[Pkg-javascript-commits] [dojo] 03/18: Imported Upstream version 1.4.1+dfsg

David Prévot taffit at alioth.debian.org
Fri Oct 25 19:59:01 UTC 2013


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch master
in repository dojo.

commit 0b27a21fbfc877dc159a105178f7f562ad254ddd
Author: David Prévot <taffit at debian.org>
Date:   Thu Oct 24 18:20:20 2013 -0400

    Imported Upstream version 1.4.1+dfsg
---
 dijit/Calendar.js                                  |  252 +
 dijit/CheckedMenuItem.js                           |    2 +-
 dijit/ColorPalette.js                              |  128 +-
 dijit/Declaration.js                               |   20 +-
 dijit/Dialog.js                                    |  165 +-
 dijit/DialogUnderlay.js                            |   24 +-
 dijit/Editor.js                                    |  130 +-
 dijit/InlineEditBox.js                             |  200 +-
 dijit/Menu.js                                      |  262 +-
 dijit/MenuBar.js                                   |   24 +-
 dijit/MenuBarItem.js                               |    2 +-
 dijit/MenuItem.js                                  |   54 +-
 dijit/MenuSeparator.js                             |    2 +-
 dijit/PopupMenuItem.js                             |    2 +
 dijit/ProgressBar.js                               |   12 +-
 dijit/TitlePane.js                                 |   62 +-
 dijit/Tooltip.js                                   |  118 +-
 dijit/TooltipDialog.js                             |   38 +-
 dijit/Tree.js                                      |  638 +-
 dijit/_Calendar.js                                 |  171 +-
 dijit/_Contained.js                                |   24 +-
 dijit/_Container.js                                |   49 +-
 dijit/_DialogMixin.js                              |    4 +-
 dijit/_HasDropDown.js                              |  221 +
 dijit/_KeyNavContainer.js                          |  103 +-
 dijit/_Templated.js                                |  162 +-
 dijit/_TimePicker.js                               |  190 +-
 dijit/_Widget.js                                   |  257 +-
 dijit/_base/focus.js                               |  321 +-
 dijit/_base/manager.js                             |  246 +-
 dijit/_base/place.js                               |  132 +-
 dijit/_base/popup.js                               |  172 +-
 dijit/_base/scroll.js                              |  185 +-
 dijit/_base/sniff.js                               |   22 +-
 dijit/_base/typematic.js                           |    8 +-
 dijit/_base/wai.js                                 |   77 +-
 dijit/_editor/RichText.js                          |  774 +-
 dijit/_editor/_Plugin.js                           |   44 +-
 dijit/_editor/html.js                              |   95 +-
 dijit/_editor/nls/LinkDialog.js                    |    2 +-
 dijit/_editor/nls/ar/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/ar/commands.js                   |    2 +-
 dijit/_editor/nls/ca/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/ca/commands.js                   |    2 +-
 dijit/_editor/nls/commands.js                      |    2 +-
 dijit/_editor/nls/cs/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/cs/commands.js                   |    2 +-
 dijit/_editor/nls/da/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/da/commands.js                   |    2 +-
 dijit/_editor/nls/de/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/de/commands.js                   |    2 +-
 dijit/_editor/nls/el/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/el/commands.js                   |    2 +-
 dijit/_editor/nls/es/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/es/commands.js                   |    2 +-
 dijit/_editor/nls/fi/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/fi/commands.js                   |    2 +-
 dijit/_editor/nls/fr/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/fr/commands.js                   |    2 +-
 dijit/_editor/nls/he/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/he/commands.js                   |    2 +-
 dijit/_editor/nls/hu/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/hu/commands.js                   |    2 +-
 dijit/_editor/nls/it/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/it/commands.js                   |    2 +-
 dijit/_editor/nls/ja/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/ja/commands.js                   |    2 +-
 dijit/_editor/nls/ko/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/ko/commands.js                   |    2 +-
 dijit/_editor/nls/nb/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/nb/commands.js                   |    2 +-
 dijit/_editor/nls/nl/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/nl/commands.js                   |    2 +-
 dijit/_editor/nls/pl/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/pl/commands.js                   |    2 +-
 dijit/_editor/nls/pt-pt/LinkDialog.js              |    2 +-
 dijit/_editor/nls/pt-pt/commands.js                |    2 +-
 dijit/_editor/nls/pt/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/pt/commands.js                   |    2 +-
 dijit/_editor/nls/ru/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/ru/commands.js                   |    2 +-
 dijit/_editor/nls/sk/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/sk/commands.js                   |    2 +-
 dijit/_editor/nls/sl/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/sl/commands.js                   |    2 +-
 dijit/_editor/nls/sv/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/sv/commands.js                   |    2 +-
 dijit/_editor/nls/th/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/th/commands.js                   |    2 +-
 dijit/_editor/nls/tr/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/tr/commands.js                   |    2 +-
 dijit/_editor/nls/zh-tw/LinkDialog.js              |    2 +-
 dijit/_editor/nls/zh-tw/commands.js                |    2 +-
 dijit/_editor/nls/zh/LinkDialog.js                 |    2 +-
 dijit/_editor/nls/zh/commands.js                   |    2 +-
 dijit/_editor/plugins/AlwaysShowToolbar.js         |   70 +-
 dijit/_editor/plugins/EnterKeyHandling.js          |  445 +-
 dijit/_editor/plugins/FontChoice.js                |  170 +-
 dijit/_editor/plugins/FullScreen.js                |  198 +
 dijit/_editor/plugins/LinkDialog.js                |  177 +-
 dijit/_editor/plugins/NewPage.js                   |   34 +
 dijit/_editor/plugins/Print.js                     |   65 +
 dijit/_editor/plugins/TabIndent.js                 |   34 +-
 dijit/_editor/plugins/ToggleDir.js                 |   23 +-
 dijit/_editor/plugins/ViewSource.js                |  300 +
 dijit/_editor/range.js                             |  438 +-
 dijit/_editor/selection.js                         |  196 +-
 dijit/_tree/dndContainer.js                        |   51 -
 dijit/_tree/dndSelector.js                         |  131 -
 dijit/_tree/dndSource.js                           |  223 +-
 dijit/dijit-all.js                                 |    2 +-
 dijit/dijit-all.js.uncompressed.js                 |14932 ++++++++++++--------
 dijit/dijit.js                                     |    2 +-
 dijit/dijit.js.uncompressed.js                     | 3090 ++--
 dijit/form/Button.js                               |  233 +-
 dijit/form/CheckBox.js                             |   40 +-
 dijit/form/ComboBox.js                             |  519 +-
 dijit/form/CurrencyTextBox.js                      |   12 +-
 dijit/form/DateTextBox.js                          |    4 +-
 dijit/form/FilteringSelect.js                      |   80 +-
 dijit/form/Form.js                                 |    4 +-
 dijit/form/HorizontalRule.js                       |    6 +-
 dijit/form/HorizontalSlider.js                     |  169 +-
 dijit/form/MultiSelect.js                          |   20 +-
 dijit/form/NumberSpinner.js                        |   28 +-
 dijit/form/NumberTextBox.js                        |   56 +-
 dijit/form/Select.js                               |  141 +
 dijit/form/SimpleTextarea.js                       |   36 +-
 dijit/form/TextBox.js                              |   59 +-
 dijit/form/Textarea.js                             |    2 +-
 dijit/form/ValidationTextBox.js                    |   78 +-
 dijit/form/VerticalRuleLabels.js                   |    2 +-
 dijit/form/VerticalSlider.js                       |    2 +-
 dijit/form/_DateTimeTextBox.js                     |   87 +-
 dijit/form/_FormMixin.js                           |   93 +-
 dijit/form/_FormSelectWidget.js                    |  307 +
 dijit/form/_FormWidget.js                          |  165 +-
 dijit/form/_Spinner.js                             |   52 +-
 dijit/form/nls/sl/Textarea.js                      |    2 +-
 dijit/layout/AccordionContainer.js                 |  139 +-
 dijit/layout/BorderContainer.js                    |  311 +-
 dijit/layout/ContentPane.js                        |  197 +-
 dijit/layout/ScrollingTabController.js             |  199 +
 dijit/layout/SplitContainer.js                     |  240 +-
 dijit/layout/StackContainer.js                     |   95 +-
 dijit/layout/StackController.js                    |  134 +-
 dijit/layout/TabContainer.js                       |   56 +-
 dijit/layout/TabController.js                      |   44 +-
 dijit/layout/_LayoutWidget.js                      |  134 +-
 dijit/layout/_TabContainerBase.js                  |   67 +
 dijit/nls/dijit-all_ROOT.js                        |    2 +-
 dijit/nls/dijit-all_ar.js                          |    2 +-
 dijit/nls/dijit-all_ca.js                          |    2 +-
 dijit/nls/dijit-all_cs.js                          |    2 +-
 dijit/nls/dijit-all_da.js                          |    2 +-
 dijit/nls/dijit-all_de-de.js                       |    2 +-
 dijit/nls/dijit-all_de.js                          |    2 +-
 dijit/nls/dijit-all_el.js                          |    2 +-
 dijit/nls/dijit-all_en-gb.js                       |    2 +-
 dijit/nls/dijit-all_en-us.js                       |    2 +-
 dijit/nls/dijit-all_en.js                          |    2 +-
 dijit/nls/dijit-all_es-es.js                       |    2 +-
 dijit/nls/dijit-all_es.js                          |    2 +-
 dijit/nls/dijit-all_fi-fi.js                       |    2 +-
 dijit/nls/dijit-all_fi.js                          |    2 +-
 dijit/nls/dijit-all_fr-fr.js                       |    2 +-
 dijit/nls/dijit-all_fr.js                          |    2 +-
 dijit/nls/dijit-all_he-il.js                       |    2 +-
 dijit/nls/dijit-all_he.js                          |    2 +-
 dijit/nls/dijit-all_hu.js                          |    2 +-
 dijit/nls/dijit-all_it-it.js                       |    2 +-
 dijit/nls/dijit-all_it.js                          |    2 +-
 dijit/nls/dijit-all_ja-jp.js                       |    2 +-
 dijit/nls/dijit-all_ja.js                          |    2 +-
 dijit/nls/dijit-all_ko-kr.js                       |    2 +-
 dijit/nls/dijit-all_ko.js                          |    2 +-
 dijit/nls/dijit-all_nl-nl.js                       |    2 +-
 dijit/nls/dijit-all_nl.js                          |    2 +-
 dijit/nls/dijit-all_no.js                          |    2 +-
 dijit/nls/dijit-all_pl.js                          |    2 +-
 dijit/nls/dijit-all_pt-br.js                       |    2 +-
 dijit/nls/dijit-all_pt-pt.js                       |    2 +-
 dijit/nls/dijit-all_pt.js                          |    2 +-
 dijit/nls/dijit-all_ru.js                          |    2 +-
 dijit/nls/dijit-all_sk.js                          |    2 +-
 dijit/nls/dijit-all_sl.js                          |    2 +-
 dijit/nls/dijit-all_sv.js                          |    2 +-
 dijit/nls/dijit-all_th.js                          |    2 +-
 dijit/nls/dijit-all_tr.js                          |    2 +-
 dijit/nls/dijit-all_xx.js                          |    2 +-
 dijit/nls/dijit-all_zh-cn.js                       |    2 +-
 dijit/nls/dijit-all_zh-tw.js                       |    2 +-
 dijit/nls/dijit-all_zh.js                          |    2 +-
 dijit/robot.js                                     |   53 +-
 dijit/themes/dijit.css                             |  240 +-
 dijit/themes/dijit_rtl.css                         |    3 +
 dijit/themes/nihilo/Calendar.css                   |    6 +-
 dijit/themes/nihilo/Dialog.css                     |    8 +-
 dijit/themes/nihilo/Editor.css                     |    4 +
 dijit/themes/nihilo/TitlePane.css                  |   15 +-
 dijit/themes/nihilo/Toolbar.css                    |    8 +-
 dijit/themes/nihilo/Tree.css                       |    2 +-
 dijit/themes/nihilo/Tree_rtl.css                   |    2 +-
 dijit/themes/nihilo/form/Button.css                |   51 +-
 dijit/themes/nihilo/form/Button_rtl.css            |    4 +
 dijit/themes/nihilo/form/Common.css                |   12 -
 dijit/themes/nihilo/form/Select.css                |   52 +
 dijit/themes/nihilo/form/Slider.css                |   34 +-
 dijit/themes/nihilo/images/editor.gif              |  Bin 3963 -> 5409 bytes
 dijit/themes/nihilo/images/editorDisabled.gif      |  Bin 4336 -> 4979 bytes
 dijit/themes/nihilo/images/editorDisabled_rtl.gif  |  Bin 4270 -> 4994 bytes
 dijit/themes/nihilo/images/editor_rtl.gif          |  Bin 3961 -> 5424 bytes
 dijit/themes/nihilo/images/titleBar.png            |  Bin 136 -> 148 bytes
 dijit/themes/nihilo/images/titleBarActive.png      |  Bin 148 -> 155 bytes
 dijit/themes/nihilo/layout/AccordionContainer.css  |    2 +-
 dijit/themes/nihilo/layout/BorderContainer.css     |   14 +-
 dijit/themes/nihilo/layout/SplitContainer.css      |    2 +-
 dijit/themes/nihilo/layout/TabContainer.css        |  241 +-
 dijit/themes/nihilo/layout/TabContainer_rtl.css    |   15 +-
 dijit/themes/nihilo/nihilo.css                     | 1901 ++-
 dijit/themes/nihilo/nihilo_rtl.css                 |   24 +-
 dijit/themes/soria/Calendar.css                    |    7 +-
 dijit/themes/soria/Dialog.css                      |   12 +-
 dijit/themes/soria/Editor.css                      |    4 +
 dijit/themes/soria/TitlePane.css                   |   15 +-
 dijit/themes/soria/Toolbar.css                     |    6 +-
 dijit/themes/soria/Tree_rtl.css                    |    2 +-
 dijit/themes/soria/form/Button.css                 |   51 +-
 dijit/themes/soria/form/Button_rtl.css             |    4 +
 dijit/themes/soria/form/Common.css                 |   12 -
 dijit/themes/soria/form/Select.css                 |   52 +
 dijit/themes/soria/form/Slider.css                 |   30 +-
 dijit/themes/soria/images/editor.gif               |  Bin 3963 -> 5409 bytes
 dijit/themes/soria/images/editorDisabled.gif       |  Bin 4336 -> 4979 bytes
 dijit/themes/soria/images/editorDisabled_rtl.gif   |  Bin 4270 -> 4994 bytes
 dijit/themes/soria/images/editor_rtl.gif           |  Bin 3961 -> 5424 bytes
 dijit/themes/soria/images/titleBar.png             |  Bin 175 -> 183 bytes
 dijit/themes/soria/images/titleBarActive.png       |  Bin 171 -> 183 bytes
 dijit/themes/soria/layout/AccordionContainer.css   |    5 +-
 dijit/themes/soria/layout/BorderContainer.css      |   12 +-
 dijit/themes/soria/layout/SplitContainer.css       |    2 +-
 dijit/themes/soria/layout/TabContainer.css         |  182 +-
 dijit/themes/soria/layout/TabContainer_rtl.css     |   15 +-
 dijit/themes/soria/soria.css                       | 1840 ++-
 dijit/themes/soria/soria_rtl.css                   |   24 +-
 dijit/themes/tundra/Calendar.css                   |    5 +-
 dijit/themes/tundra/Dialog.css                     |   15 +-
 dijit/themes/tundra/Editor.css                     |    4 +
 dijit/themes/tundra/TitlePane.css                  |   12 +-
 dijit/themes/tundra/Toolbar.css                    |    8 +-
 dijit/themes/tundra/form/Button.css                |   70 +-
 dijit/themes/tundra/form/Common.css                |   14 -
 dijit/themes/tundra/form/Common_rtl.css            |    6 +-
 dijit/themes/tundra/form/Select.css                |   55 +
 dijit/themes/tundra/form/Slider.css                |   29 +-
 dijit/themes/tundra/images/editor.gif              |  Bin 3963 -> 5409 bytes
 dijit/themes/tundra/images/editorDisabled.gif      |  Bin 4336 -> 4979 bytes
 dijit/themes/tundra/images/editorDisabled_rtl.gif  |  Bin 4270 -> 4994 bytes
 dijit/themes/tundra/images/editorMaster.png        |  Bin 0 -> 10338 bytes
 dijit/themes/tundra/images/editor_rtl.gif          |  Bin 3961 -> 5424 bytes
 dijit/themes/tundra/images/titleBar.png            |  Bin 143 -> 151 bytes
 dijit/themes/tundra/layout/BorderContainer.css     |   12 +-
 dijit/themes/tundra/layout/TabContainer.css        |  159 +-
 dijit/themes/tundra/layout/TabContainer_rtl.css    |   19 +-
 dijit/themes/tundra/tundra.css                     | 1865 ++-
 dijit/themes/tundra/tundra_rtl.css                 |  184 +
 dijit/tree/ForestStoreModel.js                     |   67 +-
 dijit/tree/TreeStoreModel.js                       |  135 +-
 dijit/tree/_dndContainer.js                        |   49 +
 dijit/tree/_dndSelector.js                         |  125 +
 dijit/tree/dndSource.js                            |  240 +
 dijit/tree/model.js                                |   14 +-
 dojo/AdapterRegistry.js                            |   16 +-
 dojo/DeferredList.js                               |   38 +-
 dojo/NodeList-manipulate.js                        |  212 +
 dojo/NodeList-traverse.js                          |  131 +
 dojo/OpenAjax.js                                   |  134 +-
 dojo/_base/Color.js                                |   58 +-
 dojo/_base/Deferred.js                             |  101 +-
 dojo/_base/NodeList.js                             |  241 +-
 dojo/_base/_loader/bootstrap.js                    |   94 +-
 dojo/_base/_loader/hostenv_browser.js              |  200 +-
 dojo/_base/_loader/hostenv_ff_ext.js               |  114 +-
 dojo/_base/_loader/hostenv_rhino.js                |  130 +-
 dojo/_base/_loader/hostenv_spidermonkey.js         |   14 +-
 dojo/_base/_loader/loader.js                       |  295 +-
 dojo/_base/_loader/loader_debug.js                 |   12 +-
 dojo/_base/_loader/loader_xd.js                    |  491 +-
 dojo/_base/array.js                                |   91 +-
 dojo/_base/connect.js                              |   78 +-
 dojo/_base/declare.js                              |  459 +-
 dojo/_base/event.js                                |  253 +-
 dojo/_base/fx.js                                   |  365 +-
 dojo/_base/html.js                                 |  783 +-
 dojo/_base/json.js                                 |   58 +-
 dojo/_base/lang.js                                 |  151 +-
 dojo/_base/query-sizzle.js                         |  760 +-
 dojo/_base/query.js                                |  846 +-
 dojo/_base/window.js                               |    7 +-
 dojo/_base/xhr.js                                  |  422 +-
 dojo/_firebug/firebug.js                           |  910 +-
 dojo/back.js                                       |  248 +-
 dojo/behavior.js                                   |   70 +-
 dojo/build.txt                                     |  585 +-
 dojo/cache.js                                      |   54 +
 dojo/cldr/nls/ar/currency.js                       |    2 +-
 dojo/cldr/nls/ar/gregorian.js                      |    2 +-
 dojo/cldr/nls/ar/hebrew.js                         |    1 +
 dojo/cldr/nls/ar/islamic-civil.js                  |    2 +-
 dojo/cldr/nls/ar/islamic.js                        |    2 +-
 dojo/cldr/nls/ar/number.js                         |    2 +-
 dojo/cldr/nls/ca/currency.js                       |    2 +-
 dojo/cldr/nls/ca/gregorian.js                      |    2 +-
 dojo/cldr/nls/cs/currency.js                       |    2 +-
 dojo/cldr/nls/cs/gregorian.js                      |    2 +-
 dojo/cldr/nls/currency.js                          |    2 +-
 dojo/cldr/nls/da/currency.js                       |    2 +-
 dojo/cldr/nls/da/gregorian.js                      |    2 +-
 dojo/cldr/nls/de/currency.js                       |    2 +-
 dojo/cldr/nls/de/gregorian.js                      |    2 +-
 dojo/cldr/nls/el/currency.js                       |    2 +-
 dojo/cldr/nls/el/gregorian.js                      |    2 +-
 dojo/cldr/nls/el/number.js                         |    2 +-
 dojo/cldr/nls/en-au/currency.js                    |    2 +-
 dojo/cldr/nls/en-au/gregorian.js                   |    2 +-
 dojo/cldr/nls/en-ca/currency.js                    |    2 +-
 dojo/cldr/nls/en-ca/gregorian.js                   |    2 +-
 dojo/cldr/nls/en-gb/gregorian.js                   |    2 +-
 dojo/cldr/nls/en-us/currency.js                    |    2 +-
 dojo/cldr/nls/en/currency.js                       |    2 +-
 dojo/cldr/nls/en/gregorian.js                      |    2 +-
 dojo/cldr/nls/es-es/gregorian.js                   |    2 +-
 dojo/cldr/nls/es-es/number.js                      |    2 +-
 dojo/cldr/nls/es/currency.js                       |    2 +-
 dojo/cldr/nls/es/gregorian.js                      |    2 +-
 dojo/cldr/nls/es/number.js                         |    2 +-
 dojo/cldr/nls/fi/currency.js                       |    2 +-
 dojo/cldr/nls/fi/gregorian.js                      |    2 +-
 dojo/cldr/nls/fr/currency.js                       |    2 +-
 dojo/cldr/nls/fr/gregorian.js                      |    2 +-
 dojo/cldr/nls/gregorian.js                         |    2 +-
 dojo/cldr/nls/he/currency.js                       |    2 +-
 dojo/cldr/nls/he/gregorian.js                      |    2 +-
 dojo/cldr/nls/he/hebrew.js                         |    2 +-
 dojo/cldr/nls/he/islamic.js                        |    1 +
 dojo/cldr/nls/hebrew.js                            |    2 +-
 dojo/cldr/nls/hu/currency.js                       |    2 +-
 dojo/cldr/nls/hu/gregorian.js                      |    2 +-
 dojo/cldr/nls/islamic-civil.js                     |    2 +-
 dojo/cldr/nls/islamic.js                           |    2 +-
 dojo/cldr/nls/it-it/gregorian.js                   |    2 +-
 dojo/cldr/nls/it/currency.js                       |    2 +-
 dojo/cldr/nls/it/gregorian.js                      |    2 +-
 dojo/cldr/nls/ja/currency.js                       |    2 +-
 dojo/cldr/nls/ja/gregorian.js                      |    2 +-
 dojo/cldr/nls/ko-kr/gregorian.js                   |    2 +-
 dojo/cldr/nls/ko/currency.js                       |    2 +-
 dojo/cldr/nls/ko/gregorian.js                      |    2 +-
 dojo/cldr/nls/nb/currency.js                       |    2 +-
 dojo/cldr/nls/nb/gregorian.js                      |    2 +-
 dojo/cldr/nls/nl/currency.js                       |    2 +-
 dojo/cldr/nls/nl/gregorian.js                      |    2 +-
 dojo/cldr/nls/pl/currency.js                       |    2 +-
 dojo/cldr/nls/pl/gregorian.js                      |    2 +-
 dojo/cldr/nls/pt-br/gregorian.js                   |    2 +-
 dojo/cldr/nls/pt-pt/gregorian.js                   |    2 +-
 dojo/cldr/nls/pt/currency.js                       |    2 +-
 dojo/cldr/nls/pt/gregorian.js                      |    2 +-
 dojo/cldr/nls/ru/currency.js                       |    2 +-
 dojo/cldr/nls/ru/gregorian.js                      |    2 +-
 dojo/cldr/nls/sk/currency.js                       |    2 +-
 dojo/cldr/nls/sk/gregorian.js                      |    2 +-
 dojo/cldr/nls/sl/currency.js                       |    2 +-
 dojo/cldr/nls/sl/gregorian.js                      |    2 +-
 dojo/cldr/nls/sl/number.js                         |    2 +-
 dojo/cldr/nls/sv/currency.js                       |    2 +-
 dojo/cldr/nls/sv/gregorian.js                      |    2 +-
 dojo/cldr/nls/sv/number.js                         |    2 +-
 dojo/cldr/nls/th/buddhist.js                       |    1 +
 dojo/cldr/nls/th/currency.js                       |    2 +-
 dojo/cldr/nls/th/gregorian.js                      |    2 +-
 dojo/cldr/nls/tr/currency.js                       |    2 +-
 dojo/cldr/nls/tr/gregorian.js                      |    2 +-
 dojo/cldr/nls/zh-cn/gregorian.js                   |    2 +-
 dojo/cldr/nls/zh-tw/currency.js                    |    2 +-
 dojo/cldr/nls/zh-tw/gregorian.js                   |    2 +-
 dojo/cldr/nls/zh/currency.js                       |    2 +-
 dojo/cldr/nls/zh/gregorian.js                      |    2 +-
 dojo/colors.js                                     |   22 +-
 dojo/cookie.js                                     |   30 +-
 dojo/data/ItemFileReadStore.js                     |  444 +-
 dojo/data/ItemFileWriteStore.js                    |  505 +-
 dojo/data/util/simpleFetch.js                      |   10 +-
 dojo/data/util/sorter.js                           |   50 +-
 dojo/date.js                                       |  191 +-
 dojo/date/locale.js                                |  380 +-
 dojo/date/stamp.js                                 |   39 +-
 dojo/dnd/Avatar.js                                 |   41 +-
 dojo/dnd/Container.js                              |  124 +-
 dojo/dnd/Manager.js                                |   36 +-
 dojo/dnd/Moveable.js                               |   26 +-
 dojo/dnd/Mover.js                                  |    8 +-
 dojo/dnd/Selector.js                               |   50 +-
 dojo/dnd/Source.js                                 |  176 +-
 dojo/dnd/TimedMoveable.js                          |    4 +-
 dojo/dnd/autoscroll.js                             |    6 +-
 dojo/dnd/common.js                                 |   11 -
 dojo/dnd/move.js                                   |   60 +-
 dojo/dojo.js                                       |    2 +-
 dojo/dojo.js.uncompressed.js                       | 5194 ++++---
 dojo/fx.js                                         |  153 +-
 dojo/fx/Toggler.js                                 |   30 +-
 dojo/hash.js                                       |  133 +
 dojo/html.js                                       |  137 +-
 dojo/i18n.js                                       |  190 +-
 dojo/io/iframe.js                                  |  151 +-
 dojo/io/script.js                                  |  134 +-
 dojo/number.js                                     |  328 +-
 dojo/parser.js                                     |  242 +-
 dojo/regexp.js                                     |   16 +-
 dojo/resources/dnd.css                             |    5 +
 dojo/resources/iframe_history.html                 |    2 +-
 dojo/resources/images/dndNoCopy.png                |  Bin 756 -> 1332 bytes
 dojo/resources/images/dndNoMove.png                |  Bin 750 -> 991 bytes
 dojo/robot.js                                      |   31 +-
 dojo/rpc/RpcService.js                             |   46 +-
 dojo/string.js                                     |   24 +-
 dojox/analytics/README                             |    2 +-
 dojox/analytics/Urchin.js                          |   21 +-
 dojox/analytics/_base.js                           |   20 +-
 dojox/analytics/logger/dojoxAnalytics.php          |    2 +-
 dojox/analytics/plugins/consoleMessages.js         |    1 +
 dojox/analytics/plugins/dojo.js                    |    1 +
 dojox/analytics/plugins/idle.js                    |    1 +
 dojox/analytics/plugins/mouseClick.js              |   13 +-
 dojox/analytics/plugins/mouseOver.js               |   17 +-
 dojox/analytics/plugins/window.js                  |    9 +-
 dojox/atom/io/Connection.js                        |  266 +-
 dojox/atom/io/model.js                             |  605 +-
 dojox/atom/widget/FeedEntryEditor.js               |  700 +-
 dojox/atom/widget/FeedEntryViewer.js               |  249 +-
 dojox/atom/widget/FeedViewer.js                    |  446 +-
 dojox/atom/widget/nls/sl/FeedEntryEditor.js        |    2 +-
 dojox/charting/Chart2D.js                          |  340 +-
 dojox/charting/Chart3D.js                          |   54 +-
 dojox/charting/DataChart.js                        |   96 +-
 dojox/charting/Theme.js                            |   46 +-
 dojox/charting/action2d/Base.js                    |   18 +-
 dojox/charting/action2d/Highlight.js               |   46 +-
 dojox/charting/action2d/Magnify.js                 |   52 +-
 dojox/charting/action2d/MoveSlice.js               |   42 +-
 dojox/charting/action2d/Shake.js                   |   50 +-
 dojox/charting/action2d/Tooltip.js                 |   75 +-
 dojox/charting/axis2d/Default.js                   |  255 +-
 dojox/charting/axis2d/common.js                    |   67 +-
 dojox/charting/plot2d/Bars.js                      |   84 +-
 dojox/charting/plot2d/Base.js                      |   22 +-
 dojox/charting/plot2d/Bubble.js                    |   92 +-
 dojox/charting/plot2d/Candlesticks.js              |  119 +
 dojox/charting/plot2d/ClusteredBars.js             |   74 +-
 dojox/charting/plot2d/ClusteredColumns.js          |   74 +-
 dojox/charting/plot2d/Columns.js                   |   80 +-
 dojox/charting/plot2d/Default.js                   |  136 +-
 dojox/charting/plot2d/Grid.js                      |   48 +-
 dojox/charting/plot2d/OHLC.js                      |  113 +
 dojox/charting/plot2d/Pie.js                       |  150 +-
 dojox/charting/plot2d/Stacked.js                   |  134 +-
 dojox/charting/plot2d/StackedBars.js               |  106 +-
 dojox/charting/plot2d/StackedColumns.js            |  102 +-
 dojox/charting/plot2d/common.js                    |  214 +-
 dojox/charting/plot3d/Bars.js                      |   28 +-
 dojox/charting/plot3d/Cylinders.js                 |   32 +-
 dojox/charting/scaler/common.js                    |   36 +-
 dojox/charting/scaler/linear.js                    |  236 +-
 dojox/charting/scaler/primitive.js                 |    6 +-
 dojox/charting/themes/Distinctive.js               |   16 +
 dojox/charting/themes/Harmony.js                   |   16 +
 dojox/charting/widget/Chart2D.js                   |    2 +-
 dojox/charting/widget/Chart2D.js.uncompressed.js   | 5055 ++++---
 dojox/charting/widget/Legend.js                    |   77 +-
 dojox/charting/widget/Sparkline.js                 |   14 +-
 dojox/collections/ArrayList.js                     |   28 +-
 dojox/collections/BinaryTree.js                    |  182 +-
 dojox/collections/Dictionary.js                    |   12 +-
 dojox/collections/Queue.js                         |    8 +-
 dojox/collections/Set.js                           |   60 +-
 dojox/collections/SortedList.js                    |   56 +-
 dojox/collections/Stack.js                         |    8 +-
 dojox/collections/_base.js                         |   46 +-
 dojox/color/Colorspace.js                          |  594 +-
 dojox/color/Palette.js                             |  149 +-
 dojox/color/_base.js                               |  146 +-
 dojox/cometd/RestChannels.js                       |  329 +-
 dojox/cometd/_base.js                              |  310 +-
 dojox/cometd/callbackPollTransport.js              |   12 +-
 dojox/cometd/longPollTransportFormEncoded.js       |    8 +-
 dojox/cometd/longPollTransportJsonEncoded.js       |   10 +-
 dojox/cometd/timesync.js                           |   42 +-
 dojox/data/AndOrReadStore.js                       |  536 +-
 dojox/data/AndOrWriteStore.js                      |  505 +-
 dojox/data/AppStore.js                             |  548 +-
 dojox/data/AtomReadStore.js                        |  307 +-
 dojox/data/CdfStore.js                             |  318 +
 dojox/data/ClientFilter.js                         |  236 +-
 dojox/data/CouchDBRestStore.js                     |   67 +-
 dojox/data/CssClassStore.js                        |   88 +-
 dojox/data/CssRuleStore.js                         |  182 +-
 dojox/data/CsvStore.js                             |  468 +-
 dojox/data/FileStore.js                            |  264 +-
 dojox/data/FlickrRestStore.js                      |  203 +-
 dojox/data/FlickrStore.js                          |  152 +-
 dojox/data/GoogleFeedStore.js                      |   29 +-
 dojox/data/GoogleSearchStore.js                    |  263 +-
 dojox/data/HtmlStore.js                            |  315 +-
 dojox/data/HtmlTableStore.js                       |  280 +-
 dojox/data/ItemExplorer.js                         |  458 +-
 dojox/data/JsonRestStore.js                        |  203 +-
 dojox/data/KeyValueStore.js                        |  179 +-
 dojox/data/OpenSearchStore.js                      |  203 +-
 dojox/data/OpmlStore.js                            |  353 +-
 dojox/data/PersevereStore.js                       |   24 +-
 dojox/data/PicasaStore.js                          |  145 +-
 dojox/data/QueryReadStore.js                       |  261 +-
 dojox/data/RailsStore.js                           |  120 +-
 dojox/data/S3Store.js                              |   12 +-
 dojox/data/ServiceStore.js                         |  165 +-
 dojox/data/SnapLogicStore.js                       |  188 +-
 dojox/data/StoreExplorer.js                        |   64 +-
 dojox/data/WikipediaStore.js                       |   20 +-
 dojox/data/XmlStore.js                             | 1087 +-
 dojox/data/css.js                                  |   92 +-
 dojox/data/jsonPathStore.js                        |  670 -
 dojox/data/restListener.js                         |   24 +-
 dojox/data/util/JsonQuery.js                       |   41 +-
 dojox/date/HebrewDate.js                           |  641 -
 dojox/date/HebrewLocale.js                         |  411 -
 dojox/date/HebrewNumerals.js                       |  158 -
 dojox/date/IslamicDate.js                          |  314 -
 dojox/date/README                                  |    4 +-
 dojox/date/buddhist.js                             |  182 +
 dojox/date/buddhist/Date.js                        |  223 +
 dojox/date/buddhist/locale.js                      |  372 +
 dojox/date/hebrew.js                               |  191 +
 dojox/date/hebrew/Date.js                          |  306 +
 dojox/date/hebrew/locale.js                        |  414 +
 dojox/date/hebrew/numerals.js                      |  103 +
 dojox/date/islamic.js                              |  185 +
 dojox/date/islamic/Date.js                         |  267 +
 dojox/date/islamic/locale.js                       |  374 +
 dojox/date/php.js                                  |  100 +-
 dojox/date/posix.js                                |  154 +-
 dojox/date/relative.js                             |   49 +
 dojox/date/timezone.js                             |  445 +
 dojox/date/zoneinfo/LICENSE                        |   10 +
 dojox/date/zoneinfo/africa                         |  310 +
 dojox/date/zoneinfo/antarctica                     |   68 +
 dojox/date/zoneinfo/asia                           |  720 +
 dojox/date/zoneinfo/australasia                    |  299 +
 dojox/date/zoneinfo/backward                       |  108 +
 dojox/date/zoneinfo/etcetera                       |   36 +
 dojox/date/zoneinfo/europe                         | 1045 ++
 dojox/date/zoneinfo/northamerica                   |  895 ++
 dojox/date/zoneinfo/pacificnew                     |    1 +
 dojox/date/zoneinfo/southamerica                   |  501 +
 dojox/drawing.js                                   |   12 +
 dojox/drawing/Drawing.js                           |  231 +
 dojox/drawing/README                               |   36 +
 dojox/drawing/_base.js                             |   36 +
 dojox/drawing/annotations/Angle.js                 |   52 +
 dojox/drawing/annotations/Arrow.js                 |   36 +
 dojox/drawing/annotations/BoxShadow.js             |  122 +
 dojox/drawing/annotations/Label.js                 |   65 +
 dojox/drawing/defaults.js                          |   42 +
 dojox/drawing/library/icons.js                     |   12 +
 dojox/drawing/manager/Anchors.js                   |  236 +
 dojox/drawing/manager/Canvas.js                    |   87 +
 dojox/drawing/manager/Mouse.js                     |  195 +
 dojox/drawing/manager/Stencil.js                   |  312 +
 dojox/drawing/manager/StencilUI.js                 |   48 +
 dojox/drawing/manager/Undo.js                      |   51 +
 dojox/drawing/manager/_registry.js                 |   34 +
 dojox/drawing/manager/keys.js                      |  154 +
 dojox/drawing/plugins/_Plugin.js                   |   28 +
 dojox/drawing/plugins/drawing/Grid.js              |   52 +
 dojox/drawing/plugins/drawing/Silverlight.js       |  138 +
 dojox/drawing/plugins/tools/Iconize.js             |   78 +
 dojox/drawing/plugins/tools/Pan.js                 |  126 +
 dojox/drawing/plugins/tools/Zoom.js                |   49 +
 dojox/drawing/resources/CrazyTruck.jpg             |  Bin 0 -> 20014 bytes
 dojox/drawing/resources/drawing.css                |   36 +
 dojox/drawing/resources/images/tool_icons.png      |  Bin 0 -> 7213 bytes
 dojox/drawing/resources/images/tool_sprites.png    |  Bin 0 -> 7431 bytes
 dojox/drawing/resources/toolbar.css                |  179 +
 dojox/drawing/stencil/Ellipse.js                   |   33 +
 dojox/drawing/stencil/Image.js                     |   62 +
 dojox/drawing/stencil/Line.js                      |   36 +
 dojox/drawing/stencil/Path.js                      |   86 +
 dojox/drawing/stencil/Rect.js                      |   34 +
 dojox/drawing/stencil/Text.js                      |   91 +
 dojox/drawing/stencil/_Base.js                     |  569 +
 dojox/drawing/tools/Arrow.js                       |   38 +
 dojox/drawing/tools/Ellipse.js                     |   46 +
 dojox/drawing/tools/Line.js                        |   61 +
 dojox/drawing/tools/Path.js                        |  152 +
 dojox/drawing/tools/Pencil.js                      |   56 +
 dojox/drawing/tools/Rect.js                        |   41 +
 dojox/drawing/tools/TextBlock.js                   |  385 +
 dojox/drawing/tools/custom/Axes.js                 |  204 +
 dojox/drawing/tools/custom/Equation.js             |   16 +
 dojox/drawing/tools/custom/Vector.js               |   52 +
 dojox/drawing/ui/Button.js                         |  140 +
 dojox/drawing/ui/Toolbar.js                        |  123 +
 dojox/drawing/ui/Tooltip.js                        |   64 +
 dojox/drawing/ui/dom/Pan.js                        |  118 +
 dojox/drawing/ui/dom/Toolbar.js                    |  114 +
 dojox/drawing/ui/dom/Zoom.js                       |   57 +
 dojox/drawing/util/common.js                       |  108 +
 dojox/drawing/util/oo.js                           |   54 +
 dojox/drawing/util/positioning.js                  |   45 +
 dojox/dtl.js                                       |    2 +-
 dojox/dtl.js.uncompressed.js                       |   41 +-
 dojox/dtl/Context.js                               |   28 +-
 dojox/dtl/_DomTemplated.js                         |    6 +-
 dojox/dtl/_Templated.js                            |   36 +-
 dojox/dtl/_base.js                                 |  582 +-
 dojox/dtl/contrib/data.js                          |  134 +-
 dojox/dtl/contrib/dijit.js                         |  192 +-
 dojox/dtl/contrib/dom.js                           |  136 +-
 dojox/dtl/dom.js                                   |  932 +-
 dojox/dtl/ext-dojo/NodeList.js                     |   18 +-
 dojox/dtl/filter/htmlstrings.js                    |   30 +-
 dojox/dtl/filter/lists.js                          |  128 +-
 dojox/dtl/filter/misc.js                           |   12 +-
 dojox/dtl/filter/strings.js                        |  324 +-
 dojox/dtl/tag/loader.js                            |  352 +-
 dojox/dtl/tag/logic.js                             |  362 +-
 dojox/dtl/tag/loop.js                              |  224 +-
 dojox/dtl/tag/misc.js                              |  331 +-
 dojox/dtl/utils/date.js                            |   16 +-
 dojox/editor/README                                |  185 +-
 dojox/editor/plugins/Breadcrumb.js                 |  235 +
 dojox/editor/plugins/EntityPalette.js              |  158 +
 dojox/editor/plugins/FindReplace.js                |  289 +
 dojox/editor/plugins/InsertEntity.js               |   50 +
 dojox/editor/plugins/NormalizeIndentOutdent.js     |  640 +
 dojox/editor/plugins/PageBreak.js                  |   78 +
 dojox/editor/plugins/PrettyPrint.js                |   51 +
 dojox/editor/plugins/Preview.js                    |   53 +
 dojox/editor/plugins/Save.js                       |   52 +
 dojox/editor/plugins/ShowBlockNodes.js             |   94 +
 dojox/editor/plugins/Smiley.js                     |   41 +
 dojox/editor/plugins/TablePlugins.js               |  262 +-
 dojox/editor/plugins/ToolbarLineBreak.js           |   28 +
 dojox/editor/plugins/UploadImage.js                |   42 +-
 dojox/editor/plugins/_SmileyPalette.js             |  129 +
 dojox/editor/plugins/nls/Breadcrumb.js             |    1 +
 dojox/editor/plugins/nls/FindReplace.js            |    1 +
 dojox/editor/plugins/nls/InsertEntity.js           |    1 +
 dojox/editor/plugins/nls/PageBreak.js              |    1 +
 dojox/editor/plugins/nls/Preview.js                |    1 +
 dojox/editor/plugins/nls/Save.js                   |    1 +
 dojox/editor/plugins/nls/ShowBlockNodes.js         |    1 +
 dojox/editor/plugins/nls/Smiley.js                 |    1 +
 dojox/editor/plugins/nls/ko/Breadcrumb.js          |    1 +
 dojox/editor/plugins/nls/ko/FindReplace.js         |    1 +
 dojox/editor/plugins/nls/ko/InsertEntity.js        |    1 +
 dojox/editor/plugins/nls/ko/PageBreak.js           |    1 +
 dojox/editor/plugins/nls/ko/Preview.js             |    1 +
 dojox/editor/plugins/nls/ko/Save.js                |    1 +
 dojox/editor/plugins/nls/ko/ShowBlockNodes.js      |    1 +
 dojox/editor/plugins/nls/latinEntities.js          |    1 +
 dojox/editor/plugins/nls/sk/TableDialog.js         |    2 +-
 dojox/editor/plugins/nls/sl/TableDialog.js         |    2 +-
 dojox/editor/plugins/resources/css/Breadcrumb.css  |   10 +
 dojox/editor/plugins/resources/css/FindReplace.css |   59 +
 .../editor/plugins/resources/css/InsertEntity.css  |   80 +
 dojox/editor/plugins/resources/css/PageBreak.css   |   14 +
 dojox/editor/plugins/resources/css/Preview.css     |   14 +
 dojox/editor/plugins/resources/css/Save.css        |   14 +
 .../plugins/resources/css/ShowBlockNodes.css       |   14 +
 dojox/editor/plugins/resources/css/Smiley.css      |   69 +
 dojox/editor/plugins/resources/editorPlugins.css   |   53 +-
 .../plugins/resources/emoticons/emoticonAngel.gif  |  Bin 0 -> 3908 bytes
 .../plugins/resources/emoticons/emoticonAngry.gif  |  Bin 0 -> 1094 bytes
 .../plugins/resources/emoticons/emoticonCool.gif   |  Bin 0 -> 1041 bytes
 .../plugins/resources/emoticons/emoticonCrying.gif |  Bin 0 -> 4994 bytes
 .../resources/emoticons/emoticonEyebrow.gif        |  Bin 0 -> 836 bytes
 .../plugins/resources/emoticons/emoticonFrown.gif  |  Bin 0 -> 839 bytes
 .../plugins/resources/emoticons/emoticonGoofy.gif  |  Bin 0 -> 828 bytes
 .../plugins/resources/emoticons/emoticonGrin.gif   |  Bin 0 -> 919 bytes
 .../plugins/resources/emoticons/emoticonHalf.gif   |  Bin 0 -> 780 bytes
 .../plugins/resources/emoticons/emoticonHappy.gif  |  Bin 0 -> 834 bytes
 .../plugins/resources/emoticons/emoticonIdea.gif   |  Bin 0 -> 200 bytes
 .../resources/emoticons/emoticonLaughing.gif       |  Bin 0 -> 757 bytes
 .../plugins/resources/emoticons/emoticonNo.gif     |  Bin 0 -> 3487 bytes
 .../plugins/resources/emoticons/emoticonOops.gif   |  Bin 0 -> 5449 bytes
 .../plugins/resources/emoticons/emoticonShy.gif    |  Bin 0 -> 2518 bytes
 .../plugins/resources/emoticons/emoticonSmile.gif  |  Bin 0 -> 1042 bytes
 .../plugins/resources/emoticons/emoticonTongue.gif |  Bin 0 -> 819 bytes
 .../plugins/resources/emoticons/emoticonWink.gif   |  Bin 0 -> 871 bytes
 .../plugins/resources/emoticons/emoticonYes.gif    |  Bin 0 -> 3020 bytes
 .../plugins/resources/icons/breadcrumbDown.gif     |  Bin 0 -> 866 bytes
 dojox/editor/plugins/resources/icons/findIcon.gif  |  Bin 0 -> 341 bytes
 .../plugins/resources/icons/findIconDisabled.gif   |  Bin 0 -> 902 bytes
 .../editor/plugins/resources/icons/findReplace.gif |  Bin 0 -> 347 bytes
 .../resources/icons/findReplaceDisabled.gif        |  Bin 0 -> 923 bytes
 .../plugins/resources/icons/insertEntity.gif       |  Bin 0 -> 177 bytes
 .../resources/icons/insertEntityDisabled.gif       |  Bin 0 -> 177 bytes
 dojox/editor/plugins/resources/icons/pageBreak.gif |  Bin 0 -> 564 bytes
 .../plugins/resources/icons/pageBreakDisabled.gif  |  Bin 0 -> 912 bytes
 dojox/editor/plugins/resources/icons/preview.gif   |  Bin 0 -> 577 bytes
 .../plugins/resources/icons/previewDisabled.gif    |  Bin 0 -> 913 bytes
 .../editor/plugins/resources/icons/replaceIcon.gif |  Bin 0 -> 574 bytes
 .../resources/icons/replaceIconDisabled.gif        |  Bin 0 -> 933 bytes
 dojox/editor/plugins/resources/icons/save.gif      |  Bin 0 -> 639 bytes
 .../plugins/resources/icons/saveDisabled.gif       |  Bin 0 -> 378 bytes
 .../plugins/resources/icons/showBlockNodes.gif     |  Bin 0 -> 599 bytes
 .../resources/icons/showBlockNodesDisabled.gif     |  Bin 0 -> 957 bytes
 dojox/editor/plugins/resources/icons/smiley.gif    |  Bin 0 -> 1042 bytes
 .../resources/images/blockelems/address.gif        |  Bin 0 -> 936 bytes
 .../resources/images/blockelems/blockquote.gif     |  Bin 0 -> 935 bytes
 .../plugins/resources/images/blockelems/button.gif |  Bin 0 -> 929 bytes
 .../plugins/resources/images/blockelems/center.gif |  Bin 0 -> 931 bytes
 .../plugins/resources/images/blockelems/dd.gif     |  Bin 0 -> 888 bytes
 .../plugins/resources/images/blockelems/del.gif    |  Bin 0 -> 898 bytes
 .../plugins/resources/images/blockelems/div.gif    |  Bin 0 -> 896 bytes
 .../plugins/resources/images/blockelems/dt.gif     |  Bin 0 -> 887 bytes
 .../resources/images/blockelems/fieldset.gif       |  Bin 0 -> 933 bytes
 .../plugins/resources/images/blockelems/form.gif   |  Bin 0 -> 918 bytes
 .../plugins/resources/images/blockelems/h1.gif     |  Bin 0 -> 886 bytes
 .../plugins/resources/images/blockelems/h2.gif     |  Bin 0 -> 889 bytes
 .../plugins/resources/images/blockelems/h3.gif     |  Bin 0 -> 891 bytes
 .../plugins/resources/images/blockelems/h4.gif     |  Bin 0 -> 890 bytes
 .../plugins/resources/images/blockelems/h5.gif     |  Bin 0 -> 892 bytes
 .../plugins/resources/images/blockelems/h6.gif     |  Bin 0 -> 890 bytes
 .../plugins/resources/images/blockelems/hr.gif     |  Bin 0 -> 891 bytes
 .../plugins/resources/images/blockelems/iframe.gif |  Bin 0 -> 929 bytes
 .../plugins/resources/images/blockelems/ins.gif    |  Bin 0 -> 898 bytes
 .../plugins/resources/images/blockelems/li.gif     |  Bin 0 -> 880 bytes
 .../plugins/resources/images/blockelems/map.gif    |  Bin 0 -> 907 bytes
 .../resources/images/blockelems/noscript.gif       |  Bin 0 -> 943 bytes
 .../plugins/resources/images/blockelems/object.gif |  Bin 0 -> 925 bytes
 .../plugins/resources/images/blockelems/ol.gif     |  Bin 0 -> 887 bytes
 .../plugins/resources/images/blockelems/p.gif      |  Bin 0 -> 875 bytes
 .../plugins/resources/images/blockelems/pre.gif    |  Bin 0 -> 898 bytes
 .../plugins/resources/images/blockelems/script.gif |  Bin 0 -> 924 bytes
 .../plugins/resources/images/blockelems/table.gif  |  Bin 0 -> 917 bytes
 .../plugins/resources/images/blockelems/ul.gif     |  Bin 0 -> 884 bytes
 dojox/embed/Flash.js                               |  146 +-
 dojox/embed/Object.js                              |   14 +-
 dojox/embed/Quicktime.js                           |   90 +-
 dojox/embed/flashVars.js                           |   22 +-
 dojox/encoding/README                              |    2 +-
 dojox/encoding/ascii85.js                          |   36 +-
 dojox/encoding/base64.js                           |   48 +-
 dojox/encoding/bits.js                             |   14 +-
 dojox/encoding/compression/lzw.js                  |   16 +-
 dojox/encoding/compression/splay.js                |   12 +-
 dojox/encoding/crypto/Blowfish.js                  |  240 +-
 dojox/encoding/crypto/RSAKey-ext.js                |  107 +
 dojox/encoding/crypto/RSAKey.js                    |   66 +
 dojox/encoding/crypto/SimpleAES.js                 |  192 +-
 dojox/encoding/digests/MD5.js                      |   46 +-
 dojox/encoding/digests/SHA1.js                     |   66 +-
 dojox/encoding/digests/_base.js                    |   16 +-
 dojox/encoding/easy64.js                           |   28 +-
 dojox/flash/DojoExternalInterface.as               |  354 +-
 dojox/flash/ExpressInstall.as                      |  142 +-
 dojox/flash/_base.js                               |  264 +-
 dojox/form/BusyButton.js                           |    2 +-
 dojox/form/CheckedMultiSelect.js                   |   51 +-
 dojox/form/DateTextBox.js                          |   68 +-
 dojox/form/DropDownSelect.js                       |  125 +-
 dojox/form/DropDownStack.js                        |    4 +-
 dojox/form/FileInput.js                            |    2 +-
 dojox/form/FileInputAuto.js                        |   26 +-
 dojox/form/FileInputBlind.js                       |   12 +
 dojox/form/FilePickerTextBox.js                    |  144 +-
 dojox/form/FileUploader.js                         |  510 +-
 dojox/form/ListInput.js                            |  440 +
 dojox/form/Manager.js                              |   15 +-
 dojox/form/PasswordValidator.js                    |   56 +-
 dojox/form/README                                  |   11 +-
 dojox/form/RangeSlider.js                          |  391 +-
 dojox/form/Rating.js                               |   32 +-
 dojox/form/TimeSpinner.js                          |   10 +-
 dojox/form/_FormSelectWidget.js                    |  203 +-
 dojox/form/_HasDropDown.js                         |  171 +-
 dojox/form/_SelectStackMixin.js                    |  147 +-
 dojox/form/manager/_ClassMixin.js                  |   26 +-
 dojox/form/manager/_EnableMixin.js                 |   42 +-
 dojox/form/manager/_FormMixin.js                   |   36 +-
 dojox/form/manager/_Mixin.js                       |  286 +-
 dojox/form/manager/_NodeMixin.js                   |  236 +-
 dojox/form/nls/ar/PasswordValidator.js             |    2 +-
 dojox/form/nls/ko/PasswordValidator.js             |    2 +-
 dojox/form/resources/BusyButton.css                |    1 +
 dojox/form/resources/DropDownSelect.css            |  202 -
 dojox/form/resources/DropDownSelect.html           |   14 -
 dojox/form/resources/FilePickerTextBox.html        |    2 +-
 dojox/form/resources/FileUploader.css              |   93 +
 dojox/form/resources/ListInput.css                 |   75 +
 dojox/form/resources/UploadFile.php                |  226 -
 dojox/form/resources/cLOG.php                      |   54 -
 dojox/form/resources/uploader.swf                  |  Bin 19253 -> 16890 bytes
 dojox/fx/README                                    |    4 +-
 dojox/fx/Shadow.js                                 |   64 +-
 dojox/fx/_base.js                                  |  140 +-
 dojox/fx/_core.js                                  |    6 +-
 dojox/fx/ext-dojo/NodeList-style.js                |   27 +
 dojox/fx/flip.js                                   |  190 +-
 dojox/fx/scroll.js                                 |    2 +-
 dojox/fx/split.js                                  |  451 +-
 dojox/fx/style.js                                  |   82 +-
 dojox/fx/text.js                                   |  366 +-
 dojox/gfx.js                                       |    2 +-
 dojox/gfx.js.uncompressed.js                       |   57 +-
 dojox/gfx/Moveable.js                              |   22 +-
 dojox/gfx/Mover.js                                 |    6 +-
 dojox/gfx/VectorText.js                            |  394 +-
 dojox/gfx/_base.js                                 |  183 +-
 dojox/gfx/arc.js                                   |   72 +-
 dojox/gfx/canvas.js                                |  395 +-
 dojox/gfx/decompose.js                             |  108 +-
 dojox/gfx/fx.js                                    |  282 +-
 dojox/gfx/matrix.js                                |  150 +-
 dojox/gfx/path.js                                  |  146 +-
 dojox/gfx/resources/gfxSvgProxyFrame.html          |   14 +
 dojox/gfx/resources/svg2gfx-simple.xsl             |   72 +
 dojox/gfx/resources/svg2gfx.xsl                    | 1046 ++
 dojox/gfx/shape.js                                 |  257 +-
 dojox/gfx/silverlight.js                           |  275 +-
 dojox/gfx/silverlight_attach.js                    |   18 +-
 dojox/gfx/svg.js                                   |  387 +-
 dojox/gfx/svg_attach.js                            |  196 +-
 dojox/gfx/utils.js                                 |  190 +-
 dojox/gfx/vml.js                                   |  713 +-
 dojox/gfx/vml_attach.js                            |  232 +-
 dojox/gfx3d/gradient.js                            |   14 +-
 dojox/gfx3d/lighting.js                            |  124 +-
 dojox/gfx3d/matrix.js                              |   88 +-
 dojox/gfx3d/object.js                              |  502 +-
 dojox/gfx3d/scheduler.js                           |   82 +-
 dojox/gfx3d/vector.js                              |   16 +-
 dojox/grid/DataGrid.js                             |    2 +-
 dojox/grid/DataGrid.js.uncompressed.js             | 5968 +++++---
 dojox/grid/DataSelection.js                        |   32 +-
 dojox/grid/EnhancedGrid.js                         |   77 +
 dojox/grid/Grid.js                                 |   13 -
 dojox/grid/README                                  |    4 +
 dojox/grid/Selection.js                            |  136 +-
 dojox/grid/TreeGrid.js                             |  727 +
 dojox/grid/TreeSelection.js                        |  214 +
 dojox/grid/VirtualGrid.js                          |   13 -
 dojox/grid/_Builder.js                             |  484 +-
 dojox/grid/_CheckBoxSelector.js                    |   12 +
 dojox/grid/_EditManager.js                         |   62 +-
 dojox/grid/_Events.js                              |   81 +-
 dojox/grid/_FocusManager.js                        |  300 +-
 dojox/grid/_Grid.js                                |  473 +-
 dojox/grid/_Layout.js                              |  161 +-
 dojox/grid/_RadioSelector.js                       |   12 +
 dojox/grid/_RowManager.js                          |   20 +-
 dojox/grid/_RowSelector.js                         |   18 +-
 dojox/grid/_Scroller.js                            |  381 +-
 dojox/grid/_Selector.js                            |  160 +
 dojox/grid/_TreeView.js                            |  408 +
 dojox/grid/_View.js                                |  491 +-
 dojox/grid/_ViewManager.js                         |  133 +-
 dojox/grid/_grid/Grid.css                          |  201 -
 dojox/grid/_grid/Grid_rtl.css                      |    8 -
 dojox/grid/_grid/nihiloGrid.css                    |  211 -
 dojox/grid/_grid/soriaGrid.css                     |  212 -
 dojox/grid/_grid/tundraGrid.css                    |  215 -
 dojox/grid/cells/_base.js                          |  289 +-
 dojox/grid/cells/dijit.js                          |   99 +-
 dojox/grid/cells/tree.js                           |   68 +
 dojox/grid/compat/Grid.js                          |  197 -
 dojox/grid/compat/README                           |   39 -
 dojox/grid/compat/VirtualGrid.js                   |  408 -
 dojox/grid/compat/_data/dijitEditors.js            |  128 -
 dojox/grid/compat/_data/editors.js                 |  122 -
 dojox/grid/compat/_data/fields.js                  |   84 -
 dojox/grid/compat/_data/model.js                   |  490 -
 dojox/grid/compat/_grid/Grid.css                   |  201 -
 dojox/grid/compat/_grid/Grid_rtl.css               |    8 -
 dojox/grid/compat/_grid/builder.js                 |  353 -
 dojox/grid/compat/_grid/cell.js                    |   44 -
 dojox/grid/compat/_grid/drag.js                    |   91 -
 dojox/grid/compat/_grid/edit.js                    |  128 -
 dojox/grid/compat/_grid/focus.js                   |  137 -
 .../grid/compat/_grid/images/grid_dx_gradient.gif  |  Bin 267 -> 0 bytes
 dojox/grid/compat/_grid/images/grid_sort_down.gif  |  Bin 49 -> 0 bytes
 dojox/grid/compat/_grid/images/grid_sort_up.gif    |  Bin 48 -> 0 bytes
 .../compat/_grid/images/tabEnabled_rotated.png     |  Bin 94 -> 0 bytes
 .../grid/compat/_grid/images/tabHover_rotated.png  |  Bin 106 -> 0 bytes
 dojox/grid/compat/_grid/layout.js                  |   56 -
 dojox/grid/compat/_grid/lib.js                     |  184 -
 dojox/grid/compat/_grid/nihiloGrid.css             |  211 -
 dojox/grid/compat/_grid/publicEvents.js            |  182 -
 dojox/grid/compat/_grid/rowbar.js                  |   41 -
 dojox/grid/compat/_grid/rows.js                    |   42 -
 dojox/grid/compat/_grid/scroller.js                |  373 -
 dojox/grid/compat/_grid/selection.js               |  153 -
 dojox/grid/compat/_grid/soriaGrid.css              |  212 -
 dojox/grid/compat/_grid/tundraGrid.css             |  215 -
 dojox/grid/compat/_grid/view.js                    |  214 -
 dojox/grid/compat/_grid/views.js                   |  190 -
 dojox/grid/compat/resources/GridView.html          |   12 -
 dojox/grid/compat/resources/VirtualGrid.html       |    5 -
 dojox/grid/compat/tests/databaseModel.js           |  337 -
 dojox/grid/compat/tests/images/closed.gif          |  Bin 907 -> 0 bytes
 dojox/grid/compat/tests/images/flatScreen.gif      |  Bin 824 -> 0 bytes
 dojox/grid/compat/tests/images/open.gif            |  Bin 907 -> 0 bytes
 dojox/grid/compat/tests/support/books.xml          |  103 -
 dojox/grid/compat/tests/support/data.php           |  379 -
 dojox/grid/compat/tests/support/geography.xml      |   51 -
 dojox/grid/compat/tests/support/json.php           |  794 --
 dojox/grid/compat/tests/support/movies.csv         |    9 -
 dojox/grid/compat/tests/support/test_data.js       |   30 -
 .../grid/compat/tests/support/test_data_objects.js |   31 -
 dojox/grid/compat/tests/support/testtbl.sql        |  944 --
 dojox/grid/compat/tests/support/yahoo_search.js    |  131 -
 dojox/grid/compat/tests/test_change_structure.html |  124 -
 dojox/grid/compat/tests/test_custom_sort.html      |   86 -
 dojox/grid/compat/tests/test_dojo_data_edit.html   |  124 -
 dojox/grid/compat/tests/test_dojo_data_empty.html  |   63 -
 dojox/grid/compat/tests/test_dojo_data_model.html  |   84 -
 .../tests/test_dojo_data_model_EmptyResultSet.html |   57 -
 .../tests/test_dojo_data_model_multiStores.html    |  291 -
 .../tests/test_dojo_data_model_processError.html   |   65 -
 .../compat/tests/test_dojo_data_notification.html  |  114 -
 dojox/grid/compat/tests/test_edit.html             |  149 -
 dojox/grid/compat/tests/test_edit_canEdit.html     |  156 -
 dojox/grid/compat/tests/test_edit_dijit.html       |  137 -
 dojox/grid/compat/tests/test_events.html           |  174 -
 dojox/grid/compat/tests/test_expand.html           |  107 -
 dojox/grid/compat/tests/test_grid.html             |   49 -
 dojox/grid/compat/tests/test_grid_dlg.html         |   88 -
 .../grid/compat/tests/test_grid_headerHeight.html  |   84 -
 dojox/grid/compat/tests/test_grid_layout.html      |  112 -
 .../tests/test_grid_layout_LayoutContainer.html    |   87 -
 .../tests/test_grid_layout_borderContainer.html    |   98 -
 .../tests/test_grid_object_model_change.html       |   86 -
 .../grid/compat/tests/test_grid_programmatic.html  |   65 -
 .../tests/test_grid_programmatic_layout.html       |   74 -
 dojox/grid/compat/tests/test_grid_rtl.html         |   71 -
 dojox/grid/compat/tests/test_grid_themes.html      |  118 -
 .../grid/compat/tests/test_grid_tooltip_menu.html  |  162 -
 dojox/grid/compat/tests/test_keyboard.html         |   90 -
 dojox/grid/compat/tests/test_markup.html           |  112 -
 dojox/grid/compat/tests/test_mysql_edit.html       |  155 -
 dojox/grid/compat/tests/test_sizing.html           |  175 -
 dojox/grid/compat/tests/test_sizing_100rows.html   |  168 -
 .../compat/tests/test_sizing_ResizeHandle.html     |  113 -
 dojox/grid/compat/tests/test_styling.html          |  131 -
 dojox/grid/compat/tests/test_subgrid.html          |  179 -
 dojox/grid/compat/tests/test_tundra_edit.html      |  139 -
 dojox/grid/compat/tests/test_yahoo_images.html     |  148 -
 dojox/grid/compat/tests/test_yahoo_search.html     |  141 -
 dojox/grid/compat/tests/yahooSearch.js             |  137 -
 dojox/grid/compatGrid.tar.gz                       |  Bin 0 -> 216813 bytes
 dojox/grid/enhanced/_Builder.js                    |   81 +
 dojox/grid/enhanced/_Events.js                     |  370 +
 dojox/grid/enhanced/_Plugin.js                     |  191 +
 dojox/grid/enhanced/dnd/_DndBuilder.js             |   26 +
 dojox/grid/enhanced/dnd/_DndEvents.js              |   47 +
 dojox/grid/enhanced/dnd/_DndFocusManager.js        |   69 +
 dojox/grid/enhanced/dnd/_DndGrid.js                |   23 +
 dojox/grid/enhanced/dnd/_DndMover.js               |   36 +
 dojox/grid/enhanced/dnd/_DndMovingManager.js       |  691 +
 dojox/grid/enhanced/dnd/_DndRowSelector.js         |   18 +
 dojox/grid/enhanced/dnd/_DndSelectingManager.js    |  371 +
 dojox/grid/enhanced/nls/EnhancedGrid.js            |    1 +
 dojox/grid/enhanced/nls/zh/EnhancedGrid.js         |    1 +
 dojox/grid/enhanced/plugins/DnD.js                 |   13 +
 dojox/grid/enhanced/plugins/IndirectSelection.js   |  291 +
 dojox/grid/enhanced/plugins/Menu.js                |   70 +
 dojox/grid/enhanced/plugins/NestedSorting.js       |  730 +
 dojox/grid/enhanced/resources/EnhancedGrid.css     |  156 +
 dojox/grid/enhanced/resources/EnhancedGrid_rtl.css |   23 +
 .../enhanced/resources/images/nestedSortArrows.png |  Bin 0 -> 955 bytes
 .../grid/enhanced/resources/tundraEnhancedGrid.css |  789 ++
 dojox/grid/resources/Expando.html                  |    5 +
 dojox/grid/resources/Grid.css                      |   76 +
 dojox/grid/resources/Grid_rtl.css                  |    5 -
 dojox/grid/resources/_Grid.html                    |    2 +-
 dojox/grid/resources/nihiloGrid.css                |  136 +-
 dojox/grid/resources/soriaGrid.css                 |  136 +-
 dojox/grid/resources/tundraGrid.css                |  150 +-
 dojox/grid/util.js                                 |   59 +-
 dojox/help/_base.js                                |  345 +-
 dojox/help/console.js                              |   66 +-
 dojox/highlight/_base.js                           |  348 +-
 dojox/highlight/languages/cpp.js                   |    4 +-
 dojox/highlight/languages/css.js                   |    4 +-
 dojox/highlight/languages/delphi.js                |    4 +-
 dojox/highlight/languages/django.js                |    4 +-
 dojox/highlight/languages/html.js                  |    4 +-
 dojox/highlight/languages/javascript.js            |    4 +-
 dojox/highlight/languages/pygments/css.js          |    4 +-
 dojox/highlight/languages/pygments/html.js         |   10 +-
 dojox/highlight/languages/pygments/javascript.js   |    4 +-
 dojox/highlight/languages/python.js                |    4 +-
 dojox/highlight/languages/sql.js                   |    4 +-
 dojox/highlight/languages/xml.js                   |    2 +-
 dojox/html/README                                  |    6 +-
 dojox/html/_base.js                                |  141 +-
 dojox/html/ellipsis.js                             |  168 +
 dojox/html/entities.js                             |   85 +
 dojox/html/format.js                               |  340 +
 dojox/html/metrics.js                              |   48 +-
 dojox/html/resources/ellipsis.css                  |   33 +
 dojox/html/styles.js                               |  120 +-
 dojox/image/Badge.js                               |   79 +-
 dojox/image/FlickrBadge.js                         |    8 +-
 dojox/image/Gallery.js                             |   23 +-
 dojox/image/Lightbox.js                            |  156 +-
 dojox/image/LightboxNano.js                        |  112 +-
 dojox/image/Magnifier.js                           |   24 +-
 dojox/image/MagnifierLite.js                       |   21 +-
 dojox/image/SlideShow.js                           |  230 +-
 dojox/image/ThumbnailPicker.js                     |  205 +-
 dojox/image/_base.js                               |   12 +-
 dojox/image/resources/SlideShow.css                |    1 -
 dojox/image/resources/ThumbnailPicker.css          |    1 -
 dojox/image/resources/image.css                    |    2 -
 dojox/io/OAuth.js                                  |  166 +-
 dojox/io/httpParse.js                              |   36 +-
 dojox/io/proxy/xip.js                              |  276 +-
 dojox/io/scriptFrame.js                            |   36 +-
 dojox/io/windowName.js                             |  126 +-
 dojox/io/xhrMultiPart.js                           |   41 +-
 dojox/io/xhrPlugins.js                             |   74 +-
 dojox/io/xhrWindowNamePlugin.js                    |   26 +-
 dojox/jq.js                                        | 1296 ++
 dojox/jq/README                                    |  103 +
 dojox/json/query.js                                |  156 +-
 dojox/json/ref.js                                  |  242 +-
 dojox/json/schema.js                               |  178 +-
 dojox/jsonPath/query.js                            |  156 +-
 dojox/lang/README                                  |   10 +
 dojox/lang/aspect.js                               |  170 +-
 dojox/lang/aspect/memoizer.js                      |   30 +-
 dojox/lang/aspect/memoizerGuard.js                 |    4 +-
 dojox/lang/aspect/profiler.js                      |    1 -
 dojox/lang/aspect/timer.js                         |    2 -
 dojox/lang/aspect/tracer.js                        |    4 -
 dojox/lang/docs.js                                 |  192 +
 dojox/lang/functional/array.js                     |   12 +-
 dojox/lang/functional/binrec.js                    |   40 +-
 dojox/lang/functional/curry.js                     |   28 +-
 dojox/lang/functional/fold.js                      |   12 +-
 dojox/lang/functional/lambda.js                    |   54 +-
 dojox/lang/functional/linrec.js                    |   40 +-
 dojox/lang/functional/listcomp.js                  |   10 +-
 dojox/lang/functional/multirec.js                  |   40 +-
 dojox/lang/functional/numrec.js                    |   18 +-
 dojox/lang/functional/object.js                    |   42 +-
 dojox/lang/functional/scan.js                      |   12 +-
 dojox/lang/functional/tailrec.js                   |   32 +-
 dojox/lang/functional/util.js                      |   12 +-
 dojox/lang/observable.js                           |  133 +-
 dojox/lang/oo/Decorator.js                         |   16 +-
 dojox/lang/oo/Filter.js                            |   23 +-
 dojox/lang/oo/aop.js                               |   19 +-
 dojox/lang/oo/declare.js                           |  173 -
 dojox/lang/oo/general.js                           |   46 +-
 dojox/lang/oo/mixin.js                             |   58 +-
 dojox/lang/oo/rearrange.js                         |   42 +-
 dojox/lang/typed.js                                |  146 +
 dojox/lang/utils.js                                |   46 +-
 dojox/layout/ContentPane.js                        |   63 +-
 dojox/layout/DragPane.js                           |    6 +-
 dojox/layout/ExpandoPane.js                        |   27 +-
 dojox/layout/FloatingPane.js                       |  109 +-
 dojox/layout/GridContainer.js                      |  817 +-
 dojox/layout/README                                |    6 +
 dojox/layout/RadioGroup.js                         |  104 +-
 dojox/layout/ResizeHandle.js                       |   83 +-
 dojox/layout/RotatorContainer.js                   |  104 +-
 dojox/layout/ScrollPane.js                         |    2 +-
 dojox/layout/TableContainer.js                     |  136 +
 dojox/layout/ToggleSplitter.js                     |   22 +-
 dojox/layout/dnd/Avatar.js                         |   33 +-
 dojox/layout/dnd/PlottedDnd.js                     |  228 +-
 .../ext-dijit/layout/StackContainer-touch.js       |    8 +-
 dojox/layout/nls/GridContainer.js                  |    1 -
 dojox/layout/nls/en/GridContainer.js               |    1 -
 dojox/layout/nls/fr/GridContainer.js               |    1 -
 dojox/layout/resources/ExpandoPane.css             |   65 +-
 dojox/layout/resources/GridContainer.css           |   19 +-
 dojox/layout/resources/RotatorContainer.css        |   81 +-
 dojox/math/BigInteger-ext.js                       |  796 ++
 dojox/math/BigInteger.js                           |  635 +
 dojox/math/LICENSE-BigInteger                      |   40 +
 dojox/math/README                                  |    9 +-
 dojox/math/_base.js                                |   36 +-
 dojox/math/curves.js                               |  176 +-
 dojox/math/matrix.js                               |  122 +-
 dojox/math/random/Secure.js                        |   54 +
 dojox/math/random/Simple.js                        |   17 +
 dojox/math/random/prng4.js                         |   45 +
 dojox/math/stats.js                                |  108 +
 dojox/off.js                                       |   12 -
 dojox/off/README                                   |   28 -
 dojox/off/_common.js                               |  178 -
 dojox/off/docs/bookmarklets.html                   |   10 -
 dojox/off/files.js                                 |  238 -
 dojox/off/network_check.txt                        |    1 -
 dojox/off/offline.js                               |   16 -
 dojox/off/offline.js.uncompressed.js               | 6243 --------
 dojox/off/resources/checkmark.png                  |  Bin 27329 -> 0 bytes
 dojox/off/resources/greenball.png                  |  Bin 27414 -> 0 bytes
 dojox/off/resources/learnhow.html                  |   43 -
 dojox/off/resources/learnhow.js                    |   39 -
 dojox/off/resources/offline-widget.css             |   88 -
 dojox/off/resources/offline-widget.html            |   40 -
 dojox/off/resources/redball.png                    |  Bin 27409 -> 0 bytes
 dojox/off/resources/roller.gif                     |  Bin 7462 -> 0 bytes
 dojox/off/sync.js                                  |  209 -
 dojox/off/ui.js                                    |  358 -
 dojox/resources/README.template                    |   84 +-
 dojox/robot/recorder.js                            |  223 +-
 dojox/rpc/Client.js                                |    2 +-
 dojox/rpc/JsonRPC.js                               |   22 +-
 dojox/rpc/JsonRest.js                              |  382 +-
 dojox/rpc/OfflineRest.js                           |  213 +-
 dojox/rpc/ProxiedPath.js                           |   12 +-
 dojox/rpc/README                                   |    8 +-
 dojox/rpc/Rest.js                                  |   97 +-
 dojox/rpc/SMDLibrary/friendfeed.smd                |   49 +
 dojox/rpc/SMDLibrary/yahoo.smd                     |   24 +-
 dojox/rpc/Service.js                               |  202 +-
 dojox/secure/DOM.js                                |  161 +-
 dojox/secure/capability.js                         |   90 +-
 dojox/secure/sandbox.js                            |  160 +-
 dojox/sketch/Anchor.js                             |   26 +-
 dojox/sketch/Annotation.js                         |   74 +-
 dojox/sketch/DoubleArrowAnnotation.js              |   86 +-
 dojox/sketch/Figure.js                             |  300 +-
 dojox/sketch/LeadAnnotation.js                     |   70 +-
 dojox/sketch/PreexistingAnnotation.js              |   50 +-
 dojox/sketch/SingleArrowAnnotation.js              |   84 +-
 dojox/sketch/Slider.js                             |   10 +-
 dojox/sketch/Toolbar.js                            |   35 +-
 dojox/sketch/UnderlineAnnotation.js                |   62 +-
 dojox/sketch/UndoStack.js                          |   64 +-
 dojox/sketch/_Plugin.js                            |   10 +-
 dojox/sql/_base.js                                 |  223 +-
 dojox/sql/_crypto.js                               |  228 +-
 dojox/storage/AirDBStorageProvider.js              |   95 +-
 dojox/storage/AirEncryptedLocalStorageProvider.js  |  114 +-
 dojox/storage/AirFileStorageProvider.js            |  107 +-
 dojox/storage/FlashStorageProvider.js              |  136 +-
 dojox/storage/GearsStorageProvider.js              |  145 +-
 dojox/storage/Provider.js                          |   28 +-
 dojox/storage/WhatWGStorageProvider.js             |  108 +-
 dojox/storage/manager.js                           |   27 +-
 dojox/string/BidiComplex.js                        |  218 +-
 dojox/string/Builder.js                            |   48 +-
 dojox/string/sprintf.js                            |  326 +-
 dojox/string/tokenize.js                           |   42 +-
 dojox/testing/DocTest.js                           |   30 +-
 dojox/timing/Sequence.js                           |   38 +-
 dojox/timing/Streamer.js                           |   30 +-
 dojox/timing/ThreadPool.js                         |  116 +-
 dojox/uuid/_base.js                                |  160 +-
 dojox/uuid/generateRandomUuid.js                   |    6 +-
 dojox/uuid/generateTimeBasedUuid.js                |  220 +-
 dojox/validate/README                              |    4 +-
 dojox/validate/_base.js                            |   28 +-
 dojox/validate/br.js                               |  203 +
 dojox/validate/ca.js                               |   10 +-
 dojox/validate/check.js                            |  172 +-
 dojox/validate/creditCard.js                       |   16 +-
 dojox/validate/regexp.js                           |  146 +-
 dojox/validate/us.js                               |   18 +-
 dojox/validate/web.js                              |   32 +-
 dojox/widget/AnalogGauge.js                        |  186 +-
 dojox/widget/AutoRotator.js                        |  104 +
 dojox/widget/BarGauge.js                           |  136 +-
 dojox/widget/Calendar.js                           |  515 +-
 dojox/widget/Calendar/Calendar.html                |    2 +-
 dojox/widget/CalendarViews.js                      |    5 +-
 dojox/widget/ColorPicker.js                        |   95 +-
 dojox/widget/ColorPicker/ColorPicker.html          |   14 +-
 dojox/widget/DataPresentation.js                   |  395 +
 dojox/widget/Dialog.js                             |   35 +-
 dojox/widget/Dialog/Dialog.css                     |    1 -
 dojox/widget/DocTester.js                          |   38 +-
 dojox/widget/DynamicTooltip.js                     |   44 +
 dojox/widget/FeedPortlet.js                        |  227 +
 dojox/widget/FilePicker.js                         |  106 +-
 dojox/widget/FisheyeList.js                        |  182 +-
 dojox/widget/FisheyeLite.js                        |    8 +-
 dojox/widget/Iterator.js                           |   40 +-
 dojox/widget/Pager.js                              |  352 +-
 dojox/widget/PlaceholderMenuItem.js                |   38 +-
 dojox/widget/Portlet.js                            |  222 +
 dojox/widget/Portlet/Portlet.css                   |  138 +
 dojox/widget/Portlet/images/icons.gif              |  Bin 0 -> 896 bytes
 dojox/widget/Portlet/images/icons.png              |  Bin 0 -> 593 bytes
 dojox/widget/README                                |    8 +
 dojox/widget/Roller.js                             |   16 +-
 dojox/widget/RollingList.js                        |  743 +-
 dojox/widget/Rotator.js                            |  148 +
 dojox/widget/SortList.js                           |   30 +-
 dojox/widget/Standby.js                            |  340 +-
 dojox/widget/Standby/Standby.css                   |   16 -
 dojox/widget/Standby/Standby.html                  |    6 -
 dojox/widget/Toaster.js                            |   95 +-
 dojox/widget/UpgradeBar.js                         |  101 +
 dojox/widget/UpgradeBar/UpgradeBar.css             |   61 +
 dojox/widget/UpgradeBar/UpgradeBar.html            |    5 +
 dojox/widget/Wizard.js                             |   20 +-
 dojox/widget/Wizard/Wizard.html                    |    8 +-
 dojox/widget/gauge/AnalogArcIndicator.js           |   44 +-
 dojox/widget/gauge/AnalogArrowIndicator.js         |   18 +-
 dojox/widget/gauge/AnalogNeedleIndicator.js        |   16 +-
 dojox/widget/gauge/BarIndicator.js                 |   48 +-
 dojox/widget/gauge/_Gauge.js                       |  202 +-
 dojox/widget/nls/ColorPicker.js                    |    1 +
 dojox/widget/nls/RollingList.js                    |    1 -
 dojox/widget/nls/ca/RollingList.js                 |    1 -
 dojox/widget/nls/sk/RollingList.js                 |    1 -
 dojox/widget/nls/sl/RollingList.js                 |    1 -
 dojox/widget/nls/th/ColorPicker.js                 |    1 +
 dojox/widget/nls/th/RollingList.js                 |    1 -
 dojox/widget/rotator/Controller.js                 |   87 +
 dojox/widget/rotator/Fade.js                       |   25 +
 dojox/widget/rotator/Pan.js                        |   75 +
 dojox/widget/rotator/Slide.js                      |   32 +
 dojox/widget/rotator/Wipe.js                       |   52 +
 dojox/wire/CompositeWire.js                        |   24 +-
 dojox/wire/DataWire.js                             |   76 +-
 dojox/wire/TableAdapter.js                         |   14 +-
 dojox/wire/TextAdapter.js                          |   18 +-
 dojox/wire/TreeAdapter.js                          |   78 +-
 dojox/wire/Wire.js                                 |  168 +-
 dojox/wire/XmlWire.js                              |  138 +-
 dojox/wire/ml/Action.js                            |   38 +-
 dojox/wire/ml/Data.js                              |   58 +-
 dojox/wire/ml/DataStore.js                         |   16 +-
 dojox/wire/ml/Invocation.js                        |   48 +-
 dojox/wire/ml/Service.js                           |  170 +-
 dojox/wire/ml/Transfer.js                          |   96 +-
 dojox/wire/ml/util.js                              |  182 +-
 dojox/xml/DomParser.js                             |  198 +-
 dojox/xml/parser.js                                |   92 +-
 dojox/xml/widgetParser.js                          |   76 +-
 dojox/xmpp/ChatService.js                          |    2 +-
 dojox/xmpp/PresenceService.js                      |  170 +-
 dojox/xmpp/README                                  |   25 +-
 dojox/xmpp/RosterService.js                        |  184 +-
 dojox/xmpp/TransportSession.js                     |  225 +-
 dojox/xmpp/UserService.js                          |   36 +-
 dojox/xmpp/bosh.js                                 |  132 +
 dojox/xmpp/sasl.js                                 |  121 +-
 dojox/xmpp/util.js                                 |  137 +-
 dojox/xmpp/widget/ChatSession.js                   |    6 +-
 dojox/xmpp/xmppSession.js                          |  337 +-
 1262 files changed, 98189 insertions(+), 73028 deletions(-)

diff --git a/dijit/Calendar.js b/dijit/Calendar.js
new file mode 100644
index 0000000..caa633c
--- /dev/null
+++ b/dijit/Calendar.js
@@ -0,0 +1,252 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dijit.Calendar"]){
+dojo._hasResource["dijit.Calendar"]=true;
+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],{templateString:dojo.cache("dijit","templates/Calendar.html","<table cellspacing=\"0\" cellpadding=\"0\" class=\"dijitCalendarContainer\" role=\"grid\" dojoAttachEvent=\"onkeypress: _onKeyPress\">\n\t<thead>\n\t\t<tr class=\"dijitReset dijitCalendarMonthContainer\" valign=\"top\">\n\t\t\t<th class='dijitReset' dojoAttachPoint=\"decrementMonth\">\n\t\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitCalendarIncrementControl [...]
+dojo.deprecated("dijit.Calendar:setValue() is deprecated.  Use attr('value', ...) instead.","","2.0");
+this.attr("value",_1);
+},_getValueAttr:function(){
+var _2=new this.dateClassObj(this.value);
+_2.setHours(0,0,0,0);
+if(_2.getDate()<this.value.getDate()){
+_2=this.dateFuncObj.add(_2,"hour",1);
+}
+return _2;
+},_setValueAttr:function(_3){
+if(!this.value||this.dateFuncObj.compare(_3,this.value)){
+_3=new this.dateClassObj(_3);
+_3.setHours(1);
+this.displayMonth=new this.dateClassObj(_3);
+if(!this.isDisabledDate(_3,this.lang)){
+this.value=_3;
+this.onChange(this.attr("value"));
+}
+dojo.attr(this.domNode,"aria-label",this.dateLocaleModule.format(_3,{selector:"date",formatLength:"full"}));
+this._populateGrid();
+}
+},_setText:function(_4,_5){
+while(_4.firstChild){
+_4.removeChild(_4.firstChild);
+}
+_4.appendChild(dojo.doc.createTextNode(_5));
+},_populateGrid:function(){
+var _6=this.displayMonth;
+_6.setDate(1);
+var _7=_6.getDay(),_8=this.dateFuncObj.getDaysInMonth(_6),_9=this.dateFuncObj.getDaysInMonth(this.dateFuncObj.add(_6,"month",-1)),_a=new this.dateClassObj(),_b=dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);
+if(_b>_7){
+_b-=7;
+}
+dojo.query(".dijitCalendarDateTemplate",this.domNode).forEach(function(_c,i){
+i+=_b;
+var _d=new this.dateClassObj(_6),_e,_f="dijitCalendar",adj=0;
+if(i<_7){
+_e=_9-_7+i+1;
+adj=-1;
+_f+="Previous";
+}else{
+if(i>=(_7+_8)){
+_e=i-_7-_8+1;
+adj=1;
+_f+="Next";
+}else{
+_e=i-_7+1;
+_f+="Current";
+}
+}
+if(adj){
+_d=this.dateFuncObj.add(_d,"month",adj);
+}
+_d.setDate(_e);
+if(!this.dateFuncObj.compare(_d,_a,"date")){
+_f="dijitCalendarCurrentDate "+_f;
+}
+if(this._isSelectedDate(_d,this.lang)){
+_f="dijitCalendarSelectedDate "+_f;
+}
+if(this.isDisabledDate(_d,this.lang)){
+_f="dijitCalendarDisabledDate "+_f;
+}
+var _10=this.getClassForDate(_d,this.lang);
+if(_10){
+_f=_10+" "+_f;
+}
+_c.className=_f+"Month dijitCalendarDateTemplate";
+_c.dijitDateValue=_d.valueOf();
+var _11=dojo.query(".dijitCalendarDateLabel",_c)[0],_12=_d.getDateLocalized?_d.getDateLocalized(this.lang):_d.getDate();
+this._setText(_11,_12);
+},this);
+var _13=this.dateLocaleModule.getNames("months","wide","standAlone",this.lang);
+this._setText(this.monthLabelNode,_13[_6.getMonth()]);
+var y=_6.getFullYear()-1;
+var d=new this.dateClassObj();
+dojo.forEach(["previous","current","next"],function(_14){
+d.setFullYear(y++);
+this._setText(this[_14+"YearLabelNode"],this.dateLocaleModule.format(d,{selector:"year",locale:this.lang}));
+},this);
+var _15=this;
+var _16=function(_17,_18,adj){
+_15._connects.push(dijit.typematic.addMouseListener(_15[_17],_15,function(_19){
+if(_19>=0){
+_15._adjustDisplay(_18,adj);
+}
+},0.8,500));
+};
+_16("incrementMonth","month",1);
+_16("decrementMonth","month",-1);
+_16("nextYearLabelNode","year",1);
+_16("previousYearLabelNode","year",-1);
+},goToToday:function(){
+this.attr("value",this.dateClassObj());
+},constructor:function(_1a){
+var _1b=(_1a.datePackage&&(_1a.datePackage!="dojo.date"))?_1a.datePackage+".Date":"Date";
+this.dateClassObj=dojo.getObject(_1b,false);
+this.datePackage=_1a.datePackage||this.datePackage;
+this.dateFuncObj=dojo.getObject(this.datePackage,false);
+this.dateLocaleModule=dojo.getObject(this.datePackage+".locale",false);
+},postMixInProperties:function(){
+if(isNaN(this.value)){
+delete this.value;
+}
+this.inherited(arguments);
+},postCreate:function(){
+this.inherited(arguments);
+dojo.setSelectable(this.domNode,false);
+var _1c=dojo.hitch(this,function(_1d,n){
+var _1e=dojo.query(_1d,this.domNode)[0];
+for(var i=0;i<n;i++){
+_1e.parentNode.appendChild(_1e.cloneNode(true));
+}
+});
+_1c(".dijitCalendarDayLabelTemplate",6);
+_1c(".dijitCalendarDateTemplate",6);
+_1c(".dijitCalendarWeekTemplate",5);
+var _1f=this.dateLocaleModule.getNames("days",this.dayWidth,"standAlone",this.lang);
+var _20=dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);
+dojo.query(".dijitCalendarDayLabel",this.domNode).forEach(function(_21,i){
+this._setText(_21,_1f[(i+_20)%7]);
+},this);
+var _22=this.dateLocaleModule.getNames("months","wide","standAlone",this.lang);
+_1c(".dijitCalendarMonthLabelTemplate",_22.length-1);
+dojo.query(".dijitCalendarMonthLabelTemplate",this.domNode).forEach(function(_23,i){
+dojo.attr(_23,"month",i);
+this._setText(_23,_22[i]);
+dojo.place(_23.cloneNode(true),this.monthLabelSpacer);
+},this);
+var _24=this.value;
+this.value=null;
+this.attr("value",new this.dateClassObj(_24));
+},_onMenuHover:function(e){
+dojo.stopEvent(e);
+dojo.toggleClass(e.target,"dijitMenuItemHover");
+},_adjustDisplay:function(_25,_26){
+this.displayMonth=this.dateFuncObj.add(this.displayMonth,_25,_26);
+this._populateGrid();
+},_onMonthToggle:function(evt){
+dojo.stopEvent(evt);
+if(evt.type=="mousedown"){
+var _27=dojo.position(this.monthLabelNode);
+var dim={width:_27.w+"px",top:-this.displayMonth.getMonth()*_27.h+"px"};
+if((dojo.isIE&&dojo.isQuirks)||dojo.isIE<7){
+dim.left=-_27.w/2+"px";
+}
+dojo.style(this.monthDropDown,dim);
+this._popupHandler=this.connect(document,"onmouseup","_onMonthToggle");
+}else{
+this.disconnect(this._popupHandler);
+delete this._popupHandler;
+}
+dojo.toggleClass(this.monthDropDown,"dijitHidden");
+dojo.toggleClass(this.monthLabelNode,"dijitVisible");
+},_onMonthSelect:function(evt){
+this._onMonthToggle(evt);
+this.displayMonth.setMonth(dojo.attr(evt.target,"month"));
+this._populateGrid();
+},_onDayClick:function(evt){
+dojo.stopEvent(evt);
+for(var _28=evt.target;_28&&!_28.dijitDateValue;_28=_28.parentNode){
+}
+if(_28&&!dojo.hasClass(_28,"dijitCalendarDisabledDate")){
+this.attr("value",_28.dijitDateValue);
+this.onValueSelected(this.attr("value"));
+}
+},_onDayMouseOver:function(evt){
+var _29=evt.target;
+if(_29&&(_29.dijitDateValue||_29==this.previousYearLabelNode||_29==this.nextYearLabelNode)){
+dojo.addClass(_29,"dijitCalendarHoveredDate");
+this._currentNode=_29;
+}
+},_onDayMouseOut:function(evt){
+if(!this._currentNode){
+return;
+}
+for(var _2a=evt.relatedTarget;_2a;){
+if(_2a==this._currentNode){
+return;
+}
+try{
+_2a=_2a.parentNode;
+}
+catch(x){
+_2a=null;
+}
+}
+dojo.removeClass(this._currentNode,"dijitCalendarHoveredDate");
+this._currentNode=null;
+},_onKeyPress:function(evt){
+var dk=dojo.keys,_2b=-1,_2c,_2d=this.value;
+switch(evt.keyCode){
+case dk.RIGHT_ARROW:
+_2b=1;
+case dk.LEFT_ARROW:
+_2c="day";
+if(!this.isLeftToRight()){
+_2b*=-1;
+}
+break;
+case dk.DOWN_ARROW:
+_2b=1;
+case dk.UP_ARROW:
+_2c="week";
+break;
+case dk.PAGE_DOWN:
+_2b=1;
+case dk.PAGE_UP:
+_2c=evt.ctrlKey?"year":"month";
+break;
+case dk.END:
+_2d=this.dateFuncObj.add(_2d,"month",1);
+_2c="day";
+case dk.HOME:
+_2d=new Date(_2d).setDate(1);
+break;
+case dk.ENTER:
+this.onValueSelected(this.attr("value"));
+break;
+case dk.ESCAPE:
+default:
+return;
+}
+dojo.stopEvent(evt);
+if(_2c){
+_2d=this.dateFuncObj.add(_2d,_2c,_2b);
+}
+this.attr("value",_2d);
+},onValueSelected:function(_2e){
+},onChange:function(_2f){
+},_isSelectedDate:function(_30,_31){
+return !this.dateFuncObj.compare(_30,this.value,"date");
+},isDisabledDate:function(_32,_33){
+},getClassForDate:function(_34,_35){
+}});
+}
diff --git a/dijit/CheckedMenuItem.js b/dijit/CheckedMenuItem.js
index 6aa5d3b..cc18b16 100644
--- a/dijit/CheckedMenuItem.js
+++ b/dijit/CheckedMenuItem.js
@@ -9,7 +9,7 @@ if(!dojo._hasResource["dijit.CheckedMenuItem"]){
 dojo._hasResource["dijit.CheckedMenuItem"]=true;
 dojo.provide("dijit.CheckedMenuItem");
 dojo.require("dijit.MenuItem");
-dojo.declare("dijit.CheckedMenuItem",dijit.MenuItem,{templateString:"<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitemcheckbox\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset\" waiRole=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon dijitCheckedMenuItemIcon\" dojoAttachPoint=\"iconNode\">\n\t\t<span class=\"dijitCheckedMenuIte [...]
+dojo.declare("dijit.CheckedMenuItem",dijit.MenuItem,{templateString:dojo.cache("dijit","templates/CheckedMenuItem.html","<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitemcheckbox\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset\" waiRole=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon dijitCheckedMenuItemIcon\" dojoAttachPoint= [...]
 dojo.toggleClass(this.domNode,"dijitCheckedMenuItemChecked",_1);
 dijit.setWaiState(this.domNode,"checked",_1);
 this.checked=_1;
diff --git a/dijit/ColorPalette.js b/dijit/ColorPalette.js
index 4891585..300a378 100644
--- a/dijit/ColorPalette.js
+++ b/dijit/ColorPalette.js
@@ -13,98 +13,94 @@ dojo.require("dijit._Templated");
 dojo.require("dojo.colors");
 dojo.require("dojo.i18n");
 dojo.requireLocalization("dojo","colors",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
-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"," [...]
+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"," [...]
+this.inherited(arguments);
 dojo.mixin(this.divNode.style,this._paletteDims[this.palette]);
-this.imageNode.setAttribute("src",this._imagePaths[this.palette]);
+this.imageNode.setAttribute("src",this._imagePaths[this.palette].toString());
 var _1=this._palettes[this.palette];
 this.domNode.style.position="relative";
 this._cellNodes=[];
 this.colorNames=dojo.i18n.getLocalization("dojo","colors",this.lang);
 var _2=this._blankGif,_3=new dojo.Color(),_4=this._paletteCoords;
 for(var _5=0;_5<_1.length;_5++){
-for(var _6=0;_6<_1[_5].length;_6++){
-var _7=_1[_5][_6],_8=_3.setColor(dojo.Color.named[_7]);
-var _9=dojo.create("span",{"class":"dijitPaletteCell","tabindex":"-1",title:this.colorNames[_7],style:{top:_4.topOffset+(_5*_4.cHeight)+"px",left:_4.leftOffset+(_6*_4.cWidth)+"px"}});
-var _a=dojo.create("img",{src:_2,"class":"dijitPaletteImg",alt:this.colorNames[_7]},_9);
-_a.color=_8.toHex();
-var _b=_a.style;
-_b.color=_b.backgroundColor=_a.color;
-dojo.forEach(["Dijitclick","MouseEnter","Focus","Blur"],function(_c){
-this.connect(_9,"on"+_c.toLowerCase(),"_onCell"+_c);
+var _6=dojo.create("div",{role:"row"},this.divNode);
+for(var _7=0;_7<_1[_5].length;_7++){
+var _8=_1[_5][_7],_9=_3.setColor(dojo.Color.named[_8]);
+var _a=dojo.create("span",{"class":"dijitPaletteCell",tabIndex:"-1",title:this.colorNames[_8],style:{top:_4.topOffset+(_5*_4.cHeight)+"px",left:_4.leftOffset+(_7*_4.cWidth)+"px"}});
+var _b=dojo.create("img",{src:_2,"class":"dijitPaletteImg",alt:this.colorNames[_8]},_a);
+_b.color=_9.toHex();
+var _c=_b.style;
+_c.color=_c.backgroundColor=_b.color;
+dojo.forEach(["Dijitclick","MouseEnter","MouseLeave","Focus"],function(_d){
+this.connect(_a,"on"+_d.toLowerCase(),"_onCell"+_d);
 },this);
-dojo.place(_9,this.divNode);
-dijit.setWaiRole(_9,"gridcell");
-_9.index=this._cellNodes.length;
-this._cellNodes.push(_9);
+dojo.place(_a,_6);
+dijit.setWaiRole(_a,"gridcell");
+_a.index=this._cellNodes.length;
+this._cellNodes.push(_a);
 }
 }
 this._xDim=_1[0].length;
 this._yDim=_1.length;
-this.connect(this.divNode,"onfocus","_onDivNodeFocus");
-var _d={UP_ARROW:-this._xDim,DOWN_ARROW:this._xDim,RIGHT_ARROW:1,LEFT_ARROW:-1};
-for(var _e in _d){
-this._connects.push(dijit.typematic.addKeyListener(this.domNode,{charOrCode:dojo.keys[_e],ctrlKey:false,altKey:false,shiftKey:false},this,function(){
-var _f=_d[_e];
-return function(_10){
-this._navigateByKey(_f,_10);
+var _e={UP_ARROW:-this._xDim,DOWN_ARROW:this._xDim,RIGHT_ARROW:1,LEFT_ARROW:-1};
+for(var _f in _e){
+this._connects.push(dijit.typematic.addKeyListener(this.domNode,{charOrCode:dojo.keys[_f],ctrlKey:false,altKey:false,shiftKey:false},this,function(){
+var _10=_e[_f];
+return function(_11){
+this._navigateByKey(_10,_11);
 };
 }(),this.timeoutChangeRate,this.defaultTimeout));
 }
+},postCreate:function(){
+this.inherited(arguments);
+this._currentFocus=this._cellNodes[0];
+dojo.attr(this._currentFocus,"tabIndex",this.tabIndex);
 },focus:function(){
-this._focusFirst();
-},onChange:function(_11){
-},_focusFirst:function(){
-this._currentFocus=0;
-var _12=this._cellNodes[this._currentFocus];
-window.setTimeout(function(){
-dijit.focus(_12);
-},0);
-},_onDivNodeFocus:function(evt){
-if(evt.target===this.divNode){
-this._focusFirst();
-}
+dojo.addClass(this._currentFocus,"dijitPaletteCellHighlight");
+dijit.focus(this._currentFocus);
+},onChange:function(_12){
 },_onFocus:function(){
-dojo.attr(this.divNode,"tabindex","-1");
+dojo.addClass(this._currentFocus,"dijitPaletteCellHighlight");
+this.inherited(arguments);
 },_onBlur:function(){
-this._removeCellHighlight(this._currentFocus);
-dojo.attr(this.divNode,"tabindex",this.tabIndex);
+dojo.attr(this._currentFocus,"tabIndex","-1");
+dojo.removeClass(this._currentFocus,"dijitPaletteCellHighlight");
+this._currentFocus=this._cellNodes[0];
+dojo.attr(this._currentFocus,"tabIndex",this.tabIndex);
+this.inherited(arguments);
 },_onCellDijitclick:function(evt){
-var _15=evt.currentTarget;
-if(this._currentFocus!=_15.index){
-this._currentFocus=_15.index;
-window.setTimeout(function(){
-dijit.focus(_15);
-},0);
-}
-this._selectColor(_15);
+var _13=evt.currentTarget;
+this._selectColor(_13);
 dojo.stopEvent(evt);
 },_onCellMouseEnter:function(evt){
-var _17=evt.currentTarget;
-this._setCurrent(_17);
-window.setTimeout(function(){
-dijit.focus(_17);
-},0);
+var _14=evt.currentTarget;
+this._setCurrent(_14);
+},_onCellMouseLeave:function(evt){
+dojo.removeClass(this._currentFocus,"dijitPaletteCellHighlight");
 },_onCellFocus:function(evt){
 this._setCurrent(evt.currentTarget);
-},_setCurrent:function(_19){
-this._removeCellHighlight(this._currentFocus);
-this._currentFocus=_19.index;
-dojo.addClass(_19,"dijitPaletteCellHighlight");
-},_onCellBlur:function(evt){
-this._removeCellHighlight(this._currentFocus);
-},_removeCellHighlight:function(_1b){
-dojo.removeClass(this._cellNodes[_1b],"dijitPaletteCellHighlight");
-},_selectColor:function(_1c){
-var img=_1c.getElementsByTagName("img")[0];
+},_setCurrent:function(_15){
+if("_currentFocus" in this){
+dojo.attr(this._currentFocus,"tabIndex","-1");
+dojo.removeClass(this._currentFocus,"dijitPaletteCellHighlight");
+}
+this._currentFocus=_15;
+if(_15){
+dojo.attr(_15,"tabIndex",this.tabIndex);
+dojo.addClass(_15,"dijitPaletteCellHighlight");
+}
+},_selectColor:function(_16){
+var img=_16.getElementsByTagName("img")[0];
 this.onChange(this.value=img.color);
-},_navigateByKey:function(_1e,_1f){
-if(_1f==-1){
+},_navigateByKey:function(_17,_18){
+if(_18==-1){
 return;
 }
-var _20=this._currentFocus+_1e;
-if(_20<this._cellNodes.length&&_20>-1){
-var _21=this._cellNodes[_20];
-_21.focus();
+var _19=this._currentFocus.index+_17;
+if(_19<this._cellNodes.length&&_19>-1){
+var _1a=this._cellNodes[_19];
+this._setCurrent(_1a);
+setTimeout(dojo.hitch(dijit,"focus",_1a),0);
 }
 }});
 }
diff --git a/dijit/Declaration.js b/dijit/Declaration.js
index f90ae68..4ca4574 100644
--- a/dijit/Declaration.js
+++ b/dijit/Declaration.js
@@ -14,23 +14,23 @@ dojo.declare("dijit.Declaration",dijit._Widget,{_noScript:true,widgetClass:"",de
 var _1=this.srcNodeRef.parentNode.removeChild(this.srcNodeRef),_2=dojo.query("> script[type^='dojo/method'][event]",_1).orphan(),_3=dojo.query("> script[type^='dojo/method']",_1).orphan(),_4=dojo.query("> script[type^='dojo/connect']",_1).orphan(),_5=_1.nodeName;
 var _6=this.defaults||{};
 dojo.forEach(_2,function(s){
-var _8=s.getAttribute("event"),_9=dojo.parser._functionFromScript(s);
-_6[_8]=_9;
+var _7=s.getAttribute("event"),_8=dojo.parser._functionFromScript(s);
+_6[_7]=_8;
 });
-this.mixins=this.mixins.length?dojo.map(this.mixins,function(_a){
-return dojo.getObject(_a);
+this.mixins=this.mixins.length?dojo.map(this.mixins,function(_9){
+return dojo.getObject(_9);
 }):[dijit._Widget,dijit._Templated];
 _6.widgetsInTemplate=true;
 _6._skipNodeCache=true;
 _6.templateString="<"+_5+" class='"+_1.className+"' dojoAttachPoint='"+(_1.getAttribute("dojoAttachPoint")||"")+"' dojoAttachEvent='"+(_1.getAttribute("dojoAttachEvent")||"")+"' >"+_1.innerHTML.replace(/\%7B/g,"{").replace(/\%7D/g,"}")+"</"+_5+">";
-dojo.query("[dojoType]",_1).forEach(function(_b){
-_b.removeAttribute("dojoType");
+dojo.query("[dojoType]",_1).forEach(function(_a){
+_a.removeAttribute("dojoType");
 });
 var wc=dojo.declare(this.widgetClass,this.mixins,_6);
-var _d=_4.concat(_3);
-dojo.forEach(_d,function(s){
-var _f=s.getAttribute("event")||"postscript",_10=dojo.parser._functionFromScript(s);
-dojo.connect(wc.prototype,_f,_10);
+var _b=_4.concat(_3);
+dojo.forEach(_b,function(s){
+var _c=s.getAttribute("event")||"postscript",_d=dojo.parser._functionFromScript(s);
+dojo.connect(wc.prototype,_c,_d);
 });
 }});
 }
diff --git a/dijit/Dialog.js b/dijit/Dialog.js
index 6284e6f..e0017cd 100644
--- a/dijit/Dialog.js
+++ b/dijit/Dialog.js
@@ -18,12 +18,12 @@ dojo.require("dijit._DialogMixin");
 dojo.require("dijit.DialogUnderlay");
 dojo.require("dijit.layout.ContentPane");
 dojo.requireLocalization("dijit","common",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
-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\"></span>\n\t<span dojoAttachPoint=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" dojoAt [...]
+dojo.declare("dijit._DialogBase",[dijit._Templated,dijit.form._FormMixin,dijit._DialogMixin],{templateString:dojo.cache("dijit","templates/Dialog.html","<div class=\"dijitDialog\" tabindex=\"-1\" waiRole=\"dialog\" waiState=\"labelledby-${id}_title\">\n\t<div dojoAttachPoint=\"titleBar\" class=\"dijitDialogTitleBar\">\n\t<span dojoAttachPoint=\"titleNode\" class=\"dijitDialogTitle\" id=\"${id}_title\"></span>\n\t<span dojoAttachPoint=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" doj [...]
 var _1=dojo.i18n.getLocalization("dijit","common");
 dojo.mixin(this,_1);
 this.inherited(arguments);
 },postCreate:function(){
-dojo.style(this.domNode,{visibility:"hidden",position:"absolute",display:"",top:"-9999px"});
+dojo.style(this.domNode,{display:"none",position:"absolute"});
 dojo.body().appendChild(this.domNode);
 this.inherited(arguments);
 this.connect(this,"onExecute","hide");
@@ -34,101 +34,140 @@ this._position();
 this.inherited(arguments);
 },_endDrag:function(e){
 if(e&&e.node&&e.node===this.domNode){
-var vp=dijit.getViewport();
-var p=e._leftTop||dojo.coords(e.node,true);
-this._relativePosition={t:p.t-vp.t,l:p.l-vp.l};
+this._relativePosition=dojo.position(e.node);
 }
 },_setup:function(){
-var _5=this.domNode;
+var _2=this.domNode;
 if(this.titleBar&&this.draggable){
-this._moveable=(dojo.isIE==6)?new dojo.dnd.TimedMoveable(_5,{handle:this.titleBar}):new dojo.dnd.Moveable(_5,{handle:this.titleBar,timeout:0});
+this._moveable=(dojo.isIE==6)?new dojo.dnd.TimedMoveable(_2,{handle:this.titleBar}):new dojo.dnd.Moveable(_2,{handle:this.titleBar,timeout:0});
 dojo.subscribe("/dnd/move/stop",this,"_endDrag");
 }else{
-dojo.addClass(_5,"dijitDialogFixed");
+dojo.addClass(_2,"dijitDialogFixed");
 }
-var _6={dialogId:this.id,"class":dojo.map(this["class"].split(/\s/),function(s){
+this.underlayAttrs={dialogId:this.id,"class":dojo.map(this["class"].split(/\s/),function(s){
 return s+"_underlay";
 }).join(" ")};
-var _8=dijit._underlay;
-if(!_8){
-_8=dijit._underlay=new dijit.DialogUnderlay(_6);
-}
-this._fadeIn=dojo.fadeIn({node:_5,duration:this.duration,beforeBegin:function(){
-_8.attr(_6);
-_8.show();
-},onEnd:dojo.hitch(this,function(){
+this._fadeIn=dojo.fadeIn({node:_2,duration:this.duration,beforeBegin:dojo.hitch(this,function(){
+var _3=dijit._underlay;
+if(!_3){
+_3=dijit._underlay=new dijit.DialogUnderlay(this.underlayAttrs);
+}else{
+_3.attr(this.underlayAttrs);
+}
+var _4=948+dijit._dialogStack.length*2;
+dojo.style(dijit._underlay.domNode,"zIndex",_4);
+dojo.style(this.domNode,"zIndex",_4+1);
+_3.show();
+}),onEnd:dojo.hitch(this,function(){
 if(this.autofocus){
 this._getFocusItems(this.domNode);
 dijit.focus(this._firstFocusItem);
 }
 })});
-this._fadeOut=dojo.fadeOut({node:_5,duration:this.duration,onEnd:function(){
-_5.style.visibility="hidden";
-_5.style.top="-9999px";
+this._fadeOut=dojo.fadeOut({node:_2,duration:this.duration,onEnd:dojo.hitch(this,function(){
+_2.style.display="none";
+var ds=dijit._dialogStack;
+if(ds.length==0){
 dijit._underlay.hide();
-}});
+}else{
+dojo.style(dijit._underlay.domNode,"zIndex",948+ds.length*2);
+dijit._underlay.attr(ds[ds.length-1].underlayAttrs);
+}
+if(this.refocus){
+var _5=this._savedFocus;
+if(ds.length>0){
+var pd=ds[ds.length-1];
+if(!dojo.isDescendant(_5.node,pd.domNode)){
+pd._getFocusItems(pd.domNode);
+_5=pd._firstFocusItem;
+}
+}
+dijit.focus(_5);
+}
+})});
 },uninitialize:function(){
-var _9=false;
+var _6=false;
 if(this._fadeIn&&this._fadeIn.status()=="playing"){
-_9=true;
+_6=true;
 this._fadeIn.stop();
 }
 if(this._fadeOut&&this._fadeOut.status()=="playing"){
-_9=true;
+_6=true;
 this._fadeOut.stop();
 }
-if(this.open||_9){
+if(this.open||_6){
 dijit._underlay.hide();
 }
 if(this._moveable){
 this._moveable.destroy();
 }
+this.inherited(arguments);
 },_size:function(){
+this._checkIfSingleChild();
+if(this._singleChild){
+if(this._singleChildOriginalStyle){
+this._singleChild.domNode.style.cssText=this._singleChildOriginalStyle;
+}
+delete this._singleChildOriginalStyle;
+}else{
+dojo.style(this.containerNode,{width:"auto",height:"auto"});
+}
 var mb=dojo.marginBox(this.domNode);
-var _b=dijit.getViewport();
-if(mb.w>=_b.w||mb.h>=_b.h){
-dojo.style(this.containerNode,{width:Math.min(mb.w,Math.floor(_b.w*0.75))+"px",height:Math.min(mb.h,Math.floor(_b.h*0.75))+"px",overflow:"auto",position:"relative"});
+var _7=dijit.getViewport();
+if(mb.w>=_7.w||mb.h>=_7.h){
+var w=Math.min(mb.w,Math.floor(_7.w*0.75)),h=Math.min(mb.h,Math.floor(_7.h*0.75));
+if(this._singleChild&&this._singleChild.resize){
+this._singleChildOriginalStyle=this._singleChild.domNode.style.cssText;
+this._singleChild.resize({w:w,h:h});
+}else{
+dojo.style(this.containerNode,{width:w+"px",height:h+"px",overflow:"auto",position:"relative"});
+}
+}else{
+if(this._singleChild&&this._singleChild.resize){
+this._singleChild.resize();
+}
 }
 },_position:function(){
 if(!dojo.hasClass(dojo.body(),"dojoMove")){
-var _c=this.domNode;
-var _d=dijit.getViewport();
-var p=this._relativePosition;
-var mb=p?null:dojo.marginBox(_c);
-dojo.style(_c,{left:Math.floor(_d.l+(p?p.l:(_d.w-mb.w)/2))+"px",top:Math.floor(_d.t+(p?p.t:(_d.h-mb.h)/2))+"px"});
+var _8=this.domNode,_9=dijit.getViewport(),p=this._relativePosition,bb=p?null:dojo._getBorderBox(_8),l=Math.floor(_9.l+(p?p.x:(_9.w-bb.w)/2)),t=Math.floor(_9.t+(p?p.y:(_9.h-bb.h)/2));
+dojo.style(_8,{left:l+"px",top:t+"px"});
+}
+},_onKey:function(_a){
+var ds=dijit._dialogStack;
+if(ds[ds.length-1]!=this){
+return;
 }
-},_onKey:function(evt){
-if(evt.charOrCode){
+if(_a.charOrCode){
 var dk=dojo.keys;
-var _12=evt.target;
-if(evt.charOrCode===dk.TAB){
+var _b=_a.target;
+if(_a.charOrCode===dk.TAB){
 this._getFocusItems(this.domNode);
 }
-var _13=(this._firstFocusItem==this._lastFocusItem);
-if(_12==this._firstFocusItem&&evt.shiftKey&&evt.charOrCode===dk.TAB){
-if(!_13){
+var _c=(this._firstFocusItem==this._lastFocusItem);
+if(_b==this._firstFocusItem&&_a.shiftKey&&_a.charOrCode===dk.TAB){
+if(!_c){
 dijit.focus(this._lastFocusItem);
 }
-dojo.stopEvent(evt);
+dojo.stopEvent(_a);
 }else{
-if(_12==this._lastFocusItem&&evt.charOrCode===dk.TAB&&!evt.shiftKey){
-if(!_13){
+if(_b==this._lastFocusItem&&_a.charOrCode===dk.TAB&&!_a.shiftKey){
+if(!_c){
 dijit.focus(this._firstFocusItem);
 }
-dojo.stopEvent(evt);
+dojo.stopEvent(_a);
 }else{
-while(_12){
-if(_12==this.domNode){
-if(evt.charOrCode==dk.ESCAPE){
+while(_b){
+if(_b==this.domNode||dojo.hasClass(_b,"dijitPopup")){
+if(_a.charOrCode==dk.ESCAPE){
 this.onCancel();
 }else{
 return;
 }
 }
-_12=_12.parentNode;
+_b=_b.parentNode;
 }
-if(evt.charOrCode!==dk.TAB){
-dojo.stopEvent(evt);
+if(_a.charOrCode!==dk.TAB){
+dojo.stopEvent(_a);
 }else{
 if(!dojo.isOpera){
 try{
@@ -154,46 +193,46 @@ this._fadeOut.stop();
 }
 this._modalconnects.push(dojo.connect(window,"onscroll",this,"layout"));
 this._modalconnects.push(dojo.connect(window,"onresize",this,function(){
-var _14=dijit.getViewport();
-if(!this._oldViewport||_14.h!=this._oldViewport.h||_14.w!=this._oldViewport.w){
+var _d=dijit.getViewport();
+if(!this._oldViewport||_d.h!=this._oldViewport.h||_d.w!=this._oldViewport.w){
 this.layout();
-this._oldViewport=_14;
+this._oldViewport=_d;
 }
 }));
 this._modalconnects.push(dojo.connect(dojo.doc.documentElement,"onkeypress",this,"_onKey"));
-dojo.style(this.domNode,{opacity:0,visibility:""});
-if(this._fixSizes){
-dojo.style(this.containerNode,{width:"auto",height:"auto"});
-}
+dojo.style(this.domNode,{opacity:0,display:""});
 this.open=true;
 this._onShow();
 this._size();
 this._position();
+dijit._dialogStack.push(this);
 this._fadeIn.play();
 this._savedFocus=dijit.getFocus(this);
 },hide:function(){
-if(!this._alreadyInitialized){
+var ds=dijit._dialogStack;
+if(!this._alreadyInitialized||this!=ds[ds.length-1]){
 return;
 }
 if(this._fadeIn.status()=="playing"){
 this._fadeIn.stop();
 }
+ds.pop();
 this._fadeOut.play();
 if(this._scrollConnected){
 this._scrollConnected=false;
 }
 dojo.forEach(this._modalconnects,dojo.disconnect);
 this._modalconnects=[];
-if(this.refocus){
-this.connect(this._fadeOut,"onEnd",dojo.hitch(dijit,"focus",this._savedFocus));
-}
 if(this._relativePosition){
 delete this._relativePosition;
 }
 this.open=false;
+this.onHide();
 },layout:function(){
-if(this.domNode.style.visibility!="hidden"){
+if(this.domNode.style.display!="none"){
+if(dijit._underlay){
 dijit._underlay.layout();
+}
 this._position();
 }
 },destroy:function(){
@@ -207,5 +246,7 @@ dojo.addClass(this.closeButtonNode,"dijitDialogCloseIcon-hover");
 },_onCloseLeave:function(){
 dojo.removeClass(this.closeButtonNode,"dijitDialogCloseIcon-hover");
 }});
+dojo.declare("dijit.Dialog",[dijit.layout.ContentPane,dijit._DialogBase],{});
+dijit._dialogStack=[];
 dojo.require("dijit.TooltipDialog");
 }
diff --git a/dijit/DialogUnderlay.js b/dijit/DialogUnderlay.js
index e1b897a..99405b9 100644
--- a/dijit/DialogUnderlay.js
+++ b/dijit/DialogUnderlay.js
@@ -12,34 +12,30 @@ dojo.require("dijit._Widget");
 dojo.require("dijit._Templated");
 dojo.declare("dijit.DialogUnderlay",[dijit._Widget,dijit._Templated],{templateString:"<div class='dijitDialogUnderlayWrapper'><div class='dijitDialogUnderlay' dojoAttachPoint='node'></div></div>",dialogId:"","class":"",attributeMap:{id:"domNode"},_setDialogIdAttr:function(id){
 dojo.attr(this.node,"id",id+"_underlay");
-},_setClassAttr:function(_2){
-this.node.className="dijitDialogUnderlay "+_2;
+},_setClassAttr:function(_1){
+this.node.className="dijitDialogUnderlay "+_1;
 },postCreate:function(){
 dojo.body().appendChild(this.domNode);
-this.bgIframe=new dijit.BackgroundIframe(this.domNode);
 },layout:function(){
 var is=this.node.style,os=this.domNode.style;
 os.display="none";
-var _5=dijit.getViewport();
-os.top=_5.t+"px";
-os.left=_5.l+"px";
-is.width=_5.w+"px";
-is.height=_5.h+"px";
+var _2=dijit.getViewport();
+os.top=_2.t+"px";
+os.left=_2.l+"px";
+is.width=_2.w+"px";
+is.height=_2.h+"px";
 os.display="block";
 },show:function(){
 this.domNode.style.display="block";
 this.layout();
-if(this.bgIframe.iframe){
-this.bgIframe.iframe.style.display="block";
-}
+this.bgIframe=new dijit.BackgroundIframe(this.domNode);
 },hide:function(){
+this.bgIframe.destroy();
 this.domNode.style.display="none";
-if(this.bgIframe.iframe){
-this.bgIframe.iframe.style.display="none";
-}
 },uninitialize:function(){
 if(this.bgIframe){
 this.bgIframe.destroy();
 }
+this.inherited(arguments);
 }});
 }
diff --git a/dijit/Editor.js b/dijit/Editor.js
index e63aa26..459e66a 100644
--- a/dijit/Editor.js
+++ b/dijit/Editor.js
@@ -25,6 +25,7 @@ this._plugins=[];
 this._editInterval=this.editActionInterval*1000;
 if(dojo.isIE){
 this.events.push("onBeforeDeactivate");
+this.events.push("onBeforeActivate");
 }
 },postCreate:function(){
 if(this.customUndo){
@@ -54,35 +55,37 @@ this._plugins=[];
 this.toolbar.destroyRecursive();
 delete this.toolbar;
 this.inherited(arguments);
-},addPlugin:function(_2,_3){
-var _4=dojo.isString(_2)?{name:_2}:_2;
-if(!_4.setEditor){
-var o={"args":_4,"plugin":null,"editor":this};
+},addPlugin:function(_1,_2){
+var _3=dojo.isString(_1)?{name:_1}:_1;
+if(!_3.setEditor){
+var o={"args":_3,"plugin":null,"editor":this};
 dojo.publish(dijit._scopeName+".Editor.getPlugin",[o]);
 if(!o.plugin){
-var pc=dojo.getObject(_4.name);
+var pc=dojo.getObject(_3.name);
 if(pc){
-o.plugin=new pc(_4);
+o.plugin=new pc(_3);
 }
 }
 if(!o.plugin){
-console.warn("Cannot find plugin",_2);
+console.warn("Cannot find plugin",_1);
 return;
 }
-_2=o.plugin;
+_1=o.plugin;
 }
 if(arguments.length>1){
-this._plugins[_3]=_2;
+this._plugins[_2]=_1;
 }else{
-this._plugins.push(_2);
+this._plugins.push(_1);
 }
-_2.setEditor(this);
-if(dojo.isFunction(_2.setToolbar)){
-_2.setToolbar(this.toolbar);
+_1.setEditor(this);
+if(dojo.isFunction(_1.setToolbar)){
+_1.setToolbar(this.toolbar);
 }
 },startup:function(){
-},resize:function(_7){
+},resize:function(_4){
+if(_4){
 dijit.layout._LayoutWidget.prototype.resize.apply(this,arguments);
+}
 },layout:function(){
 this.editingArea.style.height=(this._contentBox.h-dojo.marginBox(this.toolbar.domNode).h)+"px";
 if(this.iframe){
@@ -90,20 +93,27 @@ this.iframe.style.height="100%";
 }
 this._layoutMode=true;
 },_onIEMouseDown:function(e){
+var _5=this.document.body.componentFromPoint(e.x,e.y);
+if(!_5){
 delete this._savedSelection;
 if(e.target.tagName=="BODY"){
 setTimeout(dojo.hitch(this,"placeCursorAtEnd"),0);
 }
 this.inherited(arguments);
+}
+},onBeforeActivate:function(e){
+this._restoreSelection();
 },onBeforeDeactivate:function(e){
 if(this.customUndo){
 this.endEditing(true);
 }
+if(e.target.tagName!="BODY"){
 this._saveSelection();
-},customUndo:dojo.isIE,editActionInterval:3,beginEditing:function(_a){
+}
+},customUndo:dojo.isIE,editActionInterval:3,beginEditing:function(_6){
 if(!this._inEditing){
 this._inEditing=true;
-this._beginEditing(_a);
+this._beginEditing(_6);
 }
 if(this.editActionInterval>0){
 if(this._editTimer){
@@ -111,24 +121,25 @@ clearTimeout(this._editTimer);
 }
 this._editTimer=setTimeout(dojo.hitch(this,this.endEditing),this._editInterval);
 }
-},_steps:[],_undoedSteps:[],execCommand:function(_b){
-if(this.customUndo&&(_b=="undo"||_b=="redo")){
-return this[_b]();
+},_steps:[],_undoedSteps:[],execCommand:function(_7){
+if(this.customUndo&&(_7=="undo"||_7=="redo")){
+return this[_7]();
 }else{
 if(this.customUndo){
 this.endEditing();
 this._beginEditing();
 }
+var r;
 try{
-var r=this.inherited("execCommand",arguments);
-if(dojo.isWebKit&&_b=="paste"&&!r){
+r=this.inherited("execCommand",arguments);
+if(dojo.isWebKit&&_7=="paste"&&!r){
 throw {code:1011};
 }
 }
 catch(e){
-if(e.code==1011&&/copy|cut|paste/.test(_b)){
-var _d=dojo.string.substitute,_e={cut:"X",copy:"C",paste:"V"},_f=navigator.userAgent.indexOf("Macintosh")!=-1;
-alert(_d(this.commands.systemShortcut,[this.commands[_b],_d(this.commands[_f?"appleKey":"ctrlKey"],[_e[_b]])]));
+if(e.code==1011&&/copy|cut|paste/.test(_7)){
+var _8=dojo.string.substitute,_9={cut:"X",copy:"C",paste:"V"};
+alert(_8(this.commands.systemShortcut,[this.commands[_7],_8(this.commands[dojo.isMac?"appleKey":"ctrlKey"],[_9[_7]])]));
 }
 r=false;
 }
@@ -137,38 +148,31 @@ this._endEditing();
 }
 return r;
 }
-},queryCommandEnabled:function(cmd){
-if(this.customUndo&&(cmd=="undo"||cmd=="redo")){
-return cmd=="undo"?(this._steps.length>1):(this._undoedSteps.length>0);
+},queryCommandEnabled:function(_a){
+if(this.customUndo&&(_a=="undo"||_a=="redo")){
+return _a=="undo"?(this._steps.length>1):(this._undoedSteps.length>0);
 }else{
 return this.inherited("queryCommandEnabled",arguments);
 }
-},focus:function(){
-var _11=0;
-if(this._savedSelection&&dojo.isIE){
-_11=dijit._curFocus!=this.editNode;
-}
-this.inherited(arguments);
-if(_11){
-this._restoreSelection();
-}
 },_moveToBookmark:function(b){
-var _13=b;
+var _b=b.mark;
+var _c=b.mark;
+var _d=b.isCollapsed;
 if(dojo.isIE){
-if(dojo.isArray(b)){
-_13=[];
-dojo.forEach(b,function(n){
-_13.push(dijit.range.getNode(n,this.editNode));
+if(dojo.isArray(_c)){
+_b=[];
+dojo.forEach(_c,function(n){
+_b.push(dijit.range.getNode(n,this.editNode));
 },this);
 }
 }else{
-var r=dijit.range.create();
+var r=dijit.range.create(this.window);
 r.setStart(dijit.range.getNode(b.startContainer,this.editNode),b.startOffset);
 r.setEnd(dijit.range.getNode(b.endContainer,this.editNode),b.endOffset);
-_13=r;
+_b=r;
 }
-dojo.withGlobal(this.window,"moveToBookmark",dijit,[_13]);
-},_changeToStep:function(_16,to){
+dojo.withGlobal(this.window,"moveToBookmark",dijit,[{mark:_b,isCollapsed:_d}]);
+},_changeToStep:function(_e,to){
 this.setValue(to.text);
 var b=to.bookmark;
 if(!b){
@@ -197,34 +201,37 @@ this.onDisplayChanged();
 return true;
 }
 return false;
-},endEditing:function(_1b){
+},endEditing:function(_f){
 if(this._editTimer){
 clearTimeout(this._editTimer);
 }
 if(this._inEditing){
-this._endEditing(_1b);
+this._endEditing(_f);
 this._inEditing=false;
 }
 },_getBookmark:function(){
 var b=dojo.withGlobal(this.window,dijit.getBookmark);
 var tmp=[];
+if(b.mark){
+var _10=b.mark;
 if(dojo.isIE){
-if(dojo.isArray(b)){
-dojo.forEach(b,function(n){
+if(dojo.isArray(_10)){
+dojo.forEach(_10,function(n){
 tmp.push(dijit.range.getIndex(n,this.editNode).o);
 },this);
-b=tmp;
+b.mark=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};
+tmp=dijit.range.getIndex(_10.startContainer,this.editNode).o;
+b.mark={startContainer:tmp,startOffset:_10.startOffset,endContainer:_10.endContainer===_10.startContainer?tmp:dijit.range.getIndex(_10.endContainer,this.editNode).o,endOffset:_10.endOffset};
+}
 }
 return b;
 },_beginEditing:function(cmd){
 if(this._steps.length===0){
 this._steps.push({"text":this.savedContent,"bookmark":this._getBookmark()});
 }
-},_endEditing:function(_20){
+},_endEditing:function(_11){
 var v=this.getValue(true);
 this._undoedSteps=[];
 this._steps.push({text:v,bookmark:this._getBookmark()});
@@ -305,9 +312,6 @@ this._moveToBookmark(this._savedSelection);
 }
 delete this._savedSelection;
 }
-},_onFocus:function(){
-setTimeout(dojo.hitch(this,"_restoreSelection"),0);
-this.inherited(arguments);
 },onClick:function(){
 this.endEditing(true);
 this.inherited(arguments);
@@ -316,10 +320,10 @@ dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
 if(o.plugin){
 return;
 }
-var _26=o.args,p;
-var _p=dijit._editor._Plugin;
-var _29=_26.name;
-switch(_29){
+var _12=o.args,p;
+var _13=dijit._editor._Plugin;
+var _14=_12.name;
+switch(_14){
 case "undo":
 case "redo":
 case "cut":
@@ -338,7 +342,7 @@ case "selectAll":
 case "removeFormat":
 case "unlink":
 case "insertHorizontalRule":
-p=new _p({command:_29});
+p=new _13({command:_14});
 break;
 case "bold":
 case "italic":
@@ -346,10 +350,10 @@ case "underline":
 case "strikethrough":
 case "subscript":
 case "superscript":
-p=new _p({buttonClass:dijit.form.ToggleButton,command:_29});
+p=new _13({buttonClass:dijit.form.ToggleButton,command:_14});
 break;
 case "|":
-p=new _p({button:new dijit.ToolbarSeparator()});
+p=new _13({button:new dijit.ToolbarSeparator()});
 }
 o.plugin=p;
 });
diff --git a/dijit/InlineEditBox.js b/dijit/InlineEditBox.js
index 6a13b40..768d525 100644
--- a/dijit/InlineEditBox.js
+++ b/dijit/InlineEditBox.js
@@ -14,7 +14,7 @@ dojo.require("dijit._Container");
 dojo.require("dijit.form.Button");
 dojo.require("dijit.form.TextBox");
 dojo.requireLocalization("dijit","common",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
-dojo.declare("dijit.InlineEditBox",dijit._Widget,{editing:false,autoSave:true,buttonSave:"",buttonCancel:"",renderAsHtml:false,editor:"dijit.form.TextBox",editorParams:{},onChange:function(_1){
+dojo.declare("dijit.InlineEditBox",dijit._Widget,{editing:false,autoSave:true,buttonSave:"",buttonCancel:"",renderAsHtml:false,editor:"dijit.form.TextBox",editorWrapper:"dijit._InlineEditor",editorParams:{},onChange:function(_1){
 },onCancel:function(){
 },width:"100%",value:"",noValueIndicator:"<span style='font-family: wingdings; text-decoration: underline;'>    &#x270d;    </span>",constructor:function(){
 this.editorParams={};
@@ -36,6 +36,11 @@ this.attr("disabled",_4);
 },_setDisabledAttr:function(_5){
 this.disabled=_5;
 dijit.setWaiState(this.domNode,"disabled",_5);
+if(_5){
+this.displayNode.removeAttribute("tabIndex");
+}else{
+this.displayNode.setAttribute("tabIndex",0);
+}
 },_onMouseOver:function(){
 dojo.addClass(this.displayNode,this.disabled?"dijitDisabledClickableRegion":"dijitClickableRegion");
 },_onMouseOut:function(){
@@ -54,155 +59,162 @@ if(this.disabled||this.editing){
 return;
 }
 this.editing=true;
-var _7=(this.renderAsHtml?this.value:this.value.replace(/\s*\r?\n\s*/g,"").replace(/<br\/?>/gi,"\n").replace(/>/g,">").replace(/</g,"<").replace(/&/g,"&").replace(/"/g,"\""));
-var _8=dojo.create("span",null,this.domNode,"before");
-var ew=this.editWidget=new dijit._InlineEditor({value:dojo.trim(_7),autoSave:this.autoSave,buttonSave:this.buttonSave,buttonCancel:this.buttonCancel,renderAsHtml:this.renderAsHtml,editor:this.editor,editorParams:this.editorParams,sourceStyle:dojo.getComputedStyle(this.displayNode),save:dojo.hitch(this,"save"),cancel:dojo.hitch(this,"cancel"),width:this.width},_8);
-var _a=ew.domNode.style;
-this.displayNode.style.display="none";
-_a.position="static";
-_a.visibility="visible";
-this.domNode=ew.domNode;
-setTimeout(function(){
-ew.focus();
-ew._resetValue=ew.getValue();
-},100);
-},_showText:function(_b){
-this.displayNode.style.display="";
-var ew=this.editWidget;
-var _d=ew.domNode.style;
-_d.position="absolute";
-_d.visibility="hidden";
-this.domNode=this.displayNode;
-if(_b){
-dijit.focus(this.displayNode);
+this._savedPosition=dojo.style(this.displayNode,"position")||"static";
+this._savedOpacity=dojo.style(this.displayNode,"opacity")||"1";
+this._savedTabIndex=dojo.attr(this.displayNode,"tabIndex")||"0";
+if(this.wrapperWidget){
+this.wrapperWidget.editWidget.attr("displayedValue" in this.editorParams?"displayedValue":"value",this.value);
+}else{
+var _6=dojo.create("span",null,this.domNode,"before");
+var _7=dojo.getObject(this.editorWrapper);
+this.wrapperWidget=new _7({value:this.value,buttonSave:this.buttonSave,buttonCancel:this.buttonCancel,tabIndex:this._savedTabIndex,editor:this.editor,inlineEditBox:this,sourceStyle:dojo.getComputedStyle(this.displayNode),save:dojo.hitch(this,"save"),cancel:dojo.hitch(this,"cancel")},_6);
 }
-_d.display="none";
-setTimeout(function(){
-ew.destroy();
-delete ew;
+var ww=this.wrapperWidget;
 if(dojo.isIE){
 dijit.focus(dijit.getFocus());
 }
-},1000);
-},save:function(_e){
+dojo.style(this.displayNode,{position:"absolute",opacity:"0",display:"none"});
+dojo.style(ww.domNode,{position:this._savedPosition,visibility:"visible",opacity:"1"});
+dojo.attr(this.displayNode,"tabIndex","-1");
+setTimeout(dojo.hitch(this,function(){
+ww.focus();
+ww._resetValue=ww.getValue();
+}),0);
+},_onBlur:function(){
+this.inherited(arguments);
+if(!this.editing){
+setTimeout(dojo.hitch(this,function(){
+if(this.wrapperWidget){
+this.wrapperWidget.destroy();
+delete this.wrapperWidget;
+}
+}),0);
+}
+},_showText:function(_8){
+var ww=this.wrapperWidget;
+dojo.style(ww.domNode,{position:"absolute",visibility:"hidden",opacity:"0"});
+dojo.style(this.displayNode,{position:this._savedPosition,opacity:this._savedOpacity,display:""});
+dojo.attr(this.displayNode,"tabIndex",this._savedTabIndex);
+if(_8){
+dijit.focus(this.displayNode);
+}
+},save:function(_9){
 if(this.disabled||!this.editing){
 return;
 }
 this.editing=false;
-var _f=this.editWidget.getValue()+"";
-this.attr("value",this.renderAsHtml?_f:_f.replace(/&/gm,"&").replace(/</gm,"<").replace(/>/gm,">").replace(/"/gm,""").replace(/\n/g,"<br>"));
-this.onChange(_f);
-this._showText(_e);
-},setValue:function(val){
+var ww=this.wrapperWidget;
+var _a=ww.getValue();
+this.attr("value",_a);
+setTimeout(dojo.hitch(this,"onChange",_a),0);
+this._showText(_9);
+},setValue:function(_b){
 dojo.deprecated("dijit.InlineEditBox.setValue() is deprecated.  Use attr('value', ...) instead.","","2.0");
-return this.attr("value",val);
-},_setValueAttr:function(val){
-this.value=val;
-this.displayNode.innerHTML=dojo.trim(val)||this.noValueIndicator;
+return this.attr("value",_b);
+},_setValueAttr:function(_c){
+this.value=_c=dojo.trim(_c);
+if(!this.renderAsHtml){
+_c=_c.replace(/&/gm,"&").replace(/</gm,"<").replace(/>/gm,">").replace(/"/gm,""").replace(/\n/g,"<br>");
+}
+this.displayNode.innerHTML=_c||this.noValueIndicator;
 },getValue:function(){
 dojo.deprecated("dijit.InlineEditBox.getValue() is deprecated.  Use attr('value') instead.","","2.0");
 return this.attr("value");
-},cancel:function(_12){
+},cancel:function(_d){
+if(this.disabled||!this.editing){
+return;
+}
 this.editing=false;
-this.onCancel();
-this._showText(_12);
+setTimeout(dojo.hitch(this,"onCancel"),0);
+this._showText(_d);
 }});
-dojo.declare("dijit._InlineEditor",[dijit._Widget,dijit._Templated],{templateString:"<span dojoAttachPoint=\"editNode\" waiRole=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\n\tdojoAttachEvent=\"onkeypress: _onKeyPress\" \n\t><span dojoAttachPoint=\"editorPlaceholder\"></span\n\t><span dojoAttachPoint=\"buttonContainer\"\n\t\t><button class='saveButton' dojoAttachPoint=\"saveButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onCl [...]
+dojo.declare("dijit._InlineEditor",[dijit._Widget,dijit._Templated],{templateString:dojo.cache("dijit","templates/InlineEditBox.html","<span dojoAttachPoint=\"editNode\" waiRole=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\n\tdojoAttachEvent=\"onkeypress: _onKeyPress\"\n\t><span dojoAttachPoint=\"editorPlaceholder\"></span\n\t><span dojoAttachPoint=\"buttonContainer\"\n\t\t><button class='saveButton' dojoAttachPoint=\"saveButton\" dojo [...]
 this.inherited(arguments);
 this.messages=dojo.i18n.getLocalization("dijit","common",this.lang);
-dojo.forEach(["buttonSave","buttonCancel"],function(_13){
-if(!this[_13]){
-this[_13]=this.messages[_13];
+dojo.forEach(["buttonSave","buttonCancel"],function(_e){
+if(!this[_e]){
+this[_e]=this.messages[_e];
 }
 },this);
 },postCreate:function(){
-var cls=dojo.getObject(this.editor);
-var _15=this.sourceStyle;
-var _16="line-height:"+_15.lineHeight+";";
-dojo.forEach(["Weight","Family","Size","Style"],function(_17){
-_16+="font-"+_17+":"+_15["font"+_17]+";";
+var _f=dojo.getObject(this.editor);
+var _10=this.sourceStyle;
+var _11="line-height:"+_10.lineHeight+";";
+dojo.forEach(["Weight","Family","Size","Style"],function(_12){
+_11+="font-"+_12+":"+_10["font"+_12]+";";
 },this);
-dojo.forEach(["marginTop","marginBottom","marginLeft","marginRight"],function(_18){
-this.domNode.style[_18]=_15[_18];
+dojo.forEach(["marginTop","marginBottom","marginLeft","marginRight"],function(_13){
+this.domNode.style[_13]=_10[_13];
 },this);
-if(this.width=="100%"){
-_16+="width:100%;";
+var _14=this.inlineEditBox.width;
+if(_14=="100%"){
+_11+="width:100%;";
 this.domNode.style.display="block";
 }else{
-_16+="width:"+(this.width+(Number(this.width)==this.width?"px":""))+";";
+_11+="width:"+(_14+(Number(_14)==_14?"px":""))+";";
 }
-this.editorParams.style=_16;
-this.editorParams["displayedValue" in cls.prototype?"displayedValue":"value"]=this.value;
-var ew=this.editWidget=new cls(this.editorParams,this.editorPlaceholder);
+var _15=this.inlineEditBox.editorParams;
+_15.style=_11;
+_15["displayedValue" in _f.prototype?"displayedValue":"value"]=this.value;
+var ew=this.editWidget=new _f(_15,this.editorPlaceholder);
+if(this.inlineEditBox.autoSave){
+this.buttonContainer.style.display="none";
 this.connect(ew,"onChange","_onChange");
 this.connect(ew,"onKeyPress","_onKeyPress");
-this.connect(ew,"onKeyUp","_onKeyPress");
-if(this.autoSave){
-this.buttonContainer.style.display="none";
+}else{
+if("intermediateChanges" in _f.prototype){
+ew.attr("intermediateChanges",true);
+this.connect(ew,"onChange","_onIntermediateChange");
+this.saveButton.attr("disabled",true);
+}
 }
+},_onIntermediateChange:function(val){
+this.saveButton.attr("disabled",(this.getValue()==this._resetValue)||!this.enableSave());
 },destroy:function(){
-this.editWidget.destroy();
+this.editWidget.destroy(true);
 this.inherited(arguments);
 },getValue:function(){
 var ew=this.editWidget;
-return ew.attr("displayedValue" in ew?"displayedValue":"value");
+return String(ew.attr("displayedValue" in ew?"displayedValue":"value"));
 },_onKeyPress:function(e){
-if(this._exitInProgress){
-return;
-}
-if(this.autoSave){
+if(this.inlineEditBox.autoSave&&this.inlineEditBox.editing){
 if(e.altKey||e.ctrlKey){
 return;
 }
 if(e.charOrCode==dojo.keys.ESCAPE){
 dojo.stopEvent(e);
-this._exitInProgress=true;
 this.cancel(true);
 }else{
-if(e.charOrCode==dojo.keys.ENTER&&this.editWidget.focusNode.tagName=="INPUT"){
+if(e.charOrCode==dojo.keys.ENTER&&e.target.tagName=="INPUT"){
 dojo.stopEvent(e);
-this._exitInProgress=true;
-this.save(true);
-}else{
-if(e.charOrCode===dojo.keys.TAB){
-this._exitInProgress=true;
-setTimeout(dojo.hitch(this,"save",false),0);
+this._onChange();
 }
 }
 }
-}else{
-var _1c=this;
-setTimeout(function(){
-_1c._onChange();
-},100);
-}
 },_onBlur:function(){
 this.inherited(arguments);
-if(this._exitInProgress){
-return;
-}
-if(this.autoSave){
-this._exitInProgress=true;
+if(this.inlineEditBox.autoSave&&this.inlineEditBox.editing){
 if(this.getValue()==this._resetValue){
 this.cancel(false);
 }else{
+if(this.enableSave()){
 this.save(false);
 }
 }
-},_onChange:function(){
-if(this._exitInProgress){
-return;
 }
-if(this.autoSave){
-this._exitInProgress=true;
-this.save(true);
-}else{
-this.saveButton.attr("disabled",(this.getValue()==this._resetValue)||!this.enableSave());
+},_onChange:function(){
+if(this.inlineEditBox.autoSave&&this.inlineEditBox.editing&&this.enableSave()){
+dojo.style(this.inlineEditBox.displayNode,{display:""});
+dijit.focus(this.inlineEditBox.displayNode);
 }
 },enableSave:function(){
-return this.editWidget.isValid?this.editWidget.isValid():true;
+return (this.editWidget.isValid?this.editWidget.isValid():true);
 },focus:function(){
 this.editWidget.focus();
+setTimeout(dojo.hitch(this,function(){
+if(this.editWidget.focusNode.tagName=="INPUT"){
 dijit.selectInputText(this.editWidget.focusNode);
+}
+}),0);
 }});
 }
diff --git a/dijit/Menu.js b/dijit/Menu.js
index a54d6fa..d92df0f 100644
--- a/dijit/Menu.js
+++ b/dijit/Menu.js
@@ -31,89 +31,155 @@ if(_4&&_4._isMenuBar){
 _4.focusNext();
 }
 }
-},onItemHover:function(_5){
+},_onPopupHover:function(_5){
+if(this.currentPopup&&this.currentPopup._pendingClose_timer){
+var _6=this.currentPopup.parentMenu;
+if(_6.focusedChild){
+_6.focusedChild._setSelected(false);
+}
+_6.focusedChild=this.currentPopup.from_item;
+_6.focusedChild._setSelected(true);
+this._stopPendingCloseTimer(this.currentPopup);
+}
+},onItemHover:function(_7){
 if(this.isActive){
-this.focusChild(_5);
+this.focusChild(_7);
 if(this.focusedChild.popup&&!this.focusedChild.disabled&&!this.hover_timer){
 this.hover_timer=setTimeout(dojo.hitch(this,"_openPopup"),this.popupDelay);
 }
 }
-},_onChildBlur:function(_6){
-_6._setSelected(false);
-dijit.popup.close(_6.popup);
+if(this.focusedChild){
+this.focusChild(_7);
+}
+this._hoveredChild=_7;
+},_onChildBlur:function(_8){
 this._stopPopupTimer();
-},onItemUnhover:function(_7){
+_8._setSelected(false);
+var _9=_8.popup;
+if(_9){
+this._stopPendingCloseTimer(_9);
+_9._pendingClose_timer=setTimeout(function(){
+_9._pendingClose_timer=null;
+if(_9.parentMenu){
+_9.parentMenu.currentPopup=null;
+}
+dijit.popup.close(_9);
+},this.popupDelay);
+}
+},onItemUnhover:function(_a){
 if(this.isActive){
 this._stopPopupTimer();
 }
+if(this._hoveredChild==_a){
+this._hoveredChild=null;
+}
 },_stopPopupTimer:function(){
 if(this.hover_timer){
 clearTimeout(this.hover_timer);
 this.hover_timer=null;
 }
+},_stopPendingCloseTimer:function(_b){
+if(_b._pendingClose_timer){
+clearTimeout(_b._pendingClose_timer);
+_b._pendingClose_timer=null;
+}
+},_stopFocusTimer:function(){
+if(this._focus_timer){
+clearTimeout(this._focus_timer);
+this._focus_timer=null;
+}
 },_getTopMenu:function(){
-for(var _8=this;_8.parentMenu;_8=_8.parentMenu){
+for(var _c=this;_c.parentMenu;_c=_c.parentMenu){
 }
-return _8;
-},onItemClick:function(_9,_a){
-if(_9.disabled){
+return _c;
+},onItemClick:function(_d,_e){
+if(_d.disabled){
 return false;
 }
-this.focusChild(_9);
-if(_9.popup){
-if(!this.is_open){
-this._openPopup();
+if(typeof this.isShowingNow=="undefined"){
+this._markActive();
 }
+this.focusChild(_d);
+if(_d.popup){
+this._openPopup();
 }else{
 this.onExecute();
-_9.onClick(_a);
+_d.onClick(_e);
 }
 },_openPopup:function(){
 this._stopPopupTimer();
-var _b=this.focusedChild;
-var _c=_b.popup;
-if(_c.isShowingNow){
+var _f=this.focusedChild;
+if(!_f){
 return;
 }
-_c.parentMenu=this;
-var _d=this;
-dijit.popup.open({parent:this,popup:_c,around:_b.domNode,orient:this._orient||(this.isLeftToRight()?{"TR":"TL","TL":"TR"}:{"TL":"TR","TR":"TL"}),onCancel:function(){
-dijit.popup.close(_c);
-_b.focus();
-_d.currentPopup=null;
-},onExecute:dojo.hitch(this,"_onDescendantExecute")});
-this.currentPopup=_c;
-if(_c.focus){
-setTimeout(dojo.hitch(_c,"focus"),0);
+var _10=_f.popup;
+if(_10.isShowingNow){
+return;
+}
+if(this.currentPopup){
+this._stopPendingCloseTimer(this.currentPopup);
+dijit.popup.close(this.currentPopup);
 }
+_10.parentMenu=this;
+_10.from_item=_f;
+var _11=this;
+dijit.popup.open({parent:this,popup:_10,around:_f.domNode,orient:this._orient||(this.isLeftToRight()?{"TR":"TL","TL":"TR","BR":"BL","BL":"BR"}:{"TL":"TR","TR":"TL","BL":"BR","BR":"BL"}),onCancel:function(){
+_11.focusChild(_f);
+_11._cleanUp();
+_f._setSelected(true);
+_11.focusedChild=_f;
+},onExecute:dojo.hitch(this,"_cleanUp")});
+this.currentPopup=_10;
+_10.connect(_10.domNode,"onmouseenter",dojo.hitch(_11,"_onPopupHover"));
+if(_10.focus){
+_10._focus_timer=setTimeout(dojo.hitch(_10,function(){
+this._focus_timer=null;
+this.focus();
+}),0);
+}
+},_markActive:function(){
+this.isActive=true;
+dojo.addClass(this.domNode,"dijitMenuActive");
+dojo.removeClass(this.domNode,"dijitMenuPassive");
 },onOpen:function(e){
 this.isShowingNow=true;
+this._markActive();
+},_markInactive:function(){
+this.isActive=false;
+dojo.removeClass(this.domNode,"dijitMenuActive");
+dojo.addClass(this.domNode,"dijitMenuPassive");
 },onClose:function(){
-this._stopPopupTimer();
-this.parentMenu=null;
+this._stopFocusTimer();
+this._markInactive();
 this.isShowingNow=false;
-this.currentPopup=null;
+this.parentMenu=null;
+},_closeChild:function(){
+this._stopPopupTimer();
 if(this.focusedChild){
-this._onChildBlur(this.focusedChild);
+this.focusedChild._setSelected(false);
+this.focusedChild._onUnhover();
 this.focusedChild=null;
 }
-},_onFocus:function(){
-this.isActive=true;
-dojo.addClass(this.domNode,"dijitMenuActive");
-dojo.removeClass(this.domNode,"dijitMenuPassive");
-this.inherited(arguments);
+if(this.currentPopup){
+dijit.popup.close(this.currentPopup);
+this.currentPopup=null;
+}
+},_onItemFocus:function(_12){
+if(this._hoveredChild&&this._hoveredChild!=_12){
+this._hoveredChild._onUnhover();
+}
 },_onBlur:function(){
-this.isActive=false;
-dojo.removeClass(this.domNode,"dijitMenuActive");
-dojo.addClass(this.domNode,"dijitMenuPassive");
-this.onClose();
+this._cleanUp();
 this.inherited(arguments);
-},_onDescendantExecute:function(){
-this.onClose();
+},_cleanUp:function(){
+this._closeChild();
+if(typeof this.isShowingNow=="undefined"){
+this._markInactive();
+}
 }});
 dojo.declare("dijit.Menu",dijit._MenuBase,{constructor:function(){
 this._bindings=[];
-},templateString:"<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" waiRole=\"menu\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress:_onKeyPress\">\n\t<tbody class=\"dijitReset\" dojoAttachPoint=\"containerNode\"></tbody>\n</table>\n",targetNodeIds:[],contextMenuForWindow:false,leftClickToOpen:false,_contextMenuWithMouse:false,postCreate:function(){
+},templateString:dojo.cache("dijit","templates/Menu.html","<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" waiRole=\"menu\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress:_onKeyPress\">\n\t<tbody class=\"dijitReset\" dojoAttachPoint=\"containerNode\"></tbody>\n</table>\n"),targetNodeIds:[],contextMenuForWindow:false,leftClickToOpen:false,refocus:true,_contextMenuWithMouse:false,postCreate:function(){
 if(this.contextMenuForWindow){
 this.bindDomNode(dojo.body());
 }else{
@@ -144,26 +210,62 @@ dojo.stopEvent(evt);
 }
 break;
 }
-},_iframeContentWindow:function(_12){
-var win=dijit.getDocumentWindow(dijit.Menu._iframeContentDocument(_12))||dijit.Menu._iframeContentDocument(_12)["__parent__"]||(_12.name&&dojo.doc.frames[_12.name])||null;
+},_iframeContentWindow:function(_13){
+var win=dijit.getDocumentWindow(this._iframeContentDocument(_13))||this._iframeContentDocument(_13)["__parent__"]||(_13.name&&dojo.doc.frames[_13.name])||null;
 return win;
 },_iframeContentDocument:function(_14){
 var doc=_14.contentDocument||(_14.contentWindow&&_14.contentWindow.document)||(_14.name&&dojo.doc.frames[_14.name]&&dojo.doc.frames[_14.name].document)||null;
 return doc;
-},bindDomNode:function(_16){
-_16=dojo.byId(_16);
-var win=dijit.getDocumentWindow(_16.ownerDocument);
-if(_16.tagName.toLowerCase()=="iframe"){
-win=this._iframeContentWindow(_16);
-_16=dojo.withGlobal(win,dojo.body);
-}
-var cn=(_16==dojo.body()?dojo.doc:_16);
-_16[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")]);
+},bindDomNode:function(_15){
+_15=dojo.byId(_15);
+var cn;
+if(_15.tagName.toLowerCase()=="iframe"){
+var _16=_15,win=this._iframeContentWindow(_16);
+cn=dojo.withGlobal(win,dojo.body);
+}else{
+cn=(_15==dojo.body()?dojo.doc.documentElement:_15);
+}
+var _17={node:_15,iframe:_16};
+dojo.attr(_15,"_dijitMenu"+this.id,this._bindings.push(_17));
+var _18=dojo.hitch(this,function(cn){
+return [dojo.connect(cn,(this.leftClickToOpen)?"onclick":"oncontextmenu",this,function(evt){
+this._openMyself(evt,cn,_16);
+}),dojo.connect(cn,"onkeydown",this,"_contextKey"),dojo.connect(cn,"onmousedown",this,"_contextMouse")];
+});
+_17.connects=cn?_18(cn):[];
+if(_16){
+_17.onloadHandler=dojo.hitch(this,function(){
+var win=this._iframeContentWindow(_16);
+cn=dojo.withGlobal(win,dojo.body);
+_17.connects=_18(cn);
+});
+if(_16.addEventListener){
+_16.addEventListener("load",_17.onloadHandler,false);
+}else{
+_16.attachEvent("onload",_17.onloadHandler);
+}
+}
 },unBindDomNode:function(_19){
-var _1a=dojo.byId(_19);
-if(_1a){
-var bid=_1a[this.id]-1,b=this._bindings[bid];
-dojo.forEach(b,dojo.disconnect);
+var _1a;
+try{
+_1a=dojo.byId(_19);
+}
+catch(e){
+return;
+}
+var _1b="_dijitMenu"+this.id;
+if(_1a&&dojo.hasAttr(_1a,_1b)){
+var bid=dojo.attr(_1a,_1b)-1,b=this._bindings[bid];
+dojo.forEach(b.connects,dojo.disconnect);
+var _1c=b.iframe;
+if(_1c){
+if(_1c.removeEventListener){
+_1c.removeEventListener("load",b.onloadHandler,false);
+}else{
+_1c.detachEvent("onload",b.onloadHandler);
+}
+}
+dojo.removeAttr(_1a,_1b);
 delete this._bindings[bid];
 }
 },_contextKey:function(e){
@@ -171,17 +273,17 @@ 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(){
+var _1d={target:e.target,pageX:e.pageX,pageY:e.pageY};
+_1d.preventDefault=_1d.stopPropagation=function(){
 };
 window.setTimeout(dojo.hitch(this,function(){
-this._openMyself(_e);
+this._openMyself(_1d);
 }),1);
 }
 }
 },_contextMouse:function(e){
 this._contextMenuWithMouse=true;
-},_openMyself:function(e){
+},_openMyself:function(e,_1e,_1f){
 if(this.leftClickToOpen&&e.button>0){
 return;
 }
@@ -190,25 +292,37 @@ var x,y;
 if(dojo.isSafari||this._contextMenuWithMouse){
 x=e.pageX;
 y=e.pageY;
+if(_1f){
+var od=e.target.ownerDocument,ifc=dojo.position(_1f,true),win=this._iframeContentWindow(_1f),_20=dojo.withGlobal(win,"_docScroll",dojo);
+var cs=dojo.getComputedStyle(_1f),tp=dojo._toPixelValue,_21=(dojo.isIE&&dojo.isQuirks?0:tp(_1f,cs.paddingLeft))+(dojo.isIE&&dojo.isQuirks?tp(_1f,cs.borderLeftWidth):0),top=(dojo.isIE&&dojo.isQuirks?0:tp(_1f,cs.paddingTop))+(dojo.isIE&&dojo.isQuirks?tp(_1f,cs.borderTopWidth):0);
+x+=ifc.x+_21-_20.x;
+y+=ifc.y+top-_20.y;
+}
 }else{
-var _23=dojo.coords(e.target,true);
-x=_23.x+10;
-y=_23.y+10;
-}
-var _24=this;
-var _25=dijit.getFocus(this);
-function _26(){
-dijit.focus(_25);
-dijit.popup.close(_24);
+var _22=dojo.position(e.target,true);
+x=_22.x+10;
+y=_22.y+10;
+}
+var _23=this;
+var _24=dijit.getFocus(this);
+function _25(){
+if(_23.refocus){
+dijit.focus(_24);
+}
+dijit.popup.close(_23);
 };
-dijit.popup.open({popup:this,x:x,y:y,onExecute:_26,onCancel:_26,orient:this.isLeftToRight()?"L":"R"});
+dijit.popup.open({popup:this,x:x,y:y,onExecute:_25,onCancel:_25,orient:this.isLeftToRight()?"L":"R"});
 this.focus();
 this._onBlur=function(){
 this.inherited("_onBlur",arguments);
 dijit.popup.close(this);
 };
 },uninitialize:function(){
-dojo.forEach(this.targetNodeIds,this.unBindDomNode,this);
+dojo.forEach(this._bindings,function(b){
+if(b){
+this.unBindDomNode(b.node);
+}
+},this);
 this.inherited(arguments);
 }});
 dojo.require("dijit.MenuItem");
diff --git a/dijit/MenuBar.js b/dijit/MenuBar.js
index dfe1203..9e9a7fd 100644
--- a/dijit/MenuBar.js
+++ b/dijit/MenuBar.js
@@ -9,25 +9,31 @@ if(!dojo._hasResource["dijit.MenuBar"]){
 dojo._hasResource["dijit.MenuBar"]=true;
 dojo.provide("dijit.MenuBar");
 dojo.require("dijit.Menu");
-dojo.declare("dijit.MenuBar",dijit._MenuBase,{templateString:"<div class=\"dijitMenuBar dijitMenuPassive\" dojoAttachPoint=\"containerNode\"  waiRole=\"menubar\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress: _onKeyPress\"></div>\n",_isMenuBar:true,constructor:function(){
+dojo.declare("dijit.MenuBar",dijit._MenuBase,{templateString:dojo.cache("dijit","templates/MenuBar.html","<div class=\"dijitMenuBar dijitMenuPassive\" dojoAttachPoint=\"containerNode\"  waiRole=\"menubar\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress: _onKeyPress\"></div>\n"),_isMenuBar:true,constructor:function(){
 this._orient=this.isLeftToRight()?{BL:"TL"}:{BR:"TR"};
 },postCreate:function(){
 var k=dojo.keys,l=this.isLeftToRight();
 this.connectKeyNavHandlers(l?[k.LEFT_ARROW]:[k.RIGHT_ARROW],l?[k.RIGHT_ARROW]:[k.LEFT_ARROW]);
-},focusChild:function(_3){
-var _4=this.focusedChild,_5=_4&&_4.popup&&_4.popup.isShowingNow;
+},focusChild:function(_1){
+var _2=this.focusedChild,_3=_2&&_2.popup&&_2.popup.isShowingNow;
 this.inherited(arguments);
-if(_5&&!_3.disabled){
+if(_3&&_1.popup&&!_1.disabled){
 this._openPopup();
 }
-},_onKeyPress:function(_6){
-if(_6.ctrlKey||_6.altKey){
+},_onKeyPress:function(_4){
+if(_4.ctrlKey||_4.altKey){
 return;
 }
-switch(_6.charOrCode){
+switch(_4.charOrCode){
 case dojo.keys.DOWN_ARROW:
-this._moveToPopup(_6);
-dojo.stopEvent(_6);
+this._moveToPopup(_4);
+dojo.stopEvent(_4);
+}
+},onItemClick:function(_5,_6){
+if(_5.popup&&_5.popup.isShowingNow){
+_5.popup.onCancel();
+}else{
+this.inherited(arguments);
 }
 }});
 }
diff --git a/dijit/MenuBarItem.js b/dijit/MenuBarItem.js
index 138074a..5f95e8f 100644
--- a/dijit/MenuBarItem.js
+++ b/dijit/MenuBarItem.js
@@ -9,6 +9,6 @@ if(!dojo._hasResource["dijit.MenuBarItem"]){
 dojo._hasResource["dijit.MenuBarItem"]=true;
 dojo.provide("dijit.MenuBarItem");
 dojo.require("dijit.MenuItem");
-dojo.declare("dijit._MenuBarItemMixin",null,{templateString:"<div class=\"dijitReset dijitInline dijitMenuItem dijitMenuItemLabel\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitem\" tabIndex=\"-1\"'\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<span dojoAttachPoint=\"containerNode\"></span>\n</div>\n",attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{label:{node:"containerNode",type:"innerHTML"}})});
+dojo.declare("dijit._MenuBarItemMixin",null,{templateString:dojo.cache("dijit","templates/MenuBarItem.html","<div class=\"dijitReset dijitInline dijitMenuItem dijitMenuItemLabel\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitem\" tabIndex=\"-1\"'\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<span dojoAttachPoint=\"containerNode\"></span>\n</div>\n"),attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{label:{node:"container [...]
 dojo.declare("dijit.MenuBarItem",[dijit.MenuItem,dijit._MenuBarItemMixin],{});
 }
diff --git a/dijit/MenuItem.js b/dijit/MenuItem.js
index a275173..9f23be0 100644
--- a/dijit/MenuItem.js
+++ b/dijit/MenuItem.js
@@ -11,48 +11,58 @@ dojo.provide("dijit.MenuItem");
 dojo.require("dijit._Widget");
 dojo.require("dijit._Templated");
 dojo.require("dijit._Contained");
-dojo.declare("dijit.MenuItem",[dijit._Widget,dijit._Templated,dijit._Contained],{templateString:"<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset\" waiRole=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon\" dojoAttachPoint=\"iconNode\">\n\t</td>\n\t<td class=\"dijitReset dijitMen [...]
+dojo.declare("dijit.MenuItem",[dijit._Widget,dijit._Templated,dijit._Contained],{templateString:dojo.cache("dijit","templates/MenuItem.html","<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset\" waiRole=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon\" dojoAttachPoint=\"iconNode\" [...]
 if(_1&&!("label" in this.params)){
 this.attr("label",_1.innerHTML);
 }
 },postCreate:function(){
 dojo.setSelectable(this.domNode,false);
-dojo.attr(this.containerNode,"id",this.id+"_text");
-dijit.setWaiState(this.domNode,"labelledby",this.id+"_text");
+var _2=this.id+"_text";
+dojo.attr(this.containerNode,"id",_2);
+if(this.accelKeyNode){
+dojo.attr(this.accelKeyNode,"id",this.id+"_accel");
+_2+=" "+this.id+"_accel";
+}
+dijit.setWaiState(this.domNode,"labelledby",_2);
 },_onHover:function(){
 dojo.addClass(this.domNode,"dijitMenuItemHover");
 this.getParent().onItemHover(this);
 },_onUnhover:function(){
 dojo.removeClass(this.domNode,"dijitMenuItemHover");
 this.getParent().onItemUnhover(this);
-},_onClick:function(_2){
-this.getParent().onItemClick(this,_2);
-dojo.stopEvent(_2);
-},onClick:function(_3){
+},_onClick:function(_3){
+this.getParent().onItemClick(this,_3);
+dojo.stopEvent(_3);
+},onClick:function(_4){
 },focus:function(){
 try{
+if(dojo.isIE==8){
+this.containerNode.focus();
+}
 dijit.focus(this.focusNode);
 }
 catch(e){
 }
 },_onFocus:function(){
 this._setSelected(true);
-},_setSelected:function(_4){
-dojo.toggleClass(this.domNode,"dijitMenuItemSelected",_4);
-},setLabel:function(_5){
+this.getParent()._onItemFocus(this);
+this.inherited(arguments);
+},_setSelected:function(_5){
+dojo.toggleClass(this.domNode,"dijitMenuItemSelected",_5);
+},setLabel:function(_6){
 dojo.deprecated("dijit.MenuItem.setLabel() is deprecated.  Use attr('label', ...) instead.","","2.0");
-this.attr("label",_5);
-},setDisabled:function(_6){
+this.attr("label",_6);
+},setDisabled:function(_7){
 dojo.deprecated("dijit.Menu.setDisabled() is deprecated.  Use attr('disabled', bool) instead.","","2.0");
-this.attr("disabled",_6);
-},_setDisabledAttr:function(_7){
-this.disabled=_7;
-dojo[_7?"addClass":"removeClass"](this.domNode,"dijitMenuItemDisabled");
-dijit.setWaiState(this.focusNode,"disabled",_7?"true":"false");
-},_setAccelKeyAttr:function(_8){
-this.accelKey=_8;
-this.accelKeyNode.style.display=_8?"":"none";
-this.accelKeyNode.innerHTML=_8;
-dojo.attr(this.containerNode,"colSpan",_8?"1":"2");
+this.attr("disabled",_7);
+},_setDisabledAttr:function(_8){
+this.disabled=_8;
+dojo[_8?"addClass":"removeClass"](this.domNode,"dijitMenuItemDisabled");
+dijit.setWaiState(this.focusNode,"disabled",_8?"true":"false");
+},_setAccelKeyAttr:function(_9){
+this.accelKey=_9;
+this.accelKeyNode.style.display=_9?"":"none";
+this.accelKeyNode.innerHTML=_9;
+dojo.attr(this.containerNode,"colSpan",_9?"1":"2");
 }});
 }
diff --git a/dijit/MenuSeparator.js b/dijit/MenuSeparator.js
index 1218172..5aad370 100644
--- a/dijit/MenuSeparator.js
+++ b/dijit/MenuSeparator.js
@@ -11,7 +11,7 @@ dojo.provide("dijit.MenuSeparator");
 dojo.require("dijit._Widget");
 dojo.require("dijit._Templated");
 dojo.require("dijit._Contained");
-dojo.declare("dijit.MenuSeparator",[dijit._Widget,dijit._Templated,dijit._Contained],{templateString:"<tr class=\"dijitMenuSeparator\">\n\t<td colspan=\"4\">\n\t\t<div class=\"dijitMenuSeparatorTop\"></div>\n\t\t<div class=\"dijitMenuSeparatorBottom\"></div>\n\t</td>\n</tr>\n",postCreate:function(){
+dojo.declare("dijit.MenuSeparator",[dijit._Widget,dijit._Templated,dijit._Contained],{templateString:dojo.cache("dijit","templates/MenuSeparator.html","<tr class=\"dijitMenuSeparator\">\n\t<td colspan=\"4\">\n\t\t<div class=\"dijitMenuSeparatorTop\"></div>\n\t\t<div class=\"dijitMenuSeparatorBottom\"></div>\n\t</td>\n</tr>\n"),postCreate:function(){
 dojo.setSelectable(this.domNode,false);
 },isFocusable:function(){
 return false;
diff --git a/dijit/PopupMenuItem.js b/dijit/PopupMenuItem.js
index 226aa8f..38929f6 100644
--- a/dijit/PopupMenuItem.js
+++ b/dijit/PopupMenuItem.js
@@ -32,7 +32,9 @@ dojo.style(this.arrowWrapper,"visibility","");
 dijit.setWaiState(this.focusNode,"haspopup","true");
 },destroyDescendants:function(){
 if(this.popup){
+if(!this.popup._destroyed){
 this.popup.destroyRecursive();
+}
 delete this.popup;
 }
 this.inherited(arguments);
diff --git a/dijit/ProgressBar.js b/dijit/ProgressBar.js
index c02d8a9..a8965f5 100644
--- a/dijit/ProgressBar.js
+++ b/dijit/ProgressBar.js
@@ -12,9 +12,9 @@ dojo.require("dojo.fx");
 dojo.require("dojo.number");
 dojo.require("dijit._Widget");
 dojo.require("dijit._Templated");
-dojo.declare("dijit.ProgressBar",[dijit._Widget,dijit._Templated],{progress:"0",maximum:100,places:0,indeterminate:false,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\"> </span\n\t></div\n\t><div dojoAttachPoint=\"label\" class=\"dijitProgressBarLabel\" id=\"${ [...]
+dojo.declare("dijit.ProgressBar",[dijit._Widget,dijit._Templated],{progress:"0",maximum:100,places:0,indeterminate:false,name:"",templateString:dojo.cache("dijit","templates/ProgressBar.html","<div class=\"dijitProgressBar dijitProgressBarEmpty\"\n\t><div waiRole=\"progressbar\" dojoAttachPoint=\"internalProgress\" class=\"dijitProgressBarFull\"\n\t\t><div class=\"dijitProgressBarTile\"></div\n\t\t><span style=\"visibility:hidden\"> </span\n\t></div\n\t><div dojoAttachPoint=\"label\ [...]
 this.inherited(arguments);
-this.indeterminateHighContrastImage.setAttribute("src",this._indeterminateHighContrastImagePath);
+this.indeterminateHighContrastImage.setAttribute("src",this._indeterminateHighContrastImagePath.toString());
 this.update();
 },update:function(_1){
 dojo.mixin(this,_1||{});
@@ -44,6 +44,14 @@ dijit.setWaiState(_2,"valuemax",this.maximum);
 dojo[_4](this.domNode,"dijitProgressBarIndeterminate");
 _2.style.width=(_3*100)+"%";
 this.onChange();
+},_setValueAttr:function(v){
+if(v==Infinity){
+this.update({indeterminate:true});
+}else{
+this.update({indeterminate:false,progress:v});
+}
+},_getValueAttr:function(){
+return this.progress;
 },report:function(_6){
 return dojo.number.format(_6,{type:"percent",places:this.places,locale:this.lang});
 },onChange:function(){
diff --git a/dijit/TitlePane.js b/dijit/TitlePane.js
index 1cd71cd..4ca186a 100644
--- a/dijit/TitlePane.js
+++ b/dijit/TitlePane.js
@@ -11,14 +11,14 @@ 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],{title:"",open:true,duration:dijit.defaultDuration,baseClass:"dijitTitlePane",templateString:"<div class=\"${baseClass}\">\n\t<div dojoAttachEvent=\"onclick:toggle, onkeypress:_onTitleKey, onfocus:_handleFocus, onblur:_handleFocus, onmouseenter:_onTitleEnter, onmouseleave:_onTitleLeave\" tabindex=\"0\"\n\t\t\twaiRole=\"button\" class=\"dijitTitlePaneTitle\" dojoAttachPoint=\"titleBarNode,focusNode\">\n\t\t<img src [...]
+dojo.declare("dijit.TitlePane",[dijit.layout.ContentPane,dijit._Templated],{title:"",open:true,toggleable:true,tabIndex:"0",duration:dijit.defaultDuration,baseClass:"dijitTitlePane",templateString:dojo.cache("dijit","templates/TitlePane.html","<div class=\"${baseClass}\">\n\t<div dojoAttachEvent=\"onclick:_onTitleClick, onkeypress:_onTitleKey, onfocus:_handleFocus, onblur:_handleFocus, onmouseenter:_onTitleEnter, onmouseleave:_onTitleLeave\"\n\t\t\tclass=\"dijitTitlePaneTitle\" dojoAttac [...]
 if(!this.open){
 this.hideNode.style.display=this.wipeNode.style.display="none";
 }
 this._setCss();
 dojo.setSelectable(this.titleNode,false);
-dijit.setWaiState(this.containerNode,"labelledby",this.titleNode.id);
-dijit.setWaiState(this.focusNode,"haspopup","true");
+dijit.setWaiState(this.containerNode,"hidden",this.open?"false":"true");
+dijit.setWaiState(this.focusNode,"pressed",this.open?"true":"false");
 var _1=this.hideNode,_2=this.wipeNode;
 this._wipeIn=dojo.fx.wipeIn({node:this.wipeNode,duration:this.duration,beforeBegin:function(){
 _1.style.display="";
@@ -31,7 +31,15 @@ this.inherited(arguments);
 if(this.open!==_3){
 this.toggle();
 }
-},_setContentAttr:function(_4){
+},_setToggleableAttr:function(_4){
+this.toggleable=_4;
+dijit.setWaiRole(this.focusNode,_4?"button":"heading");
+dojo.attr(this.focusNode,"tabIndex",_4?this.tabIndex:"-1");
+if(_4){
+dijit.setWaiState(this.focusNode,"controls",this.id+"_pane");
+}
+this._setCss();
+},_setContentAttr:function(_5){
 if(!this.open||!this._wipeOut||this._wipeOut.status()=="playing"){
 this.inherited(arguments);
 }else{
@@ -47,30 +55,40 @@ this.hideNode.style.display="";
 }
 }
 },toggle:function(){
-dojo.forEach([this._wipeIn,this._wipeOut],function(_5){
-if(_5&&_5.status()=="playing"){
-_5.stop();
+dojo.forEach([this._wipeIn,this._wipeOut],function(_6){
+if(_6&&_6.status()=="playing"){
+_6.stop();
 }
 });
-var _6=this[this.open?"_wipeOut":"_wipeIn"];
-if(_6){
-_6.play();
+var _7=this[this.open?"_wipeOut":"_wipeIn"];
+if(_7){
+_7.play();
 }else{
 this.hideNode.style.display=this.open?"":"none";
 }
 this.open=!this.open;
+dijit.setWaiState(this.containerNode,"hidden",this.open?"false":"true");
+dijit.setWaiState(this.focusNode,"pressed",this.open?"true":"false");
+if(this.open){
 this._onShow();
+}else{
+this.onHide();
+}
 this._setCss();
 },_setCss:function(){
-var _7=["dijitClosed","dijitOpen"];
-var _8=this.open;
-var _9=this.titleBarNode||this.focusNode;
-dojo.removeClass(_9,_7[!_8+0]);
-_9.className+=" "+_7[_8+0];
+var _8=this.titleBarNode||this.focusNode;
+if(this._titleBarClass){
+dojo.removeClass(_8,this._titleBarClass);
+}
+this._titleBarClass="dijit"+(this.toggleable?"":"Fixed")+(this.open?"Open":"Closed");
+dojo.addClass(_8,this._titleBarClass);
 this.arrowNodeInner.innerHTML=this.open?"-":"+";
 },_onTitleKey:function(e){
 if(e.charOrCode==dojo.keys.ENTER||e.charOrCode==" "){
+if(this.toggleable){
 this.toggle();
+}
+dojo.stopEvent(e);
 }else{
 if(e.charOrCode==dojo.keys.DOWN_ARROW&&this.open){
 this.containerNode.focus();
@@ -78,13 +96,21 @@ e.preventDefault();
 }
 }
 },_onTitleEnter:function(){
+if(this.toggleable){
 dojo.addClass(this.focusNode,"dijitTitlePaneTitle-hover");
+}
 },_onTitleLeave:function(){
+if(this.toggleable){
 dojo.removeClass(this.focusNode,"dijitTitlePaneTitle-hover");
+}
+},_onTitleClick:function(){
+if(this.toggleable){
+this.toggle();
+}
 },_handleFocus:function(e){
-dojo[(e.type=="focus"?"addClass":"removeClass")](this.focusNode,this.baseClass+"Focused");
-},setTitle:function(_c){
+dojo.toggleClass(this.focusNode,this.baseClass+"Focused",e.type=="focus");
+},setTitle:function(_9){
 dojo.deprecated("dijit.TitlePane.setTitle() is deprecated.  Use attr('title', ...) instead.","","2.0");
-this.titleNode.innerHTML=_c;
+this.attr("title",_9);
 }});
 }
diff --git a/dijit/Tooltip.js b/dijit/Tooltip.js
index fb4e2ac..8379b34 100644
--- a/dijit/Tooltip.js
+++ b/dijit/Tooltip.js
@@ -10,7 +10,7 @@ dojo._hasResource["dijit.Tooltip"]=true;
 dojo.provide("dijit.Tooltip");
 dojo.require("dijit._Widget");
 dojo.require("dijit._Templated");
-dojo.declare("dijit._MasterTooltip",[dijit._Widget,dijit._Templated],{duration:dijit.defaultDuration,templateString:"<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.declare("dijit._MasterTooltip",[dijit._Widget,dijit._Templated],{duration:dijit.defaultDuration,templateString:dojo.cache("dijit","templates/Tooltip.html","<div class=\"dijitTooltip dijitTooltipLeft\" id=\"dojoTooltip\">\n\t<div class=\"dijitTooltipContainer dijitTooltipContents\" dojoAttachPoint=\"containerNode\" waiRole='alert'></div>\n\t<div class=\"dijitTooltipConnector\"></div>\n</div>\n"),postCreate:function(){
 dojo.body().appendChild(this.domNode);
 this.bgIframe=new dijit.BackgroundIframe(this.domNode);
 this.fadeIn=dojo.fadeIn({node:this.domNode,duration:this.duration,onEnd:dojo.hitch(this,"_onShow")});
@@ -25,43 +25,22 @@ return;
 }
 this.containerNode.innerHTML=_1;
 this.domNode.style.top=(this.domNode.offsetTop+1)+"px";
-var _4={};
-var _5=this.isLeftToRight();
-dojo.forEach((_3&&_3.length)?_3:dijit.Tooltip.defaultPosition,function(_6){
-switch(_6){
-case "after":
-_4[_5?"BR":"BL"]=_5?"BL":"BR";
-break;
-case "before":
-_4[_5?"BL":"BR"]=_5?"BR":"BL";
-break;
-case "below":
-_4[_5?"BL":"BR"]=_5?"TL":"TR";
-_4[_5?"BR":"BL"]=_5?"TR":"TL";
-break;
-case "above":
-default:
-_4[_5?"TL":"TR"]=_5?"BL":"BR";
-_4[_5?"TR":"TL"]=_5?"BR":"BL";
-break;
-}
-});
-var _7=dijit.placeOnScreenAroundElement(this.domNode,_2,_4,dojo.hitch(this,"orient"));
+var _4=dijit.placeOnScreenAroundElement(this.domNode,_2,dijit.getPopupAroundAlignment((_3&&_3.length)?_3:dijit.Tooltip.defaultPosition,this.isLeftToRight()),dojo.hitch(this,"orient"));
 dojo.style(this.domNode,"opacity",0);
 this.fadeIn.play();
 this.isShowingNow=true;
 this.aroundNode=_2;
-},orient:function(_8,_9,_a){
-_8.className="dijitTooltip "+{"BL-TL":"dijitTooltipBelow dijitTooltipABLeft","TL-BL":"dijitTooltipAbove dijitTooltipABLeft","BR-TR":"dijitTooltipBelow dijitTooltipABRight","TR-BR":"dijitTooltipAbove dijitTooltipABRight","BR-BL":"dijitTooltipRight","BL-BR":"dijitTooltipLeft"}[_9+"-"+_a];
+},orient:function(_5,_6,_7){
+_5.className="dijitTooltip "+{"BL-TL":"dijitTooltipBelow dijitTooltipABLeft","TL-BL":"dijitTooltipAbove dijitTooltipABLeft","BR-TR":"dijitTooltipBelow dijitTooltipABRight","TR-BR":"dijitTooltipAbove dijitTooltipABRight","BR-BL":"dijitTooltipRight","BL-BR":"dijitTooltipLeft"}[_6+"-"+_7];
 },_onShow:function(){
 if(dojo.isIE){
 this.domNode.style.filter="";
 }
-},hide:function(_b){
-if(this._onDeck&&this._onDeck[1]==_b){
+},hide:function(_8){
+if(this._onDeck&&this._onDeck[1]==_8){
 this._onDeck=null;
 }else{
-if(this.aroundNode===_b){
+if(this.aroundNode===_8){
 this.fadeIn.stop();
 this.isShowingNow=false;
 this.aroundNode=null;
@@ -76,52 +55,70 @@ this.show.apply(this,this._onDeck);
 this._onDeck=null;
 }
 }});
-dijit.showTooltip=function(_c,_d,_e){
+dijit.showTooltip=function(_9,_a,_b){
 if(!dijit._masterTT){
 dijit._masterTT=new dijit._MasterTooltip();
 }
-return dijit._masterTT.show(_c,_d,_e);
+return dijit._masterTT.show(_9,_a,_b);
 };
-dijit.hideTooltip=function(_f){
+dijit.hideTooltip=function(_c){
 if(!dijit._masterTT){
 dijit._masterTT=new dijit._MasterTooltip();
 }
-return dijit._masterTT.hide(_f);
+return dijit._masterTT.hide(_c);
 };
-dojo.declare("dijit.Tooltip",dijit._Widget,{label:"",showDelay:400,connectId:[],position:[],_setConnectIdAttr:function(ids){
-this._connectNodes=[];
-this.connectId=dojo.isArrayLike(ids)?ids:[ids];
-dojo.forEach(this.connectId,function(id){
-var _12=dojo.byId(id);
-if(_12){
-this._connectNodes.push(_12);
-dojo.forEach(["onMouseEnter","onMouseLeave","onFocus","onBlur"],function(_13){
-this.connect(_12,_13.toLowerCase(),"_"+_13);
-},this);
-if(dojo.isIE){
-_12.style.zoom=1;
+dojo.declare("dijit.Tooltip",dijit._Widget,{label:"",showDelay:400,connectId:[],position:[],constructor:function(){
+this._nodeConnectionsById={};
+},_setConnectIdAttr:function(_d){
+for(var _e in this._nodeConnectionsById){
+this.removeTarget(_e);
+}
+dojo.forEach(dojo.isArrayLike(_d)?_d:[_d],this.addTarget,this);
+},_getConnectIdAttr:function(){
+var _f=[];
+for(var id in this._nodeConnectionsById){
+_f.push(id);
+}
+return _f;
+},addTarget:function(id){
+var _10=dojo.byId(id);
+if(!_10){
+return;
+}
+if(_10.id in this._nodeConnectionsById){
+return;
+}
+this._nodeConnectionsById[_10.id]=[this.connect(_10,"onmouseenter","_onTargetMouseEnter"),this.connect(_10,"onmouseleave","_onTargetMouseLeave"),this.connect(_10,"onfocus","_onTargetFocus"),this.connect(_10,"onblur","_onTargetBlur")];
+if(dojo.isIE&&!_10.style.zoom){
+_10.style.zoom=1;
 }
+},removeTarget:function(_11){
+var id=_11.id||_11;
+if(id in this._nodeConnectionsById){
+dojo.forEach(this._nodeConnectionsById[id],this.disconnect,this);
+delete this._nodeConnectionsById[id];
 }
-},this);
 },postCreate:function(){
 dojo.addClass(this.domNode,"dijitTooltipData");
-},_onMouseEnter:function(e){
+},startup:function(){
+this.inherited(arguments);
+var ids=this.connectId;
+dojo.forEach(dojo.isArrayLike(ids)?ids:[ids],this.addTarget,this);
+},_onTargetMouseEnter:function(e){
 this._onHover(e);
-},_onMouseLeave:function(e){
+},_onTargetMouseLeave:function(e){
 this._onUnHover(e);
-},_onFocus:function(e){
+},_onTargetFocus:function(e){
 this._focus=true;
 this._onHover(e);
-this.inherited(arguments);
-},_onBlur:function(e){
+},_onTargetBlur:function(e){
 this._focus=false;
 this._onUnHover(e);
-this.inherited(arguments);
 },_onHover:function(e){
 if(!this._showTimer){
-var _19=e.target;
+var _12=e.target;
 this._showTimer=setTimeout(dojo.hitch(this,function(){
-this.open(_19);
+this.open(_12);
 }),this.showDelay);
 }
 },_onUnHover:function(e){
@@ -133,28 +130,29 @@ clearTimeout(this._showTimer);
 delete this._showTimer;
 }
 this.close();
-},open:function(_1b){
-_1b=_1b||this._connectNodes[0];
-if(!_1b){
-return;
-}
+},open:function(_13){
 if(this._showTimer){
 clearTimeout(this._showTimer);
 delete this._showTimer;
 }
-dijit.showTooltip(this.label||this.domNode.innerHTML,_1b,this.position);
-this._connectNode=_1b;
+dijit.showTooltip(this.label||this.domNode.innerHTML,_13,this.position);
+this._connectNode=_13;
+this.onShow(_13,this.position);
 },close:function(){
 if(this._connectNode){
 dijit.hideTooltip(this._connectNode);
 delete this._connectNode;
+this.onHide();
 }
 if(this._showTimer){
 clearTimeout(this._showTimer);
 delete this._showTimer;
 }
+},onShow:function(_14,_15){
+},onHide:function(){
 },uninitialize:function(){
 this.close();
+this.inherited(arguments);
 }});
 dijit.Tooltip.defaultPosition=["after","before"];
 }
diff --git a/dijit/TooltipDialog.js b/dijit/TooltipDialog.js
index 6ab4f4c..49feb3a 100644
--- a/dijit/TooltipDialog.js
+++ b/dijit/TooltipDialog.js
@@ -12,7 +12,7 @@ dojo.require("dijit.layout.ContentPane");
 dojo.require("dijit._Templated");
 dojo.require("dijit.form._FormMixin");
 dojo.require("dijit._DialogMixin");
-dojo.declare("dijit.TooltipDialog",[dijit.layout.ContentPane,dijit._Templated,dijit.form._FormMixin,dijit._DialogMixin],{title:"",doLayout:false,autofocus:true,baseClass:"dijitTooltipDialog",_firstFocusItem:null,_lastFocusItem:null,templateString:null,templateString:"<div waiRole=\"presentation\">\n\t<div class=\"dijitTooltipContainer\" waiRole=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" dojoAttachPoint=\"containerNode\" tabindex=\"-1\" waiRole=\"dia [...]
+dojo.declare("dijit.TooltipDialog",[dijit.layout.ContentPane,dijit._Templated,dijit.form._FormMixin,dijit._DialogMixin],{title:"",doLayout:false,autofocus:true,baseClass:"dijitTooltipDialog",_firstFocusItem:null,_lastFocusItem:null,templateString:dojo.cache("dijit","templates/TooltipDialog.html","<div waiRole=\"presentation\">\n\t<div class=\"dijitTooltipContainer\" waiRole=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" dojoAttachPoint=\"containerNode\" [...]
 this.inherited(arguments);
 this.connect(this.containerNode,"onkeypress","_onKey");
 this.containerNode.title=this.title;
@@ -24,38 +24,40 @@ dojo.removeClass(this.domNode,c);
 c="dijitTooltipAB"+(_3.charAt(1)=="L"?"Left":"Right")+" dijitTooltip"+(_3.charAt(0)=="T"?"Below":"Above");
 dojo.addClass(this.domNode,c);
 this._currentOrientClass=c;
-},onOpen:function(_5){
-this.orient(this.domNode,_5.aroundCorner,_5.corner);
+},onOpen:function(_4){
+this.orient(this.domNode,_4.aroundCorner,_4.corner);
 this._onShow();
 if(this.autofocus){
 this._getFocusItems(this.containerNode);
 dijit.focus(this._firstFocusItem);
 }
-},_onKey:function(_6){
-var _7=_6.target;
+},onClose:function(){
+this.onHide();
+},_onKey:function(_5){
+var _6=_5.target;
 var dk=dojo.keys;
-if(_6.charOrCode===dk.TAB){
+if(_5.charOrCode===dk.TAB){
 this._getFocusItems(this.containerNode);
 }
-var _9=(this._firstFocusItem==this._lastFocusItem);
-if(_6.charOrCode==dk.ESCAPE){
-this.onCancel();
-dojo.stopEvent(_6);
+var _7=(this._firstFocusItem==this._lastFocusItem);
+if(_5.charOrCode==dk.ESCAPE){
+setTimeout(dojo.hitch(this,"onCancel"),0);
+dojo.stopEvent(_5);
 }else{
-if(_7==this._firstFocusItem&&_6.shiftKey&&_6.charOrCode===dk.TAB){
-if(!_9){
+if(_6==this._firstFocusItem&&_5.shiftKey&&_5.charOrCode===dk.TAB){
+if(!_7){
 dijit.focus(this._lastFocusItem);
 }
-dojo.stopEvent(_6);
+dojo.stopEvent(_5);
 }else{
-if(_7==this._lastFocusItem&&_6.charOrCode===dk.TAB&&!_6.shiftKey){
-if(!_9){
+if(_6==this._lastFocusItem&&_5.charOrCode===dk.TAB&&!_5.shiftKey){
+if(!_7){
 dijit.focus(this._firstFocusItem);
 }
-dojo.stopEvent(_6);
+dojo.stopEvent(_5);
 }else{
-if(_6.charOrCode===dk.TAB){
-_6.stopPropagation();
+if(_5.charOrCode===dk.TAB){
+_5.stopPropagation();
 }
 }
 }
diff --git a/dijit/Tree.js b/dijit/Tree.js
index 70db003..4ac6dfc 100644
--- a/dijit/Tree.js
+++ b/dijit/Tree.js
@@ -9,24 +9,21 @@ if(!dojo._hasResource["dijit.Tree"]){
 dojo._hasResource["dijit.Tree"]=true;
 dojo.provide("dijit.Tree");
 dojo.require("dojo.fx");
+dojo.require("dojo.DeferredList");
 dojo.require("dijit._Widget");
 dojo.require("dijit._Templated");
 dojo.require("dijit._Container");
 dojo.require("dijit._Contained");
 dojo.require("dojo.cookie");
-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\" class=\"dijitTreeRow\" waiRole=\"presentation\" dojoAttachEvent=\"onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave\"\n\t\t><img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"expandoNode\" cl [...]
-this.setLabelNode(this.label);
+dojo.declare("dijit._TreeNode",[dijit._Widget,dijit._Templated,dijit._Container,dijit._Contained],{item:null,isTreeNode:true,label:"",isExpandable:null,isExpanded:false,state:"UNCHECKED",templateString:dojo.cache("dijit","templates/TreeNode.html","<div class=\"dijitTreeNode\" waiRole=\"presentation\"\n\t><div dojoAttachPoint=\"rowNode\" class=\"dijitTreeRow\" waiRole=\"presentation\" dojoAttachEvent=\"onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_o [...]
 this._setExpando();
 this._updateItemClasses(this.item);
 if(this.isExpandable){
 dijit.setWaiState(this.labelNode,"expanded",this.isExpanded);
-if(this==this.tree.rootNode){
-dijit.setWaitState(this.tree.domNode,"expanded",this.isExpanded);
-}
 }
 },_setIndentAttr:function(_1){
 this.indent=_1;
-var _2=(Math.max(_1,0)*19)+"px";
+var _2=(Math.max(_1,0)*this.tree._nodePixelIndent)+"px";
 dojo.style(this.domNode,"backgroundPosition",_2+" 0px");
 dojo.style(this.rowNode,dojo._isBodyLtr()?"paddingLeft":"paddingRight",_2);
 dojo.forEach(this.getChildren(),function(_3){
@@ -42,41 +39,35 @@ var _5=this.tree,_6=_5.model;
 if(_5._v10Compat&&_4===_6.root){
 _4=null;
 }
-if(this._iconClass){
-dojo.removeClass(this.iconNode,this._iconClass);
-}
-this._iconClass=_5.getIconClass(_4,this.isExpanded);
-if(this._iconClass){
-dojo.addClass(this.iconNode,this._iconClass);
+this._applyClassAndStyle(_4,"icon","Icon");
+this._applyClassAndStyle(_4,"label","Label");
+this._applyClassAndStyle(_4,"row","Row");
+},_applyClassAndStyle:function(_7,_8,_9){
+var _a="_"+_8+"Class";
+var _b=_8+"Node";
+if(this[_a]){
+dojo.removeClass(this[_b],this[_a]);
 }
-dojo.style(this.iconNode,_5.getIconStyle(_4,this.isExpanded)||{});
-if(this._labelClass){
-dojo.removeClass(this.labelNode,this._labelClass);
+this[_a]=this.tree["get"+_9+"Class"](_7,this.isExpanded);
+if(this[_a]){
+dojo.addClass(this[_b],this[_a]);
 }
-this._labelClass=_5.getLabelClass(_4,this.isExpanded);
-if(this._labelClass){
-dojo.addClass(this.labelNode,this._labelClass);
-}
-dojo.style(this.labelNode,_5.getLabelStyle(_4,this.isExpanded)||{});
+dojo.style(this[_b],this.tree["get"+_9+"Style"](_7,this.isExpanded)||{});
 },_updateLayout:function(){
-var _7=this.getParent();
-if(!_7||_7.rowNode.style.display=="none"){
+var _c=this.getParent();
+if(!_c||_c.rowNode.style.display=="none"){
 dojo.addClass(this.domNode,"dijitTreeIsRoot");
 }else{
 dojo.toggleClass(this.domNode,"dijitTreeIsLast",!this.getNextSibling());
 }
-},_setExpando:function(_8){
-var _9=["dijitTreeExpandoLoading","dijitTreeExpandoOpened","dijitTreeExpandoClosed","dijitTreeExpandoLeaf"];
-var _a=["*","-","+","*"];
-var _b=_8?0:(this.isExpandable?(this.isExpanded?1:2):3);
-dojo.forEach(_9,function(s){
-dojo.removeClass(this.expandoNode,s);
-},this);
-dojo.addClass(this.expandoNode,_9[_b]);
-this.expandoNodeText.innerHTML=_a[_b];
+},_setExpando:function(_d){
+var _e=["dijitTreeExpandoLoading","dijitTreeExpandoOpened","dijitTreeExpandoClosed","dijitTreeExpandoLeaf"],_f=["*","-","+","*"],idx=_d?0:(this.isExpandable?(this.isExpanded?1:2):3);
+dojo.removeClass(this.expandoNode,_e);
+dojo.addClass(this.expandoNode,_e[idx]);
+this.expandoNodeText.innerHTML=_f[idx];
 },expand:function(){
-if(this.isExpanded){
-return;
+if(this._expandDeferred){
+return this._expandDeferred;
 }
 this._wipeOut&&this._wipeOut.stop();
 this.isExpanded=true;
@@ -88,15 +79,22 @@ this._updateItemClasses(this.item);
 if(this==this.tree.rootNode){
 dijit.setWaiState(this.tree.domNode,"expanded","true");
 }
-if(!this._wipeIn){
-this._wipeIn=dojo.fx.wipeIn({node:this.containerNode,duration:dijit.defaultDuration});
-}
-this._wipeIn.play();
+var def,_10=dojo.fx.wipeIn({node:this.containerNode,duration:dijit.defaultDuration,onEnd:function(){
+def.callback(true);
+}});
+def=(this._expandDeferred=new dojo.Deferred(function(){
+_10.stop();
+}));
+_10.play();
+return def;
 },collapse:function(){
 if(!this.isExpanded){
 return;
 }
-this._wipeIn&&this._wipeIn.stop();
+if(this._expandDeferred){
+this._expandDeferred.cancel();
+delete this._expandDeferred;
+}
 this.isExpanded=false;
 dijit.setWaiState(this.labelNode,"expanded","false");
 if(this==this.tree.rootNode){
@@ -109,30 +107,40 @@ if(!this._wipeOut){
 this._wipeOut=dojo.fx.wipeOut({node:this.containerNode,duration:dijit.defaultDuration});
 }
 this._wipeOut.play();
-},setLabelNode:function(_d){
-this.labelNode.innerHTML="";
-this.labelNode.appendChild(dojo.doc.createTextNode(_d));
-},indent:0,setChildItems:function(_e){
-var _f=this.tree,_10=_f.model;
-this.getChildren().forEach(function(_11){
-dijit._Container.prototype.removeChild.call(this,_11);
+},indent:0,setChildItems:function(_11){
+var _12=this.tree,_13=_12.model,_14=[];
+this.getChildren().forEach(function(_15){
+dijit._Container.prototype.removeChild.call(this,_15);
 },this);
 this.state="LOADED";
-if(_e&&_e.length>0){
+if(_11&&_11.length>0){
 this.isExpandable=true;
-dojo.forEach(_e,function(_12){
-var id=_10.getIdentity(_12),_14=_f._itemNodeMap[id],_15=(_14&&!_14.getParent())?_14:this.tree._createTreeNode({item:_12,tree:_f,isExpandable:_10.mayHaveChildren(_12),label:_f.getLabel(_12),indent:this.indent+1});
-if(_14){
-_14.attr("indent",this.indent+1);
+dojo.forEach(_11,function(_16){
+var id=_13.getIdentity(_16),_17=_12._itemNodesMap[id],_18;
+if(_17){
+for(var i=0;i<_17.length;i++){
+if(_17[i]&&!_17[i].getParent()){
+_18=_17[i];
+_18.attr("indent",this.indent+1);
+break;
+}
+}
+}
+if(!_18){
+_18=this.tree._createTreeNode({item:_16,tree:_12,isExpandable:_13.mayHaveChildren(_16),label:_12.getLabel(_16),tooltip:_12.getTooltip(_16),indent:this.indent+1});
+if(_17){
+_17.push(_18);
+}else{
+_12._itemNodesMap[id]=[_18];
 }
-this.addChild(_15);
-_f._itemNodeMap[id]=_15;
-if(this.tree._state(_12)){
-_f._expandNode(_15);
+}
+this.addChild(_18);
+if(this.tree.autoExpand||this.tree._state(_16)){
+_14.push(_12._expandNode(_18));
 }
 },this);
-dojo.forEach(this.getChildren(),function(_16,idx){
-_16._updateLayout();
+dojo.forEach(this.getChildren(),function(_19,idx){
+_19._updateLayout();
 });
 }else{
 this.isExpandable=false;
@@ -140,24 +148,25 @@ this.isExpandable=false;
 if(this._setExpando){
 this._setExpando(false);
 }
-if(this==_f.rootNode){
+if(this==_12.rootNode){
 var fc=this.tree.showRoot?this:this.getChildren()[0];
 if(fc){
 fc.setSelected(true);
-_f.lastFocused=fc;
+_12.lastFocused=fc;
 }else{
-_f.domNode.setAttribute("tabIndex","0");
+_12.domNode.setAttribute("tabIndex","0");
 }
 }
-},removeChild:function(_19){
+return new dojo.DeferredList(_14);
+},removeChild:function(_1a){
 this.inherited(arguments);
-var _1a=this.getChildren();
-if(_1a.length==0){
+var _1b=this.getChildren();
+if(_1b.length==0){
 this.isExpandable=false;
 this.collapse();
 }
-dojo.forEach(_1a,function(_1b){
-_1b._updateLayout();
+dojo.forEach(_1b,function(_1c){
+_1c._updateLayout();
 });
 },makeExpandable:function(){
 this.isExpandable=true;
@@ -167,11 +176,15 @@ dojo.addClass(this.labelNode,"dijitTreeLabelFocused");
 this.tree._onNodeFocus(this);
 },_onLabelBlur:function(evt){
 dojo.removeClass(this.labelNode,"dijitTreeLabelFocused");
-},setSelected:function(_1e){
-var _1f=this.labelNode;
-_1f.setAttribute("tabIndex",_1e?"0":"-1");
-dijit.setWaiState(_1f,"selected",_1e);
-dojo.toggleClass(this.rowNode,"dijitTreeNodeSelected",_1e);
+},setSelected:function(_1d){
+var _1e=this.labelNode;
+_1e.setAttribute("tabIndex",_1d?"0":"-1");
+dijit.setWaiState(_1e,"selected",_1d);
+dojo.toggleClass(this.rowNode,"dijitTreeNodeSelected",_1d);
+},_onClick:function(evt){
+this.tree._onClick(this,evt);
+},_onDblClick:function(evt){
+this.tree._onDblClick(this,evt);
 },_onMouseEnter:function(evt){
 dojo.addClass(this.rowNode,"dijitTreeNodeHover");
 this.tree._onNodeMouseEnter(this,evt);
@@ -179,14 +192,16 @@ this.tree._onNodeMouseEnter(this,evt);
 dojo.removeClass(this.rowNode,"dijitTreeNodeHover");
 this.tree._onNodeMouseLeave(this,evt);
 }});
-dojo.declare("dijit.Tree",[dijit._Widget,dijit._Templated],{store:null,model:null,query:null,label:"",showRoot:true,childrenAttr:["children"],openOnClick:false,openOnDblClick:false,templateString:"<div class=\"dijitTreeContainer\" waiRole=\"tree\"\n\tdojoAttachEvent=\"onclick:_onClick,onkeypress:_onKeyPress,ondblclick:_onDblClick\">\n</div>\n",isExpandable:true,isTree:true,persist:true,dndController:null,dndParams:["onDndDrop","itemCreator","onDndCancel","checkAcceptance","checkItemAccep [...]
-dojo.publish(this.id,[dojo.mixin({tree:this,event:_22},_23||{})]);
+dojo.declare("dijit.Tree",[dijit._Widget,dijit._Templated],{store:null,model:null,query:null,label:"",showRoot:true,childrenAttr:["children"],path:[],selectedItem:null,openOnClick:false,openOnDblClick:false,templateString:dojo.cache("dijit","templates/Tree.html","<div class=\"dijitTree dijitTreeContainer\" waiRole=\"tree\"\n\tdojoAttachEvent=\"onkeypress:_onKeyPress\">\n\t<div class=\"dijitInline dijitTreeIndent\" style=\"position: absolute; top: -9999px\" dojoAttachPoint=\"indentDetecto [...]
+dojo.publish(this.id,[dojo.mixin({tree:this,event:_1f},_20||{})]);
 },postMixInProperties:function(){
 this.tree=this;
-this._itemNodeMap={};
+this._itemNodesMap={};
 if(!this.cookieName){
 this.cookieName=this.id+"SaveStateCookie";
 }
+this._loadDeferred=new dojo.Deferred();
+this.inherited(arguments);
 },postCreate:function(){
 this._initState();
 if(!this.model){
@@ -201,66 +216,151 @@ if(this.dndController){
 if(dojo.isString(this.dndController)){
 this.dndController=dojo.getObject(this.dndController);
 }
-var _24={};
+var _21={};
 for(var i=0;i<this.dndParams.length;i++){
 if(this[this.dndParams[i]]){
-_24[this.dndParams[i]]=this[this.dndParams[i]];
+_21[this.dndParams[i]]=this[this.dndParams[i]];
 }
 }
-this.dndController=new this.dndController(this,_24);
+this.dndController=new this.dndController(this,_21);
 }
 },_store2model:function(){
 this._v10Compat=true;
 dojo.deprecated("Tree: from version 2.0, should specify a model object rather than a store/query");
-var _26={id:this.id+"_ForestStoreModel",store:this.store,query:this.query,childrenAttrs:this.childrenAttr};
+var _22={id:this.id+"_ForestStoreModel",store:this.store,query:this.query,childrenAttrs:this.childrenAttr};
 if(this.params.mayHaveChildren){
-_26.mayHaveChildren=dojo.hitch(this,"mayHaveChildren");
+_22.mayHaveChildren=dojo.hitch(this,"mayHaveChildren");
 }
 if(this.params.getItemChildren){
-_26.getChildren=dojo.hitch(this,function(_27,_28,_29){
-this.getItemChildren((this._v10Compat&&_27===this.model.root)?null:_27,_28,_29);
+_22.getChildren=dojo.hitch(this,function(_23,_24,_25){
+this.getItemChildren((this._v10Compat&&_23===this.model.root)?null:_23,_24,_25);
 });
 }
-this.model=new dijit.tree.ForestStoreModel(_26);
+this.model=new dijit.tree.ForestStoreModel(_22);
 this.showRoot=Boolean(this.label);
+},onLoad:function(){
 },_load:function(){
-this.model.getRoot(dojo.hitch(this,function(_2a){
-var rn=this.rootNode=this.tree._createTreeNode({item:_2a,tree:this,isExpandable:true,label:this.label||this.getLabel(_2a),indent:this.showRoot?0:-1});
+this.model.getRoot(dojo.hitch(this,function(_26){
+var rn=(this.rootNode=this.tree._createTreeNode({item:_26,tree:this,isExpandable:true,label:this.label||this.getLabel(_26),indent:this.showRoot?0:-1}));
 if(!this.showRoot){
 rn.rowNode.style.display="none";
 }
 this.domNode.appendChild(rn.domNode);
-this._itemNodeMap[this.model.getIdentity(_2a)]=rn;
+var _27=this.model.getIdentity(_26);
+if(this._itemNodesMap[_27]){
+this._itemNodesMap[_27].push(rn);
+}else{
+this._itemNodesMap[_27]=[rn];
+}
 rn._updateLayout();
-this._expandNode(rn);
+this._expandNode(rn).addCallback(dojo.hitch(this,function(){
+this._loadDeferred.callback(true);
+this.onLoad();
+}));
 }),function(err){
 console.error(this,": error loading root: ",err);
 });
-},mayHaveChildren:function(_2d){
-},getItemChildren:function(_2e,_2f){
-},getLabel:function(_30){
-return this.model.getLabel(_30);
-},getIconClass:function(_31,_32){
-return (!_31||this.model.mayHaveChildren(_31))?(_32?"dijitFolderOpened":"dijitFolderClosed"):"dijitLeaf";
-},getLabelClass:function(_33,_34){
-},getIconStyle:function(_35,_36){
-},getLabelStyle:function(_37,_38){
+},getNodesByItem:function(_28){
+if(!_28){
+return [];
+}
+var _29=dojo.isString(_28)?_28:this.model.getIdentity(_28);
+return [].concat(this._itemNodesMap[_29]);
+},_setSelectedItemAttr:function(_2a){
+var _2b=this.attr("selectedItem");
+var _2c=(!_2a||dojo.isString(_2a))?_2a:this.model.getIdentity(_2a);
+if(_2c==_2b?this.model.getIdentity(_2b):null){
+return;
+}
+var _2d=this._itemNodesMap[_2c];
+if(_2d&&_2d.length){
+this.focusNode(_2d[0]);
+}else{
+if(this.lastFocused){
+this.lastFocused.setSelected(false);
+this.lastFocused=null;
+}
+}
+},_getSelectedItemAttr:function(){
+return this.lastFocused&&this.lastFocused.item;
+},_setPathAttr:function(_2e){
+if(!_2e||!_2e.length){
+return;
+}
+this._loadDeferred.addCallback(dojo.hitch(this,function(){
+if(!this.rootNode){
+return;
+}
+if(_2e[0]!==this.rootNode.item&&(dojo.isString(_2e[0])&&_2e[0]!=this.model.getIdentity(this.rootNode.item))){
+console.error(this,":path[0] doesn't match this.rootNode.item.  Maybe you are using the wrong tree.");
+return;
+}
+_2e.shift();
+var _2f=this.rootNode;
+function _30(){
+var _31=_2e.shift(),_32=dojo.isString(_31)?_31:this.model.getIdentity(_31);
+dojo.some(this._itemNodesMap[_32],function(n){
+if(n.getParent()==_2f){
+_2f=n;
+return true;
+}
+return false;
+});
+if(_2e.length){
+this._expandNode(_2f).addCallback(dojo.hitch(this,_30));
+}else{
+if(this.lastFocused!=_2f){
+this.focusNode(_2f);
+}
+}
+};
+this._expandNode(_2f).addCallback(dojo.hitch(this,_30));
+}));
+},_getPathAttr:function(){
+if(!this.lastFocused){
+return;
+}
+var res=[];
+var _33=this.lastFocused;
+while(_33&&_33!==this.rootNode){
+res.unshift(_33.item);
+_33=_33.getParent();
+}
+res.unshift(this.rootNode.item);
+return res;
+},mayHaveChildren:function(_34){
+},getItemChildren:function(_35,_36){
+},getLabel:function(_37){
+return this.model.getLabel(_37);
+},getIconClass:function(_38,_39){
+return (!_38||this.model.mayHaveChildren(_38))?(_39?"dijitFolderOpened":"dijitFolderClosed"):"dijitLeaf";
+},getLabelClass:function(_3a,_3b){
+},getRowClass:function(_3c,_3d){
+},getIconStyle:function(_3e,_3f){
+},getLabelStyle:function(_40,_41){
+},getRowStyle:function(_42,_43){
+},getTooltip:function(_44){
+return "";
 },_onKeyPress:function(e){
 if(e.altKey){
 return;
 }
 var dk=dojo.keys;
-var _3b=dijit.getEnclosingWidget(e.target);
-if(!_3b){
+var _45=dijit.getEnclosingWidget(e.target);
+if(!_45){
 return;
 }
 var key=e.charOrCode;
 if(typeof key=="string"){
 if(!e.altKey&&!e.ctrlKey&&!e.shiftKey&&!e.metaKey){
-this._onLetterKeyNav({node:_3b,key:key.toLowerCase()});
+this._onLetterKeyNav({node:_45,key:key.toLowerCase()});
 dojo.stopEvent(e);
 }
 }else{
+if(this._curSearch){
+clearTimeout(this._curSearch.timer);
+delete this._curSearch;
+}
 var map=this._keyHandlerMap;
 if(!map){
 map={};
@@ -274,235 +374,252 @@ map[dk.END]="_onEndKey";
 this._keyHandlerMap=map;
 }
 if(this._keyHandlerMap[key]){
-this[this._keyHandlerMap[key]]({node:_3b,item:_3b.item});
+this[this._keyHandlerMap[key]]({node:_45,item:_45.item,evt:e});
 dojo.stopEvent(e);
 }
 }
-},_onEnterKey:function(_3e){
-this._publish("execute",{item:_3e.item,node:_3e.node});
-this.onClick(_3e.item,_3e.node);
-},_onDownArrow:function(_3f){
-var _40=this._getNextNode(_3f.node);
-if(_40&&_40.isTreeNode){
-this.focusNode(_40);
+},_onEnterKey:function(_46,evt){
+this._publish("execute",{item:_46.item,node:_46.node});
+this.onClick(_46.item,_46.node,evt);
+},_onDownArrow:function(_47){
+var _48=this._getNextNode(_47.node);
+if(_48&&_48.isTreeNode){
+this.focusNode(_48);
 }
-},_onUpArrow:function(_41){
-var _42=_41.node;
-var _43=_42.getPreviousSibling();
-if(_43){
-_42=_43;
-while(_42.isExpandable&&_42.isExpanded&&_42.hasChildren()){
-var _44=_42.getChildren();
-_42=_44[_44.length-1];
+},_onUpArrow:function(_49){
+var _4a=_49.node;
+var _4b=_4a.getPreviousSibling();
+if(_4b){
+_4a=_4b;
+while(_4a.isExpandable&&_4a.isExpanded&&_4a.hasChildren()){
+var _4c=_4a.getChildren();
+_4a=_4c[_4c.length-1];
 }
 }else{
-var _45=_42.getParent();
-if(!(!this.showRoot&&_45===this.rootNode)){
-_42=_45;
+var _4d=_4a.getParent();
+if(!(!this.showRoot&&_4d===this.rootNode)){
+_4a=_4d;
 }
 }
-if(_42&&_42.isTreeNode){
-this.focusNode(_42);
+if(_4a&&_4a.isTreeNode){
+this.focusNode(_4a);
 }
-},_onRightArrow:function(_46){
-var _47=_46.node;
-if(_47.isExpandable&&!_47.isExpanded){
-this._expandNode(_47);
+},_onRightArrow:function(_4e){
+var _4f=_4e.node;
+if(_4f.isExpandable&&!_4f.isExpanded){
+this._expandNode(_4f);
 }else{
-if(_47.hasChildren()){
-_47=_47.getChildren()[0];
-if(_47&&_47.isTreeNode){
-this.focusNode(_47);
+if(_4f.hasChildren()){
+_4f=_4f.getChildren()[0];
+if(_4f&&_4f.isTreeNode){
+this.focusNode(_4f);
 }
 }
 }
-},_onLeftArrow:function(_48){
-var _49=_48.node;
-if(_49.isExpandable&&_49.isExpanded){
-this._collapseNode(_49);
+},_onLeftArrow:function(_50){
+var _51=_50.node;
+if(_51.isExpandable&&_51.isExpanded){
+this._collapseNode(_51);
 }else{
-var _4a=_49.getParent();
-if(_4a&&_4a.isTreeNode&&!(!this.showRoot&&_4a===this.rootNode)){
-this.focusNode(_4a);
+var _52=_51.getParent();
+if(_52&&_52.isTreeNode&&!(!this.showRoot&&_52===this.rootNode)){
+this.focusNode(_52);
 }
 }
 },_onHomeKey:function(){
-var _4b=this._getRootOrFirstNode();
-if(_4b){
-this.focusNode(_4b);
+var _53=this._getRootOrFirstNode();
+if(_53){
+this.focusNode(_53);
+}
+},_onEndKey:function(_54){
+var _55=this.rootNode;
+while(_55.isExpanded){
+var c=_55.getChildren();
+_55=c[c.length-1];
 }
-},_onEndKey:function(_4c){
-var _4d=this.rootNode;
-while(_4d.isExpanded){
-var c=_4d.getChildren();
-_4d=c[c.length-1];
+if(_55&&_55.isTreeNode){
+this.focusNode(_55);
 }
-if(_4d&&_4d.isTreeNode){
-this.focusNode(_4d);
+},multiCharSearchDuration:250,_onLetterKeyNav:function(_56){
+var cs=this._curSearch;
+if(cs){
+cs.pattern=cs.pattern+_56.key;
+clearTimeout(cs.timer);
+}else{
+cs=this._curSearch={pattern:_56.key,startNode:_56.node};
 }
-},_onLetterKeyNav:function(_4f){
-var _50=_4f.node,_51=_50,key=_4f.key;
+var _57=this;
+cs.timer=setTimeout(function(){
+delete _57._curSearch;
+},this.multiCharSearchDuration);
+var _58=cs.startNode;
 do{
-_50=this._getNextNode(_50);
-if(!_50){
-_50=this._getRootOrFirstNode();
-}
-}while(_50!==_51&&(_50.label.charAt(0).toLowerCase()!=key));
-if(_50&&_50.isTreeNode){
-if(_50!==_51){
-this.focusNode(_50);
+_58=this._getNextNode(_58);
+if(!_58){
+_58=this._getRootOrFirstNode();
 }
+}while(_58!==cs.startNode&&(_58.label.toLowerCase().substr(0,cs.pattern.length)!=cs.pattern));
+if(_58&&_58.isTreeNode){
+if(_58!==cs.startNode){
+this.focusNode(_58);
 }
-},_onClick:function(e){
-var _54=e.target;
-var _55=dijit.getEnclosingWidget(_54);
-if(!_55||!_55.isTreeNode){
-return;
 }
-if((this.openOnClick&&_55.isExpandable)||(_54==_55.expandoNode||_54==_55.expandoNodeText)){
-if(_55.isExpandable){
-this._onExpandoClick({node:_55});
+},_onClick:function(_59,e){
+var _5a=e.target;
+if((this.openOnClick&&_59.isExpandable)||(_5a==_59.expandoNode||_5a==_59.expandoNodeText)){
+if(_59.isExpandable){
+this._onExpandoClick({node:_59});
 }
 }else{
-this._publish("execute",{item:_55.item,node:_55});
-this.onClick(_55.item,_55);
-this.focusNode(_55);
+this._publish("execute",{item:_59.item,node:_59,evt:e});
+this.onClick(_59.item,_59,e);
+this.focusNode(_59);
 }
 dojo.stopEvent(e);
-},_onDblClick:function(e){
-var _57=e.target;
-var _58=dijit.getEnclosingWidget(_57);
-if(!_58||!_58.isTreeNode){
-return;
-}
-if((this.openOnDblClick&&_58.isExpandable)||(_57==_58.expandoNode||_57==_58.expandoNodeText)){
-if(_58.isExpandable){
-this._onExpandoClick({node:_58});
+},_onDblClick:function(_5b,e){
+var _5c=e.target;
+if((this.openOnDblClick&&_5b.isExpandable)||(_5c==_5b.expandoNode||_5c==_5b.expandoNodeText)){
+if(_5b.isExpandable){
+this._onExpandoClick({node:_5b});
 }
 }else{
-this._publish("execute",{item:_58.item,node:_58});
-this.onDblClick(_58.item,_58);
-this.focusNode(_58);
+this._publish("execute",{item:_5b.item,node:_5b,evt:e});
+this.onDblClick(_5b.item,_5b,e);
+this.focusNode(_5b);
 }
 dojo.stopEvent(e);
-},_onExpandoClick:function(_59){
-var _5a=_59.node;
-this.focusNode(_5a);
-if(_5a.isExpanded){
-this._collapseNode(_5a);
+},_onExpandoClick:function(_5d){
+var _5e=_5d.node;
+this.focusNode(_5e);
+if(_5e.isExpanded){
+this._collapseNode(_5e);
 }else{
-this._expandNode(_5a);
-}
-},onClick:function(_5b,_5c){
-},onDblClick:function(_5d,_5e){
-},onOpen:function(_5f,_60){
-},onClose:function(_61,_62){
-},_getNextNode:function(_63){
-if(_63.isExpandable&&_63.isExpanded&&_63.hasChildren()){
-return _63.getChildren()[0];
+this._expandNode(_5e);
+}
+},onClick:function(_5f,_60,evt){
+},onDblClick:function(_61,_62,evt){
+},onOpen:function(_63,_64){
+},onClose:function(_65,_66){
+},_getNextNode:function(_67){
+if(_67.isExpandable&&_67.isExpanded&&_67.hasChildren()){
+return _67.getChildren()[0];
 }else{
-while(_63&&_63.isTreeNode){
-var _64=_63.getNextSibling();
-if(_64){
-return _64;
+while(_67&&_67.isTreeNode){
+var _68=_67.getNextSibling();
+if(_68){
+return _68;
 }
-_63=_63.getParent();
+_67=_67.getParent();
 }
 return null;
 }
 },_getRootOrFirstNode:function(){
 return this.showRoot?this.rootNode:this.rootNode.getChildren()[0];
-},_collapseNode:function(_65){
-if(_65.isExpandable){
-if(_65.state=="LOADING"){
+},_collapseNode:function(_69){
+if(_69._expandNodeDeferred){
+delete _69._expandNodeDeferred;
+}
+if(_69.isExpandable){
+if(_69.state=="LOADING"){
 return;
 }
-_65.collapse();
-this.onClose(_65.item,_65);
-if(_65.item){
-this._state(_65.item,false);
+_69.collapse();
+this.onClose(_69.item,_69);
+if(_69.item){
+this._state(_69.item,false);
 this._saveState();
 }
 }
-},_expandNode:function(_66){
-if(!_66.isExpandable){
-return;
+},_expandNode:function(_6a,_6b){
+if(_6a._expandNodeDeferred&&!_6b){
+return _6a._expandNodeDeferred;
 }
-var _67=this.model,_68=_66.item;
-switch(_66.state){
-case "LOADING":
-return;
+var _6c=this.model,_6d=_6a.item,_6e=this;
+switch(_6a.state){
 case "UNCHECKED":
-_66.markProcessing();
-var _69=this;
-_67.getChildren(_68,function(_6a){
-_66.unmarkProcessing();
-_66.setChildItems(_6a);
-_69._expandNode(_66);
+_6a.markProcessing();
+var def=(_6a._expandNodeDeferred=new dojo.Deferred());
+_6c.getChildren(_6d,function(_6f){
+_6a.unmarkProcessing();
+var _70=_6a.setChildItems(_6f);
+var ed=_6e._expandNode(_6a,true);
+_70.addCallback(function(){
+ed.addCallback(function(){
+def.callback();
+});
+});
 },function(err){
-console.error(_69,": error loading root children: ",err);
+console.error(_6e,": error loading root children: ",err);
 });
 break;
 default:
-_66.expand();
-this.onOpen(_66.item,_66);
-if(_68){
-this._state(_68,true);
+def=(_6a._expandNodeDeferred=_6a.expand());
+this.onOpen(_6a.item,_6a);
+if(_6d){
+this._state(_6d,true);
 this._saveState();
 }
 }
-},focusNode:function(_6c){
-_6c.labelNode.focus();
-},_onNodeFocus:function(_6d){
-if(_6d){
-if(_6d!=this.lastFocused){
+return def;
+},focusNode:function(_71){
+dijit.focus(_71.labelNode);
+},_onNodeFocus:function(_72){
+if(_72){
+if(_72!=this.lastFocused&&this.lastFocused&&!this.lastFocused._destroyed){
 this.lastFocused.setSelected(false);
 }
-_6d.setSelected(true);
-this.lastFocused=_6d;
+_72.setSelected(true);
+this.lastFocused=_72;
 }
-},_onNodeMouseEnter:function(_6e){
-},_onNodeMouseLeave:function(_6f){
-},_onItemChange:function(_70){
-var _71=this.model,_72=_71.getIdentity(_70),_73=this._itemNodeMap[_72];
-if(_73){
-_73.setLabelNode(this.getLabel(_70));
-_73._updateItemClasses(_70);
-}
-},_onItemChildrenChange:function(_74,_75){
-var _76=this.model,_77=_76.getIdentity(_74),_78=this._itemNodeMap[_77];
+},_onNodeMouseEnter:function(_73){
+},_onNodeMouseLeave:function(_74){
+},_onItemChange:function(_75){
+var _76=this.model,_77=_76.getIdentity(_75),_78=this._itemNodesMap[_77];
 if(_78){
-_78.setChildItems(_75);
+var _79=this;
+dojo.forEach(_78,function(_7a){
+_7a.attr({label:_79.getLabel(_75),tooltip:_79.getTooltip(_75)});
+_7a._updateItemClasses(_75);
+});
+}
+},_onItemChildrenChange:function(_7b,_7c){
+var _7d=this.model,_7e=_7d.getIdentity(_7b),_7f=this._itemNodesMap[_7e];
+if(_7f){
+dojo.forEach(_7f,function(_80){
+_80.setChildItems(_7c);
+});
 }
-},_onItemDelete:function(_79){
-var _7a=this.model,_7b=_7a.getIdentity(_79),_7c=this._itemNodeMap[_7b];
-if(_7c){
-var _7d=_7c.getParent();
-if(_7d){
-_7d.removeChild(_7c);
+},_onItemDelete:function(_81){
+var _82=this.model,_83=_82.getIdentity(_81),_84=this._itemNodesMap[_83];
+if(_84){
+dojo.forEach(_84,function(_85){
+var _86=_85.getParent();
+if(_86){
+_86.removeChild(_85);
 }
-_7c.destroyRecursive();
-delete this._itemNodeMap[_7b];
+_85.destroyRecursive();
+});
+delete this._itemNodesMap[_83];
 }
 },_initState:function(){
 if(this.persist){
-var _7e=dojo.cookie(this.cookieName);
+var _87=dojo.cookie(this.cookieName);
 this._openedItemIds={};
-if(_7e){
-dojo.forEach(_7e.split(","),function(_7f){
-this._openedItemIds[_7f]=true;
+if(_87){
+dojo.forEach(_87.split(","),function(_88){
+this._openedItemIds[_88]=true;
 },this);
 }
 }
-},_state:function(_80,_81){
+},_state:function(_89,_8a){
 if(!this.persist){
 return false;
 }
-var id=this.model.getIdentity(_80);
+var id=this.model.getIdentity(_89);
 if(arguments.length===1){
 return this._openedItemIds[id];
 }
-if(_81){
+if(_8a){
 this._openedItemIds[id]=true;
 }else{
 delete this._openedItemIds[id];
@@ -517,6 +634,10 @@ ary.push(id);
 }
 dojo.cookie(this.cookieName,ary.join(","),{expires:365});
 },destroy:function(){
+if(this._curSearch){
+clearTimeout(this._curSearch.timer);
+delete this._curSearch;
+}
 if(this.rootNode){
 this.rootNode.destroyRecursive();
 }
@@ -527,8 +648,17 @@ this.rootNode=null;
 this.inherited(arguments);
 },destroyRecursive:function(){
 this.destroy();
-},_createTreeNode:function(_85){
-return new dijit._TreeNode(_85);
+},resize:function(_8b){
+if(_8b){
+dojo.marginBox(this.domNode,_8b);
+dojo.style(this.domNode,"overflow","auto");
+}
+this._nodePixelIndent=dojo.marginBox(this.tree.indentDetector).w;
+if(this.tree.rootNode){
+this.tree.rootNode.attr("indent",this.showRoot?0:-1);
+}
+},_createTreeNode:function(_8c){
+return new dijit._TreeNode(_8c);
 }});
 dojo.require("dijit.tree.TreeStoreModel");
 dojo.require("dijit.tree.ForestStoreModel");
diff --git a/dijit/_Calendar.js b/dijit/_Calendar.js
index 2d367f8..b4f5856 100644
--- a/dijit/_Calendar.js
+++ b/dijit/_Calendar.js
@@ -8,172 +8,7 @@
 if(!dojo._hasResource["dijit._Calendar"]){
 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],{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<img src=\"${_blankGif}\" alt=\"\" class=\"dijitCalendarIncrementControl dijitCalendarDecrease\" waiRole=\"presentation\">\n\t\t\t\t<span dojoAttachPoint=\"decreaseArrowNode\ [...]
-dojo.deprecated("dijit.Calendar:setValue() is deprecated.  Use attr('value', ...) instead.","","2.0");
-this.attr("value",_1);
-},_getValueAttr:function(_2){
-var _2=new Date(this.value);
-_2.setHours(0,0,0,0);
-if(_2.getDate()<this.value.getDate()){
-_2=dojo.date.add(_2,"hour",1);
-}
-return _2;
-},_setValueAttr:function(_3){
-if(!this.value||dojo.date.compare(_3,this.value)){
-_3=new Date(_3);
-_3.setHours(1);
-this.displayMonth=new Date(_3);
-if(!this.isDisabledDate(_3,this.lang)){
-this.value=_3;
-this.onChange(this.attr("value"));
-}
-this._populateGrid();
-}
-},_setText:function(_4,_5){
-while(_4.firstChild){
-_4.removeChild(_4.firstChild);
-}
-_4.appendChild(dojo.doc.createTextNode(_5));
-},_populateGrid:function(){
-var _6=this.displayMonth;
-_6.setDate(1);
-var _7=_6.getDay();
-var _8=dojo.date.getDaysInMonth(_6);
-var _9=dojo.date.getDaysInMonth(dojo.date.add(_6,"month",-1));
-var _a=new Date();
-var _b=this.value;
-var _c=dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);
-if(_c>_7){
-_c-=7;
-}
-dojo.query(".dijitCalendarDateTemplate",this.domNode).forEach(function(_d,i){
-i+=_c;
-var _f=new Date(_6);
-var _10,_11="dijitCalendar",adj=0;
-if(i<_7){
-_10=_9-_7+i+1;
-adj=-1;
-_11+="Previous";
-}else{
-if(i>=(_7+_8)){
-_10=i-_7-_8+1;
-adj=1;
-_11+="Next";
-}else{
-_10=i-_7+1;
-_11+="Current";
-}
-}
-if(adj){
-_f=dojo.date.add(_f,"month",adj);
-}
-_f.setDate(_10);
-if(!dojo.date.compare(_f,_a,"date")){
-_11="dijitCalendarCurrentDate "+_11;
-}
-if(!dojo.date.compare(_f,_b,"date")){
-_11="dijitCalendarSelectedDate "+_11;
-}
-if(this.isDisabledDate(_f,this.lang)){
-_11="dijitCalendarDisabledDate "+_11;
-}
-var _13=this.getClassForDate(_f,this.lang);
-if(_13){
-_11=_13+" "+_11;
-}
-_d.className=_11+"Month dijitCalendarDateTemplate";
-_d.dijitDateValue=_f.valueOf();
-var _14=dojo.query(".dijitCalendarDateLabel",_d)[0];
-this._setText(_14,_f.getDate());
-},this);
-var _15=dojo.date.locale.getNames("months","wide","standAlone",this.lang);
-this._setText(this.monthLabelNode,_15[_6.getMonth()]);
-var y=_6.getFullYear()-1;
-var d=new Date();
-dojo.forEach(["previous","current","next"],function(_18){
-d.setFullYear(y++);
-this._setText(this[_18+"YearLabelNode"],dojo.date.locale.format(d,{selector:"year",locale:this.lang}));
-},this);
-var _19=this;
-var _1a=function(_1b,_1c,adj){
-_19._connects.push(dijit.typematic.addMouseListener(_19[_1b],_19,function(_1e){
-if(_1e>=0){
-_19._adjustDisplay(_1c,adj);
-}
-},0.8,500));
-};
-_1a("incrementMonth","month",1);
-_1a("decrementMonth","month",-1);
-_1a("nextYearLabelNode","year",1);
-_1a("previousYearLabelNode","year",-1);
-},goToToday:function(){
-this.attr("value",new Date());
-},postCreate:function(){
-this.inherited(arguments);
-dojo.setSelectable(this.domNode,false);
-var _1f=dojo.hitch(this,function(_20,n){
-var _22=dojo.query(_20,this.domNode)[0];
-for(var i=0;i<n;i++){
-_22.parentNode.appendChild(_22.cloneNode(true));
-}
-});
-_1f(".dijitCalendarDayLabelTemplate",6);
-_1f(".dijitCalendarDateTemplate",6);
-_1f(".dijitCalendarWeekTemplate",5);
-var _24=dojo.date.locale.getNames("days",this.dayWidth,"standAlone",this.lang);
-var _25=dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);
-dojo.query(".dijitCalendarDayLabel",this.domNode).forEach(function(_26,i){
-this._setText(_26,_24[(i+_25)%7]);
-},this);
-var _28=dojo.date.locale.getNames("months","wide","standAlone",this.lang);
-dojo.forEach(_28,function(_29){
-var _2a=dojo.create("div",null,this.monthLabelSpacer);
-this._setText(_2a,_29);
-},this);
-this.value=null;
-this.attr("value",new Date());
-},_adjustDisplay:function(_2b,_2c){
-this.displayMonth=dojo.date.add(this.displayMonth,_2b,_2c);
-this._populateGrid();
-},_onDayClick:function(evt){
-dojo.stopEvent(evt);
-for(var _2e=evt.target;_2e&&!_2e.dijitDateValue;_2e=_2e.parentNode){
-}
-if(_2e&&!dojo.hasClass(_2e,"dijitCalendarDisabledDate")){
-this.attr("value",_2e.dijitDateValue);
-this.onValueSelected(this.attr("value"));
-}
-},_onDayMouseOver:function(evt){
-var _30=evt.target;
-if(_30&&(_30.dijitDateValue||_30==this.previousYearLabelNode||_30==this.nextYearLabelNode)){
-dojo.addClass(_30,"dijitCalendarHoveredDate");
-this._currentNode=_30;
-}
-},_onDayMouseOut:function(evt){
-if(!this._currentNode){
-return;
-}
-for(var _32=evt.relatedTarget;_32;){
-if(_32==this._currentNode){
-return;
-}
-try{
-_32=_32.parentNode;
-}
-catch(x){
-_32=null;
-}
-}
-dojo.removeClass(this._currentNode,"dijitCalendarHoveredDate");
-this._currentNode=null;
-},onValueSelected:function(_33){
-},onChange:function(_34){
-},isDisabledDate:function(_35,_36){
-},getClassForDate:function(_37,_38){
-}});
+dojo.require("dijit.Calendar");
+dojo.deprecated("dijit._Calendar is deprecated","dijit._Calendar moved to dijit.Calendar",1.5);
+dijit._Calendar=dijit.Calendar;
 }
diff --git a/dijit/_Contained.js b/dijit/_Contained.js
index 6d8aaaa..2b71174 100644
--- a/dijit/_Contained.js
+++ b/dijit/_Contained.js
@@ -9,24 +9,14 @@ if(!dojo._hasResource["dijit._Contained"]){
 dojo._hasResource["dijit._Contained"]=true;
 dojo.provide("dijit._Contained");
 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 _3=dijit.byId(id);
-return _3.isContainer?_3:null;
-}
-}
-return null;
-},_getSibling:function(_4){
-var _5=this.domNode;
+var _1=dijit.getEnclosingWidget(this.domNode.parentNode);
+return _1&&_1.isContainer?_1:null;
+},_getSibling:function(_2){
+var _3=this.domNode;
 do{
-_5=_5[_4+"Sibling"];
-}while(_5&&_5.nodeType!=1);
-if(!_5){
-return null;
-}
-var id=_5.getAttribute("widgetId");
-return dijit.byId(id);
+_3=_3[_2+"Sibling"];
+}while(_3&&_3.nodeType!=1);
+return _3&&dijit.byNode(_3);
 },getPreviousSibling:function(){
 return this._getSibling("previous");
 },getNextSibling:function(){
diff --git a/dijit/_Container.js b/dijit/_Container.js
index 2c0100d..820a5db 100644
--- a/dijit/_Container.js
+++ b/dijit/_Container.js
@@ -30,44 +30,33 @@ _1.startup();
 if(typeof _5=="number"&&_5>0){
 _5=this.getChildren()[_5];
 }
-if(!_5||!_5.domNode){
-return;
-}
+if(_5&&_5.domNode){
 var _6=_5.domNode;
 _6.parentNode.removeChild(_6);
-},_nextElement:function(_7){
-do{
-_7=_7.nextSibling;
-}while(_7&&_7.nodeType!=1);
-return _7;
-},_firstElement:function(_8){
-_8=_8.firstChild;
-if(_8&&_8.nodeType!=1){
-_8=this._nextElement(_8);
 }
-return _8;
 },getChildren:function(){
 return dojo.query("> [widgetId]",this.containerNode).map(dijit.byNode);
 },hasChildren:function(){
-return !!this._firstElement(this.containerNode);
-},destroyDescendants:function(_9){
-dojo.forEach(this.getChildren(),function(_a){
-_a.destroyRecursive(_9);
+return dojo.query("> [widgetId]",this.containerNode).length>0;
+},destroyDescendants:function(_7){
+dojo.forEach(this.getChildren(),function(_8){
+_8.destroyRecursive(_7);
 });
-},_getSiblingOfChild:function(_b,_c){
-var _d=_b.domNode;
-var _e=(_c>0?"nextSibling":"previousSibling");
+},_getSiblingOfChild:function(_9,_a){
+var _b=_9.domNode,_c=(_a>0?"nextSibling":"previousSibling");
 do{
-_d=_d[_e];
-}while(_d&&(_d.nodeType!=1||!dijit.byNode(_d)));
-return _d?dijit.byNode(_d):null;
-},getIndexOfChild:function(_f){
-var _10=this.getChildren();
-for(var i=0,c;c=_10[i];i++){
-if(c==_f){
-return i;
-}
+_b=_b[_c];
+}while(_b&&(_b.nodeType!=1||!dijit.byNode(_b)));
+return _b&&dijit.byNode(_b);
+},getIndexOfChild:function(_d){
+return dojo.indexOf(this.getChildren(),_d);
+},startup:function(){
+if(this._started){
+return;
 }
-return -1;
+dojo.forEach(this.getChildren(),function(_e){
+_e.startup();
+});
+this.inherited(arguments);
 }});
 }
diff --git a/dijit/_DialogMixin.js b/dijit/_DialogMixin.js
index ef40cab..20c7bf7 100644
--- a/dijit/_DialogMixin.js
+++ b/dijit/_DialogMixin.js
@@ -18,8 +18,8 @@ this.execute(this.attr("value"));
 var _3=dijit._getTabNavigable(dojo.byId(_2));
 this._firstFocusItem=_3.lowest||_3.first||_2;
 this._lastFocusItem=_3.last||_3.highest||this._firstFocusItem;
-if(dojo.isMoz&&this._firstFocusItem.tagName.toLowerCase()=="input"&&dojo.attr(this._firstFocusItem,"type").toLowerCase()=="file"){
-dojo.attr(_2,"tabindex","0");
+if(dojo.isMoz&&this._firstFocusItem.tagName.toLowerCase()=="input"&&dojo.getNodeProp(this._firstFocusItem,"type").toLowerCase()=="file"){
+dojo.attr(_2,"tabIndex","0");
 this._firstFocusItem=_2;
 }
 }});
diff --git a/dijit/_HasDropDown.js b/dijit/_HasDropDown.js
new file mode 100644
index 0000000..7d03423
--- /dev/null
+++ b/dijit/_HasDropDown.js
@@ -0,0 +1,221 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dijit._HasDropDown"]){
+dojo._hasResource["dijit._HasDropDown"]=true;
+dojo.provide("dijit._HasDropDown");
+dojo.require("dijit._base.place");
+dojo.require("dijit._Widget");
+dojo.declare("dijit._HasDropDown",null,{_buttonNode:null,_arrowWrapperNode:null,_popupStateNode:null,_aroundNode:null,dropDown:null,autoWidth:true,forceWidth:false,maxHeight:0,dropDownPosition:["below","above"],_stopClickEvents:true,_onDropDownMouse:function(e){
+if(e.type=="click"&&!this._seenKeydown){
+return;
+}
+this._seenKeydown=false;
+if(e.type=="mousedown"){
+this._docHandler=this.connect(dojo.doc,"onmouseup","_onDropDownMouseup");
+}
+if(this.disabled||this.readOnly){
+return;
+}
+if(this._stopClickEvents){
+dojo.stopEvent(e);
+}
+this.toggleDropDown();
+if(e.type=="click"||e.type=="keypress"){
+this._onDropDownMouseup();
+}
+},_onDropDownMouseup:function(e){
+if(e&&this._docHandler){
+this.disconnect(this._docHandler);
+}
+var _1=this.dropDown,_2=false;
+if(e&&this._opened){
+var c=dojo.position(this._buttonNode,true);
+if(!(e.pageX>=c.x&&e.pageX<=c.x+c.w)||!(e.pageY>=c.y&&e.pageY<=c.y+c.h)){
+var t=e.target;
+while(t&&!_2){
+if(dojo.hasClass(t,"dijitPopup")){
+_2=true;
+}else{
+t=t.parentNode;
+}
+}
+if(_2){
+t=e.target;
+if(_1.onItemClick){
+var _3;
+while(t&&!(_3=dijit.byNode(t))){
+t=t.parentNode;
+}
+if(_3&&_3.onClick&&_3.getParent){
+_3.getParent().onItemClick(_3,e);
+}
+}
+return;
+}
+}
+}
+if(this._opened&&_1.focus){
+window.setTimeout(dojo.hitch(_1,"focus"),1);
+}
+},_setupDropdown:function(){
+this._buttonNode=this._buttonNode||this.focusNode||this.domNode;
+this._popupStateNode=this._popupStateNode||this.focusNode||this._buttonNode;
+this._aroundNode=this._aroundNode||this.domNode;
+this.connect(this._buttonNode,"onmousedown","_onDropDownMouse");
+this.connect(this._buttonNode,"onclick","_onDropDownMouse");
+this.connect(this._buttonNode,"onkeydown","_onDropDownKeydown");
+this.connect(this._buttonNode,"onblur","_onDropDownBlur");
+this.connect(this._buttonNode,"onkeypress","_onKey");
+if(this._setStateClass){
+this.connect(this,"openDropDown","_setStateClass");
+this.connect(this,"closeDropDown","_setStateClass");
+}
+var _4={"after":this.isLeftToRight()?"Right":"Left","before":this.isLeftToRight()?"Left":"Right","above":"Up","below":"Down","left":"Left","right":"Right"}[this.dropDownPosition[0]]||this.dropDownPosition[0]||"Down";
+dojo.addClass(this._arrowWrapperNode||this._buttonNode,"dijit"+_4+"ArrowButton");
+},postCreate:function(){
+this._setupDropdown();
+this.inherited(arguments);
+},destroyDescendants:function(){
+if(this.dropDown){
+if(!this.dropDown._destroyed){
+this.dropDown.destroyRecursive();
+}
+delete this.dropDown;
+}
+this.inherited(arguments);
+},_onDropDownKeydown:function(e){
+this._seenKeydown=true;
+},_onKeyPress:function(e){
+if(this._opened&&e.charOrCode==dojo.keys.ESCAPE&&!e.shiftKey&&!e.ctrlKey&&!e.altKey){
+this.toggleDropDown();
+dojo.stopEvent(e);
+return;
+}
+this.inherited(arguments);
+},_onDropDownBlur:function(e){
+this._seenKeydown=false;
+},_onKey:function(e){
+if(this.disabled||this.readOnly){
+return;
+}
+var d=this.dropDown;
+if(d&&this._opened&&d.handleKey){
+if(d.handleKey(e)===false){
+return;
+}
+}
+if(d&&this._opened&&e.keyCode==dojo.keys.ESCAPE){
+this.toggleDropDown();
+return;
+}
+if(e.keyCode==dojo.keys.DOWN_ARROW||e.keyCode==dojo.keys.ENTER||e.charOrCode==" "){
+this._onDropDownMouse(e);
+}
+},_onBlur:function(){
+this.closeDropDown();
+this.inherited(arguments);
+},isLoaded:function(){
+return true;
+},loadDropDown:function(_5){
+_5();
+},toggleDropDown:function(){
+if(this.disabled||this.readOnly){
+return;
+}
+this.focus();
+var _6=this.dropDown;
+if(!_6){
+return;
+}
+if(!this._opened){
+if(!this.isLoaded()){
+this.loadDropDown(dojo.hitch(this,"openDropDown"));
+return;
+}else{
+this.openDropDown();
+}
+}else{
+this.closeDropDown();
+}
+},openDropDown:function(){
+var _7=this.dropDown;
+var _8=_7.domNode;
+var _9=this;
+if(!this._preparedNode){
+dijit.popup.moveOffScreen(_8);
+this._preparedNode=true;
+if(_8.style.width){
+this._explicitDDWidth=true;
+}
+if(_8.style.height){
+this._explicitDDHeight=true;
+}
+}
+if(this.maxHeight||this.forceWidth||this.autoWidth){
+var _a={display:"",visibility:"hidden"};
+if(!this._explicitDDWidth){
+_a.width="";
+}
+if(!this._explicitDDHeight){
+_a.height="";
+}
+dojo.style(_8,_a);
+var mb=dojo.marginBox(_8);
+var _b=(this.maxHeight&&mb.h>this.maxHeight);
+dojo.style(_8,{overflow:_b?"auto":"hidden"});
+if(this.forceWidth){
+mb.w=this.domNode.offsetWidth;
+}else{
+if(this.autoWidth){
+mb.w=Math.max(mb.w,this.domNode.offsetWidth);
+}else{
+delete mb.w;
+}
+}
+if(_b){
+mb.h=this.maxHeight;
+if("w" in mb){
+mb.w+=16;
+}
+}else{
+delete mb.h;
+}
+delete mb.t;
+delete mb.l;
+if(dojo.isFunction(_7.resize)){
+_7.resize(mb);
+}else{
+dojo.marginBox(_8,mb);
+}
+}
+var _c=dijit.popup.open({parent:this,popup:_7,around:this._aroundNode,orient:dijit.getPopupAroundAlignment((this.dropDownPosition&&this.dropDownPosition.length)?this.dropDownPosition:["below"],this.isLeftToRight()),onExecute:function(){
+_9.closeDropDown(true);
+},onCancel:function(){
+_9.closeDropDown(true);
+},onClose:function(){
+dojo.attr(_9._popupStateNode,"popupActive",false);
+dojo.removeClass(_9._popupStateNode,"dijitHasDropDownOpen");
+_9._opened=false;
+_9.state="";
+}});
+dojo.attr(this._popupStateNode,"popupActive","true");
+dojo.addClass(_9._popupStateNode,"dijitHasDropDownOpen");
+this._opened=true;
+this.state="Opened";
+return _c;
+},closeDropDown:function(_d){
+if(this._opened){
+dijit.popup.close(this.dropDown);
+if(_d){
+this.focus();
+}
+this._opened=false;
+this.state="";
+}
+}});
+}
diff --git a/dijit/_KeyNavContainer.js b/dijit/_KeyNavContainer.js
index 06b556f..e9b6605 100644
--- a/dijit/_KeyNavContainer.js
+++ b/dijit/_KeyNavContainer.js
@@ -9,8 +9,8 @@ if(!dojo._hasResource["dijit._KeyNavContainer"]){
 dojo._hasResource["dijit._KeyNavContainer"]=true;
 dojo.provide("dijit._KeyNavContainer");
 dojo.require("dijit._Container");
-dojo.declare("dijit._KeyNavContainer",[dijit._Container],{tabIndex:"0",_keyNavCodes:{},connectKeyNavHandlers:function(_1,_2){
-var _3=this._keyNavCodes={};
+dojo.declare("dijit._KeyNavContainer",dijit._Container,{tabIndex:"0",_keyNavCodes:{},connectKeyNavHandlers:function(_1,_2){
+var _3=(this._keyNavCodes={});
 var _4=dojo.hitch(this,this.focusPrev);
 var _5=dojo.hitch(this,this.focusNext);
 dojo.forEach(_1,function(_6){
@@ -29,101 +29,66 @@ this._startupChild(_8);
 },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 _a=this._getNextFocusableChild(this.focusedChild,1);
-if(_a.getFocalNodes){
-this.focusChild(_a,_a.getFocalNodes()[0]);
-}else{
+var _a=this._getFirstFocusableChild();
+if(_a){
 this.focusChild(_a);
 }
-},focusPrev:function(){
-if(this.focusedChild&&this.focusedChild.hasPrevFocalNode&&this.focusedChild.hasPrevFocalNode()){
-this.focusedChild.focusPrev();
-return;
-}
-var _b=this._getNextFocusableChild(this.focusedChild,-1);
-if(_b.getFocalNodes){
-var _c=_b.getFocalNodes();
-this.focusChild(_b,_c[_c.length-1]);
-}else{
+},focusNext:function(){
+var _b=this._getNextFocusableChild(this.focusedChild,1);
 this.focusChild(_b);
-}
+},focusPrev:function(){
+var _c=this._getNextFocusableChild(this.focusedChild,-1);
+this.focusChild(_c,true);
 },focusChild:function(_d,_e){
-if(_d){
 if(this.focusedChild&&_d!==this.focusedChild){
 this._onChildBlur(this.focusedChild);
 }
+_d.focus(_e?"end":"start");
 this.focusedChild=_d;
-if(_e&&_d.focusFocalNode){
-_d.focusFocalNode(_e);
-}else{
-_d.focus();
-}
-}
 },_startupChild:function(_f){
-if(_f.getFocalNodes){
-dojo.forEach(_f.getFocalNodes(),function(_10){
-dojo.attr(_10,"tabindex",-1);
-this._connectNode(_10);
-},this);
-}else{
-var _11=_f.focusNode||_f.domNode;
-if(_f.isFocusable()){
-dojo.attr(_11,"tabindex",-1);
-}
-this._connectNode(_11);
-}
-},_connectNode:function(_12){
-this.connect(_12,"onfocus","_onNodeFocus");
-this.connect(_12,"onblur","_onNodeBlur");
+_f.attr("tabIndex","-1");
+this.connect(_f,"_onFocus",function(){
+_f.attr("tabIndex",this.tabIndex);
+});
+this.connect(_f,"_onBlur",function(){
+_f.attr("tabIndex","-1");
+});
 },_onContainerFocus:function(evt){
 if(evt.target!==this.domNode){
 return;
 }
 this.focusFirstChild();
-dojo.removeAttr(this.domNode,"tabIndex");
+dojo.attr(this.domNode,"tabIndex","-1");
 },_onBlur:function(evt){
 if(this.tabIndex){
-dojo.attr(this.domNode,"tabindex",this.tabIndex);
+dojo.attr(this.domNode,"tabIndex",this.tabIndex);
 }
+this.inherited(arguments);
 },_onContainerKeypress:function(evt){
 if(evt.ctrlKey||evt.altKey){
 return;
 }
-var _16=this._keyNavCodes[evt.charOrCode];
-if(_16){
-_16();
+var _10=this._keyNavCodes[evt.charOrCode];
+if(_10){
+_10();
 dojo.stopEvent(evt);
 }
-},_onNodeFocus:function(evt){
-var _18=dijit.getEnclosingWidget(evt.target);
-if(_18&&_18.isFocusable()){
-this.focusedChild=_18;
-}
-dojo.stopEvent(evt);
-},_onNodeBlur:function(evt){
-dojo.stopEvent(evt);
-},_onChildBlur:function(_1a){
+},_onChildBlur:function(_11){
 },_getFirstFocusableChild:function(){
 return this._getNextFocusableChild(null,1);
-},_getNextFocusableChild:function(_1b,dir){
-if(_1b){
-_1b=this._getSiblingOfChild(_1b,dir);
+},_getNextFocusableChild:function(_12,dir){
+if(_12){
+_12=this._getSiblingOfChild(_12,dir);
 }
-var _1d=this.getChildren();
-for(var i=0;i<_1d.length;i++){
-if(!_1b){
-_1b=_1d[(dir>0)?0:(_1d.length-1)];
+var _13=this.getChildren();
+for(var i=0;i<_13.length;i++){
+if(!_12){
+_12=_13[(dir>0)?0:(_13.length-1)];
 }
-if(_1b.isFocusable()){
-return _1b;
+if(_12.isFocusable()){
+return _12;
 }
-_1b=this._getSiblingOfChild(_1b,dir);
+_12=this._getSiblingOfChild(_12,dir);
 }
 return null;
 }});
diff --git a/dijit/_Templated.js b/dijit/_Templated.js
index 72eb905..4a19e14 100644
--- a/dijit/_Templated.js
+++ b/dijit/_Templated.js
@@ -11,7 +11,10 @@ dojo.provide("dijit._Templated");
 dojo.require("dijit._Widget");
 dojo.require("dojo.string");
 dojo.require("dojo.parser");
-dojo.declare("dijit._Templated",null,{templateString:null,templatePath:null,widgetsInTemplate:false,_skipNodeCache:false,_stringRepl:function(_1){
+dojo.require("dojo.cache");
+dojo.declare("dijit._Templated",null,{templateString:null,templatePath:null,widgetsInTemplate:false,_skipNodeCache:false,_earlyTemplatedStartup:false,constructor:function(){
+this._attachPoints=[];
+},_stringRepl:function(_1){
 var _2=this.declaredClass,_3=this;
 return dojo.string.substitute(_1,this,function(_4,_5){
 if(_5.charAt(0)=="!"){
@@ -30,13 +33,28 @@ var _6=dijit._Templated.getCachedTemplate(this.templatePath,this.templateString,
 var _7;
 if(dojo.isString(_6)){
 _7=dojo._toDom(this._stringRepl(_6));
+if(_7.nodeType!=1){
+throw new Error("Invalid template: "+_6);
+}
 }else{
 _7=_6.cloneNode(true);
 }
 this.domNode=_7;
 this._attachTemplateNodes(_7);
 if(this.widgetsInTemplate){
-var cw=(this._supportingWidgets=dojo.parser.parse(_7));
+var _8=dojo.parser,_9,_a;
+if(_8._query!="[dojoType]"){
+_9=_8._query;
+_a=_8._attrName;
+_8._query="[dojoType]";
+_8._attrName="dojoType";
+}
+var cw=(this._startupWidgets=dojo.parser.parse(_7,{noStart:!this._earlyTemplatedStartup}));
+if(_9){
+_8._query=_9;
+_8._attrName=_a;
+}
+this._supportingWidgets=dijit.findWidgets(_7);
 this._attachTemplateNodes(cw,function(n,p){
 return n[p];
 });
@@ -53,102 +71,112 @@ _c.appendChild(_b.firstChild);
 _e=_e||function(n,p){
 return n.getAttribute(p);
 };
-var _11=dojo.isArray(_d)?_d:(_d.all||_d.getElementsByTagName("*"));
+var _f=dojo.isArray(_d)?_d:(_d.all||_d.getElementsByTagName("*"));
 var x=dojo.isArray(_d)?0:-1;
-for(;x<_11.length;x++){
-var _13=(x==-1)?_d:_11[x];
-if(this.widgetsInTemplate&&_e(_13,"dojoType")){
+for(;x<_f.length;x++){
+var _10=(x==-1)?_d:_f[x];
+if(this.widgetsInTemplate&&_e(_10,"dojoType")){
 continue;
 }
-var _14=_e(_13,"dojoAttachPoint");
-if(_14){
-var _15,_16=_14.split(/\s*,\s*/);
-while((_15=_16.shift())){
-if(dojo.isArray(this[_15])){
-this[_15].push(_13);
+var _11=_e(_10,"dojoAttachPoint");
+if(_11){
+var _12,_13=_11.split(/\s*,\s*/);
+while((_12=_13.shift())){
+if(dojo.isArray(this[_12])){
+this[_12].push(_10);
 }else{
-this[_15]=_13;
+this[_12]=_10;
 }
+this._attachPoints.push(_12);
 }
 }
-var _17=_e(_13,"dojoAttachEvent");
-if(_17){
-var _18,_19=_17.split(/\s*,\s*/);
-var _1a=dojo.trim;
-while((_18=_19.shift())){
-if(_18){
-var _1b=null;
-if(_18.indexOf(":")!=-1){
-var _1c=_18.split(":");
-_18=_1a(_1c[0]);
-_1b=_1a(_1c[1]);
+var _14=_e(_10,"dojoAttachEvent");
+if(_14){
+var _15,_16=_14.split(/\s*,\s*/);
+var _17=dojo.trim;
+while((_15=_16.shift())){
+if(_15){
+var _18=null;
+if(_15.indexOf(":")!=-1){
+var _19=_15.split(":");
+_15=_17(_19[0]);
+_18=_17(_19[1]);
 }else{
-_18=_1a(_18);
+_15=_17(_15);
 }
-if(!_1b){
-_1b=_18;
+if(!_18){
+_18=_15;
 }
-this.connect(_13,_18,_1b);
+this.connect(_10,_15,_18);
 }
 }
 }
-var _1d=_e(_13,"waiRole");
-if(_1d){
-dijit.setWaiRole(_13,_1d);
+var _1a=_e(_10,"waiRole");
+if(_1a){
+dijit.setWaiRole(_10,_1a);
 }
-var _1e=_e(_13,"waiState");
-if(_1e){
-dojo.forEach(_1e.split(/\s*,\s*/),function(_1f){
-if(_1f.indexOf("-")!=-1){
-var _20=_1f.split("-");
-dijit.setWaiState(_13,_20[0],_20[1]);
+var _1b=_e(_10,"waiState");
+if(_1b){
+dojo.forEach(_1b.split(/\s*,\s*/),function(_1c){
+if(_1c.indexOf("-")!=-1){
+var _1d=_1c.split("-");
+dijit.setWaiState(_10,_1d[0],_1d[1]);
 }
 });
 }
 }
+},startup:function(){
+dojo.forEach(this._startupWidgets,function(w){
+if(w&&!w._started&&w.startup){
+w.startup();
+}
+});
+this.inherited(arguments);
+},destroyRendering:function(){
+dojo.forEach(this._attachPoints,function(_1e){
+delete this[_1e];
+},this);
+this._attachPoints=[];
+this.inherited(arguments);
 }});
 dijit._Templated._templateCache={};
-dijit._Templated.getCachedTemplate=function(_21,_22,_23){
-var _24=dijit._Templated._templateCache;
-var key=_22||_21;
-var _26=_24[key];
-if(_26){
-if(!_26.ownerDocument||_26.ownerDocument==dojo.doc){
-return _26;
+dijit._Templated.getCachedTemplate=function(_1f,_20,_21){
+var _22=dijit._Templated._templateCache;
+var key=_20||_1f;
+var _23=_22[key];
+if(_23){
+try{
+if(!_23.ownerDocument||_23.ownerDocument==dojo.doc){
+return _23;
 }
-dojo.destroy(_26);
 }
-if(!_22){
-_22=dijit._Templated._sanitizeTemplateString(dojo.trim(dojo._getText(_21)));
+catch(e){
 }
-_22=dojo.string.trim(_22);
-if(_23||_22.match(/\$\{([^\}]+)\}/g)){
-return (_24[key]=_22);
-}else{
-return (_24[key]=dojo._toDom(_22));
+dojo.destroy(_23);
 }
-};
-dijit._Templated._sanitizeTemplateString=function(_27){
-if(_27){
-_27=_27.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,"");
-var _28=_27.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
-if(_28){
-_27=_28[1];
+if(!_20){
+_20=dojo.cache(_1f,{sanitize:true});
 }
+_20=dojo.string.trim(_20);
+if(_21||_20.match(/\$\{([^\}]+)\}/g)){
+return (_22[key]=_20);
 }else{
-_27="";
+var _24=dojo._toDom(_20);
+if(_24.nodeType!=1){
+throw new Error("Invalid template: "+_20);
+}
+return (_22[key]=_24);
 }
-return _27;
 };
 if(dojo.isIE){
 dojo.addOnWindowUnload(function(){
-var _29=dijit._Templated._templateCache;
-for(var key in _29){
-var _2b=_29[key];
-if(!isNaN(_2b.nodeType)){
-dojo.destroy(_2b);
+var _25=dijit._Templated._templateCache;
+for(var key in _25){
+var _26=_25[key];
+if(typeof _26=="object"){
+dojo.destroy(_26);
 }
-delete _29[key];
+delete _25[key];
 }
 });
 }
diff --git a/dijit/_TimePicker.js b/dijit/_TimePicker.js
index 6c5e472..31a3340 100644
--- a/dijit/_TimePicker.js
+++ b/dijit/_TimePicker.js
@@ -10,7 +10,7 @@ dojo._hasResource["dijit._TimePicker"]=true;
 dojo.provide("dijit._TimePicker");
 dojo.require("dijit.form._FormWidget");
 dojo.require("dojo.date.locale");
-dojo.declare("dijit._TimePicker",[dijit._Widget,dijit._Templated],{templateString:"<div id=\"widget_${id}\" class=\"dijitMenu ${baseClass}\"\n    ><div dojoAttachPoint=\"upArrow\" class=\"dijitButtonNode dijitUpArrowButton\" dojoAttachEvent=\"onmouseenter:_buttonMouse,onmouseleave:_buttonMouse\"\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonInner\" wairole=\"presentation\" role=\"presentation\"> </div\n\t\t><div class=\"dijitArrowButtonChar\">▲</div></div\n    ><di [...]
+dojo.declare("dijit._TimePicker",[dijit._Widget,dijit._Templated],{templateString:dojo.cache("dijit","templates/TimePicker.html","<div id=\"widget_${id}\" class=\"dijitMenu ${baseClass}\"\n    ><div dojoAttachPoint=\"upArrow\" class=\"dijitButtonNode dijitUpArrowButton\" dojoAttachEvent=\"onmouseenter:_buttonMouse,onmouseleave:_buttonMouse\"\n\t\t><div class=\"dijitReset dijitInline dijitArrowButtonInner\" wairole=\"presentation\" role=\"presentation\"> </div\n\t\t><div class=\"diji [...]
 dojo.deprecated("dijit._TimePicker:setValue() is deprecated.  Use attr('value') instead.","","2.0");
 this.attr("value",_1);
 },_setValueAttr:function(_2){
@@ -20,9 +20,9 @@ this._showText();
 if(this._beenOpened&&this.domNode.parentNode){
 var p=dijit.byId(this.domNode.parentNode.dijitPopupParent);
 if(p){
-var _5=p.getDisplayedValue();
-if(_5&&!p.parse(_5,p.constraints)){
-this._filterString=_5;
+var _4=p.attr("displayedValue");
+if(_4&&!p.parse(_4,p.constraints)){
+this._filterString=_4;
 }else{
 this._filterString="";
 }
@@ -30,48 +30,48 @@ this._showText();
 }
 }
 this._beenOpened=true;
-},isDisabledDate:function(_6,_7){
+},isDisabledDate:function(_5,_6){
 return false;
-},_getFilteredNodes:function(_8,_9,_a){
-var _b=[],n,i=_8,_e=this._maxIncrement+Math.abs(i),_f=_a?-1:1,dec=_a?1:0,inc=_a?0:1;
+},_getFilteredNodes:function(_7,_8,_9){
+var _a=[],n,i=_7,_b=this._maxIncrement+Math.abs(i),_c=_9?-1:1,_d=_9?1:0,_e=_9?0:1;
 do{
-i=i-dec;
+i=i-_d;
 n=this._createOption(i);
 if(n){
-_b.push(n);
+_a.push(n);
 }
-i=i+inc;
-}while(_b.length<_9&&(i*_f)<_e);
-if(_a){
-_b.reverse();
+i=i+_e;
+}while(_a.length<_8&&(i*_c)<_b);
+if(_9){
+_a.reverse();
 }
-return _b;
+return _a;
 },_showText:function(){
 this.timeMenu.innerHTML="";
-var _12=dojo.date.stamp.fromISOString;
-this._clickableIncrementDate=_12(this.clickableIncrement);
-this._visibleIncrementDate=_12(this.visibleIncrement);
-this._visibleRangeDate=_12(this.visibleRange);
-var _13=function(_14){
-return _14.getHours()*60*60+_14.getMinutes()*60+_14.getSeconds();
+var _f=dojo.date.stamp.fromISOString;
+this._clickableIncrementDate=_f(this.clickableIncrement);
+this._visibleIncrementDate=_f(this.visibleIncrement);
+this._visibleRangeDate=_f(this.visibleRange);
+var _10=function(_11){
+return _11.getHours()*60*60+_11.getMinutes()*60+_11.getSeconds();
 };
-var _15=_13(this._clickableIncrementDate);
-var _16=_13(this._visibleIncrementDate);
-var _17=_13(this._visibleRangeDate);
-var _18=this.value.getTime();
-this._refDate=new Date(_18-_18%(_16*1000));
+var _12=_10(this._clickableIncrementDate);
+var _13=_10(this._visibleIncrementDate);
+var _14=_10(this._visibleRangeDate);
+var _15=this.value.getTime();
+this._refDate=new Date(_15-_15%(_13*1000));
 this._refDate.setFullYear(1970,0,1);
 this._clickableIncrement=1;
-this._totalIncrements=_17/_15;
-this._visibleIncrement=_16/_15;
-this._maxIncrement=(60*60*24)/_15;
-var _19=this._getFilteredNodes(0,this._totalIncrements>>1,true);
-var _1a=this._getFilteredNodes(0,this._totalIncrements>>1,false);
-if(_19.length<this._totalIncrements>>1){
-_19=_19.slice(_19.length/2);
-_1a=_1a.slice(0,_1a.length/2);
-}
-dojo.forEach(_19.concat(_1a),function(n){
+this._totalIncrements=_14/_12;
+this._visibleIncrement=_13/_12;
+this._maxIncrement=(60*60*24)/_12;
+var _16=this._getFilteredNodes(0,this._totalIncrements>>1,true);
+var _17=this._getFilteredNodes(0,this._totalIncrements>>1,false);
+if(_16.length<this._totalIncrements>>1){
+_16=_16.slice(_16.length/2);
+_17=_17.slice(0,_17.length/2);
+}
+dojo.forEach(_16.concat(_17),function(n){
 this.timeMenu.appendChild(n);
 },this);
 },postCreate:function(){
@@ -83,53 +83,56 @@ if(!this.constraints.locale){
 this.constraints.locale=this.lang;
 }
 this.connect(this.timeMenu,dojo.isIE?"onmousewheel":"DOMMouseScroll","_mouseWheeled");
-var _1c=this;
-var _1d=function(){
-_1c._connects.push(dijit.typematic.addMouseListener.apply(null,arguments));
+var _18=this;
+var _19=function(){
+_18._connects.push(dijit.typematic.addMouseListener.apply(null,arguments));
 };
-_1d(this.upArrow,this,this._onArrowUp,1,50);
-_1d(this.downArrow,this,this._onArrowDown,1,50);
-var _1e=function(cb){
+_19(this.upArrow,this,this._onArrowUp,1,50);
+_19(this.downArrow,this,this._onArrowDown,1,50);
+var _1a=function(cb){
 return function(cnt){
 if(cnt>0){
 cb.call(this,arguments);
 }
 };
 };
-var _21=function(_22,cb){
+var _1b=function(_1c,cb){
 return function(e){
 dojo.stopEvent(e);
-dijit.typematic.trigger(e,this,_22,_1e(cb),_22,1,50);
+dijit.typematic.trigger(e,this,_1c,_1a(cb),_1c,1,50);
 };
 };
-this.connect(this.upArrow,"onmouseover",_21(this.upArrow,this._onArrowUp));
-this.connect(this.downArrow,"onmouseover",_21(this.downArrow,this._onArrowDown));
+this.connect(this.upArrow,"onmouseover",_1b(this.upArrow,this._onArrowUp));
+this.connect(this.downArrow,"onmouseover",_1b(this.downArrow,this._onArrowDown));
 this.inherited(arguments);
 },_buttonMouse:function(e){
 dojo.toggleClass(e.currentTarget,"dijitButtonNodeHover",e.type=="mouseover");
-},_createOption:function(_26){
-var _27=new Date(this._refDate);
-var _28=this._clickableIncrementDate;
-_27.setHours(_27.getHours()+_28.getHours()*_26,_27.getMinutes()+_28.getMinutes()*_26,_27.getSeconds()+_28.getSeconds()*_26);
-var _29=dojo.date.locale.format(_27,this.constraints);
-if(this._filterString&&_29.toLowerCase().indexOf(this._filterString)!==0){
+},_createOption:function(_1d){
+var _1e=new Date(this._refDate);
+var _1f=this._clickableIncrementDate;
+_1e.setHours(_1e.getHours()+_1f.getHours()*_1d,_1e.getMinutes()+_1f.getMinutes()*_1d,_1e.getSeconds()+_1f.getSeconds()*_1d);
+if(this.constraints.selector=="time"){
+_1e.setFullYear(1970,0,1);
+}
+var _20=dojo.date.locale.format(_1e,this.constraints);
+if(this._filterString&&_20.toLowerCase().indexOf(this._filterString)!==0){
 return null;
 }
 var div=dojo.create("div",{"class":this.baseClass+"Item"});
-div.date=_27;
-div.index=_26;
-dojo.create("div",{"class":this.baseClass+"ItemInner",innerHTML:_29},div);
-if(_26%this._visibleIncrement<1&&_26%this._visibleIncrement>-1){
+div.date=_1e;
+div.index=_1d;
+dojo.create("div",{"class":this.baseClass+"ItemInner",innerHTML:_20},div);
+if(_1d%this._visibleIncrement<1&&_1d%this._visibleIncrement>-1){
 dojo.addClass(div,this.baseClass+"Marker");
 }else{
-if(!(_26%this._clickableIncrement)){
+if(!(_1d%this._clickableIncrement)){
 dojo.addClass(div,this.baseClass+"Tick");
 }
 }
-if(this.isDisabledDate(_27)){
+if(this.isDisabledDate(_1e)){
 dojo.addClass(div,this.baseClass+"ItemDisabled");
 }
-if(!dojo.date.compare(this.value,_27,this.constraints.selector)){
+if(!dojo.date.compare(this.value,_1e,this.constraints.selector)){
 div.selected=true;
 dojo.addClass(div,this.baseClass+"ItemSelected");
 if(dojo.hasClass(div,this.baseClass+"Marker")){
@@ -140,74 +143,77 @@ dojo.addClass(div,this.baseClass+"TickSelected");
 }
 return div;
 },_onOptionSelected:function(tgt){
-var _2c=tgt.target.date||tgt.target.parentNode.date;
-if(!_2c||this.isDisabledDate(_2c)){
+var _21=tgt.target.date||tgt.target.parentNode.date;
+if(!_21||this.isDisabledDate(_21)){
 return;
 }
 this._highlighted_option=null;
-this.attr("value",_2c);
-this.onValueSelected(_2c);
-},onValueSelected:function(_2d){
-},_highlightOption:function(_2e,_2f){
-if(!_2e){
+this.attr("value",_21);
+this.onValueSelected(_21);
+},onValueSelected:function(_22){
+},_highlightOption:function(_23,_24){
+if(!_23){
 return;
 }
-if(_2f){
+if(_24){
 if(this._highlighted_option){
 this._highlightOption(this._highlighted_option,false);
 }
-this._highlighted_option=_2e;
+this._highlighted_option=_23;
 }else{
-if(this._highlighted_option!==_2e){
+if(this._highlighted_option!==_23){
 return;
 }else{
 this._highlighted_option=null;
 }
 }
-dojo.toggleClass(_2e,this.baseClass+"ItemHover",_2f);
-if(dojo.hasClass(_2e,this.baseClass+"Marker")){
-dojo.toggleClass(_2e,this.baseClass+"MarkerHover",_2f);
+dojo.toggleClass(_23,this.baseClass+"ItemHover",_24);
+if(dojo.hasClass(_23,this.baseClass+"Marker")){
+dojo.toggleClass(_23,this.baseClass+"MarkerHover",_24);
 }else{
-dojo.toggleClass(_2e,this.baseClass+"TickHover",_2f);
+dojo.toggleClass(_23,this.baseClass+"TickHover",_24);
 }
 },onmouseover:function(e){
+this._keyboardSelected=null;
 var tgr=(e.target.parentNode===this.timeMenu)?e.target:e.target.parentNode;
 if(!dojo.hasClass(tgr,this.baseClass+"Item")){
 return;
 }
 this._highlightOption(tgr,true);
 },onmouseout:function(e){
+this._keyboardSelected=null;
 var tgr=(e.target.parentNode===this.timeMenu)?e.target:e.target.parentNode;
 this._highlightOption(tgr,false);
 },_mouseWheeled:function(e){
+this._keyboardSelected=null;
 dojo.stopEvent(e);
-var _35=(dojo.isIE?e.wheelDelta:-e.detail);
-this[(_35>0?"_onArrowUp":"_onArrowDown")]();
-},_onArrowUp:function(_36){
-if(typeof _36=="number"&&_36==-1){
+var _25=(dojo.isIE?e.wheelDelta:-e.detail);
+this[(_25>0?"_onArrowUp":"_onArrowDown")]();
+},_onArrowUp:function(_26){
+if(typeof _26=="number"&&_26==-1){
 return;
 }
 if(!this.timeMenu.childNodes.length){
 return;
 }
-var _37=this.timeMenu.childNodes[0].index;
-var _38=this._getFilteredNodes(_37,1,true);
-if(_38.length){
+var _27=this.timeMenu.childNodes[0].index;
+var _28=this._getFilteredNodes(_27,1,true);
+if(_28.length){
 this.timeMenu.removeChild(this.timeMenu.childNodes[this.timeMenu.childNodes.length-1]);
-this.timeMenu.insertBefore(_38[0],this.timeMenu.childNodes[0]);
+this.timeMenu.insertBefore(_28[0],this.timeMenu.childNodes[0]);
 }
-},_onArrowDown:function(_39){
-if(typeof _39=="number"&&_39==-1){
+},_onArrowDown:function(_29){
+if(typeof _29=="number"&&_29==-1){
 return;
 }
 if(!this.timeMenu.childNodes.length){
 return;
 }
-var _3a=this.timeMenu.childNodes[this.timeMenu.childNodes.length-1].index+1;
-var _3b=this._getFilteredNodes(_3a,1,false);
-if(_3b.length){
+var _2a=this.timeMenu.childNodes[this.timeMenu.childNodes.length-1].index+1;
+var _2b=this._getFilteredNodes(_2a,1,false);
+if(_2b.length){
 this.timeMenu.removeChild(this.timeMenu.childNodes[0]);
-this.timeMenu.appendChild(_3b[0]);
+this.timeMenu.appendChild(_2b[0]);
 }
 },handleKey:function(e){
 var dk=dojo.keys;
@@ -222,11 +228,11 @@ dojo.stopEvent(e);
 if(this._highlighted_option&&!this._highlighted_option.parentNode){
 this._highlighted_option=null;
 }
-var _3e=this.timeMenu,tgt=this._highlighted_option||dojo.query("."+this.baseClass+"ItemSelected",_3e)[0];
+var _2c=this.timeMenu,tgt=this._highlighted_option||dojo.query("."+this.baseClass+"ItemSelected",_2c)[0];
 if(!tgt){
-tgt=_3e.childNodes[0];
+tgt=_2c.childNodes[0];
 }else{
-if(_3e.childNodes.length){
+if(_2c.childNodes.length){
 if(e.charOrCode==dk.DOWN_ARROW&&!tgt.nextSibling){
 this._onArrowDown();
 }else{
@@ -242,14 +248,16 @@ tgt=tgt.previousSibling;
 }
 }
 this._highlightOption(tgt,true);
+this._keyboardSelected=tgt;
 }else{
 if(this._highlighted_option&&(e.charOrCode==dk.ENTER||e.charOrCode===dk.TAB)){
+if(!this._keyboardSelected&&e.charOrCode===dk.TAB){
+return;
+}
 if(e.charOrCode==dk.ENTER){
 dojo.stopEvent(e);
 }
-setTimeout(dojo.hitch(this,function(){
 this._onOptionSelected({target:this._highlighted_option});
-}),1);
 }
 }
 }
diff --git a/dijit/_Widget.js b/dijit/_Widget.js
index 407d4af..2ad0cb6 100644
--- a/dijit/_Widget.js
+++ b/dijit/_Widget.js
@@ -9,49 +9,64 @@ if(!dojo._hasResource["dijit._Widget"]){
 dojo._hasResource["dijit._Widget"]=true;
 dojo.provide("dijit._Widget");
 dojo.require("dijit._base");
-dojo.connect(dojo,"connect",function(_1,_2){
+dojo.connect(dojo,"_connect",function(_1,_2){
 if(_1&&dojo.isFunction(_1._onConnect)){
 _1._onConnect(_2);
 }
 });
 dijit._connectOnUseEventHandler=function(_3){
 };
+dijit._lastKeyDownNode=null;
+if(dojo.isIE){
 (function(){
-var _4={};
-var _5=function(dc){
-if(!_4[dc]){
-var r=[];
-var _8;
-var _9=dojo.getObject(dc).prototype;
-for(var _a in _9){
-if(dojo.isFunction(_9[_a])&&(_8=_a.match(/^_set([a-zA-Z]*)Attr$/))&&_8[1]){
-r.push(_8[1].charAt(0).toLowerCase()+_8[1].substr(1));
+var _4=function(_5){
+dijit._lastKeyDownNode=_5.srcElement;
+};
+dojo.doc.attachEvent("onkeydown",_4);
+dojo.addOnWindowUnload(function(){
+dojo.doc.detachEvent("onkeydown",_4);
+});
+})();
+}else{
+dojo.doc.addEventListener("keydown",function(_6){
+dijit._lastKeyDownNode=_6.target;
+},true);
+}
+(function(){
+var _7={},_8=function(_9){
+var dc=_9.declaredClass;
+if(!_7[dc]){
+var r=[],_a,_b=_9.constructor.prototype;
+for(var _c in _b){
+if(dojo.isFunction(_b[_c])&&(_a=_c.match(/^_set([a-zA-Z]*)Attr$/))&&_a[1]){
+r.push(_a[1].charAt(0).toLowerCase()+_a[1].substr(1));
 }
 }
-_4[dc]=r;
+_7[dc]=r;
 }
-return _4[dc]||[];
+return _7[dc]||[];
 };
-dojo.declare("dijit._Widget",null,{id:"",lang:"",dir:"","class":"",style:"",title:"",srcNodeRef:null,domNode:null,containerNode:null,attributeMap:{id:"",dir:"",lang:"","class":"",style:"",title:""},_deferredConnects:{onClick:"",onDblClick:"",onKeyDown:"",onKeyPress:"",onKeyUp:"",onMouseMove:"",onMouseDown:"",onMouseOut:"",onMouseOver:"",onMouseLeave:"",onMouseEnter:"",onMouseUp:""},onClick:dijit._connectOnUseEventHandler,onDblClick:dijit._connectOnUseEventHandler,onKeyDown:dijit._connect [...]
-this.create(_b,_c);
-},create:function(_d,_e){
-this.srcNodeRef=dojo.byId(_e);
+dojo.declare("dijit._Widget",null,{id:"",lang:"",dir:"","class":"",style:"",title:"",tooltip:"",srcNodeRef:null,domNode:null,containerNode:null,attributeMap:{id:"",dir:"",lang:"","class":"",style:"",title:""},_deferredConnects:{onClick:"",onDblClick:"",onKeyDown:"",onKeyPress:"",onKeyUp:"",onMouseMove:"",onMouseDown:"",onMouseOut:"",onMouseOver:"",onMouseLeave:"",onMouseEnter:"",onMouseUp:""},onClick:dijit._connectOnUseEventHandler,onDblClick:dijit._connectOnUseEventHandler,onKeyDown:dij [...]
+this.create(_d,_e);
+},create:function(_f,_10){
+this.srcNodeRef=dojo.byId(_10);
 this._connects=[];
+this._subscribes=[];
 this._deferredConnects=dojo.clone(this._deferredConnects);
-for(var _f in this.attributeMap){
-delete this._deferredConnects[_f];
+for(var _11 in this.attributeMap){
+delete this._deferredConnects[_11];
 }
-for(_f in this._deferredConnects){
-if(this[_f]!==dijit._connectOnUseEventHandler){
-delete this._deferredConnects[_f];
+for(_11 in this._deferredConnects){
+if(this[_11]!==dijit._connectOnUseEventHandler){
+delete this._deferredConnects[_11];
 }
 }
 if(this.srcNodeRef&&(typeof this.srcNodeRef.id=="string")){
 this.id=this.srcNodeRef.id;
 }
-if(_d){
-this.params=_d;
-dojo.mixin(this,_d);
+if(_f){
+this.params=_f;
+dojo.mixin(this,_f);
 }
 this.postMixInProperties();
 if(!this.id){
@@ -61,12 +76,12 @@ dijit.registry.add(this);
 this.buildRendering();
 if(this.domNode){
 this._applyAttributes();
-var _10=this.srcNodeRef;
-if(_10&&_10.parentNode){
-_10.parentNode.replaceChild(this.domNode,_10);
+var _12=this.srcNodeRef;
+if(_12&&_12.parentNode){
+_12.parentNode.replaceChild(this.domNode,_12);
 }
-for(_f in this.params){
-this._onConnect(_f);
+for(_11 in this.params){
+this._onConnect(_11);
 }
 }
 if(this.domNode){
@@ -78,17 +93,17 @@ delete this.srcNodeRef;
 }
 this._created=true;
 },_applyAttributes:function(){
-var _11=function(_12,_13){
-if((_13.params&&_12 in _13.params)||_13[_12]){
-_13.attr(_12,_13[_12]);
+var _13=function(_14,_15){
+if((_15.params&&_14 in _15.params)||_15[_14]){
+_15.attr(_14,_15[_14]);
 }
 };
-for(var _14 in this.attributeMap){
-_11(_14,this);
+for(var _16 in this.attributeMap){
+_13(_16,this);
 }
-dojo.forEach(_5(this.declaredClass),function(a){
+dojo.forEach(_8(this),function(a){
 if(!(a in this.attributeMap)){
-_11(a,this);
+_13(a,this);
 }
 },this);
 },postMixInProperties:function(){
@@ -97,28 +112,39 @@ this.domNode=this.srcNodeRef||dojo.create("div");
 },postCreate:function(){
 },startup:function(){
 this._started=true;
-},destroyRecursive:function(_16){
-this.destroyDescendants(_16);
-this.destroy(_16);
-},destroy:function(_17){
+},destroyRecursive:function(_17){
+this._beingDestroyed=true;
+this.destroyDescendants(_17);
+this.destroy(_17);
+},destroy:function(_18){
+this._beingDestroyed=true;
 this.uninitialize();
-dojo.forEach(this._connects,function(_18){
-dojo.forEach(_18,dojo.disconnect);
+var d=dojo,dfe=d.forEach,dun=d.unsubscribe;
+dfe(this._connects,function(_19){
+dfe(_19,d.disconnect);
+});
+dfe(this._subscribes,function(_1a){
+dun(_1a);
 });
-dojo.forEach(this._supportingWidgets||[],function(w){
+dfe(this._supportingWidgets||[],function(w){
+if(w.destroyRecursive){
+w.destroyRecursive();
+}else{
 if(w.destroy){
 w.destroy();
 }
+}
 });
-this.destroyRendering(_17);
+this.destroyRendering(_18);
 dijit.registry.remove(this.id);
-},destroyRendering:function(_1a){
+this._destroyed=true;
+},destroyRendering:function(_1b){
 if(this.bgIframe){
-this.bgIframe.destroy(_1a);
+this.bgIframe.destroy(_1b);
 delete this.bgIframe;
 }
 if(this.domNode){
-if(_1a){
+if(_1b){
 dojo.removeAttr(this.domNode,"widgetId");
 }else{
 dojo.destroy(this.domNode);
@@ -126,15 +152,15 @@ dojo.destroy(this.domNode);
 delete this.domNode;
 }
 if(this.srcNodeRef){
-if(!_1a){
+if(!_1b){
 dojo.destroy(this.srcNodeRef);
 }
 delete this.srcNodeRef;
 }
-},destroyDescendants:function(_1b){
-dojo.forEach(this.getChildren(),function(_1c){
-if(_1c.destroyRecursive){
-_1c.destroyRecursive(_1b);
+},destroyDescendants:function(_1c){
+dojo.forEach(this.getChildren(),function(_1d){
+if(_1d.destroyRecursive){
+_1d.destroyRecursive(_1c);
 }
 });
 },uninitialize:function(){
@@ -157,7 +183,7 @@ dojo.removeClass(_21,this["class"]);
 this["class"]=_20;
 dojo.addClass(_21,_20);
 },_setStyleAttr:function(_22){
-var _23=this[this.attributeMap["style"]||"domNode"];
+var _23=this[this.attributeMap.style||"domNode"];
 if(dojo.isObject(_22)){
 dojo.style(_23,_22);
 }else{
@@ -167,7 +193,7 @@ _23.style.cssText+="; "+_22;
 _23.style.cssText=_22;
 }
 }
-this["style"]=_22;
+this.style=_22;
 },setAttribute:function(_24,_25){
 dojo.deprecated(this.declaredClass+"::setAttribute() is deprecated. Use attr() instead.","","2.0");
 this.attr(_24,_25);
@@ -181,10 +207,12 @@ case "attribute":
 if(dojo.isFunction(_27)){
 _27=dojo.hitch(this,_27);
 }
-if(/^on[A-Z][a-zA-Z]*$/.test(_26)){
-_26=_26.toLowerCase();
-}
-dojo.attr(_2a,_26,_27);
+var _2c=_29.attribute?_29.attribute:(/^on[A-Z][a-zA-Z]*$/.test(_26)?_26.toLowerCase():_26);
+dojo.attr(_2a,_2c,_27);
+break;
+case "innerText":
+_2a.innerHTML="";
+_2a.appendChild(dojo.doc.createTextNode(_27));
 break;
 case "innerHTML":
 _2a.innerHTML=_27;
@@ -196,31 +224,28 @@ break;
 }
 },this);
 this[_26]=_27;
-},attr:function(_2c,_2d){
-var _2e=arguments.length;
-if(_2e==1&&!dojo.isString(_2c)){
-for(var x in _2c){
-this.attr(x,_2c[x]);
+},attr:function(_2d,_2e){
+var _2f=arguments.length;
+if(_2f==1&&!dojo.isString(_2d)){
+for(var x in _2d){
+this.attr(x,_2d[x]);
 }
 return this;
 }
-var _30=this._getAttrNames(_2c);
-if(_2e==2){
+var _30=this._getAttrNames(_2d);
+if(_2f>=2){
 if(this[_30.s]){
-return this[_30.s](_2d)||this;
+_2f=dojo._toArray(arguments,1);
+return this[_30.s].apply(this,_2f)||this;
 }else{
-if(_2c in this.attributeMap){
-this._attrToDom(_2c,_2d);
+if(_2d in this.attributeMap){
+this._attrToDom(_2d,_2e);
 }
-this[_2c]=_2d;
+this[_2d]=_2e;
 }
 return this;
 }else{
-if(this[_30.g]){
-return this[_30.g]();
-}else{
-return this[_2c];
-}
+return this[_30.g]?this[_30.g]():this[_2d];
 }
 },_attrPairNames:{},_getAttrNames:function(_31){
 var apn=this._attrPairNames;
@@ -228,74 +253,70 @@ if(apn[_31]){
 return apn[_31];
 }
 var uc=_31.charAt(0).toUpperCase()+_31.substr(1);
-return apn[_31]={n:_31+"Node",s:"_set"+uc+"Attr",g:"_get"+uc+"Attr"};
+return (apn[_31]={n:_31+"Node",s:"_set"+uc+"Attr",g:"_get"+uc+"Attr"});
 },toString:function(){
 return "[Widget "+this.declaredClass+", "+(this.id||"NO ID")+"]";
 },getDescendants:function(){
-if(this.containerNode){
-var _34=dojo.query("[widgetId]",this.containerNode);
-return _34.map(dijit.byNode);
-}else{
-return [];
-}
+return this.containerNode?dojo.query("[widgetId]",this.containerNode).map(dijit.byNode):[];
 },getChildren:function(){
-if(this.containerNode){
-return dijit.findWidgets(this.containerNode);
-}else{
-return [];
-}
-},nodesWithKeyClick:["input","button"],connect:function(obj,_36,_37){
-var d=dojo;
-var dc=dojo.connect;
-var _3a=[];
-if(_36=="ondijitclick"){
-if(!this.nodesWithKeyClick[obj.nodeName]){
-var m=d.hitch(this,_37);
-_3a.push(dc(obj,"onkeydown",this,function(e){
-if(!d.isFF&&e.keyCode==d.keys.ENTER&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&!e.metaKey){
-return m(e);
-}else{
-if(e.keyCode==d.keys.SPACE){
+return this.containerNode?dijit.findWidgets(this.containerNode):[];
+},nodesWithKeyClick:["input","button"],connect:function(obj,_32,_33){
+var d=dojo,dc=d._connect,_34=[];
+if(_32=="ondijitclick"){
+if(!this.nodesWithKeyClick[obj.tagName.toLowerCase()]){
+var m=d.hitch(this,_33);
+_34.push(dc(obj,"onkeydown",this,function(e){
+if((e.keyCode==d.keys.ENTER||e.keyCode==d.keys.SPACE)&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&!e.metaKey){
+dijit._lastKeyDownNode=e.target;
 d.stopEvent(e);
 }
-}
 }),dc(obj,"onkeyup",this,function(e){
-if(e.keyCode==d.keys.SPACE&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&!e.metaKey){
+if((e.keyCode==d.keys.ENTER||e.keyCode==d.keys.SPACE)&&e.target===dijit._lastKeyDownNode&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&!e.metaKey){
+dijit._lastKeyDownNode=null;
 return m(e);
 }
 }));
-if(d.isFF){
-_3a.push(dc(obj,"onkeypress",this,function(e){
-if(e.keyCode==d.keys.ENTER&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&!e.metaKey){
-return m(e);
 }
-}));
-}
-}
-_36="onclick";
+_32="onclick";
 }
-_3a.push(dc(obj,_36,this,_37));
-this._connects.push(_3a);
-return _3a;
-},disconnect:function(_3f){
+_34.push(dc(obj,_32,this,_33));
+this._connects.push(_34);
+return _34;
+},disconnect:function(_35){
 for(var i=0;i<this._connects.length;i++){
-if(this._connects[i]==_3f){
-dojo.forEach(_3f,dojo.disconnect);
+if(this._connects[i]==_35){
+dojo.forEach(_35,dojo.disconnect);
 this._connects.splice(i,1);
 return;
 }
 }
+},subscribe:function(_36,_37){
+var d=dojo,_38=d.subscribe(_36,this,_37);
+this._subscribes.push(_38);
+return _38;
+},unsubscribe:function(_39){
+for(var i=0;i<this._subscribes.length;i++){
+if(this._subscribes[i]==_39){
+dojo.unsubscribe(_39);
+this._subscribes.splice(i,1);
+return;
+}
+}
 },isLeftToRight:function(){
 return dojo._isBodyLtr();
 },isFocusable:function(){
 return this.focus&&(dojo.style(this.domNode,"display")!="none");
-},placeAt:function(_41,_42){
-if(_41["declaredClass"]&&_41["addChild"]){
-_41.addChild(this,_42);
+},placeAt:function(_3a,_3b){
+if(_3a.declaredClass&&_3a.addChild){
+_3a.addChild(this,_3b);
 }else{
-dojo.place(this.domNode,_41,_42);
+dojo.place(this.domNode,_3a,_3b);
 }
 return this;
+},_onShow:function(){
+this.onShow();
+},onShow:function(){
+},onHide:function(){
 }});
 })();
 }
diff --git a/dijit/_base/focus.js b/dijit/_base/focus.js
index 3df8226..1e0bdc7 100644
--- a/dijit/_base/focus.js
+++ b/dijit/_base/focus.js
@@ -8,136 +8,191 @@
 if(!dojo._hasResource["dijit._base.focus"]){
 dojo._hasResource["dijit._base.focus"]=true;
 dojo.provide("dijit._base.focus");
+dojo.require("dijit._base.manager");
 dojo.mixin(dijit,{_curFocus:null,_prevFocus:null,isCollapsed:function(){
-var _1=dojo.doc;
-if(_1.selection){
-var s=_1.selection;
-if(s.type=="Text"){
-return !s.createRange().htmlText.length;
+return dijit.getBookmark().isCollapsed;
+},getBookmark:function(){
+var bm,rg,tg,_1=dojo.doc.selection,cf=dijit._curFocus;
+if(dojo.global.getSelection){
+_1=dojo.global.getSelection();
+if(_1){
+if(_1.isCollapsed){
+tg=cf?cf.tagName:"";
+if(tg){
+tg=tg.toLowerCase();
+if(tg=="textarea"||(tg=="input"&&(!cf.type||cf.type.toLowerCase()=="text"))){
+_1={start:cf.selectionStart,end:cf.selectionEnd,node:cf,pRange:true};
+return {isCollapsed:(_1.end<=_1.start),mark:_1};
+}
+}
+bm={isCollapsed:true};
 }else{
-return !s.createRange().length;
+rg=_1.getRangeAt(0);
+bm={isCollapsed:false,mark:rg.cloneRange()};
+}
 }
 }else{
-var _3=dojo.global;
-var _4=_3.getSelection();
-if(dojo.isString(_4)){
-return !_4;
+if(_1){
+tg=cf?cf.tagName:"";
+tg=tg.toLowerCase();
+if(cf&&tg&&(tg=="button"||tg=="textarea"||tg=="input")){
+if(_1.type&&_1.type.toLowerCase()=="none"){
+return {isCollapsed:true,mark:null};
 }else{
-return !_4||_4.isCollapsed||!_4.toString();
+rg=_1.createRange();
+return {isCollapsed:rg.text&&rg.text.length?false:true,mark:{range:rg,pRange:true}};
 }
 }
-},getBookmark:function(){
-var _5,_6=dojo.doc.selection;
-if(_6){
-var _7=_6.createRange();
-if(_6.type.toUpperCase()=="CONTROL"){
-if(_7.length){
-_5=[];
-var i=0,_9=_7.length;
-while(i<_9){
-_5.push(_7.item(i++));
+bm={};
+try{
+rg=_1.createRange();
+bm.isCollapsed=!(_1.type=="Text"?rg.htmlText.length:rg.length);
 }
-}else{
-_5=null;
+catch(e){
+bm.isCollapsed=true;
+return bm;
+}
+if(_1.type.toUpperCase()=="CONTROL"){
+if(rg.length){
+bm.mark=[];
+var i=0,_2=rg.length;
+while(i<_2){
+bm.mark.push(rg.item(i++));
 }
 }else{
-_5=_7.getBookmark();
+bm.isCollapsed=true;
+bm.mark=null;
 }
 }else{
-if(window.getSelection){
-_6=dojo.global.getSelection();
-if(_6){
-_7=_6.getRangeAt(0);
-_5=_7.cloneRange();
+bm.mark=rg.getBookmark();
 }
 }else{
 console.warn("No idea how to store the current selection for this browser!");
 }
 }
-return _5;
-},moveToBookmark:function(_a){
-var _b=dojo.doc;
-if(_b.selection){
-var _c;
-if(dojo.isArray(_a)){
-_c=_b.body.createControlRange();
-dojo.forEach(_a,function(n){
-_c.addElement(n);
-});
+return bm;
+},moveToBookmark:function(_3){
+var _4=dojo.doc,_5=_3.mark;
+if(_5){
+if(dojo.global.getSelection){
+var _6=dojo.global.getSelection();
+if(_6&&_6.removeAllRanges){
+if(_5.pRange){
+var r=_5;
+var n=r.node;
+n.selectionStart=r.start;
+n.selectionEnd=r.end;
 }else{
-_c=_b.selection.createRange();
-_c.moveToBookmark(_a);
+_6.removeAllRanges();
+_6.addRange(_5);
 }
-_c.select();
-}else{
-var _e=dojo.global.getSelection&&dojo.global.getSelection();
-if(_e&&_e.removeAllRanges){
-_e.removeAllRanges();
-_e.addRange(_a);
 }else{
 console.warn("No idea how to restore selection for this browser!");
 }
+}else{
+if(_4.selection&&_5){
+var rg;
+if(_5.pRange){
+rg=_5.range;
+}else{
+if(dojo.isArray(_5)){
+rg=_4.body.createControlRange();
+dojo.forEach(_5,function(n){
+rg.addElement(n);
+});
+}else{
+rg=_4.body.createTextRange();
+rg.moveToBookmark(_5);
+}
+}
+rg.select();
 }
-},getFocus:function(_f,_10){
-return {node:_f&&dojo.isDescendant(dijit._curFocus,_f.domNode)?dijit._prevFocus:dijit._curFocus,bookmark:!dojo.withGlobal(_10||dojo.global,dijit.isCollapsed)?dojo.withGlobal(_10||dojo.global,dijit.getBookmark):null,openedForWindow:_10};
-},focus:function(_11){
-if(!_11){
+}
+}
+},getFocus:function(_7,_8){
+var _9=!dijit._curFocus||(_7&&dojo.isDescendant(dijit._curFocus,_7.domNode))?dijit._prevFocus:dijit._curFocus;
+return {node:_9,bookmark:(_9==dijit._curFocus)&&dojo.withGlobal(_8||dojo.global,dijit.getBookmark),openedForWindow:_8};
+},focus:function(_a){
+if(!_a){
 return;
 }
-var _12="node" in _11?_11.node:_11,_13=_11.bookmark,_14=_11.openedForWindow;
-if(_12){
-var _15=(_12.tagName.toLowerCase()=="iframe")?_12.contentWindow:_12;
-if(_15&&_15.focus){
+var _b="node" in _a?_a.node:_a,_c=_a.bookmark,_d=_a.openedForWindow,_e=_c?_c.isCollapsed:false;
+if(_b){
+var _f=(_b.tagName.toLowerCase()=="iframe")?_b.contentWindow:_b;
+if(_f&&_f.focus){
 try{
-_15.focus();
+_f.focus();
 }
 catch(e){
 }
 }
-dijit._onFocusNode(_12);
+dijit._onFocusNode(_b);
 }
-if(_13&&dojo.withGlobal(_14||dojo.global,dijit.isCollapsed)){
-if(_14){
-_14.focus();
+if(_c&&dojo.withGlobal(_d||dojo.global,dijit.isCollapsed)&&!_e){
+if(_d){
+_d.focus();
 }
 try{
-dojo.withGlobal(_14||dojo.global,dijit.moveToBookmark,null,[_13]);
+dojo.withGlobal(_d||dojo.global,dijit.moveToBookmark,null,[_c]);
 }
-catch(e){
+catch(e2){
 }
 }
-},_activeStack:[],registerIframe:function(_16){
-dijit.registerWin(_16.contentWindow,_16);
-},registerWin:function(_17,_18){
-dojo.connect(_17.document,"onmousedown",function(evt){
+},_activeStack:[],registerIframe:function(_10){
+return dijit.registerWin(_10.contentWindow,_10);
+},unregisterIframe:function(_11){
+dijit.unregisterWin(_11);
+},registerWin:function(_12,_13){
+var _14=function(evt){
 dijit._justMouseDowned=true;
 setTimeout(function(){
 dijit._justMouseDowned=false;
 },0);
-dijit._onTouchNode(_18||evt.target||evt.srcElement);
-});
-var doc=_17.document;
+dijit._onTouchNode(_13||evt.target||evt.srcElement,"mouse");
+};
+var doc=dojo.isIE?_12.document.documentElement:_12.document;
 if(doc){
 if(dojo.isIE){
-doc.attachEvent("onactivate",function(evt){
-if(evt.srcElement.tagName.toLowerCase()!="#document"){
-dijit._onFocusNode(_18||evt.srcElement);
-}
-});
-doc.attachEvent("ondeactivate",function(evt){
-dijit._onBlurNode(_18||evt.srcElement);
-});
+doc.attachEvent("onmousedown",_14);
+var _15=function(evt){
+if(evt.srcElement.tagName.toLowerCase()!="#document"&&dijit.isTabNavigable(evt.srcElement)){
+dijit._onFocusNode(_13||evt.srcElement);
 }else{
-doc.addEventListener("focus",function(evt){
-dijit._onFocusNode(_18||evt.target);
-},true);
-doc.addEventListener("blur",function(evt){
-dijit._onBlurNode(_18||evt.target);
-},true);
+dijit._onTouchNode(_13||evt.srcElement);
+}
+};
+doc.attachEvent("onactivate",_15);
+var _16=function(evt){
+dijit._onBlurNode(_13||evt.srcElement);
+};
+doc.attachEvent("ondeactivate",_16);
+return function(){
+doc.detachEvent("onmousedown",_14);
+doc.detachEvent("onactivate",_15);
+doc.detachEvent("ondeactivate",_16);
+doc=null;
+};
+}else{
+doc.addEventListener("mousedown",_14,true);
+var _17=function(evt){
+dijit._onFocusNode(_13||evt.target);
+};
+doc.addEventListener("focus",_17,true);
+var _18=function(evt){
+dijit._onBlurNode(_13||evt.target);
+};
+doc.addEventListener("blur",_18,true);
+return function(){
+doc.removeEventListener("mousedown",_14,true);
+doc.removeEventListener("focus",_17,true);
+doc.removeEventListener("blur",_18,true);
+doc=null;
+};
 }
 }
-doc=null;
-},_onBlurNode:function(_1f){
+},unregisterWin:function(_19){
+_19&&_19();
+},_onBlurNode:function(_1a){
 dijit._prevFocus=dijit._curFocus;
 dijit._curFocus=null;
 if(dijit._justMouseDowned){
@@ -151,88 +206,96 @@ delete dijit._clearActiveWidgetsTimer;
 dijit._setStack([]);
 dijit._prevFocus=null;
 },100);
-},_onTouchNode:function(_20){
+},_onTouchNode:function(_1b,by){
 if(dijit._clearActiveWidgetsTimer){
 clearTimeout(dijit._clearActiveWidgetsTimer);
 delete dijit._clearActiveWidgetsTimer;
 }
-var _21=[];
+var _1c=[];
 try{
-while(_20){
-if(_20.dijitPopupParent){
-_20=dijit.byId(_20.dijitPopupParent).domNode;
+while(_1b){
+var _1d=dojo.attr(_1b,"dijitPopupParent");
+if(_1d){
+_1b=dijit.byId(_1d).domNode;
 }else{
-if(_20.tagName&&_20.tagName.toLowerCase()=="body"){
-if(_20===dojo.body()){
+if(_1b.tagName&&_1b.tagName.toLowerCase()=="body"){
+if(_1b===dojo.body()){
 break;
 }
-_20=dijit.getDocumentWindow(_20.ownerDocument).frameElement;
+_1b=dijit.getDocumentWindow(_1b.ownerDocument).frameElement;
 }else{
-var id=_20.getAttribute&&_20.getAttribute("widgetId");
+var id=_1b.getAttribute&&_1b.getAttribute("widgetId");
 if(id){
-_21.unshift(id);
+_1c.unshift(id);
 }
-_20=_20.parentNode;
+_1b=_1b.parentNode;
 }
 }
 }
 }
 catch(e){
 }
-dijit._setStack(_21);
-},_onFocusNode:function(_23){
-if(!_23){
+dijit._setStack(_1c,by);
+},_onFocusNode:function(_1e){
+if(!_1e){
 return;
 }
-if(_23.nodeType==9){
+if(_1e.nodeType==9){
 return;
 }
-dijit._onTouchNode(_23);
-if(_23==dijit._curFocus){
+dijit._onTouchNode(_1e);
+if(_1e==dijit._curFocus){
 return;
 }
 if(dijit._curFocus){
 dijit._prevFocus=dijit._curFocus;
 }
-dijit._curFocus=_23;
-dojo.publish("focusNode",[_23]);
-},_setStack:function(_24){
-var _25=dijit._activeStack;
-dijit._activeStack=_24;
-for(var _26=0;_26<Math.min(_25.length,_24.length);_26++){
-if(_25[_26]!=_24[_26]){
+dijit._curFocus=_1e;
+dojo.publish("focusNode",[_1e]);
+},_setStack:function(_1f,by){
+var _20=dijit._activeStack;
+dijit._activeStack=_1f;
+for(var _21=0;_21<Math.min(_20.length,_1f.length);_21++){
+if(_20[_21]!=_1f[_21]){
 break;
 }
 }
-for(var i=_25.length-1;i>=_26;i--){
-var _28=dijit.byId(_25[i]);
-if(_28){
-_28._focused=false;
-_28._hasBeenBlurred=true;
-if(_28._onBlur){
-_28._onBlur();
+var _22;
+for(var i=_20.length-1;i>=_21;i--){
+_22=dijit.byId(_20[i]);
+if(_22){
+_22._focused=false;
+_22._hasBeenBlurred=true;
+if(_22._onBlur){
+_22._onBlur(by);
 }
-if(_28._setStateClass){
-_28._setStateClass();
+if(_22._setStateClass){
+_22._setStateClass();
 }
-dojo.publish("widgetBlur",[_28]);
+dojo.publish("widgetBlur",[_22,by]);
 }
 }
-for(i=_26;i<_24.length;i++){
-_28=dijit.byId(_24[i]);
-if(_28){
-_28._focused=true;
-if(_28._onFocus){
-_28._onFocus();
+for(i=_21;i<_1f.length;i++){
+_22=dijit.byId(_1f[i]);
+if(_22){
+_22._focused=true;
+if(_22._onFocus){
+_22._onFocus(by);
 }
-if(_28._setStateClass){
-_28._setStateClass();
+if(_22._setStateClass){
+_22._setStateClass();
 }
-dojo.publish("widgetFocus",[_28]);
+dojo.publish("widgetFocus",[_22,by]);
 }
 }
 }});
 dojo.addOnLoad(function(){
-dijit.registerWin(window);
+var _23=dijit.registerWin(window);
+if(dojo.isIE){
+dojo.addOnWindowUnload(function(){
+dijit.unregisterWin(_23);
+_23=null;
+});
+}
 });
 }
diff --git a/dijit/_base/manager.js b/dijit/_base/manager.js
index d6b3dbb..67caa02 100644
--- a/dijit/_base/manager.js
+++ b/dijit/_base/manager.js
@@ -10,151 +10,219 @@ dojo._hasResource["dijit._base.manager"]=true;
 dojo.provide("dijit._base.manager");
 dojo.declare("dijit.WidgetSet",null,{constructor:function(){
 this._hash={};
+this.length=0;
 },add:function(_1){
 if(this._hash[_1.id]){
 throw new Error("Tried to register widget with id=="+_1.id+" but that id is already registered");
 }
 this._hash[_1.id]=_1;
+this.length++;
 },remove:function(id){
+if(this._hash[id]){
 delete this._hash[id];
-},forEach:function(_3){
-for(var id in this._hash){
-_3(this._hash[id]);
+this.length--;
+}
+},forEach:function(_2,_3){
+_3=_3||dojo.global;
+var i=0,id;
+for(id in this._hash){
+_2.call(_3,this._hash[id],i++,this._hash);
+}
+return this;
+},filter:function(_4,_5){
+_5=_5||dojo.global;
+var _6=new dijit.WidgetSet(),i=0,id;
+for(id in this._hash){
+var w=this._hash[id];
+if(_4.call(_5,w,i++,this._hash)){
+_6.add(w);
 }
-},filter:function(_5){
-var _6=new dijit.WidgetSet();
-this.forEach(function(_7){
-if(_5(_7)){
-_6.add(_7);
 }
-});
 return _6;
 },byId:function(id){
 return this._hash[id];
-},byClass:function(_9){
-return this.filter(function(_a){
-return _a.declaredClass==_9;
-});
+},byClass:function(_7){
+var _8=new dijit.WidgetSet(),id,_9;
+for(id in this._hash){
+_9=this._hash[id];
+if(_9.declaredClass==_7){
+_8.add(_9);
+}
+}
+return _8;
+},toArray:function(){
+var ar=[];
+for(var id in this._hash){
+ar.push(this._hash[id]);
+}
+return ar;
+},map:function(_a,_b){
+return dojo.map(this.toArray(),_a,_b);
+},every:function(_c,_d){
+_d=_d||dojo.global;
+var x=0,i;
+for(i in this._hash){
+if(!_c.call(_d,this._hash[i],x++,this._hash)){
+return false;
+}
+}
+return true;
+},some:function(_e,_f){
+_f=_f||dojo.global;
+var x=0,i;
+for(i in this._hash){
+if(_e.call(_f,this._hash[i],x++,this._hash)){
+return true;
+}
+}
+return false;
 }});
 dijit.registry=new dijit.WidgetSet();
 dijit._widgetTypeCtr={};
-dijit.getUniqueId=function(_b){
+dijit.getUniqueId=function(_10){
 var id;
 do{
-id=_b+"_"+(_b in dijit._widgetTypeCtr?++dijit._widgetTypeCtr[_b]:dijit._widgetTypeCtr[_b]=0);
+id=_10+"_"+(_10 in dijit._widgetTypeCtr?++dijit._widgetTypeCtr[_10]:dijit._widgetTypeCtr[_10]=0);
 }while(dijit.byId(id));
 return id;
 };
-dijit.findWidgets=function(_d){
-var _e=[];
-function _f(_10){
-var _11=dojo.isIE?_10.children:_10.childNodes,i=0,_13;
-while(_13=_11[i++]){
-if(_13.nodeType!=1){
-continue;
-}
-var _14=_13.getAttribute("widgetId");
-if(_14){
-var _15=dijit.byId(_14);
-_e.push(_15);
+dijit.findWidgets=function(_11){
+var _12=[];
+function _13(_14){
+for(var _15=_14.firstChild;_15;_15=_15.nextSibling){
+if(_15.nodeType==1){
+var _16=_15.getAttribute("widgetId");
+if(_16){
+var _17=dijit.byId(_16);
+_12.push(_17);
 }else{
-_f(_13);
+_13(_15);
+}
 }
 }
 };
-_f(_d);
-return _e;
+_13(_11);
+return _12;
 };
-if(dojo.isIE){
-dojo.addOnWindowUnload(function(){
-dojo.forEach(dijit.findWidgets(dojo.body()),function(_16){
-if(_16.destroyRecursive){
-_16.destroyRecursive();
+dijit._destroyAll=function(){
+dijit._curFocus=null;
+dijit._prevFocus=null;
+dijit._activeStack=[];
+dojo.forEach(dijit.findWidgets(dojo.body()),function(_18){
+if(!_18._destroyed){
+if(_18.destroyRecursive){
+_18.destroyRecursive();
 }else{
-if(_16.destroy){
-_16.destroy();
+if(_18.destroy){
+_18.destroy();
+}
 }
 }
 });
+};
+if(dojo.isIE){
+dojo.addOnWindowUnload(function(){
+dijit._destroyAll();
 });
 }
 dijit.byId=function(id){
-return (dojo.isString(id))?dijit.registry.byId(id):id;
+return typeof id=="string"?dijit.registry._hash[id]:id;
 };
-dijit.byNode=function(_18){
-return dijit.registry.byId(_18.getAttribute("widgetId"));
-};
-dijit.getEnclosingWidget=function(_19){
-while(_19){
-if(_19.getAttribute&&_19.getAttribute("widgetId")){
+dijit.byNode=function(_19){
 return dijit.registry.byId(_19.getAttribute("widgetId"));
+};
+dijit.getEnclosingWidget=function(_1a){
+while(_1a){
+var id=_1a.getAttribute&&_1a.getAttribute("widgetId");
+if(id){
+return dijit.byId(id);
 }
-_19=_19.parentNode;
+_1a=_1a.parentNode;
 }
 return null;
 };
-dijit._tabElements={area:true,button:true,input:true,object:true,select:true,textarea:true};
-dijit._isElementShown=function(_1a){
-var _1b=dojo.style(_1a);
-return (_1b.visibility!="hidden")&&(_1b.visibility!="collapsed")&&(_1b.display!="none")&&(dojo.attr(_1a,"type")!="hidden");
+dijit._isElementShown=function(_1b){
+var _1c=dojo.style(_1b);
+return (_1c.visibility!="hidden")&&(_1c.visibility!="collapsed")&&(_1c.display!="none")&&(dojo.attr(_1b,"type")!="hidden");
 };
-dijit.isTabNavigable=function(_1c){
-if(dojo.hasAttr(_1c,"disabled")){
+dijit.isTabNavigable=function(_1d){
+if(dojo.attr(_1d,"disabled")){
 return false;
-}
-var _1d=dojo.hasAttr(_1c,"tabindex");
-var _1e=dojo.attr(_1c,"tabindex");
-if(_1d&&_1e>=0){
+}else{
+if(dojo.hasAttr(_1d,"tabIndex")){
+return dojo.attr(_1d,"tabIndex")>=0;
+}else{
+switch(_1d.nodeName.toLowerCase()){
+case "a":
+return dojo.hasAttr(_1d,"href");
+case "area":
+case "button":
+case "input":
+case "object":
+case "select":
+case "textarea":
 return true;
+case "iframe":
+if(dojo.isMoz){
+return _1d.contentDocument.designMode=="on";
+}else{
+if(dojo.isWebKit){
+var doc=_1d.contentDocument,_1e=doc&&doc.body;
+return _1e&&_1e.contentEditable=="true";
+}else{
+doc=_1d.contentWindow.document;
+_1e=doc&&doc.body;
+return _1e&&_1e.firstChild&&_1e.firstChild.contentEditable=="true";
+}
+}
+default:
+return _1d.contentEditable=="true";
+}
 }
-var _1f=_1c.nodeName.toLowerCase();
-if(((_1f=="a"&&dojo.hasAttr(_1c,"href"))||dijit._tabElements[_1f])&&(!_1d||_1e>=0)){
-return true;
 }
-return false;
 };
-dijit._getTabNavigable=function(_20){
-var _21,_22,_23,_24,_25,_26;
-var _27=function(_28){
-dojo.query("> *",_28).forEach(function(_29){
-var _2a=dijit._isElementShown(_29);
-if(_2a&&dijit.isTabNavigable(_29)){
-var _2b=dojo.attr(_29,"tabindex");
-if(!dojo.hasAttr(_29,"tabindex")||_2b==0){
-if(!_21){
-_21=_29;
-}
-_22=_29;
+dijit._getTabNavigable=function(_1f){
+var _20,_21,_22,_23,_24,_25;
+var _26=function(_27){
+dojo.query("> *",_27).forEach(function(_28){
+var _29=dijit._isElementShown(_28);
+if(_29&&dijit.isTabNavigable(_28)){
+var _2a=dojo.attr(_28,"tabIndex");
+if(!dojo.hasAttr(_28,"tabIndex")||_2a==0){
+if(!_20){
+_20=_28;
+}
+_21=_28;
 }else{
-if(_2b>0){
-if(!_23||_2b<_24){
-_24=_2b;
-_23=_29;
+if(_2a>0){
+if(!_22||_2a<_23){
+_23=_2a;
+_22=_28;
 }
-if(!_25||_2b>=_26){
-_26=_2b;
-_25=_29;
+if(!_24||_2a>=_25){
+_25=_2a;
+_24=_28;
 }
 }
 }
 }
-if(_2a&&_29.nodeName.toUpperCase()!="SELECT"){
-_27(_29);
+if(_29&&_28.nodeName.toUpperCase()!="SELECT"){
+_26(_28);
 }
 });
 };
-if(dijit._isElementShown(_20)){
-_27(_20);
+if(dijit._isElementShown(_1f)){
+_26(_1f);
 }
-return {first:_21,last:_22,lowest:_23,highest:_25};
+return {first:_20,last:_21,lowest:_22,highest:_24};
 };
-dijit.getFirstInTabbingOrder=function(_2c){
-var _2d=dijit._getTabNavigable(dojo.byId(_2c));
-return _2d.lowest?_2d.lowest:_2d.first;
+dijit.getFirstInTabbingOrder=function(_2b){
+var _2c=dijit._getTabNavigable(dojo.byId(_2b));
+return _2c.lowest?_2c.lowest:_2c.first;
 };
-dijit.getLastInTabbingOrder=function(_2e){
-var _2f=dijit._getTabNavigable(dojo.byId(_2e));
-return _2f.last?_2f.last:_2f.highest;
+dijit.getLastInTabbingOrder=function(_2d){
+var _2e=dijit._getTabNavigable(dojo.byId(_2d));
+return _2e.last?_2e.last:_2e.highest;
 };
 dijit.defaultDuration=dojo.config["defaultDuration"]||200;
 }
diff --git a/dijit/_base/place.js b/dijit/_base/place.js
index 4bef81b..55190ff 100644
--- a/dijit/_base/place.js
+++ b/dijit/_base/place.js
@@ -25,58 +25,56 @@ return c;
 });
 return dijit._place(_3,_7);
 };
-dijit._place=function(_a,_b,_c){
-var _d=dijit.getViewport();
-if(!_a.parentNode||String(_a.parentNode.tagName).toLowerCase()!="body"){
-dojo.body().appendChild(_a);
+dijit._place=function(_9,_a,_b){
+var _c=dijit.getViewport();
+if(!_9.parentNode||String(_9.parentNode.tagName).toLowerCase()!="body"){
+dojo.body().appendChild(_9);
 }
-var _e=null;
-dojo.some(_b,function(_f){
-var _10=_f.corner;
-var pos=_f.pos;
-if(_c){
-_c(_a,_f.aroundCorner,_10);
+var _d=null;
+dojo.some(_a,function(_e){
+var _f=_e.corner;
+var pos=_e.pos;
+if(_b){
+_b(_9,_e.aroundCorner,_f);
 }
-var _12=_a.style;
-var _13=_12.display;
-var _14=_12.visibility;
-_12.visibility="hidden";
-_12.display="";
-var mb=dojo.marginBox(_a);
-_12.display=_13;
-_12.visibility=_14;
-var _16=(_10.charAt(1)=="L"?pos.x:Math.max(_d.l,pos.x-mb.w)),_17=(_10.charAt(0)=="T"?pos.y:Math.max(_d.t,pos.y-mb.h)),_18=(_10.charAt(1)=="L"?Math.min(_d.l+_d.w,_16+mb.w):pos.x),_19=(_10.charAt(0)=="T"?Math.min(_d.t+_d.h,_17+mb.h):pos.y),_1a=_18-_16,_1b=_19-_17,_1c=(mb.w-_1a)+(mb.h-_1b);
-if(_e==null||_1c<_e.overflow){
-_e={corner:_10,aroundCorner:_f.aroundCorner,x:_16,y:_17,w:_1a,h:_1b,overflow:_1c};
+var _10=_9.style;
+var _11=_10.display;
+var _12=_10.visibility;
+_10.visibility="hidden";
+_10.display="";
+var mb=dojo.marginBox(_9);
+_10.display=_11;
+_10.visibility=_12;
+var _13=Math.max(_c.l,_f.charAt(1)=="L"?pos.x:(pos.x-mb.w)),_14=Math.max(_c.t,_f.charAt(0)=="T"?pos.y:(pos.y-mb.h)),_15=Math.min(_c.l+_c.w,_f.charAt(1)=="L"?(_13+mb.w):pos.x),_16=Math.min(_c.t+_c.h,_f.charAt(0)=="T"?(_14+mb.h):pos.y),_17=_15-_13,_18=_16-_14,_19=(mb.w-_17)+(mb.h-_18);
+if(_d==null||_19<_d.overflow){
+_d={corner:_f,aroundCorner:_e.aroundCorner,x:_13,y:_14,w:_17,h:_18,overflow:_19};
 }
-return !_1c;
+return !_19;
 });
-_a.style.left=_e.x+"px";
-_a.style.top=_e.y+"px";
-if(_e.overflow&&_c){
-_c(_a,_e.aroundCorner,_e.corner);
+_9.style.left=_d.x+"px";
+_9.style.top=_d.y+"px";
+if(_d.overflow&&_b){
+_b(_9,_d.aroundCorner,_d.corner);
 }
-return _e;
+return _d;
 };
-dijit.placeOnScreenAroundNode=function(_1d,_1e,_1f,_20){
-_1e=dojo.byId(_1e);
-var _21=_1e.style.display;
-_1e.style.display="";
-var _22=_1e.offsetWidth;
-var _23=_1e.offsetHeight;
-var _24=dojo.coords(_1e,true);
-_1e.style.display=_21;
-return dijit._placeOnScreenAroundRect(_1d,_24.x,_24.y,_22,_23,_1f,_20);
+dijit.placeOnScreenAroundNode=function(_1a,_1b,_1c,_1d){
+_1b=dojo.byId(_1b);
+var _1e=_1b.style.display;
+_1b.style.display="";
+var _1f=dojo.position(_1b,true);
+_1b.style.display=_1e;
+return dijit._placeOnScreenAroundRect(_1a,_1f.x,_1f.y,_1f.w,_1f.h,_1c,_1d);
 };
-dijit.placeOnScreenAroundRectangle=function(_25,_26,_27,_28){
-return dijit._placeOnScreenAroundRect(_25,_26.x,_26.y,_26.width,_26.height,_27,_28);
+dijit.placeOnScreenAroundRectangle=function(_20,_21,_22,_23){
+return dijit._placeOnScreenAroundRect(_20,_21.x,_21.y,_21.width,_21.height,_22,_23);
 };
-dijit._placeOnScreenAroundRect=function(_29,x,y,_2c,_2d,_2e,_2f){
-var _30=[];
-for(var _31 in _2e){
-_30.push({aroundCorner:_31,corner:_2e[_31],pos:{x:x+(_31.charAt(1)=="L"?0:_2c),y:y+(_31.charAt(0)=="T"?0:_2d)}});
+dijit._placeOnScreenAroundRect=function(_24,x,y,_25,_26,_27,_28){
+var _29=[];
+for(var _2a in _27){
+_29.push({aroundCorner:_2a,corner:_27[_2a],pos:{x:x+(_2a.charAt(1)=="L"?0:_25),y:y+(_2a.charAt(0)=="T"?0:_26)}});
 }
-return dijit._place(_29,_30,_2f);
+return dijit._place(_24,_29,_28);
 };
 dijit.placementRegistry=new dojo.AdapterRegistry();
 dijit.placementRegistry.register("node",function(n,x){
@@ -85,7 +83,53 @@ return typeof x=="object"&&typeof x.offsetWidth!="undefined"&&typeof x.offsetHei
 dijit.placementRegistry.register("rect",function(n,x){
 return typeof x=="object"&&"x" in x&&"y" in x&&"width" in x&&"height" in x;
 },dijit.placeOnScreenAroundRectangle);
-dijit.placeOnScreenAroundElement=function(_36,_37,_38,_39){
+dijit.placeOnScreenAroundElement=function(_2b,_2c,_2d,_2e){
 return dijit.placementRegistry.match.apply(dijit.placementRegistry,arguments);
 };
+dijit.getPopupAlignment=function(_2f,_30){
+var _31={};
+dojo.forEach(_2f,function(pos){
+switch(pos){
+case "after":
+_31[_30?"BR":"BL"]=_30?"BL":"BR";
+break;
+case "before":
+_31[_30?"BL":"BR"]=_30?"BR":"BL";
+break;
+case "below":
+_31[_30?"BL":"BR"]=_30?"TL":"TR";
+_31[_30?"BR":"BL"]=_30?"TR":"TL";
+break;
+case "above":
+default:
+_31[_30?"TL":"TR"]=_30?"BL":"BR";
+_31[_30?"TR":"TL"]=_30?"BR":"BL";
+break;
+}
+});
+return _31;
+};
+dijit.getPopupAroundAlignment=function(_32,_33){
+var _34={};
+dojo.forEach(_32,function(pos){
+switch(pos){
+case "after":
+_34[_33?"BR":"BL"]=_33?"BL":"BR";
+break;
+case "before":
+_34[_33?"BL":"BR"]=_33?"BR":"BL";
+break;
+case "below":
+_34[_33?"BL":"BR"]=_33?"TL":"TR";
+_34[_33?"BR":"BL"]=_33?"TR":"TL";
+break;
+case "above":
+default:
+_34[_33?"TL":"TR"]=_33?"BL":"BR";
+_34[_33?"TR":"TL"]=_33?"BR":"BL";
+break;
+}
+});
+return _34;
+};
 }
diff --git a/dijit/_base/popup.js b/dijit/_base/popup.js
index 6e7937e..9b6a197 100644
--- a/dijit/_base/popup.js
+++ b/dijit/_base/popup.js
@@ -13,7 +13,7 @@ dojo.require("dijit._base.place");
 dojo.require("dijit._base.window");
 dijit.popup=new function(){
 var _1=[],_2=1000,_3=1;
-this.prepare=function(_4){
+this.moveOffScreen=function(_4){
 var s=_4.style;
 s.visibility="hidden";
 s.position="absolute";
@@ -23,125 +23,141 @@ s.display="";
 }
 dojo.body().appendChild(_4);
 };
-this.open=function(_6){
-var _7=_6.popup,_8=_6.orient||{"BL":"TL","TL":"BL"},_9=_6.around,id=(_6.around&&_6.around.id)?(_6.around.id+"_dropdown"):("popup_"+_3++);
-var _b=dojo.create("div",{id:id,"class":"dijitPopup",style:{zIndex:_2+_1.length,visibility:"hidden"}},dojo.body());
-dijit.setWaiRole(_b,"presentation");
-_b.style.left=_b.style.top="0px";
-if(_6.parent){
-_b.dijitPopupParent=_6.parent.id;
-}
-var s=_7.domNode.style;
+var _5=function(){
+for(var pi=_1.length-1;pi>0&&_1[pi].parent===_1[pi-1].widget;pi--){
+}
+return _1[pi];
+};
+var _6=[];
+this.open=function(_7){
+var _8=_7.popup,_9=_7.orient||(dojo._isBodyLtr()?{"BL":"TL","BR":"TR","TL":"BL","TR":"BR"}:{"BR":"TR","BL":"TL","TR":"BR","TL":"BL"}),_a=_7.around,id=(_7.around&&_7.around.id)?(_7.around.id+"_dropdown"):("popup_"+_3++);
+var _b=_6.pop(),_c,_d;
+if(!_b){
+_c=dojo.create("div",{"class":"dijitPopup"},dojo.body());
+dijit.setWaiRole(_c,"presentation");
+}else{
+_c=_b[0];
+_d=_b[1];
+}
+dojo.attr(_c,{id:id,style:{zIndex:_2+_1.length,visibility:"hidden",top:"-9999px"},dijitPopupParent:_7.parent?_7.parent.id:""});
+var s=_8.domNode.style;
 s.display="";
 s.visibility="";
 s.position="";
 s.top="0px";
-_b.appendChild(_7.domNode);
-var _d=new dijit.BackgroundIframe(_b);
-var _e=_9?dijit.placeOnScreenAroundElement(_b,_9,_8,_7.orient?dojo.hitch(_7,"orient"):null):dijit.placeOnScreen(_b,_6,_8=="R"?["TR","BR","TL","BL"]:["TL","BL","TR","BR"],_6.padding);
-_b.style.visibility="visible";
-var _f=[];
-var _10=function(){
-for(var pi=_1.length-1;pi>0&&_1[pi].parent===_1[pi-1].widget;pi--){
+_c.appendChild(_8.domNode);
+if(!_d){
+_d=new dijit.BackgroundIframe(_c);
+}else{
+_d.resize(_c);
 }
-return _1[pi];
-};
-_f.push(dojo.connect(_b,"onkeypress",this,function(evt){
-if(evt.charOrCode==dojo.keys.ESCAPE&&_6.onCancel){
+var _e=_a?dijit.placeOnScreenAroundElement(_c,_a,_9,_8.orient?dojo.hitch(_8,"orient"):null):dijit.placeOnScreen(_c,_7,_9=="R"?["TR","BR","TL","BL"]:["TL","BL","TR","BR"],_7.padding);
+_c.style.visibility="visible";
+var _f=[];
+_f.push(dojo.connect(_c,"onkeypress",this,function(evt){
+if(evt.charOrCode==dojo.keys.ESCAPE&&_7.onCancel){
 dojo.stopEvent(evt);
-_6.onCancel();
+_7.onCancel();
 }else{
 if(evt.charOrCode===dojo.keys.TAB){
 dojo.stopEvent(evt);
-var _13=_10();
-if(_13&&_13.onCancel){
-_13.onCancel();
+var _10=_5();
+if(_10&&_10.onCancel){
+_10.onCancel();
 }
 }
 }
 }));
-if(_7.onCancel){
-_f.push(dojo.connect(_7,"onCancel",null,_6.onCancel));
+if(_8.onCancel){
+_f.push(dojo.connect(_8,"onCancel",_7.onCancel));
 }
-_f.push(dojo.connect(_7,_7.onExecute?"onExecute":"onChange",null,function(){
-var _14=_10();
-if(_14&&_14.onExecute){
-_14.onExecute();
+_f.push(dojo.connect(_8,_8.onExecute?"onExecute":"onChange",function(){
+var _11=_5();
+if(_11&&_11.onExecute){
+_11.onExecute();
 }
 }));
-_1.push({wrapper:_b,iframe:_d,widget:_7,parent:_6.parent,onExecute:_6.onExecute,onCancel:_6.onCancel,onClose:_6.onClose,handlers:_f});
-if(_7.onOpen){
-_7.onOpen(_e);
+_1.push({wrapper:_c,iframe:_d,widget:_8,parent:_7.parent,onExecute:_7.onExecute,onCancel:_7.onCancel,onClose:_7.onClose,handlers:_f});
+if(_8.onOpen){
+_8.onOpen(_e);
 }
 return _e;
 };
-this.close=function(_15){
-while(dojo.some(_1,function(_16){
-return _16.widget==_15;
+this.close=function(_12){
+while(dojo.some(_1,function(_13){
+return _13.widget==_12;
 })){
-var top=_1.pop(),_18=top.wrapper,_19=top.iframe,_1a=top.widget,_1b=top.onClose;
-if(_1a.onClose){
-_1a.onClose();
+var top=_1.pop(),_14=top.wrapper,_15=top.iframe,_16=top.widget,_17=top.onClose;
+if(_16.onClose){
+_16.onClose();
 }
 dojo.forEach(top.handlers,dojo.disconnect);
-if(!_1a||!_1a.domNode){
-return;
+if(_16&&_16.domNode){
+this.moveOffScreen(_16.domNode);
 }
-this.prepare(_1a.domNode);
-_19.destroy();
-dojo.destroy(_18);
-if(_1b){
-_1b();
+_14.style.top="-9999px";
+_14.style.visibility="hidden";
+_6.push([_14,_15]);
+if(_17){
+_17();
 }
 }
 };
 }();
 dijit._frames=new function(){
-var _1c=[];
+var _18=[];
 this.pop=function(){
-var _1d;
-if(_1c.length){
-_1d=_1c.pop();
-_1d.style.display="";
+var _19;
+if(_18.length){
+_19=_18.pop();
+_19.style.display="";
 }else{
 if(dojo.isIE){
-var _1e=dojo.config["dojoBlankHtmlUrl"]||(dojo.moduleUrl("dojo","resources/blank.html")+"")||"javascript:\"\"";
-var _1f="<iframe src='"+_1e+"'"+" style='position: absolute; left: 0px; top: 0px;"+"z-index: -1; filter:Alpha(Opacity=\"0\");'>";
-_1d=dojo.doc.createElement(_1f);
+var _1a=dojo.config["dojoBlankHtmlUrl"]||(dojo.moduleUrl("dojo","resources/blank.html")+"")||"javascript:\"\"";
+var _1b="<iframe src='"+_1a+"'"+" style='position: absolute; left: 0px; top: 0px;"+"z-index: -1; filter:Alpha(Opacity=\"0\");'>";
+_19=dojo.doc.createElement(_1b);
 }else{
-_1d=dojo.create("iframe");
-_1d.src="javascript:\"\"";
-_1d.className="dijitBackgroundIframe";
+_19=dojo.create("iframe");
+_19.src="javascript:\"\"";
+_19.className="dijitBackgroundIframe";
+dojo.style(_19,"opacity",0.1);
 }
-_1d.tabIndex=-1;
-dojo.body().appendChild(_1d);
+_19.tabIndex=-1;
 }
-return _1d;
+return _19;
 };
-this.push=function(_20){
-_20.style.display="none";
-if(dojo.isIE){
-_20.style.removeExpression("width");
-_20.style.removeExpression("height");
-}
-_1c.push(_20);
+this.push=function(_1c){
+_1c.style.display="none";
+_18.push(_1c);
 };
 }();
-dijit.BackgroundIframe=function(_21){
-if(!_21.id){
+dijit.BackgroundIframe=function(_1d){
+if(!_1d.id){
 throw new Error("no id");
 }
-if(dojo.isIE<7||(dojo.isFF<3&&dojo.hasClass(dojo.body(),"dijit_a11y"))){
-var _22=dijit._frames.pop();
-_21.appendChild(_22);
-if(dojo.isIE){
-_22.style.setExpression("width",dojo._scopeName+".doc.getElementById('"+_21.id+"').offsetWidth");
-_22.style.setExpression("height",dojo._scopeName+".doc.getElementById('"+_21.id+"').offsetHeight");
+if(dojo.isIE||dojo.isMoz){
+var _1e=dijit._frames.pop();
+_1d.appendChild(_1e);
+if(dojo.isIE<7){
+this.resize(_1d);
+this._conn=dojo.connect(_1d,"onresize",this,function(){
+this.resize(_1d);
+});
+}else{
+dojo.style(_1e,{width:"100%",height:"100%"});
 }
-this.iframe=_22;
+this.iframe=_1e;
 }
 };
-dojo.extend(dijit.BackgroundIframe,{destroy:function(){
+dojo.extend(dijit.BackgroundIframe,{resize:function(_1f){
+if(this.iframe&&dojo.isIE<7){
+dojo.style(this.iframe,{width:_1f.offsetWidth+"px",height:_1f.offsetHeight+"px"});
+}
+},destroy:function(){
+if(this._conn){
+dojo.disconnect(this._conn);
+this._conn=null;
+}
 if(this.iframe){
 dijit._frames.push(this.iframe);
 delete this.iframe;
diff --git a/dijit/_base/scroll.js b/dijit/_base/scroll.js
index 4c564c3..398d15f 100644
--- a/dijit/_base/scroll.js
+++ b/dijit/_base/scroll.js
@@ -8,157 +8,88 @@
 if(!dojo._hasResource["dijit._base.scroll"]){
 dojo._hasResource["dijit._base.scroll"]=true;
 dojo.provide("dijit._base.scroll");
-dijit.scrollIntoView=function(_1){
+dijit.scrollIntoView=function(_1,_2){
 try{
 _1=dojo.byId(_1);
-var _2=dojo.doc;
-var _3=dojo.body();
-var _4=_3.parentNode;
-if((!(dojo.isFF>=3||dojo.isIE||dojo.isWebKit)||_1==_3||_1==_4)&&(typeof _1.scrollIntoView=="function")){
+var _3=_1.ownerDocument||dojo.doc,_4=_3.body||dojo.body(),_5=_3.documentElement||_4.parentNode,_6=dojo.isIE,_7=dojo.isWebKit;
+if((!(dojo.isMoz||_6||_7)||_1==_4||_1==_5)&&(typeof _1.scrollIntoView!="undefined")){
 _1.scrollIntoView(false);
 return;
 }
-var _5=dojo._isBodyLtr();
-var _6=dojo.isIE>=8&&!_7;
-var _8=!_5&&!_6;
-var _9=_3;
-var _7=_2.compatMode=="BackCompat";
-if(_7){
-_4._offsetWidth=_4._clientWidth=_3._offsetWidth=_3.clientWidth;
-_4._offsetHeight=_4._clientHeight=_3._offsetHeight=_3.clientHeight;
-}else{
-if(dojo.isWebKit){
-_3._offsetWidth=_3._clientWidth=_4.clientWidth;
-_3._offsetHeight=_3._clientHeight=_4.clientHeight;
-}else{
-_9=_4;
+var _8=_3.compatMode=="BackCompat",_9=_8?_4:_5,_a=_7?_4:_9,_b=_9.clientWidth,_c=_9.clientHeight,_d=!dojo._isBodyLtr(),_e=_2||dojo.position(_1),el=_1.parentNode,_f=function(el){
+return ((_6<=6||(_6&&_8))?false:(dojo.style(el,"position").toLowerCase()=="fixed"));
+};
+if(_f(_1)){
+return;
 }
-_4._offsetHeight=_4.clientHeight;
-_4._offsetWidth=_4.clientWidth;
+while(el){
+if(el==_4){
+el=_a;
 }
-function _a(_b){
-var ie=dojo.isIE;
-return ((ie<=6||(ie>=7&&_7))?false:(dojo.style(_b,"position").toLowerCase()=="fixed"));
-};
-function _d(_e){
-var _f=_e.parentNode;
-var _10=_e.offsetParent;
-if(_10==null||_a(_e)){
-_10=_4;
-_f=(_e==_3)?_4:null;
-}
-_e._offsetParent=_10;
-_e._parent=_f;
-var bp=dojo._getBorderExtents(_e);
-_e._borderStart={H:(_6&&!_5)?(bp.w-bp.l):bp.l,V:bp.t};
-_e._borderSize={H:bp.w,V:bp.h};
-_e._scrolledAmount={H:_e.scrollLeft,V:_e.scrollTop};
-_e._offsetSize={H:_e._offsetWidth||_e.offsetWidth,V:_e._offsetHeight||_e.offsetHeight};
-_e._offsetStart={H:(_6&&!_5)?_10.clientWidth-_e.offsetLeft-_e._offsetSize.H:_e.offsetLeft,V:_e.offsetTop};
-_e._clientSize={H:_e._clientWidth||_e.clientWidth,V:_e._clientHeight||_e.clientHeight};
-if(_e!=_3&&_e!=_4&&_e!=_1){
-for(var dir in _e._offsetSize){
-var _13=_e._offsetSize[dir]-_e._clientSize[dir]-_e._borderSize[dir];
-var _14=_e._clientSize[dir]>0&&_13>0;
-if(_14){
-_e._offsetSize[dir]-=_13;
-if(dojo.isIE&&_8&&dir=="H"){
-_e._offsetStart[dir]+=_13;
+var _10=dojo.position(el),_11=_f(el);
+with(_10){
+if(el==_a){
+w=_b,h=_c;
+if(_a==_5&&_6&&_d){
+x+=_a.offsetWidth-w;
 }
+if(x<0||!_6){
+x=0;
 }
+if(y<0||!_6){
+y=0;
 }
+}else{
+var pb=dojo._getPadBorderExtents(el);
+w-=pb.w;
+h-=pb.h;
+x+=pb.l;
+y+=pb.t;
 }
-};
-var _15=_1;
-while(_15!=null){
-if(_a(_15)){
-_1.scrollIntoView(false);
-return;
+with(el){
+if(el!=_a){
+var _12=clientWidth,_13=w-_12;
+if(_12>0&&_13>0){
+w=_12;
+if(_6&&_d){
+x+=_13;
 }
-_d(_15);
-_15=_15._parent;
 }
-if(dojo.isIE&&_1._parent){
-var _16=_1._offsetParent;
-_1._offsetStart.H+=_16._borderStart.H;
-_1._offsetStart.V+=_16._borderStart.V;
+_12=clientHeight;
+_13=h-_12;
+if(_12>0&&_13>0){
+h=_12;
 }
-if(dojo.isIE>=7&&_9==_4&&_8&&_3._offsetStart&&_3._offsetStart.H==0){
-var _17=_4.scrollWidth-_4._offsetSize.H;
-if(_17>0){
-_3._offsetStart.H=-_17;
 }
+if(_11){
+if(y<0){
+h+=y,y=0;
 }
-if(dojo.isIE<=6&&!_7){
-_4._offsetSize.H+=_4._borderSize.H;
-_4._offsetSize.V+=_4._borderSize.V;
+if(x<0){
+w+=x,x=0;
 }
-if(_8&&_3._offsetStart&&_9==_4&&_4._scrolledAmount){
-var ofs=_3._offsetStart.H;
-if(ofs<0){
-_4._scrolledAmount.H+=ofs;
-_3._offsetStart.H=0;
+if(y+h>_c){
+h=_c-y;
 }
+if(x+w>_b){
+w=_b-x;
 }
-_15=_1;
-while(_15){
-var _19=_15._parent;
-if(!_19){
-break;
 }
-if(_19.tagName=="TD"){
-var _1a=_19._parent._parent._parent;
-if(_19!=_15._offsetParent&&_19._offsetParent!=_15._offsetParent){
-_19=_1a;
+var l=_e.x-x,t=_e.y-Math.max(y,0),r=l+_e.w-w,bot=t+_e.h-h;
+if(r*l>0){
+var s=Math[l<0?"max":"min"](l,r);
+_e.x+=scrollLeft;
+scrollLeft+=(_6>=8&&!_8&&_d)?-s:s;
+_e.x-=scrollLeft;
 }
+if(bot*t>0){
+_e.y+=scrollTop;
+scrollTop+=Math[t<0?"max":"min"](t,bot);
+_e.y-=scrollTop;
 }
-var _1b=_15._offsetParent==_19;
-for(var dir in _15._offsetStart){
-var _1d=dir=="H"?"V":"H";
-if(_8&&dir=="H"&&(_19!=_4)&&(_19!=_3)&&(dojo.isIE||dojo.isWebKit)&&_19._clientSize.H>0&&_19.scrollWidth>_19._clientSize.H){
-var _1e=_19.scrollWidth-_19._clientSize.H;
-if(_1e>0){
-_19._scrolledAmount.H-=_1e;
 }
 }
-if(_19._offsetParent.tagName=="TABLE"){
-if(dojo.isIE){
-_19._offsetStart[dir]-=_19._offsetParent._borderStart[dir];
-_19._borderStart[dir]=_19._borderSize[dir]=0;
-}else{
-_19._offsetStart[dir]+=_19._offsetParent._borderStart[dir];
-}
-}
-if(dojo.isIE){
-_19._offsetStart[dir]+=_19._offsetParent._borderStart[dir];
-}
-var _1f=_15._offsetStart[dir]-_19._scrolledAmount[dir]-(_1b?0:_19._offsetStart[dir])-_19._borderStart[dir];
-var _20=_1f+_15._offsetSize[dir]-_19._offsetSize[dir]+_19._borderSize[dir];
-var _21=(dir=="H")?"scrollLeft":"scrollTop";
-var _22=dir=="H"&&_8;
-var _23=_22?-_20:_1f;
-var _24=_22?-_1f:_20;
-var _25=(_23*_24<=0)?0:Math[(_23<0)?"max":"min"](_23,_24);
-if(_25!=0){
-var _26=_19[_21];
-_19[_21]+=(_22)?-_25:_25;
-var _27=_19[_21]-_26;
-}
-if(_1b){
-_15._offsetStart[dir]+=_19._offsetStart[dir];
-}
-_15._offsetStart[dir]-=_19[_21];
-}
-_15._parent=_19._parent;
-_15._offsetParent=_19._offsetParent;
-}
-_19=_1;
-var _28;
-while(_19&&_19.removeAttribute){
-_28=_19.parentNode;
-_19.removeAttribute("_offsetParent");
-_19.removeAttribute("_parent");
-_19=_28;
+el=(el!=_a)&&!_11&&el.parentNode;
 }
 }
 catch(error){
diff --git a/dijit/_base/sniff.js b/dijit/_base/sniff.js
index 1119d1f..1d2de9d 100644
--- a/dijit/_base/sniff.js
+++ b/dijit/_base/sniff.js
@@ -9,23 +9,23 @@ if(!dojo._hasResource["dijit._base.sniff"]){
 dojo._hasResource["dijit._base.sniff"]=true;
 dojo.provide("dijit._base.sniff");
 (function(){
-var d=dojo,_2=d.doc.documentElement,ie=d.isIE,_4=d.isOpera,_5=Math.floor,ff=d.isFF,_7=d.boxModel.replace(/-/,""),_8={dj_ie:ie,dj_ie6:_5(ie)==6,dj_ie7:_5(ie)==7,dj_iequirks:ie&&d.isQuirks,dj_opera:_4,dj_opera8:_5(_4)==8,dj_opera9:_5(_4)==9,dj_khtml:d.isKhtml,dj_webkit:d.isWebKit,dj_safari:d.isSafari,dj_gecko:d.isMozilla,dj_ff2:_5(ff)==2,dj_ff3:_5(ff)==3};
-_8["dj_"+_7]=true;
-for(var p in _8){
-if(_8[p]){
-if(_2.className){
-_2.className+=" "+p;
+var d=dojo,_1=d.doc.documentElement,ie=d.isIE,_2=d.isOpera,_3=Math.floor,ff=d.isFF,_4=d.boxModel.replace(/-/,""),_5={dj_ie:ie,dj_ie6:_3(ie)==6,dj_ie7:_3(ie)==7,dj_ie8:_3(ie)==8,dj_iequirks:ie&&d.isQuirks,dj_opera:_2,dj_khtml:d.isKhtml,dj_webkit:d.isWebKit,dj_safari:d.isSafari,dj_chrome:d.isChrome,dj_gecko:d.isMozilla,dj_ff3:_3(ff)==3};
+_5["dj_"+_4]=true;
+for(var p in _5){
+if(_5[p]){
+if(_1.className){
+_1.className+=" "+p;
 }else{
-_2.className=p;
+_1.className=p;
 }
 }
 }
 dojo._loaders.unshift(function(){
 if(!dojo._isBodyLtr()){
-_2.className+=" dijitRtl";
-for(var p in _8){
-if(_8[p]){
-_2.className+=" "+p+"-rtl";
+_1.className+=" dijitRtl";
+for(var p in _5){
+if(_5[p]){
+_1.className+=" "+p+"-rtl";
 }
 }
 }
diff --git a/dijit/_base/typematic.js b/dijit/_base/typematic.js
index f688bdf..9c02105 100644
--- a/dijit/_base/typematic.js
+++ b/dijit/_base/typematic.js
@@ -11,7 +11,7 @@ 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._currentTimeout=Math.max(this._currentTimeout<0?this._initialDelay:(this._subsequentDelay>1?this._subsequentDelay:Math.round(this._currentTimeout*this._subsequentDelay)),10);
 this._timer=setTimeout(dojo.hitch(this,"_fireEventAndReload"),this._currentTimeout);
 },trigger:function(_1,_2,_3,_4,_5,_6,_7){
 if(_5!=this._obj){
@@ -46,7 +46,7 @@ dojo.deprecated("charCode attribute parameter for dijit.typematic.addKeyListener
 }
 }
 return [dojo.connect(_8,"onkeypress",this,function(_e){
-if(_e.charOrCode==_9.charOrCode&&(_9.ctrlKey===undefined||_9.ctrlKey==_e.ctrlKey)&&(_9.altKey===undefined||_9.altKey==_e.ctrlKey)&&(_9.shiftKey===undefined||_9.shiftKey==_e.ctrlKey)){
+if(_e.charOrCode==_9.charOrCode&&(_9.ctrlKey===undefined||_9.ctrlKey==_e.ctrlKey)&&(_9.altKey===undefined||_9.altKey==_e.altKey)&&(_9.metaKey===undefined||_9.metaKey==(_e.metaKey||false))&&(_9.shiftKey===undefined||_9.shiftKey==_e.shiftKey)){
 dojo.stopEvent(_e);
 dijit.typematic.trigger(_9,_a,_8,_b,_9,_c,_d);
 }else{
@@ -79,7 +79,7 @@ dijit.typematic.trigger(evt,_11,_10,_12,_10,_13,_14);
 setTimeout(dojo.hitch(this,dijit.typematic.stop),50);
 }
 })];
-},addListener:function(_1b,_1c,_1d,_1e,_1f,_20,_21){
-return this.addKeyListener(_1c,_1d,_1e,_1f,_20,_21).concat(this.addMouseListener(_1b,_1e,_1f,_20,_21));
+},addListener:function(_15,_16,_17,_18,_19,_1a,_1b){
+return this.addKeyListener(_16,_17,_18,_19,_1a,_1b).concat(this.addMouseListener(_15,_18,_19,_1a,_1b));
 }};
 }
diff --git a/dijit/_base/wai.js b/dijit/_base/wai.js
index 7f37a68..198ea35 100644
--- a/dijit/_base/wai.js
+++ b/dijit/_base/wai.js
@@ -12,9 +12,9 @@ dijit.wai={onload:function(){
 var _1=dojo.create("div",{id:"a11yTestNode",style:{cssText:"border: 1px solid;"+"border-color:red green;"+"position: absolute;"+"height: 5px;"+"top: -999px;"+"background-image: url(\""+(dojo.config.blankGif||dojo.moduleUrl("dojo","resources/blank.gif"))+"\");"}},dojo.body());
 var cs=dojo.getComputedStyle(_1);
 if(cs){
-var _3=cs.backgroundImage;
-var _4=(cs.borderTopColor==cs.borderRightColor)||(_3!=null&&(_3=="none"||_3=="url(invalid-url:)"));
-dojo[_4?"addClass":"removeClass"](dojo.body(),"dijit_a11y");
+var _2=cs.backgroundImage;
+var _3=(cs.borderTopColor==cs.borderRightColor)||(_2!=null&&(_2=="none"||_2=="url(invalid-url:)"));
+dojo[_3?"addClass":"removeClass"](dojo.body(),"dijit_a11y");
 if(dojo.isIE){
 _1.outerHTML="";
 }else{
@@ -25,55 +25,40 @@ dojo.body().removeChild(_1);
 if(dojo.isIE||dojo.isMoz){
 dojo._loaders.unshift(dijit.wai.onload);
 }
-dojo.mixin(dijit,{_XhtmlRoles:/banner|contentinfo|definition|main|navigation|search|note|secondary|seealso/,hasWaiRole:function(_5,_6){
-var _7=this.getWaiRole(_5);
-return _6?(_7.indexOf(_6)>-1):(_7.length>0);
-},getWaiRole:function(_8){
-return dojo.trim((dojo.attr(_8,"role")||"").replace(this._XhtmlRoles,"").replace("wairole:",""));
-},setWaiRole:function(_9,_a){
-var _b=dojo.attr(_9,"role")||"";
-if(dojo.isFF<3||!this._XhtmlRoles.test(_b)){
-dojo.attr(_9,"role",dojo.isFF<3?"wairole:"+_a:_a);
+dojo.mixin(dijit,{_XhtmlRoles:/banner|contentinfo|definition|main|navigation|search|note|secondary|seealso/,hasWaiRole:function(_4,_5){
+var _6=this.getWaiRole(_4);
+return _5?(_6.indexOf(_5)>-1):(_6.length>0);
+},getWaiRole:function(_7){
+return dojo.trim((dojo.attr(_7,"role")||"").replace(this._XhtmlRoles,"").replace("wairole:",""));
+},setWaiRole:function(_8,_9){
+var _a=dojo.attr(_8,"role")||"";
+if(!this._XhtmlRoles.test(_a)){
+dojo.attr(_8,"role",_9);
 }else{
-if((" "+_b+" ").indexOf(" "+_a+" ")<0){
-var _c=dojo.trim(_b.replace(this._XhtmlRoles,""));
-var _d=dojo.trim(_b.replace(_c,""));
-dojo.attr(_9,"role",_d+(_d?" ":"")+_a);
+if((" "+_a+" ").indexOf(" "+_9+" ")<0){
+var _b=dojo.trim(_a.replace(this._XhtmlRoles,""));
+var _c=dojo.trim(_a.replace(_b,""));
+dojo.attr(_8,"role",_c+(_c?" ":"")+_9);
 }
 }
-},removeWaiRole:function(_e,_f){
-var _10=dojo.attr(_e,"role");
-if(!_10){
+},removeWaiRole:function(_d,_e){
+var _f=dojo.attr(_d,"role");
+if(!_f){
 return;
 }
-if(_f){
-var _11=dojo.isFF<3?"wairole:"+_f:_f;
-var t=dojo.trim((" "+_10+" ").replace(" "+_11+" "," "));
-dojo.attr(_e,"role",t);
+if(_e){
+var t=dojo.trim((" "+_f+" ").replace(" "+_e+" "," "));
+dojo.attr(_d,"role",t);
 }else{
-_e.removeAttribute("role");
-}
-},hasWaiState:function(_13,_14){
-if(dojo.isFF<3){
-return _13.hasAttributeNS("http://www.w3.org/2005/07/aaa",_14);
-}
-return _13.hasAttribute?_13.hasAttribute("aria-"+_14):!!_13.getAttribute("aria-"+_14);
-},getWaiState:function(_15,_16){
-if(dojo.isFF<3){
-return _15.getAttributeNS("http://www.w3.org/2005/07/aaa",_16);
-}
-return _15.getAttribute("aria-"+_16)||"";
-},setWaiState:function(_17,_18,_19){
-if(dojo.isFF<3){
-_17.setAttributeNS("http://www.w3.org/2005/07/aaa","aaa:"+_18,_19);
-}else{
-_17.setAttribute("aria-"+_18,_19);
-}
-},removeWaiState:function(_1a,_1b){
-if(dojo.isFF<3){
-_1a.removeAttributeNS("http://www.w3.org/2005/07/aaa",_1b);
-}else{
-_1a.removeAttribute("aria-"+_1b);
+_d.removeAttribute("role");
 }
+},hasWaiState:function(_10,_11){
+return _10.hasAttribute?_10.hasAttribute("aria-"+_11):!!_10.getAttribute("aria-"+_11);
+},getWaiState:function(_12,_13){
+return _12.getAttribute("aria-"+_13)||"";
+},setWaiState:function(_14,_15,_16){
+_14.setAttribute("aria-"+_15,_16);
+},removeWaiState:function(_17,_18){
+_17.removeAttribute("aria-"+_18);
 }});
 }
diff --git a/dijit/_editor/RichText.js b/dijit/_editor/RichText.js
index 50e8d81..ab6fcbe 100644
--- a/dijit/_editor/RichText.js
+++ b/dijit/_editor/RichText.js
@@ -12,8 +12,6 @@ dojo.require("dijit._Widget");
 dojo.require("dijit._editor.selection");
 dojo.require("dijit._editor.range");
 dojo.require("dijit._editor.html");
-dojo.require("dojo.i18n");
-dojo.requireLocalization("dijit.form","Textarea",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
 if(!dojo.config["useXDomain"]||dojo.config["allowXdRichTextSave"]){
 if(dojo._postLoad){
 (function(){
@@ -36,14 +34,19 @@ this.contentPostFilters=[];
 this.contentDomPreFilters=[];
 this.contentDomPostFilters=[];
 this.editingAreaStyleSheets=[];
+this.events=[].concat(this.events);
 this._keyHandlers={};
 this.contentPreFilters.push(dojo.hitch(this,"_preFixUrlAttributes"));
 if(dojo.isMoz){
-this.contentPreFilters.push(this._fixContentForMoz);
+this.contentPreFilters.push(this._normalizeFontStyle);
 this.contentPostFilters.push(this._removeMozBogus);
 }
-if(dojo.isSafari){
-this.contentPostFilters.push(this._removeSafariBogus);
+if(dojo.isWebKit){
+this.contentPreFilters.push(this._removeWebkitBogus);
+this.contentPostFilters.push(this._removeWebkitBogus);
+}
+if(dojo.isIE){
+this.contentPostFilters.push(this._normalizeFontStyle);
 }
 this.onLoadDeferred=new dojo.Deferred();
 },inheritWidth:false,focusOnLoad:false,name:"",styleSheets:"",_content:"",height:"300px",minHeight:"1em",isClosed:true,isLoaded:false,_SEPARATOR:"@@**%%__RICHTEXTBOUNDRY__%%**@@",onLoadDeferred:null,isTabIndent:false,disableSpellCheck:false,postCreate:function(){
@@ -84,21 +87,21 @@ _9+="<"+_a+"><span>content</span></"+_a+"><br/>";
 _9+="<"+_a+"><li>content</li></"+_a+"><br/>";
 }
 }
-var _c=dojo.doc.createElement("div");
-dojo.style(_c,{position:"absolute",top:"-2000px"});
-dojo.doc.body.appendChild(_c);
-_c.innerHTML=_9;
-var _d=_c.firstChild;
-while(_d){
-dijit._editor.selection.selectElement(_d.firstChild);
-dojo.withGlobal(this.window,"selectElement",dijit._editor.selection,[_d.firstChild]);
-var _e=_d.tagName.toLowerCase();
-this._local2NativeFormatNames[_e]=document.queryCommandValue("formatblock");
-this._native2LocalFormatNames[this._local2NativeFormatNames[_e]]=_e;
-_d=_d.nextSibling.nextSibling;
-}
-dojo.body().removeChild(_c);
-},open:function(_f){
+var _b=dojo.doc.createElement("div");
+dojo.style(_b,{position:"absolute",top:"-2000px"});
+dojo.doc.body.appendChild(_b);
+_b.innerHTML=_9;
+var _c=_b.firstChild;
+while(_c){
+dijit._editor.selection.selectElement(_c.firstChild);
+dojo.withGlobal(this.window,"selectElement",dijit._editor.selection,[_c.firstChild]);
+var _d=_c.tagName.toLowerCase();
+this._local2NativeFormatNames[_d]=document.queryCommandValue("formatblock");
+this._native2LocalFormatNames[this._local2NativeFormatNames[_d]]=_d;
+_c=_c.nextSibling.nextSibling;
+}
+dojo.body().removeChild(_b);
+},open:function(_e){
 if(!this.onLoadDeferred||this.onLoadDeferred.fired>=0){
 this.onLoadDeferred=new dojo.Deferred();
 }
@@ -107,22 +110,22 @@ this.close();
 }
 dojo.publish(dijit._scopeName+"._editor.RichText::open",[this]);
 this._content="";
-if(arguments.length==1&&_f.nodeName){
-this.domNode=_f;
+if(arguments.length==1&&_e.nodeName){
+this.domNode=_e;
 }
 var dn=this.domNode;
-var _11;
+var _f;
 if(dn.nodeName&&dn.nodeName.toLowerCase()=="textarea"){
 var ta=(this.textarea=dn);
 this.name=ta.name;
-_11=this._preFilterContent(ta.value);
+_f=ta.value;
 dn=this.domNode=dojo.doc.createElement("div");
 dn.setAttribute("widgetId",this.id);
 ta.removeAttribute("widgetId");
 dn.cssText=ta.cssText;
 dn.className+=" "+ta.className;
 dojo.place(dn,ta,"before");
-var _13=dojo.hitch(this,function(){
+var _10=dojo.hitch(this,function(){
 dojo.style(ta,{display:"block",position:"absolute",top:"-1000px"});
 if(dojo.isIE){
 var s=ta.style;
@@ -131,9 +134,9 @@ s.overflow="hidden";
 }
 });
 if(dojo.isIE){
-setTimeout(_13,10);
+setTimeout(_10,10);
 }else{
-_13();
+_10();
 }
 if(ta.form){
 dojo.connect(ta.form,"onsubmit",this,function(){
@@ -141,38 +144,37 @@ ta.value=this.getValue();
 });
 }
 }else{
-_11=this._preFilterContent(dijit._editor.getChildrenHtml(dn));
+_f=dijit._editor.getChildrenHtml(dn);
 dn.innerHTML="";
 }
-var _15=dojo.contentBox(dn);
-this._oldHeight=_15.h;
-this._oldWidth=_15.w;
-this.savedContent=_11;
+var _11=dojo.contentBox(dn);
+this._oldHeight=_11.h;
+this._oldWidth=_11.w;
+this.savedContent=_f;
 if(dn.nodeName&&dn.nodeName=="LI"){
 dn.innerHTML=" <br>";
 }
 this.editingArea=dn.ownerDocument.createElement("div");
 dn.appendChild(this.editingArea);
-if(this.name!=""&&(!dojo.config["useXDomain"]||dojo.config["allowXdRichTextSave"])){
-var _16=dojo.byId(dijit._scopeName+"._editor.RichText.savedContent");
-if(_16.value!=""){
-var _17=_16.value.split(this._SEPARATOR),i=0,dat;
-while((dat=_17[i++])){
-var _1a=dat.split(":");
-if(_1a[0]==this.name){
-_11=_1a[1];
-_17.splice(i,1);
+if(this.name!==""&&(!dojo.config["useXDomain"]||dojo.config["allowXdRichTextSave"])){
+var _12=dojo.byId(dijit._scopeName+"._editor.RichText.savedContent");
+if(_12.value!==""){
+var _13=_12.value.split(this._SEPARATOR),i=0,dat;
+while((dat=_13[i++])){
+var _14=dat.split(":");
+if(_14[0]==this.name){
+_f=_14[1];
+_13.splice(i,1);
 break;
 }
 }
 }
-this.connect(window,"onbeforeunload","_saveContent");
+dojo.addOnUnload(dojo.hitch(this,"_saveContent"));
 }
 this.isClosed=false;
-if(dojo.isIE||dojo.isWebKit||dojo.isOpera){
 var ifr=(this.editorObject=this.iframe=dojo.doc.createElement("iframe"));
 ifr.id=this.id+"_iframe";
-this._iframeSrc=this._getIframeDocTxt(_11);
+this._iframeSrc=this._getIframeDocTxt();
 ifr.style.border="none";
 ifr.style.width="100%";
 if(this._layoutMode){
@@ -196,146 +198,64 @@ this.document=this.window.document;
 if(dojo.isIE){
 this._localizeEditorCommands();
 }
-this.onLoad();
+this.onLoad(_f);
 this.savedContent=this.getValue(true);
 });
 var s="javascript:parent."+dijit._scopeName+".byId(\""+this.id+"\")._iframeSrc";
 ifr.setAttribute("src",s);
 this.editingArea.appendChild(ifr);
-if(dojo.isWebKit){
+if(dojo.isSafari){
 setTimeout(function(){
 ifr.setAttribute("src",s);
 },0);
 }
-}else{
-this._drawIframe(_11);
-this.savedContent=this.getValue(true);
-}
 if(dn.nodeName=="LI"){
 dn.lastChild.style.marginTop="-1.2em";
 }
-if(this.domNode.nodeName=="LI"){
-this.domNode.lastChild.style.marginTop="-1.2em";
-}
 dojo.addClass(this.domNode,"RichTextEditable");
-},_local2NativeFormatNames:{},_native2LocalFormatNames:{},_localizedIframeTitles:null,_getIframeDocTxt:function(_1e){
-var _cs=dojo.getComputedStyle(this.domNode);
+},_local2NativeFormatNames:{},_native2LocalFormatNames:{},_getIframeDocTxt:function(){
+var _15=dojo.getComputedStyle(this.domNode);
+var _16="";
 if(dojo.isIE||(!this.height&&!dojo.isMoz)){
-_1e="<div>"+_1e+"</div>";
-}
-var _20=[_cs.fontWeight,_cs.fontSize,_cs.fontFamily].join(" ");
-var _21=_cs.lineHeight;
-if(_21.indexOf("px")>=0){
-_21=parseFloat(_21)/parseFloat(_cs.fontSize);
-}else{
-if(_21.indexOf("em")>=0){
-_21=parseFloat(_21);
+_16="<div></div>";
 }else{
-_21="1.0";
-}
-}
-var _22="";
-this.style.replace(/(^|;)(line-|font-?)[^;]+/g,function(_23){
-_22+=_23.replace(/^;/g,"")+";";
-});
-var d=dojo.doc;
-var _25=d.charset||d.characterSet||d.defaultCharset||"UTF-8";
-return [this.isLeftToRight()?"<html><head>":"<html dir='rtl'><head>",(dojo.isMoz?"<title>"+this._localizedIframeTitles.iframeEditTitle+"</title>":""),"<meta http-equiv='Content-Type' content='text/html; charset="+_25+"'>","<style>","body,html {","\tbackground:transparent;","\tpadding: 1em 0 0 0;","\tmargin: -1em 0 0 0;","}","body{","\ttop:0px; left:0px; right:0px;","\tfont:",_20,";",((this.height||dojo.isOpera)?"":"position: fixed;"),"\tmin-height:",this.minHeight,";","\tline-height:",_2 [...]
-},_drawIframe:function(_26){
-if(!this.iframe){
-var ifr=(this.iframe=dojo.doc.createElement("iframe"));
-ifr.id=this.id+"_iframe";
-var _28=ifr.style;
-_28.border="none";
-_28.lineHeight="0";
-_28.verticalAlign="bottom";
-this.editorObject=this.iframe;
-this._localizedIframeTitles=dojo.i18n.getLocalization("dijit.form","Textarea");
-var _29=dojo.query("label[for=\""+this.id+"\"]");
-if(_29.length){
-this._localizedIframeTitles.iframeEditTitle=_29[0].innerHTML+" "+this._localizedIframeTitles.iframeEditTitle;
-}
-ifr._loadFunc=function(win){
-};
-}
-this.iframe.style.width=this.inheritWidth?this._oldWidth:"100%";
-if(this._layoutMode){
-this.iframe.style.height="100%";
-}else{
-if(this.height){
-this.iframe.style.height=this.height;
-}else{
-this.iframe.height=this._oldHeight;
-}
+if(dojo.isMoz){
+this._cursorToStart=true;
+_16=" ";
 }
-var _2b;
-if(this.textarea){
-_2b=this.srcNodeRef;
-}else{
-_2b=dojo.doc.createElement("div");
-_2b.style.display="none";
-_2b.innerHTML=_26;
-this.editingArea.appendChild(_2b);
 }
-this.editingArea.appendChild(this.iframe);
-var _2c=dojo.hitch(this,function(){
-if(!this.editNode){
-if(!this.document){
-try{
-if(this.iframe.contentWindow){
-this.window=this.iframe.contentWindow;
-this.document=this.iframe.contentWindow.document;
+var _17=[_15.fontWeight,_15.fontSize,_15.fontFamily].join(" ");
+var _18=_15.lineHeight;
+if(_18.indexOf("px")>=0){
+_18=parseFloat(_18)/parseFloat(_15.fontSize);
 }else{
-if(this.iframe.contentDocument){
-this.window=this.iframe.contentDocument.window;
-this.document=this.iframe.contentDocument;
-}
-}
-}
-catch(e){
-}
-if(!this.document){
-setTimeout(_2c,50);
-return;
-}
-var _2d=this.document;
-_2d.open();
-if(dojo.isAIR){
-_2d.body.innerHTML=_26;
+if(_18.indexOf("em")>=0){
+_18=parseFloat(_18);
 }else{
-_2d.write(this._getIframeDocTxt(_26));
+_18="normal";
 }
-_2d.close();
-dojo.destroy(_2b);
 }
-if(!this.document.body){
-setTimeout(_2c,50);
-return;
-}
-this.onLoad();
-}else{
-dojo.destroy(_2b);
-this.editNode.innerHTML=_26;
-this.onDisplayChanged();
-}
-this._preDomFilterContent(this.editNode);
+var _19="";
+this.style.replace(/(^|;)(line-|font-?)[^;]+/g,function(_1a){
+_19+=_1a.replace(/^;/g,"")+";";
 });
-_2c();
+var _1b=dojo.query("label[for=\""+this.id+"\"]");
+return [this.isLeftToRight()?"<html><head>":"<html dir='rtl'><head>",(dojo.isMoz&&_1b.length?"<title>"+_1b[0].innerHTML+"</title>":""),"<meta http-equiv='Content-Type' content='text/html'>","<style>","body,html {","\tbackground:transparent;","\tpadding: 1px 0 0 0;","\tmargin: -1px 0 0 0;",(dojo.isWebKit?"\twidth: 100%;":""),(dojo.isWebKit?"\theight: 100%;":""),"}","body{","\ttop:0px; left:0px; right:0px;","\tfont:",_17,";",((this.height||dojo.isOpera)?"":"position: fixed;"),"\tmin-height [...]
 },_applyEditingAreaStyleSheets:function(){
-var _2e=[];
+var _1c=[];
 if(this.styleSheets){
-_2e=this.styleSheets.split(";");
+_1c=this.styleSheets.split(";");
 this.styleSheets="";
 }
-_2e=_2e.concat(this.editingAreaStyleSheets);
+_1c=_1c.concat(this.editingAreaStyleSheets);
 this.editingAreaStyleSheets=[];
-var _2f="",i=0,url;
-while((url=_2e[i++])){
-var _32=(new dojo._Url(dojo.global.location,url)).toString();
-this.editingAreaStyleSheets.push(_32);
-_2f+="<link rel=\"stylesheet\" type=\"text/css\" href=\""+_32+"\"/>";
+var _1d="",i=0,url;
+while((url=_1c[i++])){
+var _1e=(new dojo._Url(dojo.global.location,url)).toString();
+this.editingAreaStyleSheets.push(_1e);
+_1d+="<link rel=\"stylesheet\" type=\"text/css\" href=\""+_1e+"\"/>";
 }
-return _2f;
+return _1d;
 },addStyleSheet:function(uri){
 var url=uri.toString();
 if(url.charAt(0)=="."||(url.charAt(0)!="/"&&!uri.host)){
@@ -345,92 +265,91 @@ if(dojo.indexOf(this.editingAreaStyleSheets,url)>-1){
 return;
 }
 this.editingAreaStyleSheets.push(url);
+this.onLoadDeferred.addCallback(dojo.hitch(function(){
 if(this.document.createStyleSheet){
 this.document.createStyleSheet(url);
 }else{
-var _35=this.document.getElementsByTagName("head")[0];
-var _36=this.document.createElement("link");
-_36.rel="stylesheet";
-_36.type="text/css";
-_36.href=url;
-_35.appendChild(_36);
+var _1f=this.document.getElementsByTagName("head")[0];
+var _20=this.document.createElement("link");
+_20.rel="stylesheet";
+_20.type="text/css";
+_20.href=url;
+_1f.appendChild(_20);
 }
+}));
 },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 _39=dojo.indexOf(this.editingAreaStyleSheets,url);
-if(_39==-1){
+var _21=dojo.indexOf(this.editingAreaStyleSheets,url);
+if(_21==-1){
 return;
 }
-delete this.editingAreaStyleSheets[_39];
+delete this.editingAreaStyleSheets[_21];
 dojo.withGlobal(this.window,"query",dojo,["link:[href=\""+url+"\"]"]).orphan();
-},disabled:false,_mozSettingProps:{"styleWithCSS":false},_setDisabledAttr:function(_3a){
-this.disabled=_3a;
+},disabled:false,_mozSettingProps:{"styleWithCSS":false},_setDisabledAttr:function(_22){
+this.disabled=_22;
 if(!this.isLoaded){
 return;
 }
-_3a=!!_3a;
+_22=!!_22;
 if(dojo.isIE||dojo.isWebKit||dojo.isOpera){
-var _3b=dojo.isIE&&(this.isLoaded||!this.focusOnLoad);
-if(_3b){
+var _23=dojo.isIE&&(this.isLoaded||!this.focusOnLoad);
+if(_23){
 this.editNode.unselectable="on";
 }
-this.editNode.contentEditable=!_3a;
-if(_3b){
-var _3c=this;
+this.editNode.contentEditable=!_22;
+if(_23){
+var _24=this;
 setTimeout(function(){
-_3c.editNode.unselectable="off";
+_24.editNode.unselectable="off";
 },0);
 }
 }else{
 try{
-this.document.designMode=(_3a?"off":"on");
+this.document.designMode=(_22?"off":"on");
 }
 catch(e){
 return;
 }
-if(!_3a&&this._mozSettingProps){
+if(!_22&&this._mozSettingProps){
 var ps=this._mozSettingProps;
 for(var n in ps){
 if(ps.hasOwnProperty(n)){
 try{
 this.document.execCommand(n,false,ps[n]);
 }
-catch(e){
+catch(e2){
 }
 }
 }
 }
 }
 this._disabledOK=true;
-},_isResized:function(){
-return false;
-},onLoad:function(e){
+},onLoad:function(_25){
 if(!this.window.__registeredWindow){
 this.window.__registeredWindow=true;
-dijit.registerIframe(this.iframe);
+this._iframeRegHandle=dijit.registerIframe(this.iframe);
 }
 if(!dojo.isIE&&(this.height||dojo.isMoz)){
 this.editNode=this.document.body;
 }else{
 this.editNode=this.document.body.firstChild;
-var _40=this;
+var _26=this;
 if(dojo.isIE){
-var _41=(this.tabStop=dojo.doc.createElement("<div tabIndex=-1>"));
-this.editingArea.appendChild(_41);
+var _27=(this.tabStop=dojo.doc.createElement("<div tabIndex=-1>"));
+this.editingArea.appendChild(_27);
 this.iframe.onfocus=function(){
-_40.editNode.setActive();
+_26.editNode.setActive();
 };
 }
 }
 this.focusNode=this.editNode;
-this._preDomFilterContent(this.editNode);
-var _42=this.events.concat(this.captureEvents);
+var _28=this.events.concat(this.captureEvents);
 var ap=this.iframe?this.document:this.editNode;
-dojo.forEach(_42,function(_44){
-this.connect(ap,_44.toLowerCase(),_44);
+dojo.forEach(_28,function(_29){
+this.connect(ap,_29.toLowerCase(),_29);
 },this);
 if(dojo.isIE){
 this.connect(this.document,"onmousedown","_onIEMouseDown");
@@ -439,12 +358,20 @@ this.editNode.style.zoom=1;
 if(dojo.isWebKit){
 this._webkitListener=this.connect(this.document,"onmouseup","onDisplayChanged");
 }
+if(dojo.isIE){
+try{
+this.document.execCommand("RespectVisibilityInDesign",true,null);
+}
+catch(e){
+}
+}
 this.isLoaded=true;
 this.attr("disabled",this.disabled);
+this.setValue(_25);
 if(this.onLoadDeferred){
 this.onLoadDeferred.callback(true);
 }
-this.onDisplayChanged(e);
+this.onDisplayChanged();
 if(this.focusOnLoad){
 dojo.addOnLoad(dojo.hitch(this,function(){
 setTimeout(dojo.hitch(this,"focus"),this.updateInterval);
@@ -477,51 +404,33 @@ this.onKeyPress(e);
 }
 }
 }
-}else{
-if(dojo.isMoz&&!this.isTabIndent){
-if(e.keyCode==dojo.keys.TAB&&!e.shiftKey&&!e.ctrlKey&&!e.altKey&&this.iframe){
-var _46=dojo.isFF<3?this.iframe.contentDocument:this.iframe;
-_46.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);
-}
-}
-}
 }
 return true;
 },onKeyUp:function(e){
 return;
-},setDisabled:function(_48){
+},setDisabled:function(_2a){
 dojo.deprecated("dijit.Editor::setDisabled is deprecated","use dijit.Editor::attr(\"disabled\",boolean) instead",2);
-this.attr("disabled",_48);
-},_setValueAttr:function(_49){
-this.setValue(_49);
-},_getDisableSpellCheckAttr:function(){
-return !dojo.attr(this.document.body,"spellcheck");
-},_setDisableSpellCheckAttr:function(_4a){
+this.attr("disabled",_2a);
+},_setValueAttr:function(_2b){
+this.setValue(_2b);
+},_setDisableSpellCheckAttr:function(_2c){
 if(this.document){
-dojo.attr(this.document.body,"spellcheck",!_4a);
+dojo.attr(this.document.body,"spellcheck",!_2c);
 }else{
 this.onLoadDeferred.addCallback(dojo.hitch(this,function(){
-dojo.attr(this.document.body,"spellcheck",!_4a);
+dojo.attr(this.document.body,"spellcheck",!_2c);
 }));
 }
+this.disableSpellCheck=_2c;
 },onKeyPress:function(e){
-var c=(e.keyChar&&e.keyChar.toLowerCase())||e.keyCode;
-var _4d=this._keyHandlers[c];
-var _4e=arguments;
-if(_4d&&!e.altKey){
-dojo.forEach(_4d,function(h){
-if((!!h.shift==!!e.shiftKey)&&(!!h.ctrl==!!e.ctrlKey)){
-if(!h.handler.apply(this,_4e)){
+var c=(e.keyChar&&e.keyChar.toLowerCase())||e.keyCode,_2d=this._keyHandlers[c],_2e=arguments;
+if(_2d&&!e.altKey){
+dojo.some(_2d,function(h){
+if(!(h.shift^e.shiftKey)&&!(h.ctrl^e.ctrlKey)){
+if(!h.handler.apply(this,_2e)){
 e.preventDefault();
 }
+return true;
 }
 },this);
 }
@@ -530,11 +439,11 @@ this._onKeyHitch=dojo.hitch(this,"onKeyPressed");
 }
 setTimeout(this._onKeyHitch,1);
 return true;
-},addKeyHandler:function(key,_51,_52,_53){
+},addKeyHandler:function(key,_2f,_30,_31){
 if(!dojo.isArray(this._keyHandlers[key])){
 this._keyHandlers[key]=[];
 }
-this._keyHandlers[key].push({shift:_52||false,ctrl:_51||false,handler:_53});
+this._keyHandlers[key].push({shift:_30||false,ctrl:_2f||false,handler:_31});
 },onKeyPressed:function(){
 this.onDisplayChanged();
 },onClick:function(e){
@@ -545,14 +454,10 @@ 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){
-var _58=dojo.isFF<3?this.iframe.contentDocument:this.iframe;
-_58.title=this._localizedIframeTitles.iframeEditTitle;
+var _32=this.getValue(true);
+if(_32!=this.savedContent){
+this.onChange(_32);
+this.savedContent=_32;
 }
 },_onFocus:function(e){
 if(!this.disabled){
@@ -572,6 +477,12 @@ dojo.doc.body.focus();
 },focus:function(){
 if(!dojo.isIE){
 dijit.focus(this.iframe);
+if(this._cursorToStart){
+delete this._cursorToStart;
+if(this.editNode.childNodes&&this.editNode.childNodes.length===1&&this.editNode.innerHTML===" "){
+this.placeCursorAtStart();
+}
+}
 }else{
 if(this.editNode&&this.editNode.focus){
 this.iframe.fireEvent("onfocus",document.createEventObject());
@@ -587,37 +498,36 @@ this._updateHandler=dojo.hitch(this,"onNormalizedDisplayChanged");
 this._updateTimer=setTimeout(this._updateHandler,this.updateInterval);
 },onNormalizedDisplayChanged:function(){
 delete this._updateTimer;
-},onChange:function(_5b){
-},_normalizeCommand:function(cmd){
-var _5d=cmd.toLowerCase();
-if(_5d=="formatblock"){
-if(dojo.isSafari){
-_5d="heading";
+},onChange:function(_33){
+},_normalizeCommand:function(cmd,_34){
+var _35=cmd.toLowerCase();
+if(_35=="formatblock"){
+if(dojo.isSafari&&_34===undefined){
+_35="heading";
 }
 }else{
-if(_5d=="hilitecolor"&&!dojo.isMoz){
-_5d="backcolor";
+if(_35=="hilitecolor"&&!dojo.isMoz){
+_35="backcolor";
 }
 }
-return _5d;
-},_qcaCache:{},queryCommandAvailable:function(_5e){
-var ca=this._qcaCache[_5e];
-if(ca!=undefined){
+return _35;
+},_qcaCache:{},queryCommandAvailable:function(_36){
+var ca=this._qcaCache[_36];
+if(ca!==undefined){
 return ca;
 }
-return (this._qcaCache[_5e]=this._queryCommandAvailable(_5e));
-},_queryCommandAvailable:function(_60){
+return (this._qcaCache[_36]=this._queryCommandAvailable(_36));
+},_queryCommandAvailable:function(_37){
 var ie=1;
-var _62=1<<1;
-var _63=1<<2;
-var _64=1<<3;
-var _65=1<<4;
-var _66=dojo.isWebKit;
-function _67(_68){
-return {ie:Boolean(_68&ie),mozilla:Boolean(_68&_62),webkit:Boolean(_68&_63),webkit420:Boolean(_68&_65),opera:Boolean(_68&_64)};
+var _38=1<<1;
+var _39=1<<2;
+var _3a=1<<3;
+var _3b=1<<4;
+function _3c(_3d){
+return {ie:Boolean(_3d&ie),mozilla:Boolean(_3d&_38),webkit:Boolean(_3d&_39),webkit420:Boolean(_3d&_3b),opera:Boolean(_3d&_3a)};
 };
-var _69=null;
-switch(_60.toLowerCase()){
+var _3e=null;
+switch(_37.toLowerCase()){
 case "bold":
 case "italic":
 case "underline":
@@ -634,7 +544,7 @@ case "justifyright":
 case "delete":
 case "selectall":
 case "toggledir":
-_69=_67(_62|ie|_63|_64);
+_3e=_3c(_38|ie|_39|_3a);
 break;
 case "createlink":
 case "unlink":
@@ -651,7 +561,7 @@ case "undo":
 case "redo":
 case "strikethrough":
 case "tabindent":
-_69=_67(_62|ie|_64|_65);
+_3e=_3c(_38|ie|_3a|_3b);
 break;
 case "blockdirltr":
 case "blockdirrtl":
@@ -659,15 +569,15 @@ case "dirltr":
 case "dirrtl":
 case "inlinedirltr":
 case "inlinedirrtl":
-_69=_67(ie);
+_3e=_3c(ie);
 break;
 case "cut":
 case "copy":
 case "paste":
-_69=_67(ie|_62|_65);
+_3e=_3c(ie|_38|_3b);
 break;
 case "inserttable":
-_69=_67(_62|ie);
+_3e=_3c(_38|ie);
 break;
 case "insertcell":
 case "insertcol":
@@ -677,226 +587,218 @@ case "deletecols":
 case "deleterows":
 case "mergecells":
 case "splitcell":
-_69=_67(ie|_62);
+_3e=_3c(ie|_38);
 break;
 default:
 return false;
 }
-return (dojo.isIE&&_69.ie)||(dojo.isMoz&&_69.mozilla)||(dojo.isWebKit&&_69.webkit)||(dojo.isWebKit>420&&_69.webkit420)||(dojo.isOpera&&_69.opera);
-},execCommand:function(_6a,_6b){
-var _6c;
+return (dojo.isIE&&_3e.ie)||(dojo.isMoz&&_3e.mozilla)||(dojo.isWebKit&&_3e.webkit)||(dojo.isWebKit>420&&_3e.webkit420)||(dojo.isOpera&&_3e.opera);
+},execCommand:function(_3f,_40){
+var _41;
 this.focus();
-_6a=this._normalizeCommand(_6a);
-if(_6b!=undefined){
-if(_6a=="heading"){
+_3f=this._normalizeCommand(_3f,_40);
+if(_40!==undefined){
+if(_3f=="heading"){
 throw new Error("unimplemented");
 }else{
-if((_6a=="formatblock")&&dojo.isIE){
-_6b="<"+_6b+">";
+if((_3f=="formatblock")&&dojo.isIE){
+_40="<"+_40+">";
 }
 }
 }
-if(_6a=="inserthtml"){
-_6b=this._preFilterContent(_6b);
-_6c=true;
-if(dojo.isIE){
-var _6d=this.document.selection.createRange();
-if(this.document.selection.type.toUpperCase()=="CONTROL"){
-var n=_6d.item(0);
-while(_6d.length){
-_6d.remove(_6d.item(0));
-}
-n.outerHTML=_6b;
+var _42="_"+_3f+"Impl";
+if(this[_42]){
+_41=this[_42](_40);
 }else{
-_6d.pasteHTML(_6b);
-}
-_6d.select();
-}else{
-if(dojo.isMoz&&!_6b.length){
-this._sCall("remove");
-}else{
-_6c=this.document.execCommand(_6a,false,_6b);
-}
-}
-}else{
-if((_6a=="unlink")&&(this.queryCommandEnabled("unlink"))&&(dojo.isMoz||dojo.isWebKit)){
-var a=this._sCall("getAncestorElement",["a"]);
-this._sCall("selectElement",[a]);
-_6c=this.document.execCommand("unlink",false,null);
-}else{
-if((_6a=="hilitecolor")&&(dojo.isMoz)){
-this.document.execCommand("styleWithCSS",false,true);
-_6c=this.document.execCommand(_6a,false,_6b);
-this.document.execCommand("styleWithCSS",false,false);
-}else{
-if((dojo.isIE)&&((_6a=="backcolor")||(_6a=="forecolor"))){
-_6b=arguments.length>1?_6b:null;
-_6c=this.document.execCommand(_6a,false,_6b);
-}else{
-_6b=arguments.length>1?_6b:null;
-if(_6b||_6a!="createlink"){
-_6c=this.document.execCommand(_6a,false,_6b);
-}
-}
-}
+_40=arguments.length>1?_40:null;
+if(_40||_3f!="createlink"){
+_41=this.document.execCommand(_3f,false,_40);
 }
 }
 this.onDisplayChanged();
-return _6c;
-},queryCommandEnabled:function(_70){
+return _41;
+},queryCommandEnabled:function(_43){
 if(this.disabled||!this._disabledOK){
 return false;
 }
-_70=this._normalizeCommand(_70);
+_43=this._normalizeCommand(_43);
 if(dojo.isMoz||dojo.isWebKit){
-if(_70=="unlink"){
-this._sCall("hasAncestorElement",["a"]);
+if(_43=="unlink"){
+return this._sCall("hasAncestorElement",["a"]);
 }else{
-if(_70=="inserttable"){
+if(_43=="inserttable"){
 return true;
 }
 }
 }
 if(dojo.isWebKit){
-if(_70=="copy"){
-_70="cut";
+if(_43=="copy"){
+_43="cut";
 }else{
-if(_70=="paste"){
+if(_43=="paste"){
 return true;
 }
 }
 }
-var _71=dojo.isIE?this.document.selection.createRange():this.document;
-return _71.queryCommandEnabled(_70);
-},queryCommandState:function(_72){
+var _44=dojo.isIE?this.document.selection.createRange():this.document;
+try{
+return _44.queryCommandEnabled(_43);
+}
+catch(e){
+return false;
+}
+},queryCommandState:function(_45){
 if(this.disabled||!this._disabledOK){
 return false;
 }
-_72=this._normalizeCommand(_72);
-return this.document.queryCommandState(_72);
-},queryCommandValue:function(_73){
+_45=this._normalizeCommand(_45);
+try{
+return this.document.queryCommandState(_45);
+}
+catch(e){
+return false;
+}
+},queryCommandValue:function(_46){
 if(this.disabled||!this._disabledOK){
 return false;
 }
 var r;
-_73=this._normalizeCommand(_73);
-if(dojo.isIE&&_73=="formatblock"){
-r=this._native2LocalFormatNames[this.document.queryCommandValue(_73)];
+_46=this._normalizeCommand(_46);
+if(dojo.isIE&&_46=="formatblock"){
+r=this._native2LocalFormatNames[this.document.queryCommandValue(_46)];
 }else{
-r=this.document.queryCommandValue(_73);
+if(dojo.isMoz&&_46==="hilitecolor"){
+var _47;
+try{
+_47=this.document.queryCommandValue("styleWithCSS");
+}
+catch(e){
+_47=false;
+}
+this.document.execCommand("styleWithCSS",false,true);
+r=this.document.queryCommandValue(_46);
+this.document.execCommand("styleWithCSS",false,_47);
+}else{
+r=this.document.queryCommandValue(_46);
+}
 }
 return r;
-},_sCall:function(_75,_76){
-return dojo.withGlobal(this.window,_75,dijit._editor.selection,_76);
+},_sCall:function(_48,_49){
+return dojo.withGlobal(this.window,_48,dijit._editor.selection,_49);
 },placeCursorAtStart:function(){
 this.focus();
-var _77=false;
+var _4a=false;
 if(dojo.isMoz){
-var _78=this.editNode.firstChild;
-while(_78){
-if(_78.nodeType==3){
-if(_78.nodeValue.replace(/^\s+|\s+$/g,"").length>0){
-_77=true;
-this._sCall("selectElement",[_78]);
+var _4b=this.editNode.firstChild;
+while(_4b){
+if(_4b.nodeType==3){
+if(_4b.nodeValue.replace(/^\s+|\s+$/g,"").length>0){
+_4a=true;
+this._sCall("selectElement",[_4b]);
 break;
 }
 }else{
-if(_78.nodeType==1){
-_77=true;
-this._sCall("selectElementChildren",[_78]);
+if(_4b.nodeType==1){
+_4a=true;
+this._sCall("selectElementChildren",[_4b]);
 break;
 }
 }
-_78=_78.nextSibling;
+_4b=_4b.nextSibling;
 }
 }else{
-_77=true;
+_4a=true;
 this._sCall("selectElementChildren",[this.editNode]);
 }
-if(_77){
+if(_4a){
 this._sCall("collapse",[true]);
 }
 },placeCursorAtEnd:function(){
 this.focus();
-var _79=false;
+var _4c=false;
 if(dojo.isMoz){
-var _7a=this.editNode.lastChild;
-while(_7a){
-if(_7a.nodeType==3){
-if(_7a.nodeValue.replace(/^\s+|\s+$/g,"").length>0){
-_79=true;
-this._sCall("selectElement",[_7a]);
+var _4d=this.editNode.lastChild;
+while(_4d){
+if(_4d.nodeType==3){
+if(_4d.nodeValue.replace(/^\s+|\s+$/g,"").length>0){
+_4c=true;
+this._sCall("selectElement",[_4d]);
 break;
 }
 }else{
-if(_7a.nodeType==1){
-_79=true;
-if(_7a.lastChild){
-this._sCall("selectElement",[_7a.lastChild]);
+if(_4d.nodeType==1){
+_4c=true;
+if(_4d.lastChild){
+this._sCall("selectElement",[_4d.lastChild]);
 }else{
-this._sCall("selectElement",[_7a]);
+this._sCall("selectElement",[_4d]);
 }
 break;
 }
 }
-_7a=_7a.previousSibling;
+_4d=_4d.previousSibling;
 }
 }else{
-_79=true;
+_4c=true;
 this._sCall("selectElementChildren",[this.editNode]);
 }
-if(_79){
+if(_4c){
 this._sCall("collapse",[false]);
 }
-},getValue:function(_7b){
+},getValue:function(_4e){
 if(this.textarea){
 if(this.isClosed||!this.isLoaded){
 return this.textarea.value;
 }
 }
-return this._postFilterContent(null,_7b);
+return this._postFilterContent(null,_4e);
 },_getValueAttr:function(){
-return this.getValue();
-},setValue:function(_7c){
+return this.getValue(true);
+},setValue:function(_4f){
 if(!this.isLoaded){
 this.onLoadDeferred.addCallback(dojo.hitch(this,function(){
-this.setValue(_7c);
+this.setValue(_4f);
 }));
 return;
 }
 if(this.textarea&&(this.isClosed||!this.isLoaded)){
-this.textarea.value=_7c;
+this.textarea.value=_4f;
 }else{
-_7c=this._preFilterContent(_7c);
-var _7d=this.isClosed?this.domNode:this.editNode;
-_7d.innerHTML=_7c;
-this._preDomFilterContent(_7d);
+_4f=this._preFilterContent(_4f);
+var _50=this.isClosed?this.domNode:this.editNode;
+if(!_4f&&dojo.isWebKit){
+this._cursorToStart=true;
+_4f=" ";
+}
+_50.innerHTML=_4f;
+this._preDomFilterContent(_50);
 }
 this.onDisplayChanged();
-},replaceValue:function(_7e){
+},replaceValue:function(_51){
 if(this.isClosed){
-this.setValue(_7e);
+this.setValue(_51);
 }else{
 if(this.window&&this.window.getSelection&&!dojo.isMoz){
-this.setValue(_7e);
+this.setValue(_51);
 }else{
 if(this.window&&this.window.getSelection){
-_7e=this._preFilterContent(_7e);
+_51=this._preFilterContent(_51);
 this.execCommand("selectall");
-if(dojo.isMoz&&!_7e){
-_7e=" ";
+if(!_51){
+this._cursorToStart=true;
+_51=" ";
 }
-this.execCommand("inserthtml",_7e);
+this.execCommand("inserthtml",_51);
 this._preDomFilterContent(this.editNode);
 }else{
 if(this.document&&this.document.selection){
-this.setValue(_7e);
+this.setValue(_51);
 }
 }
 }
 }
-},_preFilterContent:function(_7f){
-var ec=_7f;
+},_preFilterContent:function(_52){
+var ec=_52;
 dojo.forEach(this.contentPreFilters,function(ef){
 if(ef){
 ec=ef(ec);
@@ -910,12 +812,12 @@ if(ef&&dojo.isFunction(ef)){
 ef(dom);
 }
 },this);
-},_postFilterContent:function(dom,_85){
+},_postFilterContent:function(dom,_53){
 var ec;
 if(!dojo.isString(dom)){
 dom=dom||this.editNode;
 if(this.contentDomPostFilters.length){
-if(_85){
+if(_53){
 dom=dojo.clone(dom);
 }
 dojo.forEach(this.contentDomPostFilters,function(ef){
@@ -934,29 +836,32 @@ ec=ef(ec);
 });
 return ec;
 },_saveContent:function(e){
-var _8a=dojo.byId(dijit._scopeName+"._editor.RichText.savedContent");
-_8a.value+=this._SEPARATOR+this.name+":"+this.getValue();
-},escapeXml:function(str,_8c){
+var _54=dojo.byId(dijit._scopeName+"._editor.RichText.savedContent");
+if(_54.value){
+_54.value+=this._SEPARATOR;
+}
+_54.value+=this.name+":"+this.getValue(true);
+},escapeXml:function(str,_55){
 str=str.replace(/&/gm,"&").replace(/</gm,"<").replace(/>/gm,">").replace(/"/gm,""");
-if(!_8c){
+if(!_55){
 str=str.replace(/'/gm,"'");
 }
 return str;
-},getNodeHtml:function(_8d){
+},getNodeHtml:function(_56){
 dojo.deprecated("dijit.Editor::getNodeHtml is deprecated","use dijit._editor.getNodeHtml instead",2);
-return dijit._editor.getNodeHtml(_8d);
+return dijit._editor.getNodeHtml(_56);
 },getNodeChildrenHtml:function(dom){
 dojo.deprecated("dijit.Editor::getNodeChildrenHtml is deprecated","use dijit._editor.getChildrenHtml instead",2);
 return dijit._editor.getChildrenHtml(dom);
-},close:function(_8f,_90){
+},close:function(_57){
 if(this.isClosed){
 return false;
 }
 if(!arguments.length){
-_8f=true;
+_57=true;
 }
 this._content=this.getValue();
-var _91=(this.savedContent!=this._content);
+var _58=(this.savedContent!=this._content);
 if(this.interval){
 clearInterval(this.interval);
 }
@@ -968,6 +873,10 @@ if(dojo.isIE){
 this.iframe.onfocus=null;
 }
 this.iframe._loadFunc=null;
+if(this._iframeRegHandle){
+dijit.unregisterIframe(this._iframeRegHandle);
+delete this._iframeRegHandle;
+}
 if(this.textarea){
 var s=this.textarea.style;
 s.position="";
@@ -976,16 +885,18 @@ if(dojo.isIE){
 s.overflow=this.__overflow;
 this.__overflow=null;
 }
-this.textarea.value=_8f?this._content:this.savedContent;
+this.textarea.value=_57?this._content:this.savedContent;
 dojo.destroy(this.domNode);
 this.domNode=this.textarea;
 }else{
-this.domNode.innerHTML=_8f?this._content:this.savedContent;
+this.domNode.innerHTML=_57?this._content:this.savedContent;
 }
+delete this.iframe;
 dojo.removeClass(this.domNode,"RichTextEditable");
 this.isClosed=true;
 this.isLoaded=false;
 delete this.editNode;
+delete this.focusNode;
 if(this.window&&this.window._frameElement){
 this.window._frameElement=null;
 }
@@ -993,21 +904,76 @@ this.window=null;
 this.document=null;
 this.editingArea=null;
 this.editorObject=null;
-return _91;
-},destroyRendering:function(){
+return _58;
 },destroy:function(){
-this.destroyRendering();
 if(!this.isClosed){
 this.close(false);
 }
 this.inherited(arguments);
-},_removeMozBogus:function(_93){
-return _93.replace(/\stype="_moz"/gi,"").replace(/\s_moz_dirty=""/gi,"");
-},_removeSafariBogus:function(_94){
-return _94.replace(/\sclass="webkit-block-placeholder"/gi,"");
-},_fixContentForMoz:function(_95){
-return _95.replace(/<(\/)?strong([ \>])/gi,"<$1b$2").replace(/<(\/)?em([ \>])/gi,"<$1i$2");
-},_preFixUrlAttributes:function(_96){
-return _96.replace(/(?:(<a(?=\s).*?\shref=)("|')(.*?)\2)|(?:(<a\s.*?href=)([^"'][^ >]+))/gi,"$1$4$2$3$5$2 _djrealurl=$2$3$5$2").replace(/(?:(<img(?=\s).*?\ssrc=)("|')(.*?)\2)|(?:(<img\s.*?src=)([^"'][^ >]+))/gi,"$1$4$2$3$5$2 _djrealurl=$2$3$5$2");
+},_removeMozBogus:function(_59){
+return _59.replace(/\stype="_moz"/gi,"").replace(/\s_moz_dirty=""/gi,"").replace(/_moz_resizing="(true|false)"/gi,"");
+},_removeWebkitBogus:function(_5a){
+_5a=_5a.replace(/\sclass="webkit-block-placeholder"/gi,"");
+_5a=_5a.replace(/\sclass="apple-style-span"/gi,"");
+return _5a;
+},_normalizeFontStyle:function(_5b){
+return _5b.replace(/<(\/)?strong([ \>])/gi,"<$1b$2").replace(/<(\/)?em([ \>])/gi,"<$1i$2");
+},_preFixUrlAttributes:function(_5c){
+return _5c.replace(/(?:(<a(?=\s).*?\shref=)("|')(.*?)\2)|(?:(<a\s.*?href=)([^"'][^ >]+))/gi,"$1$4$2$3$5$2 _djrealurl=$2$3$5$2").replace(/(?:(<img(?=\s).*?\ssrc=)("|')(.*?)\2)|(?:(<img\s.*?src=)([^"'][^ >]+))/gi,"$1$4$2$3$5$2 _djrealurl=$2$3$5$2");
+},_inserthorizontalruleImpl:function(_5d){
+if(dojo.isIE){
+return this._inserthtmlImpl("<hr>");
+}
+return this.document.execCommand("inserthorizontalrule",false,_5d);
+},_unlinkImpl:function(_5e){
+if((this.queryCommandEnabled("unlink"))&&(dojo.isMoz||dojo.isWebKit)){
+var a=this._sCall("getAncestorElement",["a"]);
+this._sCall("selectElement",[a]);
+return this.document.execCommand("unlink",false,null);
+}
+return this.document.execCommand("unlink",false,_5e);
+},_hilitecolorImpl:function(_5f){
+var _60;
+if(dojo.isMoz){
+this.document.execCommand("styleWithCSS",false,true);
+_60=this.document.execCommand("hilitecolor",false,_5f);
+this.document.execCommand("styleWithCSS",false,false);
+}else{
+_60=this.document.execCommand("hilitecolor",false,_5f);
+}
+return _60;
+},_backcolorImpl:function(_61){
+if(dojo.isIE){
+_61=_61?_61:null;
+}
+return this.document.execCommand("backcolor",false,_61);
+},_forecolorImpl:function(_62){
+if(dojo.isIE){
+_62=_62?_62:null;
+}
+return this.document.execCommand("forecolor",false,_62);
+},_inserthtmlImpl:function(_63){
+_63=this._preFilterContent(_63);
+var rv=true;
+if(dojo.isIE){
+var _64=this.document.selection.createRange();
+if(this.document.selection.type.toUpperCase()=="CONTROL"){
+var n=_64.item(0);
+while(_64.length){
+_64.remove(_64.item(0));
+}
+n.outerHTML=_63;
+}else{
+_64.pasteHTML(_63);
+}
+_64.select();
+}else{
+if(dojo.isMoz&&!_63.length){
+this._sCall("remove");
+}else{
+rv=this.document.execCommand("inserthtml",false,_63);
+}
+}
+return rv;
 }});
 }
diff --git a/dijit/_editor/_Plugin.js b/dijit/_editor/_Plugin.js
index 98d0788..c92ba5f 100644
--- a/dijit/_editor/_Plugin.js
+++ b/dijit/_editor/_Plugin.js
@@ -12,22 +12,21 @@ dojo.require("dijit._Widget");
 dojo.require("dijit.Editor");
 dojo.require("dijit.form.Button");
 dojo.declare("dijit._editor._Plugin",null,{constructor:function(_1,_2){
-if(_1){
-dojo.mixin(this,_1);
-}
+this.params=_1||{};
+dojo.mixin(this,this.params);
 this._connects=[];
-},editor:null,iconClassPrefix:"dijitEditorIcon",button:null,queryCommand:null,command:"",commandArg:null,useDefaultCommand:true,buttonClass:dijit.form.Button,getLabel:function(_3){
+},editor:null,iconClassPrefix:"dijitEditorIcon",button:null,command:"",useDefaultCommand:true,buttonClass:dijit.form.Button,getLabel:function(_3){
 return this.editor.commands[_3];
-},_initButton:function(_4){
+},_initButton:function(){
 if(this.command.length){
-var _5=this.getLabel(this.command);
-var _6=this.iconClassPrefix+" "+this.iconClassPrefix+this.command.charAt(0).toUpperCase()+this.command.substr(1);
+var _4=this.getLabel(this.command);
+var _5=this.iconClassPrefix+" "+this.iconClassPrefix+this.command.charAt(0).toUpperCase()+this.command.substr(1);
 if(!this.button){
-_4=dojo.mixin({label:_5,showLabel:false,iconClass:_6,dropDown:this.dropDown,tabIndex:"-1"},_4||{});
-this.button=new this.buttonClass(_4);
+var _6=dojo.mixin({label:_4,showLabel:false,iconClass:_5,dropDown:this.dropDown,tabIndex:"-1"},this.params||{});
+this.button=new this.buttonClass(_6);
 }
 }
-},destroy:function(f){
+},destroy:function(){
 dojo.forEach(this._connects,dojo.disconnect);
 if(this.dropDown){
 this.dropDown.destroyRecursive();
@@ -35,31 +34,30 @@ this.dropDown.destroyRecursive();
 },connect:function(o,f,tf){
 this._connects.push(dojo.connect(o,f,this,tf));
 },updateState:function(){
-var e=this.editor,c=this.command,_d,_e;
+var e=this.editor,c=this.command,_7,_8;
 if(!e||!e.isLoaded||!c.length){
 return;
 }
 if(this.button){
 try{
-_e=e.queryCommandEnabled(c);
-if(this.enabled!==_e){
-this.enabled=_e;
-this.button.attr("disabled",!_e);
+_8=e.queryCommandEnabled(c);
+if(this.enabled!==_8){
+this.enabled=_8;
+this.button.attr("disabled",!_8);
 }
 if(typeof this.button.checked=="boolean"){
-_d=e.queryCommandState(c);
-if(this.checked!==_d){
-this.checked=_d;
+_7=e.queryCommandState(c);
+if(this.checked!==_7){
+this.checked=_7;
 this.button.attr("checked",e.queryCommandState(c));
 }
 }
 }
 catch(e){
-
 }
 }
-},setEditor:function(_f){
-this.editor=_f;
+},setEditor:function(_9){
+this.editor=_9;
 this._initButton();
 if(this.command.length&&!this.editor.queryCommandAvailable(this.command)){
 if(this.button){
@@ -70,9 +68,9 @@ 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(_10){
+},setToolbar:function(_a){
 if(this.button){
-_10.addChild(this.button);
+_a.addChild(this.button);
 }
 }});
 }
diff --git a/dijit/_editor/html.js b/dijit/_editor/html.js
index e7523b2..b2d4e91 100644
--- a/dijit/_editor/html.js
+++ b/dijit/_editor/html.js
@@ -19,23 +19,28 @@ dijit._editor.getNodeHtml=function(_3){
 var _4;
 switch(_3.nodeType){
 case 1:
-_4="<"+_3.nodeName.toLowerCase();
-var _5=[];
+var _5=_3.nodeName.toLowerCase();
+if(_5.charAt(0)=="/"){
+return "";
+}
+_4="<"+_5;
+var _6=[];
+var _7;
 if(dojo.isIE&&_3.outerHTML){
 var s=_3.outerHTML;
 s=s.substr(0,s.indexOf(">")).replace(/(['"])[^"']*\1/g,"");
-var _7=/([^\s=]+)=/g;
+var _8=/(\b\w+)\s?=/g;
 var m,_9;
-while((m=_7.exec(s))){
+while((m=_8.exec(s))){
 _9=m[1];
 if(_9.substr(0,3)!="_dj"){
 if(_9=="src"||_9=="href"){
 if(_3.getAttribute("_djrealurl")){
-_5.push([_9,_3.getAttribute("_djrealurl")]);
+_6.push([_9,_3.getAttribute("_djrealurl")]);
 continue;
 }
 }
-var _a;
+var _a,_b;
 switch(_9){
 case "style":
 _a=_3.style.cssText.toLowerCase();
@@ -43,40 +48,76 @@ break;
 case "class":
 _a=_3.className;
 break;
+case "width":
+if(_5==="img"){
+_b=/width=(\S+)/i.exec(s);
+if(_b){
+_a=_b[1];
+}
+break;
+}
+case "height":
+if(_5==="img"){
+_b=/height=(\S+)/i.exec(s);
+if(_b){
+_a=_b[1];
+}
+break;
+}
 default:
 _a=_3.getAttribute(_9);
 }
-_5.push([_9,_a.toString()]);
+if(_a!=null){
+_6.push([_9,_a.toString()]);
+}
 }
 }
 }else{
-var _b,i=0;
-while((_b=_3.attributes[i++])){
-var n=_b.name;
+var i=0;
+while((_7=_3.attributes[i++])){
+var n=_7.name;
 if(n.substr(0,3)!="_dj"){
-var v=_b.value;
+var v=_7.value;
 if(n=="src"||n=="href"){
 if(_3.getAttribute("_djrealurl")){
 v=_3.getAttribute("_djrealurl");
 }
 }
-_5.push([n,v]);
+_6.push([n,v]);
 }
 }
 }
-_5.sort(function(a,b){
+_6.sort(function(a,b){
 return a[0]<b[0]?-1:(a[0]==b[0]?0:1);
 });
 var j=0;
-while((_b=_5[j++])){
-_4+=" "+_b[0]+"=\""+(dojo.isString(_b[1])?dijit._editor.escapeXml(_b[1],true):_b[1])+"\"";
+while((_7=_6[j++])){
+_4+=" "+_7[0]+"=\""+(dojo.isString(_7[1])?dijit._editor.escapeXml(_7[1],true):_7[1])+"\"";
 }
+if(_5==="script"){
+_4+=">"+_3.innerHTML+"</"+_5+">";
+}else{
 if(_3.childNodes.length){
-_4+=">"+dijit._editor.getChildrenHtml(_3)+"</"+_3.nodeName.toLowerCase()+">";
+_4+=">"+dijit._editor.getChildrenHtml(_3)+"</"+_5+">";
 }else{
+switch(_5){
+case "br":
+case "hr":
+case "img":
+case "input":
+case "base":
+case "meta":
+case "area":
+case "basefont":
 _4+=" />";
+break;
+default:
+_4+="></"+_5+">";
+}
+}
 }
 break;
+case 4:
 case 3:
 _4=dijit._editor.escapeXml(_3.nodeValue,true);
 break;
@@ -88,19 +129,19 @@ _4="<!-- Element not recognized - Type: "+_3.nodeType+" Name: "+_3.nodeName+"-->
 }
 return _4;
 };
-dijit._editor.getChildrenHtml=function(dom){
-var out="";
-if(!dom){
-return out;
+dijit._editor.getChildrenHtml=function(_c){
+var _d="";
+if(!_c){
+return _d;
 }
-var _14=dom["childNodes"]||dom;
-var _15=!dojo.isIE||_14!==dom;
-var _16,i=0;
-while((_16=_14[i++])){
-if(!_15||_16.parentNode==dom){
-out+=dijit._editor.getNodeHtml(_16);
+var _e=_c["childNodes"]||_c;
+var _f=!dojo.isIE||_e!==_c;
+var _10,i=0;
+while((_10=_e[i++])){
+if(!_f||_10.parentNode==_c){
+_d+=dijit._editor.getNodeHtml(_10);
 }
 }
-return out;
+return _d;
 };
 }
diff --git a/dijit/_editor/nls/LinkDialog.js b/dijit/_editor/nls/LinkDialog.js
index 3e1b917..0dd81f1 100644
--- a/dijit/_editor/nls/LinkDialog.js
+++ b/dijit/_editor/nls/LinkDialog.js
@@ -1 +1 @@
-({"set":"Set","text":"Description:","insertImageTitle":"Image Properties","url":"URL:","createLinkTitle":"Link Properties"})
\ No newline at end of file
+({"text":"Description:","insertImageTitle":"Image Properties","set":"Set","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","createLinkTitle":"Link Properties","parentWindow":"Parent Window","currentWindow":"Current Window","url":"URL:"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/ar/LinkDialog.js b/dijit/_editor/nls/ar/LinkDialog.js
index 28d0f9d..8545531 100644
--- a/dijit/_editor/nls/ar/LinkDialog.js
+++ b/dijit/_editor/nls/ar/LinkDialog.js
@@ -1 +1 @@
-({"set":"تحديد","text":"الوصف:","insertImageTitle":"خصائص الصورة","url":"عنوان URL:","createLinkTitle":"خصائص الوصلة"})
\ No newline at end of file
+({"set":"تحديد","text":"الوصف:","insertImageTitle":"خصائص الصورة","url":"عنوان URL:","createLinkTitle":"خصائص الوصلة","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/ar/commands.js b/dijit/_editor/nls/ar/commands.js
index 0134576..23e83e7 100644
--- a/dijit/_editor/nls/ar/commands.js
+++ b/dijit/_editor/nls/ar/commands.js
@@ -1 +1 @@
-({"removeFormat":"ازالة النسق","copy":"نسخ","paste":"لصق","selectAll":"اختيار كل","insertOrderedList":"‏كشف مرقم‏","insertTable":"ادراج/تحرير جدول","underline":"تسطير","foreColor":"لون الواجهة الأمامية","htmlToggle":"مصدر HTML","formatBlock":"نمط الفقرة","insertHorizontalRule":"مسطرة أفقية","delete":"حذف","insertUnorderedList":"كشف نقطي","tableProp":"خصائص الجدول","insertImage":"ادراج صورة","superscript":"رمز علوي","subscript":"رمز سفلي","createLink":"تكوين وصلة","undo":"تراجع","italic": [...]
\ No newline at end of file
+({"removeFormat":"ازالة النسق","copy":"نسخ","paste":"لصق","selectAll":"اختيار كل","insertOrderedList":"‏كشف مرقم‏","insertTable":"ادراج/تحرير جدول","underline":"تسطير","foreColor":"لون الواجهة الأمامية","htmlToggle":"مصدر HTML","formatBlock":"نمط الفقرة","insertHorizontalRule":"مسطرة أفقية","delete":"حذف","insertUnorderedList":"كشف نقطي","tableProp":"خصائص الجدول","insertImage":"ادراج صورة","superscript":"رمز علوي","subscript":"رمز سفلي","createLink":"تكوين وصلة","undo":"تراجع","italic": [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/ca/LinkDialog.js b/dijit/_editor/nls/ca/LinkDialog.js
index 3c09f35..7b3aa02 100644
--- a/dijit/_editor/nls/ca/LinkDialog.js
+++ b/dijit/_editor/nls/ca/LinkDialog.js
@@ -1 +1 @@
-({"set":"Defineix","text":"Descripció:","insertImageTitle":"Propietats de la imatge","url":"URL:","createLinkTitle":"Propietats de l'enllaç"})
\ No newline at end of file
+({"set":"Defineix","text":"Descripció:","insertImageTitle":"Propietats de la imatge","url":"URL:","createLinkTitle":"Propietats de l'enllaç","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/ca/commands.js b/dijit/_editor/nls/ca/commands.js
index fe154ad..aec09d8 100644
--- a/dijit/_editor/nls/ca/commands.js
+++ b/dijit/_editor/nls/ca/commands.js
@@ -1 +1 @@
-({"removeFormat":"Elimina el format","copy":"Copia","paste":"Enganxa","selectAll":"Selecciona-ho tot","insertOrderedList":"Llista numerada","insertTable":"Insereix/edita la taula","underline":"Subratllat","foreColor":"Color de primer pla","htmlToggle":"Font HTML","formatBlock":"Estil de paràgraf","insertHorizontalRule":"Regle horitzontal","delete":"Suprimeix","insertUnorderedList":"Llista de vinyetes","tableProp":"Propietat de taula","insertImage":"Insereix imatge","superscript":"Superín [...]
\ No newline at end of file
+({"removeFormat":"Elimina el format","copy":"Copia","paste":"Enganxa","selectAll":"Selecciona-ho tot","insertOrderedList":"Llista numerada","insertTable":"Insereix/edita la taula","underline":"Subratllat","foreColor":"Color de primer pla","htmlToggle":"Font HTML","formatBlock":"Estil de paràgraf","insertHorizontalRule":"Regle horitzontal","delete":"Suprimeix","insertUnorderedList":"Llista de vinyetes","tableProp":"Propietat de taula","insertImage":"Insereix imatge","superscript":"Superín [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/commands.js b/dijit/_editor/nls/commands.js
index be10087..582b782 100644
--- a/dijit/_editor/nls/commands.js
+++ b/dijit/_editor/nls/commands.js
@@ -1 +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":"Subscri [...]
\ No newline at end of file
+({"removeFormat":"Remove Format","copy":"Copy","paste":"Paste","selectAll":"Select All","insertOrderedList":"Numbered List","insertTable":"Insert/Edit Table","print":"Print","underline":"Underline","foreColor":"Foreground Color","htmlToggle":"HTML Source","formatBlock":"Paragraph Style","newPage":"New Page","insertHorizontalRule":"Horizontal Rule","delete":"Delete","appleKey":"⌘${0}","insertUnorderedList":"Bullet List","tableProp":"Table Property","insertImage":"Insert Image","superscrip [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/cs/LinkDialog.js b/dijit/_editor/nls/cs/LinkDialog.js
index cf124d5..b41d6d7 100644
--- a/dijit/_editor/nls/cs/LinkDialog.js
+++ b/dijit/_editor/nls/cs/LinkDialog.js
@@ -1 +1 @@
-({"set":"Nastavit","text":"Popis:","insertImageTitle":"Vlastnosti obrázku","url":"Adresa URL:","createLinkTitle":"Vlastnosti odkazu"})
\ No newline at end of file
+({"set":"Nastavit","text":"Popis:","insertImageTitle":"Vlastnosti obrázku","url":"Adresa URL:","createLinkTitle":"Vlastnosti odkazu","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/cs/commands.js b/dijit/_editor/nls/cs/commands.js
index 3e8dcd1..b0609c9 100644
--- a/dijit/_editor/nls/cs/commands.js
+++ b/dijit/_editor/nls/cs/commands.js
@@ -1 +1 @@
-({"removeFormat":"Odebrat formát","copy":"Kopírovat","paste":"Vložit","selectAll":"Vybrat vše","insertOrderedList":"Číslovaný seznam","insertTable":"Vložit/upravit tabulku","underline":"Podtržení","foreColor":"Barva popředí","htmlToggle":"Zdroj HTML","formatBlock":"Styl odstavce","insertHorizontalRule":"Vodorovná čára","delete":"Odstranit","insertUnorderedList":"Seznam s odrážkami","tableProp":"Vlastnost tabulky","insertImage":"Vložit obrázek","superscript":"Horní index","subscript":"Dol [...]
\ No newline at end of file
+({"removeFormat":"Odebrat formát","copy":"Kopírovat","paste":"Vložit","selectAll":"Vybrat vše","insertOrderedList":"Číslovaný seznam","insertTable":"Vložit/upravit tabulku","underline":"Podtržení","foreColor":"Barva popředí","htmlToggle":"Zdroj HTML","formatBlock":"Styl odstavce","insertHorizontalRule":"Vodorovná čára","delete":"Odstranit","insertUnorderedList":"Seznam s odrážkami","tableProp":"Vlastnost tabulky","insertImage":"Vložit obrázek","superscript":"Horní index","subscript":"Dol [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/da/LinkDialog.js b/dijit/_editor/nls/da/LinkDialog.js
index 87fd8a9..c7590f0 100644
--- a/dijit/_editor/nls/da/LinkDialog.js
+++ b/dijit/_editor/nls/da/LinkDialog.js
@@ -1 +1 @@
-({"set":"Definér","text":"Beskrivelse:","insertImageTitle":"Billedegenskaber","url":"URL:","createLinkTitle":"Linkegenskaber"})
\ No newline at end of file
+({"set":"Definér","text":"Beskrivelse:","insertImageTitle":"Billedegenskaber","url":"URL:","createLinkTitle":"Linkegenskaber","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/da/commands.js b/dijit/_editor/nls/da/commands.js
index 3751628..b7aed14 100644
--- a/dijit/_editor/nls/da/commands.js
+++ b/dijit/_editor/nls/da/commands.js
@@ -1 +1 @@
-({"removeFormat":"Fjern format","copy":"Kopiér","paste":"Sæt ind","selectAll":"Markér alle","insertOrderedList":"Nummereret liste","insertTable":"Indsæt/redigér tabel","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","cr [...]
\ No newline at end of file
+({"removeFormat":"Fjern format","copy":"Kopiér","paste":"Sæt ind","selectAll":"Markér alle","insertOrderedList":"Nummereret liste","insertTable":"Indsæt/redigér tabel","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","cr [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/de/LinkDialog.js b/dijit/_editor/nls/de/LinkDialog.js
index 0bc01cb..2a3c688 100644
--- a/dijit/_editor/nls/de/LinkDialog.js
+++ b/dijit/_editor/nls/de/LinkDialog.js
@@ -1 +1 @@
-({"set":"Festlegen","text":"Beschreibung:","insertImageTitle":"Grafikeigenschaften","url":"URL:","createLinkTitle":"Linkeigenschaften"})
\ No newline at end of file
+({"set":"Festlegen","text":"Beschreibung:","insertImageTitle":"Grafikeigenschaften","url":"URL:","createLinkTitle":"Linkeigenschaften","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/de/commands.js b/dijit/_editor/nls/de/commands.js
index f085780..c4e1642 100644
--- a/dijit/_editor/nls/de/commands.js
+++ b/dijit/_editor/nls/de/commands.js
@@ -1 +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":" [...]
\ No newline at end of file
+({"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":" [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/el/LinkDialog.js b/dijit/_editor/nls/el/LinkDialog.js
index a615aeb..9eef633 100644
--- a/dijit/_editor/nls/el/LinkDialog.js
+++ b/dijit/_editor/nls/el/LinkDialog.js
@@ -1 +1 @@
-({"set":"Ορισμός","text":"Περιγραφή:","insertImageTitle":"Ιδιότητες εικόνας","url":"Διεύθυνση URL:","createLinkTitle":"Ιδιότητες διασύνδεσης"})
\ No newline at end of file
+({"set":"Ορισμός","text":"Περιγραφή:","insertImageTitle":"Ιδιότητες εικόνας","url":"Διεύθυνση URL:","createLinkTitle":"Ιδιότητες διασύνδεσης","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/el/commands.js b/dijit/_editor/nls/el/commands.js
index 4c41931..eaf90eb 100644
--- a/dijit/_editor/nls/el/commands.js
+++ b/dijit/_editor/nls/el/commands.js
@@ -1 +1 @@
-({"removeFormat":"Αφαίρεση μορφοποίησης","copy":"Αντιγραφή","paste":"Επικόλληση","selectAll":"Επιλογή όλων","insertOrderedList":"Αριθμημένη λίστα","insertTable":"Εισαγωγή/Τροποποίηση πίνακα","underline":"Υπογράμμιση","foreColor":"Χρώμα προσκηνίου","htmlToggle":"Πρωτογενής κώδικας HTML","formatBlock":"Στυλ παραγράφου","insertHorizontalRule":"Οριζόντια γραμμή","delete":"Διαγραφή","insertUnorderedList":"Λίστα με κουκίδες","tableProp":"Ιδιότητα πίνακα","insertImage":"Εισαγωγή εικόνας","super [...]
\ No newline at end of file
+({"removeFormat":"Αφαίρεση μορφοποίησης","copy":"Αντιγραφή","paste":"Επικόλληση","selectAll":"Επιλογή όλων","insertOrderedList":"Αριθμημένη λίστα","insertTable":"Εισαγωγή/Τροποποίηση πίνακα","underline":"Υπογράμμιση","foreColor":"Χρώμα προσκηνίου","htmlToggle":"Πρωτογενής κώδικας HTML","formatBlock":"Στυλ παραγράφου","insertHorizontalRule":"Οριζόντια γραμμή","delete":"Διαγραφή","insertUnorderedList":"Λίστα με κουκίδες","tableProp":"Ιδιότητα πίνακα","insertImage":"Εισαγωγή εικόνας","super [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/es/LinkDialog.js b/dijit/_editor/nls/es/LinkDialog.js
index 8dfe95f..0be43cd 100644
--- a/dijit/_editor/nls/es/LinkDialog.js
+++ b/dijit/_editor/nls/es/LinkDialog.js
@@ -1 +1 @@
-({"set":"Establecer","text":"Descripción:","insertImageTitle":"Propiedades de la imagen","url":"URL:","createLinkTitle":"Propiedades del enlace"})
\ No newline at end of file
+({"set":"Establecer","text":"Descripción:","insertImageTitle":"Propiedades de la imagen","url":"URL:","createLinkTitle":"Propiedades del enlace","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/es/commands.js b/dijit/_editor/nls/es/commands.js
index de2cea7..5d5bbf0 100644
--- a/dijit/_editor/nls/es/commands.js
+++ b/dijit/_editor/nls/es/commands.js
@@ -1 +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", [...]
\ No newline at end of file
+({"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", [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/fi/LinkDialog.js b/dijit/_editor/nls/fi/LinkDialog.js
index dba80b6..0f8c69f 100644
--- a/dijit/_editor/nls/fi/LinkDialog.js
+++ b/dijit/_editor/nls/fi/LinkDialog.js
@@ -1 +1 @@
-({"set":"Aseta","text":"Kuvaus:","insertImageTitle":"Kuvan ominaisuudet","url":"URL-osoite:","createLinkTitle":"Linkin ominaisuudet"})
\ No newline at end of file
+({"set":"Aseta","text":"Kuvaus:","insertImageTitle":"Kuvan ominaisuudet","url":"URL-osoite:","createLinkTitle":"Linkin ominaisuudet","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/fi/commands.js b/dijit/_editor/nls/fi/commands.js
index 5448d11..60f87bb 100644
--- a/dijit/_editor/nls/fi/commands.js
+++ b/dijit/_editor/nls/fi/commands.js
@@ -1 +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":"Korotettu", [...]
\ No newline at end of file
+({"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":"Korotettu", [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/fr/LinkDialog.js b/dijit/_editor/nls/fr/LinkDialog.js
index d3d8728..567d2f4 100644
--- a/dijit/_editor/nls/fr/LinkDialog.js
+++ b/dijit/_editor/nls/fr/LinkDialog.js
@@ -1 +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
+({"set":"Définir","text":"Description :","insertImageTitle":"Propriétés de l'image","url":"URL :","createLinkTitle":"Propriétés du lien","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/fr/commands.js b/dijit/_editor/nls/fr/commands.js
index 4fee663..40be8b5 100644
--- a/dijit/_editor/nls/fr/commands.js
+++ b/dijit/_editor/nls/fr/commands.js
@@ -1 +1 @@
-({"removeFormat":"Supprimer la mise en forme","copy":"Copier","paste":"Coller","selectAll":"Sélectionner tout","insertOrderedList":"Liste numérotée","insertTable":"Insérer/Modifier un tableau","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","super [...]
\ No newline at end of file
+({"removeFormat":"Supprimer la mise en forme","copy":"Copier","paste":"Coller","selectAll":"Sélectionner tout","insertOrderedList":"Liste numérotée","insertTable":"Insérer/Modifier un tableau","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","super [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/he/LinkDialog.js b/dijit/_editor/nls/he/LinkDialog.js
index 71bbc23..bd36d66 100644
--- a/dijit/_editor/nls/he/LinkDialog.js
+++ b/dijit/_editor/nls/he/LinkDialog.js
@@ -1 +1 @@
-({"set":"הגדרה","text":"תיאור:","insertImageTitle":"תכונות תמונה","url":"URL:‏","createLinkTitle":"תכונות קישור"})
\ No newline at end of file
+({"set":"הגדרה","text":"תיאור:","insertImageTitle":"תכונות תמונה","url":"URL:‏","createLinkTitle":"תכונות קישור","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/he/commands.js b/dijit/_editor/nls/he/commands.js
index 2435c0c..f599a63 100644
--- a/dijit/_editor/nls/he/commands.js
+++ b/dijit/_editor/nls/he/commands.js
@@ -1 +1 @@
-({"removeFormat":"סילוק עיצוב","copy":"העתקה","paste":"הדבקה","selectAll":"בחירת הכל","insertOrderedList":"רשימה ממוספרת","insertTable":"הוספת/עריכת טבלה","underline":"קו תחתי","foreColor":"צבע חזית","htmlToggle":"מקור HTML","formatBlock":"סגנון פיסקה","insertHorizontalRule":"קו אופקי","delete":"מחיקה","insertUnorderedList":"רשימה עם תבליטים","tableProp":"תכונת טבלה","insertImage":"הוספת תמונה","superscript":"כתב עילי","subscript":"כתב תחתי","createLink":"יצירת קישור","undo":"ביטול פעולה [...]
\ No newline at end of file
+({"removeFormat":"סילוק עיצוב","copy":"העתקה","paste":"הדבקה","selectAll":"בחירת הכל","insertOrderedList":"רשימה ממוספרת","insertTable":"הוספת/עריכת טבלה","underline":"קו תחתי","foreColor":"צבע חזית","htmlToggle":"מקור HTML","formatBlock":"סגנון פיסקה","insertHorizontalRule":"קו אופקי","delete":"מחיקה","insertUnorderedList":"רשימה עם תבליטים","tableProp":"תכונת טבלה","insertImage":"הוספת תמונה","superscript":"כתב עילי","subscript":"כתב תחתי","createLink":"יצירת קישור","undo":"ביטול פעולה [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/hu/LinkDialog.js b/dijit/_editor/nls/hu/LinkDialog.js
index 8662cf2..07d1fb6 100644
--- a/dijit/_editor/nls/hu/LinkDialog.js
+++ b/dijit/_editor/nls/hu/LinkDialog.js
@@ -1 +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
+({"set":"Beállítás","text":"Leírás:","insertImageTitle":"Kép tulajdonságai","url":"URL:","createLinkTitle":"Hivatkozás tulajdonságai","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/hu/commands.js b/dijit/_editor/nls/hu/commands.js
index ee1aab0..6bb3acf 100644
--- a/dijit/_editor/nls/hu/commands.js
+++ b/dijit/_editor/nls/hu/commands.js
@@ -1 +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","superscri [...]
\ No newline at end of file
+({"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","superscri [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/it/LinkDialog.js b/dijit/_editor/nls/it/LinkDialog.js
index 72f76e4..dc3f3c1 100644
--- a/dijit/_editor/nls/it/LinkDialog.js
+++ b/dijit/_editor/nls/it/LinkDialog.js
@@ -1 +1 @@
-({"set":"Imposta","text":"Descrizione:","insertImageTitle":"Proprietà immagine","url":"URL:","createLinkTitle":"Proprietà collegamento"})
\ No newline at end of file
+({"set":"Imposta","text":"Descrizione:","insertImageTitle":"Proprietà immagine","url":"URL:","createLinkTitle":"Proprietà collegamento","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/it/commands.js b/dijit/_editor/nls/it/commands.js
index 342daa0..e20d858 100644
--- a/dijit/_editor/nls/it/commands.js
+++ b/dijit/_editor/nls/it/commands.js
@@ -1 +1 @@
-({"removeFormat":"Rimuovi formato","copy":"Copia","paste":"Incolla","selectAll":"Seleziona tutto","insertOrderedList":"Elenco numerato","insertTable":"Inserisci/Modifica tabella","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", [...]
\ No newline at end of file
+({"removeFormat":"Rimuovi formato","copy":"Copia","paste":"Incolla","selectAll":"Seleziona tutto","insertOrderedList":"Elenco numerato","insertTable":"Inserisci/Modifica tabella","print":"Stampa","underline":"Sottolineato","foreColor":"Colore primo piano","htmlToggle":"Origine HTML","formatBlock":"Stile paragrafo","newPage":"Nuova Pagina","insertHorizontalRule":"Righello orizzontale","delete":"Elimina","insertUnorderedList":"Elenco puntato","tableProp":"Proprietà tabella","insertImage":" [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/ja/LinkDialog.js b/dijit/_editor/nls/ja/LinkDialog.js
index 2fc7a63..877cb84 100644
--- a/dijit/_editor/nls/ja/LinkDialog.js
+++ b/dijit/_editor/nls/ja/LinkDialog.js
@@ -1 +1 @@
-({"set":"設定","text":"説明:","insertImageTitle":"イメージ・プロパティー","url":"URL:","createLinkTitle":"リンク・プロパティー"})
\ No newline at end of file
+({"set":"設定","text":"説明:","insertImageTitle":"イメージ・プロパティー","url":"URL:","createLinkTitle":"リンク・プロパティー","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/ja/commands.js b/dijit/_editor/nls/ja/commands.js
index 7f359c2..3f46c7c 100644
--- a/dijit/_editor/nls/ja/commands.js
+++ b/dijit/_editor/nls/ja/commands.js
@@ -1 +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":"リンクの除去" [...]
\ No newline at end of file
+({"removeFormat":"形式の除去","copy":"コピー","paste":"貼り付け","selectAll":"すべて選択","insertOrderedList":"番号付きリスト","insertTable":"テーブルの挿入/編集","underline":"下線","foreColor":"テキストの色","htmlToggle":"HTML ソース","formatBlock":"段落スタイル","insertHorizontalRule":"水平罫線","delete":"削除","insertUnorderedList":"黒丸付きリスト","tableProp":"テーブル・プロパティー","insertImage":"イメージの挿入","superscript":"上付き文字","subscript":"下付き文字","createLink":"リンクの作成","undo":"元に戻す","italic":"イタリック","fontName":"フォント名","justifyLeft":"左揃え","unlink":"リンクの除去" [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/ko/LinkDialog.js b/dijit/_editor/nls/ko/LinkDialog.js
index c8d10c3..e91dd49 100644
--- a/dijit/_editor/nls/ko/LinkDialog.js
+++ b/dijit/_editor/nls/ko/LinkDialog.js
@@ -1 +1 @@
-({"set":"설정","text":"설명:","insertImageTitle":"이미지 등록 정보","url":"URL:","createLinkTitle":"링크 등록 정보"})
\ No newline at end of file
+({"text":"설명:","insertImageTitle":"이미지 등록 정보","set":"설정","newWindow":"새 창","topWindow":"최 상위 창","target":"대상:","createLinkTitle":"링크 등록 정보","parentWindow":"부모 창","currentWindow":"현재 창","url":"URL:"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/ko/commands.js b/dijit/_editor/nls/ko/commands.js
index 546f12e..f9db664 100644
--- a/dijit/_editor/nls/ko/commands.js
+++ b/dijit/_editor/nls/ko/commands.js
@@ -1 +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":"링크 제거","toggleTableBorde [...]
\ No newline at end of file
+({"removeFormat":"형식 제거","copy":"복사","paste":"붙여넣기","selectAll":"모두 선택","insertOrderedList":"번호 목록","insertTable":"테이블 삽입/편집","print":"인쇄","underline":"밑줄","foreColor":"전경색","htmlToggle":"HTML 소스","formatBlock":"단락 양식","newPage":"새 글","insertHorizontalRule":"수평 자","delete":"삭제","appleKey":"⌘${0}","insertUnorderedList":"글머리표 목록","tableProp":"테이블 특성","insertImage":"이미지 삽입","superscript":"위첨자","subscript":"아래첨자","createLink":"링크 작성","undo":"실행 취소","fullScreen":"전체 화면","italic":"이탤릭체","fontN [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/nb/LinkDialog.js b/dijit/_editor/nls/nb/LinkDialog.js
index 1f26a40..6349943 100644
--- a/dijit/_editor/nls/nb/LinkDialog.js
+++ b/dijit/_editor/nls/nb/LinkDialog.js
@@ -1 +1 @@
-({"set":"Definer","text":"Beskrivelse:","insertImageTitle":"Bildeegenskaper","url":"URL:","createLinkTitle":"Koblingsegenskaper"})
\ No newline at end of file
+({"set":"Definer","text":"Beskrivelse:","insertImageTitle":"Bildeegenskaper","url":"URL:","createLinkTitle":"Koblingsegenskaper","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/nb/commands.js b/dijit/_editor/nls/nb/commands.js
index 76e02b1..1b3a56f 100644
--- a/dijit/_editor/nls/nb/commands.js
+++ b/dijit/_editor/nls/nb/commands.js
@@ -1 +1 @@
-({"removeFormat":"Fjern format","copy":"Kopier","paste":"Lim inn","selectAll":"Velg alle","insertOrderedList":"Nummerert liste","insertTable":"Sett inn/rediger tabell","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","cr [...]
\ No newline at end of file
+({"removeFormat":"Fjern format","copy":"Kopier","paste":"Lim inn","selectAll":"Velg alle","insertOrderedList":"Nummerert liste","insertTable":"Sett inn/rediger tabell","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","cr [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/nl/LinkDialog.js b/dijit/_editor/nls/nl/LinkDialog.js
index 5f89113..ddcd2fd 100644
--- a/dijit/_editor/nls/nl/LinkDialog.js
+++ b/dijit/_editor/nls/nl/LinkDialog.js
@@ -1 +1 @@
-({"set":"Instellen","text":"Beschrijving:","insertImageTitle":"Afbeeldingseigenschappen","url":"URL:","createLinkTitle":"Linkeigenschappen"})
\ No newline at end of file
+({"set":"Instellen","text":"Beschrijving:","insertImageTitle":"Afbeeldingseigenschappen","url":"URL:","createLinkTitle":"Linkeigenschappen","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/nl/commands.js b/dijit/_editor/nls/nl/commands.js
index 9296d51..bae4fe8 100644
--- a/dijit/_editor/nls/nl/commands.js
+++ b/dijit/_editor/nls/nl/commands.js
@@ -1 +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":"Supe [...]
\ No newline at end of file
+({"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":"Supe [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/pl/LinkDialog.js b/dijit/_editor/nls/pl/LinkDialog.js
index 9d6c182..a1c63a7 100644
--- a/dijit/_editor/nls/pl/LinkDialog.js
+++ b/dijit/_editor/nls/pl/LinkDialog.js
@@ -1 +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
+({"set":"Ustaw","text":"Opis:","insertImageTitle":"Właściwości obrazu","url":"Adres URL:","createLinkTitle":"Właściwości odsyłacza","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/pl/commands.js b/dijit/_editor/nls/pl/commands.js
index 3beb6cb..d2928ec 100644
--- a/dijit/_editor/nls/pl/commands.js
+++ b/dijit/_editor/nls/pl/commands.js
@@ -1 +1 @@
-({"removeFormat":"Usuń formatowanie","copy":"Kopiuj","paste":"Wklej","selectAll":"Wybierz wszystko","insertOrderedList":"Lista numerowana","insertTable":"Wstaw/edytuj tabelę","underline":"Podkreślenie","foreColor":"Kolor pierwszego planu","htmlToggle":"Kod źródłowy HTML","formatBlock":"Styl akapitu","insertHorizontalRule":"Linia pozioma","delete":"Usuń","insertUnorderedList":"Lista wypunktowana","tableProp":"Właściwość tabeli","insertImage":"Wstaw obraz","superscript":"Indeks górny","sub [...]
\ No newline at end of file
+({"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":"Kod źródłowy HTML","formatBlock":"Styl akapitu","insertHorizontalRule":"Linia pozioma","delete":"Usuń","insertUnorderedList":"Lista wypunktowana","tableProp":"Właściwość tabeli","insertImage":"Wstaw obraz","superscript":"Indeks górny","sub [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/pt-pt/LinkDialog.js b/dijit/_editor/nls/pt-pt/LinkDialog.js
index 98e5f2d..2d5f882 100644
--- a/dijit/_editor/nls/pt-pt/LinkDialog.js
+++ b/dijit/_editor/nls/pt-pt/LinkDialog.js
@@ -1 +1 @@
-({"set":"Definir","text":"Descrição:","insertImageTitle":"Propriedades da imagem","url":"URL:","createLinkTitle":"Propriedades da ligação"})
\ No newline at end of file
+({"set":"Definir","text":"Descrição:","insertImageTitle":"Propriedades da imagem","url":"URL:","createLinkTitle":"Propriedades da ligação","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/pt-pt/commands.js b/dijit/_editor/nls/pt-pt/commands.js
index 68f3d6d..67cad55 100644
--- a/dijit/_editor/nls/pt-pt/commands.js
+++ b/dijit/_editor/nls/pt-pt/commands.js
@@ -1 +1 @@
-({"removeFormat":"Remover formato","copy":"Copiar","paste":"Colar","selectAll":"Seleccionar tudo","insertOrderedList":"Lista numerada","insertTable":"Inserir/Editar tabela","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 à l [...]
\ No newline at end of file
+({"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 à l [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/pt/LinkDialog.js b/dijit/_editor/nls/pt/LinkDialog.js
index 1c89058..55d34aa 100644
--- a/dijit/_editor/nls/pt/LinkDialog.js
+++ b/dijit/_editor/nls/pt/LinkDialog.js
@@ -1 +1 @@
-({"set":"Definir","text":"Descrição: ","insertImageTitle":"Propriedades de Imagem","url":"URL:","createLinkTitle":"Propriedades de Link"})
\ No newline at end of file
+({"set":"Definir","text":"Descrição:","insertImageTitle":"Propriedades de Imagem","url":"URL:","createLinkTitle":"Propriedades de Link","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/pt/commands.js b/dijit/_editor/nls/pt/commands.js
index 9c4a66c..9227d07 100644
--- a/dijit/_editor/nls/pt/commands.js
+++ b/dijit/_editor/nls/pt/commands.js
@@ -1 +1 @@
-({"removeFormat":"Remover Formato","copy":"Copiar","paste":"Colar","selectAll":"Selecionar Tudo","insertOrderedList":"Lista Numerada","insertTable":"Inserir/Editar Tabela","underline":"Sublinhado","foreColor":"Cor de Primeiro Plano","htmlToggle":"Fonte HTML","formatBlock":"Estilo de Parágrafo","insertHorizontalRule":"Régua Horizontal","delete":"Excluir","insertUnorderedList":"Lista com Marcadores","tableProp":"Propriedade da Tabela","insertImage":"Inserir Imagem","superscript":"Sobrescri [...]
\ No newline at end of file
+({"removeFormat":"Remover Formato","copy":"Copiar","paste":"Colar","selectAll":"Selecionar Tudo","insertOrderedList":"Lista Numerada","insertTable":"Inserir/Editar Tabela","underline":"Sublinhado","foreColor":"Cor de Primeiro Plano","htmlToggle":"Fonte HTML","formatBlock":"Estilo de Parágrafo","insertHorizontalRule":"Régua Horizontal","delete":"Excluir","insertUnorderedList":"Lista com Marcadores","tableProp":"Propriedade da Tabela","insertImage":"Inserir Imagem","superscript":"Sobrescri [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/ru/LinkDialog.js b/dijit/_editor/nls/ru/LinkDialog.js
index 42a6826..9180528 100644
--- a/dijit/_editor/nls/ru/LinkDialog.js
+++ b/dijit/_editor/nls/ru/LinkDialog.js
@@ -1 +1 @@
-({"set":"Задать","text":"Описание:","insertImageTitle":"Свойства изображения","url":"URL:","createLinkTitle":"Свойства ссылки"})
\ No newline at end of file
+({"set":"Задать","text":"Описание:","insertImageTitle":"Свойства изображения","url":"URL:","createLinkTitle":"Свойства ссылки","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/ru/commands.js b/dijit/_editor/nls/ru/commands.js
index f8b17bc..cdf1189 100644
--- a/dijit/_editor/nls/ru/commands.js
+++ b/dijit/_editor/nls/ru/commands.js
@@ -1 +1 @@
-({"removeFormat":"Удалить формат","copy":"Копировать","paste":"Вставить","selectAll":"Выбрать все","insertOrderedList":"Нумерованный список","insertTable":"Вставить/изменить таблицу","underline":"Подчеркивание","foreColor":"Цвет текста","htmlToggle":"Исходный текст HTML","formatBlock":"Стиль абзаца","insertHorizontalRule":"Горизонтальная линейка","delete":"Удалить","insertUnorderedList":"Список с маркерами","tableProp":"Свойства таблицы","insertImage":"Вставить изображение","superscript" [...]
\ No newline at end of file
+({"removeFormat":"Удалить формат","copy":"Копировать","paste":"Вставить","selectAll":"Выбрать все","insertOrderedList":"Нумерованный список","insertTable":"Вставить/изменить таблицу","underline":"Подчеркивание","foreColor":"Цвет текста","htmlToggle":"Исходный текст HTML","formatBlock":"Стиль абзаца","insertHorizontalRule":"Горизонтальная линейка","delete":"Удалить","insertUnorderedList":"Список с маркерами","tableProp":"Свойства таблицы","insertImage":"Вставить изображение","superscript" [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/sk/LinkDialog.js b/dijit/_editor/nls/sk/LinkDialog.js
index e039781..3b4d7a8 100644
--- a/dijit/_editor/nls/sk/LinkDialog.js
+++ b/dijit/_editor/nls/sk/LinkDialog.js
@@ -1 +1 @@
-({"set":"Nastaviť","text":"Popis:","insertImageTitle":"Vlastnosti obrázku","url":"URL:","createLinkTitle":"Vlastnosti odkazu"})
\ No newline at end of file
+({"set":"Nastaviť","text":"Popis:","insertImageTitle":"Vlastnosti obrázku","url":"URL:","createLinkTitle":"Vlastnosti odkazu","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/sk/commands.js b/dijit/_editor/nls/sk/commands.js
index 14c7cca..1118482 100644
--- a/dijit/_editor/nls/sk/commands.js
+++ b/dijit/_editor/nls/sk/commands.js
@@ -1 +1 @@
-({"removeFormat":"Odstrániť formát","copy":"Kopírovať","paste":"Nalepiť","selectAll":"Vybrať všetko","insertOrderedList":"Číslovaný zoznam","insertTable":"Vložiť/upraviť tabuľku","underline":"Podčiarknuť","foreColor":"Farba popredia","htmlToggle":"Zdroj HTML","formatBlock":"Štýl odseku","insertHorizontalRule":"Horizontálna čiara","delete":"Vymazať","insertUnorderedList":"Zoznam s odrážkami","tableProp":"Vlastnosť tabuľky","insertImage":"Vložiť obrázok","superscript":"Horný index","subscr [...]
\ No newline at end of file
+({"removeFormat":"Odstrániť formát","copy":"Kopírovať","paste":"Nalepiť","selectAll":"Vybrať všetko","insertOrderedList":"Číslovaný zoznam","insertTable":"Vložiť/upraviť tabuľku","underline":"Podčiarknuť","foreColor":"Farba popredia","htmlToggle":"Zdroj HTML","formatBlock":"Štýl odseku","insertHorizontalRule":"Horizontálna čiara","delete":"Vymazať","insertUnorderedList":"Zoznam s odrážkami","tableProp":"Vlastnosť tabuľky","insertImage":"Vložiť obrázok","superscript":"Horný index","subscr [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/sl/LinkDialog.js b/dijit/_editor/nls/sl/LinkDialog.js
index 8fc7cfd..203a25d 100644
--- a/dijit/_editor/nls/sl/LinkDialog.js
+++ b/dijit/_editor/nls/sl/LinkDialog.js
@@ -1 +1 @@
-({"set":"Nastavi","text":"Opis:","insertImageTitle":"Lastnosti slike","url":"URL:","createLinkTitle":"Lastnosti povezave"})
\ No newline at end of file
+({"set":"Nastavi","text":"Opis:","insertImageTitle":"Lastnosti slike","url":"URL:","createLinkTitle":"Lastnosti povezave","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/sl/commands.js b/dijit/_editor/nls/sl/commands.js
index 49d7928..4fb720c 100644
--- a/dijit/_editor/nls/sl/commands.js
+++ b/dijit/_editor/nls/sl/commands.js
@@ -1 +1 @@
-({"removeFormat":"Odstrani obliko zapisa","copy":"Prekopiraj","paste":"Prilepi","selectAll":"Izberi vse","insertOrderedList":"Oštevilčen seznam","insertTable":"Vstavi/Uredi tabelo","underline":"Podčrtano","foreColor":"Barva ospredja","htmlToggle":"Izvor HTML","formatBlock":"Slog odstavka","insertHorizontalRule":"Horizontalno pravilo","delete":"Izbriši","insertUnorderedList":"Naštevni seznam","tableProp":"Lastnost tabele","insertImage":"Vstavi sliko","superscript":"Nadpisano","subscript": [...]
\ No newline at end of file
+({"removeFormat":"Odstrani obliko zapisa","copy":"Prekopiraj","paste":"Prilepi","selectAll":"Izberi vse","insertOrderedList":"Oštevilčen seznam","insertTable":"Vstavi/Uredi tabelo","underline":"Podčrtano","foreColor":"Barva ospredja","htmlToggle":"Izvor HTML","formatBlock":"Slog odstavka","insertHorizontalRule":"Horizontalno pravilo","delete":"Izbriši","insertUnorderedList":"Naštevni seznam","tableProp":"Lastnost tabele","insertImage":"Vstavi sliko","superscript":"Nadpisano","subscript": [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/sv/LinkDialog.js b/dijit/_editor/nls/sv/LinkDialog.js
index 64e8cfb..ed6c3da 100644
--- a/dijit/_editor/nls/sv/LinkDialog.js
+++ b/dijit/_editor/nls/sv/LinkDialog.js
@@ -1 +1 @@
-({"set":"Ange","text":"Beskrivning:","insertImageTitle":"Bildegenskaper","url":"URL-adress:","createLinkTitle":"Länkegenskaper"})
\ No newline at end of file
+({"set":"Ange","text":"Beskrivning:","insertImageTitle":"Bildegenskaper","url":"URL-adress:","createLinkTitle":"Länkegenskaper","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/sv/commands.js b/dijit/_editor/nls/sv/commands.js
index e662fd6..df5e091 100644
--- a/dijit/_editor/nls/sv/commands.js
+++ b/dijit/_editor/nls/sv/commands.js
@@ -1 +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"," [...]
\ No newline at end of file
+({"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"," [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/th/LinkDialog.js b/dijit/_editor/nls/th/LinkDialog.js
index e916dfb..b5ce3f8 100644
--- a/dijit/_editor/nls/th/LinkDialog.js
+++ b/dijit/_editor/nls/th/LinkDialog.js
@@ -1 +1 @@
-({"set":"ตั้งค่า","text":"รายละเอียด","insertImageTitle":"คุณสมบัติอิมเมจ","url":"URL:","createLinkTitle":"คุณสมบัติลิงก์"})
\ No newline at end of file
+({"set":"ตั้งค่า","text":"รายละเอียด","insertImageTitle":"คุณสมบัติอิมเมจ","url":"URL:","createLinkTitle":"คุณสมบัติลิงก์","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/th/commands.js b/dijit/_editor/nls/th/commands.js
index cdc88b5..ec513a5 100644
--- a/dijit/_editor/nls/th/commands.js
+++ b/dijit/_editor/nls/th/commands.js
@@ -1 +1 @@
-({"removeFormat":"ลบรูปแบบออก","copy":"คัดลอก","paste":"วาง","selectAll":"เลือกทั้งหมด","insertOrderedList":"ลำดับเลข","insertTable":"แทรก/แก้ไข ตาราง","underline":"ขีดเส้นใต้","foreColor":"สีพื้นหน้า","htmlToggle":"ซอร์ส HTML","formatBlock":"ลักษณะย่อหน้า","insertHorizontalRule":"ไม้บรรทัดแนวนอน","delete":"ลบ","insertUnorderedList":"หัวข้อย่อย","tableProp":"คุณสมบัติตาราง","insertImage":"แทรกอิมเมจ","superscript":"ตัวยก","subscript":"ตัวห้อย","createLink":"สร้างลิงก์","undo":"เลิกทำ","i [...]
\ No newline at end of file
+({"removeFormat":"ลบรูปแบบออก","copy":"คัดลอก","paste":"วาง","selectAll":"เลือกทั้งหมด","insertOrderedList":"ลำดับเลข","insertTable":"แทรก/แก้ไข ตาราง","underline":"ขีดเส้นใต้","foreColor":"สีพื้นหน้า","htmlToggle":"ซอร์ส HTML","formatBlock":"ลักษณะย่อหน้า","insertHorizontalRule":"ไม้บรรทัดแนวนอน","delete":"ลบ","insertUnorderedList":"หัวข้อย่อย","tableProp":"คุณสมบัติตาราง","insertImage":"แทรกอิมเมจ","superscript":"ตัวยก","subscript":"ตัวห้อย","createLink":"สร้างลิงก์","undo":"เลิกทำ","i [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/tr/LinkDialog.js b/dijit/_editor/nls/tr/LinkDialog.js
index 7f5856d..2a2491a 100644
--- a/dijit/_editor/nls/tr/LinkDialog.js
+++ b/dijit/_editor/nls/tr/LinkDialog.js
@@ -1 +1 @@
-({"set":"Ayarla","text":"Açıklama:","insertImageTitle":"Resim Özellikleri","url":"URL:","createLinkTitle":"Bağlantı Özellikleri"})
\ No newline at end of file
+({"set":"Ayarla","text":"Açıklama:","insertImageTitle":"Resim Özellikleri","url":"URL:","createLinkTitle":"Bağlantı Özellikleri","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/tr/commands.js b/dijit/_editor/nls/tr/commands.js
index 2a71faa..99c966c 100644
--- a/dijit/_editor/nls/tr/commands.js
+++ b/dijit/_editor/nls/tr/commands.js
@@ -1 +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","createLin [...]
\ No newline at end of file
+({"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","createLin [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/zh-tw/LinkDialog.js b/dijit/_editor/nls/zh-tw/LinkDialog.js
index fb74fb6..7b11c35 100644
--- a/dijit/_editor/nls/zh-tw/LinkDialog.js
+++ b/dijit/_editor/nls/zh-tw/LinkDialog.js
@@ -1 +1 @@
-({"set":"設定","text":"說明:","insertImageTitle":"影像檔內容","url":"URL:","createLinkTitle":"鏈結內容"})
\ No newline at end of file
+({"set":"設定","text":"說明:","insertImageTitle":"影像檔內容","url":"URL:","createLinkTitle":"鏈結內容","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/zh-tw/commands.js b/dijit/_editor/nls/zh-tw/commands.js
index 65d24d6..6a955a4 100644
--- a/dijit/_editor/nls/zh-tw/commands.js
+++ b/dijit/_editor/nls/zh-tw/commands.js
@@ -1 +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":"字 [...]
\ No newline at end of file
+({"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":"字 [...]
\ No newline at end of file
diff --git a/dijit/_editor/nls/zh/LinkDialog.js b/dijit/_editor/nls/zh/LinkDialog.js
index a2148bc..222b71e 100644
--- a/dijit/_editor/nls/zh/LinkDialog.js
+++ b/dijit/_editor/nls/zh/LinkDialog.js
@@ -1 +1 @@
-({"set":"设置","text":"说明:","insertImageTitle":"图像属性","url":"URL:","createLinkTitle":"链接属性"})
\ No newline at end of file
+({"set":"设置","text":"说明:","insertImageTitle":"图像属性","url":"URL:","createLinkTitle":"链接属性","newWindow":"New Window","topWindow":"Topmost Window","target":"Target:","parentWindow":"Parent Window","currentWindow":"Current Window"})
\ No newline at end of file
diff --git a/dijit/_editor/nls/zh/commands.js b/dijit/_editor/nls/zh/commands.js
index 48f9553..4f26d0f 100644
--- a/dijit/_editor/nls/zh/commands.js
+++ b/dijit/_editor/nls/zh/commands.js
@@ -1 +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":"字体大小","s [...]
\ No newline at end of file
+({"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":"字体大小","s [...]
\ No newline at end of file
diff --git a/dijit/_editor/plugins/AlwaysShowToolbar.js b/dijit/_editor/plugins/AlwaysShowToolbar.js
index 827b4df..a86d9ff 100644
--- a/dijit/_editor/plugins/AlwaysShowToolbar.js
+++ b/dijit/_editor/plugins/AlwaysShowToolbar.js
@@ -10,7 +10,6 @@ dojo._hasResource["dijit._editor.plugins.AlwaysShowToolbar"]=true;
 dojo.provide("dijit._editor.plugins.AlwaysShowToolbar");
 dojo.declare("dijit._editor.plugins.AlwaysShowToolbar",dijit._editor._Plugin,{_handleScroll:true,setEditor:function(e){
 if(!e.iframe){
-
 return;
 }
 this.editor=e;
@@ -28,67 +27,66 @@ return;
 if(e.height){
 return;
 }
-var _4=dojo.marginBox(e.editNode).h;
+var _1=dojo.marginBox(e.editNode).h;
 if(dojo.isOpera){
-_4=e.editNode.scrollHeight;
+_1=e.editNode.scrollHeight;
 }
-if(!_4){
-_4=dojo.marginBox(e.document.body).h;
+if(!_1){
+_1=dojo.marginBox(e.document.body).h;
 }
-if(_4==0){
-
+if(_1==0){
 return;
 }
 if(dojo.isIE<=7&&this.editor.minHeight){
-var _5=parseInt(this.editor.minHeight);
-if(_4<_5){
-_4=_5;
+var _2=parseInt(this.editor.minHeight);
+if(_1<_2){
+_1=_2;
 }
 }
-if(_4!=this._lastHeight){
-this._lastHeight=_4;
+if(_1!=this._lastHeight){
+this._lastHeight=_1;
 dojo.marginBox(e.iframe,{h:this._lastHeight});
 }
 },_lastHeight:0,globalOnScrollHandler:function(){
-var _6=dojo.isIE<7;
+var _3=dojo.isIE<7;
 if(!this._handleScroll){
 return;
 }
-var _7=this.editor.toolbar.domNode;
+var _4=this.editor.toolbar.domNode;
 var db=dojo.body;
 if(!this._scrollSetUp){
 this._scrollSetUp=true;
-this._scrollThreshold=dojo._abs(_7,true).y;
+this._scrollThreshold=dojo.position(_4,true).y;
 }
-var _9=dojo._docScroll().y;
-var s=_7.style;
-if(_9>this._scrollThreshold&&_9<this._scrollThreshold+this._lastHeight){
+var _5=dojo._docScroll().y;
+var s=_4.style;
+if(_5>this._scrollThreshold&&_5<this._scrollThreshold+this._lastHeight){
 if(!this._fixEnabled){
-var _b=dojo.marginBox(_7);
-this.editor.iframe.style.marginTop=_b.h+"px";
-if(_6){
-s.left=dojo._abs(_7).x;
-if(_7.previousSibling){
-this._IEOriginalPos=["after",_7.previousSibling];
+var _6=dojo.marginBox(_4);
+this.editor.iframe.style.marginTop=_6.h+"px";
+if(_3){
+s.left=dojo.position(_4).x;
+if(_4.previousSibling){
+this._IEOriginalPos=["after",_4.previousSibling];
 }else{
-if(_7.nextSibling){
-this._IEOriginalPos=["before",_7.nextSibling];
+if(_4.nextSibling){
+this._IEOriginalPos=["before",_4.nextSibling];
 }else{
-this._IEOriginalPos=["last",_7.parentNode];
+this._IEOriginalPos=["last",_4.parentNode];
 }
 }
-dojo.body().appendChild(_7);
-dojo.addClass(_7,"dijitIEFixedToolbar");
+dojo.body().appendChild(_4);
+dojo.addClass(_4,"dijitIEFixedToolbar");
 }else{
 s.position="fixed";
 s.top="0px";
 }
-dojo.marginBox(_7,{w:_b.w});
+dojo.marginBox(_4,{w:_6.w});
 s.zIndex=2000;
 this._fixEnabled=true;
 }
-var _c=(this.height)?parseInt(this.editor.height):this.editor._lastHeight;
-s.display=(_9>this._scrollThreshold+_c)?"none":"";
+var _7=(this.height)?parseInt(this.editor.height):this.editor._lastHeight;
+s.display=(_5>this._scrollThreshold+_7)?"none":"";
 }else{
 if(this._fixEnabled){
 this.editor.iframe.style.marginTop="";
@@ -96,14 +94,14 @@ s.position="";
 s.top="";
 s.zIndex="";
 s.display="";
-if(_6){
+if(_3){
 s.left="";
-dojo.removeClass(_7,"dijitIEFixedToolbar");
+dojo.removeClass(_4,"dijitIEFixedToolbar");
 if(this._IEOriginalPos){
-dojo.place(_7,this._IEOriginalPos[1],this._IEOriginalPos[0]);
+dojo.place(_4,this._IEOriginalPos[1],this._IEOriginalPos[0]);
 this._IEOriginalPos=null;
 }else{
-dojo.place(_7,this.editor.iframe,"before");
+dojo.place(_4,this.editor.iframe,"before");
 }
 }
 s.width="";
diff --git a/dijit/_editor/plugins/EnterKeyHandling.js b/dijit/_editor/plugins/EnterKeyHandling.js
index e3ddb36..ece69d8 100644
--- a/dijit/_editor/plugins/EnterKeyHandling.js
+++ b/dijit/_editor/plugins/EnterKeyHandling.js
@@ -8,6 +8,7 @@
 if(!dojo._hasResource["dijit._editor.plugins.EnterKeyHandling"]){
 dojo._hasResource["dijit._editor.plugins.EnterKeyHandling"]=true;
 dojo.provide("dijit._editor.plugins.EnterKeyHandling");
+dojo.require("dijit._base.scroll");
 dojo.declare("dijit._editor.plugins.EnterKeyHandling",dijit._editor._Plugin,{blockNodeForEnter:"BR",constructor:function(_1){
 if(_1){
 dojo.mixin(this,_1);
@@ -38,45 +39,37 @@ _2.addKeyHandler(13,0,1,h);
 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)){
-var _9=dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,["LI"]);
-if(!_9){
+var _3=dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,["LI"]);
+if(!_3){
 dijit._editor.RichText.prototype.execCommand.call(this.editor,"formatblock",this.blockNodeForEnter);
-var _a=dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,[this.blockNodeForEnter]);
-if(_a){
-_a.innerHTML=this.bogusHtmlContent;
+var _4=dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,[this.blockNodeForEnter]);
+if(_4){
+_4.innerHTML=this.bogusHtmlContent;
 if(dojo.isIE){
 var r=this.editor.document.selection.createRange();
 r.move("character",-1);
 r.select();
 }
 }else{
-alert("onKeyPressed: Can not find the new block node");
+console.error("onKeyPressed: Cannot find the new block node");
 }
 }else{
 if(dojo.isMoz){
-if(_9.parentNode.parentNode.nodeName=="LI"){
-_9=_9.parentNode.parentNode;
+if(_3.parentNode.parentNode.nodeName=="LI"){
+_3=_3.parentNode.parentNode;
 }
 }
-var fc=_9.firstChild;
+var fc=_3.firstChild;
 if(fc&&fc.nodeType==1&&(fc.nodeName=="UL"||fc.nodeName=="OL")){
-_9.insertBefore(fc.ownerDocument.createTextNode(" "),fc);
-var _d=dijit.range.create();
-_d.setStart(_9.firstChild,0);
-var _e=dijit.range.getSelection(this.editor.window,true);
-_e.removeAllRanges();
-_e.addRange(_d);
+_3.insertBefore(fc.ownerDocument.createTextNode(" "),fc);
+var _5=dijit.range.create(this.editor.window);
+_5.setStart(_3.firstChild,0);
+var _6=dijit.range.getSelection(this.editor.window,true);
+_6.removeAllRanges();
+_6.addRange(_5);
 }
 }
 }
@@ -89,47 +82,46 @@ this.removeTrailingBr(this._pressedEnterInBlock.previousSibling);
 delete this._pressedEnterInBlock;
 }
 },bogusHtmlContent:" ",blockNodes:/^(?:P|H1|H2|H3|H4|H5|H6|LI)$/,handleEnterKey:function(e){
-if(!this.blockNodeForEnter){
-return true;
-}
-var _10,_11,_12,doc=this.editor.document,br;
-if(e.shiftKey||this.blockNodeForEnter=="BR"){
-var _15=dojo.withGlobal(this.editor.window,"getParentElement",dijit._editor.selection);
-var _16=dijit.range.getAncestor(_15,this.blockNodes);
-if(_16){
-if(!e.shiftKey&&_16.tagName=="LI"){
+var _7,_8,_9,_a=this.editor.document,br;
+if(e.shiftKey){
+var _b=dojo.withGlobal(this.editor.window,"getParentElement",dijit._editor.selection);
+var _c=dijit.range.getAncestor(_b,this.blockNodes);
+if(_c){
+if(!e.shiftKey&&_c.tagName=="LI"){
 return true;
 }
-_10=dijit.range.getSelection(this.editor.window);
-_11=_10.getRangeAt(0);
-if(!_11.collapsed){
-_11.deleteContents();
+_7=dijit.range.getSelection(this.editor.window);
+_8=_7.getRangeAt(0);
+if(!_8.collapsed){
+_8.deleteContents();
+_7=dijit.range.getSelection(this.editor.window);
+_8=_7.getRangeAt(0);
 }
-if(dijit.range.atBeginningOfContainer(_16,_11.startContainer,_11.startOffset)){
+if(dijit.range.atBeginningOfContainer(_c,_8.startContainer,_8.startOffset)){
 if(e.shiftKey){
-br=doc.createElement("br");
-_12=dijit.range.create();
-_16.insertBefore(br,_16.firstChild);
-_12.setStartBefore(br.nextSibling);
-_10.removeAllRanges();
-_10.addRange(_12);
+br=_a.createElement("br");
+_9=dijit.range.create(this.editor.window);
+_c.insertBefore(br,_c.firstChild);
+_9.setStartBefore(br.nextSibling);
+_7.removeAllRanges();
+_7.addRange(_9);
 }else{
-dojo.place(br,_16,"before");
+dojo.place(br,_c,"before");
 }
 }else{
-if(dijit.range.atEndOfContainer(_16,_11.startContainer,_11.startOffset)){
-_12=dijit.range.create();
-br=doc.createElement("br");
+if(dijit.range.atEndOfContainer(_c,_8.startContainer,_8.startOffset)){
+_9=dijit.range.create(this.editor.window);
+br=_a.createElement("br");
 if(e.shiftKey){
-_16.appendChild(br);
-_16.appendChild(doc.createTextNode(" "));
-_12.setStart(_16.lastChild,0);
+_c.appendChild(br);
+_c.appendChild(_a.createTextNode(" "));
+_9.setStart(_c.lastChild,0);
 }else{
-dojo.place(br,_16,"after");
-_12.setStartAfter(_16);
+dojo.place(br,_c,"after");
+_9.setStartAfter(_c);
 }
-_10.removeAllRanges();
-_10.addRange(_12);
+_7.removeAllRanges();
+_7.addRange(_9);
 }else{
 return true;
 }
@@ -139,257 +131,232 @@ dijit._editor.RichText.prototype.execCommand.call(this.editor,"inserthtml","<br>
 }
 return false;
 }
-var _17=true;
-_10=dijit.range.getSelection(this.editor.window);
-_11=_10.getRangeAt(0);
-if(!_11.collapsed){
-_11.deleteContents();
-}
-var _18=dijit.range.getBlockAncestor(_11.endContainer,null,this.editor.editNode);
-var _19=_18.blockNode;
-if((this._checkListLater=(_19&&(_19.nodeName=="LI"||_19.parentNode.nodeName=="LI")))){
+var _d=true;
+_7=dijit.range.getSelection(this.editor.window);
+_8=_7.getRangeAt(0);
+if(!_8.collapsed){
+_8.deleteContents();
+_7=dijit.range.getSelection(this.editor.window);
+_8=_7.getRangeAt(0);
+}
+var _e=dijit.range.getBlockAncestor(_8.endContainer,null,this.editor.editNode);
+var _f=_e.blockNode;
+if((this._checkListLater=(_f&&(_f.nodeName=="LI"||_f.parentNode.nodeName=="LI")))){
 if(dojo.isMoz){
-this._pressedEnterInBlock=_19;
+this._pressedEnterInBlock=_f;
+}
+if(/^(\s| |\xA0|<span\b[^>]*\bclass=['"]Apple-style-span['"][^>]*>(\s| |\xA0)<\/span>)?(<br>)?$/.test(_f.innerHTML)){
+_f.innerHTML="";
+if(dojo.isWebKit){
+_9=dijit.range.create(this.editor.window);
+_9.setStart(_f,0);
+_7.removeAllRanges();
+_7.addRange(_9);
 }
-if(/^(?:\s| )$/.test(_19.innerHTML)){
-_19.innerHTML="";
+this._checkListLater=false;
 }
 return true;
 }
-if(!_18.blockNode||_18.blockNode===this.editor.editNode){
+if(!_e.blockNode||_e.blockNode===this.editor.editNode){
+try{
 dijit._editor.RichText.prototype.execCommand.call(this.editor,"formatblock",this.blockNodeForEnter);
-_18={blockNode:dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,[this.blockNodeForEnter]),blockContainer:this.editor.editNode};
-if(_18.blockNode){
-if(!(_18.blockNode.textContent||_18.blockNode.innerHTML).replace(/^\s+|\s+$/g,"").length){
-this.removeTrailingBr(_18.blockNode);
+}
+catch(e2){
+}
+_e={blockNode:dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,[this.blockNodeForEnter]),blockContainer:this.editor.editNode};
+if(_e.blockNode){
+if(_e.blockNode!=this.editor.editNode&&(!(_e.blockNode.textContent||_e.blockNode.innerHTML).replace(/^\s+|\s+$/g,"").length)){
+this.removeTrailingBr(_e.blockNode);
 return false;
 }
 }else{
-_18.blockNode=this.editor.editNode;
+_e.blockNode=this.editor.editNode;
 }
-_10=dijit.range.getSelection(this.editor.window);
-_11=_10.getRangeAt(0);
+_7=dijit.range.getSelection(this.editor.window);
+_8=_7.getRangeAt(0);
 }
-var _1a=doc.createElement(this.blockNodeForEnter);
-_1a.innerHTML=this.bogusHtmlContent;
-this.removeTrailingBr(_18.blockNode);
-if(dijit.range.atEndOfContainer(_18.blockNode,_11.endContainer,_11.endOffset)){
-if(_18.blockNode===_18.blockContainer){
-_18.blockNode.appendChild(_1a);
+var _10=_a.createElement(this.blockNodeForEnter);
+_10.innerHTML=this.bogusHtmlContent;
+this.removeTrailingBr(_e.blockNode);
+if(dijit.range.atEndOfContainer(_e.blockNode,_8.endContainer,_8.endOffset)){
+if(_e.blockNode===_e.blockContainer){
+_e.blockNode.appendChild(_10);
 }else{
-dojo.place(_1a,_18.blockNode,"after");
+dojo.place(_10,_e.blockNode,"after");
 }
-_17=false;
-_12=dijit.range.create();
-_12.setStart(_1a,0);
-_10.removeAllRanges();
-_10.addRange(_12);
+_d=false;
+_9=dijit.range.create(this.editor.window);
+_9.setStart(_10,0);
+_7.removeAllRanges();
+_7.addRange(_9);
 if(this.editor.height){
-_1a.scrollIntoView(false);
+dijit.scrollIntoView(_10);
 }
 }else{
-if(dijit.range.atBeginningOfContainer(_18.blockNode,_11.startContainer,_11.startOffset)){
-dojo.place(_1a,_18.blockNode,_18.blockNode===_18.blockContainer?"first":"before");
-if(_1a.nextSibling&&this.editor.height){
-_1a.nextSibling.scrollIntoView(false);
-}
-_17=false;
+if(dijit.range.atBeginningOfContainer(_e.blockNode,_8.startContainer,_8.startOffset)){
+dojo.place(_10,_e.blockNode,_e.blockNode===_e.blockContainer?"first":"before");
+if(_10.nextSibling&&this.editor.height){
+_9=dijit.range.create(this.editor.window);
+_9.setStart(_10.nextSibling,0);
+_7.removeAllRanges();
+_7.addRange(_9);
+dijit.scrollIntoView(_10.nextSibling);
+}
+_d=false;
 }else{
 if(dojo.isMoz){
-this._pressedEnterInBlock=_18.blockNode;
+this._pressedEnterInBlock=_e.blockNode;
 }
 }
 }
-return _17;
-},removeTrailingBr:function(_1b){
-var _1c=/P|DIV|LI/i.test(_1b.tagName)?_1b:dijit._editor.selection.getParentOfType(_1b,["P","DIV","LI"]);
-if(!_1c){
+return _d;
+},removeTrailingBr:function(_11){
+var _12=/P|DIV|LI/i.test(_11.tagName)?_11:dijit._editor.selection.getParentOfType(_11,["P","DIV","LI"]);
+if(!_12){
 return;
 }
-if(_1c.lastChild){
-if((_1c.childNodes.length>1&&_1c.lastChild.nodeType==3&&/^[\s\xAD]*$/.test(_1c.lastChild.nodeValue))||(_1c.lastChild&&_1c.lastChild.tagName=="BR")){
-dojo.destroy(_1c.lastChild);
+if(_12.lastChild){
+if((_12.childNodes.length>1&&_12.lastChild.nodeType==3&&/^[\s\xAD]*$/.test(_12.lastChild.nodeValue))||_12.lastChild.tagName=="BR"){
+dojo.destroy(_12.lastChild);
 }
 }
-if(!_1c.childNodes.length){
-_1c.innerHTML=this.bogusHtmlContent;
+if(!_12.childNodes.length){
+_12.innerHTML=this.bogusHtmlContent;
 }
 },_fixNewLineBehaviorForIE:function(d){
-if(this.editor.document.__INSERTED_EDITIOR_NEWLINE_CSS===undefined){
-var _1e="p{margin:0 !important;}";
-var _1f=function(_20,doc,URI){
-if(!_20){
-return null;
-}
-if(!doc){
-doc=document;
-}
-var _23=doc.createElement("style");
-_23.setAttribute("type","text/css");
-var _24=doc.getElementsByTagName("head")[0];
-if(!_24){
-
-return null;
-}else{
-_24.appendChild(_23);
-}
-if(_23.styleSheet){
-var _25=function(){
-try{
-_23.styleSheet.cssText=_20;
-}
-catch(e){
-
-}
-};
-if(_23.styleSheet.disabled){
-setTimeout(_25,10);
-}else{
-_25();
-}
-}else{
-var _26=doc.createTextNode(_20);
-_23.appendChild(_26);
-}
-return _23;
-};
-_1f(_1e,this.editor.document);
+var doc=this.editor.document;
+if(doc.__INSERTED_EDITIOR_NEWLINE_CSS===undefined){
+var _13=dojo.create("style",{type:"text/css"},doc.getElementsByTagName("head")[0]);
+_13.styleSheet.cssText="p{margin:0;}";
 this.editor.document.__INSERTED_EDITIOR_NEWLINE_CSS=true;
-return d;
 }
-return null;
-},regularPsToSingleLinePs:function(_27,_28){
-function _29(el){
-function _2b(_2c){
-var _2d=_2c[0].ownerDocument.createElement("p");
-_2c[0].parentNode.insertBefore(_2d,_2c[0]);
-dojo.forEach(_2c,function(_2e){
-_2d.appendChild(_2e);
+return d;
+},regularPsToSingleLinePs:function(_14,_15){
+function _16(el){
+function _17(_18){
+var _19=_18[0].ownerDocument.createElement("p");
+_18[0].parentNode.insertBefore(_19,_18[0]);
+dojo.forEach(_18,function(_1a){
+_19.appendChild(_1a);
 });
 };
-var _2f=0;
-var _30=[];
-var _31;
-while(_2f<el.childNodes.length){
-_31=el.childNodes[_2f];
-if(_31.nodeType==3||(_31.nodeType==1&&_31.nodeName!="BR"&&dojo.style(_31,"display")!="block")){
-_30.push(_31);
+var _1b=0;
+var _1c=[];
+var _1d;
+while(_1b<el.childNodes.length){
+_1d=el.childNodes[_1b];
+if(_1d.nodeType==3||(_1d.nodeType==1&&_1d.nodeName!="BR"&&dojo.style(_1d,"display")!="block")){
+_1c.push(_1d);
 }else{
-var _32=_31.nextSibling;
-if(_30.length){
-_2b(_30);
-_2f=(_2f+1)-_30.length;
-if(_31.nodeName=="BR"){
-dojo.destroy(_31);
+var _1e=_1d.nextSibling;
+if(_1c.length){
+_17(_1c);
+_1b=(_1b+1)-_1c.length;
+if(_1d.nodeName=="BR"){
+dojo.destroy(_1d);
 }
 }
-_30=[];
+_1c=[];
 }
-_2f++;
+_1b++;
 }
-if(_30.length){
-_2b(_30);
+if(_1c.length){
+_17(_1c);
 }
 };
-function _33(el){
-var _35=null;
-var _36=[];
-var _37=el.childNodes.length-1;
-for(var i=_37;i>=0;i--){
-_35=el.childNodes[i];
-if(_35.nodeName=="BR"){
-var _39=_35.ownerDocument.createElement("p");
-dojo.place(_39,el,"after");
-if(_36.length==0&&i!=_37){
-_39.innerHTML=" ";
-}
-dojo.forEach(_36,function(_3a){
-_39.appendChild(_3a);
+function _1f(el){
+var _20=null;
+var _21=[];
+var _22=el.childNodes.length-1;
+for(var i=_22;i>=0;i--){
+_20=el.childNodes[i];
+if(_20.nodeName=="BR"){
+var _23=_20.ownerDocument.createElement("p");
+dojo.place(_23,el,"after");
+if(_21.length==0&&i!=_22){
+_23.innerHTML=" ";
+}
+dojo.forEach(_21,function(_24){
+_23.appendChild(_24);
 });
-dojo.destroy(_35);
-_36=[];
+dojo.destroy(_20);
+_21=[];
 }else{
-_36.unshift(_35);
+_21.unshift(_20);
 }
 }
 };
-var _3b=[];
-var ps=_27.getElementsByTagName("p");
+var _25=[];
+var ps=_14.getElementsByTagName("p");
 dojo.forEach(ps,function(p){
-_3b.push(p);
+_25.push(p);
 });
-dojo.forEach(_3b,function(p){
-if((p.previousSibling)&&(p.previousSibling.nodeName=="P"||dojo.style(p.previousSibling,"display")!="block")){
-var _3f=p.parentNode.insertBefore(this.document.createElement("p"),p);
-_3f.innerHTML=_28?"":" ";
+dojo.forEach(_25,function(p){
+var _26=p.previousSibling;
+if((_26)&&(_26.nodeType==1)&&(_26.nodeName=="P"||dojo.style(_26,"display")!="block")){
+var _27=p.parentNode.insertBefore(this.document.createElement("p"),p);
+_27.innerHTML=_15?"":" ";
 }
-_33(p);
+_1f(p);
 },this.editor);
-_29(_27);
-return _27;
-},singleLinePsToRegularPs:function(_40){
-function _41(_42){
-var ps=_42.getElementsByTagName("p");
-var _44=[];
+_16(_14);
+return _14;
+},singleLinePsToRegularPs:function(_28){
+function _29(_2a){
+var ps=_2a.getElementsByTagName("p");
+var _2b=[];
 for(var i=0;i<ps.length;i++){
 var p=ps[i];
-var _47=false;
-for(var k=0;k<_44.length;k++){
-if(_44[k]===p.parentNode){
-_47=true;
+var _2c=false;
+for(var k=0;k<_2b.length;k++){
+if(_2b[k]===p.parentNode){
+_2c=true;
 break;
 }
 }
-if(!_47){
-_44.push(p.parentNode);
+if(!_2c){
+_2b.push(p.parentNode);
 }
 }
-return _44;
+return _2b;
 };
-function _49(_4a){
-if(_4a.nodeType!=1||_4a.tagName!="P"){
-return dojo.style(_4a,"display")=="block";
-}else{
-if(!_4a.childNodes.length||_4a.innerHTML==" "){
-return true;
-}
-}
-return false;
+function _2d(_2e){
+return (!_2e.childNodes.length||_2e.innerHTML==" ");
 };
-var _4b=_41(_40);
-for(var i=0;i<_4b.length;i++){
-var _4d=_4b[i];
-var _4e=null;
-var _4f=_4d.firstChild;
-var _50=null;
-while(_4f){
-if(_4f.nodeType!="1"||_4f.tagName!="P"){
-_4e=null;
+var _2f=_29(_28);
+for(var i=0;i<_2f.length;i++){
+var _30=_2f[i];
+var _31=null;
+var _32=_30.firstChild;
+var _33=null;
+while(_32){
+if(_32.nodeType!=1||_32.tagName!="P"||(_32.getAttributeNode("style")||{}).specified){
+_31=null;
 }else{
-if(_49(_4f)){
-_50=_4f;
-_4e=null;
+if(_2d(_32)){
+_33=_32;
+_31=null;
 }else{
-if(_4e==null){
-_4e=_4f;
+if(_31==null){
+_31=_32;
 }else{
-if((!_4e.lastChild||_4e.lastChild.nodeName!="BR")&&(_4f.firstChild)&&(_4f.firstChild.nodeName!="BR")){
-_4e.appendChild(this.editor.document.createElement("br"));
+if((!_31.lastChild||_31.lastChild.nodeName!="BR")&&(_32.firstChild)&&(_32.firstChild.nodeName!="BR")){
+_31.appendChild(this.editor.document.createElement("br"));
 }
-while(_4f.firstChild){
-_4e.appendChild(_4f.firstChild);
+while(_32.firstChild){
+_31.appendChild(_32.firstChild);
 }
-_50=_4f;
+_33=_32;
 }
 }
 }
-_4f=_4f.nextSibling;
-if(_50){
-dojo.destroy(_50);
-_50=null;
+_32=_32.nextSibling;
+if(_33){
+dojo.destroy(_33);
+_33=null;
 }
 }
 }
-return _40;
+return _28;
 }});
 }
diff --git a/dijit/_editor/plugins/FontChoice.js b/dijit/_editor/plugins/FontChoice.js
index 099189f..f5add30 100644
--- a/dijit/_editor/plugins/FontChoice.js
+++ b/dijit/_editor/plugins/FontChoice.js
@@ -9,93 +9,133 @@ if(!dojo._hasResource["dijit._editor.plugins.FontChoice"]){
 dojo._hasResource["dijit._editor.plugins.FontChoice"]=true;
 dojo.provide("dijit._editor.plugins.FontChoice");
 dojo.require("dijit._editor._Plugin");
+dojo.require("dijit._editor.range");
 dojo.require("dijit.form.FilteringSelect");
 dojo.require("dojo.data.ItemFileReadStore");
 dojo.require("dojo.i18n");
 dojo.requireLocalization("dijit._editor","FontChoice",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
-dojo.declare("dijit._editor.plugins.FontChoice",dijit._editor._Plugin,{_uniqueId:0,buttonClass:dijit.form.FilteringSelect,useDefaultCommand:false,_initButton:function(){
-var _1=this.command;
-var _2=this.custom||{fontName:this.generic?["serif","sans-serif","monospace","cursive","fantasy"]:["Arial","Times New Roman","Comic Sans MS","Courier New"],fontSize:[1,2,3,4,5,6,7],formatBlock:["p","h1","h2","h3","pre"]}[_1];
-this._availableValues=_2;
-var _3=dojo.i18n.getLocalization("dijit._editor","FontChoice");
-var _4=dojo.map(_2,function(_5){
-var _6=_3[_5]||_5;
-var _7=_6;
-switch(_1){
-case "fontName":
-_7="<div style='font-family: "+_5+"'>"+_6+"</div>";
-break;
-case "fontSize":
-_7="<font size="+_5+"'>"+_6+"</font>";
-break;
-case "formatBlock":
-_7="<"+_5+">"+_6+"</"+_5+">";
+dojo.declare("dijit._editor.plugins._FontDropDown",[dijit._Widget,dijit._Templated],{label:"",widgetsInTemplate:true,plainText:false,templateString:"<span style='white-space: nowrap' class='dijit dijitReset dijitInline'>"+"<label class='dijitLeft dijitInline' for='${selectId}'>${label}</label>"+"<input dojoType='dijit.form.FilteringSelect' required=false labelType=html labelAttr=label searchAttr=name "+"tabIndex='-1' id='${selectId}' dojoAttachPoint='select' value=''/>"+"</span>",postMix [...]
+this.inherited(arguments);
+this.strings=dojo.i18n.getLocalization("dijit._editor","FontChoice");
+this.label=this.strings[this.command];
+this.id=dijit.getUniqueId(this.declaredClass.replace(/\./g,"_"));
+this.selectId=this.id+"_select";
+this.inherited(arguments);
+},postCreate:function(){
+var _1=dojo.map(this.values,function(_2){
+var _3=this.strings[_2]||_2;
+return {label:this.getLabel(_2,_3),name:_3,value:_2};
+},this);
+this.select.store=new dojo.data.ItemFileReadStore({data:{identifier:"value",items:_1}});
+this.select.attr("value","",false);
+this.disabled=this.select.attr("disabled");
+},_setValueAttr:function(_4,_5){
+_5=_5!==false?true:false;
+this.select.attr("value",dojo.indexOf(this.values,_4)<0?"":_4,_5);
+if(!_5){
+this.select._lastValueReported=null;
+}
+},_getValueAttr:function(){
+return this.select.attr("value");
+},focus:function(){
+this.select.focus();
+},_setDisabledAttr:function(_6){
+this.disabled=_6;
+this.select.attr("disabled",_6);
+}});
+dojo.declare("dijit._editor.plugins._FontNameDropDown",dijit._editor.plugins._FontDropDown,{generic:false,command:"fontName",postMixInProperties:function(){
+if(!this.values){
+this.values=this.generic?["serif","sans-serif","monospace","cursive","fantasy"]:["Arial","Times New Roman","Comic Sans MS","Courier New"];
 }
-return {label:_7,name:_6,value:_5};
-});
-this.inherited(arguments,[{required:false,labelType:"html",labelAttr:"label",searchAttr:"name",store:new dojo.data.ItemFileReadStore({data:{identifier:"value",items:_4}})}]);
-this.button.attr("value","");
-this.connect(this.button,"onChange",function(_8){
-if(this.updating){
-return;
+this.inherited(arguments);
+},getLabel:function(_7,_8){
+if(this.plainText){
+return _8;
+}else{
+return "<div style='font-family: "+_7+"'>"+_8+"</div>";
 }
-if(dojo.isIE||!this._focusHandle){
-this.editor.focus();
+},_setValueAttr:function(_9,_a){
+_a=_a!==false?true:false;
+if(this.generic){
+var _b={"Arial":"sans-serif","Helvetica":"sans-serif","Myriad":"sans-serif","Times":"serif","Times New Roman":"serif","Comic Sans MS":"cursive","Apple Chancery":"cursive","Courier":"monospace","Courier New":"monospace","Papyrus":"fantasy"};
+_9=_b[_9]||_9;
+}
+this.inherited(arguments,[_9,_a]);
+}});
+dojo.declare("dijit._editor.plugins._FontSizeDropDown",dijit._editor.plugins._FontDropDown,{command:"fontSize",values:[1,2,3,4,5,6,7],getLabel:function(_c,_d){
+if(this.plainText){
+return _d;
 }else{
-dijit.focus(this._focusHandle);
+return "<font size="+_c+"'>"+_d+"</font>";
 }
-if(this.command=="fontName"&&_8.indexOf(" ")!=-1){
-_8="'"+_8+"'";
+},_setValueAttr:function(_e,_f){
+_f=_f!==false?true:false;
+if(_e.indexOf&&_e.indexOf("px")!=-1){
+var _10=parseInt(_e,10);
+_e={10:1,13:2,16:3,18:4,24:5,32:6,48:7}[_10]||_e;
 }
-this.editor.execCommand(this.editor._normalizeCommand(this.command),_8);
+this.inherited(arguments,[_e,_f]);
+}});
+dojo.declare("dijit._editor.plugins._FormatBlockDropDown",dijit._editor.plugins._FontDropDown,{command:"formatBlock",values:["p","h1","h2","h3","pre"],getLabel:function(_11,_12){
+if(this.plainText){
+return _12;
+}else{
+return "<"+_11+">"+_12+"</"+_11+">";
+}
+}});
+dojo.declare("dijit._editor.plugins.FontChoice",dijit._editor._Plugin,{useDefaultCommand:false,_initButton:function(){
+var _13={fontName:dijit._editor.plugins._FontNameDropDown,fontSize:dijit._editor.plugins._FontSizeDropDown,formatBlock:dijit._editor.plugins._FormatBlockDropDown}[this.command],_14=this.params;
+if(this.params.custom){
+_14.values=this.params.custom;
+}
+this.button=new _13(_14);
+this.connect(this.button.select,"onChange",function(_15){
+this.editor.focus();
+if(this.command=="fontName"&&_15.indexOf(" ")!=-1){
+_15="'"+_15+"'";
+}
+this.editor.execCommand(this.command,_15);
 });
 },updateState:function(){
-this.inherited(arguments);
-var _e=this.editor;
-var _c=this.command;
-if(!_e||!_e.isLoaded||!_c.length){
+var _16=this.editor;
+var _17=this.command;
+if(!_16||!_16.isLoaded||!_17.length){
 return;
 }
 if(this.button){
-var _b;
+var _18;
 try{
-_b=_e.queryCommandValue(_c)||"";
+_18=_16.queryCommandValue(_17)||"";
 }
 catch(e){
-_b="";
+_18="";
 }
-var _c=dojo.isString(_b)&&_b.match(/'([^']*)'/);
-if(_c){
-_b=_c[1];
+var _19=dojo.isString(_18)&&_18.match(/'([^']*)'/);
+if(_19){
+_18=_19[1];
 }
-if(this.generic&&_c=="fontName"){
-var _d={"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"};
-_b=_d[_b]||_b;
-}else{
-if(_c=="fontSize"&&_b.indexOf&&_b.indexOf("px")!=-1){
-var _e=parseInt(_b);
-_b={10:1,13:2,16:3,18:4,24:5,32:6,48:7}[_e]||_b;
+if(!_18&&_17==="formatBlock"){
+var _1a;
+var sel=dijit.range.getSelection(this.editor.window);
+if(sel&&sel.rangeCount>0){
+var _1b=sel.getRangeAt(0);
+if(_1b){
+_1a=_1b.endContainer;
 }
 }
-this.updating=true;
-this.button.attr("value",dojo.indexOf(this._availableValues,_b)<0?"":_b);
-delete this.updating;
+while(_1a&&_1a!==_16.editNode&&_1a!==_16.document){
+var tg=_1a.tagName?_1a.tagName.toLowerCase():"";
+if(tg&&dojo.indexOf(this.button.values,tg)>-1){
+_18=tg;
+break;
+}
+_1a=_1a.parentNode;
+}
+}
+if(_18!==this.button.attr("value")){
+this.button.attr("value",_18,false);
 }
-if(this.editor.iframe){
-this._focusHandle=dijit.getFocus(this.editor.iframe);
 }
-},setToolbar:function(){
-this.inherited(arguments);
-var _f=this.button;
-if(!_f.id){
-_f.id=dijit._scopeName+"EditorButton-"+this.command+(this._uniqueId++);
-}
-var _10=dojo.doc.createElement("label");
-dojo.addClass(_10,"dijit dijitReset dijitLeft dijitInline");
-_10.setAttribute("for",_f.id);
-var _11=dojo.i18n.getLocalization("dijit._editor","FontChoice");
-_10.appendChild(dojo.doc.createTextNode(_11[this.command]));
-dojo.place(_10,this.button.domNode,"before");
 }});
 dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
 if(o.plugin){
@@ -105,7 +145,7 @@ switch(o.args.name){
 case "fontName":
 case "fontSize":
 case "formatBlock":
-o.plugin=new dijit._editor.plugins.FontChoice({command:o.args.name});
+o.plugin=new dijit._editor.plugins.FontChoice({command:o.args.name,plainText:o.args.plainText?o.args.plainText:false});
 }
 });
 }
diff --git a/dijit/_editor/plugins/FullScreen.js b/dijit/_editor/plugins/FullScreen.js
new file mode 100644
index 0000000..25c9561
--- /dev/null
+++ b/dijit/_editor/plugins/FullScreen.js
@@ -0,0 +1,198 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dijit._editor.plugins.FullScreen"]){
+dojo._hasResource["dijit._editor.plugins.FullScreen"]=true;
+dojo.provide("dijit._editor.plugins.FullScreen");
+dojo.require("dijit._editor._Plugin");
+dojo.require("dijit.form.Button");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dijit._editor","commands",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
+dojo.declare("dijit._editor.plugins.FullScreen",dijit._editor._Plugin,{zIndex:500,_origState:null,_origiFrameState:null,_resizeHandle:null,isFullscreen:false,toggle:function(){
+this.button.attr("checked",!this.button.attr("checked"));
+},_initButton:function(){
+var _1=dojo.i18n.getLocalization("dijit._editor","commands");
+this.button=new dijit.form.ToggleButton({label:_1["fullScreen"],showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"FullScreen",tabIndex:"-1",onChange:dojo.hitch(this,"_setFullScreen")});
+},setEditor:function(_2){
+this.editor=_2;
+this._initButton();
+this.editor.addKeyHandler(dojo.keys.F11,true,true,dojo.hitch(this,function(e){
+this.toggle();
+dojo.stopEvent(e);
+setTimeout(dojo.hitch(this,function(){
+this.editor.focus();
+}),250);
+return true;
+}));
+this.connect(this.editor.domNode,"onkeydown","_containFocus");
+},_containFocus:function(e){
+if(this.isFullscreen){
+var ed=this.editor;
+if(!ed.isTabIndent&&ed._fullscreen_oldOnKeyDown&&e.keyCode===dojo.keys.TAB){
+var f=dijit.getFocus();
+var _3=this._getAltViewNode();
+if(f.node==ed.iframe||(_3&&f.node===_3)){
+setTimeout(dojo.hitch(this,function(){
+ed.toolbar.focus();
+}),10);
+}else{
+if(_3&&dojo.style(ed.iframe,"display")==="none"){
+setTimeout(dojo.hitch(this,function(){
+dijit.focus(_3);
+}),10);
+}else{
+setTimeout(dojo.hitch(this,function(){
+ed.focus();
+}),10);
+}
+}
+dojo.stopEvent(e);
+}else{
+if(ed._fullscreen_oldOnKeyDown){
+ed._fullscreen_oldOnKeyDown(e);
+}
+}
+}
+},_resizeEditor:function(){
+var vp=dijit.getViewport();
+dojo.marginBox(this.editor.domNode,{w:vp.w,h:vp.h});
+var _4=dojo.marginBox(this.editor.toolbar.domNode);
+var _5=dojo._getPadBorderExtents(this.editor.domNode);
+var _6=vp.h-(_4.h+_5.h);
+dojo.marginBox(this.editor.iframe.parentNode,{h:_6});
+dojo.marginBox(this.editor.iframe,{h:_6});
+},_getAltViewNode:function(){
+},_setFullScreen:function(_7){
+var vp=dijit.getViewport();
+var ed=this.editor;
+var _8=dojo.body();
+var _9=ed.domNode.parentNode;
+this.isFullscreen=_7;
+if(_7){
+while(_9&&_9!==dojo.body()){
+dojo.addClass(_9,"dijitForceStatic");
+_9=_9.parentNode;
+}
+this._editorResizeHolder=this.editor.resize;
+ed.resize=function(){
+};
+ed._fullscreen_oldOnKeyDown=ed.onKeyDown;
+ed.onKeyDown=dojo.hitch(this,this._containFocus);
+this._origState={};
+this._origiFrameState={};
+var _a=ed.domNode,_b=_a&&_a.style||{};
+this._origState={width:_b.width||"",height:_b.height||"",top:dojo.style(_a,"top")||"",left:dojo.style(_a,"left")||"",position:dojo.style(_a,"position")||"static"};
+var _c=ed.iframe,_d=_c&&_c.style||{};
+var bc=dojo.style(ed.iframe,"backgroundColor");
+this._origiFrameState={backgroundColor:bc||"transparent",width:_d.width||"auto",height:_d.height||"auto",zIndex:_d.zIndex||""};
+dojo.style(ed.domNode,{position:"absolute",top:"0px",left:"0px",zIndex:this.zIndex,width:vp.w+"px",height:vp.h+"px"});
+dojo.style(ed.iframe,{height:"100%",width:"100%",zIndex:this.zIndex,backgroundColor:bc!=="transparent"&&bc!=="rgba(0, 0, 0, 0)"?bc:"white"});
+dojo.style(ed.iframe.parentNode,{height:"95%",width:"100%"});
+if(_8.style&&_8.style.overflow){
+this._oldOverflow=dojo.style(_8,"overflow");
+}else{
+this._oldOverflow="";
+}
+if(dojo.isIE&&!dojo.isQuirks){
+if(_8.parentNode&&_8.parentNode.style&&_8.parentNode.style.overflow){
+this._oldBodyParentOverflow=_8.parentNode.style.overflow;
+}else{
+this._oldBodyParentOverflow="scroll";
+}
+dojo.style(_8.parentNode,"overflow","hidden");
+}
+dojo.style(_8,"overflow","hidden");
+var _e=function(){
+var vp=dijit.getViewport();
+if("_prevW" in this&&"_prevH" in this){
+if(vp.w===this._prevW&&vp.h===this._prevH){
+return;
+}
+}else{
+this._prevW=vp.w;
+this._prevH=vp.h;
+}
+if(this._resizer){
+clearTimeout(this._resizer);
+delete this._resizer;
+}
+this._resizer=setTimeout(dojo.hitch(this,function(){
+delete this._resizer;
+this._resizeEditor();
+}),10);
+};
+this._resizeHandle=dojo.connect(window,"onresize",this,_e);
+this._resizeEditor();
+var dn=this.editor.toolbar.domNode;
+setTimeout(function(){
+dijit.scrollIntoView(dn);
+},250);
+}else{
+if(this._editorResizeHolder){
+this.editor.resize=this._editorResizeHolder;
+}
+if(!this._origState&&!this._origiFrameState){
+return;
+}
+if(ed._fullscreen_oldOnKeyDown){
+ed.onKeyDown=ed._fullscreen_oldOnKeyDown;
+delete ed._fullscreen_oldOnKeyDown;
+}
+if(this._resizeHandle){
+dojo.disconnect(this._resizeHandle);
+this._resizeHandle=null;
+}
+if(this._rst){
+clearTimeout(this._rst);
+this._rst=null;
+}
+while(_9&&_9!==dojo.body()){
+dojo.removeClass(_9,"dijitForceStatic");
+_9=_9.parentNode;
+}
+var _f=this;
+setTimeout(function(){
+if(dojo.isIE&&!dojo.isQuirks){
+_8.parentNode.style.overflow=_f._oldBodyParentOverflow;
+delete _f._oldBodyParentOverflow;
+}
+dojo.style(_8,"overflow",_f._oldOverflow);
+delete _f._oldOverflow;
+dojo.style(ed.domNode,_f._origState);
+dojo.style(ed.iframe.parentNode,{height:"",width:""});
+dojo.style(ed.iframe,_f._origiFrameState);
+delete _f._origState;
+delete _f._origiFrameState;
+ed.resize();
+var _10=dijit.getEnclosingWidget(ed.domNode.parentNode);
+if(_10&&_10.resize){
+_10.resize();
+}
+dijit.scrollIntoView(_f.editor.toolbar.domNode);
+},100);
+}
+},destroy:function(){
+if(this._resizeHandle){
+dojo.disconnect(this._resizeHandle);
+this._resizeHandle=null;
+}
+if(this._resizer){
+clearTimeout(this._resizer);
+this._resizer=null;
+}
+this.inherited(arguments);
+}});
+dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
+if(o.plugin){
+return;
+}
+var _11=o.args.name.toLowerCase();
+if(_11==="fullscreen"){
+o.plugin=new dijit._editor.plugins.FullScreen({zIndex:("zIndex" in o.args)?o.args.zIndex:500});
+}
+});
+}
diff --git a/dijit/_editor/plugins/LinkDialog.js b/dijit/_editor/plugins/LinkDialog.js
index cd2c754..4404276 100644
--- a/dijit/_editor/plugins/LinkDialog.js
+++ b/dijit/_editor/plugins/LinkDialog.js
@@ -14,52 +14,182 @@ dojo.require("dijit._editor._Plugin");
 dojo.require("dijit.TooltipDialog");
 dojo.require("dijit.form.Button");
 dojo.require("dijit.form.ValidationTextBox");
+dojo.require("dijit.form.Select");
+dojo.require("dijit._editor.range");
 dojo.require("dojo.i18n");
 dojo.require("dojo.string");
+dojo.requireLocalization("dijit","common",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
 dojo.requireLocalization("dijit._editor","LinkDialog",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
-dojo.declare("dijit._editor.plugins.LinkDialog",dijit._editor._Plugin,{buttonClass:dijit.form.DropDownButton,useDefaultCommand:false,urlRegExp:"((https?|ftps?)\\://|)(((?:(?:[\\da-zA-Z](?:[-\\da-zA-Z]{0,61}[\\da-zA-Z])?)\\.)*(?:[a-zA-Z](?:[-\\da-zA-Z]{0,6}[\\da-zA-Z])?)\\.?)|(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])|(0[xX]0*[\\da-fA-F]?[\\da-fA-F]\\.){3}0[xX]0*[\\da-fA-F]?[\\da-fA-F]|(0+[0-3][0-7][0-7]\\.){3}0+[0-3][0-7][0-7]|(0|[1-9]\\d{0, [...]
+dojo.declare("dijit._editor.plugins.LinkDialog",dijit._editor._Plugin,{buttonClass:dijit.form.DropDownButton,useDefaultCommand:false,urlRegExp:"((https?|ftps?|file)\\://|./|/|)(/[a-zA-Z]{1,1}:/|)(((?:(?:[\\da-zA-Z](?:[-\\da-zA-Z]{0,61}[\\da-zA-Z])?)\\.)*(?:[a-zA-Z](?:[-\\da-zA-Z]{0,80}[\\da-zA-Z])?)\\.?)|(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])|(0[xX]0*[\\da-fA-F]?[\\da-fA-F]\\.){3}0[xX]0*[\\da-fA-F]?[\\da-fA-F]|(0+[0-3][0-7][0-7]\\.){3}0+ [...]
 var _1=this;
 this.tag=this.command=="insertImage"?"img":"a";
-var _2=dojo.i18n.getLocalization("dijit._editor","LinkDialog",this.lang);
+var _2=dojo.mixin(dojo.i18n.getLocalization("dijit","common",this.lang),dojo.i18n.getLocalization("dijit._editor","LinkDialog",this.lang));
 var _3=(this.dropDown=new dijit.TooltipDialog({title:_2[this.command+"Title"],execute:dojo.hitch(this,"setValue"),onOpen:function(){
 _1._onOpenDialog();
 dijit.TooltipDialog.prototype.onOpen.apply(this,arguments);
 },onCancel:function(){
 setTimeout(dojo.hitch(_1,"_onCloseDialog"),0);
-},onClose:dojo.hitch(this,"_onCloseDialog")}));
+}}));
 _2.urlRegExp=this.urlRegExp;
 _2.id=dijit.getUniqueId(this.editor.id);
+this._uniqueId=_2.id;
 this._setContent(_3.title+"<div style='border-bottom: 1px black solid;padding-bottom:2pt;margin-bottom:4pt'></div>"+dojo.string.substitute(this.linkDialogTemplate,_2));
 _3.startup();
+this._urlInput=dijit.byId(this._uniqueId+"_urlInput");
+this._textInput=dijit.byId(this._uniqueId+"_textInput");
+this._setButton=dijit.byId(this._uniqueId+"_setButton");
+this.connect(dijit.byId(this._uniqueId+"_cancelButton"),"onClick",function(){
+this.dropDown.onCancel();
+});
+if(this._urlInput){
+this.connect(this._urlInput,"onChange","_checkAndFixInput");
+}
+if(this._textInput){
+this.connect(this._textInput,"onChange","_checkAndFixInput");
+}
+this._connectTagEvents();
 this.inherited(arguments);
-},_setContent:function(_4){
-this.dropDown.attr("content",_4);
-},setValue:function(_5){
+},_checkAndFixInput:function(){
+var _4=this;
+var _5=this._urlInput.attr("value");
+var _6=function(_7){
+var _8=false;
+if(_7&&_7.length>7){
+_7=dojo.trim(_7);
+if(_7.indexOf("/")>0){
+if(_7.indexOf("://")===-1){
+if(_7.charAt(0)!=="/"&&_7.indexOf("./")!==0){
+if(_4._hostRxp.test(_7)){
+_8=true;
+}
+}
+}
+}
+}
+if(_8){
+_4._urlInput.attr("value","http://"+_7);
+}
+_4._setButton.attr("disabled",!_4._isValid());
+};
+if(this._delayedCheck){
+clearTimeout(this._delayedCheck);
+this._delayedCheck=null;
+}
+this._delayedCheck=setTimeout(function(){
+_6(_5);
+},250);
+},_connectTagEvents:function(){
+this.editor.onLoadDeferred.addCallback(dojo.hitch(this,function(){
+this.connect(this.editor.editNode,"ondblclick",this._onDblClick);
+}));
+},_isValid:function(){
+return this._urlInput.isValid()&&this._textInput.isValid();
+},_setContent:function(_9){
+this.dropDown.attr("content",_9);
+},_checkValues:function(_a){
+if(_a&&_a.urlInput){
+_a.urlInput=_a.urlInput.replace(/"/g,""");
+}
+return _a;
+},setValue:function(_b){
 this._onCloseDialog();
 if(dojo.isIE){
-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]);
+var _c=dijit.range.getSelection(this.editor.window);
+var _d=_c.getRangeAt(0);
+var a=_d.endContainer;
+if(a.nodeType===3){
+a=a.parentNode;
+}
+if(a&&(a.nodeName&&a.nodeName.toLowerCase()!==this.tag)){
+a=dojo.withGlobal(this.editor.window,"getSelectedElement",dijit._editor.selection,[this.tag]);
+}
+if(a&&(a.nodeName&&a.nodeName.toLowerCase()===this.tag)){
+if(this.editor.queryCommandEnabled("unlink")){
+dojo.withGlobal(this.editor.window,"selectElementChildren",dijit._editor.selection,[a]);
+this.editor.execCommand("unlink");
 }
 }
-_5.tag=this.tag;
-_5.refAttr=this.tag=="img"?"src":"href";
-var _7="<${tag} ${refAttr}='${urlInput}' _djrealurl='${urlInput}'"+(_5.tag=="img"?" alt='${textInput}'>":">${textInput}")+"</${tag}>";
-this.editor.execCommand("inserthtml",dojo.string.substitute(_7,_5));
+}
+_b=this._checkValues(_b);
+this.editor.execCommand("inserthtml",dojo.string.substitute(this.htmlTemplate,_b));
 },_onCloseDialog:function(){
 this.editor.focus();
-},_onOpenDialog:function(){
-var a=dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,[this.tag]);
-var _9,_a;
-if(a){
-_9=a.getAttribute("_djrealurl");
-_a=this.tag=="img"?a.getAttribute("alt"):a.textContent||a.innerText;
+},_getCurrentValues:function(a){
+var _e,_f,_10;
+if(a&&a.tagName.toLowerCase()===this.tag){
+_e=a.getAttribute("_djrealurl");
+_10=a.getAttribute("target")||"_self";
+_f=a.textContent||a.innerText;
 dojo.withGlobal(this.editor.window,"selectElement",dijit._editor.selection,[a,true]);
 }else{
-_a=dojo.withGlobal(this.editor.window,dijit._editor.selection.getSelectedText);
+_f=dojo.withGlobal(this.editor.window,dijit._editor.selection.getSelectedText);
+}
+return {urlInput:_e||"",textInput:_f||"",targetSelect:_10||""};
+},_onOpenDialog:function(){
+var a;
+if(dojo.isIE){
+var sel=dijit.range.getSelection(this.editor.window);
+var _11=sel.getRangeAt(0);
+a=_11.endContainer;
+if(a.nodeType===3){
+a=a.parentNode;
+}
+if(a&&(a.nodeName&&a.nodeName.toLowerCase()!==this.tag)){
+a=dojo.withGlobal(this.editor.window,"getSelectedElement",dijit._editor.selection,[this.tag]);
+}
+}else{
+a=dojo.withGlobal(this.editor.window,"getAncestorElement",dijit._editor.selection,[this.tag]);
 }
 this.dropDown.reset();
-this.dropDown.setValues({urlInput:_9||"",textInput:_a||""});
+this._setButton.attr("disabled",true);
+this.dropDown.attr("value",this._getCurrentValues(a));
+},_onDblClick:function(e){
+if(e&&e.target){
+var t=e.target;
+var tg=t.tagName?t.tagName.toLowerCase():"";
+if(tg===this.tag){
+this.editor.onDisplayChanged();
+dojo.withGlobal(this.editor.window,"selectElement",dijit._editor.selection,[t]);
+setTimeout(dojo.hitch(this,function(){
+this.button.attr("disabled",false);
+this.button.openDropDown();
+}),10);
+}
+}
+}});
+dojo.declare("dijit._editor.plugins.ImgLinkDialog",[dijit._editor.plugins.LinkDialog],{linkDialogTemplate:["<table><tr><td>","<label for='${id}_urlInput'>${url}</label>","</td><td>","<input dojoType='dijit.form.ValidationTextBox' regExp='${urlRegExp}' "+"required='true' id='${id}_urlInput' name='urlInput' intermediateChanges='true'>","</td></tr><tr><td>","<label for='${id}_textInput'>${text}</label>","</td><td>","<input dojoType='dijit.form.ValidationTextBox' required='false' id='${id}_t [...]
+var url,_12;
+if(img&&img.tagName.toLowerCase()===this.tag){
+url=img.getAttribute("_djrealurl");
+_12=img.getAttribute("alt");
+dojo.withGlobal(this.editor.window,"selectElement",dijit._editor.selection,[img,true]);
+}else{
+_12=dojo.withGlobal(this.editor.window,dijit._editor.selection.getSelectedText);
+}
+return {urlInput:url||"",textInput:_12||""};
+},_isValid:function(){
+return this._urlInput.isValid();
+},_connectTagEvents:function(){
+this.inherited(arguments);
+this.editor.onLoadDeferred.addCallback(dojo.hitch(this,function(){
+this.connect(this.editor.editNode,"onclick",this._selectTag);
+}));
+},_selectTag:function(e){
+if(e&&e.target){
+var t=e.target;
+var tg=t.tagName?t.tagName.toLowerCase():"";
+if(tg===this.tag){
+dojo.withGlobal(this.editor.window,"selectElement",dijit._editor.selection,[t]);
+}
+}
+},_checkValues:function(_13){
+if(_13&&_13.urlInput){
+_13.urlInput=_13.urlInput.replace(/"/g,""");
+}
+if(_13&&_13.textInput){
+_13.textInput=_13.textInput.replace(/"/g,""");
+}
+return _13;
 }});
 dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
 if(o.plugin){
@@ -67,8 +197,11 @@ return;
 }
 switch(o.args.name){
 case "createLink":
-case "insertImage":
 o.plugin=new dijit._editor.plugins.LinkDialog({command:o.args.name});
+break;
+case "insertImage":
+o.plugin=new dijit._editor.plugins.ImgLinkDialog({command:o.args.name});
+break;
 }
 });
 }
diff --git a/dijit/_editor/plugins/NewPage.js b/dijit/_editor/plugins/NewPage.js
new file mode 100644
index 0000000..3e6a4b1
--- /dev/null
+++ b/dijit/_editor/plugins/NewPage.js
@@ -0,0 +1,34 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dijit._editor.plugins.NewPage"]){
+dojo._hasResource["dijit._editor.plugins.NewPage"]=true;
+dojo.provide("dijit._editor.plugins.NewPage");
+dojo.require("dijit._editor._Plugin");
+dojo.require("dijit.form.Button");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dijit._editor","commands",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
+dojo.declare("dijit._editor.plugins.NewPage",dijit._editor._Plugin,{content:"<br>",_initButton:function(){
+var _1=dojo.i18n.getLocalization("dijit._editor","commands");
+this.button=new dijit.form.Button({label:_1["newPage"],showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"NewPage",tabIndex:"-1",onClick:dojo.hitch(this,"_newPage")});
+},setEditor:function(_2){
+this.editor=_2;
+this._initButton();
+},_newPage:function(){
+this.editor.attr("value",this.content);
+this.editor.focus();
+}});
+dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
+if(o.plugin){
+return;
+}
+var _3=o.args.name.toLowerCase();
+if(_3==="newpage"){
+o.plugin=new dijit._editor.plugins.NewPage({content:("content" in o.args)?o.args.content:"<br>"});
+}
+});
+}
diff --git a/dijit/_editor/plugins/Print.js b/dijit/_editor/plugins/Print.js
new file mode 100644
index 0000000..81977fa
--- /dev/null
+++ b/dijit/_editor/plugins/Print.js
@@ -0,0 +1,65 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dijit._editor.plugins.Print"]){
+dojo._hasResource["dijit._editor.plugins.Print"]=true;
+dojo.provide("dijit._editor.plugins.Print");
+dojo.require("dijit._editor._Plugin");
+dojo.require("dijit.form.Button");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dijit._editor","commands",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
+dojo.declare("dijit._editor.plugins.Print",dijit._editor._Plugin,{_initButton:function(){
+var _1=dojo.i18n.getLocalization("dijit._editor","commands");
+this.button=new dijit.form.Button({label:_1["print"],showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"Print",tabIndex:"-1",onClick:dojo.hitch(this,"_print")});
+},setEditor:function(_2){
+this.editor=_2;
+this._initButton();
+this.editor.onLoadDeferred.addCallback(dojo.hitch(this,function(){
+if(!this.editor.iframe.contentWindow["print"]){
+this.button.attr("disabled",true);
+}
+}));
+},_print:function(){
+var _3=this.editor.iframe;
+if(_3.contentWindow["print"]){
+if(!dojo.isOpera&&!dojo.isChrome){
+dijit.focus(_3);
+_3.contentWindow.print();
+}else{
+var _4=this.editor.document;
+var _5=this.editor.attr("value");
+_5="<html><head><meta http-equiv='Content-Type' "+"content='text/html; charset='UTF-8'></head><body>"+_5+"</body></html>";
+var _6=window.open("javascript: ''","","status=0,menubar=0,location=0,toolbar=0,"+"width=1,height=1,resizable=0,scrollbars=0");
+_6.document.open();
+_6.document.write(_5);
+_6.document.close();
+var _7=[];
+var _8=_4.getElementsByTagName("style");
+if(_8){
+var i;
+for(i=0;i<_8.length;i++){
+var _9=_8[i].innerHTML;
+var _a=_6.document.createElement("style");
+_a.appendChild(_6.document.createTextNode(_9));
+_6.document.getElementsByTagName("head")[0].appendChild(_a);
+}
+}
+_6.print();
+_6.close();
+}
+}
+}});
+dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
+if(o.plugin){
+return;
+}
+var _b=o.args.name.toLowerCase();
+if(_b==="print"){
+o.plugin=new dijit._editor.plugins.Print({command:"print"});
+}
+});
+}
diff --git a/dijit/_editor/plugins/TabIndent.js b/dijit/_editor/plugins/TabIndent.js
index a57a274..9376320 100644
--- a/dijit/_editor/plugins/TabIndent.js
+++ b/dijit/_editor/plugins/TabIndent.js
@@ -10,34 +10,16 @@ dojo._hasResource["dijit._editor.plugins.TabIndent"]=true;
 dojo.provide("dijit._editor.plugins.TabIndent");
 dojo.experimental("dijit._editor.plugins.TabIndent");
 dojo.require("dijit._editor._Plugin");
+dojo.require("dijit.form.ToggleButton");
 dojo.declare("dijit._editor.plugins.TabIndent",dijit._editor._Plugin,{useDefaultCommand:false,buttonClass:dijit.form.ToggleButton,command:"tabIndent",_initButton:function(){
-this.inherited("_initButton",arguments);
-this.connect(this.button,"onClick",this._tabIndent);
+this.inherited(arguments);
+var e=this.editor;
+this.connect(this.button,"onChange",function(_1){
+e.attr("isTabIndent",_1);
+});
+this.updateState();
 },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 _3=_e.isTabIndent;
-if(typeof this.button.checked=="boolean"){
-this.button.attr("checked",_3);
-}
-}
-catch(e){
-
-}
-}
-},_tabIndent:function(){
-this.editor.isTabIndent=!this.editor.isTabIndent;
+this.button.attr("checked",this.editor.isTabIndent,false);
 }});
 dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
 if(o.plugin){
diff --git a/dijit/_editor/plugins/ToggleDir.js b/dijit/_editor/plugins/ToggleDir.js
index dc3dc4a..3424950 100644
--- a/dijit/_editor/plugins/ToggleDir.js
+++ b/dijit/_editor/plugins/ToggleDir.js
@@ -10,14 +10,25 @@ 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,{useDefaultCommand:false,command:"toggleDir",_initButton:function(){
-this.inherited("_initButton",arguments);
-this.connect(this.button,"onClick",this._toggleDir);
-},updateState:function(){
-},_toggleDir:function(){
+dojo.require("dijit.form.ToggleButton");
+dojo.declare("dijit._editor.plugins.ToggleDir",dijit._editor._Plugin,{useDefaultCommand:false,command:"toggleDir",buttonClass:dijit.form.ToggleButton,_initButton:function(){
+this.inherited(arguments);
+this.editor.onLoadDeferred.addCallback(dojo.hitch(this,function(){
 var _1=this.editor.editorObject.contentWindow.document.documentElement;
+_1=_1.getElementsByTagName("body")[0];
 var _2=dojo.getComputedStyle(_1).direction=="ltr";
-_1.dir=_2?"rtl":"ltr";
+this.button.attr("checked",!_2);
+this.connect(this.button,"onChange","_setRtl");
+}));
+},updateState:function(){
+},_setRtl:function(_3){
+var _4="ltr";
+if(_3){
+_4="rtl";
+}
+var _5=this.editor.editorObject.contentWindow.document.documentElement;
+_5=_5.getElementsByTagName("body")[0];
+_5.dir=_4;
 }});
 dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
 if(o.plugin){
diff --git a/dijit/_editor/plugins/ViewSource.js b/dijit/_editor/plugins/ViewSource.js
new file mode 100644
index 0000000..9a91943
--- /dev/null
+++ b/dijit/_editor/plugins/ViewSource.js
@@ -0,0 +1,300 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dijit._editor.plugins.ViewSource"]){
+dojo._hasResource["dijit._editor.plugins.ViewSource"]=true;
+dojo.provide("dijit._editor.plugins.ViewSource");
+dojo.require("dijit._editor._Plugin");
+dojo.require("dijit.form.Button");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dijit._editor","commands",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
+dojo.declare("dijit._editor.plugins.ViewSource",dijit._editor._Plugin,{stripScripts:true,stripComments:true,stripIFrames:true,readOnly:false,_fsPlugin:null,toggle:function(){
+if(dojo.isWebKit){
+this._vsFocused=true;
+}
+this.button.attr("checked",!this.button.attr("checked"));
+},_initButton:function(){
+var _1=dojo.i18n.getLocalization("dijit._editor","commands");
+this.button=new dijit.form.ToggleButton({label:_1["viewSource"],showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"ViewSource",tabIndex:"-1",onChange:dojo.hitch(this,"_showSource")});
+if(dojo.isIE==7){
+this._ieFixNode=dojo.create("div",{style:{opacity:"0",zIndex:"-1000",position:"absolute",top:"-1000px"}},dojo.body());
+}
+this.button.attr("readOnly",false);
+},setEditor:function(_2){
+this.editor=_2;
+this._initButton();
+this.editor.addKeyHandler(dojo.keys.F12,true,true,dojo.hitch(this,function(e){
+this.button.focus();
+this.toggle();
+dojo.stopEvent(e);
+setTimeout(dojo.hitch(this,function(){
+this.editor.focus();
+}),100);
+}));
+},_showSource:function(_3){
+var ed=this.editor;
+var _4=ed._plugins;
+var _5;
+this._sourceShown=_3;
+var _6=this;
+try{
+if(!this.sourceArea){
+this._createSourceView();
+}
+if(_3){
+ed._sourceQueryCommandEnabled=ed.queryCommandEnabled;
+ed.queryCommandEnabled=function(_7){
+var _8=_7.toLowerCase();
+if(_8==="viewsource"){
+return true;
+}else{
+return false;
+}
+};
+this.editor.onDisplayChanged();
+_5=ed.attr("value");
+_5=this._filter(_5);
+ed.attr("value",_5);
+this._pluginList=[];
+this._disabledPlugins=dojo.filter(_4,function(p){
+if(p&&p.button&&!p.button.attr("disabled")&&!(p instanceof dijit._editor.plugins.ViewSource)){
+p._vs_updateState=p.updateState;
+p.updateState=function(){
+return false;
+};
+p.button.attr("disabled",true);
+if(p.command){
+switch(p.command){
+case "bold":
+case "italic":
+case "underline":
+case "strikethrough":
+case "superscript":
+case "subscript":
+p.button.attr("checked",false);
+break;
+default:
+break;
+}
+}
+return true;
+}
+});
+if(this._fsPlugin){
+this._fsPlugin._getAltViewNode=function(){
+return _6.sourceArea;
+};
+}
+this.sourceArea.value=_5;
+var is=dojo.marginBox(ed.iframe.parentNode);
+dojo.marginBox(this.sourceArea,{w:is.w,h:is.h});
+dojo.style(ed.iframe,"display","none");
+dojo.style(this.sourceArea,{display:"block"});
+var _9=function(){
+var vp=dijit.getViewport();
+if("_prevW" in this&&"_prevH" in this){
+if(vp.w===this._prevW&&vp.h===this._prevH){
+return;
+}else{
+this._prevW=vp.w;
+this._prevH=vp.h;
+}
+}else{
+this._prevW=vp.w;
+this._prevH=vp.h;
+}
+if(this._resizer){
+clearTimeout(this._resizer);
+delete this._resizer;
+}
+this._resizer=setTimeout(dojo.hitch(this,function(){
+delete this._resizer;
+this._resize();
+}),10);
+};
+this._resizeHandle=dojo.connect(window,"onresize",this,_9);
+setTimeout(dojo.hitch(this,this._resize),100);
+this.editor.onNormalizedDisplayChanged();
+}else{
+if(!ed._sourceQueryCommandEnabled){
+return;
+}
+dojo.disconnect(this._resizeHandle);
+delete this._resizeHandle;
+ed.queryCommandEnabled=ed._sourceQueryCommandEnabled;
+if(!this._readOnly){
+_5=this.sourceArea.value;
+_5=this._filter(_5);
+ed.attr("value",_5);
+}
+dojo.forEach(this._disabledPlugins,function(p){
+p.button.attr("disabled",false);
+if(p._vs_updateState){
+p.updateState=p._vs_updateState;
+}
+});
+this._disabledPlugins=null;
+dojo.style(this.sourceArea,"display","none");
+dojo.style(ed.iframe,"display","block");
+delete ed._sourceQueryCommandEnabled;
+this.editor.onDisplayChanged();
+}
+}
+catch(e){
+}
+},_resize:function(){
+var ed=this.editor;
+var tb=dojo.position(ed.toolbar.domNode);
+var eb=dojo.position(ed.domNode);
+var _a=dojo._getPadBorderExtents(ed.domNode);
+var _b={w:eb.w-_a.w,h:eb.h-(tb.h+_a.h)};
+if(this._fsPlugin&&this._fsPlugin.isFullscreen){
+var vp=dijit.getViewport();
+_b.w=(vp.w-_a.w);
+_b.h=(vp.h-(tb.h+_a.h));
+}
+if(dojo.isIE){
+_b.h-=2;
+}
+if(this._ieFixNode){
+var _c=-this._ieFixNode.offsetTop/1000;
+_b.w=Math.floor((_b.w+0.9)/_c);
+_b.h=Math.floor((_b.h+0.9)/_c);
+}
+dojo.marginBox(this.sourceArea,{w:_b.w,h:_b.h});
+},_createSourceView:function(){
+var ed=this.editor;
+var _d=ed._plugins;
+this.sourceArea=dojo.create("textarea");
+if(this.readOnly){
+dojo.attr(this.sourceArea,"readOnly",true);
+this._readOnly=true;
+}
+dojo.style(this.sourceArea,{padding:"0px",margin:"0px",borderWidth:"0px",borderStyle:"none"});
+dojo.place(this.sourceArea,ed.iframe,"before");
+dojo.style(this.sourceArea.parentNode,{padding:"0px",margin:"0px",borderWidth:"0px",borderStyle:"none"});
+if(dojo.isIE&&ed.iframe.parentNode.lastChild!==ed.iframe){
+dojo.style(ed.iframe.parentNode.lastChild,{width:"0px",height:"0px",padding:"0px",margin:"0px",borderWidth:"0px",borderStyle:"none"});
+}
+ed._viewsource_oldFocus=ed.focus;
+var _e=this;
+ed.focus=function(){
+if(_e._sourceShown){
+_e.setSourceAreaCaret();
+}else{
+try{
+if(this._vsFocused){
+delete this._vsFocused;
+dijit.focus(ed.editNode);
+}else{
+ed._viewsource_oldFocus();
+}
+}
+catch(e){
+}
+}
+};
+var i,p;
+for(i=0;i<_d.length;i++){
+p=_d[i];
+if(p&&(p.declaredClass==="dijit._editor.plugins.FullScreen"||p.declaredClass===(dijit._scopeName+"._editor.plugins.FullScreen"))){
+this._fsPlugin=p;
+break;
+}
+}
+if(this._fsPlugin){
+this._fsPlugin._viewsource_getAltViewNode=this._fsPlugin._getAltViewNode;
+this._fsPlugin._getAltViewNode=function(){
+return _e._sourceShown?_e.sourceArea:this._viewsource_getAltViewNode();
+};
+}
+this.connect(this.sourceArea,"onkeydown",dojo.hitch(this,function(e){
+if(this._sourceShown&&e.keyCode==dojo.keys.F12&&e.ctrlKey&&e.shiftKey){
+this.button.focus();
+this.button.attr("checked",false);
+setTimeout(dojo.hitch(this,function(){
+ed.focus();
+}),100);
+dojo.stopEvent(e);
+}
+}));
+},_stripScripts:function(_f){
+if(_f){
+_f=_f.replace(/<\s*script[^>]*>((.|\s)*?)<\\?\/\s*script\s*>/ig,"");
+_f=_f.replace(/<\s*script\b([^<>]|\s)*>?/ig,"");
+_f=_f.replace(/<[^>]*=(\s|)*[("|')]javascript:[^$1][(\s|.)]*[$1][^>]*>/ig,"");
+}
+return _f;
+},_stripComments:function(_10){
+if(_10){
+_10=_10.replace(/<!--(.|\s){1,}?-->/g,"");
+}
+return _10;
+},_stripIFrames:function(_11){
+if(_11){
+_11=_11.replace(/<\s*iframe[^>]*>((.|\s)*?)<\\?\/\s*iframe\s*>/ig,"");
+}
+return _11;
+},_filter:function(_12){
+if(_12){
+if(this.stripScripts){
+_12=this._stripScripts(_12);
+}
+if(this.stripComments){
+_12=this._stripComments(_12);
+}
+if(this.stripIFrames){
+_12=this._stripIFrames(_12);
+}
+}
+return _12;
+},setSourceAreaCaret:function(){
+var win=dojo.global;
+var _13=this.sourceArea;
+dijit.focus(_13);
+if(this._sourceShown&&!this.readOnly){
+if(dojo.isIE){
+if(this.sourceArea.createTextRange){
+var _14=_13.createTextRange();
+_14.collapse(true);
+_14.moveStart("character",-99999);
+_14.moveStart("character",0);
+_14.moveEnd("character",0);
+_14.select();
+}
+}else{
+if(win.getSelection){
+if(_13.setSelectionRange){
+_13.setSelectionRange(0,0);
+}
+}
+}
+}
+},destroy:function(){
+if(this._ieFixNode){
+dojo.body().removeChild(this._ieFixNode);
+}
+if(this._resizer){
+clearTimeout(this._resizer);
+delete this._resizer;
+}
+if(this._resizeHandle){
+dojo.disconnect(this._resizeHandle);
+delete this._resizeHandle;
+}
+this.inherited(arguments);
+}});
+dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
+if(o.plugin){
+return;
+}
+var _15=o.args.name.toLowerCase();
+if(_15==="viewsource"){
+o.plugin=new dijit._editor.plugins.ViewSource({readOnly:("readOnly" in o.args)?o.args.readOnly:false,stripComments:("stripComments" in o.args)?o.args.stripComments:true,stripScripts:("stripScripts" in o.args)?o.args.stripScripts:true,stripIFrames:("stripIFrames" in o.args)?o.args.stripIFrames:true});
+}
+});
+}
diff --git a/dijit/_editor/range.js b/dijit/_editor/range.js
index c85da1e..efe0736 100644
--- a/dijit/_editor/range.js
+++ b/dijit/_editor/range.js
@@ -44,25 +44,24 @@ n=n.nextSibling;
 }
 return {o:_3,r:_4};
 };
-dijit.range.getNode=function(_a,_b){
-if(!dojo.isArray(_a)||_a.length==0){
-return _b;
-}
-var _c=_b;
-dojo.every(_a,function(i){
-if(i>=0&&i<_c.childNodes.length){
-_c=_c.childNodes[i];
+dijit.range.getNode=function(_8,_9){
+if(!dojo.isArray(_8)||_8.length==0){
+return _9;
+}
+var _a=_9;
+dojo.every(_8,function(i){
+if(i>=0&&i<_a.childNodes.length){
+_a=_a.childNodes[i];
 }else{
-_c=null;
-
+_a=null;
 return false;
 }
 return true;
 });
-return _c;
+return _a;
 };
 dijit.range.getCommonAncestor=function(n1,n2){
-var _10=function(n){
+var _b=function(n){
 var as=[];
 while(n){
 as.unshift(n);
@@ -74,116 +73,116 @@ break;
 }
 return as;
 };
-var _13=_10(n1);
-var _14=_10(n2);
-var m=Math.min(_13.length,_14.length);
-var com=_13[0];
+var _c=_b(n1);
+var _d=_b(n2);
+var m=Math.min(_c.length,_d.length);
+var _e=_c[0];
 for(var i=1;i<m;i++){
-if(_13[i]===_14[i]){
-com=_13[i];
+if(_c[i]===_d[i]){
+_e=_c[i];
 }else{
 break;
 }
 }
-return com;
+return _e;
 };
-dijit.range.getAncestor=function(_18,_19,_1a){
-_1a=_1a||_18.ownerDocument.body;
-while(_18&&_18!==_1a){
-var _1b=_18.nodeName.toUpperCase();
-if(_19.test(_1b)){
-return _18;
+dijit.range.getAncestor=function(_f,_10,_11){
+_11=_11||_f.ownerDocument.body;
+while(_f&&_f!==_11){
+var _12=_f.nodeName.toUpperCase();
+if(_10.test(_12)){
+return _f;
 }
-_18=_18.parentNode;
+_f=_f.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(_1c,_1d,_1e){
-_1e=_1e||_1c.ownerDocument.body;
-_1d=_1d||dijit.range.BlockTagNames;
-var _1f=null,_20;
-while(_1c&&_1c!==_1e){
-var _21=_1c.nodeName.toUpperCase();
-if(!_1f&&_1d.test(_21)){
-_1f=_1c;
+dijit.range.getBlockAncestor=function(_13,_14,_15){
+_15=_15||_13.ownerDocument.body;
+_14=_14||dijit.range.BlockTagNames;
+var _16=null,_17;
+while(_13&&_13!==_15){
+var _18=_13.nodeName.toUpperCase();
+if(!_16&&_14.test(_18)){
+_16=_13;
 }
-if(!_20&&(/^(?:BODY|TD|TH|CAPTION)$/).test(_21)){
-_20=_1c;
+if(!_17&&(/^(?:BODY|TD|TH|CAPTION)$/).test(_18)){
+_17=_13;
 }
-_1c=_1c.parentNode;
+_13=_13.parentNode;
 }
-return {blockNode:_1f,blockContainer:_20||_1c.ownerDocument.body};
+return {blockNode:_16,blockContainer:_17||_13.ownerDocument.body};
 };
-dijit.range.atBeginningOfContainer=function(_22,_23,_24){
-var _25=false;
-var _26=(_24==0);
-if(!_26&&_23.nodeType==3){
-if(dojo.trim(_23.nodeValue.substr(0,_24))==0){
-_26=true;
-}
-}
-if(_26){
-var _27=_23;
-_25=true;
-while(_27&&_27!==_22){
-if(_27.previousSibling){
-_25=false;
+dijit.range.atBeginningOfContainer=function(_19,_1a,_1b){
+var _1c=false;
+var _1d=(_1b==0);
+if(!_1d&&_1a.nodeType==3){
+if(/^[\s\xA0]+$/.test(_1a.nodeValue.substr(0,_1b))){
+_1d=true;
+}
+}
+if(_1d){
+var _1e=_1a;
+_1c=true;
+while(_1e&&_1e!==_19){
+if(_1e.previousSibling){
+_1c=false;
 break;
 }
-_27=_27.parentNode;
+_1e=_1e.parentNode;
 }
 }
-return _25;
+return _1c;
 };
-dijit.range.atEndOfContainer=function(_28,_29,_2a){
-var _2b=false;
-var _2c=(_2a==(_29.length||_29.childNodes.length));
-if(!_2c&&_29.nodeType==3){
-if(dojo.trim(_29.nodeValue.substr(_2a))==0){
-_2c=true;
-}
-}
-if(_2c){
-var _2d=_29;
-_2b=true;
-while(_2d&&_2d!==_28){
-if(_2d.nextSibling){
-_2b=false;
+dijit.range.atEndOfContainer=function(_1f,_20,_21){
+var _22=false;
+var _23=(_21==(_20.length||_20.childNodes.length));
+if(!_23&&_20.nodeType==3){
+if(/^[\s\xA0]+$/.test(_20.nodeValue.substr(_21))){
+_23=true;
+}
+}
+if(_23){
+var _24=_20;
+_22=true;
+while(_24&&_24!==_1f){
+if(_24.nextSibling){
+_22=false;
 break;
 }
-_2d=_2d.parentNode;
+_24=_24.parentNode;
 }
 }
-return _2b;
+return _22;
 };
-dijit.range.adjacentNoneTextNode=function(_2e,_2f){
-var _30=_2e;
-var len=(0-_2e.length)||0;
-var _32=_2f?"nextSibling":"previousSibling";
-while(_30){
-if(_30.nodeType!=3){
+dijit.range.adjacentNoneTextNode=function(_25,_26){
+var _27=_25;
+var len=(0-_25.length)||0;
+var _28=_26?"nextSibling":"previousSibling";
+while(_27){
+if(_27.nodeType!=3){
 break;
 }
-len+=_30.length;
-_30=_30[_32];
+len+=_27.length;
+_27=_27[_28];
 }
-return [_30,len];
+return [_27,len];
 };
 dijit.range._w3c=Boolean(window["getSelection"]);
-dijit.range.create=function(){
+dijit.range.create=function(win){
 if(dijit.range._w3c){
-return dojo.doc.createRange();
+return (win||dojo.global).document.createRange();
 }else{
 return new dijit.range.W3CRange;
 }
 };
-dijit.range.getSelection=function(win,_34){
+dijit.range.getSelection=function(win,_29){
 if(dijit.range._w3c){
 return win.getSelection();
 }else{
 var s=new dijit.range.ie.selection(win);
-if(!_34){
+if(!_29){
 s._getCurrentSelection();
 }
 return s;
@@ -192,9 +191,9 @@ return s;
 if(!dijit.range._w3c){
 dijit.range.ie={cachedSelection:{},selection:function(win){
 this._ranges=[];
-this.addRange=function(r,_38){
+this.addRange=function(r,_2a){
 this._ranges.push(r);
-if(!_38){
+if(!_2a){
 r._select();
 }
 this.rangeCount=this._ranges.length;
@@ -203,10 +202,10 @@ this.removeAllRanges=function(){
 this._ranges=[];
 this.rangeCount=0;
 };
-var _39=function(){
+var _2b=function(){
 var r=win.document.selection.createRange();
-var _3b=win.document.selection.type.toUpperCase();
-if(_3b=="CONTROL"){
+var _2c=win.document.selection.type.toUpperCase();
+if(_2c=="CONTROL"){
 return new dijit.range.W3CRange(dijit.range.ie.decomposeControlRange(r));
 }else{
 return new dijit.range.W3CRange(dijit.range.ie.decomposeTextRange(r));
@@ -217,152 +216,153 @@ return this._ranges[i];
 };
 this._getCurrentSelection=function(){
 this.removeAllRanges();
-var r=_39();
+var r=_2b();
 if(r){
 this.addRange(r,true);
 }
 };
-},decomposeControlRange:function(_3e){
-var _3f=_3e.item(0),_40=_3e.item(_3e.length-1);
-var _41=_3f.parentNode,_42=_40.parentNode;
-var _43=dijit.range.getIndex(_3f,_41).o;
-var _44=dijit.range.getIndex(_40,_42).o+1;
-return [_41,_43,_42,_44];
-},getEndPoint:function(_45,end){
-var _47=_45.duplicate();
-_47.collapse(!end);
-var _48="EndTo"+(end?"End":"Start");
-var _49=_47.parentElement();
-var _4a,_4b,_4c;
-if(_49.childNodes.length>0){
-dojo.every(_49.childNodes,function(_4d,i){
-var _4f;
-if(_4d.nodeType!=3){
-_47.moveToElementText(_4d);
-if(_47.compareEndPoints(_48,_45)>0){
-_4a=_4d.previousSibling;
-if(_4c&&_4c.nodeType==3){
-_4a=_4c;
-_4f=true;
+},decomposeControlRange:function(_2d){
+var _2e=_2d.item(0),_2f=_2d.item(_2d.length-1);
+var _30=_2e.parentNode,_31=_2f.parentNode;
+var _32=dijit.range.getIndex(_2e,_30).o;
+var _33=dijit.range.getIndex(_2f,_31).o+1;
+return [_30,_32,_31,_33];
+},getEndPoint:function(_34,end){
+var _35=_34.duplicate();
+_35.collapse(!end);
+var _36="EndTo"+(end?"End":"Start");
+var _37=_35.parentElement();
+var _38,_39,_3a;
+if(_37.childNodes.length>0){
+dojo.every(_37.childNodes,function(_3b,i){
+var _3c;
+if(_3b.nodeType!=3){
+_35.moveToElementText(_3b);
+if(_35.compareEndPoints(_36,_34)>0){
+if(_3a&&_3a.nodeType==3){
+_38=_3a;
+_3c=true;
 }else{
-_4a=_49;
-_4b=i;
+_38=_37;
+_39=i;
 return false;
 }
 }else{
-if(i==_49.childNodes.length-1){
-_4a=_49;
-_4b=_49.childNodes.length;
+if(i==_37.childNodes.length-1){
+_38=_37;
+_39=_37.childNodes.length;
 return false;
 }
 }
 }else{
-if(i==_49.childNodes.length-1){
-_4a=_4d;
-_4f=true;
+if(i==_37.childNodes.length-1){
+_38=_3b;
+_3c=true;
 }
 }
-if(_4f&&_4a){
-var _50=dijit.range.adjacentNoneTextNode(_4a)[0];
-if(_50){
-_4a=_50.nextSibling;
+if(_3c&&_38){
+var _3d=dijit.range.adjacentNoneTextNode(_38)[0];
+if(_3d){
+_38=_3d.nextSibling;
 }else{
-_4a=_49.firstChild;
-}
-var _51=dijit.range.adjacentNoneTextNode(_4a);
-_50=_51[0];
-var _52=_51[1];
-if(_50){
-_47.moveToElementText(_50);
-_47.collapse(false);
+_38=_37.firstChild;
+}
+var _3e=dijit.range.adjacentNoneTextNode(_38);
+_3d=_3e[0];
+var _3f=_3e[1];
+if(_3d){
+_35.moveToElementText(_3d);
+_35.collapse(false);
 }else{
-_47.moveToElementText(_49);
+_35.moveToElementText(_37);
 }
-_47.setEndPoint(_48,_45);
-_4b=_47.text.length-_52;
+_35.setEndPoint(_36,_34);
+_39=_35.text.length-_3f;
 return false;
 }
-_4c=_4d;
+_3a=_3b;
 return true;
 });
 }else{
-_4a=_49;
-_4b=0;
-}
-if(!end&&_4a.nodeType!=3&&_4b==_4a.childNodes.length){
-if(_4a.nextSibling&&_4a.nextSibling.nodeType==3){
-_4a=_4a.nextSibling;
-_4b=0;
-}
-}
-return [_4a,_4b];
-},setEndPoint:function(_53,_54,_55){
-var _56=_53.duplicate(),_57,len;
-if(_54.nodeType!=3){
-if(_55>0){
-_57=_54.childNodes[_55-1];
-if(_57.nodeType==3){
-_54=_57;
-_55=_57.length;
+_38=_37;
+_39=0;
+}
+if(!end&&_38.nodeType==1&&_39==_38.childNodes.length){
+var _40=_38.nextSibling;
+if(_40&&_40.nodeType==3){
+_38=_40;
+_39=0;
+}
+}
+return [_38,_39];
+},setEndPoint:function(_41,_42,_43){
+var _44=_41.duplicate(),_45,len;
+if(_42.nodeType!=3){
+if(_43>0){
+_45=_42.childNodes[_43-1];
+if(_45.nodeType==3){
+_42=_45;
+_43=_45.length;
 }else{
-if(_57.nextSibling&&_57.nextSibling.nodeType==3){
-_54=_57.nextSibling;
-_55=0;
+if(_45.nextSibling&&_45.nextSibling.nodeType==3){
+_42=_45.nextSibling;
+_43=0;
 }else{
-_56.moveToElementText(_57.nextSibling?_57:_54);
-var _59=_57.parentNode.insertBefore(document.createTextNode(" "),_57.nextSibling);
-_56.collapse(false);
-_59.parentNode.removeChild(_59);
+_44.moveToElementText(_45.nextSibling?_45:_42);
+var _46=_45.parentNode;
+var _47=_46.insertBefore(_45.ownerDocument.createTextNode(" "),_45.nextSibling);
+_44.collapse(false);
+_46.removeChild(_47);
 }
 }
 }else{
-_56.moveToElementText(_54);
-_56.collapse(true);
-}
-}
-if(_54.nodeType==3){
-var _5a=dijit.range.adjacentNoneTextNode(_54);
-var _5b=_5a[0];
-len=_5a[1];
-if(_5b){
-_56.moveToElementText(_5b);
-_56.collapse(false);
-if(_5b.contentEditable!="inherit"){
+_44.moveToElementText(_42);
+_44.collapse(true);
+}
+}
+if(_42.nodeType==3){
+var _48=dijit.range.adjacentNoneTextNode(_42);
+var _49=_48[0];
+len=_48[1];
+if(_49){
+_44.moveToElementText(_49);
+_44.collapse(false);
+if(_49.contentEditable!="inherit"){
 len++;
 }
 }else{
-_56.moveToElementText(_54.parentNode);
-_56.collapse(true);
+_44.moveToElementText(_42.parentNode);
+_44.collapse(true);
 }
-_55+=len;
-if(_55>0){
-if(_56.move("character",_55)!=_55){
+_43+=len;
+if(_43>0){
+if(_44.move("character",_43)!=_43){
 console.error("Error when moving!");
 }
 }
 }
-return _56;
-},decomposeTextRange:function(_5c){
-var _5d=dijit.range.ie.getEndPoint(_5c);
-var _5e=_5d[0],_5f=_5d[1];
-var _60=_5d[0],_61=_5d[1];
-if(_5c.htmlText.length){
-if(_5c.htmlText==_5c.text){
-_61=_5f+_5c.text.length;
+return _44;
+},decomposeTextRange:function(_4a){
+var _4b=dijit.range.ie.getEndPoint(_4a);
+var _4c=_4b[0],_4d=_4b[1];
+var _4e=_4b[0],_4f=_4b[1];
+if(_4a.htmlText.length){
+if(_4a.htmlText==_4a.text){
+_4f=_4d+_4a.text.length;
 }else{
-_5d=dijit.range.ie.getEndPoint(_5c,true);
-_60=_5d[0],_61=_5d[1];
+_4b=dijit.range.ie.getEndPoint(_4a,true);
+_4e=_4b[0],_4f=_4b[1];
 }
 }
-return [_5e,_5f,_60,_61];
-},setRange:function(_62,_63,_64,_65,_66,_67){
-var _68=dijit.range.ie.setEndPoint(_62,_63,_64);
-_62.setEndPoint("StartToStart",_68);
-if(!_67){
-var end=dijit.range.ie.setEndPoint(_62,_65,_66);
+return [_4c,_4d,_4e,_4f];
+},setRange:function(_50,_51,_52,_53,_54,_55){
+var _56=dijit.range.ie.setEndPoint(_50,_51,_52);
+_50.setEndPoint("StartToStart",_56);
+if(!_55){
+var end=dijit.range.ie.setEndPoint(_50,_53,_54);
 }
-_62.setEndPoint("EndToEnd",end||_68);
-return _62;
+_50.setEndPoint("EndToEnd",end||_56);
+return _50;
 }};
 dojo.declare("dijit.range.W3CRange",null,{constructor:function(){
 if(arguments.length>0){
@@ -383,48 +383,48 @@ this.commonAncestorContainer=dijit.range.getCommonAncestor(this.startContainer,t
 this.commonAncestorContainer=this.startContainer;
 }
 this.collapsed=(this.startContainer===this.endContainer)&&(this.startOffset==this.endOffset);
-},setStart:function(_6a,_6b){
-_6b=parseInt(_6b);
-if(this.startContainer===_6a&&this.startOffset==_6b){
+},setStart:function(_57,_58){
+_58=parseInt(_58);
+if(this.startContainer===_57&&this.startOffset==_58){
 return;
 }
 delete this._cachedBookmark;
-this.startContainer=_6a;
-this.startOffset=_6b;
+this.startContainer=_57;
+this.startOffset=_58;
 if(!this.endContainer){
-this.setEnd(_6a,_6b);
+this.setEnd(_57,_58);
 }else{
 this._updateInternal();
 }
-},setEnd:function(_6c,_6d){
-_6d=parseInt(_6d);
-if(this.endContainer===_6c&&this.endOffset==_6d){
+},setEnd:function(_59,_5a){
+_5a=parseInt(_5a);
+if(this.endContainer===_59&&this.endOffset==_5a){
 return;
 }
 delete this._cachedBookmark;
-this.endContainer=_6c;
-this.endOffset=_6d;
+this.endContainer=_59;
+this.endOffset=_5a;
 if(!this.startContainer){
-this.setStart(_6c,_6d);
+this.setStart(_59,_5a);
 }else{
 this._updateInternal();
 }
-},setStartAfter:function(_6e,_6f){
-this._setPoint("setStart",_6e,_6f,1);
-},setStartBefore:function(_70,_71){
-this._setPoint("setStart",_70,_71,0);
-},setEndAfter:function(_72,_73){
-this._setPoint("setEnd",_72,_73,1);
-},setEndBefore:function(_74,_75){
-this._setPoint("setEnd",_74,_75,0);
-},_setPoint:function(_76,_77,_78,ext){
-var _7a=dijit.range.getIndex(_77,_77.parentNode).o;
-this[_76](_77.parentNode,_7a.pop()+ext);
+},setStartAfter:function(_5b,_5c){
+this._setPoint("setStart",_5b,_5c,1);
+},setStartBefore:function(_5d,_5e){
+this._setPoint("setStart",_5d,_5e,0);
+},setEndAfter:function(_5f,_60){
+this._setPoint("setEnd",_5f,_60,1);
+},setEndBefore:function(_61,_62){
+this._setPoint("setEnd",_61,_62,0);
+},_setPoint:function(_63,_64,_65,ext){
+var _66=dijit.range.getIndex(_64,_64.parentNode).o;
+this[_63](_64.parentNode,_66.pop()+ext);
 },_getIERange:function(){
 var r=(this._body||this.endContainer.ownerDocument.body).createTextRange();
 dijit.range.ie.setRange(r,this.startContainer,this.startOffset,this.endContainer,this.endOffset,this.collapsed);
 return r;
-},getBookmark:function(_7c){
+},getBookmark:function(_67){
 this._getIERange();
 return this._cachedBookmark;
 },_select:function(){
diff --git a/dijit/_editor/selection.js b/dijit/_editor/selection.js
index edb0aac..1e3e510 100644
--- a/dijit/_editor/selection.js
+++ b/dijit/_editor/selection.js
@@ -9,7 +9,7 @@ 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){
+if(dojo.isIE){
 return dojo.doc.selection.type.toLowerCase();
 }else{
 var _1="text";
@@ -28,7 +28,7 @@ _1="control";
 return _1;
 }
 },getSelectedText:function(){
-if(dojo.doc.selection){
+if(dojo.isIE){
 if(dijit._editor.selection.getType()=="control"){
 return null;
 }
@@ -41,7 +41,7 @@ return _4.toString();
 }
 return "";
 },getSelectedHtml:function(){
-if(dojo.doc.selection){
+if(dojo.isIE){
 if(dijit._editor.selection.getType()=="control"){
 return null;
 }
@@ -49,23 +49,28 @@ return dojo.doc.selection.createRange().htmlText;
 }else{
 var _5=dojo.global.getSelection();
 if(_5&&_5.rangeCount){
-var _6=_5.getRangeAt(0).cloneContents();
-var _7=dojo.doc.createElement("div");
-_7.appendChild(_6);
-return _7.innerHTML;
+var i;
+var _6="";
+for(i=0;i<_5.rangeCount;i++){
+var _7=_5.getRangeAt(i).cloneContents();
+var _8=dojo.doc.createElement("div");
+_8.appendChild(_7);
+_6+=_8.innerHTML;
+}
+return _6;
 }
 return null;
 }
 },getSelectedElement:function(){
 if(dijit._editor.selection.getType()=="control"){
-if(dojo.doc.selection){
-var _8=dojo.doc.selection.createRange();
-if(_8&&_8.item){
+if(dojo.isIE){
+var _9=dojo.doc.selection.createRange();
+if(_9&&_9.item){
 return dojo.doc.selection.createRange().item(0);
 }
 }else{
-var _9=dojo.global.getSelection();
-return _9.anchorNode.childNodes[_9.anchorOffset];
+var _a=dojo.global.getSelection();
+return _a.anchorNode.childNodes[_a.anchorOffset];
 }
 }
 return null;
@@ -76,125 +81,144 @@ if(p){
 return p.parentNode;
 }
 }else{
-if(dojo.doc.selection){
+if(dojo.isIE){
 var r=dojo.doc.selection.createRange();
 r.collapse(true);
 return r.parentElement();
 }else{
-var _c=dojo.global.getSelection();
-if(_c){
-var _d=_c.anchorNode;
-while(_d&&(_d.nodeType!=1)){
-_d=_d.parentNode;
+var _b=dojo.global.getSelection();
+if(_b){
+var _c=_b.anchorNode;
+while(_c&&(_c.nodeType!=1)){
+_c=_c.parentNode;
 }
-return _d;
+return _c;
 }
 }
 }
 return null;
-},hasAncestorElement:function(_e){
+},hasAncestorElement:function(_d){
 return this.getAncestorElement.apply(this,arguments)!=null;
-},getAncestorElement:function(_f){
-var _10=this.getSelectedElement()||this.getParentElement();
-return this.getParentOfType(_10,arguments);
-},isTag:function(_11,_12){
-if(_11&&_11.tagName){
-var _13=_11.tagName.toLowerCase();
-for(var i=0;i<_12.length;i++){
-var _15=String(_12[i]).toLowerCase();
-if(_13==_15){
-return _15;
+},getAncestorElement:function(_e){
+var _f=this.getSelectedElement()||this.getParentElement();
+return this.getParentOfType(_f,arguments);
+},isTag:function(_10,_11){
+if(_10&&_10.tagName){
+var _12=_10.tagName.toLowerCase();
+for(var i=0;i<_11.length;i++){
+var _13=String(_11[i]).toLowerCase();
+if(_12==_13){
+return _13;
 }
 }
 }
 return "";
-},getParentOfType:function(_16,_17){
-while(_16){
-if(this.isTag(_16,_17).length){
-return _16;
+},getParentOfType:function(_14,_15){
+while(_14){
+if(this.isTag(_14,_15).length){
+return _14;
 }
-_16=_16.parentNode;
+_14=_14.parentNode;
 }
 return null;
-},collapse:function(_18){
-if(window["getSelection"]){
-var _19=dojo.global.getSelection();
-if(_19.removeAllRanges){
-if(_18){
-_19.collapseToStart();
+},collapse:function(_16){
+if(window.getSelection){
+var _17=dojo.global.getSelection();
+if(_17.removeAllRanges){
+if(_16){
+_17.collapseToStart();
 }else{
-_19.collapseToEnd();
+_17.collapseToEnd();
 }
 }else{
-_19.collapse(_18);
+_17.collapse(_16);
 }
 }else{
-if(dojo.doc.selection){
-var _1a=dojo.doc.selection.createRange();
-_1a.collapse(_18);
-_1a.select();
+if(dojo.isIE){
+var _18=dojo.doc.selection.createRange();
+_18.collapse(_16);
+_18.select();
 }
 }
 },remove:function(){
-var _s=dojo.doc.selection;
-if(_s){
-if(_s.type.toLowerCase()!="none"){
-_s.clear();
+var sel=dojo.doc.selection;
+if(dojo.isIE){
+if(sel.type.toLowerCase()!="none"){
+sel.clear();
 }
-return _s;
+return sel;
 }else{
-_s=dojo.global.getSelection();
-_s.deleteFromDocument();
-return _s;
-}
-},selectElementChildren:function(_1c,_1d){
-var _1e=dojo.global;
-var _1f=dojo.doc;
-_1c=dojo.byId(_1c);
-if(_1f.selection&&dojo.body().createTextRange){
-var _20=_1c.ownerDocument.body.createTextRange();
-_20.moveToElementText(_1c);
-if(!_1d){
+sel=dojo.global.getSelection();
+sel.deleteFromDocument();
+return sel;
+}
+},selectElementChildren:function(_19,_1a){
+var win=dojo.global;
+var doc=dojo.doc;
+var _1b;
+_19=dojo.byId(_19);
+if(doc.selection&&dojo.isIE&&dojo.body().createTextRange){
+_1b=_19.ownerDocument.body.createTextRange();
+_1b.moveToElementText(_19);
+if(!_1a){
 try{
-_20.select();
+_1b.select();
 }
 catch(e){
 }
 }
 }else{
-if(_1e.getSelection){
-var _21=_1e.getSelection();
-if(_21.setBaseAndExtent){
-_21.setBaseAndExtent(_1c,0,_1c,_1c.innerText.length-1);
+if(win.getSelection){
+var _1c=dojo.global.getSelection();
+if(_1c.setBaseAndExtent){
+_1c.setBaseAndExtent(_19,0,_19,_19.innerText.length-1);
+}else{
+if(dojo.isOpera){
+if(_1c.rangeCount){
+_1b=_1c.getRangeAt(0);
+}else{
+_1b=doc.createRange();
+}
+_1b.setStart(_19,0);
+_1b.setEnd(_19,(_19.nodeType==3)?_19.length:_19.childNodes.length);
+_1c.addRange(_1b);
 }else{
-if(_21.selectAllChildren){
-_21.selectAllChildren(_1c);
+if(_1c.selectAllChildren){
+_1c.selectAllChildren(_19);
 }
 }
 }
 }
-},selectElement:function(_22,_23){
-var _24,_25=dojo.doc;
-_22=dojo.byId(_22);
-if(_25.selection&&dojo.body().createTextRange){
+}
+},selectElement:function(_1d,_1e){
+var _1f;
+var doc=dojo.doc;
+var win=dojo.global;
+_1d=dojo.byId(_1d);
+if(dojo.isIE&&dojo.body().createTextRange){
 try{
-_24=dojo.body().createControlRange();
-_24.addElement(_22);
-if(!_23){
-_24.select();
+_1f=dojo.body().createControlRange();
+_1f.addElement(_1d);
+if(!_1e){
+_1f.select();
 }
 }
 catch(e){
-this.selectElementChildren(_22,_23);
+this.selectElementChildren(_1d,_1e);
 }
 }else{
 if(dojo.global.getSelection){
-var _26=dojo.global.getSelection();
-if(_26.removeAllRanges){
-_24=_25.createRange();
-_24.selectNode(_22);
-_26.removeAllRanges();
-_26.addRange(_24);
+var _20=win.getSelection();
+_1f=doc.createRange();
+if(_20.removeAllRanges){
+if(dojo.isOpera){
+if(_20.getRangeAt(0)){
+_1f=_20.getRangeAt(0);
+}
+}
+_1f.selectNode(_1d);
+_20.removeAllRanges();
+_20.addRange(_1f);
 }
 }
 }
diff --git a/dijit/_tree/dndContainer.js b/dijit/_tree/dndContainer.js
deleted file mode 100644
index d8c09ee..0000000
--- a/dijit/_tree/dndContainer.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._tree.dndContainer"]){
-dojo._hasResource["dijit._tree.dndContainer"]=true;
-dojo.provide("dijit._tree.dndContainer");
-dojo.require("dojo.dnd.common");
-dojo.require("dojo.dnd.Container");
-dojo.declare("dijit._tree.dndContainer",null,{constructor:function(_1,_2){
-this.tree=_1;
-this.node=_1.domNode;
-dojo.mixin(this,_2);
-this.map={};
-this.current=null;
-this.containerState="";
-dojo.addClass(this.node,"dojoDndContainer");
-if(!(_2&&_2._skipStartup)){
-this.startup();
-}
-this.events=[dojo.connect(this.node,"onmouseenter",this,"onOverEvent"),dojo.connect(this.node,"onmouseleave",this,"onOutEvent"),dojo.connect(this.tree,"_onNodeMouseEnter",this,"onMouseOver"),dojo.connect(this.tree,"_onNodeMouseLeave",this,"onMouseOut"),dojo.connect(this.node,"ondragstart",dojo,"stopEvent"),dojo.connect(this.node,"onselectstart",dojo,"stopEvent")];
-},getItem:function(_3){
-return this.selection[_3];
-},destroy:function(){
-dojo.forEach(this.events,dojo.disconnect);
-this.node=this.parent=null;
-},onMouseOver:function(_4,_5){
-this.current=_4.rowNode;
-this.currentWidget=_4;
-},onMouseOut:function(_6,_7){
-this.current=null;
-this.currentWidget=null;
-},_changeState:function(_8,_9){
-var _a="dojoDnd"+_8;
-var _b=_8.toLowerCase()+"State";
-dojo.removeClass(this.node,_a+this[_b]);
-dojo.addClass(this.node,_a+_9);
-this[_b]=_9;
-},_addItemClass:function(_c,_d){
-dojo.addClass(_c,"dojoDndItem"+_d);
-},_removeItemClass:function(_e,_f){
-dojo.removeClass(_e,"dojoDndItem"+_f);
-},onOverEvent:function(){
-this._changeState("Container","Over");
-},onOutEvent:function(){
-this._changeState("Container","");
-}});
-}
diff --git a/dijit/_tree/dndSelector.js b/dijit/_tree/dndSelector.js
deleted file mode 100644
index fc10f1b..0000000
--- a/dijit/_tree/dndSelector.js
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dijit._tree.dndSelector"]){
-dojo._hasResource["dijit._tree.dndSelector"]=true;
-dojo.provide("dijit._tree.dndSelector");
-dojo.require("dojo.dnd.common");
-dojo.require("dijit._tree.dndContainer");
-dojo.declare("dijit._tree.dndSelector",dijit._tree.dndContainer,{constructor:function(_1,_2){
-this.selection={};
-this.anchor=null;
-this.simpleSelection=false;
-this.events.push(dojo.connect(this.tree.domNode,"onmousedown",this,"onMouseDown"),dojo.connect(this.tree.domNode,"onmouseup",this,"onMouseUp"));
-},singular:false,getSelectedItems:function(){
-var _3=[];
-for(var i in this.selection){
-_3.push(dijit.getEnclosingWidget(this.selection[i]).item);
-}
-return _3;
-},getSelectedNodes:function(){
-return this.selection;
-},selectNone:function(){
-return this._removeSelection()._removeAnchor();
-},insertItems:function(_5,_6){
-},destroy:function(){
-dijit._tree.dndSelector.superclass.destroy.call(this);
-this.selection=this.anchor=null;
-},onMouseDown:function(e){
-if(!this.current){
-return;
-}
-if(e.button==2){
-return;
-}
-var _8=dijit.getEnclosingWidget(this.current).item;
-var id=this.tree.model.getIdentity(_8);
-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)){
-}else{
-}
-}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 _8=dijit.getEnclosingWidget(this.current).item;
-var id=this.tree.model.getIdentity(_8);
-if(!(id in this.selection)){
-this.selectNone();
-this.anchor=this.current;
-this._addItemClass(this.current,"Anchor");
-this.selection[id]=this.current;
-}
-}
-}
-}
-dojo.stopEvent(e);
-},onMouseUp:function(e){
-if(!this.simpleSelection){
-return;
-}
-this.simpleSelection=false;
-this.selectNone();
-if(this.current){
-this.anchor=this.current;
-this._addItemClass(this.anchor,"Anchor");
-this.selection[this.current.id]=this.current;
-}
-},_removeSelection:function(){
-var e=dojo.dnd._empty;
-for(var i in this.selection){
-if(i in e){
-continue;
-}
-var _d=dojo.byId(i);
-if(_d){
-this._removeItemClass(_d,"Selected");
-}
-}
-this.selection={};
-return this;
-},_removeAnchor:function(){
-if(this.anchor){
-this._removeItemClass(this.anchor,"Anchor");
-this.anchor=null;
-}
-return this;
-}});
-}
diff --git a/dijit/_tree/dndSource.js b/dijit/_tree/dndSource.js
index 9cf7658..48bab03 100644
--- a/dijit/_tree/dndSource.js
+++ b/dijit/_tree/dndSource.js
@@ -8,224 +8,7 @@
 if(!dojo._hasResource["dijit._tree.dndSource"]){
 dojo._hasResource["dijit._tree.dndSource"]=true;
 dojo.provide("dijit._tree.dndSource");
-dojo.require("dijit._tree.dndSelector");
-dojo.require("dojo.dnd.Manager");
-dojo.declare("dijit._tree.dndSource",dijit._tree.dndSelector,{isSource:true,accept:["text"],copyOnly:false,dragThreshold:0,betweenThreshold:0,skipForm:false,constructor:function(_1,_2){
-if(!_2){
-_2={};
-}
-dojo.mixin(this,_2);
-this.isSource=typeof _2.isSource=="undefined"?true:_2.isSource;
-var _3=_2.accept instanceof Array?_2.accept:["text"];
-this.accept=null;
-if(_3.length){
-this.accept={};
-for(var i=0;i<_3.length;++i){
-this.accept[_3[i]]=1;
-}
-}
-this.isDragging=false;
-this.mouseDown=false;
-this.targetAnchor=null;
-this.targetBox=null;
-this.dropPosition="";
-this._lastX=0;
-this._lastY=0;
-this.sourceState="";
-if(this.isSource){
-dojo.addClass(this.node,"dojoDndSource");
-}
-this.targetState="";
-if(this.accept){
-dojo.addClass(this.node,"dojoDndTarget");
-}
-this.topics=[dojo.subscribe("/dnd/source/over",this,"onDndSourceOver"),dojo.subscribe("/dnd/start",this,"onDndStart"),dojo.subscribe("/dnd/drop",this,"onDndDrop"),dojo.subscribe("/dnd/cancel",this,"onDndCancel")];
-this.events.push(dojo.connect(this.node,"onmousemove",this,"onMouseMove"));
-},startup:function(){
-},checkAcceptance:function(_5,_6){
-return true;
-},copyState:function(_7){
-return this.copyOnly||_7;
-},destroy:function(){
-this.inherited("destroy",arguments);
-dojo.forEach(this.topics,dojo.unsubscribe);
-this.targetAnchor=null;
-},_onDragMouse:function(e){
-var m=dojo.dnd.manager(),_a=this.targetAnchor,_b=this.current,_c=this.currentWidget,_d=this.dropPosition;
-var _e="Over";
-if(_b&&this.betweenThreshold>0){
-if(!this.targetBox||_a!=_b){
-this.targetBox={xy:dojo.coords(_b,true),w:_b.offsetWidth,h:_b.offsetHeight};
-}
-if((e.pageY-this.targetBox.xy.y)<=this.betweenThreshold){
-_e="Before";
-}else{
-if((e.pageY-this.targetBox.xy.y)>=(this.targetBox.h-this.betweenThreshold)){
-_e="After";
-}
-}
-}
-if(_b!=_a||_e!=_d){
-if(_a){
-this._removeItemClass(_a,_d);
-}
-if(_b){
-this._addItemClass(_b,_e);
-}
-if(!_b){
-m.canDrop(false);
-}else{
-if(_c==this.tree.rootNode&&_e!="Over"){
-m.canDrop(false);
-}else{
-if(m.source==this&&(_b.id in this.selection)){
-m.canDrop(false);
-}else{
-if(this.checkItemAcceptance(_b,m.source,_e.toLowerCase())){
-m.canDrop(true);
-}else{
-m.canDrop(false);
-}
-}
-}
-}
-this.targetAnchor=_b;
-this.dropPosition=_e;
-}
-},onMouseMove:function(e){
-if(this.isDragging&&this.targetState=="Disabled"){
-return;
-}
-var m=dojo.dnd.manager();
-if(this.isDragging){
-if(this.betweenThreshold>0){
-this._onDragMouse(e);
-}
-}else{
-if(this.mouseDown&&this.isSource&&(Math.abs(e.pageX-this._lastX)>=this.dragThreshold||Math.abs(e.pageY-this._lastY)>=this.dragThreshold)){
-var n=this.getSelectedNodes();
-var _12=[];
-for(var i in n){
-_12.push(n[i]);
-}
-if(_12.length){
-m.startDrag(this,_12,this.copyState(dojo.dnd.getCopyKeyState(e)));
-}
-}
-}
-},onMouseDown:function(e){
-this.mouseDown=true;
-this.mouseButton=e.button;
-this._lastX=e.pageX;
-this._lastY=e.pageY;
-this.inherited("onMouseDown",arguments);
-},onMouseUp:function(e){
-if(this.mouseDown){
-this.mouseDown=false;
-this.inherited("onMouseUp",arguments);
-}
-},onMouseOver:function(_16,e){
-this.inherited(arguments);
-if(this.isDragging){
-this._onDragMouse(e);
-}
-},onMouseOut:function(){
-this.inherited(arguments);
-this._unmarkTargetAnchor();
-},checkItemAcceptance:function(_18,_19,_1a){
-return true;
-},onDndSourceOver:function(_1b){
-if(this!=_1b){
-this.mouseDown=false;
-this._unmarkTargetAnchor();
-}else{
-if(this.isDragging){
-var m=dojo.dnd.manager();
-m.canDrop(false);
-}
-}
-},onDndStart:function(_1d,_1e,_1f){
-if(this.isSource){
-this._changeState("Source",this==_1d?(_1f?"Copied":"Moved"):"");
-}
-var _20=this.checkAcceptance(_1d,_1e);
-this._changeState("Target",_20?"":"Disabled");
-if(_20){
-dojo.dnd.manager().overSource(this);
-}
-this.isDragging=true;
-},itemCreator:function(_21){
-return dojo.map(_21,function(_22){
-return {"id":_22.id,"name":_22.textContent||_22.innerText||""};
-});
-},onDndDrop:function(_23,_24,_25){
-if(this.containerState=="Over"){
-var _26=this.tree,_27=_26.model,_28=this.targetAnchor,_29=false;
-this.isDragging=false;
-var _2a=dijit.getEnclosingWidget(_28);
-var _2b;
-var _2c;
-_2b=(_2a&&_2a.item)||_26.item;
-if(this.dropPosition=="Before"||this.dropPosition=="After"){
-_2b=(_2a.getParent()&&_2a.getParent().item)||_26.item;
-_2c=_2a.getIndexInParent();
-if(this.dropPosition=="After"){
-_2c=_2a.getIndexInParent()+1;
-}
-}else{
-_2b=(_2a&&_2a.item)||_26.item;
-}
-var _2d;
-if(_23!=this){
-_2d=this.itemCreator(_24,_28);
-}
-dojo.forEach(_24,function(_2e,idx){
-if(_23==this){
-var _30=dijit.getEnclosingWidget(_2e),_31=_30.item,_32=_30.getParent().item;
-if(typeof _2c=="number"){
-if(_2b==_32&&_30.getIndexInParent()<_2c){
-_2c-=1;
-}
-}
-_27.pasteItem(_31,_32,_2b,_25,_2c);
-}else{
-_27.newItem(_2d[idx],_2b);
-}
-},this);
-this.tree._expandNode(_2a);
-}
-this.onDndCancel();
-},onDndCancel:function(){
-this._unmarkTargetAnchor();
-this.isDragging=false;
-this.mouseDown=false;
-delete this.mouseButton;
-this._changeState("Source","");
-this._changeState("Target","");
-},onOverEvent:function(){
-this.inherited(arguments);
-dojo.dnd.manager().overSource(this);
-},onOutEvent:function(){
-this._unmarkTargetAnchor();
-var m=dojo.dnd.manager();
-if(this.isDragging){
-m.canDrop(false);
-}
-m.outSource(this);
-this.inherited(arguments);
-},_unmarkTargetAnchor:function(){
-if(!this.targetAnchor){
-return;
-}
-this._removeItemClass(this.targetAnchor,this.dropPosition);
-this.targetAnchor=null;
-this.targetBox=null;
-this.dropPosition=null;
-},_markDndStatus:function(_34){
-this._changeState("Source",_34?"Copied":"Moved");
-}});
-dojo.declare("dijit._tree.dndTarget",dijit._tree.dndSource,{constructor:function(_35,_36){
-this.isSource=false;
-dojo.removeClass(this.node,"dojoDndSource");
-}});
+dojo.require("dijit.tree.dndSource");
+dojo.deprecated("dijit._tree.dndSource has been moved to dijit.tree.dndSource, use that instead","","2.0");
+dijit._tree.dndSource=dijit.tree.dndSource;
 }
diff --git a/dijit/dijit-all.js b/dijit/dijit-all.js
index 6d74312..7a4cc42 100644
--- a/dijit/dijit-all.js
+++ b/dijit/dijit-all.js
@@ -13,4 +13,4 @@
 	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],a;if((t=="rgb"&&l==3)||(t=="rgba"&&l==4)){var r=c[0];if(r. [...]
+if(!dojo._hasResource["dojo.colors"]){dojo._hasResource["dojo.colors"]=true;dojo.provide("dojo.colors");(function(){var _1=function(m1,m2,h){if(h<0){++h;}if(h>1){--h;}var h6=6*h;if(h6<1){return m1+(m2-m1)*h6;}if(2*h<1){return m2;}if(3*h<2){return m1+(m2-m1)*(2/3-h)*6;}return m1;};dojo.colorFromRgb=function(_2,_3){var m=_2.toLowerCase().match(/^(rgba?|hsla?)\(([\s\.\-,%0-9]+)\)/);if(m){var c=m[2].split(/\s*,\s*/),l=c.length,t=m[1],a;if((t=="rgb"&&l==3)||(t=="rgba"&&l==4)){var r=c[0];if(r. [...]
diff --git a/dijit/dijit-all.js.uncompressed.js b/dijit/dijit-all.js.uncompressed.js
index b7a45ed..32c4ae8 100644
--- a/dijit/dijit-all.js.uncompressed.js
+++ b/dijit/dijit-all.js.uncompressed.js
@@ -511,7 +511,7 @@ dojo.declare("dijit.ColorPalette",
 	// summary:
 	//		A keyboard accessible color-picking widget
 	// description:
-	//		Grid showing various colors, so the user can pick a certain color
+	//		Grid showing various colors, so the user can pick a certain color.
 	//		Can be used standalone, or as a popup.
 	//
 	// example:
@@ -539,8 +539,9 @@ dojo.declare("dijit.ColorPalette",
 	//		The value of the selected color.
 	value: null,
 
-	// _currentFocus: [private] Integer
-	//		Index of the currently focused color.
+	// _currentFocus: [private] DomNode
+	//		The currently focused or hovered color.
+	//		Different from value, which represents the selected (i.e. clicked) color.
 	_currentFocus: 0,
 
 	// _xDim: [protected] Integer
@@ -556,7 +557,6 @@ dojo.declare("dijit.ColorPalette",
 	//		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"],
@@ -567,8 +567,7 @@ dojo.declare("dijit.ColorPalette",
 
 		"3x4": [["white", "lime", "green", "blue"],
 			["silver", "yellow", "fuchsia", "navy"],
-			["gray", "red", "purple", "black"]]	
-
+			["gray", "red", "purple", "black"]]
 	},
 
 	// _imagePaths: [protected] Map
@@ -584,12 +583,11 @@ dojo.declare("dijit.ColorPalette",
 	_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",
+	// templateString: String
+	//		The template of this widget.
+	templateString: dojo.cache("dijit", "templates/ColorPalette.html", "<div class=\"dijitInline dijitColorPalette\">\n\t<div class=\"dijitColorPaletteInner\" dojoAttachPoint=\"divNode\" waiRole=\"grid\"\">\n\t\t<img class=\"dijitColorPaletteUnder\" dojoAttachPoint=\"imageNode\" waiRole=\"presentation\" alt=\"\">\n\t</div>\n</div>\n"),
 
 	// _paletteDims: [protected] Object
 	//		Size of the supported palettes for alignment purposes.
@@ -602,69 +600,74 @@ dojo.declare("dijit.ColorPalette",
 	//		Widget tab index.
 	tabIndex: "0",
 
-	postCreate: function(){
+	buildRendering: function(){
+		// Instantiate the template, which makes a skeleton into which we'll insert a bunch of
+		// <img> nodes
+		this.inherited(arguments);
+	
 		// 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.imageNode.setAttribute("src", this._imagePaths[this.palette].toString());
+		var choices = this._palettes[this.palette];
 		this.domNode.style.position = "relative";
-		this._cellNodes = [];	
+		this._cellNodes = [];
 		this.colorNames = dojo.i18n.getLocalization("dojo", "colors", this.lang);
 		var url = this._blankGif,
-            colorObject = new dojo.Color(),
-		    coords = this._paletteCoords;
+			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 rowNode = dojo.create("div", {
+				role: "row"
+			}, this.divNode);
+			for(var col=0; col < choices[row].length; col++){
 
-                var color = choices[row][col],
-                        colorValue = colorObject.setColor(dojo.Color.named[color])
-				;
+				var color = choices[row][col],
+						colorValue = colorObject.setColor(dojo.Color.named[color]);
 
-                var cellNode = dojo.create("span", {
-					"class":"dijitPaletteCell",
-					"tabindex":"-1",
+				var cellNode = dojo.create("span", {
+					"class": "dijitPaletteCell",
+					tabIndex: "-1",
 					title: this.colorNames[color],
-					style:{
+					style: {
 						top: coords.topOffset + (row * coords.cHeight) + "px",
 						left: coords.leftOffset + (col * coords.cWidth) + "px"
 					}
 				});
-				
+
 				var imgNode = dojo.create("img",{
-					src: url, 
+					src: url,
 					"class":"dijitPaletteImg",
 					alt: this.colorNames[color]
 				}, cellNode);
-				
+
 				// FIXME: color is an attribute of img?
 				imgNode.color = colorValue.toHex();
 				var imgStyle = imgNode.style;
 				imgStyle.color = imgStyle.backgroundColor = imgNode.color;
 
-                dojo.forEach(["Dijitclick", "MouseEnter", "Focus", "Blur"], function(handler) {
-                    this.connect(cellNode, "on" + handler.toLowerCase(), "_onCell" + handler);
-                }, this);
+				dojo.forEach(["Dijitclick", "MouseEnter", "MouseLeave", "Focus"], function(handler){
+					this.connect(cellNode, "on" + handler.toLowerCase(), "_onCell" + handler);
+				}, this);
 
-				dojo.place(cellNode, this.divNode);
+				dojo.place(cellNode, rowNode);
 
-                dijit.setWaiRole(cellNode, "gridcell");
-                cellNode.index = this._cellNodes.length;
-                this._cellNodes.push(cellNode);
-            }
+				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.		
+		// 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.	
+			// 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,
@@ -681,11 +684,26 @@ dojo.declare("dijit.ColorPalette",
 				this.timeoutChangeRate, this.defaultTimeout));
 		}
 	},
+	
+	postCreate: function(){
+		this.inherited(arguments);
+
+		// Set initial navigable node.   At any point in time there's exactly one
+		// cell with tabIndex != -1.   If focus is inside the ColorPalette then
+		// focus is on that cell.
+		// TODO: if we set aria info (for the current value) on the ColorPalette itself then can we avoid
+		// having to focus each individual cell?
+		this._currentFocus = this._cellNodes[0];
+		dojo.attr(this._currentFocus, "tabIndex", this.tabIndex);
+	},
 
 	focus: function(){
 		// summary:
-		//		Focus this ColorPalette.  Puts focus on the first swatch.
-		this._focusFirst();
+		//		Focus this ColorPalette.  Puts focus on the most recently focused cell.
+
+		// The cell already has tabIndex set, just need to set CSS and focus it
+		dojo.addClass(this._currentFocus, "dijitPaletteCellHighlight");
+		dijit.focus(this._currentFocus);
 	},
 
 	onChange: function(color){
@@ -693,57 +711,34 @@ dojo.declare("dijit.ColorPalette",
 		//		Callback when a color is selected.
 		// color: String
 		//		Hex value corresponding to color.
-//		
-	},
-
-	_focusFirst: function(){
-		// summary:
-		//		Focus the first cell in the color picker,
-		//		or the previously selected cell, if there is one
-		// tags:
-		//		private
-		this._currentFocus = 0;
-		var cellNode = this._cellNodes[this._currentFocus];
-		window.setTimeout(function(){dijit.focus(cellNode)}, 0);
-	},
-
-	_onDivNodeFocus: function(evt){
-		// summary:
-		//		Handler for when focus goes to the ColorPalette itself.
-		//		Shifts focus to the first color or the previously selected
-		//		color.
-		// tags:
-		//		private
-
-		// focus bubbles on Firefox 2, so just make sure that focus has really
-		// gone to the container
-		if(evt.target === this.divNode){
-			this._focusFirst();
-		}
+//		console.debug("Color selected is: "+color);
 	},
 
 	_onFocus: function(){
 		// summary:
-		//		Handler for when the ColorPalette or a color cell inside of it get focus
+		//		Handler for when the ColorPalette gets focus (because a cell inside
+		//		the ColorPalette got focus)
 		// tags:
 		//		protected
 
-		// 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");
+		dojo.addClass(this._currentFocus, "dijitPaletteCellHighlight");
+		this.inherited(arguments);
 	},
 
 	_onBlur: function(){
 		// summary:
-		//		Handler for when the ColorPalette and the color cell inside of it lose focus
+		//		Handler for when the ColorPalette loses focus
 		// tags:
 		//		protected
 
-		this._removeCellHighlight(this._currentFocus);
+		// Just to be the same as 1.3, when I am focused again go to first (0,0) cell rather than
+		// currently focused node.
+		dojo.attr(this._currentFocus, "tabIndex", "-1");
+		dojo.removeClass(this._currentFocus, "dijitPaletteCellHighlight");
+		this._currentFocus = this._cellNodes[0];
+		dojo.attr(this._currentFocus, "tabIndex", this.tabIndex);
 
-		// when focus leaves the palette, restore its tabindex, since it was
-		// modified by _onFocus().
-		dojo.attr(this.divNode, "tabindex", this.tabIndex);
+		this.inherited(arguments);
 	},
 
 	_onCellDijitclick: function(/*Event*/ evt){
@@ -755,32 +750,40 @@ dojo.declare("dijit.ColorPalette",
 		//		private
 
 		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.
+		//		Handler for onMouseEnter event on a cell. Put highlight on the color under the mouse.
 		// evt:
 		//		The mouse event.
 		// tags:
 		//		private
 
 		var target = evt.currentTarget;
-		this._setCurrent(target);	// redundant, but needed per safari bug where onCellFocus never called
-		window.setTimeout(function(){dijit.focus(target)}, 0);
+		this._setCurrent(target);
+	},
+
+	_onCellMouseLeave: function(/*Event*/ evt){
+		// summary:
+		//		Handler for onMouseLeave event on a cell. Remove highlight on the color under the mouse.
+		// evt:
+		//		The mouse event.
+		// tags:
+		//		private
+
+		dojo.removeClass(this._currentFocus, "dijitPaletteCellHighlight");
 	},
 
 	_onCellFocus: function(/*Event*/ evt){
 		// summary:
-		//		Handler for onFocus of a cell. Removes highlight of
-		//		the color that just lost focus, and highlights
-		//		the new color.
+		//		Handler for onFocus of a cell.
+		// description:
+		//		Removes highlight of the color that just lost focus, and highlights
+		//		the new color.  Also moves the tabIndex setting to the new cell.
+		//		
 		// evt:
 		//		The focus event.
 		// tags:
@@ -794,31 +797,24 @@ dojo.declare("dijit.ColorPalette",
 		//		Called when a color is hovered or focused.
 		// description:
 		//		Removes highlight of the old color, and highlights
-		//		the new color.
+		//		the new color.  Also moves the tabIndex setting to the new cell.
 		// tags:
 		//		protected
-		this._removeCellHighlight(this._currentFocus);
-		this._currentFocus = node.index;
-		dojo.addClass(node, "dijitPaletteCellHighlight");		
-	},
-
-	_onCellBlur: function(/*Event*/ evt){
-		// summary:
-		//		needed for Firefox 2 on Mac OS X
-		// tags:
-		//		private
-		this._removeCellHighlight(this._currentFocus);
-	},
+		if("_currentFocus" in this){
+			// Remove highlight and tabIndex on old cell
+			dojo.attr(this._currentFocus, "tabIndex", "-1");
+			dojo.removeClass(this._currentFocus, "dijitPaletteCellHighlight");
+		}
 
-	_removeCellHighlight: function(index){
-		// summary:
-		//		Removes the hover CSS class for the specified cell
-		// tags:
-		//		private
-		dojo.removeClass(this._cellNodes[index], "dijitPaletteCellHighlight");
+		// Set highlight and tabIndex of new cell
+		this._currentFocus = node;
+		if(node){
+			dojo.attr(node, "tabIndex", this.tabIndex);
+			dojo.addClass(node, "dijitPaletteCellHighlight");
+		}
 	},
 
-	_selectColor: function(selectNode){	
+	_selectColor: function(selectNode){
 		// summary:
 		// 		This selects a color. It triggers the onChange event
 		// area:
@@ -843,11 +839,15 @@ dojo.declare("dijit.ColorPalette",
 		// typecount == -1 means the key is released.
 		if(typeCount == -1){ return; }
 
-		var newFocusIndex = this._currentFocus + increment;
+		var newFocusIndex = this._currentFocus.index + increment;
 		if(newFocusIndex < this._cellNodes.length && newFocusIndex > -1)
 		{
 			var focusNode = this._cellNodes[newFocusIndex];
-			focusNode.focus();
+			this._setCurrent(focusNode);
+
+			// Actually focus the node, for the benefit of screen readers.
+			// Use setTimeout because IE doesn't like changing focus inside of an event handler
+			setTimeout(dojo.hitch(dijit, "focus", focusNode), 0);
 		}
 	}
 });
@@ -893,7 +893,7 @@ dojo.declare(
 				regularConnects = dojo.query("> script[type^='dojo/connect']", src).orphan(),
 				srcType = src.nodeName;
 
-			var propList = this.defaults||{};
+			var propList = this.defaults || {};
 
 			// For all methods defined like <script type="dojo/method" event="foo">,
 			// add that method to prototype
@@ -912,7 +912,7 @@ dojo.declare(
 
 			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+">";
+			propList.templateString = "<"+srcType+" class='"+src.className+"' dojoAttachPoint='"+(src.getAttribute("dojoAttachPoint") || '')+"' dojoAttachEvent='"+(src.getAttribute("dojoAttachEvent") || '')+"' >"+src.innerHTML.replace(/\%7B/g,"{").replace(/\%7D/g,"}")+"</"+srcType+">";
 
 			// strip things so we don't create stuff under us in the initial setup phase
 			dojo.query("[dojoType]", src).forEach(function(node){
@@ -935,7 +935,7 @@ dojo.declare(
 			// in the _prototype_.
 			var connects = regularConnects.concat(postscriptConnects);
 			dojo.forEach(connects, function(s){
-				var evt = s.getAttribute("event")||"postscript",
+				var evt = s.getAttribute("event") || "postscript",
 					func = dojo.parser._functionFromScript(s);
 				dojo.connect(wc.prototype, evt, func);
 			});
@@ -949,19 +949,10 @@ if(!dojo._hasResource["dojo.dnd.common"]){ //_hasResource checks added by build.
 dojo._hasResource["dojo.dnd.common"] = true;
 dojo.provide("dojo.dnd.common");
 
-dojo.dnd._isMac = navigator.appVersion.indexOf("Macintosh") >= 0;
-dojo.dnd._copyKey = dojo.dnd._isMac ? "metaKey" : "ctrlKey";
-
-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
+	// summary:
+	//		returns a unique string for use with any DOM element
 	var id;
 	do{
 		id = dojo._scopeName + "Unique" + (++dojo.dnd._uniqueId);
@@ -972,7 +963,8 @@ dojo.dnd.getUniqueId = function(){
 dojo.dnd._empty = {};
 
 dojo.dnd.isFormElement = function(/*Event*/ e){
-	// summary: returns true, if user clicked on a form element
+	// summary:
+	//		returns true if user clicked on a form element
 	var t = e.target;
 	if(t.nodeType == 3 /*TEXT_NODE*/){
 		t = t.parentNode;
@@ -980,13 +972,6 @@ dojo.dnd.isFormElement = function(/*Event*/ e){
 	return " button textarea input select option ".indexOf(" " + t.tagName.toLowerCase() + " ") >= 0;	// Boolean
 };
 
-// doesn't take into account when multiple buttons are pressed
-dojo.dnd._lmb = dojo.isIE ? 1 : 0;	// left mouse button
-
-dojo.dnd._isLmbPressed = dojo.isIE ?
-	function(e){ return e.button & 1; } : // intentional bit-and
-	function(e){ return e.button === 0; };
-
 }
 
 if(!dojo._hasResource["dojo.dnd.autoscroll"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
@@ -994,7 +979,10 @@ 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)
+	// summary:
+	//		Returns a viewport size (visible part of the window)
+
+	// TODO: remove this when getViewport() moved to dojo core, see #7028
 
 	// FIXME: need more docs!!
 	var d = dojo.doc, dd = d.documentElement, w = window, b = dojo.body();
@@ -1020,7 +1008,7 @@ dojo.dnd.autoScroll = function(e){
 	// summary:
 	//		a handler for onmousemove event, which scrolls the window, if
 	//		necesary
-	// e: Event:
+	// e: Event
 	//		onmousemove event
 
 	// FIXME: needs more docs!
@@ -1045,7 +1033,7 @@ 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:
+	// e: Event
 	//		onmousemove event
 
 	// FIXME: needs more docs!
@@ -1053,14 +1041,14 @@ dojo.dnd.autoScrollNodes = function(e){
 		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);
-				//
+				var b = dojo._getContentBox(n, s), t = dojo.position(n, true);
+				//console.log(b.l, b.t, t.x, t.y, n.scrollLeft, n.scrollTop);
 				var w = Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL, b.w / 2), 
 					h = Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL, b.h / 2),
 					rx = e.pageX - t.x, ry = e.pageY - t.y, dx = 0, dy = 0;
 				if(dojo.isWebKit || dojo.isOpera){
 					// FIXME: this code should not be here, it should be taken into account 
-					// either by the event fixing code, or the dojo._abs()
+					// either by the event fixing code, or the dojo.position()
 					// FIXME: this code doesn't work on Opera 9.5 Beta
 					rx += dojo.body().scrollLeft, ry += dojo.body().scrollTop;
 				}
@@ -1071,7 +1059,7 @@ dojo.dnd.autoScrollNodes = function(e){
 						dx = w;
 					}
 				}
-				//
+				//console.log("ry =", ry, "b.h =", b.h, "h =", h);
 				if(ry > 0 && ry < b.h){
 					if(ry < h){
 						dy = -h;
@@ -1105,13 +1093,17 @@ 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)
+		// 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;
@@ -1132,15 +1124,17 @@ dojo.declare("dojo.dnd.Mover", null, {
 	},
 	// mouse event processors
 	onMouseMove: function(e){
-		// summary: event processor for onmousemove
-		// e: Event: mouse event
+		// 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});
 		dojo.stopEvent(e);
 	},
 	onMouseUp: function(e){
-		if(dojo.isWebKit && dojo.dnd._isMac && this.mouseButton == 2 ? 
+		if(dojo.isWebKit && dojo.isMac && this.mouseButton == 2 ? 
 				e.button == 0 : this.mouseButton == e.button){
 			this.destroy();
 		}
@@ -1148,8 +1142,9 @@ dojo.declare("dojo.dnd.Mover", null, {
 	},
 	// utilities
 	onFirstMove: function(){
-		// summary: makes the node absolute; it is meant to be called only once. 
-		// 	relative and absolutely positioned nodes are assumed to use pixel units
+		// summary:
+		//		makes the node absolute; it is meant to be called only once. 
+		// 		relative and absolutely positioned nodes are assumed to use pixel units
 		var s = this.node.style, l, t, h = this.host;
 		switch(s.position){
 			case "relative":
@@ -1185,7 +1180,8 @@ dojo.declare("dojo.dnd.Mover", null, {
 		dojo.disconnect(this.events.pop());
 	},
 	destroy: function(){
-		// summary: stops the move, deletes all references, so the object can be garbage-collected
+		// 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;
@@ -1205,6 +1201,27 @@ dojo.provide("dojo.dnd.Moveable");
 
 
 
+/*=====
+dojo.declare("dojo.dnd.__MoveableArgs", [], {
+	// handle: Node||String
+	//		A node (or node's id), which is used as a mouse handle.
+	//		If omitted, the node itself is used as a handle.
+	handle: null,
+
+	// delay: Number
+	//		delay move by this number of pixels
+	delay: 0,
+
+	// skip: Boolean
+	//		skip move of form elements
+	skip: false,
+
+	// mover: Object
+	//		a constructor of custom Mover
+	mover: dojo.dnd.Mover
+});
+=====*/
+
 dojo.declare("dojo.dnd.Moveable", null, {
 	// object attributes (for markup)
 	handle: "",
@@ -1212,15 +1229,12 @@ dojo.declare("dojo.dnd.Moveable", null, {
 	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
+		// summary:
+		//		an object, which makes a node moveable
+		// node: Node
+		//		a node (or node's id) to be moved
+		// params: dojo.dnd.__MoveableArgs?
+		//		optional parameters
 		this.node = dojo.byId(node);
 		if(!params){ params = {}; }
 		this.handle = params.handle ? dojo.byId(params.handle) : null;
@@ -1243,15 +1257,18 @@ dojo.declare("dojo.dnd.Moveable", null, {
 
 	// methods
 	destroy: function(){
-		// summary: stops watching for possible move, deletes all references, so the object can be garbage-collected
+		// 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
+		// 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(
@@ -1266,8 +1283,10 @@ dojo.declare("dojo.dnd.Moveable", null, {
 		dojo.stopEvent(e);
 	},
 	onMouseMove: function(e){
-		// summary: event processor for onmousemove, used only for delayed drags
-		// e: Event: mouse event
+		// summary:
+		//		event processor for onmousemove, used only for delayed drags
+		// e: Event
+		//		mouse event
 		if(Math.abs(e.pageX - this._lastX) > this.delay || Math.abs(e.pageY - this._lastY) > this.delay){
 			this.onMouseUp(e);
 			this.onDragDetected(e);
@@ -1275,16 +1294,20 @@ dojo.declare("dojo.dnd.Moveable", null, {
 		dojo.stopEvent(e);
 	},
 	onMouseUp: function(e){
-		// summary: event processor for onmouseup, used only for delayed drags
-		// e: Event: mouse event
+		// summary:
+		//		event processor for onmouseup, used only for delayed drags
+		// e: Event
+		//		mouse event
 		for(var i = 0; i < 2; ++i){
 			dojo.disconnect(this.events.pop());
 		}
 		dojo.stopEvent(e);
 	},
 	onSelectStart: function(e){
-		// summary: event processor for onselectevent and ondragevent
-		// e: Event: mouse event
+		// summary:
+		//		event processor for onselectevent and ondragevent
+		// e: Event
+		//		mouse event
 		if(!this.skip || !dojo.dnd.isFormElement(e)){
 			dojo.stopEvent(e);
 		}
@@ -1292,31 +1315,36 @@ dojo.declare("dojo.dnd.Moveable", null, {
 	
 	// local events
 	onDragDetected: function(/* Event */ e){
-		// summary: called when the drag is detected,
-		// responsible for creation of the mover
+		// summary:
+		//		called when the drag is detected;
+		//		responsible for creation of the mover
 		new this.mover(this.node, e, this);
 	},
 	onMoveStart: function(/* dojo.dnd.Mover */ mover){
-		// summary: called before every move operation
+		// 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
+		// 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.
+		// 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.
+		// 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";
@@ -1324,14 +1352,14 @@ dojo.declare("dojo.dnd.Moveable", null, {
 		this.onMoved(mover, leftTop);
 	},
 	onMoving: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
-		// summary: called before every incremental move,
-		//	can be overwritten.
+		// 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.
+		// summary:
+		//		called after every incremental move; can be overwritten.
 		
 		// default implementation does nothing
 	}
@@ -1346,6 +1374,19 @@ dojo.provide("dojo.dnd.move");
 
 
 
+/*=====
+dojo.declare("dojo.dnd.move.__constrainedMoveableArgs", [dojo.dnd.__MoveableArgs], {
+	// constraints: Function
+	//		Calculates a constraint box.
+	//		It is called in a context of the moveable object.
+	constraints: function(){},
+
+	// within: Boolean
+	//		restrict move within boundaries.
+	within: false
+});
+=====*/
+
 dojo.declare("dojo.dnd.move.constrainedMoveable", dojo.dnd.Moveable, {
 	// object attributes (for markup)
 	constraints: function(){},
@@ -1357,21 +1398,21 @@ dojo.declare("dojo.dnd.move.constrainedMoveable", dojo.dnd.Moveable, {
 	},
 
 	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
+		// summary:
+		//		an object that makes a node moveable
+		// node: Node
+		//		a node (or node's id) to be moved
+		// params: dojo.dnd.move.__constrainedMoveableArgs?
+		//		an optional object with additional parameters;
+		//		the rest is passed to the base class
 		if(!params){ params = {}; }
 		this.constraints = params.constraints;
 		this.within = params.within;
 	},
 	onFirstMove: function(/* dojo.dnd.Mover */ mover){
-		// summary: called during the very first move notification,
-		//	can be used to initialize coordinates, can be overwritten.
+		// 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;
@@ -1382,16 +1423,26 @@ dojo.declare("dojo.dnd.move.constrainedMoveable", dojo.dnd.Moveable, {
 		}
 	},
 	onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
-		// summary: called during every move notification,
-		//	should actually move the node, can be overwritten.
+		// summary:
+		//		called during every move notification;
+		//		should actually move the node; can be overwritten.
 		var c = this.constraintBox, s = mover.node.style;
 		s.left = (leftTop.l < c.l ? c.l : c.r < leftTop.l ? c.r : leftTop.l) + "px";
 		s.top  = (leftTop.t < c.t ? c.t : c.b < leftTop.t ? c.b : leftTop.t) + "px";
 	}
 });
 
+/*=====
+dojo.declare("dojo.dnd.move.__boxConstrainedMoveableArgs", [dojo.dnd.move.__constrainedMoveableArgs], {
+	// box: Object
+	//		a constraint box
+	box: {}
+});
+=====*/
+
 dojo.declare("dojo.dnd.move.boxConstrainedMoveable", dojo.dnd.move.constrainedMoveable, {
-	// object attributes (for markup)
+	// box:
+	//		object attributes (for markup)
 	box: {},
 	
 	// markup methods
@@ -1400,19 +1451,29 @@ dojo.declare("dojo.dnd.move.boxConstrainedMoveable", dojo.dnd.move.constrainedMo
 	},
 
 	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
+		// summary:
+		//		an object, which makes a node moveable
+		// node: Node
+		//		a node (or node's id) to be moved
+		// params: dojo.dnd.move.__boxConstrainedMoveableArgs?
+		//		an optional object with parameters
 		var box = params && params.box;
 		this.constraints = function(){ return box; };
 	}
 });
 
+/*=====
+dojo.declare("dojo.dnd.move.__parentConstrainedMoveableArgs", [dojo.dnd.move.__constrainedMoveableArgs], {
+	// area: String
+	//		A parent's area to restrict the move.
+	//		Can be "margin", "border", "padding", or "content".
+	area: ""
+});
+=====*/
+
 dojo.declare("dojo.dnd.move.parentConstrainedMoveable", dojo.dnd.move.constrainedMoveable, {
-	// object attributes (for markup)
+	// area:
+	//		object attributes (for markup)
 	area: "content",
 
 	// markup methods
@@ -1421,13 +1482,12 @@ dojo.declare("dojo.dnd.move.parentConstrainedMoveable", dojo.dnd.move.constraine
 	},
 
 	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
+		// summary:
+		//		an object, which makes a node moveable
+		// node: Node
+		//		a node (or node's id) to be moved
+		// params: dojo.dnd.move.__parentConstrainedMoveableArgs?
+		//		an optional object with parameters
 		var area = params && params.area;
 		this.constraints = function(){
 			var n = this.node.parentNode, 
@@ -1456,12 +1516,17 @@ dojo.declare("dojo.dnd.move.parentConstrainedMoveable", dojo.dnd.move.constraine
 // WARNING: below are obsolete objects, instead of custom movers use custom moveables (above)
 
 dojo.dnd.move.constrainedMover = function(fun, within){
-	// summary: returns a constrained version of dojo.dnd.Mover
-	// description: this function produces n object, which will put a constraint on 
-	//	the margin box of dragged object in absolute coordinates
-	// fun: Function: called on drag, and returns a constraint box
-	// within: Boolean: if true, constraints the whole dragged object withtin the rectangle, 
-	//	otherwise the constraint is applied to the left-top corner
+	// 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);
@@ -1495,20 +1560,28 @@ dojo.dnd.move.constrainedMover = function(fun, within){
 };
 
 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
+	// 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
+	// summary:
+	//		a specialization of dojo.dnd.constrainedMover, which constrains to the parent node
+	// area: String
+	//		"margin" to constrain within the parent's margin box, "border" for the border box,
+	//		"padding" for the padding box, and "content" for the content box; "content" is the default value.
+	// within: Boolean
+	//		if true, constraints the whole dragged object within the rectangle, 
+	//		otherwise the constraint is applied to the left-top corner
+
 	dojo.deprecated("dojo.dnd.move.parentConstrainedMover, use dojo.dnd.move.parentConstrainedMoveable instead");
 	var fun = function(){
 		var n = this.node.parentNode, 
@@ -1548,28 +1621,36 @@ dojo.provide("dojo.dnd.TimedMoveable");
 
 
 
+/*=====
+dojo.declare("dojo.dnd.__TimedMoveableArgs", [dojo.dnd.__MoveableArgs], {
+	// timeout: Number
+	//		delay move by this number of ms,
+	//		accumulating position changes during the timeout
+	timeout: 0
+});
+=====*/
+
 (function(){
 	// precalculate long expressions
 	var oldOnMove = dojo.dnd.Moveable.prototype.onMove;
 		
 	dojo.declare("dojo.dnd.TimedMoveable", dojo.dnd.Moveable, {
 		// summary:
-		//	A specialized version of Moveable to support an FPS throttling.
-		//	This class puts an upper restriction on FPS, which may reduce 
-		//	the CPU load. The additional parameter "timeout" regulates
-		//	the delay before actually moving the moveable object.
+		//		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
+			// summary:
+			//		an object that makes a node moveable with a timer
+			// node: Node||String
+			//		a node (or node's id) to be moved
+			// params: dojo.dnd.__TimedMoveableArgs
+			//		object with additional parameters.
 			
 			// sanitize parameters
 			if(!params){ params = {}; }
@@ -1615,65 +1696,54 @@ dojo.provide("dojo.fx.Toggler");
 
 dojo.declare("dojo.fx.Toggler", null, {
 	// summary:
+	//		A simple `dojo.Animation` toggler API.
+	//
+	// description:
 	//		class constructor for an animation toggler. It accepts a packed
 	//		set of arguments about what type of animation to use in each
-	//		direction, duration, etc.
+	//		direction, duration, etc. All available members are mixed into 
+	//		these animations from the constructor (for example, `node`, 
+	//		`showDuration`, `hideDuration`). 
 	//
 	// example:
 	//	|	var t = new dojo.fx.Toggler({
 	//	|		node: "nodeId",
 	//	|		showDuration: 500,
 	//	|		// hideDuration will default to "200"
-	//	|		showFunc: dojo.wipeIn, 
+	//	|		showFunc: dojo.fx.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
+	//		the node to target for the showing and hiding animations
 	node: null,
 
 	// showFunc: Function
-	//	The function that returns the dojo._Animation to show the node
+	//		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
+	//		The function that returns the `dojo.Animation` to hide the node
 	hideFunc: dojo.fadeOut,
 
 	// showDuration:
-	//	Time in milliseconds to run the show Animation
+	//		Time in milliseconds to run the show Animation
 	showDuration: 200,
 
 	// hideDuration:
-	//	Time in milliseconds to run the hide Animation
+	//		Time in milliseconds to run the hide Animation
 	hideDuration: 200,
 
+	// FIXME: need a policy for where the toggler should "be" the next
+	// time show/hide are called if we're stopped somewhere in the
+	// middle.
+	// FIXME: also would be nice to specify individual showArgs/hideArgs mixed into
+	// each animation individually. 
+	// FIXME: also would be nice to have events from the animations exposed/bridged
+
 	/*=====
 	_showArgs: null,
 	_showAnim: null,
@@ -1685,13 +1755,36 @@ dojo.declare("dojo.fx.Toggler", null, {
 	_isHiding: false,
 	=====*/
 
+	constructor: function(args){
+		var _t = this;
+
+		dojo.mixin(_t, args);
+		_t.node = args.node;
+		_t._showArgs = dojo.mixin({}, args);
+		_t._showArgs.node = _t.node;
+		_t._showArgs.duration = _t.showDuration;
+		_t.showAnim = _t.showFunc(_t._showArgs);
+
+		_t._hideArgs = dojo.mixin({}, args);
+		_t._hideArgs.node = _t.node;
+		_t._hideArgs.duration = _t.hideDuration;
+		_t.hideAnim = _t.hideFunc(_t._hideArgs);
+
+		dojo.connect(_t.showAnim, "beforeBegin", dojo.hitch(_t.hideAnim, "stop", true));
+		dojo.connect(_t.hideAnim, "beforeBegin", dojo.hitch(_t.showAnim, "stop", true));
+	},
+
 	show: function(delay){
 		// summary: Toggle the node to showing
+		// delay: Integer?
+		//		Ammount of time to stall playing the show animation
 		return this.showAnim.play(delay || 0);
 	},
 
 	hide: function(delay){
 		// summary: Toggle the node to hidden
+		// delay: Integer?
+		//		Ammount of time to stall playing the hide animation
 		return this.hideAnim.play(delay || 0);
 	}
 });
@@ -1701,7 +1794,7 @@ dojo.declare("dojo.fx.Toggler", null, {
 if(!dojo._hasResource["dojo.fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
 dojo._hasResource["dojo.fx"] = true;
 dojo.provide("dojo.fx");
-
+ // FIXME: remove this back-compat require in 2.0 
 /*=====
 dojo.fx = {
 	// summary: Effects library on top of Base animations
@@ -1827,15 +1920,25 @@ dojo.fx = {
 	});
 	d.extend(_chain, _baseObj);
 
-	dojo.fx.chain = function(/*dojo._Animation[]*/ animations){
-		// summary: Chain a list of dojo._Animation s to run in sequence
+	dojo.fx.chain = function(/*dojo.Animation[]*/ animations){
+		// summary: 
+		//		Chain a list of `dojo.Animation`s to run in sequence
+		//
+		// description:
+		//		Return a `dojo.Animation` which will play all passed
+		//		`dojo.Animation` instances in sequence, firing its own
+		//		synthesized events simulating a single animation. (eg:
+		//		onEnd of this animation means the end of the chain, 
+		//		not the individual animations within)
+		//
 		// example:
+		//	Once `node` is faded out, fade in `otherNode`
 		//	|	dojo.fx.chain([
 		//	|		dojo.fadeIn({ node:node }),
 		//	|		dojo.fadeOut({ node:otherNode })
 		//	|	]).play();
 		//
-		return new _chain(animations) // dojo._Animation
+		return new _chain(animations) // dojo.Animation
 	};
 
 	var _combine = function(animations){
@@ -1851,9 +1954,9 @@ dojo.fx = {
 			this._connects.push(d.connect(a, "onEnd", this, "_onEnd"));
 		}, this);
 		
-		this._pseudoAnimation = new d._Animation({curve: [0, 1], duration: this.duration});
+		this._pseudoAnimation = new d.Animation({curve: [0, 1], duration: this.duration});
 		var self = this;
-		d.forEach(["beforeBegin", "onBegin", "onPlay", "onAnimate", "onPause", "onStop"], 
+		d.forEach(["beforeBegin", "onBegin", "onPlay", "onAnimate", "onPause", "onStop", "onEnd"], 
 			function(evt){
 				self._connects.push(d.connect(self._pseudoAnimation, evt,
 					function(){ self._fire(evt, arguments); }
@@ -1869,7 +1972,7 @@ dojo.fx = {
 			return this;
 		},
 		_onEnd: function(){
-			if(++this._finished == this._animations.length){
+			if(++this._finished > this._animations.length){
 				this._fire("onEnd");
 			}
 		},
@@ -1910,15 +2013,17 @@ dojo.fx = {
 	});
 	d.extend(_combine, _baseObj);
 
-	dojo.fx.combine = function(/*dojo._Animation[]*/ animations){
-		// summary: Combine an array of `dojo._Animation`s to run in parallel
+	dojo.fx.combine = function(/*dojo.Animation[]*/ animations){
+		// summary: 
+		//		Combine a list of `dojo.Animation`s to run in parallel
 		//
 		// description:
-		//		Combine an array of `dojo._Animation`s to run in parallel, 
-		//		providing a new `dojo._Animation` instance encompasing each
+		//		Combine an array of `dojo.Animation`s to run in parallel, 
+		//		providing a new `dojo.Animation` instance encompasing each
 		//		animation, firing standard animation events.
 		//
 		// example:
+		//	Fade out `node` while fading in `otherNode` simultaneously
 		//	|	dojo.fx.combine([
 		//	|		dojo.fadeIn({ node:node }),
 		//	|		dojo.fadeOut({ node:otherNode })
@@ -1926,7 +2031,7 @@ dojo.fx = {
 		//
 		// example:
 		//	When the longest animation ends, execute a function:
-		//	| 	var anim = dojo.fx.combine([
+		//	|	var anim = dojo.fx.combine([
 		//	|		dojo.fadeIn({ node: n, duration:700 }),
 		//	|		dojo.fadeOut({ node: otherNode, duration: 300 })
 		//	|	]);
@@ -1935,17 +2040,28 @@ dojo.fx = {
 		//	|	});
 		//	|	anim.play(); // play the animation
 		//
-		return new _combine(animations); // dojo._Animation
+		return new _combine(animations); // dojo.Animation
 	};
 
 	dojo.fx.wipeIn = function(/*Object*/ args){
 		// summary:
+		//		Expand a node to it's natural height.
+		//
+		// description:
 		//		Returns an animation that will expand the
 		//		node defined in 'args' object from it's current height to
 		//		it's natural height (with no scrollbar).
 		//		Node must have no margin/border/padding.
-		args.node = d.byId(args.node);
-		var node = args.node, s = node.style, o;
+		//
+		// args: Object
+		//		A hash-map of standard `dojo.Animation` constructor properties
+		//		(such as easing: node: duration: and so on)
+		//
+		// example:
+		//	|	dojo.fx.wipeIn({
+		//	|		node:"someId"
+		//	|	}).play()
+		var node = args.node = d.byId(args.node), s = node.style, o;
 
 		var anim = d.animateProperty(d.mixin({
 			properties: {
@@ -1955,11 +2071,11 @@ dojo.fx = {
 						// start at current [computed] height, but use 1px rather than 0
 						// because 0 causes IE to display the whole panel
 						o = s.overflow;
-						s.overflow="hidden";
-						if(s.visibility=="hidden"||s.display=="none"){
-							s.height="1px";
-							s.display="";
-							s.visibility="";
+						s.overflow = "hidden";
+						if(s.visibility == "hidden" || s.display == "none"){
+							s.height = "1px";
+							s.display = "";
+							s.visibility = "";
 							return 1;
 						}else{
 							var height = d.style(node, "height");
@@ -1978,13 +2094,24 @@ dojo.fx = {
 			s.overflow = o;
 		});
 
-		return anim; // dojo._Animation
+		return anim; // dojo.Animation
 	}
 
 	dojo.fx.wipeOut = function(/*Object*/ args){
 		// summary:
+		//		Shrink a node to nothing and hide it. 
+		//
+		// description:
 		//		Returns an animation that will shrink node defined in "args"
 		//		from it's current height to 1px, and then hide it.
+		//
+		// args: Object
+		//		A hash-map of standard `dojo.Animation` constructor properties
+		//		(such as easing: node: duration: and so on)
+		// 
+		// example:
+		//	|	dojo.fx.wipeOut({ node:"someId" }).play()
+		
 		var node = args.node = d.byId(args.node), s = node.style, o;
 		
 		var anim = d.animateProperty(d.mixin({
@@ -2006,16 +2133,25 @@ dojo.fx = {
 			s.display = "none";
 		});
 
-		return anim; // dojo._Animation
+		return anim; // dojo.Animation
 	}
 
-	dojo.fx.slideTo = function(/*Object?*/ args){
+	dojo.fx.slideTo = function(/*Object*/ args){
 		// summary:
+		//		Slide a node to a new top/left position
+		//
+		// description:
 		//		Returns an animation that will slide "node" 
 		//		defined in args Object from its current position to
 		//		the position defined by (args.left, args.top).
+		//
+		// args: Object
+		//		A hash-map of standard `dojo.Animation` constructor properties
+		//		(such as easing: node: duration: and so on). Special args members
+		//		are `top` and `left`, which indicate the new position to slide to.
+		//
 		// example:
-		//	|	dojo.fx.slideTo({ node: node, left:"40", top:"50", unit:"px" }).play()
+		//	|	dojo.fx.slideTo({ node: node, left:"40", top:"50", units:"px" }).play()
 
 		var node = args.node = d.byId(args.node), 
 			top = null, left = null;
@@ -2027,7 +2163,7 @@ dojo.fx = {
 				top = (pos == 'absolute' ? n.offsetTop : parseInt(cs.top) || 0);
 				left = (pos == 'absolute' ? n.offsetLeft : parseInt(cs.left) || 0);
 				if(pos != 'absolute' && pos != 'relative'){
-					var ret = d.coords(n, true);
+					var ret = d.position(n, true);
 					top = ret.y;
 					left = ret.x;
 					n.style.position="absolute";
@@ -2046,7 +2182,7 @@ dojo.fx = {
 		}, args));
 		d.connect(anim, "beforeBegin", anim, init);
 
-		return anim; // dojo._Animation
+		return anim; // dojo.Animation
 	}
 
 })();
@@ -2080,13 +2216,13 @@ dojo.declare("dijit.form._FormMixin", null,
 	// example:
 	//	| { name: "John Smith", interests: ["sports", "movies"] }
 =====*/
-	
+
 	//	TODO:
 	//	* Repeater
 	//	* better handling for arrays.  Often form elements have names with [] like
 	//	* people[3].sex (for a list of people [{name: Bill, sex: M}, ...])
 	//
-	//	
+	//
 
 		reset: function(){
 			dojo.forEach(this.getDescendants(), function(widget){
@@ -2097,34 +2233,36 @@ dojo.declare("dijit.form._FormMixin", null,
 		},
 
 		validate: function(){
-			// summary: returns if the form is valid - same as isValid - but
+			// 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 
+			//			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 
+				// Need to set this so that "required" widgets get their
 				// state set.
 				widget._hasBeenBlurred = true;
 				var valid = widget.disabled || !widget.validate || widget.validate();
-				if (!valid && !didFocus) {
+				if(!valid && !didFocus){
 					// Set focus of the first non-valid widget
-					dijit.scrollIntoView(widget.containerNode||widget.domNode);
+					dijit.scrollIntoView(widget.containerNode || widget.domNode);
 					widget.focus();
 					didFocus = true;
 				}
 	 			return valid;
-	 		}), function(item) { return item; });
+	 		}), function(item){ return item; });
 		},
-	
+
 		setValues: function(val){
 			dojo.deprecated(this.declaredClass+"::setValues() is deprecated. Use attr('value', val) instead.", "", "2.0");
 			return this.attr('value', val);
 		},
 		_setValueAttr: function(/*object*/obj){
-			// summary: Fill in form values from according to an Object (in the format returned by attr('value'))
+			// summary:
+			//		Fill in form values from according to an Object (in the format returned by attr('value'))
 
 			// generate map from name --> [list of widgets with that name]
 			var map = { };
@@ -2141,7 +2279,7 @@ dojo.declare("dijit.form._FormMixin", null,
 				var widgets = map[name],						// array of widgets w/this name
 					values = dojo.getObject(name, false, obj);	// list of values for those widgets
 
-				if(values===undefined){
+				if(values === undefined){
 					continue;
 				}
 				if(!dojo.isArray(values)){
@@ -2152,14 +2290,14 @@ dojo.declare("dijit.form._FormMixin", null,
 					dojo.forEach(widgets, function(w, i){
 						w.attr('value', dojo.indexOf(values, w.value) != -1);
 					});
-				}else if(widgets[0]._multiValue){
+				}else if(widgets[0].multiple){
 					// it takes an array (e.g. multi-select)
 					widgets[0].attr('value', values);
 				}else{
 					// otherwise, values is a list of values to be assigned sequentially to each widget
 					dojo.forEach(widgets, function(w, i){
 						w.attr('value', values[i]);
-					});					
+					});
 				}
 			}
 
@@ -2167,7 +2305,7 @@ dojo.declare("dijit.form._FormMixin", null,
 			 * 	TODO: code for plain input boxes (this shouldn't run for inputs that are part of widgets)
 
 			dojo.forEach(this.containerNode.elements, function(element){
-				if (element.name == ''){return};	// like "continue"	
+				if(element.name == ''){return};	// like "continue"
 				var namePath = element.name.split(".");
 				var myObj=obj;
 				var name=namePath[namePath.length-1];
@@ -2175,7 +2313,7 @@ dojo.declare("dijit.form._FormMixin", null,
 					var p=namePath[j - 1];
 					// repeater support block
 					var nameA=p.split("[");
-					if (nameA.length > 1){
+					if(nameA.length > 1){
 						if(typeof(myObj[nameA[0]]) == "undefined"){
 							myObj[nameA[0]]=[ ];
 						} // if
@@ -2195,22 +2333,23 @@ dojo.declare("dijit.form._FormMixin", null,
 					myObj=myObj[p];
 				}
 
-				if (typeof(myObj) == "undefined"){
+				if(typeof(myObj) == "undefined"){
 					return;		// like "continue"
 				}
-				if (typeof(myObj[name]) == "undefined" && this.ignoreNullValues){
+				if(typeof(myObj[name]) == "undefined" && this.ignoreNullValues){
 					return;		// like "continue"
 				}
 
 				// TODO: widget values (just call attr('value', ...) on the widget)
 
+				// TODO: maybe should call dojo.getNodeProp() instead
 				switch(element.type){
 					case "checkbox":
 						element.checked = (name in myObj) &&
-							dojo.some(myObj[name], function(val){ return val==element.value; });
+							dojo.some(myObj[name], function(val){ return val == element.value; });
 						break;
 					case "radio":
-						element.checked = (name in myObj) && myObj[name]==element.value;
+						element.checked = (name in myObj) && myObj[name] == element.value;
 						break;
 					case "select-multiple":
 						element.selectedIndex=-1;
@@ -2257,7 +2396,7 @@ dojo.declare("dijit.form._FormMixin", null,
 			var obj = { };
 			dojo.forEach(this.getDescendants(), function(widget){
 				var name = widget.name;
-				if(!name||widget.disabled){ return; }
+				if(!name || widget.disabled){ return; }
 
 				// Single value widget (checkbox, radio, or plain <input> type widget
 				var value = widget.attr('value');
@@ -2287,8 +2426,17 @@ dojo.declare("dijit.form._FormMixin", null,
 						}
 					}
 				}else{
-					// plain input
-					dojo.setObject(name, value, obj);
+					var prev=dojo.getObject(name, false, obj);
+					if(typeof prev != "undefined"){
+						if(dojo.isArray(prev)){
+							prev.push(value);
+						}else{
+							dojo.setObject(name, [prev, value], obj);
+						}
+					}else{
+						// unique name
+						dojo.setObject(name, value, obj);
+					}
 				}
 			});
 
@@ -2297,7 +2445,7 @@ dojo.declare("dijit.form._FormMixin", null,
 			 * but it doesn't understand [] notation, presumably)
 			var obj = { };
 			dojo.forEach(this.containerNode.elements, function(elm){
-				if (!elm.name)	{
+				if(!elm.name)	{
 					return;		// like "continue"
 				}
 				var namePath = elm.name.split(".");
@@ -2307,7 +2455,7 @@ dojo.declare("dijit.form._FormMixin", null,
 					var nameIndex = null;
 					var p=namePath[j - 1];
 					var nameA=p.split("[");
-					if (nameA.length > 1){
+					if(nameA.length > 1){
 						if(typeof(myObj[nameA[0]]) == "undefined"){
 							myObj[nameA[0]]=[ ];
 						} // if
@@ -2319,30 +2467,30 @@ dojo.declare("dijit.form._FormMixin", null,
 						myObj[nameA[0]] = { }
 					} // if
 
-					if (nameA.length == 1){
+					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((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){
+				} else if(elm.type == "checkbox" && elm.checked){
 					if(typeof(myObj[name]) == 'undefined'){
 						myObj[name]=[ ];
 					}
 					myObj[name].push(elm.value);
-				} else if (elm.type == "select-multiple"){
+				} else if(elm.type == "select-multiple"){
 					if(typeof(myObj[name]) == 'undefined'){
 						myObj[name]=[ ];
 					}
-					for (var jdx=0,len3=elm.options.length; jdx<len3; ++jdx){
-						if (elm.options[jdx].selected){
+					for(var jdx=0,len3=elm.options.length; jdx<len3; ++jdx){
+						if(elm.options[jdx].selected){
 							myObj[name].push(elm.options[jdx].value);
 						}
 					}
@@ -2357,7 +2505,7 @@ dojo.declare("dijit.form._FormMixin", null,
 	 	isValid: function(){
 	 		// summary:
 	 		//		Returns true if all of the widgets are valid
-	 		
+
 	 		// This also populate this._invalidWidgets[] array with list of invalid widgets...
 	 		// TODO: put that into separate function?   It's confusing to have that as a side effect
 	 		// of a method named isValid().
@@ -2367,32 +2515,32 @@ dojo.declare("dijit.form._FormMixin", null,
 	 		});
 			return !this._invalidWidgets.length;
 		},
-		
-		
+
+
 		onValidStateChange: function(isValid){
 			// summary:
 			//		Stub function to connect to if you want to do something
-			//		(like disable/enable a submit button) when the valid 
+			//		(like disable/enable a submit button) when the valid
 			//		state changes on the form as a whole.
 		},
-		
+
 		_widgetChange: function(widget){
 			// summary:
-			//		Connected to a widget's onChange function - update our 
+			//		Connected to a widget's onChange function - update our
 			//		valid state, if needed.
 			var isValid = this._lastValidState;
-			if(!widget || this._lastValidState===undefined){
+			if(!widget || this._lastValidState === undefined){
 				// We have passed a null widget, or we haven't been validated
 				// yet - let's re-check all our children
 				// This happens when we connect (or reconnect) our children
 				isValid = this.isValid();
-				if(this._lastValidState===undefined){
-					// Set this so that we don't fire an onValidStateChange 
+				if(this._lastValidState === undefined){
+					// Set this so that we don't fire an onValidStateChange
 					// the first time
 					this._lastValidState = isValid;
 				}
 			}else if(widget.isValid){
-				this._invalidWidgets = dojo.filter(this._invalidWidgets||[], function(w){
+				this._invalidWidgets = dojo.filter(this._invalidWidgets || [], function(w){
 					return (w != widget);
 				}, this);
 				if(!widget.isValid() && !widget.attr("disabled")){
@@ -2400,12 +2548,12 @@ dojo.declare("dijit.form._FormMixin", null,
 				}
 				isValid = (this._invalidWidgets.length === 0);
 			}
-			if (isValid !== this._lastValidState){
+			if(isValid !== this._lastValidState){
 				this._lastValidState = isValid;
 				this.onValidStateChange(isValid);
 			}
 		},
-		
+
 		connectChildren: function(){
 			// summary:
 			//		Connects to the onChange function of all children to
@@ -2415,7 +2563,7 @@ dojo.declare("dijit.form._FormMixin", null,
 			//		initialized.
 			dojo.forEach(this._changeConnections, dojo.hitch(this, "disconnect"));
 			var _this = this;
-			
+
 			// we connect to validate - so that it better reflects the states
 			// of the widgets - also, we only connect if it has a validate
 			// function (to avoid too many unneeded connections)
@@ -2426,21 +2574,21 @@ dojo.declare("dijit.form._FormMixin", null,
 			function(widget){
 				// We are interested in whenever the widget is validated - or
 				// whenever the disabled attribute on that widget is changed
-				conns.push(_this.connect(widget, "validate", 
+				conns.push(_this.connect(widget, "validate",
 									dojo.hitch(_this, "_widgetChange", widget)));
-				conns.push(_this.connect(widget, "_setDisabledAttr", 
+				conns.push(_this.connect(widget, "_setDisabledAttr",
 									dojo.hitch(_this, "_widgetChange", widget)));
 			});
 
-			// Call the widget change function to update the valid state, in 
+			// Call the widget change function to update the valid state, in
 			// case something is different now.
 			this._widgetChange(null);
 		},
-		
+
 		startup: function(){
 			this.inherited(arguments);
 			// Initialize our valid state tracking.  Needs to be done in startup
-			// because it's not guaranteed that our children are initialized 
+			// because it's not guaranteed that our children are initialized
 			// yet.
 			this._changeConnections = [];
 			this.connectChildren();
@@ -2511,14 +2659,15 @@ dojo.declare("dijit._DialogMixin", null,
 			//		setting _firstFocusItem and _lastFocusItem
 			// tags:
 			//		protected
-			
+
 			var elems = dijit._getTabNavigable(dojo.byId(dialogNode));
 			this._firstFocusItem = elems.lowest || elems.first || dialogNode;
 			this._lastFocusItem = elems.last || elems.highest || this._firstFocusItem;
-			if(dojo.isMoz && this._firstFocusItem.tagName.toLowerCase() == "input" && dojo.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;
+			if(dojo.isMoz && this._firstFocusItem.tagName.toLowerCase() == "input" &&
+					dojo.getNodeProp(this._firstFocusItem, "type").toLowerCase() == "file"){
+				// FF doesn't behave well when first element is input type=file, set first focusable to dialog container
+				dojo.attr(dialogNode, "tabIndex", "0");
+				this._firstFocusItem = dialogNode;
 			}
 		}
 	}
@@ -2537,19 +2686,20 @@ dojo.declare(
 	"dijit.DialogUnderlay",
 	[dijit._Widget, dijit._Templated],
 	{
-		// summary: The component that blocks the screen behind a `dijit.Dialog`
+		// summary:
+		//		The component that blocks the screen behind a `dijit.Dialog`
 		//
 		// description:
 		// 		A component used to block input behind a `dijit.Dialog`. Only a single
-		//		instance of this widget is created by `dijit.Dialog`, and saved as 
+		//		instance of this widget is created by `dijit.Dialog`, and saved as
 		//		a reference to be shared between all Dialogs as `dijit._underlay`
-		//	
+		//
 		//		The underlay itself can be styled based on and id:
 		//	|	#myDialog_underlay { background-color:red; }
 		//
 		//		In the case of `dijit.Dialog`, this id is based on the id of the Dialog,
-		//		suffixed with _underlay. 
-		
+		//		suffixed with _underlay.
+
 		// Template has two divs; outer div is used for fade-in/fade-out, and also to hold background iframe.
 		// Inner div has opacity specified in CSS file.
 		templateString: "<div class='dijitDialogUnderlayWrapper'><div class='dijitDialogUnderlay' dojoAttachPoint='node'></div></div>",
@@ -2578,7 +2728,6 @@ dojo.declare(
 			// summary:
 			//		Append the underlay to the body
 			dojo.body().appendChild(this.domNode);
-			this.bgIframe = new dijit.BackgroundIframe(this.domNode);
 		},
 
 		layout: function(){
@@ -2614,24 +2763,21 @@ dojo.declare(
 			//		Show the dialog underlay
 			this.domNode.style.display = "block";
 			this.layout();
-			if(this.bgIframe.iframe){
-				this.bgIframe.iframe.style.display = "block";
-			}
+			this.bgIframe = new dijit.BackgroundIframe(this.domNode);
 		},
 
 		hide: function(){
 			// summary:
 			//		Hides the dialog underlay
+			this.bgIframe.destroy();
 			this.domNode.style.display = "none";
-			if(this.bgIframe.iframe){
-				this.bgIframe.iframe.style.display = "none";
-			}
 		},
 
 		uninitialize: function(){
 			if(this.bgIframe){
 				this.bgIframe.destroy();
 			}
+			this.inherited(arguments);
 		}
 	}
 );
@@ -2648,8 +2794,9 @@ dojo.provide("dojo.html");
 (function(){ // private scope, sort of a namespace
 
 	// idCounter is incremented with each instantiation to allow asignment of a unique id for tracking, logging purposes
-	var idCounter = 0; 
-
+	var idCounter = 0, 
+		d = dojo;
+	
 	dojo.html._secureForInnerHtml = function(/*String*/ cont){
 		// summary:
 		//		removes !DOCTYPE and title elements from the html string.
@@ -2672,69 +2819,33 @@ dojo.provide("dojo.html");
 =====*/
 	dojo.html._emptyNode = dojo.empty;
 
-	dojo.html._setNodeContent = function(/* DomNode */ node, /* String|DomNode|NodeList */ cont, /* Boolean? */ shouldEmptyFirst){
+	dojo.html._setNodeContent = function(/* DomNode */ node, /* String|DomNode|NodeList */ cont){
 		// summary:
 		//		inserts the given content into the given node
-		//		overlaps similiar functionality in dijit.layout.ContentPane._setContent
 		//	node:
 		//		the parent element
 		//	content:
 		//		the content to be set on the parent element. 
 		//		This can be an html string, a node reference or a NodeList, dojo.NodeList, Array or other enumerable list of nodes
-		// shouldEmptyFirst
-		//		if shouldEmptyFirst is true, the node will first be emptied of all content before the new content is inserted
-		//		defaults to false
-		if(shouldEmptyFirst){
-			dojo.html._emptyNode(node); 
-		}
+		
+		// always empty
+		d.empty(node);
 
-		if(typeof cont == "string"){
-			// there's some hoops to jump through before we can set innerHTML on the would-be parent element. 
-	
-			// rationale for this block:
-			// if node is a table derivate tag, some browsers dont allow innerHTML on those
-			// TODO: <select>, <dl>? what other elements will give surprises if you naively set innerHTML?
-			
-			var pre = '', post = '', walk = 0, name = node.nodeName.toLowerCase();
-			switch(name){
-				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);
-				// now we can safely add the child nodes...
-				dojo.forEach(n.childNodes, function(n){
-					node.appendChild(n.cloneNode(true));
-				});
-			}else{
-				// innerHTML the content as-is into the node (element)
-				// should we ever support setting content on non-element node types? 
-				// e.g. text nodes, comments, etc.?
-				node.innerHTML = cont;
+		if(cont) {
+			if(typeof cont == "string") {
+				cont = d._toDom(cont, node.ownerDocument);
 			}
-
-		}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));
-				});
+			if(!cont.nodeType && d.isArrayLike(cont)) {
+				// handle as enumerable, but it may shrink as we enumerate it
+				for(var startlen=cont.length, i=0; i<cont.length; i=startlen==cont.length ? i+1 : 0) {
+					d.place( cont[i], node, "last");
+				}
+			} else {
+				// pass nodes, documentFragments and unknowns through to dojo.place
+				d.place(cont, node, "last");
 			}
 		}
+
 		// return DomNode
 		return node;
 	};
@@ -3016,8 +3127,9 @@ dojo.declare(
 	// summary:
 	//		A widget that acts as a container for mixed HTML and widgets, and includes an Ajax interface
 	// description:
-	//		A widget that can be used as a standalone widget
-	//		or as a baseclass for other widgets
+	//		A widget that can be used as a stand alone widget
+	//		or as a base class for other widgets.
+	//
 	//		Handles replacement of document fragment using either external uri or javascript
 	//		generated markup or DOM content, instantiating widgets within that content.
 	//		Don't confuse it with an iframe, it only needs/wants document fragments.
@@ -3035,7 +3147,7 @@ dojo.declare(
 	// 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.)
+	//		pane is shown.  (Set preload=true to load it immediately.)
 	//		Changing href after creation doesn't have any effect; use attr('href', ...);
 	href: "",
 
@@ -3054,11 +3166,11 @@ dojo.declare(
 
 	// parseOnLoad: Boolean
 	//		Parse content and create the widgets, if any.
-	parseOnLoad:	true,
+	parseOnLoad: true,
 
 	// preventCache: Boolean
 	//		Prevent caching of data from href's by appending a timestamp to the href.
-	preventCache:	false,
+	preventCache: false,
 
 	// preload: Boolean
 	//		Force load of data on initialization even if pane is hidden.
@@ -3070,11 +3182,11 @@ dojo.declare(
 
 	// loadingMessage: String
 	//		Message that shows while downloading
-	loadingMessage: "<span class='dijitContentPaneLoading'>${loadingState}</span>", 
+	loadingMessage: "<span class='dijitContentPaneLoading'>${loadingState}</span>",
 
 	// errorMessage: String
 	//		Message that shows if an error occurs
-	errorMessage: "<span class='dijitContentPaneError'>${errorState}</span>", 
+	errorMessage: "<span class='dijitContentPaneError'>${errorState}</span>",
 
 	// isLoaded: [readonly] Boolean
 	//		True if the ContentPane has data in it, either specified
@@ -3099,21 +3211,38 @@ dojo.declare(
 	ioArgs: {},
 
 	// isContainer: [protected] Boolean
-	//		Just a flag indicating that this widget will call resize() on
-	//		its children.   _LayoutWidget based widgets check for
-	//
-	//	|		if(!this.getParent || !this.getParent()){
-	//
-	//		and if getParent() returns false because !parent.isContainer,
-	//		then they resize themselves on initialization.
+	//		Indicates that this widget acts as a "parent" to the descendant widgets.
+	//		When the parent is started it will call startup() on the child widgets.
+	//		See also `isLayoutContainer`.
 	isContainer: true,
 
-	postMixInProperties: function(){
-		this.inherited(arguments);
+	// isLayoutContainer: [protected] Boolean
+	//		Indicates that this widget will call resize() on it's child widgets
+	//		when they become visible.
+	isLayoutContainer: true,
+
+	// onLoadDeferred: [readonly] dojo.Deferred
+	//		This is the `dojo.Deferred` returned by attr('href', ...) and refresh().
+	//		Calling onLoadDeferred.addCallback() or addErrback() registers your
+	//		callback to be called only once, when the prior attr('href', ...) call or
+	//		the initial href parameter to the constructor finishes loading.
+	//
+	//		This is different than an onLoad() handler which gets called any time any href is loaded.
+	onLoadDeferred: null,
+
+	// Override _Widget's attributeMap because we don't want the title attribute (used to specify
+	// tab labels) to be copied to ContentPane.domNode... otherwise a tooltip shows up over the
+	// entire pane.
+	attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
+		title: []
+	}),
+
+	postMixInProperties: function(){
+		this.inherited(arguments);
 		var messages = dojo.i18n.getLocalization("dijit", "loading", this.lang);
 		this.loadingMessage = dojo.string.substitute(this.loadingMessage, messages);
 		this.errorMessage = dojo.string.substitute(this.errorMessage, messages);
-		
+
 		// Detect if we were initialized with data
 		if(!this.href && this.srcNodeRef && this.srcNodeRef.innerHTML){
 			this.isLoaded = true;
@@ -3136,7 +3265,7 @@ dojo.declare(
 		// over a node
 		this.domNode.title = "";
 
-		if (!dojo.attr(this.domNode,"role")){
+		if(!dojo.attr(this.domNode,"role")){
 			dijit.setWaiRole(this.domNode, "group");
 		}
 
@@ -3150,25 +3279,22 @@ dojo.declare(
 		//		the same API.
 		if(this._started){ return; }
 
+		var parent = dijit._Contained.prototype.getParent.call(this);
+		this._childOfLayoutWidget = parent && parent.isLayoutContainer;
+
+		// I need to call resize() on my child/children (when I become visible), unless
+		// I'm the child of a layout widget in which case my parent will call resize() on me and I'll do it then.
+		this._needLayout = !this._childOfLayoutWidget;
+
 		if(this.isLoaded){
 			dojo.forEach(this.getChildren(), function(child){
 				child.startup();
 			});
+		}
 
-			// If we have static content in the content pane (specified during
-			// initialization) then we need to do layout now... unless we are
-			// a child of a TabContainer etc. in which case wait until the TabContainer
-			// calls resize() on us.
-			if(this.doLayout){
-				this._checkIfSingleChild();
-			}
-			if(!this._singleChild || !dijit._Contained.prototype.getParent.call(this)){
-				this._scheduleLayout();
-			}
+		if(this._isShown() || this.preload){
+			this._onShow();
 		}
-		
-		// If we have an href then check if we should load it now
-		this._loadCheck();
 
 		this.inherited(arguments);
 	},
@@ -3180,7 +3306,9 @@ dojo.declare(
 		//		and should propogate startup() and resize() calls to it.
 		//		Skips over things like data stores since they aren't visible.
 
-		var childNodes = dojo.query(">", this.containerNode),
+		var childNodes = dojo.query("> *", this.containerNode).filter(function(node){
+				return node.tagName !== "SCRIPT"; // or a regexp for hidden elements like script|area|map|etc..
+			}),
 			childWidgetNodes = childNodes.filter(function(node){
 				return dojo.hasAttr(node, "dojoType") || dojo.hasAttr(node, "widgetId");
 			}),
@@ -3199,6 +3327,9 @@ dojo.declare(
 		}else{
 			delete this._singleChild;
 		}
+
+		// So we can set overflow: hidden to avoid a safari bug w/scrollbars showing up (#9449)
+		dojo.toggleClass(this.containerNode, this.baseClass + "SingleChild", !!this._singleChild);
 	},
 
 	setHref: function(/*String|Uri*/ href){
@@ -3219,18 +3350,21 @@ dojo.declare(
 		// Cancel any in-flight requests (an attr('href') will cancel any in-flight attr('href', ...))
 		this.cancel();
 
+		this.onLoadDeferred = new dojo.Deferred(dojo.hitch(this, "cancel"));
+
 		this.href = href;
 
 		// _setHrefAttr() is called during creation and by the user, after creation.
 		// only in the second case do we actually load the URL; otherwise it's done in startup()
 		if(this._created && (this.preload || this._isShown())){
-			// we return result of refresh() here to avoid code dup. in dojox.layout.ContentPane
-			return this.refresh();
+			this._load();
 		}else{
 			// Set flag to indicate that href needs to be loaded the next time the
 			// ContentPane is made visible
 			this._hrefChanged = true;
 		}
+
+		return this.onLoadDeferred;		// dojo.Deferred
 	},
 
 	setContent: function(/*String|DomNode|Nodelist*/data){
@@ -3256,9 +3390,15 @@ dojo.declare(
 		// Cancel any in-flight requests (an attr('content') will cancel any in-flight attr('href', ...))
 		this.cancel();
 
+		// Even though user is just setting content directly, still need to define an onLoadDeferred
+		// because the _onLoadHandler() handler is still getting called from setContent()
+		this.onLoadDeferred = new dojo.Deferred(dojo.hitch(this, "cancel"));
+
 		this._setContent(data || "");
 
 		this._isDownloaded = false; // mark that content is from a attr('content') not an attr('href')
+
+		return this.onLoadDeferred; 	// dojo.Deferred
 	},
 	_getContentAttr: function(){
 		// summary:
@@ -3273,12 +3413,15 @@ dojo.declare(
 			this._xhrDfd.cancel();
 		}
 		delete this._xhrDfd; // garbage collect
+
+		this.onLoadDeferred = null;
 	},
 
 	uninitialize: function(){
 		if(this._beingDestroyed){
 			this.cancel();
 		}
+		this.inherited(arguments);
 	},
 
 	destroyRecursive: function(/*Boolean*/ preserveDom){
@@ -3289,43 +3432,69 @@ dojo.declare(
 		if(this._beingDestroyed){
 			return;
 		}
-		this._beingDestroyed = true;
 		this.inherited(arguments);
 	},
 
-	resize: function(size){
+	resize: function(changeSize, resultSize){
 		// summary:
 		//		See `dijit.layout._LayoutWidget.resize` for description.
 		//		Although ContentPane doesn't extend _LayoutWidget, it does implement
 		//		the same API.
 
-		dojo.marginBox(this.domNode, size);
+		// For the TabContainer --> BorderContainer --> ContentPane case, _onShow() is
+		// never called, so resize() is our trigger to do the initial href download.
+		if(!this._wasShown){
+			this._onShow();
+		}
 
-		// 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,
-			mb = dojo.mixin(dojo.marginBox(node), size||{});
+		this._resizeCalled = true;
 
-		var cb = (this._contentBox = dijit.layout.marginBox2contentBox(node, mb));
+		// Set margin box size, unless it wasn't specified, in which case use current size.
+		if(changeSize){
+			dojo.marginBox(this.domNode, changeSize);
+		}
 
-		// If we have a single widget child then size it to fit snugly within my borders
-		if(this._singleChild && this._singleChild.resize){
-			// note: if widget has padding this._contentBox will have l and t set,
-			// but don't pass them to resize() or it will doubly-offset the child
-			this._singleChild.resize({w: cb.w, h: cb.h});
+		// Compute content box size of containerNode in case we [later] need to size our single child.
+		var cn = this.containerNode;
+		if(cn === this.domNode){
+			// If changeSize or resultSize was passed to this method and this.containerNode ==
+			// this.domNode then we can compute the content-box size without querying the node,
+			// which is more reliable (similar to LayoutWidget.resize) (see for example #9449).
+			var mb = resultSize || {};
+			dojo.mixin(mb, changeSize || {}); // changeSize overrides resultSize
+			if(!("h" in mb) || !("w" in mb)){
+				mb = dojo.mixin(dojo.marginBox(cn), mb); // just use dojo.marginBox() to fill in missing values
+			}
+			this._contentBox = dijit.layout.marginBox2contentBox(cn, mb);
+		}else{
+			this._contentBox = dojo.contentBox(cn);
 		}
+
+		// Make my children layout, or size my single child widget
+		this._layoutChildren();
 	},
 
 	_isShown: function(){
 		// summary:
-		//		Returns true if the content is currently shown
-		if("open" in this){
+		//		Returns true if the content is currently shown.
+		// description:
+		//		If I am a child of a layout widget then it actually returns true if I've ever been visible,
+		//		not whether I'm currently visible, since that's much faster than tracing up the DOM/widget
+		//		tree every call, and at least solves the performance problem on page load by deferring loading
+		//		hidden ContentPanes until they are first shown
+
+		if(this._childOfLayoutWidget){
+			// If we are TitlePane, etc - we return that only *IF* we've been resized
+			if(this._resizeCalled && "open" in this){
+				return this.open;
+			}
+			return this._resizeCalled;
+		}else if("open" in this){
 			return this.open;		// for TitlePane, etc.
 		}else{
+			// TODO: with _childOfLayoutWidget check maybe this branch no longer necessary?
 			var node = this.domNode;
-			return (node.style.display != 'none')  && (node.style.visibility != 'hidden') && !dojo.hasClass(node, "dijitHidden");
+			return (node.style.display != 'none') && (node.style.visibility != 'hidden') && !dojo.hasClass(node, "dijitHidden");
 		}
 	},
 
@@ -3335,40 +3504,31 @@ dojo.declare(
 		// description:
 		//		For a plain ContentPane, this is called on initialization, from startup().
 		//		If the ContentPane is a hidden pane of a TabContainer etc., then it's
-		//		called whever the pane is made visible.
+		//		called whenever the pane is made visible.
 		//
-		//		Does processing necessary, including href download and layout/resize of
+		//		Does necessary processing, including href download and layout/resize of
 		//		child widget(s)
 
-		if(this._needLayout){
-			// If a layout has been scheduled for when we become visible, do it now
-			this._layoutChildren();
-		}
-
-		// Do lazy-load of URL
-		this._loadCheck();
-
-		// call onShow, if we have one
-		if(this.onShow){
-			this.onShow();
+		if(this.href){
+			if(!this._xhrDfd && // if there's an href that isn't already being loaded
+				(!this.isLoaded || this._hrefChanged || this.refreshOnShow)
+			){
+				this.refresh();
+			}
+		}else{
+			// If we are the child of a layout widget then the layout widget will call resize() on
+			// us, and then we will size our child/children.   Otherwise, we need to do it now.
+			if(!this._childOfLayoutWidget && this._needLayout){
+				// If a layout has been scheduled for when we become visible, do it now
+				this._layoutChildren();
+			}
 		}
-	},
 
-	_loadCheck: function(){
-		// summary:
-		//		Call this to load href contents if necessary.
-		// description:
-		//		Call when !ContentPane has been made visible [from prior hidden state],
-		//		or href has been changed, or on startup, etc.
+		this.inherited(arguments);
 
-		if(
-			(this.href && !this._xhrDfd) &&		// if there's an href that isn't already being loaded
-			(!this.isLoaded || this._hrefChanged || this.refreshOnShow) && 	// and we need a [re]load
-			(this.preload || this._isShown())	// and now is the time to [re]load
-		){
-			delete this._hrefChanged;
-			this.refresh();
-		}
+		// Need to keep track of whether ContentPane has been shown (which is different than
+		// whether or not it's currently visible).
+		this._wasShown = true;
 	},
 
 	refresh: function(){
@@ -3379,9 +3539,18 @@ dojo.declare(
 		//		2. posts "loading..." message
 		//		3. sends XHR to download new data
 
-		// cancel possible prior inflight request
+		// Cancel possible prior in-flight request
 		this.cancel();
 
+		this.onLoadDeferred = new dojo.Deferred(dojo.hitch(this, "cancel"));
+		this._load();
+		return this.onLoadDeferred;
+	},
+
+	_load: function(){
+		// summary:
+		//		Load/reload the href specified in this.href
+
 		// display loading message
 		this._setContent(this.onDownloadStart(), true);
 
@@ -3417,6 +3586,9 @@ dojo.declare(
 			delete self._xhrDfd;
 			return err;
 		});
+
+		// Remove flag saying that a load is needed
+		delete this._hrefChanged;
 	},
 
 	_onLoadHandler: function(data){
@@ -3424,7 +3596,8 @@ dojo.declare(
 		//		This is called whenever new content is being loaded
 		this.isLoaded = true;
 		try{
-			this.onLoad(data);			
+			this.onLoadDeferred.callback(data);
+			this.onLoad(data);
 		}catch(e){
 			console.error('Error '+this.widgetId+' running custom onLoad code: ' + e.message);
 		}
@@ -3471,28 +3644,28 @@ dojo.declare(
 			});
 			delete setter.parseResults;
 		}
-		
+
 		// And then clear away all the DOM nodes
 		dojo.html._emptyNode(this.containerNode);
+
+		// Delete any state information we have about current contents
+		delete this._singleChild;
 	},
 
 	_setContent: function(cont, isFakeContent){
-		// summary: 
+		// summary:
 		//		Insert the content into the container node
 
 		// first get rid of child widgets
 		this.destroyDescendants();
 
-		// Delete any state information we have about current contents
-		delete this._singleChild;
-
 		// dojo.html.set will take care of the rest of the details
-		// we provide an overide for the error handling to ensure the widget gets the errors 
+		// we provide an override for the error handling to ensure the widget gets the errors
 		// configure the setter instance with only the relevant widget instance properties
-		// NOTE: unless we hook into attr, or provide property setters for each property, 
+		// NOTE: unless we hook into attr, or provide property setters for each property,
 		// we need to re-configure the ContentSetter with each use
-		var setter = this._contentSetter; 
-		if(! (setter && setter instanceof dojo.html._ContentSetter)) {
+		var setter = this._contentSetter;
+		if(! (setter && setter instanceof dojo.html._ContentSetter)){
 			setter = this._contentSetter = new dojo.html._ContentSetter({
 				node: this.containerNode,
 				_onError: dojo.hitch(this, this._onError),
@@ -3511,12 +3684,12 @@ dojo.declare(
 		};
 
 		var setterParams = dojo.mixin({
-			cleanContent: this.cleanContent, 
-			extractContent: this.extractContent, 
-			parseContent: this.parseOnLoad 
+			cleanContent: this.cleanContent,
+			extractContent: this.extractContent,
+			parseContent: this.parseOnLoad
 		}, this._contentSetterParams || {});
-		
-		dojo.mixin(setter, setterParams); 
+
+		dojo.mixin(setter, setterParams);
 
 		setter.set( (dojo.isObject(cont) && cont.domNode) ? cont.domNode : cont );
 
@@ -3524,25 +3697,27 @@ dojo.declare(
 		delete this._contentSetterParams;
 
 		if(!isFakeContent){
+			// Startup each top level child widget (and they will start their children, recursively)
 			dojo.forEach(this.getChildren(), function(child){
-				child.startup();
-			});
-
-			if(this.doLayout){
-				this._checkIfSingleChild();
-			}
+				// The parser has already called startup on all widgets *without* a getParent() method
+				if(!this.parseOnLoad || child.getParent){
+					child.startup();
+				}
+			}, this);
 
 			// Call resize() on each of my child layout widgets,
 			// or resize() on my single child layout widget...
 			// either now (if I'm currently visible)
 			// or when I become visible
 			this._scheduleLayout();
-			
+
 			this._onLoadHandler(cont);
 		}
 	},
 
 	_onError: function(type, err, consoleText){
+		this.onLoadDeferred.errback(err);
+
 		// shows user the string that is returned by on[type]Error
 		// overide on[type]Error and return your own string to customize
 		var errText = this['on' + type + 'Error'].call(this, err);
@@ -3552,7 +3727,7 @@ dojo.declare(
 			this._setContent(errText, true);
 		}
 	},
-	
+
 	_scheduleLayout: function(){
 		// summary:
 		//		Call resize() on each of my child layout widgets, either now
@@ -3573,8 +3748,15 @@ dojo.declare(
 		//		(from an href, or from attr('content', ...))... but deferred until
 		//		the ContentPane is visible
 
+		if(this.doLayout){
+			this._checkIfSingleChild();
+		}
+
 		if(this._singleChild && this._singleChild.resize){
 			var cb = this._contentBox || dojo.contentBox(this.containerNode);
+
+			// note: if widget has padding this._contentBox will have l and t set,
+			// but don't pass them to resize() or it will doubly-offset the child
 			this._singleChild.resize({w: cb.w, h: cb.h});
 		}else{
 			// All my child widgets are independently sized (rather than matching my size),
@@ -3676,7 +3858,7 @@ dojo.declare(
 			//		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. 
+			//		TooltipDialog in order to control the size of an inner widget.
 			doLayout: false,
 
 			// autofocus: Boolean
@@ -3699,8 +3881,7 @@ dojo.declare(
 			//		Set by `dijit._DialogMixin._getFocusItems`.
 			_lastFocusItem: null,
 
-			templateString: null,
-			templateString:"<div waiRole=\"presentation\">\n\t<div class=\"dijitTooltipContainer\" waiRole=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" dojoAttachPoint=\"containerNode\" tabindex=\"-1\" waiRole=\"dialog\"></div>\n\t</div>\n\t<div class=\"dijitTooltipConnector\" waiRole=\"presentation\"></div>\n</div>\n",
+			templateString: dojo.cache("dijit", "templates/TooltipDialog.html", "<div waiRole=\"presentation\">\n\t<div class=\"dijitTooltipContainer\" waiRole=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" dojoAttachPoint=\"containerNode\" tabindex=\"-1\" waiRole=\"dialog\"></div>\n\t</div>\n\t<div class=\"dijitTooltipConnector\" waiRole=\"presentation\"></div>\n</div>\n"),
 
 			postCreate: function(){
 				this.inherited(arguments);
@@ -3719,7 +3900,7 @@ dojo.declare(
 				if(c){
 					dojo.removeClass(this.domNode, c);
 				}
-				c = "dijitTooltipAB"+(corner.charAt(1)=='L'?"Left":"Right")+" dijitTooltip"+(corner.charAt(0)=='T' ? "Below" : "Above");
+				c = "dijitTooltipAB"+(corner.charAt(1) == 'L'?"Left":"Right")+" dijitTooltip"+(corner.charAt(0) == 'T' ? "Below" : "Above");
 				dojo.addClass(this.domNode, c);
 				this._currentOrientClass = c;
 			},
@@ -3730,16 +3911,25 @@ dojo.declare(
 				//		This is called from the dijit.popup code, and should not be called directly.
 				// tags:
 				//		protected
-			
+
 				this.orient(this.domNode,pos.aroundCorner, pos.corner);
 				this._onShow(); // lazy load trigger
-				
+
 				if(this.autofocus){
 					this._getFocusItems(this.containerNode);
 					dijit.focus(this._firstFocusItem);
 				}
 			},
-			
+
+			onClose: function(){
+				// summary:
+				//		Called when dialog is hidden.
+				//		This is called from the dijit.popup code, and should not be called directly.
+				// tags:
+				//		protected
+				this.onHide();
+			},
+
 			_onKey: function(/*Event*/ evt){
 				// summary:
 				//		Handler for keyboard events
@@ -3750,12 +3940,13 @@ dojo.declare(
 
 				var node = evt.target;
 				var dk = dojo.keys;
-				if (evt.charOrCode === dk.TAB){
+				if(evt.charOrCode === dk.TAB){
 					this._getFocusItems(this.containerNode);
 				}
 				var singleFocusItem = (this._firstFocusItem == this._lastFocusItem);
 				if(evt.charOrCode == dk.ESCAPE){
-					this.onCancel();
+					// Use setTimeout to avoid crash on IE, see #10396.
+					setTimeout(dojo.hitch(this, "onCancel"), 0);
 					dojo.stopEvent(evt);
 				}else if(node == this._firstFocusItem && evt.shiftKey && evt.charOrCode === dk.TAB){
 					if(!singleFocusItem){
@@ -3773,7 +3964,7 @@ dojo.declare(
 					evt.stopPropagation();
 				}
 			}
-		}	
+		}
 	);
 
 }
@@ -3799,7 +3990,7 @@ dijit._underlay = function(kwArgs){
 	// summary:
 	//		A shared instance of a `dijit.DialogUnderlay`
 	//
-	// description: 
+	// description:
 	//		A shared instance of a `dijit.DialogUnderlay` created and
 	//		used by `dijit.Dialog`, though never created until some Dialog
 	//		or subclass thereof is shown.
@@ -3807,8 +3998,8 @@ dijit._underlay = function(kwArgs){
 =====*/
 
 dojo.declare(
-	"dijit.Dialog",
-	[dijit.layout.ContentPane, dijit._Templated, dijit.form._FormMixin, dijit._DialogMixin],
+	"dijit._DialogBase",
+	[dijit._Templated, dijit.form._FormMixin, dijit._DialogMixin],
 	{
 		// summary:
 		//		A modal dialog Widget
@@ -3825,14 +4016,15 @@ dojo.declare(
 		// |	var foo = new dijit.Dialog({ title: "test dialog", content: "test content" };
 		// |	dojo.body().appendChild(foo.domNode);
 		// |	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\"></span>\n\t<span dojoAttachPoint=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" dojoAttachEvent=\"onclick: onCancel, onmouseenter: _onCloseEnter, onmouseleave: _onCloseLeave\" title=\"${buttonCancel}\">\n\t\t<span dojo [...]
+
+		templateString: dojo.cache("dijit", "templates/Dialog.html", "<div class=\"dijitDialog\" tabindex=\"-1\" waiRole=\"dialog\" waiState=\"labelledby-${id}_title\">\n\t<div dojoAttachPoint=\"titleBar\" class=\"dijitDialogTitleBar\">\n\t<span dojoAttachPoint=\"titleNode\" class=\"dijitDialogTitle\" id=\"${id}_title\"></span>\n\t<span dojoAttachPoint=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" dojoAttachEvent=\"onclick: onCancel, onmouseenter: _onCloseEnter, onmouseleave: _onCloseLeav [...]
+
 		attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
 			title: [
-				{ node: "titleNode", type: "innerHTML" }, 
+				{ node: "titleNode", type: "innerHTML" },
 				{ node: "titleBar", type: "attribute" }
-			]
+			],
+			"aria-describedby":""
 		}),
 
 		// open: Boolean
@@ -3848,7 +4040,7 @@ dojo.declare(
 		// 		is to re-focus the element which had focus before being opened.
 		//		False will disable refocusing. Default: true
 		refocus: true,
-		
+
 		// autofocus: Boolean
 		// 		A Toggle to modify the default focus behavior of a Dialog, which
 		// 		is to focus on the first dialog element after opening the dialog.
@@ -3859,7 +4051,7 @@ dojo.declare(
 		//		The pointer to the first focusable node in the dialog.
 		//		Set by `dijit._DialogMixin._getFocusItems`.
 		_firstFocusItem: null,
-		
+
 		// _lastFocusItem: [private] [readonly] DomNode
 		//		The pointer to which node has focus prior to our dialog.
 		//		Set by `dijit._DialogMixin._getFocusItems`.
@@ -3869,7 +4061,7 @@ dojo.declare(
 		//		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. 
+		//		Dialog in order to control the size of an inner widget.
 		doLayout: false,
 
 		// draggable: Boolean
@@ -3878,9 +4070,15 @@ dojo.declare(
 		//		in the viewport.
 		draggable: true,
 
-		// _fixSizes: Boolean
-		//		Does this Dialog attempt to restore the width and height after becoming too small?
-		_fixSizes: true,
+		//aria-describedby: String
+		//		Allows the user to add an aria-describedby attribute onto the dialog.   The value should
+		//		be the id of the container element of text that describes the dialog purpose (usually
+		//		the first text in the dialog).
+		//		<div dojoType="dijit.Dialog" aria-describedby="intro" .....>
+		//			<div id="intro">Introductory text</div>
+		//			<div>rest of dialog contents</div>
+		//		</div>
+		"aria-describedby":"",
 
 		postMixInProperties: function(){
 			var _nlsResources = dojo.i18n.getLocalization("dijit", "common");
@@ -3890,10 +4088,8 @@ dojo.declare(
 
 		postCreate: function(){
 			dojo.style(this.domNode, {
-				visibility:"hidden",
-				position:"absolute",
-				display:"",
-				top:"-9999px"
+				display: "none",
+				position:"absolute"
 			});
 			dojo.body().appendChild(this.domNode);
 
@@ -3911,7 +4107,7 @@ dojo.declare(
 			//		but should *not* be overriden.
 			// tags:
 			//		callback
-			
+
 			// when href is specified we need to reposition the dialog after the data is loaded
 			this._position();
 			this.inherited(arguments);
@@ -3919,22 +4115,16 @@ dojo.declare(
 
 		_endDrag: function(e){
 			// summary:
-			//		Called after dragging the Dialog. Calculates the relative offset
-			//		of the Dialog in relation to the viewport.
+			//		Called after dragging the Dialog. Saves the position of the dialog in the viewport.
 			// tags:
 			//		private
 			if(e && e.node && e.node === this.domNode){
-				var vp = dijit.getViewport(); 
-				var p = e._leftTop || dojo.coords(e.node,true);
-				this._relativePosition = {
-					t: p.t - vp.t,
-					l: p.l - vp.l
-				}			
+				this._relativePosition = dojo.position(e.node);
 			}
 		},
-		
+
 		_setup: function(){
-			// summary: 
+			// summary:
 			//		Stuff we need to do before showing the Dialog for the first
 			//		time (but we defer it until right beforehand, for
 			//		performance reasons).
@@ -3949,29 +4139,33 @@ dojo.declare(
 					new dojo.dnd.Moveable(node, { handle: this.titleBar, timeout: 0 });
 				dojo.subscribe("/dnd/move/stop",this,"_endDrag");
 			}else{
-				dojo.addClass(node,"dijitDialogFixed"); 
+				dojo.addClass(node,"dijitDialogFixed");
 			}
-			
-			var underlayAttrs = {
+
+			this.underlayAttrs = {
 				dialogId: this.id,
 				"class": dojo.map(this["class"].split(/\s/), function(s){ return s+"_underlay"; }).join(" ")
 			};
-			
-			var underlay = dijit._underlay;
-			if(!underlay){ 
-				underlay = dijit._underlay = new dijit.DialogUnderlay(underlayAttrs); 
-			}
-			
+
 			this._fadeIn = dojo.fadeIn({
 				node: node,
 				duration: this.duration,
-				beforeBegin: function(){
-					underlay.attr(underlayAttrs);
+				beforeBegin: dojo.hitch(this, function(){
+					var underlay = dijit._underlay;
+					if(!underlay){
+						underlay = dijit._underlay = new dijit.DialogUnderlay(this.underlayAttrs);
+					}else{
+						underlay.attr(this.underlayAttrs);
+					}
+
+					var zIndex = 948 + dijit._dialogStack.length*2;
+					dojo.style(dijit._underlay.domNode, 'zIndex', zIndex);
+					dojo.style(this.domNode, 'zIndex', zIndex + 1);
 					underlay.show();
-				},
-				onEnd:	dojo.hitch(this, function(){
+				}),
+				onEnd: dojo.hitch(this, function(){
 					if(this.autofocus){
-						// find focusable Items each time dialog is shown since if dialog contains a widget the 
+						// find focusable Items each time dialog is shown since if dialog contains a widget the
 						// first focusable items can change
 						this._getFocusItems(this.domNode);
 						dijit.focus(this._firstFocusItem);
@@ -3982,11 +4176,38 @@ dojo.declare(
 			this._fadeOut = dojo.fadeOut({
 				node: node,
 				duration: this.duration,
-				onEnd: function(){
-					node.style.visibility="hidden";
-					node.style.top = "-9999px";
-					dijit._underlay.hide();
-				}
+				onEnd: dojo.hitch(this, function(){
+					node.style.display = "none";
+
+					// Restore the previous dialog in the stack, or if this is the only dialog
+					// then restore to original page
+					var ds = dijit._dialogStack;
+					if(ds.length == 0){
+						dijit._underlay.hide();
+					}else{
+						dojo.style(dijit._underlay.domNode, 'zIndex', 948 + ds.length*2);
+						dijit._underlay.attr(ds[ds.length-1].underlayAttrs);
+					}
+
+					// Restore focus to wherever it was before this dialog was displayed
+					if(this.refocus){
+						var focus = this._savedFocus;
+
+						// If we are returning control to a previous dialog but for some reason
+						// that dialog didn't have a focused field, set focus to first focusable item.
+						// This situation could happen if two dialogs appeared at nearly the same time,
+						// since a dialog doesn't set it's focus until the fade-in is finished.
+						if(ds.length > 0){
+							var pd = ds[ds.length-1];
+							if(!dojo.isDescendant(focus.node, pd.domNode)){
+								pd._getFocusItems(pd.domNode);
+								focus = pd._firstFocusItem;
+							}
+						}
+
+						dijit.focus(focus);
+					}
+				})
 			 });
 		},
 
@@ -4006,23 +4227,55 @@ dojo.declare(
 			if(this._moveable){
 				this._moveable.destroy();
 			}
+			this.inherited(arguments);
 		},
 
 		_size: function(){
 			// summary:
-			// 		Make sure the dialog is small enough to fit in viewport.
+			// 		If necessary, shrink dialog contents so dialog fits in viewport
 			// tags:
 			//		private
 
+			this._checkIfSingleChild();
+
+			// If we resized the dialog contents earlier, reset them back to original size, so
+			// that if the user later increases the viewport size, the dialog can display w/out a scrollbar.
+			// Need to do this before the dojo.marginBox(this.domNode) call below.
+			if(this._singleChild){
+				if(this._singleChildOriginalStyle){
+					this._singleChild.domNode.style.cssText = this._singleChildOriginalStyle;
+				}
+				delete this._singleChildOriginalStyle;
+			}else{
+				dojo.style(this.containerNode, {
+					width:"auto",
+					height:"auto"
+				});
+			}
+
 			var mb = dojo.marginBox(this.domNode);
 			var viewport = dijit.getViewport();
 			if(mb.w >= viewport.w || mb.h >= viewport.h){
-				dojo.style(this.containerNode, {
-					width: Math.min(mb.w, Math.floor(viewport.w * 0.75))+"px",
-					height: Math.min(mb.h, Math.floor(viewport.h * 0.75))+"px",
-					overflow: "auto",
-					position: "relative"	// workaround IE bug moving scrollbar or dragging dialog
-				});
+				// Reduce size of dialog contents so that dialog fits in viewport
+
+				var w = Math.min(mb.w, Math.floor(viewport.w * 0.75)),
+					h = Math.min(mb.h, Math.floor(viewport.h * 0.75));
+
+				if(this._singleChild && this._singleChild.resize){
+					this._singleChildOriginalStyle = this._singleChild.domNode.style.cssText;
+					this._singleChild.resize({w: w, h: h});
+				}else{
+					dojo.style(this.containerNode, {
+						width: w + "px",
+						height: h + "px",
+						overflow: "auto",
+						position: "relative"	// workaround IE bug moving scrollbar or dragging dialog
+					});
+				}
+			}else{
+				if(this._singleChild && this._singleChild.resize){
+					this._singleChild.resize();
+				}
 			}
 		},
 
@@ -4035,16 +4288,18 @@ dojo.declare(
 			// tags:
 			//		private
 			if(!dojo.hasClass(dojo.body(),"dojoMove")){
-				var node = this.domNode;
-				var viewport = dijit.getViewport();
-					var p = this._relativePosition;
-					var mb = p ? null : dojo.marginBox(node);
-					dojo.style(node,{
-						left: Math.floor(viewport.l + (p ? p.l : (viewport.w - mb.w) / 2)) + "px",
-						top: Math.floor(viewport.t + (p ? p.t : (viewport.h - mb.h) / 2)) + "px"
-					});
-				}
-
+				var node = this.domNode,
+					viewport = dijit.getViewport(),
+					p = this._relativePosition,
+					bb = p ? null : dojo._getBorderBox(node),
+					l = Math.floor(viewport.l + (p ? p.x : (viewport.w - bb.w) / 2)),
+					t = Math.floor(viewport.t + (p ? p.y : (viewport.h - bb.h) / 2))
+				;
+				dojo.style(node,{
+					left: l + "px",
+					top: t + "px"
+				});
+			}
 		},
 
 		_onKey: function(/*Event*/ evt){
@@ -4052,10 +4307,17 @@ dojo.declare(
 			//		Handles the keyboard events for accessibility reasons
 			// tags:
 			//		private
+
+			var ds = dijit._dialogStack;
+			if(ds[ds.length-1] != this){
+				// console.debug(this.id + ': skipping because', this, 'is not the active dialog');
+				return;
+			}
+
 			if(evt.charOrCode){
 				var dk = dojo.keys;
 				var node = evt.target;
-				if (evt.charOrCode === dk.TAB){
+				if(evt.charOrCode === dk.TAB){
 					this._getFocusItems(this.domNode);
 				}
 				var singleFocusItem = (this._firstFocusItem == this._lastFocusItem);
@@ -4066,16 +4328,16 @@ dojo.declare(
 					}
 					dojo.stopEvent(evt);
 				}else if(node == this._lastFocusItem && evt.charOrCode === dk.TAB && !evt.shiftKey){
-					if (!singleFocusItem){
+					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(node == this.domNode || dojo.hasClass(node, "dijitPopup")){
 							if(evt.charOrCode == dk.ESCAPE){
-								this.onCancel(); 
+								this.onCancel();
 							}else{
 								return; // just let it go
 							}
@@ -4099,8 +4361,8 @@ dojo.declare(
 			// summary:
 			//		Display the dialog
 			if(this.open){ return; }
-			
-			// first time we show the dialog, there's some initialization stuff to do			
+
+			// first time we show the dialog, there's some initialization stuff to do
 			if(!this._alreadyInitialized){
 				this._setup();
 				this._alreadyInitialized=true;
@@ -4126,22 +4388,15 @@ dojo.declare(
 
 			dojo.style(this.domNode, {
 				opacity:0,
-				visibility:""
+				display:""
 			});
-			
-			if(this._fixSizes){
-				dojo.style(this.containerNode, { // reset width and height so that _size():marginBox works correctly
-					width:"auto",
-					height:"auto"
-				});
-			}
-			
+
 			this.open = true;
 			this._onShow(); // lazy load trigger
 
 			this._size();
 			this._position();
-
+			dijit._dialogStack.push(this);
 			this._fadeIn.play();
 
 			this._savedFocus = dijit.getFocus(this);
@@ -4151,47 +4406,55 @@ dojo.declare(
 			// summary:
 			//		Hide the dialog
 
-			// if we haven't been initialized yet then we aren't showing and we can just return		
-			if(!this._alreadyInitialized){
+			// if we haven't been initialized yet then we aren't showing and we can just return
+			// or if we aren't the active dialog, don't allow us to close yet
+			var ds = dijit._dialogStack;
+			if(!this._alreadyInitialized || this != ds[ds.length-1]){
 				return;
 			}
 
 			if(this._fadeIn.status() == "playing"){
 				this._fadeIn.stop();
 			}
+
+			// throw away current active dialog from stack -- making the previous dialog or the node on the original page active
+			ds.pop();
+
 			this._fadeOut.play();
 
-			if (this._scrollConnected){
+			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));
-			}
+
 			if(this._relativePosition){
-				delete this._relativePosition;	
+				delete this._relativePosition;
 			}
 			this.open = false;
+
+			this.onHide();
 		},
 
-		layout: function() {
+		layout: function(){
 			// summary:
 			//		Position the Dialog and the underlay
 			// tags:
 			//		private
-			if(this.domNode.style.visibility != "hidden"){
-				dijit._underlay.layout();
+			if(this.domNode.style.display != "none"){
+				if(dijit._underlay){	// avoid race condition during show()
+					dijit._underlay.layout();
+				}
 				this._position();
 			}
 		},
-		
+
 		destroy: function(){
 			dojo.forEach(this._modalconnects, dojo.disconnect);
 			if(this.refocus && this.open){
 				setTimeout(dojo.hitch(dijit,"focus",this._savedFocus), 25);
 			}
-			this.inherited(arguments);			
+			this.inherited(arguments);
 		},
 
 		_onCloseEnter: function(){
@@ -4212,8 +4475,16 @@ dojo.declare(
 	}
 );
 
-// For back-compat.  TODO: remove in 2.0
+dojo.declare(
+	"dijit.Dialog",
+	[dijit.layout.ContentPane, dijit._DialogBase],
+	{}
+);
+
+// Stack of currenctly displayed dialogs, layered on top of each other
+dijit._dialogStack = [];
 
+// For back-compat.  TODO: remove in 2.0
 
 
 }
@@ -4229,8 +4500,9 @@ dojo.provide("dijit._editor.selection");
 
 dojo.mixin(dijit._editor.selection, {
 	getType: function(){
-		// summary: Get the selection type (like dojo.doc.select.type in IE).
-		if(dojo.doc.selection){ //IE
+		// summary:
+		//		Get the selection type (like dojo.doc.select.type in IE).
+		if(dojo.isIE){
 			return dojo.doc.selection.type.toLowerCase();
 		}else{
 			var stype = "text";
@@ -4241,7 +4513,7 @@ dojo.mixin(dijit._editor.selection, {
 				oSel = dojo.global.getSelection();
 			}catch(e){ /*squelch*/ }
 
-			if(oSel && oSel.rangeCount==1){
+			if(oSel && oSel.rangeCount == 1){
 				var oRange = oSel.getRangeAt(0);
 				if(	(oRange.startContainer == oRange.endContainer) &&
 					((oRange.endOffset - oRange.startOffset) == 1) &&
@@ -4250,14 +4522,14 @@ dojo.mixin(dijit._editor.selection, {
 					stype = "control";
 				}
 			}
-			return stype;
+			return stype; //String
 		}
 	},
 
 	getSelectedText: function(){
 		// summary:
 		//		Return the text (no html tags) included in the current selection or null if no text is selected
-		if(dojo.doc.selection){ //IE
+		if(dojo.isIE){
 			if(dijit._editor.selection.getType() == 'control'){
 				return null;
 			}
@@ -4265,16 +4537,16 @@ dojo.mixin(dijit._editor.selection, {
 		}else{
 			var selection = dojo.global.getSelection();
 			if(selection){
-				return selection.toString();
+				return selection.toString(); //String
 			}
 		}
-		return ''
+		return '';
 	},
 
 	getSelectedHtml: function(){
 		// summary:
-		//		Return the html of the current selection or null if unavailable
-		if(dojo.doc.selection){ //IE
+		//		Return the html text of the current selection or null if unavailable
+		if(dojo.isIE){
 			if(dijit._editor.selection.getType() == 'control'){
 				return null;
 			}
@@ -4282,10 +4554,16 @@ dojo.mixin(dijit._editor.selection, {
 		}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;
+				var i;
+				var html = "";
+				for(i = 0; i < selection.rangeCount; i++){
+					//Handle selections spanning ranges, such as Opera
+					var frag = selection.getRangeAt(i).cloneContents();
+					var div = dojo.doc.createElement("div");
+					div.appendChild(frag);
+					html += div.innerHTML;
+				}
+				return html; //String
 			}
 			return null;
 		}
@@ -4297,7 +4575,7 @@ dojo.mixin(dijit._editor.selection, {
 		//		a single element (object like and image or a table) is
 		//		selected.
 		if(dijit._editor.selection.getType() == "control"){
-			if(dojo.doc.selection){ //IE
+			if(dojo.isIE){
 				var range = dojo.doc.selection.createRange();
 				if(range && range.item){
 					return dojo.doc.selection.createRange().item(0);
@@ -4317,19 +4595,17 @@ dojo.mixin(dijit._editor.selection, {
 			var p = this.getSelectedElement();
 			if(p){ return p.parentNode; }
 		}else{
-			if(dojo.doc.selection){ //IE
-				var r=dojo.doc.selection.createRange();
+			if(dojo.isIE){
+				var r = dojo.doc.selection.createRange();
 				r.collapse(true);
 				return r.parentElement();
 			}else{
 				var selection = dojo.global.getSelection();
 				if(selection){
 					var node = selection.anchorNode;
-
 					while(node && (node.nodeType != 1)){ // not an element
 						node = node.parentNode;
 					}
-
 					return node;
 				}
 			}
@@ -4341,74 +4617,93 @@ dojo.mixin(dijit._editor.selection, {
 		// 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;
+		// tagName: String
+		//		The tag name to determine if it has an ancestor of.
+		return this.getAncestorElement.apply(this, arguments) != null; //Boolean
 	},
 
 	getAncestorElement: function(/*String*/tagName /* ... */){
 		// summary:
 		//		Return the parent element of the current selection which is of
 		//		type tagName (or one of the other specified tagName)
-
+		// tagName: String
+		//		The tag name to determine if it has an ancestor of.
 		var node = this.getSelectedElement() || this.getParentElement();
-		return this.getParentOfType(node, arguments);
+		return this.getParentOfType(node, arguments); //DOMNode
 	},
 
-	isTag: function(/*DomNode*/node, /*Array*/tags){
+	isTag: function(/*DomNode*/ node, /*String[]*/ tags){
+		// summary:
+		//		Function to determine if a node is one of an array of tags.
+		// node:
+		//		The node to inspect.
+		// tags:
+		//		An array of tag name strings to check to see if the node matches.
 		if(node && node.tagName){
 			var _nlc = node.tagName.toLowerCase();
 			for(var i=0; i<tags.length; i++){
 				var _tlc = String(tags[i]).toLowerCase();
 				if(_nlc == _tlc){
-					return _tlc;
+					return _tlc; // String
 				}
 			}
 		}
 		return "";
 	},
 
-	getParentOfType: function(/*DomNode*/node, /*Array*/tags){
+	getParentOfType: function(/*DomNode*/ node, /*String[]*/ tags){
+		// summary:
+		//		Function to locate a parent node that matches one of a set of tags
+		// node:
+		//		The node to inspect.
+		// tags:
+		//		An array of tag name strings to check to see if the node matches.
 		while(node){
 			if(this.isTag(node, tags).length){
-				return node;
+				return node; // DOMNode
 			}
 			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();
-	  }
+	collapse: function(/*Boolean*/beginning){
+		// summary:
+		//		Function to collapse (clear), the current selection
+		// beginning: Boolean
+		//		Boolean to indicate whether to collapse the cursor to the beginning of the selection or end.
+		if(window.getSelection){
+			var selection = dojo.global.getSelection();
+			if(selection.removeAllRanges){ // Mozilla
+				if(beginning){
+					selection.collapseToStart();
+				}else{
+					selection.collapseToEnd();
+				}
+			}else{ // Safari
+				// pulled from WebCore/ecma/kjs_window.cpp, line 2536
+				selection.collapse(beginning);
+			}
+		}else if(dojo.isIE){ // IE
+			var range = dojo.doc.selection.createRange();
+			range.collapse(beginning);
+			range.select();
+		}
 	},
 
 	remove: function(){
-		// summary: delete current selection
-		var _s = dojo.doc.selection;
-		if(_s){ //IE
-			if(_s.type.toLowerCase() != "none"){
-				_s.clear();
+		// summary:
+		//		Function to delete the currently selected content from the document.
+		var sel = dojo.doc.selection;
+		if(dojo.isIE){
+			if(sel.type.toLowerCase() != "none"){
+				sel.clear();
 			}
-			return _s;
+			return sel; //Selection
 		}else{
-			_s = dojo.global.getSelection();
-			_s.deleteFromDocument();
-			return _s;
+			sel = dojo.global.getSelection();
+			sel.deleteFromDocument();
+			return sel; //Selection
 		}
 	},
 
@@ -4416,21 +4711,38 @@ dojo.mixin(dijit._editor.selection, {
 		// summary:
 		//		clear previous selection and select the content of the node
 		//		(excluding the node itself)
-		var _window = dojo.global;
-		var _document = dojo.doc;
+		// element: DOMNode
+		//		The element you wish to select the children content of.
+		// nochangefocus: Boolean
+		//		Boolean to indicate if the foxus should change or not.
+		var win = dojo.global;
+		var doc = dojo.doc;
+		var range;
 		element = dojo.byId(element);
-		if(_document.selection && dojo.body().createTextRange){ // IE
-			var range = element.ownerDocument.body.createTextRange();
+		if(doc.selection && dojo.isIE && dojo.body().createTextRange){ // IE
+			range = element.ownerDocument.body.createTextRange();
 			range.moveToElementText(element);
 			if(!nochangefocus){
 				try{
 					range.select(); // IE throws an exception here if the widget is hidden.  See #5439
 				}catch(e){ /* squelch */}
 			}
-		}else if(_window.getSelection){
-			var selection = _window.getSelection();
+		}else if(win.getSelection){
+			var selection = dojo.global.getSelection();
 			if(selection.setBaseAndExtent){ // Safari
 				selection.setBaseAndExtent(element, 0, element, element.innerText.length - 1);
+			}else if(dojo.isOpera){
+				//Opera's selectAllChildren doesn't seem to work right
+				//against <body> nodes and possibly others ... so
+				//we use the W3C range API
+				if(selection.rangeCount){
+					range = selection.getRangeAt(0);
+				}else{
+					range = doc.createRange();
+				}
+				range.setStart(element, 0);
+				range.setEnd(element,(element.nodeType == 3)?element.length:element.childNodes.length);
+				selection.addRange(range);
 			}else if(selection.selectAllChildren){ // Mozilla
 				selection.selectAllChildren(element);
 			}
@@ -4440,9 +4752,15 @@ dojo.mixin(dijit._editor.selection, {
 	selectElement: function(/*DomNode*/element,/*Boolean?*/nochangefocus){
 		// summary:
 		//		clear previous selection and select element (including all its children)
-		var range, _document = dojo.doc;
+		// element:  DOMNode
+		//		The element to select.
+		// nochangefocus: Boolean
+		//		Boolean indicating if the focus should be changed.  IE only.
+		var range;
+		var doc = dojo.doc;
+		var win = dojo.global;
 		element = dojo.byId(element);
-		if(_document.selection && dojo.body().createTextRange){ // IE
+		if(dojo.isIE && dojo.body().createTextRange){
 			try{
 				range = dojo.body().createControlRange();
 				range.addElement(element);
@@ -4453,10 +4771,17 @@ dojo.mixin(dijit._editor.selection, {
 				this.selectElementChildren(element,nochangefocus);
 			}
 		}else if(dojo.global.getSelection){
-			var selection = dojo.global.getSelection();
-			// FIXME: does this work on Safari?
+			var selection = win.getSelection();
+			range = doc.createRange();
 			if(selection.removeAllRanges){ // Mozilla
-				range = _document.createRange();
+				// FIXME: does this work on Safari?
+				if(dojo.isOpera){
+					//Opera works if you use the current range on
+					//the selection if present.
+					if(selection.getRangeAt(0)){
+						range = selection.getRangeAt(0);
+					}
+				}
 				range.selectNode(element);
 				selection.removeAllRanges();
 				selection.addRange(range);
@@ -4484,7 +4809,7 @@ dijit.range.getIndex=function(/*DomNode*/node, /*DomNode*/parent){
 		var i = 0;
 		pnode = node.parentNode;
 		while((n=pnode.childNodes[i++])){
-			if(n===node){
+			if(n === node){
 				--i;
 				break;
 			}
@@ -4500,14 +4825,14 @@ dijit.range.getIndex=function(/*DomNode*/node, /*DomNode*/parent){
 	//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){
+	if(ret.length > 0 && onode.nodeType == 3){
 		n = onode.previousSibling;
-		while(n && n.nodeType==3){
+		while(n && n.nodeType == 3){
 			ret[ret.length-1]--;
 			n = n.previousSibling;
 		}
 		n = onode.nextSibling;
-		while(n && n.nodeType==3){
+		while(n && n.nodeType == 3){
 			retR[retR.length-1]++;
 			n = n.nextSibling;
 		}
@@ -4517,17 +4842,17 @@ dijit.range.getIndex=function(/*DomNode*/node, /*DomNode*/parent){
 }
 
 dijit.range.getNode = function(/*Array*/index, /*DomNode*/parent){
-	if(!dojo.isArray(index) || index.length==0){
+	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){
+		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
@@ -4555,7 +4880,7 @@ dijit.range.getCommonAncestor = function(n1,n2){
 	var m = Math.min(n1as.length,n2as.length);
 	var com = n1as[0]; //at least, one element should be in the array: the root (BODY by default)
 	for(var i=1;i<m;i++){
-		if(n1as[i]===n2as[i]){
+		if(n1as[i] === n2as[i]){
 			com = n1as[i]
 		}else{
 			break;
@@ -4599,8 +4924,8 @@ dijit.range.getBlockAncestor = function(/*DomNode*/node, /*RegEx?*/regex, /*DomN
 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){
+	if(!offsetAtBeginning && node.nodeType == 3){ //if this is a text node, check whether the left part is all space
+		if(/^[\s\xA0]+$/.test(node.nodeValue.substr(0,offset))){
 			offsetAtBeginning = true;
 		}
 	}
@@ -4621,8 +4946,8 @@ dijit.range.atBeginningOfContainer = function(/*DomNode*/container, /*DomNode*/n
 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){
+	if(!offsetAtEnd && node.nodeType == 3){ //if this is a text node, check whether the right part is all space
+		if(/^[\s\xA0]+$/.test(node.nodeValue.substr(offset))){
 			offsetAtEnd = true;
 		}
 	}
@@ -4655,15 +4980,15 @@ dijit.range.adjacentNoneTextNode=function(startnode, next){
 }
 
 dijit.range._w3c = Boolean(window['getSelection']);
-dijit.range.create = function(){
+dijit.range.create = function(/*Window?*/win){
 	if(dijit.range._w3c){
-		return dojo.doc.createRange();
+		return (win || dojo.global).document.createRange();
 	}else{//IE
 		return new dijit.range.W3CRange;
 	}
 }
 
-dijit.range.getSelection = function(win, /*Boolean?*/ignoreUpdate){
+dijit.range.getSelection = function(/*Window*/win, /*Boolean?*/ignoreUpdate){
 	if(dijit.range._w3c){
 		return win.getSelection();
 	}else{//IE
@@ -4717,7 +5042,7 @@ if(!dijit.range._w3c){
 			};
 		},
 		decomposeControlRange: function(range){
-			var firstnode = range.item(0), lastnode = range.item(range.length-1)
+			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;
@@ -4737,9 +5062,9 @@ if(!dijit.range._w3c){
 						atmrange.moveToElementText(node);
 
 						if(atmrange.compareEndPoints(cmpstr,range) > 0){
-							startnode = node.previousSibling;
+							//startnode = node.previousSibling;
 							if(lastNode && lastNode.nodeType == 3){
-								//where share we put the start? in the text node or after?
+								//where shall we put the start? in the text node or after?
 								startnode = lastNode;
 								calOffset = true;
 							}else{
@@ -4748,14 +5073,14 @@ if(!dijit.range._w3c){
 								return false;
 							}
 						}else{
-							if(i==parentNode.childNodes.length-1){
+							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
+						if(i == parentNode.childNodes.length-1){//at the end of this node
 							startnode = node;
 							calOffset = true;
 						}
@@ -4794,9 +5119,10 @@ if(!dijit.range._w3c){
 			//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;
+			if(!end && startnode.nodeType == 1 && startOffset == startnode.childNodes.length){
+				var nextnode=startnode.nextSibling;
+				if(nextnode && nextnode.nodeType == 3){
+					startnode = nextnode;
 					startOffset = 0;
 				}
 			}
@@ -4808,20 +5134,21 @@ if(!dijit.range._w3c){
 			if(container.nodeType!=3){ //normal node
 				if(offset > 0){
 					node = container.childNodes[offset-1];
-					if(node.nodeType==3){
+					if(node.nodeType == 3){
 						container = node;
 						offset = node.length;
 						//pass through
 					}else{
-						if(node.nextSibling && node.nextSibling.nodeType==3){
+						if(node.nextSibling && node.nextSibling.nodeType == 3){
 							container=node.nextSibling;
 							offset=0;
 							//pass through
 						}else{
 							atmrange.moveToElementText(node.nextSibling?node:container);
-							var tempnode=node.parentNode.insertBefore(document.createTextNode(' '),node.nextSibling);
+							var parent = node.parentNode;
+							var tempNode = parent.insertBefore(node.ownerDocument.createTextNode(' '), node.nextSibling);
 							atmrange.collapse(false);
-							tempnode.parentNode.removeChild(tempnode);
+							parent.removeChild(tempNode);
 						}
 					}
 				}else{
@@ -4829,7 +5156,7 @@ if(!dijit.range._w3c){
 					atmrange.collapse(true);
 				}
 			}
-			if(container.nodeType==3){
+			if(container.nodeType == 3){
 				var prevnodeobj = dijit.range.adjacentNoneTextNode(container);
 				var prevnode = prevnodeobj[0];
 				len = prevnodeobj[1];
@@ -4858,28 +5185,31 @@ if(!dijit.range._w3c){
 		},
 		decomposeTextRange: function(range){
 			var tmpary = dijit.range.ie.getEndPoint(range);
-			var startContainter = tmpary[0], startOffset = tmpary[1];
-			var endContainter = tmpary[0], endOffset = tmpary[1];
+			var startContainer = tmpary[0], startOffset = tmpary[1];
+			var endContainer = tmpary[0], endOffset = tmpary[1];
 
 			if(range.htmlText.length){
 				if(range.htmlText == range.text){ //in the same text node
 					endOffset = startOffset+range.text.length;
 				}else{
 					tmpary = dijit.range.ie.getEndPoint(range,true);
-					endContainter = tmpary[0], endOffset = tmpary[1];
+					endContainer = tmpary[0], endOffset = tmpary[1];
+//					if(startContainer.tagName == "BODY"){
+//						startContainer = startContainer.firstChild;
+//					}
 				}
 			}
-			return [startContainter, startOffset,endContainter, endOffset];
+			return [startContainer, startOffset, endContainer, endOffset];
 		},
-		setRange: function(range, startContainter,
-			startOffset, endContainter, endOffset, collapsed){
-			var start=dijit.range.ie.setEndPoint(range, startContainter, startOffset);
+		setRange: function(range, startContainer,
+			startOffset, endContainer, endOffset, collapsed){
+			var start=dijit.range.ie.setEndPoint(range, startContainer, startOffset);
 
 			range.setEndPoint('StartToStart',start);
 			if(!collapsed){
-				var end=dijit.range.ie.setEndPoint(range, endContainter, endOffset);	
+				var end=dijit.range.ie.setEndPoint(range, endContainer, endOffset);
 			}
-			range.setEndPoint('EndToEnd',end||start);
+			range.setEndPoint('EndToEnd',end || start);
 
 			return range;
 		}
@@ -4954,7 +5284,7 @@ dojo.declare("dijit.range.W3CRange",null, {
 		this[what](node.parentNode, index.pop()+ext);
 	},
 	_getIERange: function(){
-		var r=(this._body||this.endContainer.ownerDocument.body).createTextRange();
+		var r = (this._body || this.endContainer.ownerDocument.body).createTextRange();
 		dijit.range.ie.setRange(r, this.startContainer, this.startOffset, this.endContainer, this.endOffset, this.collapsed);
 		return r;
 	},
@@ -4998,7 +5328,7 @@ dojo._hasResource["dijit._editor.html"] = true;
 dojo.provide("dijit._editor.html");
 
 dijit._editor.escapeXml=function(/*String*/str, /*Boolean?*/noSingleQuotes){
-	//summary:
+	// summary:
 	//		Adds escape sequences for special characters in XML: &<>"'
 	//		Optionally skips escapes for single quotes
 	str = str.replace(/&/gm, "&").replace(/</gm, "<").replace(/>/gm, ">").replace(/"/gm, """);
@@ -5012,16 +5342,26 @@ dijit._editor.getNodeHtml=function(/* DomNode */node){
 	var output;
 	switch(node.nodeType){
 		case 1: //element node
-			output = '<' + node.nodeName.toLowerCase();
+			var lName = node.nodeName.toLowerCase();
+			if(lName.charAt(0) == "/"){
+				// IE does some strange things with malformed HTML input, like
+				// treating a close tag </span> without an open tag <span>, as
+				// a new tag with tagName of /span.  Corrupts output HTML, remove
+				// them.  Other browsers don't prefix tags that way, so will
+				// never show up.
+				return "";
+			}
+			output = '<' + lName;
 
 			//store the list of attributes and sort it to have the
 			//attributes appear in the dictionary order
 			var attrarray = [];
+			var attr;
 			if(dojo.isIE && node.outerHTML){
 				var s = node.outerHTML;
 				s = s.substr(0, s.indexOf('>'))
 					.replace(/(['"])[^"']*\1/g, ''); //to make the following regexp safe
-				var reg = /([^\s=]+)=/g;
+				var reg = /(\b\w+)\s?=/g;
 				var m, key;
 				while((m = reg.exec(s))){
 					key = m[1];
@@ -5032,7 +5372,7 @@ dijit._editor.getNodeHtml=function(/* DomNode */node){
 								continue;
 							}
 						}
-						var val;
+						var val, match;
 						switch(key){
 							case 'style':
 								val = node.style.cssText.toLowerCase();
@@ -5040,14 +5380,36 @@ dijit._editor.getNodeHtml=function(/* DomNode */node){
 							case 'class':
 								val = node.className;
 								break;
+							case 'width':
+								if(lName === "img"){
+									// This somehow gets lost on IE for IMG tags and the like
+									// and we have to find it in outerHTML, known IE oddity.
+									match=/width=(\S+)/i.exec(s);
+									if(match){
+										val = match[1];
+									}
+									break;
+								}
+							case 'height':
+								if(lName === "img"){
+									// This somehow gets lost on IE for IMG tags and the like
+									// and we have to find it in outerHTML, known IE oddity.
+									match=/height=(\S+)/i.exec(s);
+									if(match){
+										val = match[1];
+									}
+									break;
+								}
 							default:
 								val = node.getAttribute(key);
 						}
-						attrarray.push([key, val.toString()]);
+						if(val != null){
+							attrarray.push([key, val.toString()]);
+						}
 					}
 				}
 			}else{
-				var attr, i = 0;
+				var i = 0;
 				while((attr = node.attributes[i++])){
 					//ignore all attributes starting with _dj which are
 					//internal temporary attributes used by the editor
@@ -5065,20 +5427,45 @@ dijit._editor.getNodeHtml=function(/* DomNode */node){
 				}
 			}
 			attrarray.sort(function(a,b){
-				return a[0]<b[0]?-1:(a[0]==b[0]?0:1);
+				return a[0] < b[0] ? -1 : (a[0] == b[0] ? 0 : 1);
 			});
 			var j = 0;
 			while((attr = attrarray[j++])){
 				output += ' ' + attr[0] + '="' +
 					(dojo.isString(attr[1]) ? dijit._editor.escapeXml(attr[1], true) : attr[1]) + '"';
 			}
-			if(node.childNodes.length){
-				output += '>' + dijit._editor.getChildrenHtml(node)+'</'+node.nodeName.toLowerCase()+'>';
+			if(lName === "script"){
+				// Browsers handle script tags differently in how you get content,
+				// but innerHTML always seems to work, so insert its content that way
+				// Yes, it's bad to allow script tags in the editor code, but some people
+				// seem to want to do it, so we need to at least return them right.
+				// other plugins/filters can strip them.
+				output += '>' + node.innerHTML +'</' + lName + '>';
 			}else{
-				output += ' />';
+				if(node.childNodes.length){
+					output += '>' + dijit._editor.getChildrenHtml(node)+'</' + lName +'>';
+				}else{
+					switch(lName){
+						case 'br':
+						case 'hr':
+						case 'img':
+						case 'input':
+						case 'base':
+						case 'meta':
+						case 'area':
+						case 'basefont':
+							// These should all be singly closed
+							output += ' />';
+							break;
+						default:
+							// Assume XML style separate closure for everything else.
+							output += '></' + lName + '>';
+					}
+				}
 			}
 			break;
-		case 3: //text
+		case 4: // cdata
+		case 3: // text
 			// FIXME:
 			output = dijit._editor.escapeXml(node.nodeValue, true);
 			break;
@@ -5093,13 +5480,14 @@ dijit._editor.getNodeHtml=function(/* DomNode */node){
 };
 
 dijit._editor.getChildrenHtml = function(/* DomNode */dom){
-	// summary: Returns the html content of a DomNode and children
+	// summary:
+	//		Returns the html content of a DomNode and children
 	var out = "";
 	if(!dom){ return out; }
 	var nodes = dom["childNodes"] || dom;
 
 	//IE issue.
-	//If we have an actual node we can check parent relationships on for IE, 
+	//If we have an actual node we can check parent relationships on for IE,
 	//We should check, as IE sometimes builds invalid DOMS.  If no parent, we can't check
 	//And should just process it and hope for the best.
 	var checkParent = !dojo.isIE || nodes !== dom;
@@ -5129,8 +5517,6 @@ 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
@@ -5152,7 +5538,7 @@ if(!dojo.config["useXDomain"] || dojo.config["allowXdRichTextSave"]){
 		})();
 	}else{
 		//dojo.body() is not available before onLoad is fired
-		try {
+		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){ }
@@ -5203,16 +5589,27 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 
 		// editingAreaStyleSheets: dojo._URL[]
 		//		array to store all the stylesheets applied to the editing area
-		this.editingAreaStyleSheets=[];
+		this.editingAreaStyleSheets = [];
+
+		// Make a copy of this.events before we start writing into it, otherwise we
+		// will modify the prototype which leads to bad things on pages w/multiple editors
+		this.events = [].concat(this.events);
 
 		this._keyHandlers = {};
 		this.contentPreFilters.push(dojo.hitch(this, "_preFixUrlAttributes"));
 		if(dojo.isMoz){
-			this.contentPreFilters.push(this._fixContentForMoz);
+			this.contentPreFilters.push(this._normalizeFontStyle);
 			this.contentPostFilters.push(this._removeMozBogus);
 		}
-		if(dojo.isSafari){
-			this.contentPostFilters.push(this._removeSafariBogus);
+		if(dojo.isWebKit){
+			// Try to clean up WebKit bogus artifacts.  The inserted classes
+			// made by WebKit sometimes messes things up.
+			this.contentPreFilters.push(this._removeWebkitBogus);
+			this.contentPostFilters.push(this._removeWebkitBogus);
+		}
+		if(dojo.isIE){
+			// IE generates <strong> and <em> but we want to normalize to <b> and <i>
+			this.contentPostFilters.push(this._normalizeFontStyle);
 		}
 		//this.contentDomPostFilters.push(this._postDomFixUrlAttributes);
 
@@ -5252,7 +5649,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 	// minHeight: String
 	//		The minimum height that the editor should have.
 	minHeight: "1em",
-	
+
 	// isClosed: [private] Boolean
 	isClosed: true,
 
@@ -5267,7 +5664,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 	// onLoadDeferred: [protected] dojo.Deferred
 	//		Deferred which is fired when the editor finishes loading
 	onLoadDeferred: null,
-	
+
 	// isTabIndent: Boolean
 	//		Make tab key and shift-tab indent and outdent rather than navigating.
 	//		Caution: sing this makes web pages inaccessible to users unable to use a mouse.
@@ -5303,7 +5700,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 			};
 		});
 
-		var ctrlKeyHandlers = { 
+		var ctrlKeyHandlers = {
 			b: exec("bold"),
 			i: exec("italic"),
 			u: exec("underline"),
@@ -5396,15 +5793,12 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 	},
 
 	open: function(/*DomNode?*/ element){
-		//	summary:
+		// summary:
 		//		Transforms the node referenced in this.domNode into a rich text editing
-		//		node. 
-		//	description:
+		//		node.
+		// description:
 		//		Sets up the editing area asynchronously. This will result in
-		//		the creation and replacement with an <iframe> if
-		//		designMode(FF)/contentEditable(IE) is used and stylesheets are
-		//		specified, if we're in a browser that doesn't support
-		//		contentEditable.
+		//		the creation and replacement with an <iframe>.
 		//
 		//		A dojo.Deferred object is created at this.onLoadDeferred, and
 		//		users may attach to it to be informed when the rich-text area
@@ -5421,18 +5815,21 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 
 		this._content = "";
 		if(arguments.length == 1 && element.nodeName){ // else unchanged
-			this.domNode = element; 
-		} 
+			this.domNode = element;
+		}
 
 		var dn = this.domNode;
 
+		// "html" will hold the innerHTML of the srcNodeRef and will be used to
+		// initialize the editor.
 		var html;
+
 		if(dn.nodeName && dn.nodeName.toLowerCase() == "textarea"){
 			// if we were created from a textarea, then we need to create a
 			// new editing harness node.
 			var ta = (this.textarea = dn);
 			this.name = ta.name;
-			html = this._preFilterContent(ta.value);
+			html = ta.value;
 			dn = this.domNode = dojo.doc.createElement("div");
 			dn.setAttribute('widgetId', this.id);
 			ta.removeAttribute('widgetId');
@@ -5441,7 +5838,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 			dojo.place(dn, ta, "before");
 			var tmpFunc = dojo.hitch(this, function(){
 				//some browsers refuse to submit display=none textarea, so
-				//move the textarea out of screen instead
+				//move the textarea off screen instead
 				dojo.style(ta, {
 					display: "block",
 					position: "absolute",
@@ -5460,8 +5857,6 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 				tmpFunc();
 			}
 
-			// this.domNode.innerHTML = html;
-
 			if(ta.form){
 				dojo.connect(ta.form, "onsubmit", this, function(){
 					// FIXME: should we be calling close() here instead?
@@ -5469,12 +5864,11 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 				});
 			}
 		}else{
-			html = this._preFilterContent(dijit._editor.getChildrenHtml(dn));
+			html = dijit._editor.getChildrenHtml(dn);
 			dn.innerHTML = "";
 		}
 
 		var content = dojo.contentBox(dn);
-		// var content = dojo.contentBox(this.srcNodeRef);
 		this._oldHeight = content.h;
 		this._oldWidth = content.w;
 
@@ -5489,137 +5883,141 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		this.editingArea = dn.ownerDocument.createElement("div");
 		dn.appendChild(this.editingArea);
 
-		if(this.name != "" && (!dojo.config["useXDomain"] || dojo.config["allowXdRichTextSave"])){
+		// User has pressed back/forward button so we lost the text in the editor, but it's saved
+		// in a hidden <textarea> (which contains the data for all the editors on this page),
+		// so get editor value from there
+		if(this.name !== "" && (!dojo.config["useXDomain"] || dojo.config["allowXdRichTextSave"])){
 			var saveTextarea = dojo.byId(dijit._scopeName + "._editor.RichText.savedContent");
-			if(saveTextarea.value != ""){
+			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);
+						datas.splice(i, 1);	// TODO: this has no effect
 						break;
 					}
 				}
 			}
 
-			// FIXME: need to do something different for Opera/Safari
-			this.connect(window, "onbeforeunload", "_saveContent");
-			// dojo.connect(window, "onunload", this, "_saveContent");
+			// TODO: this is troublesome if this editor has been destroyed, should have global handler.
+			// TODO: need to clear <textarea> in global handler
+			dojo.addOnUnload(dojo.hitch(this, "_saveContent"));
 		}
 
 		this.isClosed = false;
 
-		// 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.isWebKit || dojo.isOpera){
-			// In 0.4, this was the contentEditable code path, but now it creates an iframe, same as for Firefox.
-			// However, firefox's iframe is handled by _drawIframe() rather than this code for some reason :-(
-			var ifr = (this.editorObject = this.iframe = dojo.doc.createElement('iframe'));
-			ifr.id = this.id+"_iframe";
-			this._iframeSrc = this._getIframeDocTxt(html);
-			ifr.style.border = "none";
-			ifr.style.width = "100%";
-			if(this._layoutMode){
-				// iframe should be 100% height, thus getting it's height from surrounding
-				// <div> (which has the correct height set by Editor
-				ifr.style.height = "100%";
-			}else{
-				if(dojo.isIE >= 7){
-					if(this.height){
-						ifr.style.height = this.height;
-					}
-					if(this.minHeight){
-						ifr.style.minHeight = this.minHeight;
-					}
-				}else{
-					ifr.style.height = this.height ? this.height : this.minHeight;
+		var ifr = (this.editorObject = this.iframe = dojo.doc.createElement('iframe'));
+		ifr.id = this.id+"_iframe";
+		this._iframeSrc = this._getIframeDocTxt();
+		ifr.style.border = "none";
+		ifr.style.width = "100%";
+		if(this._layoutMode){
+			// iframe should be 100% height, thus getting it's height from surrounding
+			// <div> (which has the correct height set by Editor)
+			ifr.style.height = "100%";
+		}else{
+			if(dojo.isIE >= 7){
+				if(this.height){
+					ifr.style.height = this.height;
 				}
-			}
-			ifr.frameBorder = 0;
-			// ifr.style.scrolling = this.height ? "auto" : "vertical";
-			ifr._loadFunc = dojo.hitch( this, function(win){
-				this.window = win;
-				this.document = this.window.document;
-
-				if(dojo.isIE){
-					this._localizeEditorCommands();
+				if(this.minHeight){
+					ifr.style.minHeight = this.minHeight;
 				}
+			}else{
+				ifr.style.height = this.height ? this.height : this.minHeight;
+			}
+		}
+		ifr.frameBorder = 0;
+		ifr._loadFunc = dojo.hitch( this, function(win){
+			this.window = win;
+			this.document = this.window.document;
 
-				this.onLoad();
-				this.savedContent = this.getValue(true);
-			});
-			var s = 'javascript:parent.' + dijit._scopeName + '.byId("'+this.id+'")._iframeSrc';
-			ifr.setAttribute('src', s);
-			this.editingArea.appendChild(ifr);
-			if(dojo.isWebKit){ // Safari seems to always append iframe with src=about:blank
-				setTimeout(function(){ifr.setAttribute('src', s)},0);
+			if(dojo.isIE){
+				this._localizeEditorCommands();
 			}
-		}else{
-			// Firefox code path
-			this._drawIframe(html);
+
+			// Do final setup and set initial contents of editor
+			this.onLoad(html);
+
 			this.savedContent = this.getValue(true);
+		});
+
+		// Set the iframe's initial (blank) content.
+		var s = 'javascript:parent.' + dijit._scopeName + '.byId("'+this.id+'")._iframeSrc';
+		ifr.setAttribute('src', s);
+		this.editingArea.appendChild(ifr);
+
+		if(dojo.isSafari){ // Safari seems to always append iframe with src=about:blank
+			setTimeout(function(){ifr.setAttribute('src', s);},0);
 		}
-		
+
 		// TODO: this is a guess at the default line-height, kinda works
 		if(dn.nodeName == "LI"){
 			dn.lastChild.style.marginTop = "-1.2em";
 		}
 
-		if(this.domNode.nodeName == "LI"){ this.domNode.lastChild.style.marginTop = "-1.2em"; }
 		dojo.addClass(this.domNode, "RichTextEditable");
 	},
 
 	//static cache variables shared among all instance of this class
 	_local2NativeFormatNames: {},
 	_native2LocalFormatNames: {},
-	_localizedIframeTitles: null,
 
-	_getIframeDocTxt: function(/* String */ html){
+	_getIframeDocTxt: function(){
 		// summary:
-		//		Generates text of the document inside the iframe (ie, <html>....editor content...</html>
+		//		Generates the boilerplate text of the document inside the iframe (ie, <html><head>...</head><body/></html>).
+		//		Editor content (if not blank) should be added afterwards.
 		// tags:
 		//		private
 		var _cs = dojo.getComputedStyle(this.domNode);
+
+		// The contents inside of <body>.  The real contents are set later via a call to setValue().
+		var html = "";
 		if(dojo.isIE || (!this.height && !dojo.isMoz)){
-			html="<div>"+html+"</div>";
+			// In auto-expand mode, need a wrapper div for AlwaysShowToolbar plugin to correctly
+			// expand/contract the editor as the content changes.
+			html = "<div></div>";
+		}else if(dojo.isMoz){
+			// workaround bug where can't select then delete text (until user types something
+			// into the editor)... and/or issue where typing doesn't erase selected text
+			this._cursorToStart = true;
+			html = " ";
 		}
+
 		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";
+			// If we can't get a non-units value, just default
+			// it to the CSS spec default of 'normal'.  Seems to
+			// work better, esp on IE, than '1.0'
+			lineHeight = "normal";
 		}
 		var userStyle = "";
-		this.style.replace(/(^|;)(line-|font-?)[^;]+/g, function(match){ userStyle += match.replace(/^;/g,"") + ';' });
-
-		/*
-		 * On IE the iframe needs to have the same codepage as the main page does, or the
-		 * src=javascript:..._iframeSrc won't handle non-ascii characters correctly
-		 */
-		var d = dojo.doc;
-		var charset =
-			/*IE*/ d.charset || 
-			/*FF, Webkit, Opera, etc */ d.characterSet || 
-			/*nothing, look for defaults */ d.defaultCharset || "UTF-8";
+		this.style.replace(/(^|;)(line-|font-?)[^;]+/g, function(match){ userStyle += match.replace(/^;/g,"") + ';'; });
+
+		// need to find any associated label element and update iframe document title
+		var label=dojo.query('label[for="'+this.id+'"]');
 
 		return [
 			this.isLeftToRight() ? "<html><head>" : "<html dir='rtl'><head>",
-			(dojo.isMoz ? "<title>" + this._localizedIframeTitles.iframeEditTitle + "</title>" : ""),
-			"<meta http-equiv='Content-Type' content='text/html; charset=" + charset + "'>",
+			(dojo.isMoz && label.length ? "<title>" + label[0].innerHTML + "</title>" : ""),
+			"<meta http-equiv='Content-Type' content='text/html'>",
 			"<style>",
 			"body,html {",
 			"\tbackground:transparent;",
-			"\tpadding: 1em 0 0 0;",
-			"\tmargin: -1em 0 0 0;", // remove extraneous vertical scrollbar on safari and firefox
+			"\tpadding: 1px 0 0 0;",
+			"\tmargin: -1px 0 0 0;", // remove extraneous vertical scrollbar on safari and firefox
+			(dojo.isWebKit?"\twidth: 100%;":""),
+			(dojo.isWebKit?"\theight: 100%;":""),
 			"}",
 			// TODO: left positioning will cause contents to disappear out of view
 			//	   if it gets too wide for the visible area
@@ -5631,7 +6029,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 			"\tmin-height:", this.minHeight, ";",
 			"\tline-height:", lineHeight,
 			"}",
-			"p{ margin: 1em 0 !important; }",
+			"p{ margin: 1em 0; }",
 			(this.height ? // height:auto undoes the height:100%
 				"" : "body,html{overflow-y:hidden;/*for IE*/} body > div {overflow-x:auto;/*FF:horizontal scrollbar*/ overflow-y:hidden;/*safari*/ min-height:"+this.minHeight+";/*safari*/}"
 			),
@@ -5639,133 +6037,10 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 			"li{ min-height:1.2em; }",
 			"</style>",
 			this._applyEditingAreaStyleSheets(),
-			"</head><body onload='frameElement._loadFunc(window,document)' style='"+userStyle+"'>"+html+"</body></html>"
+			"</head><body onload='frameElement._loadFunc(window,document)' style='"+userStyle+"'>", html, "</body></html>"
 		].join(""); // String
 	},
 
-	_drawIframe: function(/*String*/ html){
-		// summary:
-		//		Draws an iFrame using the existing one if one exists.
-		//		Used by Firefox only.  See open() for code for other browsers.
-		// tags:
-		//		private
-
-		if(!this.iframe){
-			var ifr = (this.iframe = dojo.doc.createElement("iframe"));
-			ifr.id=this.id+"_iframe";
-			// this.iframe.src = "about:blank";
-			// dojo.doc.body.appendChild(this.iframe);
-			// 
-			// 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;
-			}
-			ifr._loadFunc = function(win){}; // TODO: drawIframe should be refactored to use this event handler instead of janky setTimeout loops
-		}
-		// 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._layoutMode){
-			// iframe should be 100% height, thus getting it's height from surrounding
-			// <div> (which has the correct height set by Editor
-			this.iframe.style.height = "100%";
-		}else{
-			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);
-
-
-		// now we wait for the iframe to load. Janky hack!
-		var ifrFunc = dojo.hitch(this, function(){
-			if(!this.editNode){
-				// Iframe hasn't been loaded yet.
-				// First deal w/the document to be available (may have to wait for it)
-				if(!this.document){
-					try{
-						if(this.iframe.contentWindow){
-							this.window = this.iframe.contentWindow;
-							this.document = this.iframe.contentWindow.document
-						}else if(this.iframe.contentDocument){
-							// for opera
-							// TODO: this method is only being called for FF2; can we remove this?
-							this.window = this.iframe.contentDocument.window;
-							this.document = this.iframe.contentDocument;
-						}
-					}catch(e){}
-					if(!this.document){
-						setTimeout(ifrFunc,50);
-						return;
-					}
-					// 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.document;
-					contentDoc.open();
-					if(dojo.isAIR){
-						contentDoc.body.innerHTML = html;
-					}else{
-						contentDoc.write(this._getIframeDocTxt(html));
-					}
-					contentDoc.close();
-					
-					dojo.destroy(tmpContent);
-				}
-
-				// Wait for body to be available
-				// Writing into contentDoc (above) can make <body> temporarily unavailable, may have to delay again
-				if(!this.document.body){
-					//
-					setTimeout(ifrFunc,50);
-					return;
-				}
-
-				this.onLoad();
-			}else{
-				// Iframe is already loaded, we are just switching the content
-				dojo.destroy(tmpContent);
-				this.editNode.innerHTML = html;
-				this.onDisplayChanged();
-			}
-			this._preDomFilterContent(this.editNode);
-		});
-
-		ifrFunc();
-	},
-
 	_applyEditingAreaStyleSheets: function(){
 		// summary:
 		//		apply the specified css files in styleSheets
@@ -5785,7 +6060,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		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+'"/>'
+			text += '<link rel="stylesheet" type="text/css" href="'+abstring+'"/>';
 		}
 		return text;
 	},
@@ -5803,21 +6078,23 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		}
 
 		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");
-			stylesheet.rel="stylesheet";
-			stylesheet.type="text/css";
-			stylesheet.href=url;
-			head.appendChild(stylesheet);
-		}
+		this.onLoadDeferred.addCallback(dojo.hitch(function(){
+			if(this.document.createStyleSheet){ //IE
+				this.document.createStyleSheet(url);
+			}else{ //other browser
+				var head = this.document.getElementsByTagName("head")[0];
+				var stylesheet = this.document.createElement("link");
+				stylesheet.rel="stylesheet";
+				stylesheet.type="text/css";
+				stylesheet.href=url;
+				head.appendChild(stylesheet);
+			}
+		}));
 	},
 
 	removeStyleSheet: function(/*dojo._Url*/ uri){
@@ -5830,15 +6107,15 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		}
 		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()
+		dojo.withGlobal(this.window,'query', dojo, ['link:[href="'+url+'"]']).orphan();
 	},
 
 	// disabled: Boolean
-	// 		The editor is disabled; the text cannot be changed.
+	//		The editor is disabled; the text cannot be changed.
 	disabled: false,
 
 	_mozSettingProps: {'styleWithCSS':false},
@@ -5864,7 +6141,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 					if(ps.hasOwnProperty(n)){
 						try{
 							this.document.execCommand(n,false,ps[n]);
-						}catch(e){}
+						}catch(e2){}
 					}
 				}
 			}
@@ -5879,12 +6156,11 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 /* Event handlers
  *****************/
 
-	// TODO: _isResized seems to be unused anywhere; remove for 2.0
-	_isResized: function(){ return false; },
-
-	onLoad: function(/* Event */ e){
+	onLoad: function(/*String*/ html){
 		// summary:
-		//		Handler after the content of the document finishes loading.
+		//		Handler after the iframe finishes loading.
+		// html: String
+		//		Editor contents should be set to this value
 		// tags:
 		//		protected
 
@@ -5892,58 +6168,72 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 
 		if(!this.window.__registeredWindow){
 			this.window.__registeredWindow = true;
-			dijit.registerIframe(this.iframe);
+			this._iframeRegHandle = dijit.registerIframe(this.iframe);
 		}
 		if(!dojo.isIE && (this.height || dojo.isMoz)){
 			this.editNode=this.document.body;
 		}else{
+			// there's a wrapper div around the content, see _getIframeDocTxt().
 			this.editNode=this.document.body.firstChild;
 			var _this = this;
 			if(dojo.isIE){ // #4996 IE wants to focus the BODY tag
 				var tabStop = (this.tabStop = dojo.doc.createElement('<div tabIndex=-1>'));
 				this.editingArea.appendChild(tabStop);
-				this.iframe.onfocus = function(){ _this.editNode.setActive(); }
+				this.iframe.onfocus = function(){ _this.editNode.setActive(); };
 			}
 		}
 		this.focusNode = this.editNode; // for InlineEditBox
 
-		this._preDomFilterContent(this.editNode);
 
 		var events = this.events.concat(this.captureEvents);
 		var ap = this.iframe ? this.document : this.editNode;
 		dojo.forEach(events, function(item){
-			// dojo.connect(ap, item.toLowerCase(), console, "debug");
 			this.connect(ap, item.toLowerCase(), item);
 		}, this);
 
 		if(dojo.isIE){ // IE contentEditable
-			// give the node Layout on IE
 			this.connect(this.document, "onmousedown", "_onIEMouseDown"); // #4996 fix focus
+
+			// give the node Layout on IE
+			// TODO: this may no longer be needed, since we've reverted IE to using an iframe,
+			// not contentEditable.   Removing it would also probably remove the need for creating
+			// the extra <div> in _getIframeDocTxt()
 			this.editNode.style.zoom = 1.0;
 		}
 
-		if(dojo.isWebKit){ 
+		if(dojo.isWebKit){
 			//WebKit sometimes doesn't fire right on selections, so the toolbar
 			//doesn't update right.  Therefore, help it out a bit with an additional
 			//listener.  A mouse up will typically indicate a display change, so fire this
-			//and get the toolbar to adapt.  Reference: #9532 
+			//and get the toolbar to adapt.  Reference: #9532
 			this._webkitListener = this.connect(this.document, "onmouseup", "onDisplayChanged");
 		}
 
+		if(dojo.isIE){
+			// Try to make sure 'hidden' elements aren't visible in edit mode (like browsers other than IE
+			// do).  See #9103
+			try{
+				this.document.execCommand('RespectVisibilityInDesign', true, null);
+			}catch(e){/* squelch */}
+		}
+
 		this.isLoaded = true;
 
 		this.attr('disabled', this.disabled); // initialize content to editable (or not)
 
+		// Note that setValue() call will only work after isLoaded is set to true (above)
+		this.setValue(html);
+
 		if(this.onLoadDeferred){
 			this.onLoadDeferred.callback(true);
 		}
 
-		this.onDisplayChanged(e);
+		this.onDisplayChanged();
 
 		if(this.focusOnLoad){
-			// after the document loads, then set focus after updateInterval expires so that 
+			// after the document loads, then set focus after updateInterval expires so that
 			// onNormalizedDisplayChanged has run to avoid input caret issues
-			dojo.addOnLoad(dojo.hitch(this, function(){ setTimeout(dojo.hitch(this, "focus"), this.updateInterval) }));
+			dojo.addOnLoad(dojo.hitch(this, function(){ setTimeout(dojo.hitch(this, "focus"), this.updateInterval); }));
 		}
 	},
 
@@ -5956,7 +6246,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		// we need this event at the moment to get the events from control keys
 		// such as the backspace. It might be possible to add this to Dojo, so that
 		// keyPress events can be emulated by the keyDown and keyUp detection.
-		
+
 		if(e.keyCode === dojo.keys.TAB && this.isTabIndent ){
 			dojo.stopEvent(e); //prevent tab from moving focus out of editor
 
@@ -5965,7 +6255,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 			// Unfortunately pasteHTML does not prove to be undoable
 			if(this.queryCommandEnabled((e.shiftKey ? "outdent" : "indent"))){
 				this.execCommand((e.shiftKey ? "outdent" : "indent"));
-			}			
+			}
 		}
 		if(dojo.isIE){
 			if(e.keyCode == dojo.keys.TAB && !this.isTabIndent){
@@ -5982,28 +6272,12 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 				// 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!
+			}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  && !this.isTabIndent){
-			if(e.keyCode == dojo.keys.TAB && !e.shiftKey && !e.ctrlKey && !e.altKey && this.iframe){
-				// update iframe document title for screen reader
-				var titleObj = dojo.isFF<3 ? this.iframe.contentDocument : this.iframe;
-			 	titleObj.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);
-			}
 		}
 		return true;
 	},
@@ -6029,18 +6303,16 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		//      Registers that attr("value", foo) should call setValue(foo)
 		this.setValue(value);
 	},
-	_getDisableSpellCheckAttr: function(){
-		return !dojo.attr(this.document.body, "spellcheck");
-	},
 	_setDisableSpellCheckAttr: function(/*Boolean*/ disabled){
 		if(this.document){
 			dojo.attr(this.document.body, "spellcheck", !disabled);
 		}else{
-			// try again after the editor is finished loading 
+			// try again after the editor is finished loading
 			this.onLoadDeferred.addCallback(dojo.hitch(this, function(){
 				dojo.attr(this.document.body, "spellcheck", !disabled);
 			}));
 		}
+		this.disableSpellCheck = disabled;
 	},
 
 	onKeyPress: function(e){
@@ -6049,25 +6321,24 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		// tags:
 		//		protected
 
-		//
-		var c = (e.keyChar && e.keyChar.toLowerCase()) || e.keyCode
-		var handlers = this._keyHandlers[c];
-		//
-		var args = arguments;
+		var c = (e.keyChar && e.keyChar.toLowerCase()) || e.keyCode,
+			handlers = this._keyHandlers[c],
+			args = arguments;
+
 		if(handlers && !e.altKey){
-			dojo.forEach(handlers, function(h){
-				if((!!h.shift == !!e.shiftKey)&&(!!h.ctrl == !!e.ctrlKey)){
+			dojo.some(handlers, function(h){
+				if(!(h.shift ^ e.shiftKey) && !(h.ctrl ^ e.ctrlKey)){
 					if(!h.handler.apply(this, args)){
 						e.preventDefault();
 					}
-					// break;
+					return true;
 				}
 			}, this);
 		}
 
 		// function call after the character has been inserted
 		if(!this._onKeyHitch){
-			this._onKeyHitch=dojo.hitch(this, "onKeyPressed");
+			this._onKeyHitch = dojo.hitch(this, "onKeyPressed");
 		}
 		setTimeout(this._onKeyHitch, 1);
 		return true;
@@ -6083,6 +6354,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		if(!dojo.isArray(this._keyHandlers[key])){
 			this._keyHandlers[key] = [];
 		}
+		//TODO: would be nice to make this a hash instead of an array for quick lookups
 		this._keyHandlers[key].push({
 			shift: shift || false,
 			ctrl: ctrl || false,
@@ -6105,7 +6377,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		// tags:
 		//		private
 
-		// 
+		// console.info('onClick',this._tryDesignModeOn);
 		this.onDisplayChanged(e);
 	},
 
@@ -6126,20 +6398,15 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		// tags:
 		//		protected
 
-		// 
+		// console.info('_onBlur')
 
 		this.inherited(arguments);
 		var _c=this.getValue(true);
-		
+
 		if(_c!=this.savedContent){
 			this.onChange(_c);
 			this.savedContent=_c;
 		}
-		if(dojo.isMoz && this.iframe){
-			var titleObj = dojo.isFF<3 ? this.iframe.contentDocument : this.iframe;
-			 titleObj.title = this._localizedIframeTitles.iframeEditTitle;
-		} 
-
 	},
 	_onFocus: function(/*Event*/ e){
 		// summary:
@@ -6147,7 +6414,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		// tags:
 		//		protected
 
-		// 
+		// console.info('_onFocus')
 		if(!this.disabled){
 			if(!this._disabledOK){
 				this.attr('disabled', false);
@@ -6174,15 +6441,23 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		//		Move focus to this editor
 		if(!dojo.isIE){
 			dijit.focus(this.iframe);
+			if(this._cursorToStart){ 
+				delete this._cursorToStart;
+				if(this.editNode.childNodes && 
+					this.editNode.childNodes.length === 1 && 
+					this.editNode.innerHTML === " "){
+						this.placeCursorAtStart();
+				}
+			}
 		}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 
+			//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?
-		//	
+		// TODO: should we throw here?
+		// console.debug("Have no idea how to focus into the editor!");
 		}
 	},
 
@@ -6223,7 +6498,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		//		This is fired if and only if the editor loses focus and
 		//		the content is changed.
 	},
-	_normalizeCommand: function(/*String*/ cmd){
+	_normalizeCommand: function(/*String*/ cmd, /*Anything?*/argument){
 		// summary:
 		//		Used as the advice function by dojo.connect to map our
 		//		normalized set of commands to those supported by the target
@@ -6233,7 +6508,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 
 		var command = cmd.toLowerCase();
 		if(command == "formatblock"){
-			if(dojo.isSafari){ command = "heading"; }
+			if(dojo.isSafari && argument === undefined){ command = "heading"; }
 		}else if(command == "hilitecolor" && !dojo.isMoz){
 			command = "backcolor";
 		}
@@ -6254,10 +6529,10 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 
 		// memoizing version. See _queryCommandAvailable for computing version
 		var ca = this._qcaCache[command];
-		if(ca != undefined){ return ca; }
+		if(ca !== undefined){ return ca; }
 		return (this._qcaCache[command] = this._queryCommandAvailable(command));
 	},
-	
+
 	_queryCommandAvailable: function(/*String*/ command){
 		// summary:
 		//		See queryCommandAvailable().
@@ -6270,8 +6545,6 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		var opera = 1 << 3;
 		var webkit420 = 1 << 4;
 
-		var gt420 = dojo.isWebKit;
-
 		function isSupportedBy(browsers){
 			return {
 				ie: Boolean(browsers & ie),
@@ -6279,7 +6552,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 				webkit: Boolean(browsers & webkit),
 				webkit420: Boolean(browsers & webkit420),
 				opera: Boolean(browsers & opera)
-			}
+			};
 		}
 
 		var supportedBy = null;
@@ -6328,7 +6601,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 			(dojo.isMoz && supportedBy.mozilla) ||
 			(dojo.isWebKit && supportedBy.webkit) ||
 			(dojo.isWebKit > 420 && supportedBy.webkit420) ||
-			(dojo.isOpera && supportedBy.opera);  // Boolean return true if the command is supported, false otherwise
+			(dojo.isOpera && supportedBy.opera);	// Boolean return true if the command is supported, false otherwise
 	},
 
 	execCommand: function(/*String*/ command, argument){
@@ -6340,7 +6613,6 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		//		An optional argument to the command
 		// tags:
 		//		protected
-
 		var returnValue;
 
 		//focus() is required for IE to work
@@ -6348,88 +6620,25 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		//the command, the editor receives the focus as expected
 		this.focus();
 
-		command = this._normalizeCommand(command);
+		command = this._normalizeCommand(command, argument);
+
 
-		if(argument != undefined){
+		if(argument !== undefined){
 			if(command == "heading"){
 				throw new Error("unimplemented");
 			}else if((command == "formatblock") && dojo.isIE){
 				argument = '<'+argument+'>';
 			}
 		}
-		if(command == "inserthtml"){
-			//TODO: we shall probably call _preDomFilterContent here as well
-			argument = this._preFilterContent(argument);
-			returnValue = true;
-			if(dojo.isIE){
-				var insertRange = this.document.selection.createRange();
-				if(this.document.selection.type.toUpperCase()=='CONTROL'){
-					var n=insertRange.item(0);
-					while(insertRange.length){
-						insertRange.remove(insertRange.item(0));
-					}
-					n.outerHTML=argument;
-				}else{
-					insertRange.pasteHTML(argument);
-				}
-				insertRange.select();
-				//insertRange.collapse(true);
-			}else if(dojo.isMoz && !argument.length){
-				//mozilla can not inserthtml an empty html to delete current selection
-				//so we delete the selection instead in this case
-				this._sCall("remove"); // FIXME
-			}else{
-				returnValue = this.document.execCommand(command, false, argument);
-			}
-		}else if(
-			(command == "unlink")&&
-			(this.queryCommandEnabled("unlink"))&&
-			(dojo.isMoz || dojo.isWebKit)
-		){
-			// 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 = this._sCall("getAncestorElement", [ "a" ]);
-			this._sCall("selectElement", [ 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);
+		//Check to see if we have any over-rides for commands, they will be functions on this
+		//widget of the form _commandImpl.  If we don't, fall through to the basic native
+		//exec command of the browser.
+		var implFunc = "_" + command + "Impl";
+		if(this[implFunc]){
+			returnValue = this[implFunc](argument);
 		}else{
 			argument = arguments.length > 1 ? argument : null;
-			//	if(dojo.isMoz){
-			//		this.document = this.iframe.contentWindow.document
-			//	}
-
-//			
 			if(argument || command!="createlink"){
 				returnValue = this.document.execCommand(command, false, argument);
 			}
@@ -6448,8 +6657,8 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		command = this._normalizeCommand(command);
 		if(dojo.isMoz || dojo.isWebKit){
 			if(command == "unlink"){ // mozilla returns true always
-				// 
-				this._sCall("hasAncestorElement", ["a"]);
+				// console.debug(this._sCall("hasAncestorElement", ['a']));
+				return this._sCall("hasAncestorElement", ["a"]);
 			}else if(command == "inserttable"){
 				return true;
 			}
@@ -6462,9 +6671,15 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 				return true;
 			}
 		}
-		// return this.document.queryCommandEnabled(command);
+
 		var elem = dojo.isIE ? this.document.selection.createRange() : this.document;
-		return elem.queryCommandEnabled(command);
+		try{
+			return elem.queryCommandEnabled(command);
+		}catch(e){
+			//Squelch, occurs if editor is hidden on FF 3 (and maybe others.)
+			return false;
+		}
+
 	},
 
 	queryCommandState: function(command){
@@ -6475,13 +6690,12 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 
 		if(this.disabled || !this._disabledOK){ return false; }
 		command = this._normalizeCommand(command);
-		// try{
-			//this.editNode.contentEditable = true;
+		try{
 			return this.document.queryCommandState(command);
-		// }catch(e){
-		// 	
-		// 	return false;
-		// }
+		}catch(e){
+			//Squelch, occurs if editor is hidden on FF 3 (and maybe others.)
+			return false;
+		}
 	},
 
 	queryCommandValue: function(command){
@@ -6496,6 +6710,16 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		command = this._normalizeCommand(command);
 		if(dojo.isIE && command == "formatblock"){
 			r = this._native2LocalFormatNames[this.document.queryCommandValue(command)];
+		}else if(dojo.isMoz && command === "hilitecolor"){
+			var oldValue;
+			try{
+				oldValue = this.document.queryCommandValue("styleWithCSS");
+			}catch(e){
+				oldValue = false;
+			}
+			this.document.execCommand("styleWithCSS", false, true);
+			r = this.document.queryCommandValue(command);
+			this.document.execCommand("styleWithCSS", false, oldValue);
 		}else{
 			r = this.document.queryCommandValue(command);
 		}
@@ -6614,7 +6838,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 	_getValueAttr: function(){
 		// summary:
 		//		Hook to make attr("value") work
-		return this.getValue();
+		return this.getValue(true);
 	},
 
 	setValue: function(/*String*/ html){
@@ -6626,18 +6850,24 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 
 		// TODO: remove this and getValue() for 2.0, and move code to _setValueAttr()
 
-		if(!this.isLoaded){ 
-			// try again after the editor is finished loading 
-			this.onLoadDeferred.addCallback(dojo.hitch(this, function(){ 
-				this.setValue(html); 
-			})); 
+		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;
+
+			// Use   to avoid webkit problems where editor is disabled until the user clicks it
+			if(!html && dojo.isWebKit){
+				this._cursorToStart = true;
+				html = " ";
+			}
 			node.innerHTML = html;
 			this._preDomFilterContent(node);
 		}
@@ -6660,7 +6890,10 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		}else if(this.window && this.window.getSelection){ // Moz
 			html = this._preFilterContent(html);
 			this.execCommand("selectall");
-			if(dojo.isMoz && !html){ html = " " }
+			if(!html){ 
+				this._cursorToStart = true;
+				html = " "; 
+			}
 			this.execCommand("inserthtml", html);
 			this._preDomFilterContent(this.editNode);
 		}else if(this.document && this.document.selection){//IE
@@ -6706,7 +6939,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		// summary:
 		//		filter the output after getting the content of the editing area
 		//
-		//	description:
+		// description:
 		//		post-filtering allows plug-ins and users to specify any number
 		//		of transforms over the editor's content, enabling many common
 		//		use-cases such as transforming absolute to relative URLs (and
@@ -6731,7 +6964,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		//
 		//	dom:
 		//		a node, set of nodes, which to filter using each of the current
-		//		members of the contentDomPostFilters and contentPostFilters arrays. 
+		//		members of the contentDomPostFilters and contentPostFilters arrays.
 		//
 		//	nonDestructive:
 		//		defaults to "false". If true, ensures that filtering happens on
@@ -6779,7 +7012,10 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		//		private
 
 		var saveTextarea = dojo.byId(dijit._scopeName + "._editor.RichText.savedContent");
-		saveTextarea.value += this._SEPARATOR + this.name + ":" + this.getValue();
+		if(saveTextarea.value){
+			saveTextarea.value += this._SEPARATOR;
+		}
+		saveTextarea.value += this.name + ":" + this.getValue(true);
 	},
 
 
@@ -6815,14 +7051,12 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		return dijit._editor.getChildrenHtml(dom);
 	},
 
-	close: function(/*Boolean*/ save, /*Boolean*/ force){
+	close: function(/*Boolean*/ save){
 		// summary:
 		//		Kills the editor and optionally writes back the modified contents to the
 		//		element from which it originated.
 		// save:
 		//		Whether or not to save the changes. If false, the changes are discarded.
-		// force: Boolean
-		//		Unused.  TODO: remove for 2.0
 		// tags:
 		//		private
 
@@ -6845,10 +7079,15 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 
 		// Guard against memory leaks on IE (see #9268)
 		if(dojo.isIE){
-		   this.iframe.onfocus = null;
+			 this.iframe.onfocus = null;
 		}
 		this.iframe._loadFunc = null;
 
+		if(this._iframeRegHandle){
+			dijit.unregisterIframe(this._iframeRegHandle);
+			delete this._iframeRegHandle;
+		}
+
 		if(this.textarea){
 			var s = this.textarea.style;
 			s.position = "";
@@ -6871,14 +7110,18 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 			//			this.domNode.innerHTML = this._content;
 			//		}
 			// }
+
+			// Note that this destroys the iframe
 			this.domNode.innerHTML = save ? this._content : this.savedContent;
 		}
+		delete this.iframe;
 
 		dojo.removeClass(this.domNode, "RichTextEditable");
 		this.isClosed = true;
 		this.isLoaded = false;
-		// FIXME: is this always the right thing to do?
+
 		delete this.editNode;
+		delete this.focusNode;
 
 		if(this.window && this.window._frameElement){
 			this.window._frameElement = null;
@@ -6892,12 +7135,7 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		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(arguments);
 	},
@@ -6907,20 +7145,25 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		//		Post filter to remove unwanted HTML attributes generated by mozilla
 		// tags:
 		//		private
-		return html.replace(/\stype="_moz"/gi, '').replace(/\s_moz_dirty=""/gi, ''); // String
+		return html.replace(/\stype="_moz"/gi, '').replace(/\s_moz_dirty=""/gi, '').replace(/_moz_resizing="(true|false)"/gi,''); // String
 	},
-	_removeSafariBogus: function(/* String */ html){
+	_removeWebkitBogus: function(/* String */ html){
 		// summary:
 		//		Post filter to remove unwanted HTML attributes generated by webkit
 		// tags:
 		//		private
-		return html.replace(/\sclass="webkit-block-placeholder"/gi, ''); // String
+		html = html.replace(/\sclass="webkit-block-placeholder"/gi, '');
+		html = html.replace(/\sclass="apple-style-span"/gi, '');
+		return html; // String
 	},
-	_fixContentForMoz: function(/* String */ html){
+	_normalizeFontStyle: function(/* String */ html){
 		// summary:
-		//		Pre-filter for mozilla.
+		//		Convert <strong> and <em> to <b> and <i>.
 		// description:
-		//		Moz can not handle strong/em tags correctly, convert them to b/i
+		//		Moz can not handle strong/em tags correctly, so to help
+		//		mozilla and also to normalize output, convert them to <b> and <i>.
+		//
+		//		Note the IE generates <strong> and <em> rather than <b> and <i>
 		// tags:
 		//		private
 		return html.replace(/<(\/)?strong([ \>])/gi, '<$1b$2')
@@ -6932,10 +7175,131 @@ dojo.declare("dijit._editor.RichText", dijit._Widget, {
 		//		Pre-filter to do fixing to href attributes on <a> and <img> tags
 		// tags:
 		//		private
-		return html.replace(/(?:(<a(?=\s).*?\shref=)("|')(.*?)\2)|(?:(<a\s.*?href=)([^"'][^ >]+))/gi, 
+		return html.replace(/(?:(<a(?=\s).*?\shref=)("|')(.*?)\2)|(?:(<a\s.*?href=)([^"'][^ >]+))/gi,
 				'$1$4$2$3$5$2 _djrealurl=$2$3$5$2')
-			.replace(/(?:(<img(?=\s).*?\ssrc=)("|')(.*?)\2)|(?:(<img\s.*?src=)([^"'][^ >]+))/gi, 
+			.replace(/(?:(<img(?=\s).*?\ssrc=)("|')(.*?)\2)|(?:(<img\s.*?src=)([^"'][^ >]+))/gi,
 				'$1$4$2$3$5$2 _djrealurl=$2$3$5$2'); // String
+	},
+
+	/*****************************************************************************
+		The following functions implement HTML manipulation commands for various
+		browser/contentEditable implementations.  The goal of them is to enforce
+		standard behaviors of them.
+	******************************************************************************/
+
+	_inserthorizontalruleImpl: function(argument){
+		// summary:
+		//		This function implements the insertion of HTML <HR> tags.
+		//		into a point on the page.  IE doesn't to it right, so
+		//		we have to use an alternate form
+		// argument:
+		//		arguments to the exec command, if any.
+		// tags:
+		//		protected
+		if(dojo.isIE){
+			return this._inserthtmlImpl("<hr>");
+		}
+		return this.document.execCommand("inserthorizontalrule", false, argument);
+	},
+
+	_unlinkImpl: function(argument){
+		// summary:
+		//		This function implements the unlink of an <a> tag.
+		// argument:
+		//		arguments to the exec command, if any.
+		// tags:
+		//		protected
+		if((this.queryCommandEnabled("unlink")) && (dojo.isMoz || dojo.isWebKit)){
+			var a = this._sCall("getAncestorElement", [ "a" ]);
+			this._sCall("selectElement", [ a ]);
+			return this.document.execCommand("unlink", false, null);
+		}
+		return this.document.execCommand("unlink", false, argument);
+	},
+
+	_hilitecolorImpl: function(argument){
+		// summary:
+		//		This function implements the hilitecolor command
+		// argument:
+		//		arguments to the exec command, if any.
+		// tags:
+		//		protected
+		var returnValue;
+		if(dojo.isMoz){
+			// mozilla doesn't support hilitecolor properly when useCSS is
+			// set to false (bugzilla #279330)
+			this.document.execCommand("styleWithCSS", false, true);
+			returnValue = this.document.execCommand("hilitecolor", false, argument);
+			this.document.execCommand("styleWithCSS", false, false);
+		}else{
+			returnValue = this.document.execCommand("hilitecolor", false, argument);
+		}
+		return returnValue;
+	},
+
+	_backcolorImpl: function(argument){
+		// summary:
+		//		This function implements the backcolor command
+		// argument:
+		//		arguments to the exec command, if any.
+		// tags:
+		//		protected
+		if(dojo.isIE){
+			// Tested under IE 6 XP2, no problem here, comment out
+			// IE weirdly collapses ranges when we exec these commands, so prevent it
+			//	var tr = this.document.selection.createRange();
+			argument = argument ? argument : null;
+		}
+		return this.document.execCommand("backcolor", false, argument);
+	},
+
+	_forecolorImpl: function(argument){
+		// summary:
+		//		This function implements the forecolor command
+		// argument:
+		//		arguments to the exec command, if any.
+		// tags:
+		//		protected
+		if(dojo.isIE){
+			// Tested under IE 6 XP2, no problem here, comment out
+			// IE weirdly collapses ranges when we exec these commands, so prevent it
+			//	var tr = this.document.selection.createRange();
+			argument = argument? argument : null;
+		}
+		return this.document.execCommand("forecolor", false, argument);
+	},
+
+	_inserthtmlImpl: function(argument){
+		// summary:
+		//		This function implements the insertion of HTML content into
+		//		a point on the page.
+		// argument:
+		//		The content to insert, if any.
+		// tags:
+		//		protected
+		argument = this._preFilterContent(argument);
+		var rv = true;
+		if(dojo.isIE){
+			var insertRange = this.document.selection.createRange();
+			if(this.document.selection.type.toUpperCase() == 'CONTROL'){
+				var n=insertRange.item(0);
+				while(insertRange.length){
+					insertRange.remove(insertRange.item(0));
+				}
+				n.outerHTML=argument;
+			}else{
+				insertRange.pasteHTML(argument);
+			}
+			insertRange.select();
+			//insertRange.collapse(true);
+		}else if(dojo.isMoz && !argument.length){
+			//mozilla can not inserthtml an empty html to delete current selection
+			//so we delete the selection instead in this case
+			this._sCall("remove"); // FIXME
+		}else{
+			rv = this.document.execCommand("inserthtml", false, argument);
+		}
+		return rv;
 	}
 });
 
@@ -6947,7 +7311,7 @@ dojo.provide("dijit._KeyNavContainer");
 
 
 dojo.declare("dijit._KeyNavContainer",
-	[dijit._Container],
+	dijit._Container,
 	{
 
 		// summary:
@@ -6964,12 +7328,11 @@ dojo.declare("dijit._KeyNavContainer",
 =====*/
 
 		// tabIndex: Integer
-		//		Tab index of the container; same as HTML tabindex attribute.
+		//		Tab index of the container; same as HTML tabIndex attribute.
 		//		Note then when user tabs into the container, focus is immediately
 		//		moved to the first item in the container.
 		tabIndex: "0",
 
-
 		_keyNavCodes: {},
 
 		connectKeyNavHandlers: function(/*dojo.keys[]*/ prevKeyCodes, /*dojo.keys[]*/ nextKeyCodes){
@@ -6983,7 +7346,7 @@ dojo.declare("dijit._KeyNavContainer",
 			// tags:
 			//		protected
 
-			var keyCodes = this._keyNavCodes = {};
+			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; });
@@ -7000,7 +7363,7 @@ dojo.declare("dijit._KeyNavContainer",
 			dojo.forEach(this.getChildren(), dojo.hitch(this, "_startupChild"));
 		},
 
-		addChild: function(/*Widget*/ widget, /*int?*/ insertIndex){
+		addChild: function(/*dijit._Widget*/ widget, /*int?*/ insertIndex){
 			// summary:
 			//		Add a child to our _Container
 			dijit._KeyNavContainer.superclass.addChild.apply(this, arguments);
@@ -7018,94 +7381,67 @@ dojo.declare("dijit._KeyNavContainer",
 			//		Focus the first focusable child in the container.
 			// tags:
 			//		protected
-			this.focusChild(this._getFirstFocusableChild());
+			var child = this._getFirstFocusableChild();
+			if(child){ // edge case: Menu could be empty or hidden
+				this.focusChild(child);
+			}
 		},
 
 		focusNext: function(){
 			// summary:
-			//		Focus the next widget or focal node (for widgets
-			//		with multiple focal nodes) within this container.
+			//		Focus the next widget
 			// tags:
 			//		protected
-			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);
-			}
+			this.focusChild(child);
 		},
 
 		focusPrev: function(){
 			// summary:
-			//		Focus the previous widget or focal node (for widgets
-			//		with multiple focal nodes) within this container.
+			//		Focus the last focusable node in the previous widget
+			//		(ex: go to the ComboButton icon section rather than button section)
 			// tags:
 			//		protected
-			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);
-			}
+			this.focusChild(child, true);
 		},
 
-		focusChild: function(/*Widget*/ widget, /*Node?*/ node){
+		focusChild: function(/*dijit._Widget*/ widget, /*Boolean*/ last){
 			// summary:
-			//		Focus widget. Optionally focus 'node' within widget.
+			//		Focus widget.
+			// widget:
+			//		Reference to container's child widget
+			// last:
+			//		If true and if widget has multiple focusable nodes, focus the
+			//		last one instead of the first one
 			// tags:
 			//		protected
-			if(widget){
-				if(this.focusedChild && widget !== this.focusedChild){
-					this._onChildBlur(this.focusedChild);
-				}
-				this.focusedChild = widget;
-				if(node && widget.focusFocalNode){
-					widget.focusFocalNode(node);
-				}else{
-					widget.focus();
-				}
+			
+			if(this.focusedChild && widget !== this.focusedChild){
+				this._onChildBlur(this.focusedChild);
 			}
+			widget.focus(last ? "end" : "start");
+			this.focusedChild = widget;
 		},
 
-		_startupChild: function(/*Widget*/ widget){
+		_startupChild: function(/*dijit._Widget*/ widget){
 			// summary:
-			//		Set tabindex="-1" on focusable widgets so that we
-			// 		can focus them programmatically and by clicking.
-			//		Connect focus and blur handlers.
-			// tags:
-			//		private
-			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){
-			// summary:
-			//		Monitor focus and blur events on the node
+			//		Setup for each child widget
+			// description:
+			//		Sets tabIndex=-1 on each child, so that the tab key will 
+			//		leave the container rather than visiting each child.
 			// tags:
 			//		private
-			this.connect(node, "onfocus", "_onNodeFocus");
-			this.connect(node, "onblur", "_onNodeBlur");
+			
+			widget.attr("tabIndex", "-1");
+			
+			this.connect(widget, "_onFocus", function(){
+				// Set valid tabIndex so tabbing away from widget goes to right place, see #10272
+				widget.attr("tabIndex", this.tabIndex);
+			});
+			this.connect(widget, "_onBlur", function(){
+				widget.attr("tabIndex", "-1");
+			});
 		},
 
 		_onContainerFocus: function(evt){
@@ -7126,11 +7462,12 @@ dojo.declare("dijit._KeyNavContainer",
 			if(evt.target !== this.domNode){ return; }
 
 			this.focusFirstChild();
-			
-			// and then remove the container's tabIndex,
+
+			// and then set the container's tabIndex to -1,
+			// (don't remove as that breaks Safari 4)
 			// so that tab or shift-tab will go to the fields after/before
 			// the container, rather than the container itself
-			dojo.removeAttr(this.domNode, "tabIndex");
+			dojo.attr(this.domNode, "tabIndex", "-1");
 		},
 
 		_onBlur: function(evt){
@@ -7139,9 +7476,9 @@ dojo.declare("dijit._KeyNavContainer",
 			// Note that using _onBlur() so that this doesn't happen when focus is shifted
 			// to one of my child widgets (typically a popup)
 			if(this.tabIndex){
-				dojo.attr(this.domNode, "tabindex", this.tabIndex);
+				dojo.attr(this.domNode, "tabIndex", this.tabIndex);
 			}
-			// TODO: this.inherited(arguments);
+			this.inherited(arguments);
 		},
 
 		_onContainerKeypress: function(evt){
@@ -7158,29 +7495,7 @@ dojo.declare("dijit._KeyNavContainer",
 			}
 		},
 
-		_onNodeFocus: function(evt){
-			// summary:
-			//		Handler for onfocus event on a child node
-			// tags:
-			//		private
-
-			// 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){
-			// summary:
-			//		Handler for onblur event on a child node
-			// tags:
-			//		private
-			dojo.stopEvent(evt);
-		},
-
-		_onChildBlur: function(/*Widget*/ widget){
+		_onChildBlur: function(/*dijit._Widget*/ widget){
 			// summary:
 			//		Called when focus leaves a child widget to go
 			//		to a sibling widget.
@@ -7191,7 +7506,7 @@ dojo.declare("dijit._KeyNavContainer",
 		_getFirstFocusableChild: function(){
 			// summary:
 			//		Returns first child that can be focused
-			return this._getNextFocusableChild(null, 1);
+			return this._getNextFocusableChild(null, 1);	// dijit._Widget
 		},
 
 		_getNextFocusableChild: function(child, dir){
@@ -7212,12 +7527,12 @@ dojo.declare("dijit._KeyNavContainer",
 					child = children[(dir>0) ? 0 : (children.length-1)];
 				}
 				if(child.isFocusable()){
-					return child;
+					return child;	// dijit._Widget
 				}
 				child = this._getSiblingOfChild(child, dir);
 			}
 			// no focusable child found
-			return null;
+			return null;	// dijit._Widget
 		}
 	}
 );
@@ -7238,12 +7553,12 @@ dojo.declare("dijit.ToolbarSeparator",
 		//		A spacer between two `dijit.Toolbar` items
 		templateString: '<div class="dijitToolbarSeparator dijitInline"></div>',
 		postCreate: function(){ dojo.setSelectable(this.domNode, false); },
-		isFocusable: function(){ 
+		isFocusable: function(){
 			// summary:
 			//		This widget isn't focusable, so pass along that fact.
 			// tags:
 			//		protected
-			return false; 
+			return false;
 		}
 
 	});
@@ -7295,6 +7610,418 @@ dojo.declare("dijit.Toolbar",
 
 }
 
+if(!dojo._hasResource["dijit._HasDropDown"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._HasDropDown"] = true;
+dojo.provide("dijit._HasDropDown");
+
+
+
+
+dojo.declare("dijit._HasDropDown",
+	null,
+	{
+		// summary:
+		//		Mixin for widgets that need drop down ability.
+
+		// _buttonNode: [protected] DomNode
+		//		The button/icon/node to click to display the drop down.
+		//		Can be set via a dojoAttachPoint assignment.
+		//		If missing, then either focusNode or domNode (if focusNode is also missing) will be used.
+		_buttonNode: null,
+
+		// _arrowWrapperNode: [protected] DomNode
+		//		Will set CSS class dijitUpArrow, dijitDownArrow, dijitRightArrow etc. on this node depending
+		//		on where the drop down is set to be positioned.
+		//		Can be set via a dojoAttachPoint assignment.
+		//		If missing, then _buttonNode will be used.
+		_arrowWrapperNode: null,
+
+		// _popupStateNode: [protected] DomNode
+		//		The node to set the popupActive class on.
+		//		Can be set via a dojoAttachPoint assignment.
+		//		If missing, then focusNode or _buttonNode (if focusNode is missing) will be used.
+		_popupStateNode: null,
+
+		// _aroundNode: [protected] DomNode
+		//		The node to display the popup around.
+		//		Can be set via a dojoAttachPoint assignment.
+		//		If missing, then domNode will be used.
+		_aroundNode: null,
+
+		// dropDown: [protected] Widget
+		//		The widget to display as a popup.  This widget *must* be
+		//		defined before the startup function is called.
+		dropDown: null,
+
+		// autoWidth: [protected] Boolean
+		//		Set to true to make the drop down at least as wide as this
+		//		widget.  Set to false if the drop down should just be its
+		//		default width
+		autoWidth: true,
+
+		// forceWidth: [protected] Boolean
+		//		Set to true to make the drop down exactly as wide as this
+		//		widget.  Overrides autoWidth.
+		forceWidth: false,
+
+		// maxHeight: [protected] Integer
+		//		The max height for our dropdown.  Set to 0 for no max height.
+		//		any dropdown taller than this will have scrollbars
+		maxHeight: 0,
+
+		// dropDownPosition: [const] String[]
+		//		This variable controls the position of the drop down.
+		//		It's an array of strings with the following values:
+		//
+		//			* before: places drop down to the left of the target node/widget, or to the right in
+		//			  the case of RTL scripts like Hebrew and Arabic
+		//			* after: places drop down to the right of the target node/widget, or to the left in
+		//			  the case of RTL scripts like Hebrew and Arabic
+		//			* above: drop down goes above target node
+		//			* below: drop down goes below target node
+		//
+		//		The list is positions is tried, in order, until a position is found where the drop down fits
+		//		within the viewport.
+		//
+		dropDownPosition: ["below","above"],
+
+		// _stopClickEvents: Boolean
+		//		When set to false, the click events will not be stopped, in
+		//		case you want to use them in your subwidget
+		_stopClickEvents: true,
+
+		_onDropDownMouse: function(/*Event*/ e){
+			// summary:
+			//		Callback when the user mouse clicks on the arrow icon, or presses the down
+			//		arrow key, to open the drop down.
+
+			// We handle mouse events using onmousedown in order to allow for selecting via
+			// a mouseDown --> mouseMove --> mouseUp.  So, our click is already handled, unless
+			// we are executed via keypress - in which case, this._seenKeydown
+			// will be set to true.
+			if(e.type == "click" && !this._seenKeydown){ return; }
+			this._seenKeydown = false;
+
+			// If we are a mouse event, set up the mouseup handler.  See _onDropDownMouse() for
+			// details on this handler.
+			if(e.type == "mousedown"){
+				this._docHandler = this.connect(dojo.doc, "onmouseup", "_onDropDownMouseup");
+			}
+			if(this.disabled || this.readOnly){ return; }
+			if(this._stopClickEvents){
+				dojo.stopEvent(e);
+			}
+			this.toggleDropDown();
+
+			// If we are a click, then we'll pretend we did a mouse up
+			if(e.type == "click" || e.type == "keypress"){
+				this._onDropDownMouseup();
+			}
+		},
+
+		_onDropDownMouseup: function(/*Event?*/ e){
+			// summary:
+			//		Callback when the user lifts their mouse after mouse down on the arrow icon.
+			//		If the drop is a simple menu and the mouse is over the menu, we execute it, otherwise, we focus our
+			//		dropDown node.  If the event is missing, then we are not
+			//		a mouseup event.
+			//
+			//		This is useful for the common mouse movement pattern
+			//		with native browser <select> nodes:
+			//			1. mouse down on the select node (probably on the arrow)
+			//			2. move mouse to a menu item while holding down the mouse button
+			//			3. mouse up.  this selects the menu item as though the user had clicked it.
+
+			if(e && this._docHandler){
+				this.disconnect(this._docHandler);
+			}
+			var dropDown = this.dropDown, overMenu = false;
+
+			if(e && this._opened){
+				// This code deals with the corner-case when the drop down covers the original widget,
+				// because it's so large.  In that case mouse-up shouldn't select a value from the menu.
+				// Find out if our target is somewhere in our dropdown widget,
+				// but not over our _buttonNode (the clickable node)
+				var c = dojo.position(this._buttonNode, true);
+				if(!(e.pageX >= c.x && e.pageX <= c.x + c.w) ||
+					!(e.pageY >= c.y && e.pageY <= c.y + c.h)){
+					var t = e.target;
+					while(t && !overMenu){
+						if(dojo.hasClass(t, "dijitPopup")){
+							overMenu = true;
+						}else{
+							t = t.parentNode;
+						}
+					}
+					if(overMenu){
+						t = e.target;
+						if(dropDown.onItemClick){
+							var menuItem;
+							while(t && !(menuItem = dijit.byNode(t))){
+								t = t.parentNode;
+							}
+							if(menuItem && menuItem.onClick && menuItem.getParent){
+								menuItem.getParent().onItemClick(menuItem, e);
+							}
+						}
+						return;
+					}
+				}
+			}
+			if(this._opened && dropDown.focus){
+				// Focus the dropdown widget - do it on a delay so that we
+				// don't steal our own focus.
+				window.setTimeout(dojo.hitch(dropDown, "focus"), 1);
+			}
+		},
+
+		_setupDropdown: function(){
+			// summary:
+			//		set up nodes and connect our mouse and keypress events
+			this._buttonNode = this._buttonNode || this.focusNode || this.domNode;
+			this._popupStateNode = this._popupStateNode || this.focusNode || this._buttonNode;
+			this._aroundNode = this._aroundNode || this.domNode;
+			this.connect(this._buttonNode, "onmousedown", "_onDropDownMouse");
+			this.connect(this._buttonNode, "onclick", "_onDropDownMouse");
+			this.connect(this._buttonNode, "onkeydown", "_onDropDownKeydown");
+			this.connect(this._buttonNode, "onblur", "_onDropDownBlur");
+			this.connect(this._buttonNode, "onkeypress", "_onKey");
+
+			// If we have a _setStateClass function (which happens when
+			// we are a form widget), then we need to connect our open/close
+			// functions to it
+			if(this._setStateClass){
+				this.connect(this, "openDropDown", "_setStateClass");
+				this.connect(this, "closeDropDown", "_setStateClass");
+			}
+
+			// Add a class to the "dijitDownArrowButton" type class to _buttonNode so theme can set direction of arrow
+			// based on where drop down will normally appear
+			var defaultPos = {
+					"after" : this.isLeftToRight() ? "Right" : "Left",
+					"before" : this.isLeftToRight() ? "Left" : "Right",
+					"above" : "Up",
+					"below" : "Down",
+					"left" : "Left",
+					"right" : "Right"
+			}[this.dropDownPosition[0]] || this.dropDownPosition[0] || "Down";
+			dojo.addClass(this._arrowWrapperNode || this._buttonNode, "dijit" + defaultPos + "ArrowButton");
+		},
+
+		postCreate: function(){
+			this._setupDropdown();
+			this.inherited(arguments);
+		},
+
+		destroyDescendants: function(){
+			if(this.dropDown){
+				// Destroy the drop down, unless it's already been destroyed.  This can happen because
+				// the drop down is a direct child of <body> even though it's logically my child.
+				if(!this.dropDown._destroyed){
+					this.dropDown.destroyRecursive();
+				}
+				delete this.dropDown;
+			}
+			this.inherited(arguments);
+		},
+
+		_onDropDownKeydown: function(/*Event*/ e){
+			this._seenKeydown = true;
+		},
+
+		_onKeyPress: function(/*Event*/ e){
+			if(this._opened && e.charOrCode == dojo.keys.ESCAPE && !e.shiftKey && !e.ctrlKey && !e.altKey){
+				this.toggleDropDown();
+				dojo.stopEvent(e);
+				return;
+			}
+			this.inherited(arguments);
+		},
+
+		_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; }
+			var d = this.dropDown;
+			if(d && this._opened && d.handleKey){
+				if(d.handleKey(e) === false){ return; }
+			}
+			if(d && this._opened && e.keyCode == dojo.keys.ESCAPE){
+				this.toggleDropDown();
+				return;
+			}
+			if(e.keyCode == dojo.keys.DOWN_ARROW || e.keyCode == dojo.keys.ENTER || e.charOrCode == " "){
+				this._onDropDownMouse(e);
+			}
+		},
+
+		_onBlur: function(){
+			// summary:
+			//		Called magically when focus has shifted away from this widget and it's dropdown
+
+			this.closeDropDown();
+			// don't focus on button.  the user has explicitly focused on something else.
+			this.inherited(arguments);
+		},
+
+		isLoaded: function(){
+			// summary:
+			//		Returns whether or not the dropdown is loaded.  This can
+			//		be overridden in order to force a call to loadDropDown().
+			// tags:
+			//		protected
+
+			return true;
+		},
+
+		loadDropDown: function(/* Function */ loadCallback){
+			// summary:
+			//		Loads the data for the dropdown, and at some point, calls
+			//		the given callback
+			// tags:
+			//		protected
+
+			loadCallback();
+		},
+
+		toggleDropDown: function(){
+			// summary:
+			//		Toggle the drop-down widget; if it is up, close it, if not, open it
+			// tags:
+			//		protected
+
+			if(this.disabled || this.readOnly){ return; }
+			this.focus();
+			var dropDown = this.dropDown;
+			if(!dropDown){ return; }
+			if(!this._opened){
+				// If we aren't loaded, load it first so there isn't a flicker
+				if(!this.isLoaded()){
+					this.loadDropDown(dojo.hitch(this, "openDropDown"));
+					return;
+				}else{
+					this.openDropDown();
+				}
+			}else{
+				this.closeDropDown();
+			}
+		},
+
+		openDropDown: function(){
+			// summary:
+			//		Opens the dropdown for this widget - it returns the
+			//		return value of dijit.popup.open
+			// tags:
+			//		protected
+
+			var dropDown = this.dropDown;
+			var ddNode = dropDown.domNode;
+			var self = this;
+
+			// Prepare our popup's height and honor maxHeight if it exists.
+
+			// TODO: isn't maxHeight dependent on the return value from dijit.popup.open(),
+			// ie, dependent on how much space is available (BK)
+
+			if(!this._preparedNode){
+				dijit.popup.moveOffScreen(ddNode);
+				this._preparedNode = true;			
+				// Check if we have explicitly set width and height on the dropdown widget dom node
+				if(ddNode.style.width){
+					this._explicitDDWidth = true;
+				}
+				if(ddNode.style.height){
+					this._explicitDDHeight = true;
+				}
+			}
+			if(this.maxHeight || this.forceWidth || this.autoWidth){
+				var myStyle = {
+					display: "",
+					visibility: "hidden"
+				};
+				if(!this._explicitDDWidth){
+					myStyle.width = "";
+				}
+				if(!this._explicitDDHeight){
+					myStyle.height = "";
+				}
+				dojo.style(ddNode, myStyle);
+				var mb = dojo.marginBox(ddNode);
+				var overHeight = (this.maxHeight && mb.h > this.maxHeight);
+				dojo.style(ddNode, {overflow: overHeight ? "auto" : "hidden"});
+				if(this.forceWidth){
+					mb.w = this.domNode.offsetWidth;
+				}else if(this.autoWidth){
+					mb.w = Math.max(mb.w, this.domNode.offsetWidth);
+				}else{
+					delete mb.w;
+				}
+				if(overHeight){
+					mb.h = this.maxHeight;
+					if("w" in mb){
+						mb.w += 16;
+					}
+				}else{
+					delete mb.h;
+				}
+				delete mb.t;
+				delete mb.l;
+				if(dojo.isFunction(dropDown.resize)){
+					dropDown.resize(mb);
+				}else{
+					dojo.marginBox(ddNode, mb);
+				}
+			}
+			var retVal = dijit.popup.open({
+				parent: this,
+				popup: dropDown,
+				around: this._aroundNode,
+				orient: dijit.getPopupAroundAlignment((this.dropDownPosition && this.dropDownPosition.length) ? this.dropDownPosition : ["below"],this.isLeftToRight()),
+				onExecute: function(){
+					self.closeDropDown(true);
+				},
+				onCancel: function(){
+					self.closeDropDown(true);
+				},
+				onClose: function(){
+					dojo.attr(self._popupStateNode, "popupActive", false);
+					dojo.removeClass(self._popupStateNode, "dijitHasDropDownOpen");
+					self._opened = false;
+					self.state = "";
+				}
+			});
+			dojo.attr(this._popupStateNode, "popupActive", "true");
+			dojo.addClass(self._popupStateNode, "dijitHasDropDownOpen");
+			this._opened=true;
+			this.state="Opened";
+			// TODO: set this.checked and call setStateClass(), to affect button look while drop down is shown
+			return retVal;
+		},
+
+		closeDropDown: function(/*Boolean*/ focus){
+			// summary:
+			//		Closes the drop down on this widget
+			// tags:
+			//		protected
+
+			if(this._opened){
+				dijit.popup.close(this.dropDown);
+				if(focus){ this.focus(); }
+				this._opened = false;
+				this.state = "";
+			}
+		}
+
+	}
+);
+
+}
+
 if(!dojo._hasResource["dijit.form.Button"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
 dojo._hasResource["dijit.form.Button"] = true;
 dojo.provide("dijit.form.Button");
@@ -7302,6 +8029,7 @@ dojo.provide("dijit.form.Button");
 
 
 
+
 dojo.declare("dijit.form.Button",
 	dijit.form._FormWidget,
 	{
@@ -7313,7 +8041,7 @@ dojo.declare("dijit.form.Button",
 	//		attribute.  It can be hidden via showLabel=false.
 	// example:
 	// |	<button dojoType="dijit.form.Button" onClick="...">Hello world</button>
-	// 
+	//
 	// example:
 	// |	var button1 = new dijit.form.Button({label: "hello world", onClick: foo});
 	// |	dojo.body().appendChild(button1.domNode);
@@ -7327,7 +8055,7 @@ dojo.declare("dijit.form.Button",
 	// showLabel: Boolean
 	//		Set this to true to hide the label text and display only the icon.
 	//		(If showLabel=false then iconClass must be specified.)
-	//		Especially useful for toolbars.  
+	//		Especially useful for toolbars.
 	//		If showLabel=true, the label will become the title (a.k.a. tooltip/hint) of the icon.
 	//
 	//		The exception case is for computers in high-contrast mode, where the label
@@ -7335,7 +8063,7 @@ dojo.declare("dijit.form.Button",
 	showLabel: true,
 
 	// iconClass: String
-	//		Class to apply to div in button to make it display an icon
+	//		Class to apply to DOMNode in button to make it display an icon
 	iconClass: "",
 
 	// type: String
@@ -7344,18 +8072,18 @@ dojo.declare("dijit.form.Button",
 
 	baseClass: "dijitButton",
 
-	templateString:"<span class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachEvent=\"ondijitclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\"\n\t><span class=\"dijitReset dijitRight dijitInline\"\n\t\t><span class=\"dijitReset dijitInline dijitButtonNode\"\n\t\t\t><button class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\t\tdojoAttachPoint=\"titleNode,focusNode\" \n\t\t\t\t${nameAttrSetting} type=\"${type}\" value=\"${value}\" waiRo [...]
+	templateString: dojo.cache("dijit.form", "templates/Button.html", "<span class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachEvent=\"onclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\"\n\t><span class=\"dijitReset dijitRight dijitInline\"\n\t\t><span class=\"dijitReset dijitInline dijitButtonNode\"\n\t\t\t><button class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\t\tdojoAttachPoint=\"titleNode,focusNode\"\n\t\t\t\t${nameAttrSetti [...]
 
 	attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, {
 		label: { node: "containerNode", type: "innerHTML" },
 		iconClass: { node: "iconNode", type: "class" }
 	}),
-		
+
 
 	_onClick: function(/*Event*/ e){
 		// summary:
 		//		Internal function to handle click actions
-		if(this.disabled || this.readOnly){
+		if(this.disabled){
 			return false;
 		}
 		this._clicked(); // widget click actions
@@ -7365,13 +8093,9 @@ dojo.declare("dijit.form.Button",
 	_onButtonClick: function(/*Event*/ e){
 		// summary:
 		//		Handler when the user activates the button portion.
-		//		If is activated via a keystroke, stop the event unless is submit or reset.
-		if(e.type!='click' && !(this.type=="submit" || this.type=="reset")){
-			dojo.stopEvent(e);
-		}
 		if(this._onClick(e) === false){ // returning nothing is same as true
 			e.preventDefault(); // needed for checkbox
-		}else if(this.type=="submit" && !this.focusNode.form){ // see if a nonform widget needs to be signalled
+		}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"){
@@ -7385,31 +8109,35 @@ dojo.declare("dijit.form.Button",
 	_setValueAttr: function(/*String*/ value){
 		// Verify that value cannot be set for BUTTON elements.
 		var attr = this.attributeMap.value || '';
-		if(this[attr.node||attr||'domNode'].tagName == 'BUTTON'){
+		if(this[attr.node || attr || 'domNode'].tagName == 'BUTTON'){
 			// On IE, setting value actually overrides innerHTML, so disallow for everyone for consistency
 			if(value != this.value){
-				
+				console.debug('Cannot change the value attribute on a Button widget.');
 			}
 		}
 	},
 
 	_fillContent: function(/*DomNode*/ source){
-		// Overrides _Templated._fillcContent().
+		// Overrides _Templated._fillContent().
 		// If button label is specified as srcNodeRef.innerHTML rather than
 		// this.params.label, handle it here.
-		if(source && !("label" in this.params)){
+		if(source && (!this.params || !("label" in this.params))){
 			this.attr('label', source.innerHTML);
 		}
 	},
 
 	postCreate: function(){
-		if (this.showLabel == false){
-			dojo.addClass(this.containerNode,"dijitDisplayNone");
-		}
 		dojo.setSelectable(this.focusNode, false);
 		this.inherited(arguments);
 	},
 
+	_setShowLabelAttr: function(val){
+		if(this.containerNode){
+			dojo.toggleClass(this.containerNode, "dijitDisplayNone", !val);
+		}
+		this.showLabel = val;
+	},
+
 	onClick: function(/*Event*/ e){
 		// summary:
 		//		Callback for when button is clicked.
@@ -7436,15 +8164,14 @@ dojo.declare("dijit.form.Button",
 		// description:
 		//		Set the label (text) of the button; takes an HTML string.
 		this.containerNode.innerHTML = this.label = content;
-		this._layoutHack();
-		if (this.showLabel == false && !this.params.title){
+		if(this.showLabel == false && !this.params.title){
 			this.titleNode.title = dojo.trim(this.containerNode.innerText || this.containerNode.textContent || '');
 		}
-	}		
+	}
 });
 
 
-dojo.declare("dijit.form.DropDownButton", [dijit.form.Button, dijit._Container], {
+dojo.declare("dijit.form.DropDownButton", [dijit.form.Button, dijit._Container, dijit._HasDropDown], {
 	// summary:
 	//		A button with a drop down
 	//
@@ -7456,11 +8183,11 @@ dojo.declare("dijit.form.DropDownButton", [dijit.form.Button, dijit._Container],
 	// example:
 	// |	var button1 = new dijit.form.DropDownButton({ label: "hi", dropDown: new dijit.Menu(...) });
 	// |	dojo.body().appendChild(button1);
-	// 	
-	
+	//
+
 	baseClass : "dijitDropDownButton",
 
-	templateString:"<span class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse,onclick:_onDropDownClick,onkeydown:_onDropDownKeydown,onblur:_onDropDownBlur,onkeypress:_onKey\"\n\t><span class='dijitReset dijitRight dijitInline'\n\t\t><span class='dijitReset dijitInline dijitButtonNode'\n\t\t\t><button class=\"dijitReset dijitStretch dijitButtonContents\" \n\t\t\t\t${nameAttrSetting} type=\"${type}\" value=\"${ [...]
+	templateString: dojo.cache("dijit.form", "templates/DropDownButton.html", "<span class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachPoint=\"_buttonNode\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\"\n\t><span class='dijitReset dijitRight dijitInline'\n\t\t><span class='dijitReset dijitInline dijitButtonNode'\n\t\t\t><button class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\t\t${nameAttrSetting} type=\"${type}\" value=\"${va [...]
 
 	_fillContent: function(){
 		// Overrides Button._fillContent().
@@ -7490,145 +8217,37 @@ dojo.declare("dijit.form.DropDownButton", [dijit.form.Button, dijit._Container],
 			this.dropDown = dijit.byNode(dropDownNode);
 			delete this.dropDownContainer;
 		}
-		dijit.popup.prepare(this.dropDown.domNode);
-
-		this.inherited(arguments);
-	},
+		dijit.popup.moveOffScreen(this.dropDown.domNode);
 
-	destroyDescendants: function(){
-		if(this.dropDown){
-			this.dropDown.destroyRecursive();
-			delete this.dropDown;
-		}
 		this.inherited(arguments);
 	},
 
-	_onArrowClick: function(/*Event*/ e){
-		// summary:
-		//		Handler for 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:
-		//		Handler when the user presses a key on drop down widget
-		if(this.disabled || this.readOnly){ return; }
-		if(e.charOrCode == 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);
+	isLoaded: function(){
+		// Returns whether or not we are loaded - if our dropdown has an href,
+		// then we want to check that.
+		var dropDown = this.dropDown;
+		return (!dropDown.href || dropDown.isLoaded);
 	},
 
-	_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);
+	loadDropDown: function(){
+		// Loads our dropdown
 		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.refresh();
-				return;
-			}else{
-				this._openDropDown();
-			}
+		if(!this.isLoaded()){
+			var handler = dojo.connect(dropDown, "onLoad", this, function(){
+				dojo.disconnect(handler);
+				this.openDropDown();
+			});
+			dropDown.refresh();
 		}else{
-			this._closeDropDown();
+			this.openDropDown();
 		}
 	},
 
-	_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");
-				self._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;			
-		}
+	isFocusable: function(){
+		// Overridden so that focus is handled by the _HasDropDown mixin, not by
+		// the _FormWidget mixin.
+		return this.inherited(arguments) && !this._mouseDown;
 	}
 });
 
@@ -7647,13 +8266,14 @@ dojo.declare("dijit.form.ComboButton", dijit.form.DropDownButton, {
 	// 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 class=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\"\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 [...]
+	templateString: dojo.cache("dijit.form", "templates/ComboButton.html", "<table class='dijit dijitReset dijitInline dijitLeft'\n\tcellspacing='0' cellpadding='0' waiRole=\"presentation\"\n\t><tbody waiRole=\"presentation\"><tr waiRole=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonNode\"><button id=\"${id}_button\" class=\"dijitReset dijitButtonContents\"\n\t\t\tdojoAttachEvent=\"onclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMous [...]
 
 	attributeMap: dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap), {
-		id:"",
-		tabIndex: ["focusNode", "titleNode"]
+		id: "",
+		tabIndex: ["focusNode", "titleNode"],
+		title: "titleNode"
 	}),
 
 	// optionsTitle: String
@@ -7666,85 +8286,20 @@ dojo.declare("dijit.form.ComboButton", dijit.form.DropDownButton, {
 
 	postCreate: function(){
 		this.inherited(arguments);
-		this._focalNodes = [this.titleNode, this.popupStateNode];
+		this._focalNodes = [this.titleNode, this._popupStateNode];
+		var isIE = dojo.isIE;
 		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);
-			}
+			this.connect(node, isIE? "onactivate" : "onfocus", this._onNodeFocus);
+			this.connect(node, isIE? "ondeactivate" : "onblur", this._onNodeBlur);
 		}));
-	},
-
-	focusFocalNode: function(node){
-		// summary:
-		//		Focus the focal node node.
-		// description:
-		//		Called by _KeyNavContainer for (when example) this button is in a toolbar.
-		// tags:
-		//		protected
-		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.
-		// description:
-		//		Called by _KeyNavContainer for (when example) this button is in a toolbar.
-		// tags:
-		//		protected
-		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.
-		// description:
-		//		Called by _KeyNavContainer for (when example) this button is in a toolbar.
-		// tags:
-		//		protected
-		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.
-		// description:
-		//		Called by _KeyNavContainer for (when example) this button is in a toolbar.
-		// tags:
-		//		protected
-		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.
-		// description:
-		//		Called by _KeyNavContainer for (when example) this button is in a toolbar.
-		// tags:
-		//		protected
-		this._focusedNode = this.getFocalNodes()[this._focusedNode ? 0 : 1];
-		dijit.focus(this._focusedNode);
-	},
-
-	getFocalNodes: function(){
-		// summary:
-		//		Returns an array of focal nodes for this widget.
-		// description:
-		//		Called by _KeyNavContainer for (when example) this button is in a toolbar.
-		// tags:
-		//		protected
-		return this._focalNodes;
+		if(isIE && (isIE < 8 || dojo.isQuirks)){ // fixed in IE8/strict
+			with(this.titleNode){ // resize BUTTON tag so parent TD won't inherit extra padding
+				style.width = scrollWidth + "px";
+				this.connect(this.titleNode, "onresize", function(){
+					setTimeout( function(){ style.width = scrollWidth + "px"; }, 0);
+				});
+			}
+		}
 	},
 
 	_onNodeFocus: function(evt){
@@ -7761,6 +8316,34 @@ dojo.declare("dijit.form.ComboButton", dijit.form.DropDownButton, {
 	_onBlur: function(){
 		this.inherited(arguments);
 		this._focusedNode = null;
+	},
+	
+	_onButtonKeyPress: function(/*Event*/ evt){
+		// summary:
+		//		Handler for right arrow key when focus is on left part of button
+		if(evt.charOrCode == dojo.keys[this.isLeftToRight() ? "RIGHT_ARROW" : "LEFT_ARROW"]){
+			dijit.focus(this._popupStateNode);
+			dojo.stopEvent(evt);
+		}
+	},
+
+	_onArrowKeyPress: function(/*Event*/ evt){
+		// summary:
+		//		Handler for left arrow key when focus is on right part of button
+		if(evt.charOrCode == dojo.keys[this.isLeftToRight() ? "LEFT_ARROW" : "RIGHT_ARROW"]){
+			dijit.focus(this.titleNode);
+			dojo.stopEvent(evt);
+		}
+	},
+	
+	focus: function(/*String*/ position){
+		// summary:
+		//		Focuses this widget to according to position, if specified,
+		//		otherwise on arrow node
+		// position:
+		//		"start" or "end"
+		
+		dijit.focus(position == "start" ? this.titleNode : this._popupStateNode);
 	}
 });
 
@@ -7778,8 +8361,9 @@ dojo.declare("dijit.form.ToggleButton", dijit.form.Button, {
 	//		or the radio button is selected, etc.
 	checked: false,
 
-	attributeMap: dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap),
-		{checked:"focusNode"}),
+	attributeMap: dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap), {
+		checked:"focusNode"
+	}),
 
 	_clicked: function(/*Event*/ evt){
 		this.attr('checked', !this.checked);
@@ -7789,7 +8373,7 @@ dojo.declare("dijit.form.ToggleButton", dijit.form.Button, {
 		this.checked = value;
 		dojo.attr(this.focusNode || this.domNode, "checked", value);
 		dijit.setWaiState(this.focusNode || this.domNode, "pressed", value);
-		this._setStateClass();		
+		this._setStateClass();
 		this._handleOnChange(value, true);
 	},
 
@@ -7799,7 +8383,7 @@ dojo.declare("dijit.form.ToggleButton", dijit.form.Button, {
 		dojo.deprecated("setChecked("+checked+") is deprecated. Use attr('checked',"+checked+") instead.", "", "2.0");
 		this.attr('checked', checked);
 	},
-	
+
 	reset: function(){
 		// summary:
 		//		Reset the widget's value to what it was at initialization time
@@ -7826,9 +8410,8 @@ dojo.declare("dijit._editor._Plugin", null, {
 	//		a single button on the Toolbar and some associated code
 
 	constructor: function(/*Object?*/args, /*DomNode?*/node){
-		if(args){
-			dojo.mixin(this, args);
-		}
+		this.params = args || {};
+		dojo.mixin(this, this.params);
 		this._connects=[];
 	},
 
@@ -7841,31 +8424,24 @@ dojo.declare("dijit._editor._Plugin", null, {
 	iconClassPrefix: "dijitEditorIcon",
 
 	// button: dijit._Widget?
-	//		Pointer to `dijit.form.Button` or other widget (ex: `dijit.form.FilteringSelect`) that controls this plugin.
+	//		Pointer to `dijit.form.Button` or other widget (ex: `dijit.form.FilteringSelect`)
+	//		that is added to the toolbar to control this plugin.
 	//		If not specified, will be created on initialization according to `buttonClass`
 	button: null,
 
-	// queryCommand: ???
-	//		TODO: unused, remove
-	queryCommand: null,
-
 	// command: String
 	//		String like "insertUnorderedList", "outdent", "justifyCenter", etc. that represents an editor command.
 	//		Passed to editor.execCommand() if `useDefaultCommand` is true.
 	command: "",
 
-	// commandArg: anything
-	//		Argument to execCommand() after command.
-	//		TODO: unused, remove
-	commandArg: null,
-
 	// useDefaultCommand: Boolean
 	//		If true, this plugin executes by calling Editor.execCommand() with the argument specified in `command`.
 	useDefaultCommand: true,
 
 	// buttonClass: Widget Class
-	//		Class for button to control this plugin.   This is used to instantiate the button, unless `button` itself
-	//		is specified directly.
+	//		Class of widget (ex: dijit.form.Button or dijit.form.FilteringSelect)
+	//		that is added to the toolbar to control this plugin.
+	//		This is used to instantiate the button, unless `button` itself is specified directly.
 	buttonClass: dijit.form.Button,
 
 	getLabel: function(/*String*/key){
@@ -7876,9 +8452,9 @@ dojo.declare("dijit._editor._Plugin", null, {
 		return this.editor.commands[key];		// String
 	},
 
-	_initButton: function(props){
+	_initButton: function(){
 		// summary:
-		//		Initialize the button that will control this plugin.
+		//		Initialize the button or other widget that will control this plugin.
 		//		This code only works for plugins controlling built-in commands in the editor.
 		// tags:
 		//		protected extension
@@ -7886,24 +8462,22 @@ dojo.declare("dijit._editor._Plugin", null, {
 			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({
+				var props = dojo.mixin({
 					label: label,
 					showLabel: false,
 					iconClass: className,
 					dropDown: this.dropDown,
 					tabIndex: "-1"
-				}, props || {});
+				}, this.params || {});
 				this.button = new this.buttonClass(props);
 			}
 		}
 	},
 
-	destroy: function(f){
+	destroy: function(){
 		// summary:
 		//		Destroy this plugin
 
-		// TODO: remove f parameter, it's unused
-
 		dojo.forEach(this._connects, dojo.disconnect);
 		if(this.dropDown){
 			this.dropDown.destroyRecursive();
@@ -7950,7 +8524,7 @@ dojo.declare("dijit._editor._Plugin", null, {
 					}
 				}
 			}catch(e){
-				 // FIXME: we shouldn't have debug statements in our code.  Log as an error?
+				console.log(e); // FIXME: we shouldn't have debug statements in our code.  Log as an error?
 			}
 		}
 	},
@@ -7961,7 +8535,7 @@ dojo.declare("dijit._editor._Plugin", null, {
 
 		// TODO: refactor code to just pass editor to constructor.
 
-		// FIXME: detatch from previous editor!!
+		// FIXME: detach from previous editor!!
 		this.editor = editor;
 
 		// FIXME: prevent creating this if we don't need to (i.e., editor can't handle our command)
@@ -7970,7 +8544,7 @@ dojo.declare("dijit._editor._Plugin", null, {
 		// 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";
 			}
@@ -7985,14 +8559,15 @@ dojo.declare("dijit._editor._Plugin", null, {
 
 	setToolbar: function(/*dijit.Toolbar*/ toolbar){
 		// summary:
-		//		Tell the plugin to add itself to the toolbar (if there is a button associated with the plugin).
+		//		Tell the plugin to add it's controller widget (often a button)
+		//		to the toolbar.  Does nothing if there is no controller widget.
 
 		// TODO: refactor code to just pass toolbar to constructor.
 
 		if(this.button){
 			toolbar.addChild(this.button);
 		}
-		// 
+		// console.debug("adding", this.button, "to:", toolbar);
 	}
 });
 
@@ -8002,50 +8577,125 @@ if(!dojo._hasResource["dijit._editor.plugins.EnterKeyHandling"]){ //_hasResource
 dojo._hasResource["dijit._editor.plugins.EnterKeyHandling"] = true;
 dojo.provide("dijit._editor.plugins.EnterKeyHandling");
 
+
+
 dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
 	// summary:
-	//		This plugin tries to make all browsers have identical behavior
-	//		when the user presses the ENTER key.
-	//		Specifically, it fixes the double-spaced line problem on IE.
+	//		This plugin tries to make all browsers behave consistently w.r.t
+	//		displaying paragraphs, specifically dealing with when the user presses
+	//		the ENTER key.
+	//
+	//		It deals mainly with how the text appears on the screen (specifically
+	//		address the double-spaced line problem on IE), but also has some code
+	//		to normalize what attr('value') returns.
+	//
 	// description:
-	//		On IE the ENTER key creates a new paragraph, which visually looks
-	//		bad (ie, "double-spaced") and is also different than FF, which
-	//		makes a <br> in that.
+	//		This plugin has three modes:
+	//
+	//			* blockModeForEnter=BR
+	//			* blockModeForEnter=DIV
+	//			* blockModeForEnter=P
+	//
+	//		In blockModeForEnter=P, the ENTER key semantically means "start a new
+	//		paragraph", whereas shift-ENTER means  "new line in the current paragraph".
+	//		For example:
+	//
+	//		|	first paragraph <shift-ENTER>
+	//		|	second line of first paragraph <ENTER>
+	//		|
+	//		|	second paragraph
+	//
+	//		In the other two modes, the ENTER key means to go to a new line in the
+	//		current paragraph, and users [visually] create a new paragraph by pressing ENTER twice.
+	//		For example, if the user enters text into an editor like this:
+	//
+	//		|		one <ENTER>
+	//		|		two <ENTER>
+	//		|		three <ENTER>
+	//		|		<ENTER>
+	//		|		four <ENTER>
+	//		|		five <ENTER>
+	//		|		six <ENTER>
+	//
+	//		It will appear on the screen as two paragraphs of three lines each.
+	//
+	//		blockNodeForEnter=BR
+	//		--------------------
+	//		On IE, typing the above keystrokes in the editor will internally produce DOM of:
+	//
+	//		|		<p>one</p>
+	//		|		<p>two</p>
+	//		|		<p>three</p>
+	//		|		<p></p>
+	//		|		<p>four</p>
+	//		|		<p>five</p>
+	//		|		<p>six</p>
+	//
+	//		However, blockNodeForEnter=BR makes the Editor on IE display like other browsers, by
+	//		changing the CSS for the <p> node to not have top/bottom margins,
+	//		thus eliminating the double-spaced appearance.
+	//
+	//		Also, attr('value') when used w/blockNodeForEnter=br on IE will return:
+	//
+	//		|	<p> one <br> two <br> three </p>
+	//		|	<p> four <br> five <br> six </p>
+	//
+	//		This output normalization implemented by a filter when the
+	//		editor writes out it's data, to convert consecutive <p>
+	//		nodes into a single <p> node with internal <br> separators.
 	//
-	//		In this plugin's default operation, where blockNodeForEnter==BR, it
-	//		makes the Editor on IE appear to work like other browsers, by:
-	//			1. changing the CSS for the <p> node to not have top/bottom margins,
-	//				thus eliminating the double-spaced appearance.
-	//			2. adds the singleLinePsToRegularPs callback when the
-	//				editor writes out it's data, in order to convert adjacent <p>
-	//				nodes into a single node
-	//		There's also a pre-filter to convert a single <p> with <br> line breaks
-	//		 into separate <p> nodes, to mirror the post-filter.
+	//		There's also a pre-filter to mirror the post-filter.
+	//		It converts a single <p> with <br> line breaks
+	//		into separate <p> nodes, and creates empty <p> nodes for spacing
+	//		between paragraphs.
+	//
+	//		On FF typing the above keystrokes will internally generate:
+	//
+	//		|		one <br> two <br> three <br> <br> four <br> five <br> six <br>
+	//
+	//		And on Safari it will generate:
+	//
+	//		|		"one"
+	//		|		<div>two</div>
+	//		|		<div>three</div>
+	//		|		<div><br></div>
+	//		|		<div>four</div>
+	//		|		<div>five</div>
+	//		|		<div>six</div>
+	//
+	//		Thus, Safari and FF already look correct although semantically their content is a bit strange.
+	//		On Safari or Firefox blockNodeForEnter=BR uses the builtin editor command "insertBrOnReturn",
+	//		but that doesn't seem to do anything.
+	//		Thus, attr('value') on safari/FF returns the browser-specific HTML listed above,
+	//		rather than the semantically meaningful value that IE returns: <p>one<br>two</p> <p>three<br>four</p>.
 	//
 	//		(Note: originally based on http://bugs.dojotoolkit.org/ticket/2859)
 	//
-	//		If you set the blockNodeForEnter option to another value, then this
-	//		plugin will monitor keystrokes (as they are typed) and apparently
-	//		update the editor's content on the fly so that the ENTER key will
-	//		either create a new <div>, or a new <p>.
+	//		blockNodeForEnter=P
+	//		-------------------
+	//		Plugin will monitor keystrokes and update the editor's content on the fly,
+	//		so that the ENTER key will create a new <p> on FF and Safari (it already
+	//		works that way by default on IE).
 	//
-	//		This is useful because in some cases, you need the editor content to be
-	//		consistent with the serialized html even while the user is editing
-	//		(such as in a collaboration mode extension to the editor).
+	//		blockNodeForEnter=DIV
+	//		---------------------
+	//		Follows the same code path as blockNodeForEnter=P but inserting a <div>
+	//		on ENTER key.  Although it produces strange internal DOM, like this:
 	//
-	//		The handleEnterKey() code was mainly written for the IE double-spacing
-	//		issue that is now handled in the pre/post filters.  And it has some
-	//		issues... on IE setting blockNodeForEnter to P or BR
-	//		causes screen jumps as you type (making it unusable), and on safari
-	//		it just has no effect (safari creates a <div> every time the user
-	//		hits the enter key).  But apparently useful for case mentioned above.
+	//		|	<div>paragraph one</div>
+	//		|	<div>paragraph one, line 2</div>
+	//		|	<div> </div>
+	//		|	<div>paragraph two</div>
 	//
-	//		(Note: originally based on http://bugs.dojotoolkit.org/ticket/1331)
+	//		it does provide a consistent look on all browsers, and the on-the-fly DOM updating
+	//		can be useful for collaborative editing.
 
 	// blockNodeForEnter: String
-	//		this property decides the behavior of Enter key. It can be either P,
+	//		This property decides the behavior of Enter key. It can be either P,
 	//		DIV, BR, or empty (which means disable this feature). Anything else
 	//		will trigger errors.
+	//
+	//		See class description for more details.
 	blockNodeForEnter: 'BR',
 
 	constructor: function(args){
@@ -8071,7 +8721,7 @@ dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
 				}));
 			}
 		}else if(this.blockNodeForEnter){
-			//add enter key handler
+			// 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);
@@ -8080,20 +8730,6 @@ dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
 			this.connect(this.editor,'onKeyPressed','onKeyPressed');
 		}
 	},
-	connect: function(o,f,tf){
-		// Overrides _Plugin.connect().
-		// TODO: Remove.  Method in _Plugin does the same thing.
-		if(!this._connects){
-			this._connects=[];
-		}
-		this._connects.push(dojo.connect(o,f,this,tf));
-	},
-	destroy: function(){
-		// Overrides _Plugin.destroy().
-		// TODO: Remove.  Method in _Plugin does the same thing.
-		dojo.forEach(this._connects,dojo.disconnect);
-		this._connects=[];
-	},
 	onKeyPressed: function(e){
 		// summary:
 		//		Handler for keypress events.
@@ -8103,40 +8739,33 @@ dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
 			if(dojo.withGlobal(this.editor.window, 'isCollapsed', dijit)){
 				var liparent=dojo.withGlobal(this.editor.window, 'getAncestorElement', dijit._editor.selection, ['LI']);
 				if(!liparent){
-					//circulate the undo detection code by calling RichText::execCommand directly
+					// circulate the undo detection code by calling RichText::execCommand directly
 					dijit._editor.RichText.prototype.execCommand.call(this.editor, 'formatblock',this.blockNodeForEnter);
-					//set the innerHTML of the new block node
+					// 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
+							// move to the start by moving backwards 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
+						console.error('onKeyPressed: Cannot find the new block node'); // FIXME
 					}
 				}else{
-					
 					if(dojo.isMoz){
-						if(liparent.parentNode.parentNode.nodeName=='LI'){
+						if(liparent.parentNode.parentNode.nodeName == 'LI'){
 							liparent=liparent.parentNode.parentNode;
 						}
 					}
 					var fc=liparent.firstChild;
-					if(fc && fc.nodeType==1 && (fc.nodeName=='UL' || fc.nodeName=='OL')){
+					if(fc && fc.nodeType == 1 && (fc.nodeName == 'UL' || fc.nodeName == 'OL')){
 						liparent.insertBefore(fc.ownerDocument.createTextNode('\xA0'),fc);
-						var newrange = dijit.range.create();
+						var newrange = dijit.range.create(this.editor.window);
 						newrange.setStart(liparent.firstChild,0);
-						var selection = dijit.range.getSelection(this.editor.window,true)
+						var selection = dijit.range.getSelection(this.editor.window, true);
 						selection.removeAllRanges();
 						selection.addRange(newrange);
 					}
@@ -8145,9 +8774,9 @@ dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
 			this._checkListLater = false;
 		}
 		if(this._pressedEnterInBlock){
-			//the new created is the original current P, so we have previousSibling below
+			// the new created is the original current P, so we have previousSibling below
 			if(this._pressedEnterInBlock.previousSibling){
-			    this.removeTrailingBr(this._pressedEnterInBlock.previousSibling);
+				this.removeTrailingBr(this._pressedEnterInBlock.previousSibling);
 			}
 			delete this._pressedEnterInBlock;
 		}
@@ -8163,38 +8792,32 @@ dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
 
 	handleEnterKey: function(e){
 		// summary:
-		//		Handler for enter key events.
+		//		Handler for enter key events when blockModeForEnter is DIV or P.
 		// description:
 		//		Manually handle enter key event to make the behavior consistent across
-		//		all supported browsers. See property blockNodeForEnter for available options
+		//		all supported browsers. See class description for details.
 		// tags:
 		//		private
-		
-		 // let browser handle this
-		// TODO: delete.  this code will never fire because 
-		// onKeyPress --> handleEnterKey is only called when blockNodeForEnter != null
-		if(!this.blockNodeForEnter){ return true; }
 
 		var selection, range, newrange, doc=this.editor.document,br;
-		if(e.shiftKey  //shift+enter always generates <br>
-			|| this.blockNodeForEnter=='BR'){
-			// TODO: above condition 'this.blockNodeForEnter=='BR'' is meaningless,
-			// onKeyPress --> handleEnterKey is only called when blockNodeForEnter != BR
+		if(e.shiftKey){		// shift+enter always generates <br>
 			var parent = dojo.withGlobal(this.editor.window, "getParentElement", dijit._editor.selection);
 			var header = dijit.range.getAncestor(parent,this.blockNodes);
 			if(header){
-				if(!e.shiftKey && header.tagName=='LI'){
-					return true; //let brower handle
+				if(!e.shiftKey && header.tagName == 'LI'){
+					return true; // let browser handle
 				}
 				selection = dijit.range.getSelection(this.editor.window);
 				range = selection.getRangeAt(0);
 				if(!range.collapsed){
 					range.deleteContents();
+					selection = dijit.range.getSelection(this.editor.window);
+					range = selection.getRangeAt(0);
 				}
 				if(dijit.range.atBeginningOfContainer(header, range.startContainer, range.startOffset)){
 					if(e.shiftKey){
 						br=doc.createElement('br');
-						newrange = dijit.range.create();
+						newrange = dijit.range.create(this.editor.window);
 						header.insertBefore(br,header.firstChild);
 						newrange.setStartBefore(br.nextSibling);
 						selection.removeAllRanges();
@@ -8203,7 +8826,7 @@ dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
 						dojo.place(br, header, "before");
 					}
 				}else if(dijit.range.atEndOfContainer(header, range.startContainer, range.startOffset)){
-					newrange = dijit.range.create();
+					newrange = dijit.range.create(this.editor.window);
 					br=doc.createElement('br');
 					if(e.shiftKey){
 						header.appendChild(br);
@@ -8217,55 +8840,65 @@ dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
 					selection.removeAllRanges();
 					selection.addRange(newrange);
 				}else{
-					return true; //let brower handle
+					return true; // let browser handle
 				}
 			}else{
-				//don't change this: do not call this.execCommand, as that may have other logic in subclass
-				// FIXME
+				// don't change this: do not call this.execCommand, as that may have other logic in subclass
 				dijit._editor.RichText.prototype.execCommand.call(this.editor, 'inserthtml', '<br>');
 			}
 			return false;
 		}
 		var _letBrowserHandle = true;
-		//blockNodeForEnter is either P or DIV
-		//first remove selection
+
+		// first remove selection
 		selection = dijit.range.getSelection(this.editor.window);
 		range = selection.getRangeAt(0);
 		if(!range.collapsed){
 			range.deleteContents();
+			selection = dijit.range.getSelection(this.editor.window);
+			range = selection.getRangeAt(0);
 		}
 
 		var block = dijit.range.getBlockAncestor(range.endContainer, null, this.editor.editNode);
 		var blockNode = block.blockNode;
 
-		//if this is under a LI or the parent of the blockNode is LI, just let browser to handle it
+		// if this is under a LI or the parent of the blockNode is LI, just let browser to handle it
 		if((this._checkListLater = (blockNode && (blockNode.nodeName == 'LI' || blockNode.parentNode.nodeName == 'LI')))){
-			
-		    if(dojo.isMoz){
-				//press enter in middle of P may leave a trailing <br/>, let's remove it later
+			if(dojo.isMoz){
+				// press enter in middle of P may leave a trailing <br/>, let's remove it later
 				this._pressedEnterInBlock = blockNode;
 			}
-			//if this li only contains spaces, set the content to empty so the browser will outdent this item
-			if(/^(?:\s| )$/.test(blockNode.innerHTML)){
-				blockNode.innerHTML='';
+			// if this li only contains spaces, set the content to empty so the browser will outdent this item
+			if(/^(\s| |\xA0|<span\b[^>]*\bclass=['"]Apple-style-span['"][^>]*>(\s| |\xA0)<\/span>)?(<br>)?$/.test(blockNode.innerHTML)){
+				// empty LI node
+				blockNode.innerHTML = '';
+				if(dojo.isWebKit){ // WebKit tosses the range when innerHTML is reset
+					newrange = dijit.range.create(this.editor.window);
+					newrange.setStart(blockNode, 0);
+					selection.removeAllRanges();
+					selection.addRange(newrange);
+				}
+				this._checkListLater = false; // nothing to check since the browser handles outdent
 			}
-
 			return true;
 		}
 
-		//text node directly under body, let's wrap them in a node
+		// text node directly under body, let's wrap them in a node
 		if(!block.blockNode || block.blockNode===this.editor.editNode){
-			dijit._editor.RichText.prototype.execCommand.call(this.editor, 'formatblock',this.blockNodeForEnter);
-			//get the newly created block node
+			try{
+				dijit._editor.RichText.prototype.execCommand.call(this.editor, 'formatblock',this.blockNodeForEnter);
+			}catch(e2){ /*squelch FF3 exception bug when editor content is a single BR*/ }
+			// get the newly created block node
 			// FIXME
 			block = {blockNode:dojo.withGlobal(this.editor.window, "getAncestorElement", dijit._editor.selection, [this.blockNodeForEnter]),
 					blockContainer: this.editor.editNode};
 			if(block.blockNode){
-				if(!(block.blockNode.textContent || block.blockNode.innerHTML).replace(/^\s+|\s+$/g, "").length){
+				if(block.blockNode != this.editor.editNode &&
+					(!(block.blockNode.textContent || block.blockNode.innerHTML).replace(/^\s+|\s+$/g, "").length)){
 					this.removeTrailingBr(block.blockNode);
 					return false;
 				}
-			}else{
+			}else{	// we shouldn't be here if formatblock worked
 				block.blockNode = this.editor.editNode;
 			}
 			selection = dijit.range.getSelection(this.editor.window);
@@ -8282,25 +8915,30 @@ dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
 				dojo.place(newblock, block.blockNode, "after");
 			}
 			_letBrowserHandle = false;
-			//lets move caret to the newly created block
-			newrange = dijit.range.create();
-			newrange.setStart(newblock,0);
+			// lets move caret to the newly created block
+			newrange = dijit.range.create(this.editor.window);
+			newrange.setStart(newblock, 0);
 			selection.removeAllRanges();
 			selection.addRange(newrange);
 			if(this.editor.height){
-				newblock.scrollIntoView(false);
+				dijit.scrollIntoView(newblock);
 			}
 		}else if(dijit.range.atBeginningOfContainer(block.blockNode,
 				range.startContainer, range.startOffset)){
 			dojo.place(newblock, block.blockNode, block.blockNode === block.blockContainer ? "first" : "before");
 			if(newblock.nextSibling && this.editor.height){
-				//browser does not scroll the caret position into view, do it manually
-				newblock.nextSibling.scrollIntoView(false);
+				// position input caret - mostly WebKit needs this
+				newrange = dijit.range.create(this.editor.window);
+				newrange.setStart(newblock.nextSibling, 0);
+				selection.removeAllRanges();
+				selection.addRange(newrange);
+				// browser does not scroll the caret position into view, do it manually
+				dijit.scrollIntoView(newblock.nextSibling);
 			}
 			_letBrowserHandle = false;
-		}else{ //press enter in the middle of P
+		}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
+				// press enter in middle of P may leave a trailing <br/>, let's remove it later
 				this._pressedEnterInBlock = block.blockNode;
 			}
 		}
@@ -8318,7 +8956,7 @@ dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
 		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')){
+				para.lastChild.tagName=='BR'){
 
 				dojo.destroy(para.lastChild);
 			}
@@ -8332,59 +8970,15 @@ dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
 		//		Insert CSS so <p> nodes don't have spacing around them,
 		//		thus hiding the fact that ENTER key on IE is creating new
 		//		paragraphs
-		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
-					
-					return null;	//	HTMLStyleElement
-				}else{
-					head.appendChild(style);
-				}
-				if(style.styleSheet){// IE
-					var setFunc = function(){
-						try{
-							style.styleSheet.cssText = cssStr;
-						}catch(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);
+		// cannot use !important since there may be custom user styling;
+		var doc = this.editor.document;
+		if(doc.__INSERTED_EDITIOR_NEWLINE_CSS === undefined){
+			var style = dojo.create("style", {type: "text/css"}, doc.getElementsByTagName("head")[0]);
+			style.styleSheet.cssText = "p{margin:0;}"; // cannot use !important since there may be custom user styling;
 			this.editor.document.__INSERTED_EDITIOR_NEWLINE_CSS = true;
-			// this.regularPsToSingleLinePs(this.editNode);
-			return d;
 		}
-		return null;
+		return d;
 	},
 	regularPsToSingleLinePs: function(element, noWhiteSpaceInEmptyP){
 		// summary:
@@ -8442,7 +9036,7 @@ dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
 				if(currentNode.nodeName=="BR"){
 					var newP = currentNode.ownerDocument.createElement('p');
 					dojo.place(newP, el, "after");
-					if (trailingNodes.length==0 && i != lastNodeIndex) {
+					if(trailingNodes.length==0 && i != lastNodeIndex){
 						newP.innerHTML = " "
 					}
 					dojo.forEach(trailingNodes, function(node){
@@ -8460,8 +9054,9 @@ dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
 		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 prevSib = p.previousSibling;
+			if(	(prevSib) && (prevSib.nodeType == 1) && 
+				(prevSib.nodeName == 'P' || dojo.style(prevSib, 'display') != 'block')
 			){
 				var newP = p.parentNode.insertBefore(this.document.createElement('p'), p);
 				// this is essential to prevent IE from losing the P.
@@ -8470,7 +9065,7 @@ dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
 				newP.innerHTML = noWhiteSpaceInEmptyP ? "" : " ";
 			}
 			splitP(p);
-	  },this.editor);
+		},this.editor);
 		wrapLinesInPs(element);
 		return element;
 	},
@@ -8481,7 +9076,7 @@ dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
 		//		Apparently collapses adjacent <p> nodes into a single <p>
 		//		nodes with <br> separating each line.
 		//
-		//	example:
+		// example:
 		//		Given this input:
 		//	|	<p>line 1</p>
 		//	|	<p>line 2</p>
@@ -8505,7 +9100,7 @@ dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
 		//
 		// tags:
 		//		private
-	
+
 		function getParagraphParents(node){
 			// summary:
 			//		Used to get list of all nodes that contain paragraphs.
@@ -8529,13 +9124,7 @@ dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
 		}
 
 		function isParagraphDelimiter(node){
-			if(node.nodeType != 1 || node.tagName != 'P'){
-				return dojo.style(node, 'display') == 'block';
-			}else{
-				if(!node.childNodes.length || node.innerHTML==" "){ return true; }
-				//return node.innerHTML.match(/^(<br\ ?\/?>| |\&nbsp\;)$/i);
-			}
-			return false;
+			return (!node.childNodes.length || node.innerHTML==" ");
 		}
 
 		var paragraphContainers = getParagraphParents(element);
@@ -8545,9 +9134,10 @@ dojo.declare("dijit._editor.plugins.EnterKeyHandling", dijit._editor._Plugin, {
 			var node = container.firstChild;
 			var deleteNode = null;
 			while(node){
-				if(node.nodeType != "1" || node.tagName != 'P'){
+				if(node.nodeType != 1 || node.tagName != 'P' ||
+						(node.getAttributeNode('style') || {/*no style*/}).specified){
 					firstPInBlock = null;
-				}else if (isParagraphDelimiter(node)){
+				}else if(isParagraphDelimiter(node)){
 					deleteNode = node;
 					firstPInBlock = null;
 				}else{
@@ -8601,19 +9191,22 @@ dojo.declare(
 		//
 		// description:
 		//		This widget provides basic WYSIWYG editing features, based on the browser's
-		//		underlying rich text editing capability, accompanied by a toolbar (dijit.Toolbar).
+		//		underlying rich text editing capability, accompanied by a toolbar (`dijit.Toolbar`).
 		//		A plugin model is available to extend the editor's capabilities as well as the
 		//		the options available in the toolbar.  Content generation may vary across
 		//		browsers, and clipboard operations may have different results, to name
 		//		a few limitations.  Note: this widget should not be used with the HTML
 		//		<TEXTAREA> tag -- see dijit._editor.RichText for details.
 
-		// plugins: String[]
+		// plugins: Object[]
 		//		A list of plugin names (as strings) or instances (as objects)
 		//		for this widget.
+		//
+		//		When declared in markup, it might look like:
+		//	|	plugins="['bold',{name:'dijit._editor.plugins.FontChoice', command:'fontName', generic:true}]"
 		plugins: null,
 
-		// extraPlugins: String[]
+		// extraPlugins: Object[]
 		//		A list of extra plugin names which will be appended to plugins array
 		extraPlugins: null,
 
@@ -8636,14 +9229,15 @@ dojo.declare(
 			//when no iframe is used, focus will be lost whenever another element gets focus.
 			//For IE, we can connect to onBeforeDeactivate, which will be called right before
 			//the focus is lost, so we can obtain the selected range. For other browsers,
-			//no equivelent of onBeforeDeactivate, so we need to do two things to make sure 
-			//selection is properly saved before focus is lost: 1) when user clicks another 
+			//no equivelent of onBeforeDeactivate, so we need to do two things to make sure
+			//selection is properly saved before focus is lost: 1) when user clicks another
 			//element in the page, in which case we listen to mousedown on the entire page and
 			//see whether user clicks out of a focus editor, if so, save selection (focus will
 			//only lost after onmousedown event is fired, so we can obtain correct caret pos.)
 			//2) when user tabs away from the editor, which is handled in onKeyDown below.
 			if(dojo.isIE){
 				this.events.push("onBeforeDeactivate");
+				this.events.push("onBeforeActivate");
 			}
 		},
 
@@ -8674,7 +9268,7 @@ dojo.declare(
 
 			dojo.forEach(this.plugins, this.addPlugin, this);
 			this.onNormalizedDisplayChanged(); //update toolbar button status
-//			}catch(e){  }
+//			}catch(e){ console.debug(e); }
 
 			this.toolbar.startup();
 		},
@@ -8740,19 +9334,32 @@ dojo.declare(
 			//		Developers don't need to call this method.
 			// tags:
 			//		protected
-			//
+			//console.log('startup',arguments);
 		},
 		resize: function(size){
 			// summary:
 			//		Resize the editor to the specified size, see `dijit.layout._LayoutWidget.resize`
-			dijit.layout._LayoutWidget.prototype.resize.apply(this,arguments);
+			if(size){
+				// we've been given a height/width for the entire editor (toolbar + contents), calls layout()
+				// to split the allocated size between the toolbar and the contents
+				dijit.layout._LayoutWidget.prototype.resize.apply(this, arguments);
+			}
+			/*
+			else{
+				// do nothing, the editor is already laid out correctly.   The user has probably specified
+				// the height parameter, which was used to set a size on the iframe
+			}
+			*/
 		},
 		layout: function(){
 			// summary:
 			//		Called from `dijit.layout._LayoutWidget.resize`.  This shouldn't be called directly
 			// tags:
 			//		protected
-			this.editingArea.style.height=(this._contentBox.h - dojo.marginBox(this.toolbar.domNode).h)+"px";
+
+			// Converts the iframe (or rather the <div> surrounding it) to take all the available space
+			// except what's needed for the toolbar
+			this.editingArea.style.height = (this._contentBox.h - dojo.marginBox(this.toolbar.domNode).h)+"px";
 			if(this.iframe){
 				this.iframe.style.height="100%";
 			}
@@ -8763,11 +9370,18 @@ dojo.declare(
 			//		IE only to prevent 2 clicks to focus
 			// tags:
 			//		private
-			delete this._savedSelection; // new mouse position overrides old selection
-			if(e.target.tagName == "BODY"){
-				setTimeout(dojo.hitch(this, "placeCursorAtEnd"), 0);
+
+			var outsideClientArea = this.document.body.componentFromPoint(e.x, e.y);
+			if(!outsideClientArea){
+				delete this._savedSelection; // new mouse position overrides old selection
+				if(e.target.tagName == "BODY"){
+					setTimeout(dojo.hitch(this, "placeCursorAtEnd"), 0);
+				}
+				this.inherited(arguments);
 			}
-			this.inherited(arguments);
+		},
+		onBeforeActivate: function(e){
+			this._restoreSelection();
 		},
 		onBeforeDeactivate: function(e){
 			// summary:
@@ -8779,8 +9393,10 @@ dojo.declare(
 			}
 			//in IE, the selection will be lost when other elements get focus,
 			//let's save focus before the editor is deactivated
-			this._saveSelection();
-	        //
+			if(e.target.tagName != "BODY"){
+				this._saveSelection();
+			}
+			//console.log('onBeforeDeactivate',this);
 		},
 
 		/* beginning of custom undo/redo support */
@@ -8826,27 +9442,27 @@ dojo.declare(
 			//      Called by plugins, but not meant to be called by end users.
 			// tags:
 			//		protected
-			if(this.customUndo && (cmd=='undo' || cmd=='redo')){
+			if(this.customUndo && (cmd == 'undo' || cmd == 'redo')){
 				return this[cmd]();
 			}else{
 				if(this.customUndo){
 					this.endEditing();
 					this._beginEditing();
 				}
+				var r;
 				try{
-					var r = this.inherited('execCommand', arguments);
-                    if(dojo.isWebKit && cmd=='paste' && !r){ //see #4598: safari does not support invoking paste from js
+					r = this.inherited('execCommand', arguments);
+					if(dojo.isWebKit && cmd == 'paste' && !r){ //see #4598: safari does not support invoking paste from js
 						throw { code: 1011 }; // throw an object like Mozilla's error
-                    }
+					}
 				}catch(e){
 					//TODO: when else might we get an exception?  Do we need the Mozilla test below?
 					if(e.code == 1011 /* Mozilla: service denied */ && /copy|cut|paste/.test(cmd)){
 						// Warn user of platform limitation.  Cannot programmatically access clipboard. See ticket #4136
 						var sub = dojo.string.substitute,
-							accel = {cut:'X', copy:'C', paste:'V'},
-							isMac = navigator.userAgent.indexOf("Macintosh") != -1;
+							accel = {cut:'X', copy:'C', paste:'V'};
 						alert(sub(this.commands.systemShortcut,
-							[this.commands[cmd], sub(this.commands[isMac ? 'appleKey' : 'ctrlKey'], [accel[cmd]])]));
+							[this.commands[cmd], sub(this.commands[dojo.isMac ? 'appleKey' : 'ctrlKey'], [accel[cmd]])]));
 					}
 					r = false;
 				}
@@ -8862,47 +9478,37 @@ dojo.declare(
 			//      Used by the plugins to know when to highlight/not highlight buttons.
 			// tags:
 			//		protected
-			if(this.customUndo && (cmd=='undo' || cmd=='redo')){
-				return cmd=='undo'?(this._steps.length>1):(this._undoedSteps.length>0);
+			if(this.customUndo && (cmd == 'undo' || cmd == 'redo')){
+				return cmd == 'undo' ? (this._steps.length > 1) : (this._undoedSteps.length > 0);
 			}else{
 				return this.inherited('queryCommandEnabled',arguments);
 			}
 		},
 
-		focus: function(){
-			// summary:
-			//		Set focus inside the editor
-			var restore=0;
-			//
-			if(this._savedSelection && dojo.isIE){
-				restore = dijit._curFocus!=this.editNode;
-			}
-		    this.inherited(arguments);
-		    if(restore){
-		    	this._restoreSelection();
-		    }
-		},
 		_moveToBookmark: function(b){
 			// summary:
 			//		Selects the text specified in bookmark b
 			// tags:
 			//		private
-			var bookmark=b;
+			var bookmark = b.mark;
+			var mark = b.mark;
+			var col = b.isCollapsed;
 			if(dojo.isIE){
-				if(dojo.isArray(b)){//IE CONTROL
-					bookmark=[];
-					dojo.forEach(b,function(n){
+				if(dojo.isArray(mark)){//IE CONTROL
+					bookmark = [];
+					dojo.forEach(mark,function(n){
 						bookmark.push(dijit.range.getNode(n,this.editNode));
 					},this);
 				}
 			}else{//w3c range
-				var r=dijit.range.create();
+				var r=dijit.range.create(this.window);
 				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]);
+			dojo.withGlobal(this.window,'moveToBookmark',dijit,[{mark: bookmark, isCollapsed: col}]);
 		},
+
 		_changeToStep: function(from, to){
 			// summary:
 			//		Reverts editor to "to" setting, from the undo stack.
@@ -8918,7 +9524,7 @@ dojo.declare(
 			//		Handler for editor undo (ex: ctrl-z) operation
 			// tags:
 			//		private
-//			
+//			console.log('undo');
 			this.endEditing(true);
 			var s=this._steps.pop();
 			if(this._steps.length>0){
@@ -8936,7 +9542,7 @@ dojo.declare(
 			// tags:
 			//		private
 
-//			
+//			console.log('redo');
 			this.endEditing(true);
 			var s=this._undoedSteps.pop();
 			if(s && this._steps.length>0){
@@ -8969,19 +9575,22 @@ dojo.declare(
 			//		protected
 			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;
+			if(b.mark){
+				var mark = b.mark;
+				if(dojo.isIE){
+					if(dojo.isArray(mark)){//CONTROL
+						dojo.forEach(mark,function(n){
+							tmp.push(dijit.range.getIndex(n,this.editNode).o);
+						},this);
+						b.mark = tmp;
+					}
+				}else{//w3c range
+					tmp=dijit.range.getIndex(mark.startContainer,this.editNode).o;
+					b.mark ={startContainer:tmp,
+						startOffset:mark.startOffset,
+						endContainer:mark.endContainer === mark.startContainer?tmp:dijit.range.getIndex(mark.endContainer,this.editNode).o,
+						endOffset:mark.endOffset};
 				}
-			}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;
 		},
@@ -8991,7 +9600,7 @@ dojo.declare(
 			//		Deals with saving undo; see editActionInterval parameter.
 			// tags:
 			//		private
-			if(this._steps.length===0){
+			if(this._steps.length === 0){
 				this._steps.push({'text':this.savedContent,'bookmark':this._getBookmark()});
 			}
 		},
@@ -9014,7 +9623,7 @@ dojo.declare(
 
 			//We need to save selection if the user TAB away from this editor
 			//no need to call _saveSelection for IE, as that will be taken care of in onBeforeDeactivate
-			if(!dojo.isIE && !this.iframe && e.keyCode==dojo.keys.TAB && !this.tabIndent){
+			if(!dojo.isIE && !this.iframe && e.keyCode == dojo.keys.TAB && !this.tabIndent){
 				this._saveSelection();
 			}
 			if(!this.customUndo){
@@ -9099,7 +9708,7 @@ dojo.declare(
 			// tags:
 			//		private
 			this._savedSelection=this._getBookmark();
-			//
+			//console.log('save selection',this._savedSelection,this);
 		},
 		_restoreSelection: function(){
 			// summary:
@@ -9108,26 +9717,15 @@ dojo.declare(
 			// tags:
 			//		private
 			if(this._savedSelection){
-				//only restore the selection if the current range is collapsed
-    				//if not collapsed, then it means the editor does not lose 
-    				//selection and there is no need to restore it
-    				if(dojo.withGlobal(this.window,'isCollapsed',dijit)){
-    					//
+				// only restore the selection if the current range is collapsed
+				// if not collapsed, then it means the editor does not lose
+				// selection and there is no need to restore it
+				if(dojo.withGlobal(this.window,'isCollapsed',dijit)){
 					this._moveToBookmark(this._savedSelection);
 				}
 				delete this._savedSelection;
 			}
 		},
-		_onFocus: function(){
-			// summary:
-			//		Called from focus manager when focus has moved into this editor
-			// tags:
-			//		protected
-
-			//
-			setTimeout(dojo.hitch(this, "_restoreSelection"), 0); // needs input caret first
-			this.inherited(arguments);
-		},
 
 		onClick: function(){
 			// summary:
@@ -9163,7 +9761,7 @@ dojo.subscribe(dijit._scopeName + ".Editor.getPlugin",null,function(o){
 		case "|":
 			p = new _p({ button: new dijit.ToolbarSeparator() });
 	}
-//	
+//	console.log('name',name,p);
 	o.plugin=p;
 });
 
@@ -9185,7 +9783,7 @@ dojo.declare("dijit.MenuItem",
 
 		// Make 3 columns
 		// icon, label, and expand arrow (BiDi-dependent) indicating sub-menu
-		templateString:"<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset\" waiRole=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon\" dojoAttachPoint=\"iconNode\">\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" dojoAttachPoint=\"containerNode\"></td>\n\t<td class [...]
+		templateString: dojo.cache("dijit", "templates/MenuItem.html", "<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset\" waiRole=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon\" dojoAttachPoint=\"iconNode\">\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" dojo [...]
 
 		attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
 			label: { node: "containerNode", type: "innerHTML" },
@@ -9222,8 +9820,13 @@ dojo.declare("dijit.MenuItem",
 
 		postCreate: function(){
 			dojo.setSelectable(this.domNode, false);
-			dojo.attr(this.containerNode, "id", this.id+"_text");
-			dijit.setWaiState(this.domNode, "labelledby", this.id+"_text");
+			var label = this.id+"_text";
+			dojo.attr(this.containerNode, "id", label);
+			if(this.accelKeyNode){
+				dojo.attr(this.accelKeyNode, "id", this.id + "_accel");
+				label += " " + this.id + "_accel";
+			}
+			dijit.setWaiState(this.domNode, "labelledby", label);
 		},
 
 		_onHover: function(){
@@ -9269,6 +9872,10 @@ dojo.declare("dijit.MenuItem",
 			// summary:
 			//		Focus on this MenuItem
 			try{
+				if(dojo.isIE == 8){
+					// needed for IE8 which won't scroll TR tags into view on focus yet calling scrollIntoView creates flicker (#10275)
+					this.containerNode.focus();
+				}
 				dijit.focus(this.focusNode);
 			}catch(e){
 				// this throws on IE (at least) in some scenarios
@@ -9282,8 +9889,9 @@ dojo.declare("dijit.MenuItem",
 			// tags:
 			//		protected
 			this._setSelected(true);
+			this.getParent()._onItemFocus(this);
 
-			// TODO: this.inherited(arguments);
+			this.inherited(arguments);
 		},
 
 		_setSelected: function(selected){
@@ -9301,7 +9909,7 @@ dojo.declare("dijit.MenuItem",
 			 * MenuItem is not in the chain of active widgets and gets a premature call to
 			 * _onBlur()
 			 */
-			
+
 			dojo.toggleClass(this.domNode, "dijitMenuItemSelected", selected);
 		},
 
@@ -9355,13 +9963,13 @@ dojo.declare("dijit.PopupMenuItem",
 		dijit.MenuItem,
 		{
 		_fillContent: function(){
-			// summary: 
+			// summary:
 			//		When Menu is declared in markup, this code gets the menu label and
 			//		the popup widget from the srcNodeRef.
 			// description:
 			//		srcNodeRefinnerHTML contains both the menu item text and a popup widget
 			//		The first part holds the menu item text and the second part is the popup
-			// example: 
+			// example:
 			// |	<div dojoType="dijit.PopupMenuItem">
 			// |		<span>pick me</span>
 			// |		<popup> ... </popup>
@@ -9396,10 +10004,14 @@ dojo.declare("dijit.PopupMenuItem",
 			}
 			dijit.setWaiState(this.focusNode, "haspopup", "true");
 		},
-		
+
 		destroyDescendants: function(){
 			if(this.popup){
-				this.popup.destroyRecursive();
+				// Destroy the popup, unless it's already been destroyed.  This can happen because
+				// the popup is a direct child of <body> even though it's logically my child.
+				if(!this.popup._destroyed){
+					this.popup.destroyRecursive();
+				}
 				delete this.popup;
 			}
 			this.inherited(arguments);
@@ -9420,8 +10032,8 @@ dojo.declare("dijit.CheckedMenuItem",
 		{
 		// summary:
 		//		A checkbox-like menu item for toggling on and off
-		
-		templateString:"<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitemcheckbox\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset\" waiRole=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon dijitCheckedMenuItemIcon\" dojoAttachPoint=\"iconNode\">\n\t\t<span class=\"dijitCheckedMenuItemIconChar\">✓</span>\n\t</td>\n\t<td class=\ [...]
+
+		templateString: dojo.cache("dijit", "templates/CheckedMenuItem.html", "<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitemcheckbox\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset\" waiRole=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon dijitCheckedMenuItemIcon\" dojoAttachPoint=\"iconNode\">\n\t\t<span class=\"dijitCheckedMen [...]
 
 		// checked: Boolean
 		//		Our checked state
@@ -9471,12 +10083,12 @@ dojo.declare("dijit.MenuSeparator",
 		// summary:
 		//		A line between two menu items
 
-		templateString:"<tr class=\"dijitMenuSeparator\">\n\t<td colspan=\"4\">\n\t\t<div class=\"dijitMenuSeparatorTop\"></div>\n\t\t<div class=\"dijitMenuSeparatorBottom\"></div>\n\t</td>\n</tr>\n",
+		templateString: dojo.cache("dijit", "templates/MenuSeparator.html", "<tr class=\"dijitMenuSeparator\">\n\t<td colspan=\"4\">\n\t\t<div class=\"dijitMenuSeparatorTop\"></div>\n\t\t<div class=\"dijitMenuSeparatorBottom\"></div>\n\t</td>\n</tr>\n"),
 
 		postCreate: function(){
 			dojo.setSelectable(this.domNode, false);
 		},
-		
+
 		isFocusable: function(){
 			// summary:
 			//		Override to always return false
@@ -9558,6 +10170,28 @@ dojo.declare("dijit._MenuBase",
 		}
 	},
 
+	_onPopupHover: function(/*Event*/ evt){
+		// summary:
+		//		This handler is called when the mouse moves over the popup.
+		// tags:
+		//		private
+
+		// if the mouse hovers over a menu popup that is in pending-close state,
+		// then stop the close operation.
+		// This can't be done in onItemHover since some popup targets don't have MenuItems (e.g. ColorPicker)
+		if(this.currentPopup && this.currentPopup._pendingClose_timer){
+			var parentMenu = this.currentPopup.parentMenu;
+			// highlight the parent menu item pointing to this popup
+			if(parentMenu.focusedChild){
+				parentMenu.focusedChild._setSelected(false);
+			}
+			parentMenu.focusedChild = this.currentPopup.from_item;
+			parentMenu.focusedChild._setSelected(true);
+			// cancel the pending close
+			this._stopPendingCloseTimer(this.currentPopup);
+		}
+	},
+
 	onItemHover: function(/*MenuItem*/ item){
 		// summary:
 		//		Called when cursor is over a MenuItem.
@@ -9566,15 +10200,21 @@ dojo.declare("dijit._MenuBase",
 
 		// Don't do anything unless user has "activated" the menu by:
 		//		1) clicking it
-		//		2) tabbing into it
-		//		3) opening it from a parent menu (which automatically focuses it)
+		//		2) opening it from a parent menu (which automatically focuses it)
 		if(this.isActive){
 			this.focusChild(item);
-	
 			if(this.focusedChild.popup && !this.focusedChild.disabled && !this.hover_timer){
 				this.hover_timer = setTimeout(dojo.hitch(this, "_openPopup"), this.popupDelay);
 			}
 		}
+		// if the user is mixing mouse and keyboard navigation,
+		// then the menu may not be active but a menu item has focus,
+		// but it's not the item that the mouse just hovered over.
+		// To avoid both keyboard and mouse selections, use the latest.
+		if(this.focusedChild){
+			this.focusChild(item);
+		}
+		this._hoveredChild = item;
 	},
 
 	_onChildBlur: function(item){
@@ -9583,12 +10223,20 @@ dojo.declare("dijit._MenuBase",
 		//		has been removed from the MenuItem *and* it's descendant menus.
 		// tags:
 		//		private
-
+		this._stopPopupTimer();
 		item._setSelected(false);
-
 		// Close all popups that are open and descendants of this menu
-		dijit.popup.close(item.popup);
-		this._stopPopupTimer();
+		var itemPopup = item.popup;
+		if(itemPopup){
+			this._stopPendingCloseTimer(itemPopup);
+			itemPopup._pendingClose_timer = setTimeout(function(){
+				itemPopup._pendingClose_timer = null;
+				if(itemPopup.parentMenu){
+					itemPopup.parentMenu.currentPopup = null;
+				}
+				dijit.popup.close(itemPopup); // this calls onClose
+			}, this.popupDelay);
+		}
 	},
 
 	onItemUnhover: function(/*MenuItem*/ item){
@@ -9596,9 +10244,11 @@ dojo.declare("dijit._MenuBase",
 		//		Callback fires when mouse exits a MenuItem
 		// tags:
 		//		protected
+
 		if(this.isActive){
 			this._stopPopupTimer();
 		}
+		if(this._hoveredChild == item){ this._hoveredChild = null; }
 	},
 
 	_stopPopupTimer: function(){
@@ -9613,6 +10263,28 @@ dojo.declare("dijit._MenuBase",
 		}
 	},
 
+	_stopPendingCloseTimer: function(/*dijit._Widget*/ popup){
+		// summary:
+		//		Cancels the pending-close timer because the close has been preempted
+		// tags:
+		//		private
+		if(popup._pendingClose_timer){
+			clearTimeout(popup._pendingClose_timer);
+			popup._pendingClose_timer = null;
+		}
+	},
+
+	_stopFocusTimer: function(){
+		// summary:
+		//		Cancels the pending-focus timer because the menu was closed before focus occured
+		// tags:
+		//		private
+		if(this._focus_timer){
+			clearTimeout(this._focus_timer);
+			this._focus_timer = null;
+		}
+	},
+
 	_getTopMenu: function(){
 		// summary:
 		//		Returns the top menu in this chain of Menus
@@ -9622,19 +10294,22 @@ dojo.declare("dijit._MenuBase",
 		return top;
 	},
 
-	onItemClick: function(/*Widget*/ item, /*Event*/ evt){
+	onItemClick: function(/*dijit._Widget*/ item, /*Event*/ evt){
 		// summary:
 		//		Handle clicks on an item.
 		// tags:
 		//		private
 		if(item.disabled){ return false; }
 
+		// this can't be done in _onFocus since the _onFocus events occurs asynchronously
+		if(typeof this.isShowingNow == 'undefined'){ // non-popup menu
+			this._markActive();
+		}
+
 		this.focusChild(item);
 
 		if(item.popup){
-			if(!this.is_open){
-				this._openPopup();
-			}
+			this._openPopup();
 		}else{
 			// before calling user defined handler, close hierarchy of menus
 			// and restore focus to place it was when menu was opened
@@ -9653,36 +10328,67 @@ dojo.declare("dijit._MenuBase",
 
 		this._stopPopupTimer();
 		var from_item = this.focusedChild;
+		if(!from_item){ return; } // the focused child lost focus since the timer was started
 		var popup = from_item.popup;
-
 		if(popup.isShowingNow){ return; }
+		if(this.currentPopup){
+			this._stopPendingCloseTimer(this.currentPopup);
+			dijit.popup.close(this.currentPopup);
+		}
 		popup.parentMenu = this;
+		popup.from_item = from_item; // helps finding the parent item that should be focused for this popup
 		var self = this;
 		dijit.popup.open({
 			parent: this,
 			popup: popup,
 			around: from_item.domNode,
-			orient: this._orient || (this.isLeftToRight() ? {'TR': 'TL', 'TL': 'TR'} : {'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;
+			orient: this._orient || (this.isLeftToRight() ?
+									{'TR': 'TL', 'TL': 'TR', 'BR': 'BL', 'BL': 'BR'} :
+									{'TL': 'TR', 'TR': 'TL', 'BL': 'BR', 'BR': 'BL'}),
+			onCancel: function(){ // called when the child menu is canceled
+				// set isActive=false (_closeChild vs _cleanUp) so that subsequent hovering will NOT open child menus
+				// which seems aligned with the UX of most applications (e.g. notepad, wordpad, paint shop pro)
+				self.focusChild(from_item);	// put focus back on my node
+				self._cleanUp();			// close the submenu (be sure this is done _after_ focus is moved)
+				from_item._setSelected(true); // oops, _cleanUp() deselected the item
+				self.focusedChild = from_item;	// and unset focusedChild
 			},
-			onExecute: dojo.hitch(this, "_onDescendantExecute")
+			onExecute: dojo.hitch(this, "_cleanUp")
 		});
 
 		this.currentPopup = popup;
+		// detect mouseovers to handle lazy mouse movements that temporarily focus other menu items
+		popup.connect(popup.domNode, "onmouseenter", dojo.hitch(self, "_onPopupHover")); // cleaned up when the popped-up widget is destroyed on close
 
 		if(popup.focus){
 			// If user is opening the popup via keyboard (right arrow, or down arrow for MenuBar),
 			// if the cursor happens to collide with the popup, it will generate an onmouseover event
 			// even though the mouse wasn't moved.   Use a setTimeout() to call popup.focus so that
 			// our focus() call overrides the onmouseover event, rather than vice-versa.  (#8742)
-			setTimeout(dojo.hitch(popup, "focus"), 0);
+			popup._focus_timer = setTimeout(dojo.hitch(popup, function(){
+				this._focus_timer = null;
+				this.focus();
+			}), 0);
 		}
 	},
 
+	_markActive: function(){
+		// summary:
+		//              Mark this menu's state as active.
+		//		Called when this Menu gets focus from:
+		//			1) clicking it (mouse or via space/arrow key)
+		//			2) being opened by a parent menu.
+		//		This is not called just from mouse hover.
+		//		Focusing a menu via TAB does NOT automatically set isActive
+		//		since TAB is a navigation operation and not a selection one.
+		//		For Windows apps, pressing the ALT key focuses the menubar
+		//		menus (similar to TAB navigation) but the menu is not active
+		//		(ie no dropdown) until an item is clicked.
+		this.isActive = true;
+		dojo.addClass(this.domNode, "dijitMenuActive");
+		dojo.removeClass(this.domNode, "dijitMenuPassive");
+	},
+
 	onOpen: function(/*Event*/ e){
 		// summary:
 		//		Callback when this menu is opened.
@@ -9692,6 +10398,15 @@ dojo.declare("dijit._MenuBase",
 		//		private
 
 		this.isShowingNow = true;
+		this._markActive();
+	},
+
+	_markInactive: function(){
+		// summary:
+		//		Mark this menu's state as inactive.
+		this.isActive = false; // don't do this in _onBlur since the state is pending-close until we get here
+		dojo.removeClass(this.domNode, "dijitMenuActive");
+		dojo.addClass(this.domNode, "dijitMenuPassive");
 	},
 
 	onClose: function(){
@@ -9702,52 +10417,61 @@ dojo.declare("dijit._MenuBase",
 		// tags:
 		//		private
 
-		this._stopPopupTimer();
-		this.parentMenu = null;
+		this._stopFocusTimer();
+		this._markInactive();
 		this.isShowingNow = false;
-		this.currentPopup = null;
-		if(this.focusedChild){
-			this._onChildBlur(this.focusedChild);
+		this.parentMenu = null;
+	},
+
+	_closeChild: function(){
+		// summary:
+		//		Called when submenu is clicked or focus is lost.  Close hierarchy of menus.
+		// tags:
+		//		private
+		this._stopPopupTimer();
+		if(this.focusedChild){ // unhighlight the focused item
+			this.focusedChild._setSelected(false);
+			this.focusedChild._onUnhover();
 			this.focusedChild = null;
 		}
+		if(this.currentPopup){
+			// Close all popups that are open and descendants of this menu
+			dijit.popup.close(this.currentPopup);
+			this.currentPopup = null;
+		}
 	},
 
-	_onFocus: function(){
+	_onItemFocus: function(/*MenuItem*/ item){
 		// summary:
-		//		Called when this Menu gets focus from:
+		//		Called when child of this Menu gets focus from:
 		//			1) clicking it
 		//			2) tabbing into it
 		//			3) being opened by a parent menu.
 		//		This is not called just from mouse hover.
-		// tags:
-		//		protected
-		this.isActive = true;
-		dojo.addClass(this.domNode, "dijitMenuActive");
-		dojo.removeClass(this.domNode, "dijitMenuPassive");
-		this.inherited(arguments);
+		if(this._hoveredChild && this._hoveredChild != item){
+			this._hoveredChild._onUnhover(); // any previous mouse movement is trumped by focus selection
+		}
 	},
-	
+
 	_onBlur: function(){
 		// summary:
 		//		Called when focus is moved away from this Menu and it's submenus.
 		// tags:
 		//		protected
-		this.isActive = false;
-		dojo.removeClass(this.domNode, "dijitMenuActive");
-		dojo.addClass(this.domNode, "dijitMenuPassive");
-
-		// If user blurs/clicks away from a MenuBar (or always visible Menu), then close all popped up submenus etc.
-		this.onClose();
-
+		this._cleanUp();
 		this.inherited(arguments);
 	},
 
-	_onDescendantExecute: function(){
+	_cleanUp: function(){
 		// summary:
-		//		Called when submenu is clicked.  Close hierarchy of menus.
+		//		Called when the user is done with this menu.  Closes hierarchy of menus.
 		// tags:
 		//		private
-		this.onClose();
+
+		this._closeChild(); // don't call this.onClose since that's incorrect for MenuBar's that never close
+		if(typeof this.isShowingNow == 'undefined'){ // non-popup menu doesn't call onClose
+			this._markInactive();
+		}
 	}
 });
 
@@ -9765,7 +10489,7 @@ dojo.declare("dijit.Menu",
 		this._bindings = [];
 	},
 
-	templateString:"<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" waiRole=\"menu\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress:_onKeyPress\">\n\t<tbody class=\"dijitReset\" dojoAttachPoint=\"containerNode\"></tbody>\n</table>\n",
+	templateString: dojo.cache("dijit", "templates/Menu.html", "<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" waiRole=\"menu\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress:_onKeyPress\">\n\t<tbody class=\"dijitReset\" dojoAttachPoint=\"containerNode\"></tbody>\n</table>\n"),
 
 	// targetNodeIds: [const] String[]
 	//		Array of dom node ids of nodes to attach to.
@@ -9780,7 +10504,11 @@ dojo.declare("dijit.Menu",
 	// leftClickToOpen: [const] Boolean
 	//		If true, menu will open on left click instead of right click, similiar to a file menu.
 	leftClickToOpen: false,
-	
+
+	// refocus: Boolean
+	// 		When this menu closes, re-focus the element which had focus before it was opened.
+	refocus: true,
+
 	// _contextMenuWithMouse: [private] Boolean
 	//		Used to record mouse and keyboard events to determine if a context
 	//		menu is being opened with the keyboard or the mouse.
@@ -9790,6 +10518,9 @@ dojo.declare("dijit.Menu",
 		if(this.contextMenuForWindow){
 			this.bindDomNode(dojo.body());
 		}else{
+			// TODO: should have _setTargetNodeIds() method to handle initialization and a possible
+			// later attr('targetNodeIds', ...) call.   There's also a problem that targetNodeIds[]
+			// gets stale after calls to bindDomNode()/unBindDomNode() as it still is just the original list (see #9610)
 			dojo.forEach(this.targetNodeIds, this.bindDomNode, this);
 		}
 		var k = dojo.keys, l = this.isLeftToRight();
@@ -9831,9 +10562,9 @@ dojo.declare("dijit.Menu",
 		//		Returns the window reference of the passed iframe
 		// tags:
 		//		private
-		var win = dijit.getDocumentWindow(dijit.Menu._iframeContentDocument(iframe_el)) ||
+		var win = dijit.getDocumentWindow(this._iframeContentDocument(iframe_el)) ||
 			// Moz. TODO: is this available when defaultView isn't?
-			dijit.Menu._iframeContentDocument(iframe_el)['__parent__'] ||
+			this._iframeContentDocument(iframe_el)['__parent__'] ||
 			(iframe_el.name && dojo.doc.frames[iframe_el.name]) || null;
 		return win;	//	Window
 	},
@@ -9855,31 +10586,99 @@ dojo.declare("dijit.Menu",
 		//		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);
+		var cn;	// Connect node
+
+		// Support context menus on iframes.   Rather than binding to the iframe itself we need
+		// to bind to the <body> node inside the iframe.
+		if(node.tagName.toLowerCase() == "iframe"){
+			var iframe = node,
+				win = this._iframeContentWindow(iframe);
+			cn = dojo.withGlobal(win, dojo.body);
+		}else{
+			
+			// To capture these events at the top level, attach to <html>, not <body>.
+			// Otherwise right-click context menu just doesn't work.
+			cn = (node == dojo.body() ? dojo.doc.documentElement : node);
 		}
 
-		// 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")
-		]);
-	},
+		// "binding" is the object to track our connection to the node (ie, the parameter to bindDomNode())
+		var binding = {
+			node: node,
+			iframe: iframe
+		};
+
+		// Save info about binding in _bindings[], and make node itself record index(+1) into
+		// _bindings[] array.   Prefix w/_dijitMenu to avoid setting an attribute that may
+		// start with a number, which fails on FF/safari.
+		dojo.attr(node, "_dijitMenu" + this.id, this._bindings.push(binding));
+
+		// Setup the connections to monitor click etc., unless we are connecting to an iframe which hasn't finished
+		// loading yet, in which case we need to wait for the onload event first, and then connect
+		var doConnects = dojo.hitch(this, function(cn){
+			return [
+				dojo.connect(cn, (this.leftClickToOpen)?"onclick":"oncontextmenu", this, function(evt){
+					this._openMyself(evt, cn, iframe);
+				}),
+				dojo.connect(cn, "onkeydown", this, "_contextKey"),
+				dojo.connect(cn, "onmousedown", this, "_contextMouse")
+			];
+		});
+		binding.connects = cn ? doConnects(cn) : [];
+
+		if(iframe){
+			// Setup handler to [re]bind to the iframe when the contents are initially loaded,
+			// and every time the contents change.
+			// Need to do this b/c we are actually binding to the iframe's <body> node.
+			// Note: can't use dojo.connect(), see #9609.
+
+			binding.onloadHandler = dojo.hitch(this, function(){
+				// want to remove old connections, but IE throws exceptions when trying to
+				// access the <body> node because it's already gone, or at least in a state of limbo
+
+				var win = this._iframeContentWindow(iframe);
+					cn = dojo.withGlobal(win, dojo.body);
+				binding.connects = doConnects(cn);
+			});
+			if(iframe.addEventListener){
+				iframe.addEventListener("load", binding.onloadHandler, false);
+			}else{
+				iframe.attachEvent("onload", binding.onloadHandler);
+			}
+		}
+	},
 
 	unBindDomNode: function(/*String|DomNode*/ nodeName){
 		// summary:
 		//		Detach menu from given node
-		var node = dojo.byId(nodeName);
-		if(node){
-			var bid = node[this.id]-1, b = this._bindings[bid];
-			dojo.forEach(b, dojo.disconnect);
+
+		var node;
+		try{
+			node = dojo.byId(nodeName);
+		}catch(e){
+			// On IE the dojo.byId() call will get an exception if the attach point was
+			// the <body> node of an <iframe> that has since been reloaded (and thus the
+			// <body> node is in a limbo state of destruction.
+			return;
+		}
+
+		// node["_dijitMenu" + this.id] contains index(+1) into my _bindings[] array
+		var attrName = "_dijitMenu" + this.id;
+		if(node && dojo.hasAttr(node, attrName)){
+			var bid = dojo.attr(node, attrName)-1, b = this._bindings[bid];
+			dojo.forEach(b.connects, dojo.disconnect);
+
+			// Remove listener for iframe onload events
+			var iframe = b.iframe;
+			if(iframe){
+				if(iframe.removeEventListener){
+					iframe.removeEventListener("load", b.onloadHandler, false);
+				}else{
+					iframe.detachEvent("onload", b.onloadHandler);
+				}
+			}
+
+			dojo.removeAttr(node, attrName);
 			delete this._bindings[bid];
 		}
 	},
@@ -9892,7 +10691,7 @@ dojo.declare("dijit.Menu",
 		this._contextMenuWithMouse = false;
 		if(e.keyCode == dojo.keys.F10){
 			dojo.stopEvent(e);
-			if(e.shiftKey && e.type=="keydown"){
+			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.
@@ -9914,20 +10713,25 @@ dojo.declare("dijit.Menu",
 		this._contextMenuWithMouse = true;
 	},
 
-	_openMyself: function(/*Event*/ e){
+	_openMyself: function(/*Event*/ e, /*DomNode?*/ node, /*DomNode?*/ iframe){
 		// summary:
 		//		Internal function for opening myself when the user
-		//		does a right-click or something similar
+		//		does a right-click or something similar.
+		// node:
+		//		The node that is being clicked
+		// iframe:
+		//		If an <iframe> is being clicked, iframe points to that iframe and node
+		//		points to the iframe's body.
 		// tags:
 		//		private
 
-		if(this.leftClickToOpen&&e.button>0){
+		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
+		// 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
@@ -9936,9 +10740,25 @@ dojo.declare("dijit.Menu",
 		if(dojo.isSafari || this._contextMenuWithMouse){
 			x=e.pageX;
 			y=e.pageY;
+
+			if(iframe){
+				// Event is on <body> node of an <iframe>, convert coordinates to match main document
+				var od = e.target.ownerDocument,
+					ifc = dojo.position(iframe, true),
+					win = this._iframeContentWindow(iframe),
+					scroll = dojo.withGlobal(win, "_docScroll", dojo);
+
+				var cs = dojo.getComputedStyle(iframe),
+					tp = dojo._toPixelValue,
+					left = (dojo.isIE && dojo.isQuirks ? 0 : tp(iframe, cs.paddingLeft)) + (dojo.isIE && dojo.isQuirks ? tp(iframe, cs.borderLeftWidth) : 0),
+					top = (dojo.isIE && dojo.isQuirks ? 0 : tp(iframe, cs.paddingTop)) + (dojo.isIE && dojo.isQuirks ? tp(iframe, cs.borderTopWidth) : 0);
+
+				x += ifc.x + left - scroll.x;
+				y += ifc.y + top - scroll.y;
+			}
 		}else{
 			// otherwise open near e.target
-			var coords = dojo.coords(e.target, true);
+			var coords = dojo.position(e.target, true);
 			x = coords.x + 10;
 			y = coords.y + 10;
 		}
@@ -9947,7 +10767,9 @@ dojo.declare("dijit.Menu",
 		var savedFocus = dijit.getFocus(this);
 		function closeAndRestoreFocus(){
 			// user has clicked on a menu or popup
-			dijit.focus(savedFocus);
+			if(self.refocus){
+				dijit.focus(savedFocus);
+			}
 			dijit.popup.close(self);
 		}
 		dijit.popup.open({
@@ -9971,7 +10793,7 @@ dojo.declare("dijit.Menu",
 	},
 
 	uninitialize: function(){
- 		dojo.forEach(this.targetNodeIds, this.unBindDomNode, this);
+ 		dojo.forEach(this._bindings, function(b){ if(b){ this.unBindDomNode(b.node); } }, this);
  		this.inherited(arguments);
 	}
 }
@@ -9996,7 +10818,7 @@ dojo.declare("dijit.MenuBar", dijit._MenuBase, {
 	// summary:
 	//		A menu bar, listing menu choices horizontally, like the "File" menu in most desktop applications
 
-	templateString:"<div class=\"dijitMenuBar dijitMenuPassive\" dojoAttachPoint=\"containerNode\"  waiRole=\"menubar\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress: _onKeyPress\"></div>\n",
+	templateString: dojo.cache("dijit", "templates/MenuBar.html", "<div class=\"dijitMenuBar dijitMenuPassive\" dojoAttachPoint=\"containerNode\"  waiRole=\"menubar\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress: _onKeyPress\"></div>\n"),
 
 	// _isMenuBar: [protected] Boolean
 	//		This is a MenuBar widget, not a (vertical) Menu widget.
@@ -10022,16 +10844,16 @@ dojo.declare("dijit.MenuBar", dijit._MenuBase, {
 
 	focusChild: function(item){
 		// overload focusChild so that whenever the focus is moved to a new item,
-		// check the previous focused whether it has its popup open, if so, after 
+		// check the previous focused whether it has its popup open, if so, after
 		// focusing the new item, open its submenu immediately
-		var from_item = this.focusedChild,
-			showpopup = from_item && from_item.popup && from_item.popup.isShowingNow;
+		var prev_item = this.focusedChild,
+			showpopup = prev_item && prev_item.popup && prev_item.popup.isShowingNow;
 		this.inherited(arguments);
-		if(showpopup && !item.disabled){
+		if(showpopup && item.popup && !item.disabled){
 			this._openPopup();		// TODO: on down arrow, _openPopup() is called here and in onItemClick()
 		}
 	},
-	
+
 	_onKeyPress: function(/*Event*/ evt){
 		// summary:
 		//		Handle keyboard based menu navigation.
@@ -10045,6 +10867,18 @@ dojo.declare("dijit.MenuBar", dijit._MenuBase, {
 				this._moveToPopup(evt);
 				dojo.stopEvent(evt);
 		}
+	},
+
+	onItemClick: function(/*dijit._Widget*/ item, /*Event*/ evt){
+		// summary:
+		//		Handle clicks on an item. Cancels a dropdown if already open.
+		// tags:
+		//		private
+		if(item.popup && item.popup.isShowingNow){
+			item.popup.onCancel();
+		}else{
+			this.inherited(arguments);
+		}
 	}
 });
 
@@ -10057,7 +10891,7 @@ dojo.provide("dijit.MenuBarItem");
 
 
 dojo.declare("dijit._MenuBarItemMixin", null, {
-	templateString:"<div class=\"dijitReset dijitInline dijitMenuItem dijitMenuItemLabel\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitem\" tabIndex=\"-1\"'\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<span dojoAttachPoint=\"containerNode\"></span>\n</div>\n",
+	templateString: dojo.cache("dijit", "templates/MenuBarItem.html", "<div class=\"dijitReset dijitInline dijitMenuItem dijitMenuItemLabel\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitem\" tabIndex=\"-1\"'\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<span dojoAttachPoint=\"containerNode\"></span>\n</div>\n"),
 
 	// overriding attributeMap because we don't have icon
 	attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
@@ -10068,7 +10902,7 @@ dojo.declare("dijit._MenuBarItemMixin", null, {
 dojo.declare("dijit.MenuBarItem", [dijit.MenuItem, dijit._MenuBarItemMixin], {
 	// summary:
 	//		Item in a MenuBar that's clickable, and doesn't spawn a submenu when pressed (or hovered)
-		
+
 });
 
 }
@@ -10175,28 +11009,23 @@ dojo.number = {
 dojo.number.__FormatOptions = function(){
 	//	pattern: String?
 	//		override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
-	//		with this string
+	//		with this string.  Default value is based on locale.  Overriding this property will defeat
+	//		localization.
 	//	type: String?
 	//		choose a format type based on the locale from the following:
-	//		decimal, scientific, percent, currency. decimal by default.
+	//		decimal, scientific (not yet supported), percent, currency. decimal by default.
 	//	places: Number?
 	//		fixed number of decimal places to show.  This overrides any
 	//		information in the provided pattern.
 	//	round: Number?
 	//		5 rounds to nearest .5; 0 rounds to nearest whole (default). -1
 	//		means do not round.
-	//	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;
 }
 =====*/
@@ -10322,7 +11151,7 @@ dojo.number.__FormatAbsoluteOptions = function(){
 	//		the decimal separator
 	//	group: String?
 	//		the group separator
-	//	places: Integer?|String?
+	//	places: Number?|String?
 	//		number of decimal places.  the range "n,m" will format to m places.
 	//	round: Number?
 	//		5 rounds to nearest .5; 0 rounds to nearest whole (default). -1
@@ -10420,15 +11249,17 @@ dojo.number._formatAbsolute = function(/*Number*/value, /*String*/pattern, /*doj
 /*=====
 dojo.number.__RegexpOptions = function(){
 	//	pattern: String?
-	//		override pattern with this string.  Default is provided based on
-	//		locale.
+	//		override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
+	//		with this string.  Default value is based on locale.  Overriding this property will defeat
+	//		localization.
 	//	type: String?
 	//		choose a format type based on the locale from the following:
-	//		decimal, scientific, percent, currency. decimal by default.
+	//		decimal, scientific (not yet supported), percent, currency. decimal by default.
 	//	locale: String?
 	//		override the locale used to determine formatting rules
 	//	strict: Boolean?
-	//		strict parsing, false by default
+	//		strict parsing, false by default.  Strict parsing requires input as produced by the format() method.
+	//		Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators
 	//	places: Number|String?
 	//		number of decimal places to accept: Infinity, a positive number, or
 	//		a range "n,m".  Defined by pattern or Infinity if pattern not provided.
@@ -10529,23 +11360,22 @@ dojo.number._parseInfo = function(/*Object?*/options){
 
 /*=====
 dojo.number.__ParseOptions = function(){
-	//	pattern: String
-	//		override pattern with this string.  Default is provided based on
-	//		locale.
+	//	pattern: String?
+	//		override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns)
+	//		with this string.  Default value is based on locale.  Overriding this property will defeat
+	//		localization.
 	//	type: String?
 	//		choose a format type based on the locale from the following:
-	//		decimal, scientific, percent, currency. decimal by default.
-	//	locale: String
+	//		decimal, scientific (not yet supported), percent, currency. decimal by default.
+	//	locale: String?
 	//		override the locale used to determine formatting rules
 	//	strict: Boolean?
-	//		strict parsing, false by default
-	//	currency: Object
-	//		object with currency information
+	//		strict parsing, false by default.  Strict parsing requires input as produced by the format() method.
+	//		Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators
 	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){
@@ -10592,14 +11422,14 @@ dojo.number.__RealNumberRegexpFlags = function(){
 	//	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?
+	//	fractional: Boolean?|Array?
+	//		Whether decimal places are used.  Can be true, false, or [true,
+	//		false].  Default is [true, false] which means optional.
+	//	exponent: Boolean?|Array?
 	//		Express in exponential notation.  Can be true, false, or [true,
 	//		false]. Default is [true, false], (i.e. will match if the
 	//		exponential part is present are not).
-	//	eSigned: Boolean|Array?
+	//	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
@@ -10773,7 +11603,12 @@ dojo.declare("dijit.ProgressBar", [dijit._Widget, dijit._Templated], {
 	// 		If true: show that a process is underway but that the amount completed 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\"> </span\n\t></div\n\t><div dojoAttachPoint=\"label\" class=\"dijitProgressBarLabel\" id=\"${id}_label\"> </div\n\t><img dojoAttachPoint=\"indeterminateHighContrastImage\" class=\"dijitProgressBarIndeterminat [...]
+	// name: String
+	//		this is the field name (for a form) if set. This needs to be set if you want to use
+	//		this widget in a dijit.form.Form widget (such as dijit.Dialog)
+	name: '',
+
+	templateString: dojo.cache("dijit", "templates/ProgressBar.html", "<div class=\"dijitProgressBar dijitProgressBarEmpty\"\n\t><div waiRole=\"progressbar\" dojoAttachPoint=\"internalProgress\" class=\"dijitProgressBarFull\"\n\t\t><div class=\"dijitProgressBarTile\"></div\n\t\t><span style=\"visibility:hidden\"> </span\n\t></div\n\t><div dojoAttachPoint=\"label\" class=\"dijitProgressBarLabel\" id=\"${id}_label\"> </div\n\t><img dojoAttachPoint=\"indeterminateHighContrastImage\"  [...]
 
 	// _indeterminateHighContrastImagePath: [private] dojo._URL
 	//		URL to image to use for indeterminate progress bar when display is in high contrast mode
@@ -10784,7 +11619,7 @@ dojo.declare("dijit.ProgressBar", [dijit._Widget, dijit._Templated], {
 	postCreate: function(){
 		this.inherited(arguments);
 		this.indeterminateHighContrastImage.setAttribute("src",
-			this._indeterminateHighContrastImagePath);
+			this._indeterminateHighContrastImagePath.toString());
 		this.update();
 	},
 
@@ -10831,6 +11666,18 @@ dojo.declare("dijit.ProgressBar", [dijit._Widget, dijit._Templated], {
 		this.onChange();
 	},
 
+	_setValueAttr: function(v){
+		if(v == Infinity){
+			this.update({indeterminate:true});
+		}else{
+			this.update({indeterminate:false, progress:v});
+		}
+	},
+
+	_getValueAttr: function(){
+		return this.progress;
+	},
+
 	report: function(/*float*/percent){
 		// summary:
 		//		Generates message to show inside progress bar (normally indicating amount of task completed).
@@ -10868,9 +11715,9 @@ dojo.declare(
 	//		A pane with a title on top, that can be expanded or collapsed.
 	//
 	// description:
-	//		An accessible container with a Title Heading, and a content
-	//		section that slides open and closed. TitlePane is an extension to 
-	//		`dijit.layout.ContentPane`, providing all the usesful content-control aspects from it.
+	//		An accessible container with a title Heading, and a content
+	//		section that slides open and closed. TitlePane is an extension to
+	//		`dijit.layout.ContentPane`, providing all the useful content-control aspects from it.
 	//
 	// example:
 	// | 	// load a TitlePane from remote file:
@@ -10880,7 +11727,7 @@ dojo.declare(
 	// 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">
@@ -10895,18 +11742,29 @@ dojo.declare(
 	//		Whether pane is opened or closed.
 	open: true,
 
+	// toggleable: Boolean
+	//		Whether pane can be opened or closed by clicking the title bar.
+	toggleable: true,
+
+	// tabIndex: String
+	//		Tabindex setting for the title (so users can tab to the title then
+	//		use space/enter to open/close the title pane)
+	tabIndex: "0",
+
 	// duration: Integer
 	//		Time in milliseconds to fade in/fade out
 	duration: dijit.defaultDuration,
 
 	// baseClass: [protected] String
-	//		The root className to use for the various states of this widget
+	//		The root className to be placed on this widget's domNode.
 	baseClass: "dijitTitlePane",
 
-	templateString:"<div class=\"${baseClass}\">\n\t<div dojoAttachEvent=\"onclick:toggle, onkeypress:_onTitleKey, onfocus:_handleFocus, onblur:_handleFocus, onmouseenter:_onTitleEnter, onmouseleave:_onTitleLeave\" tabindex=\"0\"\n\t\t\twaiRole=\"button\" class=\"dijitTitlePaneTitle\" dojoAttachPoint=\"titleBarNode,focusNode\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"arrowNode\" class=\"dijitArrowNode\" waiRole=\"presentation\"\n\t\t><span dojoAttachPoint=\"arrowNodeInner\ [...]
+	templateString: dojo.cache("dijit", "templates/TitlePane.html", "<div class=\"${baseClass}\">\n\t<div dojoAttachEvent=\"onclick:_onTitleClick, onkeypress:_onTitleKey, onfocus:_handleFocus, onblur:_handleFocus, onmouseenter:_onTitleEnter, onmouseleave:_onTitleLeave\"\n\t\t\tclass=\"dijitTitlePaneTitle\" dojoAttachPoint=\"titleBarNode,focusNode\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"arrowNode\" class=\"dijitArrowNode\" waiRole=\"presentation\"\n\t\t><span dojoAttachP [...]
 
 	attributeMap: dojo.delegate(dijit.layout.ContentPane.prototype.attributeMap, {
-		title: { node: "titleNode", type: "innerHTML" }
+		title: { node: "titleNode", type: "innerHTML" },
+		tooltip: {node: "focusNode", type: "attribute", attribute: "title"},	// focusNode spans the entire width, titleNode doesn't
+		id:""
 	}),
 
 	postCreate: function(){
@@ -10915,8 +11773,8 @@ dojo.declare(
 		}
 		this._setCss();
 		dojo.setSelectable(this.titleNode, false);
-		dijit.setWaiState(this.containerNode, "labelledby", this.titleNode.id);
-		dijit.setWaiState(this.focusNode, "haspopup", "true");
+		dijit.setWaiState(this.containerNode,"hidden", this.open ? "false" : "true");
+		dijit.setWaiState(this.focusNode, "pressed", this.open ? "true" : "false");
 
 		// setup open/close animations
 		var hideNode = this.hideNode, wipeNode = this.wipeNode;
@@ -10945,6 +11803,21 @@ dojo.declare(
 		if(this.open !== open){ this.toggle(); }
 	},
 
+	_setToggleableAttr: function(/* Boolean */ canToggle){
+		// summary:
+		//		Hook to make attr("canToggle", boolean) work.
+		// canToggle: Boolean
+		//		True to allow user to open/close pane by clicking title bar.
+		this.toggleable = canToggle;
+		dijit.setWaiRole(this.focusNode, canToggle ? "button" : "heading");
+		dojo.attr(this.focusNode, "tabIndex", canToggle ? this.tabIndex : "-1");
+		if(canToggle){
+			// TODO: if canToggle is switched from true false shouldn't we remove this setting?
+			dijit.setWaiState(this.focusNode, "controls", this.id+"_pane");
+		}
+		this._setCss();
+	},
+
 	_setContentAttr: function(content){
 		// summary:
 		//		Hook to make attr("content", ...) work.
@@ -10992,10 +11865,16 @@ dojo.declare(
 			this.hideNode.style.display = this.open ? "" : "none";
 		}
 		this.open =! this.open;
+		dijit.setWaiState(this.containerNode, "hidden", this.open ? "false" : "true");
+		dijit.setWaiState(this.focusNode, "pressed", this.open ? "true" : "false");
 
 		// load content (if this is the first time we are opening the TitlePane
 		// and content is specified as an href, or href was set when hidden)
-		this._onShow();
+		if(this.open){
+			this._onShow();
+		}else{
+			this.onHide();
+		}
 
 		this._setCss();
 	},
@@ -11006,13 +11885,13 @@ dojo.declare(
 		// tags:
 		//		private
 
-		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
+		if(this._titleBarClass){
+			dojo.removeClass(node, this._titleBarClass);
+		}
+		this._titleBarClass = "dijit" + (this.toggleable ? "" : "Fixed") + (this.open ? "Open" : "Closed");
+		dojo.addClass(node, this._titleBarClass);
 		this.arrowNodeInner.innerHTML = this.open ? "-" : "+";
 	},
 
@@ -11023,19 +11902,24 @@ dojo.declare(
 		//		private
 
 		if(e.charOrCode == dojo.keys.ENTER || e.charOrCode == ' '){
-			this.toggle();
+			if(this.toggleable){
+				this.toggle();
+			}
+			dojo.stopEvent(e);
 		}else if(e.charOrCode == dojo.keys.DOWN_ARROW && this.open){
 			this.containerNode.focus();
 			e.preventDefault();
 	 	}
 	},
-	
+
 	_onTitleEnter: function(){
 		// summary:
 		//		Handler for when someone hovers over my title
 		// tags:
 		//		private
-		dojo.addClass(this.focusNode, "dijitTitlePaneTitle-hover");
+		if(this.toggleable){
+			dojo.addClass(this.focusNode, "dijitTitlePaneTitle-hover");
+		}
 	},
 
 	_onTitleLeave: function(){
@@ -11043,17 +11927,28 @@ dojo.declare(
 		//		Handler when someone stops hovering over my title
 		// tags:
 		//		private
-		dojo.removeClass(this.focusNode, "dijitTitlePaneTitle-hover");
+		if(this.toggleable){
+			dojo.removeClass(this.focusNode, "dijitTitlePaneTitle-hover");
+		}
+	},
+
+	_onTitleClick: function(){
+		// summary:
+		//		Handler when user clicks the title bar
+		// tags:
+		//		private
+		if(this.toggleable){
+			this.toggle();
+		}
 	},
 
 	_handleFocus: function(/*Event*/ e){
 		// summary:
-		//		Handle blur and focus for this widget
+		//		Handle blur and focus events on title bar
 		// tags:
 		//		private
-		
-		// add/removeClass is safe to call without hasClass in this case
-		dojo[(e.type == "focus" ? "addClass" : "removeClass")](this.focusNode, this.baseClass + "Focused");
+
+		dojo.toggleClass(this.focusNode, this.baseClass + "Focused", e.type == "focus");
 	},
 
 	setTitle: function(/*String*/ title){
@@ -11062,7 +11957,7 @@ dojo.declare(
 		// tags:
 		//		deprecated
 		dojo.deprecated("dijit.TitlePane.setTitle() is deprecated.  Use attr('title', ...) instead.", "", "2.0");
-		this.titleNode.innerHTML = title;
+		this.attr("title", title);
 	}
 });
 
@@ -11091,7 +11986,7 @@ dojo.declare(
 		//		Milliseconds to fade in/fade out
 		duration: dijit.defaultDuration,
 
-		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",
+		templateString: dojo.cache("dijit", "templates/Tooltip.html", "<div class=\"dijitTooltip dijitTooltipLeft\" id=\"dojoTooltip\">\n\t<div class=\"dijitTooltipContainer dijitTooltipContents\" dojoAttachPoint=\"containerNode\" waiRole='alert'></div>\n\t<div class=\"dijitTooltipConnector\"></div>\n</div>\n"),
 
 		postCreate: function(){
 			dojo.body().appendChild(this.domNode);
@@ -11124,31 +12019,7 @@ dojo.declare(
 			// 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"));
+			var pos = dijit.placeOnScreenAroundElement(this.domNode, aroundNode, dijit.getPopupAroundAlignment((position && position.length) ? position : dijit.Tooltip.defaultPosition, this.isLeftToRight()), dojo.hitch(this, "orient"));
 
 			// show it
 			dojo.style(this.domNode, "opacity", 0);
@@ -11241,7 +12112,7 @@ dojo.declare(
 	"dijit.Tooltip",
 	dijit._Widget,
 	{
-		// summary
+		// summary:
 		//		Pops up a tooltip (a help message) when you hover over a node.
 
 		// label: String
@@ -11268,34 +12139,72 @@ dojo.declare(
 		//		See description of `dijit.Tooltip.defaultPosition` for details on position parameter.
 		position: [],
 
-		_setConnectIdAttr: function(ids){
-			// TODO: erase old conections
+		constructor: function(){
+			// Map id's of nodes I'm connected to to a list of the this.connect() handles
+			this._nodeConnectionsById = {};
+		},
 
-			this._connectNodes = [];
+		_setConnectIdAttr: function(newIds){
+			for(var oldId in this._nodeConnectionsById){
+				this.removeTarget(oldId);
+			}
+			dojo.forEach(dojo.isArrayLike(newIds) ? newIds : [newIds], this.addTarget, this);
+		},
 
-			// TODO: rename connectId to connectIds for 2.0, and remove this code converting from string to array
-			this.connectId = dojo.isArrayLike(ids) ? ids : [ids];
-			
-			dojo.forEach(this.connectId, function(id) {
-				var node = dojo.byId(id);
-				if (node) {
-					this._connectNodes.push(node);
-					dojo.forEach(["onMouseEnter", "onMouseLeave", "onFocus", "onBlur"], function(event){
-						this.connect(node, event.toLowerCase(), "_"+event);
-					}, this);
-					if(dojo.isIE){
-						// BiDi workaround
-						node.style.zoom = 1;
-					}
-				}
-			}, this);
+		_getConnectIdAttr: function(){
+			var ary = [];
+			for(var id in this._nodeConnectionsById){
+				ary.push(id);
+			}
+			return ary;
+		},
+
+		addTarget: function(/*DOMNODE || String*/ id){
+			// summary:
+			//		Attach tooltip to specified node, if it's not already connected
+			var node = dojo.byId(id);
+			if(!node){ return; }
+			if(node.id in this._nodeConnectionsById){ return; }//Already connected
+
+			this._nodeConnectionsById[node.id] = [
+				this.connect(node, "onmouseenter", "_onTargetMouseEnter"),
+				this.connect(node, "onmouseleave", "_onTargetMouseLeave"),
+				this.connect(node, "onfocus", "_onTargetFocus"),
+				this.connect(node, "onblur", "_onTargetBlur")
+			];
+			if(dojo.isIE && !node.style.zoom){//preserve zoom
+				// BiDi workaround
+				node.style.zoom = 1;
+			}
 		},
 
-		postCreate: function(){	
+		removeTarget: function(/*DOMNODE || String*/ node){
+			// summary:
+			//		Detach tooltip from specified node
+
+			// map from DOMNode back to plain id string
+			var id = node.id || node;
+
+			if(id in this._nodeConnectionsById){
+				dojo.forEach(this._nodeConnectionsById[id], this.disconnect, this);
+				delete this._nodeConnectionsById[id];
+			}
+		},
+
+		postCreate: function(){
 			dojo.addClass(this.domNode,"dijitTooltipData");
 		},
 
-		_onMouseEnter: function(/*Event*/ e){
+		startup: function(){
+			this.inherited(arguments);
+
+			// If this tooltip was created in a template, or for some other reason the specified connectId[s]
+			// didn't exist during the widget's initialization, then connect now.
+			var ids = this.connectId;
+			dojo.forEach(dojo.isArrayLike(ids) ? ids : [ids], this.addTarget, this);
+		},
+
+		_onTargetMouseEnter: function(/*Event*/ e){
 			// summary:
 			//		Handler for mouseenter event on the target node
 			// tags:
@@ -11303,7 +12212,7 @@ dojo.declare(
 			this._onHover(e);
 		},
 
-		_onMouseLeave: function(/*Event*/ e){
+		_onTargetMouseLeave: function(/*Event*/ e){
 			// summary:
 			//		Handler for mouseleave event on the target node
 			// tags:
@@ -11311,32 +12220,24 @@ dojo.declare(
 			this._onUnHover(e);
 		},
 
-		_onFocus: function(/*Event*/ e){
+		_onTargetFocus: function(/*Event*/ e){
 			// summary:
 			//		Handler for focus event on the target node
 			// tags:
 			//		private
 
-			// TODO: this is dangerously named, as the dijit focus manager calls
-			// _onFocus() on any widget that gets focus (whereas in this class we
-			// are connecting onfocus on the *target* DOM node to this method
-
 			this._focus = true;
 			this._onHover(e);
-			this.inherited(arguments);
 		},
-		
-		_onBlur: function(/*Event*/ e){
+
+		_onTargetBlur: function(/*Event*/ e){
 			// summary:
 			//		Handler for blur event on the target node
 			// tags:
 			//		private
 
-			// TODO: rename; see above comment
-
 			this._focus = false;
 			this._onUnHover(e);
-			this.inherited(arguments);
 		},
 
 		_onHover: function(/*Event*/ e){
@@ -11375,16 +12276,14 @@ dojo.declare(
 			// tags:
 			//		private
 
-			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;
+			this.onShow(target, this.position);
 		},
 
 		close: function(){
@@ -11397,6 +12296,7 @@ dojo.declare(
 				// if tooltip is currently shown
 				dijit.hideTooltip(this._connectNode);
 				delete this._connectNode;
+				this.onHide();
 			}
 			if(this._showTimer){
 				// if tooltip is scheduled to be shown (after a brief delay)
@@ -11405,8 +12305,23 @@ dojo.declare(
 			}
 		},
 
+		onShow: function(target, position){
+			// summary:
+			//		Called when the tooltip is shown
+			// tags:
+			//		callback
+		},
+
+		onHide: function(){
+			// summary:
+			//		Called when the tooltip is hidden
+			// tags:
+			//		callback
+		},
+
 		uninitialize: function(){
 			this.close();
+			this.inherited(arguments);
 		}
 	}
 );
@@ -11434,6 +12349,95 @@ dijit.Tooltip.defaultPosition = ["after", "before"];
 
 }
 
+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;
+	}
+});
+
+}
+
 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");
@@ -11551,11 +12555,21 @@ dojo.declare(
 		//		One or more attribute names (attributes in the dojo.data item) that specify that item's children
 		childrenAttrs: ["children"],
 
+		// newItemIdAttr: String
+		//		Name of attribute in the Object passed to newItem() that specifies the id.
+		//
+		//		If newItemIdAttr is set then it's used when newItem() is called to see if an
+		//		item with the same id already exists, and if so just links to the old item
+		//		(so that the old item ends up with two parents).
+		//
+		//		Setting this to null or "" will make every drop create a new item.
+		newItemIdAttr: "id",
+
 		// labelAttr: String
 		//		If specified, get label for tree node from this attribute, rather
 		//		than by calling store.getLabel()
 		labelAttr: "",
-	 
+
 	 	// root: [readonly] dojo.data.Item
 		//		Pointer to the root item (read only, not a parameter)
 		root: null,
@@ -11568,6 +12582,15 @@ dojo.declare(
 		//	|	{id:'ROOT'}
 		query: null,
 
+		// deferItemLoadingUntilExpand: Boolean
+		//		Setting this to true will cause the TreeStoreModel to defer calling loadItem on nodes
+		// 		until they are expanded. This allows for lazying loading where only one
+		//		loadItem (and generally one network call, consequently) per expansion
+		// 		(rather than one for each child).
+		// 		This relies on partial loading of the children items; each children item of a
+		// 		fully loaded item should contain the label and info about having children.
+		deferItemLoadingUntilExpand: false,
+
 		constructor: function(/* Object */ args){
 			// summary:
 			//		Passed the arguments listed above (store, etc)
@@ -11586,9 +12609,9 @@ dojo.declare(
 			// 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")
+					dojo.connect(store, "onNew", this, "onNewItem"),
+					dojo.connect(store, "onDelete", this, "onDeleteItem"),
+					dojo.connect(store, "onSet", this, "onSetItem")
 				]);
 			}
 		},
@@ -11639,20 +12662,35 @@ dojo.declare(
 			// 		Calls onComplete() with array of child items of given parent item, all loaded.
 
 			var store = this.store;
-
+			if(!store.isItemLoaded(parentItem)){
+				// The parent is not loaded yet, we must be in deferItemLoadingUntilExpand
+				// mode, so we will load it and just return the children (without loading each
+				// child item)
+				var getChildren = dojo.hitch(this, arguments.callee);
+				store.loadItem({
+					item: parentItem,
+					onItem: function(parentItem){
+						getChildren(parentItem, onComplete, onError);
+					},
+					onError: onError
+				});
+				return;
+			}
 			// get children of specified item
 			var childItems = [];
-			for (var i=0; i<this.childrenAttrs.length; i++){
+			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(!this.deferItemLoadingUntilExpand){
+				dojo.forEach(childItems, function(item){ if(!store.isItemLoaded(item)){ _waitCount++; } });
+			}
 
 			if(_waitCount == 0){
-				// all items are already loaded.  proceed...
+				// all items are already loaded (or we aren't loading them).  proceed...
 				onComplete(childItems);
 			}else{
 				// still waiting for some or all of the items to load
@@ -11677,6 +12715,14 @@ dojo.declare(
 		// =======================================================================
 		// Inspecting items
 
+		isItem: function(/* anything */ something){
+			return this.store.isItem(something);	// Boolean
+		},
+
+		fetchItemByIdentity: function(/* object */ keywordArgs){
+			this.store.fetchItemByIdentity(keywordArgs);
+		},
+
 		getIdentity: function(/* item */ item){
 			return this.store.getIdentity(item);	// Object
 		},
@@ -11694,12 +12740,32 @@ dojo.declare(
 		// =======================================================================
 		// Write interface
 
-		newItem: function(/* Object? */ args, /*Item*/ parent){
+		newItem: function(/* dojo.dnd.Item */ args, /*Item*/ parent, /*int?*/ insertIndex){
 			// summary:
 			//		Creates a new item.   See `dojo.data.api.Write` for details on args.
 			//		Used in drag & drop when item from external source dropped onto tree.
-			var pInfo = {parent: parent, attribute: this.childrenAttrs[0]};
-			return this.store.newItem(args, pInfo);
+			// description:
+			//		Developers will need to override this method if new items get added
+			//		to parents with multiple children attributes, in order to define which
+			//		children attribute points to the new item.
+
+			var pInfo = {parent: parent, attribute: this.childrenAttrs[0], insertIndex: insertIndex};
+
+			if(this.newItemIdAttr && args[this.newItemIdAttr]){
+				// Maybe there's already a corresponding item in the store; if so, reuse it.
+				this.fetchItemByIdentity({identity: args[this.newItemIdAttr], scope: this, onItem: function(item){
+					if(item){
+						// There's already a matching item in store, use it
+						this.pasteItem(item, null, parent, true, insertIndex);
+					}else{
+						// Create new item in the tree, based on the drag source.
+						this.store.newItem(args, pInfo);
+					}
+				}});
+			}else{
+				// [as far as we know] there is no id so we must assume this is a new item
+				this.store.newItem(args, pInfo);
+			}
 		},
 
 		pasteItem: function(/*Item*/ childItem, /*Item*/ oldParentItem, /*Item*/ newParentItem, /*Boolean*/ bCopy, /*int?*/ insertIndex){
@@ -11709,7 +12775,7 @@ dojo.declare(
 			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	
+			// remove child from source item, and record the attribute that child occurred in
 			if(oldParentItem){
 				dojo.forEach(this.childrenAttrs, function(attr){
 					if(store.containsValue(oldParentItem, attr, childItem)){
@@ -11739,7 +12805,7 @@ dojo.declare(
 
 		// =======================================================================
 		// Callbacks
-		
+
 		onChange: function(/*dojo.data.Item*/ item){
 			// summary:
 			//		Callback whenever an item has changed, so that Tree
@@ -11768,40 +12834,60 @@ dojo.declare(
 		},
 
 		// =======================================================================
-		///Events from data store
+		// Events from data store
 
-		_onNewItem: function(/* dojo.data.Item */ item, /* Object */ parentInfo){
+		onNewItem: function(/* dojo.data.Item */ item, /* Object */ parentInfo){
 			// summary:
-			//		Handler for when new items appear in the store.
+			//		Handler for when new items appear in the store, either from a drop operation
+			//		or some other way.   Updates the tree view (if necessary).
+			// description:
+			//		If the new item is a child of an existing item,
+			//		calls onChildrenChange() with the new list of children
+			//		for that existing item.
+			//
+			// tags:
+			//		extension
 
-			//	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.
+			// We only care about the new item if it has a parent that corresponds to a TreeNode
+			// we are currently displaying
 			if(!parentInfo){
 				return;
 			}
+
+			// Call onChildrenChange() on parent (ie, existing) item with new list of children
+			// In the common case, the new list of children is simply parentInfo.newValue or
+			// [ parentInfo.newValue ], although if items in the store has multiple
+			// child attributes (see `childrenAttr`), then it's a superset of parentInfo.newValue,
+			// so call getChildren() to be sure to get right answer.
 			this.getChildren(parentInfo.item, dojo.hitch(this, function(children){
-				// NOTE: maybe can be optimized since parentInfo contains the new and old attribute value
 				this.onChildrenChange(parentInfo.item, children);
 			}));
 		},
-		
-		_onDeleteItem: function(/*Object*/ item){
+
+		onDeleteItem: function(/*Object*/ item){
 			// summary:
 			//		Handler for delete notifications from underlying store
 			this.onDelete(item);
 		},
 
-		_onSetItem: function(/* item */ item, 
-						/* attribute-name-string */ attribute, 
+		onSetItem: function(/* item */ item,
+						/* attribute-name-string */ attribute,
 						/* object | array */ oldValue,
 						/* object | array */ newValue){
 			// summary:
-			//		Set data event on an item in the store
-		
+			//		Updates the tree view according to changes in the data store.
+			// description:
+			//		Handles updates to an item's children by calling onChildrenChange(), and
+			//		other updates to an item by calling onChange().
+			//
+			//		See `onNewItem` for more details on handling updates to an item's children.
+			// tags:
+			//		extension
+
 			if(dojo.indexOf(this.childrenAttrs, attribute) != -1){
 				// item's children list changed
 				this.getChildren(item, dojo.hitch(this, function(children){
-					// NOTE: maybe can be optimized since parentInfo contains the new and old attribute value
+					// See comments in onNewItem() about calling getChildren()
 					this.onChildrenChange(item, children);
 				}));
 			}else{
@@ -11905,6 +12991,21 @@ dojo.declare("dijit.tree.ForestStoreModel", dijit.tree.TreeStoreModel, {
 	// =======================================================================
 	// Inspecting items
 
+	isItem: function(/* anything */ something){
+		return (something === this.root) ? true : this.inherited(arguments);
+	},
+
+	fetchItemByIdentity: function(/* object */ keywordArgs){
+		if(keywordArgs.identity == this.root.id){
+			var scope = keywordArgs.scope?keywordArgs.scope:dojo.global;
+			if(keywordArgs.onItem){
+				keywordArgs.onItem.call(scope, this.root);
+			}
+		}else{
+			this.inherited(arguments);
+		}
+	},
+
 	getIdentity: function(/* item */ item){
 		return (item === this.root) ? this.root.id : this.inherited(arguments);
 	},
@@ -11916,18 +13017,18 @@ dojo.declare("dijit.tree.ForestStoreModel", dijit.tree.TreeStoreModel, {
 	// =======================================================================
 	// Write interface
 
-	newItem: function(/* Object? */ args, /*Item*/ parent){
+	newItem: function(/* dojo.dnd.Item */ args, /*Item*/ parent, /*int?*/ insertIndex){
 		// summary:
 		//		Creates a new item.   See dojo.data.api.Write for details on args.
 		//		Used in drag & drop when item from external source dropped onto tree.
-		if(parent===this.root){
+		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
@@ -11962,7 +13063,7 @@ dojo.declare("dijit.tree.ForestStoreModel", dijit.tree.TreeStoreModel, {
 
 	// =======================================================================
 	// Handling for top level children
-	
+
 	onAddToRoot: function(/* item */ item){
 		// summary:
 		//		Called when item added to root of tree; user must override this method
@@ -11971,7 +13072,7 @@ dojo.declare("dijit.tree.ForestStoreModel", dijit.tree.TreeStoreModel, {
 		//	|	store.setValue(item, "root", true);
 		// tags:
 		//		extension
-		
+		console.log(this, ": item ", item, " added to root");
 	},
 
 	onLeaveRoot: function(/* item */ item){
@@ -11982,9 +13083,9 @@ dojo.declare("dijit.tree.ForestStoreModel", dijit.tree.TreeStoreModel, {
 		// 	|	store.unsetAttribute(item, "root");
 		// tags:
 		//		extension
-		
+		console.log(this, ": item ", item, " removed from root");
 	},
-	
+
 	// =======================================================================
 	// Events from data store
 
@@ -11997,7 +13098,7 @@ dojo.declare("dijit.tree.ForestStoreModel", dijit.tree.TreeStoreModel, {
 			onComplete: dojo.hitch(this, function(newChildren){
 				this.root.children = newChildren;
 
-				// If the list of children or the order of children has changed...	
+				// 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);
@@ -12006,20 +13107,27 @@ dojo.declare("dijit.tree.ForestStoreModel", dijit.tree.TreeStoreModel, {
 		});
 	},
 
-	_onNewItem: function(/* dojo.data.Item */ item, /* Object */ parentInfo){
+	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.
+		//		Handler for when new items appear in the store.  Developers should override this
+		//		method to be more efficient based on their app/data.
+		// description:
+		//		Note that the default implementation requeries the top level items every time
+		//		a new item is created, since any new item could be a top level item (even in
+		//		addition to being a child of another item, since items can have multiple parents).
+		//
+		//		Developers can override this function to do something more efficient if they can
+		//		detect which items are possible top level items (based on the item and the
+		//		parentInfo parameters).  Often all top level items have parentInfo==null, but
+		//		that will depend on which store you use and what your data is like.
+		// tags:
+		//		extension
 		this._requeryTop();
 
 		this.inherited(arguments);
 	},
 
-	_onDeleteItem: function(/*Object*/ item){
+	onDeleteItem: function(/*Object*/ item){
 		// summary:
 		//		Handler for delete notifications from underlying store
 
@@ -12049,6 +13157,7 @@ dojo.provide("dijit.Tree");
 
 
 
+
 dojo.declare(
 	"dijit._TreeNode",
 	[dijit._Widget, dijit._Templated, dijit._Container, dijit._Contained],
@@ -12061,7 +13170,7 @@ dojo.declare(
 
 	// item: dojo.data.Item
 	//		the dojo.data entry this tree represents
-	item: null,	
+	item: null,
 
 	// isTreeNode: [protected] Boolean
 	//		Indicates that this is a TreeNode.   Used by `dijit.Tree` only,
@@ -12083,15 +13192,17 @@ dojo.declare(
 	// state: [private] String
 	//		Dynamic loading-related stuff.
 	//		When an empty folder node appears, it is "UNCHECKED" first,
-	//		then after dojo.data query it becomes "LOADING" and, finally "LOADED"	
+	//		then after dojo.data query it becomes "LOADING" and, finally "LOADED"
 	state: "UNCHECKED",
-	
-	templateString:"<div class=\"dijitTreeNode\" waiRole=\"presentation\"\n\t><div dojoAttachPoint=\"rowNode\" class=\"dijitTreeRow\" waiRole=\"presentation\" dojoAttachEvent=\"onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave\"\n\t\t><img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"expandoNode\" class=\"dijitTreeExpando\" waiRole=\"presentation\"\n\t\t><span dojoAttachPoint=\"expandoNodeText\" class=\"dijitExpandoText\" waiRole=\"presentation\"\n\t\t></span\n\t\t><span dojoAttachP [...]
 
-	postCreate: function(){
-		// set label, escaping special characters
-		this.setLabelNode(this.label);
+	templateString: dojo.cache("dijit", "templates/TreeNode.html", "<div class=\"dijitTreeNode\" waiRole=\"presentation\"\n\t><div dojoAttachPoint=\"rowNode\" class=\"dijitTreeRow\" waiRole=\"presentation\" dojoAttachEvent=\"onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_onDblClick\"\n\t\t><img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"expandoNode\" class=\"dijitTreeExpando\" waiRole=\"presentation\"\n\t\t><span dojoAttachPoint=\"expandoNodeText\ [...]
 
+	attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
+		label: {node: "labelNode", type: "innerText"},
+		tooltip: {node: "rowNode", type: "attribute", attribute: "title"}
+	}),
+
+	postCreate: function(){
 		// set expand icon for leaf
 		this._setExpando();
 
@@ -12100,10 +13211,7 @@ dojo.declare(
 
 		if(this.isExpandable){
 			dijit.setWaiState(this.labelNode, "expanded", this.isExpanded);
-			if(this == this.tree.rootNode){
-				dijit.setWaitState(this.tree.domNode, "expanded", this.isExpanded);
-			}
-		}		
+		}
 	},
 
 	_setIndentAttr: function(indent){
@@ -12115,15 +13223,14 @@ dojo.declare(
 		this.indent = indent;
 
 		// Math.max() is to prevent negative padding on hidden root node (when indent == -1)
-		// 19 is the width of the expandoIcon (TODO: get this from CSS instead of hardcoding)
-		var pixels = (Math.max(indent, 0) * 19) + "px";	
+		var pixels = (Math.max(indent, 0) * this.tree._nodePixelIndent) + "px";
 
-		dojo.style(this.domNode, "backgroundPosition",  pixels + " 0px");
+		dojo.style(this.domNode, "backgroundPosition",	pixels + " 0px");
 		dojo.style(this.rowNode, dojo._isBodyLtr() ? "paddingLeft" : "paddingRight", pixels);
- 
+
 		dojo.forEach(this.getChildren(), function(child){
-        	child.attr("indent", indent+1);
-        });
+			child.attr("indent", indent+1);
+		});
 	},
 
 	markProcessing: function(){
@@ -12132,7 +13239,7 @@ dojo.declare(
 		// tags:
 		//		private
 		this.state = "LOADING";
-		this._setExpando(true);	
+		this._setExpando(true);
 	},
 
 	unmarkProcessing: function(){
@@ -12140,7 +13247,7 @@ dojo.declare(
 		//		Clear markup from markProcessing() call
 		// tags:
 		//		private
-		this._setExpando(false);	
+		this._setExpando(false);
 	},
 
 	_updateItemClasses: function(item){
@@ -12154,25 +13261,39 @@ dojo.declare(
 			// For back-compat with 1.0, need to use null to specify root item (TODO: remove in 2.0)
 			item = null;
 		}
+		this._applyClassAndStyle(item, "icon", "Icon");
+		this._applyClassAndStyle(item, "label", "Label");
+		this._applyClassAndStyle(item, "row", "Row");
+	},
 
-		if(this._iconClass){
-			dojo.removeClass(this.iconNode, this._iconClass);
-		}
-		this._iconClass = tree.getIconClass(item, this.isExpanded);
-		if(this._iconClass){
-			dojo.addClass(this.iconNode, this._iconClass);
-		}
-		dojo.style(this.iconNode, tree.getIconStyle(item, this.isExpanded) || {});
+	_applyClassAndStyle: function(item, lower, upper){
+		// summary:
+		//		Set the appropriate CSS classes and styles for labels, icons and rows.
+		//
+		// item:
+		//		The data item.
+		//
+		// lower:
+		//		The lower case attribute to use, e.g. 'icon', 'label' or 'row'.
+		//
+		// upper:
+		//		The upper case attribute to use, e.g. 'Icon', 'Label' or 'Row'.
+		//
+		// tags:
+		//		private
 
-		if(this._labelClass){
-			dojo.removeClass(this.labelNode, this._labelClass);
-		}
-		this._labelClass = tree.getLabelClass(item, this.isExpanded);
-		if(this._labelClass){
-			dojo.addClass(this.labelNode, this._labelClass);
-		}
-		dojo.style(this.labelNode, tree.getLabelStyle(item, this.isExpanded) || {});
-	},
+		var clsName = "_" + lower + "Class";
+		var nodeName = lower + "Node";
+
+		if(this[clsName]){
+			dojo.removeClass(this[nodeName], this[clsName]);
+ 		}
+		this[clsName] = this.tree["get" + upper + "Class"](item, this.isExpanded);
+		if(this[clsName]){
+			dojo.addClass(this[nodeName], this[clsName]);
+ 		}
+		dojo.style(this[nodeName], this.tree["get" + upper + "Style"](item, this.isExpanded) || {});
+ 	},
 
 	_updateLayout: function(){
 		// summary:
@@ -12194,32 +13315,36 @@ dojo.declare(
 		// tags:
 		//		private
 
-		// apply the appropriate class to the expando node
 		var styles = ["dijitTreeExpandoLoading", "dijitTreeExpandoOpened",
-			"dijitTreeExpandoClosed", "dijitTreeExpandoLeaf"];
-		var _a11yStates = ["*","-","+","*"];
-		
-		var idx = processing ? 0 : (this.isExpandable ?	(this.isExpanded ? 1 : 2) : 3);
-		dojo.forEach(styles,
-			function(s){
-				dojo.removeClass(this.expandoNode, s);
-			}, this
-		);
+						"dijitTreeExpandoClosed", "dijitTreeExpandoLeaf"],
+			_a11yStates = ["*","-","+","*"],
+			idx = processing ? 0 : (this.isExpandable ?	(this.isExpanded ? 1 : 2) : 3);
+
+		// apply the appropriate class to the expando node
+		dojo.removeClass(this.expandoNode, styles);
 		dojo.addClass(this.expandoNode, styles[idx]);
 
 		// provide a non-image based indicator for images-off mode
 		this.expandoNodeText.innerHTML = _a11yStates[idx];
 
-	},	
+	},
 
 	expand: function(){
 		// summary:
 		//		Show my children
-		if(this.isExpanded){ return; }
-		// cancel in progress collapse operation
+		// returns:
+		//		Deferred that fires when expansion is complete
+
+		// If there's already an expand in progress or we are already expanded, just return
+		if(this._expandDeferred){
+			return this._expandDeferred;		// dojo.Deferred
+		}
 
+		// cancel in progress collapse operation
 		this._wipeOut && this._wipeOut.stop();
 
+		// All the state information for when a node is expanded, maybe this should be
+		// set when the animation completes instead
 		this.isExpanded = true;
 		dijit.setWaiState(this.labelNode, "expanded", "true");
 		dijit.setWaiRole(this.containerNode, "group");
@@ -12230,12 +13355,23 @@ dojo.declare(
 			dijit.setWaiState(this.tree.domNode, "expanded", "true");
 		}
 
-		if(!this._wipeIn){
-			this._wipeIn = dojo.fx.wipeIn({
-				node: this.containerNode, duration: dijit.defaultDuration
+		var def,
+			wipeIn = dojo.fx.wipeIn({
+				node: this.containerNode, duration: dijit.defaultDuration,
+				onEnd: function(){
+					def.callback(true);
+				}
 			});
-		}
-		this._wipeIn.play();
+
+		// Deferred that fires when expand is complete
+		def = (this._expandDeferred = new dojo.Deferred(function(){
+			// Canceller
+			wipeIn.stop();
+		}));
+
+		wipeIn.play();
+
+		return def;		// dojo.Deferred
 	},
 
 	collapse: function(){
@@ -12245,7 +13381,10 @@ dojo.declare(
 		if(!this.isExpanded){ return; }
 
 		// cancel in progress expand operation
-		this._wipeIn && this._wipeIn.stop();
+		if(this._expandDeferred){
+			this._expandDeferred.cancel();
+			delete this._expandDeferred;
+		}
 
 		this.isExpanded = false;
 		dijit.setWaiState(this.labelNode, "expanded", "false");
@@ -12264,13 +13403,6 @@ dojo.declare(
 		this._wipeOut.play();
 	},
 
-	setLabelNode: function(label){
-		// summary:
-		//		Sets the label
-		this.labelNode.innerHTML = "";
-		this.labelNode.appendChild(dojo.doc.createTextNode(label));
-	},
-
 	// indent: Integer
 	//		Levels from this node to the root node
 	indent: 0,
@@ -12279,9 +13411,16 @@ dojo.declare(
 		// summary:
 		//		Sets the child items of this node, removing/adding nodes
 		//		from current children to match specified items[] array.
+		//		Also, if this.persist == true, expands any children that were previously
+		// 		opened.
+		// returns:
+		//		Deferred object that fires after all previously opened children
+		//		have been expanded again (or fires instantly if there are no such children).
 
 		var tree = this.tree,
-			model = tree.model;
+			model = tree.model,
+			defs = [];	// list of deferreds that need to fire before I am complete
+
 
 		// Orphan all my existing children.
 		// If items contains some of the same items as before then we will reattach them.
@@ -12300,25 +13439,38 @@ dojo.declare(
 			// released
 			dojo.forEach(items, function(item){
 				var id = model.getIdentity(item),
-					existingNode = tree._itemNodeMap[id],
-					node = 
-						( existingNode && !existingNode.getParent() ) ?
-						existingNode :
-						this.tree._createTreeNode({
+					existingNodes = tree._itemNodesMap[id],
+					node;
+				if(existingNodes){
+					for(var i=0;i<existingNodes.length;i++){
+						if(existingNodes[i] && !existingNodes[i].getParent()){
+							node = existingNodes[i];
+							node.attr('indent', this.indent+1);
+							break;
+						}
+					}
+				}
+				if(!node){
+					node = this.tree._createTreeNode({
 							item: item,
 							tree: tree,
 							isExpandable: model.mayHaveChildren(item),
 							label: tree.getLabel(item),
+							tooltip: tree.getTooltip(item),
 							indent: this.indent + 1
 						});
-				if(existingNode){
-					existingNode.attr('indent', this.indent+1);
+					if(existingNodes){
+						existingNodes.push(node);
+					}else{
+						tree._itemNodesMap[id] = [node];
+					}
 				}
 				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._state(item)){
-					tree._expandNode(node);
+
+				// If node was previously opened then open it again now (this may trigger
+				// more data store accesses, recursively)
+				if(this.tree.autoExpand || this.tree._state(item)){
+					defs.push(tree._expandNode(node));
 				}
 			}, this);
 
@@ -12348,12 +13500,14 @@ dojo.declare(
 				tree.domNode.setAttribute("tabIndex", "0");
 			}
 		}
+
+		return new dojo.DeferredList(defs);	// dojo.Deferred
 	},
 
 	removeChild: function(/* treeNode */ node){
 		this.inherited(arguments);
 
-		var children = this.getChildren();		
+		var children = this.getChildren();
 		if(children.length == 0){
 			this.isExpandable = false;
 			this.collapse();
@@ -12365,7 +13519,7 @@ dojo.declare(
 	},
 
 	makeExpandable: function(){
-		//summary:
+		// summary:
 		//		if this node wasn't already showing the expando node,
 		//		turn it into one and call _setExpando()
 
@@ -12400,7 +13554,7 @@ dojo.declare(
 		//		A Tree has a (single) currently selected node.
 		//		Mark that this node is/isn't that currently selected node.
 		// description:
-		//		In particular, setting a node as selected involves setting tabIndex 
+		//		In particular, setting a node as selected involves setting tabIndex
 		//		so that when user tabs to the tree, focus will go to that node (only).
 		var labelNode = this.labelNode;
 		labelNode.setAttribute("tabIndex", selected ? "0" : "-1");
@@ -12408,6 +13562,21 @@ dojo.declare(
 		dojo.toggleClass(this.rowNode, "dijitTreeNodeSelected", selected);
 	},
 
+	_onClick: function(evt){
+		// summary:
+		//		Handler for onclick event on a node
+		// tags:
+		//		private
+		this.tree._onClick(this, evt);
+	},
+	_onDblClick: function(evt){
+		// summary:
+		//		Handler for ondblclick event on a node
+		// tags:
+		//		private
+		this.tree._onDblClick(this, evt);
+	},
+
 	_onMouseEnter: function(evt){
 		// summary:
 		//		Handler for onmouseenter event on a node
@@ -12465,31 +13634,38 @@ dojo.declare(
 	//		One ore more attributes that holds children of a tree node
 	childrenAttr: ["children"],
 
+	// path: String[] or Item[]
+	//		Full path from rootNode to selected node expressed as array of items or array of ids.
+	path: [],
+
+	// selectedItem: [readonly] Item
+	//		The currently selected item in this tree.
+	//		This property can only be set (via attr('selectedItem', ...)) when that item is already
+	//		visible in the tree.   (I.e. the tree has already been expanded to show that node.)
+	//		Should generally use `path` attribute to set the selected item instead.
+	selectedItem: null,
+
 	// openOnClick: Boolean
 	//		If true, clicking a folder node's label will open it, rather than calling onClick()
 	openOnClick: false,
-	
+
 	// openOnDblClick: Boolean
 	//		If true, double-clicking a folder node's label will open it, rather than calling onDblClick()
 	openOnDblClick: false,
 
-	templateString:"<div class=\"dijitTreeContainer\" waiRole=\"tree\"\n\tdojoAttachEvent=\"onclick:_onClick,onkeypress:_onKeyPress,ondblclick:_onDblClick\">\n</div>\n",
-
-	// isExpandable: [private deprecated] Boolean
-	//		TODO: this appears to be vestigal, back from when Tree extended TreeNode.  Remove.
-	isExpandable: true,
-
-	// isTree: [private deprecated] Boolean
-	//		TODO: this appears to be vestigal.  Remove.
-	isTree: true,
+	templateString: dojo.cache("dijit", "templates/Tree.html", "<div class=\"dijitTree dijitTreeContainer\" waiRole=\"tree\"\n\tdojoAttachEvent=\"onkeypress:_onKeyPress\">\n\t<div class=\"dijitInline dijitTreeIndent\" style=\"position: absolute; top: -9999px\" dojoAttachPoint=\"indentDetector\"></div>\n</div>\n"),
 
 	// persist: Boolean
 	//		Enables/disables use of cookies for state saving.
 	persist: true,
-	
+
+	// autoExpand: Boolean
+	//		Fully expand the tree on load.   Overrides `persist`
+	autoExpand: false,
+
 	// dndController: [protected] String
 	//		Class name to use as as the dnd controller.  Specifying this class enables DnD.
-	//		Generally you should specify this as "dijit._tree.dndSource".
+	//		Generally you should specify this as "dijit.tree.dndSource".
 	dndController: null,
 
 	// parameters to pull off of the tree and pass on to the dndController as its params
@@ -12498,17 +13674,41 @@ dojo.declare(
 	//declare the above items so they can be pulled from the tree's markup
 
 	// onDndDrop: [protected] Function
-	//		Parameter to dndController, see `dijit._tree.dndSource.onDndDrop`.
+	//		Parameter to dndController, see `dijit.tree.dndSource.onDndDrop`.
 	//		Generally this doesn't need to be set.
 	onDndDrop: null,
 
-	// itemCreator: [protected] Function
-	//		Parameter to dndController, see `dijit._tree.dndSource.itemCreator`.
-	//		Generally this doesn't need to be set.
+	/*=====
+	itemCreator: function(nodes, target, source){
+		// summary:
+		//		Returns objects passed to `Tree.model.newItem()` based on DnD nodes
+		//		dropped onto the tree.   Developer must override this method to enable
+		// 		dropping from external sources onto this Tree, unless the Tree.model's items
+		//		happen to look like {id: 123, name: "Apple" } with no other attributes.
+		// description:
+		//		For each node in nodes[], which came from source, create a hash of name/value
+		//		pairs to be passed to Tree.model.newItem().  Returns array of those hashes.
+		// nodes: DomNode[]
+		//		The DOMNodes dragged from the source container
+		// target: DomNode
+		//		The target TreeNode.rowNode
+		// source: dojo.dnd.Source
+		//		The source container the nodes were dragged from, perhaps another Tree or a plain dojo.dnd.Source
+		// returns: Object[]
+		//		Array of name/value hashes for each new item to be added to the Tree, like:
+		// |	[
+		// |		{ id: 123, label: "apple", foo: "bar" },
+		// |		{ id: 456, label: "pear", zaz: "bam" }
+		// |	]
+		// tags:
+		//		extension
+		return [{}];
+	},
+	=====*/
 	itemCreator: null,
 
 	// onDndCancel: [protected] Function
-	//		Parameter to dndController, see `dijit._tree.dndSource.onDndCancel`.
+	//		Parameter to dndController, see `dijit.tree.dndSource.onDndCancel`.
 	//		Generally this doesn't need to be set.
 	onDndCancel: null,
 
@@ -12539,7 +13739,7 @@ dojo.declare(
 		// target: DOMNode
 		//		The dijitTreeRoot DOM node inside of the TreeNode that we are dropping on to
 		//		Use dijit.getEnclosingWidget(target) to get the TreeNode.
-		// source: dijit._tree.dndSource
+		// source: dijit.tree.dndSource
 		//		The (set of) nodes we are dropping
 		// position: String
 		//		"over", "before", or "after"
@@ -12549,11 +13749,11 @@ dojo.declare(
 	},
 =====*/
 	checkItemAcceptance: null,
-	
+
 	// dragThreshold: Integer
 	//		Number of pixels mouse moves before it's considered the start of a drag operation
-	dragThreshold: 0,
-	
+	dragThreshold: 5,
+
 	// betweenThreshold: Integer
 	//		Set to a positive value to allow drag and drop "between" nodes.
 	//
@@ -12566,27 +13766,35 @@ dojo.declare(
 	//		the target node's previous sibling rather than the target node's child.
 	betweenThreshold: 0,
 
+	// _nodePixelIndent: Integer
+	//		Number of pixels to indent tree nodes (relative to parent node).
+	//		Default is 19 but can be overridden by setting CSS class dijitTreeIndent
+	//		and calling resize() or startup() on tree after it's in the DOM.
+	_nodePixelIndent: 19,
+
 	_publish: function(/*String*/ topicName, /*Object*/ message){
 		// summary:
 		//		Publish a message for this widget/topic
-		dojo.publish(this.id, [dojo.mixin({tree: this, event: topicName}, message||{})]);
+		dojo.publish(this.id, [dojo.mixin({tree: this, event: topicName}, message || {})]);
 	},
 
 	postMixInProperties: function(){
 		this.tree = this;
 
-		this._itemNodeMap={};
+		this._itemNodesMap={};
 
 		if(!this.cookieName){
 			this.cookieName = this.id + "SaveStateCookie";
 		}
 
-		// TODO: this.inherited(arguments)
+		this._loadDeferred = new dojo.Deferred();
+
+		this.inherited(arguments);
 	},
 
 	postCreate: function(){
 		this._initState();
-		
+
 		// Create glue between store and Tree, if not specified directly by user
 		if(!this.model){
 			this._store2model();
@@ -12604,9 +13812,9 @@ dojo.declare(
 		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++){
+			for(var i=0; i<this.dndParams.length;i++){
 				if(this[this.dndParams[i]]){
 					params[this.dndParams[i]] = this[this.dndParams[i]];
 				}
@@ -12632,42 +13840,60 @@ dojo.declare(
 		if(this.params.mayHaveChildren){
 			modelParams.mayHaveChildren = dojo.hitch(this, "mayHaveChildren");
 		}
-					
+
 		if(this.params.getItemChildren){
 			modelParams.getChildren = dojo.hitch(this, function(item, onComplete, onError){
 				this.getItemChildren((this._v10Compat && item === this.model.root) ? null : item, onComplete, onError);
 			});
 		}
 		this.model = new dijit.tree.ForestStoreModel(modelParams);
-		
+
 		// For backwards compatibility, the visibility of the root node is controlled by
 		// whether or not the user has specified a label
 		this.showRoot = Boolean(this.label);
 	},
 
+	onLoad: function(){
+		// summary:
+		//		Called when tree finishes loading and expanding.
+		// description:
+		//		If persist == true the loading may encompass many levels of fetches
+		//		from the data store, each asynchronous.   Waits for all to finish.
+		// tags:
+		//		callback
+	},
+
 	_load: function(){
 		// summary:
 		//		Initial load of the tree.
 		//		Load root node (possibly hidden) and it's children.
 		this.model.getRoot(
 			dojo.hitch(this, function(item){
-				var rn = this.rootNode = this.tree._createTreeNode({
+				var rn = (this.rootNode = this.tree._createTreeNode({
 					item: item,
 					tree: this,
 					isExpandable: true,
 					label: this.label || this.getLabel(item),
 					indent: this.showRoot ? 0 : -1
-				});
+				}));
 				if(!this.showRoot){
 					rn.rowNode.style.display="none";
 				}
 				this.domNode.appendChild(rn.domNode);
-				this._itemNodeMap[this.model.getIdentity(item)] = rn;
+				var identity = this.model.getIdentity(item);
+				if(this._itemNodesMap[identity]){
+					this._itemNodesMap[identity].push(rn);
+				}else{
+					this._itemNodesMap[identity] = [rn];
+				}
 
 				rn._updateLayout();		// sets "dijitTreeIsRoot" CSS classname
 
-				// load top level children
-				this._expandNode(rn);
+				// load top level children and then fire onLoad() event
+				this._expandNode(rn).addCallback(dojo.hitch(this, function(){
+					this._loadDeferred.callback(true);
+					this.onLoad();
+				}));
 			}),
 			function(err){
 				console.error(this, ": error loading root: ", err);
@@ -12675,6 +13901,113 @@ dojo.declare(
 		);
 	},
 
+	getNodesByItem: function(/*dojo.data.Item or id*/ item){
+		// summary:
+		//		Returns all tree nodes that refer to an item
+		// returns:
+		//		Array of tree nodes that refer to passed item
+
+		if(!item){ return []; }
+		var identity = dojo.isString(item) ? item : this.model.getIdentity(item);
+		// return a copy so widget don't get messed up by changes to returned array
+		return [].concat(this._itemNodesMap[identity]);
+	},
+
+	_setSelectedItemAttr: function(/*dojo.data.Item or id*/ item){
+		// summary:
+		//		Select a tree node related to passed item.
+		//		WARNING: if model use multi-parented items or desired tree node isn't already loaded
+		//		behavior is not granted. Use 'path' attr instead for full support.
+		var oldValue = this.attr("selectedItem");
+		var identity = (!item || dojo.isString(item)) ? item : this.model.getIdentity(item);
+		if(identity == oldValue ? this.model.getIdentity(oldValue) : null){ return; }
+		var nodes = this._itemNodesMap[identity];
+		if(nodes && nodes.length){
+			//select the first item
+			this.focusNode(nodes[0]);
+		}else if(this.lastFocused){
+			// Select none so deselect current
+			this.lastFocused.setSelected(false);
+			this.lastFocused = null;
+		}
+	},
+
+	_getSelectedItemAttr: function(){
+		// summary:
+		//		Return item related to selected tree node.
+		return this.lastFocused && this.lastFocused.item;
+	},
+
+	_setPathAttr: function(/*Item[] || String[]*/ path){
+		// summary:
+		//		Select the tree node identified by passed path.
+		// path:
+		//		Array of items or item id's
+
+		if(!path || !path.length){ return; }
+
+		// If this is called during initialization, defer running until Tree has finished loading
+		this._loadDeferred.addCallback(dojo.hitch(this, function(){
+			if(!this.rootNode){
+				console.debug("!this.rootNode");
+				return;
+			}
+			if(path[0] !== this.rootNode.item && (dojo.isString(path[0]) && path[0] != this.model.getIdentity(this.rootNode.item))){
+				console.error(this, ":path[0] doesn't match this.rootNode.item.  Maybe you are using the wrong tree.");
+				return;
+			}
+			path.shift();
+
+			var node = this.rootNode;
+
+			function advance(){
+				// summary:
+				// 		Called when "node" has completed loading and expanding.   Pop the next item from the path
+				//		(which must be a child of "node") and advance to it, and then recurse.
+
+				// Set item and identity to next item in path (node is pointing to the item that was popped
+				// from the path _last_ time.
+				var item = path.shift(),
+					identity = dojo.isString(item) ? item : this.model.getIdentity(item);
+
+				// Change "node" from previous item in path to the item we just popped from path
+				dojo.some(this._itemNodesMap[identity], function(n){
+					if(n.getParent() == node){
+						node = n;
+						return true;
+					}
+					return false;
+				});
+
+				if(path.length){
+					// Need to do more expanding
+					this._expandNode(node).addCallback(dojo.hitch(this, advance));
+				}else{
+					// Final destination node, select it
+					if(this.lastFocused != node){
+						this.focusNode(node);
+					}
+				}
+			}
+
+			this._expandNode(node).addCallback(dojo.hitch(this, advance));
+		}));
+	},
+
+	_getPathAttr: function(){
+		// summary:
+		//		Return an array of items that is the path to selected tree node.
+		if(!this.lastFocused){ return; }
+		var res = [];
+		var treeNode = this.lastFocused;
+		while(treeNode && treeNode !== this.rootNode){
+			res.unshift(treeNode.item);
+			treeNode = treeNode.getParent();
+		}
+		res.unshift(this.rootNode.item);
+		return res;
+	},
+
 	////////////// Data store related functions //////////////////////
 	// These just get passed to the model; they are here for back-compat
 
@@ -12724,7 +14057,14 @@ dojo.declare(
 		// tags:
 		//		extension
 	},
-	
+
+	getRowClass: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){
+		// summary:
+		//		Overridable function to return CSS class name to display row
+		// tags:
+		//		extension
+	},
+
 	getIconStyle: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){
 		// summary:
 		//		Overridable function to return CSS styles to display icon
@@ -12743,6 +14083,23 @@ dojo.declare(
 		//		extension
 	},
 
+	getRowStyle: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){
+		// summary:
+		//		Overridable function to return CSS styles to display row
+		// returns:
+		//		Object suitable for input to dojo.style() like {background-color: "#bbb"}
+		// tags:
+		//		extension
+	},
+
+	getTooltip: function(/*dojo.data.Item*/ item){
+		// summary:
+		//		Overridable function to get the tooltip for a tree node (given the item)
+		// tags:
+		//		extension
+		return "";	// String
+	},
+
 	/////////// Keyboard and Mouse handlers ////////////////////
 
 	_onKeyPress: function(/*Event*/ e){
@@ -12754,13 +14111,20 @@ dojo.declare(
 		if(!treeNode){ return; }
 
 		var key = e.charOrCode;
-		if(typeof key == "string"){  // handle printables (letter navigation)
+		if(typeof key == "string"){	// handle printables (letter navigation)
 			// Check for key navigation.
 			if(!e.altKey && !e.ctrlKey && !e.shiftKey && !e.metaKey){
 				this._onLetterKeyNav( { node: treeNode, key: key.toLowerCase() } );
 				dojo.stopEvent(e);
 			}
-		}else{  // handle non-printables (arrow keys)
+		}else{	// handle non-printables (arrow keys)
+			// clear record of recent printables (being saved for multi-char letter navigation),
+			// because "a", down-arrow, "b" shouldn't search for "ab"
+			if(this._curSearch){
+				clearTimeout(this._curSearch.timer);
+				delete this._curSearch;
+			}
+
 			var map = this._keyHandlerMap;
 			if(!map){
 				// setup table mapping keys to events
@@ -12775,23 +14139,24 @@ dojo.declare(
 				this._keyHandlerMap = map;
 			}
 			if(this._keyHandlerMap[key]){
-				this[this._keyHandlerMap[key]]( { node: treeNode, item: treeNode.item } );	
+				this[this._keyHandlerMap[key]]( { node: treeNode, item: treeNode.item, evt: e } );
 				dojo.stopEvent(e);
 			}
 		}
 	},
 
-	_onEnterKey: function(/*Object*/ message){
-		this._publish("execute", { item: message.item, node: message.node} );
-		this.onClick(message.item, message.node);
+	_onEnterKey: function(/*Object*/ message, /*Event*/ evt){
+		this._publish("execute", { item: message.item, node: message.node } );
+		this.onClick(message.item, message.node, evt);
 	},
 
 	_onDownArrow: function(/*Object*/ message){
-		// summary: down arrow pressed; get next visible node, set focus there
+		// 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){
@@ -12800,7 +14165,7 @@ dojo.declare(
 
 		var node = message.node;
 
-		// if younger siblings		
+		// if younger siblings
 		var previousSibling = node.getPreviousSibling();
 		if(previousSibling){
 			node = previousSibling;
@@ -12881,36 +14246,64 @@ dojo.declare(
 		}
 	},
 
+	// multiCharSearchDuration: Number
+	//		If multiple characters are typed where each keystroke happens within
+	//		multiCharSearchDuration of the previous keystroke,
+	//		search for nodes matching all the keystrokes.
+	//
+	//		For example, typing "ab" will search for entries starting with
+	//		"ab" unless the delay between "a" and "b" is greater than multiCharSearchDuration.
+	multiCharSearchDuration: 250,
+
 	_onLetterKeyNav: function(message){
 		// summary:
-		//		Letter key pressed; search for node starting with first char = key
-		var node = message.node, startNode = node, 
-			key = message.key;
+		//		Called when user presses a prinatable key; search for node starting with recently typed letters.
+		// message: Object
+		//		Like { node: TreeNode, key: 'a' } where key is the key the user pressed.
+
+		// Branch depending on whether this key starts a new search, or modifies an existing search
+		var cs = this._curSearch;
+		if(cs){
+			// We are continuing a search.  Ex: user has pressed 'a', and now has pressed
+			// 'b', so we want to search for nodes starting w/"ab".
+			cs.pattern = cs.pattern + message.key;
+			clearTimeout(cs.timer);
+		}else{
+			// We are starting a new search
+			cs = this._curSearch = {
+					pattern: message.key,
+					startNode: message.node
+			};
+		}
+
+		// set/reset timer to forget recent keystrokes
+		var self = this;
+		cs.timer = setTimeout(function(){
+			delete self._curSearch;
+		}, this.multiCharSearchDuration);
+
+		// Navigate to TreeNode matching keystrokes [entered so far].
+		var node = cs.startNode;
 		do{
 			node = this._getNextNode(node);
 			//check for last node, jump to first node if necessary
 			if(!node){
 				node = this._getRootOrFirstNode();
 			}
-		}while(node !== startNode && (node.label.charAt(0).toLowerCase() != key));
+		}while(node !== cs.startNode && (node.label.toLowerCase().substr(0, cs.pattern.length) != cs.pattern));
 		if(node && node.isTreeNode){
 			// no need to set focus if back where we started
-			if(node !== startNode){
+			if(node !== cs.startNode){
 				this.focusNode(node);
 			}
 		}
 	},
 
-	_onClick: function(/*Event*/ e){
+	_onClick: function(/*TreeNode*/ nodeWidget, /*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;
-		}
+		var domElement = e.target;
 
 		if( (this.openOnClick && nodeWidget.isExpandable) ||
 			(domElement == nodeWidget.expandoNode || domElement == nodeWidget.expandoNodeText) ){
@@ -12919,22 +14312,17 @@ dojo.declare(
 				this._onExpandoClick({node:nodeWidget});
 			}
 		}else{
-			this._publish("execute", { item: nodeWidget.item, node: nodeWidget} );
-			this.onClick(nodeWidget.item, nodeWidget);
+			this._publish("execute", { item: nodeWidget.item, node: nodeWidget, evt: e } );
+			this.onClick(nodeWidget.item, nodeWidget, e);
 			this.focusNode(nodeWidget);
 		}
 		dojo.stopEvent(e);
 	},
-	_onDblClick: function(/*Event*/ e){
+	_onDblClick: function(/*TreeNode*/ nodeWidget, /*Event*/ e){
 		// summary:
 		//		Translates double-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;
-		}
+		var domElement = e.target;
 
 		if( (this.openOnDblClick && nodeWidget.isExpandable) ||
 			(domElement == nodeWidget.expandoNode || domElement == nodeWidget.expandoNodeText) ){
@@ -12943,8 +14331,8 @@ dojo.declare(
 				this._onExpandoClick({node:nodeWidget});
 			}
 		}else{
-			this._publish("execute", { item: nodeWidget.item, node: nodeWidget} );
-			this.onDblClick(nodeWidget.item, nodeWidget);
+			this._publish("execute", { item: nodeWidget.item, node: nodeWidget, evt: e } );
+			this.onDblClick(nodeWidget.item, nodeWidget, e);
 			this.focusNode(nodeWidget);
 		}
 		dojo.stopEvent(e);
@@ -12954,7 +14342,7 @@ dojo.declare(
 		// 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.
@@ -12967,13 +14355,13 @@ dojo.declare(
 		}
 	},
 
-	onClick: function(/* dojo.data */ item, /*TreeNode*/ node){
+	onClick: function(/* dojo.data */ item, /*TreeNode*/ node, /*Event*/ evt){
 		// summary:
 		//		Callback when a tree node is clicked
 		// tags:
 		//		callback
 	},
-	onDblClick: function(/* dojo.data */ item, /*TreeNode*/ node){
+	onDblClick: function(/* dojo.data */ item, /*TreeNode*/ node, /*Event*/ evt){
 		// summary:
 		//		Callback when a tree node is double-clicked
 		// tags:
@@ -12998,7 +14386,7 @@ dojo.declare(
 
 		if(node.isExpandable && node.isExpanded && node.hasChildren()){
 			// if this is an expanded node, get the first child
-			return node.getChildren()[0];		// _TreeNode	
+			return node.getChildren()[0];		// _TreeNode
 		}else{
 			// find a parent node with a sibling
 			while(node && node.isTreeNode){
@@ -13022,6 +14410,10 @@ dojo.declare(
 		// summary:
 		//		Called when the user has requested to collapse the node
 
+		if(node._expandNodeDeferred){
+			delete node._expandNodeDeferred;
+		}
+
 		if(node.isExpandable){
 			if(node.state == "LOADING"){
 				// ignore clicks while we are in the process of loading data
@@ -13038,46 +14430,75 @@ dojo.declare(
 		}
 	},
 
-	_expandNode: function(/*_TreeNode*/ node){
+	_expandNode: function(/*_TreeNode*/ node, /*Boolean?*/ recursive){
 		// summary:
 		//		Called when the user has requested to expand the node
+		// recursive:
+		//		Internal flag used when _expandNode() calls itself, don't set.
+		// returns:
+		//		Deferred that fires when the node is loaded and opened and (if persist=true) all it's descendants
+		//		that were previously opened too
 
-		if(!node.isExpandable){
-			return;
+		if(node._expandNodeDeferred && !recursive){
+			// there's already an expand in progress (or completed), so just return
+			return node._expandNodeDeferred;	// dojo.Deferred
 		}
 
 		var model = this.model,
-			item = node.item;
+			item = node.item,
+			_this = this;
 
 		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){
+
+				// Setup deferred to signal when the load and expand are finished.
+				// Save that deferred in this._expandDeferred as a flag that operation is in progress.
+				var def = (node._expandNodeDeferred = new dojo.Deferred());
+
+				// Get the children
+				model.getChildren(
+					item,
+					function(items){
 						node.unmarkProcessing();
-						node.setChildItems(items);
-						_this._expandNode(node);
+
+						// Display the children and also start expanding any children that were previously expanded
+						// (if this.persist == true).   The returned Deferred will fire when those expansions finish.
+						var scid = node.setChildItems(items);
+
+						// Call _expandNode() again but this time it will just to do the animation (default branch).
+						// The returned Deferred will fire when the animation completes.
+						// TODO: seems like I can avoid recursion and just use a deferred to sequence the events?
+						var ed = _this._expandNode(node, true);
+
+						// After the above two tasks (setChildItems() and recursive _expandNode()) finish,
+						// signal that I am done.
+						scid.addCallback(function(){
+							ed.addCallback(function(){
+								def.callback();
+							})
+						});
 					},
 					function(err){
 						console.error(_this, ": error loading root children: ", err);
-					});
+					}
+				);
 				break;
 
-			default:
-				// data is already loaded; just proceed
-				node.expand();
+			default:	// "LOADED"
+				// data is already loaded; just expand node
+				def = (node._expandNodeDeferred = node.expand());
+
 				this.onOpen(node.item, node);
 
 				if(item){
-					this._state(item,true);
+					this._state(item, true);
 					this._saveState();
 				}
 		}
+
+		return def;	// dojo.Deferred
 	},
 
 	////////////////// Miscellaneous functions ////////////////
@@ -13089,10 +14510,10 @@ dojo.declare(
 		//		protected
 
 		// set focus so that the label will be voiced using screen readers
-		node.labelNode.focus();
+		dijit.focus(node.labelNode);
 	},
 
-	_onNodeFocus: function(/*Widget*/ node){
+	_onNodeFocus: function(/*dijit._Widget*/ node){
 		// summary:
 		//		Called when a TreeNode gets focus, either by user clicking
 		//		it, or programatically by arrow key handling code.
@@ -13100,8 +14521,8 @@ dojo.declare(
 		//		It marks that the current node is the selected one, and the previously
 		//		selected node no longer is.
 
-		if (node){
-			if(node != this.lastFocused){
+		if(node){
+			if(node != this.lastFocused && this.lastFocused && !this.lastFocused._destroyed){
 				// mark that the previously selected node is no longer the selected one
 				this.lastFocused.setSelected(false);
 			}
@@ -13112,28 +14533,34 @@ dojo.declare(
 		}
 	},
 
-	_onNodeMouseEnter: function(/*Widget*/ node){
+	_onNodeMouseEnter: function(/*dijit._Widget*/ node){
 		// summary:
 		//		Called when mouse is over a node (onmouseenter event)
 	},
 
-	_onNodeMouseLeave: function(/*Widget*/ node){
+	_onNodeMouseLeave: function(/*dijit._Widget*/ node){
 		// summary:
 		//		Called when mouse is over a node (onmouseenter event)
 	},
 
 	//////////////// Events from the model //////////////////////////
-	
+
 	_onItemChange: function(/*Item*/ item){
 		// summary:
 		//		Processes notification of a change to an item's scalar values like label
 		var model = this.model,
 			identity = model.getIdentity(item),
-			node = this._itemNodeMap[identity];
+			nodes = this._itemNodesMap[identity];
 
-		if(node){
-			node.setLabelNode(this.getLabel(item));
-			node._updateItemClasses(item);
+		if(nodes){
+			var self = this;
+			dojo.forEach(nodes,function(node){
+				node.attr({
+					label: self.getLabel(item),
+					tooltip: self.getTooltip(item)
+				});
+				node._updateItemClasses(item);
+			});
 		}
 	},
 
@@ -13142,10 +14569,12 @@ dojo.declare(
 		//		Processes notification of a change to an item's children
 		var model = this.model,
 			identity = model.getIdentity(parent),
-			parentNode = this._itemNodeMap[identity];
+			parentNodes = this._itemNodesMap[identity];
 
-		if(parentNode){
-			parentNode.setChildItems(newChildrenList);
+		if(parentNodes){
+			dojo.forEach(parentNodes,function(parentNode){
+				parentNode.setChildItems(newChildrenList);
+			});
 		}
 	},
 
@@ -13154,21 +14583,23 @@ dojo.declare(
 		//		Processes notification of a deletion of an item
 		var model = this.model,
 			identity = model.getIdentity(item),
-			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);
-			}
-			node.destroyRecursive();
-			delete this._itemNodeMap[identity];
+			nodes = this._itemNodesMap[identity];
+
+		if(nodes){
+			dojo.forEach(nodes,function(node){
+				var parent = node.getParent();
+				if(parent){
+					// if node has not already been orphaned from a _onSetItem(parent, "children", ..) call...
+					parent.removeChild(node);
+				}
+				node.destroyRecursive();
+			});
+			delete this._itemNodesMap[identity];
 		}
 	},
 
 	/////////////// Miscellaneous funcs
-	
+
 	_initState: function(){
 		// summary:
 		//		Load in which nodes should be opened automatically
@@ -13189,7 +14620,7 @@ dojo.declare(
 			return false;
 		}
 		var id=this.model.getIdentity(item);
-		if(arguments.length===1){
+		if(arguments.length === 1){
 			return this._openedItemIds[id];
 		}
 		if(expanded){
@@ -13212,6 +14643,10 @@ dojo.declare(
 	},
 
 	destroy: function(){
+		if(this._curSearch){
+			clearTimeout(this._curSearch.timer);
+			delete this._curSearch;
+		}
 		if(this.rootNode){
 			this.rootNode.destroyRecursive();
 		}
@@ -13221,13 +14656,30 @@ dojo.declare(
 		this.rootNode = null;
 		this.inherited(arguments);
 	},
-	
+
 	destroyRecursive: function(){
 		// A tree is treated as a leaf, not as a node with children (like a grid),
 		// but defining destroyRecursive for back-compat.
 		this.destroy();
 	},
 
+	resize: function(changeSize){
+		if(changeSize){
+			dojo.marginBox(this.domNode, changeSize);
+			dojo.style(this.domNode, "overflow", "auto");	// for scrollbars
+		}
+
+		// The only JS sizing involved w/tree is the indentation, which is specified
+		// in CSS and read in through this dummy indentDetector node (tree must be
+		// visible and attached to the DOM to read this)
+		this._nodePixelIndent = dojo.marginBox(this.tree.indentDetector).w;
+
+		if(this.tree.rootNode){
+			// If tree has already loaded, then reset indent for all the nodes
+			this.tree.rootNode.attr('indent', this.showRoot ? 0 : -1);
+		}
+	},
+
 	_createTreeNode: function(/*Object*/ args){
 		// summary:
 		//		creates a TreeNode
@@ -13256,22 +14708,22 @@ dojo.declare(
 	"dijit.form.TextBox",
 	dijit.form._FormValueWidget,
 	{
-		//	summary:
+		// summary:
 		//		A base class for textbox form inputs
 
-		//	trim: Boolean
+		// trim: Boolean
 		//		Removes leading and trailing whitespace if true.  Default is false.
 		trim: false,
 
-		//	uppercase: Boolean
+		// uppercase: Boolean
 		//		Converts all characters to uppercase if true.  Default is false.
 		uppercase: false,
 
-		//	lowercase: Boolean
+		// lowercase: Boolean
 		//		Converts all characters to lowercase if true.  Default is false.
 		lowercase: false,
 
-		//	propercase: Boolean
+		// propercase: Boolean
 		//		Converts the first character of each word to uppercase if true.
 		propercase: false,
 
@@ -13279,11 +14731,15 @@ dojo.declare(
 		//		HTML INPUT tag maxLength declaration.
 		maxLength: "",
 
-		templateString:"<input class=\"dijit dijitReset dijitLeft\" dojoAttachPoint='textbox,focusNode'\n\tdojoAttachEvent='onmouseenter:_onMouse,onmouseleave:_onMouse'\n\tautocomplete=\"off\" type=\"${type}\" ${nameAttrSetting}\n\t/>\n",
+		//	selectOnClick: [const] Boolean
+		//		If true, all text will be selected when focused with mouse
+		selectOnClick: false,
+
+		templateString: dojo.cache("dijit.form", "templates/TextBox.html", "<input class=\"dijit dijitReset dijitLeft\" dojoAttachPoint='textbox,focusNode'\n\tdojoAttachEvent='onmouseenter:_onMouse,onmouseleave:_onMouse'\n\tautocomplete=\"off\" type=\"${type}\" ${nameAttrSetting}\n\t/>\n"),
 		baseClass: "dijitTextBox",
 
 		attributeMap: dojo.delegate(dijit.form._FormValueWidget.prototype.attributeMap, {
-			maxLength: "focusNode" 
+			maxLength: "focusNode"
 		}),
 
 		_getValueAttr: function(){
@@ -13303,7 +14759,7 @@ dojo.declare(
 			// summary:
 			//		Hook so attr('value', ...) works.
 			//
-			// description: 
+			// description:
 			//		Sets the value of the widget to "value" which can be of
 			//		any type as determined by the widget.
 			//
@@ -13316,7 +14772,7 @@ dojo.declare(
 			//		otherwise a computed visual value is used.
 			//
 			// priorityChange:
-			//		If true, an onChange event is fired immediately instead of 
+			//		If true, an onChange event is fired immediately instead of
 			//		waiting for the next blur event.
 
 			var filteredValue;
@@ -13367,9 +14823,9 @@ dojo.declare(
 			// 		after filtering (ie, trimming spaces etc.).
 			//
 			//		For some subclasses of TextBox (like ComboBox), the displayed value
-			//		is different from the serialized value that's actually 
+			//		is different from the serialized value that's actually
 			//		sent to the server (see dijit.form.ValidationTextBox.serialize)
-			
+
 			return this.filter(this.textbox.value);
 		},
 
@@ -13381,11 +14837,11 @@ dojo.declare(
 			dojo.deprecated(this.declaredClass+"::setDisplayedValue() is deprecated. Use attr('displayedValue', ...) instead.", "", "2.0");
 			this.attr('displayedValue', value);
 		},
-			
+
 		_setDisplayedValueAttr: function(/*String*/value){
 			// summary:
 			//		Hook so attr('displayedValue', ...) works.
-			//	description: 
+			// description:
 			//		Sets the value of the visual element to the string "value".
 			//		The widget value is also set to a corresponding,
 			//		but not necessarily the same, value.
@@ -13453,12 +14909,6 @@ dojo.declare(
 				this.connect(this.textbox, "onpaste", this._onInput);
 				this.connect(this.textbox, "oncut", this._onInput);
 			}
-
-			/*#5297:if(this.srcNodeRef){
-				dojo.style(this.textbox, "cssText", this.style);
-				this.textbox.className += " " + this["class"];
-			}*/
-			this._layoutHack();
 		},
 
 		_blankValue: '', // if the textbox is blank, what value should be reported
@@ -13507,10 +14957,43 @@ dojo.declare(
 			if(this.disabled){ return; }
 			this._setBlurValue();
 			this.inherited(arguments);
+
+			if(this._selectOnClickHandle){
+				this.disconnect(this._selectOnClickHandle);
+			}
+			if(this.selectOnClick && dojo.isMoz){
+				this.textbox.selectionStart = this.textbox.selectionEnd = undefined; // clear selection so that the next mouse click doesn't reselect
+			}
 		},
 
-		_onFocus: function(e){
-			if(this.disabled){ return; }
+		_onFocus: function(/*String*/ by){
+			if(this.disabled || this.readOnly){ return; }
+
+			// Select all text on focus via click if nothing already selected.
+			// Since mouse-up will clear the selection need to defer selection until after mouse-up.
+			// Don't do anything on focus by tabbing into the widgetm since there's no associated mouse-up event.
+			if(this.selectOnClick && by == "mouse"){
+				this._selectOnClickHandle = this.connect(this.domNode, "onmouseup", function(){
+					// Only select all text on first click; otherwise users would have no way to clear
+					// the selection.
+					this.disconnect(this._selectOnClickHandle);
+
+					// Check if the user selected some text manually (mouse-down, mouse-move, mouse-up)
+					// and if not, then select all the text
+					var textIsNotSelected;
+					if(dojo.isIE){
+						var range = dojo.doc.selection.createRange();
+						var parent = range.parentElement();
+						textIsNotSelected = parent == this.textbox && range.text.length == 0;
+					}else{
+						textIsNotSelected = this.textbox.selectionStart == this.textbox.selectionEnd;
+					}
+					if(textIsNotSelected){
+						dijit.selectInputText(this.textbox);
+					}
+				});
+			}
+
 			this._refreshState();
 			this.inherited(arguments);
 		},
@@ -13534,20 +15017,19 @@ dijit.selectInputText = function(/*DomNode*/element, /*Number?*/ start, /*Number
 	element = dojo.byId(element);
 	if(isNaN(start)){ start = 0; }
 	if(isNaN(stop)){ stop = element.value ? element.value.length : 0; }
-	element.focus();
+	dijit.focus(element);
 	if(_document["selection"] && dojo.body()["createTextRange"]){ // IE
 		if(element.createTextRange){
 			var range = element.createTextRange();
 			with(range){
 				collapse(true);
-				moveStart("character", start);
-				moveEnd("character", stop);
+				moveStart("character", -99999); // move to 0
+				moveStart("character", start); // delta from 0 is the correct position
+				moveEnd("character", stop-start);
 				select();
 			}
 		}
 	}else if(_window["getSelection"]){
-		var selection = _window.getSelection();	// TODO: unused, remove
-		// FIXME: does this work on Safari?
 		if(element.setSelectionRange){
 			element.setSelectionRange(start, stop);
 		}
@@ -13616,6 +15098,11 @@ dojo.declare("dijit.InlineEditBox",
 	//		Class name for Editor widget
 	editor: "dijit.form.TextBox",
 
+	// editorWrapper: String
+	//		Class name for widget that wraps the editor widget, displaying save/cancel
+	//		buttons.
+	editorWrapper: "dijit._InlineEditor",
+
 	// editorParams: Object
 	//		Set of parameters for editor, like {required: true}
 	editorParams: {},
@@ -13626,7 +15113,7 @@ dojo.declare("dijit.InlineEditBox",
 		// tags:
 		//		callback
 	},
-	
+
 	onCancel: function(){
 		// summary:
 		//		Set this handler to be notified when editing is cancelled.
@@ -13666,7 +15153,7 @@ dojo.declare("dijit.InlineEditBox",
 			onmouseover: "_onMouseOver",
 			onmouseout: "_onMouseOut",
 			onfocus: "_onMouseOver",
-			onblur: "_onMouseOut"			
+			onblur: "_onMouseOut"
 		};
 		for(var name in events){
 			this.connect(this.displayNode, name, events[name]);
@@ -13687,12 +15174,18 @@ dojo.declare("dijit.InlineEditBox",
 		dojo.deprecated("dijit.InlineEditBox.setDisabled() is deprecated.  Use attr('disabled', bool) instead.", "", "2.0");
 		this.attr('disabled', disabled);
 	},
+
 	_setDisabledAttr: function(/*Boolean*/ disabled){
-		// summary: 
+		// summary:
 		//		Hook to make attr("disabled", ...) work.
 		//		Set disabled state of widget.
 		this.disabled = disabled;
 		dijit.setWaiState(this.domNode, "disabled", disabled);
+		if(disabled){
+			this.displayNode.removeAttribute("tabIndex");
+		}else{
+			this.displayNode.setAttribute("tabIndex", 0);
+		}
 	},
 
 	_onMouseOver: function(){
@@ -13733,75 +15226,87 @@ dojo.declare("dijit.InlineEditBox",
 		if(this.disabled || this.editing){ return; }
 		this.editing = true;
 
-		var editValue = 
-				(this.renderAsHtml ?
-				this.value :
-				this.value.replace(/\s*\r?\n\s*/g,"").replace(/<br\/?>/gi,"\n").replace(/>/g,">").replace(/</g,"<").replace(/&/g,"&").replace(/"/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.create("span", null, 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,
-			sourceStyle: dojo.getComputedStyle(this.displayNode),
-			save: dojo.hitch(this, "save"),
-			cancel: dojo.hitch(this, "cancel"),
-			width: this.width
-		}, placeholder);
+		// save some display node values that can be restored later
+		this._savedPosition = dojo.style(this.displayNode, "position") || "static";
+		this._savedOpacity = dojo.style(this.displayNode, "opacity") || "1";
+		this._savedTabIndex = dojo.attr(this.displayNode, "tabIndex") || "0";
 
+		if(this.wrapperWidget){
+			this.wrapperWidget.editWidget.attr("displayedValue" in this.editorParams ? "displayedValue" : "value", this.value);
+		}else{
+			// Placeholder for edit widget
+			// Put place holder (and eventually editWidget) before the display node so that it's positioned correctly
+			// when Calendar dropdown appears, which happens automatically on focus.
+			var placeholder = dojo.create("span", null, this.domNode, "before");
+
+			// Create the editor wrapper (the thing that holds the editor widget and the save/cancel buttons)
+			var ewc = dojo.getObject(this.editorWrapper);
+			this.wrapperWidget = new ewc({
+				value: this.value,
+				buttonSave: this.buttonSave,
+				buttonCancel: this.buttonCancel,
+				tabIndex: this._savedTabIndex,
+				editor: this.editor,
+				inlineEditBox: this,
+				sourceStyle: dojo.getComputedStyle(this.displayNode),
+				save: dojo.hitch(this, "save"),
+				cancel: dojo.hitch(this, "cancel")
+			}, placeholder);
+		}
+		var ww = this.wrapperWidget;
+
+		if(dojo.isIE){
+			dijit.focus(dijit.getFocus()); // IE (at least 8) needs help with tab order changes
+		}
 		// to avoid screen jitter, we first create the editor with position:absolute, visibility:hidden,
 		// and then when it's finished rendering, we switch from display mode to editor
-		var ews = ew.domNode.style;
-		this.displayNode.style.display="none";
-		ews.position = "static";
-		ews.visibility = "visible";
+		// position:absolute releases screen space allocated to the display node
+		// opacity:0 is the same as visibility:hidden but is still focusable
+		// visiblity:hidden removes focus outline
+
+		dojo.style(this.displayNode, { position: "absolute", opacity: "0", display: "none" }); // makes display node invisible, display style used for focus-ability
+		dojo.style(ww.domNode, { position: this._savedPosition, visibility: "visible", opacity: "1" });
+		dojo.attr(this.displayNode, "tabIndex", "-1"); // needed by WebKit for TAB from editor to skip displayNode
 
 		// Replace the display widget with edit widget, leaving them both displayed for a brief time so that
 		// focus can be shifted without incident.  (browser may needs some time to render the editor.)
-		this.domNode = ew.domNode;
-		setTimeout(function(){
-			ew.focus();
-			ew._resetValue = ew.getValue();
-		}, 100);
+		setTimeout(dojo.hitch(this, function(){
+			ww.focus(); // both nodes are showing, so we can switch focus safely
+			ww._resetValue = ww.getValue();
+		}), 0);
 	},
 
-	_showText: function(/*Boolean*/ focus){
+	_onBlur: function(){
 		// summary:
-		//		Revert to display mode, and optionally focus on display node
+		//		Called when focus moves outside the InlineEditBox.
+		//		Performs garbage collection.
 		// tags:
 		//		private
 
-		// 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.inherited(arguments);
+		if(!this.editing){
+			setTimeout(dojo.hitch(this, function(){
+				if(this.wrapperWidget){
+					this.wrapperWidget.destroy();
+					delete this.wrapperWidget;
+				}
+			}), 0);
+		}
+	},
 
-		this.domNode = this.displayNode;
+	_showText: function(/*Boolean*/ focus){
+		// summary:
+		//		Revert to display mode, and optionally focus on display node
+		// tags:
+		//		private
 
+		var ww = this.wrapperWidget;
+		dojo.style(ww.domNode, { position: "absolute", visibility: "hidden", opacity: "0" }); // hide the editor from mouse/keyboard events
+		dojo.style(this.displayNode, { position: this._savedPosition, opacity: this._savedOpacity, display: "" }); // make the original text visible
+		dojo.attr(this.displayNode, "tabIndex", this._savedTabIndex);
 		if(focus){
 			dijit.focus(this.displayNode);
 		}
-		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){
@@ -13811,18 +15316,18 @@ dojo.declare("dijit.InlineEditBox",
 		//		Focus on the display mode text
 		// tags:
 		//		private
+
 		if(this.disabled || !this.editing){ return; }
 		this.editing = false;
 
-		var value = this.editWidget.getValue() + "";
-		this.attr('value', this.renderAsHtml? value
-			: value.replace(/&/gm, "&").replace(/</gm, "<").replace(/>/gm, ">").replace(/"/gm, """).replace(/\n/g, "<br>")
-		);
+		var ww = this.wrapperWidget;
+		var value = ww.getValue();
+		this.attr('value', value); // display changed, formatted value
 
 		// tell the world that we have changed
-		this.onChange(value);
+		setTimeout(dojo.hitch(this, "onChange", value), 0); // setTimeout prevents browser freeze for long-running event handlers
 
-		this._showText(focus);	
+		this._showText(focus); // set focus as needed
 	},
 
 	setValue: function(/*String*/ val){
@@ -13833,12 +15338,17 @@ dojo.declare("dijit.InlineEditBox",
 		dojo.deprecated("dijit.InlineEditBox.setValue() is deprecated.  Use attr('value', ...) instead.", "", "2.0");
 		return this.attr("value", val);
 	},
+
 	_setValueAttr: function(/*String*/ val){
 		// summary:
 		// 		Hook to make attr("value", ...) work.
 		//		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;
+
+		this.value = val = dojo.trim(val);
+		if(!this.renderAsHtml){
+			val = val.replace(/&/gm, "&").replace(/</gm, "<").replace(/>/gm, ">").replace(/"/gm, """).replace(/\n/g, "<br>");
+		}
+		this.displayNode.innerHTML = val || this.noValueIndicator;
 	},
 
 	getValue: function(){
@@ -13856,11 +15366,12 @@ dojo.declare("dijit.InlineEditBox",
 		// tags:
 		//		private
 
+		if(this.disabled || !this.editing){ return; }
 		this.editing = false;
-		
+
 		// tell the world that we have no changes
-		this.onCancel();
-		
+		setTimeout(dojo.hitch(this, "onCancel"), 0); // setTimeout prevents browser freeze for long-running event handlers
+
 		this._showText(focus);
 	}
 });
@@ -13882,7 +15393,7 @@ dojo.declare(
 	// value: String
 	//		Value as an HTML string or plain text string, depending on renderAsHTML flag
 
-	templateString:"<span dojoAttachPoint=\"editNode\" waiRole=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\n\tdojoAttachEvent=\"onkeypress: _onKeyPress\" \n\t><span dojoAttachPoint=\"editorPlaceholder\"></span\n\t><span dojoAttachPoint=\"buttonContainer\"\n\t\t><button class='saveButton' dojoAttachPoint=\"saveButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:save\" disabled=\"true\" label=\"${buttonSave}\"></button\n\t\t> [...]
+	templateString: dojo.cache("dijit", "templates/InlineEditBox.html", "<span dojoAttachPoint=\"editNode\" waiRole=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\n\tdojoAttachEvent=\"onkeypress: _onKeyPress\"\n\t><span dojoAttachPoint=\"editorPlaceholder\"></span\n\t><span dojoAttachPoint=\"buttonContainer\"\n\t\t><button class='saveButton' dojoAttachPoint=\"saveButton\" dojoType=\"dijit.form.Button\" dojoAttachEvent=\"onClick:save\" label [...]
 	widgetsInTemplate: true,
 
 	postMixInProperties: function(){
@@ -13907,33 +15418,51 @@ dojo.declare(
 		dojo.forEach(["marginTop","marginBottom","marginLeft", "marginRight"], function(prop){
 			this.domNode.style[prop] = srcStyle[prop];
 		}, this);
-		if(this.width=="100%"){
+		var width = this.inlineEditBox.width;
+		if(width == "100%"){
 			// block mode
 			editStyle += "width:100%;";
 			this.domNode.style.display = "block";
 		}else{
 			// inline-block mode
-			editStyle += "width:" + (this.width + (Number(this.width)==this.width ? "px" : "")) + ";";
+			editStyle += "width:" + (width + (Number(width) == width ? "px" : "")) + ";";
 		}
-		this.editorParams.style = editStyle;
-		this.editorParams[ "displayedValue" in cls.prototype ? "displayedValue" : "value"] = this.value;
-		var ew = this.editWidget = new cls(this.editorParams, this.editorPlaceholder);
+		var editorParams = this.inlineEditBox.editorParams;
+		editorParams.style = editStyle;
+		editorParams[ "displayedValue" in cls.prototype ? "displayedValue" : "value"] = this.value;
+		var ew = this.editWidget = new cls(editorParams, this.editorPlaceholder);
 
-		this.connect(ew, "onChange", "_onChange");
+		if(this.inlineEditBox.autoSave){
+			// Hide the save/cancel buttons since saving is done by simply tabbing away or
+			// selecting a value from the drop down list
+			this.buttonContainer.style.display="none";
 
-		// 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, "onKeyPress", "_onKeyPress");
-		this.connect(ew, "onKeyUp", "_onKeyPress"); // in case ESC was eaten but changed value
+			// Selecting a value from a drop down list causes an onChange event and then we save
+			this.connect(ew, "onChange", "_onChange");
 
-		if(this.autoSave){
-			this.buttonContainer.style.display="none";
+			// ESC and TAB should cancel and save.  Note that edit widgets do a stopEvent() on ESC key (to
+			// prevent Dialog from closing when the user just wants to revert the value in the edit widget),
+			// so this is the only way we can see the key press event.
+			this.connect(ew, "onKeyPress", "_onKeyPress");
+		}else{
+			// If possible, enable/disable save button based on whether the user has changed the value
+			if("intermediateChanges" in cls.prototype){
+				ew.attr("intermediateChanges", true);
+				this.connect(ew, "onChange", "_onIntermediateChange");
+				this.saveButton.attr("disabled", true);
+			}
 		}
 	},
 
+	_onIntermediateChange: function(val){
+		// summary:
+		//		Called for editor widgets that support the intermediateChanges=true flag as a way
+		//		to detect when to enable/disabled the save button
+		this.saveButton.attr("disabled", (this.getValue() == this._resetValue) || !this.enableSave());
+	},
+
 	destroy: function(){
-		this.editWidget.destroy();
+		this.editWidget.destroy(true); // let the parent wrapper widget clean up the DOM
 		this.inherited(arguments);
 	},
 
@@ -13941,57 +15470,41 @@ dojo.declare(
 		// summary:
 		//		Return the [display] value of the edit widget
 		var ew = this.editWidget;
-		return ew.attr("displayedValue" in ew ? "displayedValue" : "value");
+		return String(ew.attr("displayedValue" in ew ? "displayedValue" : "value"));
 	},
 
 	_onKeyPress: function(e){
 		// summary:
-		//		Handler for keypress in the edit box (see template).
+		//		Handler for keypress in the edit box in autoSave mode.
 		// 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.
 		// tags:
 		//		private
 
-		if(this._exitInProgress){
-			return;
-		}
-		if(this.autoSave){
+		if(this.inlineEditBox.autoSave && this.inlineEditBox.editing){
 			if(e.altKey || e.ctrlKey){ return; }
 			// If Enter/Esc pressed, treat as save/cancel.
 			if(e.charOrCode == dojo.keys.ESCAPE){
 				dojo.stopEvent(e);
-				this._exitInProgress = true;
-				this.cancel(true);
-			}else if(e.charOrCode == dojo.keys.ENTER && this.editWidget.focusNode.tagName == "INPUT"){
+				this.cancel(true); // sets editing=false which short-circuits _onBlur processing
+			}else if(e.charOrCode == dojo.keys.ENTER && e.target.tagName == "INPUT"){
 				dojo.stopEvent(e);
-				this._exitInProgress = true;
-				this.save(true);
-			}else if(e.charOrCode === 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);
+				this._onChange(); // fire _onBlur and then save
 			}
-		}else{
-			var _this = this;
-			// Delay before calling getValue().
-			// The delay gives the browser a chance to update the native value.
-			setTimeout(
-				function(){
-					_this._onChange(); // handle save button
-				}, 100);
+
+			// _onBlur will handle TAB automatically by allowing
+			// the TAB to change focus before we mess with the DOM: #6227
+			// Expounding by request:
+			// 	The current focus is on the edit widget input field.
+			//	save() will hide and destroy this widget.
+			//	We want the focus to jump from the currently hidden
+			//	displayNode, but since it's hidden, it's impossible to
+			//	unhide it, focus it, and then have the browser focus
+			//	away from it to the next focusable element since each
+			//	of these events is asynchronous and the focus-to-next-element
+			//	is already queued.
+			//	So we allow the browser time to unqueue the move-focus event
+			//	before we do all the hide/show stuff.
 		}
 	},
 
@@ -14002,16 +15515,10 @@ dojo.declare(
 		//		private
 
 		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.inlineEditBox.autoSave && this.inlineEditBox.editing){
 			if(this.getValue() == this._resetValue){
 				this.cancel(false);
-			}else{
+			}else if(this.enableSave()){
 				this.save(false);
 			}
 		}
@@ -14020,45 +15527,241 @@ dojo.declare(
 	_onChange: function(){
 		// summary:
 		//		Called when the underlying widget fires an onChange event,
-		//		which means that the user has finished entering the value
+		//		such as when the user selects a value from the drop down list of a ComboBox,
+		//		which means that the user has finished entering the value and we should save.
 		// tags:
 		//		private
 
-		if(this._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.attr("disabled", (this.getValue() == this._resetValue) || !this.enableSave());
+		if(this.inlineEditBox.autoSave && this.inlineEditBox.editing && this.enableSave()){
+			dojo.style(this.inlineEditBox.displayNode, { display: "" });
+			dijit.focus(this.inlineEditBox.displayNode); // fires _onBlur which will save the formatted value
 		}
 	},
-	
+
 	enableSave: function(){
 		// summary:
 		//		User overridable function returning a Boolean to indicate
 		// 		if the Save button should be enabled or not - usually due to invalid conditions
 		// tags:
 		//		extension
-		return this.editWidget.isValid ? this.editWidget.isValid() : true;
+		return (
+			this.editWidget.isValid
+			? this.editWidget.isValid()
+			: true
+		);
 	},
 
 	focus: function(){
 		// summary:
-		//		Focus on the edit widget.
+		//		Focus the edit widget.
+		// tags:
+		//		protected
+
 		this.editWidget.focus();
-		dijit.selectInputText(this.editWidget.focusNode);
+		setTimeout(dojo.hitch(this, function(){
+			if(this.editWidget.focusNode.tagName == "INPUT"){
+				dijit.selectInputText(this.editWidget.focusNode);
+			}
+		}), 0);
 	}
 });
 
 }
 
+if(!dojo._hasResource["dijit.form.Form"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.Form"] = true;
+dojo.provide("dijit.form.Form");
+
+
+
+
+
+dojo.declare(
+	"dijit.form.Form",
+	[dijit._Widget, dijit._Templated, dijit.form._FormMixin],
+	{
+		// summary:
+		//		Widget corresponding to HTML form tag, for validation and serialization
+		//
+		// example:
+		//	|	<form dojoType="dijit.form.Form" id="myForm">
+		//	|		Name: <input type="text" name="name" />
+		//	|	</form>
+		//	|	myObj = {name: "John Doe"};
+		//	|	dijit.byId('myForm').attr('value', myObj);
+		//	|
+		//	|	myObj=dijit.byId('myForm').attr('value');
+
+		// HTML <FORM> attributes
+
+		// name: String?
+		//		Name of form for scripting.
+		name: "",
+
+		// action: String?
+		//		Server-side form handler.
+		action: "",
+
+		// method: String?
+		//		HTTP method used to submit the form, either "GET" or "POST".
+		method: "",
+
+		// encType: String?
+		//		Encoding type for the form, ex: application/x-www-form-urlencoded.
+		encType: "",
+
+		// accept-charset: String?
+		//		List of supported charsets.
+		"accept-charset": "",
+
+		// accept: String?
+		//		List of MIME types for file upload.
+		accept: "",
+
+		// target: String?
+		//		Target frame for the document to be opened in.
+		target: "",
+
+		templateString: "<form dojoAttachPoint='containerNode' dojoAttachEvent='onreset:_onReset,onsubmit:_onSubmit' ${nameAttrSetting}></form>",
+
+		attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
+			action: "",
+			method: "",
+			encType: "",
+			"accept-charset": "",
+			accept: "",
+			target: ""
+		}),
+
+		postMixInProperties: function(){
+			// Setup name=foo string to be referenced from the template (but only if a name has been specified)
+			// Unfortunately we can't use attributeMap to set the name due to IE limitations, see #8660
+			this.nameAttrSetting = this.name ? ("name='" + this.name + "'") : "";
+			this.inherited(arguments);
+		},
+
+		execute: function(/*Object*/ formContents){
+			// summary:
+			//		Deprecated: use submit()
+			// tags:
+			//		deprecated
+		},
+
+		onExecute: function(){
+			// summary:
+			//		Deprecated: use onSubmit()
+			// tags:
+			//		deprecated
+		},
+
+		_setEncTypeAttr: function(/*String*/ value){
+			this.encType = value;
+			dojo.attr(this.domNode, "encType", value);
+			if(dojo.isIE){ this.domNode.encoding = value; }
+		},
+
+		postCreate: function(){
+			// IE tries to hide encType
+			// TODO: this code should be in parser, not here.
+			if(dojo.isIE && this.srcNodeRef && this.srcNodeRef.attributes){
+				var item = this.srcNodeRef.attributes.getNamedItem('encType');
+				if(item && !item.specified && (typeof item.value == "string")){
+					this.attr('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
+			// tags:
+			//		callback
+			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 this if statement beginning with 2.0
+			if(this.execute != fp.execute || this.onExecute != fp.onExecute){
+				dojo.deprecated("dijit.form.Form:execute()/onExecute() are deprecated. Use onSubmit() instead.", "", "2.0");
+				this.onExecute();
+				this.execute(this.getValues());
+			}
+			if(this.onSubmit(e) === false){ // only exactly false stops submit
+				dojo.stopEvent(e);
+			}
+		},
+
+		onSubmit: function(/*Event?*/e){
+			// summary:
+			//		Callback when user submits the form.
+			// description:
+			//		This method is intended to be over-ridden, but by default it checks and
+			//		returns the validity of form elements. When the `submit`
+			//		method is called programmatically, the return value from
+			//		`onSubmit` is used to compute whether or not submission
+			//		should proceed
+			// tags:
+			//		extension
+
+			return this.isValid(); // Boolean
+		},
+
+		submit: function(){
+			// summary:
+			//		programmatically submit form if and only if the `onSubmit` returns true
+			if(!(this.onSubmit() === false)){
+				this.containerNode.submit();
+			}
+		}
+	}
+);
+
+}
+
+if(!dojo._hasResource["dijit.form.DropDownButton"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.DropDownButton"] = true;
+dojo.provide("dijit.form.DropDownButton");
+
+
+
+}
+
+if(!dojo._hasResource["dijit.form.ComboButton"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.ComboButton"] = true;
+dojo.provide("dijit.form.ComboButton");
+
+
+}
+
+if(!dojo._hasResource["dijit.form.ToggleButton"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.ToggleButton"] = true;
+dojo.provide("dijit.form.ToggleButton");
+
+
+}
+
 if(!dojo._hasResource["dijit.form.CheckBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
 dojo._hasResource["dijit.form.CheckBox"] = true;
 dojo.provide("dijit.form.CheckBox");
@@ -14085,7 +15788,7 @@ dojo.declare(
 		// In case 2, the regular html inputs are invisible but still used by
 		// the user. They are turned quasi-invisible and overlay the background-image.
 
-		templateString:"<div class=\"dijitReset dijitInline\" waiRole=\"presentation\"\n\t><input\n\t \t${nameAttrSetting} type=\"${type}\" ${checkedAttrSetting}\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdojoAttachPoint=\"focusNode\"\n\t \tdojoAttachEvent=\"onmouseover:_onMouse,onmouseout:_onMouse,onclick:_onClick\"\n/></div>\n",
+		templateString: dojo.cache("dijit.form", "templates/CheckBox.html", "<div class=\"dijitReset dijitInline\" waiRole=\"presentation\"\n\t><input\n\t \t${nameAttrSetting} type=\"${type}\" ${checkedAttrSetting}\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdojoAttachPoint=\"focusNode\"\n\t \tdojoAttachEvent=\"onmouseover:_onMouse,onmouseout:_onMouse,onclick:_onClick\"\n/></div>\n"),
 
 		baseClass: "dijitCheckBox",
 
@@ -14107,13 +15810,30 @@ dojo.declare(
 		//		attr('value', boolean) will change the checked state.
 		value: "on",
 
+		// readOnly: Boolean
+		//		Should this widget respond to user input?
+		//		In markup, this is specified as "readOnly".
+		//		Similar to disabled except readOnly form values are submitted.
+		readOnly: false,
+
+		attributeMap: dojo.delegate(dijit.form.ToggleButton.prototype.attributeMap, {
+			readOnly: "focusNode"
+		}),
+
+		_setReadOnlyAttr: function(/*Boolean*/ value){
+			this.readOnly = value;
+			dojo.attr(this.focusNode, 'readOnly', value);
+			dijit.setWaiState(this.focusNode, "readonly", value);
+			this._setStateClass();
+		},
+
 		_setValueAttr: function(/*String or Boolean*/ newValue){
 			// summary:
 			//		Handler for value= attribute to constructor, and also calls to
 			//		attr('value', val).
 			// description:
 			//		During initialization, just saves as attribute to the <input type=checkbox>.
-			//		
+			//
 			//		After initialization,
 			//		when passed a boolean, controls whether or not the CheckBox is checked.
 			//		If passed a string, changes the value attribute of the CheckBox (the one
@@ -14149,7 +15869,7 @@ dojo.declare(
 
 			this.inherited(arguments);
 		},
-		
+
 		 _fillContent: function(/*DomNode*/ source){
 			// Override Button::_fillContent() since it doesn't make sense for CheckBox,
 			// since CheckBox doesn't even have a container
@@ -14166,7 +15886,7 @@ dojo.declare(
 			this.value = this.params.value || "on";
 			dojo.attr(this.focusNode, 'value', this.value);
 		},
-		
+
 		_onFocus: function(){
 			if(this.id){
 				dojo.query("label[for='"+this.id+"']").addClass("dijitFocusedLabel");
@@ -14177,6 +15897,16 @@ dojo.declare(
 			if(this.id){
 				dojo.query("label[for='"+this.id+"']").removeClass("dijitFocusedLabel");
 			}
+		},
+
+		_onClick: function(/*Event*/ e){
+			// summary:
+			//		Internal function to handle click actions - need to check
+			//		readOnly, since button no longer does that check.
+			if(this.readOnly){
+				return false;
+			}
+			return this.inherited(arguments);
 		}
 	}
 );
@@ -14198,7 +15928,7 @@ dojo.declare(
 			if(value){
 				var _this = this;
 				// search for radio buttons with the same name that need to be unchecked
-				dojo.query("INPUT[type=radio]", this.focusNode.form||dojo.doc).forEach( // can't use name= since dojo.query doesn't support [] in the name
+				dojo.query("INPUT[type=radio]", this.focusNode.form || dojo.doc).forEach( // can't use name= since dojo.query doesn't support [] in the name
 					function(inputNode){
 						if(inputNode.name == _this.name && inputNode != _this.focusNode && inputNode.form == _this.focusNode.form){
 							var widget = dijit.getEnclosingWidget(inputNode);
@@ -14221,6 +15951,15 @@ dojo.declare(
 
 }
 
+if(!dojo._hasResource["dijit.form.RadioButton"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.RadioButton"] = true;
+dojo.provide("dijit.form.RadioButton");
+
+
+// TODO: for 2.0, move the RadioButton code into this file
+
+}
+
 if(!dojo._hasResource["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");
@@ -14252,7 +15991,7 @@ dojo.declare(
 		// tags:
 		//		protected
 
-		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\">Χ</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\t\t><input class=\"dijitReset\" dojoAttachPoint='textbox,focus [...]
+		templateString: dojo.cache("dijit.form", "templates/ValidationTextBox.html", "<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\">Χ</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\ [...]
 		baseClass: "dijitTextBox",
 
 		// required: Boolean
@@ -14286,7 +16025,7 @@ dojo.declare(
 			//		Do not specify both regExp and regExpGen.
 			// tags:
 			//		extension protected
-			return this.regExp;     // String
+			return this.regExp; // String
 		},
 
 		// state: [readonly] String
@@ -14365,6 +16104,7 @@ dojo.declare(
 			if(isValid){ this._maskValidSubsetError = true; }
 			var isValidSubset = !isValid && isFocused && this._isValidSubset();
 			var isEmpty = this._isEmpty(this.textbox.value);
+			if(isEmpty){ this._maskValidSubsetError = true; }
 			this.state = (isValid || (!this._hasBeenBlurred && isEmpty) || isValidSubset) ? "" : "Error";
 			if(this.state == "Error"){ this._maskValidSubsetError = false; }
 			this._setStateClass();
@@ -14431,9 +16171,15 @@ dojo.declare(
 						case '^':
 						case '$':
 						case '|':
-						case '(': partialre += re; break;
-						case ")": partialre += "|$)"; break;
-						 default: partialre += "(?:"+re+"|$)"; break;
+						case '(':
+							partialre += re;
+							break;
+						case ")":
+							partialre += "|$)";
+							break;
+						 default:
+							partialre += "(?:"+re+"|$)";
+							break;
 					}
 				}
 			);}
@@ -14448,16 +16194,13 @@ dojo.declare(
 
 		_setDisabledAttr: function(/*Boolean*/ value){
 			this.inherited(arguments);	// call FormValueWidget._setDisabledAttr()
-			if(this.valueNode){
-				this.valueNode.disabled = value;
-			}
 			this._refreshState();
 		},
-		
+
 		_setRequiredAttr: function(/*Boolean*/ value){
 			this.required = value;
 			dijit.setWaiState(this.focusNode,"required", value);
-			this._refreshState();				
+			this._refreshState();
 		},
 
 		postCreate: function(){
@@ -14478,6 +16221,11 @@ dojo.declare(
 			// hiding errors about partial matches
 			this._maskValidSubsetError = true;
 			this.inherited(arguments);
+		},
+
+		_onBlur: function(){
+			this.displayMessage('');
+			this.inherited(arguments);
 		}
 	}
 );
@@ -14501,7 +16249,7 @@ dojo.declare(
 
 		postMixInProperties: function(){
 			this.inherited(arguments);
-			
+
 			// we want the name attribute to go to the hidden <input>, not the displayed <input>,
 			// so override _FormWidget.postMixInProperties() setting of nameAttrSetting
 			this.nameAttrSetting = "";
@@ -14538,17 +16286,10 @@ dojo.declare(
 			this.inherited(arguments);
 
 			// Create a hidden <input> node with the serialized value used for submit
-			// (as opposed to the displayed value)
-			this.valueNode = dojo.create("input", {
-				style: { display: "none" },
-				type: this.type,
-				name: this.name
-			}, this.textbox, "after");
-		},
-
-		_setDisabledAttr: function(/*Boolean*/ value){
-			this.inherited(arguments);
-			dojo.attr(this.valueNode, 'disabled', value);
+			// (as opposed to the displayed value).
+			// Passing in name as markup rather than calling dojo.create() with an attrs argument
+			// to make dojo.query(input[name=...]) work on IE. (see #8660)
+			this.valueNode = dojo.place("<input type='hidden'" + (this.name ? " name='" + this.name + "'" : "") + ">", this.textbox, "after");
 		},
 
 		reset:function(){
@@ -14592,13 +16333,8 @@ dojo.declare(
 			//		Overridable function used to validate the range of the numeric input value.
 			// tags:
 			//		protected
-			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
+			return	("min" in constraints? (this.compare(primitive,constraints.min) >= 0) : true) &&
+				("max" in constraints? (this.compare(primitive,constraints.max) <= 0) : true); // Boolean
 		},
 
 		isInRange: function(/*Boolean*/ isFocused){
@@ -14618,13 +16354,13 @@ dojo.declare(
 			var isTooMuch = false;
 			if("min" in this.constraints){
 				var min = this.constraints.min;
-				val = this.compare(val, ((typeof min == "number") && min >= 0 && val !=0)? 0 : min);
-				isTooLittle = (typeof val == "number") && val < 0;
+				min = this.compare(val, ((typeof min == "number") && min >= 0 && val !=0) ? 0 : min);
+				isTooLittle = (typeof min == "number") && min < 0;
 			}
 			if("max" in this.constraints){
 				var max = this.constraints.max;
-				val = this.compare(val, ((typeof max != "number") || max > 0)? max : 0);
-				isTooMuch = (typeof val == "number") && val > 0;
+				max = this.compare(val, ((typeof max != "number") || max > 0) ? max : 0);
+				isTooMuch = (typeof max == "number") && max > 0;
 			}
 			return isTooLittle || isTooMuch;
 		},
@@ -14645,7 +16381,10 @@ dojo.declare(
 
 		getErrorMessage: function(/*Boolean*/ isFocused){
 			// Overrides dijit.form.ValidationTextBox.getErrorMessage to print "out of range" message if appropriate
-			if(dijit.form.RangeBoundTextBox.superclass.isValid.call(this, false) && !this.isInRange(isFocused)){ return this.rangeMessage; } // String
+			var v = this.attr('value');
+			if(v !== null && v !== '' && v !== undefined && !this.isInRange(isFocused)){ // don't check isInRange w/o a real value
+				return this.rangeMessage; // String
+			}
 			return this.inherited(arguments);
 		},
 
@@ -14666,7 +16405,7 @@ dojo.declare(
 				dijit.setWaiState(this.focusNode, "valuemax", this.constraints.max);
 			}
 		},
-		
+
 		_setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange){
 			// summary:
 			//		Hook so attr('value', ...) works.
@@ -14679,3509 +16418,4037 @@ dojo.declare(
 
 }
 
-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");
+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.data.util.sorter.basicComparator = function(	/*anything*/ a, 
-													/*anything*/ b){
-	//	summary:  
-	//		Basic comparision function that compares if an item is greater or less than another item
-	//	description:  
-	//		returns 1 if a > b, -1 if a < b, 0 if equal.
-	//		'null' values (null, undefined) are treated as larger values so that they're pushed to the end of the list.
-	//		And compared to each other, null is equivalent to undefined.
-	
-	//null is a problematic compare, so if null, we set to undefined.
-	//Makes the check logic simple, compact, and consistent
-	//And (null == undefined) === true, so the check later against null
-	//works for undefined and is less bytes.
-	var r = -1;
-	if(a === null){
-		a = undefined;
-	}
-	if(b === null){
-		b = undefined;
-	}
-	if(a == b){
-		r = 0; 
-	}else if(a > b || a == null){
-		r = 1; 
-	}
-	return r; //int {-1,0,1}
-};
+dojo.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
 
-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=[];   
+// from http://www.unicode.org/cldr/data/common/supplemental/supplementalData.xml:supplementalData/currencyData/fractions
 
-	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
-		};
-	}
-	var sortAttribute;
-	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));
-		}
-	}
+	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
+	};
 
-	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
+	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.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");
+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.data.util.simpleFetch.fetch = function(/* Object? */ request){
-	//	summary:
-	//		The simpleFetch mixin is designed to serve as a set of function(s) that can
-	//		be mixed into other datastore implementations to accelerate their development.  
-	//		The simpleFetch mixin should work well for any datastore that can respond to a _fetchItems() 
-	//		call by returning an array of all the found items that matched the query.  The simpleFetch mixin
-	//		is not designed to work for datastores that respond to a fetch() call by incrementally
-	//		loading items, or sequentially loading partial batches of the result
-	//		set.  For datastores that mixin simpleFetch, simpleFetch 
-	//		implements a fetch method that automatically handles eight of the fetch()
-	//		arguments -- onBegin, onItem, onComplete, onError, start, count, sort and scope
-	//		The class mixing in simpleFetch should not implement fetch(),
-	//		but should instead implement a _fetchItems() method.  The _fetchItems() 
-	//		method takes three arguments, the keywordArgs object that was passed 
-	//		to fetch(), a callback function to be called when the result array is
-	//		available, and an error callback to be called if something goes wrong.
-	//		The _fetchItems() method should ignore any keywordArgs parameters for
-	//		start, count, onBegin, onItem, onComplete, onError, sort, and scope.  
-	//		The _fetchItems() method needs to correctly handle any other keywordArgs
-	//		parameters, including the query parameter and any optional parameters 
-	//		(such as includeChildren).  The _fetchItems() method should create an array of 
-	//		result items and pass it to the fetchHandler along with the original request object 
-	//		-- or, the _fetchItems() method may, if it wants to, create an new request object 
-	//		with other specifics about the request that are specific to the datastore and pass 
-	//		that as the request object to the handler.
-	//
-	//		For more information on this specific function, see dojo.data.api.Read.fetch()
-	request = request || {};
-	if(!request.store){
-		request.store = this;
-	}
-	var self = this;
 
-	var _errorHandler = function(errorData, requestObject){
-		if(requestObject.onError){
-			var scope = requestObject.scope || dojo.global;
-			requestObject.onError.call(scope, errorData, requestObject);
-		}
-	};
 
-	var _fetchHandler = function(items, requestObject){
-		var oldAbortFunction = requestObject.abort || null;
-		var aborted = false;
 
-		var startIndex = requestObject.start?requestObject.start:0;
-		var endIndex   = (requestObject.count && (requestObject.count !== Infinity))?(startIndex + requestObject.count):items.length;
 
-		requestObject.abort = function(){
-			aborted = true;
-			if(oldAbortFunction){
-				oldAbortFunction.call(requestObject);
-			}
-		};
+/*=====
+dojo.currency = {
+	// summary: localized formatting and parsing routines for currencies
+}
+=====*/
 
-		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
-};
+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);
 }
 
-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.declare("dojo.currency.__FormatOptions", [dojo.number.__FormatOptions], {
+	//	type: String?
+	//		Should not be set.  Value is assumed to be currency.
+	//	currency: String?
+	//		an [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD".
+	//		For use with dojo.currency only.
+	//	symbol: String?
+	//		localized currency symbol. The default will be looked up in table of supported currencies in `dojo.cldr`
+	//		A [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code will be used if not found.
+	//	places: Number?
+	//		number of decimal places to show.  Default is defined based on which currency is used.
+	type: "",
+	symbol: "",
+	places: "",
+	fractional: ""
+});
+=====*/
 
-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.
+dojo.currency.format = function(/*Number*/value, /*dojo.currency.__FormatOptions?*/options){
+// summary:
+//		Format a Number as a currency, using locale-specific settings
+//
+// description:
+//		Create a string from a Number using a known, localized pattern.
+//		[Formatting patterns](http://www.unicode.org/reports/tr35/#Number_Elements) appropriate to the locale are chosen from the [CLDR](http://unicode.org/cldr)
+//		as well as the appropriate symbols and delimiters.
+//
+// value:
+//		the number to be formatted.
 
-	var rxp = "^";
-	var c = null;
-	for(var i = 0; i < pattern.length; i++){
-		c = pattern.charAt(i);
-		switch (c) {
-			case '\\':
-				rxp += c;
-				i++;
-				rxp += pattern.charAt(i);
-				break;
-			case '*':
-				rxp += ".*"; break;
-			case '?':
-				rxp += "."; break;
-			case '$':
-			case '^':
-			case '/':
-			case '+':
-			case '.':
-			case '|':
-			case '(':
-			case ')':
-			case '{':
-			case '}':
-			case '[':
-			case ']':
-				rxp += "\\"; //fallthrough
-			default:
-				rxp += c;
-		}
-	}
-	rxp += "$";
-	if(ignoreCase){
-		return new RegExp(rxp,"mi"); //RegExp
-	}else{
-		return new RegExp(rxp,"m"); //RegExp
-	}
-	
-};
+	return 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
 }
 
-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("dojo.currency.__ParseOptions", [dojo.number.__ParseOptions], {
+	//	type: String?
+	//		Should not be set.  Value is assumed to be currency.
+	//	currency: String?
+	//		an [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD".
+	//		For use with dojo.currency only.
+	//	symbol: String?
+	//		localized currency symbol. The default will be looked up in table of supported currencies in `dojo.cldr`
+	//		A [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code will be used if not found.
+	//	places: Number?
+	//		number of decimal places to accept.  Default is defined based on which currency is used.
+	//	fractional: Boolean?|Array?
+	//		Whether to include the fractional portion, where the number of decimal places are implied by pattern
+	//		or explicit 'places' parameter.  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.ComboBoxMixin",
+	"dijit.form.NumberTextBox.__Constraints",
+	[dijit.form.RangeBoundTextBox.__Constraints, dojo.number.__FormatOptions, dojo.number.__ParseOptions], {
+	// summary:
+	//		Specifies both the rules on valid/invalid values (minimum, maximum,
+	//		number of required decimal places), and also formatting options for
+	//		displaying the value when the field is not focused.
+	// example:
+	//		Minimum/maximum:
+	//		To specify a field between 0 and 120:
+	//	|		{min:0,max:120}
+	//		To specify a field that must be an integer:
+	//	|		{fractional:false}
+	//		To specify a field where 0 to 3 decimal places are allowed on input,
+	//		but after the field is blurred the value is displayed with 3 decimal places:
+	//	|		{places:'0,3'}
+});
+=====*/
+
+dojo.declare("dijit.form.NumberTextBoxMixin",
 	null,
 	{
 		// summary:
-		//		Implements the base functionality for ComboBox/FilteringSelect
-		// description:
-		//		All widgets that mix in dijit.form.ComboBoxMixin must extend dijit.form._FormValueWidget
+		//		A mixin for all number textboxes
 		// tags:
 		//		protected
 
-		// 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,
+		// Override ValidationTextBox.regExpGen().... we use a reg-ex generating function rather
+		// than a straight regexp to deal with locale (plus formatting options too?)
+		regExpGen: dojo.number.regexp,
 
-		// pageSize: Integer
-		//		Argument to data provider.
-		//		Specifies number of search results per page (before hitting "next" button)
-		pageSize: Infinity,
+		/*=====
+		// constraints: dijit.form.NumberTextBox.__Constraints
+		//		Despite the name, this parameter specifies both constraints on the input
+		//		(including minimum/maximum allowed values) as well as
+		//		formatting options like places (the number of digits to display after
+		//		the decimal point).   See `dijit.form.NumberTextBox.__Constraints` for details.
+		constraints: {},
+		======*/
 
-		// store: Object
-		//		Reference to data provider object used by this ComboBox
-		store: null,
+		// value: Number
+		//		The value of this NumberTextBox as a javascript Number (ie, not a String).
+		//		If the displayed value is blank, the value is NaN, and if the user types in
+		//		an gibberish value (like "hello world"), the value is undefined
+		//		(i.e. attr('value') returns undefined).
+		//
+		//		Symetrically, attr('value', NaN) will clear the displayed value,
+		//		whereas attr('value', undefined) will have no effect.
+		value: NaN,
 
-		// fetchProperties: Object
-		//		Mixin to the dojo.data store's fetch.
-		//		For example, to set the sort order of the ComboBox menu, pass:
-		//		{sort:{attribute:"name",descending: true}}
-		fetchProperties:{},
+		// editOptions: [protected] Object
+		//		Properties to mix into constraints when the value is being edited.
+		//		This is here because we edit the number in the format "12345", which is
+		//		different than the display value (ex: "12,345")
+		editOptions: { pattern: '#.######' },
 
-		// 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: {},
+		/*=====
+		_formatter: function(value, options){
+			// summary:
+			//		_formatter() is called by format().   It's the base routine for formatting a number,
+			//		as a string, for example converting 12345 into "12,345".
+			// value: Number
+			//		The number to be converted into a string.
+			// options: dojo.number.__FormatOptions?
+			//		Formatting options
+			// tags:
+			//		protected extension
 
-		// autoComplete: Boolean
-		//		If user types in a partial string, and then tab out of the `<input>` box,
-		//		automatically copy the first entry displayed in the drop down list to
-		//		the `<input>` field
-		autoComplete: true,
+			return "12345";		// String
+		},
+		 =====*/
+		_formatter: dojo.number.format,
 
-		// highlightMatch: String
-		// 		One of: "first", "all" or "none".
-		//
-		//		If the ComboBox/FilteringSelect opens with the search results and the searched
-		//		string can be found, it will be highlighted.  If set to "all"
-		//		then will probably want to change `queryExpr` parameter to '*${0}*'
-		//
-		//		Highlighting is only performed when `labelType` is "text", so as to not
-		//		interfere with any HTML markup an HTML label might contain.
-		highlightMatch: "first",
-		
-		// searchDelay: Integer
-		//		Delay in milliseconds between when user types something and we start
-		//		searching based on that value
-		searchDelay: 100,
+		postMixInProperties: function(){
+			var places = typeof this.constraints.places == "number"? this.constraints.places : 0;
+			if(places){ places++; } // decimal rounding errors take away another digit of precision
+			if(typeof this.constraints.max != "number"){
+				this.constraints.max = 9 * Math.pow(10, 15-places);
+			}
+			if(typeof this.constraints.min != "number"){
+				this.constraints.min = -9 * Math.pow(10, 15-places);
+			}
+			this.inherited(arguments);
+		},
 
-		// searchAttr: String
-		//		Search for items in the data store where this attribute (in the item)
-		//		matches what the user typed
-		searchAttr: "name",
+		_onFocus: function(){
+			if(this.disabled){ return; }
+			var val = this.attr('value');
+			if(typeof val == "number" && !isNaN(val)){
+				var formattedValue = this.format(val, this.constraints);
+				if(formattedValue !== undefined){
+					this.textbox.value = formattedValue;
+				}
+			}
+			this.inherited(arguments);
+		},
 
-		// labelAttr: String?
-		//		The entries in the drop down list come from this attribute in the
-		//		dojo.data items.
-		//		If not specified, the searchAttr attribute is used instead.
-		labelAttr: "",
+		format: function(/*Number*/ value, /*dojo.number.__FormatOptions*/ constraints){
+			// summary:
+			//		Formats the value as a Number, according to constraints.
+			// tags:
+			//		protected
 
-		// labelType: String
-		//		Specifies how to interpret the labelAttr in the data store items.
-		//		Can be "html" or "text".
-		labelType: "text",
+			if(typeof value != "number"){ return String(value); }
+			if(isNaN(value)){ return ""; }
+			if(("rangeCheck" in this) && !this.rangeCheck(value, constraints)){ return String(value) }
+			if(this.editOptions && this._focused){
+				constraints = dojo.mixin({}, constraints, this.editOptions);
+			}
+			return this._formatter(value, constraints);
+		},
 
-		// queryExpr: String
-		//		This specifies what query ComboBox/FilteringSelect sends to the data store,
-		//		based on what the user has typed.  Changing this expression will modify
-		//		whether the drop down shows only exact matches, a "starting with" match,
-		//		etc.   Use it in conjunction with highlightMatch.
-		//		dojo.data query expression pattern.
-		//		`${0}` will be substituted for the user text.
-		//		`*` is used for wildcards.
-		//		`${0}*` means "starts with", `*${0}*` means "contains", `${0}` means "is"
-		queryExpr: "${0}*",
+		/*=====
+		parse: function(value, constraints){
+			// summary:
+			//		Parses the string value as a Number, according to constraints.
+			// value: String
+			//		String representing a number
+			// constraints: dojo.number.__ParseOptions
+			//		Formatting options
+			// tags:
+			//		protected
 
-		// ignoreCase: Boolean
-		//		Set true if the ComboBox/FilteringSelect should ignore case when matching possible items
-		ignoreCase: true,
+			return 123.45;		// Number
+		},
+		=====*/
+		parse: dojo.number.parse,
 
-		// hasDownArrow: Boolean
-		//		Set this textbox to have a down arrow button, to display the drop down list.
-		//		Defaults to true.
-		hasDownArrow: true,
+		_getDisplayedValueAttr: function(){
+			var v = this.inherited(arguments);
+			return isNaN(v) ? this.textbox.value : v;
+		},
 
-		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:_on [...]
+		filter: function(/*Number*/ value){
+			// summary:
+			//		This is called with both the display value (string), and the actual value (a number).
+			//		When called with the actual value it does corrections so that '' etc. are represented as NaN.
+			//		Otherwise it dispatches to the superclass's filter() method.
+			//
+			//		See `dijit.form.TextBox.filter` for more details.
+			return (value === null || value === '' || value === undefined) ? NaN : this.inherited(arguments); // attr('value', null||''||undefined) should fire onChange(NaN)
+		},
 
-		baseClass:"dijitComboBox",
+		serialize: function(/*Number*/ value, /*Object?*/options){
+			// summary:
+			//		Convert value (a Number) into a canonical string (ie, how the number literal is written in javascript/java/C/etc.)
+			// tags:
+			//		protected
+			return (typeof value != "number" || isNaN(value)) ? '' : this.inherited(arguments);
+		},
 
-		_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.
+		_setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange, /*String?*/formattedValue){
+			// summary:
+			//		Hook so attr('value', ...) works.
+			if(value !== undefined && formattedValue === undefined){
+				if(typeof value == "number"){
+					if(isNaN(value)){ formattedValue = '' }
+					else if(("rangeCheck" in this) && !this.rangeCheck(value, this.constraints)){
+						formattedValue = String(value);
+					}
+				}else if(!value){ // 0 processed in if branch above, ''|null|undefined flow thru here
+					formattedValue = '';
+					value = NaN;
+				}else{ // non-numeric values
+					formattedValue = String(value);
+					value = undefined;
 				}
 			}
-			return pos;
-		},
-
-		_setCaretPos: function(/*DomNode*/ element, /*Number*/ location){
-			location = parseInt(location);
-			dijit.selectInputText(element, location, location);
+			this.inherited(arguments, [value, priorityChange, formattedValue]);
 		},
 
-		_setDisabledAttr: function(/*Boolean*/ value){
-			// Additional code to set disabled state of combobox node.
-			// Overrides _FormValueWidget._setDisabledAttr() or ValidationTextBox._setDisabledAttr().
-			this.inherited(arguments);
-			dijit.setWaiState(this.comboNode, "disabled", value);
-		},	
-		
-		_onKeyPress: function(/*Event*/ evt){
+		_getValueAttr: function(){
 			// summary:
-			//		Handles keyboard events
-			var key = evt.charOrCode;
-			//except for cutting/pasting case - ctrl + x/v
-			if(evt.altKey || (evt.ctrlKey && (key != 'x' && key != 'v')) || evt.key == dojo.keys.SHIFT){
-				return; // throw out weird key combinations and spurious events
-			}
-			var doSearch = false;
-			var pw = this._popupWidget;
-			var dk = dojo.keys;
-			var highlighted = null;
-			if(this._isShowingNow){
-				pw.handleKey(key);
-				highlighted = pw.getHighlightedOption();
+			//		Hook so attr('value') works.
+			//		Returns Number, NaN for '', or undefined for unparsable text
+			var v = this.inherited(arguments); // returns Number for all values accepted by parse() or NaN for all other displayed values
+
+			// If the displayed value of the textbox is gibberish (ex: "hello world"), this.inherited() above
+			// returns NaN; this if() branch converts the return value to undefined.
+			// Returning undefined prevents user text from being overwritten when doing _setValueAttr(_getValueAttr()).
+			// A blank displayed value is still returned as NaN.
+			if(isNaN(v) && this.textbox.value !== ''){
+				if(this.constraints.exponent !== false && /\de[-+]?|\d/i.test(this.textbox.value) && (new RegExp("^"+dojo.number._realNumberRegexp(dojo.mixin({}, this.constraints))+"$").test(this.textbox.value))){	// check for exponential notation that parse() rejected (erroneously?)
+					var n = Number(this.textbox.value);
+					return isNaN(n) ? undefined : n; // return exponential Number or undefined for random text (may not be possible to do with the above RegExp check)
+				}else{
+					return undefined; // gibberish
+				}
+			}else{
+				return v; // Number or NaN for ''
 			}
-			switch(key){
-				case dk.PAGE_DOWN:
-				case dk.DOWN_ARROW:
-					if(!this._isShowingNow||this._prev_key_esc){
-						this._arrowPressed();
-						doSearch=true;
-					}else if(highlighted){
-						this._announceOption(highlighted);
-					}
-					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(highlighted);
+		isValid: function(/*Boolean*/ isFocused){
+			// Overrides dijit.form.RangeBoundTextBox.isValid to check that the editing-mode value is valid since
+			// it may not be formatted according to the regExp vaidation rules
+			if(!this._focused || this._isEmpty(this.textbox.value)){
+				return this.inherited(arguments);
+			}else{
+				var v = this.attr('value');
+				if(!isNaN(v) && this.rangeCheck(v, this.constraints)){
+					if(this.constraints.exponent !== false && /\de[-+]?\d/i.test(this.textbox.value)){ // exponential, parse doesn't like it
+						return true; // valid exponential number in range
+					}else{
+						return this.inherited(arguments);
 					}
-					dojo.stopEvent(evt);
-					this._prev_key_backspace = false;
-					this._prev_key_esc = false;
-					break;
+				}else{
+					return false;
+				}
+			}
+		}
+	}
+);
 
-				case dk.ENTER:
-					// prevent submitting form if user presses enter. Also
-					// prevent accepting the value if either Next or Previous
-					// are selected
-					if(highlighted){
-						// only stop event on prev/next
-						if(highlighted == pw.nextButton){
-							this._nextSearch(1);
-							dojo.stopEvent(evt);
-							break;
-						}else if(highlighted == pw.previousButton){
-							this._nextSearch(-1);
-							dojo.stopEvent(evt);
-							break;
-						}
-					}else{
-						// Update 'value' (ex: KY) according to currently displayed text
-						this._setDisplayedValueAttr(this.attr('displayedValue'), true);
-					}
-					// default case:
-					// prevent submit, but allow event to bubble
-					evt.preventDefault();
-					// fall through
+dojo.declare("dijit.form.NumberTextBox",
+	[dijit.form.RangeBoundTextBox,dijit.form.NumberTextBoxMixin],
+	{
+		// summary:
+		//		A TextBox for entering numbers, with formatting and range checking
+		// description:
+		//		NumberTextBox is a textbox for entering and displaying numbers, supporting
+		//		the following main features:
+		//
+		//			1. Enforce minimum/maximum allowed values (as well as enforcing that the user types
+		//				a number rather than a random string)
+		//			2. NLS support (altering roles of comma and dot as "thousands-separator" and "decimal-point"
+		//				depending on locale).
+		//			3. Separate modes for editing the value and displaying it, specifically that
+		//				the thousands separator character (typically comma) disappears when editing
+		//				but reappears after the field is blurred.
+		//			4. Formatting and constraints regarding the number of places (digits after the decimal point)
+		//				allowed on input, and number of places displayed when blurred (see `constraints` parameter).
+	}
+);
 
-				case dk.TAB:
-					var newvalue = this.attr('displayedValue');
-					// #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(highlighted){
-							pw.attr('value', { target: highlighted });
-						}
-						this._lastQuery = null; // in case results come back later
-						this._hideResultList();
-					}
-					break;
+}
 
-				case ' ':
-					this._prev_key_backspace = false;
-					this._prev_key_esc = false;
-					if(highlighted){
-						dojo.stopEvent(evt);
-						this._selectOption();
-						this._hideResultList();
-					}else{
-						doSearch = true;
-					}
-					break;
+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");
 
-				case dk.ESCAPE:
-					this._prev_key_backspace = false;
-					this._prev_key_esc = true;
-					if(this._isShowingNow){
-						dojo.stopEvent(evt);
-						this._hideResultList();
-					}
-					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;
-					doSearch = typeof key == 'string';
-			}
-			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);
-			}
-		},
+/*=====
+dojo.declare(
+	"dijit.form.CurrencyTextBox.__Constraints",
+	[dijit.form.NumberTextBox.__Constraints, dojo.currency.__FormatOptions, dojo.currency.__ParseOptions], {
+	// summary:
+	//		Specifies both the rules on valid/invalid values (minimum, maximum,
+	//		number of required decimal places), and also formatting options for
+	//		displaying the value when the field is not focused (currency symbol,
+	//		etc.)
+	// description:
+	//		Follows the pattern of `dijit.form.NumberTextBox.constraints`.
+	//		In general developers won't need to set this parameter
+	// example:
+	//		To ensure that the user types in the cents (for example, 1.00 instead of just 1):
+	//	|		{fractional:true}
+});
+=====*/
 
-		_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.
+dojo.declare(
+	"dijit.form.CurrencyTextBox",
+	dijit.form.NumberTextBox,
+	{
+		// summary:
+		//		A validating currency textbox
+		// description:
+		//		CurrencyTextBox is similar to `dijit.form.NumberTextBox` but has a few
+		//		extra features related to currency:
+		//
+		//		1. After specifying the currency type (american dollars, euros, etc.) it automatically
+		//			sets parse/format options such as how many decimal places to show.
+		//		2. The currency mark (dollar sign, euro mark, etc.) is displayed when the field is blurred
+		//			but erased during editing, so that the user can just enter a plain number.
 
-			var fn = this.focusNode;
+		// currency: String
+		//		the [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD"
+		currency: "",
 
-			// 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);
-			}
-		},
+		// constraints: dijit.form.CurrencyTextBox.__Constraints
+		//		Despite the name, this parameter specifies both constraints on the input
+		//		(including minimum/maximum allowed values) as well as
+		//		formatting options.   See `dijit.form.CurrencyTextBox.__Constraints` for details.
+		/*=====
+		constraints: {},
+		======*/
 
-		_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;
-			}
+		// Override regExpGen ValidationTextBox.regExpGen().... we use a reg-ex generating function rather
+		// than a straight regexp to deal with locale  (plus formatting options too?)
+		regExpGen: function(constraints){
+			// if focused, accept either currency data or NumberTextBox format
+			return '(' + (this._focused? this.inherited(arguments, [ dojo.mixin({}, constraints, this.editOptions) ]) + '|' : '')
+				+ dojo.currency.regexp(constraints) + ')';
+		},
 
-			// 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.
+		// Override NumberTextBox._formatter to deal with currencies, ex: converts "123.45" to "$123.45"
+		_formatter: dojo.currency.format,
 
-			this.item = null;
-			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.item = results[0];
-				this._autoCompleteText(zerothvalue);
+		parse: function(/* String */ value, /* Object */ constraints){
+			// summary:
+			// 		Parses string value as a Currency, according to the constraints object
+			// tags:
+			// 		protected extension
+			var v = dojo.currency.parse(value, constraints);
+			if(isNaN(v) && /\d+/.test(value)){ // currency parse failed, but it could be because they are using NumberTextBox format so try its parse
+				return this.inherited(arguments, [ value, dojo.mixin({}, constraints, this.editOptions) ]);
 			}
-			dataObject._maxOptions = this._maxOptions;
-			this._popupWidget.createOptions(
-				results, 
-				dataObject, 
-				dojo.hitch(this, "_getMenuLabelFromItem")
-			);
+			return v;
+		},
 
-			// 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());
-			}
-		},
+		postMixInProperties: function(){
+			this.constraints = dojo.currency._mixInDefaults(dojo.mixin(this.constraints, { currency: this.currency, exponent: false })); // get places
+			this.inherited(arguments);
+		}
+	}
+);
 
-		_showResultList: function(){
-			this._hideResultList();
-			var items = this._popupWidget.getItems(),
-				visibleCount = Math.min(items.length,this.maxListLength);   // TODO: unused, remove
-			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
+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");
 
 
-			// natural size of the list has changed, so erase old
-			// width/height settings, which were hardcoded in a previous
-			// call to this function (via dojo.marginBox() call)
-			dojo.style(this._popupWidget.domNode, {width: "", height: ""});
 
-			var best = this.open();
-			// #3212:
-			//		only set auto scroll bars if necessary prevents issues with
-			//		scroll bars appearing when they shouldn't when node is made
-			//		wider (fractional pixels cause this)
-			var popupbox = dojo.marginBox(this._popupWidget.domNode);
-			this._popupWidget.domNode.style.overflow = 
-				((best.h==popupbox.h)&&(best.w==popupbox.w)) ? "hidden" : "auto";
-			// #4134:
-			//		borrow TextArea scrollbar test so content isn't covered by
-			//		scrollbar and horizontal scrollbar doesn't appear
-			var newwidth = best.w;
-			if(best.h < this._popupWidget.domNode.scrollHeight){
-				newwidth += 16;
-			}
-			dojo.marginBox(this._popupWidget.domNode, {
-				h: best.h,
-				w: Math.max(newwidth, this.domNode.offsetWidth)
-			});
-			dijit.setWaiState(this.comboNode, "expanded", "true");
-		},
+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)
 
-		_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");
-			}
-		},
+	// 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
+	};
 
-		_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.attr('displayedValue');
-			var pw = this._popupWidget;
-			if(pw && (
-				newvalue == pw._messages["previousMessage"] ||
-				newvalue == pw._messages["nextMessage"]
-				)
-			){
-				this._setValueAttr(this._lastValueReported, true);
-			}else{
-				// Update 'value' (ex: KY) according to currently displayed text
-				this.attr('displayedValue', newvalue);
-			}
-		},
-
-		_onBlur: function(){
-			// summary:
-			//		Called magically when focus has shifted away from this widget and it's drop down
-			this._hideResultList();
-			this._arrowIdle();
-			this.inherited(arguments);
-		},
+	var country = dojo.cldr.supplemental._region(locale);
+	var dow = firstDay[country];
+	return (dow === undefined) ? 1 : dow; /*Number*/
+};
 
-		_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.
+dojo.cldr.supplemental._region = function(/*String?*/locale){
+	locale = dojo.i18n.normalizeLocale(locale);
+	var tags = locale.split('-');
+	var region = tags[1];
+	if(!region){
+		// IE often gives language only (#2269)
+		// Arbitrary mappings of language-only locales to a country:
+		region = {de:"de", en:"us", es:"es", fi:"fi", fr:"fr", he:"il", hu:"hu", it:"it",
+			ja:"jp", ko:"kr", nl:"nl", pt:"br", sv:"se", zh:"cn"}[tags[0]];
+	}else if(region.length == 4){
+		// The ISO 3166 country code is usually in the second position, unless a
+		// 4-letter script is given. See http://www.ietf.org/rfc/rfc4646.txt
+		region = tags[2];
+	}
+	return region;
+}
 
-			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);
-		},
+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}
 
-		_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.attr('displayedValue', this.attr('displayedValue'));
-				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);
-		},
+	// 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		
+	};
 
-		_doSelect: function(tgt){
-			// summary:
-			//		Menu callback function, called when an item in the menu is selected.
-			this.item = tgt.item;
-			this.attr('value', this.store.getValue(tgt.item, this.searchAttr));
-		},
+	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
+	};
 
-		_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("");
-			}
-		},
+	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}*/
+};
 
-		_startSearchFromInput: function(){
-			this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g, "\\$1"));
-		},
+}
 
-		_getQueryString: function(/*String*/ text){
-			return dojo.string.substitute(this.queryExpr, [text]);
-		},
+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");
 
-		_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._lastInput = key; // Store exactly what was entered by the user.
-			this._lastQuery = query[this.searchAttr] = this._getQueryString(key);
-			// #5970: set _lastQuery, *then* start the timeout
-			// otherwise, if the user types and the last query returns before the timeout,
-			// _lastQuery won't be set and their input gets rewritten
-			this.searchTimer=setTimeout(dojo.hitch(this, function(query, _this){
-				var fetch = {
-					queryOptions: {
-						ignoreCase: this.ignoreCase, 
-						deep: true
-					},
-					query: query,
-					onBegin: dojo.hitch(this, "_setMaxOptions"),
-					onComplete: dojo.hitch(this, "_openResultList"), 
-					onError: function(errText){
-						console.error('dijit.form.ComboBox: ' + errText);
-						dojo.hitch(_this, "_hideResultList")();
-					},
-					start: 0,
-					count: this.pageSize
-				};
-				dojo.mixin(fetch, _this.fetchProperties);
-				var dataObject = _this.store.fetch(fetch);
+/*=====
+dojo.date = {
+	// summary: Date manipulation utilities
+}
+=====*/
 
-				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);
-		},
+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
+}
 
-		_setMaxOptions: function(size, request){
-			 this._maxOptions = size;
-		},
+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.
 
-		_getValueField: function(){
-			// summmary:
-			//		Helper for postMixInProperties() to set this.value based on data inlined into the markup.
-			//		Returns the attribute name in the item (in dijit.form._ComboBoxDataStore) to use as the value.
-			return this.searchAttr;
-		},
+	var year = dateObject.getFullYear();
+	return !(year%400) || (!(year%4) && !!(year%100)); // Boolean
+}
 
-		/////////////// Event handlers /////////////////////
+// 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.
 
-		_arrowPressed: function(){
-			if(!this.disabled && !this.readOnly && this.hasDownArrow){
-				dojo.addClass(this.downArrowNode, "dijitArrowButtonActive");
-			}
-		},
+	var str = dateObject.toString(); // Start looking in toString
+	var tz = ''; // The result -- return empty string if nothing found
+	var match;
 
-		_arrowIdle: function(){
-			if(!this.disabled && !this.readOnly && this.hasDownArrow){
-				dojo.removeClass(this.downArrowNode, "dojoArrowButtonPushed");
+	// 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];
 			}
-		},
+		}
+	}
 
-		// FIXME: For 2.0, rename to "_compositionEnd"
-		compositionend: function(/*Event*/ evt){
-			// summary:
-			//		When inputting characters using an input method, such as
-			//		Asian languages, it will generate this event instead of
-			//		onKeyDown event.
-			//		Note: this event is only triggered in FF (not in IE)
-			// tags:
-			//		private
-			this._onKeyPress({charCode:-1});
-		},
+	// Make sure it doesn't somehow end up return AM or PM
+	return (tz == 'AM' || tz == 'PM') ? '' : tz; // String
+}
 
-		//////////// INITIALIZATION METHODS ///////////////////////////////////////
+// Utility methods to do arithmetic calculations with Dates
 
-		constructor: function(){
-			this.query={};
-			this.fetchProperties={};
-		},
+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"
 
-		postMixInProperties: function(){
-			if(!this.hasDownArrow){
-				this.baseClass = "dijitTextBox";
-			}
-			if(!this.store){
-				var srcNodeRef = this.srcNodeRef;
+	// Extra step required in copy for IE - see #3112
+	date1 = new Date(+date1);
+	date2 = new Date(+(date2 || new Date()));
+
+	if(portion == "date"){
+		// Ignore times and compare dates.
+		date1.setHours(0, 0, 0, 0);
+		date2.setHours(0, 0, 0, 0);
+	}else if(portion == "time"){
+		// Ignore dates and compare times.
+		date1.setFullYear(0, 0, 0);
+		date2.setFullYear(0, 0, 0);
+	}
+	
+	if(date1 > date2){ return 1; } // int
+	if(date1 < date2){ return -1; } // int
+	return 0; // int
+};
 
-				// if user didn't specify store, then assume there are option tags
-				this.store = new dijit.form._ComboBoxDataStore(srcNodeRef);
+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.
 
-				// 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
+	var sum = new Date(+date); // convert to Number before copying to accomodate IE (#3112)
+	var fixOvershoot = false;
+	var property = "Date";
 
-				// 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());
-					}
-				}
-			}
-			this.inherited(arguments);
-		},
-		
-		postCreate: function(){
-			// summary:
-			//		Subclasses must call this method from their postCreate() methods
-			// tags: protected
+	switch(interval){
+		case "day":
+			break;
+		case "weekday":
+			//i18n FIXME: assumes Saturday/Sunday weekend, but this is not always true.  see dojo.cldr.supplemental
 
-			//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);
-				
+			// 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);
 			}
-			this.inherited(arguments);
-		},
-
-		uninitialize: function(){
-			if(this._popupWidget){
-				this._hideResultList();
-				this._popupWidget.destroy();
+			// 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;
 			}
-		},
-
-		_getMenuLabelFromItem: function(/*Item*/ item){
-			var label = this.store.getValue(item, this.labelAttr || this.searchAttr);
-			var labelType = this.labelType;
-			// If labelType is not "text" we don't want to screw any markup ot whatever.
-			if (this.highlightMatch!="none" && this.labelType=="text" && this._lastInput){
-				label = this.doHighlight(label, this._escapeHtml(this._lastInput));
-				labelType = "html";
+			// 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;
 			}
-			return {html: labelType=="html", label: label};
-		},
-		
-		doHighlight: function(/*String*/label, /*String*/find){
-			// summary:
-			//		Highlights the string entered by the user in the menu.  By default this
-			//		highlights the first occurence found. Override this method
-			//		to implement your custom highlighing.
-			// tags:
-			//		protected
-
-			// Add greedy when this.highlightMatch=="all"
-			var modifiers = "i"+(this.highlightMatch=="all"?"g":"");
-			var escapedLabel = this._escapeHtml(label);
-			find = dojo.regexp.escapeString(find); // escape regexp special chars
-			var ret = escapedLabel.replace(new RegExp("(^|\\s)("+ find +")", modifiers),
-					'$1<span class="dijitComboBoxHighlightMatch">$2</span>');
-			return ret;// returns String, (almost) valid HTML (entities encoded)
-		},
-		
-		_escapeHtml: function(/*string*/str){
-			// TODO Should become dojo.html.entities(), when exists use instead
-			// summary:
-			//		Adds escape sequences for special characters in XML: &<>"'
-			str = String(str).replace(/&/gm, "&").replace(/</gm, "<")
-				.replace(/>/gm, ">").replace(/"/gm, """);
-			return str; // string
-		},
+			// Increment by number of weeks plus leftover days plus
+			// weekend adjustments
+			amount = (7 * weeks) + days + adj;
+			break;
+		case "year":
+			property = "FullYear";
+			// Keep increment/decrement from 2/29 out of March
+			fixOvershoot = true;
+			break;
+		case "week":
+			amount *= 7;
+			break;
+		case "quarter":
+			// Naive quarter is just three months
+			amount *= 3;
+			// fallthrough...
+		case "month":
+			// Reset to last day of month if you overshoot
+			fixOvershoot = true;
+			property = "Month";
+			break;
+//		case "hour":
+//		case "minute":
+//		case "second":
+//		case "millisecond":
+		default:
+			property = "UTC"+interval.charAt(0).toUpperCase() + interval.substring(1) + "s";
+	}
 
-		open: function(){
-			// summary:
-			//		Opens the drop down menu.  TODO: rename to _open.
-			// tags:
-			//		private
-			this._isShowingNow=true;
-			return dijit.popup.open({
-				popup: this._popupWidget,
-				around: this.domNode,
-				parent: this
-			});
-		},
-		
-		reset: function(){
-			// Overrides the _FormWidget.reset().
-			// Additionally reset the .item (to clean up).
-			this.item = null;
-			this.inherited(arguments);
-		}
-		
+	if(property){
+		sum["set"+property](sum["get"+property]()+amount);
 	}
-);
 
-dojo.declare(
-	"dijit.form._ComboBoxMenu",
-	[dijit._Widget, dijit._Templated],
-	{
-		// summary:
-		//		Focus-less menu for internal use in `dijit.form.ComboBox`
-		// tags:
-		//		private
+	if(fixOvershoot && (sum.getDate() < date.getDate())){
+		sum.setDate(0);
+	}
 
-		templateString: "<ul class='dijitReset dijitMenu' dojoAttachEvent='onmousedown:_onMouseDown,onmouseup:_onMouseUp,onmouseover:_onMouseOver,onmouseout:_onMouseOut' tabIndex='-1' style='overflow: \"auto\"; overflow-x: \"hidden\";'>"
-				+"<li class='dijitMenuItem dijitMenuPreviousButton' dojoAttachPoint='previousButton' waiRole='option'></li>"
-				+"<li class='dijitMenuItem dijitMenuNextButton' dojoAttachPoint='nextButton' waiRole='option'></li>"
-			+"</ul>",
+	return sum; // Date
+};
 
-		// _messages: Object
-		//		Holds "next" and "previous" text for paging buttons on drop down
-		_messages: null,
+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".
 
-		postMixInProperties: function(){
-			this._messages = dojo.i18n.getLocalization("dijit.form", "ComboBox", this.lang);
-			this.inherited(arguments);
-		},
+	date2 = date2 || new Date();
+	interval = interval || "day";
+	var yearDiff = date2.getFullYear() - date1.getFullYear();
+	var delta = 1; // Integer return value
 
-		_setValueAttr: function(/*Object*/ value){
-			this.value = value;
-			this.onChange(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;
 
-		// stubs
-		onChange: function(/*Object*/ value){
-			// summary:
-			//		Notifies ComboBox/FilteringSelect that user clicked an option in the drop down menu.
-			//		Probably should be called onSelect.
-			// tags:
-			//		callback
-		},
-		onPage: function(/*Number*/ direction){
-			// summary:
-			//		Notifies ComboBox/FilteringSelect that user clicked to advance to next/previous page.
-			// tags:
-			//		callback
-		},
-
-		postCreate: function(){
-			// fill in template with i18n messages
-			this.previousButton.innerHTML = this._messages["previousMessage"];
-			this.nextButton.innerHTML = this._messages["nextMessage"];
-			this.inherited(arguments);
-		},
-
-		onClose: function(){
-			// summary:
-			//		Callback from dijit.popup code to this widget, notifying it that it closed
-			// tags:
-			//		private
-			this._blurOptionNode();
-		},
-
-		_createOption: function(/*Object*/ item, labelFunc){
-			// summary: 
-			//		Creates an option to appear on the popup menu subclassed by
-			//		`dijit.form.FilteringSelect`.
-
-			var labelObject = labelFunc(item);
-			var menuitem = dojo.doc.createElement("li");
-			dijit.setWaiRole(menuitem, "option");
-			if(labelObject.html){
-				menuitem.innerHTML = labelObject.label;
+			// Even number of weeks
+			if(mod == 0){
+				days = weeks*5;
 			}else{
-				menuitem.appendChild(
-					dojo.doc.createTextNode(labelObject.label)
-				);
-			}
-			// #3250: in blank options, assign a normal height
-			if(menuitem.innerHTML == ""){
-				menuitem.innerHTML = " ";
-			}
-			menuitem.item=item;
-			return menuitem;
-		},
+				// Weeks plus spare change (< 7 days)
+				var adj = 0;
+				var aDay = date1.getDay();
+				var bDay = date2.getDay();
 
-		createOptions: function(results, dataObject, labelFunc){
-			// summary:
-			//		Fills in the items in the drop down list
-			// results:
-			//		Array of dojo.data items
-			// dataObject:
-			//		dojo.data store
-			// labelFunc:
-			//		Function to produce a label in the drop down list from a dojo.data item
+				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();
 
-			//this._dataObject=dataObject;
-			//this._dataObject.onComplete=dojo.hitch(comboBox, comboBox._openResultList);
-			// display "Previous . . ." button
-			this.previousButton.style.display = (dataObject.start == 0) ? "none" : "";
-			dojo.attr(this.previousButton, "id", this.id + "_prev");
-			// create options using _createOption function defined by parent
-			// ComboBox (or FilteringSelect) class
-			// #2309:
-			//		iterate over cache nondestructively
-			dojo.forEach(results, function(item, i){
-				var menuitem = this._createOption(item, labelFunc);
-				menuitem.className = "dijitReset dijitMenuItem";
-				dojo.attr(menuitem, "id", this.id + i);
-				this.domNode.insertBefore(menuitem, this.nextButton);
-			}, this);
-			// display "Next . . ." button
-			var displayMore = false;
-			//Try to determine if we should show 'more'...
-			if(dataObject._maxOptions && dataObject._maxOptions != -1){
-				if((dataObject.start + dataObject.count) < dataObject._maxOptions){
-					displayMore = true;
-				}else if((dataObject.start + dataObject.count) > (dataObject._maxOptions - 1)){
-					//Weird return from a datastore, where a start + count > maxOptions
-					//implies maxOptions isn't really valid and we have to go into faking it.
-					//And more or less assume more if count == results.length
-					if(dataObject.count == results.length){
-						displayMore = true;
+				// 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;
 					}
 				}
-			}else if(dataObject.count == results.length){
-				//Don't know the size, so we do the best we can based off count alone.
-				//So, if we have an exact match to count, assume more.
-				displayMore = true;
+				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();
+	}
 
-			this.nextButton.style.display = displayMore ? "" : "none";
-			dojo.attr(this.nextButton,"id", this.id + "_next");
-		},
+	// Round for fractional values and DST leaps
+	return Math.round(delta); // Number (integer)
+};
 
-		clearResultList: function(){
-			// summary:
-			//		Clears the entries in the drop down list, but of course keeps the previous and next buttons.
-			while(this.domNode.childNodes.length>2){
-				this.domNode.removeChild(this.domNode.childNodes[this.domNode.childNodes.length-2]);
-			}
-		},
+}
 
-		// these functions are called in showResultList
-		getItems: function(){
-			// summary:
-			//		Called from _showResultList().   Returns DOM Nodes representing the items in the drop down list.
-			return this.domNode.childNodes;
-		},
+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");
 
-		getListLength: function(){
-			// summary:
-			//		Called from _showResultList().   Returns number of  items in the drop down list,
-			//		not including next and previous buttons.
-			return this.domNode.childNodes.length-2;
-		},
+// Localization methods for Date.   Honor local customs using locale-dependent dojo.cldr data.
 
-		_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._setValueAttr({ target: tgt }, true);
-			}
-		},
 
-		_onMouseOver: function(/*Event*/ evt){
-			if(evt.target === this.domNode){ return; }
-			var tgt = evt.target;
-			if(!(tgt == this.previousButton || tgt == this.nextButton)){
-				// while the clicked node is inside the div
-				while(!tgt.item){
-					// recurse to the top
-					tgt = tgt.parentNode;
-				}
-			}
-			this._focusOptionNode(tgt);
-		},
 
-		_onMouseOut: function(/*Event*/ evt){
-			if(evt.target === this.domNode){ return; }
-			this._blurOptionNode();
-		},
 
-		_focusOptionNode: function(/*DomNode*/ node){
-			// summary:
-			//		Does the actual highlight.
-			if(this._highlighted_option != node){
-				this._blurOptionNode();
-				this._highlighted_option = node;
-				dojo.addClass(this._highlighted_option, "dijitMenuItemSelected");
-			}
-		},
 
-		_blurOptionNode: function(){
-			// summary:
-			//		Removes highlight on highlighted option.
-			if(this._highlighted_option){
-				dojo.removeClass(this._highlighted_option, "dijitMenuItemSelected");
-				this._highlighted_option = null;
-			}
-		},
 
-		_highlightNextOption: function(){
-			//	summary:
-			// 		Highlight the item just below the current selection.
-			// 		If nothing selected, highlight first option.
+// Load the bundles containing localization information for
+// names and formats
 
-			// 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);
+
+//NOTE: Everything in this module assumes Gregorian calendars.
+// Other calendars will be implemented in separate modules.
+
+(function(){
+	// Format a pattern without literals
+	function formatPattern(dateObject, bundle, options, pattern){
+		return pattern.replace(/([a-z])\1*/ig, function(match){
+			var s, pad,
+				c = match.charAt(0),
+				l = match.length,
+				widthList = ["abbr", "wide", "narrow"];
+			switch(c){
+				case 'G':
+					s = bundle[(l < 4) ? "eraAbbr" : "eraNames"][dateObject.getFullYear() < 0 ? 0 : 1];
+					break;
+				case 'y':
+					s = dateObject.getFullYear();
+					switch(l){
+						case 1:
+							break;
+						case 2:
+							if(!options.fullYear){
+								s = String(s); s = s.substr(s.length - 2);
+								break;
+							}
+							// fallthrough
+						default:
+							pad = true;
+					}
+					break;
+				case 'Q':
+				case 'q':
+					s = Math.ceil((dateObject.getMonth()+1)/3);
+//					switch(l){
+//						case 1: case 2:
+							pad = true;
+//							break;
+//						case 3: case 4: // unimplemented
+//					}
+					break;
+				case 'M':
+					var m = dateObject.getMonth();
+					if(l<3){
+						s = m+1; pad = true;
+					}else{
+						var propM = ["months", "format", widthList[l-3]].join("-");
+						s = bundle[propM][m];
+					}
+					break;
+				case 'w':
+					var firstDay = 0;
+					s = dojo.date.locale._getWeekOfYear(dateObject, firstDay); pad = true;
+					break;
+				case 'd':
+					s = dateObject.getDate(); pad = true;
+					break;
+				case 'D':
+					s = dojo.date.locale._getDayOfYear(dateObject); pad = true;
+					break;
+				case 'E':
+					var d = dateObject.getDay();
+					if(l<3){
+						s = d+1; pad = true;
+					}else{
+						var propD = ["days", "format", widthList[l-3]].join("-");
+						s = bundle[propD][d];
+					}
+					break;
+				case 'a':
+					var timePeriod = (dateObject.getHours() < 12) ? 'am' : 'pm';
+					s = bundle[timePeriod];
+					break;
+				case 'h':
+				case 'H':
+				case 'K':
+				case 'k':
+					var h = dateObject.getHours();
+					// strange choices in the date format make it impossible to write this succinctly
+					switch (c){
+						case 'h': // 1-12
+							s = (h % 12) || 12;
+							break;
+						case 'H': // 0-23
+							s = h;
+							break;
+						case 'K': // 0-11
+							s = (h % 12);
+							break;
+						case 'k': // 1-24
+							s = h || 24;
+							break;
+					}
+					pad = true;
+					break;
+				case 'm':
+					s = dateObject.getMinutes(); pad = true;
+					break;
+				case 's':
+					s = dateObject.getSeconds(); pad = true;
+					break;
+				case 'S':
+					s = Math.round(dateObject.getMilliseconds() * Math.pow(10, l-3)); pad = true;
+					break;
+				case 'v': // FIXME: don't know what this is. seems to be same as z?
+				case 'z':
+					// We only have one timezone to offer; the one from the browser
+					s = dojo.date.locale._getZone(dateObject, true, options);
+					if(s){break;}
+					l=4;
+					// fallthrough... use GMT if tz not available
+				case 'Z':
+					var offset = dojo.date.locale._getZone(dateObject, false, options);
+					var tz = [
+						(offset<=0 ? "+" : "-"),
+						dojo.string.pad(Math.floor(Math.abs(offset)/60), 2),
+						dojo.string.pad(Math.abs(offset)% 60, 2)
+					];
+					if(l==4){
+						tz.splice(0, 0, "GMT");
+						tz.splice(3, 0, ":");
+					}
+					s = tz.join("");
+					break;
+//				case 'Y': case 'u': case 'W': case 'F': case 'g': case 'A': case 'e':
+//					console.log(match+" modifier unimplemented");
+				default:
+					throw new Error("dojo.date.locale.format: invalid pattern char: "+pattern);
+			}
+			if(pad){ s = dojo.string.pad(s, l); }
+			return s;
+		});
+	}
+
+/*=====
+	dojo.date.locale.__FormatOptions = function(){
+	//	selector: String
+	//		choice of 'time','date' (default: date and time)
+	//	formatLength: String
+	//		choice of long, short, medium or full (plus any custom additions).  Defaults to 'short'
+	//	datePattern:String
+	//		override pattern with this string
+	//	timePattern:String
+	//		override pattern with this string
+	//	am: String
+	//		override strings for am in times
+	//	pm: String
+	//		override strings for pm in times
+	//	locale: String
+	//		override the locale used to determine formatting rules
+	//	fullYear: Boolean
+	//		(format only) use 4 digit years whenever 2 digit years are called for
+	//	strict: Boolean
+	//		(parse only) strict parsing, off by default
+		this.selector = selector;
+		this.formatLength = formatLength;
+		this.datePattern = datePattern;
+		this.timePattern = timePattern;
+		this.am = am;
+		this.pm = pm;
+		this.locale = locale;
+		this.fullYear = fullYear;
+		this.strict = strict;
+	}
+=====*/
+
+dojo.date.locale._getZone = function(/*Date*/dateObject, /*boolean*/getName, /*dojo.date.locale.__FormatOptions?*/options){
+	// summary:
+	//		Returns the zone (or offset) for the given date and options.  This
+	//		is broken out into a separate function so that it can be overridden
+	//		by timezone-aware code.
+	//
+	// dateObject:
+	//		the date and/or time being formatted.
+	//
+	// getName:
+	//		Whether to return the timezone string (if true), or the offset (if false)
+	//
+	// options:
+	//		The options being used for formatting
+	if(getName){
+		return dojo.date.getTimezoneName(dateObject);
+	}else{
+		return dateObject.getTimezoneOffset();
+	}
+};
+
+
+dojo.date.locale.format = function(/*Date*/dateObject, /*dojo.date.locale.__FormatOptions?*/options){
+	// summary:
+	//		Format a Date object as a String, using locale-specific settings.
+	//
+	// description:
+	//		Create a string from a Date object using a known localized pattern.
+	//		By default, this method formats both date and time from dateObject.
+	//		Formatting patterns are chosen appropriate to the locale.  Different
+	//		formatting lengths may be chosen, with "full" used by default.
+	//		Custom patterns may be used or registered with translations using
+	//		the dojo.date.locale.addCustomFormats method.
+	//		Formatting patterns are implemented using [the syntax described at
+	//		unicode.org](http://www.unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns)
+	//
+	// dateObject:
+	//		the date and/or time to be formatted.  If a time only is formatted,
+	//		the values in the year, month, and day fields are irrelevant.  The
+	//		opposite is true when formatting only dates.
+
+	options = options || {};
+
+	var locale = dojo.i18n.normalizeLocale(options.locale),
+		formatLength = options.formatLength || 'short',
+		bundle = dojo.date.locale._getGregorianBundle(locale),
+		str = [],
+		sauce = dojo.hitch(this, formatPattern, dateObject, bundle, options);
+	if(options.selector == "year"){
+		return _processPattern(bundle["dateFormatItem-yyyy"] || "yyyy", sauce);
+	}
+	var pattern;
+	if(options.selector != "date"){
+		pattern = options.timePattern || bundle["timeFormat-"+formatLength];
+		if(pattern){str.push(_processPattern(pattern, sauce));}
+	}
+	if(options.selector != "time"){
+		pattern = options.datePattern || bundle["dateFormat-"+formatLength];
+		if(pattern){str.push(_processPattern(pattern, sauce));}
+	}
+
+	return str.length == 1 ? str[0] : bundle["dateTimeFormat-"+formatLength].replace(/\{(\d+)\}/g,
+		function(match, key){ return str[key]; }); // String
+};
+
+dojo.date.locale.regexp = function(/*dojo.date.locale.__FormatOptions?*/options){
+	// summary:
+	//		Builds the regular needed to parse a localized date
+
+	return dojo.date.locale._parseInfo(options).regexp; // String
+};
+
+dojo.date.locale._parseInfo = function(/*dojo.date.locale.__FormatOptions?*/options){
+	options = options || {};
+	var locale = dojo.i18n.normalizeLocale(options.locale),
+		bundle = dojo.date.locale._getGregorianBundle(locale),
+		formatLength = options.formatLength || 'short',
+		datePattern = options.datePattern || bundle["dateFormat-" + formatLength],
+		timePattern = options.timePattern || bundle["timeFormat-" + formatLength],
+		pattern;
+	if(options.selector == 'date'){
+		pattern = datePattern;
+	}else if(options.selector == 'time'){
+		pattern = timePattern;
+	}else{
+		pattern = bundle["dateTimeFormat-"+formatLength].replace(/\{(\d+)\}/g,
+			function(match, key){ return [timePattern, datePattern][key]; });
+	}
+
+	var tokens = [],
+		re = _processPattern(pattern, dojo.hitch(this, _buildDateTimeRE, tokens, bundle, options));
+	return {regexp: re, tokens: tokens, bundle: bundle};
+};
+
+dojo.date.locale.parse = function(/*String*/value, /*dojo.date.locale.__FormatOptions?*/options){
+	// summary:
+	//		Convert a properly formatted string to a primitive Date object,
+	//		using locale-specific settings.
+	//
+	// description:
+	//		Create a Date object from a string using a known localized pattern.
+	//		By default, this method parses looking for both date and time in the string.
+	//		Formatting patterns are chosen appropriate to the locale.  Different
+	//		formatting lengths may be chosen, with "full" used by default.
+	//		Custom patterns may be used or registered with translations using
+	//		the dojo.date.locale.addCustomFormats method.
+	//	
+	//		Formatting patterns are implemented using [the syntax described at
+	//		unicode.org](http://www.unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns)
+	//		When two digit years are used, a century is chosen according to a sliding 
+	//		window of 80 years before and 20 years after present year, for both `yy` and `yyyy` patterns.
+	//		year < 100CE requires strict mode.
+	//
+	// value:
+	//		A string representation of a date
+
+	var info = dojo.date.locale._parseInfo(options),
+		tokens = info.tokens, bundle = info.bundle,
+		re = new RegExp("^" + info.regexp + "$", info.strict ? "" : "i"),
+		match = re.exec(value);
+
+	if(!match){ return null; } // null
+
+	var widthList = ['abbr', 'wide', 'narrow'],
+		result = [1970,0,1,0,0,0,0], // will get converted to a Date at the end
+		amPm = "",
+		valid = dojo.every(match, function(v, i){
+		if(!i){return true;}
+		var token=tokens[i-1];
+		var l=token.length;
+		switch(token.charAt(0)){
+			case 'y':
+				if(l != 2 && options.strict){
+					//interpret year literally, so '5' would be 5 A.D.
+					result[0] = v;
+				}else{
+					if(v<100){
+						v = Number(v);
+						//choose century to apply, according to a sliding window
+						//of 80 years before and 20 years after present year
+						var year = '' + new Date().getFullYear(),
+							century = year.substring(0, 2) * 100,
+							cutoff = Math.min(Number(year.substring(2, 4)) + 20, 99),
+							num = (v < cutoff) ? century + v : century - 100 + v;
+						result[0] = num;
+					}else{
+						//we expected 2 digits and got more...
+						if(options.strict){
+							return false;
+						}
+						//interpret literally, so '150' would be 150 A.D.
+						//also tolerate '1950', if 'yyyy' input passed to 'yy' format
+						result[0] = v;
+					}
+				}
+				break;
+			case 'M':
+				if(l>2){
+					var months = bundle['months-format-' + widthList[l-3]].concat();
+					if(!options.strict){
+						//Tolerate abbreviating period in month part
+						//Case-insensitive comparison
+						v = v.replace(".","").toLowerCase();
+						months = dojo.map(months, function(s){ return s.replace(".","").toLowerCase(); } );
+					}
+					v = dojo.indexOf(months, v);
+					if(v == -1){
+//						console.log("dojo.date.locale.parse: Could not parse month name: '" + v + "'.");
+						return false;
+					}
+				}else{
+					v--;
+				}
+				result[1] = v;
+				break;
+			case 'E':
+			case 'e':
+				var days = bundle['days-format-' + widthList[l-3]].concat();
+				if(!options.strict){
+					//Case-insensitive comparison
+					v = v.toLowerCase();
+					days = dojo.map(days, function(d){return d.toLowerCase();});
+				}
+				v = dojo.indexOf(days, v);
+				if(v == -1){
+//					console.log("dojo.date.locale.parse: Could not parse weekday name: '" + v + "'.");
+					return false;
+				}
+
+				//TODO: not sure what to actually do with this input,
+				//in terms of setting something on the Date obj...?
+				//without more context, can't affect the actual date
+				//TODO: just validate?
+				break;
+			case 'D':
+				result[1] = 0;
+				// fallthrough...
+			case 'd':
+				result[2] = v;
+				break;
+			case 'a': //am/pm
+				var am = options.am || bundle.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.log("dojo.date.locale.parse: Could not parse am/pm part.");
+					return false;
+				}
+
+				// we might not have seen the hours field yet, so store the state and apply hour change later
+				amPm = (v == pm) ? 'p' : (v == am) ? 'a' : '';
+				break;
+			case 'K': //hour (1-24)
+				if(v == 24){ v = 0; }
+				// fallthrough...
+			case 'h': //hour (1-12)
+			case 'H': //hour (0-23)
+			case 'k': //hour (0-11)
+				//TODO: strict bounds checking, padding
+				if(v > 23){
+//					console.log("dojo.date.locale.parse: Illegal hours value");
+					return false;
+				}
+
+				//in the 12-hour case, adjusting for am/pm requires the 'a' part
+				//which could come before or after the hour, so we will adjust later
+				result[3] = v;
+				break;
+			case 'm': //minutes
+				result[4] = v;
+				break;
+			case 's': //seconds
+				result[5] = v;
+				break;
+			case 'S': //milliseconds
+				result[6] = v;
+//				break;
+//			case 'w':
+//TODO				var firstDay = 0;
+//			default:
+//TODO: throw?
+//				console.log("dojo.date.locale.parse: unsupported pattern char=" + token.charAt(0));
+		}
+		return true;
+	});
+
+	var hours = +result[3];
+	if(amPm === 'p' && hours < 12){
+		result[3] = hours + 12; //e.g., 3pm -> 15
+	}else if(amPm === 'a' && hours == 12){
+		result[3] = 0; //12am -> 0
+	}
+
+	//TODO: implement a getWeekday() method in order to test 
+	//validity of input strings containing 'EEE' or 'EEEE'...
+
+	var dateObject = new Date(result[0], result[1], result[2], result[3], result[4], result[5], result[6]); // Date
+	if(options.strict){
+		dateObject.setFullYear(result[0]);
+	}
+
+	// Check for overflow.  The Date() constructor normalizes things like April 32nd...
+	//TODO: why isn't this done for times as well?
+	var allTokens = tokens.join(""),
+		dateToken = allTokens.indexOf('d') != -1,
+		monthToken = allTokens.indexOf('M') != -1;
+
+	if(!valid ||
+		(monthToken && dateObject.getMonth() > result[1]) ||
+		(dateToken && dateObject.getDate() > result[2])){
+		return null;
+	}
+
+	// Check for underflow, due to DST shifts.  See #9366
+	// This assumes a 1 hour dst shift correction at midnight
+	// We could compare the timezone offset after the shift and add the difference instead.
+	if((monthToken && dateObject.getMonth() < result[1]) ||
+		(dateToken && dateObject.getDate() < result[2])){
+		dateObject = dojo.date.add(dateObject, "hour", 1);
+	}
+
+	return dateObject; // Date
+};
+
+function _processPattern(pattern, applyPattern, applyLiteral, applyAll){
+	//summary: Process a pattern with literals in it
+
+	// Break up on single quotes, treat every other one as a literal, except '' which becomes '
+	var identity = function(x){return x;};
+	applyPattern = applyPattern || identity;
+	applyLiteral = applyLiteral || identity;
+	applyAll = applyAll || identity;
+
+	//split on single quotes (which escape literals in date format strings) 
+	//but preserve escaped single quotes (e.g., o''clock)
+	var chunks = pattern.match(/(''|[^'])+/g),
+		literal = pattern.charAt(0) == "'";
+
+	dojo.forEach(chunks, function(chunk, i){
+		if(!chunk){
+			chunks[i]='';
+		}else{
+			chunks[i]=(literal ? applyLiteral : applyPattern)(chunk);
+			literal = !literal;
+		}
+	});
+	return applyAll(chunks.join(''));
+}
+
+function _buildDateTimeRE(tokens, bundle, options, pattern){
+	pattern = dojo.regexp.escapeString(pattern);
+	if(!options.strict){ pattern = pattern.replace(" a", " ?a"); } // kludge to tolerate no space before am/pm
+	return pattern.replace(/([a-z])\1*/ig, function(match){
+		// Build a simple regexp.  Avoid captures, which would ruin the tokens list
+		var s,
+			c = match.charAt(0),
+			l = match.length,
+			p2 = '', p3 = '';
+		if(options.strict){
+			if(l > 1){ p2 = '0' + '{'+(l-1)+'}'; }
+			if(l > 2){ p3 = '0' + '{'+(l-2)+'}'; }
+		}else{
+			p2 = '0?'; p3 = '0{0,2}';
+		}
+		switch(c){
+			case 'y':
+				s = '\\d{2,4}';
+				break;
+			case 'M':
+				s = (l>2) ? '\\S+?' : p2+'[1-9]|1[0-2]';
+				break;
+			case 'D':
+				s = p2+'[1-9]|'+p3+'[1-9][0-9]|[12][0-9][0-9]|3[0-5][0-9]|36[0-6]';
+				break;
+			case 'd':
+				s = '[12]\\d|'+p2+'[1-9]|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(); }
+					if(s.indexOf('.') != -1){ s += '|' + s.replace(/\./g, ""); }
 				}
-			}
-			// 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);
-		},
+				s = s.replace(/\./g, "\\.");
+				break;
+			default:
+			// case 'v':
+			// case 'z':
+			// case 'Z':
+				s = ".*";
+//				console.log("parse of date format, pattern=" + pattern);
+		}
 
-		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);
-		},
+		if(tokens){ tokens.push(match); }
 
-		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);
-		},
+		return "(" + s + ")"; // add capture
+	}).replace(/[\xa0 ]/g, "[\\s\\xa0]"); // normalize whitespace.  Need explicit handling of \xa0 for IE.
+}
+})();
 
-		_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);
+(function(){
+var _customFormats = [];
+dojo.date.locale.addCustomFormats = function(/*String*/packageName, /*String*/bundleName){
+	// summary:
+	//		Add a reference to a bundle containing localized custom formats to be
+	//		used by date/time formatting and parsing routines.
+	//
+	// description:
+	//		The user may add custom localized formats where the bundle has properties following the
+	//		same naming convention used by dojo.cldr: `dateFormat-xxxx` / `timeFormat-xxxx`
+	//		The pattern string should match the format used by the CLDR.
+	//		See dojo.date.locale.format() for details.
+	//		The resources must be loaded by dojo.requireLocalization() prior to use
+
+	_customFormats.push({pkg:packageName,name:bundleName});
+};
+
+dojo.date.locale._getGregorianBundle = function(/*String*/locale){
+	var gregorian = {};
+	dojo.forEach(_customFormats, function(desc){
+		var bundle = dojo.i18n.getLocalization(desc.pkg, desc.name, locale);
+		gregorian = dojo.mixin(gregorian, bundle);
+	}, this);
+	return gregorian; /*Object*/
+};
+})();
+
+dojo.date.locale.addCustomFormats("dojo.cldr","gregorian");
+
+dojo.date.locale.getNames = function(/*String*/item, /*String*/type, /*String?*/context, /*String?*/locale){
+	// summary:
+	//		Used to get localized strings from dojo.cldr for day or month names.
+	//
+	// item:
+	//	'months' || 'days'
+	// type:
+	//	'wide' || 'narrow' || 'abbr' (e.g. "Monday", "Mon", or "M" respectively, in English)
+	// context:
+	//	'standAlone' || 'format' (default)
+	// locale:
+	//	override locale used to find the names
+
+	var label,
+		lookup = dojo.date.locale._getGregorianBundle(locale),
+		props = [item, context, type];
+	if(context == 'standAlone'){
+		var key = props.join('-');
+		label = lookup[key];
+		// Fall back to 'format' flavor of name
+		if(label[0] == 1){ label = undefined; } // kludge, in the absense of real aliasing support in dojo.cldr
+	}
+	props[1] = 'format';
+
+	// return by copy so changes won't be made accidentally to the in-memory model
+	return (label || lookup[props.join('-')]).concat(); /*Array*/
+};
+
+dojo.date.locale.isWeekend = function(/*Date?*/dateObject, /*String?*/locale){
+	// summary:
+	//	Determines if the date falls on a weekend, according to local custom.
+
+	var weekend = dojo.cldr.supplemental.getWeekend(locale),
+		day = (dateObject || new Date()).getDay();
+	if(weekend.end < weekend.start){
+		weekend.end += 7;
+		if(day < weekend.start){ day += 7; }
+	}
+	return day >= weekend.start && day <= weekend.end; // Boolean
+};
+
+// These are used only by format and strftime.  Do they need to be public?  Which module should they go in?
+
+dojo.date.locale._getDayOfYear = function(/*Date*/dateObject){
+	// summary: gets the day of the year as represented by dateObject
+	return dojo.date.difference(new Date(dateObject.getFullYear(), 0, 1, dateObject.getHours()), dateObject) + 1; // Number
+};
+
+dojo.date.locale._getWeekOfYear = function(/*Date*/dateObject, /*Number*/firstDayOfWeek){
+	if(arguments.length == 1){ firstDayOfWeek = 0; } // Sunday
+
+	var firstDayOfYear = new Date(dateObject.getFullYear(), 0, 1).getDay(),
+		adj = (firstDayOfYear - firstDayOfWeek + 7) % 7,
+		week = Math.floor((dojo.date.locale._getDayOfYear(dateObject) + adj - 1) / 7);
+
+	// if year starts on the specified day, start counting weeks at 1
+	if(firstDayOfYear == firstDayOfWeek){ week++; }
+
+	return week; // Number
+};
+
+}
+
+if(!dojo._hasResource["dijit.Calendar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.Calendar"] = true;
+dojo.provide("dijit.Calendar");
+
+
+
+
+
+
+
+
+dojo.declare(
+	"dijit.Calendar",
+	[dijit._Widget, dijit._Templated],
+	{
+		// summary:
+		//		A simple GUI for choosing a date in the context of a monthly calendar.
+		//
+		// description:
+		//		A simple GUI for choosing a date in the context of a monthly calendar.
+		//		This widget can't be used in a form because it doesn't serialize the date to an
+		//		`<input>` field.  For a form element, use dijit.form.DateTextBox instead.
+		//
+		//		Note that the parser takes all dates attributes passed in the
+		//		[RFC 3339 format](http://www.faqs.org/rfcs/rfc3339.html), e.g. `2005-06-30T08:05:00-07:00`
+		//		so that they are serializable and locale-independent.
+		//
+		// example:
+		//	|	var calendar = new dijit.Calendar({}, dojo.byId("calendarNode"));
+		//
+		// example:
+		//	|	<div dojoType="dijit.Calendar"></div>
+
+		templateString: dojo.cache("dijit", "templates/Calendar.html", "<table cellspacing=\"0\" cellpadding=\"0\" class=\"dijitCalendarContainer\" role=\"grid\" dojoAttachEvent=\"onkeypress: _onKeyPress\">\n\t<thead>\n\t\t<tr class=\"dijitReset dijitCalendarMonthContainer\" valign=\"top\">\n\t\t\t<th class='dijitReset' dojoAttachPoint=\"decrementMonth\">\n\t\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitCalendarIncrementControl dijitCalendarDecrease\" waiRole=\"presentation\">\n\t\t\t\ [...]
+
+		// value: Date
+		//		The currently selected Date
+		value: new Date(),
+
+		// datePackage: String
+		//		JavaScript namespace to find Calendar routines.  Uses Gregorian Calendar routines
+		//		at dojo.date by default.
+		datePackage: "dojo.date",
+
+		// dayWidth: String
+		//		How to represent the days of the week in the calendar header. See dojo.date.locale
+		dayWidth: "narrow",
+
+		// tabIndex: Integer
+		//		Order fields are traversed when user hits the tab key
+		tabIndex: "0",
+
+		attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
+			tabIndex: "domNode"
+ 		}),
+
+		setValue: function(/*Date*/ value){
+			// summary:
+			//      Deprecated.   Used attr('value', ...) instead.
+			// tags:
+			//      deprecated
+			dojo.deprecated("dijit.Calendar:setValue() is deprecated.  Use attr('value', ...) instead.", "", "2.0");
+			this.attr('value', value);
 		},
 
-		_page: function(/*Boolean*/ up){
+		_getValueAttr: function(){
 			// summary:
-			//		Handles page-up and page-down keypresses
+			//		Support getter attr('value')
+			var value = new this.dateClassObj(this.value);
+			value.setHours(0, 0, 0, 0); // return midnight, local time for back-compat
 
-			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();
+			// If daylight savings pushes midnight to the previous date, fix the Date
+			// object to point at 1am so it will represent the correct day. See #9366
+			if(value.getDate() < this.value.getDate()){
+				value = this.dateFuncObj.add(value, "hour", 1);
 			}
-			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();
+			return value;
+		},
+
+		_setValueAttr: function(/*Date*/ value){
+			// summary:
+			//		Support setter attr("value", ...)
+			// description:
+			// 		Set the current date and update the UI.  If the date is disabled, the value will
+			//		not change, but the display will change to the corresponding month.
+			// tags:
+			//      protected
+			if(!this.value || this.dateFuncObj.compare(value, this.value)){
+				value = new this.dateClassObj(value);
+				value.setHours(1); // to avoid issues when DST shift occurs at midnight, see #8521, #9366
+				this.displayMonth = new this.dateClassObj(value);
+				if(!this.isDisabledDate(value, this.lang)){
+					this.value = value;
+					this.onChange(this.attr('value'));
 				}
-				// going backwards
-				var newscroll=this.domNode.scrollTop;
-				scrollamount+=(newscroll-oldscroll)*(up ? -1:1);
-				oldscroll=newscroll;
+				dojo.attr(this.domNode, "aria-label",
+					this.dateLocaleModule.format(value,
+						{selector:"date", formatLength:"full"}));
+				this._populateGrid();
 			}
 		},
 
-		pageUp: function(){
+		_setText: function(node, text){
 			// summary:
-			//		Handles pageup keypress.
-			//		TODO: just call _page directly from handleKey().
+			//		This just sets the content of node to the specified text.
+			//		Can't do "node.innerHTML=text" because of an IE bug w/tables, see #3434.
 			// tags:
-			//		private
-			this._page(true);
+			//      private
+			while(node.firstChild){
+				node.removeChild(node.firstChild);
+			}
+			node.appendChild(dojo.doc.createTextNode(text));
 		},
 
-		pageDown: function(){
+		_populateGrid: function(){
 			// summary:
-			//		Handles pagedown keypress.
-			//		TODO: just call _page directly from handleKey().
+			//      Fills in the calendar grid with each day (1-31)
 			// tags:
-			//		private
-			this._page(false);
-		},
+			//      private
+			var month = this.displayMonth;
+			month.setDate(1);
+			var firstDay = month.getDay(),
+				daysInMonth = this.dateFuncObj.getDaysInMonth(month),
+				daysInPreviousMonth = this.dateFuncObj.getDaysInMonth(this.dateFuncObj.add(month, "month", -1)),
+				today = new this.dateClassObj(),
+				dayOffset = dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);
+			if(dayOffset > firstDay){ dayOffset -= 7; }
 
-		getHighlightedOption: function(){
-			//	summary:
-			//		Returns the highlighted option.
-			var ho = this._highlighted_option;
-			return (ho && ho.parentNode) ? ho : null;
-		},
+			// Iterate through dates in the calendar and fill in date numbers and style info
+			dojo.query(".dijitCalendarDateTemplate", this.domNode).forEach(function(template, i){
+				i += dayOffset;
+				var date = new this.dateClassObj(month),
+					number, clazz = "dijitCalendar", adj = 0;
 
-		handleKey: function(key){
-			switch(key){
-				case dojo.keys.DOWN_ARROW:
-					this._highlightNextOption();
-					break;
-				case dojo.keys.PAGE_DOWN:
-					this.pageDown();
-					break;	
-				case dojo.keys.UP_ARROW:
-					this._highlightPrevOption();
-					break;
-				case dojo.keys.PAGE_UP:
-					this.pageUp();
-					break;	
-			}
-		}
-	}
-);
+				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";
+				}
 
-dojo.declare(
-	"dijit.form.ComboBox",
-	[dijit.form.ValidationTextBox, dijit.form.ComboBoxMixin],
-	{
-		//	summary:
-		//		Auto-completing text box, and base class for dijit.form.FilteringSelect.
-		// 
-		//	description:
-		//		The drop down box's values are populated from an class called
-		//		a data provider, which returns a list of values based on the characters
-		//		that the user has typed into the input box.
-		//		If OPTION tags are used as the data provider via markup,
-		//		then the OPTION tag's child text node is used as the widget value 
-		//		when selected.  The OPTION tag's value attribute is ignored.
-		//		To set the default value when using OPTION tags, specify the selected 
-		//		attribute on 1 of the child OPTION tags.
-		// 
-		//		Some of the options to the ComboBox are actually arguments to the data
-		//		provider.
+				if(adj){
+					date = this.dateFuncObj.add(date, "month", adj);
+				}
+				date.setDate(number);
 
-		_setValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange){
-			// summary:
-			//		Hook so attr('value', value) works.
-			// description:
-			//		Sets the value of the select.
-			if(!value){ value = ''; } // null translates to blank
-			dijit.form.ValidationTextBox.prototype._setValueAttr.call(this, value, priorityChange);
-		}
-	}
-);
+				if(!this.dateFuncObj.compare(date, today, "date")){
+					clazz = "dijitCalendarCurrentDate " + clazz;
+				}
 
-dojo.declare("dijit.form._ComboBoxDataStore", null, {
-	//	summary:
-	//		Inefficient but small data store specialized for inlined `dijit.form.ComboBox` data
-	//
-	//	description:
-	//		Provides a store for inlined data like:
-	//
-	//	|	<select>
-	//	|		<option value="AL">Alabama</option>
-	//	|		...
-	//
-	//		Actually. just implements the subset of dojo.data.Read/Notification
-	//		needed for ComboBox and FilteringSelect to work.
-	//
-	//		Note that an item is just a pointer to the <option> DomNode.
+				if(this._isSelectedDate(date, this.lang)){
+					clazz = "dijitCalendarSelectedDate " + clazz;
+				}
 
-	constructor: function( /*DomNode*/ root){
-		this.root = root;
+				if(this.isDisabledDate(date, this.lang)){
+					clazz = "dijitCalendarDisabledDate " + clazz;
+				}
 
-		dojo.query("> option", root).forEach(function(node){
-			//	TODO: this was added in #3858 but unclear why/if it's needed;  doesn't seem to be.
-			//	If it is needed then can we just hide the select itself instead?
-			//node.style.display="none";
-			node.innerHTML = dojo.trim(node.innerHTML);
-		});
+				var clazz2 = this.getClassForDate(date, this.lang);
+				if(clazz2){
+					clazz = clazz2 + " " + clazz;
+				}
 
-	},
+				template.className = clazz + "Month dijitCalendarDateTemplate";
+				template.dijitDateValue = date.valueOf();
+				var label = dojo.query(".dijitCalendarDateLabel", template)[0],
+					text = date.getDateLocalized ? date.getDateLocalized(this.lang) : date.getDate();
+				this._setText(label, text);
+			}, this);
 
-	getValue: function(	/* item */ item, 
-						/* attribute-name-string */ attribute, 
-						/* value? */ defaultValue){
-		return (attribute == "value") ? item.value : (item.innerText || item.textContent || '');
-	},
+			// Fill in localized month name
+			var monthNames = this.dateLocaleModule.getNames('months', 'wide', 'standAlone', this.lang);
+			this._setText(this.monthLabelNode, monthNames[month.getMonth()]);
 
-	isItemLoaded: function(/* anything */ something) {
-		return true;
-	},
+			// Fill in localized prev/current/next years
+			var y = month.getFullYear() - 1;
+			var d = new this.dateClassObj();
+			dojo.forEach(["previous", "current", "next"], function(name){
+				d.setFullYear(y++);
+				this._setText(this[name+"YearLabelNode"],
+					this.dateLocaleModule.format(d, {selector:'year', locale:this.lang}));
+			}, this);
 
-	getFeatures: function(){
-		return {"dojo.data.api.Read": true, "dojo.data.api.Identity": true};
-	},
-	
-	_fetchItems: function(	/* Object */ args,
-							/* Function */ findCallback, 
-							/* Function */ errorCallback){
-		//	summary: 
-		//		See dojo.data.util.simpleFetch.fetch()
-		if(!args.query){ args.query = {}; }
-		if(!args.query.name){ args.query.name = ""; }
-		if(!args.queryOptions){ args.queryOptions = {}; }
-		var matcher = dojo.data.util.filter.patternToRegExp(args.query.name, args.queryOptions.ignoreCase),
-			items = dojo.query("> option", this.root).filter(function(option){
-				return (option.innerText || option.textContent || '').match(matcher);
-			} );
-		if(args.sort){
-			items.sort(dojo.data.util.sorter.createSortFunction(args.sort, this));
-		}
-		findCallback(items, args);
-	},
+			// Set up repeating mouse behavior
+			var _this = this;
+			var typematic = function(nodeProp, dateProp, adj){
+//FIXME: leaks (collects) listeners if populateGrid is called multiple times.  Do this once?
+				_this._connects.push(
+					dijit.typematic.addMouseListener(_this[nodeProp], _this, function(count){
+						if(count >= 0){ _this._adjustDisplay(dateProp, adj); }
+					}, 0.8, 500)
+				);
+			};
+			typematic("incrementMonth", "month", 1);
+			typematic("decrementMonth", "month", -1);
+			typematic("nextYearLabelNode", "year", 1);
+			typematic("previousYearLabelNode", "year", -1);
+		},
 
-	close: function(/*dojo.data.api.Request || args || null */ request){
-		return;
-	},
+		goToToday: function(){
+			// summary:
+			//      Sets calendar's value to today's date
+			this.attr('value', this.dateClassObj());
+		},
 
-	getLabel: function(/* item */ item){
-		return item.innerHTML;
-	},
+		constructor: function(/*Object*/args){
+			var dateClass = (args.datePackage && (args.datePackage != "dojo.date"))? args.datePackage + ".Date" : "Date";
+			this.dateClassObj = dojo.getObject(dateClass, false);
+			this.datePackage = args.datePackage || this.datePackage;
+			this.dateFuncObj = dojo.getObject(this.datePackage, false);
+			this.dateLocaleModule = dojo.getObject(this.datePackage + ".locale", false);
+		},
 
-	getIdentity: function(/* item */ item){
-		return dojo.attr(item, "value");
-	},
+		postMixInProperties: function(){
+			// parser.instantiate sometimes passes in NaN for IE.  Use default value in prototype instead.
+			if(isNaN(this.value)){ delete this.value; }
+			this.inherited(arguments);
+		},
 
-	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
-	}
-});
-//Mix in the simple fetch implementation to this class. 
-dojo.extend(dijit.form._ComboBoxDataStore,dojo.data.util.simpleFetch);
+		postCreate: function(){
+			this.inherited(arguments);
+			dojo.setSelectable(this.domNode, false);
 
-}
+			var cloneClass = dojo.hitch(this, function(clazz, n){
+				var template = dojo.query(clazz, this.domNode)[0];
+	 			for(var i=0; i<n; i++){
+					template.parentNode.appendChild(template.cloneNode(true));
+				}
+			});
+
+			// clone the day label and calendar day templates 6 times to make 7 columns
+			cloneClass(".dijitCalendarDayLabelTemplate", 6);
+			cloneClass(".dijitCalendarDateTemplate", 6);
+
+			// now make 6 week rows
+			cloneClass(".dijitCalendarWeekTemplate", 5);
+
+			// insert localized day names in the header
+			var dayNames = this.dateLocaleModule.getNames('days', this.dayWidth, 'standAlone', this.lang);
+			var dayOffset = dojo.cldr.supplemental.getFirstDayOfWeek(this.lang);
+			dojo.query(".dijitCalendarDayLabel", this.domNode).forEach(function(label, i){
+				this._setText(label, dayNames[(i + dayOffset) % 7]);
+			}, this);
+
+			// Fill in spacer/month dropdown element with all the month names (invisible) so that the maximum width will affect layout
+			var monthNames = this.dateLocaleModule.getNames('months', 'wide', 'standAlone', this.lang);
+			cloneClass(".dijitCalendarMonthLabelTemplate", monthNames.length-1);
+			dojo.query(".dijitCalendarMonthLabelTemplate", this.domNode).forEach(function(node, i){
+				dojo.attr(node, "month", i);
+				this._setText(node, monthNames[i]);
+				dojo.place(node.cloneNode(true), this.monthLabelSpacer);
+			}, this);
+
+			var value = this.value;
+			this.value = null;
+			this.attr('value', new this.dateClassObj(value));
+		},
+
+		_onMenuHover: function(e){
+			dojo.stopEvent(e);
+			dojo.toggleClass(e.target, "dijitMenuItemHover");
+		},
 
-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");
+		_adjustDisplay: function(/*String*/ part, /*int*/ amount){
+			// summary:
+			//      Moves calendar forwards or backwards by months or years
+			// part:
+			//      "month" or "year"
+			// amount:
+			//      Number of months or years
+			// tags:
+			//      private
+			this.displayMonth = this.dateFuncObj.add(this.displayMonth, part, amount);
+			this._populateGrid();
+		},
 
-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
+		_onMonthToggle: function(/*Event*/ evt){
+			// summary:
+			//      Handler for when user triggers or dismisses the month list
+			// tags:
+			//      protected
+			dojo.stopEvent(evt);
 
-// from http://www.unicode.org/cldr/data/common/supplemental/supplementalData.xml:supplementalData/currencyData/fractions
+			if(evt.type == "mousedown"){
+				var coords = dojo.position(this.monthLabelNode);
+//				coords.y -= dojo.position(this.domNode, true).y;
+				// Size the dropdown's width to match the label in the widget
+				// so that they are horizontally aligned
+				var dim = {
+					width: coords.w + "px",
+					top: -this.displayMonth.getMonth() * coords.h + "px"
+				};
+				if((dojo.isIE && dojo.isQuirks) || dojo.isIE < 7){
+					dim.left = -coords.w/2 + "px";
+				}
+				dojo.style(this.monthDropDown, dim);
+				this._popupHandler = this.connect(document, "onmouseup", "_onMonthToggle");
+			}else{
+				this.disconnect(this._popupHandler);
+				delete this._popupHandler;
+			}
 
-	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
-	};
+			dojo.toggleClass(this.monthDropDown, "dijitHidden");
+			dojo.toggleClass(this.monthLabelNode, "dijitVisible");
+		},
 
-	var roundingData = {CHF:5};
+		_onMonthSelect: function(/*Event*/ evt){
+			// summary:
+			//      Handler for when user selects a month from a list
+			// tags:
+			//      protected
+			this._onMonthToggle(evt);
+			this.displayMonth.setMonth(dojo.attr(evt.target, "month"));
+			this._populateGrid();
+		},
 
-	var places = placesData[code], round = roundingData[code];
-	if(typeof places == "undefined"){ places = 2; }
-	if(typeof round == "undefined"){ round = 0; }
+		_onDayClick: function(/*Event*/ evt){
+			// summary:
+			//      Handler for day clicks, selects the date if appropriate
+			// tags:
+			//      protected
+			dojo.stopEvent(evt);
+			for(var node = evt.target; node && !node.dijitDateValue; node = node.parentNode);
+			if(node && !dojo.hasClass(node, "dijitCalendarDisabledDate")){
+				this.attr('value', node.dijitDateValue);
+				this.onValueSelected(this.attr('value'));
+			}
+		},
 
-	return {places: places, round: round}; // Object
-};
+		_onDayMouseOver: function(/*Event*/ evt){
+			// summary:
+			//      Handler for mouse over events on days, sets up hovered style
+			// tags:
+			//      protected
+			var node = evt.target;
+			if(node && (node.dijitDateValue || node == this.previousYearLabelNode || node == this.nextYearLabelNode) ){
+				dojo.addClass(node, "dijitCalendarHoveredDate");
+				this._currentNode = node;
+			}
+		},
 
-}
+		_onDayMouseOut: function(/*Event*/ evt){
+			// summary:
+			//      Handler for mouse out events on days, clears hovered style
+			// tags:
+			//      protected
+			if(!this._currentNode){ return; }
+			for(var node = evt.relatedTarget; node;){
+				if(node == this._currentNode){ return; }
+				try{
+					node = node.parentNode;
+				}catch(x){
+					node = null;
+				}
+			}
+			dojo.removeClass(this._currentNode, "dijitCalendarHoveredDate");
+			this._currentNode = null;
+		},
 
-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");
+//TODO: use typematic
+//TODO: skip disabled dates without ending up in a loop
+//TODO: could optimize by avoiding populate grid when month does not change
+		_onKeyPress: function(/*Event*/evt){
+			// summary:
+			//		Provides keyboard navigation of calendar
+			// tags:
+			//		protected
+			var dk = dojo.keys,
+				increment = -1,
+				interval,
+				newValue = this.value;
+			switch(evt.keyCode){
+				case dk.RIGHT_ARROW:
+					increment = 1;
+					//fallthrough...
+				case dk.LEFT_ARROW:
+					interval = "day";
+					if(!this.isLeftToRight()){ increment *= -1; }
+					break;
+				case dk.DOWN_ARROW:
+					increment = 1;
+					//fallthrough...
+				case dk.UP_ARROW:
+					interval = "week";
+					break;
+				case dk.PAGE_DOWN:
+					increment = 1;
+					//fallthrough...
+				case dk.PAGE_UP:
+					interval = evt.ctrlKey ? "year" : "month";
+					break;
+				case dk.END:
+					// go to the next month
+					newValue = this.dateFuncObj.add(newValue, "month", 1);
+					// subtract a day from the result when we're done
+					interval = "day";
+					//fallthrough...
+				case dk.HOME:
+					newValue = new Date(newValue).setDate(1);
+					break;
+				case dk.ENTER:
+					this.onValueSelected(this.attr('value'));
+					break;
+				case dk.ESCAPE:
+					//TODO
+				default:
+					return;
+			}
+			dojo.stopEvent(evt);
 
+			if(interval){
+				newValue = this.dateFuncObj.add(newValue, interval, increment);
+			}
 
+			this.attr("value", newValue);
+		},
 
+		onValueSelected: function(/*Date*/ date){
+			// summary:
+			//		Notification that a date cell was selected.  It may be the same as the previous value.
+			// description:
+			//      Used by `dijit.form._DateTimeTextBox` (and thus `dijit.form.DateTextBox`)
+			//      to get notification when the user has clicked a date.
+			// tags:
+			//      protected
+		},
 
+		onChange: function(/*Date*/ date){
+			// summary:
+			//		Called only when the selected date has changed
+		},
 
+		_isSelectedDate: function(/*Date*/ dateObject, /*String?*/ locale){
+			// summary:
+			//		Extension point so developers can subclass Calendar to
+			//		support multiple (concurrently) selected dates
+			// tags:
+			//		protected extension
+			return !this.dateFuncObj.compare(dateObject, this.value, "date")
+		},
 
+		isDisabledDate: function(/*Date*/ dateObject, /*String?*/ locale){
+			// summary:
+			//		May be overridden to disable certain dates in the calendar e.g. `isDisabledDate=dojo.date.locale.isWeekend`
+			// tags:
+			//      extension
 /*=====
-dojo.currency = {
-	// summary: localized formatting and parsing routines for currencies
-}
+			return false; // Boolean
 =====*/
+		},
 
-dojo.currency._mixInDefaults = function(options){
-	options = options || {};
-	options.type = "currency";
+		getClassForDate: function(/*Date*/ dateObject, /*String?*/ locale){
+			// summary:
+			//		May be overridden to return CSS classes to associate with the date entry for the given dateObject,
+			//		for example to indicate a holiday in specified locale.
+			// tags:
+			//      extension
 
-	// Get locale-depenent currency data, like the symbol
-	var bundle = dojo.i18n.getLocalization("dojo.cldr", "currency", options.locale) || {};
+/*=====
+			return ""; // String
+=====*/
+		}
+	}
+);
 
-	// 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];
-	});
+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");
 
-	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.declare(
+	"dijit.form._DateTimeTextBox.__Constraints",
+	[dijit.form.RangeBoundTextBox.__Constraints, dojo.date.locale.__FormatOptions], {
+	// summary:
+	//		Specifies both the rules on valid/invalid values (first/last date/time allowed),
+	//		and also formatting options for how the date/time is displayed.
+	// example:
+	//		To restrict to dates within 2004, displayed in a long format like "December 25, 2005":
+	//	|		{min:'2004-01-01',max:'2004-12-31', formatLength:'long'}
 });
 =====*/
 
-dojo.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
+dojo.declare(
+	"dijit.form._DateTimeTextBox",
+	dijit.form.RangeBoundTextBox,
+	{
+		// summary:
+		//		Base class for validating, serializable, range-bound date or time text box.
 
-	return dojo.number.parse(expression, dojo.currency._mixInDefaults(options));
-}
+		// constraints: dijit.form._DateTimeTextBox.__Constraints
+		//		Despite the name, this parameter specifies both constraints on the input
+		//		(including starting/ending dates/times allowed) as well as
+		//		formatting options like whether the date is displayed in long (ex: December 25, 2005)
+		//		or short (ex: 12/25/2005) format.   See `dijit.form._DateTimeTextBox.__Constraints` for details.
+		/*=====
+		constraints: {},
+		======*/
 
-}
+		// Override ValidationTextBox.regExpGen().... we use a reg-ex generating function rather
+		// than a straight regexp to deal with locale  (plus formatting options too?)
+		regExpGen: dojo.date.locale.regexp,
 
-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");
+		// datePackage: String
+		//	JavaScript namespace to find calendar routines.  Uses Gregorian calendar routines
+		//	at dojo.date, by default.
+		datePackage: "dojo.date",
 
+		// Override _FormWidget.compare() to work for dates/times
+		compare: dojo.date.compare,
 
+		format: function(/*Date*/ value, /*dojo.date.locale.__FormatOptions*/ constraints){
+			// summary:
+			//		Formats the value as a Date, according to specified locale (second argument)
+			// tags:
+			//		protected
+			if(!value){ return ''; }
+			return this.dateLocaleModule.format(value, constraints);
+		},
 
+		parse: function(/*String*/ value, /*dojo.date.locale.__FormatOptions*/ constraints){
+			// summary:
+			//		Parses as string as a Date, according to constraints
+			// tags:
+			//		protected
 
-/*=====
-dojo.declare(
-	"dijit.form.NumberTextBox.__Constraints",
-	[dijit.form.RangeBoundTextBox.__Constraints, dojo.number.__FormatOptions, dojo.number.__ParseOptions]
-);
-=====*/
+			return this.dateLocaleModule.parse(value, constraints) || (this._isEmpty(value) ? null : undefined);	 // Date
+		},
 
-dojo.declare("dijit.form.NumberTextBoxMixin",
-	null,
-	{
-		// summary:
-		//		A mixin for all number textboxes
-		// tags:
-		//		protected
+		// Overrides ValidationTextBox.serialize() to serialize a date in canonical ISO format.
+		serialize: function(/*anything*/val, /*Object?*/options){
+			if(val.toGregorian){
+				val = val.toGregorian();
+			}
+			return dojo.date.stamp.toISOString(val, options);
+		},
 
-		// Override ValidationTextBox.regExpGen().... we use a reg-ex generating function rather
-		// than a straight regexp to deal with locale (plus formatting options too?)
-		regExpGen: dojo.number.regexp,
+		// value: Date
+		//		The value of this widget as a JavaScript Date object.  Use attr("value") / attr("value", val) to manipulate.
+		//		When passed to the parser in markup, must be specified according to `dojo.date.stamp.fromISOString`
+		value: new Date(""),	// value.toString()="NaN"
+		_blankValue: null,	// used by filter() when the textbox is blank
 
-		/*=====
-		// constraints: dijit.form.NumberTextBox.__Constraints
-		//		Minimum/maximum allowed values.
-		constraints: {},
-		======*/
+		//	popupClass: [protected extension] String
+		//		Name of the popup widget class used to select a date/time.
+		//		Subclasses should specify this.
+		popupClass: "", // default is no popup = text only
 
-		// value: Number
-		//		The value of this NumberTextBox as a javascript Number (ie, not a String).
-		//		If the displayed value is blank, the value is NaN, and if the user types in
-		//		an gibberish value (like "hello world"), the value is undefined
-		//		(i.e. attr('value') returns undefined).
-		//
-		//		Symetrically, attr('value', NaN) will clear the displayed value,
-		//		whereas attr('value', undefined) will have no effect.
-		value: NaN,
 
-		// editOptions: [protected] Object
-		//		Properties to mix into constraints when the value is being edited.
-		//		This is here because we edit the number in the format "12345", which is
-		//		different than the display value (ex: "12,345")
-		editOptions: { pattern: '#.######' },
+		// _selector: [protected extension] String
+		//		Specifies constraints.selector passed to dojo.date functions, should be either
+		//		"date" or "time".
+		//		Subclass must specify this.
+		_selector: "",
 
-		/*=====
-		_formatter: function(value, options){
-			// summary:
-			//		_formatter() is called by format().   It's the base routine for formatting a number,
-			//		as a string, for example converting 12345 into "12,345".
-			// value: Number
-			//		The number to be converted into a string.
-			// options: dojo.number.__FormatOptions?
-			//		Formatting options
-			// tags:
-			//		protected extension
+		constructor: function(/*Object*/args){
+			var dateClass = args.datePackage ? args.datePackage + ".Date" : "Date";
+			this.dateClassObj = dojo.getObject(dateClass, false);
+			this.value = new this.dateClassObj("");
 
-			return "12345";		// String
+			this.datePackage = args.datePackage || this.datePackage;
+			this.dateLocaleModule = dojo.getObject(this.datePackage + ".locale", false);
+			this.regExpGen = this.dateLocaleModule.regexp;
 		},
-		 =====*/
-		_formatter: dojo.number.format,
 
 		postMixInProperties: function(){
-			if(typeof this.constraints.max != "number"){
-				this.constraints.max = 9e+15;
-			}
 			this.inherited(arguments);
-		},
 
-		_onFocus: function(){
-			if(this.disabled){ return; }
-			var val = this.attr('value');
-			if(typeof val == "number" && !isNaN(val)){
-				var formattedValue = this.format(val, this.constraints);
-				if(formattedValue !== undefined){
-					this.textbox.value = formattedValue;
-				}
+			if(!this.value || this.value.toString() == dijit.form._DateTimeTextBox.prototype.value.toString()){
+				this.value = null;
 			}
+			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 popup
+			this._open();
 			this.inherited(arguments);
 		},
 
-		format: function(/*Number*/ value, /*dojo.number.__FormatOptions*/ constraints){
+		_setValueAttr: function(/*Date*/ value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){
 			// summary:
-			//		Formats the value as a Number, according to constraints.
-			// tags:
-			//		protected
+			//		Sets the date on this textbox.  Note that `value` must be like a Javascript Date object.
+			if(value instanceof Date && !(this.dateClassObj instanceof Date)){
+				value = new this.dateClassObj(value);
+			}
 
-			if(typeof value != "number") { return String(value) }
-			if(isNaN(value)){ return ""; }
-			if(("rangeCheck" in this) && !this.rangeCheck(value, constraints)){ return String(value) }
-			if(this.editOptions && this._focused){
-				constraints = dojo.mixin(dojo.mixin({}, this.editOptions), constraints);
+			this.inherited(arguments);
+			if(this._picker){
+				// #3948: fix blank date on popup only
+				if(!value){value = new this.dateClassObj();}
+				this._picker.attr('value', value);
 			}
-			return this._formatter(value, constraints);
 		},
 
-		/*=====
-		parse: function(value, constraints){
+		_open: function(){
 			// summary:
-			//		Parses the string value as a Number, according to constraints.
-			// value: String
-			//		String representing a number
-			// constraints: dojo.number.__ParseOptions
-			//		Formatting options
-			// tags:
-			//		protected
+			//		opens the TimePicker, and sets the onValueSelected value
 
-			return 123.45;		// Number
+			if(this.disabled || this.readOnly || !this.popupClass){return;}
+
+			var textBox = this;
+
+			if(!this._picker){
+				var PopupProto = dojo.getObject(this.popupClass, false);
+				this._picker = new PopupProto({
+					onValueSelected: function(value){
+						if(textBox._tabbingAway){
+							delete textBox._tabbingAway;
+						}else{
+							textBox.focus(); // focus the textbox before the popup closes to avoid reopening the popup
+						}
+						setTimeout(dojo.hitch(textBox, "_close"), 1); // allow focus time to take
+
+						// this will cause InlineEditBox and other handlers to do stuff so make sure it's last
+						dijit.form._DateTimeTextBox.superclass._setValueAttr.call(textBox, value, true);
+					},
+					id: this.id + "_popup",
+					lang: textBox.lang,
+					constraints: textBox.constraints,
+
+					datePackage: textBox.datePackage,
+
+					isDisabledDate: function(/*Date*/ date){
+						// summary:
+						// 	disables dates outside of the min/max of the _DateTimeTextBox
+						var compare = dojo.date.compare;
+						var constraints = textBox.constraints;
+						return constraints && (constraints.min && (compare(constraints.min, date, textBox._selector) > 0) ||
+							(constraints.max && compare(constraints.max, date, textBox._selector) < 0));
+					}
+				});
+				this._picker.attr('value', this.attr('value') || new this.dateClassObj());
+			}
+			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 });
 		},
-		=====*/
-		parse: dojo.number.parse,
 
-		_getDisplayedValueAttr: function(){
-			var v = this.inherited(arguments); 
-			return isNaN(v) ? this.textbox.value : v;
+		_close: function(){
+			if(this._opened){
+				dijit.popup.close(this._picker);
+				this._opened=false;
+			}
 		},
 
-		filter: function(/*Number*/ value){
+		_onBlur: function(){
 			// summary:
-			//		This is called with both the display value (string), and the actual value (a number).
-			//		When called with the actual value it does corrections so that '' etc. are represented as NaN.
-			//		Otherwise it dispatches to the superclass's filter() method.
-			//
-			//		See `dijit.form.TextBox.filter` for more details.
-			return (value === null || value === '' || value === undefined) ? NaN : this.inherited(arguments); // attr('value', null||''||undefined) should fire onChange(NaN)
+			//		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.
 		},
 
-		serialize: function(/*Number*/ value, /*Object?*/options){
-			// summary:
-			//		Convert value (a Number) into a canonical string (ie, how the number literal is written in javascript/java/C/etc.)
-			// tags:
-			//		protected
-			return (typeof value != "number" || isNaN(value))? '' : this.inherited(arguments);
+		_getDisplayedValueAttr: function(){
+			return this.textbox.value;
 		},
 
-		_setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange, /*String?*/formattedValue){
-			// summary:
-			//		Hook so attr('value', ...) works.
-			if(value !== undefined && formattedValue === undefined){
-				if(typeof value == "number"){
-					if(isNaN(value)){ formattedValue = '' }
-					else if(("rangeCheck" in this) && !this.rangeCheck(value, this.constraints)){
-						formattedValue = String(value);
-					}
-				}else if(!value){ // 0 processed in if branch above, ''|null|undefined flow thru here
-					formattedValue = '';
-					value = NaN;
-				}else{ // non-numeric values
-					formattedValue = String(value);
-					value = undefined;
-				}
+		_setDisplayedValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange){
+			this._setValueAttr(this.parse(value, this.constraints), priorityChange, value);
+		},
+
+		destroy: function(){
+			if(this._picker){
+				this._picker.destroy();
+				delete this._picker;
 			}
-			this.inherited(arguments, [value, priorityChange, formattedValue]);
+			this.inherited(arguments);
 		},
 
+		postCreate: function(){
+			this.inherited(arguments);
+			this.connect(this.focusNode, 'onkeypress', this._onKeyPress);
+			this.connect(this.focusNode, 'onclick', this._open);
+		},
 
-		_getValueAttr: function(){
+		_onKeyPress: function(/*Event*/ e){
 			// summary:
-			//		Hook so attr('value') works.
-			//		Returns Number, NaN for '', or undefined for unparsable text
-			var v = this.inherited(arguments); // returns Number for all values accepted by parse() or NaN for all other displayed values
+			//		Handler for keypress events
 
-			// If the displayed value of the textbox is gibberish (ex: "hello world"), this.inherited() above
-			// returns NaN; this if() branch converts the return value to undefined.
-			// Returning undefined prevents user text from being overwritten when doing _setValueAttr(_getValueAttr()).
-			// A blank displayed value is still returned as NaN.
-			if(isNaN(v) && this.textbox.value !== ''){ // if displayed value other than ''
-				var n = Number(this.textbox.value); // check for exponential notation that parse() rejected (erroneously?)
-				return (String(n)===this.textbox.value)? n : undefined; // return exponential Number or undefined for random text
-			}else{ return v } // Number or NaN for ''
+			var p = this._picker, dk = dojo.keys;
+			// Handle the key in the picker, if it has a handler.  If the handler
+			// returns false, then don't handle any other keys.
+			if(p && this._opened && p.handleKey){
+				if(p.handleKey(e) === false){ return; }
+			}
+			if(this._opened && e.charOrCode == dk.ESCAPE && !(e.shiftKey || e.ctrlKey || e.altKey || e.metaKey)){
+				this._close();
+				dojo.stopEvent(e);
+			}else if(!this._opened && e.charOrCode == dk.DOWN_ARROW){
+				this._open();
+				dojo.stopEvent(e);
+			}else if(e.charOrCode === dk.TAB){
+				this._tabbingAway = true;
+			}else if(this._opened && (e.keyChar || e.charOrCode === dk.BACKSPACE || e.charOrCode == dk.DELETE)){
+				// Replace the element - but do it after a delay to allow for
+				// filtering to occur
+				setTimeout(dojo.hitch(this, function(){
+					dijit.placeOnScreenAroundElement(p.domNode.parentNode, this.domNode, {'BL':'TL', 'TL':'BL'}, p.orient ? dojo.hitch(p, "orient") : null);
+				}), 1);
+			}
 		}
 	}
 );
 
-dojo.declare("dijit.form.NumberTextBox",
-	[dijit.form.RangeBoundTextBox,dijit.form.NumberTextBoxMixin],
-	{
-		// summary:
-		//		A validating, serializable, range-bound text box.
+}
+
+if(!dojo._hasResource["dijit.form.DateTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.form.DateTextBox"] = true;
+dojo.provide("dijit.form.DateTextBox");
+
+
+
+
+dojo.declare(
+	"dijit.form.DateTextBox",
+	dijit.form._DateTimeTextBox,
+	{
+		// summary:
+		//		A validating, serializable, range-bound date text box with a drop down calendar
+		//
+		//		Example:
+		// |	new dijit.form.DateTextBox({value: new Date(2009, 0, 20)})
+		//
+		//		Example:
+		// |	<input dojotype='dijit.form.DateTextBox' value='2009-01-20'>
+
+		baseClass: "dijitTextBox dijitDateTextBox",
+		popupClass: "dijit.Calendar",
+		_selector: "date",
+
+		// value: Date
+		//		The value of this widget as a JavaScript Date object, with only year/month/day specified.
+		//		If specified in markup, use the format specified in `dojo.date.stamp.fromISOString`
+		value: new Date("")	// value.toString()="NaN"
 	}
 );
 
 }
 
-if(!dojo._hasResource["dijit.form.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");
-
-
+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.CurrencyTextBox.__Constraints",
-	[dijit.form.NumberTextBox.__Constraints, dojo.currency.__FormatOptions, dojo.currency.__ParseOptions]
-);
-=====*/
 
 dojo.declare(
-	"dijit.form.CurrencyTextBox",
-	dijit.form.NumberTextBox,
+	"dijit.form._Spinner",
+	dijit.form.RangeBoundTextBox,
 	{
 		// summary:
-		//		A validating currency textbox
+		//		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.
 
-		// currency: String
-		//		the [ISO4217](http://en.wikipedia.org/wiki/ISO_4217) currency code, a three letter sequence like "USD"
-		currency: "",
+		// defaultTimeout: Number
+		//		Number of milliseconds before a held arrow key or up/down button becomes typematic
+		defaultTimeout: 500,
 
-		/*=====
-		// constraints: dijit.form.CurrencyTextBox.__Constraints
-		//		Minimum/maximum amount allowed.
-		constraints: {},
-		======*/
+		// 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,
 
-		// Override regExpGen ValidationTextBox.regExpGen().... we use a reg-ex generating function rather
-		// than a straight regexp to deal with locale  (plus formatting options too?)
-		regExpGen: dojo.currency.regexp,
+		// smallDelta: Number
+		//	  Adjust the value by this much when spinning using the arrow keys/buttons
+		smallDelta: 1,
 
-		// Override NumberTextBox._formatter to deal with currencies, ex: converts "123.45" to "$123.45"
-		_formatter: dojo.currency.format,
+		// largeDelta: Number
+		//	  Adjust the value by this much when spinning using the PgUp/Dn keys
+		largeDelta: 10,
 
-/*=====
-		parse: function(value, constraints){
+		templateString: dojo.cache("dijit.form", "templates/Spinner.html", "<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> <div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton\"\n\t\t\t\tdojoAttachP [...]
+		baseClass: "dijitSpinner",
+
+		adjust: function(/* Object */ val, /*Number*/ delta){
 			// summary:
-			//		Parses string as a Currency, according to constraints
-			// value: String
-			//		The currency represented as a string
-			// constraints: dojo.currency.__ParseOptions
+			//		Overridable function used to adjust a primitive value(Number/Date/...) by the delta amount specified.
+			// 		The val is adjusted in a way that makes sense to the object type.
 			// tags:
-			//		protected
-
-			return 123.45;		// Number
+			//		protected extension
+			return val;
 		},
-=====*/
-		parse: dojo.currency.parse,
-
-		postMixInProperties: function(){
-			this.constraints.currency = this.currency;
-			this.inherited(arguments);
-		}
-	}
-);
 
-}
+		_arrowState: function(/*Node*/ node, /*Boolean*/ pressed){
+			// summary:
+			//		Called when an arrow key is pressed to update the relevant CSS classes
+			this._active = pressed;
+			this.stateModifier = node.getAttribute("stateModifier") || "";
+			this._setStateClass();
+		},
 
-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");
+		_arrowPressed: function(/*Node*/ nodePressed, /*Number*/ direction, /*Number*/ increment){
+			// summary:
+			//		Handler for arrow button or arrow key being pressed
+			if(this.disabled || this.readOnly){ return; }
+			this._arrowState(nodePressed, true);
+			this._setValueAttr(this.adjust(this.attr('value'), direction*increment), false);
+			dijit.selectInputText(this.textbox, this.textbox.value.length);
+		},
 
+		_arrowReleased: function(/*Node*/ node){
+			// summary:
+			//		Handler for arrow button or arrow key being released
+			this._wheelTimer = null;
+			if(this.disabled || this.readOnly){ return; }
+			this._arrowState(node, false);
+		},
 
+		_typematicCallback: function(/*Number*/ count, /*DOMNode*/ node, /*Event*/ evt){
+			var inc=this.smallDelta;
+			if(node == this.textbox){
+				var k=dojo.keys;
+				var key = evt.charOrCode;
+				inc = (key == k.PAGE_UP || key == k.PAGE_DOWN) ? this.largeDelta : this.smallDelta;
+				node = (key == k.UP_ARROW || key == k.PAGE_UP) ? this.upArrowNode : this.downArrowNode;
+			}
+			if(count == -1){ this._arrowReleased(node); }
+			else{ this._arrowPressed(node, (node == this.upArrowNode) ? 1 : -1, inc); }
+		},
 
-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)
+		_wheelTimer: null,
+		_mouseWheeled: function(/*Event*/ evt){
+			// summary:
+			//		Mouse wheel listener where supported
 
-	// 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
-	};
+			dojo.stopEvent(evt);
+			// FIXME: Safari bubbles
 
-	var country = dojo.cldr.supplemental._region(locale);
-	var dow = firstDay[country];
-	return (dow === undefined) ? 1 : dow; /*Number*/
-};
+			// be nice to DOH and scroll as much as the event says to
+			var scrollAmount = evt.detail ? (evt.detail * -1) : (evt.wheelDelta / 120);
+			if(scrollAmount !== 0){
+				var node = this[(scrollAmount > 0 ? "upArrowNode" : "downArrowNode" )];
 
-dojo.cldr.supplemental._region = function(/*String?*/locale){
-	locale = dojo.i18n.normalizeLocale(locale);
-	var tags = locale.split('-');
-	var region = tags[1];
-	if(!region){
-		// IE often gives language only (#2269)
-		// Arbitrary mappings of language-only locales to a country:
-		region = {de:"de", en:"us", es:"es", fi:"fi", fr:"fr", he:"il", hu:"hu", it:"it",
-			ja:"jp", ko:"kr", nl:"nl", pt:"br", sv:"se", zh:"cn"}[tags[0]];
-	}else if(region.length == 4){
-		// The ISO 3166 country code is usually in the second position, unless a
-		// 4-letter script is given. See http://www.ietf.org/rfc/rfc4646.txt
-		region = tags[2];
-	}
-	return region;
-}
+				this._arrowPressed(node, scrollAmount, this.smallDelta);
 
-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}
+				if(!this._wheelTimer){
+					clearTimeout(this._wheelTimer);
+				}
+				this._wheelTimer = setTimeout(dojo.hitch(this,"_arrowReleased",node), 50);
+			}
 
-	// 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
-	};
+		postCreate: function(){
+			this.inherited(arguments);
 
-	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}*/
-};
+			// extra listeners
+			this.connect(this.domNode, !dojo.isMozilla ? "onmousewheel" : 'DOMMouseScroll', "_mouseWheeled");
+			this._connects.push(dijit.typematic.addListener(this.upArrowNode, this.textbox, {charOrCode:dojo.keys.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout));
+			this._connects.push(dijit.typematic.addListener(this.downArrowNode, this.textbox, {charOrCode:dojo.keys.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout));
+			this._connects.push(dijit.typematic.addListener(this.upArrowNode, this.textbox, {charOrCode:dojo.keys.PAGE_UP,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout));
+			this._connects.push(dijit.typematic.addListener(this.downArrowNode, this.textbox, {charOrCode:dojo.keys.PAGE_DOWN,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout));
+			if(dojo.isIE){
+				var _this = this;
+				(function resize(){
+					var sz = _this.upArrowNode.parentNode.offsetHeight;
+					if(sz){
+						_this.upArrowNode.style.height = sz >> 1;
+						_this.downArrowNode.style.height = sz - (sz >> 1);
+						_this.focusNode.parentNode.style.height = sz;
+					}
+				})();
+				this.connect(this.domNode, "onresize",
+					function(){ setTimeout(
+						function(){
+							resize();
+							// cause IE to rerender when spinner is moved from hidden to visible
+							_this._setStateClass();
+						}, 0);
+					}
+				);
+				this._layoutHackIE7();
+			}
+		}
+});
 
 }
 
-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
-}
-=====*/
+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.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.
+dojo.declare("dijit.form.NumberSpinner",
+	[dijit.form._Spinner, dijit.form.NumberTextBoxMixin],
+	{
+	// summary:
+	//		Extends NumberTextBox to add up/down arrows and pageup/pagedown for incremental change to the value
+	//
+	// description:
+	//		A `dijit.form.NumberTextBox` extension to provide keyboard accessible value selection
+	//		as well as icons for spinning direction. When using the keyboard, the typematic rules
+	//		apply, meaning holding the key will gradually increarease or decrease the value and
+	// 		accelerate.
+	//
+	// example:
+	//	| new dijit.form.NumberSpinner({ constraints:{ max:300, min:100 }}, "someInput");
 
-	var str = dateObject.toString(); // Start looking in toString
-	var tz = ''; // The result -- return empty string if nothing found
-	var match;
+	adjust: function(/* Object */val, /* Number*/delta){
+		// summary:
+		//		Change Number val by the given amount
+		// tags:
+		//		protected
 
-	// 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];
+		var tc = this.constraints,
+			v = isNaN(val),
+			gotMax = !isNaN(tc.max),
+			gotMin = !isNaN(tc.min)
+		;
+		if(v && delta != 0){ // blank or invalid value and they want to spin, so create defaults
+			val = (delta > 0) ?
+				gotMin ? tc.min : gotMax ? tc.max : 0 :
+				gotMax ? this.constraints.max : gotMin ? tc.min : 0
+			;
+		}
+		var newval = val + delta;
+		if(v || isNaN(newval)){ return val; }
+		if(gotMax && (newval > tc.max)){
+			newval = tc.max;
+		}
+		if(gotMin && (newval < tc.min)){
+			newval = tc.min;
+		}
+		return newval;
+	},
+
+	_onKeyPress: function(e){
+		if((e.charOrCode == dojo.keys.HOME || e.charOrCode == dojo.keys.END) && !(e.ctrlKey || e.altKey || e.metaKey)
+		&& typeof this.attr('value') != 'undefined' /* gibberish, so HOME and END are default editing keys*/){
+			var value = this.constraints[(e.charOrCode == dojo.keys.HOME ? "min" : "max")];
+			if(value){
+				this._setValueAttr(value,true);
 			}
+			// eat home or end key whether we change the value or not
+			dojo.stopEvent(e);
 		}
 	}
 
-	// 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
+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.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"
+dojo.data.util.sorter.basicComparator = function(	/*anything*/ a, 
+													/*anything*/ b){
+	//	summary:  
+	//		Basic comparision function that compares if an item is greater or less than another item
+	//	description:  
+	//		returns 1 if a > b, -1 if a < b, 0 if equal.
+	//		'null' values (null, undefined) are treated as larger values so that they're pushed to the end of the list.
+	//		And compared to each other, null is equivalent to undefined.
+	
+	//null is a problematic compare, so if null, we set to undefined.
+	//Makes the check logic simple, compact, and consistent
+	//And (null == undefined) === true, so the check later against null
+	//works for undefined and is less bytes.
+	var r = -1;
+	if(a === null){
+		a = undefined;
+	}
+	if(b === null){
+		b = undefined;
+	}
+	if(a == b){
+		r = 0; 
+	}else if(a > b || a == null){
+		r = 1; 
+	}
+	return r; //int {-1,0,1}
+};
 
-	// 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);
+dojo.data.util.sorter.createSortFunction = function(	/* attributes array */sortSpec,
+														/*dojo.data.core.Read*/ store){
+	//	summary:  
+	//		Helper function to generate the sorting function based off the list of sort attributes.
+	//	description:  
+	//		The sort function creation will look for a property on the store called 'comparatorMap'.  If it exists
+	//		it will look in the mapping for comparisons function for the attributes.  If one is found, it will
+	//		use it instead of the basic comparator, which is typically used for strings, ints, booleans, and dates.
+	//		Returns the sorting function for this particular list of attributes and sorting directions.
+	//
+	//	sortSpec: array
+	//		A JS object that array that defines out what attribute names to sort on and whether it should be descenting or asending.
+	//		The objects should be formatted as follows:
+	//		{
+	//			attribute: "attributeName-string" || attribute,
+	//			descending: true|false;   // Default is false.
+	//		}
+	//	store: object
+	//		The datastore object to look up item values from.
+	//
+	var sortFunctions=[];
+
+	function createSortFunction(attr, dir, comp, s){
+		//Passing in comp and s (comparator and store), makes this
+		//function much faster.
+		return function(itemA, itemB){
+			var a = s.getValue(itemA, attr);
+			var b = s.getValue(itemB, attr);
+			return dir * comp(a,b); //int
+		};
+	}
+	var sortAttribute;
+	var map = store.comparatorMap;
+	var bc = dojo.data.util.sorter.basicComparator;
+	for(var i = 0; i < sortSpec.length; i++){
+		sortAttribute = sortSpec[i];
+		var attr = sortAttribute.attribute;
+		if(attr){
+			var dir = (sortAttribute.descending) ? -1 : 1;
+			var comp = bc;
+			if(map){
+				if(typeof attr !== "string" && ("toString" in attr)){
+					 attr = attr.toString();
+				}
+				comp = map[attr] || bc;
+			}
+			sortFunctions.push(createSortFunction(attr, 
+				dir, comp, store));
 		}
 	}
-	
-	if(date1 > date2){ return 1; } // int
-	if(date1 < date2){ return -1; } // int
-	return 0; // int
+	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
 };
 
-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";
+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");
 
-	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";
+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;
 
-	if(property){
-		sum["set"+property](sum["get"+property]()+amount);
-	}
+	var _errorHandler = function(errorData, requestObject){
+		if(requestObject.onError){
+			var scope = requestObject.scope || dojo.global;
+			requestObject.onError.call(scope, errorData, requestObject);
+		}
+	};
 
-	if(fixOvershoot && (sum.getDate() < date.getDate())){
-		sum.setDate(0);
-	}
+	var _fetchHandler = function(items, requestObject){
+		var oldAbortFunction = requestObject.abort || null;
+		var aborted = false;
 
-	return sum; // Date
-};
+		var startIndex = requestObject.start?requestObject.start:0;
+		var endIndex = (requestObject.count && (requestObject.count !== Infinity))?(startIndex + requestObject.count):items.length;
 
-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".
+		requestObject.abort = function(){
+			aborted = true;
+			if(oldAbortFunction){
+				oldAbortFunction.call(requestObject);
+			}
+		};
 
-	date2 = date2 || new Date();
-	interval = interval || "day";
-	var yearDiff = date2.getFullYear() - date1.getFullYear();
-	var delta = 1; // Integer return value
+		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
+};
 
-	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();
+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");
 
-				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();
+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.
 
-				// 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();
+	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;
+		}
 	}
-
-	// Round for fractional values and DST leaps
-	return Math.round(delta); // Number (integer)
+	rxp += "$";
+	if(ignoreCase){
+		return new RegExp(rxp,"mi"); //RegExp
+	}else{
+		return new RegExp(rxp,"m"); //RegExp
+	}
+	
 };
 
 }
 
-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");
+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");
+
+
+
+
+
+
 
-// Localization methods for Date.   Honor local customs using locale-dependent dojo.cldr data.
 
 
+dojo.declare(
+	"dijit.form.ComboBoxMixin",
+	null,
+	{
+		// summary:
+		//		Implements the base functionality for `dijit.form.ComboBox`/`dijit.form.FilteringSelect`
+		// description:
+		//		All widgets that mix in dijit.form.ComboBoxMixin must extend `dijit.form._FormValueWidget`.
+		// tags:
+		//		protected
 
+		// item: Object
+		//		This is the item returned by the dojo.data.store implementation that
+		//		provides the data for this ComboBox, it's the currently selected item.
+		item: null,
 
+		// pageSize: Integer
+		//		Argument to data provider.
+		//		Specifies number of search results per page (before hitting "next" button)
+		pageSize: Infinity,
 
+		// store: Object
+		//		Reference to data provider object used by this ComboBox
+		store: null,
 
+		// fetchProperties: Object
+		//		Mixin to the dojo.data store's fetch.
+		//		For example, to set the sort order of the ComboBox menu, pass:
+		//	|	{ sort: {attribute:"name",descending: true} }
+		//		To override the default queryOptions so that deep=false, do:
+		//	|	{ queryOptions: {ignoreCase: true, deep: false} }
+		fetchProperties:{},
 
-// Load the bundles containing localization information for
-// names and formats
+		// query: Object
+		//		A query that can be passed to 'store' to initially filter the items,
+		//		before doing further filtering based on `searchAttr` and the key.
+		//		Any reference to the `searchAttr` is ignored.
+		query: {},
 
+		// autoComplete: Boolean
+		//		If user types in a partial string, and then tab out of the `<input>` box,
+		//		automatically copy the first entry displayed in the drop down list to
+		//		the `<input>` field
+		autoComplete: true,
 
-//NOTE: Everything in this module assumes Gregorian calendars.
-// Other calendars will be implemented in separate modules.
+		// highlightMatch: String
+		// 		One of: "first", "all" or "none".
+		//
+		//		If the ComboBox/FilteringSelect opens with the search results and the searched
+		//		string can be found, it will be highlighted.  If set to "all"
+		//		then will probably want to change `queryExpr` parameter to '*${0}*'
+		//
+		//		Highlighting is only performed when `labelType` is "text", so as to not
+		//		interfere with any HTML markup an HTML label might contain.
+		highlightMatch: "first",
 
-(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':
-					var m = dateObject.getMonth();
-					if(l<3){
-						s = m+1; pad = true;
-					}else{
-						var propM = ["months", "format", widthList[l-3]].join("-");
-						s = bundle[propM][m];
-					}
-					break;
-				case 'w':
-					var firstDay = 0;
-					s = dojo.date.locale._getWeekOfYear(dateObject, firstDay); pad = true;
-					break;
-				case 'd':
-					s = dateObject.getDate(); pad = true;
-					break;
-				case 'D':
-					s = dojo.date.locale._getDayOfYear(dateObject); pad = true;
-					break;
-				case 'E':
-					var d = dateObject.getDay();
-					if(l<3){
-						s = d+1; pad = true;
-					}else{
-						var propD = ["days", "format", widthList[l-3]].join("-");
-						s = bundle[propD][d];
-					}
-					break;
-				case 'a':
-					var timePeriod = (dateObject.getHours() < 12) ? 'am' : 'pm';
-					s = bundle[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': case 'e':
-//					
-				default:
-					throw new Error("dojo.date.locale.format: invalid pattern char: "+pattern);
-			}
-			if(pad){ s = dojo.string.pad(s, l); }
-			return s;
-		});
-	}
+		// searchDelay: Integer
+		//		Delay in milliseconds between when user types something and we start
+		//		searching based on that value
+		searchDelay: 100,
 
-/*=====
-	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;
-	}
-=====*/
+		// searchAttr: String
+		//		Search for items in the data store where this attribute (in the item)
+		//		matches what the user typed
+		searchAttr: "name",
 
-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.
+		// labelAttr: String?
+		//		The entries in the drop down list come from this attribute in the
+		//		dojo.data items.
+		//		If not specified, the searchAttr attribute is used instead.
+		labelAttr: "",
 
-	options = options || {};
+		// labelType: String
+		//		Specifies how to interpret the labelAttr in the data store items.
+		//		Can be "html" or "text".
+		labelType: "text",
 
-	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
-};
+		// queryExpr: String
+		//		This specifies what query ComboBox/FilteringSelect sends to the data store,
+		//		based on what the user has typed.  Changing this expression will modify
+		//		whether the drop down shows only exact matches, a "starting with" match,
+		//		etc.   Use it in conjunction with highlightMatch.
+		//		dojo.data query expression pattern.
+		//		`${0}` will be substituted for the user text.
+		//		`*` is used for wildcards.
+		//		`${0}*` means "starts with", `*${0}*` means "contains", `${0}` means "is"
+		queryExpr: "${0}*",
+
+		// ignoreCase: Boolean
+		//		Set true if the ComboBox/FilteringSelect should ignore case when matching possible items
+		ignoreCase: true,
 
-dojo.date.locale.regexp = function(/*dojo.date.locale.__FormatOptions?*/options){
-	// summary:
-	//		Builds the regular needed to parse a localized date
+		// hasDownArrow: [const] Boolean
+		//		Set this textbox to have a down arrow button, to display the drop down list.
+		//		Defaults to true.
+		hasDownArrow: true,
 
-	return dojo.date.locale._parseInfo(options).regexp; // String
-};
+		templateString: dojo.cache("dijit.form", "templates/ComboBox.html", "<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=\"pr [...]
 
-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
-	}
+		baseClass:"dijitComboBox",
 
-	var tokens = [];
-	var re = _processPattern(pattern, dojo.hitch(this, _buildDateTimeRE, tokens, bundle, options));
-	return {regexp: re, tokens: tokens, bundle: bundle};
-};
+		_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;
+		},
 
-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
+		_setCaretPos: function(/*DomNode*/ element, /*Number*/ location){
+			location = parseInt(location);
+			dijit.selectInputText(element, location, location);
+		},
 
-	var info = dojo.date.locale._parseInfo(options);
-	var tokens = info.tokens, bundle = info.bundle;
-	var re = new RegExp("^" + info.regexp + "$", info.strict ? "" : "i");
-	var match = re.exec(value);
-	if(!match){ return null; } // null
+		_setDisabledAttr: function(/*Boolean*/ value){
+			// Additional code to set disabled state of ComboBox node.
+			// Overrides _FormValueWidget._setDisabledAttr() or ValidationTextBox._setDisabledAttr().
+			this.inherited(arguments);
+			dijit.setWaiState(this.comboNode, "disabled", value);
+		},
 
-	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;
+		_abortQuery: function(){
+			// stop in-progress query
+			if(this.searchTimer){
+				clearTimeout(this.searchTimer);
+				this.searchTimer = null;
+			}
+			if(this._fetchHandle){
+				if(this._fetchHandle.abort){ this._fetchHandle.abort(); }
+				this._fetchHandle = null;
+			}
+		},
+
+		_onKeyPress: function(/*Event*/ evt){
+			// summary:
+			//		Handles keyboard events
+			var key = evt.charOrCode;
+			// except for cutting/pasting case - ctrl + x/v
+			if(evt.altKey || ((evt.ctrlKey || evt.metaKey) && (key != 'x' && key != 'v')) || key == dojo.keys.SHIFT){
+				return; // throw out weird key combinations and spurious events
+			}
+			var doSearch = false;
+			var searchFunction = "_startSearchFromInput";
+			var pw = this._popupWidget;
+			var dk = dojo.keys;
+			var highlighted = null;
+			this._prev_key_backspace = false;
+			this._abortQuery();
+			if(this._isShowingNow){
+				pw.handleKey(key);
+				highlighted = pw.getHighlightedOption();
+			}
+			switch(key){
+				case dk.PAGE_DOWN:
+				case dk.DOWN_ARROW:
+				case dk.PAGE_UP:
+				case dk.UP_ARROW:
+					if(!this._isShowingNow){
+						this._arrowPressed();
+						doSearch = true;
+						searchFunction = "_startSearchAll";
 					}else{
-						//we expected 2 digits and got more...
-						if(options.strict){
-							return false;
+						this._announceOption(highlighted);
+					}
+					dojo.stopEvent(evt);
+					break;
+
+				case dk.ENTER:
+					// prevent submitting form if user presses enter. Also
+					// prevent accepting the value if either Next or Previous
+					// are selected
+					if(highlighted){
+						// only stop event on prev/next
+						if(highlighted == pw.nextButton){
+							this._nextSearch(1);
+							dojo.stopEvent(evt);
+							break;
+						}else if(highlighted == pw.previousButton){
+							this._nextSearch(-1);
+							dojo.stopEvent(evt);
+							break;
 						}
-						//interpret literally, so '150' would be 150 A.D.
-						//also tolerate '1950', if 'yyyy' input passed to 'yy' format
-						result[0] = v;
+					}else{
+						// Update 'value' (ex: KY) according to currently displayed text
+						this._setBlurValue(); // set value if needed
+						this._setCaretPos(this.focusNode, this.focusNode.value.length); // move cursor to end and cancel highlighting
 					}
-				}
-				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(); } );
+					// default case:
+					// prevent submit, but allow event to bubble
+					evt.preventDefault();
+					// fall through
+
+				case dk.TAB:
+					var newvalue = this.attr('displayedValue');
+					//	if the user had More Choices selected fall into the
+					//	_onBlur handler
+					if(pw && (
+						newvalue == pw._messages["previousMessage"] ||
+						newvalue == pw._messages["nextMessage"])
+					){
+						break;
 					}
-					v = dojo.indexOf(months, v);
-					if(v == -1){
-//						
-						return false;
+					if(highlighted){
+						this._selectOption();
 					}
-				}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){
-//					
-					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){
-//					
-					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){
-//					
-					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?
-//				
-		}
-		return true;
-	});
+					if(this._isShowingNow){
+						this._lastQuery = null; // in case results come back later
+						this._hideResultList();
+					}
+					break;
 
-	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
-	}
+				case ' ':
+					if(highlighted){
+						dojo.stopEvent(evt);
+						this._selectOption();
+						this._hideResultList();
+					}else{
+						doSearch = true;
+					}
+					break;
 
-	//TODO: implement a getWeekday() method in order to test 
-	//validity of input strings containing 'EEE' or 'EEEE'...
+				case dk.ESCAPE:
+					if(this._isShowingNow){
+						dojo.stopEvent(evt);
+						this._hideResultList();
+					}
+					break;
 
-	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]);
-	}
+				case dk.DELETE:
+				case dk.BACKSPACE:
+					this._prev_key_backspace = true;
+					doSearch = true;
+					break;
 
-	// Check for overflow.  The Date() constructor normalizes things like April 32nd...
-	//TODO: why isn't this done for times as well?
-	var allTokens = tokens.join(""),
-		dateToken = allTokens.indexOf('d') != -1,
-		monthToken = allTokens.indexOf('M') != -1;
+				default:
+					// Non char keys (F1-F12 etc..)  shouldn't open list.
+					// Ascii characters and IME input (Chinese, Japanese etc.) should.
+					// On IE and safari, IME input produces keycode == 229, and we simulate
+					// it on firefox by attaching to compositionend event (see compositionend method)
+					doSearch = typeof key == 'string' || key == 229;
+			}
+			if(doSearch){
+				// need to wait a tad before start search so that the event
+				// bubbles through DOM and we have value visible
+				this.item = undefined; // undefined means item needs to be set
+				this.searchTimer = setTimeout(dojo.hitch(this, searchFunction),1);
+			}
+		},
 
-	if(!valid ||
-		(monthToken && dateObject.getMonth() > result[1]) ||
-		(dateToken && dateObject.getDate() > result[2])){
-		return null;
-	}
+		_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.
 
-	// Check for underflow, due to DST shifts.  See #9366
-	// This assumes a 1 hour dst shift correction at midnight
-	// We could compare the timezone offset after the shift and add the difference instead.
-	if((monthToken && dateObject.getMonth() < result[1]) ||
-		(dateToken && dateObject.getDate() < result[2])){
-		dateObject = dojo.date.add(dateObject, "hour", 1);
-	}
+			var fn = this.focusNode;
 
-	return dateObject; // Date
-};
+			// 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);
+			}
+		},
 
-function _processPattern(pattern, applyPattern, applyLiteral, applyAll){
-	//summary: Process a pattern with literals in it
+		_openResultList: function(/*Object*/ results, /*Object*/ dataObject){
+			this._fetchHandle = null;
+			if(	this.disabled ||
+				this.readOnly ||
+				(dataObject.query[this.searchAttr] != this._lastQuery)
+			){
+				return;
+			}
+			this._popupWidget.clearResultList();
+			if(!results.length){
+				this._hideResultList();
+				return;
+			}
 
-	// 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 = pattern.charAt(0) == "'";
+			// 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.
 
-	dojo.forEach(chunks, function(chunk, i){
-		if(!chunk){
-			chunks[i]='';
-		}else{
-			chunks[i]=(literal ? applyLiteral : applyPattern)(chunk);
-			literal = !literal;
-		}
-	});
-	return applyAll(chunks.join(''));
-}
+			dataObject._maxOptions = this._maxOptions;
+			var nodes = this._popupWidget.createOptions(
+				results,
+				dataObject,
+				dojo.hitch(this, "_getMenuLabelFromItem")
+			);
 
-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 = '[12]\\d|'+p2+'[1-9]|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(); }
-					if(s.indexOf('.') != -1){ s += '|' + s.replace(/\./g, ""); }
+			// 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();
 				}
-				s = s.replace(/\./g, "\\.");
-				break;
-			default:
-			// case 'v':
-			// case 'z':
-			// case 'Z':
-				s = ".*";
-//				
-		}
+				this._announceOption(this._popupWidget.getHighlightedOption());
+			}else if(this.autoComplete && !this._prev_key_backspace /*&& !dataObject.direction*/
+				// when the user clicks the arrow button to show the full list,
+				// startSearch looks for "*".
+				// it does not make sense to autocomplete
+				// if they are just previewing the options available.
+				&& !/^[*]+$/.test(dataObject.query[this.searchAttr])){
+					this._announceOption(nodes[1]); // 1st real item
+			}
+		},
 
-		if(tokens){ tokens.push(match); }
+		_showResultList: function(){
+			this._hideResultList();
+			this._arrowPressed();
+			// hide the tooltip
+			this.displayMessage("");
 
-		return "(" + s + ")"; // add capture
-	}).replace(/[\xa0 ]/g, "[\\s\\xa0]"); // normalize whitespace.  Need explicit handling of \xa0 for IE.
-}
-})();
+			// 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
 
-(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
+			// TODO: want to redo this, see
+			//		http://trac.dojotoolkit.org/ticket/3272
+			//	and
+			//		http://trac.dojotoolkit.org/ticket/4108
+
+
+			// natural size of the list has changed, so erase old
+			// width/height settings, which were hardcoded in a previous
+			// call to this function (via dojo.marginBox() call)
+			dojo.style(this._popupWidget.domNode, {width: "", height: ""});
+
+			var best = this.open();
+			// #3212:
+			//		only set auto scroll bars if necessary prevents issues with
+			//		scroll bars appearing when they shouldn't when node is made
+			//		wider (fractional pixels cause this)
+			var popupbox = dojo.marginBox(this._popupWidget.domNode);
+			this._popupWidget.domNode.style.overflow =
+				((best.h == popupbox.h) && (best.w == popupbox.w)) ? "hidden" : "auto";
+			// #4134:
+			//		borrow TextArea scrollbar test so content isn't covered by
+			//		scrollbar and horizontal scrollbar doesn't appear
+			var newwidth = best.w;
+			if(best.h < this._popupWidget.domNode.scrollHeight){
+				newwidth += 16;
+			}
+			dojo.marginBox(this._popupWidget.domNode, {
+				h: best.h,
+				w: Math.max(newwidth, this.domNode.offsetWidth)
+			});
+			
+			// If we increased the width of drop down to match the width of ComboBox.domNode,
+			// then need to reposition the drop down (wrapper) so (all of) the drop down still
+			// appears underneath the ComboBox.domNode
+			if(newwidth < this.domNode.offsetWidth){
+				this._popupWidget.domNode.parentNode.style.left = dojo.position(this.domNode).x + "px";
+			}
 
-	_customFormats.push({pkg:packageName,name:bundleName});
-};
+			dijit.setWaiState(this.comboNode, "expanded", "true");
+		},
 
-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*/
-};
-})();
+		_hideResultList: function(){
+			this._abortQuery();
+			if(this._isShowingNow){
+				dijit.popup.close(this._popupWidget);
+				this._arrowIdle();
+				this._isShowingNow=false;
+				dijit.setWaiState(this.comboNode, "expanded", "false");
+				dijit.removeWaiState(this.focusNode,"activedescendant");
+			}
+		},
 
-dojo.date.locale.addCustomFormats("dojo.cldr","gregorian");
+		_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.attr('displayedValue');
+			var pw = this._popupWidget;
+			if(pw && (
+				newvalue == pw._messages["previousMessage"] ||
+				newvalue == pw._messages["nextMessage"]
+				)
+			){
+				this._setValueAttr(this._lastValueReported, true);
+			}else if(typeof this.item == "undefined"){
+				// Update 'value' (ex: KY) according to currently displayed text
+				this.item = null;
+				this.attr('displayedValue', newvalue);
+			}else{
+				if(this.value != this._lastValueReported){
+					dijit.form._FormValueWidget.prototype._setValueAttr.call(this, this.value, true);
+				}
+				this._refreshState();
+			}
+		},
 
-dojo.date.locale.getNames = function(/*String*/item, /*String*/type, /*String?*/context, /*String?*/locale){
-	// summary:
-	//		Used to get localized strings from dojo.cldr for day or month names.
-	//
-	// item:
-	//	'months' || 'days'
-	// type:
-	//	'wide' || 'narrow' || 'abbr' (e.g. "Monday", "Mon", or "M" respectively, in English)
-	// context:
-	//	'standAlone' || 'format' (default)
-	// locale:
-	//	override locale used to find the names
+		_onBlur: function(){
+			// summary:
+			//		Called magically when focus has shifted away from this widget and it's drop down
+			this._hideResultList();
+			this._arrowIdle();
+			this.inherited(arguments);
+		},
 
-	var label;
-	var lookup = dojo.date.locale._getGregorianBundle(locale);
-	var props = [item, context, type];
-	if(context == 'standAlone'){
-		var key = props.join('-');
-		label = lookup[key];
-		// Fall back to 'format' flavor of name
-		if(label[0] == 1){ label = undefined; } // kludge, in the absense of real aliasing support in dojo.cldr
-	}
-	props[1] = 'format';
+		_setItemAttr: function(/*item*/ item, /*Boolean?*/ priorityChange, /*String?*/ displayedValue){
+			// summary:
+			//              Set the displayed valued in the input box, and the hidden value
+			//              that gets submitted, based on a dojo.data store item.
+			// description:
+			//              Users shouldn't call this function; they should be calling
+			//              attr('item', value)
+			// tags:
+			//              private
+			if(!displayedValue){ displayedValue = this.labelFunc(item, this.store); }
+			this.value = this._getValueField() != this.searchAttr? this.store.getIdentity(item) : displayedValue;
+			this.item = item;
+			dijit.form.ComboBox.superclass._setValueAttr.call(this, this.value, priorityChange, displayedValue);
+		},
 
-	// return by copy so changes won't be made accidentally to the in-memory model
-	return (label || lookup[props.join('-')]).concat(); /*Array*/
-};
+		_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.
 
-dojo.date.locale.isWeekend = function(/*Date?*/dateObject, /*String?*/locale){
-	// summary:
-	//	Determines if the date falls on a weekend, according to local custom.
+			if(!node){
+				return;
+			}
+			// pull the text value from the item attached to the DOM node
+			var newValue;
+			if( node == this._popupWidget.nextButton ||
+				node == this._popupWidget.previousButton){
+				newValue = node.innerHTML;
+				this.item = undefined;
+				this.value = '';
+			}else{
+				newValue = this.labelFunc(node.item, this.store);
+				this.attr('item', node.item, false, newValue);
+			}
+			// get the text that the user manually entered (cut off autocompleted text)
+			this.focusNode.value = this.focusNode.value.substring(0, this._lastInput.length);
+			// set up ARIA activedescendant
+			dijit.setWaiState(this.focusNode, "activedescendant", dojo.attr(node, "id"));
+			// autocomplete the rest of the option to announce change
+			this._autoCompleteText(newValue);
+		},
 
-	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
-};
+		_selectOption: function(/*Event*/ evt){
+			// summary:
+			//		Menu callback function, called when an item in the menu is selected.
+			if(evt){
+				this._announceOption(evt.target);
+			}
+			this._hideResultList();
+			this._setCaretPos(this.focusNode, this.focusNode.value.length);
+			dijit.form._FormValueWidget.prototype._setValueAttr.call(this, this.value, true); // set this.value and fire onChange
+		},
 
-// These are used only by format and strftime.  Do they need to be public?  Which module should they go in?
+		_onArrowMouseDown: function(evt){
+			// summary:
+			//		Callback when arrow is clicked
+			if(this.disabled || this.readOnly){
+				return;
+			}
+			dojo.stopEvent(evt);
+			this.focus();
+			if(this._isShowingNow){
+				this._hideResultList();
+			}else{
+				// forces full population of results, if they click
+				// on the arrow it means they want to see more options
+				this._startSearchAll();
+			}
+		},
 
-dojo.date.locale._getDayOfYear = function(/*Date*/dateObject){
-	// summary: gets the day of the year as represented by dateObject
-	return dojo.date.difference(new Date(dateObject.getFullYear(), 0, 1, dateObject.getHours()), dateObject) + 1; // Number
-};
+		_startSearchAll: function(){
+			this._startSearch('');
+		},
 
-dojo.date.locale._getWeekOfYear = function(/*Date*/dateObject, /*Number*/firstDayOfWeek){
-	if(arguments.length == 1){ firstDayOfWeek = 0; } // Sunday
+		_startSearchFromInput: function(){
+			this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g, "\\$1"));
+		},
 
-	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);
+		_getQueryString: function(/*String*/ text){
+			return dojo.string.substitute(this.queryExpr, [text]);
+		},
 
-	// if year starts on the specified day, start counting weeks at 1
-	if(firstDayOfYear == firstDayOfWeek){ week++; }
+		_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
+			var query = dojo.clone(this.query); // #5970
+			this._lastInput = key; // Store exactly what was entered by the user.
+			this._lastQuery = query[this.searchAttr] = this._getQueryString(key);
+			// #5970: set _lastQuery, *then* start the timeout
+			// otherwise, if the user types and the last query returns before the timeout,
+			// _lastQuery won't be set and their input gets rewritten
+			this.searchTimer=setTimeout(dojo.hitch(this, function(query, _this){
+				this.searchTimer = null;
+				var fetch = {
+					queryOptions: {
+						ignoreCase: this.ignoreCase,
+						deep: true
+					},
+					query: query,
+					onBegin: dojo.hitch(this, "_setMaxOptions"),
+					onComplete: dojo.hitch(this, "_openResultList"),
+					onError: function(errText){
+						_this._fetchHandle = null;
+						console.error('dijit.form.ComboBox: ' + errText);
+						dojo.hitch(_this, "_hideResultList")();
+					},
+					start: 0,
+					count: this.pageSize
+				};
+				dojo.mixin(fetch, _this.fetchProperties);
+				this._fetchHandle = _this.store.fetch(fetch);
 
-	return week; // Number
-};
+				var nextSearch = function(dataObject, direction){
+					dataObject.start += dataObject.count*direction;
+					// #4091:
+					//		tell callback the direction of the paging so the screen
+					//		reader knows which menu option to shout
+					dataObject.direction = direction;
+					this._fetchHandle = this.store.fetch(dataObject);
+				};
+				this._nextSearch = this._popupWidget.onPage = dojo.hitch(this, nextSearch, this._fetchHandle);
+			}, query, this), this.searchDelay);
+		},
 
-}
+		_setMaxOptions: function(size, request){
+			 this._maxOptions = size;
+		},
 
-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");
+		_getValueField: function(){
+			// summmary:
+			//		Helper for postMixInProperties() to set this.value based on data inlined into the markup.
+			//		Returns the attribute name in the item (in dijit.form._ComboBoxDataStore) to use as the value.
+			return this.searchAttr;
+		},
 
+		/////////////// Event handlers /////////////////////
 
+		_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: For 2.0, rename to "_compositionEnd"
+		compositionend: function(/*Event*/ evt){
+			// summary:
+			//		When inputting characters using an input method, such as
+			//		Asian languages, it will generate this event instead of
+			//		onKeyDown event.
+			//		Note: this event is only triggered in FF (not in IE/safari)
+			// tags:
+			//		private
 
+			// 229 is the code produced by IE and safari while pressing keys during
+			// IME input mode
+			this._onKeyPress({charOrCode: 229});
+		},
 
+		//////////// INITIALIZATION METHODS ///////////////////////////////////////
 
+		constructor: function(){
+			this.query={};
+			this.fetchProperties={};
+		},
 
-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>
+		postMixInProperties: function(){
+			if(!this.hasDownArrow){
+				this.baseClass = "dijitTextBox";
+			}
+			if(!this.store){
+				var srcNodeRef = this.srcNodeRef;
 
-		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<img src=\"${_blankGif}\" alt=\"\" class=\"dijitCalendarIncrementControl dijitCalendarDecrease\" waiRole=\"presentation\">\n\t\t\t\t<span dojoAttachPoint=\"decreaseArrowNode\" class=\"dijitA11ySideArrow\">-</span>\n\t\t\t</th>\n\t\t\t<th [...]
+				// if user didn't specify store, then assume there are option tags
+				this.store = new dijit.form._ComboBoxDataStore(srcNodeRef);
 
-		// value: Date
-		//		The currently selected Date
-		value: new Date(),
+				// 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
 
-		// dayWidth: String
-		//		How to represent the days of the week in the calendar header. See dojo.date.locale
-		dayWidth: "narrow",
+				// 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){
+						var valueField = this._getValueField();
+						this.value = valueField != this.searchAttr? this.store.getValue(item, valueField) : this.labelFunc(item, this.store);
+					}
+				}
+			}
+			this.inherited(arguments);
+		},
 
-		setValue: function(/*Date*/ value){
+		postCreate: function(){
 			// summary:
-			//      Deprecated.   Used attr('value', ...) instead.
+			//		Subclasses must call this method from their postCreate() methods
 			// tags:
-			//      deprecated
-			dojo.deprecated("dijit.Calendar:setValue() is deprecated.  Use attr('value', ...) instead.", "", "2.0");
-			this.attr('value', value);
-		},
+			//		protected
 
-		_getValueAttr: function(/*String*/ value){
-			// summary:
-			//		Hook so attr('value') works.
-			var value = new Date(this.value);
-			value.setHours(0, 0, 0, 0); // return midnight, local time for back-compat
+			// 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);
 
-			// If daylight savings pushes midnight to the previous date, fix the Date
-			// object to point at 1am so it will represent the correct day. See #9366
-			if(value.getDate() < this.value.getDate()){
-				value = dojo.date.add(value, "hour", 1);
 			}
-			return value;
+			this.inherited(arguments);
 		},
 
-		_setValueAttr: function(/*Date*/ value){
-			// summary:
-			//		Hook to make attr("value", ...) work.
-			// description:
-			// 		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.
-			// tags:
-			//      protected
-			if(!this.value || dojo.date.compare(value, this.value)){
-				value = new Date(value);
-				value.setHours(1); // to avoid issues when DST shift occurs at midnight, see #8521, #9366
-				this.displayMonth = new Date(value);
-				if(!this.isDisabledDate(value, this.lang)){
-					this.value = value;
-					this.onChange(this.attr('value'));
-				}
-				this._populateGrid();
+		uninitialize: function(){
+			if(this._popupWidget && !this._popupWidget._destroyed){
+				this._hideResultList();
+				this._popupWidget.destroy();
 			}
+			this.inherited(arguments);
 		},
 
-		_setText: function(node, text){
-			// summary:
-			//		This just sets the content of node to the specified text.
-			//		Can't do "node.innerHTML=text" because of an IE bug w/tables, see #3434.
-			// tags:
-			//      private
-			while(node.firstChild){
-				node.removeChild(node.firstChild);
+		_getMenuLabelFromItem: function(/*Item*/ item){
+			var label = this.labelAttr? this.store.getValue(item, this.labelAttr) : this.labelFunc(item, this.store);
+			var labelType = this.labelType;
+			// If labelType is not "text" we don't want to screw any markup ot whatever.
+			if(this.highlightMatch != "none" && this.labelType == "text" && this._lastInput){
+				label = this.doHighlight(label, this._escapeHtml(this._lastInput));
+				labelType = "html";
 			}
-			node.appendChild(dojo.doc.createTextNode(text));
+			return {html: labelType == "html", label: label};
 		},
 
-		_populateGrid: function(){
+		doHighlight: function(/*String*/label, /*String*/find){
 			// summary:
-			//      Fills in the calendar grid with each day (1-31)
+			//		Highlights the string entered by the user in the menu.  By default this
+			//		highlights the first occurence found. Override this method
+			//		to implement your custom highlighing.
 			// tags:
-			//      private
-			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; }
+			//		protected
 
-			// 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;
+			// Add greedy when this.highlightMatch == "all"
+			var modifiers = "i"+(this.highlightMatch == "all"?"g":"");
+			var escapedLabel = this._escapeHtml(label);
+			find = dojo.regexp.escapeString(find); // escape regexp special chars
+			var ret = escapedLabel.replace(new RegExp("(^|\\s)("+ find +")", modifiers),
+					'$1<span class="dijitComboBoxHighlightMatch">$2</span>');
+			return ret;// returns String, (almost) valid HTML (entities encoded)
+		},
 
-				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";
-				}
+		_escapeHtml: function(/*string*/str){
+			// TODO Should become dojo.html.entities(), when exists use instead
+			// summary:
+			//		Adds escape sequences for special characters in XML: &<>"'
+			str = String(str).replace(/&/gm, "&").replace(/</gm, "<")
+				.replace(/>/gm, ">").replace(/"/gm, """);
+			return str; // string
+		},
 
-				if(adj){
-					date = dojo.date.add(date, "month", adj);
-				}
-				date.setDate(number);
+		open: function(){
+			// summary:
+			//		Opens the drop down menu.  TODO: rename to _open.
+			// tags:
+			//		private
+			this._isShowingNow=true;
+			return dijit.popup.open({
+				popup: this._popupWidget,
+				around: this.domNode,
+				parent: this
+			});
+		},
 
-				if(!dojo.date.compare(date, today, "date")){
-					clazz = "dijitCalendarCurrentDate " + clazz;
-				}
+		reset: function(){
+			// Overrides the _FormWidget.reset().
+			// Additionally reset the .item (to clean up).
+			this.item = null;
+			this.inherited(arguments);
+		},
 
-				if(!dojo.date.compare(date, selected, "date")){
-					clazz = "dijitCalendarSelectedDate " + clazz;
-				}
+		labelFunc: function(/*item*/ item, /*dojo.data.store*/ store){
+			// summary:
+			//              Computes the label to display based on the dojo.data store item.
+			// returns:
+			//              The label that the ComboBox should display
+			// tags:
+			//              private
 
-				if(this.isDisabledDate(date, this.lang)){
-					clazz = "dijitCalendarDisabledDate " + clazz;
-				}
+			// Use toString() because XMLStore returns an XMLItem whereas this
+			// method is expected to return a String (#9354)
+			return store.getValue(item, this.searchAttr).toString(); // String
+		}
+	}
+);
 
-				var clazz2 = this.getClassForDate(date, this.lang);
-				if(clazz2){
-					clazz = clazz2 + " " + clazz;
-				}
+dojo.declare(
+	"dijit.form._ComboBoxMenu",
+	[dijit._Widget, dijit._Templated],
+	{
+		// summary:
+		//		Focus-less menu for internal use in `dijit.form.ComboBox`
+		// tags:
+		//		private
 
-				template.className =  clazz + "Month dijitCalendarDateTemplate";
-				template.dijitDateValue = date.valueOf();
-				var label = dojo.query(".dijitCalendarDateLabel", template)[0];
-				this._setText(label, date.getDate());
-			}, this);
+		templateString: "<ul class='dijitReset dijitMenu' dojoAttachEvent='onmousedown:_onMouseDown,onmouseup:_onMouseUp,onmouseover:_onMouseOver,onmouseout:_onMouseOut' tabIndex='-1' style='overflow: \"auto\"; overflow-x: \"hidden\";'>"
+				+"<li class='dijitMenuItem dijitMenuPreviousButton' dojoAttachPoint='previousButton' waiRole='option'></li>"
+				+"<li class='dijitMenuItem dijitMenuNextButton' dojoAttachPoint='nextButton' waiRole='option'></li>"
+			+"</ul>",
 
-			// Fill in localized month name
-			var monthNames = dojo.date.locale.getNames('months', 'wide', 'standAlone', this.lang);
-			this._setText(this.monthLabelNode, monthNames[month.getMonth()]);
+		// _messages: Object
+		//		Holds "next" and "previous" text for paging buttons on drop down
+		_messages: null,
 
-			// 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);
+		postMixInProperties: function(){
+			this._messages = dojo.i18n.getLocalization("dijit.form", "ComboBox", this.lang);
+			this.inherited(arguments);
+		},
 
-			// Set up repeating mouse behavior
-			var _this = this;
-			var typematic = function(nodeProp, dateProp, adj){
-				_this._connects.push(
-					dijit.typematic.addMouseListener(_this[nodeProp], _this, function(count){
-						if(count >= 0){ _this._adjustDisplay(dateProp, adj); }
-					}, 0.8, 500)
-				);
-			};
-			typematic("incrementMonth", "month", 1);
-			typematic("decrementMonth", "month", -1);
-			typematic("nextYearLabelNode", "year", 1);
-			typematic("previousYearLabelNode", "year", -1);
+		_setValueAttr: function(/*Object*/ value){
+			this.value = value;
+			this.onChange(value);
 		},
 
-		goToToday: function(){
+		// stubs
+		onChange: function(/*Object*/ value){
 			// summary:
-			//      Sets calendar's value to today's date
-			this.attr('value', new Date());
+			//		Notifies ComboBox/FilteringSelect that user clicked an option in the drop down menu.
+			//		Probably should be called onSelect.
+			// tags:
+			//		callback
+		},
+		onPage: function(/*Number*/ direction){
+			// summary:
+			//		Notifies ComboBox/FilteringSelect that user clicked to advance to next/previous page.
+			// tags:
+			//		callback
 		},
 
 		postCreate: function(){
+			// fill in template with i18n messages
+			this.previousButton.innerHTML = this._messages["previousMessage"];
+			this.nextButton.innerHTML = this._messages["nextMessage"];
 			this.inherited(arguments);
-			dojo.setSelectable(this.domNode, false);
+		},
 
-			var cloneClass = dojo.hitch(this, function(clazz, n){
-				var template = dojo.query(clazz, this.domNode)[0];
-	 			for(var i=0; i<n; i++){
-					template.parentNode.appendChild(template.cloneNode(true));
-				}
-			});
+		onClose: function(){
+			// summary:
+			//		Callback from dijit.popup code to this widget, notifying it that it closed
+			// tags:
+			//		private
+			this._blurOptionNode();
+		},
 
-			// clone the day label and calendar day templates 6 times to make 7 columns
-			cloneClass(".dijitCalendarDayLabelTemplate", 6);
-			cloneClass(".dijitCalendarDateTemplate", 6);
+		_createOption: function(/*Object*/ item, labelFunc){
+			// summary:
+			//		Creates an option to appear on the popup menu subclassed by
+			//		`dijit.form.FilteringSelect`.
 
-			// now make 6 week rows
-			cloneClass(".dijitCalendarWeekTemplate", 5);
+			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 = " ";
+			}
+			menuitem.item=item;
+			return menuitem;
+		},
 
-			// 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);
+		createOptions: function(results, dataObject, labelFunc){
+			// summary:
+			//		Fills in the items in the drop down list
+			// results:
+			//		Array of dojo.data items
+			// dataObject:
+			//		dojo.data store
+			// labelFunc:
+			//		Function to produce a label in the drop down list from a dojo.data item
 
-			// 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.create("div", null, this.monthLabelSpacer);
-				this._setText(monthSpacer, name);
+			//this._dataObject=dataObject;
+			//this._dataObject.onComplete=dojo.hitch(comboBox, comboBox._openResultList);
+			// display "Previous . . ." button
+			this.previousButton.style.display = (dataObject.start == 0) ? "none" : "";
+			dojo.attr(this.previousButton, "id", this.id + "_prev");
+			// create options using _createOption function defined by parent
+			// ComboBox (or FilteringSelect) class
+			// #2309:
+			//		iterate over cache nondestructively
+			dojo.forEach(results, function(item, i){
+				var menuitem = this._createOption(item, labelFunc);
+				menuitem.className = "dijitReset dijitMenuItem";
+				dojo.attr(menuitem, "id", this.id + i);
+				this.domNode.insertBefore(menuitem, this.nextButton);
 			}, this);
+			// display "Next . . ." button
+			var displayMore = false;
+			//Try to determine if we should show 'more'...
+			if(dataObject._maxOptions && dataObject._maxOptions != -1){
+				if((dataObject.start + dataObject.count) < dataObject._maxOptions){
+					displayMore = true;
+				}else if((dataObject.start + dataObject.count) > (dataObject._maxOptions - 1)){
+					//Weird return from a datastore, where a start + count > maxOptions
+					// implies maxOptions isn't really valid and we have to go into faking it.
+					//And more or less assume more if count == results.length
+					if(dataObject.count == results.length){
+						displayMore = true;
+					}
+				}
+			}else if(dataObject.count == results.length){
+				//Don't know the size, so we do the best we can based off count alone.
+				//So, if we have an exact match to count, assume more.
+				displayMore = true;
+			}
 
-			this.value = null;
-			this.attr('value', new Date());
+			this.nextButton.style.display = displayMore ? "" : "none";
+			dojo.attr(this.nextButton,"id", this.id + "_next");
+			return this.domNode.childNodes;
 		},
 
-		_adjustDisplay: function(/*String*/ part, /*int*/ amount){
+		clearResultList: function(){
 			// summary:
-			//      Moves calendar forwards or backwards by months or years
-			// part:
-			//      "month" or "year"
-			// amount:
-			//      Number of months or years
-			// tags:
-			//      private
-			this.displayMonth = dojo.date.add(this.displayMonth, part, amount);
-			this._populateGrid();
+			//		Clears the entries in the drop down list, but of course keeps the previous and next buttons.
+			while(this.domNode.childNodes.length>2){
+				this.domNode.removeChild(this.domNode.childNodes[this.domNode.childNodes.length-2]);
+			}
 		},
 
-		_onDayClick: function(/*Event*/ evt){
-			// summary:
-			//      Handler for when user clicks a day
-			// tags:
-			//      protected
+		_onMouseDown: function(/*Event*/ evt){
 			dojo.stopEvent(evt);
-			for(var node = evt.target; node && !node.dijitDateValue; node = node.parentNode);
-			if(node && !dojo.hasClass(node, "dijitCalendarDisabledDate")){
-				this.attr('value', node.dijitDateValue);
-				this.onValueSelected(this.attr('value'));
-			}
 		},
 
-		_onDayMouseOver: function(/*Event*/ evt){
-			// summary:
-			//      Handler for when user clicks a day
-			// tags:
-			//      protected
-			var node = evt.target;
-			if(node && (node.dijitDateValue || node == this.previousYearLabelNode || node == this.nextYearLabelNode) ){
-				dojo.addClass(node, "dijitCalendarHoveredDate");
-				this._currentNode = node;
+		_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._setValueAttr({ target: tgt }, true);
 			}
 		},
 
-		_onDayMouseOut: function(/*Event*/ evt){
-			// summary:
-			//      Handler for when user clicks a day
-			// tags:
-			//      protected
-			if(!this._currentNode){ return; }
-			for(var node = evt.relatedTarget; node;){
-				if(node == this._currentNode){ return; }
-				try{
-					node = node.parentNode;
-				}catch(x){
-					node = null;
+		_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;
 				}
 			}
-			dojo.removeClass(this._currentNode, "dijitCalendarHoveredDate");
-			this._currentNode = null;
+			this._focusOptionNode(tgt);
 		},
 
-		onValueSelected: function(/*Date*/ date){
-			// summary:
-			//		Notification that a date cell was selected.  It may be the same as the previous value.
-			// description:
-			//      Used by `dijit.form._DateTimeTextBox` (and thus `dijit.form.DateTextBox`)
-			//      to get notification when the user has clicked a date.
-			// tags:
-			//      protected
+		_onMouseOut: function(/*Event*/ evt){
+			if(evt.target === this.domNode){ return; }
+			this._blurOptionNode();
 		},
 
-		onChange: function(/*Date*/ date){
+		_focusOptionNode: function(/*DomNode*/ node){
 			// summary:
-			//		Called only when the selected date has changed
+			//		Does the actual highlight.
+			if(this._highlighted_option != node){
+				this._blurOptionNode();
+				this._highlighted_option = node;
+				dojo.addClass(this._highlighted_option, "dijitMenuItemSelected");
+			}
 		},
 
-		isDisabledDate: function(/*Date*/ dateObject, /*String?*/ locale){
+		_blurOptionNode: function(){
 			// summary:
-			//		May be overridden to disable certain dates in the calendar e.g. `isDisabledDate=dojo.date.locale.isWeekend`
-			// tags:
-			//      extension
-/*=====
-			return false; // Boolean
-=====*/
+			//		Removes highlight on highlighted option.
+			if(this._highlighted_option){
+				dojo.removeClass(this._highlighted_option, "dijitMenuItemSelected");
+				this._highlighted_option = null;
+			}
 		},
 
-		getClassForDate: function(/*Date*/ dateObject, /*String?*/ locale){
+		_highlightNextOption: function(){
 			// summary:
-			//		May be overridden to return CSS classes to associate with the date entry for the given dateObject,
-			//		for example to indicate a holiday in specified locale.
-			// tags:
-			//      extension
-
-/*=====
-			return ""; // String
-=====*/
-		}
-	}
-);
-
-}
-
-if(!dojo._hasResource["dijit.form._DateTimeTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form._DateTimeTextBox"] = true;
-dojo.provide("dijit.form._DateTimeTextBox");
-
-
-
-
-
-
-/*=====
-dojo.declare(
-	"dijit.form._DateTimeTextBox.__Constraints",
-	[dijit.form.RangeBoundTextBox.__Constraints, dojo.date.locale.__FormatOptions]
-);
-=====*/
-
-dojo.declare(
-	"dijit.form._DateTimeTextBox",
-	dijit.form.RangeBoundTextBox,
-	{
-		// summary:
-		//		Base class for validating, serializable, range-bound date or time text box.
-
-		/*=====
-		// constraints: dijit.form._DateTimeTextBox.__Constraints
-		//		Starting / ending dates or times allowed
-		constraints: {},
-		======*/
-
-		// Override ValidationTextBox.regExpGen().... we use a reg-ex generating function rather
-		// than a straight regexp to deal with locale  (plus formatting options too?)
-		regExpGen: dojo.date.locale.regexp,
-
-		// Override _FormWidget.compare() to work for dates/times
-		compare: dojo.date.compare,
+			// 		Highlight the item just below the current selection.
+			// 		If nothing selected, highlight first option.
 
-		format: function(/*Date*/ value, /*dojo.date.locale.__FormatOptions*/ constraints){
-			// summary:
-			//		Formats the value as a Date, according to specified locale (second argument)
-			// tags:
-			//		protected
-			if(!value){ return ''; }
-			return dojo.date.locale.format(value, constraints);
+			// 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);
 		},
 
-		parse: function(/*String*/ value, /*dojo.date.locale.__FormatOptions*/ constraints){
+		highlightFirstOption: function(){
 			// summary:
-			//		Parses as string as a Date, according to constraints
-			// tags:
-			//		protected
-
-			return dojo.date.locale.parse(value, constraints) || (this._isEmpty(value)? null : undefined);	 // Date
+			// 		Highlight the first real item in the list (not Previous Choices).
+			this._focusOptionNode(this.domNode.firstChild.nextSibling);
+			dijit.scrollIntoView(this._highlighted_option);
 		},
 
-		// Overrides ValidationTextBox.serialize() to serialize a date in canonical ISO format.
-		serialize: dojo.date.stamp.toISOString,
-
-		//	value: Date
-		//		The value of this widget as a JavaScript Date object.  Use attr("value") / attr("value", val) to manipulate.
-		//		When passed to the parser in markup, must be specified according to `dojo.date.stamp.fromISOString`
-		value: new Date(""),	// value.toString()="NaN"
-		_blankValue: null,    // used by filter() when the textbox is blank
-
-		//	popupClass: [protected extension] String
-		//		Name of the popup widget class used to select a date/time.
-		//		Subclasses should specify this.
-		popupClass: "", // default is no popup = text only
-
-
-		// _selector: [protected extension] String
-		//		Specifies constraints.selector passed to dojo.date functions, should be either
-		//		"date" or "time".
-		//		Subclass must specify this.
-		_selector: "",
-
-		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 = null;
-			}
-			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){
+		highlightLastOption: function(){
 			// summary:
-			//		open the TimePicker popup
-			this._open();
+			// 		Highlight the last real item in the list (not More Choices).
+			this._focusOptionNode(this.domNode.lastChild.previousSibling);
+			dijit.scrollIntoView(this._highlighted_option);
 		},
 
-		_setValueAttr: function(/*Date*/ value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){
+		_highlightPrevOption: function(){
 			// 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.attr('value', value);
+			// 		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);
 		},
 
-		_open: function(){
+		_page: function(/*Boolean*/ up){
 			// summary:
-			//		opens the TimePicker, and sets the onValueSelected value
-
-			if(this.disabled || this.readOnly || !this.popupClass){return;}
-
-			var textBox = this;
-
-			if(!this._picker){
-				var PopupProto=dojo.getObject(this.popupClass, false);
-				this._picker = new PopupProto({
-					onValueSelected: function(value){
-						if(textBox._tabbingAway){
-							delete textBox._tabbingAway;
-						}else{
-							textBox.focus(); // focus the textbox before the popup closes to avoid reopening the popup
-						}
-						setTimeout(dojo.hitch(textBox, "_close"), 1); // allow focus time to take
+			//		Handles page-up and page-down keypresses
 
-						// this will cause InlineEditBox and other handlers to do stuff so make sure it's last
-						dijit.form._DateTimeTextBox.superclass._setValueAttr.call(textBox, value, true);
-					},
-					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.attr('value', this.attr('value') || new Date());
+			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();
 			}
-			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;
+			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;
 			}
-			
-			dojo.marginBox(this._picker.domNode,{ w:this.domNode.offsetWidth });
-		},
-
-		_close: function(){
-			if(this._opened){
-				dijit.popup.close(this._picker);
-				this._opened=false;
-			}			
 		},
 
-		_onBlur: function(){
+		pageUp: 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.
+			//		Handles pageup keypress.
+			//		TODO: just call _page directly from handleKey().
+			// tags:
+			//		private
+			this._page(true);
 		},
 
-		_getDisplayedValueAttr: function(){
-			return this.textbox.value;
+		pageDown: function(){
+			// summary:
+			//		Handles pagedown keypress.
+			//		TODO: just call _page directly from handleKey().
+			// tags:
+			//		private
+			this._page(false);
 		},
 
-		_setDisplayedValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange){
-			this._setValueAttr(this.parse(value, this.constraints), priorityChange, value);
+		getHighlightedOption: function(){
+			// summary:
+			//		Returns the highlighted option.
+			var ho = this._highlighted_option;
+			return (ho && ho.parentNode) ? ho : null;
 		},
 
-		destroy: function(){
-			if(this._picker){
-				this._picker.destroy();
-				delete this._picker;
+		handleKey: function(key){
+			switch(key){
+				case dojo.keys.DOWN_ARROW:
+					this._highlightNextOption();
+					break;
+				case dojo.keys.PAGE_DOWN:
+					this.pageDown();
+					break;
+				case dojo.keys.UP_ARROW:
+					this._highlightPrevOption();
+					break;
+				case dojo.keys.PAGE_UP:
+					this.pageUp();
+					break;
 			}
-			this.inherited(arguments);
-		},
+		}
+	}
+);
 
-		postCreate: function(){
-			this.inherited(arguments);
-			this.connect(this.focusNode, 'onkeypress', this._onKeyPress);
-		},
+dojo.declare(
+	"dijit.form.ComboBox",
+	[dijit.form.ValidationTextBox, dijit.form.ComboBoxMixin],
+	{
+		// summary:
+		//		Auto-completing text box, and base class for dijit.form.FilteringSelect.
+		//
+		// description:
+		//		The drop down box's values are populated from an class called
+		//		a data provider, which returns a list of values based on the characters
+		//		that the user has typed into the input box.
+		//		If OPTION tags are used as the data provider via markup,
+		//		then the OPTION tag's child text node is used as the widget value
+		//		when selected.  The OPTION tag's value attribute is ignored.
+		//		To set the default value when using OPTION tags, specify the selected
+		//		attribute on 1 of the child OPTION tags.
+		//
+		//		Some of the options to the ComboBox are actually arguments to the data
+		//		provider.
 
-		_onKeyPress: function(/*Event*/ e){
+		_setValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange, /*String?*/ displayedValue){
 			// summary:
-			//		Handler for keypress events
-
-			var p = this._picker, dk = dojo.keys;
-			// Handle the key in the picker, if it has a handler.  If the handler
-			// returns false, then don't handle any other keys.
-			if(p && this._opened && p.handleKey){
-				if(p.handleKey(e) === false){ return; }
-			}
-			if(this._opened && e.charOrCode == dk.ESCAPE && !e.shiftKey && !e.ctrlKey && !e.altKey){
-				this._close();
-				dojo.stopEvent(e);
-			}else if(!this._opened && e.charOrCode == dk.DOWN_ARROW){
-				this._open();
-				dojo.stopEvent(e);
-			}else if(e.charOrCode === dk.TAB){
-				this._tabbingAway = true;
-			}else if(this._opened && (e.keyChar || e.charOrCode === dk.BACKSPACE || e.charOrCode == dk.DELETE)){
-				// Replace the element - but do it after a delay to allow for 
-				// filtering to occur
-				setTimeout(dojo.hitch(this, function(){
-					dijit.placeOnScreenAroundElement(p.domNode.parentNode, this.domNode, {'BL':'TL', 'TL':'BL'}, p.orient ? dojo.hitch(p, "orient") : null);
-				}), 1);
-			}
+			//		Hook so attr('value', value) works.
+			// description:
+			//		Sets the value of the select.
+			this.item = null; // value not looked up in store
+			if(!value){ value = ''; } // null translates to blank
+			dijit.form.ValidationTextBox.prototype._setValueAttr.call(this, value, priorityChange, displayedValue);
 		}
 	}
 );
 
-}
+dojo.declare("dijit.form._ComboBoxDataStore", null, {
+	// summary:
+	//		Inefficient but small data store specialized for inlined `dijit.form.ComboBox` data
+	//
+	// description:
+	//		Provides a store for inlined data like:
+	//
+	//	|	<select>
+	//	|		<option value="AL">Alabama</option>
+	//	|		...
+	//
+	//		Actually. just implements the subset of dojo.data.Read/Notification
+	//		needed for ComboBox and FilteringSelect to work.
+	//
+	//		Note that an item is just a pointer to the <option> DomNode.
 
-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");
+	constructor: function( /*DomNode*/ root){
+		this.root = root;
+
+		dojo.query("> option", root).forEach(function(node){
+			//	TODO: this was added in #3858 but unclear why/if it's needed;  doesn't seem to be.
+			//	If it is needed then can we just hide the select itself instead?
+			//node.style.display="none";
+			node.innerHTML = dojo.trim(node.innerHTML);
+		});
+
+	},
+
+	getValue: function(	/* item */ item,
+						/* attribute-name-string */ attribute,
+						/* value? */ defaultValue){
+		return (attribute == "value") ? item.value : (item.innerText || item.textContent || '');
+	},
+
+	isItemLoaded: function(/* anything */ something){
+		return true;
+	},
+
+	getFeatures: function(){
+		return {"dojo.data.api.Read": true, "dojo.data.api.Identity": true};
+	},
+
+	_fetchItems: function(	/* Object */ args,
+							/* Function */ findCallback,
+							/* Function */ errorCallback){
+		// summary:
+		//		See dojo.data.util.simpleFetch.fetch()
+		if(!args.query){ args.query = {}; }
+		if(!args.query.name){ args.query.name = ""; }
+		if(!args.queryOptions){ args.queryOptions = {}; }
+		var matcher = dojo.data.util.filter.patternToRegExp(args.query.name, args.queryOptions.ignoreCase),
+			items = dojo.query("> option", this.root).filter(function(option){
+				return (option.innerText || option.textContent || '').match(matcher);
+			} );
+		if(args.sort){
+			items.sort(dojo.data.util.sorter.createSortFunction(args.sort, this));
+		}
+		findCallback(items, args);
+	},
 
+	close: function(/*dojo.data.api.Request || args || null */ request){
+		return;
+	},
 
+	getLabel: function(/* item */ item){
+		return item.innerHTML;
+	},
 
+	getIdentity: function(/* item */ item){
+		return dojo.attr(item, "value");
+	},
 
-dojo.declare(
-	"dijit.form.DateTextBox",
-	dijit.form._DateTimeTextBox,
-	{
+	fetchItemByIdentity: function(/* Object */ args){
 		// summary:
-		//		A validating, serializable, range-bound date text box with a drop down calendar
-
-		baseClass: "dijitTextBox dijitDateTextBox",
-		popupClass: "dijit._Calendar",
-		_selector: "date",
-
-		//	value: Date
-		//		The value of this widget as a JavaScript Date object, with only year/month/day specified.
+		//		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.
 		//
-		//		Example:
-		// |	new dijit.form.DateTextBox({value: new Date(2009,1,20)})
+		// description:
+		//		Given arguments like:
 		//
-		//		When passed to the parser in markup, must be specified according to locale-independent
-		//		`dojo.date.stamp.fromISOString` format.
+		//	|		{identity: "CA", onItem: function(item){...}
 		//
-		//		Example:
-		// |	<input dojotype='dijit.form.DateTextBox' value='2009-01-20'>
-		value: new Date("")	// value.toString()="NaN"
+		//		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
 	}
-);
+});
+//Mix in the simple fetch implementation to this class.
+dojo.extend(dijit.form._ComboBoxDataStore,dojo.data.util.simpleFetch);
 
 }
 
@@ -18214,7 +20481,7 @@ dojo.declare(
 		//				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.
@@ -18224,7 +20491,7 @@ dojo.declare(
 		_isvalid: true,
 
 		// required: Boolean
-		//		True if user is required to enter a value into this field.
+		//		True (default) if user is required to enter a value into this field.
 		required: true,
 
 		_lastDisplayedValue: "",
@@ -18234,8 +20501,8 @@ dojo.declare(
 			return this._isvalid || (!this.required && this.attr('displayedValue') == ""); // #5974
 		},
 
-		_callbackSetLabel: function(	/*Array*/ result, 
-						/*Object*/ dataObject, 
+		_callbackSetLabel: function(	/*Array*/ result,
+						/*Object*/ dataObject,
 						/*Boolean?*/ priorityChange){
 			// summary:
 			//		Callback function that dynamically sets the label of the
@@ -18245,20 +20512,19 @@ dojo.declare(
 			// so it calls _callbackSetLabel directly,
 			// and so does not pass dataObject
 			// still need to test against _lastQuery in case it came too late
-			if((dataObject && dataObject.query[this.searchAttr] != this._lastQuery)||(!dataObject && result.length && this.store.getIdentity(result[0])!= this._lastQuery)){
+			if((dataObject && dataObject.query[this.searchAttr] != this._lastQuery) || (!dataObject && result.length && this.store.getIdentity(result[0]) != this._lastQuery)){
 				return;
 			}
 			if(!result.length){
 				//#3268: do nothing on bad input
-				//this._setValue("", "");
 				//#3285: change CSS to indicate error
 				this.valueNode.value = "";
-				dijit.form.TextBox.superclass._setValueAttr.call(this, "", priorityChange || (priorityChange===undefined && !this._focused));
+				dijit.form.TextBox.superclass._setValueAttr.call(this, "", priorityChange || (priorityChange === undefined && !this._focused));
 				this._isvalid = false;
 				this.validate(this._focused);
 				this.item = null;
 			}else{
-				this._setValueFromItem(result[0], priorityChange);
+				this.attr('item', result[0], priorityChange);
 			}
 		},
 
@@ -18278,9 +20544,8 @@ dojo.declare(
 			// summary:
 			//		Hook for attr('value') to work.
 
-			// don't get the textbox value but rather the previously set hidden value
-			// TODO: seems suspicious that we need this; how is FilteringSelect different
-			// than another MappedTextBox widget?
+			// don't get the textbox value but rather the previously set hidden value.
+			// Use this.valueNode.value which isn't always set for other MappedTextBox widgets until blur
 			return this.valueNode.value;
 		},
 
@@ -18289,20 +20554,6 @@ dojo.declare(
 			return "value";
 		},
 
-		_setValue: function(	/*String*/ value, 
-					/*String*/ displayedValue,
-					/*Boolean?*/ priorityChange){
-			// summary:
-			//		Internal function for setting the displayed value and hidden value.
-			//		Differs from _setValueAttr() in that _setValueAttr() only takes a single
-			//		value argument, and has to look up the displayed value from that.
-			// tags:
-			//		private
-			this.valueNode.value = value;
-			dijit.form.FilteringSelect.superclass._setValueAttr.call(this, value, priorityChange, displayedValue);
-			this._lastDisplayedValue = displayedValue;
-		},
-
 		_setValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange){
 			// summary:
 			//		Hook so attr('value', value) works.
@@ -18319,65 +20570,31 @@ dojo.declare(
 
 			//#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, 
+				identity: value,
 				onItem: function(item){
-					handleFetchByIdentity(item, priorityChange);
+					self._callbackSetLabel([item], undefined, priorityChange);
 				}
 			});
 		},
 
-		_setValueFromItem: function(/*item*/ item, /*Boolean?*/ priorityChange){
-			//	summary:
+		_setItemAttr: function(/*item*/ item, /*Boolean?*/ priorityChange, /*String?*/ displayedValue){
+			// summary:
 			//		Set the displayed valued in the input box, and the hidden value
 			//		that gets submitted, based on a dojo.data store item.
-			//	description:
+			// description:
 			//		Users shouldn't call this function; they should be calling
-			//		attr('displayedValue', value) or attr('value', ...) instead
+			//		attr('item', value)
 			// tags:
 			//		private
 			this._isvalid = true;
-			this.item = item; // Fix #6381
-			this._setValue(	this.store.getIdentity(item), 
-							this.labelFunc(item, this.store), 
-							priorityChange);
-		},
-
-		labelFunc: function(/*item*/ item, /*dojo.data.store*/ store){
-			// summary:
-			//		Computes the label to display based on the dojo.data store item.
-			// returns:
-			//		The label that the ComboBox should display
-			// tags:
-			//		private
-			return store.getValue(item, this.searchAttr);
+			this.inherited(arguments);
+			this.valueNode.value = this.value;
+			this._lastDisplayedValue = this.textbox.value;
 		},
 
-		_doSelect: function(/*Event*/ tgt){
-			// summary:
-			//		Overrides ComboBox._doSelect(), the method called when an item in the menu is selected.
-			//	description:
-			//		FilteringSelect overrides this to set both the visible and
-			//		hidden value from the information stored in the menu.
-			this._setValueFromItem(tgt.item, true);
+		_getDisplayQueryString: function(/*String*/ text){
+			return text.replace(/([\\\*\?])/g, "\\$1");
 		},
 
 		_setDisplayedValueAttr: function(/*String*/ label, /*Boolean?*/ priorityChange){
@@ -18396,9 +20613,10 @@ dojo.declare(
 			}
 
 			if(this.store){
+				this._hideResultList();
 				var query = dojo.clone(this.query); // #6196: populate query with user-specifics
 				// escape meta characters of dojo.data.util.filter.patternToRegExp().
-				this._lastQuery = query[this.searchAttr] = label.replace(/([\\\*\?])/g, "\\$1");
+				this._lastQuery = query[this.searchAttr] = this._getDisplayQueryString(label);
 				// if the label is not valid, the callback will never set it,
 				// so the last valid value will get the warning textbox set the
 				// textbox value now so that the impending warning will make
@@ -18407,21 +20625,23 @@ dojo.declare(
 				this._lastDisplayedValue = label;
 				var _this = this;
 				var fetch = {
-					query: query, 
+					query: query,
 					queryOptions: {
-						ignoreCase: this.ignoreCase, 
+						ignoreCase: this.ignoreCase,
 						deep: true
-					}, 
+					},
 					onComplete: function(result, dataObject){
-						        dojo.hitch(_this, "_callbackSetLabel")(result, dataObject, priorityChange);
+						_this._fetchHandle = null;
+						dojo.hitch(_this, "_callbackSetLabel")(result, dataObject, priorityChange);
 					},
 					onError: function(errText){
+						_this._fetchHandle = null;
 						console.error('dijit.form.FilteringSelect: ' + errText);
-						dojo.hitch(_this, "_setValue")("", label, false);
+						dojo.hitch(_this, "_callbackSetLabel")([], undefined, false);
 					}
 				};
 				dojo.mixin(fetch, this.fetchProperties);
-				this.store.fetch(fetch);
+				this._fetchHandle = this.store.fetch(fetch);
 			}
 		},
 
@@ -18438,207 +20658,115 @@ dojo.declare(
 
 }
 
-if(!dojo._hasResource["dijit.form._Spinner"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form._Spinner"] = true;
-dojo.provide("dijit.form._Spinner");
-
-
-
-dojo.declare(
-	"dijit.form._Spinner",
-	dijit.form.RangeBoundTextBox,
-	{
-		// summary:
-		//		Mixin for validation widgets with a spinner.
-		// description:
-		//		This class basically (conceptually) extends `dijit.form.ValidationTextBox`.
-		//		It modifies the template to have up/down arrows, and provides related handling code.
-
-		// defaultTimeout: Number
-		//		Number of milliseconds before a held arrow key or up/down button becomes typematic
-		defaultTimeout: 500,
-
-		// 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> <div class=\"dijitReset dijitLeft dijitButtonNode dijitArrowButton dijitUpArrowButton\"\n\t\t\t\tdojoAttachPoint=\"upArrowNode\"\n\t\t\t\tdojoAttachEvent=\"onmo [...]
-		baseClass: "dijitSpinner",
-
-		adjust: function(/* Object */ val, /*Number*/ delta){
-			// summary:
-			//		Overridable function used to adjust a primitive value(Number/Date/...) by the delta amount specified.
-			// 		The val is adjusted in a way that makes sense to the object type.
-			// tags:
-			//		protected extension
-			return val;
-		},
-
-		_arrowState: function(/*Node*/ node, /*Boolean*/ pressed){
-			// summary:
-			//		Called when an arrow key is pressed to update the relevant CSS classes
-			this._active = pressed;
-			this.stateModifier = node.getAttribute("stateModifier") || "";
-			this._setStateClass();
-		},
-
-		_arrowPressed: function(/*Node*/ nodePressed, /*Number*/ direction, /*Number*/ increment){
-			// summary:
-			//		Handler for arrow button or arrow key being pressed
-			if(this.disabled || this.readOnly){ return; }
-			this._arrowState(nodePressed, true);
-			this._setValueAttr(this.adjust(this.attr('value'), direction*increment), false);
-			dijit.selectInputText(this.textbox, this.textbox.value.length);
-		},
-
-		_arrowReleased: function(/*Node*/ node){
-			// summary:
-			//		Handler for arrow button or arrow key being released
-			this._wheelTimer = null;
-			if(this.disabled || this.readOnly){ return; }
-			this._arrowState(node, false);
-		},
+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");
 
-		_typematicCallback: function(/*Number*/ count, /*DOMNode*/ node, /*Event*/ evt){
-			var inc=this.smallDelta;
-			if(node == this.textbox){
-				var k=dojo.keys;
-				var key = evt.charOrCode; 
-				inc = (key == k.PAGE_UP || key == k.PAGE_DOWN) ? this.largeDelta : this.smallDelta;
-				node = (key == k.UP_ARROW ||key == k.PAGE_UP) ? this.upArrowNode : this.downArrowNode;
-			}
-			if(count == -1){ this._arrowReleased(node); }
-			else{ this._arrowPressed(node, (node == this.upArrowNode) ? 1 : -1, inc); }
-		},
-
-		_wheelTimer: null,
-		_mouseWheeled: function(/*Event*/ evt){
-			// summary:
-			//		Mouse wheel listener where supported
 
-			dojo.stopEvent(evt);	
-			// FIXME: Safari bubbles
 
-			// be nice to DOH and scroll as much as the event says to
-			var scrollAmount = evt.detail ? (evt.detail * -1) : (evt.wheelDelta / 120);
-			if(scrollAmount !== 0){
-				var node = this[(scrollAmount > 0 ? "upArrowNode" : "downArrowNode" )];
-				
-				this._arrowPressed(node, scrollAmount, this.smallDelta);
+dojo.declare("dijit.form.MultiSelect", dijit.form._FormValueWidget, {
+	// summary:
+	//		Widget version of a <select multiple=true> element,
+	//		for selecting multiple options.
 
-				if(!this._wheelTimer){
-					clearTimeout(this._wheelTimer);
-				}
-				this._wheelTimer = setTimeout(dojo.hitch(this,"_arrowReleased",node), 50);
-			}
-			
-		},
+	// 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,
 
-		postCreate: function(){
-			this.inherited(arguments);
+	templateString: "<select multiple='true' ${nameAttrSetting} dojoAttachPoint='containerNode,focusNode' dojoAttachEvent='onchange: _onChange'></select>",
 
-			// extra listeners
-			this.connect(this.domNode, !dojo.isMozilla ? "onmousewheel" : 'DOMMouseScroll', "_mouseWheeled");
-			this._connects.push(dijit.typematic.addListener(this.upArrowNode, this.textbox, {charOrCode:dojo.keys.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout));
-			this._connects.push(dijit.typematic.addListener(this.downArrowNode, this.textbox, {charOrCode:dojo.keys.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout));
-			this._connects.push(dijit.typematic.addListener(this.upArrowNode, this.textbox, {charOrCode:dojo.keys.PAGE_UP,ctrlKey:false,altKey:false,shiftKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout));
-			this._connects.push(dijit.typematic.addListener(this.downArrowNode, this.textbox, {charOrCode:dojo.keys.PAGE_DOWN,ctrlKey:false,altKey:false,shiftKey:false}, this, "_typematicCallback", this.timeoutChangeRate, this.defaultTimeout));
-			if(dojo.isIE){
-				var _this = this;
-				this.connect(this.domNode, "onresize",
-					function(){ setTimeout(dojo.hitch(_this,
-						function(){
-				        		var sz = this.upArrowNode.parentNode.offsetHeight;
-							if(sz){
-								this.upArrowNode.style.height = sz >> 1;
-								this.downArrowNode.style.height = sz - (sz >> 1);
-								this.focusNode.parentNode.style.height = sz;
-							}
-							// cause IE to rerender when spinner is moved from hidden to visible
-							this._setStateClass();
-						}), 0);
-					}
-				);
-			}
-		}
-});
+	attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, {
+		size: "focusNode"
+	}),
 
-}
+	reset: function(){
+		// summary:
+		//		Reset the widget's value to what it was at initialization time
 
-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");
+		// TODO: once we inherit from FormValueWidget this won't be needed
+		this._hasBeenBlurred = false;
+		this._setValueAttr(this._resetValue, true);
+	},
 
+	addSelected: function(/* dijit.form.MultiSelect */ select){
+		// summary:
+		//		Move the selected nodes of a passed Select widget
+		//		instance to this Select widget.
+		//
+		// example:
+		// |	// move all the selected values from "bar" to "foo"
+		// | 	dijit.byId("foo").addSelected(dijit.byId("bar"));
 
+		select.getSelected().forEach(function(n){
+			this.containerNode.appendChild(n);
+			// scroll to bottom to see item
+			// cannot use scrollIntoView since <option> tags don't support all attributes
+			// does not work on IE due to a bug where <select> always shows scrollTop = 0
+			this.domNode.scrollTop = this.domNode.offsetHeight; // overshoot will be ignored
+			// scrolling the source select is trickier esp. on safari who forgets to change the scrollbar size
+			var oldscroll = select.domNode.scrollTop;
+			select.domNode.scrollTop = 0;
+			select.domNode.scrollTop = oldscroll;
+		},this);
+	},
 
+	getSelected: function(){
+		// summary:
+		//		Access the NodeList of the selected options directly
+		return dojo.query("option",this.containerNode).filter(function(n){
+			return n.selected; // Boolean
+		}); // dojo.NodeList
+	},
 
-dojo.declare("dijit.form.NumberSpinner",
-	[dijit.form._Spinner, dijit.form.NumberTextBoxMixin],
-	{
-	// summary:
-	//		Extends NumberTextBox to add up/down arrows and pageup/pagedown for incremental change to the value
-	//
-	// description:
-	//		A `dijit.form.NumberTextBox` extension to provide keyboard accessible value selection
-	//		as well as icons for spinning direction. When using the keyboard, the typematic rules
-	//		apply, meaning holding the key will gradually increarease or decrease the value and
-	// 		accelerate.
-	//		
-	// example:
-	//	| new dijit.form.NumberSpinner({ constraints:{ max:300, min:100 }}, "someInput");
+	_getValueAttr: function(){
+		// summary:
+		//		Hook so attr('value') works.
+		// description:
+		//		Returns an array of the selected options' values.
+		return this.getSelected().map(function(n){
+			return n.value;
+		});
+	},
 
-	// Override required=false from ValidationTextBox
-	required: true,
+	multiple: true, // for Form
 
-	adjust: function(/* Object */val, /* Number*/delta){
+	_setValueAttr: function(/* Array */values){
 		// summary:
-		//		Change Number val by the given amount
-		// tags:
-		//		protected
-
-		var tc = this.constraints, 
-			v = isNaN(val), 
-			gotMax = !isNaN(tc.max), 
-			gotMin = !isNaN(tc.min)
-		;
-		if(v && delta != 0){ // blank or invalid value and they want to spin, so create defaults
-			val = (delta > 0) ? 
-				gotMin ? tc.min : gotMax ? tc.max : 0 :
-				gotMax ? this.constraints.max : gotMin ? tc.min : 0
-			;
-		}
-		var newval = val + delta;
-		if(v || isNaN(newval)){ return val; }
-		if(gotMax && (newval > tc.max)){
-			newval = tc.max;
-		}
-		if(gotMin && (newval < tc.min)){
-			newval = tc.min;
-		}
-		return newval;
-	},
-	
-	_onKeyPress: function(e){
-		if((e.charOrCode == dojo.keys.HOME || e.charOrCode == dojo.keys.END) && !e.ctrlKey && !e.altKey){
-			var value = this.constraints[(e.charOrCode == dojo.keys.HOME ? "min" : "max")];
-			if(value){
-				this._setValueAttr(value,true);
-			}
-			// eat home or end key whether we change the value or not
-			dojo.stopEvent(e);
+		//		Hook so attr('value', values) works.
+		// description:
+		//		Set the value(s) of this Select based on passed values
+		dojo.query("option",this.containerNode).forEach(function(n){
+			n.selected = (dojo.indexOf(values,n.value) != -1);
+		});
+	},
+
+	invertSelection: function(onChange){
+		// summary:
+		//		Invert the selection
+		// onChange: Boolean
+		//		If null, onChange is not fired.
+		dojo.query("option",this.containerNode).forEach(function(n){
+			n.selected = !n.selected;
+		});
+		this._handleOnChange(this.attr('value'), onChange == true);
+	},
+
+	_onChange: function(/*Event*/ e){
+		this._handleOnChange(this.attr('value'), true);
+	},
+
+	// for layout widgets:
+	resize: function(/* Object */size){
+		if(size){
+			dojo.marginBox(this.domNode, size);
 		}
+	},
+
+	postCreate: function(){
+		this._onChange();
 	}
-	
 });
 
 }
@@ -18661,7 +20789,7 @@ dojo.declare(
 	// summary:
 	//		A form widget that allows one to select a value with a horizontally draggable handle
 
-	templateString:"<table class=\"dijit dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" dojoAttachEvent=\"onkeypress:_onKeyPress\"\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 di [...]
+	templateString: dojo.cache("dijit.form", "templates/HorizontalSlider.html", "<table class=\"dijit dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" dojoAttachEvent=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td dojoAttachPoint=\"topDecoration\" class=\"dijitReset\" style=\"text-align:center;width:100%;\"></td\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t>< [...]
 
 	// Overrides FormValueWidget.value to indicate numeric value
 	value: 0,
@@ -18695,7 +20823,7 @@ dojo.declare(
 	// pageIncrement: Integer
 	//		If discreteValues is also specified, this indicates the amount of clicks (ie, snap positions)
 	//      that the slider handle is moved via pageup/pagedown keys.
-    //      If discreteValues is not specified, it indicates the number of pixels.
+	//	If discreteValues is not specified, it indicates the number of pixels.
 	pageIncrement: 2,
 
 	// clickSelect: Boolean
@@ -18723,14 +20851,19 @@ dojo.declare(
 	_handleOffsetCoord: "left",
 	_progressPixelSize: "width",
 
+	_onKeyUp: function(/*Event*/ e){
+		if(this.disabled || this.readOnly || e.altKey || e.ctrlKey || e.metaKey){ return; }
+		this._setValueAttr(this.value, true);
+	},
+
 	_onKeyPress: function(/*Event*/ e){
-		if(this.disabled || this.readOnly || e.altKey || e.ctrlKey){ return; }
+		if(this.disabled || this.readOnly || e.altKey || e.ctrlKey || e.metaKey){ return; }
 		switch(e.charOrCode){
 			case dojo.keys.HOME:
-				this._setValueAttr(this.minimum, true);
+				this._setValueAttr(this.minimum, false);
 				break;
 			case dojo.keys.END:
-				this._setValueAttr(this.maximum, true);
+				this._setValueAttr(this.maximum, false);
 				break;
 			// this._descending === false: if ascending vertical (min on top)
 			// (this._descending || this.isLeftToRight()): if left-to-right horizontal or descending vertical
@@ -18759,7 +20892,7 @@ dojo.declare(
 		}
 		dojo.stopEvent(e);
 	},
-	
+
 	_isReversed: function(){
 		// summary:
 		//		Returns true if direction is from right to left
@@ -18772,7 +20905,7 @@ dojo.declare(
 		if(this.disabled || this.readOnly || !this.clickSelect){ return; }
 		dijit.focus(this.sliderHandle);
 		dojo.stopEvent(e);
-		var abspos = dojo.coords(this.sliderBarContainer, true);
+		var abspos = dojo.position(this.sliderBarContainer, true);
 		var pixelValue = e[this._mousePixelCoord] - abspos[this._startingPixelCoord];
 		this._setPixelValue(this._isReversed() ? (abspos[this._pixelCount] - pixelValue) : pixelValue, abspos[this._pixelCount], true);
 		this._movable.onMouseDown(e);
@@ -18810,7 +20943,7 @@ dojo.declare(
 			if(duration == 0){ return; }
 			if(duration < 0){ duration = 0 - duration; }
 			props[this._progressPixelSize] = { start: start, end: percent*100, units:"%" };
-			this._inProgressAnim = dojo.animateProperty({ node: progressBar, duration: duration, 
+			this._inProgressAnim = dojo.animateProperty({ node: progressBar, duration: duration,
 				onAnimate: function(v){ remainingBar.style[_this._progressPixelSize] = (100-parseFloat(v[_this._progressPixelSize])) + "%"; },
 				onEnd: function(){ delete _this._inProgressAnim; },
 				properties: props
@@ -18823,7 +20956,7 @@ dojo.declare(
 		}
 	},
 
-	_bumpValue: function(signedChange){
+	_bumpValue: function(signedChange, /*Boolean, optional*/ priorityChange){
 		if(this.disabled || this.readOnly){ return; }
 		var s = dojo.getComputedStyle(this.sliderBarContainer);
 		var c = dojo._getContentBox(this.sliderBarContainer, s);
@@ -18834,7 +20967,7 @@ dojo.declare(
 		if(value < 0){ value = 0; }
 		if(value > count){ value = count; }
 		value = value * (this.maximum - this.minimum) / count + this.minimum;
-		this._setValueAttr(value, true);
+		this._setValueAttr(value, priorityChange);
 	},
 
 	_onClkBumper: function(val){
@@ -18850,17 +20983,17 @@ dojo.declare(
 		this._onClkBumper(this._descending === false ? this.maximum : this.minimum);
 	},
 
-	decrement: function(e){
+	decrement: function(/*Event*/ e){
 		// summary:
-		//		Decrement slider by 1 unit
+		//		Decrement slider
 		// tags:
 		//		private
 		this._bumpValue(e.charOrCode == dojo.keys.PAGE_DOWN ? -this.pageIncrement : -1);
 	},
 
-	increment: function(e){
+	increment: function(/*Event*/ e){
 		// summary:
-		//		Increment slider by 1 unit
+		//		Increment slider
 		// tags:
 		//		private
 		this._bumpValue(e.charOrCode == dojo.keys.PAGE_UP ? this.pageIncrement : 1);
@@ -18870,11 +21003,9 @@ dojo.declare(
 		// summary:
 		//		Event handler for mousewheel where supported
 		dojo.stopEvent(evt);
-		// FIXME: this adds mouse wheel support for safari, though stopEvent doesn't prevent
-		// it from bleeding to window?!
 		var janky = !dojo.isMozilla;
 		var scroll = evt[(janky ? "wheelDelta" : "detail")] * (janky ? 1 : -1);
-		this[(scroll < 0 ? "decrement" : "increment")](evt);
+		this._bumpValue(scroll < 0 ? -1 : 1, true); // negative scroll acts like a decrement
 	},
 
 	startup: function(){
@@ -18886,8 +21017,11 @@ dojo.declare(
 	},
 
 	_typematicCallback: function(/*Number*/ count, /*Object*/ button, /*Event*/ e){
-		if(count == -1){ return; }
-		this[(button == (this._descending? this.incrementButton : this.decrementButton))? "decrement" : "increment"](e);
+		if(count == -1){
+			this._setValueAttr(this.value, true);
+		}else{
+			this[(button == (this._descending? this.incrementButton : this.decrementButton)) ? "decrement" : "increment"](e);
+		}
 	},
 
 	postCreate: function(){
@@ -18902,15 +21036,12 @@ dojo.declare(
 		this.connect(this.domNode, !dojo.isMozilla ? "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);
+		var mover = dojo.declare(dijit.form._SliderMover, {
+			widget: this
+		});
 
 		this._movable = new dojo.dnd.Moveable(this.sliderHandle, {mover: mover});
-		//find any associated label element and add to slider focusnode.
+		// find any associated label element and add to slider focusnode.
 		var label=dojo.query('label[for="'+this.id+'"]');
 		if(label.length){
 			label[0].id = (this.id+"_label");
@@ -18920,6 +21051,7 @@ dojo.declare(
 		dijit.setWaiState(this.focusNode, "valuemax", this.maximum);
 
 		this.inherited(arguments);
+		this._layoutHackIE7();
 	},
 
 	destroy: function(){
@@ -18927,7 +21059,8 @@ dojo.declare(
 		if(this._inProgressAnim && this._inProgressAnim.status != "stopped"){
 			this._inProgressAnim.stop(true);
 		}
-		this.inherited(arguments);	
+		this._supportingWidgets = dijit.findWidgets(this.domNode); // tells destroy about pseudo-child widgets (ruler/labels)
+		this.inherited(arguments);
 	}
 });
 
@@ -18938,14 +21071,14 @@ dojo.declare("dijit.form._SliderMover",
 		var widget = this.widget;
 		var abspos = widget._abspos;
 		if(!abspos){
-			abspos = widget._abspos = dojo.coords(widget.sliderBarContainer, true);
+			abspos = widget._abspos = dojo.position(widget.sliderBarContainer, true);
 			widget._setPixelValue_ = dojo.hitch(widget, "_setPixelValue");
 			widget._isReversed_ = widget._isReversed();
 		}
 		var pixelValue = e[widget._mousePixelCoord] - abspos[widget._startingPixelCoord];
 		widget._setPixelValue_(widget._isReversed_ ? (abspos[widget._pixelCount]-pixelValue) : pixelValue, abspos[widget._pixelCount], false);
 	},
-	
+
 	destroy: function(e){
 		dojo.dnd.Mover.prototype.destroy.apply(this, arguments);
 		var widget = this.widget;
@@ -18971,7 +21104,7 @@ dojo.declare(
 	// summary:
 	//		A form widget that allows one to select a value with a vertically draggable handle
 
-	templateString:"<table class=\"dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" dojoAttachEvent=\"onkeypress:_onKeyPress\"\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=\"decrementButton\"><span class=\"dijitSlid [...]
+	templateString: dojo.cache("dijit.form", "templates/VerticalSlider.html", "<table class=\"dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" dojoAttachEvent=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\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= [...]
 	_mousePixelCoord: "pageY",
 	_pixelCount: "h",
 	_startingPixelCoord: "y",
@@ -18994,7 +21127,7 @@ dojo.declare(
 
 		this.inherited(arguments);
 	},
-		
+
 	_isReversed: function(){
 		// summary:
 		//		Overrides HorizontalSlider._isReversed.
@@ -19066,7 +21199,7 @@ dojo.declare("dijit.form.HorizontalRule", [dijit._Widget, dijit._Templated],
 
 	postCreate: function(){
 		var innerHTML;
-		if(this.count==1){
+		if(this.count == 1){
 			innerHTML = this._genHTML(50, 0);
 		}else{
 			var i;
@@ -19195,8 +21328,8 @@ dojo.declare("dijit.form.HorizontalRuleLabels", dijit.form.HorizontalRule,
 		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));
+			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;
 			}
 		}
@@ -19233,10 +21366,7 @@ dojo.declare("dijit.form.VerticalRuleLabels", dijit.form.HorizontalRuleLabels,
 	_calcPosition: function(pos){
 		// Overrides HorizontalRuleLabel._calcPosition()
 		return 100-pos;
-	},
-
-	// TODO: remove this.   Apparently it's not used.
-	_isHorizontal: false
+	}
 });
 
 }
@@ -19275,7 +21405,6 @@ dojo.declare("dijit.form.SimpleTextarea",
 	//		The number of characters per line.
 	cols: "20",
 
-	templatePath: null,
 	templateString: "<textarea ${nameAttrSetting} dojoAttachPoint='focusNode,containerNode,textbox' autocomplete='off'></textarea>",
 
 	postMixInProperties: function(){
@@ -19298,25 +21427,25 @@ dojo.declare("dijit.form.SimpleTextarea",
 	postCreate: function(){
 		this.inherited(arguments);
 		if(dojo.isIE && this.cols){ // attribute selectors is not supported in IE6
-			dojo.addClass(this.domNode, "dijitTextAreaCols");
+			dojo.addClass(this.textbox, "dijitTextAreaCols");
 		}
 	},
 
 	_previousValue: "",
-	_onInput: function(e){
+	_onInput: function(/*Event?*/ e){
 		// Override TextBox._onInput() to enforce maxLength restriction
 		if(this.maxLength){
 			var maxLength = parseInt(this.maxLength);
 			var value = this.textbox.value.replace(/\r/g,'');
 			var overflow = value.length - maxLength;
 			if(overflow > 0){
-				dojo.stopEvent(e);
+				if(e){ dojo.stopEvent(e); }
 				var textarea = this.textbox;
 				if(textarea.selectionStart){
 					var pos = textarea.selectionStart;
 					var cr = 0;
 					if(dojo.isOpera){
-						cr = (this.textbox.value.substring(0,pos).match(/\r/g)||[]).length;
+						cr = (this.textbox.value.substring(0,pos).match(/\r/g) || []).length;
 					}
 					this.textbox.value = value.substring(0,pos-overflow-cr)+value.substring(pos-cr);
 					textarea.setSelectionRange(pos-overflow, pos-overflow);
@@ -19371,7 +21500,7 @@ dojo.declare(
 	_getHeight: function(textarea){
 		var newH = textarea.scrollHeight;
 		if(dojo.isIE){
-			newH += textarea.offsetHeight - textarea.clientHeight - ((dojo.isIE < 8 && this._strictMode)? dojo._getPadBorderExtents(textarea).h : 0);
+			newH += textarea.offsetHeight - textarea.clientHeight - ((dojo.isIE < 8 && this._strictMode) ? dojo._getPadBorderExtents(textarea).h : 0);
 		}else if(dojo.isMoz){
 			newH += textarea.offsetHeight - textarea.clientHeight; // creates room for horizontal scrollbar
 		}else if(dojo.isWebKit && !(dojo.isSafari < 4)){ // Safari 4.0 && Chrome
@@ -19405,7 +21534,7 @@ dojo.declare(
 		if(this._busyResizing){ return; }
 		this._busyResizing = true;
 		var textarea = this.textbox;
-		if(textarea.scrollHeight){
+		if(textarea.scrollHeight && textarea.offsetHeight && textarea.clientHeight){
 			var newH = this._getHeight(textarea) + "px";
 			if(textarea.style.height != newH){
 				textarea.style.maxHeight = textarea.style.height = newH;
@@ -19482,13 +21611,6 @@ dojo.declare(
 
 }
 
-if(!dojo._hasResource["dijit.form.ToggleButton"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.form.ToggleButton"] = true;
-dojo.provide("dijit.form.ToggleButton");
-
-
-}
-
 if(!dojo._hasResource["dijit.layout.StackController"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
 dojo._hasResource["dijit.layout.StackController"] = true;
 dojo.provide("dijit.layout.StackController");
@@ -19499,16 +21621,15 @@ dojo.provide("dijit.layout.StackController");
 
 
 
-
 dojo.declare(
 		"dijit.layout.StackController",
 		[dijit._Widget, dijit._Templated, dijit._Container],
 		{
-		// summary:
-		//		Set of buttons to select a page in a page list.
-		// description:
-		//		Monitors the specified StackContainer, and whenever a page is
-		//		added, deleted, or selected, updates itself accordingly.
+			// summary:
+			//		Set of buttons to select a page in a page list.
+			// description:
+			//		Monitors the specified StackContainer, and whenever a page is
+			//		added, deleted, or selected, updates itself accordingly.
 
 			templateString: "<span wairole='tablist' dojoAttachEvent='onkeypress' class='dijitStackController'></span>",
 
@@ -19523,18 +21644,15 @@ dojo.declare(
 			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.pane2handles = {};		// mapping from panes to dojo.connect() handles
-				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")
-				];
+				this.pane2button = {};		// mapping from pane id to buttons
+				this.pane2handles = {};		// mapping from pane id to this.connect() handles
+
+				// Listen to notifications from StackContainer
+				this.subscribe(this.containerId+"-startup", "onStartup");
+				this.subscribe(this.containerId+"-addChild", "onAddChild");
+				this.subscribe(this.containerId+"-removeChild", "onRemoveChild");
+				this.subscribe(this.containerId+"-selectChild", "onSelectChild");
+				this.subscribe(this.containerId+"-containerKeyPress", "onContainerKeyPress");
 			},
 
 			onStartup: function(/*Object*/ info){
@@ -19543,18 +21661,21 @@ dojo.declare(
 				// tags:
 				//		private
 				dojo.forEach(info.children, this.onAddChild, this);
-				this.onSelectChild(info.selected);
+				if(info.selected){
+					// Show button corresponding to selected pane (unless selected
+					// is null because there are no panes)
+					this.onSelectChild(info.selected);
+				}
 			},
 
 			destroy: function(){
 				for(var pane in this.pane2button){
-					this.onRemoveChild(pane);
+					this.onRemoveChild(dijit.byId(pane));
 				}
-				dojo.forEach(this._subscriptions, dojo.unsubscribe);
 				this.inherited(arguments);
 			},
 
-			onAddChild: function(/*Widget*/ page, /*Integer?*/ insertIndex){
+			onAddChild: function(/*dijit._Widget*/ page, /*Integer?*/ insertIndex){
 				// summary:
 				//		Called whenever a page is added to the container.
 				//		Create button corresponding to the page.
@@ -19566,35 +21687,48 @@ dojo.declare(
 				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);
+				var button = new cls({
+					id: this.id + "_" + page.id,
+					label: page.title,
+					showLabel: page.showTitle,
+					iconClass: page.iconClass,
+					closeButton: page.closable,
+					title: page.tooltip
+				}, refNode);
+				dijit.setWaiState(button.focusNode,"selected", "false");
+				this.pane2handles[page.id] = [
+					this.connect(page, 'attr', function(name, value){
+						if(arguments.length == 2){
+							var buttonAttr = {
+								title: 'label',
+								showTitle: 'showLabel',
+								iconClass: 'iconClass',
+								closable: 'closeButton',
+								tooltip: 'title'
+							}[name];
+							if(buttonAttr){
+								button.attr(buttonAttr, value);
+							}
+						}
+					}),
+					this.connect(button, 'onClick', dojo.hitch(this,"onButtonClick", page)),
+					this.connect(button, 'onClickCloseButton', dojo.hitch(this,"onCloseButtonClick", page))
+				];
 				this.addChild(button, insertIndex);
-				this.pane2button[page] = button;
+				this.pane2button[page.id] = button;
 				page.controlButton = button;	// this value might be overwritten if two tabs point to same container
-
-				var handles = [];
-				handles.push(dojo.connect(button, "onClick", dojo.hitch(this,"onButtonClick",page)));
-				if(page.closable){
-					handles.push(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});
-					handles.push(dojo.connect(mItem, "onClick", dojo.hitch(this, "onCloseButtonClick", page)));
-					closeMenu.addChild(mItem);
-					this.pane2menu[page] = closeMenu;
-				}
-				this.pane2handles[page] = handles;
 				if(!this._currentChild){ // put the first child into the tab order
 					button.focusNode.setAttribute("tabIndex", "0");
+					dijit.setWaiState(button.focusNode, "selected", "true");
 					this._currentChild = page;
 				}
-				//make sure all tabs have the same length
+				// make sure all tabs have the same length
 				if(!this.isLeftToRight() && dojo.isIE && this._rectifyRtlTabList){
 					this._rectifyRtlTabList();
 				}
 			},
 
-			onRemoveChild: function(/*Widget*/ page){
+			onRemoveChild: function(/*dijit._Widget*/ page){
 				// summary:
 				//		Called whenever a page is removed from the container.
 				//		Remove the button corresponding to the page.
@@ -19602,22 +21736,18 @@ dojo.declare(
 				//		private
 
 				if(this._currentChild === page){ this._currentChild = null; }
-				dojo.forEach(this.pane2handles[page], dojo.disconnect);
-				delete this.pane2handles[page];
-				var menu = this.pane2menu[page];
-				if (menu){
-					menu.destroyRecursive();
-					delete this.pane2menu[page];
-				}
-				var button = this.pane2button[page];
+				dojo.forEach(this.pane2handles[page.id], this.disconnect, this);
+				delete this.pane2handles[page.id];
+				var button = this.pane2button[page.id];
 				if(button){
-					// TODO? if current child { reassign }
+					this.removeChild(button);
+					delete this.pane2button[page.id];
 					button.destroy();
-					delete this.pane2button[page];
 				}
+				delete page.controlButton;
 			},
 
-			onSelectChild: function(/*Widget*/ page){
+			onSelectChild: function(/*dijit._Widget*/ page){
 				// summary:
 				//		Called when a page has been selected in the StackContainer, either by me or by another StackController
 				// tags:
@@ -19626,30 +21756,32 @@ dojo.declare(
 				if(!page){ return; }
 
 				if(this._currentChild){
-					var oldButton=this.pane2button[this._currentChild];
+					var oldButton=this.pane2button[this._currentChild.id];
 					oldButton.attr('checked', false);
+					dijit.setWaiState(oldButton.focusNode, "selected", "false");
 					oldButton.focusNode.setAttribute("tabIndex", "-1");
 				}
 
-				var newButton=this.pane2button[page];
+				var newButton=this.pane2button[page.id];
 				newButton.attr('checked', true);
+				dijit.setWaiState(newButton.focusNode, "selected", "true");
 				this._currentChild = page;
 				newButton.focusNode.setAttribute("tabIndex", "0");
 				var container = dijit.byId(this.containerId);
 				dijit.setWaiState(container.containerNode, "labelledby", newButton.id);
 			},
 
-			onButtonClick: function(/*Widget*/ page){
+			onButtonClick: function(/*dijit._Widget*/ page){
 				// summary:
 				//		Called whenever one of my child buttons is pressed in an attempt to select a page
 				// tags:
 				//		private
 
-				var container = dijit.byId(this.containerId);	// TODO: do this via topics?
-				container.selectChild(page); 
+				var container = dijit.byId(this.containerId);
+				container.selectChild(page);
 			},
 
-			onCloseButtonClick: function(/*Widget*/ page){
+			onCloseButtonClick: function(/*dijit._Widget*/ page){
 				// summary:
 				//		Called whenever one of my child buttons [X] is pressed in an attempt to close a page
 				// tags:
@@ -19657,12 +21789,14 @@ dojo.declare(
 
 				var container = dijit.byId(this.containerId);
 				container.closeChild(page);
-				var b = this.pane2button[this._currentChild];
-				if(b){
-					dijit.focus(b.focusNode || b.domNode);
+				if(this._currentChild){
+					var b = this.pane2button[this._currentChild.id];
+					if(b){
+						dijit.focus(b.focusNode || b.domNode);
+					}
 				}
 			},
-			
+
 			// TODO: this is a bit redundant with forward, back api in StackContainer
 			adjacent: function(/*Boolean*/ forward){
 				// summary:
@@ -19673,7 +21807,7 @@ dojo.declare(
 				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]);
+				var current = dojo.indexOf(children, this.pane2button[this._currentChild.id]);
 				// pick next button to focus on
 				var offset = forward ? 1 : children.length - 1;
 				return children[ (current + offset) % children.length ]; // dijit._Widget
@@ -19755,14 +21889,14 @@ dojo.declare("dijit.layout._StackButton",
 
 		// Override _FormWidget.tabIndex.
 		// StackContainer buttons are not in the tab order by default.
-		// TODO: unclear if we need this; doesn't _KeyNavContainer (superclass of StackController) do it for us?
+		// Probably we should be calling this.startupKeyNavChildren() instead.
 		tabIndex: "-1",
-		
+
 		postCreate: function(/*Event*/ evt){
 			dijit.setWaiRole((this.focusNode || this.domNode), "tab");
 			this.inherited(arguments);
 		},
-		
+
 		onClick: function(/*Event*/ evt){
 			// summary:
 			//		This is for TabContainer where the tabs are <span> rather than button,
@@ -19798,14 +21932,14 @@ dojo.declare(
 	"dijit.layout.StackContainer",
 	dijit.layout._LayoutWidget,
 	{
-	// summary: 
+	// 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.
@@ -19816,20 +21950,14 @@ dojo.declare(
 
 	// persist: Boolean
 	//		Remembers the selected child across sessions
-	persist: false,	// Boolean
-	
-	baseClass: "dijitStackContainer",
+	persist: false,
 
-	// _started: Boolean
-	//		startup() has completed.
-	//	TODO: comment this section out, it's just needed for documentation.
-	//	Plus, move it to _Widget
-	_started: false,
+	baseClass: "dijitStackContainer",
 
 /*=====
-	// selectedChildWidget: Widget
-	//		References the currently selected child widget, if any
-	//
+	// selectedChildWidget: [readonly] dijit._Widget
+	//		References the currently selected child widget, if any.
+	//		Adjust selected child with selectChild() method.
 	selectedChildWidget: null,
 =====*/
 
@@ -19870,19 +21998,24 @@ dojo.declare(
 		// TabContainer, this._contentBox doesn't include the space for the tab labels.
 		dojo.publish(this.id+"-startup", [{children: children, selected: selected}]);
 
-		// Show the initially selected child (do this before this.inherited() call,
-		// because child can't size correctly if it's hidden).
-		// TODO: this will call onShow() on the child widget before startup() which is weird.
-		if(selected){
-			this._showChild(selected);
-		}
-
 		// Startup each child widget, and do initial layout like setting this._contentBox,
 		// then calls this.resize() which does the initial sizing on the selected child.
 		this.inherited(arguments);
 	},
 
-	_setupChild: function(/*Widget*/ child){
+	resize: function(){
+		// Resize is called when we are first made visible (it's called from startup()
+		// if we are initially visible).   If this is the first time we've been made
+		// visible then show our first child.
+		var selected = this.selectedChildWidget;
+		if(selected && !this._hasBeenShown){
+			this._hasBeenShown = true;
+			this._showChild(selected);
+		}
+		this.inherited(arguments);
+	},
+
+	_setupChild: function(/*dijit._Widget*/ child){
 		// Overrides _LayoutWidget._setupChild()
 
 		this.inherited(arguments);
@@ -19893,13 +22026,11 @@ dojo.declare(
 		// remove the title attribute so it doesn't show up when i hover
 		// over a node
 		child.domNode.title = "";
-
-		return child; // dijit._Widget		(TODO: remove this, return code is unused)
 	},
 
-	addChild: function(/*Widget*/ child, /*Integer?*/ insertIndex){
+	addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){
 		// Overrides _Container.addChild() to do layout and publish events
-		 
+
 		this.inherited(arguments);
 
 		if(this._started){
@@ -19907,6 +22038,9 @@ dojo.declare(
 
 			// in case the tab titles have overflowed from one line to two lines
 			// (or, if this if first child, from zero lines to one line)
+			// TODO: w/ScrollingTabController this is no longer necessary, although
+			// ScrollTabController.resize() does need to get called to show/hide
+			// the navigation buttons as appropriate, but that's handled in ScrollingTabController.onAddChild()
 			this.layout();
 
 			// if this is the first child, then select it
@@ -19916,20 +22050,23 @@ dojo.declare(
 		}
 	},
 
-	removeChild: function(/*Widget*/ page){
+	removeChild: function(/*dijit._Widget*/ page){
 		// Overrides _Container.removeChild() to do layout and publish events
 
 		this.inherited(arguments);
 
+		if(this._started){
+			// this will notify any tablists to remove a button; do this first because it may affect sizing
+			dojo.publish(this.id + "-removeChild", [page]);
+		}
+
 		// If we are being destroyed than don't run the code below (to select another page), because we are deleting
 		// every page one by one
 		if(this._beingDestroyed){ return; }
 
 		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
+			// TODO: this is overkill in most cases since ScrollingTabController never changes size (for >= 1 tab)
 			this.layout();
 		}
 
@@ -19944,9 +22081,11 @@ dojo.declare(
 		}
 	},
 
-	selectChild: function(/*Widget*/ page){
+	selectChild: function(/*dijit._Widget|String*/ page){
 		// summary:
 		//		Show the given widget (which must be one of my children)
+		// page:
+		//		Reference to child widget or id of child widget
 
 		page = dijit.byId(page);
 
@@ -19962,7 +22101,7 @@ dojo.declare(
 		}
 	},
 
-	_transition: function(/*Widget*/newWidget, /*Widget*/oldWidget){
+	_transition: function(/*dijit._Widget*/newWidget, /*dijit._Widget*/oldWidget){
 		// summary:
 		//		Hide the old widget and display the new widget.
 		//		Subclasses should override this.
@@ -19975,9 +22114,15 @@ dojo.declare(
 
 		// Size the new widget, in case this is the first time it's being shown,
 		// or I have been resized since the last time it was shown.
-		// Note that page must be visible for resizing to work. 
-		if(this.doLayout && newWidget.resize){
-			newWidget.resize(this._containerContentBox || this._contentBox);
+		// Note that page must be visible for resizing to work.
+		if(newWidget.resize){
+			if(this.doLayout){
+				newWidget.resize(this._containerContentBox || this._contentBox);
+			}else{
+				// the child should pick it's own size but we still need to call resize()
+				// (with no arguments) to let the widget lay itself out
+				newWidget.resize();
+			}
 		}
 	},
 
@@ -20013,7 +22158,7 @@ dojo.declare(
 		}
 	},
 
-	_showChild: function(/*Widget*/ page){
+	_showChild: function(/*dijit._Widget*/ page){
 		// summary:
 		//		Show the specified child by changing it's CSS, and call _onShow()/onShow() so
 		//		it can do any updates it needs regarding loading href's etc.
@@ -20025,14 +22170,10 @@ dojo.declare(
 		dojo.removeClass(page.domNode, "dijitHidden");
 		dojo.addClass(page.domNode, "dijitVisible");
 
-		if(page._onShow){
-			page._onShow(); // trigger load in ContentPane
-		}else if(page.onShow){
-			page.onShow();
-		}
+		page._onShow();
 	},
 
-	_hideChild: function(/*Widget*/ page){
+	_hideChild: function(/*dijit._Widget*/ page){
 		// summary:
 		//		Hide the specified child by changing it's CSS, and call _onHide() so
 		//		it's notified.
@@ -20040,12 +22181,10 @@ dojo.declare(
 		dojo.removeClass(page.domNode, "dijitVisible");
 		dojo.addClass(page.domNode, "dijitHidden");
 
-		if(page.onHide){
-			page.onHide();
-		}
+		page.onHide();
 	},
 
-	closeChild: function(/*Widget*/ page){
+	closeChild: function(/*dijit._Widget*/ page){
 		// summary:
 		//		Callback when user clicks the [X] to remove a page.
 		//		If onClose() returns true then remove and destroy the child.
@@ -20059,9 +22198,11 @@ dojo.declare(
 		}
 	},
 
-	destroy: function(){
-		this._beingDestroyed = true;
-		this.inherited(arguments);
+	destroyDescendants: function(/*Boolean*/preserveDom){
+		dojo.forEach(this.getChildren(), function(child){
+			this.removeChild(child);
+			child.destroyRecursive(preserveDom);
+		}, this);
 	}
 });
 
@@ -20073,22 +22214,32 @@ dojo.declare(
 // 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.
-	// TODO: remove this, it's in _Widget already.
-	title: "",
-
 	// selected: Boolean
-	//		Is this child currently selected?
+	//		Parameter for children of `dijit.layout.StackContainer` or subclasses.
+	//		Specifies that this widget should be the initially displayed pane.
+	//		Note: to change the selected child use `dijit.layout.StackContainer.selectChild`
 	selected: false,
 
 	// closable: Boolean
+	//		Parameter for children of `dijit.layout.StackContainer` or subclasses.
 	//		True if user can close (destroy) this child, such as (for example) clicking the X on the tab.
-	closable: false,	// true if user can close this tab pane
+	closable: false,
+
+	// iconClass: String
+	//		Parameter for children of `dijit.layout.StackContainer` or subclasses.
+	//		CSS Class specifying icon to use in label associated with this pane.
+	iconClass: "",
+
+	// showTitle: Boolean
+	//		Parameter for children of `dijit.layout.StackContainer` or subclasses.
+	//		When true, display title of this widget as tab label etc., rather than just using
+	//		icon specified in iconClass
+	showTitle: true,
 
 	onClose: function(){
 		// summary:
-		//		Callback if someone tries to close the child, child will be closed if func returns true
+		//		Parameter for children of `dijit.layout.StackContainer` or subclasses.
+		//		Callback if a user tries to close the child.   Child will be closed if this function returns true.
 		// tags:
 		//		extension
 
@@ -20115,7 +22266,8 @@ dojo.declare("dijit.layout.AccordionPane", dijit.layout.ContentPane, {
 	},
 
 	onSelected: function(){
-		// summary: called when this pane is selected
+		// summary:
+		//		called when this pane is selected
 	}
 });
 
@@ -20132,7 +22284,7 @@ dojo.provide("dijit.layout.AccordionContainer");
 
 
 
-	// for back compat
+	// for back compat, remove for 2.0
 
 dojo.declare(
 	"dijit.layout.AccordionContainer",
@@ -20142,35 +22294,38 @@ dojo.declare(
 		//		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>
+		//	| 	<div dojoType="dijit.layout.AccordionContainer">
+		//	|		<div dojoType="dijit.layout.ContentPane" title="pane 1">
+		//	|		</div>
+		//	|		<div dojoType="dijit.layout.ContentPane" title="pane 2">
+		//	|			<p>This is some text</p>
+		//	|		</div>
+		//	|	</div>
 
 		// duration: Integer
 		//		Amount of time (in ms) it takes to slide panes
 		duration: dijit.defaultDuration,
 
+		// buttonWidget: [const] String
+		//		The name of the widget used to display the title of each pane
+		buttonWidget: "dijit.layout._AccordionButton",
+
 		// _verticalSpace: Number
 		//		Pixels of space available for the open pane
 		//		(my content box size minus the cumulative size of all the title bars)
 		_verticalSpace: 0,
 
 		baseClass: "dijitAccordionContainer",
-		
+
 		postCreate: function(){
 			this.domNode.style.overflow = "hidden";
-			this.inherited(arguments); 
+			this.inherited(arguments);
 			dijit.setWaiRole(this.domNode, "tablist");
 		},
 
 		startup: function(){
 			if(this._started){ return; }
-			this.inherited(arguments);	
+			this.inherited(arguments);
 			if(this.selectedChildWidget){
 				var style = this.selectedChildWidget.containerNode.style;
 				style.display = "";
@@ -20178,7 +22333,7 @@ dojo.declare(
 				this.selectedChildWidget._buttonWidget._setSelectedState(true);
 			}
 		},
-		
+
 		_getTargetHeight: function(/* Node */ node){
 			// summary:
 			//		For the given node, returns the height that should be
@@ -20223,12 +22378,26 @@ dojo.declare(
 			// Setup clickable title to sit above the child widget,
 			// and stash pointer to it inside the widget itself.
 
-			child._buttonWidget = new dijit.layout._AccordionButton({
+			var cls = dojo.getObject(this.buttonWidget);
+			var button = (child._buttonWidget = new cls({
 				contentWidget: child,
-				title: child.title,
+				label: child.title,
+				title: child.tooltip,
+				iconClass: child.iconClass,
 				id: child.id + "_button",
 				parent: this
+			}));
+
+			child._accordionConnectHandle = this.connect(child, 'attr', function(name, value){
+				if(arguments.length == 2){
+					switch(name){
+					case 'title':
+					case 'iconClass':
+						button.attr(name, value);
+					}
+				}
 			});
+
 			dojo.place(child._buttonWidget.domNode, child.domNode, "before");
 
 			this.inherited(arguments);
@@ -20236,15 +22405,20 @@ dojo.declare(
 
 		removeChild: function(child){
 			// Overrides _LayoutWidget.removeChild().
+			this.disconnect(child._accordionConnectHandle);
+			delete child._accordionConnectHandle;
+
 			child._buttonWidget.destroy();
+			delete child._buttonWidget;
+
 			this.inherited(arguments);
 		},
 
 		getChildren: function(){
 			// Overrides _Container.getChildren() to ignore titles and only look at panes.
 			return dojo.filter(this.inherited(arguments), function(child){
-				return child.declaredClass != "dijit.layout._AccordionButton";
-			});
+				return child.declaredClass != this.buttonWidget;
+			}, this);
 		},
 
 		destroy: function(){
@@ -20253,7 +22427,7 @@ dojo.declare(
 			});
 			this.inherited(arguments);
 		},
-		
+
 		_transition: function(/*Widget?*/newWidget, /*Widget?*/oldWidget){
 			// Overrides StackContainer._transition() to provide sliding of title bars etc.
 
@@ -20269,11 +22443,11 @@ dojo.declare(
 
 				// Size the new widget, in case this is the first time it's being shown,
 				// or I have been resized since the last time it was shown.
-				// Note that page must be visible for resizing to work. 
+				// Note that page must be visible for resizing to work.
 				if(this.doLayout && newWidget.resize){
 					newWidget.resize(this._containerContentBox);
 				}
-				
+
 				var newContents = newWidget.domNode;
 				dojo.addClass(newContents, "dijitVisible");
 				dojo.removeClass(newContents, "dijitHidden");
@@ -20317,7 +22491,7 @@ dojo.declare(
 		},
 
 		// note: we are treating the container as controller here
-		_onKeyPress: function(/*Event*/ e, /*Widget*/ fromTitle){
+		_onKeyPress: function(/*Event*/ e, /*dijit._Widget*/ fromTitle){
 			// summary:
 			//		Handle keypress events
 			// description:
@@ -20354,9 +22528,11 @@ dojo.declare("dijit.layout._AccordionButton",
 	// tags:
 	//		private
 
-	templateString:"<div dojoAttachPoint='titleNode,focusNode' dojoAttachEvent='ondijitclick:_onTitleClick,onkeypress:_onTitleKeyPress,onfocus:_handleFocus,onblur:_handleFocus,onmouseenter:_onTitleEnter,onmouseleave:_onTitleLeave'\n\t\tclass='dijitAccordionTitle' wairole=\"tab\" waiState=\"expanded-false\"\n\t\t><span class='dijitInline dijitAccordionArrow' waiRole=\"presentation\"></span\n\t\t><span class='arrowTextUp' waiRole=\"presentation\">+</span\n\t\t><span class='arrowTextDown' waiR [...]
+	templateString: dojo.cache("dijit.layout", "templates/AccordionButton.html", "<div dojoAttachPoint='titleNode,focusNode' dojoAttachEvent='ondijitclick:_onTitleClick,onkeypress:_onTitleKeyPress,onfocus:_handleFocus,onblur:_handleFocus,onmouseenter:_onTitleEnter,onmouseleave:_onTitleLeave'\n\t\tclass='dijitAccordionTitle' wairole=\"tab\" waiState=\"expanded-false\"\n\t\t><span class='dijitInline dijitAccordionArrow' waiRole=\"presentation\"></span\n\t\t><span class='arrowTextUp' waiRole=\ [...]
 	attributeMap: dojo.mixin(dojo.clone(dijit.layout.ContentPane.prototype.attributeMap), {
-		title: {node: "titleTextNode", type: "innerHTML" }
+		label: {node: "titleTextNode", type: "innerHTML" },
+		title: {node: "titleTextNode", type: "attribute", attribute: "title"},
+		iconClass: { node: "iconNode", type: "class" }
 	}),
 
 	baseClass: "dijitAccordionTitle",
@@ -20418,10 +22594,10 @@ dojo.declare("dijit.layout._AccordionButton",
 		this.focusNode.setAttribute("tabIndex", isSelected ? "0" : "-1");
 	},
 
-	_handleFocus: function(/*Event*/e){
+	_handleFocus: function(/*Event*/ e){
 		// summary:
 		//		Handle the blur and focus state of this widget.
-		dojo[(e.type=="focus" ? "addClass" : "removeClass")](this.focusNode,"dijitAccordionFocused");		
+		dojo.toggleClass(this.titleTextNode, "dijitAccordionFocused", e.type == "focus");
 	},
 
 	setSelected: function(/*Boolean*/ isSelected){
@@ -20523,7 +22699,7 @@ dojo.declare(
 		this.inherited(arguments);
 	},
 
-	_setupChild: function(/*Widget*/child){
+	_setupChild: function(/*dijit._Widget*/ child){
 		// Override _LayoutWidget._setupChild().
 
 		var region = child.region;
@@ -20545,13 +22721,10 @@ dojo.declare(
 			// insert dummy div just for spacing
 			if((child.splitter || this.gutters) && !this._splitters[region]){
 				var _Splitter = dojo.getObject(child.splitter ? this._splitterClass : "dijit.layout._Gutter");
-				var flip = {left:'right', right:'left', top:'bottom', bottom:'top', leading:'trailing', trailing:'leading'};
 				var splitter = new _Splitter({
 					container: this,
 					child: child,
 					region: region,
-//					oppNode: dojo.query('[region=' + flip[child.region] + ']', this.domNode)[0],
-					oppNode: this["_" + flip[child.region]],
 					live: this.liveSplitters
 				});
 				splitter.isSplitter = true;
@@ -20576,15 +22749,15 @@ dojo.declare(
 		this._layoutChildren();
 	},
 
-	addChild: function(/*Widget*/ child, /*Integer?*/ insertIndex){
+	addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){
 		// Override _LayoutWidget.addChild().
 		this.inherited(arguments);
 		if(this._started){
-			this._layoutChildren(); //OPT
+			this.layout(); //OPT
 		}
 	},
 
-	removeChild: function(/*Widget*/ child){
+	removeChild: function(/*dijit._Widget*/ child){
 		// Override _LayoutWidget.removeChild().
 		var region = child.region;
 		var splitter = this._splitters[region];
@@ -20611,7 +22784,7 @@ dojo.declare(
 
 	getSplitter: function(/*String*/region){
 		// summary:
-		//		Returns the widget responsible for rendering the splitter associated with region 
+		//		Returns the widget responsible for rendering the splitter associated with region
 		var splitter = this._splitters[region];
 		return splitter ? dijit.byNode(splitter) : null;
 	},
@@ -20621,7 +22794,7 @@ dojo.declare(
 
 		// resetting potential padding to 0px to provide support for 100% width/height + padding
 		// TODO: this hack doesn't respect the box model and is a temporary fix
-		if (!this.cs || !this.pe){
+		if(!this.cs || !this.pe){
 			var node = this.domNode;
 			this.cs = dojo.getComputedStyle(node);
 			this.pe = dojo._getPadExtents(node, this.cs);
@@ -20657,7 +22830,7 @@ dojo.declare(
 		// Ask browser for width/height of side panes.
 		// Would be nice to cache this but height can change according to width
 		// (because words wrap around).  I don't think width will ever change though
-		// (except when the user drags a splitter). 
+		// (except when the user drags a splitter).
 		if(this._top){
 			topStyle = layoutTopBottom && this._top.style;
 			topHeight = dojo.marginBox(this._top).h;
@@ -20728,7 +22901,7 @@ dojo.declare(
 
 		if(rightSplitter){
 			dojo.mixin(rightSplitter.style, splitterBounds);
-			rightSplitter.style.right = rightWidth + pe.r +  "px";
+			rightSplitter.style.right = rightWidth + pe.r +	"px";
 		}
 
 		dojo.mixin(centerStyle, {
@@ -20759,7 +22932,7 @@ dojo.declare(
 			sidebarHeight = sidebarLayout ? containerHeight : middleHeight;
 
 		var containerWidth = this._borderBox.w - pe.l - pe.r,
-			middleWidth = containerWidth - (leftWidth  + leftSplitterThickness + rightWidth + rightSplitterThickness),
+			middleWidth = containerWidth - (leftWidth + leftSplitterThickness + rightWidth + rightSplitterThickness),
 			sidebarWidth = sidebarLayout ? middleWidth : containerWidth;
 
 		// New margin-box size of each pane
@@ -20836,22 +23009,26 @@ dojo.declare(
 // 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: [const] String
+	//		Parameter for children of `dijit.layout.BorderContainer`.
+	//		Values: "top", "bottom", "leading", "trailing", "left", "right", "center".
+	//		See the `dijit.layout.BorderContainer` description for details.
 	region: '',
 
-	// splitter: Boolean
-	//		If true, puts a draggable splitter on this widget to resize when used
-	//		inside a border container edge region.
+	// splitter: [const] Boolean
+	//		Parameter for child of `dijit.layout.BorderContainer` where region != "center".
+	//		If true, enables user to resize the widget by putting a draggable splitter between
+	//		this widget and the region=center widget.
 	splitter: false,
 
-	// minSize: Number
-	//		Specifies a minimum size for this widget when resized by a splitter
+	// minSize: [const] Number
+	//		Parameter for children of `dijit.layout.BorderContainer`.
+	//		Specifies a minimum size (in pixels) for this widget when resized by a splitter.
 	minSize: 0,
 
-	// maxSize: Number
-	//		Specifies a maximum size for this widget when resized by a splitter
+	// maxSize: [const] Number
+	//		Parameter for children of `dijit.layout.BorderContainer`.
+	//		Specifies a maximum size (in pixels) for this widget when resized by a splitter.
 	maxSize: Infinity
 });
 
@@ -20887,7 +23064,7 @@ dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
 	//		otherwise, the size doesn't change until you drop the splitter (by mouse-up)
 	live: true,
 
-	templateString: '<div class="dijitSplitter" dojoAttachEvent="onkeypress:_onKeyPress,onmousedown:_startDrag" tabIndex="0" waiRole="separator"><div class="dijitSplitterThumb"></div></div>',
+	templateString: '<div class="dijitSplitter" dojoAttachEvent="onkeypress:_onKeyPress,onmousedown:_startDrag,onmouseenter:_onMouse,onmouseleave:_onMouse" tabIndex="0" waiRole="separator"><div class="dijitSplitterThumb"></div></div>',
 
 	postCreate: function(){
 		this.inherited(arguments);
@@ -20897,11 +23074,6 @@ dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
 //		dojo.setSelectable(this.domNode, false); //TODO is this necessary?
 
 		this._factor = /top|left/.test(this.region) ? 1 : -1;
-		this._minSize = this.child.minSize;
-
-		// trigger constraints calculations
-		this.child.domNode._recalc = true;
-		this.connect(this.container, "resize", function(){ this.child.domNode._recalc = true; });
 
 		this._cookieName = this.container.id + "_" + this.region;
 		if(this.container.persist){
@@ -20914,20 +23086,27 @@ dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
 	},
 
 	_computeMaxSize: function(){
+		// summary:
+		//		Compute the maximum size that my corresponding pane can be set to
+
 		var dim = this.horizontal ? 'h' : 'w',
 			thickness = this.container._splitterThickness[this.region];
+			
+		// Get DOMNode of opposite pane, if an opposite pane exists.
+		// Ex: if I am the _Splitter for the left pane, then get the right pane.
+		var flip = {left:'right', right:'left', top:'bottom', bottom:'top', leading:'trailing', trailing:'leading'},
+			oppNode = this.container["_" + flip[this.region]];
+		
+		// I can expand up to the edge of the opposite pane, or if there's no opposite pane, then to
+		// edge of BorderContainer
 		var available = dojo.contentBox(this.container.domNode)[dim] -
-			(this.oppNode ? dojo.marginBox(this.oppNode)[dim] : 0) -
-			20 - thickness * 2;
-		this._maxSize = Math.min(this.child.maxSize, available);
+				(oppNode ? dojo.marginBox(oppNode)[dim] : 0) -
+				20 - thickness * 2;
+
+		return Math.min(this.child.maxSize, available);
 	},
 
 	_startDrag: function(e){
-		if(this.child.domNode._recalc){
-			this._computeMaxSize();
-			this.child.domNode._recalc = false;
-		}
-
 		if(!this.cover){
 			this.cover = dojo.doc.createElement('div');
 			dojo.addClass(this.cover, "dijitSplitterCover");
@@ -20944,11 +23123,16 @@ dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
 			dojo.place(this.fake, this.domNode, "after");
 		}
 		dojo.addClass(this.domNode, "dijitSplitterActive");
+		dojo.addClass(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V") + "Active");
+		if(this.fake){
+			dojo.removeClass(this.fake, "dijitSplitterHover");
+			dojo.removeClass(this.fake, "dijitSplitter" + (this.horizontal ? "H" : "V") + "Hover");
+		}
 
 		//Performance: load data info local vars for onmousevent function closure
 		var factor = this._factor,
-			max = this._maxSize,
-			min = this._minSize || 20,
+			max = this._computeMaxSize(),
+			min = this.child.minSize || 20,
 			isHorizontal = this.horizontal,
 			axis = isHorizontal ? "pageY" : "pageX",
 			pageStart = e[axis],
@@ -20977,13 +23161,19 @@ dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
 				}
 				splitterStyle[region] = factor * delta + splitterStart + (boundChildSize - childSize) + "px";
 			}),
-			dojo.connect(dojo.doc, "ondragstart",   dojo.stopEvent),
+			dojo.connect(dojo.doc, "ondragstart", dojo.stopEvent),
 			dojo.connect(dojo.body(), "onselectstart", dojo.stopEvent),
 			dojo.connect(de, "onmouseup", this, "_stopDrag")
 		]);
 		dojo.stopEvent(e);
 	},
 
+	_onMouse: function(e){
+		var o = (e.type == "mouseover" || e.type == "mouseenter");
+		dojo.toggleClass(this.domNode, "dijitSplitterHover", o);
+		dojo.toggleClass(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V") + "Hover", o);
+	},
+
 	_stopDrag: function(e){
 		try{
 			if(this.cover){
@@ -20991,12 +23181,12 @@ dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
 			}
 			if(this.fake){ dojo.destroy(this.fake); }
 			dojo.removeClass(this.domNode, "dijitSplitterActive");
+			dojo.removeClass(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V") + "Active");
 			dojo.removeClass(this.domNode, "dijitSplitterShadow");
 			this._drag(e); //TODO: redundant with onmousemove?
 			this._drag(e, true);
 		}finally{
 			this._cleanupHandlers();
-			if(this.oppNode){ this.oppNode._recalc = true; }
 			delete this._drag;
 		}
 
@@ -21011,11 +23201,6 @@ dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
 	},
 
 	_onKeyPress: function(/*Event*/ e){
-		if(this.child.domNode._recalc){
-			this._computeMaxSize();
-			this.child.domNode._recalc = false;
-		}
-
 		// should we apply typematic to this?
 		this._resize = true;
 		var horizontal = this.horizontal;
@@ -21033,9 +23218,8 @@ dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ],
 		}
 		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);
+		mb[ this.horizontal ? "h" : "w"] = Math.max(Math.min(childSize, this._computeMaxSize()), this.child.minSize);
 		dojo.marginBox(this.child.domNode, mb);
-		if(this.oppNode){ this.oppNode._recalc = true; }
 		this.container._layoutChildren(this.region);
 		dojo.stopEvent(e);
 	},
@@ -21124,14 +23308,14 @@ dojo.declare("dijit.layout.LayoutContainer",
 		dijit.layout.layoutChildren(this.domNode, this._contentBox, this.getChildren());
 	},
 
-	addChild: function(/*Widget*/ child, /*Integer?*/ insertIndex){
+	addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){
 		this.inherited(arguments);
 		if(this._started){
 			dijit.layout.layoutChildren(this.domNode, this._contentBox, this.getChildren());
 		}
 	},
 
-	removeChild: function(/*Widget*/ widget){
+	removeChild: function(/*dijit._Widget*/ widget){
 		this.inherited(arguments);
 		if(this._started){
 			dijit.layout.layoutChildren(this.domNode, this._contentBox, this.getChildren());
@@ -21161,7 +23345,7 @@ dojo.provide("dijit.layout.LinkPane");
 dojo.declare("dijit.layout.LinkPane",
 	[dijit.layout.ContentPane, dijit._Templated],
 	{
-	// summary: 
+	// summary:
 	//		A ContentPane with an href where (when declared in markup)
 	//		the title is specified as innerHTML rather than as a title attribute.
 	// description:
@@ -21211,7 +23395,7 @@ dojo.provide("dijit.layout.SplitContainer");
 dojo.declare("dijit.layout.SplitContainer",
 	dijit.layout._LayoutWidget,
 	{
-	// summary: 
+	// summary:
 	//		Deprecated.  Use `dijit.layout.BorderContainer` instead.
 	// description:
 	//		A Container widget with sizing handles in-between each child.
@@ -21307,10 +23491,10 @@ dojo.declare("dijit.layout.SplitContainer",
 			this._restoreState();
 		}
 
-		this.inherited(arguments); 
+		this.inherited(arguments);
 	},
 
-	_setupChild: function(/*Widget*/ child){
+	_setupChild: function(/*dijit._Widget*/ child){
 		this.inherited(arguments);
 		child.domNode.style.position = "absolute";
 		dojo.addClass(child.domNode, "dijitSplitPane");
@@ -21319,7 +23503,7 @@ dojo.declare("dijit.layout.SplitContainer",
 	_onSizerMouseDown: function(e){
 		if(e.target.id){
 			for(var i=0;i<this.sizers.length;i++){
-				if(this.sizers[i].id==e.target.id){
+				if(this.sizers[i].id == e.target.id){
 					break;
 				}
 			}
@@ -21329,7 +23513,7 @@ dojo.declare("dijit.layout.SplitContainer",
 		}
 	},
 	_addSizer: function(index){
-		index = index===undefined?this.sizers.length:index;
+		index = index === undefined ? this.sizers.length : index;
 
 		// TODO: use a template for this!!!
 		var sizer = dojo.doc.createElement('div');
@@ -21347,17 +23531,18 @@ dojo.declare("dijit.layout.SplitContainer",
 
 		// FIXME: are you serious? why aren't we using mover start/stop combo?
 		this.connect(sizer, "onmousedown", '_onSizerMouseDown');
-		
+
 		dojo.setSelectable(sizer, false);
 	},
 
 	removeChild: function(widget){
-		// summary: Remove sizer, but only if widget is really our child and
+		// 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){
+				if(i == this.sizers.length){
 					i--;
 				}
 				dojo.destroy(this.sizers[i]);
@@ -21366,21 +23551,21 @@ dojo.declare("dijit.layout.SplitContainer",
 		}
 
 		// Remove widget and repaint
-		this.inherited(arguments); 
+		this.inherited(arguments);
 		if(this._started){
 			this.layout();
 		}
 	},
 
-	addChild: function(/*Widget*/ child, /*Integer?*/ insertIndex){
+	addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){
 		// summary:
 		//		Add a child widget to the container
 		// child:
 		//		a widget to add
 		// insertIndex:
 		//		postion in the "stack" to add the child widget
-		
-		this.inherited(arguments); 
+
+		this.inherited(arguments);
 
 		if(this._started){
 			// Do the stuff that startup() does for each widget
@@ -21593,7 +23778,7 @@ dojo.declare("dijit.layout.SplitContainer",
 		this.sizingSplitter.style.zIndex = 6;
 
 		// TODO: REVISIT - we want MARGIN_BOX and core hasn't exposed that yet (but can't we use it anyway if we pay attention? we do elsewhere.)
-		this.originPos = dojo.coords(children[0].domNode, true);
+		this.originPos = dojo.position(children[0].domNode, true);
 		if(this.isHorizontal){
 			var client = e.layerX || e.offsetX || 0;
 			var screen = e.pageX;
@@ -21611,7 +23796,7 @@ dojo.declare("dijit.layout.SplitContainer",
 			this._showSizingLine();
 		}
 
-		//					
+		//
 		// attach mouse events
 		//
 		this._ownconnects = [];
@@ -21650,7 +23835,7 @@ dojo.declare("dijit.layout.SplitContainer",
 			this._saveState(this);
 		}
 
-		dojo.forEach(this._ownconnects,dojo.disconnect); 
+		dojo.forEach(this._ownconnects, dojo.disconnect);
 	},
 
 	movePoint: function(){
@@ -21695,11 +23880,11 @@ dojo.declare("dijit.layout.SplitContainer",
 		var pos = this.lastPoint - this.dragOffset - this.originPos;
 
 		var start_region = this.paneBefore.position;
-		var end_region   = this.paneAfter.position + this.paneAfter.sizeActual;
+		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;
+		this.paneAfter.sizeActual = end_region - this.paneAfter.position;
 
 		dojo.forEach(this.getChildren(), function(child){
 			child.sizeShare = child.sizeActual;
@@ -21761,12 +23946,14 @@ dojo.declare("dijit.layout.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
+	// sizeMin: [deprecated] Integer
+	//		Deprecated.  Parameter for children of `dijit.layout.SplitContainer`.
 	//		Minimum size (width or height) of a child of a SplitContainer.
 	//		The value is relative to other children's sizeShare properties.
 	sizeMin: 10,
 
-	// sizeShare: Integer
+	// sizeShare: [deprecated] Integer
+	//		Deprecated.  Parameter for children of `dijit.layout.SplitContainer`.
 	//		Size (width or height) of a child of a SplitContainer.
 	//		The value is relative to other children's sizeShare properties.
 	//		For example, if there are two children and each has sizeShare=10, then
@@ -21776,17 +23963,153 @@ dojo.extend(dijit._Widget, {
 
 }
 
+if(!dojo._hasResource["dijit.layout._TabContainerBase"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout._TabContainerBase"] = true;
+dojo.provide("dijit.layout._TabContainerBase");
+
+
+
+
+dojo.declare("dijit.layout._TabContainerBase",
+	[dijit.layout.StackContainer, dijit._Templated],
+	{
+	// summary:
+	//		Abstract base class for TabContainer.   Must define _makeController() to instantiate
+	//		and return the widget that displays the tab labels
+	// description:
+	//		A TabContainer is a container that has multiple panes, but shows only
+	//		one pane at a time.  There are a set of tabs corresponding to each pane,
+	//		where each tab has the name (aka title) of the pane, and optionally a close button.
+
+	// tabPosition: String
+	//		Defines where tabs go relative to tab content.
+	//		"top", "bottom", "left-h", "right-h"
+	tabPosition: "top",
+
+	baseClass: "dijitTabContainer",
+
+	// tabStrip: Boolean
+	//		Defines whether the tablist gets an extra class for layouting, putting a border/shading
+	//		around the set of tabs.
+	tabStrip: false,
+
+	// nested: Boolean
+	//		If true, use styling for a TabContainer nested inside another TabContainer.
+	//		For tundra etc., makes tabs look like links, and hides the outer
+	//		border since the outer TabContainer already has a border.
+	nested: false,
+
+	templateString: dojo.cache("dijit.layout", "templates/TabContainer.html", "<div class=\"dijitTabContainer\">\n\t<div class=\"dijitTabListWrapper\" dojoAttachPoint=\"tablistNode\"></div>\n\t<div dojoAttachPoint=\"tablistSpacer\" class=\"dijitTabSpacer ${baseClass}-spacer\"></div>\n\t<div class=\"dijitTabPaneWrapper ${baseClass}-container\" dojoAttachPoint=\"containerNode\"></div>\n</div>\n"),
+
+	postMixInProperties: function(){
+		// set class name according to tab position, ex: dijitTabContainerTop
+		this.baseClass += this.tabPosition.charAt(0).toUpperCase() + this.tabPosition.substr(1).replace(/-.*/, "");
+
+		this.srcNodeRef && dojo.style(this.srcNodeRef, "visibility", "hidden");
+
+		this.inherited(arguments);
+	},
+
+	postCreate: function(){
+		this.inherited(arguments);
+
+		// Create the tab list that will have a tab (a.k.a. tab button) for each tab panel
+		this.tablist = this._makeController(this.tablistNode);
+
+		if(!this.doLayout){ dojo.addClass(this.domNode, "dijitTabContainerNoLayout"); }
+
+		if(this.nested){
+			/* workaround IE's lack of support for "a > b" selectors by
+			 * tagging each node in the template.
+			 */
+			dojo.addClass(this.domNode, "dijitTabContainerNested");
+			dojo.addClass(this.tablist.containerNode, "dijitTabContainerTabListNested");
+			dojo.addClass(this.tablistSpacer, "dijitTabContainerSpacerNested");
+			dojo.addClass(this.containerNode, "dijitTabPaneWrapperNested");
+		}else{
+			dojo.addClass(this.domNode, "tabStrip-" + (this.tabStrip ? "enabled" : "disabled"));
+		}
+	},
+
+	_setupChild: function(/*dijit._Widget*/ tab){
+		// Overrides StackContainer._setupChild().
+		dojo.addClass(tab.domNode, "dijitTabPane");
+		this.inherited(arguments);
+	},
+
+	startup: function(){
+		if(this._started){ return; }
+
+		// wire up the tablist and its tabs
+		this.tablist.startup();
+
+		this.inherited(arguments);
+	},
+
+	layout: function(){
+		// Overrides StackContainer.layout().
+		// Configure the content pane to take up all the space except for where the tabs are
+		if(!this._contentBox || typeof(this._contentBox.l) == "undefined"){return;}
+
+		if(this.doLayout){
+			// position and size the titles and the container node
+			var titleAlign = this.tabPosition.replace(/-h/, "");
+			this.tablist.layoutAlign = titleAlign;
+			var children = [this.tablist, {
+				domNode: this.tablistSpacer,
+				layoutAlign: titleAlign
+			}, {
+				domNode: this.containerNode,
+				layoutAlign: "client"
+			}];
+			dijit.layout.layoutChildren(this.domNode, this._contentBox, children);
+
+			// Compute size to make each of my children.
+			// children[2] is the margin-box size of this.containerNode, set by layoutChildren() call above
+			this._containerContentBox = dijit.layout.marginBox2contentBox(this.containerNode, children[2]);
+
+			if(this.selectedChildWidget){
+				if(this.selectedChildWidget.resize){
+					this.selectedChildWidget.resize(this._containerContentBox);
+				}
+			}
+		}else{
+			// just layout the tab controller, so it can position left/right buttons etc.
+			if(this.tablist.resize){
+				this.tablist.resize({w: dojo.contentBox(this.domNode).w});
+			}
+
+			// and call resize() on the pane just to tell it that it's been made visible
+			this.selectedChildWidget.resize();
+		}
+	},
+
+	destroy: function(){
+		if(this.tablist){
+			this.tablist.destroy();
+		}
+		this.inherited(arguments);
+	}
+});
+
+
+}
+
 if(!dojo._hasResource["dijit.layout.TabController"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
 dojo._hasResource["dijit.layout.TabController"] = true;
 dojo.provide("dijit.layout.TabController");
 
 
 
+// Menu is used for an accessible close button, would be nice to have a lighter-weight solution
+
+
+
+
 
-//TODO: make private for 2.0?
 dojo.declare("dijit.layout.TabController",
 	dijit.layout.StackController,
-	{
+{
 	// summary:
 	// 		Set of tabs (the things with titles and a close button, that you click to show a tab panel).
 	//		Used internally by `dijit.layout.TabContainer`.
@@ -21804,16 +24127,14 @@ dojo.declare("dijit.layout.TabController",
 	//		"top", "bottom", "left-h", "right-h"
 	tabPosition: "top",
 
-	// doLayout: Boolean
-	//		TODO: unused, remove
-	doLayout: true,
-
 	// buttonWidget: String
 	//		The name of the tab widget to create to correspond to each page
 	buttonWidget: "dijit.layout._TabButton",
 
 	_rectifyRtlTabList: function(){
-		//summary: Rectify the width of all tabs in rtl, otherwise the tab widths are different in IE
+		// summary:
+		//		For left/right TabContainer when page is RTL mode, rectify the width of all tabs to be equal, otherwise the tab widths are different in IE
+
 		if(0 >= this.tabPosition.indexOf('-h')){ return; }
 		if(!this.pane2button){ return; }
 
@@ -21825,7 +24146,7 @@ dojo.declare("dijit.layout.TabController",
 		//unify the length of all the tabs
 		for(pane in this.pane2button){
 			this.pane2button[pane].innerDiv.style.width = maxWidth + 'px';
-		}	
+		}
 	}
 });
 
@@ -21840,28 +24161,88 @@ dojo.declare("dijit.layout._TabButton",
 	// tags:
 	//		private
 
+	// baseClass: String
+	//		The CSS class applied to the domNode.
 	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><img class =\"dijitTabButtonSpacer\" src=\"${_blankGif}\" />\n\t        <span class=\"closeBu [...]
+	templateString: dojo.cache("dijit.layout", "templates/_TabButton.html", "<div waiRole=\"presentation\" dojoAttachPoint=\"titleNode\" dojoAttachEvent='onclick:onClick,onmouseenter:_onMouse,onmouseleave:_onMouse'>\n    <div waiRole=\"presentation\" class='dijitTabInnerDiv' dojoAttachPoint='innerDiv'>\n        <div waiRole=\"presentation\" class='dijitTabContent' dojoAttachPoint='tabContent,focusNode'>\n\t        <img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint='iconNode' waiRole=\"prese [...]
 
 	// Override _FormWidget.scrollOnFocus.
 	// Don't scroll the whole tab container into view when the button is focused.
 	scrollOnFocus: false,
 
+	postMixInProperties: function(){
+		// Override blank iconClass from Button to do tab height adjustment on IE6,
+		// to make sure that tabs with and w/out close icons are same height
+		if(!this.iconClass){
+			this.iconClass = "dijitTabButtonIcon";
+		}
+	},
+
 	postCreate: function(){
-		if(this.closeButton){
-			dojo.addClass(this.innerDiv, "dijitClosable");
+		this.inherited(arguments);
+		dojo.setSelectable(this.containerNode, false);
+
+		// If a custom icon class has not been set for the
+		// tab icon, set its width to one pixel. This ensures
+		// that the height styling of the tab is maintained,
+		// as it is based on the height of the icon.
+		// TODO: I still think we can just set dijitTabButtonIcon to 1px in CSS <Bill>
+		if(this.iconNode.className == "dijitTabButtonIcon"){
+			dojo.style(this.iconNode, "width", "1px");
+		}
+	},
+
+	startup: function(){
+		this.inherited(arguments);
+		var n = this.domNode;
+
+		// Required to give IE6 a kick, as it initially hides the
+		// tabs until they are focused on.
+		setTimeout(function(){
+			n.className = n.className;
+		}, 1);
+	},
+
+	_setCloseButtonAttr: function(disp){
+		this.closeButton = disp;
+		dojo.toggleClass(this.innerDiv, "dijitClosable", disp);
+		this.closeNode.style.display = disp ? "" : "none";
+		if(disp){
 			var _nlsResources = dojo.i18n.getLocalization("dijit", "common");
 			if(this.closeNode){
 				dojo.attr(this.closeNode,"title", _nlsResources.itemClose);
-				// IE needs title set directly on image
-				dojo.attr(this.closeIcon,"title", _nlsResources.itemClose);
+				if (dojo.isIE<8){
+					// IE<8 needs title set directly on image.  Only set for IE since alt=""
+					// for this node and WCAG 2.0 does not allow title when alt=""
+					dojo.attr(this.closeIcon, "title", _nlsResources.itemClose);
+				}
 			}
+			// add context menu onto title button
+			var _nlsResources = dojo.i18n.getLocalization("dijit", "common");
+			this._closeMenu = new dijit.Menu({
+				id: this.id+"_Menu",
+				targetNodeIds: [this.domNode]
+			});
+
+			this._closeMenu.addChild(new dijit.MenuItem({
+				label: _nlsResources.itemClose,
+				onClick: dojo.hitch(this, "onClickCloseButton")
+			}));
 		}else{
-			this.closeNode.style.display="none";		
+			if(this._closeMenu){
+				this._closeMenu.destroyRecursive();
+				delete this._closeMenu;
+			}
 		}
-		this.inherited(arguments); 
-		dojo.setSelectable(this.containerNode, false);
+	},
+
+	destroy: function(){
+		if(this._closeMenu){
+			this._closeMenu.destroyRecursive();
+			delete this._closeMenu;
+		}
+		this.inherited(arguments);
 	},
 
 	_onCloseButtonEnter: function(){
@@ -21879,134 +24260,540 @@ dojo.declare("dijit.layout._TabButton",
 
 }
 
-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");
+if(!dojo._hasResource["dijit.layout.ScrollingTabController"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.ScrollingTabController"] = true;
+dojo.provide("dijit.layout.ScrollingTabController");
 
 
 
 
+dojo.declare("dijit.layout.ScrollingTabController",
+	dijit.layout.TabController,
+	{
+	// summary:
+	//		Set of tabs with left/right arrow keys and a menu to switch between tabs not
+	//		all fitting on a single row.
+	//		Works only for horizontal tabs (either above or below the content, not to the left
+	//		or right).
+	// tags:
+	//		private
 
-dojo.declare("dijit.layout.TabContainer",
-	[dijit.layout.StackContainer, dijit._Templated],
-	{	
-	// summary: 
-	//		A Container with tabs to select each child (only one of which is displayed at a time).
-	// description:
-	//		A TabContainer is a container that has multiple panes, but shows only
-	//		one pane at a time.  There are a set of tabs corresponding to each pane,
-	//		where each tab has the 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.
+	templateString: dojo.cache("dijit.layout", "templates/ScrollingTabController.html", "<div class=\"dijitTabListContainer-${tabPosition}\" style=\"visibility:hidden\">\n\t<div dojoType=\"dijit.layout._ScrollingTabControllerButton\" buttonType=\"menuBtn\" buttonClass=\"tabStripMenuButton\"\n\t\t\ttabPosition=\"${tabPosition}\" dojoAttachPoint=\"_menuBtn\" showLabel=false>↓</div>\n\t<div dojoType=\"dijit.layout._ScrollingTabControllerButton\" buttonType=\"leftBtn\" buttonClass=\"tabStr [...]
 
-	// tabPosition: String
-	//		Defines where tabs go relative to tab content.
-	//		"top", "bottom", "left-h", "right-h"
-	tabPosition: "top",
+	// useMenu:[const] Boolean
+	//		True if a menu should be used to select tabs when they are too
+	//		wide to fit the TabContainer, false otherwise.
+	useMenu: true,
 
-	baseClass: "dijitTabContainer",
-	
-	// tabStrip: Boolean
-	//		Defines whether the tablist gets an extra class for layouting, putting a border/shading
-	//		around the set of tabs.
-	tabStrip: false,
+	// useSlider: [const] Boolean
+	//		True if a slider should be used to select tabs when they are too
+	//		wide to fit the TabContainer, false otherwise.
+	useSlider: true,
 
-	// nested: Boolean
-	//		If true, use styling for a TabContainer nested inside another TabContainer.
-	//		For tundra etc., makes tabs look like links, and hides the outer
-	//		border since the outer TabContainer already has a border.
-	nested: false,
+	// tabStripClass: String
+	//		The css class to apply to the tab strip, if it is visible.
+	tabStripClass: "",
 
-	templateString: null,	// override setting in StackContainer
-	templateString:"<div class=\"dijitTabContainer\">\n\t<div dojoAttachPoint=\"tablistNode\"></div>\n\t<div dojoAttachPoint=\"tablistSpacer\" class=\"dijitTabSpacer ${baseClass}-spacer\"></div>\n\t<div class=\"dijitTabPaneWrapper ${baseClass}-container\" dojoAttachPoint=\"containerNode\"></div>\n</div>\n",
+	widgetsInTemplate: true,
 
-	// _controllerWidget: String
-	//		An optional parameter to overrider the default TabContainer controller used.
-	_controllerWidget: "dijit.layout.TabController",
+	// _minScroll: Number
+	//		The distance in pixels from the edge of the tab strip which,
+	//		if a scroll animation is less than, forces the scroll to
+	//		go all the way to the left/right.
+	_minScroll: 5,
 
-	postMixInProperties: function(){
-		// set class name according to tab position, ex: dijiTabContainerTop
-		this.baseClass += this.tabPosition.charAt(0).toUpperCase() + this.tabPosition.substr(1).replace(/-.*/, "");
-		this.inherited(arguments);
-	},
+	attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
+		"class": "containerNode"
+	}),
 
 	postCreate: function(){
 		this.inherited(arguments);
+		var n = this.domNode;
 
-		// 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,
-			"class": this.baseClass + "-tabs" + (this.doLayout ? "" : " dijitTabNoLayout")
-		}, this.tablistNode);
-		
-		// add Class for tabstrip
-		if (this.tabStrip){	dojo.addClass(this.tablist.domNode, this.baseClass+"Strip"); }		
-		
-		if(!this.doLayout){ dojo.addClass(this.domNode, "dijitTabContainerNoLayout"); }
-		
-		if(this.nested){
-			/* workaround IE's lack of support for "a > b" selectors by
-			 * tagging each node in the template.
-			 */
-			dojo.addClass(this.domNode, "dijitTabContainerNested");
-			dojo.addClass(this.tablist.domNode, "dijitTabContainerTabListNested");
-			dojo.addClass(this.tablistSpacer, "dijitTabContainerSpacerNested");
-			dojo.addClass(this.containerNode, "dijitTabPaneWrapperNested");
+		this.scrollNode = this.tablistWrapper;
+		this._initButtons();
+
+		if(!this.tabStripClass){
+			this.tabStripClass = "dijitTabContainer" +
+				this.tabPosition.charAt(0).toUpperCase() +
+				this.tabPosition.substr(1).replace(/-.*/, "") +
+				"None";
+			dojo.addClass(n, "tabStrip-disabled")
 		}
+
+		dojo.addClass(this.tablistWrapper, this.tabStripClass);
 	},
 
-	_setupChild: function(/* Widget */tab){
-		// Overrides StackContainer._setupChild().
-		dojo.addClass(tab.domNode, "dijitTabPane");
+	onStartup: function(){
 		this.inherited(arguments);
-		return tab; // Widget		(TODO: remove this, return code is unused)
-	},
 
-	startup: function(){
-		if(this._started){ return; }
+		// Do not show the TabController until the related
+		// StackController has added it's children.  This gives
+		// a less visually jumpy instantiation.
+		dojo.style(this.domNode, "visibility", "visible");
+		this._postStartup = true;
+	},
 
-		// wire up the tablist and its tabs
-		this.tablist.startup();
+	onAddChild: function(page, insertIndex){
 		this.inherited(arguments);
+		var menuItem;
+		if(this.useMenu){
+			menuItem = new dijit.MenuItem({
+				label: page.title,
+				onClick: dojo.hitch(this, function(){
+					this.onSelectChild(page);
+				})
+			});
+			this._menuChildren[page.id] = menuItem;
+			this._menu.addChild(menuItem, insertIndex);
+		}
+
+		// update the menuItem label when the button label is updated
+		this.pane2handles[page.id].push(
+			this.connect(this.pane2button[page.id], "attr", function(name, value){
+				if(this._postStartup){
+					if(arguments.length == 2 && name == "label"){
+						if(menuItem){
+							menuItem.attr(name, value);
+						}
+	
+						// The changed label will have changed the width of the
+						// buttons, so do a resize
+						if(this._dim){
+							this.resize(this._dim);
+						}
+					}
+				}
+			})
+		);
+
+		// Increment the width of the wrapper when a tab is added
+		// This makes sure that the buttons never wrap.
+		// The value 200 is chosen as it should be bigger than most
+		// Tab button widths.
+		dojo.style(this.containerNode, "width",
+			(dojo.style(this.containerNode, "width") + 200) + "px");
 	},
 
-	layout: function(){
-		// Overrides StackContainer.layout().
-		// 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.tablistSpacer, layoutAlign: titleAlign },
-			{ domNode: this.containerNode, layoutAlign: "client" }
-		];
-		dijit.layout.layoutChildren(this.domNode, this._contentBox, children);
+	onRemoveChild: function(page, insertIndex){
+		// null out _selectedTab because we are about to delete that dom node
+		var button = this.pane2button[page.id];
+		if(this._selectedTab === button.domNode){
+			this._selectedTab = null;
+		}
+
+		// delete menu entry corresponding to pane that was removed from TabContainer
+		if(this.useMenu && page && page.id && this._menuChildren[page.id]){
+			this._menu.removeChild(this._menuChildren[page.id]);
+			this._menuChildren[page.id].destroy();
+			delete this._menuChildren[page.id];
+		}
+
+		this.inherited(arguments);
+	},
 
-		// Compute size to make each of my children.
-		// children[2] is the margin-box size of this.containerNode, set by layoutChildren() call above
-		this._containerContentBox = dijit.layout.marginBox2contentBox(this.containerNode, children[2]);
+	_initButtons: function(){
+		// summary:
+		//		Creates the buttons used to scroll to view tabs that
+		//		may not be visible if the TabContainer is too narrow.
+		this._menuChildren = {};
 
-		if(this.selectedChildWidget){
-			this._showChild(this.selectedChildWidget);
-			if(this.doLayout && this.selectedChildWidget.resize){
-				this.selectedChildWidget.resize(this._containerContentBox);
+		// Make a list of the buttons to display when the tab labels become
+		// wider than the TabContainer, and hide the other buttons.
+		// Also gets the total width of the displayed buttons.
+		this._btnWidth = 0;
+		this._buttons = dojo.query("> .tabStripButton", this.domNode).filter(function(btn){
+			if((this.useMenu && btn == this._menuBtn.domNode) ||
+				(this.useSlider && (btn == this._rightBtn.domNode || btn == this._leftBtn.domNode))){
+				this._btnWidth += dojo.marginBox(btn).w;
+				return true;
+			}else{
+				dojo.style(btn, "display", "none");
+				return false;
 			}
+		}, this);
+
+		if(this.useMenu){
+			// Create the menu that is used to select tabs.
+			this._menu = new dijit.Menu({
+				id: this.id + "_menu",
+				targetNodeIds: [this._menuBtn.domNode],
+				leftClickToOpen: true,
+				refocus: false	// selecting a menu item sets focus to a TabButton
+			});
+			this._supportingWidgets.push(this._menu);
 		}
 	},
 
-	destroy: function(){
-		if(this.tablist){
-			this.tablist.destroy();
+	_getTabsWidth: function(){
+		var children = this.getChildren();
+		if(children.length){
+			var leftTab = children[this.isLeftToRight() ? 0 : children.length - 1].domNode,
+				rightTab = children[this.isLeftToRight() ? children.length - 1 : 0].domNode;
+			return rightTab.offsetLeft + dojo.style(rightTab, "width") - leftTab.offsetLeft;
+		}else{
+			return 0;
+		}
+	},
+
+	_enableBtn: function(width){
+		// summary:
+		//		Determines if the tabs are wider than the width of the TabContainer, and
+		//		thus that we need to display left/right/menu navigation buttons.
+		var tabsWidth = this._getTabsWidth();
+		width = width || dojo.style(this.scrollNode, "width");
+		return tabsWidth > 0 && width < tabsWidth;
+	},
+
+	resize: function(dim){
+		// summary:
+		//		Hides or displays the buttons used to scroll the tab list and launch the menu
+		//		that selects tabs.
+
+		if(this.domNode.offsetWidth == 0){
+			return;
+		}
+		
+		// Save the dimensions to be used when a child is renamed.
+		this._dim = dim;
+
+		// Set my height to be my natural height (tall enough for one row of tab labels),
+		// and my content-box width based on margin-box width specified in dim parameter.
+		// But first reset scrollNode.height in case it was set by layoutChildren() call
+		// in a previous run of this method.
+		this.scrollNode.style.height = "auto";
+		this._contentBox = dijit.layout.marginBox2contentBox(this.domNode, {h: 0, w: dim.w});
+		this._contentBox.h = this.scrollNode.offsetHeight;
+		dojo.contentBox(this.domNode, this._contentBox);
+
+		// Show/hide the left/right/menu navigation buttons depending on whether or not they
+		// are needed.
+		var enable = this._enableBtn(this._contentBox.w);
+		this._buttons.style("display", enable ? "" : "none");
+
+		// Position and size the navigation buttons and the tablist
+		this._leftBtn.layoutAlign = "left";
+		this._rightBtn.layoutAlign = "right";
+		this._menuBtn.layoutAlign = this.isLeftToRight() ? "right" : "left";
+		dijit.layout.layoutChildren(this.domNode, this._contentBox,
+			[this._menuBtn, this._leftBtn, this._rightBtn, {domNode: this.scrollNode, layoutAlign: "client"}]);
+
+		// set proper scroll so that selected tab is visible
+		if(this._selectedTab){
+			var w = this.scrollNode,
+				sl = this._convertToScrollLeft(this._getScrollForSelectedTab());
+			w.scrollLeft = sl;
+		}
+
+		// Enable/disabled left right buttons depending on whether or not user can scroll to left or right
+		this._setButtonClass(this._getScroll());
+	},
+
+	_getScroll: function(){
+		// summary:
+		//		Returns the current scroll of the tabs where 0 means
+		//		"scrolled all the way to the left" and some positive number, based on #
+		//		of pixels of possible scroll (ex: 1000) means "scrolled all the way to the right"
+		var sl = (this.isLeftToRight() || dojo.isIE < 8) ? this.scrollNode.scrollLeft :
+				dojo.style(this.containerNode, "width") - dojo.style(this.scrollNode, "width")
+					 + (dojo.isIE == 8 ? -1 : 1) * this.scrollNode.scrollLeft;
+		return sl;
+	},
+
+	_convertToScrollLeft: function(val){
+		// summary:
+		//		Given a scroll value where 0 means "scrolled all the way to the left"
+		//		and some positive number, based on # of pixels of possible scroll (ex: 1000)
+		//		means "scrolled all the way to the right", return value to set this.scrollNode.scrollLeft
+		//		to achieve that scroll.
+		//
+		//		This method is to adjust for RTL funniness in various browsers and versions.
+		if(this.isLeftToRight() || dojo.isIE < 8){
+			return val;
+		}else{
+			var maxScroll = dojo.style(this.containerNode, "width") - dojo.style(this.scrollNode, "width");
+			return (dojo.isIE == 8 ? -1 : 1) * (val - maxScroll);
+		}
+	},
+
+	onSelectChild: function(/*dijit._Widget*/ page){
+		// summary:
+		//		Smoothly scrolls to a tab when it is selected.
+
+		var tab = this.pane2button[page.id];
+		if(!tab || !page){return;}
+
+		var node = tab.domNode;
+		if(node != this._selectedTab){
+			this._selectedTab = node;
+
+			var sl = this._getScroll();
+
+			if(sl > node.offsetLeft ||
+				sl + dojo.style(this.scrollNode, "width") <
+				node.offsetLeft + dojo.style(node, "width")){
+
+				var anim = this.createSmoothScroll();
+				// use dojo.connect() rather than this.connect() because the animation will soon be
+				// garbage collected and there's no reason to leave a reference to the connection in this._connects[]
+				dojo.connect(anim, "onEnd", function(){
+					tab.onClick(null);
+				});
+				anim.play();
+			}else{
+				tab.onClick(null);
+			}
 		}
+
 		this.inherited(arguments);
+	},
+
+	_getScrollBounds: function(){
+		// summary:
+		//		Returns the minimum and maximum scroll setting to show the leftmost and rightmost
+		//		tabs (respectively)
+		var children = this.getChildren(),
+			scrollNodeWidth = dojo.style(this.scrollNode, "width"),		// about 500px
+			containerWidth = dojo.style(this.containerNode, "width"),	// 50,000px
+			maxPossibleScroll = containerWidth - scrollNodeWidth,	// scrolling until right edge of containerNode visible
+			tabsWidth = this._getTabsWidth();
+
+		if(children.length && tabsWidth > scrollNodeWidth){
+			// Scrolling should happen
+			return {
+				min: this.isLeftToRight() ? 0 : children[children.length-1].domNode.offsetLeft,
+				max: this.isLeftToRight() ?
+					(children[children.length-1].domNode.offsetLeft + dojo.style(children[children.length-1].domNode, "width")) - scrollNodeWidth :
+					maxPossibleScroll
+			};
+		}else{
+			// No scrolling needed, all tabs visible, we stay either scrolled to far left or far right (depending on dir)
+			var onlyScrollPosition = this.isLeftToRight() ? 0 : maxPossibleScroll;
+			return {
+				min: onlyScrollPosition,
+				max: onlyScrollPosition
+			};
+		}
+	},
+
+	_getScrollForSelectedTab: function(){
+		// summary:
+		//		Returns the scroll value setting so that the selected tab
+		//		will appear in the center
+		var w = this.scrollNode,
+			n = this._selectedTab,
+			scrollNodeWidth = dojo.style(this.scrollNode, "width"),
+			scrollBounds = this._getScrollBounds();
+
+		// TODO: scroll minimal amount (to either right or left) so that
+		// selected tab is fully visible, and just return if it's already visible?
+		var pos = (n.offsetLeft + dojo.style(n, "width")/2) - scrollNodeWidth/2;
+		pos = Math.min(Math.max(pos, scrollBounds.min), scrollBounds.max);
+
+		// TODO:
+		// If scrolling close to the left side or right side, scroll
+		// all the way to the left or right.  See this._minScroll.
+		// (But need to make sure that doesn't scroll the tab out of view...)
+		return pos;
+	},
+
+	createSmoothScroll : function(x){
+		// summary:
+		//		Creates a dojo._Animation object that smoothly scrolls the tab list
+		//		either to a fixed horizontal pixel value, or to the selected tab.
+		// description:
+		//		If an number argument is passed to the function, that horizontal
+		//		pixel position is scrolled to.  Otherwise the currently selected
+		//		tab is scrolled to.
+		// x: Integer?
+		//		An optional pixel value to scroll to, indicating distance from left.
+
+		// Calculate position to scroll to
+		if(arguments.length > 0){
+			// position specified by caller, just make sure it's within bounds
+			var scrollBounds = this._getScrollBounds();
+			x = Math.min(Math.max(x, scrollBounds.min), scrollBounds.max);
+		}else{
+			// scroll to center the current tab
+			x = this._getScrollForSelectedTab();
+		}
+
+		if(this._anim && this._anim.status() == "playing"){
+			this._anim.stop();
+		}
+
+		var self = this,
+			w = this.scrollNode,
+			anim = new dojo._Animation({
+				beforeBegin: function(){
+					if(this.curve){ delete this.curve; }
+					var oldS = w.scrollLeft,
+						newS = self._convertToScrollLeft(x);
+					anim.curve = new dojo._Line(oldS, newS);
+				},
+				onAnimate: function(val){
+					w.scrollLeft = val;
+				}
+			});
+		this._anim = anim;
+
+		// Disable/enable left/right buttons according to new scroll position
+		this._setButtonClass(x);
+
+		return anim; // dojo._Animation
+	},
+
+	_getBtnNode: function(e){
+		// summary:
+		//		Gets a button DOM node from a mouse click event.
+		// e:
+		//		The mouse click event.
+		var n = e.target;
+		while(n && !dojo.hasClass(n, "tabStripButton")){
+			n = n.parentNode;
+		}
+		return n;
+	},
+
+	doSlideRight: function(e){
+		// summary:
+		//		Scrolls the menu to the right.
+		// e:
+		//		The mouse click event.
+		this.doSlide(1, this._getBtnNode(e));
+	},
+
+	doSlideLeft: function(e){
+		// summary:
+		//		Scrolls the menu to the left.
+		// e:
+		//		The mouse click event.
+		this.doSlide(-1,this._getBtnNode(e));
+	},
+
+	doSlide: function(direction, node){
+		// summary:
+		//		Scrolls the tab list to the left or right by 75% of the widget width.
+		// direction:
+		//		If the direction is 1, the widget scrolls to the right, if it is
+		//		-1, it scrolls to the left.
+
+		if(node && dojo.hasClass(node, "dijitTabBtnDisabled")){return;}
+
+		var sWidth = dojo.style(this.scrollNode, "width");
+		var d = (sWidth * 0.75) * direction;
+
+		var to = this._getScroll() + d;
+
+		this._setButtonClass(to);
+
+		this.createSmoothScroll(to).play();
+	},
+
+	_setButtonClass: function(scroll){
+		// summary:
+		//		Adds or removes a class to the left and right scroll buttons
+		//		to indicate whether each one is enabled/disabled.
+		// description:
+		//		If the tabs are scrolled all the way to the left, the class
+		//		'dijitTabBtnDisabled' is added to the left button.
+		//		If the tabs are scrolled all the way to the right, the class
+		//		'dijitTabBtnDisabled' is added to the right button.
+		// scroll: Integer
+		//		amount of horizontal scroll
+
+		var cls = "dijitTabBtnDisabled",
+			scrollBounds = this._getScrollBounds();
+		dojo.toggleClass(this._leftBtn.domNode, cls, scroll <= scrollBounds.min);
+		dojo.toggleClass(this._rightBtn.domNode, cls, scroll >= scrollBounds.max);
+	}
+});
+
+dojo.declare("dijit.layout._ScrollingTabControllerButton",
+	dijit.form.Button,
+	{
+		baseClass: "dijitTab",
+
+		buttonType: "",
+
+		buttonClass: "",
+
+		tabPosition: "top",
+
+		templateString: dojo.cache("dijit.layout", "templates/_ScrollingTabControllerButton.html", "<div id=\"${id}-${buttonType}\" class=\"tabStripButton dijitTab ${buttonClass} tabStripButton-${tabPosition}\"\n\t\tdojoAttachEvent=\"onclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\">\n\t<div role=\"presentation\" wairole=\"presentation\" class=\"dijitTabInnerDiv\" dojoattachpoint=\"innerDiv,focusNode\">\n\t\t<div role=\"presentation\" wairole=\"presentat [...]
+
+		// Override inherited tabIndex: 0 from dijit.form.Button, because user shouldn't be
+		// able to tab to the left/right/menu buttons
+		tabIndex: ""
 	}
+);
+
+}
+
+if(!dojo._hasResource["dijit.layout.TabContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit.layout.TabContainer"] = true;
+dojo.provide("dijit.layout.TabContainer");
+
+
+
+
+
+dojo.declare("dijit.layout.TabContainer",
+	dijit.layout._TabContainerBase,
+	{
+		// summary:
+		//		A Container with tabs to select each child (only one of which is displayed at a time).
+		// description:
+		//		A TabContainer is a container that has multiple panes, but shows only
+		//		one pane at a time.  There are a set of tabs corresponding to each pane,
+		//		where each tab has the name (aka title) of the pane, and optionally a close button.
+
+		// useMenu: [const] Boolean
+		//		True if a menu should be used to select tabs when they are too
+		//		wide to fit the TabContainer, false otherwise.
+		useMenu: true,
+
+		// useSlider: [const] Boolean
+		//		True if a slider should be used to select tabs when they are too
+		//		wide to fit the TabContainer, false otherwise.
+		useSlider: true,
+
+		// controllerWidget: String
+		//		An optional parameter to override the widget used to display the tab labels
+		controllerWidget: "",
+
+		_makeController: function(/*DomNode*/ srcNode){
+			// summary:
+			//		Instantiate tablist controller widget and return reference to it.
+			//		Callback from _TabContainerBase.postCreate().
+			// tags:
+			//		protected extension
+
+			var cls = this.baseClass + "-tabs" + (this.doLayout ? "" : " dijitTabNoLayout"),
+				TabController = dojo.getObject(this.controllerWidget);
+
+			return new TabController({
+				id: this.id + "_tablist",
+				tabPosition: this.tabPosition,
+				doLayout: this.doLayout,
+				containerId: this.id,
+				"class": cls,
+				nested: this.nested,
+				useMenu: this.useMenu,
+				useSlider: this.useSlider,
+				tabStripClass: this.tabStrip ? this.baseClass + (this.tabStrip ? "":"No") + "Strip": null
+			}, srcNode);
+		},
+
+		postMixInProperties: function(){
+			this.inherited(arguments);
+
+			// Scrolling controller only works for horizontal non-nested tabs
+			if(!this.controllerWidget){
+				this.controllerWidget = (this.tabPosition == "top" || this.tabPosition == "bottom") && !this.nested ?
+							"dijit.layout.ScrollingTabController" : "dijit.layout.TabController";
+			}
+		}
 });
 
 
@@ -22018,8 +24805,9 @@ console.warn("dijit-all may include much more code than your application actuall
 dojo.provide("dijit.dijit-all");
 
 /*=====
-dijit["dijit-all"] = { 
-	// summary: A rollup that includes every dijit. You probably don't need this.
+dijit["dijit-all"] = {
+	// summary:
+	//		A rollup that includes every dijit. You probably don't need this.
 };
 =====*/
 
@@ -22049,8 +24837,10 @@ dijit["dijit-all"] = {
 
 
 
+// Form widgets
 
 
+// Button widgets
 
 
 
@@ -22058,7 +24848,7 @@ dijit["dijit-all"] = {
 
 
 
-// slider files
+// Textbox widgets
 
 
 
@@ -22066,20 +24856,30 @@ dijit["dijit-all"] = {
 
 
 
+// Select widgets
 
 
 
 
+// Slider widgets
 
 
 
 
 
 
- //deprecated
+
+// Textarea widgets
+
+
+
+// Layout widgets
+
+
 
  //deprecated
 
+ //deprecated
 
 
 
diff --git a/dijit/dijit.js b/dijit/dijit.js
index a2dbbde..bcbf8c4 100644
--- a/dijit/dijit.js
+++ b/dijit/dijit.js
@@ -13,4 +13,4 @@
 	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.doc;if(_1.selection){var s=_1.selection;if(s.type=="Text"){return !s.createRange().htmlText.length;}else{return !s.createRange().length;}}else{var _3=dojo.global;var _4=_3.getSelection();if(dojo.isString(_4)){return !_4;}else{return !_4||_4.isCollapsed||!_4.toString();}}},getBookmark:f [...]
+if(!dojo._hasResource["dijit._base.manager"]){dojo._hasResource["dijit._base.manager"]=true;dojo.provide("dijit._base.manager");dojo.declare("dijit.WidgetSet",null,{constructor:function(){this._hash={};this.length=0;},add:function(_1){if(this._hash[_1.id]){throw new Error("Tried to register widget with id=="+_1.id+" but that id is already registered");}this._hash[_1.id]=_1;this.length++;},remove:function(id){if(this._hash[id]){delete this._hash[id];this.length--;}},forEach:function(_2,_3 [...]
diff --git a/dijit/dijit.js.uncompressed.js b/dijit/dijit.js.uncompressed.js
index 868dd5f..0eb99c5 100644
--- a/dijit/dijit.js.uncompressed.js
+++ b/dijit/dijit.js.uncompressed.js
@@ -13,25 +13,465 @@
 	for documentation and information on getting the source.
 */
 
+if(!dojo._hasResource["dijit._base.manager"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.manager"] = true;
+dojo.provide("dijit._base.manager");
+
+dojo.declare("dijit.WidgetSet", null, {
+	// summary:
+	//		A set of widgets indexed by id. A default instance of this class is
+	//		available as `dijit.registry`
+	//
+	// example:
+	//		Create a small list of widgets:
+	//		|	var ws = new dijit.WidgetSet();
+	//		|	ws.add(dijit.byId("one"));
+	//		| 	ws.add(dijit.byId("two"));
+	//		|	// destroy both:
+	//		|	ws.forEach(function(w){ w.destroy(); });
+	//
+	// example:
+	//		Using dijit.registry:
+	//		|	dijit.registry.forEach(function(w){ /* do something */ });
+
+	constructor: function(){
+		this._hash = {};
+		this.length = 0;
+	},
+
+	add: function(/*dijit._Widget*/ widget){
+		// summary:
+		//		Add a widget to this list. If a duplicate ID is detected, a error is thrown.
+		//
+		// widget: dijit._Widget
+		//		Any dijit._Widget subclass.
+		if(this._hash[widget.id]){
+			throw new Error("Tried to register widget with id==" + widget.id + " but that id is already registered");
+		}
+		this._hash[widget.id] = widget;
+		this.length++;
+	},
+
+	remove: function(/*String*/ id){
+		// summary:
+		//		Remove a widget from this WidgetSet. Does not destroy the widget; simply
+		//		removes the reference.
+		if(this._hash[id]){
+			delete this._hash[id];
+			this.length--;
+		}
+	},
+
+	forEach: function(/*Function*/ func, /* Object? */thisObj){
+		// summary:
+		//		Call specified function for each widget in this set.
+		//
+		// func:
+		//		A callback function to run for each item. Is passed the widget, the index
+		//		in the iteration, and the full hash, similar to `dojo.forEach`.
+		//
+		// thisObj:
+		//		An optional scope parameter
+		//
+		// example:
+		//		Using the default `dijit.registry` instance:
+		//		|	dijit.registry.forEach(function(widget){
+		//		|		console.log(widget.declaredClass);
+		//		|	});
+		//
+		// returns:
+		//		Returns self, in order to allow for further chaining.
+
+		thisObj = thisObj || dojo.global;
+		var i = 0, id;
+		for(id in this._hash){
+			func.call(thisObj, this._hash[id], i++, this._hash);
+		}
+		return this;	// dijit.WidgetSet
+	},
+
+	filter: function(/*Function*/ filter, /* Object? */thisObj){
+		// summary:
+		//		Filter down this WidgetSet to a smaller new WidgetSet
+		//		Works the same as `dojo.filter` and `dojo.NodeList.filter`
+		//
+		// filter:
+		//		Callback function to test truthiness. Is passed the widget
+		//		reference and the pseudo-index in the object.
+		//
+		// thisObj: Object?
+		//		Option scope to use for the filter function.
+		//
+		// example:
+		//		Arbitrary: select the odd widgets in this list
+		//		|	dijit.registry.filter(function(w, i){
+		//		|		return i % 2 == 0;
+		//		|	}).forEach(function(w){ /* odd ones */ });
+
+		thisObj = thisObj || dojo.global;
+		var res = new dijit.WidgetSet(), i = 0, id;
+		for(id in this._hash){
+			var w = this._hash[id];
+			if(filter.call(thisObj, w, i++, this._hash)){
+				res.add(w);
+			}
+		}
+		return res; // dijit.WidgetSet
+	},
+
+	byId: function(/*String*/ id){
+		// summary:
+		//		Find a widget in this list by it's id.
+		// example:
+		//		Test if an id is in a particular WidgetSet
+		//		| var ws = new dijit.WidgetSet();
+		//		| ws.add(dijit.byId("bar"));
+		//		| var t = ws.byId("bar") // returns a widget
+		//		| var x = ws.byId("foo"); // returns undefined
+
+		return this._hash[id];	// dijit._Widget
+	},
+
+	byClass: function(/*String*/ cls){
+		// summary:
+		//		Reduce this widgetset to a new WidgetSet of a particular `declaredClass`
+		//
+		// cls: String
+		//		The Class to scan for. Full dot-notated string.
+		//
+		// example:
+		//		Find all `dijit.TitlePane`s in a page:
+		//		|	dijit.registry.byClass("dijit.TitlePane").forEach(function(tp){ tp.close(); });
+
+		var res = new dijit.WidgetSet(), id, widget;
+		for(id in this._hash){
+			widget = this._hash[id];
+			if(widget.declaredClass == cls){
+				res.add(widget);
+			}
+		 }
+		 return res; // dijit.WidgetSet
+},
+
+	toArray: function(){
+		// summary:
+		//		Convert this WidgetSet into a true Array
+		//
+		// example:
+		//		Work with the widget .domNodes in a real Array
+		//		|	dojo.map(dijit.registry.toArray(), function(w){ return w.domNode; });
+
+		var ar = [];
+		for(var id in this._hash){
+			ar.push(this._hash[id]);
+		}
+		return ar;	// dijit._Widget[]
+},
+
+	map: function(/* Function */func, /* Object? */thisObj){
+		// summary:
+		//		Create a new Array from this WidgetSet, following the same rules as `dojo.map`
+		// example:
+		//		|	var nodes = dijit.registry.map(function(w){ return w.domNode; });
+		//
+		// returns:
+		//		A new array of the returned values.
+		return dojo.map(this.toArray(), func, thisObj); // Array
+	},
+
+	every: function(func, thisObj){
+		// summary:
+		// 		A synthetic clone of `dojo.every` acting explictly on this WidgetSet
+		//
+		// func: Function
+		//		A callback function run for every widget in this list. Exits loop
+		//		when the first false return is encountered.
+		//
+		// thisObj: Object?
+		//		Optional scope parameter to use for the callback
+
+		thisObj = thisObj || dojo.global;
+		var x = 0, i;
+		for(i in this._hash){
+			if(!func.call(thisObj, this._hash[i], x++, this._hash)){
+				return false; // Boolean
+			}
+		}
+		return true; // Boolean
+	},
+
+	some: function(func, thisObj){
+		// summary:
+		// 		A synthetic clone of `dojo.some` acting explictly on this WidgetSet
+		//
+		// func: Function
+		//		A callback function run for every widget in this list. Exits loop
+		//		when the first true return is encountered.
+		//
+		// thisObj: Object?
+		//		Optional scope parameter to use for the callback
+
+		thisObj = thisObj || dojo.global;
+		var x = 0, i;
+		for(i in this._hash){
+			if(func.call(thisObj, this._hash[i], x++, this._hash)){
+				return true; // Boolean
+			}
+		}
+		return false; // Boolean
+	}
+
+});
+
+/*=====
+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
+};
+
+dijit.findWidgets = function(/*DomNode*/ root){
+	// summary:
+	//		Search subtree under root returning widgets found.
+	//		Doesn't search for nested widgets (ie, widgets inside other widgets).
+
+	var outAry = [];
+
+	function getChildrenHelper(root){
+		for(var node = root.firstChild; node; node = node.nextSibling){
+			if(node.nodeType == 1){
+				var widgetId = node.getAttribute("widgetId");
+				if(widgetId){
+					var widget = dijit.byId(widgetId);
+					outAry.push(widget);
+				}else{
+					getChildrenHelper(node);
+				}
+			}
+		}
+	}
+
+	getChildrenHelper(root);
+	return outAry;
+};
+
+dijit._destroyAll = function(){
+	// summary:
+	//		Code to destroy all widgets and do other cleanup on page unload
+
+	// Clean up focus manager lingering references to widgets and nodes
+	dijit._curFocus = null;
+	dijit._prevFocus = null;
+	dijit._activeStack = [];
+
+	// Destroy all the widgets, top down
+	dojo.forEach(dijit.findWidgets(dojo.body()), function(widget){
+		// Avoid double destroy of widgets like Menu that are attached to <body>
+		// even though they are logically children of other widgets.
+		if(!widget._destroyed){
+			if(widget.destroyRecursive){
+				widget.destroyRecursive();
+			}else if(widget.destroy){
+				widget.destroy();
+			}
+		}
+	});
+};
+
+if(dojo.isIE){
+	// Only run _destroyAll() for IE because we think it's only necessary in that case,
+	// and because it causes problems on FF.  See bug #3531 for details.
+	dojo.addOnWindowUnload(function(){
+		dijit._destroyAll();
+	});
+}
+
+dijit.byId = function(/*String|Widget*/id){
+	// summary:
+	//		Returns a widget by it's id, or if passed a widget, no-op (like dojo.byId())
+	return typeof id == "string" ? dijit.registry._hash[id] : id; // dijit._Widget
+};
+
+dijit.byNode = function(/* DOMNode */ node){
+	// summary:
+	//		Returns the widget corresponding to the given DOMNode
+	return dijit.registry.byId(node.getAttribute("widgetId")); // dijit._Widget
+};
+
+dijit.getEnclosingWidget = function(/* DOMNode */ node){
+	// summary:
+	//		Returns the widget whose DOM tree contains the specified DOMNode, or null if
+	//		the node is not contained within the DOM tree of any widget
+	while(node){
+		var id = node.getAttribute && node.getAttribute("widgetId");
+		if(id){
+			return dijit.byId(id);
+		}
+		node = node.parentNode;
+	}
+	return null;
+};
+
+dijit._isElementShown = function(/*Element*/elem){
+	var style = dojo.style(elem);
+	return (style.visibility != "hidden")
+		&& (style.visibility != "collapsed")
+		&& (style.display != "none")
+		&& (dojo.attr(elem, "type") != "hidden");
+}
+
+dijit.isTabNavigable = function(/*Element*/elem){
+	// summary:
+	//		Tests if an element is tab-navigable
+
+	// TODO: convert (and rename method) to return effectivite tabIndex; will save time in _getTabNavigable()
+	if(dojo.attr(elem, "disabled")){
+		return false;
+	}else if(dojo.hasAttr(elem, "tabIndex")){
+		// Explicit tab index setting
+		return dojo.attr(elem, "tabIndex") >= 0; // boolean
+	}else{
+		// No explicit tabIndex setting, need to investigate node type
+		switch(elem.nodeName.toLowerCase()){
+			case "a":
+				// An <a> w/out a tabindex is only navigable if it has an href
+				return dojo.hasAttr(elem, "href");
+			case "area":
+			case "button":
+			case "input":
+			case "object":
+			case "select":
+			case "textarea":
+				// These are navigable by default
+				return true;
+			case "iframe":
+				// If it's an editor <iframe> then it's tab navigable.
+				if(dojo.isMoz){
+					return elem.contentDocument.designMode == "on";
+				}else if(dojo.isWebKit){
+					var doc = elem.contentDocument,
+						body = doc && doc.body;
+					return body && body.contentEditable == 'true';
+				}else{
+					doc = elem.contentWindow.document;
+					body = doc && doc.body;
+					return body && body.firstChild && body.firstChild.contentEditable == 'true';
+				}
+			default:
+				return elem.contentEditable == 'true';
+		}
+	}
+};
+
+dijit._getTabNavigable = function(/*DOMNode*/root){
+	// summary:
+	//		Finds descendants of the specified root node.
+	//
+	// description:
+	//		Finds the following descendants of the specified root node:
+	//		* the first tab-navigable element in document order
+	//		  without a tabIndex or with tabIndex="0"
+	//		* the last tab-navigable element in document order
+	//		  without a tabIndex or with tabIndex="0"
+	//		* the first element in document order with the lowest
+	//		  positive tabIndex value
+	//		* the last element in document order with the highest
+	//		  positive tabIndex value
+	var first, last, lowest, lowestTabindex, highest, highestTabindex;
+	var walkTree = function(/*DOMNode*/parent){
+		dojo.query("> *", parent).forEach(function(child){
+			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 && child.nodeName.toUpperCase() != 'SELECT'){ 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; // DomNode
+};
+
+dijit.getLastInTabbingOrder = function(/*String|DOMNode*/root){
+	// summary:
+	//		Finds the descendant of the specified root node
+	//		that is last in the tabbing order
+	var elems = dijit._getTabNavigable(dojo.byId(root));
+	return elems.last ? elems.last : elems.highest; // DomNode
+};
+
+/*=====
+dojo.mixin(dijit, {
+	// defaultDuration: Integer
+	//		The default animation speed (in ms) to use for all Dijit
+	//		transitional animations, unless otherwise specified
+	//		on a per-instance basis. Defaults to 200, overrided by
+	//		`djConfig.defaultDuration`
+	defaultDuration: 300
+});
+=====*/
+
+dijit.defaultDuration = dojo.config["defaultDuration"] || 200;
+
+}
+
 if(!dojo._hasResource["dijit._base.focus"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
 dojo._hasResource["dijit._base.focus"] = true;
 dojo.provide("dijit._base.focus");
 
+	// for dijit.isTabNavigable()
+
 // summary:
 //		These functions are used to query or set the focus and selection.
 //
-//		Also, they trace when widgets become actived/deactivated,
+//		Also, they trace when widgets become activated/deactivated,
 //		so that the widget can fire _onFocus/_onBlur events.
 //		"Active" here means something similar to "focused", but
 //		"focus" isn't quite the right word because we keep track of
-//		a whole stack of "active" widgets.  Example:  Combobutton --> Menu -->
-//		MenuItem.   The onBlur event for Combobutton doesn't fire due to focusing
+//		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
+//		ComboButton widget.  It only happens when focus is shifted
 //		somewhere completely different.
 
-dojo.mixin(dijit,
-{
+dojo.mixin(dijit, {
 	// _curFocus: DomNode
 	//		Currently focused item on screen
 	_curFocus: null,
@@ -43,116 +483,166 @@ dojo.mixin(dijit,
 	isCollapsed: function(){
 		// summary:
 		//		Returns true if there is no text selected
-		var _document = dojo.doc;
-		if(_document.selection){ // IE
-			var s=_document.selection;
-			if(s.type=='Text'){
-				return !s.createRange().htmlText.length; // Boolean
-			}else{ //Control range
-				return !s.createRange().length; // Boolean
-			}
-		}else{
-			var _window = dojo.global;
-			var selection = _window.getSelection();
-			
-			if(dojo.isString(selection)){ // Safari
-				// TODO: this is dead code; safari is taking the else branch.  remove after 1.3.
-				return !selection; // Boolean
-			}else{ // Mozilla/W3
-				return !selection || selection.isCollapsed || !selection.toString(); // Boolean
-			}
-		}
+		return dijit.getBookmark().isCollapsed;
 	},
 
 	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++));
+		var bm, rg, tg, sel = dojo.doc.selection, cf = dijit._curFocus;
+
+		if(dojo.global.getSelection){
+			//W3C Range API for selections.
+			sel = dojo.global.getSelection();
+			if(sel){
+				if(sel.isCollapsed){
+					tg = cf? cf.tagName : "";
+					if(tg){
+						//Create a fake rangelike item to restore selections.
+						tg = tg.toLowerCase();
+						if(tg == "textarea" ||
+								(tg == "input" && (!cf.type || cf.type.toLowerCase() == "text"))){
+							sel = {
+								start: cf.selectionStart,
+								end: cf.selectionEnd,
+								node: cf,
+								pRange: true
+							};
+							return {isCollapsed: (sel.end <= sel.start), mark: sel}; //Object.
+						}
 					}
+					bm = {isCollapsed:true};
 				}else{
-					bookmark=null;
+					rg = sel.getRangeAt(0);
+					bm = {isCollapsed: false, mark: rg.cloneRange()};
 				}
-			}else{
-				bookmark = range.getBookmark();
 			}
-		}else{
-			if(window.getSelection){
-				selection = dojo.global.getSelection();
-				if(selection){
-					range = selection.getRangeAt(0);
-					bookmark = range.cloneRange();
+		}else if(sel){
+			// If the current focus was a input of some sort and no selection, don't bother saving
+			// a native bookmark.  This is because it causes issues with dialog/page selection restore.
+			// So, we need to create psuedo bookmarks to work with.
+			tg = cf ? cf.tagName : "";
+			tg = tg.toLowerCase();
+			if(cf && tg && (tg == "button" || tg == "textarea" || tg == "input")){
+				if(sel.type && sel.type.toLowerCase() == "none"){
+					return {
+						isCollapsed: true,
+						mark: null
+					}
+				}else{
+					rg = sel.createRange();
+					return {
+						isCollapsed: rg.text && rg.text.length?false:true,
+						mark: {
+							range: rg,
+							pRange: true
+						}
+					};
+				}
+			}
+			bm = {};
+
+			//'IE' way for selections.
+			try{
+				// createRange() throws exception when dojo in iframe
+				//and nothing selected, see #9632
+				rg = sel.createRange();
+				bm.isCollapsed = !(sel.type == 'Text' ? rg.htmlText.length : rg.length);
+			}catch(e){
+				bm.isCollapsed = true;
+				return bm;
+			}
+			if(sel.type.toUpperCase() == 'CONTROL'){
+				if(rg.length){
+					bm.mark=[];
+					var i=0,len=rg.length;
+					while(i<len){
+						bm.mark.push(rg.item(i++));
+					}
+				}else{
+					bm.isCollapsed = true;
+					bm.mark = null;
 				}
 			}else{
-				console.warn("No idea how to store the current selection for this browser!");
+				bm.mark = rg.getBookmark();
 			}
+		}else{
+			console.warn("No idea how to store the current selection for this browser!");
 		}
-		return bookmark; // Array
+		return bm; // Object
 	},
 
 	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();
-				//range.addElement does not have call/apply method, so can not call it directly
-				//range is not available in "range.addElement(item)", so can't use that either
-				dojo.forEach(bookmark, function(n){
-					range.addElement(n);
-				});
-			}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!");
+		//		Moves current selection to a bookmark
+		// bookmark:
+		//		This should be a returned object from dijit.getBookmark()
+
+		var _doc = dojo.doc,
+			mark = bookmark.mark;
+		if(mark){
+			if(dojo.global.getSelection){
+				//W3C Rangi API (FF, WebKit, Opera, etc)
+				var sel = dojo.global.getSelection();
+				if(sel && sel.removeAllRanges){
+					if(mark.pRange){
+						var r = mark;
+						var n = r.node;
+						n.selectionStart = r.start;
+						n.selectionEnd = r.end;
+					}else{
+						sel.removeAllRanges();
+						sel.addRange(mark);
+					}
+				}else{
+					console.warn("No idea how to restore selection for this browser!");
+				}
+			}else if(_doc.selection && mark){
+				//'IE' way.
+				var rg;
+				if(mark.pRange){
+					rg = mark.range;
+				}else if(dojo.isArray(mark)){
+					rg = _doc.body.createControlRange();
+					//rg.addElement does not have call/apply method, so can not call it directly
+					//rg is not available in "range.addElement(item)", so can't use that either
+					dojo.forEach(mark, function(n){
+						rg.addElement(n);
+					});
+				}else{
+					rg = _doc.body.createTextRange();
+					rg.moveToBookmark(mark);
+				}
+				rg.select();
 			}
 		}
 	},
 
-	getFocus: function(/*Widget?*/menu, /*Window?*/openedForWindow){
+	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
+		//		Called as getFocus(), this returns an Object showing the current focus
+		//		and selected text.
+		//
+		//		Called as getFocus(widget), where widget is a (widget representing) a button
+		//		that was just pressed, it returns where focus was before that button
+		//		was pressed.   (Pressing the button may have either shifted focus to the button,
+		//		or removed focus altogether.)   In this case the selected text is not returned,
+		//		since it can't be accurately determined.
 		//
-		// menu:
-		//		The menu that's being opened
+		// menu: dijit._Widget or {domNode: DomNode} structure
+		//		The button that was just pressed.  If focus has disappeared or moved
+		//		to this button, returns the previous focus.  In this case the bookmark
+		//		information is already lost, and null is returned.
 		//
 		// openedForWindow:
 		//		iframe in which menu was opened
 		//
 		// returns:
-		//		A handle to restore focus/selection
-
+		//		A handle to restore focus/selection, to be passed to `dijit.focus`
+		var node = !dijit._curFocus || (menu && dojo.isDescendant(dijit._curFocus, menu.domNode)) ? dijit._prevFocus : dijit._curFocus;
 		return {
-			// Node 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,
-
+			node: node,
+			bookmark: (node == dijit._curFocus) && dojo.withGlobal(openedForWindow || dojo.global, dijit.getBookmark),
 			openedForWindow: openedForWindow
 		}; // Object
 	},
@@ -168,39 +658,41 @@ dojo.mixin(dijit,
 
 		var node = "node" in handle ? handle.node : handle,		// because handle is either DomNode or a composite object
 			bookmark = handle.bookmark,
-			openedForWindow = handle.openedForWindow;
+			openedForWindow = handle.openedForWindow,
+			collapsed = bookmark ? bookmark.isCollapsed : false;
 
 		// Set the focus
 		// Note that for iframe's we need to use the <iframe> to follow the parentNode chain,
 		// but we need to set focus to iframe.contentWindow
 		if(node){
-			var focusNode = (node.tagName.toLowerCase()=="iframe") ? node.contentWindow : node;
+			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)){
+		// (use keyboard to select a menu item) or if previous selection was collapsed
+		// as it may cause focus shift (Esp in IE).
+		if(bookmark && dojo.withGlobal(openedForWindow || dojo.global, dijit.isCollapsed) && !collapsed){
 			if(openedForWindow){
 				openedForWindow.focus();
 			}
 			try{
-				dojo.withGlobal(openedForWindow||dojo.global, dijit.moveToBookmark, null, [bookmark]);
-			}catch(e){
+				dojo.withGlobal(openedForWindow || dojo.global, dijit.moveToBookmark, null, [bookmark]);
+			}catch(e2){
 				/*squelch IE internal error, see http://trac.dojotoolkit.org/ticket/1984 */
 			}
 		}
 	},
 
-	// _activeStack: Array
+	// _activeStack: dijit._Widget[]
 	//		List of currently active widgets (focused widget and it's ancestors)
 	_activeStack: [],
 
@@ -211,9 +703,20 @@ dojo.mixin(dijit,
 		//		as a focus/click event on the <iframe> itself.
 		// description:
 		//		Currently only used by editor.
-		dijit.registerWin(iframe.contentWindow, iframe);
+		// returns:
+		//		Handle to pass to unregisterIframe()
+		return dijit.registerWin(iframe.contentWindow, iframe);
+	},
+
+	unregisterIframe: function(/*Object*/ handle){
+		// summary:
+		//		Unregisters listeners on the specified iframe created by registerIframe.
+		//		After calling be sure to delete or null out the handle itself.
+		// handle:
+		//		Handle returned by registerIframe()
+
+		dijit.unregisterWin(handle);
 	},
-		
 
 	registerWin: function(/*Window?*/targetWindow, /*DomNode?*/ effectiveNode){
 		// summary:
@@ -228,43 +731,79 @@ dojo.mixin(dijit,
 		// effectiveNode:
 		//		If specified, report any focus events inside targetWindow as
 		//		an event on effectiveNode, rather than on evt.target.
+		// returns:
+		//		Handle to pass to unregisterWin()
 
 		// TODO: make this function private in 2.0; Editor/users should call registerIframe(),
-		// or if Editor stops using <iframe> altogether than we can probably just drop
-		// the whole public API.
 
-		dojo.connect(targetWindow.document, "onmousedown", function(evt){
+		var mousedownListener = function(evt){
 			dijit._justMouseDowned = true;
 			setTimeout(function(){ dijit._justMouseDowned = false; }, 0);
-			dijit._onTouchNode(effectiveNode||evt.target||evt.srcElement);
-		});
+			dijit._onTouchNode(effectiveNode || evt.target || evt.srcElement, "mouse");
+		};
 		//dojo.connect(targetWindow, "onscroll", ???);
 
 		// Listen for blur and focus events on targetWindow's document.
 		// IIRC, I'm using attachEvent() rather than dojo.connect() because focus/blur events don't bubble
 		// through dojo.connect(), and also maybe to catch the focus events early, before onfocus handlers
 		// fire.
-		var doc = targetWindow.document;
+		// Connect to <html> (rather than document) on IE to avoid memory leaks, but document on other browsers because
+		// (at least for FF) the focus event doesn't fire on <html> or <body>.
+		var doc = dojo.isIE ? targetWindow.document.documentElement : targetWindow.document;
 		if(doc){
 			if(dojo.isIE){
-				doc.attachEvent('onactivate', function(evt){
-					if(evt.srcElement.tagName.toLowerCase() != "#document"){
-						dijit._onFocusNode(effectiveNode||evt.srcElement);
+				doc.attachEvent('onmousedown', mousedownListener);
+				var activateListener = function(evt){
+					// IE reports that nodes like <body> have gotten focus, even though they have tabIndex=-1,
+					// Should consider those more like a mouse-click than a focus....
+					if(evt.srcElement.tagName.toLowerCase() != "#document" &&
+						dijit.isTabNavigable(evt.srcElement)){
+						dijit._onFocusNode(effectiveNode || evt.srcElement);
+					}else{
+						dijit._onTouchNode(effectiveNode || evt.srcElement);
 					}
-				});
-				doc.attachEvent('ondeactivate', function(evt){
-					dijit._onBlurNode(effectiveNode||evt.srcElement);
-				});
+				};
+				doc.attachEvent('onactivate', activateListener);
+				var deactivateListener =  function(evt){
+					dijit._onBlurNode(effectiveNode || evt.srcElement);
+				};
+				doc.attachEvent('ondeactivate', deactivateListener);
+
+				return function(){
+					doc.detachEvent('onmousedown', mousedownListener);
+					doc.detachEvent('onactivate', activateListener);
+					doc.detachEvent('ondeactivate', deactivateListener);
+					doc = null;	// prevent memory leak (apparent circular reference via closure)
+				};
 			}else{
-				doc.addEventListener('focus', function(evt){
-					dijit._onFocusNode(effectiveNode||evt.target);
-				}, true);
-				doc.addEventListener('blur', function(evt){
-					dijit._onBlurNode(effectiveNode||evt.target);
-				}, true);
+				doc.addEventListener('mousedown', mousedownListener, true);
+				var focusListener = function(evt){
+					dijit._onFocusNode(effectiveNode || evt.target);
+				};
+				doc.addEventListener('focus', focusListener, true);
+				var blurListener = function(evt){
+					dijit._onBlurNode(effectiveNode || evt.target);
+				};
+				doc.addEventListener('blur', blurListener, true);
+
+				return function(){
+					doc.removeEventListener('mousedown', mousedownListener, true);
+					doc.removeEventListener('focus', focusListener, true);
+					doc.removeEventListener('blur', blurListener, true);
+					doc = null;	// prevent memory leak (apparent circular reference via closure)
+				};
 			}
 		}
-		doc = null;	// prevent memory leak (apparent circular reference via closure)
+	},
+
+	unregisterWin: function(/*Handle*/ handle){
+		// summary:
+		//		Unregisters listeners on the specified window (either the main
+		//		window or an iframe's window) according to handle returned from registerWin().
+		//		After calling be sure to delete or null out the handle itself.
+
+		// Currently our handle is actually a function
+		handle && handle();
 	},
 
 	_onBlurNode: function(/*DomNode*/ node){
@@ -293,9 +832,13 @@ dojo.mixin(dijit,
 		}, 100);
 	},
 
-	_onTouchNode: function(/*DomNode*/ node){
+	_onTouchNode: function(/*DomNode*/ node, /*String*/ by){
 		// summary:
 		//		Callback when node is focused or mouse-downed
+		// node:
+		//		The node that was touched.
+		// by:
+		//		"mouse" if the focus/touch was caused by a mouse down event
 
 		// ignore the recent blurNode event
 		if(dijit._clearActiveWidgetsTimer){
@@ -307,11 +850,12 @@ dojo.mixin(dijit,
 		var newStack=[];
 		try{
 			while(node){
-				if(node.dijitPopupParent){
-					node=dijit.byId(node.dijitPopupParent).domNode;
-				}else if(node.tagName && node.tagName.toLowerCase()=="body"){
+				var popupParent = dojo.attr(node, "dijitPopupParent");
+				if(popupParent){
+					node=dijit.byId(popupParent).domNode;
+				}else if(node.tagName && node.tagName.toLowerCase() == "body"){
 					// is this the root of the document or just the root of an iframe?
-					if(node===dojo.body()){
+					if(node === dojo.body()){
 						// node is the root of the main document
 						break;
 					}
@@ -328,7 +872,7 @@ dojo.mixin(dijit,
 			}
 		}catch(e){ /* squelch */ }
 
-		dijit._setStack(newStack);
+		dijit._setStack(newStack, by);
 	},
 
 	_onFocusNode: function(/*DomNode*/ node){
@@ -348,7 +892,7 @@ dojo.mixin(dijit,
 
 		dijit._onTouchNode(node);
 
-		if(node==dijit._curFocus){ return; }
+		if(node == dijit._curFocus){ return; }
 		if(dijit._curFocus){
 			dijit._prevFocus = dijit._curFocus;
 		}
@@ -356,9 +900,13 @@ dojo.mixin(dijit,
 		dojo.publish("focusNode", [node]);
 	},
 
-	_setStack: function(newStack){
+	_setStack: function(/*String[]*/ newStack, /*String*/ by){
 		// summary:
 		//		The stack of active widgets has changed.  Send out appropriate events and records new stack.
+		// newStack:
+		//		array of widget id's, starting from the top (outermost) widget
+		// by:
+		//		"mouse" if the focus/touch was caused by a mouse down event
 
 		var oldStack = dijit._activeStack;
 		dijit._activeStack = newStack;
@@ -370,344 +918,50 @@ dojo.mixin(dijit,
 			}
 		}
 
+		var widget;
 		// 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]);
+			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(function(){dijit.registerWin(window); });
-
-}
-
-if(!dojo._hasResource["dijit._base.manager"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._base.manager"] = true;
-dojo.provide("dijit._base.manager");
-
-dojo.declare("dijit.WidgetSet", null, {
-	// summary:
-	//		A set of widgets indexed by id. A default instance of this class is 
-	//		available as `dijit.registry`
-	//
-	// example:
-	//		Create a small list of widgets:
-	//		|	var ws = new dijit.WidgetSet();
-	//		|	ws.add(dijit.byId("one"));
-	//		| 	ws.add(dijit.byId("two"));
-	//		|	// destroy both:
-	//		|	ws.forEach(function(w){ w.destroy(); });
-	//
-	// example:
-	//		Using dijit.registry:
-	//		|	dijit.registry.forEach(function(w){ /* do something */ });
-	
-	constructor: function(){
-		this._hash = {};
-	},
-
-	add: function(/*Widget*/ widget){
-		// summary:
-		//		Add a widget to this list. If a duplicate ID is detected, a error is thrown.
-		//
-		// widget: dijit._Widget
-		//		Any dijit._Widget subclass.
-		if(this._hash[widget.id]){
-			throw new Error("Tried to register widget with id==" + widget.id + " but that id is already registered");
-		}
-		this._hash[widget.id]=widget;
-	},
-
-	remove: function(/*String*/ id){
-		// summary:
-		//		Remove a widget from this WidgetSet. Does not destroy the widget; simply
-		//		removes the reference.
-		delete this._hash[id];
-	},
-
-	forEach: function(/*Function*/ func){
-		// summary:
-		//		Call specified function for each widget in this set.
-		//
-		// func:
-		//		A callback function to run for each item. Is passed a the widget.
-		//
-		// example:
-		//		Using the default `dijit.registry` instance:
-		//		|	dijit.registry.forEach(function(widget){
-		//		|			
-		//		|	});
-		for(var id in this._hash){
-			func(this._hash[id]);
-		}
-	},
-
-	filter: function(/*Function*/ filter){
-		// summary:
-		//		Filter down this WidgetSet to a smaller new WidgetSet
-		//		Works the same as `dojo.filter` and `dojo.NodeList.filter`
-		//		
-		// filter:
-		//		Callback function to test truthiness.
-		//
-		// example:
-		//		Arbitrary: select the odd widgets in this list
-		//		|	var i = 0;
-		//		|	dijit.registry.filter(function(w){
-		//		|		return ++i % 2 == 0;
-		//		|	}).forEach(function(w){ /* odd ones */ });
-
-		var res = new dijit.WidgetSet();
-		this.forEach(function(widget){
-			if(filter(widget)){ res.add(widget); }
-		});
-		return res; // dijit.WidgetSet
-	},
-
-	byId: function(/*String*/ id){
-		// summary:
-		//		Find a widget in this list by it's id. 
-		// example:
-		//		Test if an id is in a particular WidgetSet
-		//		| var ws = new dijit.WidgetSet();
-		//		| ws.add(dijit.byId("bar"));
-		//		| var t = ws.byId("bar") // returns a widget
-		//		| var x = ws.byId("foo"); // returns undefined
-		
-		return this._hash[id];	// dijit._Widget
-	},
-
-	byClass: function(/*String*/ cls){
-		// summary:
-		//		Reduce this widgetset to a new WidgetSet of a particular declaredClass
-		// 
-		// example:
-		//		Find all titlePane's in a page:
-		//		|	dijit.registry.byClass("dijit.TitlePane").forEach(function(tp){ tp.close(); });
-		
-		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
-};
-
-dijit.findWidgets = function(/*DomNode*/ root){
-	// summary:
-	//		Search subtree under root, putting found widgets in outAry.
-	//		Doesn't search for nested widgets (ie, widgets inside other widgets)
-	
-	var outAry = [];
-
-	function getChildrenHelper(root){
-		var list = dojo.isIE ? root.children : root.childNodes, i = 0, node;
-		while(node = list[i++]){
-			if(node.nodeType != 1){ continue; }
-			var widgetId = node.getAttribute("widgetId");
-			if(widgetId){
-				var widget = dijit.byId(widgetId);
-				outAry.push(widget);
-			}else{
-				getChildrenHelper(node);
-			}
-		}
-	}
-
-	getChildrenHelper(root);
-	return outAry;
-};
-
-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.addOnWindowUnload(function(){
-		dojo.forEach(dijit.findWidgets(dojo.body()), function(widget){
-			if(widget.destroyRecursive){
-				widget.destroyRecursive();
-			}else if(widget.destroy){
-				widget.destroy();
-			}
-		});
-	});
-}
-
-dijit.byId = function(/*String|Widget*/id){
-	// summary:
-	//		Returns a widget by it's 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 corresponding to the given DOMNode
-	return dijit.registry.byId(node.getAttribute("widgetId")); // Widget
-};
-
-dijit.getEnclosingWidget = function(/* DOMNode */ node){
-	// summary:
-	//		Returns the widget whose DOM tree contains the specified DOMNode, or null if
-	//		the node is not contained within the DOM tree of any widget
-	while(node){
-		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")
-		&& (dojo.attr(elem, "type") != "hidden");
-}
-
-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 descendants of the specified root node.
-	//
-	// description:
-	//		Finds the following descendants of the specified root node:
-	//		* the first tab-navigable element in document order
-	//		  without a tabindex or with tabindex="0"
-	//		* the last tab-navigable element in document order
-	//		  without a tabindex or with tabindex="0"
-	//		* the first element in document order with the lowest
-	//		  positive tabindex value
-	//		* the last element in document order with the highest
-	//		  positive tabindex value
-	var first, last, lowest, lowestTabindex, highest, highestTabindex;
-	var walkTree = function(/*DOMNode*/parent){
-		dojo.query("> *", parent).forEach(function(child){
-			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;
-					}
+				widget._hasBeenBlurred = true;
+				if(widget._onBlur){
+					widget._onBlur(by);
+				}
+				if(widget._setStateClass){
+					widget._setStateClass();
 				}
+				dojo.publish("widgetBlur", [widget, by]);
 			}
-			if(isShown && child.nodeName.toUpperCase() != 'SELECT'){ 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; // DomNode
-};
-
-dijit.getLastInTabbingOrder = function(/*String|DOMNode*/root){
-	// summary:
-	//		Finds the descendant of the specified root node
-	//		that is last in the tabbing order
-	var elems = dijit._getTabNavigable(dojo.byId(root));
-	return elems.last ? elems.last : elems.highest; // DomNode
-};
+		}
 
-/*=====
-dojo.mixin(dijit, {
-	// defaultDuration: Integer
-	//		The default animation speed (in ms) to use for all Dijit
-	//		transitional animations, unless otherwise specified 
-	//		on a per-instance basis. Defaults to 200, overrided by 
-	//		`djConfig.defaultDuration`
-	defaultDuration: 300
+		// for all element that have come into focus, send focus event
+		for(i=nCommon; i<newStack.length; i++){
+			widget = dijit.byId(newStack[i]);
+			if(widget){
+				widget._focused = true;
+				if(widget._onFocus){
+					widget._onFocus(by);
+				}
+				if(widget._setStateClass){
+					widget._setStateClass();
+				}
+				dojo.publish("widgetFocus", [widget, by]);
+			}
+		}
+	}
 });
-=====*/
 
-dijit.defaultDuration = dojo.config["defaultDuration"] || 200;
+// register top window and all the iframes it contains
+dojo.addOnLoad(function(){
+	var handle = dijit.registerWin(window);
+	if(dojo.isIE){
+		dojo.addOnWindowUnload(function(){
+			dijit.unregisterWin(handle);
+			handle = null;
+		})
+	}
+});
 
 }
 
@@ -848,10 +1102,10 @@ dijit.placeOnScreen = function(
 	/* dijit.__Position */	pos,
 	/* String[] */			corners,
 	/* dijit.__Position? */	padding){
-	//	summary:
+	// summary:
 	//		Positions one of the node's corners at specified position
 	//		such that node is fully visible in viewport.
-	//	description:
+	// description:
 	//		NOTE: node is assumed to be absolutely or relatively positioned.
 	//	pos:
 	//		Object like {x: 10, y: 20}
@@ -864,7 +1118,7 @@ dijit.placeOnScreen = function(
 	//			* "TR" - top right
 	//	padding:
 	//		set padding to put some buffer around the element you want to position.
-	//	example:	
+	// example:
 	//		Try to place node's top right corner at (10,20).
 	//		If that makes node go (partially) off screen, then try placing
 	//		bottom left corner at (10,20).
@@ -876,7 +1130,7 @@ dijit.placeOnScreen = function(
 			c.pos.x += corner.charAt(1) == 'L' ? padding.x : -padding.x;
 			c.pos.y += corner.charAt(0) == 'T' ? padding.y : -padding.y;
 		}
-		return c; 
+		return c;
 	});
 
 	return dijit._place(node, choices);
@@ -928,10 +1182,10 @@ dijit._place = function(/*DomNode*/ node, /* Array */ choices, /* Function */ la
 
 		// 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),
+		var startX = Math.max(view.l, corner.charAt(1) == 'L' ? pos.x : (pos.x - mb.w)),
+			startY = Math.max(view.t, corner.charAt(0) == 'T' ? pos.y : (pos.y - mb.h)),
+			endX = Math.min(view.l + view.w, corner.charAt(1) == 'L' ? (startX + mb.w) : pos.x),
+			endY = Math.min(view.t + view.h, corner.charAt(0) == 'T' ? (startY + mb.h) : pos.y),
 			width = endX - startX,
 			height = endY - startY,
 			overflow = (mb.w - width) + (mb.h - height);
@@ -978,7 +1232,7 @@ dijit.placeOnScreenAroundNode = function(
 	//		where the key corresponds to the aroundNode's corner, and
 	//		the value corresponds to the node's corner:
 	//
-	//	|	{ aroundNodeCorner1: nodeCorner1, aroundNodeCorner2: nodeCorner2,  ...}
+	//	|	{ aroundNodeCorner1: nodeCorner1, aroundNodeCorner2: nodeCorner2, ...}
 	//
 	//		The following strings are used to represent the four corners:
 	//			* "BL" - bottom left
@@ -991,7 +1245,7 @@ dijit.placeOnScreenAroundNode = function(
 	//		based on their orientation relative to the parent.   This adjusts the popup based on orientation.
 	//
 	// example:
-	//	|	dijit.placeOnScreenAroundNode(node, aroundNode, {'BL':'TL', 'TR':'BR'}); 
+	//	|	dijit.placeOnScreenAroundNode(node, aroundNode, {'BL':'TL', 'TR':'BR'});
 	//		This will try to position node such that node's top-left corner is at the same position
 	//		as the bottom left corner of the aroundNode (ie, put node below
 	//		aroundNode, with left edges aligned).  If that fails it will try to put
@@ -1004,14 +1258,12 @@ dijit.placeOnScreenAroundNode = function(
 	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);
+	var aroundNodePos = dojo.position(aroundNode, true);
 	aroundNode.style.display=oldDisplay;
 
 	// place the node around the calculated rectangle
-	return dijit._placeOnScreenAroundRect(node, 
-		aroundNodePos.x, aroundNodePos.y, aroundNodeW, aroundNodeH,	// rectangle
+	return dijit._placeOnScreenAroundRect(node,
+		aroundNodePos.x, aroundNodePos.y, aroundNodePos.w, aroundNodePos.h,	// rectangle
 		aroundCorners, layoutNode);
 };
 
@@ -1026,9 +1278,9 @@ dijit.__Rectangle = function(){
 	// height: Integer
 	//		height in pixels
 
-	thix.x = x;
+	this.x = x;
 	this.y = y;
-	thix.width = width;
+	this.width = width;
 	this.height = height;
 }
 =====*/
@@ -1045,7 +1297,7 @@ dijit.placeOnScreenAroundRectangle = function(
 	//		parameter is an arbitrary rectangle on the screen (x, y, width, height)
 	//		instead of a dom node.
 
-	return dijit._placeOnScreenAroundRect(node, 
+	return dijit._placeOnScreenAroundRect(node,
 		aroundRect.x, aroundRect.y, aroundRect.width, aroundRect.height,	// rectangle
 		aroundCorners, layoutNode);
 };
@@ -1081,7 +1333,7 @@ dijit._placeOnScreenAroundRect = function(
 	return dijit._place(node, choices, layoutNode);
 };
 
-dijit.placementRegistry = new dojo.AdapterRegistry();
+dijit.placementRegistry= new dojo.AdapterRegistry();
 dijit.placementRegistry.register("node",
 	function(n, x){
 		return typeof x == "object" &&
@@ -1108,6 +1360,97 @@ dijit.placeOnScreenAroundElement = function(
 	return dijit.placementRegistry.match.apply(dijit.placementRegistry, arguments);
 };
 
+dijit.getPopupAlignment = function(/*Array*/ position, /*Boolean*/ leftToRight){
+	// summary:
+	//		Transforms the passed array of preferred positions into a format suitable for passing as the aroundCorners argument to dijit.placeOnScreenAroundElement.
+	//
+	// position: String[]
+	//		This variable controls the position of the drop down.
+	//		It's an array of strings with the following values:
+	//
+	//			* before: places drop down to the left of the target node/widget, or to the right in
+	//			  the case of RTL scripts like Hebrew and Arabic
+	//			* after: places drop down to the right of the target node/widget, or to the left in
+	//			  the case of RTL scripts like Hebrew and Arabic
+	//			* above: drop down goes above target node
+	//			* below: drop down goes below target node
+	//
+	//		The list is positions is tried, in order, until a position is found where the drop down fits
+	//		within the viewport.
+	//
+	// leftToRight: Boolean
+	//		Whether the popup will be displaying in leftToRight mode.
+	//
+	var align = {};
+	dojo.forEach(position, function(pos){
+		switch(pos){
+			case "after":
+				align[leftToRight ? "BR" : "BL"] = leftToRight ? "BL" : "BR";
+				break;
+			case "before":
+				align[leftToRight ? "BL" : "BR"] = leftToRight ? "BR" : "BL";
+				break;
+			case "below":
+				// first try to align left borders, next try to align right borders (or reverse for RTL mode)
+				align[leftToRight ? "BL" : "BR"] = leftToRight ? "TL" : "TR";
+				align[leftToRight ? "BR" : "BL"] = leftToRight ? "TR" : "TL";
+				break;
+			case "above":
+			default:
+				// first try to align left borders, next try to align right borders (or reverse for RTL mode)
+				align[leftToRight ? "TL" : "TR"] = leftToRight ? "BL" : "BR";
+				align[leftToRight ? "TR" : "TL"] = leftToRight ? "BR" : "BL";
+				break;
+		}
+	});
+	return align;
+};
+dijit.getPopupAroundAlignment = function(/*Array*/ position, /*Boolean*/ leftToRight){
+	// summary:
+	//		Transforms the passed array of preferred positions into a format suitable for passing as the aroundCorners argument to dijit.placeOnScreenAroundElement.
+	//
+	// position: String[]
+	//		This variable controls the position of the drop down.
+	//		It's an array of strings with the following values:
+	//
+	//			* before: places drop down to the left of the target node/widget, or to the right in
+	//			  the case of RTL scripts like Hebrew and Arabic
+	//			* after: places drop down to the right of the target node/widget, or to the left in
+	//			  the case of RTL scripts like Hebrew and Arabic
+	//			* above: drop down goes above target node
+	//			* below: drop down goes below target node
+	//
+	//		The list is positions is tried, in order, until a position is found where the drop down fits
+	//		within the viewport.
+	//
+	// leftToRight: Boolean
+	//		Whether the popup will be displaying in leftToRight mode.
+	//
+	var align = {};
+	dojo.forEach(position, function(pos){
+		switch(pos){
+			case "after":
+				align[leftToRight ? "BR" : "BL"] = leftToRight ? "BL" : "BR";
+				break;
+			case "before":
+				align[leftToRight ? "BL" : "BR"] = leftToRight ? "BR" : "BL";
+				break;
+			case "below":
+				// first try to align left borders, next try to align right borders (or reverse for RTL mode)
+				align[leftToRight ? "BL" : "BR"] = leftToRight ? "TL" : "TR";
+				align[leftToRight ? "BR" : "BL"] = leftToRight ? "TR" : "TL";
+				break;
+			case "above":
+			default:
+				// first try to align left borders, next try to align right borders (or reverse for RTL mode)
+				align[leftToRight ? "TL" : "TR"] = leftToRight ? "BL" : "BR";
+				align[leftToRight ? "TR" : "TL"] = leftToRight ? "BR" : "BL";
+				break;
+		}
+	});
+	return align;
+};
+
 }
 
 if(!dojo._hasResource["dijit._base.window"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
@@ -1158,9 +1501,10 @@ dijit.popup = new function(){
 		beginZIndex=1000,
 		idGen = 1;
 
-	this.prepare = function(/*DomNode*/ node){
+	this.moveOffScreen = function(/*DomNode*/ node){
 		// summary:
-		//		Prepares a node to be used as a popup
+		//		Moves node offscreen without hiding it (so that all layout widgets included 
+		//		in this node can still layout properly)
 		//
 		// description:
 		//		Attaches node to dojo.doc.body, and
@@ -1192,7 +1536,7 @@ dijit.popup.__OpenArgs = function(){
 	// y: Integer
 	//		Absolute vertical position (in pixels) to place node at.  (Specity this *or* "around" parameter.)
 	// orient: Object || String
-	//		When the around parameter is specified, orient should be an 
+	//		When the around parameter is specified, orient should be an
 	//		ordered list of tuples of the form (around-node-corner, popup-node-corner).
 	//		dijit.popup.open() tries to position the popup according to each tuple in the list, in order,
 	//		until the popup appears fully within the viewport.
@@ -1233,6 +1577,17 @@ dijit.popup.__OpenArgs = function(){
 	this.padding = padding;
 }
 =====*/
+
+	// 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];
+	};
+
+	var wrappers=[];
 	this.open = function(/*dijit.popup.__OpenArgs*/ args){
 		// summary:
 		//		Popup the widget at the specified position
@@ -1243,36 +1598,48 @@ dijit.popup.__OpenArgs = function(){
 		//
 		// example:
 		//		opening the widget as a dropdown
-		//		|		dijit.popup.open({parent: this, popup: menuWidget, around: this.domNode, onClose: function(){...}  });
+		//		|		dijit.popup.open({parent: this, popup: menuWidget, around: this.domNode, onClose: function(){...}});
 		//
 		//		Note that whatever widget called dijit.popup.open() should also listen to its own _onBlur callback
 		//		(fired from _base/focus.js) to know that focus has moved somewhere else and thus the popup should be closed.
 
 		var widget = args.popup,
-			orient = args.orient || {'BL':'TL', 'TL':'BL'},
+			orient = args.orient || (
+				dojo._isBodyLtr() ?
+				{'BL':'TL', 'BR':'TR', 'TL':'BL', 'TR':'BR'} :
+				{'BR':'TR', 'BL':'TL', 'TR':'BR', 'TL':'BL'}
+			),
 			around = args.around,
 			id = (args.around && args.around.id) ? (args.around.id+"_dropdown") : ("popup_"+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.create("div",{
-			id: id, 
-			"class":"dijitPopup",
-			style:{
-				zIndex: beginZIndex + stack.length,
-				visibility:"hidden"
-			}
-		}, dojo.body());
-		dijit.setWaiRole(wrapper, "presentation");
-		
-		// prevent transient scrollbar causing misalign (#5776)
-		wrapper.style.left = wrapper.style.top = "0px";		
 
-		if(args.parent){
-			wrapper.dijitPopupParent=args.parent.id;
+		var wrapperobj = wrappers.pop(), wrapper, iframe;
+		if(!wrapperobj){
+			wrapper = dojo.create("div",{
+				"class":"dijitPopup"
+			}, dojo.body());
+			dijit.setWaiRole(wrapper, "presentation");
+		}else{
+			// recycled a old wrapper, so that we don't need to reattach the iframe
+			// which is slow even if the iframe is empty, see #10167
+			wrapper = wrapperobj[0];
+			iframe = wrapperobj[1];
 		}
 
+		dojo.attr(wrapper,{
+			id: id,
+			style:{
+				zIndex: beginZIndex + stack.length,
+				visibility:"hidden",
+				// prevent transient scrollbar causing misalign (#5776), and initial flash in upper left (#10111)
+				top: "-9999px"
+			},
+			dijitPopupParent: args.parent ? args.parent.id : ""
+		});
+
 		var s = widget.domNode.style;
 		s.display = "";
 		s.visibility = "";
@@ -1280,7 +1647,11 @@ dijit.popup.__OpenArgs = function(){
 		s.top = "0px";
 		wrapper.appendChild(widget.domNode);
 
-		var iframe = new dijit.BackgroundIframe(wrapper);
+		if(!iframe){
+			iframe = new dijit.BackgroundIframe(wrapper);
+		}else{
+			iframe.resize(wrapper)
+		}
 
 		// position the wrapper node
 		var best = around ?
@@ -1292,15 +1663,6 @@ dijit.popup.__OpenArgs = function(){
 
 		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){
@@ -1319,10 +1681,10 @@ dijit.popup.__OpenArgs = function(){
 		// 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, "onCancel", args.onCancel));
 		}
 
-		handlers.push(dojo.connect(widget, widget.onExecute ? "onExecute" : "onChange", null, function(){
+		handlers.push(dojo.connect(widget, widget.onExecute ? "onExecute" : "onChange", function(){
 			var topPopup = getTopPopup();
 			if(topPopup && topPopup.onExecute){
 				topPopup.onExecute();
@@ -1341,35 +1703,46 @@ dijit.popup.__OpenArgs = function(){
 		});
 
 		if(widget.onOpen){
+			// TODO: in 2.0 standardize onShow() (used by StackContainer) and onOpen() (used here)
 			widget.onOpen(best);
 		}
 
 		return best;
 	};
 
-	this.close = function(/*Widget*/ popup){
+	this.close = function(/*dijit._Widget*/ popup){
 		// summary:
 		//		Close specified popup and any popups that it parented
+		
+		// Basically work backwards from the top of the stack closing popups
+		// until we hit the specified popup, but IIRC there was some issue where closing
+		// a popup would cause others to close too.  Thus if we are trying to close B in [A,B,C]
+		// closing C might close B indirectly and then the while() condition will run where stack==[A]...
+		// so the while condition is constructed defensively.
 		while(dojo.some(stack, function(elem){return elem.widget == popup;})){
 			var top = stack.pop(),
 				wrapper = top.wrapper,
 				iframe = top.iframe,
 				widget = top.widget,
 				onClose = top.onClose;
-	
+
 			if(widget.onClose){
+				// TODO: in 2.0 standardize onHide() (used by StackContainer) and onClose() (used here)
 				widget.onClose();
 			}
 			dojo.forEach(top.handlers, dojo.disconnect);
-	
-			// #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.destroy(wrapper);
-	
+			// Move the widget offscreen, unless it has already been destroyed in above onClose() etc.
+			if(widget && widget.domNode){
+				this.moveOffScreen(widget.domNode);
+			}
+                        
+			// recycle the wrapper plus iframe, so we prevent reattaching iframe everytime an popup opens
+			// don't use moveOffScreen which would also reattach the wrapper to body, which causes reloading of iframe
+			wrapper.style.top = "-9999px";
+			wrapper.style.visibility = "hidden";
+			wrappers.push([wrapper,iframe]);
+
 			if(onClose){
 				onClose();
 			}
@@ -1378,7 +1751,8 @@ dijit.popup.__OpenArgs = function(){
 }();
 
 dijit._frames = new function(){
-	// summary: cache of iframes
+	// summary:
+	//		cache of iframes
 	var queue = [];
 
 	this.pop = function(){
@@ -1397,19 +1771,15 @@ dijit._frames = new function(){
 			 	iframe = dojo.create("iframe");
 				iframe.src = 'javascript:""';
 				iframe.className = "dijitBackgroundIframe";
+				dojo.style(iframe, "opacity", 0.1);
 			}
 			iframe.tabIndex = -1; // Magic to prevent iframe from getting focus on tab keypress - as style didnt work.
-			dojo.body().appendChild(iframe);
 		}
 		return iframe;
 	};
 
 	this.push = function(iframe){
 		iframe.style.display="none";
-		if(dojo.isIE){
-			iframe.style.removeExpression("width");
-			iframe.style.removeExpression("height");
-		}
 		queue.push(iframe);
 	}
 }();
@@ -1417,7 +1787,7 @@ dijit._frames = new function(){
 
 dijit.BackgroundIframe = function(/* DomNode */node){
 	// summary:
-	//		For IE z-index schenanigans. id attribute is required.
+	//		For IE/FF z-index schenanigans. id attribute is required.
 	//
 	// description:
 	//		new dijit.BackgroundIframe(node)
@@ -1425,20 +1795,46 @@ dijit.BackgroundIframe = function(/* DomNode */node){
 	//			area (and position) of node
 
 	if(!node.id){ throw new Error("no id"); }
-	if(dojo.isIE < 7 || (dojo.isFF < 3 && dojo.hasClass(dojo.body(), "dijit_a11y"))){
+	if(dojo.isIE || dojo.isMoz){
 		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");
+		if(dojo.isIE<7){
+			this.resize(node);
+			this._conn = dojo.connect(node, 'onresize', this, function(){
+				this.resize(node);
+			});
+		}else{
+			dojo.style(iframe, {
+				width: '100%',
+				height: '100%'
+			});
 		}
 		this.iframe = iframe;
 	}
 };
 
 dojo.extend(dijit.BackgroundIframe, {
+	resize: function(node){
+		// summary:
+		// 		resize the iframe so its the same size as node
+		// description:
+		//		this function is a no-op in all browsers except
+		//		IE6, which does not support 100% width/height 
+		//		of absolute positioned iframes
+		if(this.iframe && dojo.isIE<7){
+			dojo.style(this.iframe, {
+				width: node.offsetWidth + 'px',
+				height: node.offsetHeight + 'px'
+			});
+		}
+	},
 	destroy: function(){
-		//	summary: destroy the iframe
+		// summary:
+		//		destroy the iframe
+		if(this._conn){
+			dojo.disconnect(this._conn);
+			this._conn = null;
+		}
 		if(this.iframe){
 			dijit._frames.push(this.iframe);
 			delete this.iframe;
@@ -1452,221 +1848,96 @@ if(!dojo._hasResource["dijit._base.scroll"]){ //_hasResource checks added by bui
 dojo._hasResource["dijit._base.scroll"] = true;
 dojo.provide("dijit._base.scroll");
 
-dijit.scrollIntoView = function(/* DomNode */node){
+dijit.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){
 	// summary:
-	//		Scroll the passed node into view, if it is not.
-
+	//		Scroll the passed node into view, if it is not already.
+	
 	// 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
-	// 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 testdir="H"; //debug
+
 	try{ // catch unexpected/unrecreatable errors (#7808) since we can recover using a semi-acceptable native method
 	node = dojo.byId(node);
-	var doc = dojo.doc;
-	var body = dojo.body();
-	var html = body.parentNode;
-	// if FF2 (which is perfect) or an untested browser, then use the native method
-
-	if((!(dojo.isFF >= 3 || dojo.isIE || dojo.isWebKit) || node == body || node == html) && (typeof node.scrollIntoView == "function")){ // FF2 is perfect, too bad FF3 is not
+	var doc = node.ownerDocument || dojo.doc,
+		body = doc.body || dojo.body(),
+		html = doc.documentElement || body.parentNode,
+		isIE = dojo.isIE, isWK = dojo.isWebKit;
+	// if an untested browser, then use the native method
+	if((!(dojo.isMoz || isIE || isWK) || node == body || node == html) && (typeof node.scrollIntoView != "undefined")){
 		node.scrollIntoView(false); // short-circuit to native if possible
 		return;
 	}
-	var ltr = dojo._isBodyLtr();
-	var isIE8strict = dojo.isIE >= 8 && !compatMode;
-	var rtl = !ltr && !isIE8strict; // IE8 flips scrolling so pretend it's ltr
-	// body and html elements are all messed up due to browser bugs and inconsistencies related to doctype
-	// normalize the values before proceeding (FF2 is not listed since its native behavior is perfect)
-	// for computation simplification, client and offset width and height are the same for body and html
-	// strict:       html:       |      body:       | compatMode:
-	//           width   height  |  width   height  |------------
-	//    ie*:  clientW  clientH | scrollW  clientH | CSS1Compat
-	//    ff3:  clientW  clientH |HscrollW  clientH | CSS1Compat
-	//    sf3:  clientW  clientH | clientW HclientH | CSS1Compat
-	//    op9:  clientW  clientH |HscrollW  clientH | CSS1Compat
-	// ---------------------------------------------|-----------
-	//   none:        html:      |      body:       |
-	//           width    height |  width   height  |
-	//    ie*: BclientW BclientH | clientW  clientH | BackCompat
-	//    ff3: BclientW BclientH | clientW  clientH | BackCompat
-	//    sf3:  clientW  clientH | clientW HclientH | CSS1Compat
-	//    op9: BclientW BclientH | clientW  clientH | BackCompat
-	// ---------------------------------------------|-----------
-	//  loose:        html:      |      body:       |
-	//           width    height |  width   height  |
-	//    ie*:  clientW  clientH | scrollW  clientH | CSS1Compat
-	//    ff3: BclientW BclientH | clientW  clientH | BackCompat
-	//    sf3:  clientW  clientH | clientW HclientH | CSS1Compat
-	//    op9:  clientW  clientH |HscrollW  clientH | CSS1Compat
-	var scrollRoot = body;
-	var compatMode = doc.compatMode == 'BackCompat';
-	if(compatMode){ // BODY is scrollable, HTML has same client size
-		// body client values already OK
-		html._offsetWidth = html._clientWidth = body._offsetWidth = body.clientWidth;
-		html._offsetHeight = html._clientHeight = body._offsetHeight = body.clientHeight;
-	}else{
-		if(dojo.isWebKit){
-			body._offsetWidth = body._clientWidth  = html.clientWidth;
-			body._offsetHeight = body._clientHeight = html.clientHeight;
-		}else{
-			scrollRoot = html;
-		}
-		html._offsetHeight = html.clientHeight;
-		html._offsetWidth  = html.clientWidth;
-	}
-
-	function isFixedPosition(element){
-		var ie = dojo.isIE;
-		return ((ie <= 6 || (ie >= 7 && compatMode))? false : (dojo.style(element, 'position').toLowerCase() == "fixed"));
-	}
-
-	function addPseudoAttrs(element){
-		var parent = element.parentNode;
-		var offsetParent = element.offsetParent;
-		if(offsetParent == null || isFixedPosition(element)){ // position:fixed has no real offsetParent
-			offsetParent = html; // prevents exeptions
-			parent = (element == body)? html : null;
-		}
-		// all the V/H object members below are to reuse code for both directions
-		element._offsetParent = offsetParent;
-		element._parent = parent;
-		//
-		//
-		var bp = dojo._getBorderExtents(element);
-		element._borderStart = { H:(isIE8strict && !ltr)? (bp.w-bp.l):bp.l, V:bp.t };
-		element._borderSize = { H:bp.w, V:bp.h };
-		element._scrolledAmount = { H:element.scrollLeft, V:element.scrollTop };
-		element._offsetSize = { H: element._offsetWidth||element.offsetWidth, V: element._offsetHeight||element.offsetHeight };
-		//
-		// IE8 flips everything in rtl mode except offsetLeft and borderLeft - so manually change offsetLeft to offsetRight here 
-		element._offsetStart = { H:(isIE8strict && !ltr)? offsetParent.clientWidth-element.offsetLeft-element._offsetSize.H:element.offsetLeft, V:element.offsetTop };
-		//
-		element._clientSize = { H:element._clientWidth||element.clientWidth, V:element._clientHeight||element.clientHeight };
-		if(element != body && element != html && element != node){
-			for(var dir in element._offsetSize){ // for both x and y directions
-				var scrollBarSize = element._offsetSize[dir] - element._clientSize[dir] - element._borderSize[dir];
-				//if(dir==testdir)
-				var hasScrollBar = element._clientSize[dir] > 0 && scrollBarSize > 0; // can't check for a specific scrollbar size since it changes dramatically as you zoom
-				//if(dir==testdir)
-				if(hasScrollBar){
-					element._offsetSize[dir] -= scrollBarSize;
-					if(dojo.isIE && rtl && dir=="H"){ element._offsetStart[dir] += scrollBarSize; }
-				}
-			}
-		}
-	}
-
-	var element = node;
-	while(element != null){
-		if(isFixedPosition(element)){ node.scrollIntoView(false); return; } //TODO: handle without native call
-		addPseudoAttrs(element);
-		element = element._parent;
-	}
-	if(dojo.isIE && node._parent){ // if no parent, then offsetParent._borderStart may not tbe set
-		var offsetParent = node._offsetParent;
-		//
-		node._offsetStart.H += offsetParent._borderStart.H;
-		node._offsetStart.V += offsetParent._borderStart.V;
-	}
-	if(dojo.isIE >= 7 && scrollRoot == html && rtl && body._offsetStart && body._offsetStart.H == 0){ // IE7 bug
-		var scroll = html.scrollWidth - html._offsetSize.H;
-		if(scroll > 0){
-			//
-			body._offsetStart.H = -scroll;
-		}
-	}
-	if(dojo.isIE <= 6 && !compatMode){
-		html._offsetSize.H += html._borderSize.H;
-		html._offsetSize.V += html._borderSize.V;
-	}
-	// eliminate offsetLeft/Top oddities by tweaking scroll for ease of computation
-	if(rtl && body._offsetStart && scrollRoot == html && html._scrolledAmount){
-		var ofs = body._offsetStart.H;
-		if(ofs < 0){
-			html._scrolledAmount.H += ofs;
-			body._offsetStart.H = 0;
-		}
-	}
-	element = node;
-	while(element){
-		var parent = element._parent;
-		if(!parent){ break; }
-			//
-			if(parent.tagName == "TD"){
-				var table = parent._parent._parent._parent; // point to TABLE
-				if(parent != element._offsetParent && parent._offsetParent != element._offsetParent){
-					parent = table; // child of TD has the same offsetParent as TABLE, so skip TD, TR, and TBODY (ie. verticalslider)
-				}
+	var backCompat = doc.compatMode == 'BackCompat',
+		clientAreaRoot = backCompat? body : html,
+		scrollRoot = isWK ? body : clientAreaRoot,
+		rootWidth = clientAreaRoot.clientWidth,
+		rootHeight = clientAreaRoot.clientHeight,
+		rtl = !dojo._isBodyLtr(),
+		nodePos = pos || dojo.position(node),
+		el = node.parentNode,
+		isFixed = function(el){
+			return ((isIE <= 6 || (isIE && backCompat))? false : (dojo.style(el, 'position').toLowerCase() == "fixed"));
+		};
+	if(isFixed(node)){ return; } // nothing to do
+	while(el){
+		if(el == body){ el = scrollRoot; }
+		var elPos = dojo.position(el),
+			fixedPos = isFixed(el);
+		with(elPos){
+			if(el == scrollRoot){
+				w = rootWidth, h = rootHeight;
+				if(scrollRoot == html && isIE && rtl){ x += scrollRoot.offsetWidth-w; } // IE workaround where scrollbar causes negative x
+				if(x < 0 || !isIE){ x = 0; } // IE can have values > 0
+				if(y < 0 || !isIE){ y = 0; }
+			}else{
+				var pb = dojo._getPadBorderExtents(el);
+				w -= pb.w; h -= pb.h; x += pb.l; y += pb.t;
 			}
-			// check if this node and its parent share the same offsetParent
-			var relative = element._offsetParent == parent;
-			//
-			for(var dir in element._offsetStart){ // for both x and y directions
-				var otherDir = dir=="H"? "V" : "H";
-				if(rtl && dir=="H" && (parent != html) && (parent != body) && (dojo.isIE || dojo.isWebKit) && parent._clientSize.H > 0 && parent.scrollWidth > parent._clientSize.H){ // scroll starts on the right
-					var delta = parent.scrollWidth - parent._clientSize.H;
-					//
-					if(delta > 0){
-						parent._scrolledAmount.H -= delta;
-					} // match FF3 which has cool negative scrollLeft values
-				}
-				if(parent._offsetParent.tagName == "TABLE"){ // make it consistent
-					if(dojo.isIE){ // make it consistent with Safari and FF3 and exclude the starting TABLE border of TABLE children
-						parent._offsetStart[dir] -= parent._offsetParent._borderStart[dir];
-						parent._borderStart[dir] = parent._borderSize[dir] = 0;
+			with(el){
+				if(el != scrollRoot){ // body, html sizes already have the scrollbar removed
+					var clientSize = clientWidth,
+						scrollBarSize = w - clientSize;
+					if(clientSize > 0 && scrollBarSize > 0){
+						w = clientSize;
+						if(isIE && rtl){ x += scrollBarSize; }
 					}
-					else{
-						parent._offsetStart[dir] += parent._offsetParent._borderStart[dir];
+					clientSize = clientHeight;
+					scrollBarSize = h - clientSize;
+					if(clientSize > 0 && scrollBarSize > 0){
+						h = clientSize;
 					}
 				}
-				//if(dir==testdir)
-				if(dojo.isIE){
-					//if(dir==testdir)
-					parent._offsetStart[dir] += parent._offsetParent._borderStart[dir];
+				if(fixedPos){ // bounded by viewport, not parents
+					if(y < 0){
+						h += y, y = 0;
+					}
+					if(x < 0){
+						w += x, x = 0;
+					}
+					if(y + h > rootHeight){
+						h = rootHeight - y;
+					}
+					if(x + w > rootWidth){
+						w = rootWidth - x;
+					}
 				}
-				//if(dir==testdir)
-				// underflow = visible gap between parent and this node taking scrolling into account
-				// if negative, part of the node is obscured by the parent's beginning and should be scrolled to become visible
-				var underflow = element._offsetStart[dir] - parent._scrolledAmount[dir] - (relative? 0 : parent._offsetStart[dir]) - parent._borderStart[dir];
-				// if overflow is positive, number of pixels obscured by the parent's end
-				var overflow = underflow + element._offsetSize[dir] - parent._offsetSize[dir] + parent._borderSize[dir];
-				//if(dir==testdir)
-				var scrollAttr = (dir=="H")? "scrollLeft" : "scrollTop";
-				// see if we should scroll forward or backward
-				var reverse = dir=="H" && rtl; // flip everything
-				var underflowScroll = reverse? -overflow : underflow;
-				var overflowScroll = reverse? -underflow : overflow;
-				// don't scroll if the over/underflow signs are opposite since that means that
-				// the node extends beyond parent's boundary in both/neither directions
-				var scrollAmount = (underflowScroll*overflowScroll <= 0)? 0 : Math[(underflowScroll < 0)? "max" : "min"](underflowScroll, overflowScroll);
-				//if(dir==testdir)
-				if(scrollAmount != 0){
-					var oldScroll = parent[scrollAttr];
-					parent[scrollAttr] += (reverse)? -scrollAmount : scrollAmount; // actually perform the scroll
-					var scrolledAmount = parent[scrollAttr] - oldScroll; // in case the scroll failed
-					//if(dir==testdir)
+				// calculate overflow in all 4 directions
+				var l = nodePos.x - x, // beyond left: < 0
+					t = nodePos.y - Math.max(y, 0), // beyond top: < 0
+					r = l + nodePos.w - w, // beyond right: > 0
+					bot = t + nodePos.h - h; // beyond bottom: > 0
+				if(r * l > 0){
+					var s = Math[l < 0? "max" : "min"](l, r);
+					nodePos.x += scrollLeft;
+					scrollLeft += (isIE >= 8 && !backCompat && rtl)? -s : s;
+					nodePos.x -= scrollLeft;
 				}
-				if(relative){
-					element._offsetStart[dir] += parent._offsetStart[dir];
+				if(bot * t > 0){
+					nodePos.y += scrollTop;
+					scrollTop += Math[t < 0? "max" : "min"](t, bot);
+					nodePos.y -= scrollTop;
 				}
-				element._offsetStart[dir] -= parent[scrollAttr];
 			}
-			element._parent = parent._parent;
-			element._offsetParent = parent._offsetParent;
-	}
-	parent = node;
-	var next;
-	while(parent && parent.removeAttribute){
-		next = parent.parentNode;
-		parent.removeAttribute('_offsetParent');
-		parent.removeAttribute('_parent');
-		parent = next;
+		}
+		el = (el != scrollRoot) && !fixedPos && el.parentNode;
 	}
 	}catch(error){
 		console.error('scrollIntoView: ' + error);
@@ -1694,7 +1965,7 @@ dojo._hasResource["dijit._base.sniff"] = true;
 dojo.provide("dijit._base.sniff");
 
 (function(){
-	
+
 	var d = dojo,
 		html = d.doc.documentElement,
 		ie = d.isIE,
@@ -1702,26 +1973,29 @@ dojo.provide("dijit._base.sniff");
 		maj = Math.floor,
 		ff = d.isFF,
 		boxModel = d.boxModel.replace(/-/,''),
+
 		classes = {
 			dj_ie: ie,
-//			dj_ie55: ie == 5.5,
 			dj_ie6: maj(ie) == 6,
 			dj_ie7: maj(ie) == 7,
+			dj_ie8: maj(ie) == 8,
 			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_webkit: d.isWebKit,
 			dj_safari: d.isSafari,
+			dj_chrome: d.isChrome,
+
 			dj_gecko: d.isMozilla,
-			dj_ff2: maj(ff) == 2,
 			dj_ff3: maj(ff) == 3
 		}; // no dojo unsupported browsers
-		
+
 	classes["dj_" + boxModel] = true;
-	
+
 	// apply browser, browser version, and box model class names
 	for(var p in classes){
 		if(classes[p]){
@@ -1746,7 +2020,7 @@ dojo.provide("dijit._base.sniff");
 			}
 		}
 	});
-	
+
 })();
 
 }
@@ -1765,16 +2039,22 @@ 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));
+		
+		// Schedule next event, reducing the timer a little bit each iteration, bottoming-out at 10 to avoid
+		// browser overload (particularly avoiding starving DOH robot so it never gets to send a mouseup)
+		this._currentTimeout = Math.max(
+			this._currentTimeout < 0 ? this._initialDelay :
+				(this._subsequentDelay > 1 ? this._subsequentDelay : Math.round(this._currentTimeout * this._subsequentDelay)),
+			10);
 		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.
+		//		Start a timed, repeating callback sequence.
+		//		If already started, the function call is ignored.
+		//		This method is not normally called by the user but can be
+		//		when the normal listener code is insufficient.
 		// evt:
 		//		key or mouse event object to pass to the user callback
 		// _this:
@@ -1812,7 +2092,7 @@ dijit.typematic = {
 
 	stop: function(){
 		// summary:
-		//	  Stop an ongoing timed, repeating callback sequence.
+		//		Stop an ongoing timed, repeating callback sequence.
 		if(this._timer){
 			clearTimeout(this._timer);
 			this._timer = null;
@@ -1857,8 +2137,9 @@ dijit.typematic = {
 			dojo.connect(node, "onkeypress", this, function(evt){
 				if(evt.charOrCode == keyObject.charOrCode &&
 				(keyObject.ctrlKey === undefined || keyObject.ctrlKey == evt.ctrlKey) &&
-				(keyObject.altKey === undefined || keyObject.altKey == evt.ctrlKey) &&
-				(keyObject.shiftKey === undefined || keyObject.shiftKey == evt.ctrlKey)){
+				(keyObject.altKey === undefined || keyObject.altKey == evt.altKey) &&
+				(keyObject.metaKey === undefined || keyObject.metaKey == (evt.metaKey || false)) && // IE doesn't even set metaKey
+				(keyObject.shiftKey === undefined || keyObject.shiftKey == evt.shiftKey)){
 					dojo.stopEvent(evt);
 					dijit.typematic.trigger(keyObject, _this, node, callback, keyObject, subsequentDelay, initialDelay);
 				}else if(dijit.typematic._obj == keyObject){
@@ -1955,7 +2236,7 @@ dijit.wai = {
 		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:)" ));
+			var needsA11y = (cs.borderTopColor == cs.borderRightColor) || (bkImg != null && (bkImg == "none" || bkImg == "url(invalid-url:)" ));
 			dojo[needsA11y ? "addClass" : "removeClass"](dojo.body(), "dijit_a11y");
 			if(dojo.isIE){
 				div.outerHTML = "";		// prevent mixed-content warning, see http://support.microsoft.com/kb/925014
@@ -1972,8 +2253,7 @@ if(dojo.isIE || dojo.isMoz){	// NOTE: checking in Safari messes things up
 	dojo._loaders.unshift(dijit.wai.onload);
 }
 
-dojo.mixin(dijit,
-{
+dojo.mixin(dijit, {
 	_XhtmlRoles: /banner|contentinfo|definition|main|navigation|search|note|secondary|seealso/,
 
 	hasWaiRole: function(/*Element*/ elem, /*String*/ role){
@@ -1981,9 +2261,9 @@ dojo.mixin(dijit,
 		//		Determines if an element has a particular non-XHTML role.
 		// returns:
 		//		True if elem has the specific non-XHTML role attribute and false if not.
-		// 		For backwards compatibility if role parameter not provided, 
-		// 		returns true if has non XHTML role 
-		var waiRole = this.getWaiRole(elem);		
+		// 		For backwards compatibility if role parameter not provided,
+		// 		returns true if has non XHTML role
+		var waiRole = this.getWaiRole(elem);
 		return role ? (waiRole.indexOf(role) > -1) : (waiRole.length > 0);
 	},
 
@@ -2000,21 +2280,18 @@ dojo.mixin(dijit,
 		// summary:
 		//		Sets the role on an element.
 		// description:
-		//		In other than FF2 replace existing role attribute with new role.
-		//		FF3 supports XHTML and ARIA roles so    
-		//		if elem already has an XHTML role, append this role to XHTML role 
+		//		Replace existing role attribute with new role.
+		//		If elem already has an XHTML role, append this role to XHTML role
 		//		and remove other ARIA roles.
-		//		On Firefox 2 and below, "wairole:" is
-		//		prepended to the provided role value.
 
 		var curRole = dojo.attr(elem, "role") || "";
-		if(dojo.isFF < 3 || !this._XhtmlRoles.test(curRole)){
-			dojo.attr(elem, "role", dojo.isFF < 3 ? "wairole:" + role : role);
+		if(!this._XhtmlRoles.test(curRole)){
+			dojo.attr(elem, "role", role);
 		}else{
 			if((" "+ curRole +" ").indexOf(" " + role + " ") < 0){
 				var clearXhtml = dojo.trim(curRole.replace(this._XhtmlRoles, ""));
-				var cleanRole = dojo.trim(curRole.replace(clearXhtml, ""));	 
-         		dojo.attr(elem, "role", cleanRole + (cleanRole ? ' ' : '') + role);
+				var cleanRole = dojo.trim(curRole.replace(clearXhtml, ""));
+				dojo.attr(elem, "role", cleanRole + (cleanRole ? ' ' : '') + role);
 			}
 		}
 	},
@@ -2024,14 +2301,13 @@ dojo.mixin(dijit,
 		//		Removes the specified non-XHTML role from an element.
 		// 		Removes role attribute if no specific role provided (for backwards compat.)
 
-		var roleValue = dojo.attr(elem, "role"); 
+		var roleValue = dojo.attr(elem, "role");
 		if(!roleValue){ return; }
 		if(role){
-			var searchRole = dojo.isFF < 3 ? "wairole:" + role : role;
-			var t = dojo.trim((" " + roleValue + " ").replace(" " + searchRole + " ", " "));
+			var t = dojo.trim((" " + roleValue + " ").replace(" " + role + " ", " "));
 			dojo.attr(elem, "role", t);
 		}else{
-			elem.removeAttribute("role");	
+			elem.removeAttribute("role");
 		}
 	},
 
@@ -2039,16 +2315,11 @@ dojo.mixin(dijit,
 		// 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.
+		//		Checks for an attribute called "aria-"+state.
 		// returns:
 		//		true if elem has a value for the given state and
 		//		false if it does not.
-		if(dojo.isFF < 3){
-			return elem.hasAttributeNS("http://www.w3.org/2005/07/aaa", state);
-		}
+
 		return elem.hasAttribute ? elem.hasAttribute("aria-"+state) : !!elem.getAttribute("aria-"+state);
 	},
 
@@ -2056,16 +2327,11 @@ dojo.mixin(dijit,
 		// 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.
+		//		Checks for an attribute called "aria-"+state.
 		// returns:
 		//		The value of the requested state on elem
 		//		or an empty string if elem has no value for state.
-		if(dojo.isFF < 3){
-			return elem.getAttributeNS("http://www.w3.org/2005/07/aaa", state);
-		}
+
 		return elem.getAttribute("aria-"+state) || "";
 	},
 
@@ -2073,31 +2339,18 @@ dojo.mixin(dijit,
 		// 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 < 3){
-			elem.setAttributeNS("http://www.w3.org/2005/07/aaa",
-				"aaa:"+state, value);
-		}else{
-			elem.setAttribute("aria-"+state, value);
-		}
+		//		Sets an attribute called "aria-"+state.
+
+		elem.setAttribute("aria-"+state, value);
 	},
 
 	removeWaiState: function(/*Element*/ elem, /*String*/ state){
 		// summary:
 		//		Removes a state from an element.
 		// description:
-		//		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 < 3){
-			elem.removeAttributeNS("http://www.w3.org/2005/07/aaa", state);
-		}else{
-			elem.removeAttribute("aria-"+state);
-		}
+		//		Sets an attribute called "aria-"+state.
+
+		elem.removeAttribute("aria-"+state);
 	}
 });
 
@@ -2164,8 +2417,8 @@ dojo.date.stamp.fromISOString = function(/*String*/formattedString, /*Number?*/d
 			/^(?:(\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;
+	var match = dojo.date.stamp._isoRegExp.exec(formattedString),
+		result = null;
 
 	if(match){
 		match.shift();
@@ -2183,11 +2436,13 @@ dojo.date.stamp.fromISOString = function(/*String*/formattedString, /*Number?*/d
 				}
 			});
 		}
-		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
+		result = new Date(match[0]||1970, match[1]||0, match[2]||1, match[3]||0, match[4]||0, match[5]||0, match[6]||0); //TODO: UTC defaults
+		if(match[0] < 100){
+			result.setFullYear(match[0] || 1970);
+		}
 
-		var offset = 0;
-		var zoneSign = match[7] && match[7].charAt(0);
+		var offset = 0,
+			zoneSign = match[7] && match[7].charAt(0);
 		if(zoneSign != 'Z'){
 			offset = ((match[8] || 0) * 60) + (Number(match[9]) || 0);
 			if(zoneSign != '-'){ offset *= -1; }
@@ -2232,9 +2487,9 @@ dojo.date.stamp.toISOString = function(/*Date*/dateObject, /*dojo.date.stamp.__O
 
 	var _ = function(n){ return (n < 10) ? "0" + n : n; };
 	options = options || {};
-	var formattedDate = [];
-	var getter = options.zulu ? "getUTC" : "get";
-	var date = "";
+	var formattedDate = [],
+		getter = options.zulu ? "getUTC" : "get",
+		date = "";
 	if(options.selector != "time"){
 		var year = dateObject[getter+"FullYear"]();
 		date = ["0000".substr((year+"").length)+year, _(dateObject[getter+"Month"]()+1), _(dateObject[getter+"Date"]())].join('-');
@@ -2270,28 +2525,8 @@ dojo.parser = new function(){
 	// summary: The Dom/Widget parsing package
 
 	var d = dojo;
-	var dtName = d._scopeName + "Type";
-	var qry = "[" + dtName + "]";
-
-	var _anonCtr = 0, _anon = {};
-	var 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 nso = thisObj || _anon;
-		if(dojo.isIE){
-			var cn = anonFuncPtr["__dojoNameCache"];
-			if(cn && nso[cn] === anonFuncPtr){
-				return cn;
-			}
-		}
-		var name;
-		do{
-			name = "__" + _anonCtr++;
-		}while(name in nso)
-		nso[name] = anonFuncPtr;
-		return name; // String
-	}
+	this._attrName = d._scopeName + "Type";
+	this._query = "[" + this._attrName + "]";
 
 	function val2type(/*Object*/ value){
 		// summary:
@@ -2328,10 +2563,12 @@ dojo.parser = new function(){
 				}
 				try{
 					if(value.search(/[^\w\.]+/i) != -1){
-						// TODO: "this" here won't work
-						value = nameAnonFunc(new Function(value), this);
+						// The user has specified some text for a function like "return x+5"
+						return new Function(value);
+					}else{
+						// The user has specified the name of a function like "myOnClick"
+						return d.getObject(value, false);
 					}
-					return d.getObject(value, false);
 				}catch(e){ return new Function(); }
 			case "array":
 				return value ? value.split(/\s*,\s*/) : [];
@@ -2352,7 +2589,14 @@ dojo.parser = new function(){
 		// map from fully qualified name (like "dijit.Button") to structure like
 		// { cls: dijit.Button, params: {label: "string", disabled: "boolean"} }
 	};
-	
+
+	// Widgets like BorderContainer add properties to _Widget via dojo.extend().
+	// If BorderContainer is loaded after _Widget's parameter list has been cached,
+	// we need to refresh that parameter list (for _Widget and all widgets that extend _Widget).
+	dojo.connect(dojo, "extend", function(){
+		instanceClasses = {};
+	});
+
 	function getClassInfo(/*String*/ className){
 		// className:
 		//		fully qualified name (like "dijit.form.Button")
@@ -2405,20 +2649,25 @@ dojo.parser = new function(){
 		return new Function(preamble+script.innerHTML+suffix);
 	}
 
-	this.instantiate = function(/* Array */nodes, /* Object? */mixin){
+	this.instantiate = function(/* Array */nodes, /* Object? */mixin, /* Object? */args){
 		// 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		
-		// mixin: Object
+		// mixin: Object?
 		//		An object that will be mixed in with each node in the array.
 		//		Values in the mixin will override values in the node, if they
 		//		exist.
-		var thelist = [];
+		// args: Object?
+		//		An object used to hold kwArgs for instantiation.
+		//		Only supports 'noStart' currently.
+		var thelist = [], dp = dojo.parser;
 		mixin = mixin||{};
+		args = args||{};
+		
 		d.forEach(nodes, function(node){
 			if(!node){ return; }
-			var type = dtName in mixin?mixin[dtName]:node.getAttribute(dtName);
+			var type = dp._attrName in mixin?mixin[dp._attrName]:node.getAttribute(dp._attrName);
 			if(!type || !type.length){ return; }
 			var clsInfo = getClassInfo(type),
 				clazz = clsInfo.cls,
@@ -2474,10 +2723,7 @@ dojo.parser = new function(){
 				});
 			}
 
-			var markupFactory = clazz["markupFactory"];
-			if(!markupFactory && clazz["prototype"]){
-				markupFactory = clazz.prototype["markupFactory"];
-			}
+			var markupFactory = clazz.markupFactory || clazz.prototype && clazz.prototype.markupFactory;
 			// create the instance
 			var instance = markupFactory ? markupFactory(params, node, clazz) : new clazz(params, node);
 			thelist.push(instance);
@@ -2502,27 +2748,77 @@ dojo.parser = new function(){
 		// 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();
-			}
-		});
+		if(!mixin._started){
+			d.forEach(thelist, function(instance){
+				if(	!args.noStart && instance  && 
+					instance.startup &&
+					!instance._started && 
+					(!instance.getParent || !instance.getParent())
+				){
+					instance.startup();
+				}
+			});
+		}
 		return thelist;
 	};
 
-	this.parse = function(/*DomNode?*/ rootNode){
+	this.parse = function(/*DomNode?*/ rootNode, /* Object? */ args){
 		// summary:
+		//		Scan the DOM for class instances, and instantiate them.
+		//
+		// description:
 		//		Search specified node (or root node) recursively for class instances,
 		//		and instantiate them Searches for
 		//		dojoType="qualified.class.name"
-		var list = d.query(qry, rootNode);
-		// go build the object instances
-		var instances = this.instantiate(list);
-		return instances;
+		//
+		// rootNode: DomNode?
+		//		A default starting root node from which to start the parsing. Can be
+		//		omitted, defaulting to the entire document. If omitted, the `args`
+		//		object can be passed in this place. If the `args` object has a 
+		//		`rootNode` member, that is used.
+		//
+		// args:
+		//		a kwArgs object passed along to instantiate()
+		//		
+		//			* noStart: Boolean?
+		//				when set will prevent the parser from calling .startup()
+		//				when locating the nodes. 
+		//			* rootNode: DomNode?
+		//				identical to the function's `rootNode` argument, though
+		//				allowed to be passed in via this `args object. 
+		//
+		// example:
+		//		Parse all widgets on a page:
+		//	|		dojo.parser.parse();
+		//
+		// example:
+		//		Parse all classes within the node with id="foo"
+		//	|		dojo.parser.parse(dojo.byId(foo));
+		//
+		// example:
+		//		Parse all classes in a page, but do not call .startup() on any 
+		//		child
+		//	|		dojo.parser.parse({ noStart: true })
+		//
+		// example:
+		//		Parse all classes in a node, but do not call .startup()
+		//	|		dojo.parser.parse(someNode, { noStart:true });
+		//	|		// or
+		// 	|		dojo.parser.parse({ noStart:true, rootNode: someNode });
+
+		// determine the root node based on the passed arguments.
+		var root;
+		if(!args && rootNode && rootNode.rootNode){
+			args = rootNode;
+			root = args.rootNode;
+		}else{
+			root = rootNode;
+		}
+
+		var	list = d.query(this._query, root);
+			// go build the object instances
+		return this.instantiate(list, null, args); // Array
+
 	};
 }();
 
@@ -2531,7 +2827,7 @@ dojo.parser = new function(){
 
 (function(){
 	var parseRunner = function(){ 
-		if(dojo.config["parseOnLoad"] == true){
+		if(dojo.config.parseOnLoad){
 			dojo.parser.parse(); 
 		}
 	};
@@ -2552,8 +2848,11 @@ dojo.provide("dijit._Widget");
 
 dojo.require( "dijit._base" );
 
-dojo.connect(dojo, "connect", 
-	function(/*Widget*/ widget, /*String*/ event){
+
+// This code is to assist deferring dojo.connect() calls in widgets (connecting to events on the widgets'
+// DOM nodes) until someone actually needs to monitor that event.
+dojo.connect(dojo, "_connect",
+	function(/*dijit._Widget*/ widget, /*String*/ event){
 		if(widget && dojo.isFunction(widget._onConnect)){
 			widget._onConnect(event);
 		}
@@ -2561,27 +2860,53 @@ dojo.connect(dojo, "connect",
 
 dijit._connectOnUseEventHandler = function(/*Event*/ event){};
 
+// Keep track of where the last keydown event was, to help avoid generating
+// spurious ondijitclick events when:
+// 1. focus is on a <button> or <a>
+// 2. user presses then releases the ENTER key
+// 3. onclick handler fires and shifts focus to another node, with an ondijitclick handler
+// 4. onkeyup event fires, causing the ondijitclick handler to fire
+dijit._lastKeyDownNode = null;
+if(dojo.isIE){
+	(function(){
+		var keydownCallback = function(evt){
+			dijit._lastKeyDownNode = evt.srcElement;
+		};
+		dojo.doc.attachEvent('onkeydown', keydownCallback);
+		dojo.addOnWindowUnload(function(){
+			dojo.doc.detachEvent('onkeydown', keydownCallback);
+		});
+	})();
+}else{
+	dojo.doc.addEventListener('keydown', function(evt){
+		dijit._lastKeyDownNode = evt.target;
+	}, true);
+}
+
 (function(){
 
-var _attrReg = {};
-var getAttrReg = function(dc){
-	if(!_attrReg[dc]){
-		var r = [];
-		var attrs;
-		var proto = dojo.getObject(dc).prototype;
-		for(var fxName in proto){
-			if(dojo.isFunction(proto[fxName]) && (attrs = fxName.match(/^_set([a-zA-Z]*)Attr$/)) && attrs[1]){
-				r.push(attrs[1].charAt(0).toLowerCase() + attrs[1].substr(1));
+var _attrReg = {},	// cached results from getSetterAttributes
+	getSetterAttributes = function(widget){
+		// summary:
+		//		Returns list of attributes with custom setters for specified widget
+		var dc = widget.declaredClass;
+		if(!_attrReg[dc]){
+			var r = [],
+				attrs,
+				proto = widget.constructor.prototype;
+			for(var fxName in proto){
+				if(dojo.isFunction(proto[fxName]) && (attrs = fxName.match(/^_set([a-zA-Z]*)Attr$/)) && attrs[1]){
+					r.push(attrs[1].charAt(0).toLowerCase() + attrs[1].substr(1));
+				}
 			}
+			_attrReg[dc] = r;
 		}
-		_attrReg[dc] = r;
-	}
-	return _attrReg[dc]||[];
-}
+		return _attrReg[dc] || [];	// String[]
+	};
 
 dojo.declare("dijit._Widget", null, {
 	// summary:
-	//		Base class for all dijit widgets. 	
+	//		Base class for all Dijit widgets.
 
 	// id: [const] String
 	//		A unique, opaque ID string that can be assigned by users or by the
@@ -2613,11 +2938,22 @@ dojo.declare("dijit._Widget", null, {
 	style: "",
 
 	// title: String
-	//		HTML title attribute, used to specify the title of tabs, accordion panes, etc.
+	//		HTML title attribute.
+	//
+	//		For form widgets this specifies a tooltip to display when hovering over
+	//		the widget (just like the native HTML title attribute).
+	//
+	//		For TitlePane or for when this widget is a child of a TabContainer, AccordionContainer,
+	//		etc., it's used to specify the tab label, accordion pane title, etc.
 	title: "",
 
+	// tooltip: String
+	//		When this widget's title attribute is used to for a tab label, accordion pane title, etc.,
+	//		this specifies the tooltip to appear when the mouse is hovered over that text.
+	tooltip: "",
+
 	// srcNodeRef: [readonly] DomNode
-	//		pointer to original dom node
+	//		pointer to original DOM node
 	srcNodeRef: null,
 
 	// domNode: [readonly] DomNode
@@ -2628,21 +2964,21 @@ dojo.declare("dijit._Widget", null, {
 	domNode: null,
 
 	// containerNode: [readonly] DomNode
-	//		Designates where children of the source dom node will be placed.
-	//		"Children" in this case refers to both dom nodes and widgets.
+	//		Designates where children of the source DOM node will be placed.
+	//		"Children" in this case refers to both DOM nodes and widgets.
 	//		For example, for myWidget:
 	//
 	//		|	<div dojoType=myWidget>
-	//		|		<b> here's a plain dom node
+	//		|		<b> here's a plain DOM node
 	//		|		<span dojoType=subWidget>and a widget</span>
-	//		|		<i> and another plain dom node </i>
+	//		|		<i> and another plain DOM node </i>
 	//		|	</div>
 	//
 	//		containerNode would point to:
 	//
-	//		|		<b> here's a plain dom node
+	//		|		<b> here's a plain DOM node
 	//		|		<span dojoType=subWidget>and a widget</span>
-	//		|		<i> and another plain dom node </i>
+	//		|		<i> and another plain DOM node </i>
 	//
 	//		In templated widgets, "containerNode" is set via a
 	//		dojoAttachPoint assignment.
@@ -2652,10 +2988,16 @@ dojo.declare("dijit._Widget", null, {
 	//		is null for widgets that don't, like TextBox.
 	containerNode: null,
 
+/*=====
+	// _started: Boolean
+	//		startup() has completed.
+	_started: false,
+=====*/
+
 	// attributeMap: [protected] Object
 	//		attributeMap sets up a "binding" between attributes (aka properties)
 	//		of the widget and the widget's DOM.
-	//		Changes to widget attributes listed in attributeMap will be 
+	//		Changes to widget attributes listed in attributeMap will be
 	//		reflected into the DOM.
 	//
 	//		For example, calling attr('title', 'hello')
@@ -2673,6 +3015,10 @@ dojo.declare("dijit._Widget", null, {
 	//	|		title: { node: "titleNode", type: "innerHTML" }
 	//		Maps this.title to this.titleNode.innerHTML
 	//
+	//		- DOM node innerText
+	//	|		title: { node: "titleNode", type: "innerText" }
+	//		Maps this.title to this.titleNode.innerText
+	//
 	//		- DOM node CSS class
 	// |		myClass: { node: "domNode", type: "class" }
 	//		Maps this.myClass to this.domNode.className
@@ -2700,12 +3046,13 @@ dojo.declare("dijit._Widget", null, {
 		onMouseOver: "",
 		onMouseLeave: "",
 		onMouseEnter: "",
-		onMouseUp: ""},
+		onMouseUp: ""
+	},
 
 	onClick: dijit._connectOnUseEventHandler,
 	/*=====
 	onClick: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of mouse click events.
 		// event:
 		//		mouse Event
@@ -2716,7 +3063,7 @@ dojo.declare("dijit._Widget", null, {
 	onDblClick: dijit._connectOnUseEventHandler,
 	/*=====
 	onDblClick: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of mouse double click events.
 		// event:
 		//		mouse Event
@@ -2727,7 +3074,7 @@ dojo.declare("dijit._Widget", null, {
 	onKeyDown: dijit._connectOnUseEventHandler,
 	/*=====
 	onKeyDown: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of keys being pressed down.
 		// event:
 		//		key Event
@@ -2738,7 +3085,7 @@ dojo.declare("dijit._Widget", null, {
 	onKeyPress: dijit._connectOnUseEventHandler,
 	/*=====
 	onKeyPress: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of printable keys being typed.
 		// event:
 		//		key Event
@@ -2749,7 +3096,7 @@ dojo.declare("dijit._Widget", null, {
 	onKeyUp: dijit._connectOnUseEventHandler,
 	/*=====
 	onKeyUp: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of keys being released.
 		// event:
 		//		key Event
@@ -2760,7 +3107,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseDown: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseDown: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse button is pressed down.
 		// event:
 		//		mouse Event
@@ -2771,7 +3118,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseMove: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseMove: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse moves over nodes contained within this widget.
 		// event:
 		//		mouse Event
@@ -2782,7 +3129,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseOut: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseOut: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse moves off of nodes contained within this widget.
 		// event:
 		//		mouse Event
@@ -2793,7 +3140,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseOver: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseOver: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse moves onto nodes contained within this widget.
 		// event:
 		//		mouse Event
@@ -2804,7 +3151,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseLeave: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseLeave: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse moves off of this widget.
 		// event:
 		//		mouse Event
@@ -2815,7 +3162,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseEnter: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseEnter: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse moves onto this widget.
 		// event:
 		//		mouse Event
@@ -2826,7 +3173,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseUp: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseUp: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse button is released.
 		// event:
 		//		mouse Event
@@ -2836,10 +3183,11 @@ dojo.declare("dijit._Widget", null, {
 	=====*/
 
 	// Constants used in templates
-	
-	// _blankGif: [protected] URL
-	//		Used by <img> nodes in templates that really get there image via CSS background-image
-	_blankGif: (dojo.config.blankGif || dojo.moduleUrl("dojo", "resources/blank.gif")),
+
+	// _blankGif: [protected] String
+	//		Path to a blank 1x1 image.
+	//		Used by <img> nodes in templates that really get their image via CSS background-image.
+	_blankGif: (dojo.config.blankGif || dojo.moduleUrl("dojo", "resources/blank.gif")).toString(),
 
 	//////////// INITIALIZATION METHODS ///////////////////////////////////////
 
@@ -2859,45 +3207,33 @@ dojo.declare("dijit._Widget", null, {
 		//		scalar values (like title, duration etc.) and functions,
 		//		typically callbacks like onClick.
 		// srcNodeRef:
-		//		If a srcNodeRef (dom node) is specified:
+		//		If a srcNodeRef (DOM node) is specified:
 		//			- use srcNodeRef.innerHTML as my contents
 		//			- if this is a behavioral widget then apply behavior
-		//			  to that srcNodeRef 
+		//			  to that srcNodeRef
 		//			- otherwise, replace srcNodeRef with my generated DOM
 		//			  tree
 		// 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.
+		//		Create calls a number of widget methods (postMixInProperties, buildRendering, postCreate,
+		//		etc.), some of which of you'll want to override. See http://docs.dojocampus.org/dijit/_Widget
+		//		for a discussion of the widget creation lifecycle.
 		//
-		//		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
+		//		Of course, adventurous developers could override create entirely, but this should
+		//		only be done as a last resort.
 		// tags:
 		//		private
 
-		// store pointer to original dom tree
+		// store pointer to original DOM tree
 		this.srcNodeRef = dojo.byId(srcNodeRef);
 
 		// For garbage collection.  An array of handles returned by Widget.connect()
 		// Each handle returned from Widget.connect() is an array of handles from dojo.connect()
 		this._connects = [];
 
+		// For garbage collection.  An array of handles returned by Widget.subscribe()
+		// The handle returned from Widget.subscribe() is the handle returned from dojo.subscribe()
+		this._subscribes = [];
+
 		// To avoid double-connects, remove entries from _deferredConnects
 		// that have been setup manually by a subclass (ex, by dojoAttachEvent).
 		// If a subclass has redefined a callback (ex: onClick) then assume it's being
@@ -2941,12 +3277,12 @@ dojo.declare("dijit._Widget", null, {
 
 			// If the developer has specified a handler as a widget parameter
 			// (ex: new Button({onClick: ...})
-			// then naturally need to connect from dom node to that handler immediately, 
+			// then naturally need to connect from DOM node to that handler immediately,
 			for(attr in this.params){
 				this._onConnect(attr);
 			}
 		}
-		
+
 		if(this.domNode){
 			this.domNode.setAttribute("widgetId", this.id);
 		}
@@ -2955,7 +3291,7 @@ dojo.declare("dijit._Widget", null, {
 		// If srcNodeRef has been processed and removed from the DOM (e.g. TemplatedWidget) then delete it to allow GC.
 		if(this.srcNodeRef && !this.srcNodeRef.parentNode){
 			delete this.srcNodeRef;
-		}	
+		}
 
 		this._created = true;
 	},
@@ -2975,14 +3311,18 @@ dojo.declare("dijit._Widget", null, {
 		// tags:
 		//		private
 		var condAttrApply = function(attr, scope){
-			if( (scope.params && attr in scope.params) || scope[attr]){
+			if((scope.params && attr in scope.params) || scope[attr]){
 				scope.attr(attr, scope[attr]);
 			}
 		};
+
+		// Do the attributes in attributeMap
 		for(var attr in this.attributeMap){
 			condAttrApply(attr, this);
 		}
-		dojo.forEach(getAttrReg(this.declaredClass), function(a){
+
+		// And also any attributes with custom setters
+		dojo.forEach(getSetterAttributes(this), function(a){
 			if(!(a in this.attributeMap)){
 				condAttrApply(a, this);
 			}
@@ -3001,8 +3341,9 @@ dojo.declare("dijit._Widget", null, {
 
 	buildRendering: function(){
 		// summary:
-		//		Construct the UI for this widget, setting this.domNode.  Most
-		//		widgets will mixin `dijit._Templated`, which implements this
+		//		Construct the UI for this widget, setting this.domNode
+		// description:
+		//		Most widgets will mixin `dijit._Templated`, which implements this
 		//		method.
 		// tags:
 		//		protected
@@ -3011,15 +3352,21 @@ dojo.declare("dijit._Widget", null, {
 
 	postCreate: function(){
 		// summary:
-		//		Called after a widget's dom has been setup
+		//		Processing after the DOM fragment is created
+		// description:
+		//		Called after the DOM fragment has been created, but not necessarily
+		//		added to the document.  Do not include any operations which rely on
+		//		node dimensions or placement.
 		// tags:
 		//		protected
 	},
 
 	startup: function(){
 		// summary:
-		//		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.
+		//		Processing after the DOM fragment is added to the document
+		// description:
+		//		Called after a widget and its children have been created and added to the page,
+		//		and all related widgets have finished their create() cycle, up through postCreate().
 		//		This is useful for composite widgets that need to control or layout sub-widgets.
 		//		Many layout widgets can use this as a wiring phase.
 		this._started = true;
@@ -3029,15 +3376,17 @@ dojo.declare("dijit._Widget", null, {
 
 	destroyRecursive: function(/*Boolean?*/ preserveDom){
 		// 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.
+		// 		Destroy this widget and its descendants
+		// description:
+		//		This is the generic "destructor" function that all widget users
+		// 		should call to cleanly discard with a widget. Once a widget is
+		// 		destroyed, it is removed from the manager object.
 		// preserveDom:
-		//		If true, this method will leave the original Dom structure
+		//		If true, this method will leave the original DOM structure
 		//		alone of descendant Widgets. Note: This will NOT work with
 		//		dijit._Templated widgets.
 
+		this._beingDestroyed = true;
 		this.destroyDescendants(preserveDom);
 		this.destroy(preserveDom);
 	},
@@ -3045,34 +3394,44 @@ dojo.declare("dijit._Widget", null, {
 	destroy: function(/*Boolean*/ preserveDom){
 		// summary:
 		// 		Destroy this widget, but not its descendants.
-		//		Will, however, destroy internal widgets such as those used within a template.
+		//		This method will, however, destroy internal widgets such as those used within a template.
 		// preserveDom: Boolean
-		//		If true, this method will leave the original Dom structure alone.
+		//		If true, this method will leave the original DOM structure alone.
 		//		Note: This will not yet work with _Templated widgets
 
+		this._beingDestroyed = true;
 		this.uninitialize();
-		dojo.forEach(this._connects, function(array){
-			dojo.forEach(array, dojo.disconnect);
+		var d = dojo,
+			dfe = d.forEach,
+			dun = d.unsubscribe;
+		dfe(this._connects, function(array){
+			dfe(array, d.disconnect);
+		});
+		dfe(this._subscribes, function(handle){
+			dun(handle);
 		});
 
 		// destroy widgets created as part of template, etc.
-		dojo.forEach(this._supportingWidgets||[], function(w){ 
-			if(w.destroy){
+		dfe(this._supportingWidgets || [], function(w){
+			if(w.destroyRecursive){
+				w.destroyRecursive();
+			}else if(w.destroy){
 				w.destroy();
 			}
 		});
-		
+
 		this.destroyRendering(preserveDom);
 		dijit.registry.remove(this.id);
+		this._destroyed = true;
 	},
 
 	destroyRendering: function(/*Boolean?*/ preserveDom){
 		// summary:
 		//		Destroys the DOM nodes associated with this widget
 		// preserveDom:
-		//		If true, this method will leave the original Dom structure alone
+		//		If true, this method will leave the original DOM structure alone
 		//		during tear-down. Note: this will not work with _Templated
-		//		widgets yet. 
+		//		widgets yet.
 		// tags:
 		//		protected
 
@@ -3108,7 +3467,7 @@ dojo.declare("dijit._Widget", null, {
 		//		widgets.
 
 		// get all direct descendants and destroy them recursively
-		dojo.forEach(this.getChildren(), function(widget){ 
+		dojo.forEach(this.getChildren(), function(widget){
 			if(widget.destroyRecursive){
 				widget.destroyRecursive(preserveDom);
 			}
@@ -3174,7 +3533,7 @@ dojo.declare("dijit._Widget", null, {
 		// tags:
 		//		private
 		if(event in this._deferredConnects){
-			var mapNode = this[this._deferredConnects[event]||'domNode'];
+			var mapNode = this[this._deferredConnects[event] || 'domNode'];
 			this.connect(mapNode, event.toLowerCase(), event);
 			delete this._deferredConnects[event];
 		}
@@ -3185,7 +3544,7 @@ dojo.declare("dijit._Widget", null, {
 		//		Custom setter for the CSS "class" attribute
 		// tags:
 		//		protected
-		var mapNode = this[this.attributeMap["class"]||'domNode'];
+		var mapNode = this[this.attributeMap["class"] || 'domNode'];
 		dojo.removeClass(mapNode, this["class"])
 		this["class"] = value;
 		dojo.addClass(mapNode, value);
@@ -3202,8 +3561,8 @@ dojo.declare("dijit._Widget", null, {
 		// tags:
 		//		protected
 
-		var mapNode = this[this.attributeMap["style"]||'domNode'];
-		
+		var mapNode = this[this.attributeMap.style || 'domNode'];
+
 		// Note: technically we should revert any style setting made in a previous call
 		// to his method, but that's difficult to keep track of.
 
@@ -3217,7 +3576,7 @@ dojo.declare("dijit._Widget", null, {
 			}
 		}
 
-		this["style"] = value;
+		this.style = value;
 	},
 
 	setAttribute: function(/*String*/ attr, /*anything*/ value){
@@ -3228,7 +3587,7 @@ dojo.declare("dijit._Widget", null, {
 		dojo.deprecated(this.declaredClass+"::setAttribute() is deprecated. Use attr() instead.", "", "2.0");
 		this.attr(attr, value);
 	},
-	
+
 	_attrToDom: function(/*String*/ attr, /*String*/ value){
 		// summary:
 		//		Reflect a widget attribute (title, tabIndex, duration etc.) to
@@ -3243,21 +3602,29 @@ dojo.declare("dijit._Widget", null, {
 		//		private
 
 		var commands = this.attributeMap[attr];
-		dojo.forEach( dojo.isArray(commands) ? commands : [commands], function(command){
+		dojo.forEach(dojo.isArray(commands) ? commands : [commands], function(command){
 
 			// Get target node and what we are doing to that node
 			var mapNode = this[command.node || command || "domNode"];	// DOM node
-			var type = command.type || "attribute";	// class, innerHTML, or attribute
-	
+			var type = command.type || "attribute";	// class, innerHTML, innerText, or attribute
+
 			switch(type){
 				case "attribute":
 					if(dojo.isFunction(value)){ // functions execute in the context of the widget
 						value = dojo.hitch(this, value);
 					}
-					if(/^on[A-Z][a-zA-Z]*$/.test(attr)){ // eg. onSubmit needs to be onsubmit
-						attr = attr.toLowerCase();
-					}
-					dojo.attr(mapNode, attr, value);
+
+					// Get the name of the DOM node attribute; usually it's the same
+					// as the name of the attribute in the widget (attr), but can be overridden.
+					// Also maps handler names to lowercase, like onSubmit --> onsubmit
+					var attrName = command.attribute ? command.attribute :
+						(/^on[A-Z][a-zA-Z]*$/.test(attr) ? attr.toLowerCase() : attr);
+
+					dojo.attr(mapNode, attrName, value);
+					break;
+				case "innerText":
+					mapNode.innerHTML = "";
+					mapNode.appendChild(dojo.doc.createTextNode(value));
 					break;
 				case "innerHTML":
 					mapNode.innerHTML = value;
@@ -3272,7 +3639,7 @@ dojo.declare("dijit._Widget", null, {
 	},
 
 	attr: function(/*String|Object*/name, /*Object?*/value){
-		//	summary:
+		// summary:
 		//		Set or get properties on a widget instance.
 		//	name:
 		//		The property to get or set. If an object is passed here and not
@@ -3281,7 +3648,7 @@ dojo.declare("dijit._Widget", null, {
 		//	value:
 		//		Optional. If provided, attr() operates as a setter. If omitted,
 		//		the current value of the named property is returned.
-		//	description:
+		// description:
 		//		Get or set named properties on a widget. If no value is
 		//		provided, the current value of the attribute is returned,
 		//		potentially via a getter method. If a value is provided, then
@@ -3304,7 +3671,7 @@ dojo.declare("dijit._Widget", null, {
 		//		will do
 		//	|	myTitlePane.title = "Howdy!";
 		//	|	myTitlePane.title.innerHTML = "Howdy!";
-		//		It works for dom node attributes too.  Calling
+		//		It works for DOM node attributes too.  Calling
 		//	|	widget.attr("disabled", true)
 		//		will set the disabled attribute on the widget's focusNode,
 		//		among other housekeeping for a change in disabled state.
@@ -3320,10 +3687,11 @@ dojo.declare("dijit._Widget", null, {
 			return this;
 		}
 		var names = this._getAttrNames(name);
-		if(args == 2){ // setter
+		if(args >= 2){ // setter
 			if(this[names.s]){
 				// use the explicit setter
-				return this[names.s](value) || this;
+				args = dojo._toArray(arguments, 1);
+				return this[names.s].apply(this, args) || this;
 			}else{
 				// if param is specified as DOM node attribute, copy it
 				if(name in this.attributeMap){
@@ -3335,11 +3703,7 @@ dojo.declare("dijit._Widget", null, {
 			}
 			return this;
 		}else{ // getter
-			if(this[names.g]){
-				return this[names.g]();
-			}else{
-				return this[name];
-			}
+			return this[names.g] ? this[names.g]() : this[name];
 		}
 	},
 
@@ -3354,45 +3718,37 @@ dojo.declare("dijit._Widget", null, {
 		var apn = this._attrPairNames;
 		if(apn[name]){ return apn[name]; }
 		var uc = name.charAt(0).toUpperCase() + name.substr(1);
-		return apn[name] = {
+		return (apn[name] = {
 			n: name+"Node",
 			s: "_set"+uc+"Attr",
 			g: "_get"+uc+"Attr"
-		};
+		});
 	},
 
 	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
+		//		Returns a string that represents the widget
+		// description:
+		//		When a widget is cast to a string, this method will be used to generate the
+		//		output. Currently, it does not implement any sort of reversible
 		//		serialization.
 		return '[Widget ' + this.declaredClass + ', ' + (this.id || 'NO ID') + ']'; // String
 	},
 
 	getDescendants: function(){
 		// summary:
-		//		Returns all the widgets that contained by this, i.e., all widgets underneath this.containerNode.
+		//		Returns all the widgets contained by this, i.e., all widgets underneath this.containerNode.
 		//		This method should generally be avoided as it returns widgets declared in templates, which are
 		//		supposed to be internal/hidden, but it's left here for back-compat reasons.
 
-		if(this.containerNode){
-			var list = dojo.query('[widgetId]', this.containerNode);
-			return list.map(dijit.byNode);		// Array
-		}else{
-			return [];
-		}
+		return this.containerNode ? dojo.query('[widgetId]', this.containerNode).map(dijit.byNode) : []; // dijit._Widget[]
 	},
 
 	getChildren: function(){
 		// summary:
 		//		Returns all the widgets contained by this, i.e., all widgets underneath this.containerNode.
 		//		Does not return nested widgets, nor widgets that are part of this widget's template.
-		if(this.containerNode){
-			return dijit.findWidgets(this.containerNode);
-		}else{
-			return [];
-		}
+		return this.containerNode ? dijit.findWidgets(this.containerNode) : []; // dijit._Widget[]
 	},
 
 	// nodesWithKeyClick: [private] String[]
@@ -3411,68 +3767,67 @@ dojo.declare("dijit._Widget", null, {
 		//		Provide widget-specific analog to dojo.connect, except with the
 		//		implicit use of this widget as the target object.
 		//		This version of connect also provides a special "ondijitclick"
-		//		event which triggers on a click or space-up, enter-down in IE
-		//		or enter press in FF (since often can't cancel enter onkeydown
-		//		in FF)
+		//		event which triggers on a click or space or enter keyup
+		// returns:
+		//		A handle that can be passed to `disconnect` in order to disconnect before
+		//		the widget is destroyed.
 		// example:
 		//	|	var btn = new dijit.form.Button();
 		//	|	// when foo.bar() is called, call the listener we're going to
 		//	|	// provide in the scope of btn
-		//	|	btn.connect(foo, "bar", function(){ 
-		//	|		
+		//	|	btn.connect(foo, "bar", function(){
+		//	|		console.debug(this.toString());
 		//	|	});
 		// tags:
 		//		protected
 
-		var d = dojo;
-		var dc = dojo.connect;
-		var handles =[];
+		var d = dojo,
+			dc = d._connect,
+			handles = [];
 		if(event == "ondijitclick"){
 			// add key based click activation for unsupported nodes.
-			if(!this.nodesWithKeyClick[obj.nodeName]){
+			// do all processing onkey up to prevent spurious clicks
+			// for details see comments at top of this file where _lastKeyDownNode is defined
+			if(!this.nodesWithKeyClick[obj.tagName.toLowerCase()]){
 				var m = d.hitch(this, method);
 				handles.push(
 					dc(obj, "onkeydown", this, function(e){
-						if(!d.isFF && e.keyCode == d.keys.ENTER &&
+						//console.log(this.id + ": onkeydown, e.target = ", e.target, ", lastKeyDownNode was ", dijit._lastKeyDownNode, ", equality is ", (e.target === dijit._lastKeyDownNode));
+						if((e.keyCode == d.keys.ENTER || e.keyCode == d.keys.SPACE) &&
 							!e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey){
-							return m(e);
-						}else if(e.keyCode == d.keys.SPACE){
-							// stop space down as it causes IE to scroll
-							// the browser window
-							d.stopEvent(e);
+							// needed on IE for when focus changes between keydown and keyup - otherwise dropdown menus do not work
+							dijit._lastKeyDownNode = e.target;
+							d.stopEvent(e);		// stop event to prevent scrolling on space key in IE
 						}
 			 		}),
 					dc(obj, "onkeyup", this, function(e){
-						if(e.keyCode == d.keys.SPACE && 
-							!e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey){ return m(e); }
+						//console.log(this.id + ": onkeyup, e.target = ", e.target, ", lastKeyDownNode was ", dijit._lastKeyDownNode, ", equality is ", (e.target === dijit._lastKeyDownNode));
+						if( (e.keyCode == d.keys.ENTER || e.keyCode == d.keys.SPACE) &&
+							e.target === dijit._lastKeyDownNode &&
+							!e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey){
+								//need reset here or have problems in FF when focus returns to trigger element after closing popup/alert
+								dijit._lastKeyDownNode = null;
+								return m(e);
+						}
 					})
 				);
-			 	if(d.isFF){
-					handles.push(
-						dc(obj, "onkeypress", this, function(e){
-							if(e.keyCode == d.keys.ENTER &&
-								!e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey){ return m(e); }
-						})
-					);
-			 	}
 			}
 			event = "onclick";
 		}
 		handles.push(dc(obj, event, this, method));
 
-		// return handles for FormElement and ComboBox
 		this._connects.push(handles);
-		return handles;
+		return handles;		// _Widget.Handle
 	},
 
-	disconnect: function(/*Object*/ handles){
+	disconnect: function(/* _Widget.Handle */ handles){
 		// summary:
-		//		Disconnects handle created by this.connect.
-		//		Also removes handle from this widget's list of connects
+		//		Disconnects handle created by `connect`.
+		//		Also removes handle from this widget's list of connects.
 		// tags:
 		//		protected
 		for(var i=0; i<this._connects.length; i++){
-			if(this._connects[i]==handles){
+			if(this._connects[i] == handles){
 				dojo.forEach(handles, dojo.disconnect);
 				this._connects.splice(i, 1);
 				return;
@@ -3480,6 +3835,43 @@ dojo.declare("dijit._Widget", null, {
 		}
 	},
 
+	subscribe: function(
+			/*String*/ topic,
+			/*String|Function*/ method){
+		// summary:
+		//		Subscribes to the specified topic and calls the specified method
+		//		of this object and registers for unsubscribe() on widget destroy.
+		// description:
+		//		Provide widget-specific analog to dojo.subscribe, except with the
+		//		implicit use of this widget as the target object.
+		// example:
+		//	|	var btn = new dijit.form.Button();
+		//	|	// when /my/topic is published, this button changes its label to
+		//	|   // be the parameter of the topic.
+		//	|	btn.subscribe("/my/topic", function(v){
+		//	|		this.attr("label", v);
+		//	|	});
+		var d = dojo,
+			handle = d.subscribe(topic, this, method);
+
+		// return handles for Any widget that may need them
+		this._subscribes.push(handle);
+		return handle;
+	},
+
+	unsubscribe: function(/*Object*/ handle){
+		// summary:
+		//		Unsubscribes handle created by this.subscribe.
+		//		Also removes handle from this widget's list of subscriptions
+		for(var i=0; i<this._subscribes.length; i++){
+			if(this._subscribes[i] == handle){
+				dojo.unsubscribe(handle);
+				this._subscribes.splice(i, 1);
+				return;
+			}
+		}
+	},
+
 	isLeftToRight: function(){
 		// summary:
 		//		Checks the page for text direction
@@ -3494,7 +3886,7 @@ dojo.declare("dijit._Widget", null, {
 		//		and false if not
 		return this.focus && (dojo.style(this.domNode, "display") != "none");
 	},
-	
+
 	placeAt: function(/* String|DomNode|_Widget */reference, /* String?|Int? */position){
 		// summary:
 		//		Place this widget's domNode reference somewhere in the DOM based
@@ -3506,29 +3898,30 @@ dojo.declare("dijit._Widget", null, {
 		//		shorthand mechanism to put an existing (or newly created) Widget
 		//		somewhere in the dom, and allow chaining.
 		//
-		// reference: 
-		//		The String id of a domNode, a domNode reference, or a reference to a Widget posessing 
+		// reference:
+		//		The String id of a domNode, a domNode reference, or a reference to a Widget posessing
 		//		an addChild method.
 		//
-		// position: 
+		// position:
 		//		If passed a string or domNode reference, the position argument
-		//		accepts a string just as dojo.place does, one of: "first", "last", 
-		//		"before", or "after". 
+		//		accepts a string just as dojo.place does, one of: "first", "last",
+		//		"before", or "after".
 		//
-		//		If passed a _Widget reference, and that widget reference has an ".addChild" method, 
+		//		If passed a _Widget reference, and that widget reference has an ".addChild" method,
 		//		it will be called passing this widget instance into that method, supplying the optional
 		//		position index passed.
 		//
-		// returns: dijit._Widget
-		//		Provides a useful return of the newly created dijit._Widget instance so you 
+		// returns:
+		//		dijit._Widget
+		//		Provides a useful return of the newly created dijit._Widget instance so you
 		//		can "chain" this function by instantiating, placing, then saving the return value
-		//		to a variable. 
+		//		to a variable.
 		//
 		// example:
 		// | 	// create a Button with no srcNodeRef, and place it in the body:
 		// | 	var button = new dijit.form.Button({ label:"click" }).placeAt(dojo.body());
 		// | 	// now, 'button' is still the widget reference to the newly created button
-		// | 	dojo.connect(button, "onClick", function(e){  });
+		// | 	dojo.connect(button, "onClick", function(e){ console.log('click'); });
 		//
 		// example:
 		// |	// create a button out of a node with id="src" and append it to id="wrapper":
@@ -3538,19 +3931,47 @@ dojo.declare("dijit._Widget", null, {
 		// |	// place a new button as the first element of some div
 		// |	var button = new dijit.form.Button({ label:"click" }).placeAt("wrapper","first");
 		//
-		// example: 
+		// example:
 		// |	// create a contentpane and add it to a TabContainer
 		// |	var tc = dijit.byId("myTabs");
 		// |	new dijit.layout.ContentPane({ href:"foo.html", title:"Wow!" }).placeAt(tc)
 
-		if(reference["declaredClass"] && reference["addChild"]){
+		if(reference.declaredClass && reference.addChild){
 			reference.addChild(this, position);
 		}else{
 			dojo.place(this.domNode, reference, position);
 		}
 		return this;
-	}
+	},
+
+	_onShow: function(){
+		// summary:
+		//		Internal method called when this widget is made visible.
+		//		See `onShow` for details.
+		this.onShow();
+	},
+
+	onShow: function(){
+		// summary:
+		//		Called when this widget becomes the selected pane in a
+		//		`dijit.layout.TabContainer`, `dijit.layout.StackContainer`,
+		//		`dijit.layout.AccordionContainer`, etc.
+		//
+		//		Also called to indicate display of a `dijit.Dialog`, `dijit.TooltipDialog`, or `dijit.TitlePane`.
+		// tags:
+		//		callback
+	},
 
+	onHide: function(){
+		// summary:
+			//		Called when another widget becomes the selected pane in a
+			//		`dijit.layout.TabContainer`, `dijit.layout.StackContainer`,
+			//		`dijit.layout.AccordionContainer`, etc.
+			//
+			//		Also called to indicate hide of a `dijit.Dialog`, `dijit.TooltipDialog`, or `dijit.TitlePane`.
+			// tags:
+			//		callback
+	}
 });
 
 })();
@@ -3627,24 +4048,28 @@ dojo.string.substitute = function(	/*String*/		template,
 	//		hash to search for substitutions
 	//	transform: 
 	//		a function to process all parameters before substitution takes
-	//		place, e.g. dojo.string.encodeXML
+	//		place, e.g. mylib.encodeXML
 	//	thisObject: 
 	//		where to look for optional format function; default to the global
 	//		namespace
 	//	example:
+	//		Substitutes two expressions in a string from an Array or Object
 	//	|	// returns "File 'foo.html' is not found in directory '/temp'."
+	//	|	// by providing substitution data in an Array
 	//	|	dojo.string.substitute(
 	//	|		"File '${0}' is not found in directory '${1}'.",
 	//	|		["foo.html","/temp"]
 	//	|	);
 	//	|
 	//	|	// also returns "File 'foo.html' is not found in directory '/temp'."
+	//	|	// but provides substitution data in an Object structure.  Dotted
+	//	|	// notation may be used to traverse the structure.
 	//	|	dojo.string.substitute(
 	//	|		"File '${name}' is not found in directory '${info.dir}'.",
 	//	|		{ name: "foo.html", info: { dir: "/temp" } }
 	//	|	);
 	//	example:
-	//		use a transform function to modify the values:
+	//		Use a transform function to modify the values:
 	//	|	// returns "file 'foo.html' is not found in directory '/temp'."
 	//	|	dojo.string.substitute(
 	//	|		"${0} is not found in ${1}.",
@@ -3656,7 +4081,7 @@ dojo.string.substitute = function(	/*String*/		template,
 	//	|		}
 	//	|	);
 	//	example:
-	//		use a formatter
+	//		Use a formatter
 	//	|	// returns "thinger -- howdy"
 	//	|	dojo.string.substitute(
 	//	|		"${0:postfix}", ["thinger"], null, {
@@ -3666,18 +4091,18 @@ dojo.string.substitute = function(	/*String*/		template,
 	//	|		}
 	//	|	);
 
-	thisObject = thisObject||dojo.global;
-	transform = (!transform) ? 
-					function(v){ return v; } : 
-					dojo.hitch(thisObject, transform);
+	thisObject = thisObject || dojo.global;
+	transform = transform ? 
+		dojo.hitch(thisObject, transform) : function(v){ return v; };
 
-	return template.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g, function(match, key, format){
-		var value = dojo.getObject(key, false, map);
-		if(format){
-			value = dojo.getObject(format, false, thisObject).call(thisObject, value, key);
-		}
-		return transform(value, key).toString();
-	}); // string
+	return template.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,
+		function(match, key, format){
+			var value = dojo.getObject(key, false, map);
+			if(format){
+				value = dojo.getObject(format, false, thisObject).call(thisObject, value, key);
+			}
+			return transform(value, key).toString();
+		}); // String
 };
 
 /*=====
@@ -3711,6 +4136,128 @@ dojo.string.trim = String.prototype.trim ?
 
 }
 
+if(!dojo._hasResource["dojo.cache"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.cache"] = true;
+dojo.provide("dojo.cache");
+
+/*=====
+dojo.cache = { 
+	// summary:
+	// 		A way to cache string content that is fetchable via `dojo.moduleUrl`.
+};
+=====*/
+
+(function(){
+	var cache = {};
+	dojo.cache = function(/*String||Object*/module, /*String*/url, /*String||Object?*/value){
+		// summary:
+		// 		A getter and setter for storing the string content associated with the
+		// 		module and url arguments.
+		// description:
+		// 		module and url are used to call `dojo.moduleUrl()` to generate a module URL.
+		// 		If value is specified, the cache value for the moduleUrl will be set to
+		// 		that value. Otherwise, dojo.cache will fetch the moduleUrl and store it
+		// 		in its internal cache and return that cached value for the URL. To clear
+		// 		a cache value pass null for value. Since XMLHttpRequest (XHR) is used to fetch the
+		// 		the URL contents, only modules on the same domain of the page can use this capability.
+		// 		The build system can inline the cache values though, to allow for xdomain hosting.
+		// module: String||Object
+		// 		If a String, the module name to use for the base part of the URL, similar to module argument
+		// 		to `dojo.moduleUrl`. If an Object, something that has a .toString() method that
+		// 		generates a valid path for the cache item. For example, a dojo._Url object.
+		// url: String
+		// 		The rest of the path to append to the path derived from the module argument. If
+		// 		module is an object, then this second argument should be the "value" argument instead.
+		// value: String||Object?
+		// 		If a String, the value to use in the cache for the module/url combination.
+		// 		If an Object, it can have two properties: value and sanitize. The value property
+		// 		should be the value to use in the cache, and sanitize can be set to true or false,
+		// 		to indicate if XML declarations should be removed from the value and if the HTML
+		// 		inside a body tag in the value should be extracted as the real value. The value argument
+		// 		or the value property on the value argument are usually only used by the build system
+		// 		as it inlines cache content.
+		//	example:
+		//		To ask dojo.cache to fetch content and store it in the cache (the dojo["cache"] style
+		// 		of call is used to avoid an issue with the build system erroneously trying to intern
+		// 		this example. To get the build system to intern your dojo.cache calls, use the
+		// 		"dojo.cache" style of call):
+		// 		|	//If template.html contains "<h1>Hello</h1>" that will be
+		// 		|	//the value for the text variable.
+		//		|	var text = dojo["cache"]("my.module", "template.html");
+		//	example:
+		//		To ask dojo.cache to fetch content and store it in the cache, and sanitize the input
+		// 		 (the dojo["cache"] style of call is used to avoid an issue with the build system 
+		// 		erroneously trying to intern this example. To get the build system to intern your
+		// 		dojo.cache calls, use the "dojo.cache" style of call):
+		// 		|	//If template.html contains "<html><body><h1>Hello</h1></body></html>", the
+		// 		|	//text variable will contain just "<h1>Hello</h1>".
+		//		|	var text = dojo["cache"]("my.module", "template.html", {sanitize: true});
+		//	example:
+		//		Same example as previous, but demostrates how an object can be passed in as
+		//		the first argument, then the value argument can then be the second argument.
+		// 		|	//If template.html contains "<html><body><h1>Hello</h1></body></html>", the
+		// 		|	//text variable will contain just "<h1>Hello</h1>".
+		//		|	var text = dojo["cache"](new dojo._Url("my/module/template.html"), {sanitize: true});
+
+		//Module could be a string, or an object that has a toString() method
+		//that will return a useful path. If it is an object, then the "url" argument
+		//will actually be the value argument.
+		if(typeof module == "string"){
+			var pathObj = dojo.moduleUrl(module, url);
+		}else{
+			pathObj = module;
+			value = url;
+		}
+		var key = pathObj.toString();
+
+		var val = value;
+		if(value !== undefined && !dojo.isString(value)){
+			val = ("value" in value ? value.value : undefined);
+		}
+
+		var sanitize = value && value.sanitize ? true : false;
+
+		if(val || val === null){
+			//We have a value, either clear or set the cache value.
+			if(val == null){
+				delete cache[key];
+			}else{
+				val = cache[key] = sanitize ? dojo.cache._sanitize(val) : val;
+			}
+		}else{
+			//Allow cache values to be empty strings. If key property does
+			//not exist, fetch it.
+			if(!(key in cache)){
+				val = dojo._getText(key);
+				cache[key] = sanitize ? dojo.cache._sanitize(val) : val;
+			}
+			val = cache[key];
+		}
+		return val; //String
+	};
+
+	dojo.cache._sanitize = function(/*String*/val){
+		// summary: 
+		//		Strips <?xml ...?> declarations so that external SVG and XML
+		// 		documents can be added to a document without worry. Also, if the string
+		//		is an HTML document, only the part inside the body tag is returned.
+		// description:
+		// 		Copied from dijit._Templated._sanitizeTemplateString.
+		if(val){
+			val = val.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, "");
+			var matches = val.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
+			if(matches){
+				val = matches[1];
+			}
+		}else{
+			val = "";
+		}
+		return val; //String
+	};
+})();
+
+}
+
 if(!dojo._hasResource["dijit._Templated"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
 dojo._hasResource["dijit._Templated"] = true;
 dojo.provide("dijit._Templated");
@@ -3719,22 +4266,25 @@ dojo.provide("dijit._Templated");
 
 
 
+
 dojo.declare("dijit._Templated",
 	null,
 	{
-		//	summary:
+		// summary:
 		//		Mixin for widgets that are instantiated from a template
-		// 
 
 		// templateString: [protected] String
 		//		A string that represents the widget template. Pre-empts the
 		//		templatePath. In builds that have their strings "interned", the
 		//		templatePath is converted to an inline templateString, thereby
 		//		preventing a synchronous network call.
+		//
+		//		Use in conjunction with dojo.cache() to load from a file.
 		templateString: null,
 
-		// templatePath: [protected] String
-		//		Path to template (HTML file) for this widget relative to dojo.baseUrl
+		// templatePath: [protected deprecated] String
+		//		Path to template (HTML file) for this widget relative to dojo.baseUrl.
+		//		Deprecated: use templateString with dojo.cache() instead.
 		templatePath: null,
 
 		// widgetsInTemplate: [protected] Boolean
@@ -3748,6 +4298,26 @@ dojo.declare("dijit._Templated",
 		//		that its template is always re-built from a string
 		_skipNodeCache: false,
 
+		// _earlyTemplatedStartup: Boolean
+		//		A fallback to preserve the 1.0 - 1.3 behavior of children in
+		//		templates having their startup called before the parent widget
+		//		fires postCreate. Defaults to 'false', causing child widgets to
+		//		have their .startup() called immediately before a parent widget
+		//		.startup(), but always after the parent .postCreate(). Set to
+		//		'true' to re-enable to previous, arguably broken, behavior.
+		_earlyTemplatedStartup: false,
+
+		// _attachPoints: [private] String[]
+		//		List of widget attribute names associated with dojoAttachPoint=... in the
+		//		template, ex: ["containerNode", "labelNode"]
+/*=====
+ 		_attachPoints: [],
+ =====*/
+
+		constructor: function(){
+			this._attachPoints = [];
+		},
+
 		_stringRepl: function(tmpl){
 			// summary:
 			//		Does substitution of ${foo} type properties in template string
@@ -3785,6 +4355,10 @@ dojo.declare("dijit._Templated",
 			var node;
 			if(dojo.isString(cached)){
 				node = dojo._toDom(this._stringRepl(cached));
+				if(node.nodeType != 1){
+					// Flag common problems such as templates with multiple top level nodes (nodeType == 11)
+					throw new Error("Invalid template: " + cached);
+				}
 			}else{
 				// if it's a node, all we have to do is clone it
 				node = cached.cloneNode(true);
@@ -3797,7 +4371,29 @@ dojo.declare("dijit._Templated",
 			this._attachTemplateNodes(node);
 
 			if(this.widgetsInTemplate){
-				var cw = (this._supportingWidgets = dojo.parser.parse(node));
+				// Make sure dojoType is used for parsing widgets in template.
+				// The dojo.parser.query could be changed from multiversion support.
+				var parser = dojo.parser, qry, attr;
+				if(parser._query != "[dojoType]"){
+					qry = parser._query;
+					attr = parser._attrName;
+					parser._query = "[dojoType]";
+					parser._attrName = "dojoType";
+				}
+
+				// Store widgets that we need to start at a later point in time
+				var cw = (this._startupWidgets = dojo.parser.parse(node, {
+					noStart: !this._earlyTemplatedStartup
+				}));
+
+				// Restore the query.
+				if(qry){
+					parser._query = qry;
+					parser._attrName = attr;
+				}
+
+				this._supportingWidgets = dijit.findWidgets(node);
+
 				this._attachTemplateNodes(cw, function(n,p){
 					return n[p];
 				});
@@ -3822,13 +4418,13 @@ dojo.declare("dijit._Templated",
 
 		_attachTemplateNodes: function(rootNode, getAttrFunc){
 			// summary:
-			//		Iterate through the template and attach functions and nodes accordingly.	
-			// description:		
+			//		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	
+			//			* dojoAttachEvent
 			//			* waiRole
 			//			* waiState
 			// rootNode: DomNode|Array[Widgets]
@@ -3858,6 +4454,7 @@ dojo.declare("dijit._Templated",
 						}else{
 							this[point]=baseNode;
 						}
+						this._attachPoints.push(point);
 					}
 				}
 
@@ -3902,6 +4499,25 @@ dojo.declare("dijit._Templated",
 					});
 				}
 			}
+		},
+
+		startup: function(){
+			dojo.forEach(this._startupWidgets, function(w){
+				if(w && !w._started && w.startup){
+					w.startup();
+				}
+			});
+			this.inherited(arguments);
+		},
+
+		destroyRendering: function(){
+			// Delete all attach points to prevent IE6 memory leaks.
+			dojo.forEach(this._attachPoints, function(point){
+				delete this[point];
+			}, this);
+			this._attachPoints = [];
+
+			this.inherited(arguments);
 		}
 	}
 );
@@ -3913,8 +4529,8 @@ dijit._Templated.getCachedTemplate = function(templatePath, templateString, alwa
 	// 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.
+	// templatePath: String||dojo.uri.Uri
+	//		The URL to get the template from.
 	// templateString: String?
 	//		a string to use in lieu of fetching the template from a URL. Takes precedence
 	//		over templatePath
@@ -3927,19 +4543,20 @@ dijit._Templated.getCachedTemplate = function(templatePath, templateString, alwa
 	var key = templateString || templatePath;
 	var cached = tmplts[key];
 	if(cached){
-		if(!cached.ownerDocument || cached.ownerDocument == dojo.doc){
-			// string or node of the same document
-			return cached;
-		}
-		// destroy the old cached node of a different document
+		try{
+			// if the cached value is an innerHTML string (no ownerDocument) or a DOM tree created within the current document, then use the current cached value
+			if(!cached.ownerDocument || cached.ownerDocument == dojo.doc){
+				// string or node of the same document
+				return cached;
+			}
+		}catch(e){ /* squelch */ } // IE can throw an exception if cached.ownerDocument was reloaded
 		dojo.destroy(cached);
 	}
 
 	// If necessary, load template string from template path
 	if(!templateString){
-		templateString = dijit._Templated._sanitizeTemplateString(dojo.trim(dojo._getText(templatePath)));
+		templateString = dojo.cache(templatePath, {sanitize: true});
 	}
-
 	templateString = dojo.string.trim(templateString);
 
 	if(alwaysUseString || templateString.match(/\$\{([^\}]+)\}/g)){
@@ -3947,34 +4564,20 @@ dijit._Templated.getCachedTemplate = function(templatePath, templateString, alwa
 		return (tmplts[key] = templateString); //String
 	}else{
 		// there are no variables in the template so we can cache the DOM tree
-		return (tmplts[key] = dojo._toDom(templateString)); //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];
+		var node = dojo._toDom(templateString);
+		if(node.nodeType != 1){
+			throw new Error("Invalid template: " + templateString);
 		}
-	}else{
-		tString = "";
+		return (tmplts[key] = node); //Node
 	}
-	return tString; //String
 };
 
-
 if(dojo.isIE){
 	dojo.addOnWindowUnload(function(){
 		var cache = dijit._Templated._templateCache;
 		for(var key in cache){
 			var value = cache[key];
-			if(!isNaN(value.nodeType)){ // isNode equivalent
+			if(typeof value == "object"){ // value is either a string or a DOM node template
 				dojo.destroy(value);
 			}
 			delete cache[key];
@@ -4015,18 +4618,20 @@ dojo.declare("dijit._Container",
 		//		wouldn't make sense.
 
 		// isContainer: [protected] Boolean
-		//		Just a flag indicating that this widget descends from dijit._Container
+		//		Indicates that this widget acts as a "parent" to the descendant widgets.
+		//		When the parent is started it will call startup() on the child widgets.
+		//		See also `isLayoutContainer`.
 		isContainer: true,
 
 		buildRendering: function(){
 			this.inherited(arguments);
 			if(!this.containerNode){
 				// all widgets with descendants must set containerNode
-   				this.containerNode = this.domNode;
+	 				this.containerNode = this.domNode;
 			}
 		},
 
-		addChild: function(/*Widget*/ widget, /*int?*/ insertIndex){
+		addChild: function(/*dijit._Widget*/ widget, /*int?*/ insertIndex){
 			// summary:
 			//		Makes the given widget a child of this widget.
 			// description:
@@ -4057,37 +4662,15 @@ dojo.declare("dijit._Container",
 			//		Removes the passed widget instance from this widget but does
 			//		not destroy it.  You can also pass in an integer indicating
 			//		the index within the container to remove
+
 			if(typeof widget == "number" && widget > 0){
 				widget = this.getChildren()[widget];
 			}
-			// If we cannot find the widget, just return
-			if(!widget || !widget.domNode){ return; }
-			
-			var node = widget.domNode;
-			node.parentNode.removeChild(node);	// detach but don't destroy
-		},
-
-		_nextElement: function(node){
-			// summary:
-			//      Find the next (non-text, non-comment etc) node
-			// tags:
-			//      private
-			do{
-				node = node.nextSibling;
-			}while(node && node.nodeType != 1);
-			return node;
-		},
 
-		_firstElement: function(node){
-			// summary:
-			//      Find the first (non-text, non-comment etc) node
-			// tags:
-			//      private
-			node = node.firstChild;
-			if(node && node.nodeType != 1){
-				node = this._nextElement(node);
+			if(widget && widget.domNode){
+				var node = widget.domNode;
+				node.parentNode.removeChild(node); // detach but don't destroy
 			}
-			return node;
 		},
 
 		getChildren: function(){
@@ -4101,7 +4684,7 @@ dojo.declare("dijit._Container",
 		hasChildren: function(){
 			// summary:
 			//		Returns true if widget has children, i.e. if this.containerNode contains something.
-			return !!this._firstElement(this.containerNode); // Boolean
+			return dojo.query("> [widgetId]", this.containerNode).length > 0;	// Boolean
 		},
 
 		destroyDescendants: function(/*Boolean*/ preserveDom){
@@ -4110,8 +4693,8 @@ dojo.declare("dijit._Container",
 			//      but not this widget itself
 			dojo.forEach(this.getChildren(), function(child){ child.destroyRecursive(preserveDom); });
 		},
-	
-		_getSiblingOfChild: function(/*Widget*/ child, /*int*/ dir){
+
+		_getSiblingOfChild: function(/*dijit._Widget*/ child, /*int*/ dir){
 			// summary:
 			//		Get the next or previous widget sibling of child
 			// dir:
@@ -4119,24 +4702,38 @@ dojo.declare("dijit._Container",
 			//		if -1, get the previous sibling
 			// tags:
 			//      private
-			var node = child.domNode;
-			var which = (dir>0 ? "nextSibling" : "previousSibling");
+			var node = child.domNode,
+				which = (dir>0 ? "nextSibling" : "previousSibling");
 			do{
 				node = node[which];
 			}while(node && (node.nodeType != 1 || !dijit.byNode(node)));
-			return node ? dijit.byNode(node) : null;
+			return node && dijit.byNode(node);	// dijit._Widget
 		},
-		
-		getIndexOfChild: function(/*Widget*/ child){
+
+		getIndexOfChild: function(/*dijit._Widget*/ child){
 			// summary:
 			//		Gets the index of the child in this container or -1 if not found
-			var children = this.getChildren();
-			for(var i=0, c; c=children[i]; i++){
-				if(c == child){ 
-					return i; // int
-				}
-			}
-			return -1; // int
+			return dojo.indexOf(this.getChildren(), child);	// int
+		},
+
+		startup: function(){
+			// summary:
+			//		Called after all the widgets have been instantiated and their
+			//		dom nodes have been inserted somewhere under dojo.doc.body.
+			//
+			//		Widgets should override this method to do any initialization
+			//		dependent on other widgets existing, and then call
+			//		this superclass method to finish things off.
+			//
+			//		startup() in subclasses shouldn't do anything
+			//		size related because the size of the widget hasn't been set yet.
+
+			if(this._started){ return; }
+
+			// Startup all children of this widget
+			dojo.forEach(this.getChildren(), function(child){ child.startup(); });
+
+			this.inherited(arguments);
 		}
 	}
 );
@@ -4150,28 +4747,22 @@ dojo.provide("dijit._Contained");
 dojo.declare("dijit._Contained",
 		null,
 		{
-			// summary
+			// 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;
+				//		specifies isContainer
+				var parent = dijit.getEnclosingWidget(this.domNode.parentNode);
+				return parent && parent.isContainer ? parent : null;
 			},
 
-			_getSibling: function(which){
+			_getSibling: function(/*String*/ which){
 				// summary:
 				//      Returns next or previous sibling
 				// which:
@@ -4182,9 +4773,7 @@ dojo.declare("dijit._Contained",
 				do{
 					node = node[which+"Sibling"];
 				}while(node && node.nodeType != 1);
-				if(!node){ return null; } // null
-				var id = node.getAttribute("widgetId");
-				return dijit.byId(id);
+				return node && dijit.byNode(node);	// dijit._Widget
 			},
 
 			getPreviousSibling: function(){
@@ -4192,7 +4781,7 @@ dojo.declare("dijit._Contained",
 				//		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
+				return this._getSibling("previous"); // dijit._Widget
 			},
 
 			getNextSibling: function(){
@@ -4200,15 +4789,15 @@ dojo.declare("dijit._Contained",
 				//		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
+				return this._getSibling("next"); // dijit._Widget
 			},
-			
+
 			getIndexInParent: function(){
 				// summary:
 				//		Returns the index of this widget within its container parent.
 				//		It returns -1 if the parent does not exist, or if the parent
 				//		is not a dijit._Container
-				
+
 				var p = this.getParent();
 				if(!p || !p.getIndexOfChild){
 					return -1; // int
@@ -4234,25 +4823,24 @@ dojo.declare("dijit.layout._LayoutWidget",
 	{
 		// summary:
 		//		Base class for a _Container widget which is responsible for laying out its children.
-		//		Widgets which mixin this code must define layout() to lay out the children.
+		//		Widgets which mixin this code must define layout() to manage placement and sizing of the children.
 
 		// baseClass: [protected extension] String
 		//		This class name is applied to the widget's domNode
 		//		and also may be used to generate names for sub nodes,
-		//		like for example dijitTabContainer-content.
+		//		for example dijitTabContainer-content.
 		baseClass: "dijitLayoutContainer",
 
-		// isLayoutContainer: [private deprecated] Boolean
-		//		TODO: this is unused, but maybe it *should* be used for a child to
-		//		detect whether the parent is going to call resize() on it or not
-		//		(see calls to getParent() and resize() in this file)
+		// isLayoutContainer: [protected] Boolean
+		//		Indicates that this widget is going to call resize() on its
+		//		children widgets, setting their size, when they become visible.
 		isLayoutContainer: true,
 
 		postCreate: function(){
 			dojo.addClass(this.domNode, "dijitContainer");
 			dojo.addClass(this.domNode, this.baseClass);
-			
-			// TODO: this.inherited()
+
+			this.inherited(arguments);
 		},
 
 		startup: function(){
@@ -4269,32 +4857,27 @@ dojo.declare("dijit.layout._LayoutWidget",
 
 			if(this._started){ return; }
 
-			// TODO: seems like this code should be in _Container.startup().
-			// Then things that don't extend LayoutContainer (like GridContainer)
-			// would get the behavior for free.
-			dojo.forEach(this.getChildren(), function(child){ child.startup(); });
+			// Need to call inherited first - so that child widgets get started
+			// up correctly
+			this.inherited(arguments);
 
-			// If I am a top level widget
-			if(!this.getParent || !this.getParent()){
+			// If I am a not being controlled by a parent layout widget...
+			var parent = this.getParent && this.getParent()
+			if(!(parent && parent.isLayoutContainer)){
 				// Do recursive sizing and layout of all my descendants
 				// (passing in no argument to resize means that it has to glean the size itself)
 				this.resize();
 
-				// Since my parent isn't a layout container, and my style is width=height=100% (or something similar),
-				// then I need to watch when the window resizes, and size myself accordingly.
-				// (Passing in no arguments to resize means that it has to glean the size itself.)
-				// TODO: make one global listener to avoid getViewport() per widget.
-				this._viewport = dijit.getViewport();
-				this.connect(dojo.global, 'onresize', function(){
-					var newViewport = dijit.getViewport();
-					if(newViewport.w != this._viewport.w ||  newViewport.h != this._viewport.h){
-						this._viewport = newViewport;
-						this.resize();
-					}
+				// Since my parent isn't a layout container, and my style *may be* width=height=100%
+				// or something similar (either set directly or via a CSS class),
+				// monitor when my size changes so that I can re-layout.
+				// For browsers where I can't directly monitor when my size changes,
+				// monitor when the viewport changes size, which *may* indicate a size change for me.
+				this.connect(dojo.isIE ? this.domNode : dojo.global, 'onresize', function(){
+					// Using function(){} closure to ensure no arguments to resize.
+					this.resize();
 				});
 			}
-			
-			this.inherited(arguments);
 		},
 
 		resize: function(changeSize, resultSize){
@@ -4303,7 +4886,7 @@ dojo.declare("dijit.layout._LayoutWidget",
 			// description:
 			//		Change size mode:
 			//			When changeSize is specified, changes the marginBox of this widget
-			//			 and forces it to relayout its contents accordingly.
+			//			and forces it to relayout its contents accordingly.
 			//			changeSize may specify height, width, or both.
 			//
 			//			If resultSize is specified it indicates the size the widget will
@@ -4312,7 +4895,7 @@ dojo.declare("dijit.layout._LayoutWidget",
 			//		Notification mode:
 			//			When changeSize is null, indicates that the caller has already changed
 			//			the size of the widget, or perhaps it changed because the browser
-			//			window was resized.  Tells widget to relayout it's contents accordingly.
+			//			window was resized.  Tells widget to relayout its contents accordingly.
 			//
 			//			If resultSize is also specified it indicates the size the widget has
 			//			become.
@@ -4320,7 +4903,7 @@ dojo.declare("dijit.layout._LayoutWidget",
 			//		In either mode, this method also:
 			//			1. Sets this._borderBox and this._contentBox to the new size of
 			//				the widget.  Queries the current domNode size if necessary.
-			//			2. Calls layout() to resize contents (and maybe adjust child widgets).	
+			//			2. Calls layout() to resize contents (and maybe adjust child widgets).
 			//
 			// changeSize: Object?
 			//		Sets the widget to this margin-box size and position.
@@ -4328,7 +4911,7 @@ dojo.declare("dijit.layout._LayoutWidget",
 			//	|	{w: int, h: int, l: int, t: int}
 			//
 			// resultSize: Object?
-			//		The margin-box size of this widget after applying changeSize (if 
+			//		The margin-box size of this widget after applying changeSize (if
 			//		changeSize is specified).  If caller knows this size and
 			//		passes it in, we don't need to query the browser to get the size.
 			//	|	{w: int, h: int}
@@ -4349,7 +4932,7 @@ dojo.declare("dijit.layout._LayoutWidget",
 			// inaccurate results, so try not to depend on it.
 			var mb = resultSize || {};
 			dojo.mixin(mb, changeSize || {});	// changeSize overrides resultSize
-			if ( !("h" in mb) || !("w" in mb) ){
+			if( !("h" in mb) || !("w" in mb) ){
 				mb = dojo.mixin(dojo.marginBox(node), mb);	// just use dojo.marginBox() to fill in missing values
 			}
 
@@ -4370,7 +4953,7 @@ dojo.declare("dijit.layout._LayoutWidget",
 				h: bb.h - pe.h
 			};
 
-			// Callback for widget to adjust size of it's children
+			// Callback for widget to adjust size of its children
 			this.layout();
 		},
 
@@ -4385,7 +4968,7 @@ dojo.declare("dijit.layout._LayoutWidget",
 			//		protected extension
 		},
 
-		_setupChild: function(/*Widget*/child){
+		_setupChild: function(/*dijit._Widget*/child){
 			// summary:
 			//		Common setup for initial children and children which are added after startup
 			// tags:
@@ -4397,7 +4980,7 @@ dojo.declare("dijit.layout._LayoutWidget",
 			}
 		},
 
-		addChild: function(/*Widget*/ child, /*Integer?*/ insertIndex){
+		addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){
 			// Overrides _Container.addChild() to call _setupChild()
 			this.inherited(arguments);
 			if(this._started){
@@ -4405,7 +4988,7 @@ dojo.declare("dijit.layout._LayoutWidget",
 			}
 		},
 
-		removeChild: function(/*Widget*/ child){
+		removeChild: function(/*dijit._Widget*/ child){
 			// Overrides _Container.removeChild() to remove class added by _setupChild()
 			dojo.removeClass(child.domNode, this.baseClass+"-child");
 			if(child.baseClass){
@@ -4482,11 +5065,11 @@ dijit.layout.marginBox2contentBox = function(/*DomNode*/ node, /*Object*/ mb){
 			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.
+			// note that setting the width of a <div> may affect its height.
 			if(pos == "top" || pos == "bottom"){
 				size(child, { w: dim.w });
 				dim.h -= child.h;
-				if(pos=="top"){
+				if(pos == "top"){
 					dim.t += child.h;
 				}else{
 					elmStyle.top = dim.t + dim.h + "px";
@@ -4518,7 +5101,6 @@ dojo.provide("dijit.form._FormWidget");
 
 dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 	{
-	//
 	// summary:
 	//		Base class for widgets corresponding to native HTML elements such as <checkbox> or <button>,
 	//		which can be children of a <form> node or a `dijit.form.Form` widget.
@@ -4528,7 +5110,7 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 	//		All these widgets should have these attributes just like native HTML input elements.
 	//		You can set them during widget construction or afterwards, via `dijit._Widget.attr`.
 	//
-	//	They also share some common methods.
+	//		They also share some common methods.
 
 	// baseClass: [protected] String
 	//		Root CSS class of the widget (ex: dijitTextBox), used to add CSS classes of widget
@@ -4561,12 +5143,6 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 	//		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,
@@ -4578,11 +5154,10 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 	// These mixins assume that the focus node is an INPUT, as many but not all _FormWidgets are.
 	attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
 		value: "focusNode",
-		disabled: "focusNode",
-		readOnly: "focusNode",
 		id: "focusNode",
 		tabIndex: "focusNode",
-		alt: "focusNode"
+		alt: "focusNode",
+		title: "focusNode"
 	}),
 
 	postMixInProperties: function(){
@@ -4595,19 +5170,22 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 	_setDisabledAttr: function(/*Boolean*/ value){
 		this.disabled = value;
 		dojo.attr(this.focusNode, 'disabled', value);
+		if(this.valueNode){
+			dojo.attr(this.valueNode, 'disabled', value);
+		}
 		dijit.setWaiState(this.focusNode, "disabled", value);
 
-				if(value){
-					//reset 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
-					this.focusNode.removeAttribute('tabIndex');
-				}else{
-					this.focusNode.setAttribute('tabIndex', this.tabIndex);
-				}
-				this._setStateClass();
+		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
+			this.focusNode.setAttribute('tabIndex', "-1");
+		}else{
+			this.focusNode.setAttribute('tabIndex', this.tabIndex);
+		}
+		this._setStateClass();
 	},
 
 	setDisabled: function(/*Boolean*/ disabled){
@@ -4657,8 +5235,8 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 					// 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(){
-						//if user clicks on the button, even if the mouse is released outside of it,
-						//this button should get focus (which mimics native browser buttons)
+						// if user clicks on the button, even if the mouse is released outside of it,
+						// this button should get focus (which mimics native browser buttons)
 						if(this._mouseDown && this.isFocusable()){
 							this.focus();
 						}
@@ -4775,11 +5353,15 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 		//		Compare 2 values (as returned by attr('value') for this widget).
 		// tags:
 		//		protected
-		if((typeof val1 == "number") && (typeof val2 == "number")){
-			return (isNaN(val1) && isNaN(val2))? 0 : (val1-val2);
-		}else if(val1 > val2){ return 1; }
-		else if(val1 < val2){ return -1; }
-		else { return 0; }
+		if(typeof val1 == "number" && typeof val2 == "number"){
+			return (isNaN(val1) && isNaN(val2)) ? 0 : val1 - val2;
+		}else if(val1 > val2){
+			return 1;
+		}else if(val1 < val2){
+			return -1;
+		}else{
+			return 0;
+		}
 	},
 
 	onChange: function(newValue){
@@ -4816,7 +5398,18 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 			((typeof newValue != typeof this._lastValueReported) ||
 				this.compare(newValue, this._lastValueReported) != 0)){
 			this._lastValueReported = newValue;
-			if(this._onChangeActive){ this.onChange(newValue); }
+			if(this._onChangeActive){
+				if(this._onChangeHandle){
+					clearTimeout(this._onChangeHandle);
+				}
+				// setTimout allows hidden value processing to run and
+				// also the onChange handler can safely adjust focus, etc
+				this._onChangeHandle = setTimeout(dojo.hitch(this,
+					function(){
+						this._onChangeHandle = null;
+						this.onChange(newValue);
+					}), 0); // try to collapse multiple onChange's fired faster than can be processed
+			}
 		}
 	},
 
@@ -4828,8 +5421,9 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 	},
 
 	destroy: function(){
-		if(this._layoutHackHandle){
-			clearTimeout(this._layoutHackHandle);
+		if(this._onChangeHandle){ // destroy called before last onChange has fired
+			clearTimeout(this._onChangeHandle);
+			this.onChange(this._lastValueReported);
 		}
 		this.inherited(arguments);
 	},
@@ -4846,21 +5440,6 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 		//		Deprecated.   Use attr('value') instead.
 		dojo.deprecated(this.declaredClass+"::getValue() is deprecated. Use attr('value') instead.", "", "2.0");
 		return this.attr('value');
-	},
-
-	_layoutHack: function(){
-		// summary:
-		//		Work around table sizing bugs on FF2 by forcing redraw
-
-		if(dojo.isFF == 2 && !this._layoutHackHandle){
-			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);
-		}
 	}
 });
 
@@ -4880,10 +5459,27 @@ dojo.declare("dijit.form._FormValueWidget", dijit.form._FormWidget,
 	// so maybe {value: ""} is so the value *doesn't* get copied to focusNode?
 	// Seems like we really want value removed from attributeMap altogether
 	// (although there's no easy way to do that now)
-	attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, { value: "" }),
+
+	// readOnly: Boolean
+	//		Should this widget respond to user input?
+	//		In markup, this is specified as "readOnly".
+	//		Similar to disabled except readOnly form values are submitted.
+	readOnly: false,
+
+	attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, {
+		value: "",
+		readOnly: "focusNode"
+	}),
+
+	_setReadOnlyAttr: function(/*Boolean*/ value){
+		this.readOnly = value;
+		dojo.attr(this.focusNode, 'readOnly', value);
+		dijit.setWaiState(this.focusNode, "readonly", value);
+		this._setStateClass();
+	},
 
 	postCreate: function(){
-		if(dojo.isIE || dojo.isWebKit){ // IE won't stop the event with keypress and Safari won't send an ESCAPE to keypress at all
+		if(dojo.isIE){ // IE won't stop the event with keypress
 			this.connect(this.focusNode || this.domNode, "onkeydown", this._onKeyDown);
 		}
 		// Update our reset value if it hasn't yet been set (because this.attr
@@ -4904,7 +5500,7 @@ dojo.declare("dijit.form._FormValueWidget", dijit.form._FormWidget,
 		this._handleOnChange(newValue, priorityChange);
 	},
 
-	_getValueAttr: function(/*String*/ value){
+	_getValueAttr: function(){
 		// summary:
 		//		Hook so attr('value') works.
 		return this._lastValue;
@@ -4924,20 +5520,35 @@ dojo.declare("dijit.form._FormValueWidget", dijit.form._FormWidget,
 	},
 
 	_onKeyDown: function(e){
-		if(e.keyCode == dojo.keys.ESCAPE && !e.ctrlKey && !e.altKey){
+		if(e.keyCode == dojo.keys.ESCAPE && !(e.ctrlKey || e.altKey || e.metaKey)){
 			var te;
-			if(dojo.isIE){ 
+			if(dojo.isIE){
 				e.preventDefault(); // default behavior needs to be stopped here since keypress is too late
 				te = document.createEventObject();
 				te.keyCode = dojo.keys.ESCAPE;
 				te.shiftKey = e.shiftKey;
 				e.srcElement.fireEvent('onkeypress', te);
-			}else if(dojo.isWebKit){ // ESCAPE needs help making it into keypress
-				te = document.createEvent('Events');
-				te.initEvent('keypress', true, true);
-				te.keyCode = dojo.keys.ESCAPE;
-				te.shiftKey = e.shiftKey;
-				e.target.dispatchEvent(te);
+			}
+		}
+	},
+
+	_layoutHackIE7: function(){
+		// summary:
+		//		Work around table sizing bugs on IE7 by forcing redraw
+
+		if(dojo.isIE == 7){ // fix IE7 layout bug when the widget is scrolled out of sight
+			var domNode = this.domNode;
+			var parent = domNode.parentNode;
+			var pingNode = domNode.firstChild || domNode; // target node most unlikely to have a custom filter
+			var origFilter = pingNode.style.filter; // save custom filter, most likely nothing
+			while(parent && parent.clientHeight == 0){ // search for parents that haven't rendered yet
+				parent._disconnectHandle = this.connect(parent, "onscroll", dojo.hitch(this, function(e){
+					this.disconnect(parent._disconnectHandle); // only call once
+					parent.removeAttribute("_disconnectHandle"); // clean up DOM node
+					pingNode.style.filter = (new Date()).getMilliseconds(); // set to anything that's unique
+					setTimeout(function(){ pingNode.style.filter = origFilter }, 0); // restore custom filter, if any
+				}));
+				parent = parent.parentNode;
 			}
 		}
 	}
@@ -4951,11 +5562,12 @@ dojo.provide("dijit.dijit");
 
 /*=====
 dijit.dijit = {
-	// summary: A roll-up for common dijit methods
+	// 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>
 	//
diff --git a/dijit/form/Button.js b/dijit/form/Button.js
index db7cf9b..f38d20d 100644
--- a/dijit/form/Button.js
+++ b/dijit/form/Button.js
@@ -10,63 +10,61 @@ 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,{label:"",showLabel:true,iconClass:"",type:"button",baseClass:"dijitButton",templateString:"<span class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachEvent=\"ondijitclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\"\n\t><span class=\"dijitReset dijitRight dijitInline\"\n\t\t><span class=\"dijitReset dijitInline dijitButtonNode\"\n\t\t\t><button class=\"dijitReset dijitStretch dijitButto [...]
-if(this.disabled||this.readOnly){
+dojo.require("dijit._HasDropDown");
+dojo.declare("dijit.form.Button",dijit.form._FormWidget,{label:"",showLabel:true,iconClass:"",type:"button",baseClass:"dijitButton",templateString:dojo.cache("dijit.form","templates/Button.html","<span class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachEvent=\"onclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\"\n\t><span class=\"dijitReset dijitRight dijitInline\"\n\t\t><span class=\"dijitReset dijitInline dijitButtonNode\"\n\t\t\t><button [...]
+if(this.disabled){
 return false;
 }
 this._clicked();
 return this.onClick(e);
 },_onButtonClick:function(e){
-if(e.type!="click"&&!(this.type=="submit"||this.type=="reset")){
-dojo.stopEvent(e);
-}
 if(this._onClick(e)===false){
 e.preventDefault();
 }else{
 if(this.type=="submit"&&!this.focusNode.form){
-for(var _3=this.domNode;_3.parentNode;_3=_3.parentNode){
-var _4=dijit.byNode(_3);
-if(_4&&typeof _4._onSubmit=="function"){
-_4._onSubmit(e);
+for(var _1=this.domNode;_1.parentNode;_1=_1.parentNode){
+var _2=dijit.byNode(_1);
+if(_2&&typeof _2._onSubmit=="function"){
+_2._onSubmit(e);
 break;
 }
 }
 }
 }
-},_setValueAttr:function(_5){
-var _6=this.attributeMap.value||"";
-if(this[_6.node||_6||"domNode"].tagName=="BUTTON"){
-if(_5!=this.value){
-
+},_setValueAttr:function(_3){
+var _4=this.attributeMap.value||"";
+if(this[_4.node||_4||"domNode"].tagName=="BUTTON"){
+if(_3!=this.value){
 }
 }
-},_fillContent:function(_7){
-if(_7&&!("label" in this.params)){
-this.attr("label",_7.innerHTML);
+},_fillContent:function(_5){
+if(_5&&(!this.params||!("label" in this.params))){
+this.attr("label",_5.innerHTML);
 }
 },postCreate:function(){
-if(this.showLabel==false){
-dojo.addClass(this.containerNode,"dijitDisplayNone");
-}
 dojo.setSelectable(this.focusNode,false);
 this.inherited(arguments);
+},_setShowLabelAttr:function(_6){
+if(this.containerNode){
+dojo.toggleClass(this.containerNode,"dijitDisplayNone",!_6);
+}
+this.showLabel=_6;
 },onClick:function(e){
 return true;
 },_clicked:function(e){
-},setLabel:function(_a){
+},setLabel:function(_7){
 dojo.deprecated("dijit.form.Button.setLabel() is deprecated.  Use attr('label', ...) instead.","","2.0");
-this.attr("label",_a);
-},_setLabelAttr:function(_b){
-this.containerNode.innerHTML=this.label=_b;
-this._layoutHack();
+this.attr("label",_7);
+},_setLabelAttr:function(_8){
+this.containerNode.innerHTML=this.label=_8;
 if(this.showLabel==false&&!this.params.title){
 this.titleNode.title=dojo.trim(this.containerNode.innerText||this.containerNode.textContent||"");
 }
 }});
-dojo.declare("dijit.form.DropDownButton",[dijit.form.Button,dijit._Container],{baseClass:"dijitDropDownButton",templateString:"<span class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse,onclick:_onDropDownClick,onkeydown:_onDropDownKeydown,onblur:_onDropDownBlur,onkeypress:_onKey\"\n\t><span class='dijitReset dijitRight dijitInline'\n\t\t><span class='dijitReset dijitInline dijitButtonNode'\n\t\t\t><button  [...]
+dojo.declare("dijit.form.DropDownButton",[dijit.form.Button,dijit._Container,dijit._HasDropDown],{baseClass:"dijitDropDownButton",templateString:dojo.cache("dijit.form","templates/DropDownButton.html","<span class=\"dijit dijitReset dijitLeft dijitInline\"\n\tdojoAttachPoint=\"_buttonNode\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\"\n\t><span class='dijitReset dijitRight dijitInline'\n\t\t><span class='dijitReset dijitInline dijitButtonNode'\n [...]
 if(this.srcNodeRef){
-var _c=dojo.query("*",this.srcNodeRef);
-dijit.form.DropDownButton.superclass._fillContent.call(this,_c[0]);
+var _9=dojo.query("*",this.srcNodeRef);
+dijit.form.DropDownButton.superclass._fillContent.call(this,_9[0]);
 this.dropDownContainer=this.srcNodeRef;
 }
 },startup:function(){
@@ -74,135 +72,50 @@ if(this._started){
 return;
 }
 if(!this.dropDown){
-var _d=dojo.query("[widgetId]",this.dropDownContainer)[0];
-this.dropDown=dijit.byNode(_d);
+var _a=dojo.query("[widgetId]",this.dropDownContainer)[0];
+this.dropDown=dijit.byNode(_a);
 delete this.dropDownContainer;
 }
-dijit.popup.prepare(this.dropDown.domNode);
+dijit.popup.moveOffScreen(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 _10=dojo.isFF&&dojo.isFF<3&&navigator.appVersion.indexOf("Macintosh")!=-1;
-if(!_10||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.charOrCode==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 _14=this.dropDown;
-if(!_14){
+},isLoaded:function(){
+var _b=this.dropDown;
+return (!_b.href||_b.isLoaded);
+},loadDropDown:function(){
+var _c=this.dropDown;
+if(!_c){
 return;
 }
-if(!this._opened){
-if(_14.href&&!_14.isLoaded){
-var _15=this;
-var _16=dojo.connect(_14,"onLoad",function(){
-dojo.disconnect(_16);
-_15._openDropDown();
+if(!this.isLoaded()){
+var _d=dojo.connect(_c,"onLoad",this,function(){
+dojo.disconnect(_d);
+this.openDropDown();
 });
-_14.refresh();
-return;
+_c.refresh();
 }else{
-this._openDropDown();
+this.openDropDown();
 }
-}else{
-this._closeDropDown();
-}
-},_openDropDown:function(){
-var _17=this.dropDown;
-var _18=_17.domNode.style.width;
-var _19=this;
-dijit.popup.open({parent:this,popup:_17,around:this.domNode,orient:this.isLeftToRight()?{"BL":"TL","BR":"TR","TL":"BL","TR":"BR"}:{"BR":"TR","BL":"TL","TR":"BR","TL":"BL"},onExecute:function(){
-_19._closeDropDown(true);
-},onCancel:function(){
-_19._closeDropDown(true);
-},onClose:function(){
-_17.domNode.style.width=_18;
-_19.popupStateNode.removeAttribute("popupActive");
-_19._opened=false;
+},isFocusable:function(){
+return this.inherited(arguments)&&!this._mouseDown;
 }});
-if(this.domNode.offsetWidth>_17.domNode.offsetWidth){
-var _1a=null;
-if(!this.isLeftToRight()){
-_1a=_17.domNode.parentNode;
-var _1b=_1a.offsetLeft+_1a.offsetWidth;
-}
-dojo.marginBox(_17.domNode,{w:this.domNode.offsetWidth});
-if(_1a){
-_1a.style.left=_1b-this.domNode.offsetWidth+"px";
-}
-}
-this.popupStateNode.setAttribute("popupActive","true");
-this._opened=true;
-if(_17.focus){
-_17.focus();
-}
-},_closeDropDown:function(_1c){
-if(this._opened){
-dijit.popup.close(this.dropDown);
-if(_1c){
-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 class=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\"\n\t\t\tdojoAttachEvent=\"ondijitclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\"  dojoAttachPoint=\"titleNode\"\n [...]
+dojo.declare("dijit.form.ComboButton",dijit.form.DropDownButton,{templateString:dojo.cache("dijit.form","templates/ComboButton.html","<table class='dijit dijitReset dijitInline dijitLeft'\n\tcellspacing='0' cellpadding='0' waiRole=\"presentation\"\n\t><tbody waiRole=\"presentation\"><tr waiRole=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonNode\"><button id=\"${id}_button\" class=\"dijitReset dijitButtonContents\"\n\t\t\tdojoAttachEvent=\"onclick:_onButtonClick,on [...]
 this.inherited(arguments);
-this._focalNodes=[this.titleNode,this.popupStateNode];
-dojo.forEach(this._focalNodes,dojo.hitch(this,function(_1d){
-if(dojo.isIE){
-this.connect(_1d,"onactivate",this._onNodeFocus);
-this.connect(_1d,"ondeactivate",this._onNodeBlur);
-}else{
-this.connect(_1d,"onfocus",this._onNodeFocus);
-this.connect(_1d,"onblur",this._onNodeBlur);
-}
+this._focalNodes=[this.titleNode,this._popupStateNode];
+var _e=dojo.isIE;
+dojo.forEach(this._focalNodes,dojo.hitch(this,function(_f){
+this.connect(_f,_e?"onactivate":"onfocus",this._onNodeFocus);
+this.connect(_f,_e?"ondeactivate":"onblur",this._onNodeBlur);
 }));
-},focusFocalNode:function(_1e){
-this._focusedNode=_1e;
-dijit.focus(_1e);
-},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;
+if(_e&&(_e<8||dojo.isQuirks)){
+with(this.titleNode){
+style.width=scrollWidth+"px";
+this.connect(this.titleNode,"onresize",function(){
+setTimeout(function(){
+style.width=scrollWidth+"px";
+},0);
+});
+}
+}
 },_onNodeFocus:function(evt){
 this._focusedNode=evt.currentTarget;
 var fnc=this._focusedNode==this.focusNode?"dijitDownArrowButtonFocused":"dijitButtonContentsFocused";
@@ -213,18 +126,30 @@ dojo.removeClass(evt.currentTarget,fnc);
 },_onBlur:function(){
 this.inherited(arguments);
 this._focusedNode=null;
+},_onButtonKeyPress:function(evt){
+if(evt.charOrCode==dojo.keys[this.isLeftToRight()?"RIGHT_ARROW":"LEFT_ARROW"]){
+dijit.focus(this._popupStateNode);
+dojo.stopEvent(evt);
+}
+},_onArrowKeyPress:function(evt){
+if(evt.charOrCode==dojo.keys[this.isLeftToRight()?"LEFT_ARROW":"RIGHT_ARROW"]){
+dijit.focus(this.titleNode);
+dojo.stopEvent(evt);
+}
+},focus:function(_10){
+dijit.focus(_10=="start"?this.titleNode:this._popupStateNode);
 }});
 dojo.declare("dijit.form.ToggleButton",dijit.form.Button,{baseClass:"dijitToggleButton",checked:false,attributeMap:dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap),{checked:"focusNode"}),_clicked:function(evt){
 this.attr("checked",!this.checked);
-},_setCheckedAttr:function(_24){
-this.checked=_24;
-dojo.attr(this.focusNode||this.domNode,"checked",_24);
-dijit.setWaiState(this.focusNode||this.domNode,"pressed",_24);
+},_setCheckedAttr:function(_11){
+this.checked=_11;
+dojo.attr(this.focusNode||this.domNode,"checked",_11);
+dijit.setWaiState(this.focusNode||this.domNode,"pressed",_11);
 this._setStateClass();
-this._handleOnChange(_24,true);
-},setChecked:function(_25){
-dojo.deprecated("setChecked("+_25+") is deprecated. Use attr('checked',"+_25+") instead.","","2.0");
-this.attr("checked",_25);
+this._handleOnChange(_11,true);
+},setChecked:function(_12){
+dojo.deprecated("setChecked("+_12+") is deprecated. Use attr('checked',"+_12+") instead.","","2.0");
+this.attr("checked",_12);
 },reset:function(){
 this._hasBeenBlurred=false;
 this.attr("checked",this.params.checked||false);
diff --git a/dijit/form/CheckBox.js b/dijit/form/CheckBox.js
index 7fa44dc..93761e1 100644
--- a/dijit/form/CheckBox.js
+++ b/dijit/form/CheckBox.js
@@ -9,14 +9,19 @@ if(!dojo._hasResource["dijit.form.CheckBox"]){
 dojo._hasResource["dijit.form.CheckBox"]=true;
 dojo.provide("dijit.form.CheckBox");
 dojo.require("dijit.form.Button");
-dojo.declare("dijit.form.CheckBox",dijit.form.ToggleButton,{templateString:"<div class=\"dijitReset dijitInline\" waiRole=\"presentation\"\n\t><input\n\t \t${nameAttrSetting} type=\"${type}\" ${checkedAttrSetting}\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdojoAttachPoint=\"focusNode\"\n\t \tdojoAttachEvent=\"onmouseover:_onMouse,onmouseout:_onMouse,onclick:_onClick\"\n/></div>\n",baseClass:"dijitCheckBox",type:"checkbox",value:"on",_setValueAttr:function(_1){
-if(typeof _1=="string"){
-this.value=_1;
-dojo.attr(this.focusNode,"value",_1);
-_1=true;
+dojo.declare("dijit.form.CheckBox",dijit.form.ToggleButton,{templateString:dojo.cache("dijit.form","templates/CheckBox.html","<div class=\"dijitReset dijitInline\" waiRole=\"presentation\"\n\t><input\n\t \t${nameAttrSetting} type=\"${type}\" ${checkedAttrSetting}\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdojoAttachPoint=\"focusNode\"\n\t \tdojoAttachEvent=\"onmouseover:_onMouse,onmouseout:_onMouse,onclick:_onClick\"\n/></div>\n"),baseClass:"dijitCheckBox",type:"checkbox",value:"o [...]
+this.readOnly=_1;
+dojo.attr(this.focusNode,"readOnly",_1);
+dijit.setWaiState(this.focusNode,"readonly",_1);
+this._setStateClass();
+},_setValueAttr:function(_2){
+if(typeof _2=="string"){
+this.value=_2;
+dojo.attr(this.focusNode,"value",_2);
+_2=true;
 }
 if(this._created){
-this.attr("checked",_1);
+this.attr("checked",_2);
 }
 },_getValueAttr:function(){
 return (this.checked?this.value:false);
@@ -26,7 +31,7 @@ this.value="on";
 }
 this.checkedAttrSetting=this.checked?"checked":"";
 this.inherited(arguments);
-},_fillContent:function(_2){
+},_fillContent:function(_3){
 },reset:function(){
 this._hasBeenBlurred=false;
 this.attr("checked",this.params.checked||false);
@@ -40,19 +45,24 @@ dojo.query("label[for='"+this.id+"']").addClass("dijitFocusedLabel");
 if(this.id){
 dojo.query("label[for='"+this.id+"']").removeClass("dijitFocusedLabel");
 }
+},_onClick:function(e){
+if(this.readOnly){
+return false;
+}
+return this.inherited(arguments);
 }});
-dojo.declare("dijit.form.RadioButton",dijit.form.CheckBox,{type:"radio",baseClass:"dijitRadio",_setCheckedAttr:function(_3){
+dojo.declare("dijit.form.RadioButton",dijit.form.CheckBox,{type:"radio",baseClass:"dijitRadio",_setCheckedAttr:function(_4){
 this.inherited(arguments);
 if(!this._created){
 return;
 }
-if(_3){
-var _4=this;
-dojo.query("INPUT[type=radio]",this.focusNode.form||dojo.doc).forEach(function(_5){
-if(_5.name==_4.name&&_5!=_4.focusNode&&_5.form==_4.focusNode.form){
-var _6=dijit.getEnclosingWidget(_5);
-if(_6&&_6.checked){
-_6.attr("checked",false);
+if(_4){
+var _5=this;
+dojo.query("INPUT[type=radio]",this.focusNode.form||dojo.doc).forEach(function(_6){
+if(_6.name==_5.name&&_6!=_5.focusNode&&_6.form==_5.focusNode.form){
+var _7=dijit.getEnclosingWidget(_6);
+if(_7&&_7.checked){
+_7.attr("checked",false);
 }
 }
 });
diff --git a/dijit/form/ComboBox.js b/dijit/form/ComboBox.js
index 10e9396..5e2bff1 100644
--- a/dijit/form/ComboBox.js
+++ b/dijit/form/ComboBox.js
@@ -8,204 +8,196 @@
 if(!dojo._hasResource["dijit.form.ComboBox"]){
 dojo._hasResource["dijit.form.ComboBox"]=true;
 dojo.provide("dijit.form.ComboBox");
+dojo.require("dijit.form._FormWidget");
 dojo.require("dijit.form.ValidationTextBox");
 dojo.require("dojo.data.util.simpleFetch");
 dojo.require("dojo.data.util.filter");
 dojo.require("dojo.regexp");
 dojo.requireLocalization("dijit.form","ComboBox",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
-dojo.declare("dijit.form.ComboBoxMixin",null,{item:null,pageSize:Infinity,store:null,fetchProperties:{},query:{},autoComplete:true,highlightMatch:"first",searchDelay:100,searchAttr:"name",labelAttr:"",labelType:"text",queryExpr:"${0}*",ignoreCase:true,hasDownArrow:true,templateString:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" dojoAttachPoint=\"comboNode\" waiRol [...]
+dojo.declare("dijit.form.ComboBoxMixin",null,{item:null,pageSize:Infinity,store:null,fetchProperties:{},query:{},autoComplete:true,highlightMatch:"first",searchDelay:100,searchAttr:"name",labelAttr:"",labelType:"text",queryExpr:"${0}*",ignoreCase:true,hasDownArrow:true,templateString:dojo.cache("dijit.form","templates/ComboBox.html","<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedo [...]
 var _2=0;
 if(typeof (_1.selectionStart)=="number"){
 _2=_1.selectionStart;
 }else{
 if(dojo.isIE){
 var tr=dojo.doc.selection.createRange().duplicate();
-var _4=_1.createTextRange();
+var _3=_1.createTextRange();
 tr.move("character",0);
-_4.move("character",0);
+_3.move("character",0);
 try{
-_4.setEndPoint("EndToEnd",tr);
-_2=String(_4.text).replace(/\r/g,"").length;
+_3.setEndPoint("EndToEnd",tr);
+_2=String(_3.text).replace(/\r/g,"").length;
 }
 catch(e){
 }
 }
 }
 return _2;
-},_setCaretPos:function(_5,_6){
-_6=parseInt(_6);
-dijit.selectInputText(_5,_6,_6);
-},_setDisabledAttr:function(_7){
+},_setCaretPos:function(_4,_5){
+_5=parseInt(_5);
+dijit.selectInputText(_4,_5,_5);
+},_setDisabledAttr:function(_6){
 this.inherited(arguments);
-dijit.setWaiState(this.comboNode,"disabled",_7);
-},_onKeyPress:function(_8){
-var _9=_8.charOrCode;
-if(_8.altKey||(_8.ctrlKey&&(_9!="x"&&_9!="v"))||_8.key==dojo.keys.SHIFT){
+dijit.setWaiState(this.comboNode,"disabled",_6);
+},_abortQuery:function(){
+if(this.searchTimer){
+clearTimeout(this.searchTimer);
+this.searchTimer=null;
+}
+if(this._fetchHandle){
+if(this._fetchHandle.abort){
+this._fetchHandle.abort();
+}
+this._fetchHandle=null;
+}
+},_onKeyPress:function(_7){
+var _8=_7.charOrCode;
+if(_7.altKey||((_7.ctrlKey||_7.metaKey)&&(_8!="x"&&_8!="v"))||_8==dojo.keys.SHIFT){
 return;
 }
-var _a=false;
+var _9=false;
+var _a="_startSearchFromInput";
 var pw=this._popupWidget;
 var dk=dojo.keys;
-var _d=null;
+var _b=null;
+this._prev_key_backspace=false;
+this._abortQuery();
 if(this._isShowingNow){
-pw.handleKey(_9);
-_d=pw.getHighlightedOption();
+pw.handleKey(_8);
+_b=pw.getHighlightedOption();
 }
-switch(_9){
+switch(_8){
 case dk.PAGE_DOWN:
 case dk.DOWN_ARROW:
-if(!this._isShowingNow||this._prev_key_esc){
-this._arrowPressed();
-_a=true;
-}else{
-if(_d){
-this._announceOption(_d);
-}
-}
-dojo.stopEvent(_8);
-this._prev_key_backspace=false;
-this._prev_key_esc=false;
-break;
 case dk.PAGE_UP:
 case dk.UP_ARROW:
-if(this._isShowingNow){
-this._announceOption(_d);
+if(!this._isShowingNow){
+this._arrowPressed();
+_9=true;
+_a="_startSearchAll";
+}else{
+this._announceOption(_b);
 }
-dojo.stopEvent(_8);
-this._prev_key_backspace=false;
-this._prev_key_esc=false;
+dojo.stopEvent(_7);
 break;
 case dk.ENTER:
-if(_d){
-if(_d==pw.nextButton){
+if(_b){
+if(_b==pw.nextButton){
 this._nextSearch(1);
-dojo.stopEvent(_8);
+dojo.stopEvent(_7);
 break;
 }else{
-if(_d==pw.previousButton){
+if(_b==pw.previousButton){
 this._nextSearch(-1);
-dojo.stopEvent(_8);
+dojo.stopEvent(_7);
 break;
 }
 }
 }else{
-this._setDisplayedValueAttr(this.attr("displayedValue"),true);
+this._setBlurValue();
+this._setCaretPos(this.focusNode,this.focusNode.value.length);
 }
-_8.preventDefault();
+_7.preventDefault();
 case dk.TAB:
-var _e=this.attr("displayedValue");
-if(pw&&(_e==pw._messages["previousMessage"]||_e==pw._messages["nextMessage"])){
+var _c=this.attr("displayedValue");
+if(pw&&(_c==pw._messages["previousMessage"]||_c==pw._messages["nextMessage"])){
 break;
 }
-if(this._isShowingNow){
-this._prev_key_backspace=false;
-this._prev_key_esc=false;
-if(_d){
-pw.attr("value",{target:_d});
+if(_b){
+this._selectOption();
 }
+if(this._isShowingNow){
 this._lastQuery=null;
 this._hideResultList();
 }
 break;
 case " ":
-this._prev_key_backspace=false;
-this._prev_key_esc=false;
-if(_d){
-dojo.stopEvent(_8);
+if(_b){
+dojo.stopEvent(_7);
 this._selectOption();
 this._hideResultList();
 }else{
-_a=true;
+_9=true;
 }
 break;
 case dk.ESCAPE:
-this._prev_key_backspace=false;
-this._prev_key_esc=true;
 if(this._isShowingNow){
-dojo.stopEvent(_8);
+dojo.stopEvent(_7);
 this._hideResultList();
 }
 break;
 case dk.DELETE:
 case dk.BACKSPACE:
-this._prev_key_esc=false;
 this._prev_key_backspace=true;
-_a=true;
-break;
-case dk.RIGHT_ARROW:
-case dk.LEFT_ARROW:
-this._prev_key_backspace=false;
-this._prev_key_esc=false;
+_9=true;
 break;
 default:
-this._prev_key_backspace=false;
-this._prev_key_esc=false;
-_a=typeof _9=="string";
+_9=typeof _8=="string"||_8==229;
 }
-if(this.searchTimer){
-clearTimeout(this.searchTimer);
-}
-if(_a){
-setTimeout(dojo.hitch(this,"_startSearchFromInput"),1);
+if(_9){
+this.item=undefined;
+this.searchTimer=setTimeout(dojo.hitch(this,_a),1);
 }
-},_autoCompleteText:function(_f){
+},_autoCompleteText:function(_d){
 var fn=this.focusNode;
 dijit.selectInputText(fn,fn.value.length);
-var _11=this.ignoreCase?"toLowerCase":"substr";
-if(_f[_11](0).indexOf(this.focusNode.value[_11](0))==0){
-var _12=this._getCaretPos(fn);
-if((_12+1)>fn.value.length){
-fn.value=_f;
-dijit.selectInputText(fn,_12);
+var _e=this.ignoreCase?"toLowerCase":"substr";
+if(_d[_e](0).indexOf(this.focusNode.value[_e](0))==0){
+var _f=this._getCaretPos(fn);
+if((_f+1)>fn.value.length){
+fn.value=_d;
+dijit.selectInputText(fn,_f);
 }
 }else{
-fn.value=_f;
+fn.value=_d;
 dijit.selectInputText(fn);
 }
-},_openResultList:function(_13,_14){
-if(this.disabled||this.readOnly||(_14.query[this.searchAttr]!=this._lastQuery)){
+},_openResultList:function(_10,_11){
+this._fetchHandle=null;
+if(this.disabled||this.readOnly||(_11.query[this.searchAttr]!=this._lastQuery)){
 return;
 }
 this._popupWidget.clearResultList();
-if(!_13.length){
+if(!_10.length){
 this._hideResultList();
 return;
 }
-this.item=null;
-var _15=new String(this.store.getValue(_13[0],this.searchAttr));
-if(_15&&this.autoComplete&&!this._prev_key_backspace&&(_14.query[this.searchAttr]!="*")){
-this.item=_13[0];
-this._autoCompleteText(_15);
-}
-_14._maxOptions=this._maxOptions;
-this._popupWidget.createOptions(_13,_14,dojo.hitch(this,"_getMenuLabelFromItem"));
+_11._maxOptions=this._maxOptions;
+var _12=this._popupWidget.createOptions(_10,_11,dojo.hitch(this,"_getMenuLabelFromItem"));
 this._showResultList();
-if(_14.direction){
-if(1==_14.direction){
+if(_11.direction){
+if(1==_11.direction){
 this._popupWidget.highlightFirstOption();
 }else{
-if(-1==_14.direction){
+if(-1==_11.direction){
 this._popupWidget.highlightLastOption();
 }
 }
 this._announceOption(this._popupWidget.getHighlightedOption());
+}else{
+if(this.autoComplete&&!this._prev_key_backspace&&!/^[*]+$/.test(_11.query[this.searchAttr])){
+this._announceOption(_12[1]);
+}
 }
 },_showResultList:function(){
 this._hideResultList();
-var _16=this._popupWidget.getItems(),_17=Math.min(_16.length,this.maxListLength);
 this._arrowPressed();
 this.displayMessage("");
 dojo.style(this._popupWidget.domNode,{width:"",height:""});
-var _18=this.open();
-var _19=dojo.marginBox(this._popupWidget.domNode);
-this._popupWidget.domNode.style.overflow=((_18.h==_19.h)&&(_18.w==_19.w))?"hidden":"auto";
-var _1a=_18.w;
-if(_18.h<this._popupWidget.domNode.scrollHeight){
-_1a+=16;
-}
-dojo.marginBox(this._popupWidget.domNode,{h:_18.h,w:Math.max(_1a,this.domNode.offsetWidth)});
+var _13=this.open();
+var _14=dojo.marginBox(this._popupWidget.domNode);
+this._popupWidget.domNode.style.overflow=((_13.h==_14.h)&&(_13.w==_14.w))?"hidden":"auto";
+var _15=_13.w;
+if(_13.h<this._popupWidget.domNode.scrollHeight){
+_15+=16;
+}
+dojo.marginBox(this._popupWidget.domNode,{h:_13.h,w:Math.max(_15,this.domNode.offsetWidth)});
+if(_15<this.domNode.offsetWidth){
+this._popupWidget.domNode.parentNode.style.left=dojo.position(this.domNode).x+"px";
+}
 dijit.setWaiState(this.comboNode,"expanded","true");
 },_hideResultList:function(){
+this._abortQuery();
 if(this._isShowingNow){
 dijit.popup.close(this._popupWidget);
 this._arrowIdle();
@@ -214,49 +206,55 @@ dijit.setWaiState(this.comboNode,"expanded","false");
 dijit.removeWaiState(this.focusNode,"activedescendant");
 }
 },_setBlurValue:function(){
-var _1b=this.attr("displayedValue");
+var _16=this.attr("displayedValue");
 var pw=this._popupWidget;
-if(pw&&(_1b==pw._messages["previousMessage"]||_1b==pw._messages["nextMessage"])){
+if(pw&&(_16==pw._messages["previousMessage"]||_16==pw._messages["nextMessage"])){
 this._setValueAttr(this._lastValueReported,true);
 }else{
-this.attr("displayedValue",_1b);
+if(typeof this.item=="undefined"){
+this.item=null;
+this.attr("displayedValue",_16);
+}else{
+if(this.value!=this._lastValueReported){
+dijit.form._FormValueWidget.prototype._setValueAttr.call(this,this.value,true);
+}
+this._refreshState();
+}
 }
 },_onBlur:function(){
 this._hideResultList();
 this._arrowIdle();
 this.inherited(arguments);
-},_announceOption:function(_1d){
-if(_1d==null){
+},_setItemAttr:function(_17,_18,_19){
+if(!_19){
+_19=this.labelFunc(_17,this.store);
+}
+this.value=this._getValueField()!=this.searchAttr?this.store.getIdentity(_17):_19;
+this.item=_17;
+dijit.form.ComboBox.superclass._setValueAttr.call(this,this.value,_18,_19);
+},_announceOption:function(_1a){
+if(!_1a){
 return;
 }
-var _1e;
-if(_1d==this._popupWidget.nextButton||_1d==this._popupWidget.previousButton){
-_1e=_1d.innerHTML;
+var _1b;
+if(_1a==this._popupWidget.nextButton||_1a==this._popupWidget.previousButton){
+_1b=_1a.innerHTML;
+this.item=undefined;
+this.value="";
 }else{
-_1e=this.store.getValue(_1d.item,this.searchAttr);
+_1b=this.labelFunc(_1a.item,this.store);
+this.attr("item",_1a.item,false,_1b);
 }
-this.focusNode.value=this.focusNode.value.substring(0,this._getCaretPos(this.focusNode));
-dijit.setWaiState(this.focusNode,"activedescendant",dojo.attr(_1d,"id"));
-this._autoCompleteText(_1e);
+this.focusNode.value=this.focusNode.value.substring(0,this._lastInput.length);
+dijit.setWaiState(this.focusNode,"activedescendant",dojo.attr(_1a,"id"));
+this._autoCompleteText(_1b);
 },_selectOption:function(evt){
-var tgt=null;
-if(!evt){
-evt={target:this._popupWidget.getHighlightedOption()};
-}
-if(!evt.target){
-this.attr("displayedValue",this.attr("displayedValue"));
-return;
-}else{
-tgt=evt.target;
+if(evt){
+this._announceOption(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.attr("value",this.store.getValue(tgt.item,this.searchAttr));
+this._setCaretPos(this.focusNode,this.focusNode.value.length);
+dijit.form._FormValueWidget.prototype._setValueAttr.call(this,this.value,true);
 },_onArrowMouseDown:function(evt){
 if(this.disabled||this.readOnly){
 return;
@@ -266,39 +264,42 @@ this.focus();
 if(this._isShowingNow){
 this._hideResultList();
 }else{
-this._startSearch("");
+this._startSearchAll();
 }
+},_startSearchAll:function(){
+this._startSearch("");
 },_startSearchFromInput:function(){
 this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g,"\\$1"));
-},_getQueryString:function(_23){
-return dojo.string.substitute(this.queryExpr,[_23]);
+},_getQueryString:function(_1c){
+return dojo.string.substitute(this.queryExpr,[_1c]);
 },_startSearch:function(key){
 if(!this._popupWidget){
-var _25=this.id+"_popup";
-this._popupWidget=new dijit.form._ComboBoxMenu({onChange:dojo.hitch(this,this._selectOption),id:_25});
+var _1d=this.id+"_popup";
+this._popupWidget=new dijit.form._ComboBoxMenu({onChange:dojo.hitch(this,this._selectOption),id:_1d});
 dijit.removeWaiState(this.focusNode,"activedescendant");
-dijit.setWaiState(this.textbox,"owns",_25);
+dijit.setWaiState(this.textbox,"owns",_1d);
 }
-this.item=null;
-var _26=dojo.clone(this.query);
+var _1e=dojo.clone(this.query);
 this._lastInput=key;
-this._lastQuery=_26[this.searchAttr]=this._getQueryString(key);
-this.searchTimer=setTimeout(dojo.hitch(this,function(_27,_28){
-var _29={queryOptions:{ignoreCase:this.ignoreCase,deep:true},query:_27,onBegin:dojo.hitch(this,"_setMaxOptions"),onComplete:dojo.hitch(this,"_openResultList"),onError:function(_2a){
-console.error("dijit.form.ComboBox: "+_2a);
-dojo.hitch(_28,"_hideResultList")();
+this._lastQuery=_1e[this.searchAttr]=this._getQueryString(key);
+this.searchTimer=setTimeout(dojo.hitch(this,function(_1f,_20){
+this.searchTimer=null;
+var _21={queryOptions:{ignoreCase:this.ignoreCase,deep:true},query:_1f,onBegin:dojo.hitch(this,"_setMaxOptions"),onComplete:dojo.hitch(this,"_openResultList"),onError:function(_22){
+_20._fetchHandle=null;
+console.error("dijit.form.ComboBox: "+_22);
+dojo.hitch(_20,"_hideResultList")();
 },start:0,count:this.pageSize};
-dojo.mixin(_29,_28.fetchProperties);
-var _2b=_28.store.fetch(_29);
-var _2c=function(_2d,_2e){
-_2d.start+=_2d.count*_2e;
-_2d.direction=_2e;
-this.store.fetch(_2d);
+dojo.mixin(_21,_20.fetchProperties);
+this._fetchHandle=_20.store.fetch(_21);
+var _23=function(_24,_25){
+_24.start+=_24.count*_25;
+_24.direction=_25;
+this._fetchHandle=this.store.fetch(_24);
 };
-this._nextSearch=this._popupWidget.onPage=dojo.hitch(this,_2c,_2b);
-},_26,this),this.searchDelay);
-},_setMaxOptions:function(_2f,_30){
-this._maxOptions=_2f;
+this._nextSearch=this._popupWidget.onPage=dojo.hitch(this,_23,this._fetchHandle);
+},_1e,this),this.searchDelay);
+},_setMaxOptions:function(_26,_27){
+this._maxOptions=_26;
 },_getValueField:function(){
 return this.searchAttr;
 },_arrowPressed:function(){
@@ -310,7 +311,7 @@ if(!this.disabled&&!this.readOnly&&this.hasDownArrow){
 dojo.removeClass(this.downArrowNode,"dojoArrowButtonPushed");
 }
 },compositionend:function(evt){
-this._onKeyPress({charCode:-1});
+this._onKeyPress({charOrCode:229});
 },constructor:function(){
 this.query={};
 this.fetchProperties={};
@@ -319,42 +320,44 @@ if(!this.hasDownArrow){
 this.baseClass="dijitTextBox";
 }
 if(!this.store){
-var _32=this.srcNodeRef;
-this.store=new dijit.form._ComboBoxDataStore(_32);
-if(!this.value||((typeof _32.selectedIndex=="number")&&_32.selectedIndex.toString()===this.value)){
-var _33=this.store.fetchSelectedItem();
-if(_33){
-this.value=this.store.getValue(_33,this._getValueField());
+var _28=this.srcNodeRef;
+this.store=new dijit.form._ComboBoxDataStore(_28);
+if(!this.value||((typeof _28.selectedIndex=="number")&&_28.selectedIndex.toString()===this.value)){
+var _29=this.store.fetchSelectedItem();
+if(_29){
+var _2a=this._getValueField();
+this.value=_2a!=this.searchAttr?this.store.getValue(_29,_2a):this.labelFunc(_29,this.store);
 }
 }
 }
 this.inherited(arguments);
 },postCreate:function(){
-var _34=dojo.query("label[for=\""+this.id+"\"]");
-if(_34.length){
-_34[0].id=(this.id+"_label");
+var _2b=dojo.query("label[for=\""+this.id+"\"]");
+if(_2b.length){
+_2b[0].id=(this.id+"_label");
 var cn=this.comboNode;
-dijit.setWaiState(cn,"labelledby",_34[0].id);
+dijit.setWaiState(cn,"labelledby",_2b[0].id);
 }
 this.inherited(arguments);
 },uninitialize:function(){
-if(this._popupWidget){
+if(this._popupWidget&&!this._popupWidget._destroyed){
 this._hideResultList();
 this._popupWidget.destroy();
 }
-},_getMenuLabelFromItem:function(_36){
-var _37=this.store.getValue(_36,this.labelAttr||this.searchAttr);
-var _38=this.labelType;
+this.inherited(arguments);
+},_getMenuLabelFromItem:function(_2c){
+var _2d=this.labelAttr?this.store.getValue(_2c,this.labelAttr):this.labelFunc(_2c,this.store);
+var _2e=this.labelType;
 if(this.highlightMatch!="none"&&this.labelType=="text"&&this._lastInput){
-_37=this.doHighlight(_37,this._escapeHtml(this._lastInput));
-_38="html";
-}
-return {html:_38=="html",label:_37};
-},doHighlight:function(_39,_3a){
-var _3b="i"+(this.highlightMatch=="all"?"g":"");
-var _3c=this._escapeHtml(_39);
-_3a=dojo.regexp.escapeString(_3a);
-var ret=_3c.replace(new RegExp("(^|\\s)("+_3a+")",_3b),"$1<span class=\"dijitComboBoxHighlightMatch\">$2</span>");
+_2d=this.doHighlight(_2d,this._escapeHtml(this._lastInput));
+_2e="html";
+}
+return {html:_2e=="html",label:_2d};
+},doHighlight:function(_2f,_30){
+var _31="i"+(this.highlightMatch=="all"?"g":"");
+var _32=this._escapeHtml(_2f);
+_30=dojo.regexp.escapeString(_30);
+var ret=_32.replace(new RegExp("(^|\\s)("+_30+")",_31),"$1<span class=\"dijitComboBoxHighlightMatch\">$2</span>");
 return ret;
 },_escapeHtml:function(str){
 str=String(str).replace(/&/gm,"&").replace(/</gm,"<").replace(/>/gm,">").replace(/"/gm,""");
@@ -365,70 +368,69 @@ return dijit.popup.open({popup:this._popupWidget,around:this.domNode,parent:this
 },reset:function(){
 this.item=null;
 this.inherited(arguments);
+},labelFunc:function(_33,_34){
+return _34.getValue(_33,this.searchAttr).toString();
 }});
 dojo.declare("dijit.form._ComboBoxMenu",[dijit._Widget,dijit._Templated],{templateString:"<ul class='dijitReset dijitMenu' dojoAttachEvent='onmousedown:_onMouseDown,onmouseup:_onMouseUp,onmouseover:_onMouseOver,onmouseout:_onMouseOut' tabIndex='-1' style='overflow: \"auto\"; overflow-x: \"hidden\";'>"+"<li class='dijitMenuItem dijitMenuPreviousButton' dojoAttachPoint='previousButton' waiRole='option'></li>"+"<li class='dijitMenuItem dijitMenuNextButton' dojoAttachPoint='nextButton' waiRo [...]
 this._messages=dojo.i18n.getLocalization("dijit.form","ComboBox",this.lang);
 this.inherited(arguments);
-},_setValueAttr:function(_3f){
-this.value=_3f;
-this.onChange(_3f);
-},onChange:function(_40){
-},onPage:function(_41){
+},_setValueAttr:function(_35){
+this.value=_35;
+this.onChange(_35);
+},onChange:function(_36){
+},onPage:function(_37){
 },postCreate:function(){
 this.previousButton.innerHTML=this._messages["previousMessage"];
 this.nextButton.innerHTML=this._messages["nextMessage"];
 this.inherited(arguments);
 },onClose:function(){
 this._blurOptionNode();
-},_createOption:function(_42,_43){
-var _44=_43(_42);
-var _45=dojo.doc.createElement("li");
-dijit.setWaiRole(_45,"option");
-if(_44.html){
-_45.innerHTML=_44.label;
+},_createOption:function(_38,_39){
+var _3a=_39(_38);
+var _3b=dojo.doc.createElement("li");
+dijit.setWaiRole(_3b,"option");
+if(_3a.html){
+_3b.innerHTML=_3a.label;
 }else{
-_45.appendChild(dojo.doc.createTextNode(_44.label));
+_3b.appendChild(dojo.doc.createTextNode(_3a.label));
 }
-if(_45.innerHTML==""){
-_45.innerHTML=" ";
+if(_3b.innerHTML==""){
+_3b.innerHTML=" ";
 }
-_45.item=_42;
-return _45;
-},createOptions:function(_46,_47,_48){
-this.previousButton.style.display=(_47.start==0)?"none":"";
+_3b.item=_38;
+return _3b;
+},createOptions:function(_3c,_3d,_3e){
+this.previousButton.style.display=(_3d.start==0)?"none":"";
 dojo.attr(this.previousButton,"id",this.id+"_prev");
-dojo.forEach(_46,function(_49,i){
-var _4b=this._createOption(_49,_48);
-_4b.className="dijitReset dijitMenuItem";
-dojo.attr(_4b,"id",this.id+i);
-this.domNode.insertBefore(_4b,this.nextButton);
+dojo.forEach(_3c,function(_3f,i){
+var _40=this._createOption(_3f,_3e);
+_40.className="dijitReset dijitMenuItem";
+dojo.attr(_40,"id",this.id+i);
+this.domNode.insertBefore(_40,this.nextButton);
 },this);
-var _4c=false;
-if(_47._maxOptions&&_47._maxOptions!=-1){
-if((_47.start+_47.count)<_47._maxOptions){
-_4c=true;
+var _41=false;
+if(_3d._maxOptions&&_3d._maxOptions!=-1){
+if((_3d.start+_3d.count)<_3d._maxOptions){
+_41=true;
 }else{
-if((_47.start+_47.count)>(_47._maxOptions-1)){
-if(_47.count==_46.length){
-_4c=true;
+if((_3d.start+_3d.count)>(_3d._maxOptions-1)){
+if(_3d.count==_3c.length){
+_41=true;
 }
 }
 }
 }else{
-if(_47.count==_46.length){
-_4c=true;
+if(_3d.count==_3c.length){
+_41=true;
 }
 }
-this.nextButton.style.display=_4c?"":"none";
+this.nextButton.style.display=_41?"":"none";
 dojo.attr(this.nextButton,"id",this.id+"_next");
+return this.domNode.childNodes;
 },clearResultList:function(){
 while(this.domNode.childNodes.length>2){
 this.domNode.removeChild(this.domNode.childNodes[this.domNode.childNodes.length-2]);
 }
-},getItems:function(){
-return this.domNode.childNodes;
-},getListLength:function(){
-return this.domNode.childNodes.length-2;
 },_onMouseDown:function(evt){
 dojo.stopEvent(evt);
 },_onMouseUp:function(evt){
@@ -465,10 +467,10 @@ if(evt.target===this.domNode){
 return;
 }
 this._blurOptionNode();
-},_focusOptionNode:function(_53){
-if(this._highlighted_option!=_53){
+},_focusOptionNode:function(_42){
+if(this._highlighted_option!=_42){
 this._blurOptionNode();
-this._highlighted_option=_53;
+this._highlighted_option=_42;
 dojo.addClass(this._highlighted_option,"dijitMenuItemSelected");
 }
 },_blurOptionNode:function(){
@@ -505,13 +507,13 @@ this._focusOptionNode(ps);
 }
 dijit.scrollIntoView(this._highlighted_option);
 },_page:function(up){
-var _59=0;
-var _5a=this.domNode.scrollTop;
-var _5b=dojo.style(this.domNode,"height");
+var _43=0;
+var _44=this.domNode.scrollTop;
+var _45=dojo.style(this.domNode,"height");
 if(!this.getHighlightedOption()){
 this._highlightNextOption();
 }
-while(_59<_5b){
+while(_43<_45){
 if(up){
 if(!this.getHighlightedOption().previousSibling||this._highlighted_option.previousSibling.style.display=="none"){
 break;
@@ -523,9 +525,9 @@ break;
 }
 this._highlightNextOption();
 }
-var _5c=this.domNode.scrollTop;
-_59+=(_5c-_5a)*(up?-1:1);
-_5a=_5c;
+var _46=this.domNode.scrollTop;
+_43+=(_46-_44)*(up?-1:1);
+_44=_46;
 }
 },pageUp:function(){
 this._page(true);
@@ -550,52 +552,53 @@ this.pageUp();
 break;
 }
 }});
-dojo.declare("dijit.form.ComboBox",[dijit.form.ValidationTextBox,dijit.form.ComboBoxMixin],{_setValueAttr:function(_5f,_60){
-if(!_5f){
-_5f="";
+dojo.declare("dijit.form.ComboBox",[dijit.form.ValidationTextBox,dijit.form.ComboBoxMixin],{_setValueAttr:function(_47,_48,_49){
+this.item=null;
+if(!_47){
+_47="";
 }
-dijit.form.ValidationTextBox.prototype._setValueAttr.call(this,_5f,_60);
+dijit.form.ValidationTextBox.prototype._setValueAttr.call(this,_47,_48,_49);
 }});
-dojo.declare("dijit.form._ComboBoxDataStore",null,{constructor:function(_61){
-this.root=_61;
-dojo.query("> option",_61).forEach(function(_62){
-_62.innerHTML=dojo.trim(_62.innerHTML);
+dojo.declare("dijit.form._ComboBoxDataStore",null,{constructor:function(_4a){
+this.root=_4a;
+dojo.query("> option",_4a).forEach(function(_4b){
+_4b.innerHTML=dojo.trim(_4b.innerHTML);
 });
-},getValue:function(_63,_64,_65){
-return (_64=="value")?_63.value:(_63.innerText||_63.textContent||"");
-},isItemLoaded:function(_66){
+},getValue:function(_4c,_4d,_4e){
+return (_4d=="value")?_4c.value:(_4c.innerText||_4c.textContent||"");
+},isItemLoaded:function(_4f){
 return true;
 },getFeatures:function(){
 return {"dojo.data.api.Read":true,"dojo.data.api.Identity":true};
-},_fetchItems:function(_67,_68,_69){
-if(!_67.query){
-_67.query={};
+},_fetchItems:function(_50,_51,_52){
+if(!_50.query){
+_50.query={};
 }
-if(!_67.query.name){
-_67.query.name="";
+if(!_50.query.name){
+_50.query.name="";
 }
-if(!_67.queryOptions){
-_67.queryOptions={};
+if(!_50.queryOptions){
+_50.queryOptions={};
 }
-var _6a=dojo.data.util.filter.patternToRegExp(_67.query.name,_67.queryOptions.ignoreCase),_6b=dojo.query("> option",this.root).filter(function(_6c){
-return (_6c.innerText||_6c.textContent||"").match(_6a);
+var _53=dojo.data.util.filter.patternToRegExp(_50.query.name,_50.queryOptions.ignoreCase),_54=dojo.query("> option",this.root).filter(function(_55){
+return (_55.innerText||_55.textContent||"").match(_53);
 });
-if(_67.sort){
-_6b.sort(dojo.data.util.sorter.createSortFunction(_67.sort,this));
+if(_50.sort){
+_54.sort(dojo.data.util.sorter.createSortFunction(_50.sort,this));
 }
-_68(_6b,_67);
-},close:function(_6d){
+_51(_54,_50);
+},close:function(_56){
 return;
-},getLabel:function(_6e){
-return _6e.innerHTML;
-},getIdentity:function(_6f){
-return dojo.attr(_6f,"value");
-},fetchItemByIdentity:function(_70){
-var _71=dojo.query("option[value='"+_70.identity+"']",this.root)[0];
-_70.onItem(_71);
+},getLabel:function(_57){
+return _57.innerHTML;
+},getIdentity:function(_58){
+return dojo.attr(_58,"value");
+},fetchItemByIdentity:function(_59){
+var _5a=dojo.query("option[value='"+_59.identity+"']",this.root)[0];
+_59.onItem(_5a);
 },fetchSelectedItem:function(){
-var _72=this.root,si=_72.selectedIndex;
-return dojo.query("> option:nth-child("+(si!=-1?si+1:1)+")",_72)[0];
+var _5b=this.root,si=_5b.selectedIndex;
+return dojo.query("> option:nth-child("+(si!=-1?si+1:1)+")",_5b)[0];
 }});
 dojo.extend(dijit.form._ComboBoxDataStore,dojo.data.util.simpleFetch);
 }
diff --git a/dijit/form/CurrencyTextBox.js b/dijit/form/CurrencyTextBox.js
index 0f9b140..412885d 100644
--- a/dijit/form/CurrencyTextBox.js
+++ b/dijit/form/CurrencyTextBox.js
@@ -10,8 +10,16 @@ dojo._hasResource["dijit.form.CurrencyTextBox"]=true;
 dojo.provide("dijit.form.CurrencyTextBox");
 dojo.require("dojo.currency");
 dojo.require("dijit.form.NumberTextBox");
-dojo.declare("dijit.form.CurrencyTextBox",dijit.form.NumberTextBox,{currency:"",regExpGen:dojo.currency.regexp,_formatter:dojo.currency.format,parse:dojo.currency.parse,postMixInProperties:function(){
-this.constraints.currency=this.currency;
+dojo.declare("dijit.form.CurrencyTextBox",dijit.form.NumberTextBox,{currency:"",regExpGen:function(_1){
+return "("+(this._focused?this.inherited(arguments,[dojo.mixin({},_1,this.editOptions)])+"|":"")+dojo.currency.regexp(_1)+")";
+},_formatter:dojo.currency.format,parse:function(_2,_3){
+var v=dojo.currency.parse(_2,_3);
+if(isNaN(v)&&/\d+/.test(_2)){
+return this.inherited(arguments,[_2,dojo.mixin({},_3,this.editOptions)]);
+}
+return v;
+},postMixInProperties:function(){
+this.constraints=dojo.currency._mixInDefaults(dojo.mixin(this.constraints,{currency:this.currency,exponent:false}));
 this.inherited(arguments);
 }});
 }
diff --git a/dijit/form/DateTextBox.js b/dijit/form/DateTextBox.js
index 5595f38..95e6c42 100644
--- a/dijit/form/DateTextBox.js
+++ b/dijit/form/DateTextBox.js
@@ -8,7 +8,7 @@
 if(!dojo._hasResource["dijit.form.DateTextBox"]){
 dojo._hasResource["dijit.form.DateTextBox"]=true;
 dojo.provide("dijit.form.DateTextBox");
-dojo.require("dijit._Calendar");
+dojo.require("dijit.Calendar");
 dojo.require("dijit.form._DateTimeTextBox");
-dojo.declare("dijit.form.DateTextBox",dijit.form._DateTimeTextBox,{baseClass:"dijitTextBox dijitDateTextBox",popupClass:"dijit._Calendar",_selector:"date",value:new Date("")});
+dojo.declare("dijit.form.DateTextBox",dijit.form._DateTimeTextBox,{baseClass:"dijitTextBox dijitDateTextBox",popupClass:"dijit.Calendar",_selector:"date",value:new Date("")});
 }
diff --git a/dijit/form/FilteringSelect.js b/dijit/form/FilteringSelect.js
index b8a1e69..4080463 100644
--- a/dijit/form/FilteringSelect.js
+++ b/dijit/form/FilteringSelect.js
@@ -22,7 +22,7 @@ this._isvalid=false;
 this.validate(this._focused);
 this.item=null;
 }else{
-this._setValueFromItem(_1[0],_3);
+this.attr("item",_1[0],_3);
 }
 },_openResultList:function(_4,_5){
 if(_5.query[this.searchAttr]!=this._lastQuery){
@@ -35,63 +35,47 @@ dijit.form.ComboBoxMixin.prototype._openResultList.apply(this,arguments);
 return this.valueNode.value;
 },_getValueField:function(){
 return "value";
-},_setValue:function(_6,_7,_8){
-this.valueNode.value=_6;
-dijit.form.FilteringSelect.superclass._setValueAttr.call(this,_6,_8,_7);
-this._lastDisplayedValue=_7;
-},_setValueAttr:function(_9,_a){
+},_setValueAttr:function(_6,_7){
 if(!this._onChangeActive){
-_a=null;
+_7=null;
 }
-this._lastQuery=_9;
-if(_9===null||_9===""){
-this._setDisplayedValueAttr("",_a);
+this._lastQuery=_6;
+if(_6===null||_6===""){
+this._setDisplayedValueAttr("",_7);
 return;
 }
-var _b=this;
-var _c=function(_d,_e){
-if(_d){
-if(_b.store.isItemLoaded(_d)){
-_b._callbackSetLabel([_d],undefined,_e);
-}else{
-_b.store.loadItem({item:_d,onItem:function(_f,_10){
-_b._callbackSetLabel(_f,_10,_e);
-}});
-}
-}else{
-_b._isvalid=false;
-_b.validate(false);
-}
-};
-this.store.fetchItemByIdentity({identity:_9,onItem:function(_11){
-_c(_11,_a);
+var _8=this;
+this.store.fetchItemByIdentity({identity:_6,onItem:function(_9){
+_8._callbackSetLabel([_9],undefined,_7);
 }});
-},_setValueFromItem:function(_12,_13){
+},_setItemAttr:function(_a,_b,_c){
 this._isvalid=true;
-this.item=_12;
-this._setValue(this.store.getIdentity(_12),this.labelFunc(_12,this.store),_13);
-},labelFunc:function(_14,_15){
-return _15.getValue(_14,this.searchAttr);
-},_doSelect:function(tgt){
-this._setValueFromItem(tgt.item,true);
-},_setDisplayedValueAttr:function(_17,_18){
+this.inherited(arguments);
+this.valueNode.value=this.value;
+this._lastDisplayedValue=this.textbox.value;
+},_getDisplayQueryString:function(_d){
+return _d.replace(/([\\\*\?])/g,"\\$1");
+},_setDisplayedValueAttr:function(_e,_f){
 if(!this._created){
-_18=false;
+_f=false;
 }
 if(this.store){
-var _19=dojo.clone(this.query);
-this._lastQuery=_19[this.searchAttr]=_17.replace(/([\\\*\?])/g,"\\$1");
-this.textbox.value=_17;
-this._lastDisplayedValue=_17;
-var _1a=this;
-var _1b={query:_19,queryOptions:{ignoreCase:this.ignoreCase,deep:true},onComplete:function(_1c,_1d){
-dojo.hitch(_1a,"_callbackSetLabel")(_1c,_1d,_18);
-},onError:function(_1e){
-console.error("dijit.form.FilteringSelect: "+_1e);
-dojo.hitch(_1a,"_setValue")("",_17,false);
+this._hideResultList();
+var _10=dojo.clone(this.query);
+this._lastQuery=_10[this.searchAttr]=this._getDisplayQueryString(_e);
+this.textbox.value=_e;
+this._lastDisplayedValue=_e;
+var _11=this;
+var _12={query:_10,queryOptions:{ignoreCase:this.ignoreCase,deep:true},onComplete:function(_13,_14){
+_11._fetchHandle=null;
+dojo.hitch(_11,"_callbackSetLabel")(_13,_14,_f);
+},onError:function(_15){
+_11._fetchHandle=null;
+console.error("dijit.form.FilteringSelect: "+_15);
+dojo.hitch(_11,"_callbackSetLabel")([],undefined,false);
 }};
-dojo.mixin(_1b,this.fetchProperties);
-this.store.fetch(_1b);
+dojo.mixin(_12,this.fetchProperties);
+this._fetchHandle=this.store.fetch(_12);
 }
 },postMixInProperties:function(){
 this.inherited(arguments);
diff --git a/dijit/form/Form.js b/dijit/form/Form.js
index 6e44ac1..d9328d3 100644
--- a/dijit/form/Form.js
+++ b/dijit/form/Form.js
@@ -33,11 +33,11 @@ this.inherited(arguments);
 },onReset:function(e){
 return true;
 },_onReset:function(e){
-var _6={returnValue:true,preventDefault:function(){
+var _4={returnValue:true,preventDefault:function(){
 this.returnValue=false;
 },stopPropagation:function(){
 },currentTarget:e.currentTarget,target:e.target};
-if(!(this.onReset(_6)===false)&&_6.returnValue){
+if(!(this.onReset(_4)===false)&&_4.returnValue){
 this.reset();
 }
 dojo.stopEvent(e);
diff --git a/dijit/form/HorizontalRule.js b/dijit/form/HorizontalRule.js
index bf3ef27..29f8e97 100644
--- a/dijit/form/HorizontalRule.js
+++ b/dijit/form/HorizontalRule.js
@@ -18,17 +18,17 @@ if(this.count==1){
 _3=this._genHTML(50,0);
 }else{
 var i;
-var _5=100/(this.count-1);
+var _4=100/(this.count-1);
 if(!this._isHorizontal||this.isLeftToRight()){
 _3=this._genHTML(0,0);
 for(i=1;i<this.count-1;i++){
-_3+=this._genHTML(_5*i,i);
+_3+=this._genHTML(_4*i,i);
 }
 _3+=this._genHTML(100,this.count-1);
 }else{
 _3=this._genHTML(100,0);
 for(i=1;i<this.count-1;i++){
-_3+=this._genHTML(100-_5*i,i);
+_3+=this._genHTML(100-_4*i,i);
 }
 _3+=this._genHTML(0,this.count-1);
 }
diff --git a/dijit/form/HorizontalSlider.js b/dijit/form/HorizontalSlider.js
index ef9bbb1..6fc4e56 100644
--- a/dijit/form/HorizontalSlider.js
+++ b/dijit/form/HorizontalSlider.js
@@ -14,16 +14,21 @@ dojo.require("dojo.dnd.move");
 dojo.require("dijit.form.Button");
 dojo.require("dojo.number");
 dojo.require("dojo._base.fx");
-dojo.declare("dijit.form.HorizontalSlider",[dijit.form._FormValueWidget,dijit._Container],{templateString:"<table class=\"dijit dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" dojoAttachEvent=\"onkeypress:_onKeyPress\"\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\ [...]
-if(this.disabled||this.readOnly||e.altKey||e.ctrlKey){
+dojo.declare("dijit.form.HorizontalSlider",[dijit.form._FormValueWidget,dijit._Container],{templateString:dojo.cache("dijit.form","templates/HorizontalSlider.html","<table class=\"dijit dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" dojoAttachEvent=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset\" colspan=\"2\"></td\n\t\t><td dojoAttachPoint=\"topDecoration\" class=\"dijitReset\" style=\"text- [...]
+if(this.disabled||this.readOnly||e.altKey||e.ctrlKey||e.metaKey){
+return;
+}
+this._setValueAttr(this.value,true);
+},_onKeyPress:function(e){
+if(this.disabled||this.readOnly||e.altKey||e.ctrlKey||e.metaKey){
 return;
 }
 switch(e.charOrCode){
 case dojo.keys.HOME:
-this._setValueAttr(this.minimum,true);
+this._setValueAttr(this.minimum,false);
 break;
 case dojo.keys.END:
-this._setValueAttr(this.maximum,true);
+this._setValueAttr(this.maximum,false);
 break;
 case ((this._descending||this.isLeftToRight())?dojo.keys.RIGHT_ARROW:dojo.keys.LEFT_ARROW):
 case (this._descending===false?dojo.keys.DOWN_ARROW:dojo.keys.UP_ARROW):
@@ -55,75 +60,75 @@ return;
 }
 dijit.focus(this.sliderHandle);
 dojo.stopEvent(e);
-var _4=dojo.coords(this.sliderBarContainer,true);
-var _5=e[this._mousePixelCoord]-_4[this._startingPixelCoord];
-this._setPixelValue(this._isReversed()?(_4[this._pixelCount]-_5):_5,_4[this._pixelCount],true);
+var _1=dojo.position(this.sliderBarContainer,true);
+var _2=e[this._mousePixelCoord]-_1[this._startingPixelCoord];
+this._setPixelValue(this._isReversed()?(_1[this._pixelCount]-_2):_2,_1[this._pixelCount],true);
 this._movable.onMouseDown(e);
-},_setPixelValue:function(_6,_7,_8){
+},_setPixelValue:function(_3,_4,_5){
 if(this.disabled||this.readOnly){
 return;
 }
-_6=_6<0?0:_7<_6?_7:_6;
-var _9=this.discreteValues;
-if(_9<=1||_9==Infinity){
-_9=_7;
-}
-_9--;
-var _a=_7/_9;
-var _b=Math.round(_6/_a);
-this._setValueAttr((this.maximum-this.minimum)*_b/_9+this.minimum,_8);
-},_setValueAttr:function(_c,_d){
-this.valueNode.value=this.value=_c;
-dijit.setWaiState(this.focusNode,"valuenow",_c);
+_3=_3<0?0:_4<_3?_4:_3;
+var _6=this.discreteValues;
+if(_6<=1||_6==Infinity){
+_6=_4;
+}
+_6--;
+var _7=_4/_6;
+var _8=Math.round(_3/_7);
+this._setValueAttr((this.maximum-this.minimum)*_8/_6+this.minimum,_5);
+},_setValueAttr:function(_9,_a){
+this.valueNode.value=this.value=_9;
+dijit.setWaiState(this.focusNode,"valuenow",_9);
 this.inherited(arguments);
-var _e=(_c-this.minimum)/(this.maximum-this.minimum);
-var _f=(this._descending===false)?this.remainingBar:this.progressBar;
-var _10=(this._descending===false)?this.progressBar:this.remainingBar;
+var _b=(_9-this.minimum)/(this.maximum-this.minimum);
+var _c=(this._descending===false)?this.remainingBar:this.progressBar;
+var _d=(this._descending===false)?this.progressBar:this.remainingBar;
 if(this._inProgressAnim&&this._inProgressAnim.status!="stopped"){
 this._inProgressAnim.stop(true);
 }
-if(_d&&this.slideDuration>0&&_f.style[this._progressPixelSize]){
-var _11=this;
-var _12={};
-var _13=parseFloat(_f.style[this._progressPixelSize]);
-var _14=this.slideDuration*(_e-_13/100);
-if(_14==0){
+if(_a&&this.slideDuration>0&&_c.style[this._progressPixelSize]){
+var _e=this;
+var _f={};
+var _10=parseFloat(_c.style[this._progressPixelSize]);
+var _11=this.slideDuration*(_b-_10/100);
+if(_11==0){
 return;
 }
-if(_14<0){
-_14=0-_14;
+if(_11<0){
+_11=0-_11;
 }
-_12[this._progressPixelSize]={start:_13,end:_e*100,units:"%"};
-this._inProgressAnim=dojo.animateProperty({node:_f,duration:_14,onAnimate:function(v){
-_10.style[_11._progressPixelSize]=(100-parseFloat(v[_11._progressPixelSize]))+"%";
+_f[this._progressPixelSize]={start:_10,end:_b*100,units:"%"};
+this._inProgressAnim=dojo.animateProperty({node:_c,duration:_11,onAnimate:function(v){
+_d.style[_e._progressPixelSize]=(100-parseFloat(v[_e._progressPixelSize]))+"%";
 },onEnd:function(){
-delete _11._inProgressAnim;
-},properties:_12});
+delete _e._inProgressAnim;
+},properties:_f});
 this._inProgressAnim.play();
 }else{
-_f.style[this._progressPixelSize]=(_e*100)+"%";
-_10.style[this._progressPixelSize]=((1-_e)*100)+"%";
+_c.style[this._progressPixelSize]=(_b*100)+"%";
+_d.style[this._progressPixelSize]=((1-_b)*100)+"%";
 }
-},_bumpValue:function(_16){
+},_bumpValue:function(_12,_13){
 if(this.disabled||this.readOnly){
 return;
 }
 var s=dojo.getComputedStyle(this.sliderBarContainer);
 var c=dojo._getContentBox(this.sliderBarContainer,s);
-var _19=this.discreteValues;
-if(_19<=1||_19==Infinity){
-_19=c[this._pixelCount];
+var _14=this.discreteValues;
+if(_14<=1||_14==Infinity){
+_14=c[this._pixelCount];
 }
-_19--;
-var _1a=(this.value-this.minimum)*_19/(this.maximum-this.minimum)+_16;
-if(_1a<0){
-_1a=0;
+_14--;
+var _15=(this.value-this.minimum)*_14/(this.maximum-this.minimum)+_12;
+if(_15<0){
+_15=0;
 }
-if(_1a>_19){
-_1a=_19;
+if(_15>_14){
+_15=_14;
 }
-_1a=_1a*(this.maximum-this.minimum)/_19+this.minimum;
-this._setValueAttr(_1a,true);
+_15=_15*(this.maximum-this.minimum)/_14+this.minimum;
+this._setValueAttr(_15,_13);
 },_onClkBumper:function(val){
 if(this.disabled||this.readOnly||!this.clickSelect){
 return;
@@ -139,20 +144,21 @@ this._bumpValue(e.charOrCode==dojo.keys.PAGE_DOWN?-this.pageIncrement:-1);
 this._bumpValue(e.charOrCode==dojo.keys.PAGE_UP?this.pageIncrement:1);
 },_mouseWheeled:function(evt){
 dojo.stopEvent(evt);
-var _1f=!dojo.isMozilla;
-var _20=evt[(_1f?"wheelDelta":"detail")]*(_1f?1:-1);
-this[(_20<0?"decrement":"increment")](evt);
+var _16=!dojo.isMozilla;
+var _17=evt[(_16?"wheelDelta":"detail")]*(_16?1:-1);
+this._bumpValue(_17<0?-1:1,true);
 },startup:function(){
-dojo.forEach(this.getChildren(),function(_21){
-if(this[_21.container]!=this.containerNode){
-this[_21.container].appendChild(_21.domNode);
+dojo.forEach(this.getChildren(),function(_18){
+if(this[_18.container]!=this.containerNode){
+this[_18.container].appendChild(_18.domNode);
 }
 },this);
-},_typematicCallback:function(_22,_23,e){
-if(_22==-1){
-return;
+},_typematicCallback:function(_19,_1a,e){
+if(_19==-1){
+this._setValueAttr(this.value,true);
+}else{
+this[(_1a==(this._descending?this.incrementButton:this.decrementButton))?"decrement":"increment"](e);
 }
-this[(_23==(this._descending?this.incrementButton:this.decrementButton))?"decrement":"increment"](e);
 },postCreate:function(){
 if(this.showButtons){
 this.incrementButton.style.display="";
@@ -161,42 +167,39 @@ this._connects.push(dijit.typematic.addMouseListener(this.decrementButton,this,"
 this._connects.push(dijit.typematic.addMouseListener(this.incrementButton,this,"_typematicCallback",25,500));
 }
 this.connect(this.domNode,!dojo.isMozilla?"onmousewheel":"DOMMouseScroll","_mouseWheeled");
-var _25=this;
-var _26=function(){
-dijit.form._SliderMover.apply(this,arguments);
-this.widget=_25;
-};
-dojo.extend(_26,dijit.form._SliderMover.prototype);
-this._movable=new dojo.dnd.Moveable(this.sliderHandle,{mover:_26});
-var _27=dojo.query("label[for=\""+this.id+"\"]");
-if(_27.length){
-_27[0].id=(this.id+"_label");
-dijit.setWaiState(this.focusNode,"labelledby",_27[0].id);
+var _1b=dojo.declare(dijit.form._SliderMover,{widget:this});
+this._movable=new dojo.dnd.Moveable(this.sliderHandle,{mover:_1b});
+var _1c=dojo.query("label[for=\""+this.id+"\"]");
+if(_1c.length){
+_1c[0].id=(this.id+"_label");
+dijit.setWaiState(this.focusNode,"labelledby",_1c[0].id);
 }
 dijit.setWaiState(this.focusNode,"valuemin",this.minimum);
 dijit.setWaiState(this.focusNode,"valuemax",this.maximum);
 this.inherited(arguments);
+this._layoutHackIE7();
 },destroy:function(){
 this._movable.destroy();
 if(this._inProgressAnim&&this._inProgressAnim.status!="stopped"){
 this._inProgressAnim.stop(true);
 }
+this._supportingWidgets=dijit.findWidgets(this.domNode);
 this.inherited(arguments);
 }});
 dojo.declare("dijit.form._SliderMover",dojo.dnd.Mover,{onMouseMove:function(e){
-var _29=this.widget;
-var _2a=_29._abspos;
-if(!_2a){
-_2a=_29._abspos=dojo.coords(_29.sliderBarContainer,true);
-_29._setPixelValue_=dojo.hitch(_29,"_setPixelValue");
-_29._isReversed_=_29._isReversed();
-}
-var _2b=e[_29._mousePixelCoord]-_2a[_29._startingPixelCoord];
-_29._setPixelValue_(_29._isReversed_?(_2a[_29._pixelCount]-_2b):_2b,_2a[_29._pixelCount],false);
+var _1d=this.widget;
+var _1e=_1d._abspos;
+if(!_1e){
+_1e=_1d._abspos=dojo.position(_1d.sliderBarContainer,true);
+_1d._setPixelValue_=dojo.hitch(_1d,"_setPixelValue");
+_1d._isReversed_=_1d._isReversed();
+}
+var _1f=e[_1d._mousePixelCoord]-_1e[_1d._startingPixelCoord];
+_1d._setPixelValue_(_1d._isReversed_?(_1e[_1d._pixelCount]-_1f):_1f,_1e[_1d._pixelCount],false);
 },destroy:function(e){
 dojo.dnd.Mover.prototype.destroy.apply(this,arguments);
-var _2d=this.widget;
-_2d._abspos=null;
-_2d._setValueAttr(_2d.value,true);
+var _20=this.widget;
+_20._abspos=null;
+_20._setValueAttr(_20.value,true);
 }});
 }
diff --git a/dijit/form/MultiSelect.js b/dijit/form/MultiSelect.js
index 97ad7ba..bdd661f 100644
--- a/dijit/form/MultiSelect.js
+++ b/dijit/form/MultiSelect.js
@@ -9,16 +9,16 @@ if(!dojo._hasResource["dijit.form.MultiSelect"]){
 dojo._hasResource["dijit.form.MultiSelect"]=true;
 dojo.provide("dijit.form.MultiSelect");
 dojo.require("dijit.form._FormWidget");
-dojo.declare("dijit.form.MultiSelect",dijit.form._FormWidget,{size:7,templateString:"<select multiple='true' ${nameAttrSetting} dojoAttachPoint='containerNode,focusNode' dojoAttachEvent='onchange: _onChange'></select>",attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{size:"focusNode"}),reset:function(){
+dojo.declare("dijit.form.MultiSelect",dijit.form._FormValueWidget,{size:7,templateString:"<select multiple='true' ${nameAttrSetting} dojoAttachPoint='containerNode,focusNode' dojoAttachEvent='onchange: _onChange'></select>",attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{size:"focusNode"}),reset:function(){
 this._hasBeenBlurred=false;
 this._setValueAttr(this._resetValue,true);
 },addSelected:function(_1){
 _1.getSelected().forEach(function(n){
 this.containerNode.appendChild(n);
 this.domNode.scrollTop=this.domNode.offsetHeight;
-var _3=_1.domNode.scrollTop;
+var _2=_1.domNode.scrollTop;
 _1.domNode.scrollTop=0;
-_1.domNode.scrollTop=_3;
+_1.domNode.scrollTop=_2;
 },this);
 },getSelected:function(){
 return dojo.query("option",this.containerNode).filter(function(n){
@@ -28,20 +28,20 @@ return n.selected;
 return this.getSelected().map(function(n){
 return n.value;
 });
-},_multiValue:true,_setValueAttr:function(_6){
+},multiple:true,_setValueAttr:function(_3){
 dojo.query("option",this.containerNode).forEach(function(n){
-n.selected=(dojo.indexOf(_6,n.value)!=-1);
+n.selected=(dojo.indexOf(_3,n.value)!=-1);
 });
-},invertSelection:function(_8){
+},invertSelection:function(_4){
 dojo.query("option",this.containerNode).forEach(function(n){
 n.selected=!n.selected;
 });
-this._handleOnChange(this.attr("value"),_8==true);
+this._handleOnChange(this.attr("value"),_4==true);
 },_onChange:function(e){
 this._handleOnChange(this.attr("value"),true);
-},resize:function(_b){
-if(_b){
-dojo.marginBox(this.domNode,_b);
+},resize:function(_5){
+if(_5){
+dojo.marginBox(this.domNode,_5);
 }
 },postCreate:function(){
 this._onChange();
diff --git a/dijit/form/NumberSpinner.js b/dijit/form/NumberSpinner.js
index c9137e0..f5a341c 100644
--- a/dijit/form/NumberSpinner.js
+++ b/dijit/form/NumberSpinner.js
@@ -10,27 +10,27 @@ 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],{required:true,adjust:function(_1,_2){
-var tc=this.constraints,v=isNaN(_1),_5=!isNaN(tc.max),_6=!isNaN(tc.min);
+dojo.declare("dijit.form.NumberSpinner",[dijit.form._Spinner,dijit.form.NumberTextBoxMixin],{adjust:function(_1,_2){
+var tc=this.constraints,v=isNaN(_1),_3=!isNaN(tc.max),_4=!isNaN(tc.min);
 if(v&&_2!=0){
-_1=(_2>0)?_6?tc.min:_5?tc.max:0:_5?this.constraints.max:_6?tc.min:0;
+_1=(_2>0)?_4?tc.min:_3?tc.max:0:_3?this.constraints.max:_4?tc.min:0;
 }
-var _7=_1+_2;
-if(v||isNaN(_7)){
+var _5=_1+_2;
+if(v||isNaN(_5)){
 return _1;
 }
-if(_5&&(_7>tc.max)){
-_7=tc.max;
+if(_3&&(_5>tc.max)){
+_5=tc.max;
 }
-if(_6&&(_7<tc.min)){
-_7=tc.min;
+if(_4&&(_5<tc.min)){
+_5=tc.min;
 }
-return _7;
+return _5;
 },_onKeyPress:function(e){
-if((e.charOrCode==dojo.keys.HOME||e.charOrCode==dojo.keys.END)&&!e.ctrlKey&&!e.altKey){
-var _9=this.constraints[(e.charOrCode==dojo.keys.HOME?"min":"max")];
-if(_9){
-this._setValueAttr(_9,true);
+if((e.charOrCode==dojo.keys.HOME||e.charOrCode==dojo.keys.END)&&!(e.ctrlKey||e.altKey||e.metaKey)&&typeof this.attr("value")!="undefined"){
+var _6=this.constraints[(e.charOrCode==dojo.keys.HOME?"min":"max")];
+if(_6){
+this._setValueAttr(_6,true);
 }
 dojo.stopEvent(e);
 }
diff --git a/dijit/form/NumberTextBox.js b/dijit/form/NumberTextBox.js
index 7efdc91..9c5cf06 100644
--- a/dijit/form/NumberTextBox.js
+++ b/dijit/form/NumberTextBox.js
@@ -11,36 +11,43 @@ dojo.provide("dijit.form.NumberTextBox");
 dojo.require("dijit.form.ValidationTextBox");
 dojo.require("dojo.number");
 dojo.declare("dijit.form.NumberTextBoxMixin",null,{regExpGen:dojo.number.regexp,value:NaN,editOptions:{pattern:"#.######"},_formatter:dojo.number.format,postMixInProperties:function(){
+var _1=typeof this.constraints.places=="number"?this.constraints.places:0;
+if(_1){
+_1++;
+}
 if(typeof this.constraints.max!="number"){
-this.constraints.max=9000000000000000;
+this.constraints.max=9*Math.pow(10,15-_1);
+}
+if(typeof this.constraints.min!="number"){
+this.constraints.min=-9*Math.pow(10,15-_1);
 }
 this.inherited(arguments);
 },_onFocus:function(){
 if(this.disabled){
 return;
 }
-var _1=this.attr("value");
-if(typeof _1=="number"&&!isNaN(_1)){
-var _2=this.format(_1,this.constraints);
-if(_2!==undefined){
-this.textbox.value=_2;
+var _2=this.attr("value");
+if(typeof _2=="number"&&!isNaN(_2)){
+var _3=this.format(_2,this.constraints);
+if(_3!==undefined){
+this.textbox.value=_3;
 }
 }
 this.inherited(arguments);
-},format:function(_3,_4){
-if(typeof _3!="number"){
-return String(_3);
+},format:function(_4,_5){
+if(typeof _4!="number"){
+return String(_4);
 }
-if(isNaN(_3)){
+if(isNaN(_4)){
 return "";
 }
-if(("rangeCheck" in this)&&!this.rangeCheck(_3,_4)){
-return String(_3);
+if(("rangeCheck" in this)&&!this.rangeCheck(_4,_5)){
+return String(_4);
 }
 if(this.editOptions&&this._focused){
-_4=dojo.mixin(dojo.mixin({},this.editOptions),_4);
+_5=dojo.mixin({},_5,this.editOptions);
 }
-return this._formatter(_3,_4);
+return this._formatter(_4,_5);
 },parse:dojo.number.parse,_getDisplayedValueAttr:function(){
 var v=this.inherited(arguments);
 return isNaN(v)?this.textbox.value:v;
@@ -72,11 +79,30 @@ this.inherited(arguments,[_9,_a,_b]);
 },_getValueAttr:function(){
 var v=this.inherited(arguments);
 if(isNaN(v)&&this.textbox.value!==""){
+if(this.constraints.exponent!==false&&/\de[-+]?|\d/i.test(this.textbox.value)&&(new RegExp("^"+dojo.number._realNumberRegexp(dojo.mixin({},this.constraints))+"$").test(this.textbox.value))){
 var n=Number(this.textbox.value);
-return (String(n)===this.textbox.value)?n:undefined;
+return isNaN(n)?undefined:n;
+}else{
+return undefined;
+}
 }else{
 return v;
 }
+},isValid:function(_c){
+if(!this._focused||this._isEmpty(this.textbox.value)){
+return this.inherited(arguments);
+}else{
+var v=this.attr("value");
+if(!isNaN(v)&&this.rangeCheck(v,this.constraints)){
+if(this.constraints.exponent!==false&&/\de[-+]?\d/i.test(this.textbox.value)){
+return true;
+}else{
+return this.inherited(arguments);
+}
+}else{
+return false;
+}
+}
 }});
 dojo.declare("dijit.form.NumberTextBox",[dijit.form.RangeBoundTextBox,dijit.form.NumberTextBoxMixin],{});
 }
diff --git a/dijit/form/Select.js b/dijit/form/Select.js
new file mode 100644
index 0000000..edc49b5
--- /dev/null
+++ b/dijit/form/Select.js
@@ -0,0 +1,141 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dijit.form.Select"]){
+dojo._hasResource["dijit.form.Select"]=true;
+dojo.provide("dijit.form.Select");
+dojo.require("dijit.form._FormSelectWidget");
+dojo.require("dijit._HasDropDown");
+dojo.require("dijit.Menu");
+dojo.requireLocalization("dijit.form","validate",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
+dojo.declare("dijit.form._SelectMenu",dijit.Menu,{buildRendering:function(){
+this.inherited(arguments);
+var o=(this.menuTableNode=this.domNode);
+var n=(this.domNode=dojo.doc.createElement("div"));
+if(o.parentNode){
+o.parentNode.replaceChild(n,o);
+}
+dojo.removeClass(o,"dijitMenuTable");
+n.className=o.className+" dijitSelectMenu";
+o.className="dijitReset dijitMenuTable";
+dijit.setWaiRole(o,"listbox");
+dijit.setWaiRole(n,"presentation");
+n.appendChild(o);
+this.tabIndex=null;
+},resize:function(mb){
+if(mb){
+dojo.marginBox(this.domNode,mb);
+var w=dojo.contentBox(this.domNode).w;
+if(dojo.isMoz&&this.domNode.scrollHeight>this.domNode.clientHeight){
+w--;
+}else{
+if(dojo.isIE<8||(dojo.isIE&&dojo.isQuirks)){
+w-=16;
+}
+}
+dojo.marginBox(this.menuTableNode,{w:w});
+}
+}});
+dojo.declare("dijit.form.Select",[dijit.form._FormSelectWidget,dijit._HasDropDown],{baseClass:"dijitSelect",templateString:dojo.cache("dijit.form","templates/Select.html","<table class='dijit dijitReset dijitInline dijitLeft'\n\tdojoAttachPoint=\"_buttonNode,tableNode\" cellspacing='0' cellpadding='0' waiRole=\"presentation\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\"\n\t><tbody waiRole=\"presentation\"><tr waiRole=\"presentation\"\n\t\t><td c [...]
+this.inherited(arguments);
+if(this.options.length&&!this.value&&this.srcNodeRef){
+var si=this.srcNodeRef.selectedIndex;
+this.value=this.options[si!=-1?si:0].value;
+}
+this.dropDown=new dijit.form._SelectMenu();
+dojo.addClass(this.dropDown.domNode,this.baseClass+"Menu");
+},_getMenuItemForOption:function(_1){
+if(!_1.value){
+return new dijit.MenuSeparator();
+}else{
+var _2=dojo.hitch(this,"_setValueAttr",_1);
+var _3=new dijit.MenuItem({option:_1,label:_1.label,onClick:_2,disabled:_1.disabled||false});
+dijit.setWaiRole(_3.focusNode,"listitem");
+return _3;
+}
+},_addOptionItem:function(_4){
+if(this.dropDown){
+this.dropDown.addChild(this._getMenuItemForOption(_4));
+}
+},_getChildren:function(){
+if(!this.dropDown){
+return [];
+}
+return this.dropDown.getChildren();
+},_loadChildren:function(_5){
+if(_5===true){
+if(this.dropDown){
+delete this.dropDown.focusedChild;
+}
+if(this.options.length){
+this.inherited(arguments);
+}else{
+dojo.forEach(this._getChildren(),function(_6){
+_6.destroyRecursive();
+});
+var _7=new dijit.MenuItem({label:" "});
+this.dropDown.addChild(_7);
+}
+}else{
+this._updateSelection();
+}
+var _8=this.options.length;
+this._isLoaded=false;
+this._childrenLoaded=true;
+if(!this._loadingStore){
+this._setValueAttr(this.value);
+}
+},_setValueAttr:function(_9){
+this.inherited(arguments);
+dojo.attr(this.valueNode,"value",this.attr("value"));
+},_setDisplay:function(_a){
+this.containerNode.innerHTML="<span class=\"dijitReset dijitInline "+this.baseClass+"Label\">"+(_a||this.emptyLabel||" ")+"</span>";
+dijit.setWaiState(this.focusNode,"valuenow",(_a||this.emptyLabel||" "));
+},validate:function(_b){
+var _c=this.isValid(_b);
+this.state=_c?"":"Error";
+this._setStateClass();
+dijit.setWaiState(this.focusNode,"invalid",_c?"false":"true");
+var _d=_c?"":this._missingMsg;
+if(this._message!==_d){
+this._message=_d;
+dijit.hideTooltip(this.domNode);
+if(_d){
+dijit.showTooltip(_d,this.domNode,this.tooltipPosition);
+}
+}
+return _c;
+},isValid:function(_e){
+return (!this.required||!(/^\s*$/.test(this.value)));
+},reset:function(){
+this.inherited(arguments);
+dijit.hideTooltip(this.domNode);
+this.state="";
+this._setStateClass();
+delete this._message;
+},postMixInProperties:function(){
+this.inherited(arguments);
+this._missingMsg=dojo.i18n.getLocalization("dijit.form","validate",this.lang).missingMessage;
+},postCreate:function(){
+this.inherited(arguments);
+if(this.tableNode.style.width){
+dojo.addClass(this.domNode,this.baseClass+"FixedWidth");
+}
+},isLoaded:function(){
+return this._isLoaded;
+},loadDropDown:function(_f){
+this._loadChildren(true);
+this._isLoaded=true;
+_f();
+},uninitialize:function(_10){
+if(this.dropDown&&!this.dropDown._destroyed){
+this.dropDown.destroyRecursive(_10);
+delete this.dropDown;
+}
+this.inherited(arguments);
+}});
+}
diff --git a/dijit/form/SimpleTextarea.js b/dijit/form/SimpleTextarea.js
index dafff7b..ac2495d 100644
--- a/dijit/form/SimpleTextarea.js
+++ b/dijit/form/SimpleTextarea.js
@@ -9,7 +9,7 @@ if(!dojo._hasResource["dijit.form.SimpleTextarea"]){
 dojo._hasResource["dijit.form.SimpleTextarea"]=true;
 dojo.provide("dijit.form.SimpleTextarea");
 dojo.require("dijit.form.TextBox");
-dojo.declare("dijit.form.SimpleTextarea",dijit.form.TextBox,{baseClass:"dijitTextArea",attributeMap:dojo.delegate(dijit.form._FormValueWidget.prototype.attributeMap,{rows:"textbox",cols:"textbox"}),rows:"3",cols:"20",templatePath:null,templateString:"<textarea ${nameAttrSetting} dojoAttachPoint='focusNode,containerNode,textbox' autocomplete='off'></textarea>",postMixInProperties:function(){
+dojo.declare("dijit.form.SimpleTextarea",dijit.form.TextBox,{baseClass:"dijitTextArea",attributeMap:dojo.delegate(dijit.form._FormValueWidget.prototype.attributeMap,{rows:"textbox",cols:"textbox"}),rows:"3",cols:"20",templateString:"<textarea ${nameAttrSetting} dojoAttachPoint='focusNode,containerNode,textbox' autocomplete='off'></textarea>",postMixInProperties:function(){
 if(!this.value&&this.srcNodeRef){
 this.value=this.srcNodeRef.value;
 }
@@ -22,31 +22,33 @@ return this.inherited(arguments);
 },postCreate:function(){
 this.inherited(arguments);
 if(dojo.isIE&&this.cols){
-dojo.addClass(this.domNode,"dijitTextAreaCols");
+dojo.addClass(this.textbox,"dijitTextAreaCols");
 }
 },_previousValue:"",_onInput:function(e){
 if(this.maxLength){
-var _3=parseInt(this.maxLength);
-var _4=this.textbox.value.replace(/\r/g,"");
-var _5=_4.length-_3;
-if(_5>0){
+var _2=parseInt(this.maxLength);
+var _3=this.textbox.value.replace(/\r/g,"");
+var _4=_3.length-_2;
+if(_4>0){
+if(e){
 dojo.stopEvent(e);
-var _6=this.textbox;
-if(_6.selectionStart){
-var _7=_6.selectionStart;
+}
+var _5=this.textbox;
+if(_5.selectionStart){
+var _6=_5.selectionStart;
 var cr=0;
 if(dojo.isOpera){
-cr=(this.textbox.value.substring(0,_7).match(/\r/g)||[]).length;
+cr=(this.textbox.value.substring(0,_6).match(/\r/g)||[]).length;
 }
-this.textbox.value=_4.substring(0,_7-_5-cr)+_4.substring(_7-cr);
-_6.setSelectionRange(_7-_5,_7-_5);
+this.textbox.value=_3.substring(0,_6-_4-cr)+_3.substring(_6-cr);
+_5.setSelectionRange(_6-_4,_6-_4);
 }else{
 if(dojo.doc.selection){
-_6.focus();
-var _9=dojo.doc.selection.createRange();
-_9.moveStart("character",-_5);
-_9.text="";
-_9.select();
+_5.focus();
+var _7=dojo.doc.selection.createRange();
+_7.moveStart("character",-_4);
+_7.text="";
+_7.select();
 }
 }
 }
diff --git a/dijit/form/TextBox.js b/dijit/form/TextBox.js
index 54012f1..7291351 100644
--- a/dijit/form/TextBox.js
+++ b/dijit/form/TextBox.js
@@ -9,7 +9,7 @@ if(!dojo._hasResource["dijit.form.TextBox"]){
 dojo._hasResource["dijit.form.TextBox"]=true;
 dojo.provide("dijit.form.TextBox");
 dojo.require("dijit.form._FormWidget");
-dojo.declare("dijit.form.TextBox",dijit.form._FormValueWidget,{trim:false,uppercase:false,lowercase:false,propercase:false,maxLength:"",templateString:"<input class=\"dijit dijitReset dijitLeft\" dojoAttachPoint='textbox,focusNode'\n\tdojoAttachEvent='onmouseenter:_onMouse,onmouseleave:_onMouse'\n\tautocomplete=\"off\" type=\"${type}\" ${nameAttrSetting}\n\t/>\n",baseClass:"dijitTextBox",attributeMap:dojo.delegate(dijit.form._FormValueWidget.prototype.attributeMap,{maxLength:"focusNode"} [...]
+dojo.declare("dijit.form.TextBox",dijit.form._FormValueWidget,{trim:false,uppercase:false,lowercase:false,propercase:false,maxLength:"",selectOnClick:false,templateString:dojo.cache("dijit.form","templates/TextBox.html","<input class=\"dijit dijitReset dijitLeft\" dojoAttachPoint='textbox,focusNode'\n\tdojoAttachEvent='onmouseenter:_onMouse,onmouseleave:_onMouse'\n\tautocomplete=\"off\" type=\"${type}\" ${nameAttrSetting}\n\t/>\n"),baseClass:"dijitTextBox",attributeMap:dojo.delegate(diji [...]
 return this.parse(this.attr("displayedValue"),this.constraints);
 },_setValueAttr:function(_1,_2,_3){
 var _4;
@@ -61,9 +61,9 @@ return;
 }
 }
 if(this.intermediateChanges){
-var _c=this;
+var _b=this;
 setTimeout(function(){
-_c._handleOnChange(_c.attr("value"),false);
+_b._handleOnChange(_b.attr("value"),false);
 },0);
 }
 this._refreshState();
@@ -78,29 +78,28 @@ this.connect(this.textbox,"onkeyup",this._onInput);
 this.connect(this.textbox,"onpaste",this._onInput);
 this.connect(this.textbox,"oncut",this._onInput);
 }
-this._layoutHack();
-},_blankValue:"",filter:function(_d){
-if(_d===null){
+},_blankValue:"",filter:function(_c){
+if(_c===null){
 return this._blankValue;
 }
-if(typeof _d!="string"){
-return _d;
+if(typeof _c!="string"){
+return _c;
 }
 if(this.trim){
-_d=dojo.trim(_d);
+_c=dojo.trim(_c);
 }
 if(this.uppercase){
-_d=_d.toUpperCase();
+_c=_c.toUpperCase();
 }
 if(this.lowercase){
-_d=_d.toLowerCase();
+_c=_c.toLowerCase();
 }
 if(this.propercase){
-_d=_d.replace(/[^\s]+/g,function(_e){
-return _e.substring(0,1).toUpperCase()+_e.substring(1);
+_c=_c.replace(/[^\s]+/g,function(_d){
+return _d.substring(0,1).toUpperCase()+_d.substring(1);
 });
 }
-return _d;
+return _c;
 },_setBlurValue:function(){
 this._setValueAttr(this.attr("value"),true);
 },_onBlur:function(e){
@@ -109,10 +108,32 @@ return;
 }
 this._setBlurValue();
 this.inherited(arguments);
-},_onFocus:function(e){
-if(this.disabled){
+if(this._selectOnClickHandle){
+this.disconnect(this._selectOnClickHandle);
+}
+if(this.selectOnClick&&dojo.isMoz){
+this.textbox.selectionStart=this.textbox.selectionEnd=undefined;
+}
+},_onFocus:function(by){
+if(this.disabled||this.readOnly){
 return;
 }
+if(this.selectOnClick&&by=="mouse"){
+this._selectOnClickHandle=this.connect(this.domNode,"onmouseup",function(){
+this.disconnect(this._selectOnClickHandle);
+var _e;
+if(dojo.isIE){
+var _f=dojo.doc.selection.createRange();
+var _10=_f.parentElement();
+_e=_10==this.textbox&&_f.text.length==0;
+}else{
+_e=this.textbox.selectionStart==this.textbox.selectionEnd;
+}
+if(_e){
+dijit.selectInputText(this.textbox);
+}
+});
+}
 this._refreshState();
 this.inherited(arguments);
 },reset:function(){
@@ -129,20 +150,20 @@ _12=0;
 if(isNaN(_13)){
 _13=_11.value?_11.value.length:0;
 }
-_11.focus();
+dijit.focus(_11);
 if(_15["selection"]&&dojo.body()["createTextRange"]){
 if(_11.createTextRange){
 var _16=_11.createTextRange();
 with(_16){
 collapse(true);
+moveStart("character",-99999);
 moveStart("character",_12);
-moveEnd("character",_13);
+moveEnd("character",_13-_12);
 select();
 }
 }
 }else{
 if(_14["getSelection"]){
-var _17=_14.getSelection();
 if(_11.setSelectionRange){
 _11.setSelectionRange(_12,_13);
 }
diff --git a/dijit/form/Textarea.js b/dijit/form/Textarea.js
index 453b524..5f267aa 100644
--- a/dijit/form/Textarea.js
+++ b/dijit/form/Textarea.js
@@ -36,7 +36,7 @@ return;
 }
 this._busyResizing=true;
 var _4=this.textbox;
-if(_4.scrollHeight){
+if(_4.scrollHeight&&_4.offsetHeight&&_4.clientHeight){
 var _5=this._getHeight(_4)+"px";
 if(_4.style.height!=_5){
 _4.style.maxHeight=_4.style.height=_5;
diff --git a/dijit/form/ValidationTextBox.js b/dijit/form/ValidationTextBox.js
index f45493a..5a41300 100644
--- a/dijit/form/ValidationTextBox.js
+++ b/dijit/form/ValidationTextBox.js
@@ -12,7 +12,7 @@ dojo.require("dojo.i18n");
 dojo.require("dijit.form.TextBox");
 dojo.require("dijit.Tooltip");
 dojo.requireLocalization("dijit.form","validate",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
-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\">Χ</div\n\t\t><div class=\"dijitReset dijitInputField\"\n\t\ [...]
+dojo.declare("dijit.form.ValidationTextBox",dijit.form.TextBox,{templateString:dojo.cache("dijit.form","templates/ValidationTextBox.html","<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\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 [...]
 return this.regExp;
 },state:"",tooltipPosition:[],_setValueAttr:function(){
 this.inherited(arguments);
@@ -37,6 +37,9 @@ this._maskValidSubsetError=true;
 }
 var _b=!_a&&_8&&this._isValidSubset();
 var _c=this._isEmpty(this.textbox.value);
+if(_c){
+this._maskValidSubsetError=true;
+}
 this.state=(_a||(!this._hasBeenBlurred&&_c)||_b)?"":"Error";
 if(this.state=="Error"){
 this._maskValidSubsetError=false;
@@ -76,7 +79,7 @@ this.invalidMessage=this.messages.invalidMessage;
 }
 var p=this.regExpGen(this.constraints);
 this.regExp=p;
-var _f="";
+var _e="";
 if(p!=".*"){
 this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g,function(re){
 switch(re.charAt(0)){
@@ -88,34 +91,31 @@ case "^":
 case "$":
 case "|":
 case "(":
-_f+=re;
+_e+=re;
 break;
 case ")":
-_f+="|$)";
+_e+="|$)";
 break;
 default:
-_f+="(?:"+re+"|$)";
+_e+="(?:"+re+"|$)";
 break;
 }
 });
 }
 try{
-"".search(_f);
+"".search(_e);
 }
 catch(e){
-_f=this.regExp;
+_e=this.regExp;
 console.warn("RegExp error in "+this.declaredClass+": "+this.regExp);
 }
-this._partialre="^(?:"+_f+")$";
-},_setDisabledAttr:function(_11){
+this._partialre="^(?:"+_e+")$";
+},_setDisabledAttr:function(_f){
 this.inherited(arguments);
-if(this.valueNode){
-this.valueNode.disabled=_11;
-}
 this._refreshState();
-},_setRequiredAttr:function(_12){
-this.required=_12;
-dijit.setWaiState(this.focusNode,"required",_12);
+},_setRequiredAttr:function(_10){
+this.required=_10;
+dijit.setWaiState(this.focusNode,"required",_10);
 this._refreshState();
 },postCreate:function(){
 if(dojo.isIE){
@@ -131,11 +131,14 @@ this.inherited(arguments);
 },reset:function(){
 this._maskValidSubsetError=true;
 this.inherited(arguments);
+},_onBlur:function(){
+this.displayMessage("");
+this.inherited(arguments);
 }});
 dojo.declare("dijit.form.MappedTextBox",dijit.form.ValidationTextBox,{postMixInProperties:function(){
 this.inherited(arguments);
 this.nameAttrSetting="";
-},serialize:function(val,_16){
+},serialize:function(val,_11){
 return val.toString?val.toString():"";
 },toString:function(){
 var val=this.filter(this.attr("value"));
@@ -145,44 +148,37 @@ this.valueNode.value=this.toString();
 return this.inherited(arguments);
 },buildRendering:function(){
 this.inherited(arguments);
-this.valueNode=dojo.create("input",{style:{display:"none"},type:this.type,name:this.name},this.textbox,"after");
-},_setDisabledAttr:function(_18){
-this.inherited(arguments);
-dojo.attr(this.valueNode,"disabled",_18);
+this.valueNode=dojo.place("<input type='hidden'"+(this.name?" name='"+this.name+"'":"")+">",this.textbox,"after");
 },reset:function(){
 this.valueNode.value="";
 this.inherited(arguments);
 }});
-dojo.declare("dijit.form.RangeBoundTextBox",dijit.form.MappedTextBox,{rangeMessage:"",rangeCheck:function(_19,_1a){
-var _1b="min" in _1a;
-var _1c="max" in _1a;
-if(_1b||_1c){
-return (!_1b||this.compare(_19,_1a.min)>=0)&&(!_1c||this.compare(_19,_1a.max)<=0);
-}
-return true;
-},isInRange:function(_1d){
+dojo.declare("dijit.form.RangeBoundTextBox",dijit.form.MappedTextBox,{rangeMessage:"",rangeCheck:function(_12,_13){
+return ("min" in _13?(this.compare(_12,_13.min)>=0):true)&&("max" in _13?(this.compare(_12,_13.max)<=0):true);
+},isInRange:function(_14){
 return this.rangeCheck(this.attr("value"),this.constraints);
 },_isDefinitelyOutOfRange:function(){
 var val=this.attr("value");
-var _1f=false;
-var _20=false;
+var _15=false;
+var _16=false;
 if("min" in this.constraints){
 var min=this.constraints.min;
-val=this.compare(val,((typeof min=="number")&&min>=0&&val!=0)?0:min);
-_1f=(typeof val=="number")&&val<0;
+min=this.compare(val,((typeof min=="number")&&min>=0&&val!=0)?0:min);
+_15=(typeof min=="number")&&min<0;
 }
 if("max" in this.constraints){
 var max=this.constraints.max;
-val=this.compare(val,((typeof max!="number")||max>0)?max:0);
-_20=(typeof val=="number")&&val>0;
+max=this.compare(val,((typeof max!="number")||max>0)?max:0);
+_16=(typeof max=="number")&&max>0;
 }
-return _1f||_20;
+return _15||_16;
 },_isValidSubset:function(){
 return this.inherited(arguments)&&!this._isDefinitelyOutOfRange();
-},isValid:function(_23){
-return this.inherited(arguments)&&((this._isEmpty(this.textbox.value)&&!this.required)||this.isInRange(_23));
-},getErrorMessage:function(_24){
-if(dijit.form.RangeBoundTextBox.superclass.isValid.call(this,false)&&!this.isInRange(_24)){
+},isValid:function(_17){
+return this.inherited(arguments)&&((this._isEmpty(this.textbox.value)&&!this.required)||this.isInRange(_17));
+},getErrorMessage:function(_18){
+var v=this.attr("value");
+if(v!==null&&v!==""&&v!==undefined&&!this.isInRange(_18)){
 return this.rangeMessage;
 }
 return this.inherited(arguments);
@@ -200,8 +196,8 @@ dijit.setWaiState(this.focusNode,"valuemin",this.constraints.min);
 if(this.constraints.max!==undefined){
 dijit.setWaiState(this.focusNode,"valuemax",this.constraints.max);
 }
-},_setValueAttr:function(_25,_26){
-dijit.setWaiState(this.focusNode,"valuenow",_25);
+},_setValueAttr:function(_19,_1a){
+dijit.setWaiState(this.focusNode,"valuenow",_19);
 this.inherited(arguments);
 }});
 }
diff --git a/dijit/form/VerticalRuleLabels.js b/dijit/form/VerticalRuleLabels.js
index 604e03f..5d829af 100644
--- a/dijit/form/VerticalRuleLabels.js
+++ b/dijit/form/VerticalRuleLabels.js
@@ -11,5 +11,5 @@ dojo.provide("dijit.form.VerticalRuleLabels");
 dojo.require("dijit.form.HorizontalRuleLabels");
 dojo.declare("dijit.form.VerticalRuleLabels",dijit.form.HorizontalRuleLabels,{templateString:"<div class=\"dijitRuleContainer dijitRuleContainerV dijitRuleLabelsContainer dijitRuleLabelsContainerV\"></div>",_positionPrefix:"<div class=\"dijitRuleLabelContainer dijitRuleLabelContainerV\" style=\"top:",_labelPrefix:"\"><span class=\"dijitRuleLabel dijitRuleLabelV\">",_calcPosition:function(_1){
 return 100-_1;
-},_isHorizontal:false});
+}});
 }
diff --git a/dijit/form/VerticalSlider.js b/dijit/form/VerticalSlider.js
index 9df15b6..292c8b6 100644
--- a/dijit/form/VerticalSlider.js
+++ b/dijit/form/VerticalSlider.js
@@ -9,7 +9,7 @@ if(!dojo._hasResource["dijit.form.VerticalSlider"]){
 dojo._hasResource["dijit.form.VerticalSlider"]=true;
 dojo.provide("dijit.form.VerticalSlider");
 dojo.require("dijit.form.HorizontalSlider");
-dojo.declare("dijit.form.VerticalSlider",dijit.form.HorizontalSlider,{templateString:"<table class=\"dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" dojoAttachEvent=\"onkeypress:_onKeyPress\"\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=\"displ [...]
+dojo.declare("dijit.form.VerticalSlider",dijit.form.HorizontalSlider,{templateString:dojo.cache("dijit.form","templates/VerticalSlider.html","<table class=\"dijitReset dijitSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\" dojoAttachEvent=\"onkeypress:_onKeyPress,onkeyup:_onKeyUp\"\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 [...]
 if(this._started){
 return;
 }
diff --git a/dijit/form/_DateTimeTextBox.js b/dijit/form/_DateTimeTextBox.js
index 8b39b1e..fe76c2f 100644
--- a/dijit/form/_DateTimeTextBox.js
+++ b/dijit/form/_DateTimeTextBox.js
@@ -12,63 +12,79 @@ dojo.require("dojo.date");
 dojo.require("dojo.date.locale");
 dojo.require("dojo.date.stamp");
 dojo.require("dijit.form.ValidationTextBox");
-dojo.declare("dijit.form._DateTimeTextBox",dijit.form.RangeBoundTextBox,{regExpGen:dojo.date.locale.regexp,compare:dojo.date.compare,format:function(_1,_2){
+dojo.declare("dijit.form._DateTimeTextBox",dijit.form.RangeBoundTextBox,{regExpGen:dojo.date.locale.regexp,datePackage:"dojo.date",compare:dojo.date.compare,format:function(_1,_2){
 if(!_1){
 return "";
 }
-return dojo.date.locale.format(_1,_2);
+return this.dateLocaleModule.format(_1,_2);
 },parse:function(_3,_4){
-return dojo.date.locale.parse(_3,_4)||(this._isEmpty(_3)?null:undefined);
-},serialize:dojo.date.stamp.toISOString,value:new Date(""),_blankValue:null,popupClass:"",_selector:"",postMixInProperties:function(){
+return this.dateLocaleModule.parse(_3,_4)||(this._isEmpty(_3)?null:undefined);
+},serialize:function(_5,_6){
+if(_5.toGregorian){
+_5=_5.toGregorian();
+}
+return dojo.date.stamp.toISOString(_5,_6);
+},value:new Date(""),_blankValue:null,popupClass:"",_selector:"",constructor:function(_7){
+var _8=_7.datePackage?_7.datePackage+".Date":"Date";
+this.dateClassObj=dojo.getObject(_8,false);
+this.value=new this.dateClassObj("");
+this.datePackage=_7.datePackage||this.datePackage;
+this.dateLocaleModule=dojo.getObject(this.datePackage+".locale",false);
+this.regExpGen=this.dateLocaleModule.regexp;
+},postMixInProperties:function(){
 this.inherited(arguments);
 if(!this.value||this.value.toString()==dijit.form._DateTimeTextBox.prototype.value.toString()){
 this.value=null;
 }
-var _5=this.constraints;
-_5.selector=this._selector;
-_5.fullYear=true;
-var _6=dojo.date.stamp.fromISOString;
-if(typeof _5.min=="string"){
-_5.min=_6(_5.min);
+var _9=this.constraints;
+_9.selector=this._selector;
+_9.fullYear=true;
+var _a=dojo.date.stamp.fromISOString;
+if(typeof _9.min=="string"){
+_9.min=_a(_9.min);
 }
-if(typeof _5.max=="string"){
-_5.max=_6(_5.max);
+if(typeof _9.max=="string"){
+_9.max=_a(_9.max);
 }
-},_onFocus:function(_7){
+},_onFocus:function(_b){
 this._open();
-},_setValueAttr:function(_8,_9,_a){
+this.inherited(arguments);
+},_setValueAttr:function(_c,_d,_e){
+if(_c instanceof Date&&!(this.dateClassObj instanceof Date)){
+_c=new this.dateClassObj(_c);
+}
 this.inherited(arguments);
 if(this._picker){
-if(!_8){
-_8=new Date();
+if(!_c){
+_c=new this.dateClassObj();
 }
-this._picker.attr("value",_8);
+this._picker.attr("value",_c);
 }
 },_open:function(){
 if(this.disabled||this.readOnly||!this.popupClass){
 return;
 }
-var _b=this;
+var _f=this;
 if(!this._picker){
-var _c=dojo.getObject(this.popupClass,false);
-this._picker=new _c({onValueSelected:function(_d){
-if(_b._tabbingAway){
-delete _b._tabbingAway;
+var _10=dojo.getObject(this.popupClass,false);
+this._picker=new _10({onValueSelected:function(_11){
+if(_f._tabbingAway){
+delete _f._tabbingAway;
 }else{
-_b.focus();
-}
-setTimeout(dojo.hitch(_b,"_close"),1);
-dijit.form._DateTimeTextBox.superclass._setValueAttr.call(_b,_d,true);
-},lang:_b.lang,constraints:_b.constraints,isDisabledDate:function(_e){
-var _f=dojo.date.compare;
-var _10=_b.constraints;
-return _10&&(_10.min&&(_f(_10.min,_e,"date")>0)||(_10.max&&_f(_10.max,_e,"date")<0));
+_f.focus();
+}
+setTimeout(dojo.hitch(_f,"_close"),1);
+dijit.form._DateTimeTextBox.superclass._setValueAttr.call(_f,_11,true);
+},id:this.id+"_popup",lang:_f.lang,constraints:_f.constraints,datePackage:_f.datePackage,isDisabledDate:function(_12){
+var _13=dojo.date.compare;
+var _14=_f.constraints;
+return _14&&(_14.min&&(_13(_14.min,_12,_f._selector)>0)||(_14.max&&_13(_14.max,_12,_f._selector)<0));
 }});
-this._picker.attr("value",this.attr("value")||new Date());
+this._picker.attr("value",this.attr("value")||new this.dateClassObj());
 }
 if(!this._opened){
 dijit.popup.open({parent:this,popup:this._picker,around:this.domNode,onCancel:dojo.hitch(this,this._close),onClose:function(){
-_b._opened=false;
+_f._opened=false;
 }});
 this._opened=true;
 }
@@ -87,8 +103,8 @@ delete this._picker;
 this.inherited(arguments);
 },_getDisplayedValueAttr:function(){
 return this.textbox.value;
-},_setDisplayedValueAttr:function(_11,_12){
-this._setValueAttr(this.parse(_11,this.constraints),_12,_11);
+},_setDisplayedValueAttr:function(_15,_16){
+this._setValueAttr(this.parse(_15,this.constraints),_16,_15);
 },destroy:function(){
 if(this._picker){
 this._picker.destroy();
@@ -98,6 +114,7 @@ this.inherited(arguments);
 },postCreate:function(){
 this.inherited(arguments);
 this.connect(this.focusNode,"onkeypress",this._onKeyPress);
+this.connect(this.focusNode,"onclick",this._open);
 },_onKeyPress:function(e){
 var p=this._picker,dk=dojo.keys;
 if(p&&this._opened&&p.handleKey){
@@ -105,7 +122,7 @@ if(p.handleKey(e)===false){
 return;
 }
 }
-if(this._opened&&e.charOrCode==dk.ESCAPE&&!e.shiftKey&&!e.ctrlKey&&!e.altKey){
+if(this._opened&&e.charOrCode==dk.ESCAPE&&!(e.shiftKey||e.ctrlKey||e.altKey||e.metaKey)){
 this._close();
 dojo.stopEvent(e);
 }else{
diff --git a/dijit/form/_FormMixin.js b/dijit/form/_FormMixin.js
index 55b0153..fe51939 100644
--- a/dijit/form/_FormMixin.js
+++ b/dijit/form/_FormMixin.js
@@ -56,7 +56,7 @@ dojo.forEach(_c,function(w,i){
 w.attr("value",dojo.indexOf(_d,w.value)!=-1);
 });
 }else{
-if(_c[0]._multiValue){
+if(_c[0].multiple){
 _c[0].attr("value",_d);
 }else{
 dojo.forEach(_c,function(w,i){
@@ -69,75 +69,84 @@ w.attr("value",_d[i]);
 dojo.deprecated(this.declaredClass+"::getValues() is deprecated. Use attr('value') instead.","","2.0");
 return this.attr("value");
 },_getValueAttr:function(){
-var obj={};
-dojo.forEach(this.getDescendants(),function(_13){
-var _14=_13.name;
-if(!_14||_13.disabled){
+var _e={};
+dojo.forEach(this.getDescendants(),function(_f){
+var _10=_f.name;
+if(!_10||_f.disabled){
 return;
 }
-var _15=_13.attr("value");
-if(typeof _13.checked=="boolean"){
-if(/Radio/.test(_13.declaredClass)){
-if(_15!==false){
-dojo.setObject(_14,_15,obj);
+var _11=_f.attr("value");
+if(typeof _f.checked=="boolean"){
+if(/Radio/.test(_f.declaredClass)){
+if(_11!==false){
+dojo.setObject(_10,_11,_e);
 }else{
-_15=dojo.getObject(_14,false,obj);
-if(_15===undefined){
-dojo.setObject(_14,null,obj);
+_11=dojo.getObject(_10,false,_e);
+if(_11===undefined){
+dojo.setObject(_10,null,_e);
 }
 }
 }else{
-var ary=dojo.getObject(_14,false,obj);
+var ary=dojo.getObject(_10,false,_e);
 if(!ary){
 ary=[];
-dojo.setObject(_14,ary,obj);
+dojo.setObject(_10,ary,_e);
 }
-if(_15!==false){
-ary.push(_15);
+if(_11!==false){
+ary.push(_11);
 }
 }
 }else{
-dojo.setObject(_14,_15,obj);
+var _12=dojo.getObject(_10,false,_e);
+if(typeof _12!="undefined"){
+if(dojo.isArray(_12)){
+_12.push(_11);
+}else{
+dojo.setObject(_10,[_12,_11],_e);
+}
+}else{
+dojo.setObject(_10,_11,_e);
+}
 }
 });
-return obj;
+return _e;
 },isValid:function(){
-this._invalidWidgets=dojo.filter(this.getDescendants(),function(_17){
-return !_17.disabled&&_17.isValid&&!_17.isValid();
+this._invalidWidgets=dojo.filter(this.getDescendants(),function(_13){
+return !_13.disabled&&_13.isValid&&!_13.isValid();
 });
 return !this._invalidWidgets.length;
-},onValidStateChange:function(_18){
-},_widgetChange:function(_19){
-var _1a=this._lastValidState;
-if(!_19||this._lastValidState===undefined){
-_1a=this.isValid();
+},onValidStateChange:function(_14){
+},_widgetChange:function(_15){
+var _16=this._lastValidState;
+if(!_15||this._lastValidState===undefined){
+_16=this.isValid();
 if(this._lastValidState===undefined){
-this._lastValidState=_1a;
+this._lastValidState=_16;
 }
 }else{
-if(_19.isValid){
+if(_15.isValid){
 this._invalidWidgets=dojo.filter(this._invalidWidgets||[],function(w){
-return (w!=_19);
+return (w!=_15);
 },this);
-if(!_19.isValid()&&!_19.attr("disabled")){
-this._invalidWidgets.push(_19);
+if(!_15.isValid()&&!_15.attr("disabled")){
+this._invalidWidgets.push(_15);
 }
-_1a=(this._invalidWidgets.length===0);
+_16=(this._invalidWidgets.length===0);
 }
 }
-if(_1a!==this._lastValidState){
-this._lastValidState=_1a;
-this.onValidStateChange(_1a);
+if(_16!==this._lastValidState){
+this._lastValidState=_16;
+this.onValidStateChange(_16);
 }
 },connectChildren:function(){
 dojo.forEach(this._changeConnections,dojo.hitch(this,"disconnect"));
-var _1c=this;
-var _1d=this._changeConnections=[];
-dojo.forEach(dojo.filter(this.getDescendants(),function(_1e){
-return _1e.validate;
-}),function(_1f){
-_1d.push(_1c.connect(_1f,"validate",dojo.hitch(_1c,"_widgetChange",_1f)));
-_1d.push(_1c.connect(_1f,"_setDisabledAttr",dojo.hitch(_1c,"_widgetChange",_1f)));
+var _17=this;
+var _18=this._changeConnections=[];
+dojo.forEach(dojo.filter(this.getDescendants(),function(_19){
+return _19.validate;
+}),function(_1a){
+_18.push(_17.connect(_1a,"validate",dojo.hitch(_17,"_widgetChange",_1a)));
+_18.push(_17.connect(_1a,"_setDisabledAttr",dojo.hitch(_17,"_widgetChange",_1a)));
 });
 this._widgetChange(null);
 },startup:function(){
diff --git a/dijit/form/_FormSelectWidget.js b/dijit/form/_FormSelectWidget.js
new file mode 100644
index 0000000..8dfae78
--- /dev/null
+++ b/dijit/form/_FormSelectWidget.js
@@ -0,0 +1,307 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dijit.form._FormSelectWidget"]){
+dojo._hasResource["dijit.form._FormSelectWidget"]=true;
+dojo.provide("dijit.form._FormSelectWidget");
+dojo.require("dijit.form._FormWidget");
+dojo.require("dojo.data.util.sorter");
+dojo.declare("dijit.form._FormSelectWidget",dijit.form._FormValueWidget,{multiple:false,options:null,store:null,query:null,queryOptions:null,onFetch:null,sortByLabel:true,loadChildrenOnOpen:false,getOptions:function(_1){
+var _2=_1,_3=this.options||[],l=_3.length;
+if(_2===undefined){
+return _3;
+}
+if(dojo.isArray(_2)){
+return dojo.map(_2,"return this.getOptions(item);",this);
+}
+if(dojo.isObject(_1)){
+if(!dojo.some(this.options,function(o,_4){
+if(o===_2||(o.value&&o.value===_2.value)){
+_2=_4;
+return true;
+}
+return false;
+})){
+_2=-1;
+}
+}
+if(typeof _2=="string"){
+for(var i=0;i<l;i++){
+if(_3[i].value===_2){
+_2=i;
+break;
+}
+}
+}
+if(typeof _2=="number"&&_2>=0&&_2<l){
+return this.options[_2];
+}
+return null;
+},addOption:function(_5){
+if(!dojo.isArray(_5)){
+_5=[_5];
+}
+dojo.forEach(_5,function(i){
+if(i&&dojo.isObject(i)){
+this.options.push(i);
+}
+},this);
+this._loadChildren();
+},removeOption:function(_6){
+if(!dojo.isArray(_6)){
+_6=[_6];
+}
+var _7=this.getOptions(_6);
+dojo.forEach(_7,function(i){
+if(i){
+this.options=dojo.filter(this.options,function(_8,_9){
+return (_8.value!==i.value);
+});
+this._removeOptionItem(i);
+}
+},this);
+this._loadChildren();
+},updateOption:function(_a){
+if(!dojo.isArray(_a)){
+_a=[_a];
+}
+dojo.forEach(_a,function(i){
+var _b=this.getOptions(i),k;
+if(_b){
+for(k in i){
+_b[k]=i[k];
+}
+}
+},this);
+this._loadChildren();
+},setStore:function(_c,_d,_e){
+var _f=this.store;
+_e=_e||{};
+if(_f!==_c){
+dojo.forEach(this._notifyConnections||[],dojo.disconnect);
+delete this._notifyConnections;
+if(_c&&_c.getFeatures()["dojo.data.api.Notification"]){
+this._notifyConnections=[dojo.connect(_c,"onNew",this,"_onNewItem"),dojo.connect(_c,"onDelete",this,"_onDeleteItem"),dojo.connect(_c,"onSet",this,"_onSetItem")];
+}
+this.store=_c;
+}
+this._onChangeActive=false;
+if(this.options&&this.options.length){
+this.removeOption(this.options);
+}
+if(_c){
+var cb=function(_10){
+if(this.sortByLabel&&!_e.sort&&_10.length){
+_10.sort(dojo.data.util.sorter.createSortFunction([{attribute:_c.getLabelAttributes(_10[0])[0]}],_c));
+}
+if(_e.onFetch){
+_10=_e.onFetch(_10);
+}
+dojo.forEach(_10,function(i){
+this._addOptionForItem(i);
+},this);
+this._loadingStore=false;
+this.attr("value",(("_pendingValue" in this)?this._pendingValue:_d));
+delete this._pendingValue;
+if(!this.loadChildrenOnOpen){
+this._loadChildren();
+}else{
+this._pseudoLoadChildren(_10);
+}
+this._fetchedWith=_11;
+this._lastValueReported=this.multiple?[]:null;
+this._onChangeActive=true;
+this.onSetStore();
+this._handleOnChange(this.value);
+};
+var _11=dojo.mixin({onComplete:cb,scope:this},_e);
+this._loadingStore=true;
+_c.fetch(_11);
+}else{
+delete this._fetchedWith;
+}
+return _f;
+},_setValueAttr:function(_12,_13){
+if(this._loadingStore){
+this._pendingValue=_12;
+return;
+}
+var _14=this.getOptions()||[];
+if(!dojo.isArray(_12)){
+_12=[_12];
+}
+dojo.forEach(_12,function(i,idx){
+if(!dojo.isObject(i)){
+i=i+"";
+}
+if(typeof i==="string"){
+_12[idx]=dojo.filter(_14,function(_15){
+return _15.value===i;
+})[0]||{value:"",label:""};
+}
+},this);
+_12=dojo.filter(_12,function(i){
+return i&&i.value;
+});
+if(!this.multiple&&(!_12[0]||!_12[0].value)&&_14.length){
+_12[0]=_14[0];
+}
+dojo.forEach(_14,function(i){
+i.selected=dojo.some(_12,function(v){
+return v.value===i.value;
+});
+});
+var val=dojo.map(_12,function(i){
+return i.value;
+}),_16=dojo.map(_12,function(i){
+return i.label;
+});
+this.value=this.multiple?val:val[0];
+this._setDisplay(this.multiple?_16:_16[0]);
+this._updateSelection();
+this._handleOnChange(this.value,_13);
+},_getDisplayedValueAttr:function(){
+var val=this.attr("value");
+if(!dojo.isArray(val)){
+val=[val];
+}
+var ret=dojo.map(this.getOptions(val),function(v){
+if(v&&"label" in v){
+return v.label;
+}else{
+if(v){
+return v.value;
+}
+}
+return null;
+},this);
+return this.multiple?ret:ret[0];
+},_getValueDeprecated:false,getValue:function(){
+return this._lastValue;
+},undo:function(){
+this._setValueAttr(this._lastValueReported,false);
+},_loadChildren:function(){
+if(this._loadingStore){
+return;
+}
+dojo.forEach(this._getChildren(),function(_17){
+_17.destroyRecursive();
+});
+dojo.forEach(this.options,this._addOptionItem,this);
+this._updateSelection();
+},_updateSelection:function(){
+this.value=this._getValueFromOpts();
+var val=this.value;
+if(!dojo.isArray(val)){
+val=[val];
+}
+if(val&&val[0]){
+dojo.forEach(this._getChildren(),function(_18){
+var _19=dojo.some(val,function(v){
+return _18.option&&(v===_18.option.value);
+});
+dojo.toggleClass(_18.domNode,this.baseClass+"SelectedOption",_19);
+dijit.setWaiState(_18.domNode,"selected",_19);
+},this);
+}
+this._handleOnChange(this.value);
+},_getValueFromOpts:function(){
+var _1a=this.getOptions()||[];
+if(!this.multiple&&_1a.length){
+var opt=dojo.filter(_1a,function(i){
+return i.selected;
+})[0];
+if(opt&&opt.value){
+return opt.value;
+}else{
+_1a[0].selected=true;
+return _1a[0].value;
+}
+}else{
+if(this.multiple){
+return dojo.map(dojo.filter(_1a,function(i){
+return i.selected;
+}),function(i){
+return i.value;
+})||[];
+}
+}
+return "";
+},_onNewItem:function(_1b,_1c){
+if(!_1c||!_1c.parent){
+this._addOptionForItem(_1b);
+}
+},_onDeleteItem:function(_1d){
+var _1e=this.store;
+this.removeOption(_1e.getIdentity(_1d));
+},_onSetItem:function(_1f){
+this.updateOption(this._getOptionObjForItem(_1f));
+},_getOptionObjForItem:function(_20){
+var _21=this.store,_22=_21.getLabel(_20),_23=(_22?_21.getIdentity(_20):null);
+return {value:_23,label:_22,item:_20};
+},_addOptionForItem:function(_24){
+var _25=this.store;
+if(!_25.isItemLoaded(_24)){
+_25.loadItem({item:_24,onComplete:function(i){
+this._addOptionForItem(_24);
+},scope:this});
+return;
+}
+var _26=this._getOptionObjForItem(_24);
+this.addOption(_26);
+},constructor:function(_27){
+this._oValue=(_27||{}).value||null;
+},_fillContent:function(){
+var _28=this.options;
+if(!_28){
+_28=this.options=this.srcNodeRef?dojo.query(">",this.srcNodeRef).map(function(_29){
+if(_29.getAttribute("type")==="separator"){
+return {value:"",label:"",selected:false,disabled:false};
+}
+return {value:_29.getAttribute("value"),label:String(_29.innerHTML),selected:_29.getAttribute("selected")||false,disabled:_29.getAttribute("disabled")||false};
+},this):[];
+}
+if(!this.value){
+this.value=this._getValueFromOpts();
+}else{
+if(this.multiple&&typeof this.value=="string"){
+this.value=this.value.split(",");
+}
+}
+},postCreate:function(){
+dojo.setSelectable(this.focusNode,false);
+this.inherited(arguments);
+this.connect(this,"onChange","_updateSelection");
+this.connect(this,"startup","_loadChildren");
+this._setValueAttr(this.value,null);
+},startup:function(){
+this.inherited(arguments);
+var _2a=this.store,_2b={};
+dojo.forEach(["query","queryOptions","onFetch"],function(i){
+if(this[i]){
+_2b[i]=this[i];
+}
+delete this[i];
+},this);
+if(_2a&&_2a.getFeatures()["dojo.data.api.Identity"]){
+this.store=null;
+this.setStore(_2a,this._oValue,_2b);
+}
+},destroy:function(){
+dojo.forEach(this._notifyConnections||[],dojo.disconnect);
+this.inherited(arguments);
+},_addOptionItem:function(_2c){
+},_removeOptionItem:function(_2d){
+},_setDisplay:function(_2e){
+},_getChildren:function(){
+return [];
+},_getSelectedOptionsAttr:function(){
+return this.getOptions(this.attr("value"));
+},_pseudoLoadChildren:function(_2f){
+},onSetStore:function(){
+}});
+}
diff --git a/dijit/form/_FormWidget.js b/dijit/form/_FormWidget.js
index f56f7ce..6be034f 100644
--- a/dijit/form/_FormWidget.js
+++ b/dijit/form/_FormWidget.js
@@ -10,17 +10,20 @@ 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],{baseClass:"",name:"",alt:"",value:"",type:"text",tabIndex:"0",disabled:false,readOnly:false,intermediateChanges:false,scrollOnFocus:true,attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{value:"focusNode",disabled:"focusNode",readOnly:"focusNode",id:"focusNode",tabIndex:"focusNode",alt:"focusNode"}),postMixInProperties:function(){
+dojo.declare("dijit.form._FormWidget",[dijit._Widget,dijit._Templated],{baseClass:"",name:"",alt:"",value:"",type:"text",tabIndex:"0",disabled:false,intermediateChanges:false,scrollOnFocus:true,attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{value:"focusNode",id:"focusNode",tabIndex:"focusNode",alt:"focusNode",title:"focusNode"}),postMixInProperties:function(){
 this.nameAttrSetting=this.name?("name='"+this.name+"'"):"";
 this.inherited(arguments);
 },_setDisabledAttr:function(_1){
 this.disabled=_1;
 dojo.attr(this.focusNode,"disabled",_1);
+if(this.valueNode){
+dojo.attr(this.valueNode,"disabled",_1);
+}
 dijit.setWaiState(this.focusNode,"disabled",_1);
 if(_1){
 this._hovering=false;
 this._active=false;
-this.focusNode.removeAttribute("tabIndex");
+this.focusNode.setAttribute("tabIndex","-1");
 }else{
 this.focusNode.setAttribute("tabIndex",this.tabIndex);
 }
@@ -33,13 +36,13 @@ if(this.scrollOnFocus){
 dijit.scrollIntoView(this.domNode);
 }
 this.inherited(arguments);
-},_onMouse:function(_4){
-var _5=_4.currentTarget;
-if(_5&&_5.getAttribute){
-this.stateModifier=_5.getAttribute("stateModifier")||"";
+},_onMouse:function(_3){
+var _4=_3.currentTarget;
+if(_4&&_4.getAttribute){
+this.stateModifier=_4.getAttribute("stateModifier")||"";
 }
 if(!this.disabled){
-switch(_4.type){
+switch(_3.type){
 case "mouseenter":
 case "mouseover":
 this._hovering=true;
@@ -53,14 +56,14 @@ break;
 case "mousedown":
 this._active=true;
 this._mouseDown=true;
-var _6=this.connect(dojo.body(),"onmouseup",function(){
+var _5=this.connect(dojo.body(),"onmouseup",function(){
 if(this._mouseDown&&this.isFocusable()){
 this.focus();
 }
 this._active=false;
 this._mouseDown=false;
 this._setStateClass();
-this.disconnect(_6);
+this.disconnect(_5);
 });
 break;
 }
@@ -71,81 +74,87 @@ return !this.disabled&&!this.readOnly&&this.focusNode&&(dojo.style(this.domNode,
 },focus:function(){
 dijit.focus(this.focusNode);
 },_setStateClass:function(){
-var _7=this.baseClass.split(" ");
-function _8(_9){
-_7=_7.concat(dojo.map(_7,function(c){
-return c+_9;
-}),"dijit"+_9);
+var _6=this.baseClass.split(" ");
+function _7(_8){
+_6=_6.concat(dojo.map(_6,function(c){
+return c+_8;
+}),"dijit"+_8);
 };
 if(this.checked){
-_8("Checked");
+_7("Checked");
 }
 if(this.state){
-_8(this.state);
+_7(this.state);
 }
 if(this.selected){
-_8("Selected");
+_7("Selected");
 }
 if(this.disabled){
-_8("Disabled");
+_7("Disabled");
 }else{
 if(this.readOnly){
-_8("ReadOnly");
+_7("ReadOnly");
 }else{
 if(this._active){
-_8(this.stateModifier+"Active");
+_7(this.stateModifier+"Active");
 }else{
 if(this._focused){
-_8("Focused");
+_7("Focused");
 }
 if(this._hovering){
-_8(this.stateModifier+"Hover");
+_7(this.stateModifier+"Hover");
 }
 }
 }
 }
-var tn=this.stateNode||this.domNode,_c={};
+var tn=this.stateNode||this.domNode,_9={};
 dojo.forEach(tn.className.split(" "),function(c){
-_c[c]=true;
+_9[c]=true;
 });
 if("_stateClasses" in this){
 dojo.forEach(this._stateClasses,function(c){
-delete _c[c];
+delete _9[c];
 });
 }
-dojo.forEach(_7,function(c){
-_c[c]=true;
+dojo.forEach(_6,function(c){
+_9[c]=true;
 });
-var _10=[];
-for(var c in _c){
-_10.push(c);
-}
-tn.className=_10.join(" ");
-this._stateClasses=_7;
-},compare:function(_12,_13){
-if((typeof _12=="number")&&(typeof _13=="number")){
-return (isNaN(_12)&&isNaN(_13))?0:(_12-_13);
+var _a=[];
+for(var c in _9){
+_a.push(c);
+}
+tn.className=_a.join(" ");
+this._stateClasses=_6;
+},compare:function(_b,_c){
+if(typeof _b=="number"&&typeof _c=="number"){
+return (isNaN(_b)&&isNaN(_c))?0:_b-_c;
 }else{
-if(_12>_13){
+if(_b>_c){
 return 1;
 }else{
-if(_12<_13){
+if(_b<_c){
 return -1;
 }else{
 return 0;
 }
 }
 }
-},onChange:function(_14){
-},_onChangeActive:false,_handleOnChange:function(_15,_16){
-this._lastValue=_15;
-if(this._lastValueReported==undefined&&(_16===null||!this._onChangeActive)){
-this._resetValue=this._lastValueReported=_15;
+},onChange:function(_d){
+},_onChangeActive:false,_handleOnChange:function(_e,_f){
+this._lastValue=_e;
+if(this._lastValueReported==undefined&&(_f===null||!this._onChangeActive)){
+this._resetValue=this._lastValueReported=_e;
 }
-if((this.intermediateChanges||_16||_16===undefined)&&((typeof _15!=typeof this._lastValueReported)||this.compare(_15,this._lastValueReported)!=0)){
-this._lastValueReported=_15;
+if((this.intermediateChanges||_f||_f===undefined)&&((typeof _e!=typeof this._lastValueReported)||this.compare(_e,this._lastValueReported)!=0)){
+this._lastValueReported=_e;
 if(this._onChangeActive){
-this.onChange(_15);
+if(this._onChangeHandle){
+clearTimeout(this._onChangeHandle);
+}
+this._onChangeHandle=setTimeout(dojo.hitch(this,function(){
+this._onChangeHandle=null;
+this.onChange(_e);
+}),0);
 }
 }
 },create:function(){
@@ -153,38 +162,34 @@ this.inherited(arguments);
 this._onChangeActive=true;
 this._setStateClass();
 },destroy:function(){
-if(this._layoutHackHandle){
-clearTimeout(this._layoutHackHandle);
+if(this._onChangeHandle){
+clearTimeout(this._onChangeHandle);
+this.onChange(this._lastValueReported);
 }
 this.inherited(arguments);
-},setValue:function(_17){
-dojo.deprecated("dijit.form._FormWidget:setValue("+_17+") is deprecated.  Use attr('value',"+_17+") instead.","","2.0");
-this.attr("value",_17);
+},setValue:function(_10){
+dojo.deprecated("dijit.form._FormWidget:setValue("+_10+") is deprecated.  Use attr('value',"+_10+") instead.","","2.0");
+this.attr("value",_10);
 },getValue:function(){
 dojo.deprecated(this.declaredClass+"::getValue() is deprecated. Use attr('value') instead.","","2.0");
 return this.attr("value");
-},_layoutHack:function(){
-if(dojo.isFF==2&&!this._layoutHackHandle){
-var _18=this.domNode;
-var old=_18.style.opacity;
-_18.style.opacity="0.999";
-this._layoutHackHandle=setTimeout(dojo.hitch(this,function(){
-this._layoutHackHandle=null;
-_18.style.opacity=old;
-}),0);
-}
 }});
-dojo.declare("dijit.form._FormValueWidget",dijit.form._FormWidget,{attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{value:""}),postCreate:function(){
-if(dojo.isIE||dojo.isWebKit){
+dojo.declare("dijit.form._FormValueWidget",dijit.form._FormWidget,{readOnly:false,attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{value:"",readOnly:"focusNode"}),_setReadOnlyAttr:function(_11){
+this.readOnly=_11;
+dojo.attr(this.focusNode,"readOnly",_11);
+dijit.setWaiState(this.focusNode,"readonly",_11);
+this._setStateClass();
+},postCreate:function(){
+if(dojo.isIE){
 this.connect(this.focusNode||this.domNode,"onkeydown",this._onKeyDown);
 }
 if(this._resetValue===undefined){
 this._resetValue=this.value;
 }
-},_setValueAttr:function(_1a,_1b){
-this.value=_1a;
-this._handleOnChange(_1a,_1b);
-},_getValueAttr:function(_1c){
+},_setValueAttr:function(_12,_13){
+this.value=_12;
+this._handleOnChange(_12,_13);
+},_getValueAttr:function(){
 return this._lastValue;
 },undo:function(){
 this._setValueAttr(this._lastValueReported,false);
@@ -192,7 +197,7 @@ this._setValueAttr(this._lastValueReported,false);
 this._hasBeenBlurred=false;
 this._setValueAttr(this._resetValue,true);
 },_onKeyDown:function(e){
-if(e.keyCode==dojo.keys.ESCAPE&&!e.ctrlKey&&!e.altKey){
+if(e.keyCode==dojo.keys.ESCAPE&&!(e.ctrlKey||e.altKey||e.metaKey)){
 var te;
 if(dojo.isIE){
 e.preventDefault();
@@ -200,15 +205,25 @@ te=document.createEventObject();
 te.keyCode=dojo.keys.ESCAPE;
 te.shiftKey=e.shiftKey;
 e.srcElement.fireEvent("onkeypress",te);
-}else{
-if(dojo.isWebKit){
-te=document.createEvent("Events");
-te.initEvent("keypress",true,true);
-te.keyCode=dojo.keys.ESCAPE;
-te.shiftKey=e.shiftKey;
-e.target.dispatchEvent(te);
 }
 }
+},_layoutHackIE7:function(){
+if(dojo.isIE==7){
+var _14=this.domNode;
+var _15=_14.parentNode;
+var _16=_14.firstChild||_14;
+var _17=_16.style.filter;
+while(_15&&_15.clientHeight==0){
+_15._disconnectHandle=this.connect(_15,"onscroll",dojo.hitch(this,function(e){
+this.disconnect(_15._disconnectHandle);
+_15.removeAttribute("_disconnectHandle");
+_16.style.filter=(new Date()).getMilliseconds();
+setTimeout(function(){
+_16.style.filter=_17;
+},0);
+}));
+_15=_15.parentNode;
+}
 }
 }});
 }
diff --git a/dijit/form/_Spinner.js b/dijit/form/_Spinner.js
index a1c194e..f305a13 100644
--- a/dijit/form/_Spinner.js
+++ b/dijit/form/_Spinner.js
@@ -9,7 +9,7 @@ if(!dojo._hasResource["dijit.form._Spinner"]){
 dojo._hasResource["dijit.form._Spinner"]=true;
 dojo.provide("dijit.form._Spinner");
 dojo.require("dijit.form.ValidationTextBox");
-dojo.declare("dijit.form._Spinner",dijit.form.RangeBoundTextBox,{defaultTimeout:500,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> <div class=\"dijitReset dijit [...]
+dojo.declare("dijit.form._Spinner",dijit.form.RangeBoundTextBox,{defaultTimeout:500,timeoutChangeRate:0.9,smallDelta:1,largeDelta:10,templateString:dojo.cache("dijit.form","templates/Spinner.html","<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" waiRole=\"presentation\"\n\t><div class=\"dijitInputLayoutContainer\"\n\t\t><div class=\"dijitReset dijitSpinnerButtonContai [...]
 return _1;
 },_arrowState:function(_3,_4){
 this._active=_4;
@@ -32,46 +32,50 @@ this._arrowState(_8,false);
 var _c=this.smallDelta;
 if(_a==this.textbox){
 var k=dojo.keys;
-var _e=_b.charOrCode;
-_c=(_e==k.PAGE_UP||_e==k.PAGE_DOWN)?this.largeDelta:this.smallDelta;
-_a=(_e==k.UP_ARROW||_e==k.PAGE_UP)?this.upArrowNode:this.downArrowNode;
+var _d=_b.charOrCode;
+_c=(_d==k.PAGE_UP||_d==k.PAGE_DOWN)?this.largeDelta:this.smallDelta;
+_a=(_d==k.UP_ARROW||_d==k.PAGE_UP)?this.upArrowNode:this.downArrowNode;
 }
 if(_9==-1){
 this._arrowReleased(_a);
 }else{
 this._arrowPressed(_a,(_a==this.upArrowNode)?1:-1,_c);
 }
-},_wheelTimer:null,_mouseWheeled:function(_f){
-dojo.stopEvent(_f);
-var _10=_f.detail?(_f.detail*-1):(_f.wheelDelta/120);
-if(_10!==0){
-var _11=this[(_10>0?"upArrowNode":"downArrowNode")];
-this._arrowPressed(_11,_10,this.smallDelta);
+},_wheelTimer:null,_mouseWheeled:function(_e){
+dojo.stopEvent(_e);
+var _f=_e.detail?(_e.detail*-1):(_e.wheelDelta/120);
+if(_f!==0){
+var _10=this[(_f>0?"upArrowNode":"downArrowNode")];
+this._arrowPressed(_10,_f,this.smallDelta);
 if(!this._wheelTimer){
 clearTimeout(this._wheelTimer);
 }
-this._wheelTimer=setTimeout(dojo.hitch(this,"_arrowReleased",_11),50);
+this._wheelTimer=setTimeout(dojo.hitch(this,"_arrowReleased",_10),50);
 }
 },postCreate:function(){
 this.inherited(arguments);
 this.connect(this.domNode,!dojo.isMozilla?"onmousewheel":"DOMMouseScroll","_mouseWheeled");
-this._connects.push(dijit.typematic.addListener(this.upArrowNode,this.textbox,{charOrCode:dojo.keys.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout));
-this._connects.push(dijit.typematic.addListener(this.downArrowNode,this.textbox,{charOrCode:dojo.keys.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout));
-this._connects.push(dijit.typematic.addListener(this.upArrowNode,this.textbox,{charOrCode:dojo.keys.PAGE_UP,ctrlKey:false,altKey:false,shiftKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout));
-this._connects.push(dijit.typematic.addListener(this.downArrowNode,this.textbox,{charOrCode:dojo.keys.PAGE_DOWN,ctrlKey:false,altKey:false,shiftKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout));
+this._connects.push(dijit.typematic.addListener(this.upArrowNode,this.textbox,{charOrCode:dojo.keys.UP_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout));
+this._connects.push(dijit.typematic.addListener(this.downArrowNode,this.textbox,{charOrCode:dojo.keys.DOWN_ARROW,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout));
+this._connects.push(dijit.typematic.addListener(this.upArrowNode,this.textbox,{charOrCode:dojo.keys.PAGE_UP,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout));
+this._connects.push(dijit.typematic.addListener(this.downArrowNode,this.textbox,{charOrCode:dojo.keys.PAGE_DOWN,ctrlKey:false,altKey:false,shiftKey:false,metaKey:false},this,"_typematicCallback",this.timeoutChangeRate,this.defaultTimeout));
 if(dojo.isIE){
-var _12=this;
-this.connect(this.domNode,"onresize",function(){
-setTimeout(dojo.hitch(_12,function(){
-var sz=this.upArrowNode.parentNode.offsetHeight;
+var _11=this;
+(function resize(){
+var sz=_11.upArrowNode.parentNode.offsetHeight;
 if(sz){
-this.upArrowNode.style.height=sz>>1;
-this.downArrowNode.style.height=sz-(sz>>1);
-this.focusNode.parentNode.style.height=sz;
+_11.upArrowNode.style.height=sz>>1;
+_11.downArrowNode.style.height=sz-(sz>>1);
+_11.focusNode.parentNode.style.height=sz;
 }
-this._setStateClass();
-}),0);
+})();
+this.connect(this.domNode,"onresize",function(){
+setTimeout(function(){
+resize();
+_11._setStateClass();
+},0);
 });
+this._layoutHackIE7();
 }
 }});
 }
diff --git a/dijit/form/nls/sl/Textarea.js b/dijit/form/nls/sl/Textarea.js
index 00e9ee8..912ee39 100644
--- a/dijit/form/nls/sl/Textarea.js
+++ b/dijit/form/nls/sl/Textarea.js
@@ -1 +1 @@
-({"iframeEditTitle":"uredi področje","iframeFocusTitle":"uredi področje okvirja"})
\ No newline at end of file
+({"iframeEditTitle":"urejanje področja","iframeFocusTitle":"urejanje področja okvirja"})
\ No newline at end of file
diff --git a/dijit/layout/AccordionContainer.js b/dijit/layout/AccordionContainer.js
index e1d635a..01433ad 100644
--- a/dijit/layout/AccordionContainer.js
+++ b/dijit/layout/AccordionContainer.js
@@ -14,7 +14,7 @@ dojo.require("dijit._Templated");
 dojo.require("dijit.layout.StackContainer");
 dojo.require("dijit.layout.ContentPane");
 dojo.require("dijit.layout.AccordionPane");
-dojo.declare("dijit.layout.AccordionContainer",dijit.layout.StackContainer,{duration:dijit.defaultDuration,_verticalSpace:0,baseClass:"dijitAccordionContainer",postCreate:function(){
+dojo.declare("dijit.layout.AccordionContainer",dijit.layout.StackContainer,{duration:dijit.defaultDuration,buttonWidget:"dijit.layout._AccordionButton",_verticalSpace:0,baseClass:"dijitAccordionContainer",postCreate:function(){
 this.domNode.style.overflow="hidden";
 this.inherited(arguments);
 dijit.setWaiRole(this.domNode,"tablist");
@@ -33,89 +33,102 @@ this.selectedChildWidget._buttonWidget._setSelectedState(true);
 var cs=dojo.getComputedStyle(_2);
 return Math.max(this._verticalSpace-dojo._getPadBorderExtents(_2,cs).h,0);
 },layout:function(){
-var _4=this.selectedChildWidget;
-var _5=0;
-dojo.forEach(this.getChildren(),function(_6){
-_5+=_6._buttonWidget.getTitleHeight();
+var _3=this.selectedChildWidget;
+var _4=0;
+dojo.forEach(this.getChildren(),function(_5){
+_4+=_5._buttonWidget.getTitleHeight();
 });
-var _7=this._contentBox;
-this._verticalSpace=_7.h-_5;
-this._containerContentBox={h:this._verticalSpace,w:_7.w};
-if(_4){
-_4.resize(this._containerContentBox);
-}
-},_setupChild:function(_8){
-_8._buttonWidget=new dijit.layout._AccordionButton({contentWidget:_8,title:_8.title,id:_8.id+"_button",parent:this});
-dojo.place(_8._buttonWidget.domNode,_8.domNode,"before");
+var _6=this._contentBox;
+this._verticalSpace=_6.h-_4;
+this._containerContentBox={h:this._verticalSpace,w:_6.w};
+if(_3){
+_3.resize(this._containerContentBox);
+}
+},_setupChild:function(_7){
+var _8=dojo.getObject(this.buttonWidget);
+var _9=(_7._buttonWidget=new _8({contentWidget:_7,label:_7.title,title:_7.tooltip,iconClass:_7.iconClass,id:_7.id+"_button",parent:this}));
+_7._accordionConnectHandle=this.connect(_7,"attr",function(_a,_b){
+if(arguments.length==2){
+switch(_a){
+case "title":
+case "iconClass":
+_9.attr(_a,_b);
+}
+}
+});
+dojo.place(_7._buttonWidget.domNode,_7.domNode,"before");
 this.inherited(arguments);
-},removeChild:function(_9){
-_9._buttonWidget.destroy();
+},removeChild:function(_c){
+this.disconnect(_c._accordionConnectHandle);
+delete _c._accordionConnectHandle;
+_c._buttonWidget.destroy();
+delete _c._buttonWidget;
 this.inherited(arguments);
 },getChildren:function(){
-return dojo.filter(this.inherited(arguments),function(_a){
-return _a.declaredClass!="dijit.layout._AccordionButton";
-});
+return dojo.filter(this.inherited(arguments),function(_d){
+return _d.declaredClass!=this.buttonWidget;
+},this);
 },destroy:function(){
-dojo.forEach(this.getChildren(),function(_b){
-_b._buttonWidget.destroy();
+dojo.forEach(this.getChildren(),function(_e){
+_e._buttonWidget.destroy();
 });
 this.inherited(arguments);
-},_transition:function(_c,_d){
+},_transition:function(_f,_10){
 if(this._inTransition){
 return;
 }
 this._inTransition=true;
-var _e=[];
-var _f=this._verticalSpace;
-if(_c){
-_c._buttonWidget.setSelected(true);
-this._showChild(_c);
-if(this.doLayout&&_c.resize){
-_c.resize(this._containerContentBox);
-}
-var _10=_c.domNode;
-dojo.addClass(_10,"dijitVisible");
-dojo.removeClass(_10,"dijitHidden");
-var _11=_10.style.overflow;
-_10.style.overflow="hidden";
-_e.push(dojo.animateProperty({node:_10,duration:this.duration,properties:{height:{start:1,end:this._getTargetHeight(_10)}},onEnd:dojo.hitch(this,function(){
-_10.style.overflow=_11;
+var _11=[];
+var _12=this._verticalSpace;
+if(_f){
+_f._buttonWidget.setSelected(true);
+this._showChild(_f);
+if(this.doLayout&&_f.resize){
+_f.resize(this._containerContentBox);
+}
+var _13=_f.domNode;
+dojo.addClass(_13,"dijitVisible");
+dojo.removeClass(_13,"dijitHidden");
+var _14=_13.style.overflow;
+_13.style.overflow="hidden";
+_11.push(dojo.animateProperty({node:_13,duration:this.duration,properties:{height:{start:1,end:this._getTargetHeight(_13)}},onEnd:dojo.hitch(this,function(){
+_13.style.overflow=_14;
 delete this._inTransition;
 })}));
 }
-if(_d){
-_d._buttonWidget.setSelected(false);
-var _12=_d.domNode,_13=_12.style.overflow;
-_12.style.overflow="hidden";
-_e.push(dojo.animateProperty({node:_12,duration:this.duration,properties:{height:{start:this._getTargetHeight(_12),end:1}},onEnd:function(){
-dojo.addClass(_12,"dijitHidden");
-dojo.removeClass(_12,"dijitVisible");
-_12.style.overflow=_13;
-if(_d.onHide){
-_d.onHide();
+if(_10){
+_10._buttonWidget.setSelected(false);
+var _15=_10.domNode,_16=_15.style.overflow;
+_15.style.overflow="hidden";
+_11.push(dojo.animateProperty({node:_15,duration:this.duration,properties:{height:{start:this._getTargetHeight(_15),end:1}},onEnd:function(){
+dojo.addClass(_15,"dijitHidden");
+dojo.removeClass(_15,"dijitVisible");
+_15.style.overflow=_16;
+if(_10.onHide){
+_10.onHide();
 }
 }}));
 }
-dojo.fx.combine(_e).play();
-},_onKeyPress:function(e,_15){
-if(this._inTransition||this.disabled||e.altKey||!(_15||e.ctrlKey)){
+dojo.fx.combine(_11).play();
+},_onKeyPress:function(e,_17){
+if(this._inTransition||this.disabled||e.altKey||!(_17||e.ctrlKey)){
 if(this._inTransition){
 dojo.stopEvent(e);
 }
 return;
 }
 var k=dojo.keys,c=e.charOrCode;
-if((_15&&(c==k.LEFT_ARROW||c==k.UP_ARROW))||(e.ctrlKey&&c==k.PAGE_UP)){
+if((_17&&(c==k.LEFT_ARROW||c==k.UP_ARROW))||(e.ctrlKey&&c==k.PAGE_UP)){
 this._adjacent(false)._buttonWidget._onTitleClick();
 dojo.stopEvent(e);
 }else{
-if((_15&&(c==k.RIGHT_ARROW||c==k.DOWN_ARROW))||(e.ctrlKey&&(c==k.PAGE_DOWN||c==k.TAB))){
+if((_17&&(c==k.RIGHT_ARROW||c==k.DOWN_ARROW))||(e.ctrlKey&&(c==k.PAGE_DOWN||c==k.TAB))){
 this._adjacent(true)._buttonWidget._onTitleClick();
 dojo.stopEvent(e);
 }
 }
 }});
-dojo.declare("dijit.layout._AccordionButton",[dijit._Widget,dijit._Templated],{templateString:"<div dojoAttachPoint='titleNode,focusNode' dojoAttachEvent='ondijitclick:_onTitleClick,onkeypress:_onTitleKeyPress,onfocus:_handleFocus,onblur:_handleFocus,onmouseenter:_onTitleEnter,onmouseleave:_onTitleLeave'\n\t\tclass='dijitAccordionTitle' wairole=\"tab\" waiState=\"expanded-false\"\n\t\t><span class='dijitInline dijitAccordionArrow' waiRole=\"presentation\"></span\n\t\t><span class='arrowT [...]
+dojo.declare("dijit.layout._AccordionButton",[dijit._Widget,dijit._Templated],{templateString:dojo.cache("dijit.layout","templates/AccordionButton.html","<div dojoAttachPoint='titleNode,focusNode' dojoAttachEvent='ondijitclick:_onTitleClick,onkeypress:_onTitleKeyPress,onfocus:_handleFocus,onblur:_handleFocus,onmouseenter:_onTitleEnter,onmouseleave:_onTitleLeave'\n\t\tclass='dijitAccordionTitle' wairole=\"tab\" waiState=\"expanded-false\"\n\t\t><span class='dijitInline dijitAccordionArrow [...]
 return this.parent;
 },postCreate:function(){
 this.inherited(arguments);
@@ -138,17 +151,17 @@ dojo.addClass(this.focusNode,"dijitAccordionTitle-hover");
 dojo.removeClass(this.focusNode,"dijitAccordionTitle-hover");
 },_onTitleKeyPress:function(evt){
 return this.getParent()._onKeyPress(evt,this.contentWidget);
-},_setSelectedState:function(_1b){
-this.selected=_1b;
-dojo[(_1b?"addClass":"removeClass")](this.titleNode,"dijitAccordionTitle-selected");
-dijit.setWaiState(this.focusNode,"expanded",_1b);
-dijit.setWaiState(this.focusNode,"selected",_1b);
-this.focusNode.setAttribute("tabIndex",_1b?"0":"-1");
+},_setSelectedState:function(_1a){
+this.selected=_1a;
+dojo[(_1a?"addClass":"removeClass")](this.titleNode,"dijitAccordionTitle-selected");
+dijit.setWaiState(this.focusNode,"expanded",_1a);
+dijit.setWaiState(this.focusNode,"selected",_1a);
+this.focusNode.setAttribute("tabIndex",_1a?"0":"-1");
 },_handleFocus:function(e){
-dojo[(e.type=="focus"?"addClass":"removeClass")](this.focusNode,"dijitAccordionFocused");
-},setSelected:function(_1d){
-this._setSelectedState(_1d);
-if(_1d){
+dojo.toggleClass(this.titleTextNode,"dijitAccordionFocused",e.type=="focus");
+},setSelected:function(_1b){
+this._setSelectedState(_1b);
+if(_1b){
 var cw=this.contentWidget;
 if(cw.onSelected){
 cw.onSelected();
diff --git a/dijit/layout/BorderContainer.js b/dijit/layout/BorderContainer.js
index cb1f690..ffb0838 100644
--- a/dijit/layout/BorderContainer.js
+++ b/dijit/layout/BorderContainer.js
@@ -41,185 +41,184 @@ this["_"+_2]=_1.domNode;
 this["_"+_2+"Widget"]=_1;
 if((_1.splitter||this.gutters)&&!this._splitters[_2]){
 var _4=dojo.getObject(_1.splitter?this._splitterClass:"dijit.layout._Gutter");
-var _5={left:"right",right:"left",top:"bottom",bottom:"top",leading:"trailing",trailing:"leading"};
-var _6=new _4({container:this,child:_1,region:_2,oppNode:this["_"+_5[_1.region]],live:this.liveSplitters});
-_6.isSplitter=true;
-this._splitters[_2]=_6.domNode;
+var _5=new _4({container:this,child:_1,region:_2,live:this.liveSplitters});
+_5.isSplitter=true;
+this._splitters[_2]=_5.domNode;
 dojo.place(this._splitters[_2],_1.domNode,"after");
-_6.startup();
+_5.startup();
 }
 _1.region=_2;
 }
-},_computeSplitterThickness:function(_7){
-this._splitterThickness[_7]=this._splitterThickness[_7]||dojo.marginBox(this._splitters[_7])[(/top|bottom/.test(_7)?"h":"w")];
+},_computeSplitterThickness:function(_6){
+this._splitterThickness[_6]=this._splitterThickness[_6]||dojo.marginBox(this._splitters[_6])[(/top|bottom/.test(_6)?"h":"w")];
 },layout:function(){
-for(var _8 in this._splitters){
-this._computeSplitterThickness(_8);
+for(var _7 in this._splitters){
+this._computeSplitterThickness(_7);
 }
 this._layoutChildren();
-},addChild:function(_9,_a){
+},addChild:function(_8,_9){
 this.inherited(arguments);
 if(this._started){
-this._layoutChildren();
+this.layout();
 }
-},removeChild:function(_b){
-var _c=_b.region;
-var _d=this._splitters[_c];
-if(_d){
-dijit.byNode(_d).destroy();
-delete this._splitters[_c];
-delete this._splitterThickness[_c];
+},removeChild:function(_a){
+var _b=_a.region;
+var _c=this._splitters[_b];
+if(_c){
+dijit.byNode(_c).destroy();
+delete this._splitters[_b];
+delete this._splitterThickness[_b];
 }
 this.inherited(arguments);
-delete this["_"+_c];
-delete this["_"+_c+"Widget"];
+delete this["_"+_b];
+delete this["_"+_b+"Widget"];
 if(this._started){
-this._layoutChildren(_b.region);
+this._layoutChildren(_a.region);
 }
-dojo.removeClass(_b.domNode,this.baseClass+"Pane");
+dojo.removeClass(_a.domNode,this.baseClass+"Pane");
 },getChildren:function(){
-return dojo.filter(this.inherited(arguments),function(_e){
-return !_e.isSplitter;
+return dojo.filter(this.inherited(arguments),function(_d){
+return !_d.isSplitter;
 });
-},getSplitter:function(_f){
-var _10=this._splitters[_f];
-return _10?dijit.byNode(_10):null;
-},resize:function(_11,_12){
+},getSplitter:function(_e){
+var _f=this._splitters[_e];
+return _f?dijit.byNode(_f):null;
+},resize:function(_10,_11){
 if(!this.cs||!this.pe){
-var _13=this.domNode;
-this.cs=dojo.getComputedStyle(_13);
-this.pe=dojo._getPadExtents(_13,this.cs);
-this.pe.r=dojo._toPixelValue(_13,this.cs.paddingRight);
-this.pe.b=dojo._toPixelValue(_13,this.cs.paddingBottom);
-dojo.style(_13,"padding","0px");
+var _12=this.domNode;
+this.cs=dojo.getComputedStyle(_12);
+this.pe=dojo._getPadExtents(_12,this.cs);
+this.pe.r=dojo._toPixelValue(_12,this.cs.paddingRight);
+this.pe.b=dojo._toPixelValue(_12,this.cs.paddingBottom);
+dojo.style(_12,"padding","0px");
 }
 this.inherited(arguments);
-},_layoutChildren:function(_14){
+},_layoutChildren:function(_13){
 if(!this._borderBox||!this._borderBox.h){
 return;
 }
-var _15=(this.design=="sidebar");
-var _16=0,_17=0,_18=0,_19=0;
-var _1a={},_1b={},_1c={},_1d={},_1e=(this._center&&this._center.style)||{};
-var _1f=/left|right/.test(_14);
-var _20=!_14||(!_1f&&!_15);
-var _21=!_14||(_1f&&_15);
+var _14=(this.design=="sidebar");
+var _15=0,_16=0,_17=0,_18=0;
+var _19={},_1a={},_1b={},_1c={},_1d=(this._center&&this._center.style)||{};
+var _1e=/left|right/.test(_13);
+var _1f=!_13||(!_1e&&!_14);
+var _20=!_13||(_1e&&_14);
 if(this._top){
-_1a=_21&&this._top.style;
-_16=dojo.marginBox(this._top).h;
+_19=_20&&this._top.style;
+_15=dojo.marginBox(this._top).h;
 }
 if(this._left){
-_1b=_20&&this._left.style;
-_18=dojo.marginBox(this._left).w;
+_1a=_1f&&this._left.style;
+_17=dojo.marginBox(this._left).w;
 }
 if(this._right){
-_1c=_20&&this._right.style;
-_19=dojo.marginBox(this._right).w;
+_1b=_1f&&this._right.style;
+_18=dojo.marginBox(this._right).w;
 }
 if(this._bottom){
-_1d=_21&&this._bottom.style;
-_17=dojo.marginBox(this._bottom).h;
-}
-var _22=this._splitters;
-var _23=_22.top,_24=_22.bottom,_25=_22.left,_26=_22.right;
-var _27=this._splitterThickness;
-var _28=_27.top||0,_29=_27.left||0,_2a=_27.right||0,_2b=_27.bottom||0;
-if(_29>50||_2a>50){
+_1c=_20&&this._bottom.style;
+_16=dojo.marginBox(this._bottom).h;
+}
+var _21=this._splitters;
+var _22=_21.top,_23=_21.bottom,_24=_21.left,_25=_21.right;
+var _26=this._splitterThickness;
+var _27=_26.top||0,_28=_26.left||0,_29=_26.right||0,_2a=_26.bottom||0;
+if(_28>50||_29>50){
 setTimeout(dojo.hitch(this,function(){
 this._splitterThickness={};
-for(var _2c in this._splitters){
-this._computeSplitterThickness(_2c);
+for(var _2b in this._splitters){
+this._computeSplitterThickness(_2b);
 }
 this._layoutChildren();
 }),50);
 return false;
 }
 var pe=this.pe;
-var _2e={left:(_15?_18+_29:0)+pe.l+"px",right:(_15?_19+_2a:0)+pe.r+"px"};
+var _2c={left:(_14?_17+_28:0)+pe.l+"px",right:(_14?_18+_29:0)+pe.r+"px"};
+if(_22){
+dojo.mixin(_22.style,_2c);
+_22.style.top=_15+pe.t+"px";
+}
 if(_23){
-dojo.mixin(_23.style,_2e);
-_23.style.top=_16+pe.t+"px";
+dojo.mixin(_23.style,_2c);
+_23.style.bottom=_16+pe.b+"px";
 }
+_2c={top:(_14?0:_15+_27)+pe.t+"px",bottom:(_14?0:_16+_2a)+pe.b+"px"};
 if(_24){
-dojo.mixin(_24.style,_2e);
-_24.style.bottom=_17+pe.b+"px";
+dojo.mixin(_24.style,_2c);
+_24.style.left=_17+pe.l+"px";
 }
-_2e={top:(_15?0:_16+_28)+pe.t+"px",bottom:(_15?0:_17+_2b)+pe.b+"px"};
 if(_25){
-dojo.mixin(_25.style,_2e);
-_25.style.left=_18+pe.l+"px";
-}
-if(_26){
-dojo.mixin(_26.style,_2e);
-_26.style.right=_19+pe.r+"px";
-}
-dojo.mixin(_1e,{top:pe.t+_16+_28+"px",left:pe.l+_18+_29+"px",right:pe.r+_19+_2a+"px",bottom:pe.b+_17+_2b+"px"});
-var _2f={top:_15?pe.t+"px":_1e.top,bottom:_15?pe.b+"px":_1e.bottom};
-dojo.mixin(_1b,_2f);
-dojo.mixin(_1c,_2f);
-_1b.left=pe.l+"px";
-_1c.right=pe.r+"px";
-_1a.top=pe.t+"px";
-_1d.bottom=pe.b+"px";
-if(_15){
-_1a.left=_1d.left=_18+_29+pe.l+"px";
-_1a.right=_1d.right=_19+_2a+pe.r+"px";
+dojo.mixin(_25.style,_2c);
+_25.style.right=_18+pe.r+"px";
+}
+dojo.mixin(_1d,{top:pe.t+_15+_27+"px",left:pe.l+_17+_28+"px",right:pe.r+_18+_29+"px",bottom:pe.b+_16+_2a+"px"});
+var _2d={top:_14?pe.t+"px":_1d.top,bottom:_14?pe.b+"px":_1d.bottom};
+dojo.mixin(_1a,_2d);
+dojo.mixin(_1b,_2d);
+_1a.left=pe.l+"px";
+_1b.right=pe.r+"px";
+_19.top=pe.t+"px";
+_1c.bottom=pe.b+"px";
+if(_14){
+_19.left=_1c.left=_17+_28+pe.l+"px";
+_19.right=_1c.right=_18+_29+pe.r+"px";
 }else{
-_1a.left=_1d.left=pe.l+"px";
-_1a.right=_1d.right=pe.r+"px";
-}
-var _30=this._borderBox.h-pe.t-pe.b,_31=_30-(_16+_28+_17+_2b),_32=_15?_30:_31;
-var _33=this._borderBox.w-pe.l-pe.r,_34=_33-(_18+_29+_19+_2a),_35=_15?_34:_33;
-var dim={top:{w:_35,h:_16},bottom:{w:_35,h:_17},left:{w:_18,h:_32},right:{w:_19,h:_32},center:{h:_31,w:_34}};
-var _37=dojo.isIE<8||(dojo.isIE&&dojo.isQuirks)||dojo.some(this.getChildren(),function(_38){
-return _38.domNode.tagName=="TEXTAREA"||_38.domNode.tagName=="INPUT";
+_19.left=_1c.left=pe.l+"px";
+_19.right=_1c.right=pe.r+"px";
+}
+var _2e=this._borderBox.h-pe.t-pe.b,_2f=_2e-(_15+_27+_16+_2a),_30=_14?_2e:_2f;
+var _31=this._borderBox.w-pe.l-pe.r,_32=_31-(_17+_28+_18+_29),_33=_14?_32:_31;
+var dim={top:{w:_33,h:_15},bottom:{w:_33,h:_16},left:{w:_17,h:_30},right:{w:_18,h:_30},center:{h:_2f,w:_32}};
+var _34=dojo.isIE<8||(dojo.isIE&&dojo.isQuirks)||dojo.some(this.getChildren(),function(_35){
+return _35.domNode.tagName=="TEXTAREA"||_35.domNode.tagName=="INPUT";
 });
+if(_34){
+var _36=function(_37,_38,_39){
 if(_37){
-var _39=function(_3a,_3b,_3c){
-if(_3a){
-(_3a.resize?_3a.resize(_3b,_3c):dojo.marginBox(_3a.domNode,_3b));
+(_37.resize?_37.resize(_38,_39):dojo.marginBox(_37.domNode,_38));
 }
 };
+if(_24){
+_24.style.height=_30;
+}
 if(_25){
-_25.style.height=_32;
+_25.style.height=_30;
 }
-if(_26){
-_26.style.height=_32;
+_36(this._leftWidget,{h:_30},dim.left);
+_36(this._rightWidget,{h:_30},dim.right);
+if(_22){
+_22.style.width=_33;
 }
-_39(this._leftWidget,{h:_32},dim.left);
-_39(this._rightWidget,{h:_32},dim.right);
 if(_23){
-_23.style.width=_35;
-}
-if(_24){
-_24.style.width=_35;
+_23.style.width=_33;
 }
-_39(this._topWidget,{w:_35},dim.top);
-_39(this._bottomWidget,{w:_35},dim.bottom);
-_39(this._centerWidget,dim.center);
+_36(this._topWidget,{w:_33},dim.top);
+_36(this._bottomWidget,{w:_33},dim.bottom);
+_36(this._centerWidget,dim.center);
 }else{
-var _3d={};
-if(_14){
-_3d[_14]=_3d.center=true;
-if(/top|bottom/.test(_14)&&this.design!="sidebar"){
-_3d.left=_3d.right=true;
+var _3a={};
+if(_13){
+_3a[_13]=_3a.center=true;
+if(/top|bottom/.test(_13)&&this.design!="sidebar"){
+_3a.left=_3a.right=true;
 }else{
-if(/left|right/.test(_14)&&this.design=="sidebar"){
-_3d.top=_3d.bottom=true;
+if(/left|right/.test(_13)&&this.design=="sidebar"){
+_3a.top=_3a.bottom=true;
 }
 }
 }
-dojo.forEach(this.getChildren(),function(_3e){
-if(_3e.resize&&(!_14||_3e.region in _3d)){
-_3e.resize(null,dim[_3e.region]);
+dojo.forEach(this.getChildren(),function(_3b){
+if(_3b.resize&&(!_13||_3b.region in _3a)){
+_3b.resize(null,dim[_3b.region]);
 }
 },this);
 }
 },destroy:function(){
-for(var _3f in this._splitters){
-var _40=this._splitters[_3f];
-dijit.byNode(_40).destroy();
-dojo.destroy(_40);
+for(var _3c in this._splitters){
+var _3d=this._splitters[_3c];
+dijit.byNode(_3d).destroy();
+dojo.destroy(_3d);
 }
 delete this._splitters;
 delete this._splitterThickness;
@@ -227,32 +226,24 @@ this.inherited(arguments);
 }});
 dojo.extend(dijit._Widget,{region:"",splitter:false,minSize:0,maxSize:Infinity});
 dojo.require("dijit._Templated");
-dojo.declare("dijit.layout._Splitter",[dijit._Widget,dijit._Templated],{live:true,templateString:"<div class=\"dijitSplitter\" dojoAttachEvent=\"onkeypress:_onKeyPress,onmousedown:_startDrag\" tabIndex=\"0\" waiRole=\"separator\"><div class=\"dijitSplitterThumb\"></div></div>",postCreate:function(){
+dojo.declare("dijit.layout._Splitter",[dijit._Widget,dijit._Templated],{live:true,templateString:"<div class=\"dijitSplitter\" dojoAttachEvent=\"onkeypress:_onKeyPress,onmousedown:_startDrag,onmouseenter:_onMouse,onmouseleave:_onMouse\" tabIndex=\"0\" waiRole=\"separator\"><div class=\"dijitSplitterThumb\"></div></div>",postCreate:function(){
 this.inherited(arguments);
 this.horizontal=/top|bottom/.test(this.region);
 dojo.addClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V"));
 this._factor=/top|left/.test(this.region)?1:-1;
-this._minSize=this.child.minSize;
-this.child.domNode._recalc=true;
-this.connect(this.container,"resize",function(){
-this.child.domNode._recalc=true;
-});
 this._cookieName=this.container.id+"_"+this.region;
 if(this.container.persist){
-var _41=dojo.cookie(this._cookieName);
-if(_41){
-this.child.domNode.style[this.horizontal?"height":"width"]=_41;
+var _3e=dojo.cookie(this._cookieName);
+if(_3e){
+this.child.domNode.style[this.horizontal?"height":"width"]=_3e;
 }
 }
 },_computeMaxSize:function(){
-var dim=this.horizontal?"h":"w",_43=this.container._splitterThickness[this.region];
-var _44=dojo.contentBox(this.container.domNode)[dim]-(this.oppNode?dojo.marginBox(this.oppNode)[dim]:0)-20-_43*2;
-this._maxSize=Math.min(this.child.maxSize,_44);
+var dim=this.horizontal?"h":"w",_3f=this.container._splitterThickness[this.region];
+var _40={left:"right",right:"left",top:"bottom",bottom:"top",leading:"trailing",trailing:"leading"},_41=this.container["_"+_40[this.region]];
+var _42=dojo.contentBox(this.container.domNode)[dim]-(_41?dojo.marginBox(_41)[dim]:0)-20-_3f*2;
+return Math.min(this.child.maxSize,_42);
 },_startDrag:function(e){
-if(this.child.domNode._recalc){
-this._computeMaxSize();
-this.child.domNode._recalc=false;
-}
 if(!this.cover){
 this.cover=dojo.doc.createElement("div");
 dojo.addClass(this.cover,"dijitSplitterCover");
@@ -268,17 +259,26 @@ dojo.addClass(this.domNode,"dijitSplitterShadow");
 dojo.place(this.fake,this.domNode,"after");
 }
 dojo.addClass(this.domNode,"dijitSplitterActive");
-var _46=this._factor,max=this._maxSize,min=this._minSize||20,_49=this.horizontal,_4a=_49?"pageY":"pageX",_4b=e[_4a],_4c=this.domNode.style,dim=_49?"h":"w",_4e=dojo.marginBox(this.child.domNode)[dim],_4f=this.region,_50=parseInt(this.domNode.style[_4f],10),_51=this._resize,mb={},_53=this.child.domNode,_54=dojo.hitch(this.container,this.container._layoutChildren),de=dojo.doc.body;
-this._handlers=(this._handlers||[]).concat([dojo.connect(de,"onmousemove",this._drag=function(e,_57){
-var _58=e[_4a]-_4b,_59=_46*_58+_4e,_5a=Math.max(Math.min(_59,max),min);
-if(_51||_57){
-mb[dim]=_5a;
-dojo.marginBox(_53,mb);
-_54(_4f);
-}
-_4c[_4f]=_46*_58+_50+(_5a-_59)+"px";
+dojo.addClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V")+"Active");
+if(this.fake){
+dojo.removeClass(this.fake,"dijitSplitterHover");
+dojo.removeClass(this.fake,"dijitSplitter"+(this.horizontal?"H":"V")+"Hover");
+}
+var _43=this._factor,max=this._computeMaxSize(),min=this.child.minSize||20,_44=this.horizontal,_45=_44?"pageY":"pageX",_46=e[_45],_47=this.domNode.style,dim=_44?"h":"w",_48=dojo.marginBox(this.child.domNode)[dim],_49=this.region,_4a=parseInt(this.domNode.style[_49],10),_4b=this._resize,mb={},_4c=this.child.domNode,_4d=dojo.hitch(this.container,this.container._layoutChildren),de=dojo.doc.body;
+this._handlers=(this._handlers||[]).concat([dojo.connect(de,"onmousemove",this._drag=function(e,_4e){
+var _4f=e[_45]-_46,_50=_43*_4f+_48,_51=Math.max(Math.min(_50,max),min);
+if(_4b||_4e){
+mb[dim]=_51;
+dojo.marginBox(_4c,mb);
+_4d(_49);
+}
+_47[_49]=_43*_4f+_4a+(_51-_50)+"px";
 }),dojo.connect(dojo.doc,"ondragstart",dojo.stopEvent),dojo.connect(dojo.body(),"onselectstart",dojo.stopEvent),dojo.connect(de,"onmouseup",this,"_stopDrag")]);
 dojo.stopEvent(e);
+},_onMouse:function(e){
+var o=(e.type=="mouseover"||e.type=="mouseenter");
+dojo.toggleClass(this.domNode,"dijitSplitterHover",o);
+dojo.toggleClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V")+"Hover",o);
 },_stopDrag:function(e){
 try{
 if(this.cover){
@@ -288,15 +288,13 @@ if(this.fake){
 dojo.destroy(this.fake);
 }
 dojo.removeClass(this.domNode,"dijitSplitterActive");
+dojo.removeClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V")+"Active");
 dojo.removeClass(this.domNode,"dijitSplitterShadow");
 this._drag(e);
 this._drag(e,true);
 }
 finally{
 this._cleanupHandlers();
-if(this.oppNode){
-this.oppNode._recalc=true;
-}
 delete this._drag;
 }
 if(this.container.persist){
@@ -306,29 +304,22 @@ dojo.cookie(this._cookieName,this.child.domNode.style[this.horizontal?"height":"
 dojo.forEach(this._handlers,dojo.disconnect);
 delete this._handlers;
 },_onKeyPress:function(e){
-if(this.child.domNode._recalc){
-this._computeMaxSize();
-this.child.domNode._recalc=false;
-}
 this._resize=true;
-var _5d=this.horizontal;
-var _5e=1;
+var _52=this.horizontal;
+var _53=1;
 var dk=dojo.keys;
 switch(e.charOrCode){
-case _5d?dk.UP_ARROW:dk.LEFT_ARROW:
-_5e*=-1;
-case _5d?dk.DOWN_ARROW:dk.RIGHT_ARROW:
+case _52?dk.UP_ARROW:dk.LEFT_ARROW:
+_53*=-1;
+case _52?dk.DOWN_ARROW:dk.RIGHT_ARROW:
 break;
 default:
 return;
 }
-var _60=dojo.marginBox(this.child.domNode)[_5d?"h":"w"]+this._factor*_5e;
+var _54=dojo.marginBox(this.child.domNode)[_52?"h":"w"]+this._factor*_53;
 var mb={};
-mb[this.horizontal?"h":"w"]=Math.max(Math.min(_60,this._maxSize),this._minSize);
+mb[this.horizontal?"h":"w"]=Math.max(Math.min(_54,this._computeMaxSize()),this.child.minSize);
 dojo.marginBox(this.child.domNode,mb);
-if(this.oppNode){
-this.oppNode._recalc=true;
-}
 this.container._layoutChildren(this.region);
 dojo.stopEvent(e);
 },destroy:function(){
diff --git a/dijit/layout/ContentPane.js b/dijit/layout/ContentPane.js
index df61022..b674f4f 100644
--- a/dijit/layout/ContentPane.js
+++ b/dijit/layout/ContentPane.js
@@ -15,7 +15,7 @@ dojo.require("dojo.parser");
 dojo.require("dojo.string");
 dojo.require("dojo.html");
 dojo.requireLocalization("dijit","loading",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
-dojo.declare("dijit.layout.ContentPane",dijit._Widget,{href:"",extractContent:false,parseOnLoad:true,preventCache:false,preload:false,refreshOnShow:false,loadingMessage:"<span class='dijitContentPaneLoading'>${loadingState}</span>",errorMessage:"<span class='dijitContentPaneError'>${errorState}</span>",isLoaded:false,baseClass:"dijitContentPane",doLayout:true,ioArgs:{},isContainer:true,postMixInProperties:function(){
+dojo.declare("dijit.layout.ContentPane",dijit._Widget,{href:"",extractContent:false,parseOnLoad:true,preventCache:false,preload:false,refreshOnShow:false,loadingMessage:"<span class='dijitContentPaneLoading'>${loadingState}</span>",errorMessage:"<span class='dijitContentPaneError'>${errorState}</span>",isLoaded:false,baseClass:"dijitContentPane",doLayout:true,ioArgs:{},isContainer:true,isLayoutContainer:true,onLoadDeferred:null,attributeMap:dojo.delegate(dijit._Widget.prototype.attribute [...]
 this.inherited(arguments);
 var _1=dojo.i18n.getLocalization("dijit","loading",this.lang);
 this.loadingMessage=dojo.string.substitute(this.loadingMessage,_1);
@@ -38,49 +38,55 @@ dojo.addClass(this.domNode,this.baseClass);
 if(this._started){
 return;
 }
+var _2=dijit._Contained.prototype.getParent.call(this);
+this._childOfLayoutWidget=_2&&_2.isLayoutContainer;
+this._needLayout=!this._childOfLayoutWidget;
 if(this.isLoaded){
-dojo.forEach(this.getChildren(),function(_2){
-_2.startup();
+dojo.forEach(this.getChildren(),function(_3){
+_3.startup();
 });
-if(this.doLayout){
-this._checkIfSingleChild();
-}
-if(!this._singleChild||!dijit._Contained.prototype.getParent.call(this)){
-this._scheduleLayout();
 }
+if(this._isShown()||this.preload){
+this._onShow();
 }
-this._loadCheck();
 this.inherited(arguments);
 },_checkIfSingleChild:function(){
-var _3=dojo.query(">",this.containerNode),_4=_3.filter(function(_5){
-return dojo.hasAttr(_5,"dojoType")||dojo.hasAttr(_5,"widgetId");
-}),_6=dojo.filter(_4.map(dijit.byNode),function(_7){
-return _7&&_7.domNode&&_7.resize;
+var _4=dojo.query("> *",this.containerNode).filter(function(_5){
+return _5.tagName!=="SCRIPT";
+}),_6=_4.filter(function(_7){
+return dojo.hasAttr(_7,"dojoType")||dojo.hasAttr(_7,"widgetId");
+}),_8=dojo.filter(_6.map(dijit.byNode),function(_9){
+return _9&&_9.domNode&&_9.resize;
 });
-if(_3.length==_4.length&&_6.length==1){
-this._singleChild=_6[0];
+if(_4.length==_6.length&&_8.length==1){
+this._singleChild=_8[0];
 }else{
 delete this._singleChild;
 }
-},setHref:function(_8){
+dojo.toggleClass(this.containerNode,this.baseClass+"SingleChild",!!this._singleChild);
+},setHref:function(_a){
 dojo.deprecated("dijit.layout.ContentPane.setHref() is deprecated. Use attr('href', ...) instead.","","2.0");
-return this.attr("href",_8);
-},_setHrefAttr:function(_9){
+return this.attr("href",_a);
+},_setHrefAttr:function(_b){
 this.cancel();
-this.href=_9;
+this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));
+this.href=_b;
 if(this._created&&(this.preload||this._isShown())){
-return this.refresh();
+this._load();
 }else{
 this._hrefChanged=true;
 }
-},setContent:function(_a){
+return this.onLoadDeferred;
+},setContent:function(_c){
 dojo.deprecated("dijit.layout.ContentPane.setContent() is deprecated.  Use attr('content', ...) instead.","","2.0");
-this.attr("content",_a);
-},_setContentAttr:function(_b){
+this.attr("content",_c);
+},_setContentAttr:function(_d){
 this.href="";
 this.cancel();
-this._setContent(_b||"");
+this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));
+this._setContent(_d||"");
 this._isDownloaded=false;
+return this.onLoadDeferred;
 },_getContentAttr:function(){
 return this.containerNode.innerHTML;
 },cancel:function(){
@@ -88,45 +94,69 @@ if(this._xhrDfd&&(this._xhrDfd.fired==-1)){
 this._xhrDfd.cancel();
 }
 delete this._xhrDfd;
+this.onLoadDeferred=null;
 },uninitialize:function(){
 if(this._beingDestroyed){
 this.cancel();
 }
-},destroyRecursive:function(_c){
+this.inherited(arguments);
+},destroyRecursive:function(_e){
 if(this._beingDestroyed){
 return;
 }
-this._beingDestroyed=true;
 this.inherited(arguments);
-},resize:function(_d){
-dojo.marginBox(this.domNode,_d);
-var _e=this.containerNode,mb=dojo.mixin(dojo.marginBox(_e),_d||{});
-var cb=(this._contentBox=dijit.layout.marginBox2contentBox(_e,mb));
-if(this._singleChild&&this._singleChild.resize){
-this._singleChild.resize({w:cb.w,h:cb.h});
+},resize:function(_f,_10){
+if(!this._wasShown){
+this._onShow();
+}
+this._resizeCalled=true;
+if(_f){
+dojo.marginBox(this.domNode,_f);
+}
+var cn=this.containerNode;
+if(cn===this.domNode){
+var mb=_10||{};
+dojo.mixin(mb,_f||{});
+if(!("h" in mb)||!("w" in mb)){
+mb=dojo.mixin(dojo.marginBox(cn),mb);
+}
+this._contentBox=dijit.layout.marginBox2contentBox(cn,mb);
+}else{
+this._contentBox=dojo.contentBox(cn);
 }
+this._layoutChildren();
 },_isShown:function(){
+if(this._childOfLayoutWidget){
+if(this._resizeCalled&&"open" in this){
+return this.open;
+}
+return this._resizeCalled;
+}else{
 if("open" in this){
 return this.open;
 }else{
 var _11=this.domNode;
 return (_11.style.display!="none")&&(_11.style.visibility!="hidden")&&!dojo.hasClass(_11,"dijitHidden");
 }
+}
 },_onShow:function(){
-if(this._needLayout){
-this._layoutChildren();
+if(this.href){
+if(!this._xhrDfd&&(!this.isLoaded||this._hrefChanged||this.refreshOnShow)){
+this.refresh();
 }
-this._loadCheck();
-if(this.onShow){
-this.onShow();
+}else{
+if(!this._childOfLayoutWidget&&this._needLayout){
+this._layoutChildren();
 }
-},_loadCheck:function(){
-if((this.href&&!this._xhrDfd)&&(!this.isLoaded||this._hrefChanged||this.refreshOnShow)&&(this.preload||this._isShown())){
-delete this._hrefChanged;
-this.refresh();
 }
+this.inherited(arguments);
+this._wasShown=true;
 },refresh:function(){
 this.cancel();
+this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));
+this._load();
+return this.onLoadDeferred;
+},_load:function(){
 this._setContent(this.onDownloadStart(),true);
 var _12=this;
 var _13={preventCache:(this.preventCache||this.refreshOnShow),url:this.href,handleAs:"text"};
@@ -153,10 +183,12 @@ _12._onError("Download",err);
 delete _12._xhrDfd;
 return err;
 });
-},_onLoadHandler:function(_17){
+delete this._hrefChanged;
+},_onLoadHandler:function(_16){
 this.isLoaded=true;
 try{
-this.onLoad(_17);
+this.onLoadDeferred.callback(_16);
+this.onLoad(_16);
 }
 catch(e){
 console.error("Error "+this.widgetId+" running custom onLoad code: "+e.message);
@@ -173,57 +205,57 @@ console.error("Error "+this.widgetId+" running custom onUnload code: "+e.message
 if(this.isLoaded){
 this._onUnloadHandler();
 }
-var _18=this._contentSetter;
-dojo.forEach(this.getChildren(),function(_19){
-if(_19.destroyRecursive){
-_19.destroyRecursive();
+var _17=this._contentSetter;
+dojo.forEach(this.getChildren(),function(_18){
+if(_18.destroyRecursive){
+_18.destroyRecursive();
 }
 });
-if(_18){
-dojo.forEach(_18.parseResults,function(_1a){
-if(_1a.destroyRecursive&&_1a.domNode&&_1a.domNode.parentNode==dojo.body()){
-_1a.destroyRecursive();
+if(_17){
+dojo.forEach(_17.parseResults,function(_19){
+if(_19.destroyRecursive&&_19.domNode&&_19.domNode.parentNode==dojo.body()){
+_19.destroyRecursive();
 }
 });
-delete _18.parseResults;
+delete _17.parseResults;
 }
 dojo.html._emptyNode(this.containerNode);
-},_setContent:function(_1b,_1c){
-this.destroyDescendants();
 delete this._singleChild;
-var _1d=this._contentSetter;
-if(!(_1d&&_1d instanceof dojo.html._ContentSetter)){
-_1d=this._contentSetter=new dojo.html._ContentSetter({node:this.containerNode,_onError:dojo.hitch(this,this._onError),onContentError:dojo.hitch(this,function(e){
-var _1f=this.onContentError(e);
+},_setContent:function(_1a,_1b){
+this.destroyDescendants();
+var _1c=this._contentSetter;
+if(!(_1c&&_1c instanceof dojo.html._ContentSetter)){
+_1c=this._contentSetter=new dojo.html._ContentSetter({node:this.containerNode,_onError:dojo.hitch(this,this._onError),onContentError:dojo.hitch(this,function(e){
+var _1d=this.onContentError(e);
 try{
-this.containerNode.innerHTML=_1f;
+this.containerNode.innerHTML=_1d;
 }
 catch(e){
 console.error("Fatal "+this.id+" could not change content due to "+e.message,e);
 }
 })});
 }
-var _20=dojo.mixin({cleanContent:this.cleanContent,extractContent:this.extractContent,parseContent:this.parseOnLoad},this._contentSetterParams||{});
-dojo.mixin(_1d,_20);
-_1d.set((dojo.isObject(_1b)&&_1b.domNode)?_1b.domNode:_1b);
+var _1e=dojo.mixin({cleanContent:this.cleanContent,extractContent:this.extractContent,parseContent:this.parseOnLoad},this._contentSetterParams||{});
+dojo.mixin(_1c,_1e);
+_1c.set((dojo.isObject(_1a)&&_1a.domNode)?_1a.domNode:_1a);
 delete this._contentSetterParams;
-if(!_1c){
-dojo.forEach(this.getChildren(),function(_21){
-_21.startup();
-});
-if(this.doLayout){
-this._checkIfSingleChild();
+if(!_1b){
+dojo.forEach(this.getChildren(),function(_1f){
+if(!this.parseOnLoad||_1f.getParent){
+_1f.startup();
 }
+},this);
 this._scheduleLayout();
-this._onLoadHandler(_1b);
+this._onLoadHandler(_1a);
 }
-},_onError:function(_22,err,_24){
-var _25=this["on"+_22+"Error"].call(this,err);
-if(_24){
-console.error(_24,err);
+},_onError:function(_20,err,_21){
+this.onLoadDeferred.errback(err);
+var _22=this["on"+_20+"Error"].call(this,err);
+if(_21){
+console.error(_21,err);
 }else{
-if(_25){
-this._setContent(_25,true);
+if(_22){
+this._setContent(_22,true);
 }
 }
 },_scheduleLayout:function(){
@@ -233,23 +265,26 @@ this._layoutChildren();
 this._needLayout=true;
 }
 },_layoutChildren:function(){
+if(this.doLayout){
+this._checkIfSingleChild();
+}
 if(this._singleChild&&this._singleChild.resize){
 var cb=this._contentBox||dojo.contentBox(this.containerNode);
 this._singleChild.resize({w:cb.w,h:cb.h});
 }else{
-dojo.forEach(this.getChildren(),function(_27){
-if(_27.resize){
-_27.resize();
+dojo.forEach(this.getChildren(),function(_23){
+if(_23.resize){
+_23.resize();
 }
 });
 }
 delete this._needLayout;
-},onLoad:function(_28){
+},onLoad:function(_24){
 },onUnload:function(){
 },onDownloadStart:function(){
 return this.loadingMessage;
-},onContentError:function(_29){
-},onDownloadError:function(_2a){
+},onContentError:function(_25){
+},onDownloadError:function(_26){
 return this.errorMessage;
 },onDownloadEnd:function(){
 }});
diff --git a/dijit/layout/ScrollingTabController.js b/dijit/layout/ScrollingTabController.js
new file mode 100644
index 0000000..61714c5
--- /dev/null
+++ b/dijit/layout/ScrollingTabController.js
@@ -0,0 +1,199 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dijit.layout.ScrollingTabController"]){
+dojo._hasResource["dijit.layout.ScrollingTabController"]=true;
+dojo.provide("dijit.layout.ScrollingTabController");
+dojo.require("dijit.layout.TabController");
+dojo.require("dijit.Menu");
+dojo.declare("dijit.layout.ScrollingTabController",dijit.layout.TabController,{templateString:dojo.cache("dijit.layout","templates/ScrollingTabController.html","<div class=\"dijitTabListContainer-${tabPosition}\" style=\"visibility:hidden\">\n\t<div dojoType=\"dijit.layout._ScrollingTabControllerButton\" buttonType=\"menuBtn\" buttonClass=\"tabStripMenuButton\"\n\t\t\ttabPosition=\"${tabPosition}\" dojoAttachPoint=\"_menuBtn\" showLabel=false>↓</div>\n\t<div dojoType=\"dijit.layout. [...]
+this.inherited(arguments);
+var n=this.domNode;
+this.scrollNode=this.tablistWrapper;
+this._initButtons();
+if(!this.tabStripClass){
+this.tabStripClass="dijitTabContainer"+this.tabPosition.charAt(0).toUpperCase()+this.tabPosition.substr(1).replace(/-.*/,"")+"None";
+dojo.addClass(n,"tabStrip-disabled");
+}
+dojo.addClass(this.tablistWrapper,this.tabStripClass);
+},onStartup:function(){
+this.inherited(arguments);
+dojo.style(this.domNode,"visibility","visible");
+this._postStartup=true;
+},onAddChild:function(_1,_2){
+this.inherited(arguments);
+var _3;
+if(this.useMenu){
+_3=new dijit.MenuItem({label:_1.title,onClick:dojo.hitch(this,function(){
+this.onSelectChild(_1);
+})});
+this._menuChildren[_1.id]=_3;
+this._menu.addChild(_3,_2);
+}
+this.pane2handles[_1.id].push(this.connect(this.pane2button[_1.id],"attr",function(_4,_5){
+if(this._postStartup){
+if(arguments.length==2&&_4=="label"){
+if(_3){
+_3.attr(_4,_5);
+}
+if(this._dim){
+this.resize(this._dim);
+}
+}
+}
+}));
+dojo.style(this.containerNode,"width",(dojo.style(this.containerNode,"width")+200)+"px");
+},onRemoveChild:function(_6,_7){
+var _8=this.pane2button[_6.id];
+if(this._selectedTab===_8.domNode){
+this._selectedTab=null;
+}
+if(this.useMenu&&_6&&_6.id&&this._menuChildren[_6.id]){
+this._menu.removeChild(this._menuChildren[_6.id]);
+this._menuChildren[_6.id].destroy();
+delete this._menuChildren[_6.id];
+}
+this.inherited(arguments);
+},_initButtons:function(){
+this._menuChildren={};
+this._btnWidth=0;
+this._buttons=dojo.query("> .tabStripButton",this.domNode).filter(function(_9){
+if((this.useMenu&&_9==this._menuBtn.domNode)||(this.useSlider&&(_9==this._rightBtn.domNode||_9==this._leftBtn.domNode))){
+this._btnWidth+=dojo.marginBox(_9).w;
+return true;
+}else{
+dojo.style(_9,"display","none");
+return false;
+}
+},this);
+if(this.useMenu){
+this._menu=new dijit.Menu({id:this.id+"_menu",targetNodeIds:[this._menuBtn.domNode],leftClickToOpen:true,refocus:false});
+this._supportingWidgets.push(this._menu);
+}
+},_getTabsWidth:function(){
+var _a=this.getChildren();
+if(_a.length){
+var _b=_a[this.isLeftToRight()?0:_a.length-1].domNode,_c=_a[this.isLeftToRight()?_a.length-1:0].domNode;
+return _c.offsetLeft+dojo.style(_c,"width")-_b.offsetLeft;
+}else{
+return 0;
+}
+},_enableBtn:function(_d){
+var _e=this._getTabsWidth();
+_d=_d||dojo.style(this.scrollNode,"width");
+return _e>0&&_d<_e;
+},resize:function(_f){
+if(this.domNode.offsetWidth==0){
+return;
+}
+this._dim=_f;
+this.scrollNode.style.height="auto";
+this._contentBox=dijit.layout.marginBox2contentBox(this.domNode,{h:0,w:_f.w});
+this._contentBox.h=this.scrollNode.offsetHeight;
+dojo.contentBox(this.domNode,this._contentBox);
+var _10=this._enableBtn(this._contentBox.w);
+this._buttons.style("display",_10?"":"none");
+this._leftBtn.layoutAlign="left";
+this._rightBtn.layoutAlign="right";
+this._menuBtn.layoutAlign=this.isLeftToRight()?"right":"left";
+dijit.layout.layoutChildren(this.domNode,this._contentBox,[this._menuBtn,this._leftBtn,this._rightBtn,{domNode:this.scrollNode,layoutAlign:"client"}]);
+if(this._selectedTab){
+var w=this.scrollNode,sl=this._convertToScrollLeft(this._getScrollForSelectedTab());
+w.scrollLeft=sl;
+}
+this._setButtonClass(this._getScroll());
+},_getScroll:function(){
+var sl=(this.isLeftToRight()||dojo.isIE<8)?this.scrollNode.scrollLeft:dojo.style(this.containerNode,"width")-dojo.style(this.scrollNode,"width")+(dojo.isIE==8?-1:1)*this.scrollNode.scrollLeft;
+return sl;
+},_convertToScrollLeft:function(val){
+if(this.isLeftToRight()||dojo.isIE<8){
+return val;
+}else{
+var _11=dojo.style(this.containerNode,"width")-dojo.style(this.scrollNode,"width");
+return (dojo.isIE==8?-1:1)*(val-_11);
+}
+},onSelectChild:function(_12){
+var tab=this.pane2button[_12.id];
+if(!tab||!_12){
+return;
+}
+var _13=tab.domNode;
+if(_13!=this._selectedTab){
+this._selectedTab=_13;
+var sl=this._getScroll();
+if(sl>_13.offsetLeft||sl+dojo.style(this.scrollNode,"width")<_13.offsetLeft+dojo.style(_13,"width")){
+var _14=this.createSmoothScroll();
+dojo.connect(_14,"onEnd",function(){
+tab.onClick(null);
+});
+_14.play();
+}else{
+tab.onClick(null);
+}
+}
+this.inherited(arguments);
+},_getScrollBounds:function(){
+var _15=this.getChildren(),_16=dojo.style(this.scrollNode,"width"),_17=dojo.style(this.containerNode,"width"),_18=_17-_16,_19=this._getTabsWidth();
+if(_15.length&&_19>_16){
+return {min:this.isLeftToRight()?0:_15[_15.length-1].domNode.offsetLeft,max:this.isLeftToRight()?(_15[_15.length-1].domNode.offsetLeft+dojo.style(_15[_15.length-1].domNode,"width"))-_16:_18};
+}else{
+var _1a=this.isLeftToRight()?0:_18;
+return {min:_1a,max:_1a};
+}
+},_getScrollForSelectedTab:function(){
+var w=this.scrollNode,n=this._selectedTab,_1b=dojo.style(this.scrollNode,"width"),_1c=this._getScrollBounds();
+var pos=(n.offsetLeft+dojo.style(n,"width")/2)-_1b/2;
+pos=Math.min(Math.max(pos,_1c.min),_1c.max);
+return pos;
+},createSmoothScroll:function(x){
+if(arguments.length>0){
+var _1d=this._getScrollBounds();
+x=Math.min(Math.max(x,_1d.min),_1d.max);
+}else{
+x=this._getScrollForSelectedTab();
+}
+if(this._anim&&this._anim.status()=="playing"){
+this._anim.stop();
+}
+var _1e=this,w=this.scrollNode,_1f=new dojo._Animation({beforeBegin:function(){
+if(this.curve){
+delete this.curve;
+}
+var _20=w.scrollLeft,_21=_1e._convertToScrollLeft(x);
+_1f.curve=new dojo._Line(_20,_21);
+},onAnimate:function(val){
+w.scrollLeft=val;
+}});
+this._anim=_1f;
+this._setButtonClass(x);
+return _1f;
+},_getBtnNode:function(e){
+var n=e.target;
+while(n&&!dojo.hasClass(n,"tabStripButton")){
+n=n.parentNode;
+}
+return n;
+},doSlideRight:function(e){
+this.doSlide(1,this._getBtnNode(e));
+},doSlideLeft:function(e){
+this.doSlide(-1,this._getBtnNode(e));
+},doSlide:function(_22,_23){
+if(_23&&dojo.hasClass(_23,"dijitTabBtnDisabled")){
+return;
+}
+var _24=dojo.style(this.scrollNode,"width");
+var d=(_24*0.75)*_22;
+var to=this._getScroll()+d;
+this._setButtonClass(to);
+this.createSmoothScroll(to).play();
+},_setButtonClass:function(_25){
+var cls="dijitTabBtnDisabled",_26=this._getScrollBounds();
+dojo.toggleClass(this._leftBtn.domNode,cls,_25<=_26.min);
+dojo.toggleClass(this._rightBtn.domNode,cls,_25>=_26.max);
+}});
+dojo.declare("dijit.layout._ScrollingTabControllerButton",dijit.form.Button,{baseClass:"dijitTab",buttonType:"",buttonClass:"",tabPosition:"top",templateString:dojo.cache("dijit.layout","templates/_ScrollingTabControllerButton.html","<div id=\"${id}-${buttonType}\" class=\"tabStripButton dijitTab ${buttonClass} tabStripButton-${tabPosition}\"\n\t\tdojoAttachEvent=\"onclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\">\n\t<div role=\"presentation\" wai [...]
+}
diff --git a/dijit/layout/SplitContainer.js b/dijit/layout/SplitContainer.js
index 92b58d3..4fa6aee 100644
--- a/dijit/layout/SplitContainer.js
+++ b/dijit/layout/SplitContainer.js
@@ -44,9 +44,9 @@ this.inherited(arguments);
 if(this._started){
 return;
 }
-dojo.forEach(this.getChildren(),function(_2,i,_4){
+dojo.forEach(this.getChildren(),function(_2,i,_3){
 this._setupChild(_2);
-if(i<_4.length-1){
+if(i<_3.length-1){
 this._addSizer();
 }
 },this);
@@ -54,10 +54,10 @@ if(this.persist){
 this._restoreState();
 }
 this.inherited(arguments);
-},_setupChild:function(_5){
+},_setupChild:function(_4){
 this.inherited(arguments);
-_5.domNode.style.position="absolute";
-dojo.addClass(_5.domNode,"dijitSplitPane");
+_4.domNode.style.position="absolute";
+dojo.addClass(_4.domNode,"dijitSplitPane");
 },_onSizerMouseDown:function(e){
 if(e.target.id){
 for(var i=0;i<this.sizers.length;i++){
@@ -69,22 +69,22 @@ if(i<this.sizers.length){
 this.beginSizing(e,i);
 }
 }
-},_addSizer:function(_8){
-_8=_8===undefined?this.sizers.length:_8;
-var _9=dojo.doc.createElement("div");
-_9.id=dijit.getUniqueId("dijit_layout_SplitterContainer_Splitter");
-this.sizers.splice(_8,0,_9);
-this.domNode.appendChild(_9);
-_9.className=this.isHorizontal?"dijitSplitContainerSizerH":"dijitSplitContainerSizerV";
-var _a=dojo.doc.createElement("div");
-_a.className="thumb";
-_a.id=_9.id;
-_9.appendChild(_a);
-this.connect(_9,"onmousedown","_onSizerMouseDown");
-dojo.setSelectable(_9,false);
-},removeChild:function(_b){
+},_addSizer:function(_5){
+_5=_5===undefined?this.sizers.length:_5;
+var _6=dojo.doc.createElement("div");
+_6.id=dijit.getUniqueId("dijit_layout_SplitterContainer_Splitter");
+this.sizers.splice(_5,0,_6);
+this.domNode.appendChild(_6);
+_6.className=this.isHorizontal?"dijitSplitContainerSizerH":"dijitSplitContainerSizerV";
+var _7=dojo.doc.createElement("div");
+_7.className="thumb";
+_7.id=_6.id;
+_6.appendChild(_7);
+this.connect(_6,"onmousedown","_onSizerMouseDown");
+dojo.setSelectable(_6,false);
+},removeChild:function(_8){
 if(this.sizers.length){
-var i=dojo.indexOf(this.getChildren(),_b);
+var i=dojo.indexOf(this.getChildren(),_8);
 if(i!=-1){
 if(i==this.sizers.length){
 i--;
@@ -97,133 +97,133 @@ this.inherited(arguments);
 if(this._started){
 this.layout();
 }
-},addChild:function(_d,_e){
+},addChild:function(_9,_a){
 this.inherited(arguments);
 if(this._started){
-var _f=this.getChildren();
-if(_f.length>1){
-this._addSizer(_e);
+var _b=this.getChildren();
+if(_b.length>1){
+this._addSizer(_a);
 }
 this.layout();
 }
 },layout:function(){
 this.paneWidth=this._contentBox.w;
 this.paneHeight=this._contentBox.h;
-var _10=this.getChildren();
-if(!_10.length){
+var _c=this.getChildren();
+if(!_c.length){
 return;
 }
-var _11=this.isHorizontal?this.paneWidth:this.paneHeight;
-if(_10.length>1){
-_11-=this.sizerWidth*(_10.length-1);
+var _d=this.isHorizontal?this.paneWidth:this.paneHeight;
+if(_c.length>1){
+_d-=this.sizerWidth*(_c.length-1);
 }
-var _12=0;
-dojo.forEach(_10,function(_13){
-_12+=_13.sizeShare;
+var _e=0;
+dojo.forEach(_c,function(_f){
+_e+=_f.sizeShare;
 });
-var _14=_11/_12;
-var _15=0;
-dojo.forEach(_10.slice(0,_10.length-1),function(_16){
-var _17=Math.round(_14*_16.sizeShare);
-_16.sizeActual=_17;
-_15+=_17;
+var _10=_d/_e;
+var _11=0;
+dojo.forEach(_c.slice(0,_c.length-1),function(_12){
+var _13=Math.round(_10*_12.sizeShare);
+_12.sizeActual=_13;
+_11+=_13;
 });
-_10[_10.length-1].sizeActual=_11-_15;
+_c[_c.length-1].sizeActual=_d-_11;
 this._checkSizes();
 var pos=0;
-var _19=_10[0].sizeActual;
-this._movePanel(_10[0],pos,_19);
-_10[0].position=pos;
-pos+=_19;
+var _14=_c[0].sizeActual;
+this._movePanel(_c[0],pos,_14);
+_c[0].position=pos;
+pos+=_14;
 if(!this.sizers){
 return;
 }
-dojo.some(_10.slice(1),function(_1a,i){
+dojo.some(_c.slice(1),function(_15,i){
 if(!this.sizers[i]){
 return true;
 }
 this._moveSlider(this.sizers[i],pos,this.sizerWidth);
 this.sizers[i].position=pos;
 pos+=this.sizerWidth;
-_19=_1a.sizeActual;
-this._movePanel(_1a,pos,_19);
-_1a.position=pos;
-pos+=_19;
+_14=_15.sizeActual;
+this._movePanel(_15,pos,_14);
+_15.position=pos;
+pos+=_14;
 },this);
-},_movePanel:function(_1c,pos,_1e){
+},_movePanel:function(_16,pos,_17){
 if(this.isHorizontal){
-_1c.domNode.style.left=pos+"px";
-_1c.domNode.style.top=0;
-var box={w:_1e,h:this.paneHeight};
-if(_1c.resize){
-_1c.resize(box);
+_16.domNode.style.left=pos+"px";
+_16.domNode.style.top=0;
+var box={w:_17,h:this.paneHeight};
+if(_16.resize){
+_16.resize(box);
 }else{
-dojo.marginBox(_1c.domNode,box);
+dojo.marginBox(_16.domNode,box);
 }
 }else{
-_1c.domNode.style.left=0;
-_1c.domNode.style.top=pos+"px";
-var box={w:this.paneWidth,h:_1e};
-if(_1c.resize){
-_1c.resize(box);
+_16.domNode.style.left=0;
+_16.domNode.style.top=pos+"px";
+var box={w:this.paneWidth,h:_17};
+if(_16.resize){
+_16.resize(box);
 }else{
-dojo.marginBox(_1c.domNode,box);
+dojo.marginBox(_16.domNode,box);
 }
 }
-},_moveSlider:function(_20,pos,_22){
+},_moveSlider:function(_18,pos,_19){
 if(this.isHorizontal){
-_20.style.left=pos+"px";
-_20.style.top=0;
-dojo.marginBox(_20,{w:_22,h:this.paneHeight});
+_18.style.left=pos+"px";
+_18.style.top=0;
+dojo.marginBox(_18,{w:_19,h:this.paneHeight});
 }else{
-_20.style.left=0;
-_20.style.top=pos+"px";
-dojo.marginBox(_20,{w:this.paneWidth,h:_22});
-}
-},_growPane:function(_23,_24){
-if(_23>0){
-if(_24.sizeActual>_24.sizeMin){
-if((_24.sizeActual-_24.sizeMin)>_23){
-_24.sizeActual=_24.sizeActual-_23;
-_23=0;
+_18.style.left=0;
+_18.style.top=pos+"px";
+dojo.marginBox(_18,{w:this.paneWidth,h:_19});
+}
+},_growPane:function(_1a,_1b){
+if(_1a>0){
+if(_1b.sizeActual>_1b.sizeMin){
+if((_1b.sizeActual-_1b.sizeMin)>_1a){
+_1b.sizeActual=_1b.sizeActual-_1a;
+_1a=0;
 }else{
-_23-=_24.sizeActual-_24.sizeMin;
-_24.sizeActual=_24.sizeMin;
+_1a-=_1b.sizeActual-_1b.sizeMin;
+_1b.sizeActual=_1b.sizeMin;
 }
 }
 }
-return _23;
+return _1a;
 },_checkSizes:function(){
-var _25=0;
-var _26=0;
-var _27=this.getChildren();
-dojo.forEach(_27,function(_28){
-_26+=_28.sizeActual;
-_25+=_28.sizeMin;
+var _1c=0;
+var _1d=0;
+var _1e=this.getChildren();
+dojo.forEach(_1e,function(_1f){
+_1d+=_1f.sizeActual;
+_1c+=_1f.sizeMin;
 });
-if(_25<=_26){
-var _29=0;
-dojo.forEach(_27,function(_2a){
-if(_2a.sizeActual<_2a.sizeMin){
-_29+=_2a.sizeMin-_2a.sizeActual;
-_2a.sizeActual=_2a.sizeMin;
+if(_1c<=_1d){
+var _20=0;
+dojo.forEach(_1e,function(_21){
+if(_21.sizeActual<_21.sizeMin){
+_20+=_21.sizeMin-_21.sizeActual;
+_21.sizeActual=_21.sizeMin;
 }
 });
-if(_29>0){
-var _2b=this.isDraggingLeft?_27.reverse():_27;
-dojo.forEach(_2b,function(_2c){
-_29=this._growPane(_29,_2c);
+if(_20>0){
+var _22=this.isDraggingLeft?_1e.reverse():_1e;
+dojo.forEach(_22,function(_23){
+_20=this._growPane(_20,_23);
 },this);
 }
 }else{
-dojo.forEach(_27,function(_2d){
-_2d.sizeActual=Math.round(_26*(_2d.sizeMin/_25));
+dojo.forEach(_1e,function(_24){
+_24.sizeActual=Math.round(_1d*(_24.sizeMin/_1c));
 });
 }
 },beginSizing:function(e,i){
-var _30=this.getChildren();
-this.paneBefore=_30[i];
-this.paneAfter=_30[i+1];
+var _25=this.getChildren();
+this.paneBefore=_25[i];
+this.paneAfter=_25[i+1];
 this.isSizing=true;
 this.sizingSplitter=this.sizers[i];
 if(!this.cover){
@@ -232,18 +232,18 @@ this.cover=dojo.create("div",{style:{position:"absolute",zIndex:5,top:0,left:0,w
 this.cover.style.zIndex=5;
 }
 this.sizingSplitter.style.zIndex=6;
-this.originPos=dojo.coords(_30[0].domNode,true);
+this.originPos=dojo.position(_25[0].domNode,true);
 if(this.isHorizontal){
-var _31=e.layerX||e.offsetX||0;
-var _32=e.pageX;
+var _26=e.layerX||e.offsetX||0;
+var _27=e.pageX;
 this.originPos=this.originPos.x;
 }else{
-var _31=e.layerY||e.offsetY||0;
-var _32=e.pageY;
+var _26=e.layerY||e.offsetY||0;
+var _27=e.pageY;
 this.originPos=this.originPos.y;
 }
-this.startPoint=this.lastPoint=_32;
-this.screenToClientOffset=_32-_31;
+this.startPoint=this.lastPoint=_27;
+this.screenToClientOffset=_27-_26;
 this.dragOffset=this.lastPoint-this.paneBefore.sizeActual-this.originPos-this.paneBefore.position;
 if(!this.activeSizing){
 this._showSizingLine();
@@ -304,13 +304,13 @@ this._checkSizes();
 return a;
 },_updateSize:function(){
 var pos=this.lastPoint-this.dragOffset-this.originPos;
-var _3b=this.paneBefore.position;
-var _3c=this.paneAfter.position+this.paneAfter.sizeActual;
-this.paneBefore.sizeActual=pos-_3b;
+var _28=this.paneBefore.position;
+var _29=this.paneAfter.position+this.paneAfter.sizeActual;
+this.paneBefore.sizeActual=pos-_28;
 this.paneAfter.position=pos+this.sizerWidth;
-this.paneAfter.sizeActual=_3c-this.paneAfter.position;
-dojo.forEach(this.getChildren(),function(_3d){
-_3d.sizeShare=_3d.sizeActual;
+this.paneAfter.sizeActual=_29-this.paneAfter.position;
+dojo.forEach(this.getChildren(),function(_2a){
+_2a.sizeShare=_2a.sizeActual;
 });
 if(this._started){
 this.layout();
@@ -327,13 +327,13 @@ dojo.style(this.virtualSizer,(this.isHorizontal?"left":"top"),pos+"px");
 },_getCookieName:function(i){
 return this.id+"_"+i;
 },_restoreState:function(){
-dojo.forEach(this.getChildren(),function(_40,i){
-var _42=this._getCookieName(i);
-var _43=dojo.cookie(_42);
-if(_43){
-var pos=parseInt(_43);
+dojo.forEach(this.getChildren(),function(_2b,i){
+var _2c=this._getCookieName(i);
+var _2d=dojo.cookie(_2c);
+if(_2d){
+var pos=parseInt(_2d);
 if(typeof pos=="number"){
-_40.sizeShare=pos;
+_2b.sizeShare=pos;
 }
 }
 },this);
@@ -341,8 +341,8 @@ _40.sizeShare=pos;
 if(!this.persist){
 return;
 }
-dojo.forEach(this.getChildren(),function(_45,i){
-dojo.cookie(this._getCookieName(i),_45.sizeShare,{expires:365});
+dojo.forEach(this.getChildren(),function(_2e,i){
+dojo.cookie(this._getCookieName(i),_2e.sizeShare,{expires:365});
 },this);
 }});
 dojo.extend(dijit._Widget,{sizeMin:10,sizeShare:10});
diff --git a/dijit/layout/StackContainer.js b/dijit/layout/StackContainer.js
index 6cf1f1f..8c33481 100644
--- a/dijit/layout/StackContainer.js
+++ b/dijit/layout/StackContainer.js
@@ -12,7 +12,7 @@ dojo.require("dijit._Templated");
 dojo.require("dijit.layout._LayoutWidget");
 dojo.requireLocalization("dijit","common",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
 dojo.require("dojo.cookie");
-dojo.declare("dijit.layout.StackContainer",dijit.layout._LayoutWidget,{doLayout:true,persist:false,baseClass:"dijitStackContainer",_started:false,postCreate:function(){
+dojo.declare("dijit.layout.StackContainer",dijit.layout._LayoutWidget,{doLayout:true,persist:false,baseClass:"dijitStackContainer",postCreate:function(){
 this.inherited(arguments);
 dojo.addClass(this.domNode,"dijitLayoutContainer");
 dijit.setWaiRole(this.containerNode,"tabpanel");
@@ -39,66 +39,75 @@ _3=this.selectedChildWidget=_1[0];
 _3.selected=true;
 }
 dojo.publish(this.id+"-startup",[{children:_1,selected:_3}]);
-if(_3){
-this._showChild(_3);
+this.inherited(arguments);
+},resize:function(){
+var _4=this.selectedChildWidget;
+if(_4&&!this._hasBeenShown){
+this._hasBeenShown=true;
+this._showChild(_4);
 }
 this.inherited(arguments);
-},_setupChild:function(_4){
+},_setupChild:function(_5){
 this.inherited(arguments);
-dojo.removeClass(_4.domNode,"dijitVisible");
-dojo.addClass(_4.domNode,"dijitHidden");
-_4.domNode.title="";
-return _4;
-},addChild:function(_5,_6){
+dojo.removeClass(_5.domNode,"dijitVisible");
+dojo.addClass(_5.domNode,"dijitHidden");
+_5.domNode.title="";
+},addChild:function(_6,_7){
 this.inherited(arguments);
 if(this._started){
-dojo.publish(this.id+"-addChild",[_5,_6]);
+dojo.publish(this.id+"-addChild",[_6,_7]);
 this.layout();
 if(!this.selectedChildWidget){
-this.selectChild(_5);
+this.selectChild(_6);
 }
 }
-},removeChild:function(_7){
+},removeChild:function(_8){
 this.inherited(arguments);
+if(this._started){
+dojo.publish(this.id+"-removeChild",[_8]);
+}
 if(this._beingDestroyed){
 return;
 }
 if(this._started){
-dojo.publish(this.id+"-removeChild",[_7]);
 this.layout();
 }
-if(this.selectedChildWidget===_7){
+if(this.selectedChildWidget===_8){
 this.selectedChildWidget=undefined;
 if(this._started){
-var _8=this.getChildren();
-if(_8.length){
-this.selectChild(_8[0]);
+var _9=this.getChildren();
+if(_9.length){
+this.selectChild(_9[0]);
 }
 }
 }
-},selectChild:function(_9){
-_9=dijit.byId(_9);
-if(this.selectedChildWidget!=_9){
-this._transition(_9,this.selectedChildWidget);
-this.selectedChildWidget=_9;
-dojo.publish(this.id+"-selectChild",[_9]);
+},selectChild:function(_a){
+_a=dijit.byId(_a);
+if(this.selectedChildWidget!=_a){
+this._transition(_a,this.selectedChildWidget);
+this.selectedChildWidget=_a;
+dojo.publish(this.id+"-selectChild",[_a]);
 if(this.persist){
 dojo.cookie(this.id+"_selectedChild",this.selectedChildWidget.id);
 }
 }
-},_transition:function(_a,_b){
-if(_b){
-this._hideChild(_b);
+},_transition:function(_b,_c){
+if(_c){
+this._hideChild(_c);
+}
+this._showChild(_b);
+if(_b.resize){
+if(this.doLayout){
+_b.resize(this._containerContentBox||this._contentBox);
+}else{
+_b.resize();
 }
-this._showChild(_a);
-if(this.doLayout&&_a.resize){
-_a.resize(this._containerContentBox||this._contentBox);
 }
-},_adjacent:function(_c){
-var _d=this.getChildren();
-var _e=dojo.indexOf(_d,this.selectedChildWidget);
-_e+=_c?1:_d.length-1;
-return _d[_e%_d.length];
+},_adjacent:function(_d){
+var _e=this.getChildren();
+var _f=dojo.indexOf(_e,this.selectedChildWidget);
+_f+=_d?1:_e.length-1;
+return _e[_f%_e.length];
 },forward:function(){
 this.selectChild(this._adjacent(true));
 },back:function(){
@@ -116,32 +125,26 @@ _10.isLastChild=(_10==_11[_11.length-1]);
 _10.selected=true;
 dojo.removeClass(_10.domNode,"dijitHidden");
 dojo.addClass(_10.domNode,"dijitVisible");
-if(_10._onShow){
 _10._onShow();
-}else{
-if(_10.onShow){
-_10.onShow();
-}
-}
 },_hideChild:function(_12){
 _12.selected=false;
 dojo.removeClass(_12.domNode,"dijitVisible");
 dojo.addClass(_12.domNode,"dijitHidden");
-if(_12.onHide){
 _12.onHide();
-}
 },closeChild:function(_13){
 var _14=_13.onClose(this,_13);
 if(_14){
 this.removeChild(_13);
 _13.destroyRecursive();
 }
-},destroy:function(){
-this._beingDestroyed=true;
-this.inherited(arguments);
+},destroyDescendants:function(_15){
+dojo.forEach(this.getChildren(),function(_16){
+this.removeChild(_16);
+_16.destroyRecursive(_15);
+},this);
 }});
 dojo.require("dijit.layout.StackController");
-dojo.extend(dijit._Widget,{title:"",selected:false,closable:false,onClose:function(){
+dojo.extend(dijit._Widget,{selected:false,closable:false,iconClass:"",showTitle:true,onClose:function(){
 return true;
 }});
 }
diff --git a/dijit/layout/StackController.js b/dijit/layout/StackController.js
index c9e8fe2..52e98af 100644
--- a/dijit/layout/StackController.js
+++ b/dijit/layout/StackController.js
@@ -12,127 +12,129 @@ dojo.require("dijit._Widget");
 dojo.require("dijit._Templated");
 dojo.require("dijit._Container");
 dojo.require("dijit.form.ToggleButton");
-dojo.require("dijit.Menu");
 dojo.requireLocalization("dijit","common",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
 dojo.declare("dijit.layout.StackController",[dijit._Widget,dijit._Templated,dijit._Container],{templateString:"<span wairole='tablist' dojoAttachEvent='onkeypress' class='dijitStackController'></span>",containerId:"",buttonWidget:"dijit.layout._StackButton",postCreate:function(){
 dijit.setWaiRole(this.domNode,"tablist");
 this.pane2button={};
 this.pane2handles={};
-this.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")];
+this.subscribe(this.containerId+"-startup","onStartup");
+this.subscribe(this.containerId+"-addChild","onAddChild");
+this.subscribe(this.containerId+"-removeChild","onRemoveChild");
+this.subscribe(this.containerId+"-selectChild","onSelectChild");
+this.subscribe(this.containerId+"-containerKeyPress","onContainerKeyPress");
 },onStartup:function(_1){
 dojo.forEach(_1.children,this.onAddChild,this);
+if(_1.selected){
 this.onSelectChild(_1.selected);
+}
 },destroy:function(){
 for(var _2 in this.pane2button){
-this.onRemoveChild(_2);
+this.onRemoveChild(dijit.byId(_2));
 }
-dojo.forEach(this._subscriptions,dojo.unsubscribe);
 this.inherited(arguments);
 },onAddChild:function(_3,_4){
 var _5=dojo.doc.createElement("span");
 this.domNode.appendChild(_5);
 var _6=dojo.getObject(this.buttonWidget);
-var _7=new _6({label:_3.title,closeButton:_3.closable},_5);
+var _7=new _6({id:this.id+"_"+_3.id,label:_3.title,showLabel:_3.showTitle,iconClass:_3.iconClass,closeButton:_3.closable,title:_3.tooltip},_5);
+dijit.setWaiState(_7.focusNode,"selected","false");
+this.pane2handles[_3.id]=[this.connect(_3,"attr",function(_8,_9){
+if(arguments.length==2){
+var _a={title:"label",showTitle:"showLabel",iconClass:"iconClass",closable:"closeButton",tooltip:"title"}[_8];
+if(_a){
+_7.attr(_a,_9);
+}
+}
+}),this.connect(_7,"onClick",dojo.hitch(this,"onButtonClick",_3)),this.connect(_7,"onClickCloseButton",dojo.hitch(this,"onCloseButtonClick",_3))];
 this.addChild(_7,_4);
-this.pane2button[_3]=_7;
+this.pane2button[_3.id]=_7;
 _3.controlButton=_7;
-var _8=[];
-_8.push(dojo.connect(_7,"onClick",dojo.hitch(this,"onButtonClick",_3)));
-if(_3.closable){
-_8.push(dojo.connect(_7,"onClickCloseButton",dojo.hitch(this,"onCloseButtonClick",_3)));
-var _9=dojo.i18n.getLocalization("dijit","common");
-var _a=new dijit.Menu({targetNodeIds:[_7.id],id:_7.id+"_Menu"});
-var _b=new dijit.MenuItem({label:_9.itemClose});
-_8.push(dojo.connect(_b,"onClick",dojo.hitch(this,"onCloseButtonClick",_3)));
-_a.addChild(_b);
-this.pane2menu[_3]=_a;
-}
-this.pane2handles[_3]=_8;
 if(!this._currentChild){
 _7.focusNode.setAttribute("tabIndex","0");
+dijit.setWaiState(_7.focusNode,"selected","true");
 this._currentChild=_3;
 }
 if(!this.isLeftToRight()&&dojo.isIE&&this._rectifyRtlTabList){
 this._rectifyRtlTabList();
 }
-},onRemoveChild:function(_c){
-if(this._currentChild===_c){
+},onRemoveChild:function(_b){
+if(this._currentChild===_b){
 this._currentChild=null;
 }
-dojo.forEach(this.pane2handles[_c],dojo.disconnect);
-delete this.pane2handles[_c];
-var _d=this.pane2menu[_c];
-if(_d){
-_d.destroyRecursive();
-delete this.pane2menu[_c];
-}
-var _e=this.pane2button[_c];
-if(_e){
-_e.destroy();
-delete this.pane2button[_c];
-}
-},onSelectChild:function(_f){
-if(!_f){
+dojo.forEach(this.pane2handles[_b.id],this.disconnect,this);
+delete this.pane2handles[_b.id];
+var _c=this.pane2button[_b.id];
+if(_c){
+this.removeChild(_c);
+delete this.pane2button[_b.id];
+_c.destroy();
+}
+delete _b.controlButton;
+},onSelectChild:function(_d){
+if(!_d){
 return;
 }
 if(this._currentChild){
-var _10=this.pane2button[this._currentChild];
-_10.attr("checked",false);
-_10.focusNode.setAttribute("tabIndex","-1");
-}
-var _11=this.pane2button[_f];
-_11.attr("checked",true);
-this._currentChild=_f;
-_11.focusNode.setAttribute("tabIndex","0");
+var _e=this.pane2button[this._currentChild.id];
+_e.attr("checked",false);
+dijit.setWaiState(_e.focusNode,"selected","false");
+_e.focusNode.setAttribute("tabIndex","-1");
+}
+var _f=this.pane2button[_d.id];
+_f.attr("checked",true);
+dijit.setWaiState(_f.focusNode,"selected","true");
+this._currentChild=_d;
+_f.focusNode.setAttribute("tabIndex","0");
+var _10=dijit.byId(this.containerId);
+dijit.setWaiState(_10.containerNode,"labelledby",_f.id);
+},onButtonClick:function(_11){
 var _12=dijit.byId(this.containerId);
-dijit.setWaiState(_12.containerNode,"labelledby",_11.id);
-},onButtonClick:function(_13){
+_12.selectChild(_11);
+},onCloseButtonClick:function(_13){
 var _14=dijit.byId(this.containerId);
-_14.selectChild(_13);
-},onCloseButtonClick:function(_15){
-var _16=dijit.byId(this.containerId);
-_16.closeChild(_15);
-var b=this.pane2button[this._currentChild];
+_14.closeChild(_13);
+if(this._currentChild){
+var b=this.pane2button[this._currentChild.id];
 if(b){
 dijit.focus(b.focusNode||b.domNode);
 }
-},adjacent:function(_18){
+}
+},adjacent:function(_15){
 if(!this.isLeftToRight()&&(!this.tabPosition||/top|bottom/.test(this.tabPosition))){
-_18=!_18;
+_15=!_15;
 }
-var _19=this.getChildren();
-var _1a=dojo.indexOf(_19,this.pane2button[this._currentChild]);
-var _1b=_18?1:_19.length-1;
-return _19[(_1a+_1b)%_19.length];
+var _16=this.getChildren();
+var _17=dojo.indexOf(_16,this.pane2button[this._currentChild.id]);
+var _18=_15?1:_16.length-1;
+return _16[(_17+_18)%_16.length];
 },onkeypress:function(e){
 if(this.disabled||e.altKey){
 return;
 }
-var _1d=null;
+var _19=null;
 if(e.ctrlKey||!e._djpage){
 var k=dojo.keys;
 switch(e.charOrCode){
 case k.LEFT_ARROW:
 case k.UP_ARROW:
 if(!e._djpage){
-_1d=false;
+_19=false;
 }
 break;
 case k.PAGE_UP:
 if(e.ctrlKey){
-_1d=false;
+_19=false;
 }
 break;
 case k.RIGHT_ARROW:
 case k.DOWN_ARROW:
 if(!e._djpage){
-_1d=true;
+_19=true;
 }
 break;
 case k.PAGE_DOWN:
 if(e.ctrlKey){
-_1d=true;
+_19=true;
 }
 break;
 case k.DELETE:
@@ -156,14 +158,14 @@ dojo.stopEvent(e);
 }
 }
 }
-if(_1d!==null){
-this.adjacent(_1d).onClick();
+if(_19!==null){
+this.adjacent(_19).onClick();
 dojo.stopEvent(e);
 }
 }
-},onContainerKeyPress:function(_1f){
-_1f.e._djpage=_1f.page;
-this.onkeypress(_1f.e);
+},onContainerKeyPress:function(_1a){
+_1a.e._djpage=_1a.page;
+this.onkeypress(_1a.e);
 }});
 dojo.declare("dijit.layout._StackButton",dijit.form.ToggleButton,{tabIndex:"-1",postCreate:function(evt){
 dijit.setWaiRole((this.focusNode||this.domNode),"tab");
diff --git a/dijit/layout/TabContainer.js b/dijit/layout/TabContainer.js
index 7f7164c..030a4ac 100644
--- a/dijit/layout/TabContainer.js
+++ b/dijit/layout/TabContainer.js
@@ -8,56 +8,16 @@
 if(!dojo._hasResource["dijit.layout.TabContainer"]){
 dojo._hasResource["dijit.layout.TabContainer"]=true;
 dojo.provide("dijit.layout.TabContainer");
-dojo.require("dijit.layout.StackContainer");
-dojo.require("dijit._Templated");
+dojo.require("dijit.layout._TabContainerBase");
 dojo.require("dijit.layout.TabController");
-dojo.declare("dijit.layout.TabContainer",[dijit.layout.StackContainer,dijit._Templated],{tabPosition:"top",baseClass:"dijitTabContainer",tabStrip:false,nested:false,templateString:null,templateString:"<div class=\"dijitTabContainer\">\n\t<div dojoAttachPoint=\"tablistNode\"></div>\n\t<div dojoAttachPoint=\"tablistSpacer\" class=\"dijitTabSpacer ${baseClass}-spacer\"></div>\n\t<div class=\"dijitTabPaneWrapper ${baseClass}-container\" dojoAttachPoint=\"containerNode\"></div>\n</div>\n",_co [...]
-this.baseClass+=this.tabPosition.charAt(0).toUpperCase()+this.tabPosition.substr(1).replace(/-.*/,"");
+dojo.require("dijit.layout.ScrollingTabController");
+dojo.declare("dijit.layout.TabContainer",dijit.layout._TabContainerBase,{useMenu:true,useSlider:true,controllerWidget:"",_makeController:function(_1){
+var _2=this.baseClass+"-tabs"+(this.doLayout?"":" dijitTabNoLayout"),_3=dojo.getObject(this.controllerWidget);
+return new _3({id:this.id+"_tablist",tabPosition:this.tabPosition,doLayout:this.doLayout,containerId:this.id,"class":_2,nested:this.nested,useMenu:this.useMenu,useSlider:this.useSlider,tabStripClass:this.tabStrip?this.baseClass+(this.tabStrip?"":"No")+"Strip":null},_1);
+},postMixInProperties:function(){
 this.inherited(arguments);
-},postCreate:function(){
-this.inherited(arguments);
-var _1=dojo.getObject(this._controllerWidget);
-this.tablist=new _1({id:this.id+"_tablist",tabPosition:this.tabPosition,doLayout:this.doLayout,containerId:this.id,"class":this.baseClass+"-tabs"+(this.doLayout?"":" dijitTabNoLayout")},this.tablistNode);
-if(this.tabStrip){
-dojo.addClass(this.tablist.domNode,this.baseClass+"Strip");
-}
-if(!this.doLayout){
-dojo.addClass(this.domNode,"dijitTabContainerNoLayout");
-}
-if(this.nested){
-dojo.addClass(this.domNode,"dijitTabContainerNested");
-dojo.addClass(this.tablist.domNode,"dijitTabContainerTabListNested");
-dojo.addClass(this.tablistSpacer,"dijitTabContainerSpacerNested");
-dojo.addClass(this.containerNode,"dijitTabPaneWrapperNested");
+if(!this.controllerWidget){
+this.controllerWidget=(this.tabPosition=="top"||this.tabPosition=="bottom")&&!this.nested?"dijit.layout.ScrollingTabController":"dijit.layout.TabController";
 }
-},_setupChild:function(_2){
-dojo.addClass(_2.domNode,"dijitTabPane");
-this.inherited(arguments);
-return _2;
-},startup:function(){
-if(this._started){
-return;
-}
-this.tablist.startup();
-this.inherited(arguments);
-},layout:function(){
-if(!this.doLayout){
-return;
-}
-var _3=this.tabPosition.replace(/-h/,"");
-var _4=[{domNode:this.tablist.domNode,layoutAlign:_3},{domNode:this.tablistSpacer,layoutAlign:_3},{domNode:this.containerNode,layoutAlign:"client"}];
-dijit.layout.layoutChildren(this.domNode,this._contentBox,_4);
-this._containerContentBox=dijit.layout.marginBox2contentBox(this.containerNode,_4[2]);
-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);
 }});
 }
diff --git a/dijit/layout/TabController.js b/dijit/layout/TabController.js
index 99ca9b6..119dd35 100644
--- a/dijit/layout/TabController.js
+++ b/dijit/layout/TabController.js
@@ -9,8 +9,10 @@ if(!dojo._hasResource["dijit.layout.TabController"]){
 dojo._hasResource["dijit.layout.TabController"]=true;
 dojo.provide("dijit.layout.TabController");
 dojo.require("dijit.layout.StackController");
+dojo.require("dijit.Menu");
+dojo.require("dijit.MenuItem");
 dojo.requireLocalization("dijit","common",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
-dojo.declare("dijit.layout.TabController",dijit.layout.StackController,{templateString:"<div wairole='tablist' dojoAttachEvent='onkeypress:onkeypress'></div>",tabPosition:"top",doLayout:true,buttonWidget:"dijit.layout._TabButton",_rectifyRtlTabList:function(){
+dojo.declare("dijit.layout.TabController",dijit.layout.StackController,{templateString:"<div wairole='tablist' dojoAttachEvent='onkeypress:onkeypress'></div>",tabPosition:"top",buttonWidget:"dijit.layout._TabButton",_rectifyRtlTabList:function(){
 if(0>=this.tabPosition.indexOf("-h")){
 return;
 }
@@ -26,19 +28,49 @@ for(_2 in this.pane2button){
 this.pane2button[_2].innerDiv.style.width=_1+"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><img cl [...]
-if(this.closeButton){
-dojo.addClass(this.innerDiv,"dijitClosable");
+dojo.declare("dijit.layout._TabButton",dijit.layout._StackButton,{baseClass:"dijitTab",templateString:dojo.cache("dijit.layout","templates/_TabButton.html","<div waiRole=\"presentation\" dojoAttachPoint=\"titleNode\" dojoAttachEvent='onclick:onClick,onmouseenter:_onMouse,onmouseleave:_onMouse'>\n    <div waiRole=\"presentation\" class='dijitTabInnerDiv' dojoAttachPoint='innerDiv'>\n        <div waiRole=\"presentation\" class='dijitTabContent' dojoAttachPoint='tabContent,focusNode'>\n\t   [...]
+if(!this.iconClass){
+this.iconClass="dijitTabButtonIcon";
+}
+},postCreate:function(){
+this.inherited(arguments);
+dojo.setSelectable(this.containerNode,false);
+if(this.iconNode.className=="dijitTabButtonIcon"){
+dojo.style(this.iconNode,"width","1px");
+}
+},startup:function(){
+this.inherited(arguments);
+var n=this.domNode;
+setTimeout(function(){
+n.className=n.className;
+},1);
+},_setCloseButtonAttr:function(_3){
+this.closeButton=_3;
+dojo.toggleClass(this.innerDiv,"dijitClosable",_3);
+this.closeNode.style.display=_3?"":"none";
+if(_3){
 var _4=dojo.i18n.getLocalization("dijit","common");
 if(this.closeNode){
 dojo.attr(this.closeNode,"title",_4.itemClose);
+if(dojo.isIE<8){
 dojo.attr(this.closeIcon,"title",_4.itemClose);
 }
+}
+var _4=dojo.i18n.getLocalization("dijit","common");
+this._closeMenu=new dijit.Menu({id:this.id+"_Menu",targetNodeIds:[this.domNode]});
+this._closeMenu.addChild(new dijit.MenuItem({label:_4.itemClose,onClick:dojo.hitch(this,"onClickCloseButton")}));
 }else{
-this.closeNode.style.display="none";
+if(this._closeMenu){
+this._closeMenu.destroyRecursive();
+delete this._closeMenu;
+}
+}
+},destroy:function(){
+if(this._closeMenu){
+this._closeMenu.destroyRecursive();
+delete this._closeMenu;
 }
 this.inherited(arguments);
-dojo.setSelectable(this.containerNode,false);
 },_onCloseButtonEnter:function(){
 dojo.addClass(this.closeNode,"closeButton-hover");
 },_onCloseButtonLeave:function(){
diff --git a/dijit/layout/_LayoutWidget.js b/dijit/layout/_LayoutWidget.js
index 6578ef0..507c9f5 100644
--- a/dijit/layout/_LayoutWidget.js
+++ b/dijit/layout/_LayoutWidget.js
@@ -14,116 +14,110 @@ dojo.require("dijit._Contained");
 dojo.declare("dijit.layout._LayoutWidget",[dijit._Widget,dijit._Container,dijit._Contained],{baseClass:"dijitLayoutContainer",isLayoutContainer:true,postCreate:function(){
 dojo.addClass(this.domNode,"dijitContainer");
 dojo.addClass(this.domNode,this.baseClass);
+this.inherited(arguments);
 },startup:function(){
 if(this._started){
 return;
 }
-dojo.forEach(this.getChildren(),function(_1){
-_1.startup();
-});
-if(!this.getParent||!this.getParent()){
+this.inherited(arguments);
+var _1=this.getParent&&this.getParent();
+if(!(_1&&_1.isLayoutContainer)){
 this.resize();
-this._viewport=dijit.getViewport();
-this.connect(dojo.global,"onresize",function(){
-var _2=dijit.getViewport();
-if(_2.w!=this._viewport.w||_2.h!=this._viewport.h){
-this._viewport=_2;
+this.connect(dojo.isIE?this.domNode:dojo.global,"onresize",function(){
 this.resize();
-}
 });
 }
-this.inherited(arguments);
-},resize:function(_3,_4){
-var _5=this.domNode;
-if(_3){
-dojo.marginBox(_5,_3);
-if(_3.t){
-_5.style.top=_3.t+"px";
+},resize:function(_2,_3){
+var _4=this.domNode;
+if(_2){
+dojo.marginBox(_4,_2);
+if(_2.t){
+_4.style.top=_2.t+"px";
 }
-if(_3.l){
-_5.style.left=_3.l+"px";
+if(_2.l){
+_4.style.left=_2.l+"px";
 }
 }
-var mb=_4||{};
-dojo.mixin(mb,_3||{});
+var mb=_3||{};
+dojo.mixin(mb,_2||{});
 if(!("h" in mb)||!("w" in mb)){
-mb=dojo.mixin(dojo.marginBox(_5),mb);
+mb=dojo.mixin(dojo.marginBox(_4),mb);
 }
-var cs=dojo.getComputedStyle(_5);
-var me=dojo._getMarginExtents(_5,cs);
-var be=dojo._getBorderExtents(_5,cs);
+var cs=dojo.getComputedStyle(_4);
+var me=dojo._getMarginExtents(_4,cs);
+var be=dojo._getBorderExtents(_4,cs);
 var bb=(this._borderBox={w:mb.w-(me.w+be.w),h:mb.h-(me.h+be.h)});
-var pe=dojo._getPadExtents(_5,cs);
-this._contentBox={l:dojo._toPixelValue(_5,cs.paddingLeft),t:dojo._toPixelValue(_5,cs.paddingTop),w:bb.w-pe.w,h:bb.h-pe.h};
+var pe=dojo._getPadExtents(_4,cs);
+this._contentBox={l:dojo._toPixelValue(_4,cs.paddingLeft),t:dojo._toPixelValue(_4,cs.paddingTop),w:bb.w-pe.w,h:bb.h-pe.h};
 this.layout();
 },layout:function(){
-},_setupChild:function(_c){
-dojo.addClass(_c.domNode,this.baseClass+"-child");
-if(_c.baseClass){
-dojo.addClass(_c.domNode,this.baseClass+"-"+_c.baseClass);
+},_setupChild:function(_5){
+dojo.addClass(_5.domNode,this.baseClass+"-child");
+if(_5.baseClass){
+dojo.addClass(_5.domNode,this.baseClass+"-"+_5.baseClass);
 }
-},addChild:function(_d,_e){
+},addChild:function(_6,_7){
 this.inherited(arguments);
 if(this._started){
-this._setupChild(_d);
+this._setupChild(_6);
 }
-},removeChild:function(_f){
-dojo.removeClass(_f.domNode,this.baseClass+"-child");
-if(_f.baseClass){
-dojo.removeClass(_f.domNode,this.baseClass+"-"+_f.baseClass);
+},removeChild:function(_8){
+dojo.removeClass(_8.domNode,this.baseClass+"-child");
+if(_8.baseClass){
+dojo.removeClass(_8.domNode,this.baseClass+"-"+_8.baseClass);
 }
 this.inherited(arguments);
 }});
-dijit.layout.marginBox2contentBox=function(_10,mb){
-var cs=dojo.getComputedStyle(_10);
-var me=dojo._getMarginExtents(_10,cs);
-var pb=dojo._getPadBorderExtents(_10,cs);
-return {l:dojo._toPixelValue(_10,cs.paddingLeft),t:dojo._toPixelValue(_10,cs.paddingTop),w:mb.w-(me.w+pb.w),h:mb.h-(me.h+pb.h)};
+dijit.layout.marginBox2contentBox=function(_9,mb){
+var cs=dojo.getComputedStyle(_9);
+var me=dojo._getMarginExtents(_9,cs);
+var pb=dojo._getPadBorderExtents(_9,cs);
+return {l:dojo._toPixelValue(_9,cs.paddingLeft),t:dojo._toPixelValue(_9,cs.paddingTop),w:mb.w-(me.w+pb.w),h:mb.h-(me.h+pb.h)};
 };
 (function(){
-var _15=function(_16){
-return _16.substring(0,1).toUpperCase()+_16.substring(1);
+var _a=function(_b){
+return _b.substring(0,1).toUpperCase()+_b.substring(1);
 };
-var _17=function(_18,dim){
-_18.resize?_18.resize(dim):dojo.marginBox(_18.domNode,dim);
-dojo.mixin(_18,dojo.marginBox(_18.domNode));
-dojo.mixin(_18,dim);
+var _c=function(_d,_e){
+_d.resize?_d.resize(_e):dojo.marginBox(_d.domNode,_e);
+dojo.mixin(_d,dojo.marginBox(_d.domNode));
+dojo.mixin(_d,_e);
 };
-dijit.layout.layoutChildren=function(_1a,dim,_1c){
+dijit.layout.layoutChildren=function(_f,dim,_10){
 dim=dojo.mixin({},dim);
-dojo.addClass(_1a,"dijitLayoutContainer");
-_1c=dojo.filter(_1c,function(_1d){
-return _1d.layoutAlign!="client";
-}).concat(dojo.filter(_1c,function(_1e){
-return _1e.layoutAlign=="client";
+dojo.addClass(_f,"dijitLayoutContainer");
+_10=dojo.filter(_10,function(_11){
+return _11.layoutAlign!="client";
+}).concat(dojo.filter(_10,function(_12){
+return _12.layoutAlign=="client";
 }));
-dojo.forEach(_1c,function(_1f){
-var elm=_1f.domNode,pos=_1f.layoutAlign;
-var _22=elm.style;
-_22.left=dim.l+"px";
-_22.top=dim.t+"px";
-_22.bottom=_22.right="auto";
-dojo.addClass(elm,"dijitAlign"+_15(pos));
+dojo.forEach(_10,function(_13){
+var elm=_13.domNode,pos=_13.layoutAlign;
+var _14=elm.style;
+_14.left=dim.l+"px";
+_14.top=dim.t+"px";
+_14.bottom=_14.right="auto";
+dojo.addClass(elm,"dijitAlign"+_a(pos));
 if(pos=="top"||pos=="bottom"){
-_17(_1f,{w:dim.w});
-dim.h-=_1f.h;
+_c(_13,{w:dim.w});
+dim.h-=_13.h;
 if(pos=="top"){
-dim.t+=_1f.h;
+dim.t+=_13.h;
 }else{
-_22.top=dim.t+dim.h+"px";
+_14.top=dim.t+dim.h+"px";
 }
 }else{
 if(pos=="left"||pos=="right"){
-_17(_1f,{h:dim.h});
-dim.w-=_1f.w;
+_c(_13,{h:dim.h});
+dim.w-=_13.w;
 if(pos=="left"){
-dim.l+=_1f.w;
+dim.l+=_13.w;
 }else{
-_22.left=dim.l+dim.w+"px";
+_14.left=dim.l+dim.w+"px";
 }
 }else{
 if(pos=="client"){
-_17(_1f,dim);
+_c(_13,dim);
 }
 }
 }
diff --git a/dijit/layout/_TabContainerBase.js b/dijit/layout/_TabContainerBase.js
new file mode 100644
index 0000000..a319ff5
--- /dev/null
+++ b/dijit/layout/_TabContainerBase.js
@@ -0,0 +1,67 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dijit.layout._TabContainerBase"]){
+dojo._hasResource["dijit.layout._TabContainerBase"]=true;
+dojo.provide("dijit.layout._TabContainerBase");
+dojo.require("dijit.layout.StackContainer");
+dojo.require("dijit._Templated");
+dojo.declare("dijit.layout._TabContainerBase",[dijit.layout.StackContainer,dijit._Templated],{tabPosition:"top",baseClass:"dijitTabContainer",tabStrip:false,nested:false,templateString:dojo.cache("dijit.layout","templates/TabContainer.html","<div class=\"dijitTabContainer\">\n\t<div class=\"dijitTabListWrapper\" dojoAttachPoint=\"tablistNode\"></div>\n\t<div dojoAttachPoint=\"tablistSpacer\" class=\"dijitTabSpacer ${baseClass}-spacer\"></div>\n\t<div class=\"dijitTabPaneWrapper ${baseCla [...]
+this.baseClass+=this.tabPosition.charAt(0).toUpperCase()+this.tabPosition.substr(1).replace(/-.*/,"");
+this.srcNodeRef&&dojo.style(this.srcNodeRef,"visibility","hidden");
+this.inherited(arguments);
+},postCreate:function(){
+this.inherited(arguments);
+this.tablist=this._makeController(this.tablistNode);
+if(!this.doLayout){
+dojo.addClass(this.domNode,"dijitTabContainerNoLayout");
+}
+if(this.nested){
+dojo.addClass(this.domNode,"dijitTabContainerNested");
+dojo.addClass(this.tablist.containerNode,"dijitTabContainerTabListNested");
+dojo.addClass(this.tablistSpacer,"dijitTabContainerSpacerNested");
+dojo.addClass(this.containerNode,"dijitTabPaneWrapperNested");
+}else{
+dojo.addClass(this.domNode,"tabStrip-"+(this.tabStrip?"enabled":"disabled"));
+}
+},_setupChild:function(_1){
+dojo.addClass(_1.domNode,"dijitTabPane");
+this.inherited(arguments);
+},startup:function(){
+if(this._started){
+return;
+}
+this.tablist.startup();
+this.inherited(arguments);
+},layout:function(){
+if(!this._contentBox||typeof (this._contentBox.l)=="undefined"){
+return;
+}
+if(this.doLayout){
+var _2=this.tabPosition.replace(/-h/,"");
+this.tablist.layoutAlign=_2;
+var _3=[this.tablist,{domNode:this.tablistSpacer,layoutAlign:_2},{domNode:this.containerNode,layoutAlign:"client"}];
+dijit.layout.layoutChildren(this.domNode,this._contentBox,_3);
+this._containerContentBox=dijit.layout.marginBox2contentBox(this.containerNode,_3[2]);
+if(this.selectedChildWidget){
+if(this.selectedChildWidget.resize){
+this.selectedChildWidget.resize(this._containerContentBox);
+}
+}
+}else{
+if(this.tablist.resize){
+this.tablist.resize({w:dojo.contentBox(this.domNode).w});
+}
+this.selectedChildWidget.resize();
+}
+},destroy:function(){
+if(this.tablist){
+this.tablist.destroy();
+}
+this.inherited(arguments);
+}});
+}
diff --git a/dijit/nls/dijit-all_ROOT.js b/dijit/nls/dijit-all_ROOT.js
index bcd917c..68fec9e 100644
--- a/dijit/nls/dijit-all_ROOT.js
+++ b/dijit/nls/dijit-all_ROOT.js
@@ -1 +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","ivor [...]
+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","ivor [...]
diff --git a/dijit/nls/dijit-all_ar.js b/dijit/nls/dijit-all_ar.js
index 011eb18..e09c642 100644
--- a/dijit/nls/dijit-all_ar.js
+++ b/dijit/nls/dijit-all_ar.js
@@ -1 +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":"برتقالي وردي شاحب","dar [...]
+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":"برتقالي وردي شاحب","dar [...]
diff --git a/dijit/nls/dijit-all_ca.js b/dijit/nls/dijit-all_ca.js
index f86c2ce..43c19b4 100644
--- a/dijit/nls/dijit-all_ca.js
+++ b/dijit/nls/dijit-all_ca.js
@@ -1 +1 @@
-dojo.provide("dijit.nls.dijit-all_ca");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.ca");dojo.nls.colors.ca={"lightsteelblue":"blau acer clar","orangered":"taronja vermellós","midnightblue":"blau mitjanit","cadetblue":"blau marí","seashell":"petxina marina","slategrey":"gris pissarra","coral":"corall","darkturquoise":"turquesa fosc","antiquewhite":"blanc antic","mediumspringgreen":"verd primavera mitjà","salmon":"salmó","darkgrey":"gris fosc", [...]
+dojo.provide("dijit.nls.dijit-all_ca");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.ca");dojo.nls.colors.ca={"lightsteelblue":"blau acer clar","orangered":"taronja vermellós","midnightblue":"blau mitjanit","cadetblue":"blau marí","seashell":"petxina marina","slategrey":"gris pissarra","coral":"corall","darkturquoise":"turquesa fosc","antiquewhite":"blanc antic","mediumspringgreen":"verd primavera mitjà","salmon":"salmó","darkgrey":"gris fosc", [...]
diff --git a/dijit/nls/dijit-all_cs.js b/dijit/nls/dijit-all_cs.js
index 99e49f2..1974b82 100644
--- a/dijit/nls/dijit-all_cs.js
+++ b/dijit/nls/dijit-all_cs.js
@@ -1 +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á","darkgre [...]
+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á","darkgre [...]
diff --git a/dijit/nls/dijit-all_da.js b/dijit/nls/dijit-all_da.js
index 9060c8a..d0e570e 100644
--- a/dijit/nls/dijit-all_da.js
+++ b/dijit/nls/dijit-all_da.js
@@ -1 +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","gr [...]
+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","gr [...]
diff --git a/dijit/nls/dijit-all_de-de.js b/dijit/nls/dijit-all_de-de.js
index 997f731..4f40ebf 100644
--- a/dijit/nls/dijit-all_de-de.js
+++ b/dijit/nls/dijit-all_de-de.js
@@ -1 +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 [...]
+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 [...]
diff --git a/dijit/nls/dijit-all_de.js b/dijit/nls/dijit-all_de.js
index 02b6ac7..a8fdf33 100644
--- a/dijit/nls/dijit-all_de.js
+++ b/dijit/nls/dijit-all_de.js
@@ -1 +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" [...]
+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" [...]
diff --git a/dijit/nls/dijit-all_el.js b/dijit/nls/dijit-all_el.js
index b302916..9ecdc94 100644
--- a/dijit/nls/dijit-all_el.js
+++ b/dijit/nls/dijit-all_el.js
@@ -1 +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":"σομόν" [...]
+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":"σομόν" [...]
diff --git a/dijit/nls/dijit-all_en-gb.js b/dijit/nls/dijit-all_en-gb.js
index 1a0f9d4..2d84e28 100644
--- a/dijit/nls/dijit-all_en-gb.js
+++ b/dijit/nls/dijit-all_en-gb.js
@@ -1 +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","i [...]
+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","i [...]
diff --git a/dijit/nls/dijit-all_en-us.js b/dijit/nls/dijit-all_en-us.js
index ed5ffc9..ace1591 100644
--- a/dijit/nls/dijit-all_en-us.js
+++ b/dijit/nls/dijit-all_en-us.js
@@ -1 +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","i [...]
+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","i [...]
diff --git a/dijit/nls/dijit-all_en.js b/dijit/nls/dijit-all_en.js
index cc66d39..c4e2f4d 100644
--- a/dijit/nls/dijit-all_en.js
+++ b/dijit/nls/dijit-all_en.js
@@ -1 +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":"iv [...]
+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":"iv [...]
diff --git a/dijit/nls/dijit-all_es-es.js b/dijit/nls/dijit-all_es-es.js
index 8a4bb80..722228a 100644
--- a/dijit/nls/dijit-all_es-es.js
+++ b/dijit/nls/dijit-all_es-es.js
@@ -1 +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","darkg [...]
+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","darkg [...]
diff --git a/dijit/nls/dijit-all_es.js b/dijit/nls/dijit-all_es.js
index 53049f1..bc5064a 100644
--- a/dijit/nls/dijit-all_es.js
+++ b/dijit/nls/dijit-all_es.js
@@ -1 +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":"gri [...]
+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":"gri [...]
diff --git a/dijit/nls/dijit-all_fi-fi.js b/dijit/nls/dijit-all_fi-fi.js
index 55e86a1..17a0507 100644
--- a/dijit/nls/dijit-all_fi-fi.js
+++ b/dijit/nls/dijit-all_fi-fi.js
@@ -1 +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","i [...]
+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","i [...]
diff --git a/dijit/nls/dijit-all_fi.js b/dijit/nls/dijit-all_fi.js
index 06c13c6..c9b83e8 100644
--- a/dijit/nls/dijit-all_fi.js
+++ b/dijit/nls/dijit-all_fi.js
@@ -1 +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":"iv [...]
+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":"iv [...]
diff --git a/dijit/nls/dijit-all_fr-fr.js b/dijit/nls/dijit-all_fr-fr.js
index c268211..f0b195b 100644
--- a/dijit/nls/dijit-all_fr-fr.js
+++ b/dijit/nls/dijit-all_fr-fr.js
@@ -1 +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 f [...]
+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 f [...]
diff --git a/dijit/nls/dijit-all_fr.js b/dijit/nls/dijit-all_fr.js
index 9eff710..0156343 100644
--- a/dijit/nls/dijit-all_fr.js
+++ b/dijit/nls/dijit-all_fr.js
@@ -1 +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é","iv [...]
+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é","iv [...]
diff --git a/dijit/nls/dijit-all_he-il.js b/dijit/nls/dijit-all_he-il.js
index e23508c..19f78a6 100644
--- a/dijit/nls/dijit-all_he-il.js
+++ b/dijit/nls/dijit-all_he-il.js
@@ -1 +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":"כחול כהה","cadetblue":"כחול ים","seashell":"צדף","slategrey":"אפור צפחה","coral":"אלמוג","darkturquoise":"טורקיז כהה","antiquewhite":"לבן עתיק","mediumspringgreen":"ירוק אביב בינוני","salmon":"סלמון","darkgrey":"אפור כהה","ivory":"שנהב","greenyellow":"ירו [...]
+dojo.provide("dijit.nls.dijit-all_he-il");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.he_il");dojo.nls.colors.he_il={"lightsteelblue":"כחול פלדה בהיר","orangered":"כתום אדום","midnightblue":"כחול כהה","cadetblue":"כחול ים","seashell":"צדף","slategrey":"אפור צפחה","coral":"אלמוג","darkturquoise":"טורקיז כהה","antiquewhite":"לבן עתיק","mediumspringgreen":"ירוק אביב בינוני","salmon":"סלמון","darkgrey":"אפור כהה","ivory":"שנהב","greenyellow":"ירו [...]
diff --git a/dijit/nls/dijit-all_he.js b/dijit/nls/dijit-all_he.js
index 6b7eeb4..b3505a4 100644
--- a/dijit/nls/dijit-all_he.js
+++ b/dijit/nls/dijit-all_he.js
@@ -1 +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":"כחול כהה","cadetblue":"כחול ים","seashell":"צדף","slategrey":"אפור צפחה","coral":"אלמוג","darkturquoise":"טורקיז כהה","antiquewhite":"לבן עתיק","mediumspringgreen":"ירוק אביב בינוני","salmon":"סלמון","darkgrey":"אפור כהה","ivory":"שנהב","greenyellow":"ירוק-צהוב"," [...]
+dojo.provide("dijit.nls.dijit-all_he");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.he");dojo.nls.colors.he={"lightsteelblue":"כחול פלדה בהיר","orangered":"כתום אדום","midnightblue":"כחול כהה","cadetblue":"כחול ים","seashell":"צדף","slategrey":"אפור צפחה","coral":"אלמוג","darkturquoise":"טורקיז כהה","antiquewhite":"לבן עתיק","mediumspringgreen":"ירוק אביב בינוני","salmon":"סלמון","darkgrey":"אפור כהה","ivory":"שנהב","greenyellow":"ירוק-צהוב"," [...]
diff --git a/dijit/nls/dijit-all_hu.js b/dijit/nls/dijit-all_hu.js
index 7af646e..f91f8f1 100644
--- a/dijit/nls/dijit-all_hu.js
+++ b/dijit/nls/dijit-all_hu.js
@@ -1 +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ántcs [...]
+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ántcs [...]
diff --git a/dijit/nls/dijit-all_it-it.js b/dijit/nls/dijit-all_it-it.js
index f93c817..bf110ce 100644
--- a/dijit/nls/dijit-all_it-it.js
+++ b/dijit/nls/dijit-all_it-it.js
@@ -1 +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","darkg [...]
+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","darkg [...]
diff --git a/dijit/nls/dijit-all_it.js b/dijit/nls/dijit-all_it.js
index 52dfe92..4f4a4b5 100644
--- a/dijit/nls/dijit-all_it.js
+++ b/dijit/nls/dijit-all_it.js
@@ -1 +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":"gri [...]
+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":"gri [...]
diff --git a/dijit/nls/dijit-all_ja-jp.js b/dijit/nls/dijit-all_ja-jp.js
index 1d8e20b..2334ba2 100644
--- a/dijit/nls/dijit-all_ja-jp.js
+++ b/dijit/nls/dijit-all_ja-jp.js
@@ -1 +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":"緑黄色","m [...]
+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":"緑黄色","m [...]
diff --git a/dijit/nls/dijit-all_ja.js b/dijit/nls/dijit-all_ja.js
index b488528..86790b0 100644
--- a/dijit/nls/dijit-all_ja.js
+++ b/dijit/nls/dijit-all_ja.js
@@ -1 +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" [...]
+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" [...]
diff --git a/dijit/nls/dijit-all_ko-kr.js b/dijit/nls/dijit-all_ko-kr.js
index bb3ac7f..6e3df85 100644
--- a/dijit/nls/dijit-all_ko-kr.js
+++ b/dijit/nls/dijit-all_ko-kr.js
@@ -1 +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)","mediumspringgre [...]
+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)","mediumspringgre [...]
diff --git a/dijit/nls/dijit-all_ko.js b/dijit/nls/dijit-all_ko.js
index 7a3a0d4..d892277 100644
--- a/dijit/nls/dijit-all_ko.js
+++ b/dijit/nls/dijit-all_ko.js
@@ -1 +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":"미디엄  [...]
+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":"미디엄  [...]
diff --git a/dijit/nls/dijit-all_nl-nl.js b/dijit/nls/dijit-all_nl-nl.js
index 15b7518..2c3d26b 100644
--- a/dijit/nls/dijit-all_nl-nl.js
+++ b/dijit/nls/dijit-all_nl-nl.js
@@ -1 +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": [...]
+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": [...]
diff --git a/dijit/nls/dijit-all_nl.js b/dijit/nls/dijit-all_nl.js
index abb7bed..2234289 100644
--- a/dijit/nls/dijit-all_nl.js
+++ b/dijit/nls/dijit-all_nl.js
@@ -1 +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 [...]
+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 [...]
diff --git a/dijit/nls/dijit-all_no.js b/dijit/nls/dijit-all_no.js
index 5dc6643..8f973d6 100644
--- a/dijit/nls/dijit-all_no.js
+++ b/dijit/nls/dijit-all_no.js
@@ -1 +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":"iv [...]
+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":"iv [...]
diff --git a/dijit/nls/dijit-all_pl.js b/dijit/nls/dijit-all_pl.js
index 2a632fb..4628124 100644
--- a/dijit/nls/dijit-all_pl.js
+++ b/dijit/nls/dijit-all_pl.js
@@ -1 +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", [...]
+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", [...]
diff --git a/dijit/nls/dijit-all_pt-br.js b/dijit/nls/dijit-all_pt-br.js
index ae931a5..fda85fd 100644
--- a/dijit/nls/dijit-all_pt-br.js
+++ b/dijit/nls/dijit-all_pt-br.js
@@ -1 +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-aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadet","seashell":"seashell","slategrey":"cinza-ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde-primavera médio","salmon":"salmão","darkgrey" [...]
+dojo.provide("dijit.nls.dijit-all_pt-br");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.pt_br");dojo.nls.colors.pt_br={"lightsteelblue":"azul-aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadet","seashell":"seashell","slategrey":"cinza-ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde-primavera médio","salmon":"salmão","darkgrey" [...]
diff --git a/dijit/nls/dijit-all_pt-pt.js b/dijit/nls/dijit-all_pt-pt.js
index 33c98ed..231f26a 100644
--- a/dijit/nls/dijit-all_pt-pt.js
+++ b/dijit/nls/dijit-all_pt-pt.js
@@ -1 +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","darkgre [...]
+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","darkgre [...]
diff --git a/dijit/nls/dijit-all_pt.js b/dijit/nls/dijit-all_pt.js
index e93d064..77092b4 100644
--- a/dijit/nls/dijit-all_pt.js
+++ b/dijit/nls/dijit-all_pt.js
@@ -1 +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-aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadet","seashell":"seashell","slategrey":"cinza-ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde-primavera médio","salmon":"salmão","darkgrey":"cinza e [...]
+dojo.provide("dijit.nls.dijit-all_pt");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.pt");dojo.nls.colors.pt={"lightsteelblue":"azul-aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadet","seashell":"seashell","slategrey":"cinza-ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde-primavera médio","salmon":"salmão","darkgrey":"cinza e [...]
diff --git a/dijit/nls/dijit-all_ru.js b/dijit/nls/dijit-all_ru.js
index 1c7b65e..26b4123 100644
--- a/dijit/nls/dijit-all_ru.js
+++ b/dijit/nls/dijit-all_ru.js
@@ -1 +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":"лососевы [...]
+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":"лососевы [...]
diff --git a/dijit/nls/dijit-all_sk.js b/dijit/nls/dijit-all_sk.js
index 2c6cd42..2539608 100644
--- a/dijit/nls/dijit-all_sk.js
+++ b/dijit/nls/dijit-all_sk.js
@@ -1 +1 @@
-dojo.provide("dijit.nls.dijit-all_sk");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.sk");dojo.nls.colors.sk={"lightsteelblue":"oceľovo modrá svetlá","orangered":"oranžovo červená","midnightblue":"nočná modrá","cadetblue":"sivomodrá","seashell":"lastúrová","slategrey":"bridlicová sivá","coral":"koralová","darkturquoise":"tyrkysová tmavá","antiquewhite":"antická biela","mediumspringgreen":"jarná zelená stredná","salmon":"lososovo ružová","darkgr [...]
+dojo.provide("dijit.nls.dijit-all_sk");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.sk");dojo.nls.colors.sk={"lightsteelblue":"oceľovo modrá svetlá","orangered":"oranžovo červená","midnightblue":"nočná modrá","cadetblue":"sivomodrá","seashell":"lastúrová","slategrey":"bridlicová sivá","coral":"koralová","darkturquoise":"tyrkysová tmavá","antiquewhite":"antická biela","mediumspringgreen":"jarná zelená stredná","salmon":"lososovo ružová","darkgr [...]
diff --git a/dijit/nls/dijit-all_sl.js b/dijit/nls/dijit-all_sl.js
index 8814742..9169d1b 100644
--- a/dijit/nls/dijit-all_sl.js
+++ b/dijit/nls/dijit-all_sl.js
@@ -1 +1 @@
-dojo.provide("dijit.nls.dijit-all_sl");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.sl");dojo.nls.colors.sl={"lightsteelblue":"svetlo jeklena modra","orangered":"oranžno-rdeča","midnightblue":"polnočno modra","cadetblue":"zelenkasto modra","seashell":"morska školjka","slategrey":"skrilasto siva","coral":"koralna","darkturquoise":"temno turkizna","antiquewhite":"antično bela","mediumspringgreen":"srednje pomladno zelena","salmon":"lososova","da [...]
+dojo.provide("dijit.nls.dijit-all_sl");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.sl");dojo.nls.colors.sl={"lightsteelblue":"svetlo jeklena modra","orangered":"oranžno-rdeča","midnightblue":"polnočno modra","cadetblue":"zelenkasto modra","seashell":"morska školjka","slategrey":"skrilasto siva","coral":"koralna","darkturquoise":"temno turkizna","antiquewhite":"antično bela","mediumspringgreen":"srednje pomladno zelena","salmon":"lososova","da [...]
diff --git a/dijit/nls/dijit-all_sv.js b/dijit/nls/dijit-all_sv.js
index e058f37..6c81e26 100644
--- a/dijit/nls/dijit-all_sv.js
+++ b/dijit/nls/dijit-all_sv.js
@@ -1 +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":"mellanvårgrönt","salmon":"laxfärgat","darkgrey":"mörkgrått","ivory":"elfenbe [...]
+dojo.provide("dijit.nls.dijit-all_sv");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.sv");dojo.nls.colors.sv={"lightsteelblue":"ljust stålblått","orangered":"orangerött","midnightblue":"midnattsblått","cadetblue":"kadettblått","seashell":"snäckskal","slategrey":"skiffergrått","coral":"korall","darkturquoise":"mörkturkost","antiquewhite":"antikvitt","mediumspringgreen":"mellanvårgrönt","salmon":"laxfärgat","darkgrey":"mörkgrått","ivory":"elfenbe [...]
diff --git a/dijit/nls/dijit-all_th.js b/dijit/nls/dijit-all_th.js
index d31e754..594ebdd 100644
--- a/dijit/nls/dijit-all_th.js
+++ b/dijit/nls/dijit-all_th.js
@@ -1 +1 @@
-dojo.provide("dijit.nls.dijit-all_th");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.th");dojo.nls.colors.th={"lightsteelblue":"light steel blue","orangered":"ส้มแกมแดง","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"เทาเข้ม","ivory":"งาช้า [...]
+dojo.provide("dijit.nls.dijit-all_th");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.th");dojo.nls.colors.th={"lightsteelblue":"light steel blue","orangered":"ส้มแกมแดง","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"เทาเข้ม","ivory":"งาช้า [...]
diff --git a/dijit/nls/dijit-all_tr.js b/dijit/nls/dijit-all_tr.js
index 2b9594a..8cd5efe 100644
--- a/dijit/nls/dijit-all_tr.js
+++ b/dijit/nls/dijit-all_tr.js
@@ -1 +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","iv [...]
+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","iv [...]
diff --git a/dijit/nls/dijit-all_xx.js b/dijit/nls/dijit-all_xx.js
index 7b47094..549bf3e 100644
--- a/dijit/nls/dijit-all_xx.js
+++ b/dijit/nls/dijit-all_xx.js
@@ -1 +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":"iv [...]
+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":"iv [...]
diff --git a/dijit/nls/dijit-all_zh-cn.js b/dijit/nls/dijit-all_zh-cn.js
index a127715..88cdb0f 100644
--- a/dijit/nls/dijit-all_zh-cn.js
+++ b/dijit/nls/dijit-all_zh-cn.js
@@ -1 +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": [...]
+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": [...]
diff --git a/dijit/nls/dijit-all_zh-tw.js b/dijit/nls/dijit-all_zh-tw.js
index 4a7a978..b2d5168 100644
--- a/dijit/nls/dijit-all_zh-tw.js
+++ b/dijit/nls/dijit-all_zh-tw.js
@@ -1 +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" [...]
+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" [...]
diff --git a/dijit/nls/dijit-all_zh.js b/dijit/nls/dijit-all_zh.js
index 86367af..2bd4d39 100644
--- a/dijit/nls/dijit-all_zh.js
+++ b/dijit/nls/dijit-all_zh.js
@@ -1 +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":"暗灰色","or [...]
+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":"暗灰色","or [...]
diff --git a/dijit/robot.js b/dijit/robot.js
index bdcd59d..82dcfed 100644
--- a/dijit/robot.js
+++ b/dijit/robot.js
@@ -9,11 +9,56 @@ if(!dojo._hasResource["dijit.robot"]){
 dojo._hasResource["dijit.robot"]=true;
 dojo.provide("dijit.robot");
 dojo.require("dojo.robot");
+dojo.provide("dijit._base.place");
 dojo.require("dijit._base.scroll");
-dojo.mixin(doh.robot,{_scrollIntoView:function(_1){
-if(typeof _1=="function"){
-_1=_1();
+dojo.require("dijit._base.window");
+dojo.mixin(doh.robot,{_position:function(n){
+var d=dojo,p=null,M=Math.max,m=Math.min;
+d.forEach(doh.robot._getWindowChain(n),function(w){
+d.withGlobal(w,function(){
+var p2=d.position(n,false),b=d._getPadBorderExtents(n);
+if(!p){
+p=p2;
+}else{
+var _1;
+d.withGlobal(n.contentWindow,function(){
+_1=dijit.getViewport();
+});
+p2.r=p2.x+_1.w;
+p2.b=p2.y+_1.h;
+p={x:M(p.x+p2.x,p2.x)+b.l,y:M(p.y+p2.y,p2.y)+b.t,r:m(p.x+p2.x+p.w,p2.r)+b.l,b:m(p.y+p2.y+p.h,p2.b)+b.t};
+p.w=p.r-p.x;
+p.h=p.b-p.y;
 }
-dijit.scrollIntoView(_1);
+n=w.frameElement;
+});
+});
+return p;
+},_scrollIntoView:function(n){
+var d=dojo,dr=doh.robot,p=null;
+d.forEach(dr._getWindowChain(n),function(w){
+d.withGlobal(w,function(){
+var p2=d.position(n,false),b=d._getPadBorderExtents(n),_2=null;
+if(!p){
+p=p2;
+}else{
+_2=p;
+p={x:p.x+p2.x+b.l,y:p.y+p2.y+b.t,w:p.w,h:p.h};
+}
+dijit.scrollIntoView(n,p);
+p2=d.position(n,false);
+if(!_2){
+p=p2;
+}else{
+p={x:_2.x+p2.x+b.l,y:_2.y+p2.y+b.t,w:p.w,h:p.h};
+}
+n=w.frameElement;
+});
+});
+},_getWindowChain:function(n){
+var cW=dijit.getDocumentWindow(n.ownerDocument);
+var _3=[cW];
+var f=cW.frameElement;
+return (cW==dojo.global||f==null)?_3:_3.concat(doh.robot._getWindowChain(f));
 }});
 }
diff --git a/dijit/themes/dijit.css b/dijit/themes/dijit.css
index ad9a984..df8b8cd 100644
--- a/dijit/themes/dijit.css
+++ b/dijit/themes/dijit.css
@@ -10,7 +10,6 @@
 }
 .dijitInline {
 	
-	display:-moz-inline-box;		
 	display:inline-block;			
 	#zoom: 1; 
 	#display:inline; 
@@ -37,7 +36,6 @@
 }
 .dijitInlineTable {
 	
-	display: -moz-inline-stack;	
 	display:inline-table;
 	display:inline-block;		
 	#zoom: 1; 
@@ -118,8 +116,15 @@
 	display: inline !important; 
 	cursor: pointer;
 }
-.dijit_a11y .dijitCalendarSelectedDate {
-	text-decoration:overline !important;
+.dijit_a11y .dijitCalendarDateLabel {
+	padding: 1px;
+}
+.dijit_a11y .dijitCalendarSelectedDate .dijitCalendarDateLabel {
+	border: solid 1px black;
+	padding: 0px;
+}
+.dijit_a11y .dijitCalendarDateTemplate {
+	padding-bottom: 0.1em !important;	
 }
 .dijit_a11y .dijit * {
 	background:white !important;
@@ -130,6 +135,10 @@
 	border-style: outset!important;
 	border-width: medium!important;
 }
+.dijit_a11y .dijitComboBoxReadOnly .dijitInputField,
+.dijit_a11y .dijitComboBoxReadOnly .dijitButtonNode,
+.dijit_a11y .dijitSpinnerReadOnly .dijitButtonNode,
+.dijit_a11y .dijitSpinnerReadOnly .dijitInputField,
 .dijit_a11y .dijitButtonDisabled .dijitButtonNode,
 .dijit_a11y .dijitDropDownButtonDisabled .dijitButtonNode,
 .dijit_a11y .dijitComboButtonDisabled .dijitButtonNode,
@@ -142,10 +151,6 @@
 	border-color: #999 !important;
 	color:#999 !important;
 }
-.dj_ff2 .dijit_a11y .dijitComboButton .dijitButtonContentsFocused,
-.dj_ff2 .dijit_a11y .dijitComboButton .dijitDownArrowButtonFocused {
-	border: 1px dotted black !important;
-}
 .dijitButtonNode * {
 	vertical-align: middle;
 }
@@ -163,7 +168,6 @@
 .dijit_a11y .dijitToggleButtonChecked .dijitToggleButtonIconChar {
 	display: inline !important;
 }
-	
 .dijitLeft {
 	
 	background-position:left top;
@@ -180,12 +184,14 @@
 	background-position:right top;
 	background-repeat:no-repeat;
 }
+.dijitToggleButton,
 .dijitButton,
 .dijitDropDownButton,
 .dijitComboButton {
 	
 	margin: 0.2em;
 }
+.dijitToolbar .dijitToggleButton,
 .dijitToolbar .dijitButton,
 .dijitToolbar .dijitDropDownButton,
 .dijitToolbar .dijitComboButton {
@@ -222,7 +228,7 @@
 }
 .dijitButtonNode, .dijitButtonNode * {
 	cursor: pointer;
-} 
+}
 .dijitReadOnly *,
 .dijitDisabled *,
 .dijitReadOnly,
@@ -234,10 +240,10 @@
 	
 	zoom: 1;
 }
-.dj_ie .dijitButtonNode button { 
-	 
+.dj_ie .dijitButtonNode button {
+	
 	overflow: visible;
-} 
+}
 .dijitArrowButton {
 	
 	
@@ -297,7 +303,7 @@ table .dijitComboButton .dijitButtonNode {
 	#overflow: hidden; 
 	width: 15em;	
 	vertical-align: middle;
-	#vertical-align: auto;	
+	#vertical-align: auto;
 }
 .dijitTimeTextBox {
 	width: 8em;
@@ -314,17 +320,13 @@ table .dijitComboButton .dijitButtonNode {
 	
 	outline: auto 5px -webkit-focus-ring-color;
 }
-.dijitTextAreaFocused div {
-	
-	outline: none !important;
-}
 .dijitTextBox INPUT,
 .dijitComboBox INPUT,
 .dijitSpinner INPUT {
 	border-left: solid black 1px;	
 	display:inline;
 	position:static !important;
-	border:0 !important;	
+	border:0 !important;
 	margin:0 !important;
 	vertical-align:top !important;
 	background-color:transparent !important;
@@ -616,6 +618,10 @@ body .dijitAlignClient { position: absolute; }
 	display: block;
 	overflow: auto;	
 }
+.dijitContentPaneSingleChild {
+	
+	overflow: hidden;
+}
 .dijitTitlePane {
 	display: block;
 	overflow: hidden;
@@ -665,7 +671,7 @@ img.dijitColorPaletteUnder {
 	cursor: default;
 	border:2px solid #000;
 	outline:1px solid #dedede;
-		
+	
 }
 .dijit_a11y .dijitPaletteCell {
 	background-color:transparent !important;
@@ -677,18 +683,25 @@ img.dijitColorPaletteUnder {
 	border:1px solid #b7b7b7;
 	border-top:0 !important;
 }
+.dj_webkit .dijitAccordionContainer  div:focus {
+	outline:none;
+}
+.dj_ff3 .dijitAccordionContainer  div:focus {
+	outline:none;
+}
 .dijitAccordionTitle {
 	cursor: pointer;
 }
+.dijitAccordionFocused  {
+	text-decoration: underline;
+}
 .dijitAccordionTitle .arrowTextUp,
 .dijitAccordionTitle .arrowTextDown {
 	display: none;
 	font-size: 0.65em;
 	font-weight: normal !important;
 }
-.dijit_a11y .dijitAccordionTitle .arrowTextUp {
-	display: inline;
-}
+.dijit_a11y .dijitAccordionTitle .arrowTextUp,
 .dijit_a11y .dijitAccordionTitle-selected .arrowTextDown {
 	display: inline;
 }
@@ -705,27 +718,23 @@ img.dijitColorPaletteUnder {
 	margin:0 0.55em 0 0;
 }
 .dijitCalendarIncrementControl {
-	cursor:pointer;
 	vertical-align: middle;
 }
 .dijitCalendarDisabledDate {
 	color:gray !important;
 }
-.dijitCalendarBodyContainer tbody tr td {
-	cursor:pointer;
-}
 .dijitCalendarPreviousMonthDisabled,
 .dijitCalendarCurrentMonthDisabled,
 .dijitCalendarNextMonthDisabled {
 	cursor:default !important
 }
+.dijitCalendarIncrementControl,
+.dijitCalendarBodyContainer tbody tr td,
 .dijitCalendarDateTemplate,
-.dijitCalendarSelectedYear,
-.dijitCalendarNextYear,
-.dijitCalendarPreviousYear {
+.dijitCalendarContainer .dijitInline {
 	cursor:pointer;
 }
-.dijitCalendarMonthLabelSpacer {
+.dijitSpacer {
 	
   	position: relative;
   	height: 1px;
@@ -775,12 +784,19 @@ img.dijitColorPaletteUnder {
 	position: relative;
 	vertical-align: middle;
 }
+.dijit_a11y .dijitMenuItemSelected {
+	border: 1px #fff dotted !important;
+}
+.dj_ff3 .dijit_a11y .dijitMenuItem td {
+	padding: none !important;
+	background:none ! important;
+}
 .dijit_a11y .dijitMenuItemSelected .dijitMenuItemLabel {
 	border-width: 1px;
 	border-style: solid;
 }
-.dijit_a11y .dijitMenuItemSelected {
-	border: 1px #fff dotted !important;
+.dj_ie8 .dijit_a11y .dijitMenuItemLabel {
+	position:static;
 }
 .dijitMenuExpandA11y {
 	display: none;
@@ -820,11 +836,13 @@ img.dijitColorPaletteUnder {
 .dijitStackController .dijitToggleButtonChecked * {
 	cursor: default;	
 }
+.dijitTabContainerNoLayout {
+	width: 100%;	
+}
 .dijitTabContainerBottom-tabs,
 .dijitTabContainerTop-tabs,
 .dijitTabContainerLeft-tabs,
 .dijitTabContainerRight-tabs {
-	z-index:10;
 	overflow: visible !important;  
 }
 .dijitTabContainerBottom-container,
@@ -835,6 +853,18 @@ img.dijitColorPaletteUnder {
 	overflow: hidden;
 	border: 1px solid black;
 }
+.dijitTabContainer .nowrapTabStrip {
+	width: 50000px;
+	display: block;
+	position: relative;
+}
+.dijitTabContainer .dijitTabListWrapper {
+	overflow: hidden;
+}
+.dijit_a11y .dijitTabContainer .tabStripButton img {
+	
+	display: none;
+}
 .dijitTabContainerTop-tabs {
 	border-bottom: 1px solid black;
 }
@@ -843,6 +873,7 @@ img.dijitColorPaletteUnder {
 }
 .dijitTabContainerLeft-tabs {
 	border-right: 1px solid black;
+	float: left;
 }
 .dijitTabContainerLeft-container {
 	border-left: 0px;
@@ -854,20 +885,31 @@ img.dijitColorPaletteUnder {
 	border-bottom: 0px;
 }
 .dijitTabContainerRight-tabs {
-	border-left: 1px solid black
+	border-left: 1px solid black;
+	float: left;
 }
 .dijitTabContainerRight-container {
 	border-right: 0px;
 }
+div.dijitTabBtnDisabled, .dj_ie div.dijitTabBtnDisabled {
+	cursor: auto;
+}
 .dijitTab {
 	position:relative;
 	cursor:pointer;
 	white-space:nowrap;
 	z-index:3;
 }
+.dijitTab * {
+	
+	vertical-align: middle;
+}
 .dijitTabChecked {
 	cursor: default;	
 }
+.dijitTabButtonIcon {
+	height: 18px;
+}
 .dijitTabContainerTop-tabs .dijitTab {
 	top: 1px;	
 }
@@ -883,7 +925,6 @@ img.dijitColorPaletteUnder {
 .dijitTabContainerTop-tabs .dijitTab,
 .dijitTabContainerBottom-tabs .dijitTab {
 	
-	display:-moz-inline-box;		
 	display:inline-block;			
 	#zoom: 1; 
 	#display:inline; 
@@ -891,6 +932,15 @@ img.dijitColorPaletteUnder {
 .dijitTabInnerDiv {
 	position:relative;
 }
+.tabStripButton {
+	z-index: 12;
+}
+.dijitTabButtonDisabled .tabStripButton {
+	display: none;
+}
+.dijitTab .closeButton {
+	margin-left: 1em;
+}
 .dijitTab .closeText {
 	display:none;
 }
@@ -936,6 +986,10 @@ img.dijitColorPaletteUnder {
 .dijitInlineEditor .saveButton,
 .dijitInlineEditor .cancelButton {
 }
+.dijitTreeIndent {
+	
+	width: 19px;
+}
 .dijitTreeRow, .dijitTreeContent {
 	white-space: nowrap;
 }
@@ -965,13 +1019,10 @@ img.dijitColorPaletteUnder {
 	position: absolute;
 	z-index: 999;
 	padding: 1px;
-     overflow: hidden;       
-}
-.dj_ff2 .dijitDialog {
-     overflow: auto;          
+	overflow: hidden;       
 }
 .dijitDialogFixed div.dijitDialogTitleBar {
-	cursor:default; 
+	cursor:default;
 }
 .dijitDialogUnderlayWrapper {
 	position: absolute;
@@ -1177,9 +1228,13 @@ img.dijitColorPaletteUnder {
 .dj_ie .dijitRuleLabelContainerV {
 	margin-top:-.55em;
 }
-.dijit_a11y .dijitButtonContents .dijitButtonText {
+.dijit_a11y .dijitButtonContents .dijitButtonText,
+.dijit_a11y .dijitTab .tabLabel {
 	display: inline !important;
 }
+.dj_ie7 .dijitButtonNode > BUTTON.dijitButtonContents > * {
+	position: relative; 
+}
 .dijitTextArea {
 	width:100%;
 	overflow-y: auto;	
@@ -1244,7 +1299,7 @@ img.dijitColorPaletteUnder {
 	cursor:pointer;
 }
 .dijit_a11y .dijitTimePickerItem {
-	border-bottom:1px solid #333;	
+	border-bottom:1px solid #333;
 }
 .dijitToggleButtonIconChar {
 	display:none !important;
@@ -1299,3 +1354,102 @@ img.dijitColorPaletteUnder {
 	border-width: 1px 0px 0px 1px;
 	border-style: solid !important;
 }
+.dijitSelect {
+	margin: 0.2em;
+}
+.dj_ie .dijitSelect,
+.dj_ie7 .dijitSelect,
+.dj_iequirks .dijitSelect {
+	vertical-align: middle; 
+}
+.dj_ie8 .dijitSelect .dijitButtonText {
+	vertical-align: top;
+}
+.dijitSelect .dijitButtonNode {
+	text-align: left;
+}
+.dijitRtl .dijitSelect .dijitButtonNode {
+	text-align: right;
+}
+.dijitToolbar .dijitSelect {
+	margin: 0;
+}
+.dj_webkit .dijitToolbar .dijitSelect {
+	padding-left: 0.3em;
+}
+.dijit_a11y .dijitSelectDisabled .dijitButtonNode {
+	border-style: outset!important;
+	border-width: medium!important;
+	border-color: #999 !important;
+	color:#999 !important;
+}
+.dijitSelect .dijitButtonContents {
+	padding: 0px;
+	background: transparent none;
+}
+.dijitSelectFixedWidth .dijitButtonContents {
+	width: 100%;
+}
+.dijitSelect .dijitArrowButton {
+	width: 16px;
+}
+.dj_ie6 .dijitSelectMenu .dijitMenuItemLabel,
+.dj_ie7 .dijitSelectMenu .dijitMenuItemLabel {
+	
+	position: static;
+}
+.dijitSelectLabel *
+{
+	vertical-align: baseline;
+}
+.dijitSelectSelectedOption * {
+	font-weight: bold;
+}
+.dijitSelectMenu {
+	border-width: 1px;
+}
+.dijitSelect .dijitButtonContents {
+	white-space: nowrap;
+}
+.dijitSelectMenu .dijitMenuTable {
+	margin: 0px;
+	background-color: transparent;
+}
+.dijitTextBoxReadOnly,
+.dijitComboBoxReadOnly,
+.dijitSpinnerReadOnly,
+.dijitTextAreaReadOnly,
+.dijitTextBoxDisabled,
+.dijitComboBoxDisabled,
+.dijitSpinnerDisabled,
+.dijitTextAreaDisabled {
+	color: gray;
+}
+.dj_webkit .dijitTextBoxDisabled INPUT,
+.dj_webkit .dijitComboBoxDisabled INPUT,
+.dj_webkit .dijitSpinnerDisabled INPUT {
+	color: #eee;
+}
+.dj_webkit INPUT.dijitTextBoxDisabled,
+.dj_webkit TEXTAREA.dijitTextAreaDisabled {
+	color: #333; 
+}
+.dijit_a11y .dijitSliderReadOnly,
+.dijit_a11y .dijitSliderDisabled {
+	opacity:0.6;
+}
+.dj_ie .dijit_a11y .dijitSliderReadOnly .dijitSliderBar,
+.dj_ie .dijit_a11y .dijitSliderDisabled .dijitSliderBar {
+	filter: alpha(opacity=40);
+}
+.dijit_a11y .dijitSlider .dijitSliderButtonContainer DIV {
+	font-family: monospace; 
+	font-size: 1em;
+	line-height: 1em;
+	height: auto;
+	width: auto;
+	margin: 0px 4px;
+}
+.dijitForceStatic {
+    position: static !important;
+}
diff --git a/dijit/themes/dijit_rtl.css b/dijit/themes/dijit_rtl.css
index a125d1d..ed887c4 100644
--- a/dijit/themes/dijit_rtl.css
+++ b/dijit/themes/dijit_rtl.css
@@ -74,3 +74,6 @@
 	background-position:right;
 	padding-right:25px;
 }
+.dijitRtl .dijitTabContainer .tabStripMenuButton {
+	float: left;
+}
diff --git a/dijit/themes/nihilo/Calendar.css b/dijit/themes/nihilo/Calendar.css
index 6fd45e0..6ead491 100644
--- a/dijit/themes/nihilo/Calendar.css
+++ b/dijit/themes/nihilo/Calendar.css
@@ -1,5 +1,4 @@
 
-	
 .nihilo .dijitCalendarIncrementControl {
 	
 	width:15px;
@@ -37,7 +36,6 @@
 .dj_ie6 .nihilo .dijitCalendarMonthContainer th {
 	padding-top:.2em;
 	padding-bottom:.1em;
-	
 }
 .nihilo .dijitCalendarDayLabelTemplate {
 	
@@ -50,7 +48,7 @@
 	text-align:center;
 }
 .nihilo .dijitCalendarBodyContainer {
-	border-bottom: 1px solid #eeeeee;	
+	border-bottom: 1px solid #eeeeee;
 }
 .nihilo .dijitCalendarMonthLabel {
 	color:#293a4b;
@@ -85,7 +83,7 @@
 	
 }
 .nihilo .dijitCalendarCurrentMonthDisabled {
-		
+	
 	background-color:#bbbbbc !important;
 }
 .nihilo .dijitCalendarDisabledDate {
diff --git a/dijit/themes/nihilo/Dialog.css b/dijit/themes/nihilo/Dialog.css
index d40eba3..b5ade7e 100644
--- a/dijit/themes/nihilo/Dialog.css
+++ b/dijit/themes/nihilo/Dialog.css
@@ -81,7 +81,7 @@
 	width:17px;
 	height:11px;
 }
-.dj_ie6 .nihilo .dijitTooltipBelow .dijitTooltipConnector {
+.dj_ie .nihilo .dijitTooltipBelow .dijitTooltipConnector {
 	background-image: url("images/tooltipConnectorUp.gif");
 }
 .nihilo .dijitTooltipAbove .dijitTooltipConnector {
@@ -92,7 +92,7 @@
 	width:17px;
 	height:11px;
 }
-.dj_ie6 .nihilo .dijitTooltipAbove .dijitTooltipConnector {
+.dj_ie .nihilo .dijitTooltipAbove .dijitTooltipConnector {
 	background-image: url("images/tooltipConnectorDown.gif");
 }
 .dj_ie6 .nihilo .dijitTooltipAbove .dijitTooltipConnector {
@@ -112,7 +112,7 @@
 	width:11px;
 	height:17px;
 }
-.dj_ie6 .nihilo .dijitTooltipLeft .dijitTooltipConnector {
+.dj_ie .nihilo .dijitTooltipLeft .dijitTooltipConnector {
 	background-image: url("images/tooltipConnectorRight.gif");
 }
 .nihilo .dijitTooltipRight {
@@ -126,6 +126,6 @@
 	width:11px;
 	height:17px;
 }
-.dj_ie6 .nihilo .dijitTooltipRight .dijitTooltipConnector {
+.dj_ie .nihilo .dijitTooltipRight .dijitTooltipConnector {
 	background-image: url("images/tooltipConnectorLeft.gif");
 }
diff --git a/dijit/themes/nihilo/Editor.css b/dijit/themes/nihilo/Editor.css
index 6d618ea..54e69e3 100644
--- a/dijit/themes/nihilo/Editor.css
+++ b/dijit/themes/nihilo/Editor.css
@@ -59,3 +59,7 @@
 .nihilo .dijitEditorIconTabIndent { background-position: -702px; }
 .nihilo .dijitEditorIconSelectAll { background-position: -720px; }
 .nihilo .dijitEditorIconUnlink { background-position: -738px; }
+.nihilo .dijitEditorIconFullScreen { background-position: -756px; }
+.nihilo .dijitEditorIconViewSource { background-position: -774px; }
+.nihilo .dijitEditorIconPrint { background-position: -792px; }
+.nihilo .dijitEditorIconNewPage { background-position: -810px; }
diff --git a/dijit/themes/nihilo/TitlePane.css b/dijit/themes/nihilo/TitlePane.css
index 576897e..83aa48e 100644
--- a/dijit/themes/nihilo/TitlePane.css
+++ b/dijit/themes/nihilo/TitlePane.css
@@ -1,29 +1,30 @@
- 
- 
+
 .nihilo .dijitTitlePaneTitle {
 	background: #cccccc;
 	background:#fff url("images/titleBar.png") repeat-x top left;
 	border:1px solid #bfbfbf;
 	padding:3px 4px;
-	cursor: pointer;
 	font-size: 0.9em;
 	font-weight: bold;
 	color: #6d6d6d;
 }
 .nihilo .dijitTitlePaneTitle-hover  {
 	background: #f9f9f9 url("images/accordionItemActive.png") top repeat-x;
+	cursor: pointer;
 }
 .nihilo .dijitTitlePaneTitle * {
 	vertical-align: middle;
 }
-.nihilo .dijitTitlePane .dijitArrowNode {
+.nihilo .dijitTitlePane .dijitOpen .dijitArrowNode,
+.nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
 	width:15px;
 	height:15px;
 }
 .nihilo .dijitTitlePaneFocused .dijitTitlePaneTextNode {
 	color: #243C5F;
 }
-.nihilo .dijitOpen .dijitTitlePaneTextNode {
+.nihilo .dijitOpen .dijitTitlePaneTextNode,
+.nihilo .dijitFixedOpen .dijitTitlePaneTextNode {
 	color: #243C5F;
 }
 .nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
@@ -41,10 +42,10 @@
 .nihilo .dijitTitlePane .dijitArrowNodeInner {
 	display:none;
 }
-.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
+.dijit_a11y .dijitTitlePane .dijitOpen .dijitArrowNodeInner,
+.dijit_a11y .dijitTitlePane .dijitClosed .dijitArrowNodeInner {
 	display:inline !important;
 	font-family:monospace;
-	cursor: pointer;
 	padding-bottom:.2em;
 }
 .dijit_a11y .dijitTitlePane .dijitArrowNode {
diff --git a/dijit/themes/nihilo/Toolbar.css b/dijit/themes/nihilo/Toolbar.css
index 4013f1c..4106fad 100644
--- a/dijit/themes/nihilo/Toolbar.css
+++ b/dijit/themes/nihilo/Toolbar.css
@@ -19,7 +19,7 @@
 .nihilo .dijitToolbar .dijitDropDownButton,
 .nihilo .dijitToolbar .dijitComboButton .dijitButtonContents,
 .nihilo .dijitToolbar .dijitComboButton .dijitDownArrowButton {
-	background: none;	
+	background: none;
 	padding: 1px;	
 }
 .nihilo .dijitToolbar .dijitButtonChecked,
@@ -45,13 +45,11 @@
 	padding: 0;
 	background-color:#ffe284;
 }
-.nihilo .dijitToolbar label {	
+.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 {
+.dj_ie .nihilo .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
 	
 	border: 1px #555 dotted !important;
 	padding: 0px;
diff --git a/dijit/themes/nihilo/Tree.css b/dijit/themes/nihilo/Tree.css
index 668c9d4..18e97cb 100644
--- a/dijit/themes/nihilo/Tree.css
+++ b/dijit/themes/nihilo/Tree.css
@@ -16,7 +16,7 @@
 }
 .nihilo .dijitTreeLabel {
 	font-weight: normal;
-	margin-left: 3px;	
+	margin-left: 3px;
 }
 .nihilo .dijitTreeIsRoot {
     margin-left: 0;
diff --git a/dijit/themes/nihilo/Tree_rtl.css b/dijit/themes/nihilo/Tree_rtl.css
index d9b2994..e92d5d5 100644
--- a/dijit/themes/nihilo/Tree_rtl.css
+++ b/dijit/themes/nihilo/Tree_rtl.css
@@ -9,7 +9,7 @@
 }
 .dijitRtl .nihilo .dijitTreeContainer .dijitTreeContent {
     padding-left: auto;
-    padding-right: 1px;   
+    padding-right: 1px;
 }
 .dijitRtl .nihilo .dijitTreeContainer .dijitTreeExpandoOpened {
 	background: url('images/spriteTree_rtl.gif') no-repeat -18px top;
diff --git a/dijit/themes/nihilo/form/Button.css b/dijit/themes/nihilo/form/Button.css
index e996526..01dc674 100644
--- a/dijit/themes/nihilo/form/Button.css
+++ b/dijit/themes/nihilo/form/Button.css
@@ -4,16 +4,18 @@
 	
 	border:1px solid #dedede;
 	border-bottom:1px solid #dedede;
-	padding: 0.1em 0.2em 0.2em 0.2em; 
+	padding: 0.1em 0.2em 0.2em 0.2em;
 	background: #fff url("../images/buttonEnabled.png") repeat-x top left;
 }
-.nihilo .dijitButtonNode button { 
-	border: 0px; 
-	background-color: transparent; 
-} 
- 
+.nihilo .dijitSelect .dijitButtonContents {
+	border-right: none;
+}
+.nihilo .dijitButtonNode button {
+	border: 0px;
+	background-color: transparent;
+}
 .nihilo .dijitButtonText {
-	text-align: center; 
+	text-align: center;
 	padding: 0 0.3em;
 }
 .nihilo .dijitComboBox .dijitButtonNode {
@@ -25,10 +27,9 @@
 .nihilo .dijitComboButton .dijitDownArrowButton {
 	padding-right:4px;
 }
-.dj_ff2 .nihilo .dijitComboButton .dijitButtonContentsFocused,
-.dj_ff2 .nihilo .dijitComboButton .dijitDownArrowButtonFocused {
-	border: 1px black dotted !important;
-}
+.nihilo .dijitComboBoxReadOnly,
+.nihilo .dijitSpinnerReadOnly,
+.nihilo .dijitSpinnerReadOnly .dijitButtonNode,
 .nihilo .dijitButtonDisabled .dijitButtonNode,
 .nihilo .dijitToggleButtonDisabled .dijitButtonNode,
 .nihilo .dijitDropDownButtonDisabled .dijitButtonNode,
@@ -39,7 +40,11 @@
 	
 	border-color: #dedede;
 	background:#fafafa url("../images/buttonDisabled.png") top repeat-x;
-	opacity: 0.60; 
+	opacity: 0.60;
+}
+.dj_ie6 .nihilo .dijitComboButtonDisabled .dijitButtonText {
+	
+	color: #aaa;
 }
 .nihilo .dijitButtonHover .dijitButtonNode,
 .nihilo .dijitButtonNodeHover,
@@ -69,18 +74,20 @@
 	background: #f5f5f5 url("../images/buttonActive.png") top left repeat-x;
 }
 .nihilo .dijitArrowButtonInner {
-	background:url("../images/spriteArrows.png") no-repeat left top;
+	background-image: url("../images/spriteArrows.png");
+	background-repeat: no-repeat;
+	background-position: 0px top;
 	width: 11px;
 }
-.nihilo .dijitUpArrowButton .dijitArrowButtonInner { 
-	background:url("../images/spriteArrows.png") no-repeat -22px top; 
-	width: 11px;
+.nihilo .dijitLeftArrowButton .dijitArrowButtonInner {
+	background-position: -11px top;
 }
-.dj_ie6 .nihilo .dijitArrowButtonInner {
-	background:url("../images/spriteArrows.gif") no-repeat left top;
-	width: 11px;
+.nihilo .dijitUpArrowButton .dijitArrowButtonInner {
+	background-position: -22px top;
 }
-.dj_ie6 .nihilo .dijitUpArrowButton .dijitArrowButtonInner {
-	background:url("../images/spriteArrows.gif") no-repeat -22px top;
-	width: 11px;
+.nihilo .dijitRightArrowButton .dijitArrowButtonInner {
+	background-position: -33px top;
+}
+.dj_ie6 .nihilo .dijitArrowButtonInner {
+	background-image: url("../images/spriteArrows.gif");
 }
diff --git a/dijit/themes/nihilo/form/Button_rtl.css b/dijit/themes/nihilo/form/Button_rtl.css
index 26fda32..3a7acc0 100644
--- a/dijit/themes/nihilo/form/Button_rtl.css
+++ b/dijit/themes/nihilo/form/Button_rtl.css
@@ -1,3 +1,7 @@
 .dijitRtl .nihilo .dijitComboBox .dijitButtonNode {
 	border-width: 0px 0px 0px 1px;
 }
+.dijitRtl .nihilo .dijitSelect .dijitButtonContents {
+	border-left: none;
+	border-right-width: 1px;
+}
diff --git a/dijit/themes/nihilo/form/Common.css b/dijit/themes/nihilo/form/Common.css
index bbb2864..4a9ddc0 100644
--- a/dijit/themes/nihilo/form/Common.css
+++ b/dijit/themes/nihilo/form/Common.css
@@ -31,18 +31,6 @@
 	border-color: #d3d3d3;
 	border-left: 1px solid #d3d3d3;
 }
-.nihilo .dijitTextBoxDisabled,
-.nihilo .dijitComboBoxDisabled,
-.nihilo .dijitSpinnerDisabled,
-.nihilo .dijitTextAreaDisabled {
-	color: gray;
-}
-.dj_webkit .nihilo .dijitTextBoxDisabled,
-.dj_webkit .nihilo .dijitComboBoxDisabled,
-.dj_webkit .nihilo .dijitSpinnerDisabled,
-.dj_webkit .nihilo .dijitTextareaDisabled {
-	color: #eee;
-}
 .nihilo .dijitTextBoxFocused,
 .nihilo .dijitComboBoxFocused,
 .nihilo .dijitSpinnerFocused, .nihilo .dijitSpinnerUpArrowActive, .nihilo .dijitSpinnerDownArrowActive,
diff --git a/dijit/themes/nihilo/form/Select.css b/dijit/themes/nihilo/form/Select.css
new file mode 100644
index 0000000..8872b18
--- /dev/null
+++ b/dijit/themes/nihilo/form/Select.css
@@ -0,0 +1,52 @@
+
+.nihilo .dijitSelectDisabled * {
+    cursor: not-allowed !important;
+}
+.nihilo .dijitSelectReadOnly * {
+    cursor: default !important;
+}
+.nihilo .dijitSelect .dijitButtonNode {
+	padding: 0px;
+}
+.nihilo .dijitSelect .dijitButtonContents {
+	padding-top: 1px;
+    background:#fff url("../images/validationInputBg.png") repeat-x top left;
+    #background:#fff url('../images/validationInputBg.gif') repeat-x top left;
+}
+.nihilo .dijitSelectHover .dijitButtonContents,
+.nihilo .dijitSelectActive .dijitButtonContents,
+.nihilo .dijitSelectOpened .dijitButtonContents,
+.nihilo .dijitSelectDisabled .dijitButtonContents,
+.nihilo .dijitSelectReadOnly .dijitButtonContents{
+	background: transparent none;
+}
+.dj_ie .nihilo .dijitSelect .dijitButtonContents {
+	padding-top: 0px;
+}
+.nihilo .dijitSelectDisabled .dijitButtonNode {
+    border-color: #dedede;
+    background:#fafafa url("../images/buttonDisabled.png") top repeat-x;
+}
+.dj_ie .nihilo .dijitSelectDisabled  .dijitButtonNode * {
+	filter: gray() alpha(opacity=50);
+}
+.nihilo .dijitSelectHover .dijitButtonNode {
+    color:#000;
+    background:#fcfcfc url("../images/buttonHover.png") repeat-x top left;
+}
+.nihilo .dijitSelectActive .dijitButtonNode,
+.nihilo .dijitSelectOpened .dijitButtonNode {
+    border-color:#dedede;
+    background: #f5f5f5 url("../images/buttonActive.png") top left repeat-x;
+}
+.nihilo .dijitSelectMenu td {
+	padding: 0em;
+}
+.nihilo .dijitSelectMenu .dijitMenuItemIcon {
+	margin: 0.1em 0.2em;
+	display: none;
+}
+.nihilo .dijitSelectMenu .dijitMenuItemLabel,
+.nihilo .dijitSelectMenu .dijitMenuArrowCell {
+	padding: 0.1em 0.2em;
+}
diff --git a/dijit/themes/nihilo/form/Slider.css b/dijit/themes/nihilo/form/Slider.css
index d7e803b..47b0ca2 100644
--- a/dijit/themes/nihilo/form/Slider.css
+++ b/dijit/themes/nihilo/form/Slider.css
@@ -29,7 +29,7 @@
 	
 }
 .nihilo .dijitSliderFocused .dijitSliderBar {
-	border-color:#727272;	
+	border-color:#727272;
 }
 .dijit_a11y .dijitSliderProgressBar {
 	background-color:#333 !important;
@@ -97,19 +97,31 @@
 	background:url('../images/spriteRoundedIconsSmall.png') no-repeat -15px top;
 	#background:url('../images/spriteRoundedIconsSmall.gif') no-repeat -15px top;
 }
-.nihilo .dijitSliderDecrementIconH { 
-	background:url('../images/spriteRoundedIconsSmall.png') no-repeat 0px top; 
-	#background:url('../images/spriteRoundedIconsSmall.gif') no-repeat 0px top; 
+.nihilo .dijitSliderDecrementIconH {
+	background:url('../images/spriteRoundedIconsSmall.png') no-repeat 0px top;
+	#background:url('../images/spriteRoundedIconsSmall.gif') no-repeat 0px top;
 }
 .nihilo .dijitSliderButtonInner {
 	visibility:hidden;
 }
-.nihilo .dijitSliderDisabled {
-	opacity:0.6 !important;
+.nihilo .dijitSliderReadOnly *,
+.nihilo .dijitSliderDisabled * {
+	border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
+	color: #bdbdbd;
 }
-.dj_ie .nihilo .dijitSliderDisabled,
-.dj_ie .nihilo .dijitSliderDisabled .dijitRuleContainer,
-.dj_ie .nihilo .dijitSliderDisabled .dijitSliderRemainingBar,
-.dj_ie .nihilo .dijitSliderDisabled .dijitSliderProgressBar {
-	filter: gray() alpha(opacity=40);
+.nihilo .dijitSliderReadOnly .dijitSliderDecrementIconH,
+.nihilo .dijitSliderDisabled .dijitSliderDecrementIconH {
+	background-position: 0px -15px;
+}
+.nihilo .dijitSliderReadOnly .dijitSliderIncrementIconH,
+.nihilo .dijitSliderDisabled .dijitSliderIncrementIconH {
+	background-position: -30px -15px;
+}
+.nihilo .dijitSliderReadOnly .dijitSliderDecrementIconV,
+.nihilo .dijitSliderDisabled .dijitSliderDecrementIconV {
+	background-position: -15px -15px;
+}
+.nihilo .dijitSliderReadOnly .dijitSliderIncrementIconV,
+.nihilo .dijitSliderDisabled .dijitSliderIncrementIconV {
+	background-position: -45px -15px;
 }
diff --git a/dijit/themes/nihilo/images/editor.gif b/dijit/themes/nihilo/images/editor.gif
index 127c9c4..750c6b9 100644
Binary files a/dijit/themes/nihilo/images/editor.gif and b/dijit/themes/nihilo/images/editor.gif differ
diff --git a/dijit/themes/nihilo/images/editorDisabled.gif b/dijit/themes/nihilo/images/editorDisabled.gif
index 9dc5103..e40460d 100644
Binary files a/dijit/themes/nihilo/images/editorDisabled.gif and b/dijit/themes/nihilo/images/editorDisabled.gif differ
diff --git a/dijit/themes/nihilo/images/editorDisabled_rtl.gif b/dijit/themes/nihilo/images/editorDisabled_rtl.gif
index 74d407a..a0f6c10 100644
Binary files a/dijit/themes/nihilo/images/editorDisabled_rtl.gif and b/dijit/themes/nihilo/images/editorDisabled_rtl.gif differ
diff --git a/dijit/themes/nihilo/images/editor_rtl.gif b/dijit/themes/nihilo/images/editor_rtl.gif
index b94d040..a9740c2 100644
Binary files a/dijit/themes/nihilo/images/editor_rtl.gif and b/dijit/themes/nihilo/images/editor_rtl.gif differ
diff --git a/dijit/themes/nihilo/images/titleBar.png b/dijit/themes/nihilo/images/titleBar.png
index 48f3a2f..06ea21c 100644
Binary files a/dijit/themes/nihilo/images/titleBar.png and b/dijit/themes/nihilo/images/titleBar.png differ
diff --git a/dijit/themes/nihilo/images/titleBarActive.png b/dijit/themes/nihilo/images/titleBarActive.png
index 58f3cf9..fe6c7a4 100644
Binary files a/dijit/themes/nihilo/images/titleBarActive.png and b/dijit/themes/nihilo/images/titleBarActive.png differ
diff --git a/dijit/themes/nihilo/layout/AccordionContainer.css b/dijit/themes/nihilo/layout/AccordionContainer.css
index cb3613d..f87199f 100644
--- a/dijit/themes/nihilo/layout/AccordionContainer.css
+++ b/dijit/themes/nihilo/layout/AccordionContainer.css
@@ -18,7 +18,7 @@
 	border-top: 1px solid #dedede;
 	border-bottom: 1px solid #dedede;
 	padding: 5px 4px 5px 8px;
-	cursor: default;	
+	cursor: default;
 	color: #243C5F;
 }
 .nihilo .dijitAccordionArrow {
diff --git a/dijit/themes/nihilo/layout/BorderContainer.css b/dijit/themes/nihilo/layout/BorderContainer.css
index 598f092..29fcc39 100644
--- a/dijit/themes/nihilo/layout/BorderContainer.css
+++ b/dijit/themes/nihilo/layout/BorderContainer.css
@@ -1,4 +1,4 @@
- 
+
 .nihilo .dijitBorderContainer {
 	background-color: #fcfcfc;
 	padding: 5px;
@@ -29,10 +29,10 @@
 	height:5px;
 }
 .nihilo .dijitSplitterH .dijitSplitterThumb {
-	background:url("../images/splitContainerSizerH-thumb.png") no-repeat;
-	top:1px;
+	background:#8BA0BD none;
+	height:1px;
+	top:2px;
 	width:19px;
-	height:2px;
 }
 .nihilo .dijitSplitterV,
 .nihilo .dijitGutterV {
@@ -43,10 +43,10 @@
 	width:5px;
 }
 .nihilo .dijitSplitterV .dijitSplitterThumb {
-	background:url("../images/splitContainerSizerV-thumb.png") no-repeat;
-	left:1px;
+	background:#8BA0BD none;
 	height:19px;
-	width:5px;
+	left:2px;
+	width:1px;
 }
 .nihilo .dijitSplitterActive {
 	font-size: 1px;
diff --git a/dijit/themes/nihilo/layout/SplitContainer.css b/dijit/themes/nihilo/layout/SplitContainer.css
index 6d6d715..79d8fbd 100644
--- a/dijit/themes/nihilo/layout/SplitContainer.css
+++ b/dijit/themes/nihilo/layout/SplitContainer.css
@@ -1,4 +1,4 @@
- 
+
 .nihilo .dijitSplitContainerSizerH {
 	background:url("../images/splitContainerSizerV.png") repeat-y #fff;
 	border:0;
diff --git a/dijit/themes/nihilo/layout/TabContainer.css b/dijit/themes/nihilo/layout/TabContainer.css
index 54f5ce4..585e440 100644
--- a/dijit/themes/nihilo/layout/TabContainer.css
+++ b/dijit/themes/nihilo/layout/TabContainer.css
@@ -1,5 +1,77 @@
- 
- 
+
+.nihilo .dijitMenu,
+.nihilo .dijitMenuBar {
+	border: 1px solid #d3d3d3;
+	margin: 0px;
+	padding: 0px;
+	background-color: #fff;
+}
+.nihilo .dijitBorderContainer .dijitMenuBar {
+	border: 1px #ccc solid;
+}
+.nihilo .dijitMenuItem {
+	font-family: sans-serif;
+	margin: 0px;
+	color: #243C5F;
+}
+.nihilo .dijitMenuBar .dijitMenuItem {
+	padding: 4px 5px;
+}
+.nihilo .dijitMenuPreviousButton, .nihilo .dijitMenuNextButton {
+	font-style: italic;
+}
+.nihilo .dijitMenuItem TD {
+	padding:1px;
+}
+.nihilo .dijitMenuPassive .dijitMenuItemHover,
+.nihilo .dijitMenuItemSelected {
+	background-color: #ffe284; 
+	color: #243C5F;
+}
+.nihilo .dijitMenuItemIcon {
+	width: 15px;
+	height: 15px;
+}
+.nihilo .dijitMenuExpand {
+	width:15px;
+	height:15px;
+	background-image: url(../images/spriteRoundedIconsSmall.png);
+	background-position: -30px top;
+}
+.dj_ie6 .nihilo .dijitMenuExpand {
+	background-image:url(../images/spriteRoundedIconsSmall.gif);
+}
+.nihilo .dijitMenuSeparator {
+	height: 1px;
+}
+.nihilo .dijitMenuSeparatorTop {
+	border-bottom: 1px solid #fff; 
+}
+.nihilo .dijitMenuSeparatorBottom {
+	border-top: 1px solid #d3d3d3;
+}
+.nihilo .dijitCheckedMenuItemIconChar {
+	display: none;
+}
+.nihilo .dijitCheckedMenuItemIcon {
+	background-image: url(../images/spriteCheckbox.gif);
+	background-position: -80px;
+}
+.nihilo .dijitCheckedMenuItemChecked .dijitCheckedMenuItemIcon {
+	background-position: -64px;
+}
+.nihilo .dijitTabContainer .tabStripRBtn {
+	margin-right: 21px;
+}
+.nihilo .dijitTabContainer .tabStripLBtn {
+	margin-left: 21px;
+}
+.nihilo .dijitTabContainerBottom .nowrapTabStrip .dijitTab {
+	top: 0px;
+}
+.nihilo .dijitTabContainer .tabStripMenuButton-Hover {
+	cursor: pointer;
+}
 .nihilo .dijitTabPaneWrapper {
 	background:#fff;
 	border:1px solid #ccc;
@@ -21,13 +93,10 @@
 	border-bottom: 1px #ccc solid;
 }
 .nihilo .dijitTabInnerDiv .dijitTabContent {
-	padding:5px 3px 4px 4px;
+	padding:3px 3px 3px 4px;
 	background: url("../images/tabContainerSprite.gif") repeat-x 0 -350px;
 	position: relative;
 }
-.dijitTabSpacer {
-	font-size: 1px;
-}
 .nihilo .dijitTabHover {
 	color: #243C5F;
 	background: url("../images/tabContainerSprite.gif") no-repeat 0px -150px;
@@ -51,6 +120,9 @@
 	background: url("../images/tabContainerSprite.gif") repeat-x 0 -50px;
 	color: #243C5F !important;
 }
+.nihilo .dijitTabContainerNested .dijitTabListWrapper {
+	height: auto;
+}
 .nihilo .dijitTabContainerTabListNested {
 	background: #FDFDFD;
 	border: none;
@@ -84,8 +156,9 @@
 	background: url("../images/spriteRoundedIconsSmall.png") no-repeat -60px top;
 	width: 15px;
 	height: 15px;
+	margin-top: -1px;
 }
-.dj_ie6 .dijitTab .closeImage {
+.dj_ie6 .nihilo .dijitTab .closeImage {
 	background: url("../images/spriteRoundedIconsSmall.gif") no-repeat -60px top;
 }
 .nihilo .dijitTab .closeButton-hover .closeImage {
@@ -94,34 +167,63 @@
 .dj_ie6 .nihilo .dijitTab .closeButton-hover .closeImage {
 	background: url("../images/spriteRoundedIconsSmall.gif") no-repeat -60px -15px;
 }
-.nihilo .dijitTab .dijitTabButtonSpacer {
-	height: 15px;
+.nihilo .dijitTab .tabLabel {
+	
+	min-height: 15px;
+	display: inline-block;
+}
+.dj_ie6 .nihilo .dijitTabButtonIcon {
+	
+	height: 18px;
 	width: 1px;
 }
 .nihilo .dijitTabContainerTop-tabs {
-	margin-bottom: -1px;
-	border-color: #ccc;
+	border-bottom: none;
+	padding-bottom: 1px;
+	background-position: bottom;
 	padding-left: 3px;
 }
+.dj_ie6 .nihilo .dijitTabListContainer-top,
+.dj_ie7 .nihilo .dijitTabListContainer-top {
+	z-index: 3;
+}
+.dj_ie6 .nihilo .dijitTabContainerTop-tabs,
+.dj_ie7 .nihilo .dijitTabContainerTop-tabs {
+	border-bottom: 1px solid #ccc;
+	padding-bottom: 0px;
+}
+.nihilo .dijitTabContainerTopNoStrip {
+	padding-top: 3px;
+}
 .nihilo .dijitTabContainerTop-container {
 	border-top: none;
 }
 .nihilo .dijitTabContainerTop-tabs .dijitTabChecked {
 	border-bottom-color: #f8f8f8;
 }
-.nihilo .dijitTabContainerTopStrip {
-	border: 1px solid #ccc;
-	padding-top: 2px;
-	padding-left: 3px;
-}
-.nihilo .dijitTabContainerTopStrip {
+.nihilo .dijitTabContainer .dijitTabContainerTopStrip {
+	border-bottom: none;
+	padding-top: 1px;
+	margin-top: 1px;
 	background: #f2f2f2;
+	border-top: 1px solid #CCC;
+	border-right: 1px solid #CCC;
+	border-left: 1px solid #CCC;
 }
 .nihilo .dijitTabContainerBottom-tabs {
-	margin-top: -1px;
-	border-color: #ccc;
+	border-top: none;
+	background-position: top;
 	padding-left: 3px;
 }
+.dj_ie6 .nihilo .dijitTabListContainer-bottom,
+.dj_ie7 .nihilo .dijitTabListContainer-bottom {
+	z-index: 3;
+}
+.dj_ie6 .nihilo .dijitTabContainerBottom-tabs,
+.dj_ie7 .nihilo .dijitTabContainerBottom-tabs {
+	border-top: 1px solid #ccc;
+	margin-top: -1px;
+}
 .nihilo .dijitTabContainerBottom-container {
 	border-bottom: none;
 }
@@ -131,11 +233,11 @@
 	background: url("../images/tabBottomEnabledSpriteLR.gif") no-repeat bottom left;
 }
 .nihilo .dijitTabContainerBottom-tabs .dijitTabChecked {
-	border-top-color:#f8f8f8;
+	border-top-color: #f8f8f8;
 }
 .nihilo .dijitTabContainerBottom-tabs .dijitTabInnerDiv .dijitTabContent {
-	padding-top: 4px;
-	padding-bottom: 5px;
+	padding-top: 3px;
+	padding-bottom: 3px;
 	background: url("../images/tabBottomEnabledC.gif") repeat-x bottom left;
 }
 .nihilo .dijitTabContainerBottom-tabs .dijitTabInnerDiv {
@@ -163,13 +265,11 @@
 .nihilo .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
 	background: url("../images/tabBottomActiveC.gif") repeat-x bottom left;
 }
-.nihilo .dijitTabContainerBottomStrip {
-	padding-bottom: 2px;
-	padding-left: 3px;	
+.nihilo .dijitTabContainer .dijitTabContainerBottomStrip {
 	border: 1px solid #ccc;
-}
-.nihilo .dijitTabContainerBottomStrip {
 	background: #f2f2f2;
+	border-top: none;
+	padding-bottom: 2px;
 }
 .nihilo .dijitTabContainerBottom-spacer,
 .nihilo .dijitTabContainerTop-spacer {
@@ -177,11 +277,19 @@
 	border: 1px solid #ccc;
 	background: #f8f8f8;
 }
+.nihilo  .dijitTabContainerTop-spacer {
+	margin-top: -1px;
+}
+.nihilo .dijitTabContainerBottom-spacer {
+	margin-bottom: -1px;
+}
 .nihilo .dijitTabContainerRight-tabs {
-	margin-left: -1px;
 	border-color: #ccc;
 	padding-top: 3px;
 }
+.nihilo .dijitTabContainerRight .dijitTabListWrapper {
+	padding-right: 3px;
+}
 .nihilo .dijitTabContainerRight-container {
 	border-right: none;
 }
@@ -211,14 +319,11 @@
 }
 .nihilo .dijitTabContainerRightStrip {
 	padding-right: 2px;
-	padding-top: 3px;	
 	border: 1px solid #ccc;
-}
-.nihilo .dijitTabContainerRightStrip {
+	border-left: none;
 	background: #f2f2f2;
 }
 .nihilo .dijitTabContainerLeft-tabs {
-	margin-right: -1px;
 	border-color: #ccc;
 	padding-top: 3px;
 }
@@ -247,12 +352,12 @@
 	border-bottom: solid #efefef 1px;
 }
 .dj_ie .nihilo .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
-border-bottom: solid #fff 1px;
+	border-bottom: solid #fff 1px;
 }
 .nihilo .dijitTabContainerLeftStrip {
 	padding-left: 2px;
-	padding-top: 3px;	
 	border: 1px solid #ccc;
+	border-right: none;
 }
 .nihilo .dijitTabContainerLeftStrip {
 	background: #f2f2f2;
@@ -268,10 +373,76 @@ border-bottom: solid #fff 1px;
 	border: 1px solid #ccc;
 	background: #f8f8f8;
 }
+.nihilo .dijitTabContainerRight-spacer {
+	border-right: none;
+}
+.nihilo .dijitTabContainerRight-tabs {
+	padding-top: 3px;
+	height: 100%;
+}
+.nihilo .dijitTabContainerLeft-tabs {
+	height: 100%;
+}
+.nihilo .dijitTabContainerLeft-spacer {
+	border-left: none;
+}
 .nihilo .dijitTabContainerTop-dijitContentPane .dijitTabContainerTop-tabs {
 	border-left: 0px solid #ccc;
 	border-top: 0px solid #ccc;
 	border-right: 0px solid #ccc;
 	padding-top: 0px;
-	padding-left: 0px;	
+	padding-left: 0px;
+}
+.nihilo .dijitTabContainer .tabStripButton {
+	margin-right: 0px;
+}
+.nihilo .tabStripButton .dijitTabInnerDiv .dijitTabContent {
+	padding: 5px 0 6px;
+}
+.dj_ie6 .nihilo .tabStripButton .dijitTabInnerDiv .dijitTabContent,
+.dj_ie7 .nihilo .tabStripButton .dijitTabInnerDiv .dijitTabContent,
+.dj_opera .nihilo .tabStripButton .dijitTabInnerDiv .dijitTabContent {
+	padding-bottom: 7px;
+}
+.nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent {
+	padding: 3px 0 5px;
+}
+.dj_ie6 .nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent,
+.dj_ie7 .nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent,
+.dj_opera .nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent {
+	padding-top: 4px;
+}
+.nihilo .dijitTabContainer .tabStripButton {
+	
+	width: 21px;
+}
+.nihilo .dijitTabContainer .tabStripButton img {
+	height: 14px;
+	background: url(../images/spriteRoundedIconsSmall.png) no-repeat left top ;
+}
+.dj_ie6 .nihilo .dijitTabContainer .tabStripButton img {
+	background-image: url(../images/spriteRoundedIconsSmall.gif);
+}
+.nihilo .dijitTabContainer .tabStripSlideButtonRight img {
+	background-position: -30px top;
+}
+.nihilo .dijitTabContainer .tabStripMenuButton img {
+	background-position: -15px top;
+}
+.nihilo .dijitTabContainerTopNone {
+	padding-top: 0px;
+}
+.nihilo .dijitTabContainer .tabStripButton-top {
+	margin-top: 1px;
+}
+.nihilo .dijitTabContainer .tabStripButton-bottom {
+	background: transparent url(../images/tabBottomEnabledSpriteLR.gif) no-repeat scroll left bottom;
+	border-bottom: medium none;
+	border-top: 1px solid #CCCCCC;
+}
+.nihilo .dijitTabContainer .tabStripButton-bottom .dijitTabInnerDiv {
+	background: transparent url(../images/tabBottomEnabledSpriteLR.gif) no-repeat scroll right bottom;
+}
+.nihilo .dijitTabContainer .tabStripButton-bottom .dijitTabContent {
+	background: transparent;
 }
diff --git a/dijit/themes/nihilo/layout/TabContainer_rtl.css b/dijit/themes/nihilo/layout/TabContainer_rtl.css
index 65cab9b..8a55f50 100644
--- a/dijit/themes/nihilo/layout/TabContainer_rtl.css
+++ b/dijit/themes/nihilo/layout/TabContainer_rtl.css
@@ -2,17 +2,14 @@
 	margin-right:0;
 	margin-left:2px;		
 }
-.dijitRtl .nihilo .dijitTabContainerTopStrip,
-.dijitRtl .nihilo .dijitTabContainerBottomStrip {
-	padding-right: 3px;
-	padding-left: 0px;
-}
-.dijitRtl .nihilo .dijitTabContainerTop-tabs {
-	padding-left: auto;
-	padding-right: 3px;
+.dijitRtl .nihilo .dijitTabContainer .tabStripButton {
+	margin-left: 0;
 }
+.dijitRtl .nihilo .dijitTabContainerTopStrip,
+.dijitRtl .nihilo .dijitTabContainerBottomStrip,
+.dijitRtl .nihilo .dijitTabContainerTop-tabs,
 .dijitRtl .nihilo .dijitTabContainerBottom-tabs {
-	padding-left: auto;
+	padding-left: 0;
 	padding-right: 3px;
 }
 .dijitRtl .nihilo .dijitTabInnerDiv {
diff --git a/dijit/themes/nihilo/nihilo.css b/dijit/themes/nihilo/nihilo.css
index 2a6532a..6a42a06 100644
--- a/dijit/themes/nihilo/nihilo.css
+++ b/dijit/themes/nihilo/nihilo.css
@@ -1,5 +1,1458 @@
 
- at import url("../dijit.css");
+.dijitReset {
+	
+	margin:0;
+	border:0;
+	padding:0;
+	line-height:normal;
+	font: inherit;
+	color: inherit;
+}
+.dijitInline {
+	
+	display:inline-block;			
+	#zoom: 1; 
+	#display:inline; 
+	border:0;
+	padding:0;
+	vertical-align:middle;
+	#vertical-align: auto;	
+}
+.dijitHidden {
+	
+	display: none !important;
+}
+.dijitVisible {
+	
+	display: block !important;	
+	position: relative;			
+}
+.dj_ie INPUT.dijitTextBox,
+.dj_ie .dijitInputField INPUT {
+	font-size: 100%;
+}
+.dj_ie .dijitInputField INPUT { 
+	margin: -1px 0 !important;
+}
+.dijitInlineTable {
+	
+	display:inline-table;
+	display:inline-block;		
+	#zoom: 1; 
+	#display:inline; 
+	box-sizing: content-box; -moz-box-sizing: content-box;
+	border:0;
+	padding:0;
+}
+.dijitTeeny {
+	font-size:1px;
+	line-height:1px;
+}
+.dijitPopup {
+	position: absolute;
+	background-color: transparent;
+	margin: 0;
+	border: 0;
+	padding: 0;
+}
+.dijit_a11y .dijitPopup,
+.dijit_ally .dijitPopup div,
+.dijit_a11y .dijitPopup table,
+.dijit_a11y .dijitTooltipContainer {
+	background-color: white !important;
+}
+.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 {
+	
+	background-color: #e2ebf2;
+	cursor: text;
+}
+.dijitDisplayNone {
+	
+	display:none !important;
+}
+.dijitContainer {
+	
+	overflow: hidden;	
+}
+.dijit_a11y * {
+	background-image:none !important;
+}
+.dijit_a11y .dijitCalendarIncrementControl {
+	display: none;	
+}
+.dijit_a11y .dijitA11ySideArrow {
+	display: inline !important; 
+	cursor: pointer;
+}
+.dijit_a11y .dijitCalendarDateLabel {
+	padding: 1px;
+}
+.dijit_a11y .dijitCalendarSelectedDate .dijitCalendarDateLabel {
+	border: solid 1px black;
+	padding: 0px;
+}
+.dijit_a11y .dijitCalendarDateTemplate {
+	padding-bottom: 0.1em !important;	
+}
+.dijit_a11y .dijit * {
+	background:white !important;
+	color:black !important;
+}
+.dijit_a11y .dijitButtonNode {
+	border-color: black!important;
+	border-style: outset!important;
+	border-width: medium!important;
+}
+.dijit_a11y .dijitComboBoxReadOnly .dijitInputField,
+.dijit_a11y .dijitComboBoxReadOnly .dijitButtonNode,
+.dijit_a11y .dijitSpinnerReadOnly .dijitButtonNode,
+.dijit_a11y .dijitSpinnerReadOnly .dijitInputField,
+.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: 1em;
+	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;
+}
+.dijitToggleButton,
+.dijitButton,
+.dijitDropDownButton,
+.dijitComboButton {
+	
+	margin: 0.2em;
+}
+.dijitToolbar .dijitToggleButton,
+.dijitToolbar .dijitButton,
+.dijitToolbar .dijitDropDownButton,
+.dijitToolbar .dijitComboButton {
+	margin: 0;
+}
+.dj_ie8 .dijitToolbar button,
+.dj_webkit .dijitToolbar button {
+	
+	padding: 1px 2px;
+}
+.dj_ie .dijitToolbar .dijitComboBox{
+	
+	vertical-align: middle;
+}
+.dj_ie .dijitComboButton {
+	
+	margin-bottom: -3px;
+}
+.dj_webkit .dijitToolbar .dijitDropDownButton {
+	padding-left: 0.3em;
+}
+.dj_gecko .dijitToolbar .dijitButtonNode::-moz-focus-inner {
+	padding:0;
+}
+.dijitButtonNode {
+	
+	border:1px solid gray;
+	margin:0;
+	line-height:normal;
+	vertical-align: middle;
+	#vertical-align: auto;
+	text-align:center;
+	white-space: nowrap;
+}
+.dijitButtonNode, .dijitButtonNode * {
+	cursor: pointer;
+}
+.dijitReadOnly *,
+.dijitDisabled *,
+.dijitReadOnly,
+.dijitDisabled,
+.dijitDisabledClickableRegion {	
+	cursor: not-allowed !important;
+}
+.dj_ie .dijitButtonNode {
+	
+	zoom: 1;
+}
+.dj_ie .dijitButtonNode button {
+	
+	overflow: visible;
+}
+.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: auto;
+	bottom: 0;
+	border-top-width: 1px !important;
+}
+.dijitSpinner .dijitInputLayoutContainer .dijitUpArrowButton {
+	top: 0;
+	bottom: auto;
+}
+TABLE.dijitComboButton {
+	
+	border-collapse: collapse;
+	border:0;
+	padding:0;
+	margin:0;
+}
+.dijitToolbar .dijitComboButton {
+	
+	border-collapse: separate;
+}
+.dj_ie BUTTON.dijitButtonNode {
+	overflow: visible; 
+}
+table .dijitButton .dijitButtonNode,
+table .dijitComboButton .dijitButtonNode {
+	#overflow:hidden; 
+}
+.dijitButtonNode IMG {
+	
+	vertical-align:middle;
+	
+}
+.dijitTextBox,
+.dijitComboBox,
+.dijitSpinner {
+	border: solid black 1px;
+	#overflow: hidden; 
+	width: 15em;	
+	vertical-align: middle;
+	#vertical-align: auto;
+}
+.dijitTimeTextBox {
+	width: 8em;
+}
+.dijitTextBox input:focus,
+.dijitComboBox input:focus,
+.dijitSpinner input:focus {
+	outline: none;	
+}
+.dijitTextBoxFocused,
+.dijitComboBoxFocused,
+.dijitSpinnerFocused, .dijitSpinnerUpArrowActive, .dijitSpinnerDownArrowActive,
+.dijitTextAreaFocused {
+	
+	outline: auto 5px -webkit-focus-ring-color;
+}
+.dijitTextBox INPUT,
+.dijitComboBox INPUT,
+.dijitSpinner INPUT {
+	border-left: solid black 1px;	
+	display:inline;
+	position:static !important;
+	border:0 !important;
+	margin:0 !important;
+	vertical-align:top !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.75em;
+	padding-right: 0.15em;
+	line-height: 160%;
+}
+.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%;
+}
+.dj_ie6 .dijitProgressBarFull {
+	height:1.6em;
+}
+.dijitProgressBarTile {
+	
+	position:absolute;
+	overflow:hidden;
+	top:0;
+	left:0;
+	bottom:0;
+	right:0;
+	margin:0;
+	padding:0;
+	width:auto;
+	height:auto;
+	background-color:#aaa;
+	background-attachment: fixed;
+}
+.dijit_a11y .dijitProgressBarTile{
+	
+	border-width:4px;
+	border-style:solid;
+	background-color:transparent !important;
+}
+.dj_ie6 .dijitProgressBarTile {
+	
+	position:static;
+	
+	height:1.6em;
+}
+.dijitProgressBarIndeterminate .dijitProgressBarLabel {
+	visibility:hidden;
+}
+.dijitProgressBarIndeterminate .dijitProgressBarTile {
+	
+}
+.dijitProgressBarIndeterminateHighContrastImage {
+	display:none;
+}
+.dijit_a11y .dijitProgressBarIndeterminate .dijitProgressBarIndeterminateHighContrastImage {
+	display:block;
+	position:absolute;
+	top:0;
+	bottom:0;
+	margin:0;
+	padding:0;
+	width:100%;
+	height:auto;
+}
+.dijitProgressBarLabel {
+	display:block;
+	position:static;
+	width:100%;
+	text-align:center;
+	background-color:transparent !important;
+}
+.dijitTooltip {
+	position: absolute;
+	z-index: 2000;
+	display: block;
+	
+	left: 50%;
+	top: -10000px;
+	overflow: visible;
+}
+.dijitTooltipContainer {
+	border: solid black 2px;
+	background: #b8b5b5;
+	color: black;
+	font-size: small;
+}
+.dijitTooltipFocusNode {
+	padding: 2px 2px 2px 2px;
+}
+.dijitTooltipConnector {
+	position: absolute;
+}
+.dijitTooltipData {
+	display:none;
+}
+.dijitLayoutContainer{
+	position: relative;
+	display: block;
+	overflow: hidden;
+}
+body .dijitAlignTop,
+body .dijitAlignBottom,
+body .dijitAlignLeft,
+body .dijitAlignRight {
+	position: absolute;
+	overflow: hidden;
+}
+body .dijitAlignClient { position: absolute; }
+.dijitBorderContainer, .dijitBorderContainerNoGutter {
+	position:relative;
+	overflow: hidden;
+}
+.dijitBorderContainerPane,
+.dijitBorderContainerNoGutterPane {
+	position: absolute !important;	
+	z-index: 2;		
+}
+.dijitBorderContainer > .dijitTextArea {
+	
+	resize: none;
+}
+.dijitGutter {
+	
+	position: absolute;
+	font-size: 1px;		
+}
+.dijitSplitter {
+	position: absolute;
+	overflow: hidden;
+	z-index: 10;		
+	background-color: #fff;
+	border-color: gray;
+	border-style: solid;
+	border-width: 0;
+}
+.dj_ie .dijitSplitter {
+	z-index: 1;	
+}
+.dijitSplitterActive {
+	z-index: 11 !important;
+}
+.dijitSplitterCover{
+	position:absolute;
+	z-index:-1;
+	top:0;
+	left:0;
+	width:100%;
+	height:100%;
+}
+.dijitSplitterCoverActive{
+	z-index:3 !important;
+}
+.dj_ie .dijitSplitterCover{
+	background: white;
+	filter: alpha(opacity=0);
+}
+.dijitSplitterH {
+	height: 7px;
+	border-top:1px;
+	border-bottom:1px;
+	cursor: ns-resize;
+}
+.dijitSplitterV {
+	width: 7px;
+	border-left:1px;
+	border-right:1px;
+	cursor: ew-resize;
+}
+.dijitSplitContainer{
+	position: relative;
+	overflow: hidden;
+	display: block;
+}
+.dijitSplitPane{
+	position: absolute;
+}
+.dijitSplitContainerSizerH,
+.dijitSplitContainerSizerV {
+	position:absolute;
+	font-size: 1px;
+	cursor: move;
+	cursor: w-resize;
+	background-color: ThreeDFace;
+	border: 1px solid;
+	border-color: ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight;
+	margin: 0;
+}
+.dijitSplitContainerSizerH .thumb, .dijitSplitterV .dijitSplitterThumb {
+	overflow:hidden;
+	position:absolute;
+	top:49%;
+}
+.dijitSplitContainerSizerV .thumb, .dijitSplitterH .dijitSplitterThumb {
+	position:absolute;
+	left:49%;
+}
+.dijitSplitterShadow,
+.dijitSplitContainerVirtualSizerH,
+.dijitSplitContainerVirtualSizerV {
+	font-size: 1px;
+	background-color: ThreeDShadow;
+	-moz-opacity: 0.5;
+	opacity: 0.5;
+	filter: Alpha(Opacity=50);
+	margin: 0;
+}
+.dj_ie .dijitSplitterV, .dijitSplitContainerVirtualSizerH {
+	cursor: w-resize;
+}
+.dj_ie .dijitSplitterH, .dijitSplitContainerSizerV, .dijitSplitContainerVirtualSizerV {
+	cursor: n-resize;
+}
+.dijit_a11y .dijitSplitterH {
+	border-top:1px solid #d3d3d3 !important;
+	border-bottom:1px solid #d3d3d3 !important;
+}
+.dijit_a11y .dijitSplitterV {
+	border-left:1px solid #d3d3d3 !important;
+	border-right:1px solid #d3d3d3 !important;
+}
+.dijitContentPane {
+	display: block;
+	overflow: auto;	
+}
+.dijitContentPaneSingleChild {
+	
+	overflow: hidden;
+}
+.dijitTitlePane {
+	display: block;
+	overflow: hidden;
+}
+.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;
+}
+.dijitAccordionContainer {
+	border:1px solid #b7b7b7;
+	border-top:0 !important;
+}
+.dj_webkit .dijitAccordionContainer  div:focus {
+	outline:none;
+}
+.dj_ff3 .dijitAccordionContainer  div:focus {
+	outline:none;
+}
+.dijitAccordionTitle {
+	cursor: pointer;
+}
+.dijitAccordionFocused  {
+	text-decoration: underline;
+}
+.dijitAccordionTitle .arrowTextUp,
+.dijitAccordionTitle .arrowTextDown {
+	display: none;
+	font-size: 0.65em;
+	font-weight: normal !important;
+}
+.dijit_a11y .dijitAccordionTitle .arrowTextUp,
+.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 {
+	vertical-align: middle;
+}
+.dijitCalendarDisabledDate {
+	color:gray !important;
+}
+.dijitCalendarPreviousMonthDisabled,
+.dijitCalendarCurrentMonthDisabled,
+.dijitCalendarNextMonthDisabled {
+	cursor:default !important
+}
+.dijitCalendarIncrementControl,
+.dijitCalendarBodyContainer tbody tr td,
+.dijitCalendarDateTemplate,
+.dijitCalendarContainer .dijitInline {
+	cursor:pointer;
+}
+.dijitSpacer {
+	
+  	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;
+}
+.dj_webkit .dijitMenuTable td[colspan="2"]{
+	border-right:hidden;
+}
+.dijitMenuItem{
+	text-align: left;
+	white-space: nowrap;
+	padding:.1em .2em;
+	cursor:pointer;
+}
+.dijitMenuPassive .dijitMenuItemHover,
+.dijitMenuItemSelected {
+	
+	background-color:black;
+	color:white;
+}
+.dijitMenuItemIcon, .dijitMenuExpand {
+	background-repeat: no-repeat;
+}
+.dijitMenuItemDisabled * {
+	
+	opacity:0.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 .dijitMenuItemSelected {
+	border: 1px #fff dotted !important;
+}
+.dj_ff3 .dijit_a11y .dijitMenuItem td {
+	padding: none !important;
+	background:none ! important;
+}
+.dijit_a11y .dijitMenuItemSelected .dijitMenuItemLabel {
+	border-width: 1px;
+	border-style: solid;
+}
+.dj_ie8 .dijit_a11y .dijitMenuItemLabel {
+	position:static;
+}
+.dijitMenuExpandA11y {
+	display: none;
+}
+.dijit_a11y .dijitMenuExpandA11y {
+	display: inline;
+}
+.dijitMenuSeparator td {
+	border: 0;
+	padding: 0;
+}
+.dijitMenuSeparatorTop {
+	height: 50%;
+	margin: 0;
+	margin-top:3px;
+	font-size: 1px;
+}
+.dijitMenuSeparatorBottom {
+	height: 50%;
+	margin: 0;
+	margin-bottom:3px;
+	font-size: 1px;
+}
+.dijitCheckedMenuItemIconChar {
+	vertical-align: middle;
+	visibility:hidden;
+}
+.dijitCheckedMenuItemChecked .dijitCheckedMenuItemIconChar {
+	visibility: visible;
+}
+.dijit_a11y .dijitCheckedMenuItemIconChar {
+	display:inline !important;
+}
+.dijit_a11y .dijitCheckedMenuItemIcon {
+	display: none;
+}
+.dijitStackController .dijitToggleButtonChecked * {
+	cursor: default;	
+}
+.dijitTabContainerNoLayout {
+	width: 100%;	
+}
+.dijitTabContainerBottom-tabs,
+.dijitTabContainerTop-tabs,
+.dijitTabContainerLeft-tabs,
+.dijitTabContainerRight-tabs {
+	overflow: visible !important;  
+}
+.dijitTabContainerBottom-container,
+.dijitTabContainerTop-container,
+.dijitTabContainerLeft-container,
+.dijitTabContainerRight-container {
+	z-index:0;
+	overflow: hidden;
+	border: 1px solid black;
+}
+.dijitTabContainer .nowrapTabStrip {
+	width: 50000px;
+	display: block;
+	position: relative;
+}
+.dijitTabContainer .dijitTabListWrapper {
+	overflow: hidden;
+}
+.dijit_a11y .dijitTabContainer .tabStripButton img {
+	
+	display: none;
+}
+.dijitTabContainerTop-tabs {
+	border-bottom: 1px solid black;
+}
+.dijitTabContainerTop-container {
+	border-top: 0px;
+}
+.dijitTabContainerLeft-tabs {
+	border-right: 1px solid black;
+	float: left;
+}
+.dijitTabContainerLeft-container {
+	border-left: 0px;
+}
+.dijitTabContainerBottom-tabs {
+	border-top: 1px solid black;
+}
+.dijitTabContainerBottom-container {
+	border-bottom: 0px;
+}
+.dijitTabContainerRight-tabs {
+	border-left: 1px solid black;
+	float: left;
+}
+.dijitTabContainerRight-container {
+	border-right: 0px;
+}
+div.dijitTabBtnDisabled, .dj_ie div.dijitTabBtnDisabled {
+	cursor: auto;
+}
+.dijitTab {
+	position:relative;
+	cursor:pointer;
+	white-space:nowrap;
+	z-index:3;
+}
+.dijitTab * {
+	
+	vertical-align: middle;
+}
+.dijitTabChecked {
+	cursor: default;	
+}
+.dijitTabButtonIcon {
+	height: 18px;
+}
+.dijitTabContainerTop-tabs .dijitTab {
+	top: 1px;	
+}
+.dijitTabContainerBottom-tabs .dijitTab {
+	top: -1px;	
+}
+.dijitTabContainerLeft-tabs .dijitTab {
+	left: 1px;	
+}
+.dijitTabContainerRight-tabs .dijitTab {
+	left: -1px;	
+}
+.dijitTabContainerTop-tabs .dijitTab,
+.dijitTabContainerBottom-tabs .dijitTab {
+	
+	display:inline-block;			
+	#zoom: 1; 
+	#display:inline; 
+}
+.dijitTabInnerDiv {
+	position:relative;
+}
+.tabStripButton {
+	z-index: 12;
+}
+.dijitTabButtonDisabled .tabStripButton {
+	display: none;
+}
+.dijitTab .closeButton {
+	margin-left: 1em;
+}
+.dijitTab .closeText {
+	display:none;
+}
+.dijit_a11y .closeText {
+	display:inline;
+	margin: 0px 6px;
+}
+.dijit_a11y .dijitTab .closeImage {
+	display:none;
+}
+.dijit_a11y .closeButton-hover .closeText {
+	border:thin solid;
+}
+.dijit_a11y .dijitTabChecked {
+	border-style:dashed !important;
+}
+.dijit_a11y .dijitTabInnerDiv {
+	border-left:none !important;
+ }
+.dijitTabPane,
+.dijitStackContainer-child,
+.dijitAccordionContainer-child {
+	
+    border: 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 {
+}
+.dijitTreeIndent {
+	
+	width: 19px;
+}
+.dijitTreeRow, .dijitTreeContent {
+	white-space: nowrap;
+}
+.dijitTreeRow img {
+	
+	vertical-align: middle;
+}
+.dijitTreeContent {
+    cursor: default;
+}
+.dijitExpandoText {
+	display: none;
+}
+.dijit_a11y .dijitExpandoText {
+	display: inline;
+	padding-left: 10px;
+	padding-right: 10px;
+	font-family: monospace;
+	border-style: solid;
+	border-width: thin;
+	cursor: pointer;
+}
+.dijitTreeLabel {
+	margin: 0px 4px;
+}
+.dijitDialog {
+	position: absolute;
+	z-index: 999;
+	padding: 1px;
+	overflow: hidden;       
+}
+.dijitDialogFixed div.dijitDialogTitleBar {
+	cursor:default;
+}
+.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;
+}
+.dijitSliderBarContainerV {
+	position:relative;
+	height:100%;
+	z-index:1;
+}
+.dijitSliderBarContainerH {
+	position:relative;
+	z-index:1;
+}
+.dijitSliderBarH {
+	height:4px;
+	border-width:1px 0;
+}
+.dijitSliderBarV {
+	width:4px;
+	border-width:0 1px;
+}
+.dijitSliderProgressBar {
+	background-color:red;
+	z-index:1;
+}
+.dijitSliderProgressBarV {
+	position:static !important;
+	height:0%;
+	vertical-align:top;
+	text-align:left;
+}
+.dijitSliderProgressBarH {
+	position:absolute !important;
+	width:0%;
+	vertical-align:middle;
+	overflow:visible;
+}
+.dijitSliderRemainingBar {
+	overflow:hidden;
+	background-color:transparent;
+	z-index:1;
+}
+.dijitSliderRemainingBarV {
+	height:100%;
+	text-align:left;
+}
+.dijitSliderRemainingBarH {
+	width:100% !important;
+}
+.dijitSliderBumper {
+	overflow:hidden;
+	z-index:1;
+}
+.dijitSliderBumperV {
+	width:4px;
+	height:8px;
+	border-width:0 1px;
+}
+.dijitSliderBumperH {
+	width:8px;
+	height:4px;
+	border-width:1px 0;
+}
+.dijitSliderBottomBumper,
+.dijitSliderLeftBumper {
+	background-color:red;
+}
+.dijitSliderTopBumper,
+.dijitSliderRightBumper {
+	background-color:transparent;
+}
+.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;
+}
+.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,
+.dijit_a11y .dijitTab .tabLabel {
+	display: inline !important;
+}
+.dj_ie7 .dijitButtonNode > BUTTON.dijitButtonContents > * {
+	position: relative; 
+}
+.dijitTextArea {
+	width:100%;
+	overflow-y: auto;	
+}
+.dijitTextArea[cols] {
+	width:auto; 
+}
+.dj_ie .dijitTextAreaCols {
+	width:auto;
+}
+.dijitTextArea > DIV {
+	text-decoration:none;
+	overflow:auto;
+	min-height: 1.40em;
+}
+.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));
+}
+.RichTextEditable {
+	display: block;	
+}
+.dijitTimePickerItemInner {
+	text-align:center;
+	border:0;
+	padding:2px 8px 2px 8px;
+}
+.dijitTimePickerTick,
+.dijitTimePickerMarker {
+	border-bottom:1px solid gray;
+}
+.dijitTimePicker .dijitDownArrowButton {
+	border-top: none !important;
+}
+.dijitTimePickerTick {
+	color:#CCC;
+}
+.dijitTimePickerMarker {
+	color:black;
+	background-color:#CCC;
+}
+.dijitTimePickerItemSelected {
+	font-weight:bold;
+	color:#333;
+	background-color:#b7cdee;
+}
+.dijitTimePickerItemHover {
+	background-color:gray;
+	color:white;
+	cursor:pointer;
+}
+.dijit_a11y .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;
+}
+.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;
+}
+.dijitSelect {
+	margin: 0.2em;
+}
+.dj_ie .dijitSelect,
+.dj_ie7 .dijitSelect,
+.dj_iequirks .dijitSelect {
+	vertical-align: middle; 
+}
+.dj_ie8 .dijitSelect .dijitButtonText {
+	vertical-align: top;
+}
+.dijitSelect .dijitButtonNode {
+	text-align: left;
+}
+.dijitRtl .dijitSelect .dijitButtonNode {
+	text-align: right;
+}
+.dijitToolbar .dijitSelect {
+	margin: 0;
+}
+.dj_webkit .dijitToolbar .dijitSelect {
+	padding-left: 0.3em;
+}
+.dijit_a11y .dijitSelectDisabled .dijitButtonNode {
+	border-style: outset!important;
+	border-width: medium!important;
+	border-color: #999 !important;
+	color:#999 !important;
+}
+.dijitSelect .dijitButtonContents {
+	padding: 0px;
+	background: transparent none;
+}
+.dijitSelectFixedWidth .dijitButtonContents {
+	width: 100%;
+}
+.dijitSelect .dijitArrowButton {
+	width: 16px;
+}
+.dj_ie6 .dijitSelectMenu .dijitMenuItemLabel,
+.dj_ie7 .dijitSelectMenu .dijitMenuItemLabel {
+	
+	position: static;
+}
+.dijitSelectLabel *
+{
+	vertical-align: baseline;
+}
+.dijitSelectSelectedOption * {
+	font-weight: bold;
+}
+.dijitSelectMenu {
+	border-width: 1px;
+}
+.dijitSelect .dijitButtonContents {
+	white-space: nowrap;
+}
+.dijitSelectMenu .dijitMenuTable {
+	margin: 0px;
+	background-color: transparent;
+}
+.dijitTextBoxReadOnly,
+.dijitComboBoxReadOnly,
+.dijitSpinnerReadOnly,
+.dijitTextAreaReadOnly,
+.dijitTextBoxDisabled,
+.dijitComboBoxDisabled,
+.dijitSpinnerDisabled,
+.dijitTextAreaDisabled {
+	color: gray;
+}
+.dj_webkit .dijitTextBoxDisabled INPUT,
+.dj_webkit .dijitComboBoxDisabled INPUT,
+.dj_webkit .dijitSpinnerDisabled INPUT {
+	color: #eee;
+}
+.dj_webkit INPUT.dijitTextBoxDisabled,
+.dj_webkit TEXTAREA.dijitTextAreaDisabled {
+	color: #333; 
+}
+.dijit_a11y .dijitSliderReadOnly,
+.dijit_a11y .dijitSliderDisabled {
+	opacity:0.6;
+}
+.dj_ie .dijit_a11y .dijitSliderReadOnly .dijitSliderBar,
+.dj_ie .dijit_a11y .dijitSliderDisabled .dijitSliderBar {
+	filter: alpha(opacity=40);
+}
+.dijit_a11y .dijitSlider .dijitSliderButtonContainer DIV {
+	font-family: monospace; 
+	font-size: 1em;
+	line-height: 1em;
+	height: auto;
+	width: auto;
+	margin: 0px 4px;
+}
+.dijitForceStatic {
+    position: static !important;
+}
 .nihilo .dojoDndItemBefore {
 	border-top: 2px solid #369;
 }
@@ -34,8 +1487,79 @@
     background-color: #fff;		
     padding: 5px;
 }
- 
- 
+.nihilo .dijitMenu,
+.nihilo .dijitMenuBar {
+	border: 1px solid #d3d3d3;
+	margin: 0px;
+	padding: 0px;
+	background-color: #fff;
+}
+.nihilo .dijitBorderContainer .dijitMenuBar {
+	border: 1px #ccc solid;
+}
+.nihilo .dijitMenuItem {
+	font-family: sans-serif;
+	margin: 0px;
+	color: #243C5F;
+}
+.nihilo .dijitMenuBar .dijitMenuItem {
+	padding: 4px 5px;
+}
+.nihilo .dijitMenuPreviousButton, .nihilo .dijitMenuNextButton {
+	font-style: italic;
+}
+.nihilo .dijitMenuItem TD {
+	padding:1px;
+}
+.nihilo .dijitMenuPassive .dijitMenuItemHover,
+.nihilo .dijitMenuItemSelected {
+	background-color: #ffe284; 
+	color: #243C5F;
+}
+.nihilo .dijitMenuItemIcon {
+	width: 15px;
+	height: 15px;
+}
+.nihilo .dijitMenuExpand {
+	width:15px;
+	height:15px;
+	background-image: url(images/spriteRoundedIconsSmall.png);
+	background-position: -30px top;
+}
+.dj_ie6 .nihilo .dijitMenuExpand {
+	background-image:url(images/spriteRoundedIconsSmall.gif);
+}
+.nihilo .dijitMenuSeparator {
+	height: 1px;
+}
+.nihilo .dijitMenuSeparatorTop {
+	border-bottom: 1px solid #fff; 
+}
+.nihilo .dijitMenuSeparatorBottom {
+	border-top: 1px solid #d3d3d3;
+}
+.nihilo .dijitCheckedMenuItemIconChar {
+	display: none;
+}
+.nihilo .dijitCheckedMenuItemIcon {
+	background-image: url(images/spriteCheckbox.gif);
+	background-position: -80px;
+}
+.nihilo .dijitCheckedMenuItemChecked .dijitCheckedMenuItemIcon {
+	background-position: -64px;
+}
+.nihilo .dijitTabContainer .tabStripRBtn {
+	margin-right: 21px;
+}
+.nihilo .dijitTabContainer .tabStripLBtn {
+	margin-left: 21px;
+}
+.nihilo .dijitTabContainerBottom .nowrapTabStrip .dijitTab {
+	top: 0px;
+}
+.nihilo .dijitTabContainer .tabStripMenuButton-Hover {
+	cursor: pointer;
+}
 .nihilo .dijitTabPaneWrapper {
 	background:#fff;
 	border:1px solid #ccc;
@@ -57,13 +1581,10 @@
 	border-bottom: 1px #ccc solid;
 }
 .nihilo .dijitTabInnerDiv .dijitTabContent {
-	padding:5px 3px 4px 4px;
+	padding:3px 3px 3px 4px;
 	background: url(images/tabContainerSprite.gif) repeat-x 0 -350px;
 	position: relative;
 }
-.dijitTabSpacer {
-	font-size: 1px;
-}
 .nihilo .dijitTabHover {
 	color: #243C5F;
 	background: url(images/tabContainerSprite.gif) no-repeat 0px -150px;
@@ -87,6 +1608,9 @@
 	background: url(images/tabContainerSprite.gif) repeat-x 0 -50px;
 	color: #243C5F !important;
 }
+.nihilo .dijitTabContainerNested .dijitTabListWrapper {
+	height: auto;
+}
 .nihilo .dijitTabContainerTabListNested {
 	background: #FDFDFD;
 	border: none;
@@ -120,8 +1644,9 @@
 	background: url(images/spriteRoundedIconsSmall.png) no-repeat -60px top;
 	width: 15px;
 	height: 15px;
+	margin-top: -1px;
 }
-.dj_ie6 .dijitTab .closeImage {
+.dj_ie6 .nihilo .dijitTab .closeImage {
 	background: url(images/spriteRoundedIconsSmall.gif) no-repeat -60px top;
 }
 .nihilo .dijitTab .closeButton-hover .closeImage {
@@ -130,34 +1655,63 @@
 .dj_ie6 .nihilo .dijitTab .closeButton-hover .closeImage {
 	background: url(images/spriteRoundedIconsSmall.gif) no-repeat -60px -15px;
 }
-.nihilo .dijitTab .dijitTabButtonSpacer {
-	height: 15px;
+.nihilo .dijitTab .tabLabel {
+	
+	min-height: 15px;
+	display: inline-block;
+}
+.dj_ie6 .nihilo .dijitTabButtonIcon {
+	
+	height: 18px;
 	width: 1px;
 }
 .nihilo .dijitTabContainerTop-tabs {
-	margin-bottom: -1px;
-	border-color: #ccc;
+	border-bottom: none;
+	padding-bottom: 1px;
+	background-position: bottom;
 	padding-left: 3px;
 }
+.dj_ie6 .nihilo .dijitTabListContainer-top,
+.dj_ie7 .nihilo .dijitTabListContainer-top {
+	z-index: 3;
+}
+.dj_ie6 .nihilo .dijitTabContainerTop-tabs,
+.dj_ie7 .nihilo .dijitTabContainerTop-tabs {
+	border-bottom: 1px solid #ccc;
+	padding-bottom: 0px;
+}
+.nihilo .dijitTabContainerTopNoStrip {
+	padding-top: 3px;
+}
 .nihilo .dijitTabContainerTop-container {
 	border-top: none;
 }
 .nihilo .dijitTabContainerTop-tabs .dijitTabChecked {
 	border-bottom-color: #f8f8f8;
 }
-.nihilo .dijitTabContainerTopStrip {
-	border: 1px solid #ccc;
-	padding-top: 2px;
-	padding-left: 3px;
-}
-.nihilo .dijitTabContainerTopStrip {
+.nihilo .dijitTabContainer .dijitTabContainerTopStrip {
+	border-bottom: none;
+	padding-top: 1px;
+	margin-top: 1px;
 	background: #f2f2f2;
+	border-top: 1px solid #CCC;
+	border-right: 1px solid #CCC;
+	border-left: 1px solid #CCC;
 }
 .nihilo .dijitTabContainerBottom-tabs {
-	margin-top: -1px;
-	border-color: #ccc;
+	border-top: none;
+	background-position: top;
 	padding-left: 3px;
 }
+.dj_ie6 .nihilo .dijitTabListContainer-bottom,
+.dj_ie7 .nihilo .dijitTabListContainer-bottom {
+	z-index: 3;
+}
+.dj_ie6 .nihilo .dijitTabContainerBottom-tabs,
+.dj_ie7 .nihilo .dijitTabContainerBottom-tabs {
+	border-top: 1px solid #ccc;
+	margin-top: -1px;
+}
 .nihilo .dijitTabContainerBottom-container {
 	border-bottom: none;
 }
@@ -167,11 +1721,11 @@
 	background: url(images/tabBottomEnabledSpriteLR.gif) no-repeat bottom left;
 }
 .nihilo .dijitTabContainerBottom-tabs .dijitTabChecked {
-	border-top-color:#f8f8f8;
+	border-top-color: #f8f8f8;
 }
 .nihilo .dijitTabContainerBottom-tabs .dijitTabInnerDiv .dijitTabContent {
-	padding-top: 4px;
-	padding-bottom: 5px;
+	padding-top: 3px;
+	padding-bottom: 3px;
 	background: url(images/tabBottomEnabledC.gif) repeat-x bottom left;
 }
 .nihilo .dijitTabContainerBottom-tabs .dijitTabInnerDiv {
@@ -199,13 +1753,11 @@
 .nihilo .dijitTabContainerBottom-tabs .dijitTabChecked .dijitTabInnerDiv .dijitTabContent {
 	background: url(images/tabBottomActiveC.gif) repeat-x bottom left;
 }
-.nihilo .dijitTabContainerBottomStrip {
-	padding-bottom: 2px;
-	padding-left: 3px;	
+.nihilo .dijitTabContainer .dijitTabContainerBottomStrip {
 	border: 1px solid #ccc;
-}
-.nihilo .dijitTabContainerBottomStrip {
 	background: #f2f2f2;
+	border-top: none;
+	padding-bottom: 2px;
 }
 .nihilo .dijitTabContainerBottom-spacer,
 .nihilo .dijitTabContainerTop-spacer {
@@ -213,11 +1765,19 @@
 	border: 1px solid #ccc;
 	background: #f8f8f8;
 }
+.nihilo  .dijitTabContainerTop-spacer {
+	margin-top: -1px;
+}
+.nihilo .dijitTabContainerBottom-spacer {
+	margin-bottom: -1px;
+}
 .nihilo .dijitTabContainerRight-tabs {
-	margin-left: -1px;
 	border-color: #ccc;
 	padding-top: 3px;
 }
+.nihilo .dijitTabContainerRight .dijitTabListWrapper {
+	padding-right: 3px;
+}
 .nihilo .dijitTabContainerRight-container {
 	border-right: none;
 }
@@ -247,14 +1807,11 @@
 }
 .nihilo .dijitTabContainerRightStrip {
 	padding-right: 2px;
-	padding-top: 3px;	
 	border: 1px solid #ccc;
-}
-.nihilo .dijitTabContainerRightStrip {
+	border-left: none;
 	background: #f2f2f2;
 }
 .nihilo .dijitTabContainerLeft-tabs {
-	margin-right: -1px;
 	border-color: #ccc;
 	padding-top: 3px;
 }
@@ -283,12 +1840,12 @@
 	border-bottom: solid #efefef 1px;
 }
 .dj_ie .nihilo .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
-border-bottom: solid #fff 1px;
+	border-bottom: solid #fff 1px;
 }
 .nihilo .dijitTabContainerLeftStrip {
 	padding-left: 2px;
-	padding-top: 3px;	
 	border: 1px solid #ccc;
+	border-right: none;
 }
 .nihilo .dijitTabContainerLeftStrip {
 	background: #f2f2f2;
@@ -304,12 +1861,78 @@ border-bottom: solid #fff 1px;
 	border: 1px solid #ccc;
 	background: #f8f8f8;
 }
+.nihilo .dijitTabContainerRight-spacer {
+	border-right: none;
+}
+.nihilo .dijitTabContainerRight-tabs {
+	padding-top: 3px;
+	height: 100%;
+}
+.nihilo .dijitTabContainerLeft-tabs {
+	height: 100%;
+}
+.nihilo .dijitTabContainerLeft-spacer {
+	border-left: none;
+}
 .nihilo .dijitTabContainerTop-dijitContentPane .dijitTabContainerTop-tabs {
 	border-left: 0px solid #ccc;
 	border-top: 0px solid #ccc;
 	border-right: 0px solid #ccc;
 	padding-top: 0px;
-	padding-left: 0px;	
+	padding-left: 0px;
+}
+.nihilo .dijitTabContainer .tabStripButton {
+	margin-right: 0px;
+}
+.nihilo .tabStripButton .dijitTabInnerDiv .dijitTabContent {
+	padding: 5px 0 6px;
+}
+.dj_ie6 .nihilo .tabStripButton .dijitTabInnerDiv .dijitTabContent,
+.dj_ie7 .nihilo .tabStripButton .dijitTabInnerDiv .dijitTabContent,
+.dj_opera .nihilo .tabStripButton .dijitTabInnerDiv .dijitTabContent {
+	padding-bottom: 7px;
+}
+.nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent {
+	padding: 3px 0 5px;
+}
+.dj_ie6 .nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent,
+.dj_ie7 .nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent,
+.dj_opera .nihilo .tabStrip-disabled .tabStripButton .dijitTabInnerDiv .dijitTabContent {
+	padding-top: 4px;
+}
+.nihilo .dijitTabContainer .tabStripButton {
+	
+	width: 21px;
+}
+.nihilo .dijitTabContainer .tabStripButton img {
+	height: 14px;
+	background: url(images/spriteRoundedIconsSmall.png) no-repeat left top ;
+}
+.dj_ie6 .nihilo .dijitTabContainer .tabStripButton img {
+	background-image: url(images/spriteRoundedIconsSmall.gif);
+}
+.nihilo .dijitTabContainer .tabStripSlideButtonRight img {
+	background-position: -30px top;
+}
+.nihilo .dijitTabContainer .tabStripMenuButton img {
+	background-position: -15px top;
+}
+.nihilo .dijitTabContainerTopNone {
+	padding-top: 0px;
+}
+.nihilo .dijitTabContainer .tabStripButton-top {
+	margin-top: 1px;
+}
+.nihilo .dijitTabContainer .tabStripButton-bottom {
+	background: transparent url(images/tabBottomEnabledSpriteLR.gif) no-repeat scroll left bottom;
+	border-bottom: medium none;
+	border-top: 1px solid #CCCCCC;
+}
+.nihilo .dijitTabContainer .tabStripButton-bottom .dijitTabInnerDiv {
+	background: transparent url(images/tabBottomEnabledSpriteLR.gif) no-repeat scroll right bottom;
+}
+.nihilo .dijitTabContainer .tabStripButton-bottom .dijitTabContent {
+	background: transparent;
 }
 .nihilo .dijitAccordionContainer {
 	border-color: #ccc;
@@ -330,7 +1953,7 @@ border-bottom: solid #fff 1px;
 	border-top: 1px solid #dedede;
 	border-bottom: 1px solid #dedede;
 	padding: 5px 4px 5px 8px;
-	cursor: default;	
+	cursor: default;
 	color: #243C5F;
 }
 .nihilo .dijitAccordionArrow {
@@ -347,7 +1970,6 @@ border-bottom: solid #fff 1px;
 	margin-left: 4px;
 	margin-right: 4px;
 }
- 
 .nihilo .dijitSplitContainerSizerH {
 	background:url(images/splitContainerSizerV.png) repeat-y #fff;
 	border:0;
@@ -374,7 +1996,6 @@ border-bottom: solid #fff 1px;
 	width:19px;
 	height:5px;
 }
- 
 .nihilo .dijitBorderContainer {
 	background-color: #fcfcfc;
 	padding: 5px;
@@ -405,10 +2026,10 @@ border-bottom: solid #fff 1px;
 	height:5px;
 }
 .nihilo .dijitSplitterH .dijitSplitterThumb {
-	background:url(images/splitContainerSizerH-thumb.png) no-repeat;
-	top:1px;
+	background:#8BA0BD none;
+	height:1px;
+	top:2px;
 	width:19px;
-	height:2px;
 }
 .nihilo .dijitSplitterV,
 .nihilo .dijitGutterV {
@@ -419,10 +2040,10 @@ border-bottom: solid #fff 1px;
 	width:5px;
 }
 .nihilo .dijitSplitterV .dijitSplitterThumb {
-	background:url(images/splitContainerSizerV-thumb.png) no-repeat;
-	left:1px;
+	background:#8BA0BD none;
 	height:19px;
-	width:5px;
+	left:2px;
+	width:1px;
 }
 .nihilo .dijitSplitterActive {
 	font-size: 1px;
@@ -465,18 +2086,6 @@ border-bottom: solid #fff 1px;
 	border-color: #d3d3d3;
 	border-left: 1px solid #d3d3d3;
 }
-.nihilo .dijitTextBoxDisabled,
-.nihilo .dijitComboBoxDisabled,
-.nihilo .dijitSpinnerDisabled,
-.nihilo .dijitTextAreaDisabled {
-	color: gray;
-}
-.dj_webkit .nihilo .dijitTextBoxDisabled,
-.dj_webkit .nihilo .dijitComboBoxDisabled,
-.dj_webkit .nihilo .dijitSpinnerDisabled,
-.dj_webkit .nihilo .dijitTextareaDisabled {
-	color: #eee;
-}
 .nihilo .dijitTextBoxFocused,
 .nihilo .dijitComboBoxFocused,
 .nihilo .dijitSpinnerFocused, .nihilo .dijitSpinnerUpArrowActive, .nihilo .dijitSpinnerDownArrowActive,
@@ -525,16 +2134,18 @@ border-bottom: solid #fff 1px;
 	
 	border:1px solid #dedede;
 	border-bottom:1px solid #dedede;
-	padding: 0.1em 0.2em 0.2em 0.2em; 
+	padding: 0.1em 0.2em 0.2em 0.2em;
 	background: #fff url(images/buttonEnabled.png) repeat-x top left;
 }
-.nihilo .dijitButtonNode button { 
-	border: 0px; 
-	background-color: transparent; 
-} 
- 
+.nihilo .dijitSelect .dijitButtonContents {
+	border-right: none;
+}
+.nihilo .dijitButtonNode button {
+	border: 0px;
+	background-color: transparent;
+}
 .nihilo .dijitButtonText {
-	text-align: center; 
+	text-align: center;
 	padding: 0 0.3em;
 }
 .nihilo .dijitComboBox .dijitButtonNode {
@@ -546,10 +2157,9 @@ border-bottom: solid #fff 1px;
 .nihilo .dijitComboButton .dijitDownArrowButton {
 	padding-right:4px;
 }
-.dj_ff2 .nihilo .dijitComboButton .dijitButtonContentsFocused,
-.dj_ff2 .nihilo .dijitComboButton .dijitDownArrowButtonFocused {
-	border: 1px black dotted !important;
-}
+.nihilo .dijitComboBoxReadOnly,
+.nihilo .dijitSpinnerReadOnly,
+.nihilo .dijitSpinnerReadOnly .dijitButtonNode,
 .nihilo .dijitButtonDisabled .dijitButtonNode,
 .nihilo .dijitToggleButtonDisabled .dijitButtonNode,
 .nihilo .dijitDropDownButtonDisabled .dijitButtonNode,
@@ -560,7 +2170,11 @@ border-bottom: solid #fff 1px;
 	
 	border-color: #dedede;
 	background:#fafafa url(images/buttonDisabled.png) top repeat-x;
-	opacity: 0.60; 
+	opacity: 0.60;
+}
+.dj_ie6 .nihilo .dijitComboButtonDisabled .dijitButtonText {
+	
+	color: #aaa;
 }
 .nihilo .dijitButtonHover .dijitButtonNode,
 .nihilo .dijitButtonNodeHover,
@@ -590,20 +2204,22 @@ border-bottom: solid #fff 1px;
 	background: #f5f5f5 url(images/buttonActive.png) top left repeat-x;
 }
 .nihilo .dijitArrowButtonInner {
-	background:url(images/spriteArrows.png) no-repeat left top;
+	background-image: url(images/spriteArrows.png);
+	background-repeat: no-repeat;
+	background-position: 0px top;
 	width: 11px;
 }
-.nihilo .dijitUpArrowButton .dijitArrowButtonInner { 
-	background:url(images/spriteArrows.png) no-repeat -22px top; 
-	width: 11px;
+.nihilo .dijitLeftArrowButton .dijitArrowButtonInner {
+	background-position: -11px top;
 }
-.dj_ie6 .nihilo .dijitArrowButtonInner {
-	background:url(images/spriteArrows.gif) no-repeat left top;
-	width: 11px;
+.nihilo .dijitUpArrowButton .dijitArrowButtonInner {
+	background-position: -22px top;
 }
-.dj_ie6 .nihilo .dijitUpArrowButton .dijitArrowButtonInner {
-	background:url(images/spriteArrows.gif) no-repeat -22px top;
-	width: 11px;
+.nihilo .dijitRightArrowButton .dijitArrowButtonInner {
+	background-position: -33px top;
+}
+.dj_ie6 .nihilo .dijitArrowButtonInner {
+	background-image: url(images/spriteArrows.gif);
 }
 .nihilo .dijitComboBox .dijitArrowButton .dijitArrowButtonInner {
 	background:url(images/spriteArrows.png) no-repeat left center;
@@ -723,7 +2339,7 @@ border-bottom: solid #fff 1px;
 	
 }
 .nihilo .dijitSliderFocused .dijitSliderBar {
-	border-color:#727272;	
+	border-color:#727272;
 }
 .dijit_a11y .dijitSliderProgressBar {
 	background-color:#333 !important;
@@ -791,21 +2407,84 @@ border-bottom: solid #fff 1px;
 	background:url(images/spriteRoundedIconsSmall.png) no-repeat -15px top;
 	#background:url(images/spriteRoundedIconsSmall.gif) no-repeat -15px top;
 }
-.nihilo .dijitSliderDecrementIconH { 
-	background:url(images/spriteRoundedIconsSmall.png) no-repeat 0px top; 
-	#background:url(images/spriteRoundedIconsSmall.gif) no-repeat 0px top; 
+.nihilo .dijitSliderDecrementIconH {
+	background:url(images/spriteRoundedIconsSmall.png) no-repeat 0px top;
+	#background:url(images/spriteRoundedIconsSmall.gif) no-repeat 0px top;
 }
 .nihilo .dijitSliderButtonInner {
 	visibility:hidden;
 }
-.nihilo .dijitSliderDisabled {
-	opacity:0.6 !important;
+.nihilo .dijitSliderReadOnly *,
+.nihilo .dijitSliderDisabled * {
+	border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
+	color: #bdbdbd;
+}
+.nihilo .dijitSliderReadOnly .dijitSliderDecrementIconH,
+.nihilo .dijitSliderDisabled .dijitSliderDecrementIconH {
+	background-position: 0px -15px;
+}
+.nihilo .dijitSliderReadOnly .dijitSliderIncrementIconH,
+.nihilo .dijitSliderDisabled .dijitSliderIncrementIconH {
+	background-position: -30px -15px;
+}
+.nihilo .dijitSliderReadOnly .dijitSliderDecrementIconV,
+.nihilo .dijitSliderDisabled .dijitSliderDecrementIconV {
+	background-position: -15px -15px;
+}
+.nihilo .dijitSliderReadOnly .dijitSliderIncrementIconV,
+.nihilo .dijitSliderDisabled .dijitSliderIncrementIconV {
+	background-position: -45px -15px;
+}
+.nihilo .dijitSelectDisabled * {
+    cursor: not-allowed !important;
+}
+.nihilo .dijitSelectReadOnly * {
+    cursor: default !important;
+}
+.nihilo .dijitSelect .dijitButtonNode {
+	padding: 0px;
+}
+.nihilo .dijitSelect .dijitButtonContents {
+	padding-top: 1px;
+    background:#fff url(images/validationInputBg.png) repeat-x top left;
+    #background:#fff url(images/validationInputBg.gif) repeat-x top left;
+}
+.nihilo .dijitSelectHover .dijitButtonContents,
+.nihilo .dijitSelectActive .dijitButtonContents,
+.nihilo .dijitSelectOpened .dijitButtonContents,
+.nihilo .dijitSelectDisabled .dijitButtonContents,
+.nihilo .dijitSelectReadOnly .dijitButtonContents{
+	background: transparent none;
+}
+.dj_ie .nihilo .dijitSelect .dijitButtonContents {
+	padding-top: 0px;
+}
+.nihilo .dijitSelectDisabled .dijitButtonNode {
+    border-color: #dedede;
+    background:#fafafa url(images/buttonDisabled.png) top repeat-x;
 }
-.dj_ie .nihilo .dijitSliderDisabled,
-.dj_ie .nihilo .dijitSliderDisabled .dijitRuleContainer,
-.dj_ie .nihilo .dijitSliderDisabled .dijitSliderRemainingBar,
-.dj_ie .nihilo .dijitSliderDisabled .dijitSliderProgressBar {
-	filter: gray() alpha(opacity=40);
+.dj_ie .nihilo .dijitSelectDisabled  .dijitButtonNode * {
+	filter: gray() alpha(opacity=50);
+}
+.nihilo .dijitSelectHover .dijitButtonNode {
+    color:#000;
+    background:#fcfcfc url(images/buttonHover.png) repeat-x top left;
+}
+.nihilo .dijitSelectActive .dijitButtonNode,
+.nihilo .dijitSelectOpened .dijitButtonNode {
+    border-color:#dedede;
+    background: #f5f5f5 url(images/buttonActive.png) top left repeat-x;
+}
+.nihilo .dijitSelectMenu td {
+	padding: 0em;
+}
+.nihilo .dijitSelectMenu .dijitMenuItemIcon {
+	margin: 0.1em 0.2em;
+	display: none;
+}
+.nihilo .dijitSelectMenu .dijitMenuItemLabel,
+.nihilo .dijitSelectMenu .dijitMenuArrowCell {
+	padding: 0.1em 0.2em;
 }
 .nihilo .dijitTreeNode {
     background : url(images/treeI.gif) no-repeat;
@@ -824,7 +2503,7 @@ border-bottom: solid #fff 1px;
 }
 .nihilo .dijitTreeLabel {
 	font-weight: normal;
-	margin-left: 3px;	
+	margin-left: 3px;
 }
 .nihilo .dijitTreeIsRoot {
     margin-left: 0;
@@ -916,32 +2595,32 @@ border-bottom: solid #fff 1px;
 	
 	background:#cad2de url(images/progressBarAnim.gif) repeat-x center center;
 }
- 
- 
 .nihilo .dijitTitlePaneTitle {
 	background: #cccccc;
 	background:#fff url(images/titleBar.png) repeat-x top left;
 	border:1px solid #bfbfbf;
 	padding:3px 4px;
-	cursor: pointer;
 	font-size: 0.9em;
 	font-weight: bold;
 	color: #6d6d6d;
 }
 .nihilo .dijitTitlePaneTitle-hover  {
 	background: #f9f9f9 url(images/accordionItemActive.png) top repeat-x;
+	cursor: pointer;
 }
 .nihilo .dijitTitlePaneTitle * {
 	vertical-align: middle;
 }
-.nihilo .dijitTitlePane .dijitArrowNode {
+.nihilo .dijitTitlePane .dijitOpen .dijitArrowNode,
+.nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
 	width:15px;
 	height:15px;
 }
 .nihilo .dijitTitlePaneFocused .dijitTitlePaneTextNode {
 	color: #243C5F;
 }
-.nihilo .dijitOpen .dijitTitlePaneTextNode {
+.nihilo .dijitOpen .dijitTitlePaneTextNode,
+.nihilo .dijitFixedOpen .dijitTitlePaneTextNode {
 	color: #243C5F;
 }
 .nihilo .dijitTitlePane .dijitClosed .dijitArrowNode {
@@ -959,10 +2638,10 @@ border-bottom: solid #fff 1px;
 .nihilo .dijitTitlePane .dijitArrowNodeInner {
 	display:none;
 }
-.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
+.dijit_a11y .dijitTitlePane .dijitOpen .dijitArrowNodeInner,
+.dijit_a11y .dijitTitlePane .dijitClosed .dijitArrowNodeInner {
 	display:inline !important;
 	font-family:monospace;
-	cursor: pointer;
 	padding-bottom:.2em;
 }
 .dijit_a11y .dijitTitlePane .dijitArrowNode {
@@ -984,7 +2663,6 @@ border-bottom: solid #fff 1px;
 	margin-left: 4px;
 	margin-right: 4px;
 }
-	
 .nihilo .dijitCalendarIncrementControl {
 	
 	width:15px;
@@ -1022,7 +2700,6 @@ border-bottom: solid #fff 1px;
 .dj_ie6 .nihilo .dijitCalendarMonthContainer th {
 	padding-top:.2em;
 	padding-bottom:.1em;
-	
 }
 .nihilo .dijitCalendarDayLabelTemplate {
 	
@@ -1035,7 +2712,7 @@ border-bottom: solid #fff 1px;
 	text-align:center;
 }
 .nihilo .dijitCalendarBodyContainer {
-	border-bottom: 1px solid #eeeeee;	
+	border-bottom: 1px solid #eeeeee;
 }
 .nihilo .dijitCalendarMonthLabel {
 	color:#293a4b;
@@ -1070,7 +2747,7 @@ border-bottom: solid #fff 1px;
 	
 }
 .nihilo .dijitCalendarCurrentMonthDisabled {
-		
+	
 	background-color:#bbbbbc !important;
 }
 .nihilo .dijitCalendarDisabledDate {
@@ -1184,7 +2861,7 @@ border-bottom: solid #fff 1px;
 .nihilo .dijitToolbar .dijitDropDownButton,
 .nihilo .dijitToolbar .dijitComboButton .dijitButtonContents,
 .nihilo .dijitToolbar .dijitComboButton .dijitDownArrowButton {
-	background: none;	
+	background: none;
 	padding: 1px;	
 }
 .nihilo .dijitToolbar .dijitButtonChecked,
@@ -1210,13 +2887,11 @@ border-bottom: solid #fff 1px;
 	padding: 0;
 	background-color:#ffe284;
 }
-.nihilo .dijitToolbar label {	
+.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 {
+.dj_ie .nihilo .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
 	
 	border: 1px #555 dotted !important;
 	padding: 0px;
@@ -1303,7 +2978,7 @@ border-bottom: solid #fff 1px;
 	width:17px;
 	height:11px;
 }
-.dj_ie6 .nihilo .dijitTooltipBelow .dijitTooltipConnector {
+.dj_ie .nihilo .dijitTooltipBelow .dijitTooltipConnector {
 	background-image: url(images/tooltipConnectorUp.gif);
 }
 .nihilo .dijitTooltipAbove .dijitTooltipConnector {
@@ -1314,7 +2989,7 @@ border-bottom: solid #fff 1px;
 	width:17px;
 	height:11px;
 }
-.dj_ie6 .nihilo .dijitTooltipAbove .dijitTooltipConnector {
+.dj_ie .nihilo .dijitTooltipAbove .dijitTooltipConnector {
 	background-image: url(images/tooltipConnectorDown.gif);
 }
 .dj_ie6 .nihilo .dijitTooltipAbove .dijitTooltipConnector {
@@ -1334,7 +3009,7 @@ border-bottom: solid #fff 1px;
 	width:11px;
 	height:17px;
 }
-.dj_ie6 .nihilo .dijitTooltipLeft .dijitTooltipConnector {
+.dj_ie .nihilo .dijitTooltipLeft .dijitTooltipConnector {
 	background-image: url(images/tooltipConnectorRight.gif);
 }
 .nihilo .dijitTooltipRight {
@@ -1348,7 +3023,7 @@ border-bottom: solid #fff 1px;
 	width:11px;
 	height:17px;
 }
-.dj_ie6 .nihilo .dijitTooltipRight .dijitTooltipConnector {
+.dj_ie .nihilo .dijitTooltipRight .dijitTooltipConnector {
 	background-image: url(images/tooltipConnectorLeft.gif);
 }
 .nihilo .dijitMenu,
@@ -1473,6 +3148,10 @@ border-bottom: solid #fff 1px;
 .nihilo .dijitEditorIconTabIndent { background-position: -702px; }
 .nihilo .dijitEditorIconSelectAll { background-position: -720px; }
 .nihilo .dijitEditorIconUnlink { background-position: -738px; }
+.nihilo .dijitEditorIconFullScreen { background-position: -756px; }
+.nihilo .dijitEditorIconViewSource { background-position: -774px; }
+.nihilo .dijitEditorIconPrint { background-position: -792px; }
+.nihilo .dijitEditorIconNewPage { background-position: -810px; }
 .dijitColorPalette {
 	border:1px solid #d3d3d3;
 	background:#fff;
diff --git a/dijit/themes/nihilo/nihilo_rtl.css b/dijit/themes/nihilo/nihilo_rtl.css
index bb7a5eb..9a830c6 100644
--- a/dijit/themes/nihilo/nihilo_rtl.css
+++ b/dijit/themes/nihilo/nihilo_rtl.css
@@ -75,21 +75,21 @@
 	background-position:right;
 	padding-right:25px;
 }
+.dijitRtl .dijitTabContainer .tabStripMenuButton {
+	float: left;
+}
 .dijitRtl .nihilo .dijitTab {
 	margin-right:0;
 	margin-left:2px;		
 }
-.dijitRtl .nihilo .dijitTabContainerTopStrip,
-.dijitRtl .nihilo .dijitTabContainerBottomStrip {
-	padding-right: 3px;
-	padding-left: 0px;
-}
-.dijitRtl .nihilo .dijitTabContainerTop-tabs {
-	padding-left: auto;
-	padding-right: 3px;
+.dijitRtl .nihilo .dijitTabContainer .tabStripButton {
+	margin-left: 0;
 }
+.dijitRtl .nihilo .dijitTabContainerTopStrip,
+.dijitRtl .nihilo .dijitTabContainerBottomStrip,
+.dijitRtl .nihilo .dijitTabContainerTop-tabs,
 .dijitRtl .nihilo .dijitTabContainerBottom-tabs {
-	padding-left: auto;
+	padding-left: 0;
 	padding-right: 3px;
 }
 .dijitRtl .nihilo .dijitTabInnerDiv {
@@ -150,6 +150,10 @@
 .dijitRtl .nihilo .dijitComboBox .dijitButtonNode {
 	border-width: 0px 0px 0px 1px;
 }
+.dijitRtl .nihilo .dijitSelect .dijitButtonContents {
+	border-left: none;
+	border-right-width: 1px;
+}
 .dijitRtl .nihilo .dijitComboBox .dijitButtonNode,
 .dijitRtl .nihilo .dijitSpinner .dijitButtonNode {
 	
@@ -167,7 +171,7 @@
 }
 .dijitRtl .nihilo .dijitTreeContainer .dijitTreeContent {
     padding-left: auto;
-    padding-right: 1px;   
+    padding-right: 1px;
 }
 .dijitRtl .nihilo .dijitTreeContainer .dijitTreeExpandoOpened {
 	background: url(images/spriteTree_rtl.gif) no-repeat -18px top;
diff --git a/dijit/themes/soria/Calendar.css b/dijit/themes/soria/Calendar.css
index f2d179f..de0029d 100644
--- a/dijit/themes/soria/Calendar.css
+++ b/dijit/themes/soria/Calendar.css
@@ -1,5 +1,4 @@
 
-	
 .soria .dijitCalendarIncrementControl {
 	
 	width:15px;
@@ -8,7 +7,7 @@
 	background-repeat: no-repeat;
 }
 .dj_ie6 .soria .dijitCalendarIncrementControl {
-	font-size:.1em;	
+	font-size:.1em;
 	background-image: url("images/spriteRoundedIconsSmall.gif");
 }
 .soria .dijitA11ySideArrow {
@@ -49,7 +48,7 @@
 	text-align:center;
 }
 .soria .dijitCalendarBodyContainer {
-	border-bottom: 1px solid #eeeeee;	
+	border-bottom: 1px solid #eeeeee;
 }
 .soria .dijitCalendarMonthLabel {
 	color:#293a4b;
@@ -84,7 +83,7 @@
 	
 }
 .soria .dijitCalendarCurrentMonthDisabled {
-		
+	
 	background-color:#bbbbbc !important;
 }
 .soria .dijitCalendarDisabledDate {
diff --git a/dijit/themes/soria/Dialog.css b/dijit/themes/soria/Dialog.css
index 854d51d..c12f27d 100644
--- a/dijit/themes/soria/Dialog.css
+++ b/dijit/themes/soria/Dialog.css
@@ -81,7 +81,7 @@
 	width:17px;
 	height:11px;
 }
-.dj_ie6 .soria .dijitTooltipBelow .dijitTooltipConnector {
+.dj_ie .soria .dijitTooltipBelow .dijitTooltipConnector {
 	background-image: url("images/tooltipConnectorUp.gif");
 }
 .soria .dijitTooltipAbove .dijitTooltipConnector {
@@ -92,11 +92,13 @@
 	width:17px;
 	height:11px;
 }
-.dj_ie6 .soria .dijitTooltipAbove .dijitTooltipConnector {
+.dj_ie .soria .dijitTooltipAbove .dijitTooltipConnector {
 	background-image: url("images/tooltipConnectorDown.gif");
 }
-.dj_ie6 .soria .dijitTooltipAbove .dijitTooltipConnector {
+.dj_ie .soria .dijitTooltipAbove .dijitTooltipConnector {
 	background-image: url("images/tooltipConnectorDown.gif");
+}
+.dj_ie6 .soria .dijitTooltipAbove .dijitTooltipConnector {
 	bottom: -5px;
 }
 .soria .dijitTooltipLeft {
@@ -113,7 +115,7 @@
 	width:11px;
 	height:17px;
 }
-.dj_ie6 .soria .dijitTooltipLeft .dijitTooltipConnector {
+.dj_ie .soria .dijitTooltipLeft .dijitTooltipConnector {
 	background-image: url("images/tooltipConnectorRight.gif");
 }
 .soria .dijitTooltipRight {
@@ -127,6 +129,6 @@
 	width:11px;
 	height:17px;
 }
-.dj_ie6 .soria .dijitTooltipRight .dijitTooltipConnector {
+.dj_ie .soria .dijitTooltipRight .dijitTooltipConnector {
 	background-image: url("images/tooltipConnectorLeft.gif");
 }
diff --git a/dijit/themes/soria/Editor.css b/dijit/themes/soria/Editor.css
index 54374df..6b481c7 100644
--- a/dijit/themes/soria/Editor.css
+++ b/dijit/themes/soria/Editor.css
@@ -59,3 +59,7 @@
 .soria .dijitEditorIconTabIndent { background-position: -702px; }
 .soria .dijitEditorIconSelectAll { background-position: -720px; }
 .soria .dijitEditorIconUnlink { background-position: -738px; }
+.soria .dijitEditorIconFullScreen { background-position: -756px; }
+.soria .dijitEditorIconViewSource { background-position: -774px; }
+.soria .dijitEditorIconPrint { background-position: -792px; }
+.soria .dijitEditorIconNewPage { background-position: -810px; }
diff --git a/dijit/themes/soria/TitlePane.css b/dijit/themes/soria/TitlePane.css
index cf2ee29..f9e49cd 100644
--- a/dijit/themes/soria/TitlePane.css
+++ b/dijit/themes/soria/TitlePane.css
@@ -1,29 +1,30 @@
- 
- 
+
 .soria .dijitTitlePaneTitle {
 	background: #cccccc;
 	background:#fff url("images/titleBar.png") repeat-x top left;
 	border:1px solid #bfbfbf;
 	padding:3px 4px;
-	cursor: pointer;
 	font-size: 0.9em;
 	font-weight: bold;
 	color: #6d6d6d;
 }
 .soria .dijitTitlePaneTitle-hover {
 	background: #f9f9f9 url("images/accordionItemActive.png") top repeat-x;
+	cursor: pointer;
 }
 .soria .dijitTitlePaneTitle * {
 	vertical-align: middle;
 }
-.soria .dijitTitlePane .dijitArrowNode {
+.soria .dijitTitlePane .dijitOpen .dijitArrowNode,
+.soria .dijitTitlePane .dijitClosed .dijitArrowNode {
 	width:15px;
 	height:15px;
 }
 .soria .dijitTitlePaneFocused .dijitTitlePaneTextNode {
 	color: #243C5F;
 }
-.soria .dijitOpen .dijitTitlePaneTextNode {
+.soria .dijitOpen .dijitTitlePaneTextNode,
+.soria .dijitFixedOpen .dijitTitlePaneTextNode {
 	color: #243C5F;
 }
 .soria .dijitTitlePane .dijitClosed .dijitArrowNode {
@@ -41,10 +42,10 @@
 .soria .dijitTitlePane .dijitArrowNodeInner {
 	display:none;
 }
-.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
+.dijit_a11y .dijitTitlePane .dijitOpen .dijitArrowNodeInner,
+.dijit_a11y .dijitTitlePane .dijitClosed .dijitArrowNodeInner {
 	display:inline !important;
 	font-family:monospace;
-	cursor: pointer;
 	padding-bottom:.2em;
 }
 .dijit_a11y .dijitTitlePane .dijitArrowNode {
diff --git a/dijit/themes/soria/Toolbar.css b/dijit/themes/soria/Toolbar.css
index fa4cbc3..c3f2f6e 100644
--- a/dijit/themes/soria/Toolbar.css
+++ b/dijit/themes/soria/Toolbar.css
@@ -45,13 +45,11 @@
 	padding: 0px;
 	background-color:#9abbea;
 }
-.soria .dijitToolbar label {	
+.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 {
+.dj_ie .soria .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
 	
 	border: 1px #777 dotted !important;
 	padding: 0px;
diff --git a/dijit/themes/soria/Tree_rtl.css b/dijit/themes/soria/Tree_rtl.css
index 551c0d5..ebe50b0 100644
--- a/dijit/themes/soria/Tree_rtl.css
+++ b/dijit/themes/soria/Tree_rtl.css
@@ -4,7 +4,7 @@
 }
 .dijitRtl .soria .dijitTreeContainer .dijitTreeContent {
     padding-left: auto;
-    padding-right: 1px;   
+    padding-right: 1px;
 }
 .dijitRtl .soria .dijitTreeContainer .dijitTreeExpandoOpened {
 	background: url('images/spriteTree_rtl.gif') no-repeat -18px top;
diff --git a/dijit/themes/soria/form/Button.css b/dijit/themes/soria/form/Button.css
index 086fb90..c85e954 100644
--- a/dijit/themes/soria/form/Button.css
+++ b/dijit/themes/soria/form/Button.css
@@ -4,16 +4,18 @@
 	
 	border: 1px solid #8ba0bd;
 	border-bottom:1px solid #657c9c;
-	padding: 0.1em 0.2em 0.2em 0.2em; 
+	padding: 0.1em 0.2em 0.2em 0.2em;
 	background: #bcd5f0 url("../images/buttonEnabled.png") repeat-x top left;
 }
-.soria .dijitButtonNode button { 
-	border: 0px; 
-	background-color: transparent; 
-} 
- 
+.soria .dijitSelect .dijitButtonContents {
+	border-right: none;
+}
+.soria .dijitButtonNode button {
+	border: 0px;
+	background-color: transparent;
+}
 .soria .dijitButtonText {
-	text-align: center; 
+	text-align: center;
 	padding: 0 0.3em;
 }
 .soria .dijitComboBox .dijitButtonNode {
@@ -25,10 +27,9 @@
 .soria .dijitComboButton .dijitDownArrowButton {
 	padding-right:4px;
 }
-.dj_ff2 .soria .dijitComboButton .dijitButtonContentsFocused,
-.dj_ff2 .soria .dijitComboButton .dijitDownArrowButtonFocused {
-	border: 1px black dotted !important;
-}
+.soria .dijitComboBoxReadOnly,
+.soria .dijitSpinnerReadOnly,
+.soria .dijitSpinnerReadOnly .dijitButtonNode,
 .soria .dijitButtonDisabled .dijitButtonNode,
 .soria .dijitToggleButtonDisabled .dijitButtonNode,
 .soria .dijitDropDownButtonDisabled .dijitButtonNode,
@@ -39,7 +40,11 @@
 	
 	border-color: #b9bbdd #b9bbdd #b9bbdd #b9bbdd;
 	background:#c3d3e5 url("../images/buttonDisabled.png") top repeat-x;
-	opacity: 0.60; 
+	opacity: 0.60;
+}
+.dj_ie6 .soria .dijitComboButtonDisabled .dijitButtonText {
+	
+	color: #aaa;
 }
 .soria .dijitButtonHover .dijitButtonNode,
 .soria .dijitButtonNodeHover,
@@ -71,18 +76,20 @@
 	background: #91b4e5 url("../images/buttonActive.png") top left repeat-x;
 }
 .soria .dijitArrowButtonInner {
-	background:url("../images/spriteArrows.png") no-repeat left top;
+	background-image: url("../images/spriteArrows.png");
+	background-repeat: no-repeat;
+	background-position: 0px top;
 	width: 11px;
 }
-.soria .dijitUpArrowButton .dijitArrowButtonInner { 
-	background:url("../images/spriteArrows.png") no-repeat -22px top; 
-	width: 11px;
+.soria .dijitLeftArrowButton .dijitArrowButtonInner {
+	background-position: -11px top;
 }
-.dj_ie6 .soria .dijitArrowButtonInner {
-	background:url("../images/spriteArrows.gif") no-repeat left top;
-	width: 11px;
+.soria .dijitUpArrowButton .dijitArrowButtonInner {
+	background-position: -22px top;
 }
-.dj_ie6 .soria .dijitUpArrowButton .dijitArrowButtonInner {
-	background:url("../images/spriteArrows.gif") no-repeat -22px top;
-	width: 11px;
+.soria .dijitRightArrowButton .dijitArrowButtonInner {
+	background-position: -33px top;
+}
+.dj_ie6 .soria .dijitArrowButtonInner {
+	background-image: url("../images/spriteArrows.gif");
 }
diff --git a/dijit/themes/soria/form/Button_rtl.css b/dijit/themes/soria/form/Button_rtl.css
index ee80da7..50a5c5e 100644
--- a/dijit/themes/soria/form/Button_rtl.css
+++ b/dijit/themes/soria/form/Button_rtl.css
@@ -1,3 +1,7 @@
 .dijitRtl .soria .dijitComboBox .dijitButtonNode {
 	border-width: 0px 0px 0px 1px;
 }
+.dijitRtl .soria .dijitSelect .dijitButtonContents {
+	border-left: none;
+	border-right-width: 1px;
+}
diff --git a/dijit/themes/soria/form/Common.css b/dijit/themes/soria/form/Common.css
index f1e7f0e..23bb181 100644
--- a/dijit/themes/soria/form/Common.css
+++ b/dijit/themes/soria/form/Common.css
@@ -22,18 +22,6 @@
 .dj_ie6 .soria .dijitTextArea {
 	background:#fff url('../images/validationInputBg.gif') repeat-x top left;
 }
-.soria .dijitTextBoxDisabled,
-.soria .dijitComboBoxDisabled,
-.soria .dijitSpinnerDisabled,
-.soria .dijitTextAreaDisabled {
-	color: gray;
-}
-.dj_webkit .soria .dijitTextBoxDisabled,
-.dj_webkit .soria .dijitComboBoxDisabled,
-.dj_webkit .soria .dijitSpinnerDisabled,
-.dj_webkit .soria .dijitTextareaDisabled {
-	color: #eee;
-}
 .soria .dijitComboBox .dijitButtonNode {
 	padding: 0 0.2em;
 }
diff --git a/dijit/themes/soria/form/Select.css b/dijit/themes/soria/form/Select.css
new file mode 100644
index 0000000..c0cd68e
--- /dev/null
+++ b/dijit/themes/soria/form/Select.css
@@ -0,0 +1,52 @@
+
+.soria .dijitSelectDisabled * {
+    cursor: not-allowed !important;
+}
+.soria .dijitSelectReadOnly * {
+    cursor: default !important;
+}
+.soria .dijitSelect .dijitButtonNode {
+	padding: 0px;
+}
+.soria .dijitSelect .dijitButtonContents {
+	padding-top: 1px;
+    background:#fff url("../images/validationInputBg.png") repeat-x top left;
+    #background:#fff url('../images/validationInputBg.gif') repeat-x top left;
+}
+.soria .dijitSelectHover .dijitButtonContents,
+.soria .dijitSelectActive .dijitButtonContents,
+.soria .dijitSelectOpened .dijitButtonContents,
+.soria .dijitSelectDisabled .dijitButtonContents,
+.soria .dijitSelectReadOnly .dijitButtonContents{
+	background: transparent none;
+}
+.dj_ie .soria .dijitSelect .dijitButtonContents {
+	padding-top: 0px;
+}
+.soria .dijitSelectDisabled .dijitButtonNode {
+    border-color: #b9bbdd #b9bbdd #b9bbdd #b9bbdd;
+    background:#c3d3e5 url("../images/buttonDisabled.png") top repeat-x;
+}
+.dj_ie .soria .dijitSelectDisabled  .dijitButtonNode * {
+	filter: gray() alpha(opacity=50);
+}
+.soria .dijitSelectHover .dijitButtonNode {
+    color:#000;
+    background:#acc5e2 url("../images/buttonHover.png") repeat-x top left;
+}
+.soria .dijitSelectActive .dijitButtonNode,
+.soria .dijitSelectOpened .dijitButtonNode {
+    border-color:#657c9c;
+    background: #91b4e5 url("../images/buttonActive.png") top left repeat-x;
+}
+.soria .dijitSelectMenu td {
+	padding: 0em;
+}
+.soria .dijitSelectMenu .dijitMenuItemIcon {
+	margin: 0.1em 0.2em;
+	display: none;
+}
+.soria .dijitSelectMenu .dijitMenuItemLabel,
+.soria .dijitSelectMenu .dijitMenuArrowCell {
+	padding: 0.1em 0.2em;
+}
diff --git a/dijit/themes/soria/form/Slider.css b/dijit/themes/soria/form/Slider.css
index 4625bbf..f5a42ea 100644
--- a/dijit/themes/soria/form/Slider.css
+++ b/dijit/themes/soria/form/Slider.css
@@ -29,7 +29,7 @@
 	
 }
 .soria .dijitSliderFocused .dijitSliderBar {
-	border-color:#8ba0bd;	
+	border-color:#8ba0bd;
 }
 .dijit_a11y .dijitSliderProgressBar {
 	background-color:#333 !important;
@@ -99,19 +99,31 @@
 	background:url('../images/spriteRoundedIconsSmall.png') no-repeat -15px top;
 	#background:url('../images/spriteRoundedIconsSmall.gif') no-repeat -15px top;
 }
-.soria .dijitSliderDecrementIconH { 
+.soria .dijitSliderDecrementIconH {
 	background:url('../images/spriteRoundedIconsSmall.png') no-repeat 0px top;
 	#background:url('../images/spriteRoundedIconsSmall.gif') no-repeat 0px top;
 }
 .soria .dijitSliderButtonInner {
 	visibility:hidden;
 }
-.soria .dijitSliderDisabled {
-	opacity:0.6 !important;
+.soria .dijitSliderReadOnly *,
+.soria .dijitSliderDisabled * {
+	border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
+	color: #bdbdbd;
 }
-.dj_ie .soria .dijitSliderDisabled,
-.dj_ie .soria .dijitSliderDisabled .dijitRuleContainer,
-.dj_ie .soria .dijitSliderDisabled .dijitSliderRemainingBar,
-.dj_ie .soria .dijitSliderDisabled .dijitSliderProgressBar {
-	filter: gray() alpha(opacity=40);
+.soria .dijitSliderReadOnly .dijitSliderDecrementIconH,
+.soria .dijitSliderDisabled .dijitSliderDecrementIconH {
+	background-position: 0px -15px;
+}
+.soria .dijitSliderReadOnly .dijitSliderIncrementIconH,
+.soria .dijitSliderDisabled .dijitSliderIncrementIconH {
+	background-position: -30px -15px;
+}
+.soria .dijitSliderReadOnly .dijitSliderDecrementIconV,
+.soria .dijitSliderDisabled .dijitSliderDecrementIconV {
+	background-position: -15px -15px;
+}
+.soria .dijitSliderReadOnly .dijitSliderIncrementIconV,
+.soria .dijitSliderDisabled .dijitSliderIncrementIconV {
+	background-position: -45px -15px;
 }
diff --git a/dijit/themes/soria/images/editor.gif b/dijit/themes/soria/images/editor.gif
index 127c9c4..750c6b9 100644
Binary files a/dijit/themes/soria/images/editor.gif and b/dijit/themes/soria/images/editor.gif differ
diff --git a/dijit/themes/soria/images/editorDisabled.gif b/dijit/themes/soria/images/editorDisabled.gif
index 9dc5103..e40460d 100644
Binary files a/dijit/themes/soria/images/editorDisabled.gif and b/dijit/themes/soria/images/editorDisabled.gif differ
diff --git a/dijit/themes/soria/images/editorDisabled_rtl.gif b/dijit/themes/soria/images/editorDisabled_rtl.gif
index 74d407a..a0f6c10 100644
Binary files a/dijit/themes/soria/images/editorDisabled_rtl.gif and b/dijit/themes/soria/images/editorDisabled_rtl.gif differ
diff --git a/dijit/themes/soria/images/editor_rtl.gif b/dijit/themes/soria/images/editor_rtl.gif
index b94d040..a9740c2 100644
Binary files a/dijit/themes/soria/images/editor_rtl.gif and b/dijit/themes/soria/images/editor_rtl.gif differ
diff --git a/dijit/themes/soria/images/titleBar.png b/dijit/themes/soria/images/titleBar.png
index cbf98da..93c4146 100644
Binary files a/dijit/themes/soria/images/titleBar.png and b/dijit/themes/soria/images/titleBar.png differ
diff --git a/dijit/themes/soria/images/titleBarActive.png b/dijit/themes/soria/images/titleBarActive.png
index 92c7431..fb8a2e6 100644
Binary files a/dijit/themes/soria/images/titleBarActive.png and b/dijit/themes/soria/images/titleBarActive.png differ
diff --git a/dijit/themes/soria/layout/AccordionContainer.css b/dijit/themes/soria/layout/AccordionContainer.css
index 24e653d..eaaeebd 100644
--- a/dijit/themes/soria/layout/AccordionContainer.css
+++ b/dijit/themes/soria/layout/AccordionContainer.css
@@ -1,5 +1,4 @@
- 
- 
+
 .soria .dijitAccordionContainer {
 	border-color: #b1badf;
 	background-color: #fff;
@@ -19,7 +18,7 @@
 	border-top: 1px solid #b9bbdd;
 	border-bottom: 1px solid #b9bbdd;
 	padding: 5px 4px 5px 8px;
-	cursor: default;	
+	cursor: default;
 	color: #243C5F;
 }
 .soria .dijitAccordionArrow {
diff --git a/dijit/themes/soria/layout/BorderContainer.css b/dijit/themes/soria/layout/BorderContainer.css
index 4515041..aec147a 100644
--- a/dijit/themes/soria/layout/BorderContainer.css
+++ b/dijit/themes/soria/layout/BorderContainer.css
@@ -29,10 +29,10 @@
 	height:5px;
 }
 .soria .dijitSplitterH .dijitSplitterThumb {
-	background:url("../images/splitContainerSizerH-thumb.png") no-repeat;
-	top:1px;
+	background:#B0B0B0 none;
+	height:1px;
+	top:2px;
 	width:19px;
-	height:2px;
 }
 .soria .dijitSplitterV,
 .soria .dijitGutterV {
@@ -43,10 +43,10 @@
 	width:5px;
 }
 .soria .dijitSplitterV .dijitSplitterThumb {
-	background:url("../images/splitContainerSizerV-thumb.png") no-repeat;
-	left:1px;
+	background:#B0B0B0 none;
 	height:19px;
-	width:5px;
+	left:2px;
+	width:1px;
 }
 .soria .dijitSplitterActive {
 	font-size: 1px;
diff --git a/dijit/themes/soria/layout/SplitContainer.css b/dijit/themes/soria/layout/SplitContainer.css
index 88b0de2..87f0657 100644
--- a/dijit/themes/soria/layout/SplitContainer.css
+++ b/dijit/themes/soria/layout/SplitContainer.css
@@ -1,4 +1,4 @@
- 
+
 .soria .dijitSplitContainerSizerH {
 	background:url("../images/splitContainerSizerV.png") repeat-y #cddef4;
 	border:0;
diff --git a/dijit/themes/soria/layout/TabContainer.css b/dijit/themes/soria/layout/TabContainer.css
index c3479b2..24f10f4 100644
--- a/dijit/themes/soria/layout/TabContainer.css
+++ b/dijit/themes/soria/layout/TabContainer.css
@@ -1,5 +1,20 @@
- 
- 
+
+ .soria .dijitTabContainer .tabStripRBtn {
+	margin-right: 21px;
+}
+ .soria .dijitTabContainer .tabStripLBtn {
+	margin-left: 21px;
+}
+ .soria .nowrapTabStrip .dijitTab {
+	top: 2px;
+}
+ .soria .dijitTabContainerBottom-tabs .dijitTab {
+	top: -1px;
+	bottom: 2px;
+}
+ .soria .dijitTabContainer .tabStripMenuButton-Hover {
+	cursor: pointer;
+}
 .soria .dijitTabPaneWrapper {
 	background:#fff;
 	border:1px solid #B1BADF;
@@ -19,14 +34,14 @@
 	background: url("../images/tabContainerSprite.gif") no-repeat 0 -300px;
 	color: #243C5F;
 	border-bottom: 1px #B1BADF solid;
-}	
+}
 .soria .dijitTabInnerDiv .dijitTabContent {
-	padding:5px 3px 4px 4px;
+	padding:4px 3px 2px 4px;
 	background: url("../images/tabContainerSprite.gif") repeat-x 0 -350px;
 	position: relative;
 }
-.dijitTabSpacer {
-	font-size: 1px;
+.soria .dijitTabListWrapper {
+	z-index: 10;
 }
 .soria .dijitTabHover {
 	color: #243C5F;
@@ -83,8 +98,9 @@
 	width: 15px;
 	height: 15px;
 	background: url("../images/spriteRoundedIconsSmall.png") no-repeat -60px top;
+	margin-top: -1px;
 }
-.dj_ie6 .dijitTab .dijitClosable .closeImage {
+.dj_ie6 .soria .dijitTab .dijitClosable .closeImage {
 	background: url("../images/spriteRoundedIconsSmall.gif") no-repeat -60px top;
 }
 .soria .dijitTab .closeButton-hover .closeImage {
@@ -93,33 +109,57 @@
 .dj_ie6 .soria .dijitTab .closeButton-hover .closeImage {
 	background: url("../images/spriteRoundedIconsSmall.gif") no-repeat -60px -15px;
 }
-.soria .dijitTab .dijitTabButtonSpacer {
-	height: 15px;
+.soria .dijitTab .tabLabel {
+	
+	min-height: 15px;
+	display: inline-block;
+}
+.dj_ie6 .soria .dijitTabButtonIcon {
+	
+	height: 18px;
 	width: 1px;
 }
 .soria .dijitTabContainerTop-tabs {
-	margin-bottom: -1px;
-	border-color: #ccc;
+	border-color: #B1BADF;
 	padding-left: 3px;
 }
+.soria .dijitTabContainerTopNoStrip {
+	padding-top: 3px;
+}
 .soria .dijitTabContainerTop-container {
 	border-top: none;
 }
+.soria .dijitTabContainerTop .dijitTabListWrapper {
+	border-bottom: none;
+}
+.soria .dijitTabContainerTop-tabs .dijitTab {
+	top: 1px;
+}
 .soria .dijitTabContainerTop-tabs .dijitTabChecked {
 	border-bottom-color: #94b4e6;
 }
 .soria .dijitTabContainerTopStrip {
 	border: 1px solid #B1BADF;
-	padding-top: 2px;
+	margin-top: 1px;
+	padding-top: 1px;
+	background: #F0F4FC;
+}
+.soria .dijitTabContainerTopStrip .dijitTabContainerTop-tabs {
 	padding-left: 3px;
 }
-.soria .dijitTabContainerTopStrip {
-	background: #F0F4FC;
+.soria .dijitTabContainerNested .dijitTabListWrapper {
+	height: auto;
 }
 .soria .dijitTabContainerBottom-tabs {
 	margin-top: -1px;
-	border-color: #ccc;
 	padding-left: 3px;
+	border-top: 1px solid #B1BADF;
+}
+.soria .dijitTabContainerBottom .dijitTabListWrapper {
+	border-top: none;
+	padding-top: 1px;
+	padding-bottom: 1px;
+	float: left;
 }
 .soria .dijitTabContainerBottom-container {
 	border-bottom: none;
@@ -133,8 +173,8 @@
 	border-top-color:#94b4e6;
 }
 .soria .dijitTabContainerBottom-tabs .dijitTabInnerDiv .dijitTabContent {
-	padding-top: 4px;
-	padding-bottom: 5px;
+	padding-top: 3px;
+	padding-bottom: 3px;
 	background: url("../images/tabBottomEnabledC.gif") repeat-x bottom left;
 }
 .soria .dijitTabContainerBottom-tabs .dijitTabInnerDiv {
@@ -164,7 +204,6 @@
 }
 .soria .dijitTabContainerBottomStrip {
 	padding-bottom: 2px;
-	padding-left: 3px;	
 	border: 1px solid #B1BADF;
 }
 .soria .dijitTabContainerBottomStrip {
@@ -176,8 +215,14 @@
 	border: 1px solid #8ba0bd;
 	background: #94b4e6;
 }
+.soria .dijitTabContainerTop-spacer {
+	border-top: none;
+}
+.soria .dijitTabContainerBottom-spacer {
+	border-bottom: none;
+}
 .soria .dijitTabContainerRight-tabs {
-	margin-left: -1px;
+	height: 100%;
 	border-color: #ccc;
 	padding-top: 3px;
 }
@@ -189,8 +234,10 @@
 	border-left: 1px solid #B1BADF;
 	border-bottom: 1px solid #B1BADF !important;
 }
-.dj_ie .soria .dijitTabContainerRight-tabs .dijitTabInnerDiv {
-	border-bottom: solid #fff 1px;
+.dj_ie6 .soria .dijitTabContainerRight-tabs .dijitTabInnerDiv,
+.dj_ie7 .soria .dijitTabContainerRight-tabs .dijitTabInnerDiv {
+	border-bottom: solid #B1BADF 1px;
+	margin-bottom: -1px;
 }
 .soria .dijitTabContainerRight-tabs .dijitTabChecked {
 	border-left-color: #94b4e6;
@@ -198,9 +245,12 @@
 .soria .dijitTabContainerRight-tabs .dijitTabChecked {
 	background: url("../images/tabRightChecked.gif") no-repeat left top !important;
 }
-.dj_ie .soria .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv,
-.dj_ie .soria .dijitTabContainerRight-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
-	border-bottom: solid #efefef 1px;
+.dj_ie6 .soria .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv,
+.dj_ie7 .soria .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv,
+.dj_ie6 .soria .dijitTabContainerRight-tabs .dijitTabCheckedHover .dijitTabInnerDiv,
+.dj_ie7 .soria .dijitTabContainerRight-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
+	border-bottom: solid #94b4e6 1px;
+	margin-bottom: -1px;
 }
 .soria .dijitTabContainerRight-tabs .dijitTab {
 	background: url("../images/tabContainerSprite.gif") no-repeat left -350px;
@@ -210,16 +260,14 @@
 }
 .soria .dijitTabContainerRightStrip {
 	padding-right: 2px;
-	padding-top: 3px;	
 	border: 1px solid #B1BADF;
-}
-.soria .dijitTabContainerRightStrip {
 	background: #F0F4FC;
+	border-left: none;
 }
 .soria .dijitTabContainerLeft-tabs {
-	margin-right: -1px;
 	border-color: #ccc;
 	padding-top: 3px;
+	height: 100%;
 }
 .soria .dijitTabContainerLeft-container {
 	border-left: none;
@@ -241,20 +289,23 @@
 .soria .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
 	background: url("../images/tabLeftChecked.gif") no-repeat right top;
 }
-.dj_ie .soria .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv,
-.dj_ie .soria .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
-	border-bottom: solid #efefef 1px;
+.dj_ie6 .soria .dijitTabContainerLeft-tabs .dijitTabInnerDiv,
+.dj_ie7 .soria .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
+	border-bottom: solid #B1BADF 1px;
+	margin-bottom: -1px;
 }
-.dj_ie .soria .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
-	border-bottom: solid #fff 1px;
+.dj_ie6 .soria .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv,
+.dj_ie7 .soria .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv,
+.dj_ie6 .soria .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv,
+.dj_ie7 .soria .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
+	border-bottom: solid #94b4e6 1px;
+	margin-bottom: -1px;
 }
 .soria .dijitTabContainerLeftStrip {
 	padding-left: 2px;
-	padding-top: 3px;	
 	border: 1px solid #B1BADF;
-}
-.soria .dijitTabContainerLeftStrip {
 	background: #F0F4FC;
+	border-right: none;
 }
 .soria .dijitTabContainerLeft-tabs .dijitTab,
 .soria .dijitTabContainerRight-tabs .dijitTab {
@@ -267,10 +318,67 @@
 	border: 1px solid #8ba0bd;
 	background: #94b4e6;
 }
+.soria .dijitTabContainerLeft-spacer {
+	border-left: none;
+}
+.soria .dijitTabContainerRight-spacer {
+	border-right: none;
+}
 .soria .dijitTabContainerTop-dijitContentPane .dijitTabContainerTop-tabs {
 	border-left: 0px solid #ccc;
 	border-top: 0px solid #ccc;
 	border-right: 0px solid #ccc;
 	padding-top: 0px;
-	padding-left: 0px;	
+	padding-left: 0px;
+}
+.soria .dijitTabContainer .tabStripButton {
+	margin-right: 0;
+}
+.soria .dijitTabContainer .tabStripButton-top {
+	margin-top: 1px;
+}
+.soria .tabStripButton .dijitTabContent{
+	padding: 6px 0 5px 0;
+}
+.dj_ie6 .soria .tabStripButton .dijitTabContent,
+.dj_ie7 .soria .tabStripButton .dijitTabContent {
+	padding-top: 7px;
+}
+.soria .tabStrip-disabled .tabStripButton .dijitTabContent {
+	padding: 5px 0 3px 0;
+}
+.dj_ie6 .soria .tabStrip-disabled .tabStripButton .dijitTabContent,
+.dj_ie7 .soria .tabStrip-disabled .tabStripButton .dijitTabContent {
+	padding-top: 6px;
+}
+.soria .dijitTabContainer .tabStripButton-bottom {
+	background: transparent url(../images/tabBottomEnabledSpriteLR.gif) no-repeat scroll left bottom;
+	border-bottom: medium none;
+	border-top: 1px solid #B1BADF;
+}
+.soria .dijitTabContainer .tabStripButton-bottom .dijitTabInnerDiv {
+	background: transparent url(../images/tabBottomEnabledSpriteLR.gif) no-repeat scroll right bottom;
+}
+.soria .dijitTabContainer .tabStripButton-bottom .dijitTabContent {
+	background: transparent;
+}
+.soria .dijitTabContainer .tabStripButton {
+	
+	width: 21px;
+}
+.soria .dijitTabContainer .tabStripButton img {
+	height: 14px;
+	background: url(../images/spriteRoundedIconsSmall.png) no-repeat;
+}
+.dj_ie6 .soria .dijitTabContainer .tabStripButton img {
+	background-image: url(../images/spriteRoundedIconsSmall.gif);
+}
+.soria .dijitTabContainer .tabStripMenuButton img {
+	background-position: -15px top;
+}
+.soria .dijitTabContainer .tabStripSlideButtonLeft img {
+	background-position: 0px top;
+}
+.soria .dijitTabContainer .tabStripSlideButtonRight img {
+	background-position: -30px top;
 }
diff --git a/dijit/themes/soria/layout/TabContainer_rtl.css b/dijit/themes/soria/layout/TabContainer_rtl.css
index 3097eab..8638498 100644
--- a/dijit/themes/soria/layout/TabContainer_rtl.css
+++ b/dijit/themes/soria/layout/TabContainer_rtl.css
@@ -2,17 +2,14 @@
 	margin-right:0;
 	margin-left:2px;		
 }
-.dijitRtl .soria .dijitTabContainerTopStrip,
-.dijitRtl .soria .dijitTabContainerBottomStrip {
-	padding-right: 3px;
-	padding-left: 0px;
-}
-.dijitRtl .soria .dijitTabContainerTop-tabs {
-	padding-left: auto;
-	padding-right: 3px;
+.dijitRtl .soria .dijitTabContainer .tabStripButton {
+	margin-left: 0;
 }
+.dijitRtl .soria .dijitTabContainerTopStrip,
+.dijitRtl .soria .dijitTabContainerBottomStrip,
+.dijitRtl .soria .dijitTabContainerTop-tabs,
 .dijitRtl .soria .dijitTabContainerBottom-tabs {
-	padding-left: auto;
+	padding-left: 0;
 	padding-right: 3px;
 }
 .dijitRtl .soria .dijitTabInnerDiv {
diff --git a/dijit/themes/soria/soria.css b/dijit/themes/soria/soria.css
index 771c3af..2493f7c 100644
--- a/dijit/themes/soria/soria.css
+++ b/dijit/themes/soria/soria.css
@@ -1,5 +1,1458 @@
 
- at import url("../dijit.css");
+.dijitReset {
+	
+	margin:0;
+	border:0;
+	padding:0;
+	line-height:normal;
+	font: inherit;
+	color: inherit;
+}
+.dijitInline {
+	
+	display:inline-block;			
+	#zoom: 1; 
+	#display:inline; 
+	border:0;
+	padding:0;
+	vertical-align:middle;
+	#vertical-align: auto;	
+}
+.dijitHidden {
+	
+	display: none !important;
+}
+.dijitVisible {
+	
+	display: block !important;	
+	position: relative;			
+}
+.dj_ie INPUT.dijitTextBox,
+.dj_ie .dijitInputField INPUT {
+	font-size: 100%;
+}
+.dj_ie .dijitInputField INPUT { 
+	margin: -1px 0 !important;
+}
+.dijitInlineTable {
+	
+	display:inline-table;
+	display:inline-block;		
+	#zoom: 1; 
+	#display:inline; 
+	box-sizing: content-box; -moz-box-sizing: content-box;
+	border:0;
+	padding:0;
+}
+.dijitTeeny {
+	font-size:1px;
+	line-height:1px;
+}
+.dijitPopup {
+	position: absolute;
+	background-color: transparent;
+	margin: 0;
+	border: 0;
+	padding: 0;
+}
+.dijit_a11y .dijitPopup,
+.dijit_ally .dijitPopup div,
+.dijit_a11y .dijitPopup table,
+.dijit_a11y .dijitTooltipContainer {
+	background-color: white !important;
+}
+.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 {
+	
+	background-color: #e2ebf2;
+	cursor: text;
+}
+.dijitDisplayNone {
+	
+	display:none !important;
+}
+.dijitContainer {
+	
+	overflow: hidden;	
+}
+.dijit_a11y * {
+	background-image:none !important;
+}
+.dijit_a11y .dijitCalendarIncrementControl {
+	display: none;	
+}
+.dijit_a11y .dijitA11ySideArrow {
+	display: inline !important; 
+	cursor: pointer;
+}
+.dijit_a11y .dijitCalendarDateLabel {
+	padding: 1px;
+}
+.dijit_a11y .dijitCalendarSelectedDate .dijitCalendarDateLabel {
+	border: solid 1px black;
+	padding: 0px;
+}
+.dijit_a11y .dijitCalendarDateTemplate {
+	padding-bottom: 0.1em !important;	
+}
+.dijit_a11y .dijit * {
+	background:white !important;
+	color:black !important;
+}
+.dijit_a11y .dijitButtonNode {
+	border-color: black!important;
+	border-style: outset!important;
+	border-width: medium!important;
+}
+.dijit_a11y .dijitComboBoxReadOnly .dijitInputField,
+.dijit_a11y .dijitComboBoxReadOnly .dijitButtonNode,
+.dijit_a11y .dijitSpinnerReadOnly .dijitButtonNode,
+.dijit_a11y .dijitSpinnerReadOnly .dijitInputField,
+.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: 1em;
+	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;
+}
+.dijitToggleButton,
+.dijitButton,
+.dijitDropDownButton,
+.dijitComboButton {
+	
+	margin: 0.2em;
+}
+.dijitToolbar .dijitToggleButton,
+.dijitToolbar .dijitButton,
+.dijitToolbar .dijitDropDownButton,
+.dijitToolbar .dijitComboButton {
+	margin: 0;
+}
+.dj_ie8 .dijitToolbar button,
+.dj_webkit .dijitToolbar button {
+	
+	padding: 1px 2px;
+}
+.dj_ie .dijitToolbar .dijitComboBox{
+	
+	vertical-align: middle;
+}
+.dj_ie .dijitComboButton {
+	
+	margin-bottom: -3px;
+}
+.dj_webkit .dijitToolbar .dijitDropDownButton {
+	padding-left: 0.3em;
+}
+.dj_gecko .dijitToolbar .dijitButtonNode::-moz-focus-inner {
+	padding:0;
+}
+.dijitButtonNode {
+	
+	border:1px solid gray;
+	margin:0;
+	line-height:normal;
+	vertical-align: middle;
+	#vertical-align: auto;
+	text-align:center;
+	white-space: nowrap;
+}
+.dijitButtonNode, .dijitButtonNode * {
+	cursor: pointer;
+}
+.dijitReadOnly *,
+.dijitDisabled *,
+.dijitReadOnly,
+.dijitDisabled,
+.dijitDisabledClickableRegion {	
+	cursor: not-allowed !important;
+}
+.dj_ie .dijitButtonNode {
+	
+	zoom: 1;
+}
+.dj_ie .dijitButtonNode button {
+	
+	overflow: visible;
+}
+.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: auto;
+	bottom: 0;
+	border-top-width: 1px !important;
+}
+.dijitSpinner .dijitInputLayoutContainer .dijitUpArrowButton {
+	top: 0;
+	bottom: auto;
+}
+TABLE.dijitComboButton {
+	
+	border-collapse: collapse;
+	border:0;
+	padding:0;
+	margin:0;
+}
+.dijitToolbar .dijitComboButton {
+	
+	border-collapse: separate;
+}
+.dj_ie BUTTON.dijitButtonNode {
+	overflow: visible; 
+}
+table .dijitButton .dijitButtonNode,
+table .dijitComboButton .dijitButtonNode {
+	#overflow:hidden; 
+}
+.dijitButtonNode IMG {
+	
+	vertical-align:middle;
+	
+}
+.dijitTextBox,
+.dijitComboBox,
+.dijitSpinner {
+	border: solid black 1px;
+	#overflow: hidden; 
+	width: 15em;	
+	vertical-align: middle;
+	#vertical-align: auto;
+}
+.dijitTimeTextBox {
+	width: 8em;
+}
+.dijitTextBox input:focus,
+.dijitComboBox input:focus,
+.dijitSpinner input:focus {
+	outline: none;	
+}
+.dijitTextBoxFocused,
+.dijitComboBoxFocused,
+.dijitSpinnerFocused, .dijitSpinnerUpArrowActive, .dijitSpinnerDownArrowActive,
+.dijitTextAreaFocused {
+	
+	outline: auto 5px -webkit-focus-ring-color;
+}
+.dijitTextBox INPUT,
+.dijitComboBox INPUT,
+.dijitSpinner INPUT {
+	border-left: solid black 1px;	
+	display:inline;
+	position:static !important;
+	border:0 !important;
+	margin:0 !important;
+	vertical-align:top !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.75em;
+	padding-right: 0.15em;
+	line-height: 160%;
+}
+.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%;
+}
+.dj_ie6 .dijitProgressBarFull {
+	height:1.6em;
+}
+.dijitProgressBarTile {
+	
+	position:absolute;
+	overflow:hidden;
+	top:0;
+	left:0;
+	bottom:0;
+	right:0;
+	margin:0;
+	padding:0;
+	width:auto;
+	height:auto;
+	background-color:#aaa;
+	background-attachment: fixed;
+}
+.dijit_a11y .dijitProgressBarTile{
+	
+	border-width:4px;
+	border-style:solid;
+	background-color:transparent !important;
+}
+.dj_ie6 .dijitProgressBarTile {
+	
+	position:static;
+	
+	height:1.6em;
+}
+.dijitProgressBarIndeterminate .dijitProgressBarLabel {
+	visibility:hidden;
+}
+.dijitProgressBarIndeterminate .dijitProgressBarTile {
+	
+}
+.dijitProgressBarIndeterminateHighContrastImage {
+	display:none;
+}
+.dijit_a11y .dijitProgressBarIndeterminate .dijitProgressBarIndeterminateHighContrastImage {
+	display:block;
+	position:absolute;
+	top:0;
+	bottom:0;
+	margin:0;
+	padding:0;
+	width:100%;
+	height:auto;
+}
+.dijitProgressBarLabel {
+	display:block;
+	position:static;
+	width:100%;
+	text-align:center;
+	background-color:transparent !important;
+}
+.dijitTooltip {
+	position: absolute;
+	z-index: 2000;
+	display: block;
+	
+	left: 50%;
+	top: -10000px;
+	overflow: visible;
+}
+.dijitTooltipContainer {
+	border: solid black 2px;
+	background: #b8b5b5;
+	color: black;
+	font-size: small;
+}
+.dijitTooltipFocusNode {
+	padding: 2px 2px 2px 2px;
+}
+.dijitTooltipConnector {
+	position: absolute;
+}
+.dijitTooltipData {
+	display:none;
+}
+.dijitLayoutContainer{
+	position: relative;
+	display: block;
+	overflow: hidden;
+}
+body .dijitAlignTop,
+body .dijitAlignBottom,
+body .dijitAlignLeft,
+body .dijitAlignRight {
+	position: absolute;
+	overflow: hidden;
+}
+body .dijitAlignClient { position: absolute; }
+.dijitBorderContainer, .dijitBorderContainerNoGutter {
+	position:relative;
+	overflow: hidden;
+}
+.dijitBorderContainerPane,
+.dijitBorderContainerNoGutterPane {
+	position: absolute !important;	
+	z-index: 2;		
+}
+.dijitBorderContainer > .dijitTextArea {
+	
+	resize: none;
+}
+.dijitGutter {
+	
+	position: absolute;
+	font-size: 1px;		
+}
+.dijitSplitter {
+	position: absolute;
+	overflow: hidden;
+	z-index: 10;		
+	background-color: #fff;
+	border-color: gray;
+	border-style: solid;
+	border-width: 0;
+}
+.dj_ie .dijitSplitter {
+	z-index: 1;	
+}
+.dijitSplitterActive {
+	z-index: 11 !important;
+}
+.dijitSplitterCover{
+	position:absolute;
+	z-index:-1;
+	top:0;
+	left:0;
+	width:100%;
+	height:100%;
+}
+.dijitSplitterCoverActive{
+	z-index:3 !important;
+}
+.dj_ie .dijitSplitterCover{
+	background: white;
+	filter: alpha(opacity=0);
+}
+.dijitSplitterH {
+	height: 7px;
+	border-top:1px;
+	border-bottom:1px;
+	cursor: ns-resize;
+}
+.dijitSplitterV {
+	width: 7px;
+	border-left:1px;
+	border-right:1px;
+	cursor: ew-resize;
+}
+.dijitSplitContainer{
+	position: relative;
+	overflow: hidden;
+	display: block;
+}
+.dijitSplitPane{
+	position: absolute;
+}
+.dijitSplitContainerSizerH,
+.dijitSplitContainerSizerV {
+	position:absolute;
+	font-size: 1px;
+	cursor: move;
+	cursor: w-resize;
+	background-color: ThreeDFace;
+	border: 1px solid;
+	border-color: ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight;
+	margin: 0;
+}
+.dijitSplitContainerSizerH .thumb, .dijitSplitterV .dijitSplitterThumb {
+	overflow:hidden;
+	position:absolute;
+	top:49%;
+}
+.dijitSplitContainerSizerV .thumb, .dijitSplitterH .dijitSplitterThumb {
+	position:absolute;
+	left:49%;
+}
+.dijitSplitterShadow,
+.dijitSplitContainerVirtualSizerH,
+.dijitSplitContainerVirtualSizerV {
+	font-size: 1px;
+	background-color: ThreeDShadow;
+	-moz-opacity: 0.5;
+	opacity: 0.5;
+	filter: Alpha(Opacity=50);
+	margin: 0;
+}
+.dj_ie .dijitSplitterV, .dijitSplitContainerVirtualSizerH {
+	cursor: w-resize;
+}
+.dj_ie .dijitSplitterH, .dijitSplitContainerSizerV, .dijitSplitContainerVirtualSizerV {
+	cursor: n-resize;
+}
+.dijit_a11y .dijitSplitterH {
+	border-top:1px solid #d3d3d3 !important;
+	border-bottom:1px solid #d3d3d3 !important;
+}
+.dijit_a11y .dijitSplitterV {
+	border-left:1px solid #d3d3d3 !important;
+	border-right:1px solid #d3d3d3 !important;
+}
+.dijitContentPane {
+	display: block;
+	overflow: auto;	
+}
+.dijitContentPaneSingleChild {
+	
+	overflow: hidden;
+}
+.dijitTitlePane {
+	display: block;
+	overflow: hidden;
+}
+.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;
+}
+.dijitAccordionContainer {
+	border:1px solid #b7b7b7;
+	border-top:0 !important;
+}
+.dj_webkit .dijitAccordionContainer  div:focus {
+	outline:none;
+}
+.dj_ff3 .dijitAccordionContainer  div:focus {
+	outline:none;
+}
+.dijitAccordionTitle {
+	cursor: pointer;
+}
+.dijitAccordionFocused  {
+	text-decoration: underline;
+}
+.dijitAccordionTitle .arrowTextUp,
+.dijitAccordionTitle .arrowTextDown {
+	display: none;
+	font-size: 0.65em;
+	font-weight: normal !important;
+}
+.dijit_a11y .dijitAccordionTitle .arrowTextUp,
+.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 {
+	vertical-align: middle;
+}
+.dijitCalendarDisabledDate {
+	color:gray !important;
+}
+.dijitCalendarPreviousMonthDisabled,
+.dijitCalendarCurrentMonthDisabled,
+.dijitCalendarNextMonthDisabled {
+	cursor:default !important
+}
+.dijitCalendarIncrementControl,
+.dijitCalendarBodyContainer tbody tr td,
+.dijitCalendarDateTemplate,
+.dijitCalendarContainer .dijitInline {
+	cursor:pointer;
+}
+.dijitSpacer {
+	
+  	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;
+}
+.dj_webkit .dijitMenuTable td[colspan="2"]{
+	border-right:hidden;
+}
+.dijitMenuItem{
+	text-align: left;
+	white-space: nowrap;
+	padding:.1em .2em;
+	cursor:pointer;
+}
+.dijitMenuPassive .dijitMenuItemHover,
+.dijitMenuItemSelected {
+	
+	background-color:black;
+	color:white;
+}
+.dijitMenuItemIcon, .dijitMenuExpand {
+	background-repeat: no-repeat;
+}
+.dijitMenuItemDisabled * {
+	
+	opacity:0.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 .dijitMenuItemSelected {
+	border: 1px #fff dotted !important;
+}
+.dj_ff3 .dijit_a11y .dijitMenuItem td {
+	padding: none !important;
+	background:none ! important;
+}
+.dijit_a11y .dijitMenuItemSelected .dijitMenuItemLabel {
+	border-width: 1px;
+	border-style: solid;
+}
+.dj_ie8 .dijit_a11y .dijitMenuItemLabel {
+	position:static;
+}
+.dijitMenuExpandA11y {
+	display: none;
+}
+.dijit_a11y .dijitMenuExpandA11y {
+	display: inline;
+}
+.dijitMenuSeparator td {
+	border: 0;
+	padding: 0;
+}
+.dijitMenuSeparatorTop {
+	height: 50%;
+	margin: 0;
+	margin-top:3px;
+	font-size: 1px;
+}
+.dijitMenuSeparatorBottom {
+	height: 50%;
+	margin: 0;
+	margin-bottom:3px;
+	font-size: 1px;
+}
+.dijitCheckedMenuItemIconChar {
+	vertical-align: middle;
+	visibility:hidden;
+}
+.dijitCheckedMenuItemChecked .dijitCheckedMenuItemIconChar {
+	visibility: visible;
+}
+.dijit_a11y .dijitCheckedMenuItemIconChar {
+	display:inline !important;
+}
+.dijit_a11y .dijitCheckedMenuItemIcon {
+	display: none;
+}
+.dijitStackController .dijitToggleButtonChecked * {
+	cursor: default;	
+}
+.dijitTabContainerNoLayout {
+	width: 100%;	
+}
+.dijitTabContainerBottom-tabs,
+.dijitTabContainerTop-tabs,
+.dijitTabContainerLeft-tabs,
+.dijitTabContainerRight-tabs {
+	overflow: visible !important;  
+}
+.dijitTabContainerBottom-container,
+.dijitTabContainerTop-container,
+.dijitTabContainerLeft-container,
+.dijitTabContainerRight-container {
+	z-index:0;
+	overflow: hidden;
+	border: 1px solid black;
+}
+.dijitTabContainer .nowrapTabStrip {
+	width: 50000px;
+	display: block;
+	position: relative;
+}
+.dijitTabContainer .dijitTabListWrapper {
+	overflow: hidden;
+}
+.dijit_a11y .dijitTabContainer .tabStripButton img {
+	
+	display: none;
+}
+.dijitTabContainerTop-tabs {
+	border-bottom: 1px solid black;
+}
+.dijitTabContainerTop-container {
+	border-top: 0px;
+}
+.dijitTabContainerLeft-tabs {
+	border-right: 1px solid black;
+	float: left;
+}
+.dijitTabContainerLeft-container {
+	border-left: 0px;
+}
+.dijitTabContainerBottom-tabs {
+	border-top: 1px solid black;
+}
+.dijitTabContainerBottom-container {
+	border-bottom: 0px;
+}
+.dijitTabContainerRight-tabs {
+	border-left: 1px solid black;
+	float: left;
+}
+.dijitTabContainerRight-container {
+	border-right: 0px;
+}
+div.dijitTabBtnDisabled, .dj_ie div.dijitTabBtnDisabled {
+	cursor: auto;
+}
+.dijitTab {
+	position:relative;
+	cursor:pointer;
+	white-space:nowrap;
+	z-index:3;
+}
+.dijitTab * {
+	
+	vertical-align: middle;
+}
+.dijitTabChecked {
+	cursor: default;	
+}
+.dijitTabButtonIcon {
+	height: 18px;
+}
+.dijitTabContainerTop-tabs .dijitTab {
+	top: 1px;	
+}
+.dijitTabContainerBottom-tabs .dijitTab {
+	top: -1px;	
+}
+.dijitTabContainerLeft-tabs .dijitTab {
+	left: 1px;	
+}
+.dijitTabContainerRight-tabs .dijitTab {
+	left: -1px;	
+}
+.dijitTabContainerTop-tabs .dijitTab,
+.dijitTabContainerBottom-tabs .dijitTab {
+	
+	display:inline-block;			
+	#zoom: 1; 
+	#display:inline; 
+}
+.dijitTabInnerDiv {
+	position:relative;
+}
+.tabStripButton {
+	z-index: 12;
+}
+.dijitTabButtonDisabled .tabStripButton {
+	display: none;
+}
+.dijitTab .closeButton {
+	margin-left: 1em;
+}
+.dijitTab .closeText {
+	display:none;
+}
+.dijit_a11y .closeText {
+	display:inline;
+	margin: 0px 6px;
+}
+.dijit_a11y .dijitTab .closeImage {
+	display:none;
+}
+.dijit_a11y .closeButton-hover .closeText {
+	border:thin solid;
+}
+.dijit_a11y .dijitTabChecked {
+	border-style:dashed !important;
+}
+.dijit_a11y .dijitTabInnerDiv {
+	border-left:none !important;
+ }
+.dijitTabPane,
+.dijitStackContainer-child,
+.dijitAccordionContainer-child {
+	
+    border: 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 {
+}
+.dijitTreeIndent {
+	
+	width: 19px;
+}
+.dijitTreeRow, .dijitTreeContent {
+	white-space: nowrap;
+}
+.dijitTreeRow img {
+	
+	vertical-align: middle;
+}
+.dijitTreeContent {
+    cursor: default;
+}
+.dijitExpandoText {
+	display: none;
+}
+.dijit_a11y .dijitExpandoText {
+	display: inline;
+	padding-left: 10px;
+	padding-right: 10px;
+	font-family: monospace;
+	border-style: solid;
+	border-width: thin;
+	cursor: pointer;
+}
+.dijitTreeLabel {
+	margin: 0px 4px;
+}
+.dijitDialog {
+	position: absolute;
+	z-index: 999;
+	padding: 1px;
+	overflow: hidden;       
+}
+.dijitDialogFixed div.dijitDialogTitleBar {
+	cursor:default;
+}
+.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;
+}
+.dijitSliderBarContainerV {
+	position:relative;
+	height:100%;
+	z-index:1;
+}
+.dijitSliderBarContainerH {
+	position:relative;
+	z-index:1;
+}
+.dijitSliderBarH {
+	height:4px;
+	border-width:1px 0;
+}
+.dijitSliderBarV {
+	width:4px;
+	border-width:0 1px;
+}
+.dijitSliderProgressBar {
+	background-color:red;
+	z-index:1;
+}
+.dijitSliderProgressBarV {
+	position:static !important;
+	height:0%;
+	vertical-align:top;
+	text-align:left;
+}
+.dijitSliderProgressBarH {
+	position:absolute !important;
+	width:0%;
+	vertical-align:middle;
+	overflow:visible;
+}
+.dijitSliderRemainingBar {
+	overflow:hidden;
+	background-color:transparent;
+	z-index:1;
+}
+.dijitSliderRemainingBarV {
+	height:100%;
+	text-align:left;
+}
+.dijitSliderRemainingBarH {
+	width:100% !important;
+}
+.dijitSliderBumper {
+	overflow:hidden;
+	z-index:1;
+}
+.dijitSliderBumperV {
+	width:4px;
+	height:8px;
+	border-width:0 1px;
+}
+.dijitSliderBumperH {
+	width:8px;
+	height:4px;
+	border-width:1px 0;
+}
+.dijitSliderBottomBumper,
+.dijitSliderLeftBumper {
+	background-color:red;
+}
+.dijitSliderTopBumper,
+.dijitSliderRightBumper {
+	background-color:transparent;
+}
+.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;
+}
+.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,
+.dijit_a11y .dijitTab .tabLabel {
+	display: inline !important;
+}
+.dj_ie7 .dijitButtonNode > BUTTON.dijitButtonContents > * {
+	position: relative; 
+}
+.dijitTextArea {
+	width:100%;
+	overflow-y: auto;	
+}
+.dijitTextArea[cols] {
+	width:auto; 
+}
+.dj_ie .dijitTextAreaCols {
+	width:auto;
+}
+.dijitTextArea > DIV {
+	text-decoration:none;
+	overflow:auto;
+	min-height: 1.40em;
+}
+.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));
+}
+.RichTextEditable {
+	display: block;	
+}
+.dijitTimePickerItemInner {
+	text-align:center;
+	border:0;
+	padding:2px 8px 2px 8px;
+}
+.dijitTimePickerTick,
+.dijitTimePickerMarker {
+	border-bottom:1px solid gray;
+}
+.dijitTimePicker .dijitDownArrowButton {
+	border-top: none !important;
+}
+.dijitTimePickerTick {
+	color:#CCC;
+}
+.dijitTimePickerMarker {
+	color:black;
+	background-color:#CCC;
+}
+.dijitTimePickerItemSelected {
+	font-weight:bold;
+	color:#333;
+	background-color:#b7cdee;
+}
+.dijitTimePickerItemHover {
+	background-color:gray;
+	color:white;
+	cursor:pointer;
+}
+.dijit_a11y .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;
+}
+.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;
+}
+.dijitSelect {
+	margin: 0.2em;
+}
+.dj_ie .dijitSelect,
+.dj_ie7 .dijitSelect,
+.dj_iequirks .dijitSelect {
+	vertical-align: middle; 
+}
+.dj_ie8 .dijitSelect .dijitButtonText {
+	vertical-align: top;
+}
+.dijitSelect .dijitButtonNode {
+	text-align: left;
+}
+.dijitRtl .dijitSelect .dijitButtonNode {
+	text-align: right;
+}
+.dijitToolbar .dijitSelect {
+	margin: 0;
+}
+.dj_webkit .dijitToolbar .dijitSelect {
+	padding-left: 0.3em;
+}
+.dijit_a11y .dijitSelectDisabled .dijitButtonNode {
+	border-style: outset!important;
+	border-width: medium!important;
+	border-color: #999 !important;
+	color:#999 !important;
+}
+.dijitSelect .dijitButtonContents {
+	padding: 0px;
+	background: transparent none;
+}
+.dijitSelectFixedWidth .dijitButtonContents {
+	width: 100%;
+}
+.dijitSelect .dijitArrowButton {
+	width: 16px;
+}
+.dj_ie6 .dijitSelectMenu .dijitMenuItemLabel,
+.dj_ie7 .dijitSelectMenu .dijitMenuItemLabel {
+	
+	position: static;
+}
+.dijitSelectLabel *
+{
+	vertical-align: baseline;
+}
+.dijitSelectSelectedOption * {
+	font-weight: bold;
+}
+.dijitSelectMenu {
+	border-width: 1px;
+}
+.dijitSelect .dijitButtonContents {
+	white-space: nowrap;
+}
+.dijitSelectMenu .dijitMenuTable {
+	margin: 0px;
+	background-color: transparent;
+}
+.dijitTextBoxReadOnly,
+.dijitComboBoxReadOnly,
+.dijitSpinnerReadOnly,
+.dijitTextAreaReadOnly,
+.dijitTextBoxDisabled,
+.dijitComboBoxDisabled,
+.dijitSpinnerDisabled,
+.dijitTextAreaDisabled {
+	color: gray;
+}
+.dj_webkit .dijitTextBoxDisabled INPUT,
+.dj_webkit .dijitComboBoxDisabled INPUT,
+.dj_webkit .dijitSpinnerDisabled INPUT {
+	color: #eee;
+}
+.dj_webkit INPUT.dijitTextBoxDisabled,
+.dj_webkit TEXTAREA.dijitTextAreaDisabled {
+	color: #333; 
+}
+.dijit_a11y .dijitSliderReadOnly,
+.dijit_a11y .dijitSliderDisabled {
+	opacity:0.6;
+}
+.dj_ie .dijit_a11y .dijitSliderReadOnly .dijitSliderBar,
+.dj_ie .dijit_a11y .dijitSliderDisabled .dijitSliderBar {
+	filter: alpha(opacity=40);
+}
+.dijit_a11y .dijitSlider .dijitSliderButtonContainer DIV {
+	font-family: monospace; 
+	font-size: 1em;
+	line-height: 1em;
+	height: auto;
+	width: auto;
+	margin: 0px 4px;
+}
+.dijitForceStatic {
+    position: static !important;
+}
 .soria .dojoDndItemBefore {
 	border-top: 2px solid #369;
 }
@@ -34,8 +1487,22 @@
     background-color: #fff;		
     padding: 5px;
 }
- 
- 
+ .soria .dijitTabContainer .tabStripRBtn {
+	margin-right: 21px;
+}
+ .soria .dijitTabContainer .tabStripLBtn {
+	margin-left: 21px;
+}
+ .soria .nowrapTabStrip .dijitTab {
+	top: 2px;
+}
+ .soria .dijitTabContainerBottom-tabs .dijitTab {
+	top: -1px;
+	bottom: 2px;
+}
+ .soria .dijitTabContainer .tabStripMenuButton-Hover {
+	cursor: pointer;
+}
 .soria .dijitTabPaneWrapper {
 	background:#fff;
 	border:1px solid #B1BADF;
@@ -55,14 +1522,14 @@
 	background: url(images/tabContainerSprite.gif) no-repeat 0 -300px;
 	color: #243C5F;
 	border-bottom: 1px #B1BADF solid;
-}	
+}
 .soria .dijitTabInnerDiv .dijitTabContent {
-	padding:5px 3px 4px 4px;
+	padding:4px 3px 2px 4px;
 	background: url(images/tabContainerSprite.gif) repeat-x 0 -350px;
 	position: relative;
 }
-.dijitTabSpacer {
-	font-size: 1px;
+.soria .dijitTabListWrapper {
+	z-index: 10;
 }
 .soria .dijitTabHover {
 	color: #243C5F;
@@ -119,8 +1586,9 @@
 	width: 15px;
 	height: 15px;
 	background: url(images/spriteRoundedIconsSmall.png) no-repeat -60px top;
+	margin-top: -1px;
 }
-.dj_ie6 .dijitTab .dijitClosable .closeImage {
+.dj_ie6 .soria .dijitTab .dijitClosable .closeImage {
 	background: url(images/spriteRoundedIconsSmall.gif) no-repeat -60px top;
 }
 .soria .dijitTab .closeButton-hover .closeImage {
@@ -129,33 +1597,57 @@
 .dj_ie6 .soria .dijitTab .closeButton-hover .closeImage {
 	background: url(images/spriteRoundedIconsSmall.gif) no-repeat -60px -15px;
 }
-.soria .dijitTab .dijitTabButtonSpacer {
-	height: 15px;
+.soria .dijitTab .tabLabel {
+	
+	min-height: 15px;
+	display: inline-block;
+}
+.dj_ie6 .soria .dijitTabButtonIcon {
+	
+	height: 18px;
 	width: 1px;
 }
 .soria .dijitTabContainerTop-tabs {
-	margin-bottom: -1px;
-	border-color: #ccc;
+	border-color: #B1BADF;
 	padding-left: 3px;
 }
+.soria .dijitTabContainerTopNoStrip {
+	padding-top: 3px;
+}
 .soria .dijitTabContainerTop-container {
 	border-top: none;
 }
+.soria .dijitTabContainerTop .dijitTabListWrapper {
+	border-bottom: none;
+}
+.soria .dijitTabContainerTop-tabs .dijitTab {
+	top: 1px;
+}
 .soria .dijitTabContainerTop-tabs .dijitTabChecked {
 	border-bottom-color: #94b4e6;
 }
 .soria .dijitTabContainerTopStrip {
 	border: 1px solid #B1BADF;
-	padding-top: 2px;
+	margin-top: 1px;
+	padding-top: 1px;
+	background: #F0F4FC;
+}
+.soria .dijitTabContainerTopStrip .dijitTabContainerTop-tabs {
 	padding-left: 3px;
 }
-.soria .dijitTabContainerTopStrip {
-	background: #F0F4FC;
+.soria .dijitTabContainerNested .dijitTabListWrapper {
+	height: auto;
 }
 .soria .dijitTabContainerBottom-tabs {
 	margin-top: -1px;
-	border-color: #ccc;
 	padding-left: 3px;
+	border-top: 1px solid #B1BADF;
+}
+.soria .dijitTabContainerBottom .dijitTabListWrapper {
+	border-top: none;
+	padding-top: 1px;
+	padding-bottom: 1px;
+	float: left;
 }
 .soria .dijitTabContainerBottom-container {
 	border-bottom: none;
@@ -169,8 +1661,8 @@
 	border-top-color:#94b4e6;
 }
 .soria .dijitTabContainerBottom-tabs .dijitTabInnerDiv .dijitTabContent {
-	padding-top: 4px;
-	padding-bottom: 5px;
+	padding-top: 3px;
+	padding-bottom: 3px;
 	background: url(images/tabBottomEnabledC.gif) repeat-x bottom left;
 }
 .soria .dijitTabContainerBottom-tabs .dijitTabInnerDiv {
@@ -200,7 +1692,6 @@
 }
 .soria .dijitTabContainerBottomStrip {
 	padding-bottom: 2px;
-	padding-left: 3px;	
 	border: 1px solid #B1BADF;
 }
 .soria .dijitTabContainerBottomStrip {
@@ -212,8 +1703,14 @@
 	border: 1px solid #8ba0bd;
 	background: #94b4e6;
 }
+.soria .dijitTabContainerTop-spacer {
+	border-top: none;
+}
+.soria .dijitTabContainerBottom-spacer {
+	border-bottom: none;
+}
 .soria .dijitTabContainerRight-tabs {
-	margin-left: -1px;
+	height: 100%;
 	border-color: #ccc;
 	padding-top: 3px;
 }
@@ -225,8 +1722,10 @@
 	border-left: 1px solid #B1BADF;
 	border-bottom: 1px solid #B1BADF !important;
 }
-.dj_ie .soria .dijitTabContainerRight-tabs .dijitTabInnerDiv {
-	border-bottom: solid #fff 1px;
+.dj_ie6 .soria .dijitTabContainerRight-tabs .dijitTabInnerDiv,
+.dj_ie7 .soria .dijitTabContainerRight-tabs .dijitTabInnerDiv {
+	border-bottom: solid #B1BADF 1px;
+	margin-bottom: -1px;
 }
 .soria .dijitTabContainerRight-tabs .dijitTabChecked {
 	border-left-color: #94b4e6;
@@ -234,9 +1733,12 @@
 .soria .dijitTabContainerRight-tabs .dijitTabChecked {
 	background: url(images/tabRightChecked.gif) no-repeat left top !important;
 }
-.dj_ie .soria .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv,
-.dj_ie .soria .dijitTabContainerRight-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
-	border-bottom: solid #efefef 1px;
+.dj_ie6 .soria .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv,
+.dj_ie7 .soria .dijitTabContainerRight-tabs .dijitTabChecked .dijitTabInnerDiv,
+.dj_ie6 .soria .dijitTabContainerRight-tabs .dijitTabCheckedHover .dijitTabInnerDiv,
+.dj_ie7 .soria .dijitTabContainerRight-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
+	border-bottom: solid #94b4e6 1px;
+	margin-bottom: -1px;
 }
 .soria .dijitTabContainerRight-tabs .dijitTab {
 	background: url(images/tabContainerSprite.gif) no-repeat left -350px;
@@ -246,16 +1748,14 @@
 }
 .soria .dijitTabContainerRightStrip {
 	padding-right: 2px;
-	padding-top: 3px;	
 	border: 1px solid #B1BADF;
-}
-.soria .dijitTabContainerRightStrip {
 	background: #F0F4FC;
+	border-left: none;
 }
 .soria .dijitTabContainerLeft-tabs {
-	margin-right: -1px;
 	border-color: #ccc;
 	padding-top: 3px;
+	height: 100%;
 }
 .soria .dijitTabContainerLeft-container {
 	border-left: none;
@@ -277,20 +1777,23 @@
 .soria .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
 	background: url(images/tabLeftChecked.gif) no-repeat right top;
 }
-.dj_ie .soria .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv,
-.dj_ie .soria .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
-	border-bottom: solid #efefef 1px;
+.dj_ie6 .soria .dijitTabContainerLeft-tabs .dijitTabInnerDiv,
+.dj_ie7 .soria .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
+	border-bottom: solid #B1BADF 1px;
+	margin-bottom: -1px;
 }
-.dj_ie .soria .dijitTabContainerLeft-tabs .dijitTabInnerDiv {
-	border-bottom: solid #fff 1px;
+.dj_ie6 .soria .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv,
+.dj_ie7 .soria .dijitTabContainerLeft-tabs .dijitTabChecked .dijitTabInnerDiv,
+.dj_ie6 .soria .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv,
+.dj_ie7 .soria .dijitTabContainerLeft-tabs .dijitTabCheckedHover .dijitTabInnerDiv {
+	border-bottom: solid #94b4e6 1px;
+	margin-bottom: -1px;
 }
 .soria .dijitTabContainerLeftStrip {
 	padding-left: 2px;
-	padding-top: 3px;	
 	border: 1px solid #B1BADF;
-}
-.soria .dijitTabContainerLeftStrip {
 	background: #F0F4FC;
+	border-right: none;
 }
 .soria .dijitTabContainerLeft-tabs .dijitTab,
 .soria .dijitTabContainerRight-tabs .dijitTab {
@@ -303,15 +1806,70 @@
 	border: 1px solid #8ba0bd;
 	background: #94b4e6;
 }
+.soria .dijitTabContainerLeft-spacer {
+	border-left: none;
+}
+.soria .dijitTabContainerRight-spacer {
+	border-right: none;
+}
 .soria .dijitTabContainerTop-dijitContentPane .dijitTabContainerTop-tabs {
 	border-left: 0px solid #ccc;
 	border-top: 0px solid #ccc;
 	border-right: 0px solid #ccc;
 	padding-top: 0px;
-	padding-left: 0px;	
+	padding-left: 0px;
+}
+.soria .dijitTabContainer .tabStripButton {
+	margin-right: 0;
+}
+.soria .dijitTabContainer .tabStripButton-top {
+	margin-top: 1px;
+}
+.soria .tabStripButton .dijitTabContent{
+	padding: 6px 0 5px 0;
+}
+.dj_ie6 .soria .tabStripButton .dijitTabContent,
+.dj_ie7 .soria .tabStripButton .dijitTabContent {
+	padding-top: 7px;
+}
+.soria .tabStrip-disabled .tabStripButton .dijitTabContent {
+	padding: 5px 0 3px 0;
+}
+.dj_ie6 .soria .tabStrip-disabled .tabStripButton .dijitTabContent,
+.dj_ie7 .soria .tabStrip-disabled .tabStripButton .dijitTabContent {
+	padding-top: 6px;
+}
+.soria .dijitTabContainer .tabStripButton-bottom {
+	background: transparent url(images/tabBottomEnabledSpriteLR.gif) no-repeat scroll left bottom;
+	border-bottom: medium none;
+	border-top: 1px solid #B1BADF;
+}
+.soria .dijitTabContainer .tabStripButton-bottom .dijitTabInnerDiv {
+	background: transparent url(images/tabBottomEnabledSpriteLR.gif) no-repeat scroll right bottom;
+}
+.soria .dijitTabContainer .tabStripButton-bottom .dijitTabContent {
+	background: transparent;
+}
+.soria .dijitTabContainer .tabStripButton {
+	
+	width: 21px;
+}
+.soria .dijitTabContainer .tabStripButton img {
+	height: 14px;
+	background: url(images/spriteRoundedIconsSmall.png) no-repeat;
+}
+.dj_ie6 .soria .dijitTabContainer .tabStripButton img {
+	background-image: url(images/spriteRoundedIconsSmall.gif);
+}
+.soria .dijitTabContainer .tabStripMenuButton img {
+	background-position: -15px top;
+}
+.soria .dijitTabContainer .tabStripSlideButtonLeft img {
+	background-position: 0px top;
+}
+.soria .dijitTabContainer .tabStripSlideButtonRight img {
+	background-position: -30px top;
 }
- 
- 
 .soria .dijitAccordionContainer {
 	border-color: #b1badf;
 	background-color: #fff;
@@ -331,7 +1889,7 @@
 	border-top: 1px solid #b9bbdd;
 	border-bottom: 1px solid #b9bbdd;
 	padding: 5px 4px 5px 8px;
-	cursor: default;	
+	cursor: default;
 	color: #243C5F;
 }
 .soria .dijitAccordionArrow {
@@ -348,7 +1906,6 @@
 	margin-left: 4px;
 	margin-right: 4px;
 }
- 
 .soria .dijitSplitContainerSizerH {
 	background:url(images/splitContainerSizerV.png) repeat-y #cddef4;
 	border:0;
@@ -405,10 +1962,10 @@
 	height:5px;
 }
 .soria .dijitSplitterH .dijitSplitterThumb {
-	background:url(images/splitContainerSizerH-thumb.png) no-repeat;
-	top:1px;
+	background:#B0B0B0 none;
+	height:1px;
+	top:2px;
 	width:19px;
-	height:2px;
 }
 .soria .dijitSplitterV,
 .soria .dijitGutterV {
@@ -419,10 +1976,10 @@
 	width:5px;
 }
 .soria .dijitSplitterV .dijitSplitterThumb {
-	background:url(images/splitContainerSizerV-thumb.png) no-repeat;
-	left:1px;
+	background:#B0B0B0 none;
 	height:19px;
-	width:5px;
+	left:2px;
+	width:1px;
 }
 .soria .dijitSplitterActive {
 	font-size: 1px;
@@ -456,18 +2013,6 @@
 .dj_ie6 .soria .dijitTextArea {
 	background:#fff url(images/validationInputBg.gif) repeat-x top left;
 }
-.soria .dijitTextBoxDisabled,
-.soria .dijitComboBoxDisabled,
-.soria .dijitSpinnerDisabled,
-.soria .dijitTextAreaDisabled {
-	color: gray;
-}
-.dj_webkit .soria .dijitTextBoxDisabled,
-.dj_webkit .soria .dijitComboBoxDisabled,
-.dj_webkit .soria .dijitSpinnerDisabled,
-.dj_webkit .soria .dijitTextareaDisabled {
-	color: #eee;
-}
 .soria .dijitComboBox .dijitButtonNode {
 	padding: 0 0.2em;
 }
@@ -525,16 +2070,18 @@
 	
 	border: 1px solid #8ba0bd;
 	border-bottom:1px solid #657c9c;
-	padding: 0.1em 0.2em 0.2em 0.2em; 
+	padding: 0.1em 0.2em 0.2em 0.2em;
 	background: #bcd5f0 url(images/buttonEnabled.png) repeat-x top left;
 }
-.soria .dijitButtonNode button { 
-	border: 0px; 
-	background-color: transparent; 
-} 
- 
+.soria .dijitSelect .dijitButtonContents {
+	border-right: none;
+}
+.soria .dijitButtonNode button {
+	border: 0px;
+	background-color: transparent;
+}
 .soria .dijitButtonText {
-	text-align: center; 
+	text-align: center;
 	padding: 0 0.3em;
 }
 .soria .dijitComboBox .dijitButtonNode {
@@ -546,10 +2093,9 @@
 .soria .dijitComboButton .dijitDownArrowButton {
 	padding-right:4px;
 }
-.dj_ff2 .soria .dijitComboButton .dijitButtonContentsFocused,
-.dj_ff2 .soria .dijitComboButton .dijitDownArrowButtonFocused {
-	border: 1px black dotted !important;
-}
+.soria .dijitComboBoxReadOnly,
+.soria .dijitSpinnerReadOnly,
+.soria .dijitSpinnerReadOnly .dijitButtonNode,
 .soria .dijitButtonDisabled .dijitButtonNode,
 .soria .dijitToggleButtonDisabled .dijitButtonNode,
 .soria .dijitDropDownButtonDisabled .dijitButtonNode,
@@ -560,7 +2106,11 @@
 	
 	border-color: #b9bbdd #b9bbdd #b9bbdd #b9bbdd;
 	background:#c3d3e5 url(images/buttonDisabled.png) top repeat-x;
-	opacity: 0.60; 
+	opacity: 0.60;
+}
+.dj_ie6 .soria .dijitComboButtonDisabled .dijitButtonText {
+	
+	color: #aaa;
 }
 .soria .dijitButtonHover .dijitButtonNode,
 .soria .dijitButtonNodeHover,
@@ -592,20 +2142,22 @@
 	background: #91b4e5 url(images/buttonActive.png) top left repeat-x;
 }
 .soria .dijitArrowButtonInner {
-	background:url(images/spriteArrows.png) no-repeat left top;
+	background-image: url(images/spriteArrows.png);
+	background-repeat: no-repeat;
+	background-position: 0px top;
 	width: 11px;
 }
-.soria .dijitUpArrowButton .dijitArrowButtonInner { 
-	background:url(images/spriteArrows.png) no-repeat -22px top; 
-	width: 11px;
+.soria .dijitLeftArrowButton .dijitArrowButtonInner {
+	background-position: -11px top;
 }
-.dj_ie6 .soria .dijitArrowButtonInner {
-	background:url(images/spriteArrows.gif) no-repeat left top;
-	width: 11px;
+.soria .dijitUpArrowButton .dijitArrowButtonInner {
+	background-position: -22px top;
 }
-.dj_ie6 .soria .dijitUpArrowButton .dijitArrowButtonInner {
-	background:url(images/spriteArrows.gif) no-repeat -22px top;
-	width: 11px;
+.soria .dijitRightArrowButton .dijitArrowButtonInner {
+	background-position: -33px top;
+}
+.dj_ie6 .soria .dijitArrowButtonInner {
+	background-image: url(images/spriteArrows.gif);
 }
 .soria .dijitComboBox .dijitArrowButton .dijitArrowButtonInner {
 	background:url(images/spriteArrows.png) no-repeat left center;
@@ -725,7 +2277,7 @@
 	
 }
 .soria .dijitSliderFocused .dijitSliderBar {
-	border-color:#8ba0bd;	
+	border-color:#8ba0bd;
 }
 .dijit_a11y .dijitSliderProgressBar {
 	background-color:#333 !important;
@@ -795,21 +2347,84 @@
 	background:url(images/spriteRoundedIconsSmall.png) no-repeat -15px top;
 	#background:url(images/spriteRoundedIconsSmall.gif) no-repeat -15px top;
 }
-.soria .dijitSliderDecrementIconH { 
+.soria .dijitSliderDecrementIconH {
 	background:url(images/spriteRoundedIconsSmall.png) no-repeat 0px top;
 	#background:url(images/spriteRoundedIconsSmall.gif) no-repeat 0px top;
 }
 .soria .dijitSliderButtonInner {
 	visibility:hidden;
 }
-.soria .dijitSliderDisabled {
-	opacity:0.6 !important;
+.soria .dijitSliderReadOnly *,
+.soria .dijitSliderDisabled * {
+	border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
+	color: #bdbdbd;
+}
+.soria .dijitSliderReadOnly .dijitSliderDecrementIconH,
+.soria .dijitSliderDisabled .dijitSliderDecrementIconH {
+	background-position: 0px -15px;
+}
+.soria .dijitSliderReadOnly .dijitSliderIncrementIconH,
+.soria .dijitSliderDisabled .dijitSliderIncrementIconH {
+	background-position: -30px -15px;
+}
+.soria .dijitSliderReadOnly .dijitSliderDecrementIconV,
+.soria .dijitSliderDisabled .dijitSliderDecrementIconV {
+	background-position: -15px -15px;
+}
+.soria .dijitSliderReadOnly .dijitSliderIncrementIconV,
+.soria .dijitSliderDisabled .dijitSliderIncrementIconV {
+	background-position: -45px -15px;
+}
+.soria .dijitSelectDisabled * {
+    cursor: not-allowed !important;
+}
+.soria .dijitSelectReadOnly * {
+    cursor: default !important;
+}
+.soria .dijitSelect .dijitButtonNode {
+	padding: 0px;
+}
+.soria .dijitSelect .dijitButtonContents {
+	padding-top: 1px;
+    background:#fff url(images/validationInputBg.png) repeat-x top left;
+    #background:#fff url(images/validationInputBg.gif) repeat-x top left;
+}
+.soria .dijitSelectHover .dijitButtonContents,
+.soria .dijitSelectActive .dijitButtonContents,
+.soria .dijitSelectOpened .dijitButtonContents,
+.soria .dijitSelectDisabled .dijitButtonContents,
+.soria .dijitSelectReadOnly .dijitButtonContents{
+	background: transparent none;
+}
+.dj_ie .soria .dijitSelect .dijitButtonContents {
+	padding-top: 0px;
+}
+.soria .dijitSelectDisabled .dijitButtonNode {
+    border-color: #b9bbdd #b9bbdd #b9bbdd #b9bbdd;
+    background:#c3d3e5 url(images/buttonDisabled.png) top repeat-x;
 }
-.dj_ie .soria .dijitSliderDisabled,
-.dj_ie .soria .dijitSliderDisabled .dijitRuleContainer,
-.dj_ie .soria .dijitSliderDisabled .dijitSliderRemainingBar,
-.dj_ie .soria .dijitSliderDisabled .dijitSliderProgressBar {
-	filter: gray() alpha(opacity=40);
+.dj_ie .soria .dijitSelectDisabled  .dijitButtonNode * {
+	filter: gray() alpha(opacity=50);
+}
+.soria .dijitSelectHover .dijitButtonNode {
+    color:#000;
+    background:#acc5e2 url(images/buttonHover.png) repeat-x top left;
+}
+.soria .dijitSelectActive .dijitButtonNode,
+.soria .dijitSelectOpened .dijitButtonNode {
+    border-color:#657c9c;
+    background: #91b4e5 url(images/buttonActive.png) top left repeat-x;
+}
+.soria .dijitSelectMenu td {
+	padding: 0em;
+}
+.soria .dijitSelectMenu .dijitMenuItemIcon {
+	margin: 0.1em 0.2em;
+	display: none;
+}
+.soria .dijitSelectMenu .dijitMenuItemLabel,
+.soria .dijitSelectMenu .dijitMenuArrowCell {
+	padding: 0.1em 0.2em;
 }
 .soria .dijitTreeNode {
     background : url(images/treeI.gif) no-repeat;
@@ -923,32 +2538,32 @@
 	
 	background:#cad2de url(images/progressBarAnim.gif) repeat-x center center;
 }
- 
- 
 .soria .dijitTitlePaneTitle {
 	background: #cccccc;
 	background:#fff url(images/titleBar.png) repeat-x top left;
 	border:1px solid #bfbfbf;
 	padding:3px 4px;
-	cursor: pointer;
 	font-size: 0.9em;
 	font-weight: bold;
 	color: #6d6d6d;
 }
 .soria .dijitTitlePaneTitle-hover {
 	background: #f9f9f9 url(images/accordionItemActive.png) top repeat-x;
+	cursor: pointer;
 }
 .soria .dijitTitlePaneTitle * {
 	vertical-align: middle;
 }
-.soria .dijitTitlePane .dijitArrowNode {
+.soria .dijitTitlePane .dijitOpen .dijitArrowNode,
+.soria .dijitTitlePane .dijitClosed .dijitArrowNode {
 	width:15px;
 	height:15px;
 }
 .soria .dijitTitlePaneFocused .dijitTitlePaneTextNode {
 	color: #243C5F;
 }
-.soria .dijitOpen .dijitTitlePaneTextNode {
+.soria .dijitOpen .dijitTitlePaneTextNode,
+.soria .dijitFixedOpen .dijitTitlePaneTextNode {
 	color: #243C5F;
 }
 .soria .dijitTitlePane .dijitClosed .dijitArrowNode {
@@ -966,10 +2581,10 @@
 .soria .dijitTitlePane .dijitArrowNodeInner {
 	display:none;
 }
-.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
+.dijit_a11y .dijitTitlePane .dijitOpen .dijitArrowNodeInner,
+.dijit_a11y .dijitTitlePane .dijitClosed .dijitArrowNodeInner {
 	display:inline !important;
 	font-family:monospace;
-	cursor: pointer;
 	padding-bottom:.2em;
 }
 .dijit_a11y .dijitTitlePane .dijitArrowNode {
@@ -991,7 +2606,6 @@
 	margin-left: 4px;
 	margin-right: 4px;
 }
-	
 .soria .dijitCalendarIncrementControl {
 	
 	width:15px;
@@ -1000,7 +2614,7 @@
 	background-repeat: no-repeat;
 }
 .dj_ie6 .soria .dijitCalendarIncrementControl {
-	font-size:.1em;	
+	font-size:.1em;
 	background-image: url(images/spriteRoundedIconsSmall.gif);
 }
 .soria .dijitA11ySideArrow {
@@ -1041,7 +2655,7 @@
 	text-align:center;
 }
 .soria .dijitCalendarBodyContainer {
-	border-bottom: 1px solid #eeeeee;	
+	border-bottom: 1px solid #eeeeee;
 }
 .soria .dijitCalendarMonthLabel {
 	color:#293a4b;
@@ -1076,7 +2690,7 @@
 	
 }
 .soria .dijitCalendarCurrentMonthDisabled {
-		
+	
 	background-color:#bbbbbc !important;
 }
 .soria .dijitCalendarDisabledDate {
@@ -1216,13 +2830,11 @@
 	padding: 0px;
 	background-color:#9abbea;
 }
-.soria .dijitToolbar label {	
+.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 {
+.dj_ie .soria .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
 	
 	border: 1px #777 dotted !important;
 	padding: 0px;
@@ -1309,7 +2921,7 @@
 	width:17px;
 	height:11px;
 }
-.dj_ie6 .soria .dijitTooltipBelow .dijitTooltipConnector {
+.dj_ie .soria .dijitTooltipBelow .dijitTooltipConnector {
 	background-image: url(images/tooltipConnectorUp.gif);
 }
 .soria .dijitTooltipAbove .dijitTooltipConnector {
@@ -1320,11 +2932,13 @@
 	width:17px;
 	height:11px;
 }
-.dj_ie6 .soria .dijitTooltipAbove .dijitTooltipConnector {
+.dj_ie .soria .dijitTooltipAbove .dijitTooltipConnector {
 	background-image: url(images/tooltipConnectorDown.gif);
 }
-.dj_ie6 .soria .dijitTooltipAbove .dijitTooltipConnector {
+.dj_ie .soria .dijitTooltipAbove .dijitTooltipConnector {
 	background-image: url(images/tooltipConnectorDown.gif);
+}
+.dj_ie6 .soria .dijitTooltipAbove .dijitTooltipConnector {
 	bottom: -5px;
 }
 .soria .dijitTooltipLeft {
@@ -1341,7 +2955,7 @@
 	width:11px;
 	height:17px;
 }
-.dj_ie6 .soria .dijitTooltipLeft .dijitTooltipConnector {
+.dj_ie .soria .dijitTooltipLeft .dijitTooltipConnector {
 	background-image: url(images/tooltipConnectorRight.gif);
 }
 .soria .dijitTooltipRight {
@@ -1355,7 +2969,7 @@
 	width:11px;
 	height:17px;
 }
-.dj_ie6 .soria .dijitTooltipRight .dijitTooltipConnector {
+.dj_ie .soria .dijitTooltipRight .dijitTooltipConnector {
 	background-image: url(images/tooltipConnectorLeft.gif);
 }
 .soria .dijitMenu,
@@ -1480,6 +3094,10 @@
 .soria .dijitEditorIconTabIndent { background-position: -702px; }
 .soria .dijitEditorIconSelectAll { background-position: -720px; }
 .soria .dijitEditorIconUnlink { background-position: -738px; }
+.soria .dijitEditorIconFullScreen { background-position: -756px; }
+.soria .dijitEditorIconViewSource { background-position: -774px; }
+.soria .dijitEditorIconPrint { background-position: -792px; }
+.soria .dijitEditorIconNewPage { background-position: -810px; }
 .dijitColorPalette {
 	border:1px solid #cbcbcb;
 	background:#fff;
diff --git a/dijit/themes/soria/soria_rtl.css b/dijit/themes/soria/soria_rtl.css
index 0189c42..e2ce51a 100644
--- a/dijit/themes/soria/soria_rtl.css
+++ b/dijit/themes/soria/soria_rtl.css
@@ -75,21 +75,21 @@
 	background-position:right;
 	padding-right:25px;
 }
+.dijitRtl .dijitTabContainer .tabStripMenuButton {
+	float: left;
+}
 .dijitRtl .soria .dijitTab {
 	margin-right:0;
 	margin-left:2px;		
 }
-.dijitRtl .soria .dijitTabContainerTopStrip,
-.dijitRtl .soria .dijitTabContainerBottomStrip {
-	padding-right: 3px;
-	padding-left: 0px;
-}
-.dijitRtl .soria .dijitTabContainerTop-tabs {
-	padding-left: auto;
-	padding-right: 3px;
+.dijitRtl .soria .dijitTabContainer .tabStripButton {
+	margin-left: 0;
 }
+.dijitRtl .soria .dijitTabContainerTopStrip,
+.dijitRtl .soria .dijitTabContainerBottomStrip,
+.dijitRtl .soria .dijitTabContainerTop-tabs,
 .dijitRtl .soria .dijitTabContainerBottom-tabs {
-	padding-left: auto;
+	padding-left: 0;
 	padding-right: 3px;
 }
 .dijitRtl .soria .dijitTabInnerDiv {
@@ -150,6 +150,10 @@
 .dijitRtl .soria .dijitComboBox .dijitButtonNode {
 	border-width: 0px 0px 0px 1px;
 }
+.dijitRtl .soria .dijitSelect .dijitButtonContents {
+	border-left: none;
+	border-right-width: 1px;
+}
 .dijitRtl .soria .dijitComboBox .dijitButtonNode,
 .dijitRtl .soria .dijitSpinner .dijitButtonNode {
 	
@@ -162,7 +166,7 @@
 }
 .dijitRtl .soria .dijitTreeContainer .dijitTreeContent {
     padding-left: auto;
-    padding-right: 1px;   
+    padding-right: 1px;
 }
 .dijitRtl .soria .dijitTreeContainer .dijitTreeExpandoOpened {
 	background: url(images/spriteTree_rtl.gif) no-repeat -18px top;
diff --git a/dijit/themes/tundra/Calendar.css b/dijit/themes/tundra/Calendar.css
index 443aa43..25b605f 100644
--- a/dijit/themes/tundra/Calendar.css
+++ b/dijit/themes/tundra/Calendar.css
@@ -1,5 +1,4 @@
 
-	
 .tundra .dijitCalendarIncrementControl {
 	
 	width:15px;
@@ -49,7 +48,7 @@
 	text-align:center;
 }
 .tundra .dijitCalendarBodyContainer {
-	border-bottom: 1px solid #eeeeee;	
+	border-bottom: 1px solid #eeeeee;
 }
 .tundra .dijitCalendarMonthLabel {
 	color:#293a4b;
@@ -82,7 +81,7 @@
 	background-color:white !important;
 }
 .tundra .dijitCalendarCurrentMonthDisabled {
-		
+	
 	background-color:#bbbbbc !important;
 }
 .tundra .dijitCalendarDisabledDate {
diff --git a/dijit/themes/tundra/Dialog.css b/dijit/themes/tundra/Dialog.css
index f96dd28..ac5774c 100644
--- a/dijit/themes/tundra/Dialog.css
+++ b/dijit/themes/tundra/Dialog.css
@@ -62,13 +62,10 @@
 	
 	background: #ffffff url("images/popupMenuBg.gif") repeat-x bottom left;
 	border: 1px solid #7eabcd;
-	padding: 0.45em;	
+	padding: 0.45em;
 	-webkit-border-radius: 3px;
-}
-.dj_ff3 .tundra .dijitTooltipContainer {
-	
 	-moz-border-radius: 3px;
-}	
+}
 .tundra .dijitTooltipConnector {
 	
 	border:0px;
@@ -87,7 +84,7 @@
 	width:16px;
 	height:14px;
 }
-.dj_ie6 .tundra .dijitTooltipBelow .dijitTooltipConnector {
+.dj_ie .tundra .dijitTooltipBelow .dijitTooltipConnector {
 	
 	background-image: url("images/tooltipConnectorUp.gif");
 }
@@ -99,7 +96,7 @@
 	width:16px;
 	height:14px;
 }
-.dj_ie6 .tundra .dijitTooltipAbove .dijitTooltipConnector {
+.dj_ie .tundra .dijitTooltipAbove .dijitTooltipConnector {
 	background-image: url("images/tooltipConnectorDown.gif");
 }
 .dj_ie6 .tundra .dijitTooltipAbove .dijitTooltipConnector {
@@ -119,7 +116,7 @@
 	width:16px;
 	height:14px;
 }
-.dj_ie6 .tundra .dijitTooltipLeft .dijitTooltipConnector {
+.dj_ie .tundra .dijitTooltipLeft .dijitTooltipConnector {
 	background-image: url("images/tooltipConnectorRight.gif");
 }
 .tundra .dijitTooltipRight {
@@ -133,7 +130,7 @@
 	width:16px;
 	height:14px;
 }
-.dj_ie6 .tundra .dijitTooltipRight .dijitTooltipConnector {
+.dj_ie .tundra .dijitTooltipRight .dijitTooltipConnector {
 	background-image: url("images/tooltipConnectorLeft.gif");
 }
 .dj_webkit .tundra .dijitPopup .dijitTooltipContainer,
diff --git a/dijit/themes/tundra/Editor.css b/dijit/themes/tundra/Editor.css
index f929b97..a6f4ecb 100644
--- a/dijit/themes/tundra/Editor.css
+++ b/dijit/themes/tundra/Editor.css
@@ -59,3 +59,7 @@
 .tundra .dijitEditorIconTabIndent { background-position: -702px; }
 .tundra .dijitEditorIconSelectAll { background-position: -720px; }
 .tundra .dijitEditorIconUnlink { background-position: -738px; }
+.tundra .dijitEditorIconFullScreen { background-position: -756px; }
+.tundra .dijitEditorIconViewSource { background-position: -774px; }
+.tundra .dijitEditorIconPrint { background-position: -792px; }
+.tundra .dijitEditorIconNewPage { background-position: -810px; }
diff --git a/dijit/themes/tundra/TitlePane.css b/dijit/themes/tundra/TitlePane.css
index f5d8de3..3fc2433 100644
--- a/dijit/themes/tundra/TitlePane.css
+++ b/dijit/themes/tundra/TitlePane.css
@@ -3,16 +3,16 @@
 	background:#fff url("images/titleBar.png") repeat-x bottom left;
 	border:1px solid #bfbfbf;
 	padding:3px 4px;
-	cursor: pointer;
 }
 .tundra .dijitTitlePaneTitle-hover  {
 	background: #f8fafd url("images/accordionItemHover.gif") bottom repeat-x;
+	cursor: pointer;
 }
 .tundra .dijitTitlePaneTitle * {
 	vertical-align: middle;
 }
-.tundra .dijitTitlePane .dijitArrowNode {
-	cursor: pointer;
+.tundra .dijitTitlePane .dijitOpen .dijitArrowNode,
+.tundra .dijitTitlePane .dijitClosed .dijitArrowNode {
 	background-image: url('images/spriteArrows.png');
 	background-repeat: no-repeat;
 	height: 7px;
@@ -31,15 +31,17 @@
 	text-decoration:underline;
 }
 .tundra .dijitTitlePane .dijitArrowNodeInner {
+	
 	display:none;
 }
-.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
+.dijit_a11y .dijitTitlePane .dijitOpen .dijitArrowNodeInner,
+.dijit_a11y .dijitTitlePane .dijitClosed .dijitArrowNodeInner {
 	display:inline !important;
 	font-family:monospace;
-	cursor: pointer;
 	padding-bottom:.2em;
 }
 .dijit_a11y .dijitTitlePane .dijitArrowNode {
+	
 	display:none;
 }
 .tundra .dijitTitlePaneContentOuter {
diff --git a/dijit/themes/tundra/Toolbar.css b/dijit/themes/tundra/Toolbar.css
index 7033ddf..bbb7cdb 100644
--- a/dijit/themes/tundra/Toolbar.css
+++ b/dijit/themes/tundra/Toolbar.css
@@ -45,14 +45,12 @@
 	padding: 0px;	
 	background-color:#e1e5f0;
 }
-.tundra .dijitToolbar label {	
+.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 {
+.dj_ie .tundra .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
 	
 	border: 1px #555 dotted !important;
-	padding: 0px;	
+	padding: 0px;
 }
diff --git a/dijit/themes/tundra/form/Button.css b/dijit/themes/tundra/form/Button.css
index f357f5b..8617f37 100644
--- a/dijit/themes/tundra/form/Button.css
+++ b/dijit/themes/tundra/form/Button.css
@@ -1,18 +1,24 @@
 
 .tundra .dijitButtonNode {
 	
-	border: 1px solid #c0c0c0; 
-	border-bottom: 1px solid #9b9b9b; 
-	padding: 0.1em 0.2em 0.2em 0.2em; 
+	border: 1px solid #c0c0c0;
+	border-bottom: 1px solid #9b9b9b;
+	padding: 0.1em 0.2em 0.2em 0.2em;
 	background: #fff url("../images/buttonEnabled.png") repeat-x bottom left;
 }
-.tundra .dijitButtonNode button { 
-	border: 0px; 
-	background-color: transparent; 
-} 
- 
+.tundra .dijitSelect .dijitButtonContents {
+	border-right: none;
+}
+.dijitRtl .tundra .dijitSelect .dijitButtonContents {
+	border-left: none;
+	border-right-width: 1px;
+}
+.tundra .dijitButtonNode button {
+	border: 0px;
+	background-color: transparent;
+}
 .tundra .dijitButtonText {
-	text-align: center; 
+	text-align: center;
 	padding: 0 0.3em;
 }
 .tundra .dijitDisabled .dijitButtonText {
@@ -24,10 +30,9 @@
 .tundra .dijitComboButton .dijitDownArrowButton {
 	padding-right:4px;
 }
-.dj_ff2 .tundra .dijitComboButton .dijitButtonContentsFocused,
-.dj_ff2 .tundra .dijitComboButton .dijitDownArrowButtonFocused {
-	border: 1px solid transparent; 
-}
+.tundra .dijitComboBoxReadOnly,
+.tundra .dijitSpinnerReadOnly,
+.tundra .dijitSpinnerReadOnly .dijitButtonNode,
 .tundra .dijitButtonDisabled .dijitButtonNode,
 .tundra .dijitToggleButtonDisabled .dijitButtonNode,
 .tundra .dijitDropDownButtonDisabled .dijitButtonNode,
@@ -37,7 +42,7 @@
 .tundra .dijitSpinnerDisabled .dijitButtonNode {
 	
 	
-	border-color: #d5d5d5 #d5d5d5 #bdbdbd #d5d5d5; 
+	border-color: #d5d5d5 #d5d5d5 #bdbdbd #d5d5d5;
 	background:#e4e4e4 url("../images/buttonDisabled.png") top repeat-x;
 }
 .tundra .dijitButtonHover .dijitButtonNode,
@@ -45,11 +50,11 @@
 .tundra .dijitToggleButtonHover .dijitButtonNode,
 .tundra .dijitDropDownButtonHover .dijitButtonNode,
 .tundra .dijitComboButtonHover .dijitButtonContents,
-.tundra .dijitComboButtonDownArrowHover .dijitDownArrowButton {
+.tundra .dijitComboButtonDownArrowHover .dijitArrowButton {
 	
 	
-	border-color:		#a5beda; 
-	border-bottom-color:#5c7590; 
+	border-color: #a5beda;
+	border-bottom-color:#5c7590;
 	color:#243C5F;
 	background:#fcfdff url("../images/buttonHover.png") repeat-x bottom;
 }
@@ -74,8 +79,7 @@
 	background: #ededed url("../images/buttonActive.png") bottom repeat-x;
 }
 .tundra .dijitArrowButtonInner {
-	background-image:url("../images/spriteArrows.png");
-	background-position: left top;
+	background:url("../images/spriteArrows.png") no-repeat scroll 0px center;
 	width: 7px;
 	height: 7px;
 	font-size: 1px;
@@ -84,20 +88,28 @@
 .dj_ie6 .tundra .dijitArrowButtonInner {
 	background-image:url("../images/spriteArrows.gif");
 }
+.tundra .dijitLeftArrowButton .dijitArrowButtonInner {
+	background-position: -7px center;
+}
+.tundra .dijitRightArrowButton .dijitArrowButtonInner {
+	background-position: -14px center;
+}
+.tundra .dijitUpArrowButton .dijitArrowButtonInner {
+	background-position: -21px center;
+}
 .tundra .dijitDisabled .dijitArrowButtonInner {
-	background-position: -28px top;
+	background-position: -28px center;
+}
+.tundra .dijitDisabled .dijitLeftArrowButton .dijitArrowButtonInner {
+	background-position: -35px center;
 }
-.tundra .dijitUpArrowButton .dijitArrowButtonInner { 
-	background-position: -21px top; 
+.tundra .dijitDisabled .dijitRightArrowButton .dijitArrowButtonInner {
+	background-position: -42px center;
 }
-.tundra .dijitDisabled .dijitUpArrowButton .dijitArrowButtonInner { 
-	background-position: -49px top; 
+.tundra .dijitDisabled .dijitUpArrowButton .dijitArrowButtonInner {
+	background-position: -49px center;
 }
 .tundra .dijitComboBox .dijitArrowButton .dijitArrowButtonInner {
-	background-image: url("../images/comboArrowDown.gif");
-	background-repeat: no-repeat;
-	background-attachment: scroll;
-	background-position: center center;
 	height: auto;
 	font-size: 100%;
 	font-size: inherit;
@@ -108,7 +120,7 @@
 .tundra .dijitSpinner .dijitArrowButtonInner {
 	display: block;  
 	position:absolute;
-	top: 50%; 
+	top: 50%;
 	margin-top: -4px; 
 	left: 50%;
 	margin-left: -4px; 
diff --git a/dijit/themes/tundra/form/Common.css b/dijit/themes/tundra/form/Common.css
index a43f17f..c949d1e 100644
--- a/dijit/themes/tundra/form/Common.css
+++ b/dijit/themes/tundra/form/Common.css
@@ -26,18 +26,6 @@
 	border:1px solid #b3b3b3;
 	line-height: normal;
 }
-.tundra .dijitTextBoxDisabled,
-.tundra .dijitComboBoxDisabled,
-.tundra .dijitSpinnerDisabled,
-.tundra .dijitTextAreaDisabled {
-	color: gray;
-}
-.dj_webkit .tundra .dijitTextBoxDisabled,
-.dj_webkit .tundra .dijitComboBoxDisabled,
-.dj_webkit .tundra .dijitSpinnerDisabled,
-.dj_webkit .tundra .dijitTextAreaDisabled {
-	color: #eee;
-}
 .tundra .dijitComboBox .dijitInputField {
 	padding: 1px 0;
 }
@@ -98,9 +86,7 @@
 .tundra .dijitInlineEditor {
 	
 	display: inline-block;
-	display: -moz-inline-stack;
 	#display:inline;
-	
 }
 .dijitInlineEditor .saveButton,
 .dijitInlineEditor .cancelButton {
diff --git a/dijit/themes/tundra/form/Common_rtl.css b/dijit/themes/tundra/form/Common_rtl.css
index 093415e..d1a7f8c 100644
--- a/dijit/themes/tundra/form/Common_rtl.css
+++ b/dijit/themes/tundra/form/Common_rtl.css
@@ -1,6 +1,6 @@
 .dijitRtl .tundra .dijitComboBox .dijitButtonNode,
-.dijitRtl  .dijitSpinner .dijitButtonNode {
+.dijitRtl .tundra .dijitSpinner .dijitButtonNode {
 	
-	border-color: #9b9b9b;
-	border-width: 0px 1px 0px 0px;
+	border-left-width: 0px;
+	border-right-width: 1px;
 }
diff --git a/dijit/themes/tundra/form/Select.css b/dijit/themes/tundra/form/Select.css
new file mode 100644
index 0000000..fc5092b
--- /dev/null
+++ b/dijit/themes/tundra/form/Select.css
@@ -0,0 +1,55 @@
+
+.tundra .dijitSelectDisabled * {
+    cursor: not-allowed !important;
+}
+.tundra .dijitSelectReadOnly * {
+    cursor: default !important;
+}
+.tundra .dijitSelect .dijitButtonNode {
+	padding: 0px;
+}
+.tundra .dijitSelect .dijitButtonContents {
+	padding-top: 1px;
+    background:#fff url("../images/validationInputBg.png") repeat-x top left;
+    #background:#fff url('../images/validationInputBg.gif') repeat-x top left;
+}
+.tundra .dijitSelectHover .dijitButtonContents,
+.tundra .dijitSelectActive .dijitButtonContents,
+.tundra .dijitSelectOpened .dijitButtonContents,
+.tundra .dijitSelectDisabled .dijitButtonContents,
+.tundra .dijitSelectReadOnly .dijitButtonContents{
+	background: transparent none;
+}
+.dj_ie .tundra .dijitSelect .dijitButtonContents {
+	padding-top: 0px;
+}
+.tundra .dijitSelectDisabled .dijitButtonNode {
+    border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
+    background:#e4e4e4 url("../images/buttonDisabled.png") top repeat-x;
+}
+.dj_ie .tundra .dijitSelectDisabled  .dijitButtonNode * {
+	filter: gray() alpha(opacity=50);
+}
+.tundra .dijitSelectHover .dijitButtonNode {
+    border-color:#a5beda;
+    border-bottom-color:#5c7590;
+    border-right-color:#5c7590;
+    color:#243C5F;
+    background:#fcfdff url("../images/buttonHover.png") repeat-x bottom;
+}
+.tundra .dijitSelectActive .dijitButtonNode,
+.tundra .dijitSelectOpened .dijitButtonNode {
+    border-color:#366dba;
+    background: #ededed url("../images/buttonActive.png") bottom repeat-x;
+}
+.tundra .dijitSelectMenu td {
+	padding: 0em;
+}
+.tundra .dijitSelectMenu .dijitMenuItemIcon {
+	margin: 0.1em 0.2em;
+	display: none;
+}
+.tundra .dijitSelectMenu .dijitMenuItemLabel,
+.tundra .dijitSelectMenu .dijitMenuArrowCell {
+	padding: 0.1em 0.2em;
+}
diff --git a/dijit/themes/tundra/form/Slider.css b/dijit/themes/tundra/form/Slider.css
index 59c4685..dbb95d7 100644
--- a/dijit/themes/tundra/form/Slider.css
+++ b/dijit/themes/tundra/form/Slider.css
@@ -27,7 +27,7 @@
 	outline:1px;
 }
 .tundra .dijitSliderFocused .dijitSliderBar {
-	border-color:#888;	
+	border-color:#888;
 }
 .dijit_a11y .dijitSliderProgressBar {
 	background-color:#888 !important;
@@ -112,15 +112,24 @@
 .tundra .dijitSliderButtonInner {
 	visibility:hidden;
 }
-.tundra .dijitSliderDisabled {
-	opacity:0.6 !important;
+.tundra .dijitSliderReadOnly *,
+.tundra .dijitSliderDisabled * {
+	border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
+	color: #bdbdbd;
 }
-.dj_ie .tundra .dijitSliderDisabled,
-.dj_ie .tundra .dijitSliderDisabled .dijitRuleContainer,
-.dj_ie .tundra .dijitSliderDisabled .dijitSliderRemainingBar,
-.dj_ie .tundra .dijitSliderDisabled .dijitSliderProgressBar {
-	filter: gray() alpha(opacity=40);
+.tundra .dijitSliderReadOnly .dijitSliderDecrementIconH,
+.tundra .dijitSliderDisabled .dijitSliderDecrementIconH {
+	background-position: -35px 0px;
 }
-.tundra .dijitSliderDisabled * {
-	cursor: not-allowed !important;
+.tundra .dijitSliderReadOnly .dijitSliderIncrementIconH,
+.tundra .dijitSliderDisabled .dijitSliderIncrementIconH {
+	background-position: -42px 0px;
+}
+.tundra .dijitSliderReadOnly .dijitSliderDecrementIconV,
+.tundra .dijitSliderDisabled .dijitSliderDecrementIconV {
+	background-position: -28px 0px;
+}
+.tundra .dijitSliderReadOnly .dijitSliderIncrementIconV,
+.tundra .dijitSliderDisabled .dijitSliderIncrementIconV {
+	background-position: -49px 0px;
 }
diff --git a/dijit/themes/tundra/images/editor.gif b/dijit/themes/tundra/images/editor.gif
index 127c9c4..750c6b9 100644
Binary files a/dijit/themes/tundra/images/editor.gif and b/dijit/themes/tundra/images/editor.gif differ
diff --git a/dijit/themes/tundra/images/editorDisabled.gif b/dijit/themes/tundra/images/editorDisabled.gif
index 9dc5103..e40460d 100644
Binary files a/dijit/themes/tundra/images/editorDisabled.gif and b/dijit/themes/tundra/images/editorDisabled.gif differ
diff --git a/dijit/themes/tundra/images/editorDisabled_rtl.gif b/dijit/themes/tundra/images/editorDisabled_rtl.gif
index 74d407a..a0f6c10 100644
Binary files a/dijit/themes/tundra/images/editorDisabled_rtl.gif and b/dijit/themes/tundra/images/editorDisabled_rtl.gif differ
diff --git a/dijit/themes/tundra/images/editorMaster.png b/dijit/themes/tundra/images/editorMaster.png
new file mode 100644
index 0000000..2e6772f
Binary files /dev/null and b/dijit/themes/tundra/images/editorMaster.png differ
diff --git a/dijit/themes/tundra/images/editor_rtl.gif b/dijit/themes/tundra/images/editor_rtl.gif
index b94d040..a9740c2 100644
Binary files a/dijit/themes/tundra/images/editor_rtl.gif and b/dijit/themes/tundra/images/editor_rtl.gif differ
diff --git a/dijit/themes/tundra/images/titleBar.png b/dijit/themes/tundra/images/titleBar.png
index 617d9d4..b2609f3 100644
Binary files a/dijit/themes/tundra/images/titleBar.png and b/dijit/themes/tundra/images/titleBar.png differ
diff --git a/dijit/themes/tundra/layout/BorderContainer.css b/dijit/themes/tundra/layout/BorderContainer.css
index 22ec672..076460f 100644
--- a/dijit/themes/tundra/layout/BorderContainer.css
+++ b/dijit/themes/tundra/layout/BorderContainer.css
@@ -27,10 +27,10 @@
 	height:5px;
 }
 .tundra .dijitSplitterH .dijitSplitterThumb {
-	background:url("../images/splitContainerSizerH-thumb.png") no-repeat;
-	top:1px;
+	background:#B0B0B0 none;
+	height:1px;
+	top:2px;
 	width:19px;
-	height:2px;
 }
 .tundra .dijitSplitterV,
 .tundra .dijitGutterV {
@@ -39,10 +39,10 @@
 	width:5px;
 }
 .tundra .dijitSplitterV .dijitSplitterThumb {
-	background:url("../images/splitContainerSizerV-thumb.png") no-repeat;
-	left:1px;
+	background:#B0B0B0 none;
 	height:19px;
-	width:5px;
+	left:2px;
+	width:1px;
 }
 .tundra .dijitSplitterActive {
 	font-size: 1px;
diff --git a/dijit/themes/tundra/layout/TabContainer.css b/dijit/themes/tundra/layout/TabContainer.css
index 4307abb..f644935 100644
--- a/dijit/themes/tundra/layout/TabContainer.css
+++ b/dijit/themes/tundra/layout/TabContainer.css
@@ -13,10 +13,26 @@
 	background:#e2e2e2 url("../images/tabEnabled.png") repeat-x;
 }
 .tundra .dijitTabInnerDiv {
-	padding:6px 8px 5px 9px;
+	padding:2px 8px 2px 9px;
 }
-.dijitTabSpacer {
-	font-size: 1px;
+.tundra .dijitTabSpacer {
+	display: none;
+}
+.tundra .dijitTabContainer .tabStripRBtn {
+	margin-right: 20px;
+}
+.tundra .dijitTabContainer .tabStripLBtn {
+	margin-left: 20px;
+}
+.tundra .nowrapTabStrip .dijitTab {
+	top: 2px;
+}
+.tundra .dijitTabContainerBottom .nowrapTabStrip .dijitTab {
+	top: 0px;
+	bottom: 2px;
+}
+.tundra .dijitTabContainer .tabStripMenuButton-Hover {
+	cursor: pointer;
 }
 .tundra .dijitTabChecked {
 	
@@ -29,9 +45,22 @@
 	border-top-color:#92a0b3;
 	border-left-color:#92a0b3;
 	border-right-color:#92a0b3;
+	border-bottom-color:#92a0b3;
 	background:#e2e2e2 url("../images/tabHover.gif") repeat-x;
 }
-.tundra .dijitTabCheckedHover {
+.tundra .dijitTabContainerTop .dijitTabHover {
+	border-bottom-color:#ccc;
+}
+.tundra .dijitTabContainerBottom .dijitTabHover {
+	border-top-color:#ccc;
+}
+.tundra .dijitTabContainerLeft .dijitTabHover {
+	border-right-color:#ccc;
+}
+.tundra .dijitTabContainerRight .dijitTabHover {
+	border-left-color:#ccc;
+}
+.tundra .dijitTabContainer .dijitTabCheckedHover {
 	color: inherit;
 	border:1px solid #ccc;
 	background:#fff;
@@ -41,15 +70,21 @@
 	width: 12px;
 	height: 12px;
 }
-.tundra .dijitTab .dijitTabButtonSpacer {
+.tundra .dijitTab .tabLabel {
 	
-	height: 12px;
-	width: 1px;
+	min-height: 12px;
+	display: inline-block;
+}
+.tundra .dijitTabContainerNested .dijitTabListWrapper {
+	height: auto;
+}
+.tundra .dijitTabContainerNested .dijitTabContainerTop-tabs {
+	border-bottom: 1px solid #CCC;
 }
 .tundra .dijitTabContainerTabListNested .dijitTab {
 	background: none;
 	border: none;
-	top: 0px;		 
+	top: 0px;		
 }
 .tundra .dijitTabContainerTabListNested .dijitTab .dijitTabContent {
 }
@@ -77,8 +112,14 @@
 	background-image : url("../images/tabCloseHover.gif");
 }
 .tundra .dijitTabContainerTop-tabs {
+	margin-bottom: 0px;
+	border-color: #cccccc;
+	padding-left: 3px;
+	background-position: bottom;
+}
+.tundra .dijitTabContainerTop-tabs .dijitTab {
+	top: 0px;
 	margin-bottom: -1px;
-	border-color: #ccc;
 }
 .tundra .dijitTabContainerTop-container {
 	border-top: none;
@@ -86,17 +127,30 @@
 .tundra .dijitTabContainerTop-tabs .dijitTabChecked {
 	border-bottom-color:white;
 }
-.tundra .dijitTabContainerTopStrip {
-	border: 1px solid #ccc;
-	padding-top: 2px;
+.tundra .dijitTabContainerTop-tabs,
+.tundra .dijitTabContainerBottom-tabs {
 	padding-left: 3px;
+	padding-right: 3px;
 }
 .tundra .dijitTabContainerTopStrip {
+	border-top: 1px solid #CCC;
+	border-right: 1px solid #CCC;
+	border-left: 1px solid #CCC;
+	padding-top: 2px;
 	background: #f2f2f2;
 }
+.tundra .dijitTabContainerTopNone {
+	padding-top: 0px;
+}
 .tundra .dijitTabContainerBottom-tabs {
+	margin-top: 0px;
+	border-color: #cccccc;
+	background-position: top;
+	padding-left: 3px;
+}
+.tundra .dijitTabContainerBottom-tabs .dijitTab {
+	bottom: 0px;
 	margin-top: -1px;
-	border-color: #ccc;
 }
 .tundra .dijitTabContainerBottom-container {
 	border-bottom: none;
@@ -106,21 +160,17 @@
 }
 .tundra .dijitTabContainerBottomStrip {
 	padding-bottom: 2px;
-	padding-left: 3px;	
 	border: 1px solid #ccc;
-}
-.tundra .dijitTabContainerBottomStrip {
 	background: #f2f2f2;
-}
-.tundra .dijitTabContainerBottom-spacer,
-.tundra .dijitTabContainerTop-spacer {
-	height: 0px;
-	border-top: 1px solid #ccc;
-	background: #fff;
+	border-top: none;
 }
 .tundra .dijitTabContainerRight-tabs {
-	margin-left: -1px;
 	border-color: #ccc;
+	height: 100%;
+	padding-top: 3px;
+}
+.tundra .dijitTabContainerRightStrip {
+	margin-left: -1px;
 }
 .tundra .dijitTabContainerRight-container {
 	border-right: none;
@@ -130,15 +180,17 @@
 }
 .tundra .dijitTabContainerRightStrip {
 	padding-right: 2px;
-	padding-top: 3px;	
 	border: 1px solid #ccc;
 }
 .tundra .dijitTabContainerRightStrip {
 	background: #f2f2f2;
 }
 .tundra .dijitTabContainerLeft-tabs {
-	margin-right: -1px;
 	border-color: #ccc;
+	padding-top: 3px;
+	height: 100%;
+}
+.tundra .dijitTabContainerLeft .dijitTabListWrapper {
 }
 .tundra .dijitTabContainerLeft-container {
 	border-left: none;
@@ -148,27 +200,64 @@
 }
 .tundra .dijitTabContainerLeftStrip {
 	padding-left: 2px;
-	padding-top: 3px;	
 	border: 1px solid #ccc;
-}
-.tundra .dijitTabContainerLeftStrip {
 	background: #f2f2f2;
+	border-right: none;
 }
 .tundra .dijitTabContainerLeft-tabs .dijitTab,
 .tundra .dijitTabContainerRight-tabs .dijitTab {
 	margin-right:0px;
 	margin-bottom:4px;	
 }
-.tundra .dijitTabContainerLeft-spacer,
-.tundra .dijitTabContainerRight-spacer {
-	width: 0px;
-	border-left: 1px solid #ccc;
-	background: #fff;
-}
 .tundra .dijitTabContainerTop-dijitContentPane .dijitTabContainerTop-tabs {
 	border-left: 0px solid #ccc;
 	border-top: 0px solid #ccc;
 	border-right: 0px solid #ccc;
 	padding-top: 0px;
-	padding-left: 0px;	
+	padding-left: 0px;
+}
+.tundra .dijitTabContainer .tabStripButton {
+	margin-right: 0;
+	padding-top: 2px;
+	z-index: 12;
+}
+.tundra .dijitTabContainerBottom .tabStripButton {
+	padding-top: 2px;
+}
+.tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv {
+	padding-bottom: 3px;
+	padding-top: 1px;
+}
+.tundra .tabStripButton .dijitTabInnerDiv {
+	padding: 3px 2px 4px 2px;
+}
+.dj_ie6 .tundra .tabStripButton .dijitTabInnerDiv,
+.dj_ie7 .tundra .tabStripButton .dijitTabInnerDiv,
+.dj_opera .tundra .tabStripButton .dijitTabInnerDiv {
+	padding-bottom: 5px;
+}
+.dj_ie6 .tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv,
+.dj_ie7 .tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv,
+.dj_opera .tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv {
+	padding-bottom: 4px;
+}
+.tundra .dijitTabContainer .tabStripButton {
+	
+	width: 21px;
+}
+.tundra .dijitTabContainer .tabStripButton img {
+	height: 14px;
+	background: url(../images/spriteRoundedIconsSmall.png) no-repeat;
+}
+.dj_ie6 .tundra .dijitTabContainer .tabStripButton img {
+	background-image: url(../images/spriteRoundedIconsSmall.gif);
+}
+.tundra .dijitTabContainer .tabStripMenuButton img {
+	background-position: -15px top;
+}
+.tundra .dijitTabContainer .tabStripSlideButtonLeft img {
+	background-position: 0px top;
+}
+.tundra .dijitTabContainer .tabStripSlideButtonRight img {
+	background-position: -30px top;
 }
diff --git a/dijit/themes/tundra/layout/TabContainer_rtl.css b/dijit/themes/tundra/layout/TabContainer_rtl.css
index f0ba45d..b55835e 100644
--- a/dijit/themes/tundra/layout/TabContainer_rtl.css
+++ b/dijit/themes/tundra/layout/TabContainer_rtl.css
@@ -1,16 +1,16 @@
 .dijitRtl .tundra .dijitTab {
-	margin-right:auto;
-	margin-left:4px;		
 	-moz-box-orient:horizontal;
 	text-align: right;
 }
-.dijitRtl .tundra .dijitTabContainerTopStrip,
-.dijitRtl .tundra .dijitTabContainerBottomStrip {
-	padding-right: 3px;
-	padding-left: 0px;
-}
 .dijitRtl .tundra .dijitTabInnerDiv {
-	padding:6px 9px 5px 8px;
+	padding:2px 9px 2px 8px;
+}
+.dijitRtl .tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv {
+	padding-bottom: 3px;
+	padding-top: 1px;
+}
+.dijitRtl .tundra .tabStripButton .dijitTabInnerDiv {
+	padding: 3px 2px 4px 2px;
 }
 .dijitRtl .tundra .dijitTabPaneWrapper {
 	#zoom: 1;
@@ -26,5 +26,6 @@
 	margin-left:0px;
 }
 .dj_ie-rtl .tundra .dijitTab .dijitTabInnerDiv {
-	width : 1% !important;
+	
+	width : 0.1% !important;
 }
diff --git a/dijit/themes/tundra/tundra.css b/dijit/themes/tundra/tundra.css
index cc8d0d9..9618d83 100644
--- a/dijit/themes/tundra/tundra.css
+++ b/dijit/themes/tundra/tundra.css
@@ -1,5 +1,1458 @@
 
- at import url("../dijit.css");
+.dijitReset {
+	
+	margin:0;
+	border:0;
+	padding:0;
+	line-height:normal;
+	font: inherit;
+	color: inherit;
+}
+.dijitInline {
+	
+	display:inline-block;			
+	#zoom: 1; 
+	#display:inline; 
+	border:0;
+	padding:0;
+	vertical-align:middle;
+	#vertical-align: auto;	
+}
+.dijitHidden {
+	
+	display: none !important;
+}
+.dijitVisible {
+	
+	display: block !important;	
+	position: relative;			
+}
+.dj_ie INPUT.dijitTextBox,
+.dj_ie .dijitInputField INPUT {
+	font-size: 100%;
+}
+.dj_ie .dijitInputField INPUT { 
+	margin: -1px 0 !important;
+}
+.dijitInlineTable {
+	
+	display:inline-table;
+	display:inline-block;		
+	#zoom: 1; 
+	#display:inline; 
+	box-sizing: content-box; -moz-box-sizing: content-box;
+	border:0;
+	padding:0;
+}
+.dijitTeeny {
+	font-size:1px;
+	line-height:1px;
+}
+.dijitPopup {
+	position: absolute;
+	background-color: transparent;
+	margin: 0;
+	border: 0;
+	padding: 0;
+}
+.dijit_a11y .dijitPopup,
+.dijit_ally .dijitPopup div,
+.dijit_a11y .dijitPopup table,
+.dijit_a11y .dijitTooltipContainer {
+	background-color: white !important;
+}
+.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 {
+	
+	background-color: #e2ebf2;
+	cursor: text;
+}
+.dijitDisplayNone {
+	
+	display:none !important;
+}
+.dijitContainer {
+	
+	overflow: hidden;	
+}
+.dijit_a11y * {
+	background-image:none !important;
+}
+.dijit_a11y .dijitCalendarIncrementControl {
+	display: none;	
+}
+.dijit_a11y .dijitA11ySideArrow {
+	display: inline !important; 
+	cursor: pointer;
+}
+.dijit_a11y .dijitCalendarDateLabel {
+	padding: 1px;
+}
+.dijit_a11y .dijitCalendarSelectedDate .dijitCalendarDateLabel {
+	border: solid 1px black;
+	padding: 0px;
+}
+.dijit_a11y .dijitCalendarDateTemplate {
+	padding-bottom: 0.1em !important;	
+}
+.dijit_a11y .dijit * {
+	background:white !important;
+	color:black !important;
+}
+.dijit_a11y .dijitButtonNode {
+	border-color: black!important;
+	border-style: outset!important;
+	border-width: medium!important;
+}
+.dijit_a11y .dijitComboBoxReadOnly .dijitInputField,
+.dijit_a11y .dijitComboBoxReadOnly .dijitButtonNode,
+.dijit_a11y .dijitSpinnerReadOnly .dijitButtonNode,
+.dijit_a11y .dijitSpinnerReadOnly .dijitInputField,
+.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: 1em;
+	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;
+}
+.dijitToggleButton,
+.dijitButton,
+.dijitDropDownButton,
+.dijitComboButton {
+	
+	margin: 0.2em;
+}
+.dijitToolbar .dijitToggleButton,
+.dijitToolbar .dijitButton,
+.dijitToolbar .dijitDropDownButton,
+.dijitToolbar .dijitComboButton {
+	margin: 0;
+}
+.dj_ie8 .dijitToolbar button,
+.dj_webkit .dijitToolbar button {
+	
+	padding: 1px 2px;
+}
+.dj_ie .dijitToolbar .dijitComboBox{
+	
+	vertical-align: middle;
+}
+.dj_ie .dijitComboButton {
+	
+	margin-bottom: -3px;
+}
+.dj_webkit .dijitToolbar .dijitDropDownButton {
+	padding-left: 0.3em;
+}
+.dj_gecko .dijitToolbar .dijitButtonNode::-moz-focus-inner {
+	padding:0;
+}
+.dijitButtonNode {
+	
+	border:1px solid gray;
+	margin:0;
+	line-height:normal;
+	vertical-align: middle;
+	#vertical-align: auto;
+	text-align:center;
+	white-space: nowrap;
+}
+.dijitButtonNode, .dijitButtonNode * {
+	cursor: pointer;
+}
+.dijitReadOnly *,
+.dijitDisabled *,
+.dijitReadOnly,
+.dijitDisabled,
+.dijitDisabledClickableRegion {	
+	cursor: not-allowed !important;
+}
+.dj_ie .dijitButtonNode {
+	
+	zoom: 1;
+}
+.dj_ie .dijitButtonNode button {
+	
+	overflow: visible;
+}
+.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: auto;
+	bottom: 0;
+	border-top-width: 1px !important;
+}
+.dijitSpinner .dijitInputLayoutContainer .dijitUpArrowButton {
+	top: 0;
+	bottom: auto;
+}
+TABLE.dijitComboButton {
+	
+	border-collapse: collapse;
+	border:0;
+	padding:0;
+	margin:0;
+}
+.dijitToolbar .dijitComboButton {
+	
+	border-collapse: separate;
+}
+.dj_ie BUTTON.dijitButtonNode {
+	overflow: visible; 
+}
+table .dijitButton .dijitButtonNode,
+table .dijitComboButton .dijitButtonNode {
+	#overflow:hidden; 
+}
+.dijitButtonNode IMG {
+	
+	vertical-align:middle;
+	
+}
+.dijitTextBox,
+.dijitComboBox,
+.dijitSpinner {
+	border: solid black 1px;
+	#overflow: hidden; 
+	width: 15em;	
+	vertical-align: middle;
+	#vertical-align: auto;
+}
+.dijitTimeTextBox {
+	width: 8em;
+}
+.dijitTextBox input:focus,
+.dijitComboBox input:focus,
+.dijitSpinner input:focus {
+	outline: none;	
+}
+.dijitTextBoxFocused,
+.dijitComboBoxFocused,
+.dijitSpinnerFocused, .dijitSpinnerUpArrowActive, .dijitSpinnerDownArrowActive,
+.dijitTextAreaFocused {
+	
+	outline: auto 5px -webkit-focus-ring-color;
+}
+.dijitTextBox INPUT,
+.dijitComboBox INPUT,
+.dijitSpinner INPUT {
+	border-left: solid black 1px;	
+	display:inline;
+	position:static !important;
+	border:0 !important;
+	margin:0 !important;
+	vertical-align:top !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.75em;
+	padding-right: 0.15em;
+	line-height: 160%;
+}
+.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%;
+}
+.dj_ie6 .dijitProgressBarFull {
+	height:1.6em;
+}
+.dijitProgressBarTile {
+	
+	position:absolute;
+	overflow:hidden;
+	top:0;
+	left:0;
+	bottom:0;
+	right:0;
+	margin:0;
+	padding:0;
+	width:auto;
+	height:auto;
+	background-color:#aaa;
+	background-attachment: fixed;
+}
+.dijit_a11y .dijitProgressBarTile{
+	
+	border-width:4px;
+	border-style:solid;
+	background-color:transparent !important;
+}
+.dj_ie6 .dijitProgressBarTile {
+	
+	position:static;
+	
+	height:1.6em;
+}
+.dijitProgressBarIndeterminate .dijitProgressBarLabel {
+	visibility:hidden;
+}
+.dijitProgressBarIndeterminate .dijitProgressBarTile {
+	
+}
+.dijitProgressBarIndeterminateHighContrastImage {
+	display:none;
+}
+.dijit_a11y .dijitProgressBarIndeterminate .dijitProgressBarIndeterminateHighContrastImage {
+	display:block;
+	position:absolute;
+	top:0;
+	bottom:0;
+	margin:0;
+	padding:0;
+	width:100%;
+	height:auto;
+}
+.dijitProgressBarLabel {
+	display:block;
+	position:static;
+	width:100%;
+	text-align:center;
+	background-color:transparent !important;
+}
+.dijitTooltip {
+	position: absolute;
+	z-index: 2000;
+	display: block;
+	
+	left: 50%;
+	top: -10000px;
+	overflow: visible;
+}
+.dijitTooltipContainer {
+	border: solid black 2px;
+	background: #b8b5b5;
+	color: black;
+	font-size: small;
+}
+.dijitTooltipFocusNode {
+	padding: 2px 2px 2px 2px;
+}
+.dijitTooltipConnector {
+	position: absolute;
+}
+.dijitTooltipData {
+	display:none;
+}
+.dijitLayoutContainer{
+	position: relative;
+	display: block;
+	overflow: hidden;
+}
+body .dijitAlignTop,
+body .dijitAlignBottom,
+body .dijitAlignLeft,
+body .dijitAlignRight {
+	position: absolute;
+	overflow: hidden;
+}
+body .dijitAlignClient { position: absolute; }
+.dijitBorderContainer, .dijitBorderContainerNoGutter {
+	position:relative;
+	overflow: hidden;
+}
+.dijitBorderContainerPane,
+.dijitBorderContainerNoGutterPane {
+	position: absolute !important;	
+	z-index: 2;		
+}
+.dijitBorderContainer > .dijitTextArea {
+	
+	resize: none;
+}
+.dijitGutter {
+	
+	position: absolute;
+	font-size: 1px;		
+}
+.dijitSplitter {
+	position: absolute;
+	overflow: hidden;
+	z-index: 10;		
+	background-color: #fff;
+	border-color: gray;
+	border-style: solid;
+	border-width: 0;
+}
+.dj_ie .dijitSplitter {
+	z-index: 1;	
+}
+.dijitSplitterActive {
+	z-index: 11 !important;
+}
+.dijitSplitterCover{
+	position:absolute;
+	z-index:-1;
+	top:0;
+	left:0;
+	width:100%;
+	height:100%;
+}
+.dijitSplitterCoverActive{
+	z-index:3 !important;
+}
+.dj_ie .dijitSplitterCover{
+	background: white;
+	filter: alpha(opacity=0);
+}
+.dijitSplitterH {
+	height: 7px;
+	border-top:1px;
+	border-bottom:1px;
+	cursor: ns-resize;
+}
+.dijitSplitterV {
+	width: 7px;
+	border-left:1px;
+	border-right:1px;
+	cursor: ew-resize;
+}
+.dijitSplitContainer{
+	position: relative;
+	overflow: hidden;
+	display: block;
+}
+.dijitSplitPane{
+	position: absolute;
+}
+.dijitSplitContainerSizerH,
+.dijitSplitContainerSizerV {
+	position:absolute;
+	font-size: 1px;
+	cursor: move;
+	cursor: w-resize;
+	background-color: ThreeDFace;
+	border: 1px solid;
+	border-color: ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight;
+	margin: 0;
+}
+.dijitSplitContainerSizerH .thumb, .dijitSplitterV .dijitSplitterThumb {
+	overflow:hidden;
+	position:absolute;
+	top:49%;
+}
+.dijitSplitContainerSizerV .thumb, .dijitSplitterH .dijitSplitterThumb {
+	position:absolute;
+	left:49%;
+}
+.dijitSplitterShadow,
+.dijitSplitContainerVirtualSizerH,
+.dijitSplitContainerVirtualSizerV {
+	font-size: 1px;
+	background-color: ThreeDShadow;
+	-moz-opacity: 0.5;
+	opacity: 0.5;
+	filter: Alpha(Opacity=50);
+	margin: 0;
+}
+.dj_ie .dijitSplitterV, .dijitSplitContainerVirtualSizerH {
+	cursor: w-resize;
+}
+.dj_ie .dijitSplitterH, .dijitSplitContainerSizerV, .dijitSplitContainerVirtualSizerV {
+	cursor: n-resize;
+}
+.dijit_a11y .dijitSplitterH {
+	border-top:1px solid #d3d3d3 !important;
+	border-bottom:1px solid #d3d3d3 !important;
+}
+.dijit_a11y .dijitSplitterV {
+	border-left:1px solid #d3d3d3 !important;
+	border-right:1px solid #d3d3d3 !important;
+}
+.dijitContentPane {
+	display: block;
+	overflow: auto;	
+}
+.dijitContentPaneSingleChild {
+	
+	overflow: hidden;
+}
+.dijitTitlePane {
+	display: block;
+	overflow: hidden;
+}
+.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;
+}
+.dijitAccordionContainer {
+	border:1px solid #b7b7b7;
+	border-top:0 !important;
+}
+.dj_webkit .dijitAccordionContainer  div:focus {
+	outline:none;
+}
+.dj_ff3 .dijitAccordionContainer  div:focus {
+	outline:none;
+}
+.dijitAccordionTitle {
+	cursor: pointer;
+}
+.dijitAccordionFocused  {
+	text-decoration: underline;
+}
+.dijitAccordionTitle .arrowTextUp,
+.dijitAccordionTitle .arrowTextDown {
+	display: none;
+	font-size: 0.65em;
+	font-weight: normal !important;
+}
+.dijit_a11y .dijitAccordionTitle .arrowTextUp,
+.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 {
+	vertical-align: middle;
+}
+.dijitCalendarDisabledDate {
+	color:gray !important;
+}
+.dijitCalendarPreviousMonthDisabled,
+.dijitCalendarCurrentMonthDisabled,
+.dijitCalendarNextMonthDisabled {
+	cursor:default !important
+}
+.dijitCalendarIncrementControl,
+.dijitCalendarBodyContainer tbody tr td,
+.dijitCalendarDateTemplate,
+.dijitCalendarContainer .dijitInline {
+	cursor:pointer;
+}
+.dijitSpacer {
+	
+  	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;
+}
+.dj_webkit .dijitMenuTable td[colspan="2"]{
+	border-right:hidden;
+}
+.dijitMenuItem{
+	text-align: left;
+	white-space: nowrap;
+	padding:.1em .2em;
+	cursor:pointer;
+}
+.dijitMenuPassive .dijitMenuItemHover,
+.dijitMenuItemSelected {
+	
+	background-color:black;
+	color:white;
+}
+.dijitMenuItemIcon, .dijitMenuExpand {
+	background-repeat: no-repeat;
+}
+.dijitMenuItemDisabled * {
+	
+	opacity:0.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 .dijitMenuItemSelected {
+	border: 1px #fff dotted !important;
+}
+.dj_ff3 .dijit_a11y .dijitMenuItem td {
+	padding: none !important;
+	background:none ! important;
+}
+.dijit_a11y .dijitMenuItemSelected .dijitMenuItemLabel {
+	border-width: 1px;
+	border-style: solid;
+}
+.dj_ie8 .dijit_a11y .dijitMenuItemLabel {
+	position:static;
+}
+.dijitMenuExpandA11y {
+	display: none;
+}
+.dijit_a11y .dijitMenuExpandA11y {
+	display: inline;
+}
+.dijitMenuSeparator td {
+	border: 0;
+	padding: 0;
+}
+.dijitMenuSeparatorTop {
+	height: 50%;
+	margin: 0;
+	margin-top:3px;
+	font-size: 1px;
+}
+.dijitMenuSeparatorBottom {
+	height: 50%;
+	margin: 0;
+	margin-bottom:3px;
+	font-size: 1px;
+}
+.dijitCheckedMenuItemIconChar {
+	vertical-align: middle;
+	visibility:hidden;
+}
+.dijitCheckedMenuItemChecked .dijitCheckedMenuItemIconChar {
+	visibility: visible;
+}
+.dijit_a11y .dijitCheckedMenuItemIconChar {
+	display:inline !important;
+}
+.dijit_a11y .dijitCheckedMenuItemIcon {
+	display: none;
+}
+.dijitStackController .dijitToggleButtonChecked * {
+	cursor: default;	
+}
+.dijitTabContainerNoLayout {
+	width: 100%;	
+}
+.dijitTabContainerBottom-tabs,
+.dijitTabContainerTop-tabs,
+.dijitTabContainerLeft-tabs,
+.dijitTabContainerRight-tabs {
+	overflow: visible !important;  
+}
+.dijitTabContainerBottom-container,
+.dijitTabContainerTop-container,
+.dijitTabContainerLeft-container,
+.dijitTabContainerRight-container {
+	z-index:0;
+	overflow: hidden;
+	border: 1px solid black;
+}
+.dijitTabContainer .nowrapTabStrip {
+	width: 50000px;
+	display: block;
+	position: relative;
+}
+.dijitTabContainer .dijitTabListWrapper {
+	overflow: hidden;
+}
+.dijit_a11y .dijitTabContainer .tabStripButton img {
+	
+	display: none;
+}
+.dijitTabContainerTop-tabs {
+	border-bottom: 1px solid black;
+}
+.dijitTabContainerTop-container {
+	border-top: 0px;
+}
+.dijitTabContainerLeft-tabs {
+	border-right: 1px solid black;
+	float: left;
+}
+.dijitTabContainerLeft-container {
+	border-left: 0px;
+}
+.dijitTabContainerBottom-tabs {
+	border-top: 1px solid black;
+}
+.dijitTabContainerBottom-container {
+	border-bottom: 0px;
+}
+.dijitTabContainerRight-tabs {
+	border-left: 1px solid black;
+	float: left;
+}
+.dijitTabContainerRight-container {
+	border-right: 0px;
+}
+div.dijitTabBtnDisabled, .dj_ie div.dijitTabBtnDisabled {
+	cursor: auto;
+}
+.dijitTab {
+	position:relative;
+	cursor:pointer;
+	white-space:nowrap;
+	z-index:3;
+}
+.dijitTab * {
+	
+	vertical-align: middle;
+}
+.dijitTabChecked {
+	cursor: default;	
+}
+.dijitTabButtonIcon {
+	height: 18px;
+}
+.dijitTabContainerTop-tabs .dijitTab {
+	top: 1px;	
+}
+.dijitTabContainerBottom-tabs .dijitTab {
+	top: -1px;	
+}
+.dijitTabContainerLeft-tabs .dijitTab {
+	left: 1px;	
+}
+.dijitTabContainerRight-tabs .dijitTab {
+	left: -1px;	
+}
+.dijitTabContainerTop-tabs .dijitTab,
+.dijitTabContainerBottom-tabs .dijitTab {
+	
+	display:inline-block;			
+	#zoom: 1; 
+	#display:inline; 
+}
+.dijitTabInnerDiv {
+	position:relative;
+}
+.tabStripButton {
+	z-index: 12;
+}
+.dijitTabButtonDisabled .tabStripButton {
+	display: none;
+}
+.dijitTab .closeButton {
+	margin-left: 1em;
+}
+.dijitTab .closeText {
+	display:none;
+}
+.dijit_a11y .closeText {
+	display:inline;
+	margin: 0px 6px;
+}
+.dijit_a11y .dijitTab .closeImage {
+	display:none;
+}
+.dijit_a11y .closeButton-hover .closeText {
+	border:thin solid;
+}
+.dijit_a11y .dijitTabChecked {
+	border-style:dashed !important;
+}
+.dijit_a11y .dijitTabInnerDiv {
+	border-left:none !important;
+ }
+.dijitTabPane,
+.dijitStackContainer-child,
+.dijitAccordionContainer-child {
+	
+    border: 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 {
+}
+.dijitTreeIndent {
+	
+	width: 19px;
+}
+.dijitTreeRow, .dijitTreeContent {
+	white-space: nowrap;
+}
+.dijitTreeRow img {
+	
+	vertical-align: middle;
+}
+.dijitTreeContent {
+    cursor: default;
+}
+.dijitExpandoText {
+	display: none;
+}
+.dijit_a11y .dijitExpandoText {
+	display: inline;
+	padding-left: 10px;
+	padding-right: 10px;
+	font-family: monospace;
+	border-style: solid;
+	border-width: thin;
+	cursor: pointer;
+}
+.dijitTreeLabel {
+	margin: 0px 4px;
+}
+.dijitDialog {
+	position: absolute;
+	z-index: 999;
+	padding: 1px;
+	overflow: hidden;       
+}
+.dijitDialogFixed div.dijitDialogTitleBar {
+	cursor:default;
+}
+.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;
+}
+.dijitSliderBarContainerV {
+	position:relative;
+	height:100%;
+	z-index:1;
+}
+.dijitSliderBarContainerH {
+	position:relative;
+	z-index:1;
+}
+.dijitSliderBarH {
+	height:4px;
+	border-width:1px 0;
+}
+.dijitSliderBarV {
+	width:4px;
+	border-width:0 1px;
+}
+.dijitSliderProgressBar {
+	background-color:red;
+	z-index:1;
+}
+.dijitSliderProgressBarV {
+	position:static !important;
+	height:0%;
+	vertical-align:top;
+	text-align:left;
+}
+.dijitSliderProgressBarH {
+	position:absolute !important;
+	width:0%;
+	vertical-align:middle;
+	overflow:visible;
+}
+.dijitSliderRemainingBar {
+	overflow:hidden;
+	background-color:transparent;
+	z-index:1;
+}
+.dijitSliderRemainingBarV {
+	height:100%;
+	text-align:left;
+}
+.dijitSliderRemainingBarH {
+	width:100% !important;
+}
+.dijitSliderBumper {
+	overflow:hidden;
+	z-index:1;
+}
+.dijitSliderBumperV {
+	width:4px;
+	height:8px;
+	border-width:0 1px;
+}
+.dijitSliderBumperH {
+	width:8px;
+	height:4px;
+	border-width:1px 0;
+}
+.dijitSliderBottomBumper,
+.dijitSliderLeftBumper {
+	background-color:red;
+}
+.dijitSliderTopBumper,
+.dijitSliderRightBumper {
+	background-color:transparent;
+}
+.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;
+}
+.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,
+.dijit_a11y .dijitTab .tabLabel {
+	display: inline !important;
+}
+.dj_ie7 .dijitButtonNode > BUTTON.dijitButtonContents > * {
+	position: relative; 
+}
+.dijitTextArea {
+	width:100%;
+	overflow-y: auto;	
+}
+.dijitTextArea[cols] {
+	width:auto; 
+}
+.dj_ie .dijitTextAreaCols {
+	width:auto;
+}
+.dijitTextArea > DIV {
+	text-decoration:none;
+	overflow:auto;
+	min-height: 1.40em;
+}
+.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));
+}
+.RichTextEditable {
+	display: block;	
+}
+.dijitTimePickerItemInner {
+	text-align:center;
+	border:0;
+	padding:2px 8px 2px 8px;
+}
+.dijitTimePickerTick,
+.dijitTimePickerMarker {
+	border-bottom:1px solid gray;
+}
+.dijitTimePicker .dijitDownArrowButton {
+	border-top: none !important;
+}
+.dijitTimePickerTick {
+	color:#CCC;
+}
+.dijitTimePickerMarker {
+	color:black;
+	background-color:#CCC;
+}
+.dijitTimePickerItemSelected {
+	font-weight:bold;
+	color:#333;
+	background-color:#b7cdee;
+}
+.dijitTimePickerItemHover {
+	background-color:gray;
+	color:white;
+	cursor:pointer;
+}
+.dijit_a11y .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;
+}
+.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;
+}
+.dijitSelect {
+	margin: 0.2em;
+}
+.dj_ie .dijitSelect,
+.dj_ie7 .dijitSelect,
+.dj_iequirks .dijitSelect {
+	vertical-align: middle; 
+}
+.dj_ie8 .dijitSelect .dijitButtonText {
+	vertical-align: top;
+}
+.dijitSelect .dijitButtonNode {
+	text-align: left;
+}
+.dijitRtl .dijitSelect .dijitButtonNode {
+	text-align: right;
+}
+.dijitToolbar .dijitSelect {
+	margin: 0;
+}
+.dj_webkit .dijitToolbar .dijitSelect {
+	padding-left: 0.3em;
+}
+.dijit_a11y .dijitSelectDisabled .dijitButtonNode {
+	border-style: outset!important;
+	border-width: medium!important;
+	border-color: #999 !important;
+	color:#999 !important;
+}
+.dijitSelect .dijitButtonContents {
+	padding: 0px;
+	background: transparent none;
+}
+.dijitSelectFixedWidth .dijitButtonContents {
+	width: 100%;
+}
+.dijitSelect .dijitArrowButton {
+	width: 16px;
+}
+.dj_ie6 .dijitSelectMenu .dijitMenuItemLabel,
+.dj_ie7 .dijitSelectMenu .dijitMenuItemLabel {
+	
+	position: static;
+}
+.dijitSelectLabel *
+{
+	vertical-align: baseline;
+}
+.dijitSelectSelectedOption * {
+	font-weight: bold;
+}
+.dijitSelectMenu {
+	border-width: 1px;
+}
+.dijitSelect .dijitButtonContents {
+	white-space: nowrap;
+}
+.dijitSelectMenu .dijitMenuTable {
+	margin: 0px;
+	background-color: transparent;
+}
+.dijitTextBoxReadOnly,
+.dijitComboBoxReadOnly,
+.dijitSpinnerReadOnly,
+.dijitTextAreaReadOnly,
+.dijitTextBoxDisabled,
+.dijitComboBoxDisabled,
+.dijitSpinnerDisabled,
+.dijitTextAreaDisabled {
+	color: gray;
+}
+.dj_webkit .dijitTextBoxDisabled INPUT,
+.dj_webkit .dijitComboBoxDisabled INPUT,
+.dj_webkit .dijitSpinnerDisabled INPUT {
+	color: #eee;
+}
+.dj_webkit INPUT.dijitTextBoxDisabled,
+.dj_webkit TEXTAREA.dijitTextAreaDisabled {
+	color: #333; 
+}
+.dijit_a11y .dijitSliderReadOnly,
+.dijit_a11y .dijitSliderDisabled {
+	opacity:0.6;
+}
+.dj_ie .dijit_a11y .dijitSliderReadOnly .dijitSliderBar,
+.dj_ie .dijit_a11y .dijitSliderDisabled .dijitSliderBar {
+	filter: alpha(opacity=40);
+}
+.dijit_a11y .dijitSlider .dijitSliderButtonContainer DIV {
+	font-family: monospace; 
+	font-size: 1em;
+	line-height: 1em;
+	height: auto;
+	width: auto;
+	margin: 0px 4px;
+}
+.dijitForceStatic {
+    position: static !important;
+}
 .tundra .dojoDndItemBefore {
 	border-top: 2px solid #369;
 }
@@ -56,10 +1509,26 @@
 	background:#e2e2e2 url(images/tabEnabled.png) repeat-x;
 }
 .tundra .dijitTabInnerDiv {
-	padding:6px 8px 5px 9px;
+	padding:2px 8px 2px 9px;
 }
-.dijitTabSpacer {
-	font-size: 1px;
+.tundra .dijitTabSpacer {
+	display: none;
+}
+.tundra .dijitTabContainer .tabStripRBtn {
+	margin-right: 20px;
+}
+.tundra .dijitTabContainer .tabStripLBtn {
+	margin-left: 20px;
+}
+.tundra .nowrapTabStrip .dijitTab {
+	top: 2px;
+}
+.tundra .dijitTabContainerBottom .nowrapTabStrip .dijitTab {
+	top: 0px;
+	bottom: 2px;
+}
+.tundra .dijitTabContainer .tabStripMenuButton-Hover {
+	cursor: pointer;
 }
 .tundra .dijitTabChecked {
 	
@@ -72,9 +1541,22 @@
 	border-top-color:#92a0b3;
 	border-left-color:#92a0b3;
 	border-right-color:#92a0b3;
+	border-bottom-color:#92a0b3;
 	background:#e2e2e2 url(images/tabHover.gif) repeat-x;
 }
-.tundra .dijitTabCheckedHover {
+.tundra .dijitTabContainerTop .dijitTabHover {
+	border-bottom-color:#ccc;
+}
+.tundra .dijitTabContainerBottom .dijitTabHover {
+	border-top-color:#ccc;
+}
+.tundra .dijitTabContainerLeft .dijitTabHover {
+	border-right-color:#ccc;
+}
+.tundra .dijitTabContainerRight .dijitTabHover {
+	border-left-color:#ccc;
+}
+.tundra .dijitTabContainer .dijitTabCheckedHover {
 	color: inherit;
 	border:1px solid #ccc;
 	background:#fff;
@@ -84,15 +1566,21 @@
 	width: 12px;
 	height: 12px;
 }
-.tundra .dijitTab .dijitTabButtonSpacer {
+.tundra .dijitTab .tabLabel {
 	
-	height: 12px;
-	width: 1px;
+	min-height: 12px;
+	display: inline-block;
+}
+.tundra .dijitTabContainerNested .dijitTabListWrapper {
+	height: auto;
+}
+.tundra .dijitTabContainerNested .dijitTabContainerTop-tabs {
+	border-bottom: 1px solid #CCC;
 }
 .tundra .dijitTabContainerTabListNested .dijitTab {
 	background: none;
 	border: none;
-	top: 0px;		 
+	top: 0px;		
 }
 .tundra .dijitTabContainerTabListNested .dijitTab .dijitTabContent {
 }
@@ -120,8 +1608,14 @@
 	background-image : url(images/tabCloseHover.gif);
 }
 .tundra .dijitTabContainerTop-tabs {
+	margin-bottom: 0px;
+	border-color: #cccccc;
+	padding-left: 3px;
+	background-position: bottom;
+}
+.tundra .dijitTabContainerTop-tabs .dijitTab {
+	top: 0px;
 	margin-bottom: -1px;
-	border-color: #ccc;
 }
 .tundra .dijitTabContainerTop-container {
 	border-top: none;
@@ -129,17 +1623,30 @@
 .tundra .dijitTabContainerTop-tabs .dijitTabChecked {
 	border-bottom-color:white;
 }
-.tundra .dijitTabContainerTopStrip {
-	border: 1px solid #ccc;
-	padding-top: 2px;
+.tundra .dijitTabContainerTop-tabs,
+.tundra .dijitTabContainerBottom-tabs {
 	padding-left: 3px;
+	padding-right: 3px;
 }
 .tundra .dijitTabContainerTopStrip {
+	border-top: 1px solid #CCC;
+	border-right: 1px solid #CCC;
+	border-left: 1px solid #CCC;
+	padding-top: 2px;
 	background: #f2f2f2;
 }
+.tundra .dijitTabContainerTopNone {
+	padding-top: 0px;
+}
 .tundra .dijitTabContainerBottom-tabs {
+	margin-top: 0px;
+	border-color: #cccccc;
+	background-position: top;
+	padding-left: 3px;
+}
+.tundra .dijitTabContainerBottom-tabs .dijitTab {
+	bottom: 0px;
 	margin-top: -1px;
-	border-color: #ccc;
 }
 .tundra .dijitTabContainerBottom-container {
 	border-bottom: none;
@@ -149,21 +1656,17 @@
 }
 .tundra .dijitTabContainerBottomStrip {
 	padding-bottom: 2px;
-	padding-left: 3px;	
 	border: 1px solid #ccc;
-}
-.tundra .dijitTabContainerBottomStrip {
 	background: #f2f2f2;
-}
-.tundra .dijitTabContainerBottom-spacer,
-.tundra .dijitTabContainerTop-spacer {
-	height: 0px;
-	border-top: 1px solid #ccc;
-	background: #fff;
+	border-top: none;
 }
 .tundra .dijitTabContainerRight-tabs {
-	margin-left: -1px;
 	border-color: #ccc;
+	height: 100%;
+	padding-top: 3px;
+}
+.tundra .dijitTabContainerRightStrip {
+	margin-left: -1px;
 }
 .tundra .dijitTabContainerRight-container {
 	border-right: none;
@@ -173,15 +1676,17 @@
 }
 .tundra .dijitTabContainerRightStrip {
 	padding-right: 2px;
-	padding-top: 3px;	
 	border: 1px solid #ccc;
 }
 .tundra .dijitTabContainerRightStrip {
 	background: #f2f2f2;
 }
 .tundra .dijitTabContainerLeft-tabs {
-	margin-right: -1px;
 	border-color: #ccc;
+	padding-top: 3px;
+	height: 100%;
+}
+.tundra .dijitTabContainerLeft .dijitTabListWrapper {
 }
 .tundra .dijitTabContainerLeft-container {
 	border-left: none;
@@ -191,29 +1696,66 @@
 }
 .tundra .dijitTabContainerLeftStrip {
 	padding-left: 2px;
-	padding-top: 3px;	
 	border: 1px solid #ccc;
-}
-.tundra .dijitTabContainerLeftStrip {
 	background: #f2f2f2;
+	border-right: none;
 }
 .tundra .dijitTabContainerLeft-tabs .dijitTab,
 .tundra .dijitTabContainerRight-tabs .dijitTab {
 	margin-right:0px;
 	margin-bottom:4px;	
 }
-.tundra .dijitTabContainerLeft-spacer,
-.tundra .dijitTabContainerRight-spacer {
-	width: 0px;
-	border-left: 1px solid #ccc;
-	background: #fff;
-}
 .tundra .dijitTabContainerTop-dijitContentPane .dijitTabContainerTop-tabs {
 	border-left: 0px solid #ccc;
 	border-top: 0px solid #ccc;
 	border-right: 0px solid #ccc;
 	padding-top: 0px;
-	padding-left: 0px;	
+	padding-left: 0px;
+}
+.tundra .dijitTabContainer .tabStripButton {
+	margin-right: 0;
+	padding-top: 2px;
+	z-index: 12;
+}
+.tundra .dijitTabContainerBottom .tabStripButton {
+	padding-top: 2px;
+}
+.tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv {
+	padding-bottom: 3px;
+	padding-top: 1px;
+}
+.tundra .tabStripButton .dijitTabInnerDiv {
+	padding: 3px 2px 4px 2px;
+}
+.dj_ie6 .tundra .tabStripButton .dijitTabInnerDiv,
+.dj_ie7 .tundra .tabStripButton .dijitTabInnerDiv,
+.dj_opera .tundra .tabStripButton .dijitTabInnerDiv {
+	padding-bottom: 5px;
+}
+.dj_ie6 .tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv,
+.dj_ie7 .tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv,
+.dj_opera .tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv {
+	padding-bottom: 4px;
+}
+.tundra .dijitTabContainer .tabStripButton {
+	
+	width: 21px;
+}
+.tundra .dijitTabContainer .tabStripButton img {
+	height: 14px;
+	background: url(images/spriteRoundedIconsSmall.png) no-repeat;
+}
+.dj_ie6 .tundra .dijitTabContainer .tabStripButton img {
+	background-image: url(images/spriteRoundedIconsSmall.gif);
+}
+.tundra .dijitTabContainer .tabStripMenuButton img {
+	background-position: -15px top;
+}
+.tundra .dijitTabContainer .tabStripSlideButtonLeft img {
+	background-position: 0px top;
+}
+.tundra .dijitTabContainer .tabStripSlideButtonRight img {
+	background-position: -30px top;
 }
 .tundra .dijitAccordionContainer {
 	border-color: #ccc;
@@ -295,10 +1837,10 @@
 	height:5px;
 }
 .tundra .dijitSplitterH .dijitSplitterThumb {
-	background:url(images/splitContainerSizerH-thumb.png) no-repeat;
-	top:1px;
+	background:#B0B0B0 none;
+	height:1px;
+	top:2px;
 	width:19px;
-	height:2px;
 }
 .tundra .dijitSplitterV,
 .tundra .dijitGutterV {
@@ -307,10 +1849,10 @@
 	width:5px;
 }
 .tundra .dijitSplitterV .dijitSplitterThumb {
-	background:url(images/splitContainerSizerV-thumb.png) no-repeat;
-	left:1px;
+	background:#B0B0B0 none;
 	height:19px;
-	width:5px;
+	left:2px;
+	width:1px;
 }
 .tundra .dijitSplitterActive {
 	font-size: 1px;
@@ -348,18 +1890,6 @@
 	border:1px solid #b3b3b3;
 	line-height: normal;
 }
-.tundra .dijitTextBoxDisabled,
-.tundra .dijitComboBoxDisabled,
-.tundra .dijitSpinnerDisabled,
-.tundra .dijitTextAreaDisabled {
-	color: gray;
-}
-.dj_webkit .tundra .dijitTextBoxDisabled,
-.dj_webkit .tundra .dijitComboBoxDisabled,
-.dj_webkit .tundra .dijitSpinnerDisabled,
-.dj_webkit .tundra .dijitTextAreaDisabled {
-	color: #eee;
-}
 .tundra .dijitComboBox .dijitInputField {
 	padding: 1px 0;
 }
@@ -420,9 +1950,7 @@
 .tundra .dijitInlineEditor {
 	
 	display: inline-block;
-	display: -moz-inline-stack;
 	#display:inline;
-	
 }
 .dijitInlineEditor .saveButton,
 .dijitInlineEditor .cancelButton {
@@ -441,18 +1969,24 @@
 }
 .tundra .dijitButtonNode {
 	
-	border: 1px solid #c0c0c0; 
-	border-bottom: 1px solid #9b9b9b; 
-	padding: 0.1em 0.2em 0.2em 0.2em; 
+	border: 1px solid #c0c0c0;
+	border-bottom: 1px solid #9b9b9b;
+	padding: 0.1em 0.2em 0.2em 0.2em;
 	background: #fff url(images/buttonEnabled.png) repeat-x bottom left;
 }
-.tundra .dijitButtonNode button { 
-	border: 0px; 
-	background-color: transparent; 
-} 
- 
+.tundra .dijitSelect .dijitButtonContents {
+	border-right: none;
+}
+.dijitRtl .tundra .dijitSelect .dijitButtonContents {
+	border-left: none;
+	border-right-width: 1px;
+}
+.tundra .dijitButtonNode button {
+	border: 0px;
+	background-color: transparent;
+}
 .tundra .dijitButtonText {
-	text-align: center; 
+	text-align: center;
 	padding: 0 0.3em;
 }
 .tundra .dijitDisabled .dijitButtonText {
@@ -464,10 +1998,9 @@
 .tundra .dijitComboButton .dijitDownArrowButton {
 	padding-right:4px;
 }
-.dj_ff2 .tundra .dijitComboButton .dijitButtonContentsFocused,
-.dj_ff2 .tundra .dijitComboButton .dijitDownArrowButtonFocused {
-	border: 1px solid transparent; 
-}
+.tundra .dijitComboBoxReadOnly,
+.tundra .dijitSpinnerReadOnly,
+.tundra .dijitSpinnerReadOnly .dijitButtonNode,
 .tundra .dijitButtonDisabled .dijitButtonNode,
 .tundra .dijitToggleButtonDisabled .dijitButtonNode,
 .tundra .dijitDropDownButtonDisabled .dijitButtonNode,
@@ -477,7 +2010,7 @@
 .tundra .dijitSpinnerDisabled .dijitButtonNode {
 	
 	
-	border-color: #d5d5d5 #d5d5d5 #bdbdbd #d5d5d5; 
+	border-color: #d5d5d5 #d5d5d5 #bdbdbd #d5d5d5;
 	background:#e4e4e4 url(images/buttonDisabled.png) top repeat-x;
 }
 .tundra .dijitButtonHover .dijitButtonNode,
@@ -485,11 +2018,11 @@
 .tundra .dijitToggleButtonHover .dijitButtonNode,
 .tundra .dijitDropDownButtonHover .dijitButtonNode,
 .tundra .dijitComboButtonHover .dijitButtonContents,
-.tundra .dijitComboButtonDownArrowHover .dijitDownArrowButton {
+.tundra .dijitComboButtonDownArrowHover .dijitArrowButton {
 	
 	
-	border-color:		#a5beda; 
-	border-bottom-color:#5c7590; 
+	border-color: #a5beda;
+	border-bottom-color:#5c7590;
 	color:#243C5F;
 	background:#fcfdff url(images/buttonHover.png) repeat-x bottom;
 }
@@ -514,8 +2047,7 @@
 	background: #ededed url(images/buttonActive.png) bottom repeat-x;
 }
 .tundra .dijitArrowButtonInner {
-	background-image:url(images/spriteArrows.png);
-	background-position: left top;
+	background:url(images/spriteArrows.png) no-repeat scroll 0px center;
 	width: 7px;
 	height: 7px;
 	font-size: 1px;
@@ -524,20 +2056,28 @@
 .dj_ie6 .tundra .dijitArrowButtonInner {
 	background-image:url(images/spriteArrows.gif);
 }
+.tundra .dijitLeftArrowButton .dijitArrowButtonInner {
+	background-position: -7px center;
+}
+.tundra .dijitRightArrowButton .dijitArrowButtonInner {
+	background-position: -14px center;
+}
+.tundra .dijitUpArrowButton .dijitArrowButtonInner {
+	background-position: -21px center;
+}
 .tundra .dijitDisabled .dijitArrowButtonInner {
-	background-position: -28px top;
+	background-position: -28px center;
 }
-.tundra .dijitUpArrowButton .dijitArrowButtonInner { 
-	background-position: -21px top; 
+.tundra .dijitDisabled .dijitLeftArrowButton .dijitArrowButtonInner {
+	background-position: -35px center;
 }
-.tundra .dijitDisabled .dijitUpArrowButton .dijitArrowButtonInner { 
-	background-position: -49px top; 
+.tundra .dijitDisabled .dijitRightArrowButton .dijitArrowButtonInner {
+	background-position: -42px center;
+}
+.tundra .dijitDisabled .dijitUpArrowButton .dijitArrowButtonInner {
+	background-position: -49px center;
 }
 .tundra .dijitComboBox .dijitArrowButton .dijitArrowButtonInner {
-	background-image: url(images/comboArrowDown.gif);
-	background-repeat: no-repeat;
-	background-attachment: scroll;
-	background-position: center center;
 	height: auto;
 	font-size: 100%;
 	font-size: inherit;
@@ -548,7 +2088,7 @@
 .tundra .dijitSpinner .dijitArrowButtonInner {
 	display: block;  
 	position:absolute;
-	top: 50%; 
+	top: 50%;
 	margin-top: -4px; 
 	left: 50%;
 	margin-left: -4px; 
@@ -672,7 +2212,7 @@
 	outline:1px;
 }
 .tundra .dijitSliderFocused .dijitSliderBar {
-	border-color:#888;	
+	border-color:#888;
 }
 .dijit_a11y .dijitSliderProgressBar {
 	background-color:#888 !important;
@@ -757,17 +2297,80 @@
 .tundra .dijitSliderButtonInner {
 	visibility:hidden;
 }
-.tundra .dijitSliderDisabled {
-	opacity:0.6 !important;
+.tundra .dijitSliderReadOnly *,
+.tundra .dijitSliderDisabled * {
+	border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
+	color: #bdbdbd;
 }
-.dj_ie .tundra .dijitSliderDisabled,
-.dj_ie .tundra .dijitSliderDisabled .dijitRuleContainer,
-.dj_ie .tundra .dijitSliderDisabled .dijitSliderRemainingBar,
-.dj_ie .tundra .dijitSliderDisabled .dijitSliderProgressBar {
-	filter: gray() alpha(opacity=40);
+.tundra .dijitSliderReadOnly .dijitSliderDecrementIconH,
+.tundra .dijitSliderDisabled .dijitSliderDecrementIconH {
+	background-position: -35px 0px;
 }
-.tundra .dijitSliderDisabled * {
-	cursor: not-allowed !important;
+.tundra .dijitSliderReadOnly .dijitSliderIncrementIconH,
+.tundra .dijitSliderDisabled .dijitSliderIncrementIconH {
+	background-position: -42px 0px;
+}
+.tundra .dijitSliderReadOnly .dijitSliderDecrementIconV,
+.tundra .dijitSliderDisabled .dijitSliderDecrementIconV {
+	background-position: -28px 0px;
+}
+.tundra .dijitSliderReadOnly .dijitSliderIncrementIconV,
+.tundra .dijitSliderDisabled .dijitSliderIncrementIconV {
+	background-position: -49px 0px;
+}
+.tundra .dijitSelectDisabled * {
+    cursor: not-allowed !important;
+}
+.tundra .dijitSelectReadOnly * {
+    cursor: default !important;
+}
+.tundra .dijitSelect .dijitButtonNode {
+	padding: 0px;
+}
+.tundra .dijitSelect .dijitButtonContents {
+	padding-top: 1px;
+    background:#fff url(images/validationInputBg.png) repeat-x top left;
+    #background:#fff url(images/validationInputBg.gif) repeat-x top left;
+}
+.tundra .dijitSelectHover .dijitButtonContents,
+.tundra .dijitSelectActive .dijitButtonContents,
+.tundra .dijitSelectOpened .dijitButtonContents,
+.tundra .dijitSelectDisabled .dijitButtonContents,
+.tundra .dijitSelectReadOnly .dijitButtonContents{
+	background: transparent none;
+}
+.dj_ie .tundra .dijitSelect .dijitButtonContents {
+	padding-top: 0px;
+}
+.tundra .dijitSelectDisabled .dijitButtonNode {
+    border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
+    background:#e4e4e4 url(images/buttonDisabled.png) top repeat-x;
+}
+.dj_ie .tundra .dijitSelectDisabled  .dijitButtonNode * {
+	filter: gray() alpha(opacity=50);
+}
+.tundra .dijitSelectHover .dijitButtonNode {
+    border-color:#a5beda;
+    border-bottom-color:#5c7590;
+    border-right-color:#5c7590;
+    color:#243C5F;
+    background:#fcfdff url(images/buttonHover.png) repeat-x bottom;
+}
+.tundra .dijitSelectActive .dijitButtonNode,
+.tundra .dijitSelectOpened .dijitButtonNode {
+    border-color:#366dba;
+    background: #ededed url(images/buttonActive.png) bottom repeat-x;
+}
+.tundra .dijitSelectMenu td {
+	padding: 0em;
+}
+.tundra .dijitSelectMenu .dijitMenuItemIcon {
+	margin: 0.1em 0.2em;
+	display: none;
+}
+.tundra .dijitSelectMenu .dijitMenuItemLabel,
+.tundra .dijitSelectMenu .dijitMenuArrowCell {
+	padding: 0.1em 0.2em;
 }
 .tundra .dijitTreeNode {
     background-image : url(images/i.gif);
@@ -881,16 +2484,16 @@
 	background:#fff url(images/titleBar.png) repeat-x bottom left;
 	border:1px solid #bfbfbf;
 	padding:3px 4px;
-	cursor: pointer;
 }
 .tundra .dijitTitlePaneTitle-hover  {
 	background: #f8fafd url(images/accordionItemHover.gif) bottom repeat-x;
+	cursor: pointer;
 }
 .tundra .dijitTitlePaneTitle * {
 	vertical-align: middle;
 }
-.tundra .dijitTitlePane .dijitArrowNode {
-	cursor: pointer;
+.tundra .dijitTitlePane .dijitOpen .dijitArrowNode,
+.tundra .dijitTitlePane .dijitClosed .dijitArrowNode {
 	background-image: url(images/spriteArrows.png);
 	background-repeat: no-repeat;
 	height: 7px;
@@ -909,15 +2512,17 @@
 	text-decoration:underline;
 }
 .tundra .dijitTitlePane .dijitArrowNodeInner {
+	
 	display:none;
 }
-.dijit_a11y .dijitTitlePane .dijitArrowNodeInner {
+.dijit_a11y .dijitTitlePane .dijitOpen .dijitArrowNodeInner,
+.dijit_a11y .dijitTitlePane .dijitClosed .dijitArrowNodeInner {
 	display:inline !important;
 	font-family:monospace;
-	cursor: pointer;
 	padding-bottom:.2em;
 }
 .dijit_a11y .dijitTitlePane .dijitArrowNode {
+	
 	display:none;
 }
 .tundra .dijitTitlePaneContentOuter {
@@ -936,7 +2541,6 @@
 	margin-left: 4px;
 	margin-right: 4px;
 }
-	
 .tundra .dijitCalendarIncrementControl {
 	
 	width:15px;
@@ -986,7 +2590,7 @@
 	text-align:center;
 }
 .tundra .dijitCalendarBodyContainer {
-	border-bottom: 1px solid #eeeeee;	
+	border-bottom: 1px solid #eeeeee;
 }
 .tundra .dijitCalendarMonthLabel {
 	color:#293a4b;
@@ -1019,7 +2623,7 @@
 	background-color:white !important;
 }
 .tundra .dijitCalendarCurrentMonthDisabled {
-		
+	
 	background-color:#bbbbbc !important;
 }
 .tundra .dijitCalendarDisabledDate {
@@ -1159,16 +2763,14 @@
 	padding: 0px;	
 	background-color:#e1e5f0;
 }
-.tundra .dijitToolbar label {	
+.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 {
+.dj_ie .tundra .dijitToolbar .dijitComboButton .dijitDownArrowButtonFocused {
 	
 	border: 1px #555 dotted !important;
-	padding: 0px;	
+	padding: 0px;
 }
 .tundra .dijitDialog {
 	background: #fff;
@@ -1233,13 +2835,10 @@
 	
 	background: #ffffff url(images/popupMenuBg.gif) repeat-x bottom left;
 	border: 1px solid #7eabcd;
-	padding: 0.45em;	
+	padding: 0.45em;
 	-webkit-border-radius: 3px;
-}
-.dj_ff3 .tundra .dijitTooltipContainer {
-	
 	-moz-border-radius: 3px;
-}	
+}
 .tundra .dijitTooltipConnector {
 	
 	border:0px;
@@ -1258,7 +2857,7 @@
 	width:16px;
 	height:14px;
 }
-.dj_ie6 .tundra .dijitTooltipBelow .dijitTooltipConnector {
+.dj_ie .tundra .dijitTooltipBelow .dijitTooltipConnector {
 	
 	background-image: url(images/tooltipConnectorUp.gif);
 }
@@ -1270,7 +2869,7 @@
 	width:16px;
 	height:14px;
 }
-.dj_ie6 .tundra .dijitTooltipAbove .dijitTooltipConnector {
+.dj_ie .tundra .dijitTooltipAbove .dijitTooltipConnector {
 	background-image: url(images/tooltipConnectorDown.gif);
 }
 .dj_ie6 .tundra .dijitTooltipAbove .dijitTooltipConnector {
@@ -1290,7 +2889,7 @@
 	width:16px;
 	height:14px;
 }
-.dj_ie6 .tundra .dijitTooltipLeft .dijitTooltipConnector {
+.dj_ie .tundra .dijitTooltipLeft .dijitTooltipConnector {
 	background-image: url(images/tooltipConnectorRight.gif);
 }
 .tundra .dijitTooltipRight {
@@ -1304,7 +2903,7 @@
 	width:16px;
 	height:14px;
 }
-.dj_ie6 .tundra .dijitTooltipRight .dijitTooltipConnector {
+.dj_ie .tundra .dijitTooltipRight .dijitTooltipConnector {
 	background-image: url(images/tooltipConnectorLeft.gif);
 }
 .dj_webkit .tundra .dijitPopup .dijitTooltipContainer,
@@ -1434,6 +3033,10 @@
 .tundra .dijitEditorIconTabIndent { background-position: -702px; }
 .tundra .dijitEditorIconSelectAll { background-position: -720px; }
 .tundra .dijitEditorIconUnlink { background-position: -738px; }
+.tundra .dijitEditorIconFullScreen { background-position: -756px; }
+.tundra .dijitEditorIconViewSource { background-position: -774px; }
+.tundra .dijitEditorIconPrint { background-position: -792px; }
+.tundra .dijitEditorIconNewPage { background-position: -810px; }
 .dijitColorPalette {
 	border:1px solid #7eabcd;
 	background:#fff;
@@ -1515,6 +3118,9 @@
 	background-position:right;
 	padding-right:25px;
 }
+.dijitRtl .dijitTabContainer .tabStripMenuButton {
+	float: left;
+}
 .dijitRtl .tundra .dijitCalendarDecrease {
 	background-position: -30px top;
 }
@@ -1557,18 +3163,18 @@
 	background-position: -7px 0px;
 }
 .dijitRtl .tundra .dijitTab {
-	margin-right:auto;
-	margin-left:4px;		
 	-moz-box-orient:horizontal;
 	text-align: right;
 }
-.dijitRtl .tundra .dijitTabContainerTopStrip,
-.dijitRtl .tundra .dijitTabContainerBottomStrip {
-	padding-right: 3px;
-	padding-left: 0px;
-}
 .dijitRtl .tundra .dijitTabInnerDiv {
-	padding:6px 9px 5px 8px;
+	padding:2px 9px 2px 8px;
+}
+.dijitRtl .tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv {
+	padding-bottom: 3px;
+	padding-top: 1px;
+}
+.dijitRtl .tundra .tabStripButton .dijitTabInnerDiv {
+	padding: 3px 2px 4px 2px;
 }
 .dijitRtl .tundra .dijitTabPaneWrapper {
 	#zoom: 1;
@@ -1584,7 +3190,8 @@
 	margin-left:0px;
 }
 .dj_ie-rtl .tundra .dijitTab .dijitTabInnerDiv {
-	width : 1% !important;
+	
+	width : 0.1% !important;
 }
 .dijitRtl .tundra .dijitSliderProgressBarH,
 .dijitRtl .tundra .dijitSliderRemainingBarH,
@@ -1612,3 +3219,9 @@
 .dijitRtl .tundra .dijitSliderDecrementIconH {
 	background-position: -14px 0px;
 }
+.dijitRtl .tundra .dijitComboBox .dijitButtonNode,
+.dijitRtl .tundra .dijitSpinner .dijitButtonNode {
+	
+	border-left-width: 0px;
+	border-right-width: 1px;
+}
diff --git a/dijit/themes/tundra/tundra_rtl.css b/dijit/themes/tundra/tundra_rtl.css
new file mode 100644
index 0000000..9aeeeb7
--- /dev/null
+++ b/dijit/themes/tundra/tundra_rtl.css
@@ -0,0 +1,184 @@
+
+.dj_gecko-rtl .dijitInputField {
+	direction: ltr; 
+}
+.dj_gecko-rtl .dijitInputField * {
+	direction: rtl; 
+}
+.dijitRtl .dijitMenuItem {
+	text-align: right;
+}
+.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 .dijitSliderImageHandleV {
+	left:auto;
+	right:-6px;
+}
+.dj_ie-rtl .dijitSliderImageHandleV {
+	right:-10px;
+}
+.dijitRtl .dijitSliderMoveableH {
+	right:auto;
+	left:0;
+}
+.dijitRtl .dijitRuleContainerV {
+	float:right;
+}
+.dj_gecko-rtl .dijitRuleContainerV {
+	float:left;
+}
+.dj_ie-rtl .dijitRuleContainerV {
+	text-align:right;
+}
+.dj_ie-rtl .dijitRuleLabelV {
+	text-align:left;
+}
+.dj_ie-rtl .dijitRuleLabelH {
+	zoom:1;
+}
+.dj_ie-rtl .dijitSliderProgressBarH {
+	right:0;
+	left:auto;
+}
+.dj_gecko-rtl .dijitSliderProgressBarH {
+	float:right;
+	right:0;
+	left:auto;
+}
+.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 .dijitTabContainer .tabStripMenuButton {
+	float: left;
+}
+.dijitRtl .tundra .dijitCalendarDecrease {
+	background-position: -30px top;
+}
+.dijitRtl .tundra .dijitCalendarIncrease {
+	background-position: 0px top;
+}
+.dijitRtl .tundra .dijitDialogTitleBar .dijitDialogCloseIcon {
+	right: auto;
+	left: 5px;
+}
+.dijitRtl .tundra .dijitEditorIcon {
+	background-image: url(images/editor_rtl.gif); 
+}
+.dijitRtl .tundra .dijitDisabled .dijitEditorIcon {
+	background-image: url(images/editorDisabled_rtl.gif); 
+}
+.dijitRtl .tundra .dijitToolbar .dijitToolbarSeparator {
+	background-image: url(images/editor_rtl.gif);
+}
+.dijitRtl .tundra .dijitMenuItem .dijitMenuItemIcon {
+	padding-left: 3px;
+	padding-right: 0px;
+}
+.dijitRtl .tundra .dijitMenuItem .dijitMenuExpand {
+	background-position: -7px 0px;
+}
+.dijitRtl .tundra .dijitTreeContainer .dijitTreeNode {
+    background-image : none;
+}
+.dijitRtl .tundra .dijitTreeContainer .dijitTreeExpandoOpened {
+	background-image: url(images/treeExpand_minus_rtl.gif);
+}
+.dijitRtl .tundra .dijitTreeContainer .dijitTreeExpandoClosed {
+	background-image: url(images/treeExpand_plus_rtl.gif);
+}
+.dijitRtl .tundra .dijitTreeContainer .dijitTreeExpandoLeaf {
+	background-image: none;
+}
+.dijitRtl .tundra .dijitTitlePane .dijitClosed .dijitArrowNode {
+	background-position: -7px 0px;
+}
+.dijitRtl .tundra .dijitTab {
+	-moz-box-orient:horizontal;
+	text-align: right;
+}
+.dijitRtl .tundra .dijitTabInnerDiv {
+	padding:2px 9px 2px 8px;
+}
+.dijitRtl .tundra .tabStrip-disabled .tabStripButton .dijitTabInnerDiv {
+	padding-bottom: 3px;
+	padding-top: 1px;
+}
+.dijitRtl .tundra .tabStripButton .dijitTabInnerDiv {
+	padding: 3px 2px 4px 2px;
+}
+.dijitRtl .tundra .dijitTabPaneWrapper {
+	#zoom: 1;
+}
+.dj_ie-rtl .tundra .dijitTabContainerLeft-tabs {
+	margin-left: 1px !important;
+}
+.dj_ie-rtl .tundra .dijitTabContainerRight-tabs {
+	margin-right: 1px !important;
+}
+.dijitRtl .tundra .dijitTabContainerLeft-tabs .dijitTab,
+.dijitRtl .tundra .dijitTabContainerRight-tabs .dijitTab {
+	margin-left:0px;
+}
+.dj_ie-rtl .tundra .dijitTab .dijitTabInnerDiv {
+	
+	width : 0.1% !important;
+}
+.dijitRtl .tundra .dijitSliderProgressBarH,
+.dijitRtl .tundra .dijitSliderRemainingBarH,
+.dijitRtl .tundra .dijitSliderLeftBumper,
+.dijitRtl .tundra .dijitSliderRightBumper,
+.dijitRtl .tundra .dijitSliderTopBumper {
+	background-position: top right;
+}
+.dijitRtl .tundra .dijitSliderProgressBarV,
+.dijitRtl .tundra .dijitSliderRemainingBarV,
+.dijitRtl .tundra .dijitSliderBottomBumper {
+	background-position: bottom right;
+}
+.dijitRtl .tundra .dijitSliderLeftBumper {
+	border-left-width: 0px;
+	border-right-width: 1px;
+}
+.dijitRtl .tundra .dijitSliderRightBumper {
+	border-left-width: 1px;
+	border-right-width: 0px;
+}
+.dijitRtl .tundra .dijitSliderIncrementIconH {
+	background-position: -7px 0px;
+}
+.dijitRtl .tundra .dijitSliderDecrementIconH {
+	background-position: -14px 0px;
+}
+.dijitRtl .tundra .dijitComboBox .dijitButtonNode,
+.dijitRtl .tundra .dijitSpinner .dijitButtonNode {
+	
+	border-left-width: 0px;
+	border-right-width: 1px;
+}
diff --git a/dijit/tree/ForestStoreModel.js b/dijit/tree/ForestStoreModel.js
index 4e49ff3..9edf788 100644
--- a/dijit/tree/ForestStoreModel.js
+++ b/dijit/tree/ForestStoreModel.js
@@ -26,47 +26,56 @@ _4(_6);
 }else{
 this.inherited(arguments);
 }
-},getIdentity:function(_7){
-return (_7===this.root)?this.root.id:this.inherited(arguments);
-},getLabel:function(_8){
-return (_8===this.root)?this.root.label:this.inherited(arguments);
-},newItem:function(_9,_a){
-if(_a===this.root){
-this.onNewRootItem(_9);
-return this.store.newItem(_9);
+},isItem:function(_7){
+return (_7===this.root)?true:this.inherited(arguments);
+},fetchItemByIdentity:function(_8){
+if(_8.identity==this.root.id){
+var _9=_8.scope?_8.scope:dojo.global;
+if(_8.onItem){
+_8.onItem.call(_9,this.root);
+}
 }else{
-return this.inherited(arguments);
+this.inherited(arguments);
 }
-},onNewRootItem:function(_b){
-},pasteItem:function(_c,_d,_e,_f,_10){
+},getIdentity:function(_a){
+return (_a===this.root)?this.root.id:this.inherited(arguments);
+},getLabel:function(_b){
+return (_b===this.root)?this.root.label:this.inherited(arguments);
+},newItem:function(_c,_d,_e){
 if(_d===this.root){
-if(!_f){
-this.onLeaveRoot(_c);
+this.onNewRootItem(_c);
+return this.store.newItem(_c);
+}else{
+return this.inherited(arguments);
 }
+},onNewRootItem:function(_f){
+},pasteItem:function(_10,_11,_12,_13,_14){
+if(_11===this.root){
+if(!_13){
+this.onLeaveRoot(_10);
 }
-dijit.tree.TreeStoreModel.prototype.pasteItem.call(this,_c,_d===this.root?null:_d,_e===this.root?null:_e,_f,_10);
-if(_e===this.root){
-this.onAddToRoot(_c);
 }
-},onAddToRoot:function(_11){
-
-},onLeaveRoot:function(_12){
-
+dijit.tree.TreeStoreModel.prototype.pasteItem.call(this,_10,_11===this.root?null:_11,_12===this.root?null:_12,_13,_14);
+if(_12===this.root){
+this.onAddToRoot(_10);
+}
+},onAddToRoot:function(_15){
+},onLeaveRoot:function(_16){
 },_requeryTop:function(){
-var _13=this.root.children||[];
-this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_14){
-this.root.children=_14;
-if(_13.length!=_14.length||dojo.some(_13,function(_15,idx){
-return _14[idx]!=_15;
+var _17=this.root.children||[];
+this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_18){
+this.root.children=_18;
+if(_17.length!=_18.length||dojo.some(_17,function(_19,idx){
+return _18[idx]!=_19;
 })){
-this.onChildrenChange(this.root,_14);
+this.onChildrenChange(this.root,_18);
 }
 })});
-},_onNewItem:function(_17,_18){
+},onNewItem:function(_1a,_1b){
 this._requeryTop();
 this.inherited(arguments);
-},_onDeleteItem:function(_19){
-if(dojo.indexOf(this.root.children,_19)!=-1){
+},onDeleteItem:function(_1c){
+if(dojo.indexOf(this.root.children,_1c)!=-1){
 this._requeryTop();
 }
 this.inherited(arguments);
diff --git a/dijit/tree/TreeStoreModel.js b/dijit/tree/TreeStoreModel.js
index 6ed087a..9b18d98 100644
--- a/dijit/tree/TreeStoreModel.js
+++ b/dijit/tree/TreeStoreModel.js
@@ -8,7 +8,7 @@
 if(!dojo._hasResource["dijit.tree.TreeStoreModel"]){
 dojo._hasResource["dijit.tree.TreeStoreModel"]=true;
 dojo.provide("dijit.tree.TreeStoreModel");
-dojo.declare("dijit.tree.TreeStoreModel",null,{store:null,childrenAttrs:["children"],labelAttr:"",root:null,query:null,constructor:function(_1){
+dojo.declare("dijit.tree.TreeStoreModel",null,{store:null,childrenAttrs:["children"],newItemIdAttr:"id",labelAttr:"",root:null,query:null,deferItemLoadingUntilExpand:false,constructor:function(_1){
 dojo.mixin(this,_1);
 this.connects=[];
 var _2=this.store;
@@ -16,7 +16,7 @@ if(!_2.getFeatures()["dojo.data.api.Identity"]){
 throw new Error("dijit.Tree: store must support dojo.data.Identity");
 }
 if(_2.getFeatures()["dojo.data.api.Notification"]){
-this.connects=this.connects.concat([dojo.connect(_2,"onNew",this,"_onNewItem"),dojo.connect(_2,"onDelete",this,"_onDeleteItem"),dojo.connect(_2,"onSet",this,"_onSetItem")]);
+this.connects=this.connects.concat([dojo.connect(_2,"onNew",this,"onNewItem"),dojo.connect(_2,"onDelete",this,"onDeleteItem"),dojo.connect(_2,"onSet",this,"onSetItem")]);
 }
 },destroy:function(){
 dojo.forEach(this.connects,dojo.disconnect);
@@ -38,85 +38,108 @@ return this.store.hasAttribute(_6,_7);
 },this);
 },getChildren:function(_8,_9,_a){
 var _b=this.store;
-var _c=[];
+if(!_b.isItemLoaded(_8)){
+var _c=dojo.hitch(this,arguments.callee);
+_b.loadItem({item:_8,onItem:function(_d){
+_c(_d,_9,_a);
+},onError:_a});
+return;
+}
+var _e=[];
 for(var i=0;i<this.childrenAttrs.length;i++){
-var _e=_b.getValues(_8,this.childrenAttrs[i]);
-_c=_c.concat(_e);
+var _f=_b.getValues(_8,this.childrenAttrs[i]);
+_e=_e.concat(_f);
 }
-var _f=0;
-dojo.forEach(_c,function(_10){
-if(!_b.isItemLoaded(_10)){
-_f++;
+var _10=0;
+if(!this.deferItemLoadingUntilExpand){
+dojo.forEach(_e,function(_11){
+if(!_b.isItemLoaded(_11)){
+_10++;
 }
 });
-if(_f==0){
-_9(_c);
+}
+if(_10==0){
+_9(_e);
 }else{
-var _11=function _11(_12){
-if(--_f==0){
-_9(_c);
+var _12=function _12(_13){
+if(--_10==0){
+_9(_e);
 }
 };
-dojo.forEach(_c,function(_13){
-if(!_b.isItemLoaded(_13)){
-_b.loadItem({item:_13,onItem:_11,onError:_a});
+dojo.forEach(_e,function(_14){
+if(!_b.isItemLoaded(_14)){
+_b.loadItem({item:_14,onItem:_12,onError:_a});
 }
 });
 }
-},getIdentity:function(_14){
-return this.store.getIdentity(_14);
-},getLabel:function(_15){
+},isItem:function(_15){
+return this.store.isItem(_15);
+},fetchItemByIdentity:function(_16){
+this.store.fetchItemByIdentity(_16);
+},getIdentity:function(_17){
+return this.store.getIdentity(_17);
+},getLabel:function(_18){
 if(this.labelAttr){
-return this.store.getValue(_15,this.labelAttr);
+return this.store.getValue(_18,this.labelAttr);
+}else{
+return this.store.getLabel(_18);
+}
+},newItem:function(_19,_1a,_1b){
+var _1c={parent:_1a,attribute:this.childrenAttrs[0],insertIndex:_1b};
+if(this.newItemIdAttr&&_19[this.newItemIdAttr]){
+this.fetchItemByIdentity({identity:_19[this.newItemIdAttr],scope:this,onItem:function(_1d){
+if(_1d){
+this.pasteItem(_1d,null,_1a,true,_1b);
+}else{
+this.store.newItem(_19,_1c);
+}
+}});
 }else{
-return this.store.getLabel(_15);
-}
-},newItem:function(_16,_17){
-var _18={parent:_17,attribute:this.childrenAttrs[0]};
-return this.store.newItem(_16,_18);
-},pasteItem:function(_19,_1a,_1b,_1c,_1d){
-var _1e=this.store,_1f=this.childrenAttrs[0];
-if(_1a){
-dojo.forEach(this.childrenAttrs,function(_20){
-if(_1e.containsValue(_1a,_20,_19)){
-if(!_1c){
-var _21=dojo.filter(_1e.getValues(_1a,_20),function(x){
-return x!=_19;
+this.store.newItem(_19,_1c);
+}
+},pasteItem:function(_1e,_1f,_20,_21,_22){
+var _23=this.store,_24=this.childrenAttrs[0];
+if(_1f){
+dojo.forEach(this.childrenAttrs,function(_25){
+if(_23.containsValue(_1f,_25,_1e)){
+if(!_21){
+var _26=dojo.filter(_23.getValues(_1f,_25),function(x){
+return x!=_1e;
 });
-_1e.setValues(_1a,_20,_21);
+_23.setValues(_1f,_25,_26);
 }
-_1f=_20;
+_24=_25;
 }
 });
 }
-if(_1b){
-if(typeof _1d=="number"){
-var _23=_1e.getValues(_1b,_1f);
-_23.splice(_1d,0,_19);
-_1e.setValues(_1b,_1f,_23);
+if(_20){
+if(typeof _22=="number"){
+var _27=_23.getValues(_20,_24);
+_27.splice(_22,0,_1e);
+_23.setValues(_20,_24,_27);
 }else{
-_1e.setValues(_1b,_1f,_1e.getValues(_1b,_1f).concat(_19));
+_23.setValues(_20,_24,_23.getValues(_20,_24).concat(_1e));
 }
 }
-},onChange:function(_24){
-},onChildrenChange:function(_25,_26){
-},onDelete:function(_27,_28){
-},_onNewItem:function(_29,_2a){
-if(!_2a){
+},onChange:function(_28){
+},onChildrenChange:function(_29,_2a){
+},onDelete:function(_2b,_2c){
+},onNewItem:function(_2d,_2e){
+if(!_2e){
 return;
 }
-this.getChildren(_2a.item,dojo.hitch(this,function(_2b){
-this.onChildrenChange(_2a.item,_2b);
+this.getChildren(_2e.item,dojo.hitch(this,function(_2f){
+this.onChildrenChange(_2e.item,_2f);
 }));
-},_onDeleteItem:function(_2c){
-this.onDelete(_2c);
-},_onSetItem:function(_2d,_2e,_2f,_30){
-if(dojo.indexOf(this.childrenAttrs,_2e)!=-1){
-this.getChildren(_2d,dojo.hitch(this,function(_31){
-this.onChildrenChange(_2d,_31);
+},onDeleteItem:function(_30){
+this.onDelete(_30);
+},onSetItem:function(_31,_32,_33,_34){
+if(dojo.indexOf(this.childrenAttrs,_32)!=-1){
+this.getChildren(_31,dojo.hitch(this,function(_35){
+this.onChildrenChange(_31,_35);
 }));
 }else{
-this.onChange(_2d);
+this.onChange(_31);
 }
 }});
 }
diff --git a/dijit/tree/_dndContainer.js b/dijit/tree/_dndContainer.js
new file mode 100644
index 0000000..39804d2
--- /dev/null
+++ b/dijit/tree/_dndContainer.js
@@ -0,0 +1,49 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dijit.tree._dndContainer"]){
+dojo._hasResource["dijit.tree._dndContainer"]=true;
+dojo.provide("dijit.tree._dndContainer");
+dojo.require("dojo.dnd.common");
+dojo.require("dojo.dnd.Container");
+dojo.declare("dijit.tree._dndContainer",null,{constructor:function(_1,_2){
+this.tree=_1;
+this.node=_1.domNode;
+dojo.mixin(this,_2);
+this.map={};
+this.current=null;
+this.containerState="";
+dojo.addClass(this.node,"dojoDndContainer");
+this.events=[dojo.connect(this.node,"onmouseenter",this,"onOverEvent"),dojo.connect(this.node,"onmouseleave",this,"onOutEvent"),dojo.connect(this.tree,"_onNodeMouseEnter",this,"onMouseOver"),dojo.connect(this.tree,"_onNodeMouseLeave",this,"onMouseOut"),dojo.connect(this.node,"ondragstart",dojo,"stopEvent"),dojo.connect(this.node,"onselectstart",dojo,"stopEvent")];
+},getItem:function(_3){
+var _4=this.selection[_3],_5={data:dijit.getEnclosingWidget(_4),type:["treeNode"]};
+return _5;
+},destroy:function(){
+dojo.forEach(this.events,dojo.disconnect);
+this.node=this.parent=null;
+},onMouseOver:function(_6,_7){
+this.current=_6.rowNode;
+this.currentWidget=_6;
+},onMouseOut:function(_8,_9){
+this.current=null;
+this.currentWidget=null;
+},_changeState:function(_a,_b){
+var _c="dojoDnd"+_a;
+var _d=_a.toLowerCase()+"State";
+dojo.removeClass(this.node,_c+this[_d]);
+dojo.addClass(this.node,_c+_b);
+this[_d]=_b;
+},_addItemClass:function(_e,_f){
+dojo.addClass(_e,"dojoDndItem"+_f);
+},_removeItemClass:function(_10,_11){
+dojo.removeClass(_10,"dojoDndItem"+_11);
+},onOverEvent:function(){
+this._changeState("Container","Over");
+},onOutEvent:function(){
+this._changeState("Container","");
+}});
+}
diff --git a/dijit/tree/_dndSelector.js b/dijit/tree/_dndSelector.js
new file mode 100644
index 0000000..30b1ade
--- /dev/null
+++ b/dijit/tree/_dndSelector.js
@@ -0,0 +1,125 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dijit.tree._dndSelector"]){
+dojo._hasResource["dijit.tree._dndSelector"]=true;
+dojo.provide("dijit.tree._dndSelector");
+dojo.require("dojo.dnd.common");
+dojo.require("dijit.tree._dndContainer");
+dojo.declare("dijit.tree._dndSelector",dijit.tree._dndContainer,{constructor:function(_1,_2){
+this.selection={};
+this.anchor=null;
+this.simpleSelection=false;
+this.events.push(dojo.connect(this.tree.domNode,"onmousedown",this,"onMouseDown"),dojo.connect(this.tree.domNode,"onmouseup",this,"onMouseUp"),dojo.connect(this.tree.domNode,"onmousemove",this,"onMouseMove"));
+},singular:false,getSelectedNodes:function(){
+return this.selection;
+},selectNone:function(){
+return this._removeSelection()._removeAnchor();
+},destroy:function(){
+this.inherited(arguments);
+this.selection=this.anchor=null;
+},onMouseDown:function(e){
+if(!this.current){
+return;
+}
+if(e.button==dojo.mouseButtons.RIGHT){
+return;
+}
+var _3=dijit.getEnclosingWidget(this.current),id=_3.id+"-dnd";
+if(!dojo.hasAttr(this.current,"id")){
+dojo.attr(this.current,"id",id);
+}
+if(!this.singular&&!dojo.isCopyKey(e)&&!e.shiftKey&&(this.current.id in this.selection)){
+this.simpleSelection=true;
+dojo.stopEvent(e);
+return;
+}
+if(this.singular){
+if(this.anchor==this.current){
+if(dojo.isCopyKey(e)){
+this.selectNone();
+}
+}else{
+this.selectNone();
+this.anchor=this.current;
+this._addItemClass(this.anchor,"Anchor");
+this.selection[this.current.id]=this.current;
+}
+}else{
+if(!this.singular&&e.shiftKey){
+if(dojo.isCopyKey(e)){
+}else{
+}
+}else{
+if(dojo.isCopyKey(e)){
+if(this.anchor==this.current){
+delete this.selection[this.anchor.id];
+this._removeAnchor();
+}else{
+if(this.current.id in this.selection){
+this._removeItemClass(this.current,"Selected");
+delete this.selection[this.current.id];
+}else{
+if(this.anchor){
+this._removeItemClass(this.anchor,"Anchor");
+this._addItemClass(this.anchor,"Selected");
+}
+this.anchor=this.current;
+this._addItemClass(this.current,"Anchor");
+this.selection[this.current.id]=this.current;
+}
+}
+}else{
+if(!(id in this.selection)){
+this.selectNone();
+this.anchor=this.current;
+this._addItemClass(this.current,"Anchor");
+this.selection[id]=this.current;
+}
+}
+}
+}
+dojo.stopEvent(e);
+},onMouseUp:function(e){
+if(!this.simpleSelection){
+return;
+}
+this.simpleSelection=false;
+this.selectNone();
+if(this.current){
+this.anchor=this.current;
+this._addItemClass(this.anchor,"Anchor");
+this.selection[this.current.id]=this.current;
+}
+},onMouseMove:function(e){
+this.simpleSelection=false;
+},_removeSelection:function(){
+var e=dojo.dnd._empty;
+for(var i in this.selection){
+if(i in e){
+continue;
+}
+var _4=dojo.byId(i);
+if(_4){
+this._removeItemClass(_4,"Selected");
+}
+}
+this.selection={};
+return this;
+},_removeAnchor:function(){
+if(this.anchor){
+this._removeItemClass(this.anchor,"Anchor");
+this.anchor=null;
+}
+return this;
+},forInSelectedItems:function(f,o){
+o=o||dojo.global;
+for(var id in this.selection){
+f.call(o,this.getItem(id),id,this);
+}
+}});
+}
diff --git a/dijit/tree/dndSource.js b/dijit/tree/dndSource.js
new file mode 100644
index 0000000..d8f3627
--- /dev/null
+++ b/dijit/tree/dndSource.js
@@ -0,0 +1,240 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dijit.tree.dndSource"]){
+dojo._hasResource["dijit.tree.dndSource"]=true;
+dojo.provide("dijit.tree.dndSource");
+dojo.require("dijit.tree._dndSelector");
+dojo.require("dojo.dnd.Manager");
+dojo.declare("dijit.tree.dndSource",dijit.tree._dndSelector,{isSource:true,accept:["text","treeNode"],copyOnly:false,dragThreshold:5,betweenThreshold:0,constructor:function(_1,_2){
+if(!_2){
+_2={};
+}
+dojo.mixin(this,_2);
+this.isSource=typeof _2.isSource=="undefined"?true:_2.isSource;
+var _3=_2.accept instanceof Array?_2.accept:["text","treeNode"];
+this.accept=null;
+if(_3.length){
+this.accept={};
+for(var i=0;i<_3.length;++i){
+this.accept[_3[i]]=1;
+}
+}
+this.isDragging=false;
+this.mouseDown=false;
+this.targetAnchor=null;
+this.targetBox=null;
+this.dropPosition="";
+this._lastX=0;
+this._lastY=0;
+this.sourceState="";
+if(this.isSource){
+dojo.addClass(this.node,"dojoDndSource");
+}
+this.targetState="";
+if(this.accept){
+dojo.addClass(this.node,"dojoDndTarget");
+}
+this.topics=[dojo.subscribe("/dnd/source/over",this,"onDndSourceOver"),dojo.subscribe("/dnd/start",this,"onDndStart"),dojo.subscribe("/dnd/drop",this,"onDndDrop"),dojo.subscribe("/dnd/cancel",this,"onDndCancel")];
+},checkAcceptance:function(_4,_5){
+return true;
+},copyState:function(_6){
+return this.copyOnly||_6;
+},destroy:function(){
+this.inherited("destroy",arguments);
+dojo.forEach(this.topics,dojo.unsubscribe);
+this.targetAnchor=null;
+},_onDragMouse:function(e){
+var m=dojo.dnd.manager(),_7=this.targetAnchor,_8=this.current,_9=this.currentWidget,_a=this.dropPosition;
+var _b="Over";
+if(_8&&this.betweenThreshold>0){
+if(!this.targetBox||_7!=_8){
+this.targetBox=dojo.position(_8,true);
+}
+if((e.pageY-this.targetBox.y)<=this.betweenThreshold){
+_b="Before";
+}else{
+if((e.pageY-this.targetBox.y)>=(this.targetBox.h-this.betweenThreshold)){
+_b="After";
+}
+}
+}
+if(_8!=_7||_b!=_a){
+if(_7){
+this._removeItemClass(_7,_a);
+}
+if(_8){
+this._addItemClass(_8,_b);
+}
+if(!_8){
+m.canDrop(false);
+}else{
+if(_9==this.tree.rootNode&&_b!="Over"){
+m.canDrop(false);
+}else{
+if(m.source==this&&(_8.id in this.selection)){
+m.canDrop(false);
+}else{
+if(this.checkItemAcceptance(_8,m.source,_b.toLowerCase())&&!this._isParentChildDrop(m.source,_8)){
+m.canDrop(true);
+}else{
+m.canDrop(false);
+}
+}
+}
+}
+this.targetAnchor=_8;
+this.dropPosition=_b;
+}
+},onMouseMove:function(e){
+if(this.isDragging&&this.targetState=="Disabled"){
+return;
+}
+this.inherited(arguments);
+var m=dojo.dnd.manager();
+if(this.isDragging){
+this._onDragMouse(e);
+}else{
+if(this.mouseDown&&this.isSource&&(Math.abs(e.pageX-this._lastX)>=this.dragThreshold||Math.abs(e.pageY-this._lastY)>=this.dragThreshold)){
+var n=this.getSelectedNodes();
+var _c=[];
+for(var i in n){
+_c.push(n[i]);
+}
+if(_c.length){
+m.startDrag(this,_c,this.copyState(dojo.isCopyKey(e)));
+}
+}
+}
+},onMouseDown:function(e){
+this.mouseDown=true;
+this.mouseButton=e.button;
+this._lastX=e.pageX;
+this._lastY=e.pageY;
+this.inherited("onMouseDown",arguments);
+},onMouseUp:function(e){
+if(this.mouseDown){
+this.mouseDown=false;
+this.inherited("onMouseUp",arguments);
+}
+},onMouseOut:function(){
+this.inherited(arguments);
+this._unmarkTargetAnchor();
+},checkItemAcceptance:function(_d,_e,_f){
+return true;
+},onDndSourceOver:function(_10){
+if(this!=_10){
+this.mouseDown=false;
+this._unmarkTargetAnchor();
+}else{
+if(this.isDragging){
+var m=dojo.dnd.manager();
+m.canDrop(false);
+}
+}
+},onDndStart:function(_11,_12,_13){
+if(this.isSource){
+this._changeState("Source",this==_11?(_13?"Copied":"Moved"):"");
+}
+var _14=this.checkAcceptance(_11,_12);
+this._changeState("Target",_14?"":"Disabled");
+if(this==_11){
+dojo.dnd.manager().overSource(this);
+}
+this.isDragging=true;
+},itemCreator:function(_15,_16,_17){
+return dojo.map(_15,function(_18){
+return {"id":_18.id,"name":_18.textContent||_18.innerText||""};
+});
+},onDndDrop:function(_19,_1a,_1b){
+if(this.containerState=="Over"){
+var _1c=this.tree,_1d=_1c.model,_1e=this.targetAnchor,_1f=false;
+this.isDragging=false;
+var _20=dijit.getEnclosingWidget(_1e);
+var _21;
+var _22;
+_21=(_20&&_20.item)||_1c.item;
+if(this.dropPosition=="Before"||this.dropPosition=="After"){
+_21=(_20.getParent()&&_20.getParent().item)||_1c.item;
+_22=_20.getIndexInParent();
+if(this.dropPosition=="After"){
+_22=_20.getIndexInParent()+1;
+}
+}else{
+_21=(_20&&_20.item)||_1c.item;
+}
+var _23;
+dojo.forEach(_1a,function(_24,idx){
+var _25=_19.getItem(_24.id);
+if(dojo.indexOf(_25.type,"treeNode")!=-1){
+var _26=_25.data,_27=_26.item,_28=_26.getParent().item;
+}
+if(_19==this){
+if(typeof _22=="number"){
+if(_21==_28&&_26.getIndexInParent()<_22){
+_22-=1;
+}
+}
+_1d.pasteItem(_27,_28,_21,_1b,_22);
+}else{
+if(_1d.isItem(_27)){
+_1d.pasteItem(_27,_28,_21,_1b,_22);
+}else{
+if(!_23){
+_23=this.itemCreator(_1a,_1e,_19);
+}
+_1d.newItem(_23[idx],_21,_22);
+}
+}
+},this);
+this.tree._expandNode(_20);
+}
+this.onDndCancel();
+},onDndCancel:function(){
+this._unmarkTargetAnchor();
+this.isDragging=false;
+this.mouseDown=false;
+delete this.mouseButton;
+this._changeState("Source","");
+this._changeState("Target","");
+},onOverEvent:function(){
+this.inherited(arguments);
+dojo.dnd.manager().overSource(this);
+},onOutEvent:function(){
+this._unmarkTargetAnchor();
+var m=dojo.dnd.manager();
+if(this.isDragging){
+m.canDrop(false);
+}
+m.outSource(this);
+this.inherited(arguments);
+},_isParentChildDrop:function(_29,_2a){
+if(!_29.tree||_29.tree!=this.tree){
+return false;
+}
+var _2b=_29.tree.domNode;
+var ids={};
+for(var x in _29.selection){
+ids[_29.selection[x].parentNode.id]=true;
+}
+var _2c=_2a.parentNode;
+while(_2c!=_2b&&(!_2c.id||!ids[_2c.id])){
+_2c=_2c.parentNode;
+}
+return _2c.id&&ids[_2c.id];
+},_unmarkTargetAnchor:function(){
+if(!this.targetAnchor){
+return;
+}
+this._removeItemClass(this.targetAnchor,this.dropPosition);
+this.targetAnchor=null;
+this.targetBox=null;
+this.dropPosition=null;
+},_markDndStatus:function(_2d){
+this._changeState("Source",_2d?"Copied":"Moved");
+}});
+}
diff --git a/dijit/tree/model.js b/dijit/tree/model.js
index a40ca0c..b21a9b6 100644
--- a/dijit/tree/model.js
+++ b/dijit/tree/model.js
@@ -9,10 +9,12 @@ dojo.declare("dijit.tree.model",null,{destroy:function(){
 },getRoot:function(_1){
 },mayHaveChildren:function(_2){
 },getChildren:function(_3,_4){
-},getIdentity:function(_5){
-},getLabel:function(_6){
-},newItem:function(_7,_8){
-},pasteItem:function(_9,_a,_b,_c){
-},onChange:function(_d){
-},onChildrenChange:function(_e,_f){
+},isItem:function(_5){
+},fetchItemByIdentity:function(_6){
+},getIdentity:function(_7){
+},getLabel:function(_8){
+},newItem:function(_9,_a,_b){
+},pasteItem:function(_c,_d,_e,_f){
+},onChange:function(_10){
+},onChildrenChange:function(_11,_12){
 }});
diff --git a/dojo/AdapterRegistry.js b/dojo/AdapterRegistry.js
index 353d416..60039b3 100644
--- a/dojo/AdapterRegistry.js
+++ b/dojo/AdapterRegistry.js
@@ -16,20 +16,20 @@ dojo.extend(dojo.AdapterRegistry,{register:function(_2,_3,_4,_5,_6){
 this.pairs[((_6)?"unshift":"push")]([_2,_3,_4,_5]);
 },match:function(){
 for(var i=0;i<this.pairs.length;i++){
-var _8=this.pairs[i];
-if(_8[1].apply(this,arguments)){
-if((_8[3])||(this.returnWrappers)){
-return _8[2];
+var _7=this.pairs[i];
+if(_7[1].apply(this,arguments)){
+if((_7[3])||(this.returnWrappers)){
+return _7[2];
 }else{
-return _8[2].apply(this,arguments);
+return _7[2].apply(this,arguments);
 }
 }
 }
 throw new Error("No match found");
-},unregister:function(_9){
+},unregister:function(_8){
 for(var i=0;i<this.pairs.length;i++){
-var _b=this.pairs[i];
-if(_b[0]==_9){
+var _9=this.pairs[i];
+if(_9[0]==_8){
 this.pairs.splice(i,1);
 return true;
 }
diff --git a/dojo/DeferredList.js b/dojo/DeferredList.js
index 9f406a1..abc81d3 100644
--- a/dojo/DeferredList.js
+++ b/dojo/DeferredList.js
@@ -25,25 +25,25 @@ this.finishedCount=0;
 this.fireOnOneCallback=_2;
 this.fireOnOneErrback=_3;
 this.consumeErrors=_4;
-dojo.forEach(this.list,function(d,_7){
+dojo.forEach(this.list,function(d,_6){
 d.addCallback(this,function(r){
-this._cbDeferred(_7,true,r);
+this._cbDeferred(_6,true,r);
 return r;
 });
 d.addErrback(this,function(r){
-this._cbDeferred(_7,false,r);
+this._cbDeferred(_6,false,r);
 return r;
 });
 },this);
-},_cbDeferred:function(_a,_b,_c){
-this.resultList[_a]=[_b,_c];
+},_cbDeferred:function(_7,_8,_9){
+this.resultList[_7]=[_8,_9];
 this.finishedCount+=1;
 if(this.fired!==0){
-if(_b&&this.fireOnOneCallback){
-this.callback([_a,_c]);
+if(_8&&this.fireOnOneCallback){
+this.callback([_7,_9]);
 }else{
-if(!_b&&this.fireOnOneErrback){
-this.errback(_c);
+if(!_8&&this.fireOnOneErrback){
+this.errback(_9);
 }else{
 if(this.finishedCount==this.list.length){
 this.callback(this.resultList);
@@ -51,18 +51,18 @@ this.callback(this.resultList);
 }
 }
 }
-if(!_b&&this.consumeErrors){
-_c=null;
+if(!_8&&this.consumeErrors){
+_9=null;
 }
-return _c;
-},gatherResults:function(_d){
-var d=new dojo.DeferredList(_d,false,true,false);
-d.addCallback(function(_f){
-var ret=[];
-dojo.forEach(_f,function(_11){
-ret.push(_11[1]);
+return _9;
+},gatherResults:function(_a){
+var d=new dojo.DeferredList(_a,false,true,false);
+d.addCallback(function(_b){
+var _c=[];
+dojo.forEach(_b,function(_d){
+_c.push(_d[1]);
 });
-return ret;
+return _c;
 });
 return d;
 }});
diff --git a/dojo/NodeList-manipulate.js b/dojo/NodeList-manipulate.js
new file mode 100644
index 0000000..ba22fa8
--- /dev/null
+++ b/dojo/NodeList-manipulate.js
@@ -0,0 +1,212 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojo.NodeList-manipulate"]){
+dojo._hasResource["dojo.NodeList-manipulate"]=true;
+dojo.provide("dojo.NodeList-manipulate");
+(function(){
+function _1(_2){
+var _3="",ch=_2.childNodes;
+for(var i=0,n;n=ch[i];i++){
+if(n.nodeType!=8){
+if(n.nodeType==1){
+_3+=_1(n);
+}else{
+_3+=n.nodeValue;
+}
+}
+}
+return _3;
+};
+function _4(_5){
+while(_5.childNodes[0]&&_5.childNodes[0].nodeType==1){
+_5=_5.childNodes[0];
+}
+return _5;
+};
+function _6(_7,_8){
+if(typeof _7=="string"){
+_7=dojo._toDom(_7,(_8&&_8.ownerDocument));
+if(_7.nodeType==11){
+_7=_7.childNodes[0];
+}
+}else{
+if(_7.nodeType==1&&_7.parentNode){
+_7=_7.cloneNode(false);
+}
+}
+return _7;
+};
+dojo.extend(dojo.NodeList,{_placeMultiple:function(_9,_a){
+var _b=typeof _9=="string"||_9.nodeType?dojo.query(_9):_9;
+var _c=[];
+for(var i=0;i<_b.length;i++){
+var _d=_b[i];
+var _e=this.length;
+for(var j=_e-1,_f;_f=this[j];j--){
+if(i>0){
+_f=this._cloneNode(_f);
+_c.unshift(_f);
+}
+if(j==_e-1){
+dojo.place(_f,_d,_a);
+}else{
+_d.parentNode.insertBefore(_f,_d);
+}
+_d=_f;
+}
+}
+if(_c.length){
+_c.unshift(0);
+_c.unshift(this.length-1);
+Array.prototype.splice.apply(this,_c);
+}
+return this;
+},innerHTML:function(_10){
+if(arguments.length){
+return this.addContent(_10,"only");
+}else{
+return this[0].innerHTML;
+}
+},text:function(_11){
+if(arguments.length){
+for(var i=0,_12;_12=this[i];i++){
+if(_12.nodeType==1){
+dojo.empty(_12);
+_12.appendChild(_12.ownerDocument.createTextNode(_11));
+}
+}
+return this;
+}else{
+var _13="";
+for(i=0;_12=this[i];i++){
+_13+=_1(_12);
+}
+return _13;
+}
+},val:function(_14){
+if(arguments.length){
+var _15=dojo.isArray(_14);
+for(var _16=0,_17;_17=this[_16];_16++){
+var _18=_17.nodeName.toUpperCase();
+var _19=_17.type;
+var _1a=_15?_14[_16]:_14;
+if(_18=="SELECT"){
+var _1b=_17.options;
+for(var i=0;i<_1b.length;i++){
+var opt=_1b[i];
+if(_17.multiple){
+opt.selected=(dojo.indexOf(_14,opt.value)!=-1);
+}else{
+opt.selected=(opt.value==_1a);
+}
+}
+}else{
+if(_19=="checkbox"||_19=="radio"){
+_17.checked=(_17.value==_1a);
+}else{
+_17.value=_1a;
+}
+}
+}
+return this;
+}else{
+_17=this[0];
+if(!_17||_17.nodeType!=1){
+return undefined;
+}
+_14=_17.value||"";
+if(_17.nodeName.toUpperCase()=="SELECT"&&_17.multiple){
+_14=[];
+_1b=_17.options;
+for(i=0;i<_1b.length;i++){
+opt=_1b[i];
+if(opt.selected){
+_14.push(opt.value);
+}
+}
+if(!_14.length){
+_14=null;
+}
+}
+return _14;
+}
+},append:function(_1c){
+return this.addContent(_1c,"last");
+},appendTo:function(_1d){
+return this._placeMultiple(_1d,"last");
+},prepend:function(_1e){
+return this.addContent(_1e,"first");
+},prependTo:function(_1f){
+return this._placeMultiple(_1f,"first");
+},after:function(_20){
+return this.addContent(_20,"after");
+},insertAfter:function(_21){
+return this._placeMultiple(_21,"after");
+},before:function(_22){
+return this.addContent(_22,"before");
+},insertBefore:function(_23){
+return this._placeMultiple(_23,"before");
+},remove:dojo.NodeList.prototype.orphan,wrap:function(_24){
+if(this[0]){
+_24=_6(_24,this[0]);
+for(var i=0,_25;_25=this[i];i++){
+var _26=this._cloneNode(_24);
+if(_25.parentNode){
+_25.parentNode.replaceChild(_26,_25);
+}
+var _27=_4(_26);
+_27.appendChild(_25);
+}
+}
+return this;
+},wrapAll:function(_28){
+if(this[0]){
+_28=_6(_28,this[0]);
+this[0].parentNode.replaceChild(_28,this[0]);
+var _29=_4(_28);
+for(var i=0,_2a;_2a=this[i];i++){
+_29.appendChild(_2a);
+}
+}
+return this;
+},wrapInner:function(_2b){
+if(this[0]){
+_2b=_6(_2b,this[0]);
+for(var i=0;i<this.length;i++){
+var _2c=this._cloneNode(_2b);
+this._wrap(dojo._toArray(this[i].childNodes),null,this._NodeListCtor).wrapAll(_2c);
+}
+}
+return this;
+},replaceWith:function(_2d){
+_2d=this._normalize(_2d,this[0]);
+for(var i=0,_2e;_2e=this[i];i++){
+this._place(_2d,_2e,"before",i>0);
+_2e.parentNode.removeChild(_2e);
+}
+return this;
+},replaceAll:function(_2f){
+var nl=dojo.query(_2f);
+var _30=this._normalize(this,this[0]);
+for(var i=0,_31;_31=nl[i];i++){
+this._place(_30,_31,"before",i>0);
+_31.parentNode.removeChild(_31);
+}
+return this;
+},clone:function(){
+var ary=[];
+for(var i=0;i<this.length;i++){
+ary.push(this._cloneNode(this[i]));
+}
+return this._wrap(ary,this,this._NodeListCtor);
+}});
+if(!dojo.NodeList.prototype.html){
+dojo.NodeList.prototype.html=dojo.NodeList.prototype.innerHTML;
+}
+})();
+}
diff --git a/dojo/NodeList-traverse.js b/dojo/NodeList-traverse.js
new file mode 100644
index 0000000..d2b367a
--- /dev/null
+++ b/dojo/NodeList-traverse.js
@@ -0,0 +1,131 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojo.NodeList-traverse"]){
+dojo._hasResource["dojo.NodeList-traverse"]=true;
+dojo.provide("dojo.NodeList-traverse");
+dojo.extend(dojo.NodeList,{_buildArrayFromCallback:function(_1){
+var _2=[];
+for(var i=0;i<this.length;i++){
+var _3=_1.call(this[i],this[i],_2);
+if(_3){
+_2=_2.concat(_3);
+}
+}
+return _2;
+},_filterQueryResult:function(_4,_5){
+var _6=dojo.filter(_4,function(_7){
+return dojo.query(_5,_7.parentNode).indexOf(_7)!=-1;
+});
+var _8=this._wrap(_6);
+return _8;
+},_getUniqueAsNodeList:function(_9){
+var _a=[];
+for(var i=0,_b;_b=_9[i];i++){
+if(_b.nodeType==1&&dojo.indexOf(_a,_b)==-1){
+_a.push(_b);
+}
+}
+return this._wrap(_a,null,this._NodeListCtor);
+},_getUniqueNodeListWithParent:function(_c,_d){
+var _e=this._getUniqueAsNodeList(_c);
+_e=(_d?this._filterQueryResult(_e,_d):_e);
+return _e._stash(this);
+},_getRelatedUniqueNodes:function(_f,_10){
+return this._getUniqueNodeListWithParent(this._buildArrayFromCallback(_10),_f);
+},children:function(_11){
+return this._getRelatedUniqueNodes(_11,function(_12,ary){
+return dojo._toArray(_12.childNodes);
+});
+},closest:function(_13){
+var _14=this;
+return this._getRelatedUniqueNodes(_13,function(_15,ary){
+do{
+if(_14._filterQueryResult([_15],_13).length){
+return _15;
+}
+}while((_15=_15.parentNode)&&_15.nodeType==1);
+return null;
+});
+},parent:function(_16){
+return this._getRelatedUniqueNodes(_16,function(_17,ary){
+return _17.parentNode;
+});
+},parents:function(_18){
+return this._getRelatedUniqueNodes(_18,function(_19,ary){
+var _1a=[];
+while(_19.parentNode){
+_19=_19.parentNode;
+_1a.push(_19);
+}
+return _1a;
+});
+},siblings:function(_1b){
+return this._getRelatedUniqueNodes(_1b,function(_1c,ary){
+var _1d=[];
+var _1e=(_1c.parentNode&&_1c.parentNode.childNodes);
+for(var i=0;i<_1e.length;i++){
+if(_1e[i]!=_1c){
+_1d.push(_1e[i]);
+}
+}
+return _1d;
+});
+},next:function(_1f){
+return this._getRelatedUniqueNodes(_1f,function(_20,ary){
+var _21=_20.nextSibling;
+while(_21&&_21.nodeType!=1){
+_21=_21.nextSibling;
+}
+return _21;
+});
+},nextAll:function(_22){
+return this._getRelatedUniqueNodes(_22,function(_23,ary){
+var _24=[];
+var _25=_23;
+while((_25=_25.nextSibling)){
+if(_25.nodeType==1){
+_24.push(_25);
+}
+}
+return _24;
+});
+},prev:function(_26){
+return this._getRelatedUniqueNodes(_26,function(_27,ary){
+var _28=_27.previousSibling;
+while(_28&&_28.nodeType!=1){
+_28=_28.previousSibling;
+}
+return _28;
+});
+},prevAll:function(_29){
+return this._getRelatedUniqueNodes(_29,function(_2a,ary){
+var _2b=[];
+var _2c=_2a;
+while((_2c=_2c.previousSibling)){
+if(_2c.nodeType==1){
+_2b.push(_2c);
+}
+}
+return _2b;
+});
+},andSelf:function(){
+return this.concat(this._parent);
+},first:function(){
+return this._wrap(((this[0]&&[this[0]])||[]),this);
+},last:function(){
+return this._wrap((this.length?[this[this.length-1]]:[]),this);
+},even:function(){
+return this.filter(function(_2d,i){
+return i%2!=0;
+});
+},odd:function(){
+return this.filter(function(_2e,i){
+return i%2==0;
+});
+}});
+}
diff --git a/dojo/OpenAjax.js b/dojo/OpenAjax.js
index 5f7c344..60d18aa 100644
--- a/dojo/OpenAjax.js
+++ b/dojo/OpenAjax.js
@@ -10,42 +10,42 @@ OpenAjax=new function(){
 var t=true;
 var f=false;
 var g=window;
-var _4;
-var _5="org.openajax.hub.";
+var _1;
+var _2="org.openajax.hub.";
 var h={};
 this.hub=h;
 h.implementer="http://openajax.org";
 h.implVersion="0.6";
 h.specVersion="0.6";
 h.implExtraData={};
-var _4={};
-h.libraries=_4;
-h.registerLibrary=function(_7,_8,_9,_a){
-_4[_7]={prefix:_7,namespaceURI:_8,version:_9,extraData:_a};
-this.publish(_5+"registerLibrary",_4[_7]);
+var _1={};
+h.libraries=_1;
+h.registerLibrary=function(_3,_4,_5,_6){
+_1[_3]={prefix:_3,namespaceURI:_4,version:_5,extraData:_6};
+this.publish(_2+"registerLibrary",_1[_3]);
 };
-h.unregisterLibrary=function(_b){
-this.publish(_5+"unregisterLibrary",_4[_b]);
-delete _4[_b];
+h.unregisterLibrary=function(_7){
+this.publish(_2+"unregisterLibrary",_1[_7]);
+delete _1[_7];
 };
 h._subscriptions={c:{},s:[]};
 h._cleanup=[];
 h._subIndex=0;
 h._pubDepth=0;
-h.subscribe=function(_c,_d,_e,_f,_10){
-if(!_e){
-_e=window;
-}
-var _11=_c+"."+this._subIndex;
-var sub={scope:_e,cb:_d,fcb:_10,data:_f,sid:this._subIndex++,hdl:_11};
-var _13=_c.split(".");
-this._subscribe(this._subscriptions,_13,0,sub);
-return _11;
+h.subscribe=function(_8,_9,_a,_b,_c){
+if(!_a){
+_a=window;
+}
+var _d=_8+"."+this._subIndex;
+var _e={scope:_a,cb:_9,fcb:_c,data:_b,sid:this._subIndex++,hdl:_d};
+var _f=_8.split(".");
+this._subscribe(this._subscriptions,_f,0,_e);
+return _d;
 };
-h.publish=function(_14,_15){
-var _16=_14.split(".");
+h.publish=function(_10,_11){
+var _12=_10.split(".");
 this._pubDepth++;
-this._publish(this._subscriptions,_16,0,_14,_15);
+this._publish(this._subscriptions,_12,0,_10,_11);
 this._pubDepth--;
 if((this._cleanup.length>0)&&(this._pubDepth==0)){
 for(var i=0;i<this._cleanup.length;i++){
@@ -56,81 +56,81 @@ this._cleanup=[];
 }
 };
 h.unsubscribe=function(sub){
-var _19=sub.split(".");
-var sid=_19.pop();
-this._unsubscribe(this._subscriptions,_19,0,sid);
+var _13=sub.split(".");
+var sid=_13.pop();
+this._unsubscribe(this._subscriptions,_13,0,sid);
 };
-h._subscribe=function(_1b,_1c,_1d,sub){
-var _1f=_1c[_1d];
-if(_1d==_1c.length){
-_1b.s.push(sub);
+h._subscribe=function(_14,_15,_16,sub){
+var _17=_15[_16];
+if(_16==_15.length){
+_14.s.push(sub);
 }else{
-if(typeof _1b.c=="undefined"){
-_1b.c={};
+if(typeof _14.c=="undefined"){
+_14.c={};
 }
-if(typeof _1b.c[_1f]=="undefined"){
-_1b.c[_1f]={c:{},s:[]};
-this._subscribe(_1b.c[_1f],_1c,_1d+1,sub);
+if(typeof _14.c[_17]=="undefined"){
+_14.c[_17]={c:{},s:[]};
+this._subscribe(_14.c[_17],_15,_16+1,sub);
 }else{
-this._subscribe(_1b.c[_1f],_1c,_1d+1,sub);
+this._subscribe(_14.c[_17],_15,_16+1,sub);
 }
 }
 };
-h._publish=function(_20,_21,_22,_23,msg){
-if(typeof _20!="undefined"){
-var _25;
-if(_22==_21.length){
-_25=_20;
+h._publish=function(_18,_19,_1a,_1b,msg){
+if(typeof _18!="undefined"){
+var _1c;
+if(_1a==_19.length){
+_1c=_18;
 }else{
-this._publish(_20.c[_21[_22]],_21,_22+1,_23,msg);
-this._publish(_20.c["*"],_21,_22+1,_23,msg);
-_25=_20.c["**"];
+this._publish(_18.c[_19[_1a]],_19,_1a+1,_1b,msg);
+this._publish(_18.c["*"],_19,_1a+1,_1b,msg);
+_1c=_18.c["**"];
 }
-if(typeof _25!="undefined"){
-var _26=_25.s;
-var max=_26.length;
+if(typeof _1c!="undefined"){
+var _1d=_1c.s;
+var max=_1d.length;
 for(var i=0;i<max;i++){
-if(_26[i].cb){
-var sc=_26[i].scope;
-var cb=_26[i].cb;
-var fcb=_26[i].fcb;
-var d=_26[i].data;
+if(_1d[i].cb){
+var sc=_1d[i].scope;
+var cb=_1d[i].cb;
+var fcb=_1d[i].fcb;
+var d=_1d[i].data;
 if(typeof cb=="string"){
 cb=sc[cb];
 }
 if(typeof fcb=="string"){
 fcb=sc[fcb];
 }
-if((!fcb)||(fcb.call(sc,_23,msg,d))){
-cb.call(sc,_23,msg,d);
+if((!fcb)||(fcb.call(sc,_1b,msg,d))){
+cb.call(sc,_1b,msg,d);
 }
 }
 }
 }
 }
 };
-h._unsubscribe=function(_2d,_2e,_2f,sid){
-if(typeof _2d!="undefined"){
-if(_2f<_2e.length){
-var _31=_2d.c[_2e[_2f]];
-this._unsubscribe(_31,_2e,_2f+1,sid);
-if(_31.s.length==0){
-for(var x in _31.c){
+h._unsubscribe=function(_1e,_1f,_20,sid){
+if(typeof _1e!="undefined"){
+if(_20<_1f.length){
+var _21=_1e.c[_1f[_20]];
+this._unsubscribe(_21,_1f,_20+1,sid);
+if(_21.s.length==0){
+for(var x in _21.c){
 return;
 }
-delete _2d.c[_2e[_2f]];
+delete _1e.c[_1f[_20]];
 }
 return;
 }else{
-var _33=_2d.s;
-var max=_33.length;
+var _22=_1e.s;
+var max=_22.length;
 for(var i=0;i<max;i++){
-if(sid==_33[i].sid){
+if(sid==_22[i].sid){
 if(this._pubDepth>0){
-_33[i].cb=null;
-this._cleanup.push(_33[i]);
+_22[i].cb=null;
+this._cleanup.push(_22[i]);
 }else{
-_33.splice(i,1);
+_22.splice(i,1);
 }
 return;
 }
diff --git a/dojo/_base/Color.js b/dojo/_base/Color.js
index 23d662a..8882137 100644
--- a/dojo/_base/Color.js
+++ b/dojo/_base/Color.js
@@ -12,27 +12,27 @@ dojo.require("dojo._base.array");
 dojo.require("dojo._base.lang");
 (function(){
 var d=dojo;
-dojo.Color=function(_2){
-if(_2){
-this.setColor(_2);
+dojo.Color=function(_1){
+if(_1){
+this.setColor(_1);
 }
 };
-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.Color.named={black:[0,0,0],silver:[192,192,192],gray:[128,128,128],white:[255,255,255],maroon:[128,0,0],red:[255,0,0],purple:[128,0,128],fuchsia:[255,0,255],green:[0,128,0],lime:[0,255,0],olive:[128,128,0],yellow:[255,255,0],navy:[0,0,128],blue:[0,0,255],teal:[0,128,128],aqua:[0,255,255],transparent:d.config.transparentColor||[255,255,255]};
 dojo.extend(dojo.Color,{r:255,g:255,b:255,a:1,_set:function(r,g,b,a){
 var t=this;
 t.r=r;
 t.g=g;
 t.b=b;
 t.a=a;
-},setColor:function(_8){
-if(d.isString(_8)){
-d.colorFromString(_8,this);
+},setColor:function(_2){
+if(d.isString(_2)){
+d.colorFromString(_2,this);
 }else{
-if(d.isArray(_8)){
-d.colorFromArray(_8,this);
+if(d.isArray(_2)){
+d.colorFromArray(_2,this);
 }else{
-this._set(_8.r,_8.g,_8.b,_8.a);
-if(!(_8 instanceof d.Color)){
+this._set(_2.r,_2.g,_2.b,_2.a);
+if(!(_2 instanceof d.Color)){
 this.sanitize();
 }
 }
@@ -47,41 +47,41 @@ return [t.r,t.g,t.b];
 var t=this;
 return [t.r,t.g,t.b,t.a];
 },toHex:function(){
-var _b=d.map(["r","g","b"],function(x){
+var _3=d.map(["r","g","b"],function(x){
 var s=this[x].toString(16);
 return s.length<2?"0"+s:s;
 },this);
-return "#"+_b.join("");
-},toCss:function(_e){
-var t=this,rgb=t.r+", "+t.g+", "+t.b;
-return (_e?"rgba("+rgb+", "+t.a:"rgb("+rgb)+")";
+return "#"+_3.join("");
+},toCss:function(_4){
+var t=this,_5=t.r+", "+t.g+", "+t.b;
+return (_4?"rgba("+_5+", "+t.a:"rgb("+_5)+")";
 },toString:function(){
 return this.toCss(true);
 }});
-dojo.blendColors=function(_11,end,_13,obj){
-var t=obj||new d.Color();
+dojo.blendColors=function(_6,_7,_8,_9){
+var t=_9||new d.Color();
 d.forEach(["r","g","b","a"],function(x){
-t[x]=_11[x]+(end[x]-_11[x])*_13;
+t[x]=_6[x]+(_7[x]-_6[x])*_8;
 if(x!="a"){
 t[x]=Math.round(t[x]);
 }
 });
 return t.sanitize();
 };
-dojo.colorFromRgb=function(_17,obj){
-var m=_17.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/);
-return m&&dojo.colorFromArray(m[1].split(/\s*,\s*/),obj);
+dojo.colorFromRgb=function(_a,_b){
+var m=_a.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/);
+return m&&dojo.colorFromArray(m[1].split(/\s*,\s*/),_b);
 };
-dojo.colorFromHex=function(_1a,obj){
-var t=obj||new d.Color(),_1d=(_1a.length==4)?4:8,_1e=(1<<_1d)-1;
-_1a=Number("0x"+_1a.substr(1));
-if(isNaN(_1a)){
+dojo.colorFromHex=function(_c,_d){
+var t=_d||new d.Color(),_e=(_c.length==4)?4:8,_f=(1<<_e)-1;
+_c=Number("0x"+_c.substr(1));
+if(isNaN(_c)){
 return null;
 }
 d.forEach(["b","g","r"],function(x){
-var c=_1a&_1e;
-_1a>>=_1d;
-t[x]=_1d==4?17*c:c;
+var c=_c&_f;
+_c>>=_e;
+t[x]=_e==4?17*c:c;
 });
 t.a=1;
 return t;
diff --git a/dojo/_base/Deferred.js b/dojo/_base/Deferred.js
index 9944304..8db920b 100644
--- a/dojo/_base/Deferred.js
+++ b/dojo/_base/Deferred.js
@@ -17,6 +17,7 @@ this.paused=0;
 this.results=[null,null];
 this.canceller=_1;
 this.silentlyCancelled=false;
+this.isFiring=false;
 };
 dojo.extend(dojo.Deferred,{_nextId:(function(){
 var n=1;
@@ -24,34 +25,34 @@ return function(){
 return n++;
 };
 })(),cancel:function(){
-var _3;
+var _2;
 if(this.fired==-1){
 if(this.canceller){
-_3=this.canceller(this);
+_2=this.canceller(this);
 }else{
 this.silentlyCancelled=true;
 }
 if(this.fired==-1){
-if(!(_3 instanceof Error)){
-var _4=_3;
-var _5="Deferred Cancelled";
-if(_3&&_3.toString){
-_5+=": "+_3.toString();
+if(!(_2 instanceof Error)){
+var _3=_2;
+var _4="Deferred Cancelled";
+if(_2&&_2.toString){
+_4+=": "+_2.toString();
 }
-_3=new Error(_5);
-_3.dojoType="cancel";
-_3.cancelResult=_4;
+_2=new Error(_4);
+_2.dojoType="cancel";
+_2.cancelResult=_3;
 }
-this.errback(_3);
+this.errback(_2);
 }
 }else{
 if((this.fired==0)&&(this.results[0] instanceof dojo.Deferred)){
 this.results[0].cancel();
 }
 }
-},_resback:function(_6){
-this.fired=((_6 instanceof Error)?1:0);
-this.results[this.fired]=_6;
+},_resback:function(_5){
+this.fired=((_5 instanceof Error)?1:0);
+this.results[this.fired]=_5;
 this._fire();
 },_check:function(){
 if(this.fired!=-1){
@@ -61,72 +62,74 @@ throw new Error("already called!");
 this.silentlyCancelled=false;
 return;
 }
-},callback:function(_7){
+},callback:function(_6){
 this._check();
-this._resback(_7);
-},errback:function(_8){
+this._resback(_6);
+},errback:function(_7){
 this._check();
-if(!(_8 instanceof Error)){
-_8=new Error(_8);
-}
-this._resback(_8);
-},addBoth:function(cb,_a){
-var _b=dojo.hitch.apply(dojo,arguments);
-return this.addCallbacks(_b,_b);
-},addCallback:function(cb,_d){
+if(!(_7 instanceof Error)){
+_7=new Error(_7);
+}
+this._resback(_7);
+},addBoth:function(cb,_8){
+var _9=dojo.hitch.apply(dojo,arguments);
+return this.addCallbacks(_9,_9);
+},addCallback:function(cb,_a){
 return this.addCallbacks(dojo.hitch.apply(dojo,arguments));
-},addErrback:function(cb,_f){
+},addErrback:function(cb,_b){
 return this.addCallbacks(null,dojo.hitch.apply(dojo,arguments));
 },addCallbacks:function(cb,eb){
 this.chain.push([cb,eb]);
-if(this.fired>=0){
+if(this.fired>=0&&!this.isFiring){
 this._fire();
 }
 return this;
 },_fire:function(){
-var _12=this.chain;
-var _13=this.fired;
-var res=this.results[_13];
-var _15=this;
+this.isFiring=true;
+var _c=this.chain;
+var _d=this.fired;
+var _e=this.results[_d];
+var _f=this;
 var cb=null;
-while((_12.length>0)&&(this.paused==0)){
-var f=_12.shift()[_13];
+while((_c.length>0)&&(this.paused==0)){
+var f=_c.shift()[_d];
 if(!f){
 continue;
 }
-var _18=function(){
-var ret=f(res);
+var _10=function(){
+var ret=f(_e);
 if(typeof ret!="undefined"){
-res=ret;
+_e=ret;
 }
-_13=((res instanceof Error)?1:0);
-if(res instanceof dojo.Deferred){
+_d=((_e instanceof Error)?1:0);
+if(_e instanceof dojo.Deferred){
 cb=function(res){
-_15._resback(res);
-_15.paused--;
-if((_15.paused==0)&&(_15.fired>=0)){
-_15._fire();
+_f._resback(res);
+_f.paused--;
+if((_f.paused==0)&&(_f.fired>=0)){
+_f._fire();
 }
 };
 this.paused++;
 }
 };
 if(dojo.config.debugAtAllCosts){
-_18.call(this);
+_10.call(this);
 }else{
 try{
-_18.call(this);
+_10.call(this);
 }
 catch(err){
-_13=1;
-res=err;
+_d=1;
+_e=err;
 }
 }
 }
-this.fired=_13;
-this.results[_13]=res;
+this.fired=_d;
+this.results[_d]=_e;
+this.isFiring=false;
 if((cb)&&(this.paused)){
-res.addBoth(cb);
+_e.addBoth(cb);
 }
 }});
 }
diff --git a/dojo/_base/NodeList.js b/dojo/_base/NodeList.js
index 7074b1a..919c97a 100644
--- a/dojo/_base/NodeList.js
+++ b/dojo/_base/NodeList.js
@@ -12,152 +12,217 @@ dojo.require("dojo._base.lang");
 dojo.require("dojo._base.array");
 (function(){
 var d=dojo;
-var ap=Array.prototype,_3=ap.slice,_4=ap.concat;
-var _5=function(a){
-a.constructor=d.NodeList;
-dojo._mixin(a,d.NodeList.prototype);
-return a;
-};
-var _7=function(f,a,o){
-a=[0].concat(_3.call(a,0));
+var ap=Array.prototype,_1=ap.slice,_2=ap.concat;
+var _3=function(a,_4,_5){
 if(!a.sort){
-a=_3.call(a,0);
+a=_1.call(a,0);
 }
+var _6=_5||this._NodeListCtor||d._NodeListCtor;
+a.constructor=_6;
+dojo._mixin(a,_6.prototype);
+a._NodeListCtor=_6;
+return _4?a._stash(_4):a;
+};
+var _7=function(f,a,o){
+a=[0].concat(_1.call(a,0));
 o=o||d.global;
-return function(_b){
-a[0]=_b;
+return function(_8){
+a[0]=_8;
 return f.apply(o,a);
 };
 };
-var _c=function(f,o){
+var _9=function(f,o){
 return function(){
 this.forEach(_7(f,arguments,o));
 return this;
 };
 };
-var _f=function(f,o){
+var _a=function(f,o){
 return function(){
 return this.map(_7(f,arguments,o));
 };
 };
-var _12=function(f,o){
+var _b=function(f,o){
 return function(){
 return this.filter(_7(f,arguments,o));
 };
 };
-var _15=function(f,g,o){
+var _c=function(f,g,o){
 return function(){
-var a=arguments,_1a=_7(f,a,o);
+var a=arguments,_d=_7(f,a,o);
 if(g.call(o||d.global,a)){
-return this.map(_1a);
+return this.map(_d);
 }
-this.forEach(_1a);
+this.forEach(_d);
 return this;
 };
 };
-var _1b=function(a){
-return a.length==1&&d.isString(a[0]);
+var _e=function(a){
+return a.length==1&&(typeof a[0]=="string");
 };
-var _1d=function(_1e){
-var p=_1e.parentNode;
+var _f=function(_10){
+var p=_10.parentNode;
 if(p){
-p.removeChild(_1e);
+p.removeChild(_10);
 }
 };
 dojo.NodeList=function(){
-return _5(Array.apply(null,arguments));
+return _3(Array.apply(null,arguments));
 };
+d._NodeListCtor=d.NodeList;
 var nl=d.NodeList,nlp=nl.prototype;
-nl._wrap=_5;
-nl._adaptAsMap=_f;
-nl._adaptAsForEach=_c;
-nl._adaptAsFilter=_12;
-nl._adaptWithCondition=_15;
-d.forEach(["slice","splice"],function(_22){
-var f=ap[_22];
-nlp[_22]=function(){
-return _5(f.apply(this,arguments));
+nl._wrap=nlp._wrap=_3;
+nl._adaptAsMap=_a;
+nl._adaptAsForEach=_9;
+nl._adaptAsFilter=_b;
+nl._adaptWithCondition=_c;
+d.forEach(["slice","splice"],function(_11){
+var f=ap[_11];
+nlp[_11]=function(){
+return this._wrap(f.apply(this,arguments),_11=="slice"?this:null);
 };
 });
-d.forEach(["indexOf","lastIndexOf","every","some"],function(_24){
-var f=d[_24];
-nlp[_24]=function(){
-return f.apply(d,[this].concat(_3.call(arguments,0)));
+d.forEach(["indexOf","lastIndexOf","every","some"],function(_12){
+var f=d[_12];
+nlp[_12]=function(){
+return f.apply(d,[this].concat(_1.call(arguments,0)));
 };
 });
-d.forEach(["attr","style"],function(_26){
-nlp[_26]=_15(d[_26],_1b);
+d.forEach(["attr","style"],function(_13){
+nlp[_13]=_c(d[_13],_e);
 });
-d.forEach(["connect","addClass","removeClass","toggleClass","empty"],function(_27){
-nlp[_27]=_c(d[_27]);
+d.forEach(["connect","addClass","removeClass","toggleClass","empty","removeAttr"],function(_14){
+nlp[_14]=_9(d[_14]);
 });
-dojo.extend(dojo.NodeList,{concat:function(_28){
-var t=d.isArray(this)?this:_3.call(this,0),m=d.map(arguments,function(a){
-return a&&!d.isArray(a)&&(a.constructor===NodeList||a.constructor==nl)?_3.call(a,0):a;
+dojo.extend(dojo.NodeList,{_normalize:function(_15,_16){
+var _17=_15.parse===true?true:false;
+if(typeof _15.template=="string"){
+var _18=_15.templateFunc||(dojo.string&&dojo.string.substitute);
+_15=_18?_18(_15.template,_15):_15;
+}
+var _19=(typeof _15);
+if(_19=="string"||_19=="number"){
+_15=dojo._toDom(_15,(_16&&_16.ownerDocument));
+if(_15.nodeType==11){
+_15=dojo._toArray(_15.childNodes);
+}else{
+_15=[_15];
+}
+}else{
+if(!dojo.isArrayLike(_15)){
+_15=[_15];
+}else{
+if(!dojo.isArray(_15)){
+_15=dojo._toArray(_15);
+}
+}
+}
+if(_17){
+_15._runParse=true;
+}
+return _15;
+},_cloneNode:function(_1a){
+return _1a.cloneNode(true);
+},_place:function(ary,_1b,_1c,_1d){
+if(_1b.nodeType!=1&&_1c=="only"){
+return;
+}
+var _1e=_1b,_1f;
+var _20=ary.length;
+for(var i=_20-1;i>=0;i--){
+var _21=(_1d?this._cloneNode(ary[i]):ary[i]);
+if(ary._runParse&&dojo.parser&&dojo.parser.parse){
+if(!_1f){
+_1f=_1e.ownerDocument.createElement("div");
+}
+_1f.appendChild(_21);
+dojo.parser.parse(_1f);
+_21=_1f.firstChild;
+while(_1f.firstChild){
+_1f.removeChild(_1f.firstChild);
+}
+}
+if(i==_20-1){
+dojo.place(_21,_1e,_1c);
+}else{
+_1e.parentNode.insertBefore(_21,_1e);
+}
+_1e=_21;
+}
+},_stash:function(_22){
+this._parent=_22;
+return this;
+},end:function(){
+if(this._parent){
+return this._parent;
+}else{
+return new this._NodeListCtor();
+}
+},concat:function(_23){
+var t=d.isArray(this)?this:_1.call(this,0),m=d.map(arguments,function(a){
+return a&&!d.isArray(a)&&(typeof NodeList!="undefined"&&a.constructor===NodeList||a.constructor===this._NodeListCtor)?_1.call(a,0):a;
 });
-return _5(_4.apply(t,m));
-},map:function(_2c,obj){
-return _5(d.map(this,_2c,obj));
-},forEach:function(_2e,_2f){
-d.forEach(this,_2e,_2f);
+return this._wrap(_2.apply(t,m),this);
+},map:function(_24,obj){
+return this._wrap(d.map(this,_24,obj),this);
+},forEach:function(_25,_26){
+d.forEach(this,_25,_26);
 return this;
-},coords:_f(d.coords),place:function(_30,_31){
-var _32=d.query(_30)[0];
-return this.forEach(function(_33){
-d.place(_33,_32,_31);
+},coords:_a(d.coords),position:_a(d.position),place:function(_27,_28){
+var _29=d.query(_27)[0];
+return this.forEach(function(_2a){
+d.place(_2a,_29,_28);
 });
-},orphan:function(_34){
-return (_34?d._filterQueryResult(this,_34):this).forEach(_1d);
-},adopt:function(_35,_36){
-return d.query(_35).place(this[0],_36);
-},query:function(_37){
-if(!_37){
+},orphan:function(_2b){
+return (_2b?d._filterQueryResult(this,_2b):this).forEach(_f);
+},adopt:function(_2c,_2d){
+return d.query(_2c).place(this[0],_2d)._stash(this);
+},query:function(_2e){
+if(!_2e){
 return this;
 }
-var ret=this.map(function(_39){
-return d.query(_37,_39).filter(function(_3a){
-return _3a!==undefined;
+var ret=this.map(function(_2f){
+return d.query(_2e,_2f).filter(function(_30){
+return _30!==undefined;
 });
 });
-return _5(_4.apply([],ret));
-},filter:function(_3b){
-var a=arguments,_3d=this,_3e=0;
-if(d.isString(_3b)){
-_3d=d._filterQueryResult(this,a[0]);
+return this._wrap(_2.apply([],ret),this);
+},filter:function(_31){
+var a=arguments,_32=this,_33=0;
+if(typeof _31=="string"){
+_32=d._filterQueryResult(this,a[0]);
 if(a.length==1){
-return _3d;
-}
-_3e=1;
+return _32._stash(this);
 }
-return _5(d.filter(_3d,a[_3e],a[_3e+1]));
-},addContent:function(_3f,_40){
-var c=d.isString(_3f)?d._toDom(_3f,this[0]&&this[0].ownerDocument):_3f,i,l=this.length-1;
-for(i=0;i<l;++i){
-d.place(c.cloneNode(true),this[i],_40);
+_33=1;
 }
-if(l>=0){
-d.place(c,this[l],_40);
+return this._wrap(d.filter(_32,a[_33],a[_33+1]),this);
+},addContent:function(_34,_35){
+_34=this._normalize(_34,this[0]);
+for(var i=0,_36;_36=this[i];i++){
+this._place(_34,_36,_35,i>0);
 }
 return this;
-},instantiate:function(_44,_45){
-var c=d.isFunction(_44)?_44:d.getObject(_44);
-_45=_45||{};
-return this.forEach(function(_47){
-new c(_45,_47);
+},instantiate:function(_37,_38){
+var c=d.isFunction(_37)?_37:d.getObject(_37);
+_38=_38||{};
+return this.forEach(function(_39){
+new c(_38,_39);
 });
 },at:function(){
-var t=new dojo.NodeList();
+var t=new this._NodeListCtor();
 d.forEach(arguments,function(i){
 if(this[i]){
 t.push(this[i]);
 }
 },this);
-return t;
+return t._stash(this);
 }});
-d.forEach(["blur","focus","change","click","error","keydown","keypress","keyup","load","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","submit"],function(evt){
-var _oe="on"+evt;
-nlp[_oe]=function(a,b){
-return this.connect(_oe,a,b);
+nl.events=["blur","focus","change","click","error","keydown","keypress","keyup","load","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","submit"];
+d.forEach(nl.events,function(evt){
+var _3a="on"+evt;
+nlp[_3a]=function(a,b){
+return this.connect(_3a,a,b);
 };
 });
 })();
diff --git a/dojo/_base/_loader/bootstrap.js b/dojo/_base/_loader/bootstrap.js
index 7f21fcc..9a2c303 100644
--- a/dojo/_base/_loader/bootstrap.js
+++ b/dojo/_base/_loader/bootstrap.js
@@ -15,26 +15,27 @@ var i=0,tn;
 while((tn=cn[i++])){
 if(!console[tn]){
 (function(){
-var _4=tn+"";
-console[_4]=("log" in console)?function(){
+var _1=tn+"";
+console[_1]=("log" in console)?function(){
 var a=Array.apply({},arguments);
-a.unshift(_4+":");
+a.unshift(_1+":");
 console["log"](a.join(" "));
 }:function(){
 };
+console[_1]._fake=true;
 })();
 }
 }
 }
 if(typeof dojo=="undefined"){
-this.dojo={_scopeName:"dojo",_scopePrefix:"",_scopePrefixArgs:"",_scopeSuffix:"",_scopeMap:{},_scopeMapRev:{}};
+dojo={_scopeName:"dojo",_scopePrefix:"",_scopePrefixArgs:"",_scopeSuffix:"",_scopeMap:{},_scopeMapRev:{}};
 }
 var d=dojo;
 if(typeof dijit=="undefined"){
-this.dijit={_scopeName:"dijit"};
+dijit={_scopeName:"dijit"};
 }
 if(typeof dojox=="undefined"){
-this.dojox={_scopeName:"dojox"};
+dojox={_scopeName:"dojox"};
 }
 if(!d._scopeArgs){
 d._scopeArgs=[dojo,dijit,dojox];
@@ -42,13 +43,13 @@ d._scopeArgs=[dojo,dijit,dojox];
 d.global=this;
 d.config={isDebug:false,debugAtAllCosts:false};
 if(typeof djConfig!="undefined"){
-for(var _7 in djConfig){
-d.config[_7]=djConfig[_7];
+for(var _2 in djConfig){
+d.config[_2]=djConfig[_2];
 }
 }
 dojo.locale=d.config.locale;
-var _8="$Rev: 18832 $".match(/\d+/);
-dojo.version={major:1,minor:3,patch:2,flag:"",revision:_8?+_8[0]:NaN,toString:function(){
+var _3="$Rev: 21254 $".match(/\d+/);
+dojo.version={major:1,minor:4,patch:1,flag:"",revision:_3?+_3[0]:NaN,toString:function(){
 with(d.version){
 return major+"."+minor+"."+patch+flag+" ("+revision+")";
 }
@@ -56,52 +57,63 @@ return major+"."+minor+"."+patch+flag+" ("+revision+")";
 if(typeof OpenAjax!="undefined"){
 OpenAjax.hub.registerLibrary(dojo._scopeName,"http://dojotoolkit.org",d.version.toString());
 }
-var _9={};
-dojo._mixin=function(_a,_b){
-for(var x in _b){
-if(_9[x]===undefined||_9[x]!=_b[x]){
-_a[x]=_b[x];
+var _4,_5,_6={};
+for(var i in {toString:1}){
+_4=[];
+break;
 }
+dojo._extraNames=_4=_4||["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"];
+_5=_4.length;
+dojo._mixin=function(_7,_8){
+var _9,s,i;
+for(_9 in _8){
+s=_8[_9];
+if(!(_9 in _7)||(_7[_9]!==s&&(!(_9 in _6)||_6[_9]!==s))){
+_7[_9]=s;
 }
-if(d.isIE&&_b){
-var p=_b.toString;
-if(typeof p=="function"&&p!=_a.toString&&p!=_9.toString&&p!="\nfunction toString() {\n    [native code]\n}\n"){
-_a.toString=_b.toString;
 }
+if(_5&&_8){
+for(i=0;i<_5;++i){
+_9=_4[i];
+s=_8[_9];
+if(!(_9 in _7)||(_7[_9]!==s&&(!(_9 in _6)||_6[_9]!==s))){
+_7[_9]=s;
 }
-return _a;
+}
+}
+return _7;
 };
-dojo.mixin=function(_e,_f){
-if(!_e){
-_e={};
+dojo.mixin=function(_a,_b){
+if(!_a){
+_a={};
 }
 for(var i=1,l=arguments.length;i<l;i++){
-d._mixin(_e,arguments[i]);
+d._mixin(_a,arguments[i]);
 }
-return _e;
+return _a;
 };
-dojo._getProp=function(_12,_13,_14){
-var obj=_14||d.global;
-for(var i=0,p;obj&&(p=_12[i]);i++){
-if(i==0&&this._scopeMap[p]){
-p=this._scopeMap[p];
+dojo._getProp=function(_c,_d,_e){
+var _f=_e||d.global;
+for(var i=0,p;_f&&(p=_c[i]);i++){
+if(i==0&&d._scopeMap[p]){
+p=d._scopeMap[p];
 }
-obj=(p in obj?obj[p]:(_13?obj[p]={}:undefined));
+_f=(p in _f?_f[p]:(_d?_f[p]={}:undefined));
 }
-return obj;
+return _f;
 };
-dojo.setObject=function(_18,_19,_1a){
-var _1b=_18.split("."),p=_1b.pop(),obj=d._getProp(_1b,true,_1a);
-return obj&&p?(obj[p]=_19):undefined;
+dojo.setObject=function(_10,_11,_12){
+var _13=_10.split("."),p=_13.pop(),obj=d._getProp(_13,true,_12);
+return obj&&p?(obj[p]=_11):undefined;
 };
-dojo.getObject=function(_1e,_1f,_20){
-return d._getProp(_1e.split("."),_1f,_20);
+dojo.getObject=function(_14,_15,_16){
+return d._getProp(_14.split("."),_15,_16);
 };
-dojo.exists=function(_21,obj){
-return !!d.getObject(_21,false,obj);
+dojo.exists=function(_17,obj){
+return !!d.getObject(_17,false,obj);
 };
-dojo["eval"]=function(_23){
-return d.global.eval?d.global.eval(_23):eval(_23);
+dojo["eval"]=function(_18){
+return d.global.eval?d.global.eval(_18):eval(_18);
 };
 d.deprecated=d.experimental=function(){
 };
diff --git a/dojo/_base/_loader/hostenv_browser.js b/dojo/_base/_loader/hostenv_browser.js
index 8344294..32feb26 100644
--- a/dojo/_base/_loader/hostenv_browser.js
+++ b/dojo/_base/_loader/hostenv_browser.js
@@ -11,23 +11,23 @@ dojo._name="browser";
 (function(){
 var d=dojo;
 if(document&&document.getElementsByTagName){
-var _2=document.getElementsByTagName("script");
-var _3=/dojo(\.xd)?\.js(\W|$)/i;
-for(var i=0;i<_2.length;i++){
-var _5=_2[i].getAttribute("src");
-if(!_5){
+var _1=document.getElementsByTagName("script");
+var _2=/dojo(\.xd)?\.js(\W|$)/i;
+for(var i=0;i<_1.length;i++){
+var _3=_1[i].getAttribute("src");
+if(!_3){
 continue;
 }
-var m=_5.match(_3);
+var m=_3.match(_2);
 if(m){
 if(!d.config.baseUrl){
-d.config.baseUrl=_5.substring(0,m.index);
+d.config.baseUrl=_3.substring(0,m.index);
 }
-var _7=_2[i].getAttribute("djConfig");
-if(_7){
-var _8=eval("({ "+_7+" })");
-for(var x in _8){
-dojo.config[x]=_8[x];
+var _4=_1[i].getAttribute("djConfig");
+if(_4){
+var _5=eval("({ "+_4+" })");
+for(var x in _5){
+dojo.config[x]=_5[x];
 }
 }
 break;
@@ -36,113 +36,113 @@ break;
 }
 d.baseUrl=d.config.baseUrl;
 var n=navigator;
-var _b=n.userAgent,_c=n.appVersion,tv=parseFloat(_c);
-if(_b.indexOf("Opera")>=0){
+var _6=n.userAgent,_7=n.appVersion,tv=parseFloat(_7);
+if(_6.indexOf("Opera")>=0){
 d.isOpera=tv;
 }
-if(_b.indexOf("AdobeAIR")>=0){
+if(_6.indexOf("AdobeAIR")>=0){
 d.isAIR=1;
 }
-d.isKhtml=(_c.indexOf("Konqueror")>=0)?tv:0;
-d.isWebKit=parseFloat(_b.split("WebKit/")[1])||undefined;
-d.isChrome=parseFloat(_b.split("Chrome/")[1])||undefined;
-var _e=Math.max(_c.indexOf("WebKit"),_c.indexOf("Safari"),0);
-if(_e&&!dojo.isChrome){
-d.isSafari=parseFloat(_c.split("Version/")[1]);
-if(!d.isSafari||parseFloat(_c.substr(_e+7))<=419.3){
+d.isKhtml=(_7.indexOf("Konqueror")>=0)?tv:0;
+d.isWebKit=parseFloat(_6.split("WebKit/")[1])||undefined;
+d.isChrome=parseFloat(_6.split("Chrome/")[1])||undefined;
+d.isMac=_7.indexOf("Macintosh")>=0;
+var _8=Math.max(_7.indexOf("WebKit"),_7.indexOf("Safari"),0);
+if(_8&&!dojo.isChrome){
+d.isSafari=parseFloat(_7.split("Version/")[1]);
+if(!d.isSafari||parseFloat(_7.substr(_8+7))<=419.3){
 d.isSafari=2;
 }
 }
-if(_b.indexOf("Gecko")>=0&&!d.isKhtml&&!d.isWebKit){
+if(_6.indexOf("Gecko")>=0&&!d.isKhtml&&!d.isWebKit){
 d.isMozilla=d.isMoz=tv;
 }
 if(d.isMoz){
-d.isFF=parseFloat(_b.split("Firefox/")[1]||_b.split("Minefield/")[1]||_b.split("Shiretoko/")[1])||undefined;
+d.isFF=parseFloat(_6.split("Firefox/")[1]||_6.split("Minefield/")[1])||undefined;
 }
 if(document.all&&!d.isOpera){
-d.isIE=parseFloat(_c.split("MSIE ")[1])||undefined;
-if(d.isIE>=8&&document.documentMode!=5){
-d.isIE=document.documentMode;
+d.isIE=parseFloat(_7.split("MSIE ")[1])||undefined;
+var _9=document.documentMode;
+if(_9&&_9!=5&&Math.floor(d.isIE)!=_9){
+d.isIE=_9;
 }
 }
 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.isQuirks=document.compatMode=="BackCompat";
 d.locale=dojo.config.locale||(d.isIE?n.userLanguage:n.language).toLowerCase();
 d._XMLHTTP_PROGIDS=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"];
 d._xhrObj=function(){
-var _10,_11;
+var _a,_b;
 if(!dojo.isIE||!dojo.config.ieForceActiveXXhr){
 try{
-_10=new XMLHttpRequest();
+_a=new XMLHttpRequest();
 }
 catch(e){
 }
 }
-if(!_10){
+if(!_a){
 for(var i=0;i<3;++i){
-var _13=d._XMLHTTP_PROGIDS[i];
+var _c=d._XMLHTTP_PROGIDS[i];
 try{
-_10=new ActiveXObject(_13);
+_a=new ActiveXObject(_c);
 }
 catch(e){
-_11=e;
+_b=e;
 }
-if(_10){
-d._XMLHTTP_PROGIDS=[_13];
+if(_a){
+d._XMLHTTP_PROGIDS=[_c];
 break;
 }
 }
 }
-if(!_10){
-throw new Error("XMLHTTP not available: "+_11);
+if(!_a){
+throw new Error("XMLHTTP not available: "+_b);
 }
-return _10;
+return _a;
 };
-d._isDocumentOk=function(_14){
-var _15=_14.status||0;
-return (_15>=200&&_15<300)||_15==304||_15==1223||(!_15&&(location.protocol=="file:"||location.protocol=="chrome:"));
+d._isDocumentOk=function(_d){
+var _e=_d.status||0,lp=location.protocol;
+return (_e>=200&&_e<300)||_e==304||_e==1223||(!_e&&(lp=="file:"||lp=="chrome:"||lp=="app:"));
 };
-var _16=window.location+"";
-var _17=document.getElementsByTagName("base");
-var _18=(_17&&_17.length>0);
-d._getText=function(uri,_1a){
-var _1b=this._xhrObj();
-if(!_18&&dojo._Url){
-uri=(new dojo._Url(_16,uri)).toString();
+var _f=window.location+"";
+var _10=document.getElementsByTagName("base");
+var _11=(_10&&_10.length>0);
+d._getText=function(uri,_12){
+var _13=d._xhrObj();
+if(!_11&&dojo._Url){
+uri=(new dojo._Url(_f,uri)).toString();
 }
 if(d.config.cacheBust){
 uri+="";
 uri+=(uri.indexOf("?")==-1?"?":"&")+String(d.config.cacheBust).replace(/\W+/g,"");
 }
-_1b.open("GET",uri,false);
+_13.open("GET",uri,false);
 try{
-_1b.send(null);
-if(!d._isDocumentOk(_1b)){
-var err=Error("Unable to load "+uri+" status:"+_1b.status);
-err.status=_1b.status;
-err.responseText=_1b.responseText;
+_13.send(null);
+if(!d._isDocumentOk(_13)){
+var err=Error("Unable to load "+uri+" status:"+_13.status);
+err.status=_13.status;
+err.responseText=_13.responseText;
 throw err;
 }
 }
 catch(e){
-if(_1a){
+if(_12){
 return null;
 }
 throw e;
 }
-return _1b.responseText;
-};
-var _w=window;
-var _1e=function(_1f,fp){
-var _21=_w[_1f]||function(){
-};
-_w[_1f]=function(){
-fp.apply(_w,arguments);
-_21.apply(_w,arguments);
+return _13.responseText;
 };
+var _14=window;
+var _15=function(_16,fp){
+var _17=_14.attachEvent||_14.addEventListener;
+_16=_14.attachEvent?_16:_16.substring(2);
+_17(_16,function(){
+fp.apply(_14,arguments);
+},false);
 };
 d._windowUnloaders=[];
 d.windowUnloaded=function(){
@@ -151,65 +151,59 @@ while(mll.length){
 (mll.pop())();
 }
 };
-var _23=0;
-d.addOnWindowUnload=function(obj,_25){
-d._onto(d._windowUnloaders,obj,_25);
-if(!_23){
-_23=1;
-_1e("onunload",d.windowUnloaded);
+var _18=0;
+d.addOnWindowUnload=function(obj,_19){
+d._onto(d._windowUnloaders,obj,_19);
+if(!_18){
+_18=1;
+_15("onunload",d.windowUnloaded);
 }
 };
-var _26=0;
-d.addOnUnload=function(obj,_28){
-d._onto(d._unloaders,obj,_28);
-if(!_26){
-_26=1;
-_1e("onbeforeunload",dojo.unloaded);
+var _1a=0;
+d.addOnUnload=function(obj,_1b){
+d._onto(d._unloaders,obj,_1b);
+if(!_1a){
+_1a=1;
+_15("onbeforeunload",dojo.unloaded);
 }
 };
 })();
 dojo._initFired=false;
 dojo._loadInit=function(e){
+if(!dojo._initFired){
 dojo._initFired=true;
-var _2a=e&&e.type?e.type.toLowerCase():"load";
-if(arguments.callee.initialized||(_2a!="domcontentloaded"&&_2a!="load")){
-return;
-}
-arguments.callee.initialized=true;
-if("_khtmlTimer" in dojo){
-clearInterval(dojo._khtmlTimer);
-delete dojo._khtmlTimer;
+if(!dojo.config.afterOnLoad&&window.detachEvent){
+window.detachEvent("onload",dojo._loadInit);
 }
 if(dojo._inFlightCount==0){
 dojo._modulesLoaded();
 }
+}
 };
 if(!dojo.config.afterOnLoad){
 if(document.addEventListener){
-if(dojo.isWebKit>525||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);
+document.addEventListener("DOMContentLoaded",dojo._loadInit,false);
+window.addEventListener("load",dojo._loadInit,false);
 }else{
-if((dojo.isWebKit<525)||dojo.isKhtml){
-dojo._khtmlTimer=setInterval(function(){
-if(/loaded|complete/.test(document.readyState)){
-dojo._loadInit();
-}
-},10);
+if(window.attachEvent){
+window.attachEvent("onload",dojo._loadInit);
 }
 }
 }
 if(dojo.isIE){
-if(!dojo.config.afterOnLoad){
+if(!dojo.config.afterOnLoad&&!dojo.config.skipIeDomLoaded){
 document.write("<scr"+"ipt defer src=\"//:\" "+"onreadystatechange=\"if(this.readyState=='complete'){"+dojo._scopeName+"._loadInit();}\">"+"</scr"+"ipt>");
 }
 try{
 document.namespaces.add("v","urn:schemas-microsoft-com:vml");
-document.createStyleSheet().addRule("v\\:*","behavior:url(#default#VML);  display:inline-block");
+var vmlElems=["*","group","roundrect","oval","shape","rect","imagedata"],i=0,l=1,s=document.createStyleSheet();
+if(dojo.isIE>=8){
+i=1;
+l=vmlElems.length;
+}
+for(;i<l;++i){
+s.addRule("v\\:"+vmlElems[i],"behavior:url(#default#VML); display:inline-block");
+}
 }
 catch(e){
 }
@@ -218,8 +212,8 @@ catch(e){
 (function(){
 var mp=dojo.config["modulePaths"];
 if(mp){
-for(var _2c in mp){
-dojo.registerModulePath(_2c,mp[_2c]);
+for(var _1c in mp){
+dojo.registerModulePath(_1c,mp[_1c]);
 }
 }
 })();
diff --git a/dojo/_base/_loader/hostenv_ff_ext.js b/dojo/_base/_loader/hostenv_ff_ext.js
index 3c17c94..e7ccc52 100644
--- a/dojo/_base/_loader/hostenv_ff_ext.js
+++ b/dojo/_base/_loader/hostenv_ff_ext.js
@@ -12,98 +12,97 @@ dojo._name="browser";
 var d=dojo;
 d.baseUrl=d.config.baseUrl;
 var n=navigator;
-var _3=n.userAgent;
-var _4=n.appVersion;
-var tv=parseFloat(_4);
+var _1=n.userAgent;
+var _2=n.appVersion;
+var tv=parseFloat(_2);
 d.isMozilla=d.isMoz=tv;
 if(d.isMoz){
-d.isFF=parseFloat(_3.split("Firefox/")[1])||undefined;
+d.isFF=parseFloat(_1.split("Firefox/")[1])||undefined;
 }
-var cm=document.compatMode;
-d.isQuirks=cm=="BackCompat"||cm=="QuirksMode";
+d.isQuirks=document.compatMode=="BackCompat";
 d.locale=dojo.config.locale||n.language.toLowerCase();
 d._xhrObj=function(){
 return new XMLHttpRequest();
 };
-var _7=d._loadUri;
-d._loadUri=function(_8,cb){
-var _a=["file:","chrome:","resource:"].some(function(_b){
-return String(_8).indexOf(_b)==0;
+var _3=d._loadUri;
+d._loadUri=function(_4,cb){
+var _5=["file:","chrome:","resource:"].some(function(_6){
+return String(_4).indexOf(_6)==0;
 });
-if(_a){
+if(_5){
 var l=Components.classes["@mozilla.org/moz/jssubscript-loader;1"].getService(Components.interfaces.mozIJSSubScriptLoader);
-var _d=l.loadSubScript(_8,d.global);
+var _7=l.loadSubScript(_4,d.global);
 if(cb){
-cb(_d);
+cb(_7);
 }
 return true;
 }else{
-return _7.apply(d,arguments);
+return _3.apply(d,arguments);
 }
 };
-d._isDocumentOk=function(_e){
-var _f=_e.status||0;
-return (_f>=200&&_f<300)||_f==304||_f==1223||(!_f&&(location.protocol=="file:"||location.protocol=="chrome:"));
+d._isDocumentOk=function(_8){
+var _9=_8.status||0;
+return (_9>=200&&_9<300)||_9==304||_9==1223||(!_9&&(location.protocol=="file:"||location.protocol=="chrome:"));
 };
-var _10=false;
-d._getText=function(uri,_12){
-var _13=this._xhrObj();
-if(!_10&&dojo._Url){
-uri=(new dojo._Url(uri)).toString();
+var _a=false;
+d._getText=function(_b,_c){
+var _d=d._xhrObj();
+if(!_a&&dojo._Url){
+_b=(new dojo._Url(_b)).toString();
 }
 if(d.config.cacheBust){
-uri+="";
-uri+=(uri.indexOf("?")==-1?"?":"&")+String(d.config.cacheBust).replace(/\W+/g,"");
+_b+="";
+_b+=(_b.indexOf("?")==-1?"?":"&")+String(d.config.cacheBust).replace(/\W+/g,"");
 }
-var _14=["file:","chrome:","resource:"].some(function(_15){
-return String(uri).indexOf(_15)==0;
+var _e=["file:","chrome:","resource:"].some(function(_f){
+return String(_b).indexOf(_f)==0;
 });
-if(_14){
-var _16=Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
-var _17=Components.classes["@mozilla.org/scriptableinputstream;1"].getService(Components.interfaces.nsIScriptableInputStream);
-var _18=_16.newChannel(uri,null,null);
-var _19=_18.open();
-_17.init(_19);
-var str=_17.read(_19.available());
-_17.close();
-_19.close();
+if(_e){
+var _10=Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
+var _11=Components.classes["@mozilla.org/scriptableinputstream;1"].getService(Components.interfaces.nsIScriptableInputStream);
+var _12=_10.newChannel(_b,null,null);
+var _13=_12.open();
+_11.init(_13);
+var str=_11.read(_13.available());
+_11.close();
+_13.close();
 return str;
 }else{
-_13.open("GET",uri,false);
+_d.open("GET",_b,false);
 try{
-_13.send(null);
-if(!d._isDocumentOk(_13)){
-var err=Error("Unable to load "+uri+" status:"+_13.status);
-err.status=_13.status;
-err.responseText=_13.responseText;
+_d.send(null);
+if(!d._isDocumentOk(_d)){
+var err=Error("Unable to load "+_b+" status:"+_d.status);
+err.status=_d.status;
+err.responseText=_d.responseText;
 throw err;
 }
 }
 catch(e){
-if(_12){
+if(_c){
 return null;
 }
 throw e;
 }
-return _13.responseText;
+return _d.responseText;
 }
 };
 d._windowUnloaders=[];
 d.windowUnloaded=function(){
-var mll=this._windowUnloaders;
+var mll=d._windowUnloaders;
 while(mll.length){
 (mll.pop())();
 }
 };
-d.addOnWindowUnload=function(obj,_1e){
-d._onto(d._windowUnloaders,obj,_1e);
+d.addOnWindowUnload=function(obj,_14){
+d._onto(d._windowUnloaders,obj,_14);
 };
-var _1f=[];
-var _20=null;
+var _15=[];
+var _16=null;
 dojo._defaultContext=[window,document];
 dojo.pushContext=function(g,d){
 var old=[dojo.global,dojo.doc];
-_1f.push(old);
+_15.push(old);
 var n;
 if(!g&&!d){
 n=dojo._defaultContext;
@@ -116,16 +115,16 @@ n=[t.contentWindow,t.contentDocument];
 }
 }
 }
-_20=n;
+_16=n;
 dojo.setContext.apply(dojo,n);
 return old;
 };
 dojo.popContext=function(){
-var oc=_20;
-if(!_1f.length){
+var oc=_16;
+if(!_15.length){
 return oc;
 }
-dojo.setContext.apply(dojo,_1f.pop());
+dojo.setContext.apply(dojo,_15.pop());
 return oc;
 };
 dojo._inContext=function(g,d,f){
@@ -143,8 +142,8 @@ return r;
 dojo._initFired=false;
 dojo._loadInit=function(e){
 dojo._initFired=true;
-var _2d=(e&&e.type)?e.type.toLowerCase():"load";
-if(arguments.callee.initialized||(_2d!="domcontentloaded"&&_2d!="load")){
+var _17=(e&&e.type)?e.type.toLowerCase():"load";
+if(arguments.callee.initialized||(_17!="domcontentloaded"&&_17!="load")){
 return;
 }
 arguments.callee.initialized=true;
@@ -161,8 +160,8 @@ dojo._loadInit(e);
 (function(){
 var mp=dojo.config["modulePaths"];
 if(mp){
-for(var _30 in mp){
-dojo.registerModulePath(_30,mp[_30]);
+for(var _18 in mp){
+dojo.registerModulePath(_18,mp[_18]);
 }
 }
 })();
@@ -172,6 +171,5 @@ var s=Components.classes["@mozilla.org/consoleservice;1"].getService(Components.
 s.logStringMessage(m);
 };
 console.debug=function(){
-
 };
 }
diff --git a/dojo/_base/_loader/hostenv_rhino.js b/dojo/_base/_loader/hostenv_rhino.js
index f156098..aa20149 100644
--- a/dojo/_base/_loader/hostenv_rhino.js
+++ b/dojo/_base/_loader/hostenv_rhino.js
@@ -17,30 +17,43 @@ if(typeof print=="function"){
 console.debug=print;
 }
 if(!("byId" in dojo)){
-dojo.byId=function(id,_2){
+dojo.byId=function(id,_1){
 if(id&&(typeof id=="string"||id instanceof String)){
-if(!_2){
-_2=document;
+if(!_1){
+_1=document;
 }
-return _2.getElementById(id);
+return _1.getElementById(id);
 }
 return id;
 };
 }
-dojo._loadUri=function(_3,cb){
+dojo._isLocalUrl=function(_2){
+var _3=(new java.io.File(_2)).exists();
+if(!_3){
+var _4;
 try{
-var _5=(new java.io.File(_3)).exists();
-if(!_5){
+_4=(new java.net.URL(_2)).openStream();
+_4.close();
+}
+finally{
+if(_4&&_4.close){
+_4.close();
+}
+}
+}
+return _3;
+};
+dojo._loadUri=function(_5,cb){
 try{
-var _6=(new java.net.URL(_3)).openStream();
-_6.close();
+var _6;
+try{
+_6=dojo._isLocalUrl(_5);
 }
 catch(e){
 return false;
 }
-}
 if(cb){
-var _7=(_5?readText:readUri)(_3,"UTF-8");
+var _7=(_6?readText:readUri)(_5,"UTF-8");
 if(!eval("'‏'").length){
 _7=String(_7).replace(/[\u200E\u200F\u202A-\u202E]/g,function(_8){
 return "\\u"+_8.charCodeAt(0).toString(16);
@@ -48,112 +61,89 @@ return "\\u"+_8.charCodeAt(0).toString(16);
 }
 cb(eval("("+_7+")"));
 }else{
-load(_3);
+load(_5);
 }
 return true;
 }
 catch(e){
-
 return false;
 }
 };
 dojo.exit=function(_9){
 quit(_9);
 };
-dojo._rhinoCurrentScriptViaJava=function(_a){
-var _b=Packages.org.mozilla.javascript.Context.getCurrentContext().getOptimizationLevel();
-var _c=new java.io.CharArrayWriter();
-var pw=new java.io.PrintWriter(_c);
-var _e=new java.lang.Exception();
-var s=_c.toString();
-var _10=s.match(/[^\(]*\.js\)/gi);
-if(!_10){
-throw Error("cannot parse printStackTrace output: "+s);
-}
-var _11=((typeof _a!="undefined")&&(_a))?_10[_a+1]:_10[_10.length-1];
-_11=_10[3];
-if(!_11){
-_11=_10[1];
-}
-if(!_11){
-throw Error("could not find js file in printStackTrace output: "+s);
-}
-return _11;
-};
-function readText(_12,_13){
-_13=_13||"utf-8";
-var jf=new java.io.File(_12);
+function readText(_a,_b){
+_b=_b||"utf-8";
+var jf=new java.io.File(_a);
 var is=new java.io.FileInputStream(jf);
-return dj_readInputStream(is,_13);
+return dj_readInputStream(is,_b);
 };
-function readUri(uri,_17){
-var _18=(new java.net.URL(uri)).openConnection();
-_17=_17||_18.getContentEncoding()||"utf-8";
-var is=_18.getInputStream();
-return dj_readInputStream(is,_17);
+function readUri(_c,_d){
+var _e=(new java.net.URL(_c)).openConnection();
+_d=_d||_e.getContentEncoding()||"utf-8";
+var is=_e.getInputStream();
+return dj_readInputStream(is,_d);
 };
-function dj_readInputStream(is,_1b){
-var _1c=new java.io.BufferedReader(new java.io.InputStreamReader(is,_1b));
+function dj_readInputStream(is,_f){
+var _10=new java.io.BufferedReader(new java.io.InputStreamReader(is,_f));
 try{
 var sb=new java.lang.StringBuffer();
-var _1e="";
-while((_1e=_1c.readLine())!==null){
-sb.append(_1e);
+var _11="";
+while((_11=_10.readLine())!==null){
+sb.append(_11);
 sb.append(java.lang.System.getProperty("line.separator"));
 }
 return sb.toString();
 }
 finally{
-_1c.close();
+_10.close();
 }
 };
-if((!dojo.config.libraryScriptUri)||(!dojo.config.libraryScriptUri.length)){
+dojo._getText=function(uri,_12){
 try{
-dojo.config.libraryScriptUri=dojo._rhinoCurrentScriptViaJava(1);
+var _13=dojo._isLocalUrl(uri);
+var _14=(_13?readText:readUri)(uri,"UTF-8");
+if(_14!==null){
+_14+="";
 }
-catch(e){
-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");
+return _14;
 }
-dojo.config.libraryScriptUri="./";
+catch(e){
+if(_12){
+return null;
+}else{
+throw e;
 }
 }
+};
 dojo.doc=typeof document!="undefined"?document:null;
 dojo.body=function(){
 return document.body;
 };
 if(typeof setTimeout=="undefined"||typeof clearTimeout=="undefined"){
 dojo._timeouts=[];
-function clearTimeout(idx){
+clearTimeout=function(idx){
 if(!dojo._timeouts[idx]){
 return;
 }
 dojo._timeouts[idx].stop();
 };
-function setTimeout(_20,_21){
-var def={sleepTime:_21,hasSlept:false,run:function(){
+setTimeout=function(_15,_16){
+var def={sleepTime:_16,hasSlept:false,run:function(){
 if(!this.hasSlept){
 this.hasSlept=true;
 java.lang.Thread.currentThread().sleep(this.sleepTime);
 }
 try{
-_20();
+_15();
 }
 catch(e){
-
 }
 }};
-var _23=new java.lang.Runnable(def);
-var _24=new java.lang.Thread(_23);
-_24.start();
-return dojo._timeouts.push(_24)-1;
+var _17=new java.lang.Runnable(def);
+var _18=new java.lang.Thread(_17);
+_18.start();
+return dojo._timeouts.push(_18)-1;
 };
 }
 if(dojo.config["modulePaths"]){
diff --git a/dojo/_base/_loader/hostenv_spidermonkey.js b/dojo/_base/_loader/hostenv_spidermonkey.js
index d35a6fa..7d5cdc7 100644
--- a/dojo/_base/_loader/hostenv_spidermonkey.js
+++ b/dojo/_base/_loader/hostenv_spidermonkey.js
@@ -29,18 +29,18 @@ throw Error("whatever");
 catch(e){
 s=e.stack;
 }
-var _4=s.match(/[^@]*\.js/gi);
-if(!_4){
+var _3=s.match(/[^@]*\.js/gi);
+if(!_3){
 throw Error("could not parse stack string: '"+s+"'");
 }
-var _5=(typeof _2!="undefined"&&_2)?_4[_2+1]:_4[_4.length-1];
-if(!_5){
+var _4=(typeof _2!="undefined"&&_2)?_3[_2+1]:_3[_3.length-1];
+if(!_4){
 throw Error("could not find file name in stack string '"+s+"'");
 }
-return _5;
+return _4;
 };
-dojo._loadUri=function(_6){
-var ok=load(_6);
+dojo._loadUri=function(_5){
+var ok=load(_5);
 return 1;
 };
 if(dojo.config["modulePaths"]){
diff --git a/dojo/_base/_loader/loader.js b/dojo/_base/_loader/loader.js
index b2613fa..0bf4a0e 100644
--- a/dojo/_base/_loader/loader.js
+++ b/dojo/_base/_loader/loader.js
@@ -9,93 +9,100 @@ if(!dojo._hasResource["dojo.foo"]){
 dojo._hasResource["dojo.foo"]=true;
 (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(_2){
-var mp=this._modulePrefixes;
-return !!(mp[_2]&&mp[_2].value);
-},_getModulePrefix:function(_4){
-var mp=this._modulePrefixes;
-if(this._moduleHasPrefix(_4)){
-return mp[_4].value;
-}
-return _4;
+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(_1){
+var mp=d._modulePrefixes;
+return !!(mp[_1]&&mp[_1].value);
+},_getModulePrefix:function(_2){
+var mp=d._modulePrefixes;
+if(d._moduleHasPrefix(_2)){
+return mp[_2].value;
+}
+return _2;
 },_loadedUrls:[],_postLoad:false,_loaders:[],_unloaders:[],_loadNotifying:false});
-dojo._loadPath=function(_6,_7,cb){
-var _9=((_6.charAt(0)=="/"||_6.match(/^\w+:/))?"":this.baseUrl)+_6;
+dojo._loadPath=function(_3,_4,cb){
+var _5=((_3.charAt(0)=="/"||_3.match(/^\w+:/))?"":d.baseUrl)+_3;
 try{
-return !_7?this._loadUri(_9,cb):this._loadUriAndCheck(_9,_7,cb);
+return !_4?d._loadUri(_5,cb):d._loadUriAndCheck(_5,_4,cb);
 }
 catch(e){
 console.error(e);
 return false;
 }
 };
-dojo._loadUri=function(_a,cb){
-if(this._loadedUrls[_a]){
+dojo._loadUri=function(_6,cb){
+if(d._loadedUrls[_6]){
 return true;
 }
-var _c=this._getText(_a,true);
-if(!_c){
-return false;
-}
-this._loadedUrls[_a]=true;
-this._loadedUrls.push(_a);
+d._inFlightCount++;
+var _7=d._getText(_6,true);
+if(_7){
+d._loadedUrls[_6]=true;
+d._loadedUrls.push(_6);
 if(cb){
-_c="("+_c+")";
+_7="("+_7+")";
 }else{
-_c=this._scopePrefix+_c+this._scopeSuffix;
+_7=d._scopePrefix+_7+d._scopeSuffix;
 }
-if(d.isMoz){
-_c+="\r\n//@ sourceURL="+_a;
+if(!d.isIE){
+_7+="\r\n//@ sourceURL="+_6;
 }
-var _d=d["eval"](_c);
+var _8=d["eval"](_7);
 if(cb){
-cb(_d);
+cb(_8);
 }
-return true;
+}
+if(--d._inFlightCount==0&&d._postLoad&&d._loaders.length){
+setTimeout(function(){
+if(d._inFlightCount==0){
+d._callLoaded();
+}
+},0);
+}
+return !!_7;
 };
-dojo._loadUriAndCheck=function(_e,_f,cb){
+dojo._loadUriAndCheck=function(_9,_a,cb){
 var ok=false;
 try{
-ok=this._loadUri(_e,cb);
+ok=d._loadUri(_9,cb);
 }
 catch(e){
-console.error("failed loading "+_e+" with error: "+e);
+console.error("failed loading "+_9+" with error: "+e);
 }
-return !!(ok&&this._loadedModules[_f]);
+return !!(ok&&d._loadedModules[_a]);
 };
 dojo.loaded=function(){
-this._loadNotifying=true;
-this._postLoad=true;
-var mll=d._loaders;
-this._loaders=[];
-for(var x=0;x<mll.length;x++){
-mll[x]();
-}
-this._loadNotifying=false;
-if(d._postLoad&&d._inFlightCount==0&&mll.length){
+d._loadNotifying=true;
+d._postLoad=true;
+var _b=d._loaders;
+d._loaders=[];
+for(var x=0;x<_b.length;x++){
+_b[x]();
+}
+d._loadNotifying=false;
+if(d._postLoad&&d._inFlightCount==0&&_b.length){
 d._callLoaded();
 }
 };
 dojo.unloaded=function(){
-var mll=d._unloaders;
-while(mll.length){
-(mll.pop())();
+var _c=d._unloaders;
+while(_c.length){
+(_c.pop())();
 }
 };
-d._onto=function(arr,obj,fn){
+d._onto=function(_d,_e,fn){
 if(!fn){
-arr.push(obj);
+_d.push(_e);
 }else{
 if(fn){
-var _18=(typeof fn=="string")?obj[fn]:fn;
-arr.push(function(){
-_18.call(obj);
+var _f=(typeof fn=="string")?_e[fn]:fn;
+_d.push(function(){
+_f.call(_e);
 });
 }
 }
 };
-dojo.addOnLoad=function(obj,_1a){
-d._onto(d._loaders,obj,_1a);
+dojo.ready=dojo.addOnLoad=function(obj,_10){
+d._onto(d._loaders,obj,_10);
 if(d._postLoad&&d._inFlightCount==0&&!d._loadNotifying){
 d._callLoaded();
 }
@@ -115,154 +122,146 @@ 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);
-}
+if(typeof setTimeout=="object"||(d.config.useXDomain&&d.isOpera)){
+setTimeout(d.isAIR?function(){
+d.loaded();
+}:d._scopeName+".loaded();",0);
 }else{
 d.loaded();
 }
 };
-dojo._getModuleSymbols=function(_1c){
-var _1d=_1c.split(".");
-for(var i=_1d.length;i>0;i--){
-var _1f=_1d.slice(0,i).join(".");
-if((i==1)&&!this._moduleHasPrefix(_1f)){
-_1d[0]="../"+_1d[0];
+dojo._getModuleSymbols=function(_11){
+var _12=_11.split(".");
+for(var i=_12.length;i>0;i--){
+var _13=_12.slice(0,i).join(".");
+if(i==1&&!d._moduleHasPrefix(_13)){
+_12[0]="../"+_12[0];
 }else{
-var _20=this._getModulePrefix(_1f);
-if(_20!=_1f){
-_1d.splice(0,i,_20);
+var _14=d._getModulePrefix(_13);
+if(_14!=_13){
+_12.splice(0,i,_14);
 break;
 }
 }
 }
-return _1d;
+return _12;
 };
 dojo._global_omit_module_check=false;
-dojo.loadInit=function(_21){
-_21();
+dojo.loadInit=function(_15){
+_15();
 };
-dojo._loadModule=dojo.require=function(_22,_23){
-_23=this._global_omit_module_check||_23;
-var _24=this._loadedModules[_22];
-if(_24){
-return _24;
+dojo._loadModule=dojo.require=function(_16,_17){
+_17=d._global_omit_module_check||_17;
+var _18=d._loadedModules[_16];
+if(_18){
+return _18;
 }
-var _25=this._getModuleSymbols(_22).join("/")+".js";
-var _26=(!_23)?_22:null;
-var ok=this._loadPath(_25,_26);
-if(!ok&&!_23){
-throw new Error("Could not load '"+_22+"'; last tried '"+_25+"'");
+var _19=d._getModuleSymbols(_16).join("/")+".js";
+var _1a=!_17?_16:null;
+var ok=d._loadPath(_19,_1a);
+if(!ok&&!_17){
+throw new Error("Could not load '"+_16+"'; last tried '"+_19+"'");
 }
-if(!_23&&!this._isXDomain){
-_24=this._loadedModules[_22];
-if(!_24){
-throw new Error("symbol '"+_22+"' is not defined after loading '"+_25+"'");
+if(!_17&&!d._isXDomain){
+_18=d._loadedModules[_16];
+if(!_18){
+throw new Error("symbol '"+_16+"' is not defined after loading '"+_19+"'");
 }
 }
-return _24;
+return _18;
 };
-dojo.provide=function(_28){
-_28=_28+"";
-return (d._loadedModules[_28]=d.getObject(_28,true));
+dojo.provide=function(_1b){
+_1b=_1b+"";
+return (d._loadedModules[_1b]=d.getObject(_1b,true));
 };
-dojo.platformRequire=function(_29){
-var _2a=_29.common||[];
-var _2b=_2a.concat(_29[d._name]||_29["default"]||[]);
-for(var x=0;x<_2b.length;x++){
-var _2d=_2b[x];
-if(_2d.constructor==Array){
-d._loadModule.apply(d,_2d);
+dojo.platformRequire=function(_1c){
+var _1d=_1c.common||[];
+var _1e=_1d.concat(_1c[d._name]||_1c["default"]||[]);
+for(var x=0;x<_1e.length;x++){
+var _1f=_1e[x];
+if(_1f.constructor==Array){
+d._loadModule.apply(d,_1f);
 }else{
-d._loadModule(_2d);
+d._loadModule(_1f);
 }
 }
 };
-dojo.requireIf=function(_2e,_2f){
-if(_2e===true){
-var _30=[];
+dojo.requireIf=function(_20,_21){
+if(_20===true){
+var _22=[];
 for(var i=1;i<arguments.length;i++){
-_30.push(arguments[i]);
+_22.push(arguments[i]);
 }
-d.require.apply(d,_30);
+d.require.apply(d,_22);
 }
 };
 dojo.requireAfterIf=d.requireIf;
-dojo.registerModulePath=function(_32,_33){
-d._modulePrefixes[_32]={name:_32,value:_33};
+dojo.registerModulePath=function(_23,_24){
+d._modulePrefixes[_23]={name:_23,value:_24};
 };
-dojo.requireLocalization=function(_34,_35,_36,_37){
+dojo.requireLocalization=function(_25,_26,_27,_28){
 d.require("dojo.i18n");
 d.i18n._requireLocalization.apply(d.hostenv,arguments);
 };
-var ore=new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$");
-var ire=new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$");
+var ore=new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"),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]){
+var n=null,_29=arguments,uri=[_29[0]];
+for(var i=1;i<_29.length;i++){
+if(!_29[i]){
 continue;
 }
-var _3e=new d._Url(_a[i]+"");
-var _3f=new d._Url(uri[0]+"");
-if(_3e.path==""&&!_3e.scheme&&!_3e.authority&&!_3e.query){
-if(_3e.fragment!=n){
-_3f.fragment=_3e.fragment;
+var _2a=new d._Url(_29[i]+""),_2b=new d._Url(uri[0]+"");
+if(_2a.path==""&&!_2a.scheme&&!_2a.authority&&!_2a.query){
+if(_2a.fragment!=n){
+_2b.fragment=_2a.fragment;
 }
-_3e=_3f;
+_2a=_2b;
 }else{
-if(!_3e.scheme){
-_3e.scheme=_3f.scheme;
-if(!_3e.authority){
-_3e.authority=_3f.authority;
-if(_3e.path.charAt(0)!="/"){
-var _40=_3f.path.substring(0,_3f.path.lastIndexOf("/")+1)+_3e.path;
-var _41=_40.split("/");
-for(var j=0;j<_41.length;j++){
-if(_41[j]=="."){
-if(j==_41.length-1){
-_41[j]="";
+if(!_2a.scheme){
+_2a.scheme=_2b.scheme;
+if(!_2a.authority){
+_2a.authority=_2b.authority;
+if(_2a.path.charAt(0)!="/"){
+var _2c=_2b.path.substring(0,_2b.path.lastIndexOf("/")+1)+_2a.path;
+var _2d=_2c.split("/");
+for(var j=0;j<_2d.length;j++){
+if(_2d[j]=="."){
+if(j==_2d.length-1){
+_2d[j]="";
 }else{
-_41.splice(j,1);
+_2d.splice(j,1);
 j--;
 }
 }else{
-if(j>0&&!(j==1&&_41[0]=="")&&_41[j]==".."&&_41[j-1]!=".."){
-if(j==(_41.length-1)){
-_41.splice(j,1);
-_41[j-1]="";
+if(j>0&&!(j==1&&_2d[0]=="")&&_2d[j]==".."&&_2d[j-1]!=".."){
+if(j==(_2d.length-1)){
+_2d.splice(j,1);
+_2d[j-1]="";
 }else{
-_41.splice(j-1,2);
+_2d.splice(j-1,2);
 j-=2;
 }
 }
 }
 }
-_3e.path=_41.join("/");
+_2a.path=_2d.join("/");
 }
 }
 }
 }
 uri=[];
-if(_3e.scheme){
-uri.push(_3e.scheme,":");
+if(_2a.scheme){
+uri.push(_2a.scheme,":");
 }
-if(_3e.authority){
-uri.push("//",_3e.authority);
+if(_2a.authority){
+uri.push("//",_2a.authority);
 }
-uri.push(_3e.path);
-if(_3e.query){
-uri.push("?",_3e.query);
+uri.push(_2a.path);
+if(_2a.query){
+uri.push("?",_2a.query);
 }
-if(_3e.fragment){
-uri.push("#",_3e.fragment);
+if(_2a.fragment){
+uri.push("#",_2a.fragment);
 }
 }
 this.uri=uri.join("");
@@ -283,16 +282,16 @@ this.port=r[9]||n;
 dojo._Url.prototype.toString=function(){
 return this.uri;
 };
-dojo.moduleUrl=function(_44,url){
-var loc=d._getModuleSymbols(_44).join("/");
+dojo.moduleUrl=function(_2e,url){
+var loc=d._getModuleSymbols(_2e).join("/");
 if(!loc){
 return null;
 }
 if(loc.lastIndexOf("/")!=loc.length-1){
 loc+="/";
 }
-var _47=loc.indexOf(":");
-if(loc.charAt(0)!="/"&&(_47==-1||_47>loc.indexOf("/"))){
+var _2f=loc.indexOf(":");
+if(loc.charAt(0)!="/"&&(_2f==-1||_2f>loc.indexOf("/"))){
 loc=d.baseUrl+loc;
 }
 return new d._Url(loc,url);
diff --git a/dojo/_base/_loader/loader_debug.js b/dojo/_base/_loader/loader_debug.js
index cddb73a..878e748 100644
--- a/dojo/_base/_loader/loader_debug.js
+++ b/dojo/_base/_loader/loader_debug.js
@@ -23,15 +23,15 @@ window.setTimeout(dojo._scopeName+"._xdDebugFileLoaded('"+_1+"')",1);
 return dojo.nonDebugProvide.apply(dojo,arguments);
 };
 dojo._xdDebugFileLoaded=function(_3){
-if(!this._xdDebugScopeChecked){
+if(!dojo._xdDebugScopeChecked){
 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;
+dojo._xdDebugScopeChecked=true;
 }
-var _4=this._xdDebugQueue;
+var _4=dojo._xdDebugQueue;
 if(_3&&_3==_4.currentResourceName){
 _4.shift();
 }
@@ -40,12 +40,12 @@ dojo._xdWatchInFlight();
 }
 if(_4.length==0){
 _4.currentResourceName=null;
-for(var _5 in this._xdInFlight){
-if(this._xdInFlight[_5]===true){
+for(var _5 in dojo._xdInFlight){
+if(dojo._xdInFlight[_5]===true){
 return;
 }
 }
-this._xdNotifyLoaded();
+dojo._xdNotifyLoaded();
 }else{
 if(_3==_4.currentResourceName){
 _4.currentResourceName=_4[0].resourceName;
diff --git a/dojo/_base/_loader/loader_xd.js b/dojo/_base/_loader/loader_xd.js
index 2649e30..084071e 100644
--- a/dojo/_base/_loader/loader_xd.js
+++ b/dojo/_base/_loader/loader_xd.js
@@ -9,13 +9,19 @@ if(!dojo._hasResource["dojo._base._loader.loader_xd"]){
 dojo._hasResource["dojo._base._loader.loader_xd"]=true;
 dojo.provide("dojo._base._loader.loader_xd");
 dojo._xdReset=function(){
-this._isXDomain=dojo.config.useXDomain||false;
-this._xdTimer=0;
-this._xdInFlight={};
-this._xdOrderedReqs=[];
-this._xdDepMap={};
-this._xdContents=[];
-this._xdDefList=[];
+dojo._isXDomain=dojo.config.useXDomain||false;
+dojo._xdClearInterval();
+dojo._xdInFlight={};
+dojo._xdOrderedReqs=[];
+dojo._xdDepMap={};
+dojo._xdContents=[];
+dojo._xdDefList=[];
+};
+dojo._xdClearInterval=function(){
+if(dojo._xdTimer){
+clearInterval(dojo._xdTimer);
+dojo._xdTimer=0;
+}
 };
 dojo._xdReset();
 dojo._xdCreateResource=function(_1,_2,_3){
@@ -57,400 +63,403 @@ _8.push(_1);
 _8.push("\n}, resourceName: '"+_2+"', resourcePath: '"+_3+"'};});");
 return _8.join("");
 };
-dojo._xdExtractLoadInits=function(_b){
-var _c=/dojo.loadInit\s*\(/g;
+dojo._xdExtractLoadInits=function(_a){
+var _b=/dojo.loadInit\s*\(/g;
+_b.lastIndex=0;
+var _c=/[\(\)]/g;
 _c.lastIndex=0;
-var _d=/[\(\)]/g;
-_d.lastIndex=0;
-var _e=[];
-var _f;
-while((_f=_c.exec(_b))){
-_d.lastIndex=_c.lastIndex;
-var _10=1;
-var _11;
-while((_11=_d.exec(_b))){
-if(_11[0]==")"){
-_10-=1;
+var _d=[];
+var _e;
+while((_e=_b.exec(_a))){
+_c.lastIndex=_b.lastIndex;
+var _f=1;
+var _10;
+while((_10=_c.exec(_a))){
+if(_10[0]==")"){
+_f-=1;
 }else{
-_10+=1;
+_f+=1;
 }
-if(_10==0){
+if(_f==0){
 break;
 }
 }
-if(_10!=0){
-throw "unmatched paren around character "+_d.lastIndex+" in: "+_b;
+if(_f!=0){
+throw "unmatched paren around character "+_c.lastIndex+" in: "+_a;
 }
-var _12=_c.lastIndex-_f[0].length;
-_e.push(_b.substring(_12,_d.lastIndex));
-var _13=_d.lastIndex-_12;
-_b=_b.substring(0,_12)+_b.substring(_d.lastIndex,_b.length);
-_c.lastIndex=_d.lastIndex-_13;
-_c.lastIndex=_d.lastIndex;
+var _11=_b.lastIndex-_e[0].length;
+_d.push(_a.substring(_11,_c.lastIndex));
+var _12=_c.lastIndex-_11;
+_a=_a.substring(0,_11)+_a.substring(_c.lastIndex,_a.length);
+_b.lastIndex=_c.lastIndex-_12;
+_b.lastIndex=_c.lastIndex;
 }
-if(_e.length>0){
-_e.unshift(_b);
+if(_d.length>0){
+_d.unshift(_a);
 }
-return (_e.length?_e:null);
+return (_d.length?_d:null);
 };
-dojo._xdIsXDomainPath=function(_14){
-var _15=_14.indexOf(":");
-var _16=_14.indexOf("/");
-if(_15>0&&_15<_16){
+dojo._xdIsXDomainPath=function(_13){
+var _14=_13.indexOf(":");
+var _15=_13.indexOf("/");
+if(_14>0&&_14<_15){
 return true;
 }else{
-var url=this.baseUrl;
-_15=url.indexOf(":");
-_16=url.indexOf("/");
-if(_15>0&&_15<_16&&(!location.host||url.indexOf("http://"+location.host)!=0)){
+var url=dojo.baseUrl;
+_14=url.indexOf(":");
+_15=url.indexOf("/");
+if(_14>0&&_14<_15&&(!location.host||url.indexOf("http://"+location.host)!=0)){
 return true;
 }
 }
 return false;
 };
-dojo._loadPath=function(_18,_19,cb){
-var _1b=this._xdIsXDomainPath(_18);
-this._isXDomain|=_1b;
-var uri=((_18.charAt(0)=="/"||_18.match(/^\w+:/))?"":this.baseUrl)+_18;
+dojo._loadPath=function(_16,_17,cb){
+var _18=dojo._xdIsXDomainPath(_16);
+dojo._isXDomain|=_18;
+var uri=((_16.charAt(0)=="/"||_16.match(/^\w+:/))?"":dojo.baseUrl)+_16;
 try{
-return ((!_19||this._isXDomain)?this._loadUri(uri,cb,_1b,_19):this._loadUriAndCheck(uri,_19,cb));
+return ((!_17||dojo._isXDomain)?dojo._loadUri(uri,cb,_18,_17):dojo._loadUriAndCheck(uri,_17,cb));
 }
 catch(e){
 console.error(e);
 return false;
 }
 };
-dojo._loadUri=function(uri,cb,_1f,_20){
-if(this._loadedUrls[uri]){
+dojo._xdCharSet="utf-8";
+dojo._loadUri=function(uri,cb,_19,_1a){
+if(dojo._loadedUrls[uri]){
 return 1;
 }
-if(this._isXDomain&&_20&&_20!="dojo.i18n"){
-this._xdOrderedReqs.push(_20);
-if(_1f||uri.indexOf("/nls/")==-1){
-this._xdInFlight[_20]=true;
-this._inFlightCount++;
+if(dojo._isXDomain&&_1a&&_1a!="dojo.i18n"){
+dojo._xdOrderedReqs.push(_1a);
+if(_19||uri.indexOf("/nls/")==-1){
+dojo._xdInFlight[_1a]=true;
+dojo._inFlightCount++;
 }
-if(!this._xdTimer){
+if(!dojo._xdTimer){
 if(dojo.isAIR){
-this._xdTimer=setInterval(function(){
+dojo._xdTimer=setInterval(function(){
 dojo._xdWatchInFlight();
 },100);
 }else{
-this._xdTimer=setInterval(dojo._scopeName+"._xdWatchInFlight();",100);
+dojo._xdTimer=setInterval(dojo._scopeName+"._xdWatchInFlight();",100);
 }
 }
-this._xdStartTime=(new Date()).getTime();
+dojo._xdStartTime=(new Date()).getTime();
 }
-if(_1f){
-var _21=uri.lastIndexOf(".");
-if(_21<=0){
-_21=uri.length-1;
+if(_19){
+var _1b=uri.lastIndexOf(".");
+if(_1b<=0){
+_1b=uri.length-1;
 }
-var _22=uri.substring(0,_21)+".xd";
-if(_21!=uri.length-1){
-_22+=uri.substring(_21,uri.length);
+var _1c=uri.substring(0,_1b)+".xd";
+if(_1b!=uri.length-1){
+_1c+=uri.substring(_1b,uri.length);
 }
 if(dojo.isAIR){
-_22=_22.replace("app:/","/");
+_1c=_1c.replace("app:/","/");
 }
-var _23=document.createElement("script");
-_23.type="text/javascript";
-_23.src=_22;
-if(!this.headElement){
-this._headElement=document.getElementsByTagName("head")[0];
-if(!this._headElement){
-this._headElement=document.getElementsByTagName("html")[0];
+var _1d=document.createElement("script");
+_1d.type="text/javascript";
+if(dojo._xdCharSet){
+_1d.charset=dojo._xdCharSet;
 }
+_1d.src=_1c;
+if(!dojo.headElement){
+dojo._headElement=document.getElementsByTagName("head")[0];
+if(!dojo._headElement){
+dojo._headElement=document.getElementsByTagName("html")[0];
 }
-this._headElement.appendChild(_23);
+}
+dojo._headElement.appendChild(_1d);
 }else{
-var _24=this._getText(uri,null,true);
-if(_24==null){
+var _1e=dojo._getText(uri,null,true);
+if(_1e==null){
 return 0;
 }
-if(this._isXDomain&&uri.indexOf("/nls/")==-1&&_20!="dojo.i18n"){
-var res=this._xdCreateResource(_24,_20,uri);
+if(dojo._isXDomain&&uri.indexOf("/nls/")==-1&&_1a!="dojo.i18n"){
+var res=dojo._xdCreateResource(_1e,_1a,uri);
 dojo.eval(res);
 }else{
 if(cb){
-_24="("+_24+")";
+_1e="("+_1e+")";
 }else{
-_24=this._scopePrefix+_24+this._scopeSuffix;
+_1e=dojo._scopePrefix+_1e+dojo._scopeSuffix;
 }
-var _26=dojo["eval"](_24+"\r\n//@ sourceURL="+uri);
+var _1f=dojo["eval"](_1e+"\r\n//@ sourceURL="+uri);
 if(cb){
-cb(_26);
+cb(_1f);
 }
 }
 }
-this._loadedUrls[uri]=true;
-this._loadedUrls.push(uri);
+dojo._loadedUrls[uri]=true;
+dojo._loadedUrls.push(uri);
 return true;
 };
 dojo._xdResourceLoaded=function(res){
 res=res.apply(dojo.global,dojo._scopeArgs);
-var _28=res.depends;
-var _29=null;
-var _2a=null;
-var _2b=[];
-if(_28&&_28.length>0){
+var _20=res.depends;
+var _21=null;
+var _22=null;
+var _23=[];
+if(_20&&_20.length>0){
 var dep=null;
-var _2d=0;
-var _2e=false;
-for(var i=0;i<_28.length;i++){
-dep=_28[i];
+var _24=0;
+var _25=false;
+for(var i=0;i<_20.length;i++){
+dep=_20[i];
 if(dep[0]=="provide"){
-_2b.push(dep[1]);
+_23.push(dep[1]);
 }else{
-if(!_29){
-_29=[];
+if(!_21){
+_21=[];
 }
-if(!_2a){
-_2a=[];
+if(!_22){
+_22=[];
 }
-var _30=this._xdUnpackDependency(dep);
-if(_30.requires){
-_29=_29.concat(_30.requires);
+var _26=dojo._xdUnpackDependency(dep);
+if(_26.requires){
+_21=_21.concat(_26.requires);
 }
-if(_30.requiresAfter){
-_2a=_2a.concat(_30.requiresAfter);
+if(_26.requiresAfter){
+_22=_22.concat(_26.requiresAfter);
 }
 }
-var _31=dep[0];
-var _32=_31.split(".");
-if(_32.length==2){
-dojo[_32[0]][_32[1]].apply(dojo[_32[0]],dep.slice(1));
+var _27=dep[0];
+var _28=_27.split(".");
+if(_28.length==2){
+dojo[_28[0]][_28[1]].apply(dojo[_28[0]],dep.slice(1));
 }else{
-dojo[_31].apply(dojo,dep.slice(1));
+dojo[_27].apply(dojo,dep.slice(1));
 }
 }
-if(_2b.length==1&&_2b[0]=="dojo._base._loader.loader_debug"){
+if(_23.length==1&&_23[0]=="dojo._base._loader.loader_debug"){
 res.defineResource(dojo);
 }else{
-var _33=this._xdContents.push({content:res.defineResource,resourceName:res["resourceName"],resourcePath:res["resourcePath"],isDefined:false})-1;
-for(i=0;i<_2b.length;i++){
-this._xdDepMap[_2b[i]]={requires:_29,requiresAfter:_2a,contentIndex:_33};
+var _29=dojo._xdContents.push({content:res.defineResource,resourceName:res["resourceName"],resourcePath:res["resourcePath"],isDefined:false})-1;
+for(i=0;i<_23.length;i++){
+dojo._xdDepMap[_23[i]]={requires:_21,requiresAfter:_22,contentIndex:_29};
 }
 }
-for(i=0;i<_2b.length;i++){
-this._xdInFlight[_2b[i]]=false;
+for(i=0;i<_23.length;i++){
+dojo._xdInFlight[_23[i]]=false;
 }
 }
 };
-dojo._xdLoadFlattenedBundle=function(_34,_35,_36,_37){
-_36=_36||"root";
-var _38=dojo.i18n.normalizeLocale(_36).replace("-","_");
-var _39=[_34,"nls",_35].join(".");
-var _3a=dojo["provide"](_39);
-_3a[_38]=_37;
-var _3b=[_34,_38,_35].join(".");
-var _3c=dojo._xdBundleMap[_3b];
-if(_3c){
-for(var _3d in _3c){
-_3a[_3d]=_37;
+dojo._xdLoadFlattenedBundle=function(_2a,_2b,_2c,_2d){
+_2c=_2c||"root";
+var _2e=dojo.i18n.normalizeLocale(_2c).replace("-","_");
+var _2f=[_2a,"nls",_2b].join(".");
+var _30=dojo["provide"](_2f);
+_30[_2e]=_2d;
+var _31=[_2a,_2e,_2b].join(".");
+var _32=dojo._xdBundleMap[_31];
+if(_32){
+for(var _33 in _32){
+_30[_33]=_2d;
 }
 }
 };
 dojo._xdInitExtraLocales=function(){
-var _3e=dojo.config.extraLocale;
-if(_3e){
-if(!_3e instanceof Array){
-_3e=[_3e];
+var _34=dojo.config.extraLocale;
+if(_34){
+if(!_34 instanceof Array){
+_34=[_34];
 }
 dojo._xdReqLoc=dojo.xdRequireLocalization;
-dojo.xdRequireLocalization=function(m,b,_41,_42){
-dojo._xdReqLoc(m,b,_41,_42);
-if(_41){
+dojo.xdRequireLocalization=function(m,b,_35,_36){
+dojo._xdReqLoc(m,b,_35,_36);
+if(_35){
 return;
 }
-for(var i=0;i<_3e.length;i++){
-dojo._xdReqLoc(m,b,_3e[i],_42);
+for(var i=0;i<_34.length;i++){
+dojo._xdReqLoc(m,b,_34[i],_36);
 }
 };
 }
 };
 dojo._xdBundleMap={};
-dojo.xdRequireLocalization=function(_44,_45,_46,_47){
+dojo.xdRequireLocalization=function(_37,_38,_39,_3a){
 if(dojo._xdInitExtraLocales){
 dojo._xdInitExtraLocales();
 dojo._xdInitExtraLocales=null;
 dojo.xdRequireLocalization.apply(dojo,arguments);
 return;
 }
-var _48=_47.split(",");
-var _49=dojo.i18n.normalizeLocale(_46);
-var _4a="";
-for(var i=0;i<_48.length;i++){
-if(_49.indexOf(_48[i])==0){
-if(_48[i].length>_4a.length){
-_4a=_48[i];
+var _3b=_3a.split(",");
+var _3c=dojo.i18n.normalizeLocale(_39);
+var _3d="";
+for(var i=0;i<_3b.length;i++){
+if(_3c.indexOf(_3b[i])==0){
+if(_3b[i].length>_3d.length){
+_3d=_3b[i];
 }
 }
 }
-var _4c=_4a.replace("-","_");
-var _4d=dojo.getObject([_44,"nls",_45].join("."));
-if(_4d&&_4d[_4c]){
-_4e[_49.replace("-","_")]=_4d[_4c];
-}else{
-var _4f=[_44,(_4c||"root"),_45].join(".");
-var _4e=dojo._xdBundleMap[_4f];
-if(!_4e){
-_4e=dojo._xdBundleMap[_4f]={};
+var _3e=_3d.replace("-","_");
+var _3f=dojo.getObject([_37,"nls",_38].join("."));
+if(!_3f||!_3f[_3e]){
+var _40=[_37,(_3e||"root"),_38].join(".");
+var _41=dojo._xdBundleMap[_40];
+if(!_41){
+_41=dojo._xdBundleMap[_40]={};
 }
-_4e[_49.replace("-","_")]=true;
-dojo.require(_44+".nls"+(_4a?"."+_4a:"")+"."+_45);
+_41[_3c.replace("-","_")]=true;
+dojo.require(_37+".nls"+(_3d?"."+_3d:"")+"."+_38);
 }
 };
 dojo._xdRealRequireLocalization=dojo.requireLocalization;
-dojo.requireLocalization=function(_50,_51,_52,_53){
-var _54=this.moduleUrl(_50).toString();
-if(this._xdIsXDomainPath(_54)){
+dojo.requireLocalization=function(_42,_43,_44,_45){
+var _46=dojo.moduleUrl(_42).toString();
+if(dojo._xdIsXDomainPath(_46)){
 return dojo.xdRequireLocalization.apply(dojo,arguments);
 }else{
 return dojo._xdRealRequireLocalization.apply(dojo,arguments);
 }
 };
 dojo._xdUnpackDependency=function(dep){
-var _56=null;
-var _57=null;
+var _47=null;
+var _48=null;
 switch(dep[0]){
 case "requireIf":
 case "requireAfterIf":
 if(dep[1]===true){
-_56=[{name:dep[2],content:null}];
+_47=[{name:dep[2],content:null}];
 }
 break;
 case "platformRequire":
-var _58=dep[1];
-var _59=_58["common"]||[];
-_56=(_58[dojo.hostenv.name_])?_59.concat(_58[dojo.hostenv.name_]||[]):_59.concat(_58["default"]||[]);
-if(_56){
-for(var i=0;i<_56.length;i++){
-if(_56[i] instanceof Array){
-_56[i]={name:_56[i][0],content:null};
+var _49=dep[1];
+var _4a=_49["common"]||[];
+_47=(_49[dojo.hostenv.name_])?_4a.concat(_49[dojo.hostenv.name_]||[]):_4a.concat(_49["default"]||[]);
+if(_47){
+for(var i=0;i<_47.length;i++){
+if(_47[i] instanceof Array){
+_47[i]={name:_47[i][0],content:null};
 }else{
-_56[i]={name:_56[i],content:null};
+_47[i]={name:_47[i],content:null};
 }
 }
 }
 break;
 case "require":
-_56=[{name:dep[1],content:null}];
+_47=[{name:dep[1],content:null}];
 break;
 case "i18n._preloadLocalizations":
 dojo.i18n._preloadLocalizations.apply(dojo.i18n._preloadLocalizations,dep.slice(1));
 break;
 }
 if(dep[0]=="requireAfterIf"||dep[0]=="requireIf"){
-_57=_56;
-_56=null;
+_48=_47;
+_47=null;
 }
-return {requires:_56,requiresAfter:_57};
+return {requires:_47,requiresAfter:_48};
 };
 dojo._xdWalkReqs=function(){
-var _5b=null;
+var _4b=null;
 var req;
-for(var i=0;i<this._xdOrderedReqs.length;i++){
-req=this._xdOrderedReqs[i];
-if(this._xdDepMap[req]){
-_5b=[req];
-_5b[req]=true;
-this._xdEvalReqs(_5b);
+for(var i=0;i<dojo._xdOrderedReqs.length;i++){
+req=dojo._xdOrderedReqs[i];
+if(dojo._xdDepMap[req]){
+_4b=[req];
+_4b[req]=true;
+dojo._xdEvalReqs(_4b);
 }
 }
 };
-dojo._xdEvalReqs=function(_5e){
-while(_5e.length>0){
-var req=_5e[_5e.length-1];
-var res=this._xdDepMap[req];
-var i,_62,_63;
+dojo._xdEvalReqs=function(_4c){
+while(_4c.length>0){
+var req=_4c[_4c.length-1];
+var res=dojo._xdDepMap[req];
+var i,_4d,_4e;
 if(res){
-_62=res.requires;
-if(_62&&_62.length>0){
-for(i=0;i<_62.length;i++){
-_63=_62[i].name;
-if(_63&&!_5e[_63]){
-_5e.push(_63);
-_5e[_63]=true;
-this._xdEvalReqs(_5e);
+_4d=res.requires;
+if(_4d&&_4d.length>0){
+for(i=0;i<_4d.length;i++){
+_4e=_4d[i].name;
+if(_4e&&!_4c[_4e]){
+_4c.push(_4e);
+_4c[_4e]=true;
+dojo._xdEvalReqs(_4c);
 }
 }
 }
-var _64=this._xdContents[res.contentIndex];
-if(!_64.isDefined){
-var _65=_64.content;
-_65["resourceName"]=_64["resourceName"];
-_65["resourcePath"]=_64["resourcePath"];
-this._xdDefList.push(_65);
-_64.isDefined=true;
+var _4f=dojo._xdContents[res.contentIndex];
+if(!_4f.isDefined){
+var _50=_4f.content;
+_50["resourceName"]=_4f["resourceName"];
+_50["resourcePath"]=_4f["resourcePath"];
+dojo._xdDefList.push(_50);
+_4f.isDefined=true;
 }
-this._xdDepMap[req]=null;
-_62=res.requiresAfter;
-if(_62&&_62.length>0){
-for(i=0;i<_62.length;i++){
-_63=_62[i].name;
-if(_63&&!_5e[_63]){
-_5e.push(_63);
-_5e[_63]=true;
-this._xdEvalReqs(_5e);
+dojo._xdDepMap[req]=null;
+_4d=res.requiresAfter;
+if(_4d&&_4d.length>0){
+for(i=0;i<_4d.length;i++){
+_4e=_4d[i].name;
+if(_4e&&!_4c[_4e]){
+_4c.push(_4e);
+_4c[_4e]=true;
+dojo._xdEvalReqs(_4c);
 }
 }
 }
 }
-_5e.pop();
+_4c.pop();
 }
 };
-dojo._xdClearInterval=function(){
-clearInterval(this._xdTimer);
-this._xdTimer=0;
-};
 dojo._xdWatchInFlight=function(){
-var _66="";
-var _67=(dojo.config.xdWaitSeconds||15)*1000;
-var _68=(this._xdStartTime+_67)<(new Date()).getTime();
-for(var _69 in this._xdInFlight){
-if(this._xdInFlight[_69]===true){
-if(_68){
-_66+=_69+" ";
+var _51="";
+var _52=(dojo.config.xdWaitSeconds||15)*1000;
+var _53=(dojo._xdStartTime+_52)<(new Date()).getTime();
+for(var _54 in dojo._xdInFlight){
+if(dojo._xdInFlight[_54]===true){
+if(_53){
+_51+=_54+" ";
 }else{
 return;
 }
 }
 }
-this._xdClearInterval();
-if(_68){
-throw "Could not load cross-domain resources: "+_66;
+dojo._xdClearInterval();
+if(_53){
+throw "Could not load cross-domain resources: "+_51;
 }
-this._xdWalkReqs();
-var _6a=this._xdDefList.length;
-for(var i=0;i<_6a;i++){
-var _6c=dojo._xdDefList[i];
-if(dojo.config["debugAtAllCosts"]&&_6c["resourceName"]){
-if(!this["_xdDebugQueue"]){
-this._xdDebugQueue=[];
+dojo._xdWalkReqs();
+var _55=dojo._xdDefList.length;
+for(var i=0;i<_55;i++){
+var _56=dojo._xdDefList[i];
+if(dojo.config["debugAtAllCosts"]&&_56["resourceName"]){
+if(!dojo["_xdDebugQueue"]){
+dojo._xdDebugQueue=[];
 }
-this._xdDebugQueue.push({resourceName:_6c.resourceName,resourcePath:_6c.resourcePath});
+dojo._xdDebugQueue.push({resourceName:_56.resourceName,resourcePath:_56.resourcePath});
 }else{
-_6c.apply(dojo.global,dojo._scopeArgs);
+_56.apply(dojo.global,dojo._scopeArgs);
 }
 }
-for(i=0;i<this._xdContents.length;i++){
-var _6d=this._xdContents[i];
-if(_6d.content&&!_6d.isDefined){
-_6d.content.apply(dojo.global,dojo._scopeArgs);
+for(i=0;i<dojo._xdContents.length;i++){
+var _57=dojo._xdContents[i];
+if(_57.content&&!_57.isDefined){
+_57.content.apply(dojo.global,dojo._scopeArgs);
 }
 }
-this._xdReset();
-if(this["_xdDebugQueue"]&&this._xdDebugQueue.length>0){
-this._xdDebugFileLoaded();
+dojo._xdReset();
+if(dojo["_xdDebugQueue"]&&dojo._xdDebugQueue.length>0){
+dojo._xdDebugFileLoaded();
 }else{
-this._xdNotifyLoaded();
+dojo._xdNotifyLoaded();
 }
 };
 dojo._xdNotifyLoaded=function(){
-this._inFlightCount=0;
-if(this._initFired&&!this._loadNotifying){
-this._callLoaded();
+for(var _58 in dojo._xdInFlight){
+if(typeof dojo._xdInFlight[_58]=="boolean"){
+return;
+}
+}
+dojo._inFlightCount=0;
+if(dojo._initFired&&!dojo._loadNotifying){
+dojo._callLoaded();
 }
 };
 }
diff --git a/dojo/_base/array.js b/dojo/_base/array.js
index 88c435c..6d4d797 100644
--- a/dojo/_base/array.js
+++ b/dojo/_base/array.js
@@ -11,68 +11,69 @@ dojo.require("dojo._base.lang");
 dojo.provide("dojo._base.array");
 (function(){
 var _1=function(_2,_3,cb){
-return [dojo.isString(_2)?_2.split(""):_2,_3||dojo.global,dojo.isString(cb)?new Function("item","index","array",cb):cb];
+return [(typeof _2=="string")?_2.split(""):_2,_3||dojo.global,(typeof cb=="string")?new Function("item","index","array",cb):cb];
 };
-dojo.mixin(dojo,{indexOf:function(_5,_6,_7,_8){
-var _9=1,_a=_5.length||0,i=0;
-if(_8){
-i=_a-1;
-_9=_a=-1;
+var _4=function(_5,_6,_7,_8){
+var _9=_1(_6,_8,_7);
+_6=_9[0];
+for(var i=0,l=_6.length;i<l;++i){
+var _a=!!_9[2].call(_9[1],_6[i],i,_6);
+if(_5^_a){
+return _a;
 }
-if(_7!=undefined){
-i=_7;
 }
-if((_8&&i>_a)||i<_a){
-for(;i!=_a;i+=_9){
-if(_5[i]==_6){
+return _5;
+};
+dojo.mixin(dojo,{indexOf:function(_b,_c,_d,_e){
+var _f=1,end=_b.length||0,i=0;
+if(_e){
+i=end-1;
+_f=end=-1;
+}
+if(_d!=undefined){
+i=_d;
+}
+if((_e&&i>end)||i<end){
+for(;i!=end;i+=_f){
+if(_b[i]==_c){
 return i;
 }
 }
 }
 return -1;
-},lastIndexOf:function(_c,_d,_e){
-return dojo.indexOf(_c,_d,_e,true);
-},forEach:function(_f,_10,_11){
-if(!_f||!_f.length){
+},lastIndexOf:function(_10,_11,_12){
+return dojo.indexOf(_10,_11,_12,true);
+},forEach:function(arr,_13,_14){
+if(!arr||!arr.length){
 return;
 }
-var _p=_1(_f,_11,_10);
-_f=_p[0];
-for(var i=0,l=_f.length;i<l;++i){
-_p[2].call(_p[1],_f[i],i,_f);
-}
-},_everyOrSome:function(_15,arr,_17,_18){
-var _p=_1(arr,_18,_17);
-arr=_p[0];
+var _15=_1(arr,_14,_13);
+arr=_15[0];
 for(var i=0,l=arr.length;i<l;++i){
-var _1c=!!_p[2].call(_p[1],arr[i],i,arr);
-if(_15^_1c){
-return _1c;
-}
+_15[2].call(_15[1],arr[i],i,arr);
 }
-return _15;
-},every:function(arr,_1e,_1f){
-return dojo._everyOrSome(true,arr,_1e,_1f);
-},some:function(arr,_21,_22){
-return dojo._everyOrSome(false,arr,_21,_22);
-},map:function(arr,_24,_25){
-var _p=_1(arr,_25,_24);
-arr=_p[0];
-var _27=(arguments[3]?(new arguments[3]()):[]);
+},every:function(arr,_16,_17){
+return _4(true,arr,_16,_17);
+},some:function(arr,_18,_19){
+return _4(false,arr,_18,_19);
+},map:function(arr,_1a,_1b){
+var _1c=_1(arr,_1b,_1a);
+arr=_1c[0];
+var _1d=(arguments[3]?(new arguments[3]()):[]);
 for(var i=0,l=arr.length;i<l;++i){
-_27.push(_p[2].call(_p[1],arr[i],i,arr));
+_1d.push(_1c[2].call(_1c[1],arr[i],i,arr));
 }
-return _27;
-},filter:function(arr,_2b,_2c){
-var _p=_1(arr,_2c,_2b);
-arr=_p[0];
-var _2e=[];
+return _1d;
+},filter:function(arr,_1e,_1f){
+var _20=_1(arr,_1f,_1e);
+arr=_20[0];
+var _21=[];
 for(var i=0,l=arr.length;i<l;++i){
-if(_p[2].call(_p[1],arr[i],i,arr)){
-_2e.push(arr[i]);
+if(_20[2].call(_20[1],arr[i],i,arr)){
+_21.push(arr[i]);
 }
 }
-return _2e;
+return _21;
 }});
 })();
 }
diff --git a/dojo/_base/connect.js b/dojo/_base/connect.js
index cf344f9..55ac57d 100644
--- a/dojo/_base/connect.js
+++ b/dojo/_base/connect.js
@@ -13,73 +13,73 @@ dojo._listener={getDispatcher:function(){
 return function(){
 var ap=Array.prototype,c=arguments.callee,ls=c._listeners,t=c.target;
 var r=t&&t.apply(this,arguments);
-var _6;
-_6=[].concat(ls);
-for(var i in _6){
+var _1;
+_1=[].concat(ls);
+for(var i in _1){
 if(!(i in ap)){
-_6[i].apply(this,arguments);
+_1[i].apply(this,arguments);
 }
 }
 return r;
 };
-},add:function(_8,_9,_a){
-_8=_8||dojo.global;
-var f=_8[_9];
+},add:function(_2,_3,_4){
+_2=_2||dojo.global;
+var f=_2[_3];
 if(!f||!f._listeners){
 var d=dojo._listener.getDispatcher();
 d.target=f;
 d._listeners=[];
-f=_8[_9]=d;
+f=_2[_3]=d;
 }
-return f._listeners.push(_a);
-},remove:function(_d,_e,_f){
-var f=(_d||dojo.global)[_e];
-if(f&&f._listeners&&_f--){
-delete f._listeners[_f];
+return f._listeners.push(_4);
+},remove:function(_5,_6,_7){
+var f=(_5||dojo.global)[_6];
+if(f&&f._listeners&&_7--){
+delete f._listeners[_7];
 }
 }};
-dojo.connect=function(obj,_12,_13,_14,_15){
-var a=arguments,_17=[],i=0;
-_17.push(dojo.isString(a[0])?null:a[i++],a[i++]);
+dojo.connect=function(_8,_9,_a,_b,_c){
+var a=arguments,_d=[],i=0;
+_d.push(dojo.isString(a[0])?null:a[i++],a[i++]);
 var a1=a[i+1];
-_17.push(dojo.isString(a1)||dojo.isFunction(a1)?a[i++]:null,a[i++]);
+_d.push(dojo.isString(a1)||dojo.isFunction(a1)?a[i++]:null,a[i++]);
 for(var l=a.length;i<l;i++){
-_17.push(a[i]);
+_d.push(a[i]);
 }
-return dojo._connect.apply(this,_17);
+return dojo._connect.apply(this,_d);
 };
-dojo._connect=function(obj,_1c,_1d,_1e){
-var l=dojo._listener,h=l.add(obj,_1c,dojo.hitch(_1d,_1e));
-return [obj,_1c,h,l];
+dojo._connect=function(_e,_f,_10,_11){
+var l=dojo._listener,h=l.add(_e,_f,dojo.hitch(_10,_11));
+return [_e,_f,h,l];
 };
-dojo.disconnect=function(_21){
-if(_21&&_21[0]!==undefined){
-dojo._disconnect.apply(this,_21);
-delete _21[0];
+dojo.disconnect=function(_12){
+if(_12&&_12[0]!==undefined){
+dojo._disconnect.apply(this,_12);
+delete _12[0];
 }
 };
-dojo._disconnect=function(obj,_23,_24,_25){
-_25.remove(obj,_23,_24);
+dojo._disconnect=function(obj,_13,_14,_15){
+_15.remove(obj,_13,_14);
 };
 dojo._topics={};
-dojo.subscribe=function(_26,_27,_28){
-return [_26,dojo._listener.add(dojo._topics,_26,dojo.hitch(_27,_28))];
+dojo.subscribe=function(_16,_17,_18){
+return [_16,dojo._listener.add(dojo._topics,_16,dojo.hitch(_17,_18))];
 };
-dojo.unsubscribe=function(_29){
-if(_29){
-dojo._listener.remove(dojo._topics,_29[0],_29[1]);
+dojo.unsubscribe=function(_19){
+if(_19){
+dojo._listener.remove(dojo._topics,_19[0],_19[1]);
 }
 };
-dojo.publish=function(_2a,_2b){
-var f=dojo._topics[_2a];
+dojo.publish=function(_1a,_1b){
+var f=dojo._topics[_1a];
 if(f){
-f.apply(this,_2b||[]);
+f.apply(this,_1b||[]);
 }
 };
-dojo.connectPublisher=function(_2d,obj,_2f){
+dojo.connectPublisher=function(_1c,obj,_1d){
 var pf=function(){
-dojo.publish(_2d,arguments);
+dojo.publish(_1c,arguments);
 };
-return (_2f)?dojo.connect(obj,_2f,pf):dojo.connect(obj,pf);
+return (_1d)?dojo.connect(obj,_1d,pf):dojo.connect(obj,pf);
 };
 }
diff --git a/dojo/_base/declare.js b/dojo/_base/declare.js
index 17753f5..f8bc84c 100644
--- a/dojo/_base/declare.js
+++ b/dojo/_base/declare.js
@@ -9,120 +9,371 @@ if(!dojo._hasResource["dojo._base.declare"]){
 dojo._hasResource["dojo._base.declare"]=true;
 dojo.provide("dojo._base.declare");
 dojo.require("dojo._base.lang");
-dojo.declare=function(_1,_2,_3){
-var dd=arguments.callee,_5;
-if(dojo.isArray(_2)){
-_5=_2;
-_2=_5.shift();
-}
-if(_5){
-dojo.forEach(_5,function(m,i){
-if(!m){
-throw (_1+": mixin #"+i+" is null");
-}
-_2=dd._delegate(_2,m);
-});
-}
-var _8=dd._delegate(_2);
-_3=_3||{};
-_8.extend(_3);
-dojo.extend(_8,{declaredClass:_1,_constructor:_3.constructor});
-_8.prototype.constructor=_8;
-return dojo.setObject(_1,_8);
-};
-dojo.mixin(dojo.declare,{_delegate:function(_9,_a){
-var bp=(_9||0).prototype,mp=(_a||0).prototype,dd=dojo.declare;
-var _e=dd._makeCtor();
-dojo.mixin(_e,{superclass:bp,mixin:mp,extend:dd._extend});
-if(_9){
-_e.prototype=dojo._delegate(bp);
-}
-dojo.extend(_e,dd._core,mp||0,{_constructor:null,preamble:null});
-_e.prototype.constructor=_e;
-_e.prototype.declaredClass=(bp||0).declaredClass+"_"+(mp||0).declaredClass;
-return _e;
-},_extend:function(_f){
-var i,fn;
-for(i in _f){
-if(dojo.isFunction(fn=_f[i])&&!0[i]){
-fn.nom=i;
-fn.ctor=this;
-}
-}
-dojo.extend(this,_f);
-},_makeCtor:function(){
-return function(){
-this._construct(arguments);
+dojo.require("dojo._base.array");
+(function(){
+var d=dojo,_1=d._mixin,op=Object.prototype,_2=op.toString,_3=new Function,_4=0,_5="constructor";
+function _6(_7){
+throw new Error("declare: "+_7);
 };
-},_core:{_construct:function(_12){
-var c=_12.callee,s=c.superclass,ct=s&&s.constructor,m=c.mixin,mct=m&&m.constructor,a=_12,ii,fn;
-if(a[0]){
-if(((fn=a[0].preamble))){
-a=fn.apply(this,a)||a;
+function _8(_9){
+var _a=[],_b=[{cls:0,refs:[]}],_c={},_d=1,l=_9.length,i=0,j,_e,_f,top,_10,rec,_11,_12;
+for(;i<l;++i){
+_f=_9[i];
+if(!_f){
+_6("mixin #"+i+" is null");
+}
+_e=_f._meta?_f._meta.bases:[_f];
+top=0;
+for(j=_e.length-1;j>=0;--j){
+_10=_e[j].prototype;
+if(!_10.hasOwnProperty("declaredClass")){
+_10.declaredClass="uniqName_"+(_4++);
+}
+_11=_10.declaredClass;
+if(!_c.hasOwnProperty(_11)){
+_c[_11]={count:0,refs:[],cls:_e[j]};
+++_d;
+}
+rec=_c[_11];
+if(top&&top!==rec){
+rec.refs.push(top);
+++top.count;
+}
+top=rec;
+}
+++top.count;
+_b[0].refs.push(top);
 }
+while(_b.length){
+top=_b.pop();
+_a.push(top.cls);
+--_d;
+while(_12=top.refs,_12.length==1){
+top=_12[0];
+if(!top||--top.count){
+top=0;
+break;
 }
-if((fn=c.prototype.preamble)){
-a=fn.apply(this,a)||a;
+_a.push(top.cls);
+--_d;
 }
-if(ct&&ct.apply){
-ct.apply(this,a);
+if(top){
+for(i=0,l=_12.length;i<l;++i){
+top=_12[i];
+if(!--top.count){
+_b.push(top);
 }
-if(mct&&mct.apply){
-mct.apply(this,a);
 }
-if((ii=c.prototype._constructor)){
-ii.apply(this,_12);
 }
-if(this.constructor.prototype==c.prototype&&(ct=this.postscript)){
-ct.apply(this,_12);
 }
-},_findMixin:function(_1b){
-var c=this.constructor,p,m;
-while(c){
-p=c.superclass;
-m=c.mixin;
-if(m==_1b||(m instanceof _1b.constructor)){
-return p;
+if(_d){
+_6("can't build consistent linearization");
+}
+_f=_9[0];
+_a[0]=_f?_f._meta&&_f===_a[_a.length-_f._meta.bases.length]?_f._meta.bases.length:1:0;
+return _a;
+};
+function _13(_14,a,f){
+var _15,_16,_17,_18,_19,_1a,_1b,opf,pos,_1c=this._inherited=this._inherited||{};
+if(typeof _14=="string"){
+_15=_14;
+_14=a;
+a=f;
+}
+f=0;
+_18=_14.callee;
+_15=_15||_18.nom;
+if(!_15){
+_6("can't deduce a name to call inherited()");
+}
+_19=this.constructor._meta;
+_17=_19.bases;
+pos=_1c.p;
+if(_15!=_5){
+if(_1c.c!==_18){
+pos=0;
+_1a=_17[0];
+_19=_1a._meta;
+if(_19.hidden[_15]!==_18){
+_16=_19.chains;
+if(_16&&typeof _16[_15]=="string"){
+_6("calling chained method with inherited: "+_15);
+}
+do{
+_19=_1a._meta;
+_1b=_1a.prototype;
+if(_19&&(_1b[_15]===_18&&_1b.hasOwnProperty(_15)||_19.hidden[_15]===_18)){
+break;
 }
-if(m&&m._findMixin&&(m=m._findMixin(_1b))){
-return m;
+}while(_1a=_17[++pos]);
+pos=_1a?pos:-1;
 }
-c=p&&p.constructor;
 }
-},_findMethod:function(_1f,_20,_21,has){
-var p=_21,c,m,f;
+_1a=_17[++pos];
+if(_1a){
+_1b=_1a.prototype;
+if(_1a._meta&&_1b.hasOwnProperty(_15)){
+f=_1b[_15];
+}else{
+opf=op[_15];
 do{
-c=p.constructor;
-m=c.mixin;
-if(m&&(m=this._findMethod(_1f,_20,m,has))){
-return m;
-}
-if((f=p[_1f])&&(has==(f==_20))){
-return p;
-}
-p=c.superclass;
-}while(p);
-return !has&&(p=this._findMixin(_21))&&this._findMethod(_1f,_20,p,has);
-},inherited:function(_27,_28,_29){
-var a=arguments;
-if(!dojo.isString(a[0])){
-_29=_28;
-_28=_27;
-_27=_28.callee.nom;
-}
-a=_29||_28;
-var c=_28.callee,p=this.constructor.prototype,fn,mp;
-if(this[_27]!=c||p[_27]==c){
-mp=(c.ctor||0).superclass||this._findMethod(_27,c,p,true);
-if(!mp){
-throw (this.declaredClass+": inherited method \""+_27+"\" mismatch");
-}
-p=this._findMethod(_27,c,mp,false);
-}
-fn=p&&p[_27];
-if(!fn){
-throw (mp.declaredClass+": inherited method \""+_27+"\" not found");
-}
-return fn.apply(this,a);
-}}});
+_1b=_1a.prototype;
+f=_1b[_15];
+if(f&&(_1a._meta?_1b.hasOwnProperty(_15):f!==opf)){
+break;
+}
+}while(_1a=_17[++pos]);
+}
+}
+f=_1a&&f||op[_15];
+}else{
+if(_1c.c!==_18){
+pos=0;
+_19=_17[0]._meta;
+if(_19&&_19.ctor!==_18){
+_16=_19.chains;
+if(!_16||_16.constructor!=="manual"){
+_6("calling chained constructor with inherited");
+}
+while(_1a=_17[++pos]){
+_19=_1a._meta;
+if(_19&&_19.ctor===_18){
+break;
+}
+}
+pos=_1a?pos:-1;
+}
+}
+while(_1a=_17[++pos]){
+_19=_1a._meta;
+f=_19?_19.ctor:_1a;
+if(f){
+break;
+}
+}
+f=_1a&&f;
+}
+_1c.c=f;
+_1c.p=pos;
+if(f){
+return a===true?f:f.apply(this,a||_14);
+}
+};
+function _1d(_1e,_1f){
+if(typeof _1e=="string"){
+return this.inherited(_1e,_1f,true);
+}
+return this.inherited(_1e,true);
+};
+function _20(cls){
+var _21=this.constructor._meta.bases;
+for(var i=0,l=_21.length;i<l;++i){
+if(_21[i]===cls){
+return true;
+}
+}
+return this instanceof cls;
+};
+function _22(_23,_24){
+var _25,t,i=0,l=d._extraNames.length;
+for(_25 in _24){
+t=_24[_25];
+if((t!==op[_25]||!(_25 in op))&&_25!=_5){
+if(_2.call(t)=="[object Function]"){
+t.nom=_25;
+}
+_23[_25]=t;
+}
+}
+for(;i<l;++i){
+_25=d._extraNames[i];
+t=_24[_25];
+if((t!==op[_25]||!(_25 in op))&&_25!=_5){
+if(_2.call(t)=="[object Function]"){
+t.nom=_25;
+}
+_23[_25]=t;
+}
+}
+return _23;
+};
+function _26(_27){
+_22(this.prototype,_27);
+return this;
+};
+function _28(_29,_2a){
+return function(){
+var a=arguments,_2b=a,a0=a[0],f,i,m,l=_29.length,_2c;
+if(_2a&&(a0&&a0.preamble||this.preamble)){
+_2c=new Array(_29.length);
+_2c[0]=a;
+for(i=0;;){
+a0=a[0];
+if(a0){
+f=a0.preamble;
+if(f){
+a=f.apply(this,a)||a;
+}
+}
+f=_29[i].prototype;
+f=f.hasOwnProperty("preamble")&&f.preamble;
+if(f){
+a=f.apply(this,a)||a;
+}
+if(++i==l){
+break;
+}
+_2c[i]=a;
+}
+}
+for(i=l-1;i>=0;--i){
+f=_29[i];
+m=f._meta;
+f=m?m.ctor:f;
+if(f){
+f.apply(this,_2c?_2c[i]:a);
+}
+}
+f=this.postscript;
+if(f){
+f.apply(this,_2b);
+}
+};
+};
+function _2d(_2e,_2f){
+return function(){
+var a=arguments,t=a,a0=a[0],f;
+if(_2f){
+if(a0){
+f=a0.preamble;
+if(f){
+t=f.apply(this,t)||t;
+}
+}
+f=this.preamble;
+if(f){
+f.apply(this,t);
+}
+}
+if(_2e){
+_2e.apply(this,a);
+}
+f=this.postscript;
+if(f){
+f.apply(this,a);
+}
+};
+};
+function _30(_31){
+return function(){
+var a=arguments,i=0,f;
+for(;f=_31[i];++i){
+m=f._meta;
+f=m?m.ctor:f;
+if(f){
+f.apply(this,a);
+break;
+}
+}
+f=this.postscript;
+if(f){
+f.apply(this,a);
+}
+};
+};
+function _32(_33,_34,_35){
+return function(){
+var b,m,f,i=0,_36=1;
+if(_35){
+i=_34.length-1;
+_36=-1;
+}
+for(;b=_34[i];i+=_36){
+m=b._meta;
+f=(m?m.hidden:b.prototype)[_33];
+if(f){
+f.apply(this,arguments);
+}
+}
+};
+};
+d.declare=function(_37,_38,_39){
+var _3a,i,t,_3b,_3c,_3d,_3e,_3f=1,_40=_38;
+if(typeof _37!="string"){
+_39=_38;
+_38=_37;
+_37="";
+}
+_39=_39||{};
+if(_2.call(_38)=="[object Array]"){
+_3d=_8(_38);
+t=_3d[0];
+_3f=_3d.length-t;
+_38=_3d[_3f];
+}else{
+_3d=[0];
+if(_38){
+t=_38._meta;
+_3d=_3d.concat(t?t.bases:_38);
+}
+}
+if(_38){
+for(i=_3f-1;;--i){
+_3.prototype=_38.prototype;
+_3a=new _3;
+if(!i){
+break;
+}
+t=_3d[i];
+_1(_3a,t._meta?t._meta.hidden:t.prototype);
+_3b=new Function;
+_3b.superclass=_38;
+_3b.prototype=_3a;
+_38=_3a.constructor=_3b;
+}
+}else{
+_3a={};
+}
+_22(_3a,_39);
+t=_39.constructor;
+if(t!==op.constructor){
+t.nom=_5;
+_3a.constructor=t;
+}
+_3.prototype=0;
+for(i=_3f-1;i;--i){
+t=_3d[i]._meta;
+if(t&&t.chains){
+_3e=_1(_3e||{},t.chains);
+}
+}
+if(_3a["-chains-"]){
+_3e=_1(_3e||{},_3a["-chains-"]);
+}
+t=!_3e||!_3e.hasOwnProperty(_5);
+_3d[0]=_3b=(_3e&&_3e.constructor==="manual")?_30(_3d):(_3d.length==1?_2d(_39.constructor,t):_28(_3d,t));
+_3b._meta={bases:_3d,hidden:_39,chains:_3e,parents:_40,ctor:_39.constructor};
+_3b.superclass=_38&&_38.prototype;
+_3b.extend=_26;
+_3b.prototype=_3a;
+_3a.constructor=_3b;
+_3a.getInherited=_1d;
+_3a.inherited=_13;
+_3a.isInstanceOf=_20;
+if(_37){
+_3a.declaredClass=_37;
+d.setObject(_37,_3b);
+}
+if(_3e){
+for(_3c in _3e){
+if(_3a[_3c]&&typeof _3e[_3c]=="string"&&_3c!=_5){
+t=_3a[_3c]=_32(_3c,_3d,_3e[_3c]==="after");
+t.nom=_3c;
+}
+}
+}
+return _3b;
+};
+d.safeMixin=_22;
+})();
 }
diff --git a/dojo/_base/event.js b/dojo/_base/event.js
index df1ec62..ae9fcfc 100644
--- a/dojo/_base/event.js
+++ b/dojo/_base/event.js
@@ -16,147 +16,164 @@ return;
 }
 _3=_1._normalizeEventName(_3);
 fp=_1._fixCallback(_3,fp);
-var _5=_3;
+var _4=_3;
 if(!dojo.isIE&&(_3=="mouseenter"||_3=="mouseleave")){
-var _6=fp;
+var _5=fp;
 _3=(_3=="mouseenter")?"mouseover":"mouseout";
 fp=function(e){
-if(dojo.isFF<=2){
-try{
-e.relatedTarget.tagName;
-}
-catch(e2){
-return;
-}
-}
 if(!dojo.isDescendant(e.relatedTarget,_2)){
-return _6.call(this,e);
+return _5.call(this,e);
 }
 };
 }
 _2.addEventListener(_3,fp,false);
 return fp;
-},remove:function(_8,_9,_a){
-if(_8){
-_9=_1._normalizeEventName(_9);
-if(!dojo.isIE&&(_9=="mouseenter"||_9=="mouseleave")){
-_9=(_9=="mouseenter")?"mouseover":"mouseout";
-}
-_8.removeEventListener(_9,_a,false);
-}
-},_normalizeEventName:function(_b){
-return _b.slice(0,2)=="on"?_b.slice(2):_b;
-},_fixCallback:function(_c,fp){
-return _c!="keypress"?fp:function(e){
+},remove:function(_6,_7,_8){
+if(_6){
+_7=_1._normalizeEventName(_7);
+if(!dojo.isIE&&(_7=="mouseenter"||_7=="mouseleave")){
+_7=(_7=="mouseenter")?"mouseover":"mouseout";
+}
+_6.removeEventListener(_7,_8,false);
+}
+},_normalizeEventName:function(_9){
+return _9.slice(0,2)=="on"?_9.slice(2):_9;
+},_fixCallback:function(_a,fp){
+return _a!="keypress"?fp:function(e){
 return fp.call(this,_1._fixEvent(e,this));
 };
-},_fixEvent:function(_f,_10){
-switch(_f.type){
+},_fixEvent:function(_b,_c){
+switch(_b.type){
 case "keypress":
-_1._setKeyChar(_f);
+_1._setKeyChar(_b);
 break;
 }
-return _f;
-},_setKeyChar:function(evt){
-evt.keyChar=evt.charCode?String.fromCharCode(evt.charCode):"";
-evt.charOrCode=evt.keyChar||evt.keyCode;
+return _b;
+},_setKeyChar:function(_d){
+_d.keyChar=_d.charCode?String.fromCharCode(_d.charCode):"";
+_d.charOrCode=_d.keyChar||_d.keyCode;
 },_punctMap:{106:42,111:47,186:59,187:43,188:44,189:45,190:46,191:47,192:96,219:91,220:92,221:93,222:39}});
-dojo.fixEvent=function(evt,_13){
-return _1._fixEvent(evt,_13);
+dojo.fixEvent=function(_e,_f){
+return _1._fixEvent(_e,_f);
 };
 dojo.stopEvent=function(evt){
 evt.preventDefault();
 evt.stopPropagation();
 };
-var _15=dojo._listener;
-dojo._connect=function(obj,_17,_18,_19,_1a){
-var _1b=obj&&(obj.nodeType||obj.attachEvent||obj.addEventListener);
-var lid=_1b?(_1a?2:1):0,l=[dojo._listener,_1,_15][lid];
-var h=l.add(obj,_17,dojo.hitch(_18,_19));
-return [obj,_17,h,lid];
+var _10=dojo._listener;
+dojo._connect=function(obj,_11,_12,_13,_14){
+var _15=obj&&(obj.nodeType||obj.attachEvent||obj.addEventListener);
+var lid=_15?(_14?2:1):0,l=[dojo._listener,_1,_10][lid];
+var h=l.add(obj,_11,dojo.hitch(_12,_13));
+return [obj,_11,h,lid];
 };
-dojo._disconnect=function(obj,_20,_21,_22){
-([dojo._listener,_1,_15][_22]).remove(obj,_20,_21);
+dojo._disconnect=function(obj,_16,_17,_18){
+([dojo._listener,_1,_10][_18]).remove(obj,_16,_17);
+};
+dojo.keys={BACKSPACE:8,TAB:9,CLEAR:12,ENTER:13,SHIFT:16,CTRL:17,ALT:18,META:dojo.isSafari?91:224,PAUSE:19,CAPS_LOCK:20,ESCAPE:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT_ARROW:37,UP_ARROW:38,RIGHT_ARROW:39,DOWN_ARROW:40,INSERT:45,DELETE:46,HELP:47,LEFT_WINDOW:91,RIGHT_WINDOW:92,SELECT:93,NUMPAD_0:96,NUMPAD_1:97,NUMPAD_2:98,NUMPAD_3:99,NUMPAD_4:100,NUMPAD_5:101,NUMPAD_6:102,NUMPAD_7:103,NUMPAD_8:104,NUMPAD_9:105,NUMPAD_MULTIPLY:106,NUMPAD_PLUS:107,NUMPAD_ENTER:108,NUMPAD_MINUS [...]
+var _19=dojo.isMac?"metaKey":"ctrlKey";
+dojo.isCopyKey=function(e){
+return e[_19];
 };
-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,NUM [...]
 if(dojo.isIE){
-var _23=function(e,_25){
+dojo.mouseButtons={LEFT:1,MIDDLE:4,RIGHT:2,isButton:function(e,_1a){
+return e.button&_1a;
+},isLeft:function(e){
+return e.button&1;
+},isMiddle:function(e){
+return e.button&4;
+},isRight:function(e){
+return e.button&2;
+}};
+}else{
+dojo.mouseButtons={LEFT:0,MIDDLE:1,RIGHT:2,isButton:function(e,_1b){
+return e.button==_1b;
+},isLeft:function(e){
+return e.button==0;
+},isMiddle:function(e){
+return e.button==1;
+},isRight:function(e){
+return e.button==2;
+}};
+}
+if(dojo.isIE){
+var _1c=function(e,_1d){
 try{
-return (e.keyCode=_25);
+return (e.keyCode=_1d);
 }
 catch(e){
 return 0;
 }
 };
 var iel=dojo._listener;
-var _27=(dojo._ieListenersName="_"+dojo._scopeName+"_listeners");
+var _1e=(dojo._ieListenersName="_"+dojo._scopeName+"_listeners");
 if(!dojo.config._allow_leaks){
-_15=iel=dojo._ie_listener={handlers:[],add:function(_28,_29,_2a){
-_28=_28||dojo.global;
-var f=_28[_29];
-if(!f||!f[_27]){
+_10=iel=dojo._ie_listener={handlers:[],add:function(_1f,_20,_21){
+_1f=_1f||dojo.global;
+var f=_1f[_20];
+if(!f||!f[_1e]){
 var d=dojo._getIeDispatcher();
 d.target=f&&(ieh.push(f)-1);
-d[_27]=[];
-f=_28[_29]=d;
+d[_1e]=[];
+f=_1f[_20]=d;
 }
-return f[_27].push(ieh.push(_2a)-1);
-},remove:function(_2e,_2f,_30){
-var f=(_2e||dojo.global)[_2f],l=f&&f[_27];
-if(f&&l&&_30--){
-delete ieh[l[_30]];
-delete l[_30];
+return f[_1e].push(ieh.push(_21)-1);
+},remove:function(_22,_23,_24){
+var f=(_22||dojo.global)[_23],l=f&&f[_1e];
+if(f&&l&&_24--){
+delete ieh[l[_24]];
+delete l[_24];
 }
 }};
 var ieh=iel.handlers;
 }
-dojo.mixin(_1,{add:function(_33,_34,fp){
-if(!_33){
+dojo.mixin(_1,{add:function(_25,_26,fp){
+if(!_25){
 return;
 }
-_34=_1._normalizeEventName(_34);
-if(_34=="onkeypress"){
-var kd=_33.onkeydown;
-if(!kd||!kd[_27]||!kd._stealthKeydownHandle){
-var h=_1.add(_33,"onkeydown",_1._stealthKeyDown);
-kd=_33.onkeydown;
+_26=_1._normalizeEventName(_26);
+if(_26=="onkeypress"){
+var kd=_25.onkeydown;
+if(!kd||!kd[_1e]||!kd._stealthKeydownHandle){
+var h=_1.add(_25,"onkeydown",_1._stealthKeyDown);
+kd=_25.onkeydown;
 kd._stealthKeydownHandle=h;
 kd._stealthKeydownRefs=1;
 }else{
 kd._stealthKeydownRefs++;
 }
 }
-return iel.add(_33,_34,_1._fixCallback(fp));
-},remove:function(_38,_39,_3a){
-_39=_1._normalizeEventName(_39);
-iel.remove(_38,_39,_3a);
-if(_39=="onkeypress"){
-var kd=_38.onkeydown;
+return iel.add(_25,_26,_1._fixCallback(fp));
+},remove:function(_27,_28,_29){
+_28=_1._normalizeEventName(_28);
+iel.remove(_27,_28,_29);
+if(_28=="onkeypress"){
+var kd=_27.onkeydown;
 if(--kd._stealthKeydownRefs<=0){
-iel.remove(_38,"onkeydown",kd._stealthKeydownHandle);
+iel.remove(_27,"onkeydown",kd._stealthKeydownHandle);
 delete kd._stealthKeydownHandle;
 }
 }
-},_normalizeEventName:function(_3c){
-return _3c.slice(0,2)!="on"?"on"+_3c:_3c;
+},_normalizeEventName:function(_2a){
+return _2a.slice(0,2)!="on"?"on"+_2a:_2a;
 },_nop:function(){
-},_fixEvent:function(evt,_3e){
+},_fixEvent:function(evt,_2b){
 if(!evt){
-var w=_3e&&(_3e.ownerDocument||_3e.document||_3e).parentWindow||window;
+var w=_2b&&(_2b.ownerDocument||_2b.document||_2b).parentWindow||window;
 evt=w.event;
 }
 if(!evt){
 return (evt);
 }
 evt.target=evt.srcElement;
-evt.currentTarget=(_3e||evt.srcElement);
+evt.currentTarget=(_2b||evt.srcElement);
 evt.layerX=evt.offsetX;
 evt.layerY=evt.offsetY;
 var se=evt.srcElement,doc=(se&&se.ownerDocument)||document;
-var _42=((dojo.isIE<6)||(doc["compatMode"]=="BackCompat"))?doc.body:doc.documentElement;
-var _43=dojo._getIeDocumentElementOffset();
-evt.pageX=evt.clientX+dojo._fixIeBiDiScrollLeft(_42.scrollLeft||0)-_43.x;
-evt.pageY=evt.clientY+(_42.scrollTop||0)-_43.y;
+var _2c=((dojo.isIE<6)||(doc["compatMode"]=="BackCompat"))?doc.body:doc.documentElement;
+var _2d=dojo._getIeDocumentElementOffset();
+evt.pageX=evt.clientX+dojo._fixIeBiDiScrollLeft(_2c.scrollLeft||0)-_2d.x;
+evt.pageY=evt.clientY+(_2c.scrollTop||0)-_2d.y;
 if(evt.type=="mouseover"){
 evt.relatedTarget=evt.fromElement;
 }
@@ -189,13 +206,13 @@ break;
 return evt;
 },_stealthKeyDown:function(evt){
 var kp=evt.currentTarget.onkeypress;
-if(!kp||!kp[_27]){
+if(!kp||!kp[_1e]){
 return;
 }
 var k=evt.keyCode;
-var _49=k!=13&&k!=32&&k!=27&&(k<48||k>90)&&(k<96||k>111)&&(k<186||k>192)&&(k<219||k>222);
-if(_49||evt.ctrlKey){
-var c=_49?0:k;
+var _2e=k!=13&&k!=32&&k!=27&&(k<48||k>90)&&(k<96||k>111)&&(k<186||k>192)&&(k<219||k>222);
+if(_2e||evt.ctrlKey){
+var c=_2e?0:k;
 if(evt.ctrlKey){
 if(k==3||k==13){
 return;
@@ -211,18 +228,18 @@ c=_1._punctMap[c]||c;
 }
 }
 }
-var _4b=_1._synthesizeEvent(evt,{type:"keypress",faux:true,charCode:c});
-kp.call(evt.currentTarget,_4b);
-evt.cancelBubble=_4b.cancelBubble;
-evt.returnValue=_4b.returnValue;
-_23(evt,_4b.keyCode);
+var _2f=_1._synthesizeEvent(evt,{type:"keypress",faux:true,charCode:c});
+kp.call(evt.currentTarget,_2f);
+evt.cancelBubble=_2f.cancelBubble;
+evt.returnValue=_2f.returnValue;
+_1c(evt,_2f.keyCode);
 }
 },_stopPropagation:function(){
 this.cancelBubble=true;
 },_preventDefault:function(){
 this.bubbledKeyCode=this.keyCode;
 if(this.ctrlKey){
-_23(this,0);
+_1c(this,0);
 }
 this.returnValue=false;
 }});
@@ -232,19 +249,19 @@ _1._stopPropagation.call(evt);
 _1._preventDefault.call(evt);
 };
 }
-_1._synthesizeEvent=function(evt,_4e){
-var _4f=dojo.mixin({},evt,_4e);
-_1._setKeyChar(_4f);
-_4f.preventDefault=function(){
+_1._synthesizeEvent=function(evt,_30){
+var _31=dojo.mixin({},evt,_30);
+_1._setKeyChar(_31);
+_31.preventDefault=function(){
 evt.preventDefault();
 };
-_4f.stopPropagation=function(){
+_31.stopPropagation=function(){
 evt.stopPropagation();
 };
-return _4f;
+return _31;
 };
 if(dojo.isOpera){
-dojo.mixin(_1,{_fixEvent:function(evt,_51){
+dojo.mixin(_1,{_fixEvent:function(evt,_32){
 switch(evt.type){
 case "keypress":
 var c=evt.which;
@@ -263,17 +280,17 @@ return evt;
 if(dojo.isWebKit){
 _1._add=_1.add;
 _1._remove=_1.remove;
-dojo.mixin(_1,{add:function(_53,_54,fp){
-if(!_53){
+dojo.mixin(_1,{add:function(_33,_34,fp){
+if(!_33){
 return;
 }
-var _56=_1._add(_53,_54,fp);
-if(_1._normalizeEventName(_54)=="keypress"){
-_56._stealthKeyDownHandle=_1._add(_53,"keydown",function(evt){
+var _35=_1._add(_33,_34,fp);
+if(_1._normalizeEventName(_34)=="keypress"){
+_35._stealthKeyDownHandle=_1._add(_33,"keydown",function(evt){
 var k=evt.keyCode;
-var _59=k!=13&&k!=32&&k!=27&&(k<48||k>90)&&(k<96||k>111)&&(k<186||k>192)&&(k<219||k>222);
-if(_59||evt.ctrlKey){
-var c=_59?0:k;
+var _36=k!=13&&k!=32&&(k<48||k>90)&&(k<96||k>111)&&(k<186||k>192)&&(k<219||k>222);
+if(_36||evt.ctrlKey){
+var c=_36?0:k;
 if(evt.ctrlKey){
 if(k==3||k==13){
 return;
@@ -289,20 +306,20 @@ c=_1._punctMap[c]||c;
 }
 }
 }
-var _5b=_1._synthesizeEvent(evt,{type:"keypress",faux:true,charCode:c});
-fp.call(evt.currentTarget,_5b);
+var _37=_1._synthesizeEvent(evt,{type:"keypress",faux:true,charCode:c});
+fp.call(evt.currentTarget,_37);
 }
 });
 }
-return _56;
-},remove:function(_5c,_5d,_5e){
-if(_5c){
-if(_5e._stealthKeyDownHandle){
-_1._remove(_5c,"keydown",_5e._stealthKeyDownHandle);
+return _35;
+},remove:function(_38,_39,_3a){
+if(_38){
+if(_3a._stealthKeyDownHandle){
+_1._remove(_38,"keydown",_3a._stealthKeyDownHandle);
 }
-_1._remove(_5c,_5d,_5e);
+_1._remove(_38,_39,_3a);
 }
-},_fixEvent:function(evt,_60){
+},_fixEvent:function(evt,_3b){
 switch(evt.type){
 case "keypress":
 if(evt.faux){
@@ -317,14 +334,14 @@ return evt;
 }
 })();
 if(dojo.isIE){
-dojo._ieDispatcher=function(_62,_63){
-var ap=Array.prototype,h=dojo._ie_listener.handlers,c=_62.callee,ls=c[dojo._ieListenersName],t=h[c.target];
-var r=t&&t.apply(_63,_62);
+dojo._ieDispatcher=function(_3c,_3d){
+var ap=Array.prototype,h=dojo._ie_listener.handlers,c=_3c.callee,ls=c[dojo._ieListenersName],t=h[c.target];
+var r=t&&t.apply(_3d,_3c);
 var lls=[].concat(ls);
 for(var i in lls){
 var f=h[lls[i]];
 if(!(i in ap)&&f){
-f.apply(_63,_62);
+f.apply(_3d,_3c);
 }
 }
 return r;
diff --git a/dojo/_base/fx.js b/dojo/_base/fx.js
index dbf9126..2d2bf98 100644
--- a/dojo/_base/fx.js
+++ b/dojo/_base/fx.js
@@ -10,31 +10,36 @@ 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");
 (function(){
 var d=dojo;
-var _2=d.mixin;
-dojo._Line=function(_3,_4){
-this.start=_3;
-this.end=_4;
+var _1=d._mixin;
+dojo._Line=function(_2,_3){
+this.start=_2;
+this.end=_3;
 };
 dojo._Line.prototype.getValue=function(n){
 return ((this.end-this.start)*n)+this.start;
 };
-d.declare("dojo._Animation",null,{constructor:function(_6){
-_2(this,_6);
+dojo.Animation=function(_4){
+_1(this,_4);
 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(_7,_8){
+};
+d._Animation=d.Animation;
+d.extend(dojo.Animation,{duration:350,repeat:0,rate:20,_percent:0,_startRepeatCount:0,_getStep:function(){
+var _5=this._percent,_6=this.easing;
+return _6?_6(_5):_5;
+},_fire:function(_7,_8){
+var a=_8||[];
 if(this[_7]){
-if(dojo.config.debugAtAllCosts){
-this[_7].apply(this,_8||[]);
+if(d.config.debugAtAllCosts){
+this[_7].apply(this,a);
 }else{
 try{
-this[_7].apply(this,_8||[]);
+this[_7].apply(this,a);
 }
 catch(e){
 console.error("exception in animation handler for:",_7);
@@ -44,253 +49,255 @@ console.error(e);
 }
 return this;
 },play:function(_9,_a){
-var _t=this;
-if(_t._delayTimer){
-_t._clearTimer();
+var _b=this;
+if(_b._delayTimer){
+_b._clearTimer();
 }
 if(_a){
-_t._stopTimer();
-_t._active=_t._paused=false;
-_t._percent=0;
+_b._stopTimer();
+_b._active=_b._paused=false;
+_b._percent=0;
 }else{
-if(_t._active&&!_t._paused){
-return _t;
+if(_b._active&&!_b._paused){
+return _b;
 }
 }
-_t._fire("beforeBegin");
-var de=_9||_t.delay,_p=dojo.hitch(_t,"_play",_a);
+_b._fire("beforeBegin",[_b.node]);
+var de=_9||_b.delay,_c=dojo.hitch(_b,"_play",_a);
 if(de>0){
-_t._delayTimer=setTimeout(_p,de);
-return _t;
-}
-_p();
-return _t;
-},_play:function(_e){
-var _t=this;
-if(_t._delayTimer){
-_t._clearTimer();
-}
-_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 _10=_t.curve.getValue(_t._percent);
-if(!_t._percent){
-if(!_t._startRepeatCount){
-_t._startRepeatCount=_t.repeat;
-}
-_t._fire("onBegin",[_10]);
-}
-_t._fire("onPlay",[_10]);
-_t._cycle();
-return _t;
+_b._delayTimer=setTimeout(_c,de);
+return _b;
+}
+_c();
+return _b;
+},_play:function(_d){
+var _e=this;
+if(_e._delayTimer){
+_e._clearTimer();
+}
+_e._startTime=new Date().valueOf();
+if(_e._paused){
+_e._startTime-=_e.duration*_e._percent;
+}
+_e._endTime=_e._startTime+_e.duration;
+_e._active=true;
+_e._paused=false;
+var _f=_e.curve.getValue(_e._getStep());
+if(!_e._percent){
+if(!_e._startRepeatCount){
+_e._startRepeatCount=_e.repeat;
+}
+_e._fire("onBegin",[_f]);
+}
+_e._fire("onPlay",[_f]);
+_e._cycle();
+return _e;
 },pause:function(){
-var _t=this;
-if(_t._delayTimer){
-_t._clearTimer();
-}
-_t._stopTimer();
-if(!_t._active){
-return _t;
-}
-_t._paused=true;
-_t._fire("onPause",[_t.curve.getValue(_t._percent)]);
-return _t;
-},gotoPercent:function(_12,_13){
-var _t=this;
-_t._stopTimer();
-_t._active=_t._paused=true;
-_t._percent=_12;
-if(_13){
-_t.play();
-}
-return _t;
-},stop:function(_15){
-var _t=this;
-if(_t._delayTimer){
-_t._clearTimer();
-}
-if(!_t._timer){
-return _t;
-}
-_t._stopTimer();
-if(_15){
-_t._percent=1;
-}
-_t._fire("onStop",[_t.curve.getValue(_t._percent)]);
-_t._active=_t._paused=false;
-return _t;
+var _10=this;
+if(_10._delayTimer){
+_10._clearTimer();
+}
+_10._stopTimer();
+if(!_10._active){
+return _10;
+}
+_10._paused=true;
+_10._fire("onPause",[_10.curve.getValue(_10._getStep())]);
+return _10;
+},gotoPercent:function(_11,_12){
+var _13=this;
+_13._stopTimer();
+_13._active=_13._paused=true;
+_13._percent=_11;
+if(_12){
+_13.play();
+}
+return _13;
+},stop:function(_14){
+var _15=this;
+if(_15._delayTimer){
+_15._clearTimer();
+}
+if(!_15._timer){
+return _15;
+}
+_15._stopTimer();
+if(_14){
+_15._percent=1;
+}
+_15._fire("onStop",[_15.curve.getValue(_15._getStep())]);
+_15._active=_15._paused=false;
+return _15;
 },status:function(){
 if(this._active){
 return this._paused?"paused":"playing";
 }
 return "stopped";
 },_cycle:function(){
-var _t=this;
-if(_t._active){
-var _18=new Date().valueOf();
-var _19=(_18-_t._startTime)/(_t._endTime-_t._startTime);
-if(_19>=1){
-_19=1;
-}
-_t._percent=_19;
-if(_t.easing){
-_19=_t.easing(_19);
-}
-_t._fire("onAnimate",[_t.curve.getValue(_19)]);
-if(_t._percent<1){
-_t._startTimer();
+var _16=this;
+if(_16._active){
+var _17=new Date().valueOf();
+var _18=(_17-_16._startTime)/(_16._endTime-_16._startTime);
+if(_18>=1){
+_18=1;
+}
+_16._percent=_18;
+if(_16.easing){
+_18=_16.easing(_18);
+}
+_16._fire("onAnimate",[_16.curve.getValue(_18)]);
+if(_16._percent<1){
+_16._startTimer();
 }else{
-_t._active=false;
-if(_t.repeat>0){
-_t.repeat--;
-_t.play(null,true);
+_16._active=false;
+if(_16.repeat>0){
+_16.repeat--;
+_16.play(null,true);
 }else{
-if(_t.repeat==-1){
-_t.play(null,true);
+if(_16.repeat==-1){
+_16.play(null,true);
 }else{
-if(_t._startRepeatCount){
-_t.repeat=_t._startRepeatCount;
-_t._startRepeatCount=0;
+if(_16._startRepeatCount){
+_16.repeat=_16._startRepeatCount;
+_16._startRepeatCount=0;
 }
 }
 }
-_t._percent=0;
-_t._fire("onEnd");
-_t._stopTimer();
+_16._percent=0;
+_16._fire("onEnd",[_16.node]);
+!_16.repeat&&_16._stopTimer();
 }
 }
-return _t;
+return _16;
 },_clearTimer:function(){
 clearTimeout(this._delayTimer);
 delete this._delayTimer;
 }});
-var ctr=0,_1b=[],_1c=null,_1d={run:function(){
+var ctr=0,_19=[],_1a=null,_1b={run:function(){
 }};
-dojo._Animation.prototype._startTimer=function(){
+d.extend(d.Animation,{_startTimer:function(){
 if(!this._timer){
-this._timer=d.connect(_1d,"run",this,"_cycle");
+this._timer=d.connect(_1b,"run",this,"_cycle");
 ctr++;
 }
-if(!_1c){
-_1c=setInterval(d.hitch(_1d,"run"),this.rate);
+if(!_1a){
+_1a=setInterval(d.hitch(_1b,"run"),this.rate);
 }
-};
-dojo._Animation.prototype._stopTimer=function(){
+},_stopTimer:function(){
 if(this._timer){
 d.disconnect(this._timer);
 this._timer=null;
 ctr--;
 }
 if(ctr<=0){
-clearInterval(_1c);
-_1c=null;
+clearInterval(_1a);
+_1a=null;
 ctr=0;
 }
-};
-var _1e=d.isIE?function(_1f){
-var ns=_1f.style;
-if(!ns.width.length&&d.style(_1f,"width")=="auto"){
+}});
+var _1c=d.isIE?function(_1d){
+var ns=_1d.style;
+if(!ns.width.length&&d.style(_1d,"width")=="auto"){
 ns.width="auto";
 }
 }:function(){
 };
-dojo._fade=function(_21){
-_21.node=d.byId(_21.node);
-var _22=_2({properties:{}},_21),_23=(_22.properties.opacity={});
-_23.start=!("start" in _22)?function(){
-return +d.style(_22.node,"opacity")||0;
-}:_22.start;
-_23.end=_22.end;
-var _24=d.animateProperty(_22);
-d.connect(_24,"beforeBegin",d.partial(_1e,_22.node));
-return _24;
+dojo._fade=function(_1e){
+_1e.node=d.byId(_1e.node);
+var _1f=_1({properties:{}},_1e),_20=(_1f.properties.opacity={});
+_20.start=!("start" in _1f)?function(){
+return +d.style(_1f.node,"opacity")||0;
+}:_1f.start;
+_20.end=_1f.end;
+var _21=d.animateProperty(_1f);
+d.connect(_21,"beforeBegin",d.partial(_1c,_1f.node));
+return _21;
 };
-dojo.fadeIn=function(_25){
-return d._fade(_2({end:1},_25));
+dojo.fadeIn=function(_22){
+return d._fade(_1({end:1},_22));
 };
-dojo.fadeOut=function(_26){
-return d._fade(_2({end:0},_26));
+dojo.fadeOut=function(_23){
+return d._fade(_1({end:0},_23));
 };
 dojo._defaultEasing=function(n){
 return 0.5+((Math.sin((n+1.5)*Math.PI))/2);
 };
-var _28=function(_29){
-this._properties=_29;
-for(var p in _29){
-var _2b=_29[p];
-if(_2b.start instanceof d.Color){
-_2b.tempColor=new d.Color();
+var _24=function(_25){
+this._properties=_25;
+for(var p in _25){
+var _26=_25[p];
+if(_26.start instanceof d.Color){
+_26.tempColor=new d.Color();
 }
 }
 };
-_28.prototype.getValue=function(r){
+_24.prototype.getValue=function(r){
 var ret={};
 for(var p in this._properties){
-var _2f=this._properties[p],_30=_2f.start;
-if(_30 instanceof d.Color){
-ret[p]=d.blendColors(_30,_2f.end,r,_2f.tempColor).toCss();
+var _27=this._properties[p],_28=_27.start;
+if(_28 instanceof d.Color){
+ret[p]=d.blendColors(_28,_27.end,r,_27.tempColor).toCss();
 }else{
-if(!d.isArray(_30)){
-ret[p]=((_2f.end-_30)*r)+_30+(p!="opacity"?_2f.units||"px":0);
+if(!d.isArray(_28)){
+ret[p]=((_27.end-_28)*r)+_28+(p!="opacity"?_27.units||"px":0);
 }
 }
 }
 return ret;
 };
-dojo.animateProperty=function(_31){
-_31.node=d.byId(_31.node);
-if(!_31.easing){
-_31.easing=d._defaultEasing;
+dojo.animateProperty=function(_29){
+var n=_29.node=d.byId(_29.node);
+if(!_29.easing){
+_29.easing=d._defaultEasing;
 }
-var _32=new d._Animation(_31);
-d.connect(_32,"beforeBegin",_32,function(){
+var _2a=new d.Animation(_29);
+d.connect(_2a,"beforeBegin",_2a,function(){
 var pm={};
 for(var p in this.properties){
 if(p=="width"||p=="height"){
 this.node.display="block";
 }
-var _35=this.properties[p];
-_35=pm[p]=_2({},(d.isObject(_35)?_35:{end:_35}));
-if(d.isFunction(_35.start)){
-_35.start=_35.start();
+var _2b=this.properties[p];
+if(d.isFunction(_2b)){
+_2b=_2b(n);
+}
+_2b=pm[p]=_1({},(d.isObject(_2b)?_2b:{end:_2b}));
+if(d.isFunction(_2b.start)){
+_2b.start=_2b.start(n);
 }
-if(d.isFunction(_35.end)){
-_35.end=_35.end();
+if(d.isFunction(_2b.end)){
+_2b.end=_2b.end(n);
 }
-var _36=(p.toLowerCase().indexOf("color")>=0);
-function _37(_38,p){
-var v={height:_38.offsetHeight,width:_38.offsetWidth}[p];
+var _2c=(p.toLowerCase().indexOf("color")>=0);
+function _2d(_2e,p){
+var v={height:_2e.offsetHeight,width:_2e.offsetWidth}[p];
 if(v!==undefined){
 return v;
 }
-v=d.style(_38,p);
-return (p=="opacity")?+v:(_36?v:parseFloat(v));
+v=d.style(_2e,p);
+return (p=="opacity")?+v:(_2c?v:parseFloat(v));
 };
-if(!("end" in _35)){
-_35.end=_37(this.node,p);
+if(!("end" in _2b)){
+_2b.end=_2d(n,p);
 }else{
-if(!("start" in _35)){
-_35.start=_37(this.node,p);
+if(!("start" in _2b)){
+_2b.start=_2d(n,p);
 }
 }
-if(_36){
-_35.start=new d.Color(_35.start);
-_35.end=new d.Color(_35.end);
+if(_2c){
+_2b.start=new d.Color(_2b.start);
+_2b.end=new d.Color(_2b.end);
 }else{
-_35.start=(p=="opacity")?+_35.start:parseFloat(_35.start);
+_2b.start=(p=="opacity")?+_2b.start:parseFloat(_2b.start);
 }
 }
-this.curve=new _28(pm);
+this.curve=new _24(pm);
 });
-d.connect(_32,"onAnimate",d.hitch(d,"style",_32.node));
-return _32;
+d.connect(_2a,"onAnimate",d.hitch(d,"style",_2a.node));
+return _2a;
 };
-dojo.anim=function(_3b,_3c,_3d,_3e,_3f,_40){
-return d.animateProperty({node:_3b,duration:_3d||d._Animation.prototype.duration,properties:_3c,easing:_3e,onEnd:_3f}).play(_40||0);
+dojo.anim=function(_2f,_30,_31,_32,_33,_34){
+return d.animateProperty({node:_2f,duration:_31||d.Animation.prototype.duration,properties:_30,easing:_32,onEnd:_33}).play(_34||0);
 };
 })();
 }
diff --git a/dojo/_base/html.js b/dojo/_base/html.js
index 9e1109e..2b1aca0 100644
--- a/dojo/_base/html.js
+++ b/dojo/_base/html.js
@@ -15,251 +15,251 @@ document.execCommand("BackgroundImageCache",false,true);
 catch(e){
 }
 if(dojo.isIE||dojo.isOpera){
-dojo.byId=function(id,_2){
-if(dojo.isString(id)){
-var _d=_2||dojo.doc;
-var te=_d.getElementById(id);
+dojo.byId=function(id,_1){
+if(typeof id!="string"){
+return id;
+}
+var _2=_1||dojo.doc,te=_2.getElementById(id);
 if(te&&(te.attributes.id.value==id||te.id==id)){
 return te;
 }else{
-var _5=_d.all[id];
-if(!_5||_5.nodeName){
-_5=[_5];
+var _3=_2.all[id];
+if(!_3||_3.nodeName){
+_3=[_3];
 }
 var i=0;
-while((te=_5[i++])){
+while((te=_3[i++])){
 if((te.attributes&&te.attributes.id&&te.attributes.id.value==id)||te.id==id){
 return te;
 }
 }
 }
-}else{
-return id;
-}
 };
 }else{
-dojo.byId=function(id,_8){
-return dojo.isString(id)?(_8||dojo.doc).getElementById(id):id;
+dojo.byId=function(id,_4){
+return (typeof id=="string")?(_4||dojo.doc).getElementById(id):id;
 };
 }
 (function(){
 var d=dojo;
-var _a=null;
+var _5=d.byId;
+var _6=null,_7;
 d.addOnWindowUnload(function(){
-_a=null;
+_6=null;
 });
-dojo._destroyElement=dojo.destroy=function(_b){
-_b=d.byId(_b);
+dojo._destroyElement=dojo.destroy=function(_8){
+_8=_5(_8);
 try{
-if(!_a||_a.ownerDocument!=_b.ownerDocument){
-_a=_b.ownerDocument.createElement("div");
+var _9=_8.ownerDocument;
+if(!_6||_7!=_9){
+_6=_9.createElement("div");
+_7=_9;
 }
-_a.appendChild(_b.parentNode?_b.parentNode.removeChild(_b):_b);
-_a.innerHTML="";
+_6.appendChild(_8.parentNode?_8.parentNode.removeChild(_8):_8);
+_6.innerHTML="";
 }
 catch(e){
 }
 };
-dojo.isDescendant=function(_c,_d){
+dojo.isDescendant=function(_a,_b){
 try{
-_c=d.byId(_c);
-_d=d.byId(_d);
-while(_c){
-if(_c===_d){
+_a=_5(_a);
+_b=_5(_b);
+while(_a){
+if(_a==_b){
 return true;
 }
-_c=_c.parentNode;
+_a=_a.parentNode;
 }
 }
 catch(e){
 }
 return false;
 };
-dojo.setSelectable=function(_e,_f){
-_e=d.byId(_e);
+dojo.setSelectable=function(_c,_d){
+_c=_5(_c);
 if(d.isMozilla){
-_e.style.MozUserSelect=_f?"":"none";
+_c.style.MozUserSelect=_d?"":"none";
 }else{
 if(d.isKhtml||d.isWebKit){
-_e.style.KhtmlUserSelect=_f?"auto":"none";
+_c.style.KhtmlUserSelect=_d?"auto":"none";
 }else{
 if(d.isIE){
-var v=(_e.unselectable=_f?"":"on");
-d.query("*",_e).forEach("item.unselectable = '"+v+"'");
+var v=(_c.unselectable=_d?"":"on");
+d.query("*",_c).forEach("item.unselectable = '"+v+"'");
 }
 }
 }
 };
-var _11=function(_12,ref){
-var _14=ref.parentNode;
-if(_14){
-_14.insertBefore(_12,ref);
+var _e=function(_f,ref){
+var _10=ref.parentNode;
+if(_10){
+_10.insertBefore(_f,ref);
 }
 };
-var _15=function(_16,ref){
-var _18=ref.parentNode;
-if(_18){
-if(_18.lastChild==ref){
-_18.appendChild(_16);
+var _11=function(_12,ref){
+var _13=ref.parentNode;
+if(_13){
+if(_13.lastChild==ref){
+_13.appendChild(_12);
 }else{
-_18.insertBefore(_16,ref.nextSibling);
+_13.insertBefore(_12,ref.nextSibling);
 }
 }
 };
-dojo.place=function(_19,_1a,_1b){
-_1a=d.byId(_1a);
-if(d.isString(_19)){
-_19=_19.charAt(0)=="<"?d._toDom(_19,_1a.ownerDocument):d.byId(_19);
+dojo.place=function(_14,_15,_16){
+_15=_5(_15);
+if(typeof _14=="string"){
+_14=_14.charAt(0)=="<"?d._toDom(_14,_15.ownerDocument):_5(_14);
 }
-if(typeof _1b=="number"){
-var cn=_1a.childNodes;
-if(!cn.length||cn.length<=_1b){
-_1a.appendChild(_19);
+if(typeof _16=="number"){
+var cn=_15.childNodes;
+if(!cn.length||cn.length<=_16){
+_15.appendChild(_14);
 }else{
-_11(_19,cn[_1b<0?0:_1b]);
+_e(_14,cn[_16<0?0:_16]);
 }
 }else{
-switch(_1b){
+switch(_16){
 case "before":
-_11(_19,_1a);
+_e(_14,_15);
 break;
 case "after":
-_15(_19,_1a);
+_11(_14,_15);
 break;
 case "replace":
-_1a.parentNode.replaceChild(_19,_1a);
+_15.parentNode.replaceChild(_14,_15);
 break;
 case "only":
-d.empty(_1a);
-_1a.appendChild(_19);
+d.empty(_15);
+_15.appendChild(_14);
 break;
 case "first":
-if(_1a.firstChild){
-_11(_19,_1a.firstChild);
+if(_15.firstChild){
+_e(_14,_15.firstChild);
 break;
 }
 default:
-_1a.appendChild(_19);
+_15.appendChild(_14);
 }
 }
-return _19;
+return _14;
 };
 dojo.boxModel="content-box";
 if(d.isIE){
-var _1d=document.compatMode;
-d.boxModel=_1d=="BackCompat"||_1d=="QuirksMode"||d.isIE<6?"border-box":"content-box";
+d.boxModel=document.compatMode=="BackCompat"?"border-box":"content-box";
 }
 var gcs;
 if(d.isWebKit){
-gcs=function(_1f){
+gcs=function(_17){
 var s;
-if(_1f.nodeType==1){
-var dv=_1f.ownerDocument.defaultView;
-s=dv.getComputedStyle(_1f,null);
-if(!s&&_1f.style){
-_1f.style.display="";
-s=dv.getComputedStyle(_1f,null);
+if(_17.nodeType==1){
+var dv=_17.ownerDocument.defaultView;
+s=dv.getComputedStyle(_17,null);
+if(!s&&_17.style){
+_17.style.display="";
+s=dv.getComputedStyle(_17,null);
 }
 }
 return s||{};
 };
 }else{
 if(d.isIE){
-gcs=function(_22){
-return _22.nodeType==1?_22.currentStyle:{};
+gcs=function(_18){
+return _18.nodeType==1?_18.currentStyle:{};
 };
 }else{
-gcs=function(_23){
-return _23.nodeType==1?_23.ownerDocument.defaultView.getComputedStyle(_23,null):{};
+gcs=function(_19){
+return _19.nodeType==1?_19.ownerDocument.defaultView.getComputedStyle(_19,null):{};
 };
 }
 }
 dojo.getComputedStyle=gcs;
 if(!d.isIE){
-d._toPixelValue=function(_24,_25){
-return parseFloat(_25)||0;
+d._toPixelValue=function(_1a,_1b){
+return parseFloat(_1b)||0;
 };
 }else{
-d._toPixelValue=function(_26,_27){
-if(!_27){
+d._toPixelValue=function(_1c,_1d){
+if(!_1d){
 return 0;
 }
-if(_27=="medium"){
+if(_1d=="medium"){
 return 4;
 }
-if(_27.slice&&_27.slice(-2)=="px"){
-return parseFloat(_27);
+if(_1d.slice&&_1d.slice(-2)=="px"){
+return parseFloat(_1d);
 }
-with(_26){
-var _28=style.left;
-var _29=runtimeStyle.left;
+with(_1c){
+var _1e=style.left;
+var _1f=runtimeStyle.left;
 runtimeStyle.left=currentStyle.left;
 try{
-style.left=_27;
-_27=style.pixelLeft;
+style.left=_1d;
+_1d=style.pixelLeft;
 }
 catch(e){
-_27=0;
+_1d=0;
 }
-style.left=_28;
-runtimeStyle.left=_29;
+style.left=_1e;
+runtimeStyle.left=_1f;
 }
-return _27;
+return _1d;
 };
 }
 var px=d._toPixelValue;
-var _2b="DXImageTransform.Microsoft.Alpha";
+var _20="DXImageTransform.Microsoft.Alpha";
 var af=function(n,f){
 try{
-return n.filters.item(_2b);
+return n.filters.item(_20);
 }
 catch(e){
 return f?{}:null;
 }
 };
-dojo._getOpacity=d.isIE?function(_2f){
+dojo._getOpacity=d.isIE?function(_21){
 try{
-return af(_2f).Opacity/100;
+return af(_21).Opacity/100;
 }
 catch(e){
 return 1;
 }
-}:function(_30){
-return gcs(_30).opacity;
+}:function(_22){
+return gcs(_22).opacity;
 };
-dojo._setOpacity=d.isIE?function(_31,_32){
-var ov=_32*100;
-_31.style.zoom=1;
-af(_31,1).Enabled=!(_32==1);
-if(!af(_31)){
-_31.style.filter+=" progid:"+_2b+"(Opacity="+ov+")";
+dojo._setOpacity=d.isIE?function(_23,_24){
+var ov=_24*100;
+_23.style.zoom=1;
+af(_23,1).Enabled=!(_24==1);
+if(!af(_23)){
+_23.style.filter+=" progid:"+_20+"(Opacity="+ov+")";
 }else{
-af(_31,1).Opacity=ov;
+af(_23,1).Opacity=ov;
 }
-if(_31.nodeName.toLowerCase()=="tr"){
-d.query("> td",_31).forEach(function(i){
-d._setOpacity(i,_32);
+if(_23.nodeName.toLowerCase()=="tr"){
+d.query("> td",_23).forEach(function(i){
+d._setOpacity(i,_24);
 });
 }
-return _32;
-}:function(_35,_36){
-return _35.style.opacity=_36;
+return _24;
+}:function(_25,_26){
+return _25.style.opacity=_26;
 };
-var _37={left:true,top:true};
-var _38=/margin|padding|width|height|max|min|offset/;
-var _39=function(_3a,_3b,_3c){
-_3b=_3b.toLowerCase();
+var _27={left:true,top:true};
+var _28=/margin|padding|width|height|max|min|offset/;
+var _29=function(_2a,_2b,_2c){
+_2b=_2b.toLowerCase();
 if(d.isIE){
-if(_3c=="auto"){
-if(_3b=="height"){
-return _3a.offsetHeight;
+if(_2c=="auto"){
+if(_2b=="height"){
+return _2a.offsetHeight;
 }
-if(_3b=="width"){
-return _3a.offsetWidth;
+if(_2b=="width"){
+return _2a.offsetWidth;
 }
 }
-if(_3b=="fontweight"){
-switch(_3c){
+if(_2b=="fontweight"){
+switch(_2c){
 case 700:
 return "bold";
 case 400:
@@ -268,52 +268,52 @@ return "normal";
 }
 }
 }
-if(!(_3b in _37)){
-_37[_3b]=_38.test(_3b);
+if(!(_2b in _27)){
+_27[_2b]=_28.test(_2b);
 }
-return _37[_3b]?px(_3a,_3c):_3c;
+return _27[_2b]?px(_2a,_2c):_2c;
 };
-var _3d=d.isIE?"styleFloat":"cssFloat",_3e={"cssFloat":_3d,"styleFloat":_3d,"float":_3d};
-dojo.style=function(_3f,_40,_41){
-var n=d.byId(_3f),_43=arguments.length,op=(_40=="opacity");
-_40=_3e[_40]||_40;
-if(_43==3){
-return op?d._setOpacity(n,_41):n.style[_40]=_41;
+var _2d=d.isIE?"styleFloat":"cssFloat",_2e={"cssFloat":_2d,"styleFloat":_2d,"float":_2d};
+dojo.style=function(_2f,_30,_31){
+var n=_5(_2f),_32=arguments.length,op=(_30=="opacity");
+_30=_2e[_30]||_30;
+if(_32==3){
+return op?d._setOpacity(n,_31):n.style[_30]=_31;
 }
-if(_43==2&&op){
+if(_32==2&&op){
 return d._getOpacity(n);
 }
 var s=gcs(n);
-if(_43==2&&!d.isString(_40)){
-for(var x in _40){
-d.style(_3f,x,_40[x]);
+if(_32==2&&typeof _30!="string"){
+for(var x in _30){
+d.style(_2f,x,_30[x]);
 }
 return s;
 }
-return (_43==1)?s:_39(n,_40,s[_40]||n.style[_40]);
+return (_32==1)?s:_29(n,_30,s[_30]||n.style[_30]);
 };
-dojo._getPadExtents=function(n,_48){
-var s=_48||gcs(n),l=px(n,s.paddingLeft),t=px(n,s.paddingTop);
+dojo._getPadExtents=function(n,_33){
+var s=_33||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,_4d){
-var ne="none",s=_4d||gcs(n),bl=(s.borderLeftStyle!=ne?px(n,s.borderLeftWidth):0),bt=(s.borderTopStyle!=ne?px(n,s.borderTopWidth):0);
+dojo._getBorderExtents=function(n,_34){
+var ne="none",s=_34||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,_53){
-var s=_53||gcs(n),p=d._getPadExtents(n,s),b=d._getBorderExtents(n,s);
+dojo._getPadBorderExtents=function(n,_35){
+var s=_35||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,_58){
-var s=_58||gcs(n),l=px(n,s.marginLeft),t=px(n,s.marginTop),r=px(n,s.marginRight),b=px(n,s.marginBottom);
+dojo._getMarginExtents=function(n,_36){
+var s=_36||gcs(n),l=px(n,s.marginLeft),t=px(n,s.marginTop),r=px(n,s.marginRight),b=px(n,s.marginBottom);
 if(d.isWebKit&&(s.position!="absolute")){
 r=l;
 }
 return {l:l,t:t,w:l+r,h:t+b};
 };
-dojo._getMarginBox=function(_5e,_5f){
-var s=_5f||gcs(_5e),me=d._getMarginExtents(_5e,s);
-var l=_5e.offsetLeft-me.l,t=_5e.offsetTop-me.t,p=_5e.parentNode;
+dojo._getMarginBox=function(_37,_38){
+var s=_38||gcs(_37),me=d._getMarginExtents(_37,s);
+var l=_37.offsetLeft-me.l,t=_37.offsetTop-me.t,p=_37.parentNode;
 if(d.isMoz){
 var sl=parseFloat(s.left),st=parseFloat(s.top);
 if(!isNaN(sl)&&!isNaN(st)){
@@ -336,14 +336,14 @@ t-=be.t;
 }
 }
 }
-return {l:l,t:t,w:_5e.offsetWidth+me.w,h:_5e.offsetHeight+me.h};
+return {l:l,t:t,w:_37.offsetWidth+me.w,h:_37.offsetHeight+me.h};
 };
-dojo._getContentBox=function(_69,_6a){
-var s=_6a||gcs(_69),pe=d._getPadExtents(_69,s),be=d._getBorderExtents(_69,s),w=_69.clientWidth,h;
+dojo._getContentBox=function(_39,_3a){
+var s=_3a||gcs(_39),pe=d._getPadExtents(_39,s),be=d._getBorderExtents(_39,s),w=_39.clientWidth,h;
 if(!w){
-w=_69.offsetWidth,h=_69.offsetHeight;
+w=_39.offsetWidth,h=_39.offsetHeight;
 }else{
-h=_69.clientHeight,be.w=be.h=0;
+h=_39.clientHeight,be.w=be.h=0;
 }
 if(d.isOpera){
 pe.l+=be.l;
@@ -351,13 +351,13 @@ 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(_70,_71){
-var s=_71||gcs(_70),pe=d._getPadExtents(_70,s),cb=d._getContentBox(_70,s);
+dojo._getBorderBox=function(_3b,_3c){
+var s=_3c||gcs(_3b),pe=d._getPadExtents(_3b,s),cb=d._getContentBox(_3b,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(_75,l,t,w,h,u){
+dojo._setBox=function(_3d,l,t,w,h,u){
 u=u||"px";
-var s=_75.style;
+var s=_3d.style;
 if(!isNaN(l)){
 s.left=l+u;
 }
@@ -371,345 +371,372 @@ if(h>=0){
 s.height=h+u;
 }
 };
-dojo._isButtonTag=function(_7c){
-return _7c.tagName=="BUTTON"||_7c.tagName=="INPUT"&&_7c.getAttribute("type").toUpperCase()=="BUTTON";
+dojo._isButtonTag=function(_3e){
+return _3e.tagName=="BUTTON"||_3e.tagName=="INPUT"&&(_3e.getAttribute("type")||"").toUpperCase()=="BUTTON";
 };
-dojo._usesBorderBox=function(_7d){
-var n=_7d.tagName;
-return d.boxModel=="border-box"||n=="TABLE"||d._isButtonTag(_7d);
+dojo._usesBorderBox=function(_3f){
+var n=_3f.tagName;
+return d.boxModel=="border-box"||n=="TABLE"||d._isButtonTag(_3f);
 };
-dojo._setContentSize=function(_7f,_80,_81,_82){
-if(d._usesBorderBox(_7f)){
-var pb=d._getPadBorderExtents(_7f,_82);
-if(_80>=0){
-_80+=pb.w;
+dojo._setContentSize=function(_40,_41,_42,_43){
+if(d._usesBorderBox(_40)){
+var pb=d._getPadBorderExtents(_40,_43);
+if(_41>=0){
+_41+=pb.w;
 }
-if(_81>=0){
-_81+=pb.h;
+if(_42>=0){
+_42+=pb.h;
 }
 }
-d._setBox(_7f,NaN,NaN,_80,_81);
+d._setBox(_40,NaN,NaN,_41,_42);
 };
-dojo._setMarginBox=function(_84,_85,_86,_87,_88,_89){
-var s=_89||gcs(_84),bb=d._usesBorderBox(_84),pb=bb?_8d:d._getPadBorderExtents(_84,s);
+dojo._setMarginBox=function(_44,_45,_46,_47,_48,_49){
+var s=_49||gcs(_44),bb=d._usesBorderBox(_44),pb=bb?_4a:d._getPadBorderExtents(_44,s);
 if(d.isWebKit){
-if(d._isButtonTag(_84)){
-var ns=_84.style;
-if(_87>=0&&!ns.width){
+if(d._isButtonTag(_44)){
+var ns=_44.style;
+if(_47>=0&&!ns.width){
 ns.width="4px";
 }
-if(_88>=0&&!ns.height){
+if(_48>=0&&!ns.height){
 ns.height="4px";
 }
 }
 }
-var mb=d._getMarginExtents(_84,s);
-if(_87>=0){
-_87=Math.max(_87-pb.w-mb.w,0);
+var mb=d._getMarginExtents(_44,s);
+if(_47>=0){
+_47=Math.max(_47-pb.w-mb.w,0);
 }
-if(_88>=0){
-_88=Math.max(_88-pb.h-mb.h,0);
+if(_48>=0){
+_48=Math.max(_48-pb.h-mb.h,0);
 }
-d._setBox(_84,_85,_86,_87,_88);
+d._setBox(_44,_45,_46,_47,_48);
 };
-var _8d={l:0,t:0,w:0,h:0};
-dojo.marginBox=function(_90,box){
-var n=d.byId(_90),s=gcs(n),b=box;
+var _4a={l:0,t:0,w:0,h:0};
+dojo.marginBox=function(_4b,box){
+var n=_5(_4b),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(_95,box){
-var n=d.byId(_95),s=gcs(n),b=box;
+dojo.contentBox=function(_4c,box){
+var n=_5(_4c),s=gcs(n),b=box;
 return !b?d._getContentBox(n,s):d._setContentSize(n,b.w,b.h,s);
 };
-var _9a=function(_9b,_9c){
-if(!(_9b=(_9b||0).parentNode)){
+var _4d=function(_4e,_4f){
+if(!(_4e=(_4e||0).parentNode)){
 return 0;
 }
-var val,_9e=0,_b=d.body();
-while(_9b&&_9b.style){
-if(gcs(_9b).position=="fixed"){
+var val,_50=0,_51=d.body();
+while(_4e&&_4e.style){
+if(gcs(_4e).position=="fixed"){
 return 0;
 }
-val=_9b[_9c];
+val=_4e[_4f];
 if(val){
-_9e+=val-0;
-if(_9b==_b){
+_50+=val-0;
+if(_4e==_51){
 break;
 }
 }
-_9b=_9b.parentNode;
+_4e=_4e.parentNode;
 }
-return _9e;
+return _50;
 };
 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)};
+var n=d.global;
+return "pageXOffset" in n?{x:n.pageXOffset,y:n.pageYOffset}:(n=d.doc.documentElement,n.clientHeight?{x:d._fixIeBiDiScrollLeft(n.scrollLeft),y:n.scrollTop}:(n=d.body(),{x:n.scrollLeft||0,y:n.scrollTop||0}));
 };
 dojo._isBodyLtr=function(){
-return ("_bodyLtr" in d)?d._bodyLtr:d._bodyLtr=gcs(d.body()).direction=="ltr";
+return "_bodyLtr" in d?d._bodyLtr:d._bodyLtr=(d.body().dir||d.doc.documentElement.dir||"ltr").toLowerCase()=="ltr";
 };
 dojo._getIeDocumentElementOffset=function(){
 var de=d.doc.documentElement;
-if(d.isIE<7){
-return {x:d._isBodyLtr()||window.parent==window?de.clientLeft:de.offsetWidth-de.clientWidth-de.clientLeft,y:de.clientTop};
-}else{
 if(d.isIE<8){
-return {x:de.getBoundingClientRect().left,y:de.getBoundingClientRect().top};
+var r=de.getBoundingClientRect();
+var l=r.left,t=r.top;
+if(d.isIE<7){
+l+=de.clientLeft;
+t+=de.clientTop;
+}
+return {x:l<0?0:l,y:t<0?0:t};
 }else{
 return {x:0,y:0};
 }
-}
 };
-dojo._fixIeBiDiScrollLeft=function(_a4){
+dojo._fixIeBiDiScrollLeft=function(_52){
 var dd=d.doc;
 if(d.isIE<8&&!d._isBodyLtr()){
-var de=dd.compatMode=="BackCompat"?dd.body:dd.documentElement;
-return _a4+de.clientWidth-de.scrollWidth;
+var de=d.isQuirks?dd.body:dd.documentElement;
+return _52+de.clientWidth-de.scrollWidth;
 }
-return _a4;
+return _52;
 };
-dojo._abs=function(_a7,_a8){
-var db=d.body(),dh=d.body().parentNode,ret;
-if(_a7["getBoundingClientRect"]){
-var _ac=_a7.getBoundingClientRect();
-ret={x:_ac.left,y:_ac.top};
-if(d.isFF>=3){
+dojo._abs=dojo.position=function(_53,_54){
+var db=d.body(),dh=db.parentNode,ret;
+_53=_5(_53);
+if(_53["getBoundingClientRect"]){
+ret=_53.getBoundingClientRect();
+ret={x:ret.left,y:ret.top,w:ret.right-ret.left,h:ret.bottom-ret.top};
+if(d.isIE){
+var _55=d._getIeDocumentElementOffset();
+ret.x-=_55.x+(d.isQuirks?db.clientLeft+db.offsetLeft:0);
+ret.y-=_55.y+(d.isQuirks?db.clientTop+db.offsetTop:0);
+}else{
+if(d.isFF==3){
 var cs=gcs(dh);
 ret.x-=px(dh,cs.marginLeft)+px(dh,cs.borderLeftWidth);
 ret.y-=px(dh,cs.marginTop)+px(dh,cs.borderTopWidth);
 }
-if(d.isIE){
-var _ae=d._getIeDocumentElementOffset();
-ret.x-=_ae.x+(d.isQuirks?db.clientLeft:0);
-ret.y-=_ae.y+(d.isQuirks?db.clientTop:0);
 }
 }else{
-ret={x:0,y:0};
-if(_a7["offsetParent"]){
-ret.x-=_9a(_a7,"scrollLeft");
-ret.y-=_9a(_a7,"scrollTop");
-var _af=_a7;
+ret={x:0,y:0,w:_53.offsetWidth,h:_53.offsetHeight};
+if(_53["offsetParent"]){
+ret.x-=_4d(_53,"scrollLeft");
+ret.y-=_4d(_53,"scrollTop");
+var _56=_53;
 do{
-var n=_af.offsetLeft,t=_af.offsetTop;
+var n=_56.offsetLeft,t=_56.offsetTop;
 ret.x+=isNaN(n)?0:n;
 ret.y+=isNaN(t)?0:t;
-cs=gcs(_af);
-if(_af!=_a7){
-if(d.isFF){
-ret.x+=2*px(_af,cs.borderLeftWidth);
-ret.y+=2*px(_af,cs.borderTopWidth);
+cs=gcs(_56);
+if(_56!=_53){
+if(d.isMoz){
+ret.x+=2*px(_56,cs.borderLeftWidth);
+ret.y+=2*px(_56,cs.borderTopWidth);
 }else{
-ret.x+=px(_af,cs.borderLeftWidth);
-ret.y+=px(_af,cs.borderTopWidth);
+ret.x+=px(_56,cs.borderLeftWidth);
+ret.y+=px(_56,cs.borderTopWidth);
 }
 }
-if(d.isFF&&cs.position=="static"){
-var _b2=_af.parentNode;
-while(_b2!=_af.offsetParent){
-var pcs=gcs(_b2);
+if(d.isMoz&&cs.position=="static"){
+var _57=_56.parentNode;
+while(_57!=_56.offsetParent){
+var pcs=gcs(_57);
 if(pcs.position=="static"){
-ret.x+=px(_af,pcs.borderLeftWidth);
-ret.y+=px(_af,pcs.borderTopWidth);
+ret.x+=px(_56,pcs.borderLeftWidth);
+ret.y+=px(_56,pcs.borderTopWidth);
 }
-_b2=_b2.parentNode;
+_57=_57.parentNode;
 }
 }
-_af=_af.offsetParent;
-}while((_af!=dh)&&_af);
+_56=_56.offsetParent;
+}while((_56!=dh)&&_56);
 }else{
-if(_a7.x&&_a7.y){
-ret.x+=isNaN(_a7.x)?0:_a7.x;
-ret.y+=isNaN(_a7.y)?0:_a7.y;
+if(_53.x&&_53.y){
+ret.x+=isNaN(_53.x)?0:_53.x;
+ret.y+=isNaN(_53.y)?0:_53.y;
 }
 }
 }
-if(_a8){
-var _b4=d._docScroll();
-ret.x+=_b4.x;
-ret.y+=_b4.y;
+if(_54){
+var _58=d._docScroll();
+ret.x+=_58.x;
+ret.y+=_58.y;
 }
 return ret;
 };
-dojo.coords=function(_b5,_b6){
-var n=d.byId(_b5),s=gcs(n),mb=d._getMarginBox(n,s);
-var abs=d._abs(n,_b6);
+dojo.coords=function(_59,_5a){
+var n=_5(_59),s=gcs(n),mb=d._getMarginBox(n,s);
+var abs=d.position(n,_5a);
 mb.x=abs.x;
 mb.y=abs.y;
 return mb;
 };
-var _bb=d.isIE<8;
-var _bc=function(_bd){
-switch(_bd.toLowerCase()){
-case "tabindex":
-return _bb?"tabIndex":"tabindex";
-case "readonly":
-return "readOnly";
-case "class":
-return "className";
-case "for":
-case "htmlfor":
-return _bb?"htmlFor":"for";
-default:
-return _bd;
-}
-};
-var _be={colspan:"colSpan",enctype:"enctype",frameborder:"frameborder",method:"method",rowspan:"rowSpan",scrolling:"scrolling",shape:"shape",span:"span",type:"type",valuetype:"valueType",classname:"className",innerhtml:"innerHTML"};
-dojo.hasAttr=function(_bf,_c0){
-_bf=d.byId(_bf);
-var _c1=_bc(_c0);
-_c1=_c1=="htmlFor"?"for":_c1;
-var _c2=_bf.getAttributeNode&&_bf.getAttributeNode(_c1);
-return _c2?_c2.specified:false;
-};
-var _c3={},_c4=0,_c5=dojo._scopeName+"attrid",_c6={col:1,colgroup:1,table:1,tbody:1,tfoot:1,thead:1,tr:1,title:1};
-dojo.attr=function(_c7,_c8,_c9){
-_c7=d.byId(_c7);
-var _ca=arguments.length;
-if(_ca==2&&!d.isString(_c8)){
-for(var x in _c8){
-d.attr(_c7,x,_c8[x]);
-}
-return;
-}
-_c8=_bc(_c8);
-if(_ca==3){
-if(d.isFunction(_c9)){
-var _cc=d.attr(_c7,_c5);
-if(!_cc){
-_cc=_c4++;
-d.attr(_c7,_c5,_cc);
-}
-if(!_c3[_cc]){
-_c3[_cc]={};
-}
-var h=_c3[_cc][_c8];
-if(h){
-d.disconnect(h);
-}else{
-try{
-delete _c7[_c8];
+var _5b={"class":"className","for":"htmlFor",tabindex:"tabIndex",readonly:"readOnly",colspan:"colSpan",frameborder:"frameBorder",rowspan:"rowSpan",valuetype:"valueType"},_5c={classname:"class",htmlfor:"for",tabindex:"tabIndex",readonly:"readOnly"},_5d={innerHTML:1,className:1,htmlFor:d.isIE,value:1};
+var _5e=function(_5f){
+return _5c[_5f.toLowerCase()]||_5f;
+};
+var _60=function(_61,_62){
+var _63=_61.getAttributeNode&&_61.getAttributeNode(_62);
+return _63&&_63.specified;
+};
+dojo.hasAttr=function(_64,_65){
+var lc=_65.toLowerCase();
+return _5d[_5b[lc]||_65]||_60(_5(_64),_5c[lc]||_65);
+};
+var _66={},_67=0,_68=dojo._scopeName+"attrid",_69={col:1,colgroup:1,table:1,tbody:1,tfoot:1,thead:1,tr:1,title:1};
+dojo.attr=function(_6a,_6b,_6c){
+_6a=_5(_6a);
+var _6d=arguments.length,_6e;
+if(_6d==2&&typeof _6b!="string"){
+for(var x in _6b){
+d.attr(_6a,x,_6b[x]);
 }
-catch(e){
+return _6a;
 }
+var lc=_6b.toLowerCase(),_6f=_5b[lc]||_6b,_70=_5d[_6f],_71=_5c[lc]||_6b;
+if(_6d==3){
+do{
+if(_6f=="style"&&typeof _6c!="string"){
+d.style(_6a,_6c);
+break;
 }
-_c3[_cc][_c8]=d.connect(_c7,_c8,_c9);
+if(_6f=="innerHTML"){
+if(d.isIE&&_6a.tagName.toLowerCase() in _69){
+d.empty(_6a);
+_6a.appendChild(d._toDom(_6c,_6a.ownerDocument));
 }else{
-if(typeof _c9=="boolean"){
-_c7[_c8]=_c9;
-}else{
-if(_c8==="style"&&!d.isString(_c9)){
-d.style(_c7,_c9);
-}else{
-if(_c8=="className"){
-_c7.className=_c9;
-}else{
-if(_c8==="innerHTML"){
-if(d.isIE&&_c7.tagName.toLowerCase() in _c6){
-d.empty(_c7);
-_c7.appendChild(d._toDom(_c9,_c7.ownerDocument));
-}else{
-_c7[_c8]=_c9;
+_6a[_6f]=_6c;
+}
+break;
+}
+if(d.isFunction(_6c)){
+var _72=d.attr(_6a,_68);
+if(!_72){
+_72=_67++;
+d.attr(_6a,_68,_72);
 }
+if(!_66[_72]){
+_66[_72]={};
+}
+var h=_66[_72][_6f];
+if(h){
+d.disconnect(h);
 }else{
-_c7.setAttribute(_c8,_c9);
+try{
+delete _6a[_6f];
 }
+catch(e){
 }
 }
+_66[_72][_6f]=d.connect(_6a,_6f,_6c);
+break;
 }
+if(_70||typeof _6c=="boolean"){
+_6a[_6f]=_6c;
+break;
 }
-}else{
-var _ce=_be[_c8.toLowerCase()];
-if(_ce){
-return _c7[_ce];
+_6a.setAttribute(_71,_6c);
+}while(false);
+return _6a;
+}
+_6c=_6a[_6f];
+if(_70&&typeof _6c!="undefined"){
+return _6c;
 }
-var _cf=_c7[_c8];
-return (typeof _cf=="boolean"||typeof _cf=="function")?_cf:(d.hasAttr(_c7,_c8)?_c7.getAttribute(_c8):null);
+if(_6f!="href"&&(typeof _6c=="boolean"||d.isFunction(_6c))){
+return _6c;
 }
+return _60(_6a,_71)?_6a.getAttribute(_71):null;
 };
-dojo.removeAttr=function(_d0,_d1){
-d.byId(_d0).removeAttribute(_bc(_d1));
+dojo.removeAttr=function(_73,_74){
+_5(_73).removeAttribute(_5e(_74));
+};
+dojo.getNodeProp=function(_75,_76){
+_75=_5(_75);
+var lc=_76.toLowerCase(),_77=_5b[lc]||_76;
+if((_77 in _75)&&_77!="href"){
+return _75[_77];
+}
+var _78=_5c[lc]||_76;
+return _60(_75,_78)?_75.getAttribute(_78):null;
 };
-dojo.create=function(tag,_d3,_d4,pos){
+dojo.create=function(tag,_79,_7a,pos){
 var doc=d.doc;
-if(_d4){
-_d4=d.byId(_d4);
-doc=_d4.ownerDocument;
+if(_7a){
+_7a=_5(_7a);
+doc=_7a.ownerDocument;
 }
-if(d.isString(tag)){
+if(typeof tag=="string"){
 tag=doc.createElement(tag);
 }
-if(_d3){
-d.attr(tag,_d3);
+if(_79){
+d.attr(tag,_79);
 }
-if(_d4){
-d.place(tag,_d4,pos);
+if(_7a){
+d.place(tag,_7a,pos);
 }
 return tag;
 };
-d.empty=d.isIE?function(_d7){
-_d7=d.byId(_d7);
-for(var c;c=_d7.lastChild;){
+d.empty=d.isIE?function(_7b){
+_7b=_5(_7b);
+for(var c;c=_7b.lastChild;){
 d.destroy(c);
 }
-}:function(_d9){
-d.byId(_d9).innerHTML="";
+}:function(_7c){
+_5(_7c).innerHTML="";
 };
-var _da={option:["select"],tbody:["table"],thead:["table"],tfoot:["table"],tr:["table","tbody"],td:["table","tbody","tr"],th:["table","thead","tr"],legend:["fieldset"],caption:["table"],colgroup:["table"],col:["table","colgroup"],li:["ul"]},_db=/<\s*([\w\:]+)/,_dc={},_dd=0,_de="__"+d._scopeName+"ToDomId";
-for(var _df in _da){
-var tw=_da[_df];
-tw.pre=_df=="option"?"<select multiple=\"multiple\">":"<"+tw.join("><")+">";
+var _7d={option:["select"],tbody:["table"],thead:["table"],tfoot:["table"],tr:["table","tbody"],td:["table","tbody","tr"],th:["table","thead","tr"],legend:["fieldset"],caption:["table"],colgroup:["table"],col:["table","colgroup"],li:["ul"]},_7e=/<\s*([\w\:]+)/,_7f={},_80=0,_81="__"+d._scopeName+"ToDomId";
+for(var _82 in _7d){
+var tw=_7d[_82];
+tw.pre=_82=="option"?"<select multiple=\"multiple\">":"<"+tw.join("><")+">";
 tw.post="</"+tw.reverse().join("></")+">";
 }
-d._toDom=function(_e1,doc){
+d._toDom=function(_83,doc){
 doc=doc||d.doc;
-var _e3=doc[_de];
-if(!_e3){
-doc[_de]=_e3=++_dd+"";
-_dc[_e3]=doc.createElement("div");
-}
-_e1+="";
-var _e4=_e1.match(_db),tag=_e4?_e4[1].toLowerCase():"",_e6=_dc[_e3],_e7,i,fc,df;
-if(_e4&&_da[tag]){
-_e7=_da[tag];
-_e6.innerHTML=_e7.pre+_e1+_e7.post;
-for(i=_e7.length;i;--i){
-_e6=_e6.firstChild;
+var _84=doc[_81];
+if(!_84){
+doc[_81]=_84=++_80+"";
+_7f[_84]=doc.createElement("div");
+}
+_83+="";
+var _85=_83.match(_7e),tag=_85?_85[1].toLowerCase():"",_86=_7f[_84],_87,i,fc,df;
+if(_85&&_7d[tag]){
+_87=_7d[tag];
+_86.innerHTML=_87.pre+_83+_87.post;
+for(i=_87.length;i;--i){
+_86=_86.firstChild;
 }
 }else{
-_e6.innerHTML=_e1;
+_86.innerHTML=_83;
 }
-if(_e6.childNodes.length==1){
-return _e6.removeChild(_e6.firstChild);
+if(_86.childNodes.length==1){
+return _86.removeChild(_86.firstChild);
 }
 df=doc.createDocumentFragment();
-while(fc=_e6.firstChild){
+while(fc=_86.firstChild){
 df.appendChild(fc);
 }
 return df;
 };
-var _eb="className";
-dojo.hasClass=function(_ec,_ed){
-return ((" "+d.byId(_ec)[_eb]+" ").indexOf(" "+_ed+" ")>=0);
+var _88="className";
+dojo.hasClass=function(_89,_8a){
+return ((" "+_5(_89)[_88]+" ").indexOf(" "+_8a+" ")>=0);
 };
-dojo.addClass=function(_ee,_ef){
-_ee=d.byId(_ee);
-var cls=_ee[_eb];
-if((" "+cls+" ").indexOf(" "+_ef+" ")<0){
-_ee[_eb]=cls+(cls?" ":"")+_ef;
+var _8b=/\s+/,a1=[""],_8c=function(s){
+if(typeof s=="string"||s instanceof String){
+if(s.indexOf(" ")<0){
+a1[0]=s;
+return a1;
+}else{
+return s.split(_8b);
+}
 }
+return s;
 };
-dojo.removeClass=function(_f1,_f2){
-_f1=d.byId(_f1);
-var t=d.trim((" "+_f1[_eb]+" ").replace(" "+_f2+" "," "));
-if(_f1[_eb]!=t){
-_f1[_eb]=t;
+dojo.addClass=function(_8d,_8e){
+_8d=_5(_8d);
+_8e=_8c(_8e);
+var cls=" "+_8d[_88]+" ";
+for(var i=0,len=_8e.length,c;i<len;++i){
+c=_8e[i];
+if(c&&cls.indexOf(" "+c+" ")<0){
+cls+=c+" ";
+}
+}
+_8d[_88]=d.trim(cls);
+};
+dojo.removeClass=function(_8f,_90){
+_8f=_5(_8f);
+var cls;
+if(_90!==undefined){
+_90=_8c(_90);
+cls=" "+_8f[_88]+" ";
+for(var i=0,len=_90.length;i<len;++i){
+cls=cls.replace(" "+_90[i]+" "," ");
+}
+cls=d.trim(cls);
+}else{
+cls="";
+}
+if(_8f[_88]!=cls){
+_8f[_88]=cls;
 }
 };
-dojo.toggleClass=function(_f4,_f5,_f6){
-if(_f6===undefined){
-_f6=!d.hasClass(_f4,_f5);
+dojo.toggleClass=function(_91,_92,_93){
+if(_93===undefined){
+_93=!d.hasClass(_91,_92);
 }
-d[_f6?"addClass":"removeClass"](_f4,_f5);
+d[_93?"addClass":"removeClass"](_91,_92);
 };
 })();
 }
diff --git a/dojo/_base/json.js b/dojo/_base/json.js
index 835114a..30bbf1c 100644
--- a/dojo/_base/json.js
+++ b/dojo/_base/json.js
@@ -15,12 +15,12 @@ dojo._escapeString=function(_2){
 return ("\""+_2.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,_4,_5){
+dojo.toJson=function(it,_3,_4){
 if(it===undefined){
 return "undefined";
 }
-var _6=typeof it;
-if(_6=="number"||_6=="boolean"){
+var _5=typeof it;
+if(_5=="number"||_5=="boolean"){
 return it+"";
 }
 if(it===null){
@@ -29,53 +29,53 @@ return "null";
 if(dojo.isString(it)){
 return dojo._escapeString(it);
 }
-var _7=arguments.callee;
-var _8;
-_5=_5||"";
-var _9=_4?_5+dojo.toJsonIndentStr:"";
+var _6=arguments.callee;
+var _7;
+_4=_4||"";
+var _8=_3?_4+dojo.toJsonIndentStr:"";
 var tf=it.__json__||it.json;
 if(dojo.isFunction(tf)){
-_8=tf.call(it);
-if(it!==_8){
-return _7(_8,_4,_9);
+_7=tf.call(it);
+if(it!==_7){
+return _6(_7,_3,_8);
 }
 }
 if(it.nodeType&&it.cloneNode){
 throw new Error("Can't serialize DOM nodes");
 }
-var _b=_4?" ":"";
-var _c=_4?"\n":"";
+var _9=_3?" ":"";
+var _a=_3?"\n":"";
 if(dojo.isArray(it)){
-var _d=dojo.map(it,function(_e){
-var _f=_7(_e,_4,_9);
-if(typeof _f!="string"){
-_f="undefined";
+var _b=dojo.map(it,function(_c){
+var _d=_6(_c,_3,_8);
+if(typeof _d!="string"){
+_d="undefined";
 }
-return _c+_9+_f;
+return _a+_8+_d;
 });
-return "["+_d.join(","+_b)+_c+_5+"]";
+return "["+_b.join(","+_9)+_a+_4+"]";
 }
-if(_6=="function"){
+if(_5=="function"){
 return null;
 }
-var _10=[],key;
-for(key in it){
-var _12,val;
-if(typeof key=="number"){
-_12="\""+key+"\"";
+var _e=[],_f;
+for(_f in it){
+var _10,val;
+if(typeof _f=="number"){
+_10="\""+_f+"\"";
 }else{
-if(typeof key=="string"){
-_12=dojo._escapeString(key);
+if(typeof _f=="string"){
+_10=dojo._escapeString(_f);
 }else{
 continue;
 }
 }
-val=_7(it[key],_4,_9);
+val=_6(it[_f],_3,_8);
 if(typeof val!="string"){
 continue;
 }
-_10.push(_c+_9+_12+":"+_b+val);
+_e.push(_a+_8+_10+":"+_9+val);
 }
-return "{"+_10.join(","+_b)+_c+_5+"}";
+return "{"+_e.join(","+_9)+_a+_4+"}";
 };
 }
diff --git a/dojo/_base/lang.js b/dojo/_base/lang.js
index 3f71cf6..692c7fa 100644
--- a/dojo/_base/lang.js
+++ b/dojo/_base/lang.js
@@ -8,125 +8,127 @@
 if(!dojo._hasResource["dojo._base.lang"]){
 dojo._hasResource["dojo._base.lang"]=true;
 dojo.provide("dojo._base.lang");
+(function(){
+var d=dojo,_1=Object.prototype.toString;
 dojo.isString=function(it){
-return !!arguments.length&&it!=null&&(typeof it=="string"||it instanceof String);
+return (typeof it=="string"||it instanceof String);
 };
 dojo.isArray=function(it){
 return it&&(it instanceof Array||typeof it=="array");
 };
-dojo.isFunction=(function(){
-var _3=function(it){
-var t=typeof it;
-return it&&(t=="function"||it instanceof Function);
+dojo.isFunction=function(it){
+return _1.call(it)==="[object Function]";
 };
-return dojo.isSafari?function(it){
-if(typeof it=="function"&&it=="[object NodeList]"){
-return false;
-}
-return _3(it);
-}:_3;
-})();
 dojo.isObject=function(it){
-return it!==undefined&&(it===null||typeof it=="object"||dojo.isArray(it)||dojo.isFunction(it));
+return it!==undefined&&(it===null||typeof it=="object"||d.isArray(it)||d.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));
+return it&&!d.isFunction(it)&&/\{\s*\[native code\]\s*\}/.test(String(it));
 };
-dojo.extend=function(_b,_c){
+dojo.extend=function(_2,_3){
 for(var i=1,l=arguments.length;i<l;i++){
-dojo._mixin(_b.prototype,arguments[i]);
+d._mixin(_2.prototype,arguments[i]);
 }
-return _b;
+return _2;
 };
-dojo._hitchArgs=function(_f,_10){
-var pre=dojo._toArray(arguments,2);
-var _12=dojo.isString(_10);
+dojo._hitchArgs=function(_4,_5){
+var _6=d._toArray(arguments,2);
+var _7=d.isString(_5);
 return function(){
-var _13=dojo._toArray(arguments);
-var f=_12?(_f||dojo.global)[_10]:_10;
-return f&&f.apply(_f||this,pre.concat(_13));
+var _8=d._toArray(arguments);
+var f=_7?(_4||d.global)[_5]:_5;
+return f&&f.apply(_4||this,_6.concat(_8));
 };
 };
-dojo.hitch=function(_15,_16){
+dojo.hitch=function(_9,_a){
 if(arguments.length>2){
-return dojo._hitchArgs.apply(dojo,arguments);
+return d._hitchArgs.apply(d,arguments);
 }
-if(!_16){
-_16=_15;
-_15=null;
+if(!_a){
+_a=_9;
+_9=null;
 }
-if(dojo.isString(_16)){
-_15=_15||dojo.global;
-if(!_15[_16]){
-throw (["dojo.hitch: scope[\"",_16,"\"] is null (scope=\"",_15,"\")"].join(""));
+if(d.isString(_a)){
+_9=_9||d.global;
+if(!_9[_a]){
+throw (["dojo.hitch: scope[\"",_a,"\"] is null (scope=\"",_9,"\")"].join(""));
 }
 return function(){
-return _15[_16].apply(_15,arguments||[]);
+return _9[_a].apply(_9,arguments||[]);
 };
 }
-return !_15?_16:function(){
-return _16.apply(_15,arguments||[]);
+return !_9?_a:function(){
+return _a.apply(_9,arguments||[]);
 };
 };
 dojo.delegate=dojo._delegate=(function(){
-function TMP(){
+function _b(){
 };
-return function(obj,_19){
-TMP.prototype=obj;
-var tmp=new TMP();
-if(_19){
-dojo._mixin(tmp,_19);
+return function(_c,_d){
+_b.prototype=_c;
+var _e=new _b();
+_b.prototype=null;
+if(_d){
+d._mixin(_e,_d);
 }
-return tmp;
+return _e;
 };
 })();
-(function(){
-var _1b=function(obj,_1d,_1e){
-return (_1e||[]).concat(Array.prototype.slice.call(obj,_1d||0));
+var _f=function(obj,_10,_11){
+return (_11||[]).concat(Array.prototype.slice.call(obj,_10||0));
 };
-var _1f=function(obj,_21,_22){
-var arr=_22||[];
-for(var x=_21||0;x<obj.length;x++){
+var _12=function(obj,_13,_14){
+var arr=_14||[];
+for(var x=_13||0;x<obj.length;x++){
 arr.push(obj[x]);
 }
 return arr;
 };
-dojo._toArray=dojo.isIE?function(obj){
-return ((obj.item)?_1f:_1b).apply(this,arguments);
-}:_1b;
-})();
-dojo.partial=function(_26){
+dojo._toArray=d.isIE?function(obj){
+return ((obj.item)?_12:_f).apply(this,arguments);
+}:_f;
+dojo.partial=function(_15){
 var arr=[null];
-return dojo.hitch.apply(dojo,arr.concat(dojo._toArray(arguments)));
+return d.hitch.apply(d,arr.concat(d._toArray(arguments)));
 };
+var _16=d._extraNames,_17=_16.length,_18={};
 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)){
+if(!o||typeof o!="object"||d.isFunction(o)){
 return o;
 }
-if(o.nodeType&&o.cloneNode){
+if(o.nodeType&&"cloneNode" in o){
 return o.cloneNode(true);
 }
 if(o instanceof Date){
 return new Date(o.getTime());
 }
-r=new o.constructor();
-for(i in o){
-if(!(i in r)||r[i]!=o[i]){
-r[i]=dojo.clone(o[i]);
+var r,i,l,s,_19;
+if(d.isArray(o)){
+r=[];
+for(i=0,l=o.length;i<l;++i){
+if(i in o){
+r.push(d.clone(o[i]));
+}
+}
+}else{
+r=o.constructor?new o.constructor():{};
+}
+for(_19 in o){
+s=o[_19];
+if(!(_19 in r)||(r[_19]!==s&&(!(_19 in _18)||_18[_19]!==s))){
+r[_19]=d.clone(s);
+}
+}
+if(_17){
+for(i=0;i<_17;++i){
+_19=_16[i];
+s=o[_19];
+if(!(_19 in r)||(r[_19]!==s&&(!(_19 in _18)||_18[_19]!==s))){
+r[_19]=s;
+}
 }
 }
 return r;
@@ -136,4 +138,11 @@ return str.trim();
 }:function(str){
 return str.replace(/^\s\s*/,"").replace(/\s\s*$/,"");
 };
+var _1a=/\{([^\}]+)\}/g;
+dojo.replace=function(_1b,map,_1c){
+return _1b.replace(_1c||_1a,d.isFunction(map)?map:function(_1d,k){
+return d.getObject(k,false,map);
+});
+};
+})();
 }
diff --git a/dojo/_base/query-sizzle.js b/dojo/_base/query-sizzle.js
index 05b1237..67d8f61 100644
--- a/dojo/_base/query-sizzle.js
+++ b/dojo/_base/query-sizzle.js
@@ -34,395 +34,395 @@ return dojo.Sizzle.filter(_5,_4);
 };
 }
 (function(ns){
-var _7=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g,_8=0,_9=Object.prototype.toString;
-var _a=function(_b,_c,_d,_e){
-_d=_d||[];
-_c=_c||document;
-if(_c.nodeType!==1&&_c.nodeType!==9){
+var _6=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[^[\]]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g,_7=0,_8=Object.prototype.toString;
+var _9=function(_a,_b,_c,_d){
+_c=_c||[];
+_b=_b||document;
+if(_b.nodeType!==1&&_b.nodeType!==9){
 return [];
 }
-if(!_b||typeof _b!=="string"){
-return _d;
+if(!_a||typeof _a!=="string"){
+return _c;
 }
-var _f=[],m,set,_12,_13,_14,_15,_16=true;
-_7.lastIndex=0;
-while((m=_7.exec(_b))!==null){
-_f.push(m[1]);
+var _e=[],m,_f,_10,_11,_12,_13,_14=true;
+_6.lastIndex=0;
+while((m=_6.exec(_a))!==null){
+_e.push(m[1]);
 if(m[2]){
-_15=RegExp.rightContext;
+_13=RegExp.rightContext;
 break;
 }
 }
-if(_f.length>1&&_17.match.POS.exec(_b)){
-if(_f.length===2&&_17.relative[_f[0]]){
-var _18="",_19;
-while((_19=_17.match.POS.exec(_b))){
-_18+=_19[0];
-_b=_b.replace(_17.match.POS,"");
+if(_e.length>1&&_15.match.POS.exec(_a)){
+if(_e.length===2&&_15.relative[_e[0]]){
+var _16="",_17;
+while((_17=_15.match.POS.exec(_a))){
+_16+=_17[0];
+_a=_a.replace(_15.match.POS,"");
 }
-set=_a.filter(_18,_a(_b,_c));
+_f=_9.filter(_16,_9(_a,_b));
 }else{
-set=_17.relative[_f[0]]?[_c]:_a(_f.shift(),_c);
-while(_f.length){
-var _1a=[];
-_b=_f.shift();
-if(_17.relative[_b]){
-_b+=_f.shift();
+_f=_15.relative[_e[0]]?[_b]:_9(_e.shift(),_b);
+while(_e.length){
+var _18=[];
+_a=_e.shift();
+if(_15.relative[_a]){
+_a+=_e.shift();
 }
-for(var i=0,l=set.length;i<l;i++){
-_a(_b,set[i],_1a);
+for(var i=0,l=_f.length;i<l;i++){
+_9(_a,_f[i],_18);
 }
-set=_1a;
+_f=_18;
 }
 }
 }else{
-var ret=_e?{expr:_f.pop(),set:_1e(_e)}:_a.find(_f.pop(),_f.length===1&&_c.parentNode?_c.parentNode:_c);
-set=_a.filter(ret.expr,ret.set);
-if(_f.length>0){
-_12=_1e(set);
+var ret=_d?{expr:_e.pop(),set:_19(_d)}:_9.find(_e.pop(),_e.length===1&&_b.parentNode?_b.parentNode:_b);
+_f=_9.filter(ret.expr,ret.set);
+if(_e.length>0){
+_10=_19(_f);
 }else{
-_16=false;
+_14=false;
 }
-while(_f.length){
-var cur=_f.pop(),pop=cur;
-if(!_17.relative[cur]){
+while(_e.length){
+var cur=_e.pop(),pop=cur;
+if(!_15.relative[cur]){
 cur="";
 }else{
-pop=_f.pop();
+pop=_e.pop();
 }
 if(pop==null){
-pop=_c;
+pop=_b;
 }
-_17.relative[cur](_12,pop);
+_15.relative[cur](_10,pop);
 }
 }
-if(!_12){
-_12=set;
+if(!_10){
+_10=_f;
 }
-if(!_12){
-throw "Syntax error, unrecognized expression: "+(cur||_b);
+if(!_10){
+throw "Syntax error, unrecognized expression: "+(cur||_a);
 }
-if(_9.call(_12)==="[object Array]"){
-if(!_16){
-_d.push.apply(_d,_12);
+if(_8.call(_10)==="[object Array]"){
+if(!_14){
+_c.push.apply(_c,_10);
 }else{
-if(_c.nodeType===1){
-for(var i=0;_12[i]!=null;i++){
-if(_12[i]&&(_12[i]===true||_12[i].nodeType===1&&_21(_c,_12[i]))){
-_d.push(set[i]);
+if(_b.nodeType===1){
+for(var i=0;_10[i]!=null;i++){
+if(_10[i]&&(_10[i]===true||_10[i].nodeType===1&&_1a(_b,_10[i]))){
+_c.push(_f[i]);
 }
 }
 }else{
-for(var i=0;_12[i]!=null;i++){
-if(_12[i]&&_12[i].nodeType===1){
-_d.push(set[i]);
+for(var i=0;_10[i]!=null;i++){
+if(_10[i]&&_10[i].nodeType===1){
+_c.push(_f[i]);
 }
 }
 }
 }
 }else{
-_1e(_12,_d);
+_19(_10,_c);
 }
-if(_15){
-_a(_15,_c,_d,_e);
+if(_13){
+_9(_13,_b,_c,_d);
 }
-return _d;
+return _c;
 };
-_a.matches=function(_22,set){
-return _a(_22,null,null,set);
+_9.matches=function(_1b,set){
+return _9(_1b,null,null,set);
 };
-_a.find=function(_24,_25){
-var set,_27;
-if(!_24){
+_9.find=function(_1c,_1d){
+var set,_1e;
+if(!_1c){
 return [];
 }
-for(var i=0,l=_17.order.length;i<l;i++){
-var _2a=_17.order[i],_27;
-if((_27=_17.match[_2a].exec(_24))){
-var _2b=RegExp.leftContext;
-if(_2b.substr(_2b.length-1)!=="\\"){
-_27[1]=(_27[1]||"").replace(/\\/g,"");
-set=_17.find[_2a](_27,_25);
+for(var i=0,l=_15.order.length;i<l;i++){
+var _1f=_15.order[i],_1e;
+if((_1e=_15.match[_1f].exec(_1c))){
+var _20=RegExp.leftContext;
+if(_20.substr(_20.length-1)!=="\\"){
+_1e[1]=(_1e[1]||"").replace(/\\/g,"");
+set=_15.find[_1f](_1e,_1d);
 if(set!=null){
-_24=_24.replace(_17.match[_2a],"");
+_1c=_1c.replace(_15.match[_1f],"");
 break;
 }
 }
 }
 }
 if(!set){
-set=_25.getElementsByTagName("*");
+set=_1d.getElementsByTagName("*");
 }
-return {set:set,expr:_24};
+return {set:set,expr:_1c};
 };
-_a.filter=function(_2c,set,_2e,not){
-var old=_2c,_31=[],_32=set,_33,_34;
-while(_2c&&set.length){
-for(var _35 in _17.filter){
-if((_33=_17.match[_35].exec(_2c))!=null){
-var _36=_17.filter[_35],_37=null,_38=0,_39,_3a;
-_34=false;
-if(_32==_31){
-_31=[];
-}
-if(_17.preFilter[_35]){
-_33=_17.preFilter[_35](_33,_32,_2e,_31,not);
-if(!_33){
-_34=_39=true;
+_9.filter=function(_21,set,_22,not){
+var old=_21,_23=[],_24=set,_25,_26;
+while(_21&&set.length){
+for(var _27 in _15.filter){
+if((_25=_15.match[_27].exec(_21))!=null){
+var _28=_15.filter[_27],_29=null,_2a=0,_2b,_2c;
+_26=false;
+if(_24==_23){
+_23=[];
+}
+if(_15.preFilter[_27]){
+_25=_15.preFilter[_27](_25,_24,_22,_23,not);
+if(!_25){
+_26=_2b=true;
 }else{
-if(_33[0]===true){
-_37=[];
-var _3b=null,_3c;
-for(var i=0;(_3c=_32[i])!==undefined;i++){
-if(_3c&&_3b!==_3c){
-_37.push(_3c);
-_3b=_3c;
+if(_25[0]===true){
+_29=[];
+var _2d=null,_2e;
+for(var i=0;(_2e=_24[i])!==undefined;i++){
+if(_2e&&_2d!==_2e){
+_29.push(_2e);
+_2d=_2e;
 }
 }
 }
 }
 }
-if(_33){
-for(var i=0;(_3a=_32[i])!==undefined;i++){
-if(_3a){
-if(_37&&_3a!=_37[_38]){
-_38++;
+if(_25){
+for(var i=0;(_2c=_24[i])!==undefined;i++){
+if(_2c){
+if(_29&&_2c!=_29[_2a]){
+_2a++;
 }
-_39=_36(_3a,_33,_38,_37);
-var _3e=not^!!_39;
-if(_2e&&_39!=null){
-if(_3e){
-_34=true;
+_2b=_28(_2c,_25,_2a,_29);
+var _2f=not^!!_2b;
+if(_22&&_2b!=null){
+if(_2f){
+_26=true;
 }else{
-_32[i]=false;
+_24[i]=false;
 }
 }else{
-if(_3e){
-_31.push(_3a);
-_34=true;
+if(_2f){
+_23.push(_2c);
+_26=true;
 }
 }
 }
 }
 }
-if(_39!==undefined){
-if(!_2e){
-_32=_31;
+if(_2b!==undefined){
+if(!_22){
+_24=_23;
 }
-_2c=_2c.replace(_17.match[_35],"");
-if(!_34){
+_21=_21.replace(_15.match[_27],"");
+if(!_26){
 return [];
 }
 break;
 }
 }
 }
-_2c=_2c.replace(/\s*,\s*/,"");
-if(_2c==old){
-if(_34==null){
-throw "Syntax error, unrecognized expression: "+_2c;
+_21=_21.replace(/\s*,\s*/,"");
+if(_21==old){
+if(_26==null){
+throw "Syntax error, unrecognized expression: "+_21;
 }else{
 break;
 }
 }
-old=_2c;
+old=_21;
 }
-return _32;
+return _24;
 };
-var _17=_a.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u0128-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u0128-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u0128-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[((?:[\w\u0128-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\]/,TAG:/^((?:[\w\u0128-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child\(?(even|odd|[\dn+-]*)\)?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)\(?(\d*)\)?(?:[^-]|$)/,PSEUDO:/:((?:[\w\u0128-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\ [...]
-for(var i=0,l=_3f.length;i<l;i++){
-var _43=_3f[i];
-if(_43){
-var cur=_43.previousSibling;
+var _15=_9.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u0128-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u0128-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u0128-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[((?:[\w\u0128-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\]/,TAG:/^((?:[\w\u0128-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child\(?(even|odd|[\dn+-]*)\)?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)\(?(\d*)\)?(?:[^-]|$)/,PSEUDO:/:((?:[\w\u0128-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\ [...]
+for(var i=0,l=_30.length;i<l;i++){
+var _32=_30[i];
+if(_32){
+var cur=_32.previousSibling;
 while(cur&&cur.nodeType!==1){
 cur=cur.previousSibling;
 }
-_3f[i]=typeof _40==="string"?cur||false:cur===_40;
+_30[i]=typeof _31==="string"?cur||false:cur===_31;
 }
 }
-if(typeof _40==="string"){
-_a.filter(_40,_3f,true);
+if(typeof _31==="string"){
+_9.filter(_31,_30,true);
 }
-},">":function(_45,_46){
-if(typeof _46==="string"&&!/\W/.test(_46)){
-_46=_46.toUpperCase();
-for(var i=0,l=_45.length;i<l;i++){
-var _49=_45[i];
-if(_49){
-var _4a=_49.parentNode;
-_45[i]=_4a.nodeName===_46?_4a:false;
+},">":function(_33,_34){
+if(typeof _34==="string"&&!/\W/.test(_34)){
+_34=_34.toUpperCase();
+for(var i=0,l=_33.length;i<l;i++){
+var _35=_33[i];
+if(_35){
+var _36=_35.parentNode;
+_33[i]=_36.nodeName===_34?_36:false;
 }
 }
 }else{
-for(var i=0,l=_45.length;i<l;i++){
-var _49=_45[i];
-if(_49){
-_45[i]=typeof _46==="string"?_49.parentNode:_49.parentNode===_46;
+for(var i=0,l=_33.length;i<l;i++){
+var _35=_33[i];
+if(_35){
+_33[i]=typeof _34==="string"?_35.parentNode:_35.parentNode===_34;
 }
 }
-if(typeof _46==="string"){
-_a.filter(_46,_45,true);
+if(typeof _34==="string"){
+_9.filter(_34,_33,true);
 }
 }
-},"":function(_4b,_4c){
-var _4d="done"+(_8++),_4e=_4f;
-if(!_4c.match(/\W/)){
-var _50=_4c=_4c.toUpperCase();
-_4e=_51;
+},"":function(_37,_38){
+var _39="done"+(_7++),_3a=_3b;
+if(!_38.match(/\W/)){
+var _3c=_38=_38.toUpperCase();
+_3a=_3d;
 }
-_4e("parentNode",_4c,_4d,_4b,_50);
-},"~":function(_52,_53){
-var _54="done"+(_8++),_55=_4f;
-if(typeof _53==="string"&&!_53.match(/\W/)){
-var _56=_53=_53.toUpperCase();
-_55=_51;
+_3a("parentNode",_38,_39,_37,_3c);
+},"~":function(_3e,_3f){
+var _40="done"+(_7++),_41=_3b;
+if(typeof _3f==="string"&&!_3f.match(/\W/)){
+var _42=_3f=_3f.toUpperCase();
+_41=_3d;
 }
-_55("previousSibling",_53,_54,_52,_56);
-}},find:{ID:function(_57,_58){
-if(_58.getElementById){
-var m=_58.getElementById(_57[1]);
+_41("previousSibling",_3f,_40,_3e,_42);
+}},find:{ID:function(_43,_44){
+if(_44.getElementById){
+var m=_44.getElementById(_43[1]);
 return m?[m]:[];
 }
-},NAME:function(_5a,_5b){
-return _5b.getElementsByName?_5b.getElementsByName(_5a[1]):null;
-},TAG:function(_5c,_5d){
-return _5d.getElementsByTagName(_5c[1]);
-}},preFilter:{CLASS:function(_5e,_5f,_60,_61,not){
-_5e=" "+_5e[1].replace(/\\/g,"")+" ";
-for(var i=0;_5f[i];i++){
-if(not^(" "+_5f[i].className+" ").indexOf(_5e)>=0){
-if(!_60){
-_61.push(_5f[i]);
+},NAME:function(_45,_46){
+return _46.getElementsByName?_46.getElementsByName(_45[1]):null;
+},TAG:function(_47,_48){
+return _48.getElementsByTagName(_47[1]);
+}},preFilter:{CLASS:function(_49,_4a,_4b,_4c,not){
+_49=" "+_49[1].replace(/\\/g,"")+" ";
+for(var i=0;_4a[i];i++){
+if(not^(" "+_4a[i].className+" ").indexOf(_49)>=0){
+if(!_4b){
+_4c.push(_4a[i]);
 }
 }else{
-if(_60){
-_5f[i]=false;
+if(_4b){
+_4a[i]=false;
 }
 }
 }
 return false;
-},ID:function(_64){
-return _64[1];
-},TAG:function(_65){
-return _65[1].toUpperCase();
-},CHILD:function(_66){
-if(_66[1]=="nth"){
-var _67=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(_66[2]=="even"&&"2n"||_66[2]=="odd"&&"2n+1"||!/\D/.test(_66[2])&&"0n+"+_66[2]||_66[2]);
-_66[2]=(_67[1]+(_67[2]||1))-0;
-_66[3]=_67[3]-0;
-}
-_66[0]="done"+(_8++);
-return _66;
-},ATTR:function(_68){
-var _69=_68[1];
-if(_17.attrMap[_69]){
-_68[1]=_17.attrMap[_69];
-}
-if(_68[2]==="~="){
-_68[4]=" "+_68[4]+" ";
-}
-return _68;
-},PSEUDO:function(_6a,_6b,_6c,_6d,not){
-if(_6a[1]==="not"){
-if(_6a[3].match(_7).length>1){
-_6a[3]=_a(_6a[3],null,null,_6b);
+},ID:function(_4d){
+return _4d[1];
+},TAG:function(_4e){
+return _4e[1].toUpperCase();
+},CHILD:function(_4f){
+if(_4f[1]=="nth"){
+var _50=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(_4f[2]=="even"&&"2n"||_4f[2]=="odd"&&"2n+1"||!/\D/.test(_4f[2])&&"0n+"+_4f[2]||_4f[2]);
+_4f[2]=(_50[1]+(_50[2]||1))-0;
+_4f[3]=_50[3]-0;
+}
+_4f[0]="done"+(_7++);
+return _4f;
+},ATTR:function(_51){
+var _52=_51[1];
+if(_15.attrMap[_52]){
+_51[1]=_15.attrMap[_52];
+}
+if(_51[2]==="~="){
+_51[4]=" "+_51[4]+" ";
+}
+return _51;
+},PSEUDO:function(_53,_54,_55,_56,not){
+if(_53[1]==="not"){
+if(_53[3].match(_6).length>1){
+_53[3]=_9(_53[3],null,null,_54);
 }else{
-var ret=_a.filter(_6a[3],_6b,_6c,true^not);
-if(!_6c){
-_6d.push.apply(_6d,ret);
+var ret=_9.filter(_53[3],_54,_55,true^not);
+if(!_55){
+_56.push.apply(_56,ret);
 }
 return false;
 }
 }
-return _6a;
-},POS:function(_70){
-_70.unshift(true);
-return _70;
-}},filters:{enabled:function(_71){
-return _71.disabled===false&&_71.type!=="hidden";
-},disabled:function(_72){
-return _72.disabled===true;
-},checked:function(_73){
-return _73.checked===true;
-},selected:function(_74){
-_74.parentNode.selectedIndex;
-return _74.selected===true;
-},parent:function(_75){
-return !!_75.firstChild;
-},empty:function(_76){
-return !_76.firstChild;
-},has:function(_77,i,_79){
-return !!_a(_79[3],_77).length;
-},header:function(_7a){
-return /h\d/i.test(_7a.nodeName);
-},text:function(_7b){
-return "text"===_7b.type;
-},radio:function(_7c){
-return "radio"===_7c.type;
-},checkbox:function(_7d){
-return "checkbox"===_7d.type;
-},file:function(_7e){
-return "file"===_7e.type;
-},password:function(_7f){
-return "password"===_7f.type;
-},submit:function(_80){
-return "submit"===_80.type;
-},image:function(_81){
-return "image"===_81.type;
-},reset:function(_82){
-return "reset"===_82.type;
-},button:function(_83){
-return "button"===_83.type||_83.nodeName.toUpperCase()==="BUTTON";
-},input:function(_84){
-return /input|select|textarea|button/i.test(_84.nodeName);
-}},setFilters:{first:function(_85,i){
+return _53;
+},POS:function(_57){
+_57.unshift(true);
+return _57;
+}},filters:{enabled:function(_58){
+return _58.disabled===false&&_58.type!=="hidden";
+},disabled:function(_59){
+return _59.disabled===true;
+},checked:function(_5a){
+return _5a.checked===true;
+},selected:function(_5b){
+_5b.parentNode.selectedIndex;
+return _5b.selected===true;
+},parent:function(_5c){
+return !!_5c.firstChild;
+},empty:function(_5d){
+return !_5d.firstChild;
+},has:function(_5e,i,_5f){
+return !!_9(_5f[3],_5e).length;
+},header:function(_60){
+return /h\d/i.test(_60.nodeName);
+},text:function(_61){
+return "text"===_61.type;
+},radio:function(_62){
+return "radio"===_62.type;
+},checkbox:function(_63){
+return "checkbox"===_63.type;
+},file:function(_64){
+return "file"===_64.type;
+},password:function(_65){
+return "password"===_65.type;
+},submit:function(_66){
+return "submit"===_66.type;
+},image:function(_67){
+return "image"===_67.type;
+},reset:function(_68){
+return "reset"===_68.type;
+},button:function(_69){
+return "button"===_69.type||_69.nodeName.toUpperCase()==="BUTTON";
+},input:function(_6a){
+return /input|select|textarea|button/i.test(_6a.nodeName);
+}},setFilters:{first:function(_6b,i){
 return i===0;
-},last:function(_87,i,_89,_8a){
-return i===_8a.length-1;
-},even:function(_8b,i){
+},last:function(_6c,i,_6d,_6e){
+return i===_6e.length-1;
+},even:function(_6f,i){
 return i%2===0;
-},odd:function(_8d,i){
+},odd:function(_70,i){
 return i%2===1;
-},lt:function(_8f,i,_91){
-return i<_91[3]-0;
-},gt:function(_92,i,_94){
-return i>_94[3]-0;
-},nth:function(_95,i,_97){
-return _97[3]-0==i;
-},eq:function(_98,i,_9a){
-return _9a[3]-0==i;
-}},filter:{CHILD:function(_9b,_9c){
-var _9d=_9c[1],_9e=_9b.parentNode;
-var _9f=_9c[0];
-if(_9e&&!_9e[_9f]){
-var _a0=1;
-for(var _a1=_9e.firstChild;_a1;_a1=_a1.nextSibling){
-if(_a1.nodeType==1){
-_a1.nodeIndex=_a0++;
-}
-}
-_9e[_9f]=_a0-1;
-}
-if(_9d=="first"){
-return _9b.nodeIndex==1;
+},lt:function(_71,i,_72){
+return i<_72[3]-0;
+},gt:function(_73,i,_74){
+return i>_74[3]-0;
+},nth:function(_75,i,_76){
+return _76[3]-0==i;
+},eq:function(_77,i,_78){
+return _78[3]-0==i;
+}},filter:{CHILD:function(_79,_7a){
+var _7b=_7a[1],_7c=_79.parentNode;
+var _7d=_7a[0];
+if(_7c&&!_7c[_7d]){
+var _7e=1;
+for(var _7f=_7c.firstChild;_7f;_7f=_7f.nextSibling){
+if(_7f.nodeType==1){
+_7f.nodeIndex=_7e++;
+}
+}
+_7c[_7d]=_7e-1;
+}
+if(_7b=="first"){
+return _79.nodeIndex==1;
 }else{
-if(_9d=="last"){
-return _9b.nodeIndex==_9e[_9f];
+if(_7b=="last"){
+return _79.nodeIndex==_7c[_7d];
 }else{
-if(_9d=="only"){
-return _9e[_9f]==1;
+if(_7b=="only"){
+return _7c[_7d]==1;
 }else{
-if(_9d=="nth"){
-var add=false,_a3=_9c[2],_a4=_9c[3];
-if(_a3==1&&_a4==0){
+if(_7b=="nth"){
+var add=false,_80=_7a[2],_81=_7a[3];
+if(_80==1&&_81==0){
 return true;
 }
-if(_a3==0){
-if(_9b.nodeIndex==_a4){
+if(_80==0){
+if(_79.nodeIndex==_81){
 add=true;
 }
 }else{
-if((_9b.nodeIndex-_a4)%_a3==0&&(_9b.nodeIndex-_a4)/_a3>=0){
+if((_79.nodeIndex-_81)%_80==0&&(_79.nodeIndex-_81)/_80>=0){
 add=true;
 }
 }
@@ -431,18 +431,18 @@ return add;
 }
 }
 }
-},PSEUDO:function(_a5,_a6,i,_a8){
-var _a9=_a6[1],_aa=_17.filters[_a9];
-if(_aa){
-return _aa(_a5,i,_a6,_a8);
+},PSEUDO:function(_82,_83,i,_84){
+var _85=_83[1],_86=_15.filters[_85];
+if(_86){
+return _86(_82,i,_83,_84);
 }else{
-if(_a9==="contains"){
-return (_a5.textContent||_a5.innerText||"").indexOf(_a6[3])>=0;
+if(_85==="contains"){
+return (_82.textContent||_82.innerText||"").indexOf(_83[3])>=0;
 }else{
-if(_a9==="not"){
-var not=_a6[3];
+if(_85==="not"){
+var not=_83[3];
 for(var i=0,l=not.length;i<l;i++){
-if(not[i]===_a5){
+if(not[i]===_82){
 return false;
 }
 }
@@ -450,48 +450,48 @@ return true;
 }
 }
 }
-},ID:function(_ad,_ae){
-return _ad.nodeType===1&&_ad.getAttribute("id")===_ae;
-},TAG:function(_af,_b0){
-return (_b0==="*"&&_af.nodeType===1)||_af.nodeName===_b0;
-},CLASS:function(_b1,_b2){
-return _b2.test(_b1.className);
-},ATTR:function(_b3,_b4){
-var _b5=_b3[_b4[1]]||_b3.getAttribute(_b4[1]),_b6=_b5+"",_b7=_b4[2],_b8=_b4[4];
-return _b5==null?false:_b7==="="?_b6===_b8:_b7==="*="?_b6.indexOf(_b8)>=0:_b7==="~="?(" "+_b6+" ").indexOf(_b8)>=0:!_b4[4]?_b5:_b7==="!="?_b6!=_b8:_b7==="^="?_b6.indexOf(_b8)===0:_b7==="$="?_b6.substr(_b6.length-_b8.length)===_b8:_b7==="|="?_b6===_b8||_b6.substr(0,_b8.length+1)===_b8+"-":false;
-},POS:function(_b9,_ba,i,_bc){
-var _bd=_ba[2],_be=_17.setFilters[_bd];
-if(_be){
-return _be(_b9,i,_ba,_bc);
+},ID:function(_87,_88){
+return _87.nodeType===1&&_87.getAttribute("id")===_88;
+},TAG:function(_89,_8a){
+return (_8a==="*"&&_89.nodeType===1)||_89.nodeName===_8a;
+},CLASS:function(_8b,_8c){
+return _8c.test(_8b.className);
+},ATTR:function(_8d,_8e){
+var _8f=_8d[_8e[1]]||_8d.getAttribute(_8e[1]),_90=_8f+"",_91=_8e[2],_92=_8e[4];
+return _8f==null?false:_91==="="?_90===_92:_91==="*="?_90.indexOf(_92)>=0:_91==="~="?(" "+_90+" ").indexOf(_92)>=0:!_8e[4]?_8f:_91==="!="?_90!=_92:_91==="^="?_90.indexOf(_92)===0:_91==="$="?_90.substr(_90.length-_92.length)===_92:_91==="|="?_90===_92||_90.substr(0,_92.length+1)===_92+"-":false;
+},POS:function(_93,_94,i,_95){
+var _96=_94[2],_97=_15.setFilters[_96];
+if(_97){
+return _97(_93,i,_94,_95);
 }
 }}};
-for(var _bf in _17.match){
-_17.match[_bf]=RegExp(_17.match[_bf].source+/(?![^\[]*\])(?![^\(]*\))/.source);
+for(var _98 in _15.match){
+_15.match[_98]=RegExp(_15.match[_98].source+/(?![^\[]*\])(?![^\(]*\))/.source);
 }
-var _1e=function(_c0,_c1){
-_c0=Array.prototype.slice.call(_c0);
-if(_c1){
-_c1.push.apply(_c1,_c0);
-return _c1;
+var _19=function(_99,_9a){
+_99=Array.prototype.slice.call(_99);
+if(_9a){
+_9a.push.apply(_9a,_99);
+return _9a;
 }
-return _c0;
+return _99;
 };
 try{
 Array.prototype.slice.call(document.documentElement.childNodes);
 }
 catch(e){
-_1e=function(_c2,_c3){
-var ret=_c3||[];
-if(_9.call(_c2)==="[object Array]"){
-Array.prototype.push.apply(ret,_c2);
+_19=function(_9b,_9c){
+var ret=_9c||[];
+if(_8.call(_9b)==="[object Array]"){
+Array.prototype.push.apply(ret,_9b);
 }else{
-if(typeof _c2.length==="number"){
-for(var i=0,l=_c2.length;i<l;i++){
-ret.push(_c2[i]);
+if(typeof _9b.length==="number"){
+for(var i=0,l=_9b.length;i<l;i++){
+ret.push(_9b[i]);
 }
 }else{
-for(var i=0;_c2[i];i++){
-ret.push(_c2[i]);
+for(var i=0;_9b[i];i++){
+ret.push(_9b[i]);
 }
 }
 }
@@ -499,130 +499,130 @@ return ret;
 };
 }
 (function(){
-var _c7=document.createElement("form"),id="script"+(new Date).getTime();
-_c7.innerHTML="<input name='"+id+"'/>";
-var _c9=document.documentElement;
-_c9.insertBefore(_c7,_c9.firstChild);
+var _9d=document.createElement("form"),id="script"+(new Date).getTime();
+_9d.innerHTML="<input name='"+id+"'/>";
+var _9e=document.documentElement;
+_9e.insertBefore(_9d,_9e.firstChild);
 if(!!document.getElementById(id)){
-_17.find.ID=function(_ca,_cb){
-if(_cb.getElementById){
-var m=_cb.getElementById(_ca[1]);
-return m?m.id===_ca[1]||m.getAttributeNode&&m.getAttributeNode("id").nodeValue===_ca[1]?[m]:undefined:[];
+_15.find.ID=function(_9f,_a0){
+if(_a0.getElementById){
+var m=_a0.getElementById(_9f[1]);
+return m?m.id===_9f[1]||m.getAttributeNode&&m.getAttributeNode("id").nodeValue===_9f[1]?[m]:undefined:[];
 }
 };
-_17.filter.ID=function(_cd,_ce){
-var _cf=_cd.getAttributeNode&&_cd.getAttributeNode("id");
-return _cd.nodeType===1&&_cf&&_cf.nodeValue===_ce;
+_15.filter.ID=function(_a1,_a2){
+var _a3=_a1.getAttributeNode&&_a1.getAttributeNode("id");
+return _a1.nodeType===1&&_a3&&_a3.nodeValue===_a2;
 };
 }
-_c9.removeChild(_c7);
+_9e.removeChild(_9d);
 })();
 (function(){
 var div=document.createElement("div");
 div.appendChild(document.createComment(""));
 if(div.getElementsByTagName("*").length>0){
-_17.find.TAG=function(_d1,_d2){
-var _d3=_d2.getElementsByTagName(_d1[1]);
-if(_d1[1]==="*"){
+_15.find.TAG=function(_a4,_a5){
+var _a6=_a5.getElementsByTagName(_a4[1]);
+if(_a4[1]==="*"){
 var tmp=[];
-for(var i=0;_d3[i];i++){
-if(_d3[i].nodeType===1){
-tmp.push(_d3[i]);
+for(var i=0;_a6[i];i++){
+if(_a6[i].nodeType===1){
+tmp.push(_a6[i]);
 }
 }
-_d3=tmp;
+_a6=tmp;
 }
-return _d3;
+return _a6;
 };
 }
 })();
 if(document.querySelectorAll){
 (function(){
-var _d6=_a;
-_a=function(_d7,_d8,_d9,_da){
-_d8=_d8||document;
-if(!_da&&_d8.nodeType===9){
+var _a7=_9;
+_9=function(_a8,_a9,_aa,_ab){
+_a9=_a9||document;
+if(!_ab&&_a9.nodeType===9){
 try{
-return _1e(_d8.querySelectorAll(_d7),_d9);
+return _19(_a9.querySelectorAll(_a8),_aa);
 }
 catch(e){
 }
 }
-return _d6(_d7,_d8,_d9,_da);
+return _a7(_a8,_a9,_aa,_ab);
 };
-_a.find=_d6.find;
-_a.filter=_d6.filter;
-_a.selectors=_d6.selectors;
-_a.matches=_d6.matches;
+_9.find=_a7.find;
+_9.filter=_a7.filter;
+_9.selectors=_a7.selectors;
+_9.matches=_a7.matches;
 })();
 }
 if(document.documentElement.getElementsByClassName){
-_17.order.splice(1,0,"CLASS");
-_17.find.CLASS=function(_db,_dc){
-return _dc.getElementsByClassName(_db[1]);
+_15.order.splice(1,0,"CLASS");
+_15.find.CLASS=function(_ac,_ad){
+return _ad.getElementsByClassName(_ac[1]);
 };
 }
-function _51(dir,cur,_df,_e0,_e1){
-for(var i=0,l=_e0.length;i<l;i++){
-var _e4=_e0[i];
-if(_e4){
-_e4=_e4[dir];
-var _e5=false;
-while(_e4&&_e4.nodeType){
-var _e6=_e4[_df];
-if(_e6){
-_e5=_e0[_e6];
+function _3d(dir,cur,_ae,_af,_b0){
+for(var i=0,l=_af.length;i<l;i++){
+var _b1=_af[i];
+if(_b1){
+_b1=_b1[dir];
+var _b2=false;
+while(_b1&&_b1.nodeType){
+var _b3=_b1[_ae];
+if(_b3){
+_b2=_af[_b3];
 break;
 }
-if(_e4.nodeType===1){
-_e4[_df]=i;
+if(_b1.nodeType===1){
+_b1[_ae]=i;
 }
-if(_e4.nodeName===cur){
-_e5=_e4;
+if(_b1.nodeName===cur){
+_b2=_b1;
 break;
 }
-_e4=_e4[dir];
+_b1=_b1[dir];
 }
-_e0[i]=_e5;
+_af[i]=_b2;
 }
 }
 };
-function _4f(dir,cur,_e9,_ea,_eb){
-for(var i=0,l=_ea.length;i<l;i++){
-var _ee=_ea[i];
-if(_ee){
-_ee=_ee[dir];
-var _ef=false;
-while(_ee&&_ee.nodeType){
-if(_ee[_e9]){
-_ef=_ea[_ee[_e9]];
+function _3b(dir,cur,_b4,_b5,_b6){
+for(var i=0,l=_b5.length;i<l;i++){
+var _b7=_b5[i];
+if(_b7){
+_b7=_b7[dir];
+var _b8=false;
+while(_b7&&_b7.nodeType){
+if(_b7[_b4]){
+_b8=_b5[_b7[_b4]];
 break;
 }
-if(_ee.nodeType===1){
-_ee[_e9]=i;
+if(_b7.nodeType===1){
+_b7[_b4]=i;
 if(typeof cur!=="string"){
-if(_ee===cur){
-_ef=true;
+if(_b7===cur){
+_b8=true;
 break;
 }
 }else{
-if(_a.filter(cur,[_ee]).length>0){
-_ef=_ee;
+if(_9.filter(cur,[_b7]).length>0){
+_b8=_b7;
 break;
 }
 }
 }
-_ee=_ee[dir];
+_b7=_b7[dir];
 }
-_ea[i]=_ef;
+_b5[i]=_b8;
 }
 }
 };
-var _21=document.compareDocumentPosition?function(a,b){
+var _1a=document.compareDocumentPosition?function(a,b){
 return a.compareDocumentPosition(b)&16;
 }:function(a,b){
 return a!==b&&(a.contains?a.contains(b):true);
 };
-(ns||window).Sizzle=_a;
+(ns||window).Sizzle=_9;
 })(typeof dojo=="undefined"?null:dojo);
 }
diff --git a/dojo/_base/query.js b/dojo/_base/query.js
index c6333a9..1e8fcad 100644
--- a/dojo/_base/query.js
+++ b/dojo/_base/query.js
@@ -13,144 +13,143 @@ dojo.require("dojo._base.NodeList");
 dojo.require("dojo._base.lang");
 }
 (function(d){
-var _2=d.trim;
-var _3=d.forEach;
-var _4=d._queryListCtor=d.NodeList;
-var _5=d.isString;
-var _6=function(){
+var _1=d.trim;
+var _2=d.forEach;
+var _3=d._NodeListCtor=d.NodeList;
+var _4=function(){
 return d.doc;
 };
-var _7=((d.isWebKit||d.isMozilla)&&((_6().compatMode)=="BackCompat"));
-var _8=!!_6().firstChild["children"]?"children":"childNodes";
-var _9=">~+";
-var _a=false;
-var _b=function(){
+var _5=((d.isWebKit||d.isMozilla)&&((_4().compatMode)=="BackCompat"));
+var _6=!!_4().firstChild["children"]?"children":"childNodes";
+var _7=">~+";
+var _8=false;
+var _9=function(){
 return true;
 };
-var _c=function(_d){
-if(_9.indexOf(_d.slice(-1))>=0){
-_d+=" * ";
+var _a=function(_b){
+if(_7.indexOf(_b.slice(-1))>=0){
+_b+=" * ";
 }else{
-_d+=" ";
+_b+=" ";
 }
 var ts=function(s,e){
-return _2(_d.slice(s,e));
+return _1(_b.slice(s,e));
 };
-var _11=[];
-var _12=-1,_13=-1,_14=-1,_15=-1,_16=-1,_17=-1,_18=-1,lc="",cc="",_1b;
-var x=0,ql=_d.length,_1e=null,_cp=null;
-var _20=function(){
-if(_18>=0){
-var tv=(_18==x)?null:ts(_18,x);
-_1e[(_9.indexOf(tv)<0)?"tag":"oper"]=tv;
-_18=-1;
+var _c=[];
+var _d=-1,_e=-1,_f=-1,_10=-1,_11=-1,_12=-1,_13=-1,lc="",cc="",_14;
+var x=0,ql=_b.length,_15=null,_16=null;
+var _17=function(){
+if(_13>=0){
+var tv=(_13==x)?null:ts(_13,x);
+_15[(_7.indexOf(tv)<0)?"tag":"oper"]=tv;
+_13=-1;
 }
 };
-var _22=function(){
-if(_17>=0){
-_1e.id=ts(_17,x).replace(/\\/g,"");
-_17=-1;
+var _18=function(){
+if(_12>=0){
+_15.id=ts(_12,x).replace(/\\/g,"");
+_12=-1;
 }
 };
-var _23=function(){
-if(_16>=0){
-_1e.classes.push(ts(_16+1,x).replace(/\\/g,""));
-_16=-1;
+var _19=function(){
+if(_11>=0){
+_15.classes.push(ts(_11+1,x).replace(/\\/g,""));
+_11=-1;
 }
 };
-var _24=function(){
-_22();
-_20();
-_23();
+var _1a=function(){
+_18();
+_17();
+_19();
 };
-var _25=function(){
-_24();
-if(_15>=0){
-_1e.pseudos.push({name:ts(_15+1,x)});
+var _1b=function(){
+_1a();
+if(_10>=0){
+_15.pseudos.push({name:ts(_10+1,x)});
 }
-_1e.loops=(_1e.pseudos.length||_1e.attrs.length||_1e.classes.length);
-_1e.oquery=_1e.query=ts(_1b,x);
-_1e.otag=_1e.tag=(_1e["oper"])?null:(_1e.tag||"*");
-if(_1e.tag){
-_1e.tag=_1e.tag.toUpperCase();
+_15.loops=(_15.pseudos.length||_15.attrs.length||_15.classes.length);
+_15.oquery=_15.query=ts(_14,x);
+_15.otag=_15.tag=(_15["oper"])?null:(_15.tag||"*");
+if(_15.tag){
+_15.tag=_15.tag.toUpperCase();
 }
-if(_11.length&&(_11[_11.length-1].oper)){
-_1e.infixOper=_11.pop();
-_1e.query=_1e.infixOper.query+" "+_1e.query;
+if(_c.length&&(_c[_c.length-1].oper)){
+_15.infixOper=_c.pop();
+_15.query=_15.infixOper.query+" "+_15.query;
 }
-_11.push(_1e);
-_1e=null;
+_c.push(_15);
+_15=null;
 };
-for(;lc=cc,cc=_d.charAt(x),x<ql;x++){
+for(;lc=cc,cc=_b.charAt(x),x<ql;x++){
 if(lc=="\\"){
 continue;
 }
-if(!_1e){
-_1b=x;
-_1e={query:null,pseudos:[],attrs:[],classes:[],tag:null,oper:null,id:null,getTag:function(){
-return (_a)?this.otag:this.tag;
+if(!_15){
+_14=x;
+_15={query:null,pseudos:[],attrs:[],classes:[],tag:null,oper:null,id:null,getTag:function(){
+return (_8)?this.otag:this.tag;
 }};
-_18=x;
+_13=x;
 }
-if(_12>=0){
+if(_d>=0){
 if(cc=="]"){
-if(!_cp.attr){
-_cp.attr=ts(_12+1,x);
+if(!_16.attr){
+_16.attr=ts(_d+1,x);
 }else{
-_cp.matchFor=ts((_14||_12+1),x);
+_16.matchFor=ts((_f||_d+1),x);
 }
-var cmf=_cp.matchFor;
+var cmf=_16.matchFor;
 if(cmf){
 if((cmf.charAt(0)=="\"")||(cmf.charAt(0)=="'")){
-_cp.matchFor=cmf.slice(1,-1);
+_16.matchFor=cmf.slice(1,-1);
 }
 }
-_1e.attrs.push(_cp);
-_cp=null;
-_12=_14=-1;
+_15.attrs.push(_16);
+_16=null;
+_d=_f=-1;
 }else{
 if(cc=="="){
-var _27=("|~^$*".indexOf(lc)>=0)?lc:"";
-_cp.type=_27+cc;
-_cp.attr=ts(_12+1,x-_27.length);
-_14=x+1;
+var _1c=("|~^$*".indexOf(lc)>=0)?lc:"";
+_16.type=_1c+cc;
+_16.attr=ts(_d+1,x-_1c.length);
+_f=x+1;
 }
 }
 }else{
-if(_13>=0){
+if(_e>=0){
 if(cc==")"){
-if(_15>=0){
-_cp.value=ts(_13+1,x);
+if(_10>=0){
+_16.value=ts(_e+1,x);
 }
-_15=_13=-1;
+_10=_e=-1;
 }
 }else{
 if(cc=="#"){
-_24();
-_17=x+1;
+_1a();
+_12=x+1;
 }else{
 if(cc=="."){
-_24();
-_16=x;
+_1a();
+_11=x;
 }else{
 if(cc==":"){
-_24();
-_15=x;
+_1a();
+_10=x;
 }else{
 if(cc=="["){
-_24();
-_12=x;
-_cp={};
+_1a();
+_d=x;
+_16={};
 }else{
 if(cc=="("){
-if(_15>=0){
-_cp={name:ts(_15+1,x),value:null};
-_1e.pseudos.push(_cp);
+if(_10>=0){
+_16={name:ts(_10+1,x),value:null};
+_15.pseudos.push(_16);
 }
-_13=x;
+_e=x;
 }else{
 if((cc==" ")&&(lc!=cc)){
-_25();
+_1b();
 }
 }
 }
@@ -160,146 +159,146 @@ _25();
 }
 }
 }
-return _11;
+return _c;
 };
-var _28=function(_29,_2a){
-if(!_29){
-return _2a;
+var _1d=function(_1e,_1f){
+if(!_1e){
+return _1f;
 }
-if(!_2a){
-return _29;
+if(!_1f){
+return _1e;
 }
 return function(){
-return _29.apply(window,arguments)&&_2a.apply(window,arguments);
+return _1e.apply(window,arguments)&&_1f.apply(window,arguments);
 };
 };
-var _2b=function(i,arr){
+var _20=function(i,arr){
 var r=arr||[];
 if(i){
 r.push(i);
 }
 return r;
 };
-var _2f=function(n){
+var _21=function(n){
 return (1==n.nodeType);
 };
-var _31="";
-var _32=function(_33,_34){
-if(!_33){
-return _31;
+var _22="";
+var _23=function(_24,_25){
+if(!_24){
+return _22;
 }
-if(_34=="class"){
-return _33.className||_31;
+if(_25=="class"){
+return _24.className||_22;
 }
-if(_34=="for"){
-return _33.htmlFor||_31;
+if(_25=="for"){
+return _24.htmlFor||_22;
 }
-if(_34=="style"){
-return _33.style.cssText||_31;
+if(_25=="style"){
+return _24.style.cssText||_22;
 }
-return (_a?_33.getAttribute(_34):_33.getAttribute(_34,2))||_31;
+return (_8?_24.getAttribute(_25):_24.getAttribute(_25,2))||_22;
+};
+var _26={"*=":function(_27,_28){
+return function(_29){
+return (_23(_29,_27).indexOf(_28)>=0);
+};
+},"^=":function(_2a,_2b){
+return function(_2c){
+return (_23(_2c,_2a).indexOf(_2b)==0);
+};
+},"$=":function(_2d,_2e){
+var _2f=" "+_2e;
+return function(_30){
+var ea=" "+_23(_30,_2d);
+return (ea.lastIndexOf(_2e)==(ea.length-_2e.length));
 };
-var _35={"*=":function(_36,_37){
+},"~=":function(_31,_32){
+var _33=" "+_32+" ";
+return function(_34){
+var ea=" "+_23(_34,_31)+" ";
+return (ea.indexOf(_33)>=0);
+};
+},"|=":function(_35,_36){
+var _37=" "+_36+"-";
 return function(_38){
-return (_32(_38,_36).indexOf(_37)>=0);
+var ea=" "+_23(_38,_35);
+return ((ea==_36)||(ea.indexOf(_37)==0));
 };
-},"^=":function(_39,_3a){
+},"=":function(_39,_3a){
 return function(_3b){
-return (_32(_3b,_39).indexOf(_3a)==0);
-};
-},"$=":function(_3c,_3d){
-var _3e=" "+_3d;
-return function(_3f){
-var ea=" "+_32(_3f,_3c);
-return (ea.lastIndexOf(_3d)==(ea.length-_3d.length));
-};
-},"~=":function(_41,_42){
-var _43=" "+_42+" ";
-return function(_44){
-var ea=" "+_32(_44,_41)+" ";
-return (ea.indexOf(_43)>=0);
-};
-},"|=":function(_46,_47){
-var _48=" "+_47+"-";
-return function(_49){
-var ea=" "+_32(_49,_46);
-return ((ea==_47)||(ea.indexOf(_48)==0));
-};
-},"=":function(_4b,_4c){
-return function(_4d){
-return (_32(_4d,_4b)==_4c);
+return (_23(_3b,_39)==_3a);
 };
 }};
-var _4e=(typeof _6().firstChild.nextElementSibling=="undefined");
-var _ns=!_4e?"nextElementSibling":"nextSibling";
-var _ps=!_4e?"previousElementSibling":"previousSibling";
-var _51=(_4e?_2f:_b);
-var _52=function(_53){
-while(_53=_53[_ps]){
-if(_51(_53)){
+var _3c=(typeof _4().firstChild.nextElementSibling=="undefined");
+var _3d=!_3c?"nextElementSibling":"nextSibling";
+var _3e=!_3c?"previousElementSibling":"previousSibling";
+var _3f=(_3c?_21:_9);
+var _40=function(_41){
+while(_41=_41[_3e]){
+if(_3f(_41)){
 return false;
 }
 }
 return true;
 };
-var _54=function(_55){
-while(_55=_55[_ns]){
-if(_51(_55)){
+var _42=function(_43){
+while(_43=_43[_3d]){
+if(_3f(_43)){
 return false;
 }
 }
 return true;
 };
-var _56=function(_57){
-var _58=_57.parentNode;
-var i=0,_5a=_58[_8],ci=(_57["_i"]||-1),cl=(_58["_l"]||-1);
-if(!_5a){
+var _44=function(_45){
+var _46=_45.parentNode;
+var i=0,_47=_46[_6],ci=(_45["_i"]||-1),cl=(_46["_l"]||-1);
+if(!_47){
 return -1;
 }
-var l=_5a.length;
+var l=_47.length;
 if(cl==l&&ci>=0&&cl>=0){
 return ci;
 }
-_58["_l"]=l;
+_46["_l"]=l;
 ci=-1;
-for(var te=_58["firstElementChild"]||_58["firstChild"];te;te=te[_ns]){
-if(_51(te)){
+for(var te=_46["firstElementChild"]||_46["firstChild"];te;te=te[_3d]){
+if(_3f(te)){
 te["_i"]=++i;
-if(_57===te){
+if(_45===te){
 ci=i;
 }
 }
 }
 return ci;
 };
-var _5f=function(_60){
-return !((_56(_60))%2);
+var _48=function(_49){
+return !((_44(_49))%2);
 };
-var _61=function(_62){
-return ((_56(_62))%2);
+var _4a=function(_4b){
+return ((_44(_4b))%2);
 };
-var _63={"checked":function(_64,_65){
-return function(_66){
-return !!d.attr(_66,"checked");
+var _4c={"checked":function(_4d,_4e){
+return function(_4f){
+return !!("checked" in _4f?_4f.checked:_4f.selected);
 };
 },"first-child":function(){
-return _52;
+return _40;
 },"last-child":function(){
-return _54;
-},"only-child":function(_67,_68){
-return function(_69){
-if(!_52(_69)){
+return _42;
+},"only-child":function(_50,_51){
+return function(_52){
+if(!_40(_52)){
 return false;
 }
-if(!_54(_69)){
+if(!_42(_52)){
 return false;
 }
 return true;
 };
-},"empty":function(_6a,_6b){
-return function(_6c){
-var cn=_6c.childNodes;
-var cnl=_6c.childNodes.length;
+},"empty":function(_53,_54){
+return function(_55){
+var cn=_55.childNodes;
+var cnl=_55.childNodes.length;
 for(var x=cnl-1;x>=0;x--){
 var nt=cn[x].nodeType;
 if((nt===1)||(nt==3)){
@@ -308,265 +307,265 @@ return false;
 }
 return true;
 };
-},"contains":function(_71,_72){
-var cz=_72.charAt(0);
+},"contains":function(_56,_57){
+var cz=_57.charAt(0);
 if(cz=="\""||cz=="'"){
-_72=_72.slice(1,-1);
+_57=_57.slice(1,-1);
 }
-return function(_74){
-return (_74.innerHTML.indexOf(_72)>=0);
+return function(_58){
+return (_58.innerHTML.indexOf(_57)>=0);
 };
-},"not":function(_75,_76){
-var p=_c(_76)[0];
-var _78={el:1};
+},"not":function(_59,_5a){
+var p=_a(_5a)[0];
+var _5b={el:1};
 if(p.tag!="*"){
-_78.tag=1;
+_5b.tag=1;
 }
 if(!p.classes.length){
-_78.classes=1;
+_5b.classes=1;
 }
-var ntf=_7a(p,_78);
-return function(_7b){
-return (!ntf(_7b));
+var ntf=_5c(p,_5b);
+return function(_5d){
+return (!ntf(_5d));
 };
-},"nth-child":function(_7c,_7d){
+},"nth-child":function(_5e,_5f){
 var pi=parseInt;
-if(_7d=="odd"){
-return _61;
+if(_5f=="odd"){
+return _4a;
 }else{
-if(_7d=="even"){
-return _5f;
+if(_5f=="even"){
+return _48;
 }
 }
-if(_7d.indexOf("n")!=-1){
-var _7f=_7d.split("n",2);
-var _80=_7f[0]?((_7f[0]=="-")?-1:pi(_7f[0])):1;
-var idx=_7f[1]?pi(_7f[1]):0;
+if(_5f.indexOf("n")!=-1){
+var _60=_5f.split("n",2);
+var _61=_60[0]?((_60[0]=="-")?-1:pi(_60[0])):1;
+var idx=_60[1]?pi(_60[1]):0;
 var lb=0,ub=-1;
-if(_80>0){
+if(_61>0){
 if(idx<0){
-idx=(idx%_80)&&(_80+(idx%_80));
+idx=(idx%_61)&&(_61+(idx%_61));
 }else{
 if(idx>0){
-if(idx>=_80){
-lb=idx-idx%_80;
+if(idx>=_61){
+lb=idx-idx%_61;
 }
-idx=idx%_80;
+idx=idx%_61;
 }
 }
 }else{
-if(_80<0){
-_80*=-1;
+if(_61<0){
+_61*=-1;
 if(idx>0){
 ub=idx;
-idx=idx%_80;
+idx=idx%_61;
 }
 }
 }
-if(_80>0){
-return function(_84){
-var i=_56(_84);
-return (i>=lb)&&(ub<0||i<=ub)&&((i%_80)==idx);
+if(_61>0){
+return function(_62){
+var i=_44(_62);
+return (i>=lb)&&(ub<0||i<=ub)&&((i%_61)==idx);
 };
 }else{
-_7d=idx;
+_5f=idx;
 }
 }
-var _86=pi(_7d);
-return function(_87){
-return (_56(_87)==_86);
+var _63=pi(_5f);
+return function(_64){
+return (_44(_64)==_63);
 };
 }};
-var _88=(d.isIE)?function(_89){
-var clc=_89.toLowerCase();
+var _65=(d.isIE)?function(_66){
+var clc=_66.toLowerCase();
 if(clc=="class"){
-_89="className";
+_66="className";
 }
-return function(_8b){
-return (_a?_8b.getAttribute(_89):_8b[_89]||_8b[clc]);
+return function(_67){
+return (_8?_67.getAttribute(_66):_67[_66]||_67[clc]);
 };
-}:function(_8c){
-return function(_8d){
-return (_8d&&_8d.getAttribute&&_8d.hasAttribute(_8c));
+}:function(_68){
+return function(_69){
+return (_69&&_69.getAttribute&&_69.hasAttribute(_68));
 };
 };
-var _7a=function(_8e,_8f){
-if(!_8e){
-return _b;
+var _5c=function(_6a,_6b){
+if(!_6a){
+return _9;
 }
-_8f=_8f||{};
+_6b=_6b||{};
 var ff=null;
-if(!("el" in _8f)){
-ff=_28(ff,_2f);
+if(!("el" in _6b)){
+ff=_1d(ff,_21);
 }
-if(!("tag" in _8f)){
-if(_8e.tag!="*"){
-ff=_28(ff,function(_91){
-return (_91&&(_91.tagName==_8e.getTag()));
+if(!("tag" in _6b)){
+if(_6a.tag!="*"){
+ff=_1d(ff,function(_6c){
+return (_6c&&(_6c.tagName==_6a.getTag()));
 });
 }
 }
-if(!("classes" in _8f)){
-_3(_8e.classes,function(_92,idx,arr){
-var re=new RegExp("(?:^|\\s)"+_92+"(?:\\s|$)");
-ff=_28(ff,function(_96){
-return re.test(_96.className);
+if(!("classes" in _6b)){
+_2(_6a.classes,function(_6d,idx,arr){
+var re=new RegExp("(?:^|\\s)"+_6d+"(?:\\s|$)");
+ff=_1d(ff,function(_6e){
+return re.test(_6e.className);
 });
 ff.count=idx;
 });
 }
-if(!("pseudos" in _8f)){
-_3(_8e.pseudos,function(_97){
-var pn=_97.name;
-if(_63[pn]){
-ff=_28(ff,_63[pn](pn,_97.value));
+if(!("pseudos" in _6b)){
+_2(_6a.pseudos,function(_6f){
+var pn=_6f.name;
+if(_4c[pn]){
+ff=_1d(ff,_4c[pn](pn,_6f.value));
 }
 });
 }
-if(!("attrs" in _8f)){
-_3(_8e.attrs,function(_99){
-var _9a;
-var a=_99.attr;
-if(_99.type&&_35[_99.type]){
-_9a=_35[_99.type](a,_99.matchFor);
+if(!("attrs" in _6b)){
+_2(_6a.attrs,function(_70){
+var _71;
+var a=_70.attr;
+if(_70.type&&_26[_70.type]){
+_71=_26[_70.type](a,_70.matchFor);
 }else{
 if(a.length){
-_9a=_88(a);
+_71=_65(a);
 }
 }
-if(_9a){
-ff=_28(ff,_9a);
+if(_71){
+ff=_1d(ff,_71);
 }
 });
 }
-if(!("id" in _8f)){
-if(_8e.id){
-ff=_28(ff,function(_9c){
-return (!!_9c&&(_9c.id==_8e.id));
+if(!("id" in _6b)){
+if(_6a.id){
+ff=_1d(ff,function(_72){
+return (!!_72&&(_72.id==_6a.id));
 });
 }
 }
 if(!ff){
-if(!("default" in _8f)){
-ff=_b;
+if(!("default" in _6b)){
+ff=_9;
 }
 }
 return ff;
 };
-var _9d=function(_9e){
-return function(_9f,ret,bag){
-while(_9f=_9f[_ns]){
-if(_4e&&(!_2f(_9f))){
+var _73=function(_74){
+return function(_75,ret,bag){
+while(_75=_75[_3d]){
+if(_3c&&(!_21(_75))){
 continue;
 }
-if((!bag||_a2(_9f,bag))&&_9e(_9f)){
-ret.push(_9f);
+if((!bag||_76(_75,bag))&&_74(_75)){
+ret.push(_75);
 }
 break;
 }
 return ret;
 };
 };
-var _a3=function(_a4){
-return function(_a5,ret,bag){
-var te=_a5[_ns];
+var _77=function(_78){
+return function(_79,ret,bag){
+var te=_79[_3d];
 while(te){
-if(_51(te)){
-if(bag&&!_a2(te,bag)){
+if(_3f(te)){
+if(bag&&!_76(te,bag)){
 break;
 }
-if(_a4(te)){
+if(_78(te)){
 ret.push(te);
 }
 }
-te=te[_ns];
+te=te[_3d];
 }
 return ret;
 };
 };
-var _a9=function(_aa){
-_aa=_aa||_b;
-return function(_ab,ret,bag){
-var te,x=0,_b0=_ab[_8];
-while(te=_b0[x++]){
-if(_51(te)&&(!bag||_a2(te,bag))&&(_aa(te,x))){
+var _7a=function(_7b){
+_7b=_7b||_9;
+return function(_7c,ret,bag){
+var te,x=0,_7d=_7c[_6];
+while(te=_7d[x++]){
+if(_3f(te)&&(!bag||_76(te,bag))&&(_7b(te,x))){
 ret.push(te);
 }
 }
 return ret;
 };
 };
-var _b1=function(_b2,_b3){
-var pn=_b2.parentNode;
+var _7e=function(_7f,_80){
+var pn=_7f.parentNode;
 while(pn){
-if(pn==_b3){
+if(pn==_80){
 break;
 }
 pn=pn.parentNode;
 }
 return !!pn;
 };
-var _b5={};
-var _b6=function(_b7){
-var _b8=_b5[_b7.query];
-if(_b8){
-return _b8;
-}
-var io=_b7.infixOper;
-var _ba=(io?io.oper:"");
-var _bb=_7a(_b7,{el:1});
-var qt=_b7.tag;
-var _bd=("*"==qt);
-var ecs=_6()["getElementsByClassName"];
-if(!_ba){
-if(_b7.id){
-_bb=(!_b7.loops&&_bd)?_b:_7a(_b7,{el:1,id:1});
-_b8=function(_bf,arr){
-var te=d.byId(_b7.id,(_bf.ownerDocument||_bf));
-if(!te||!_bb(te)){
+var _81={};
+var _82=function(_83){
+var _84=_81[_83.query];
+if(_84){
+return _84;
+}
+var io=_83.infixOper;
+var _85=(io?io.oper:"");
+var _86=_5c(_83,{el:1});
+var qt=_83.tag;
+var _87=("*"==qt);
+var ecs=_4()["getElementsByClassName"];
+if(!_85){
+if(_83.id){
+_86=(!_83.loops&&_87)?_9:_5c(_83,{el:1,id:1});
+_84=function(_88,arr){
+var te=d.byId(_83.id,(_88.ownerDocument||_88));
+if(!te||!_86(te)){
 return;
 }
-if(9==_bf.nodeType){
-return _2b(te,arr);
+if(9==_88.nodeType){
+return _20(te,arr);
 }else{
-if(_b1(te,_bf)){
-return _2b(te,arr);
+if(_7e(te,_88)){
+return _20(te,arr);
 }
 }
 };
 }else{
-if(ecs&&/\{\s*\[native code\]\s*\}/.test(String(ecs))&&_b7.classes.length&&!_7){
-_bb=_7a(_b7,{el:1,classes:1,id:1});
-var _c2=_b7.classes.join(" ");
-_b8=function(_c3,arr,bag){
-var ret=_2b(0,arr),te,x=0;
-var _c9=_c3.getElementsByClassName(_c2);
-while((te=_c9[x++])){
-if(_bb(te,_c3)&&_a2(te,bag)){
+if(ecs&&/\{\s*\[native code\]\s*\}/.test(String(ecs))&&_83.classes.length&&!_5){
+_86=_5c(_83,{el:1,classes:1,id:1});
+var _89=_83.classes.join(" ");
+_84=function(_8a,arr,bag){
+var ret=_20(0,arr),te,x=0;
+var _8b=_8a.getElementsByClassName(_89);
+while((te=_8b[x++])){
+if(_86(te,_8a)&&_76(te,bag)){
 ret.push(te);
 }
 }
 return ret;
 };
 }else{
-if(!_bd&&!_b7.loops){
-_b8=function(_ca,arr,bag){
-var ret=_2b(0,arr),te,x=0;
-var _d0=_ca.getElementsByTagName(_b7.getTag());
-while((te=_d0[x++])){
-if(_a2(te,bag)){
+if(!_87&&!_83.loops){
+_84=function(_8c,arr,bag){
+var ret=_20(0,arr),te,x=0;
+var _8d=_8c.getElementsByTagName(_83.getTag());
+while((te=_8d[x++])){
+if(_76(te,bag)){
 ret.push(te);
 }
 }
 return ret;
 };
 }else{
-_bb=_7a(_b7,{el:1,tag:1,id:1});
-_b8=function(_d1,arr,bag){
-var ret=_2b(0,arr),te,x=0;
-var _d7=_d1.getElementsByTagName(_b7.getTag());
-while((te=_d7[x++])){
-if(_bb(te,_d1)&&_a2(te,bag)){
+_86=_5c(_83,{el:1,tag:1,id:1});
+_84=function(_8e,arr,bag){
+var ret=_20(0,arr),te,x=0;
+var _8f=_8e.getElementsByTagName(_83.getTag());
+while((te=_8f[x++])){
+if(_86(te,_8e)&&_76(te,bag)){
 ret.push(te);
 }
 }
@@ -576,138 +575,143 @@ return ret;
 }
 }
 }else{
-var _d8={el:1};
-if(_bd){
-_d8.tag=1;
+var _90={el:1};
+if(_87){
+_90.tag=1;
 }
-_bb=_7a(_b7,_d8);
-if("+"==_ba){
-_b8=_9d(_bb);
+_86=_5c(_83,_90);
+if("+"==_85){
+_84=_73(_86);
 }else{
-if("~"==_ba){
-_b8=_a3(_bb);
+if("~"==_85){
+_84=_77(_86);
 }else{
-if(">"==_ba){
-_b8=_a9(_bb);
+if(">"==_85){
+_84=_7a(_86);
 }
 }
 }
 }
-return _b5[_b7.query]=_b8;
+return _81[_83.query]=_84;
 };
-var _d9=function(_da,_db){
-var _dc=_2b(_da),qp,x,te,qpl=_db.length,bag,ret;
+var _91=function(_92,_93){
+var _94=_20(_92),qp,x,te,qpl=_93.length,bag,ret;
 for(var i=0;i<qpl;i++){
 ret=[];
-qp=_db[i];
-x=_dc.length-1;
+qp=_93[i];
+x=_94.length-1;
 if(x>0){
 bag={};
 ret.nozip=true;
 }
-var gef=_b6(qp);
-while(te=_dc[x--]){
+var gef=_82(qp);
+for(var j=0;(te=_94[j]);j++){
 gef(te,ret,bag);
 }
 if(!ret.length){
 break;
 }
-_dc=ret;
+_94=ret;
 }
 return ret;
 };
-var _e5={},_e6={};
-var _e7=function(_e8){
-var _e9=_c(_2(_e8));
-if(_e9.length==1){
-var tef=_b6(_e9[0]);
-return function(_eb){
-var r=tef(_eb,new _4());
+var _95={},_96={};
+var _97=function(_98){
+var _99=_a(_1(_98));
+if(_99.length==1){
+var tef=_82(_99[0]);
+return function(_9a){
+var r=tef(_9a,new _3());
 if(r){
 r.nozip=true;
 }
 return r;
 };
 }
-return function(_ed){
-return _d9(_ed,_e9);
+return function(_9b){
+return _91(_9b,_99);
 };
 };
 var nua=navigator.userAgent;
 var wk="WebKit/";
-var _f0=(d.isWebKit&&(nua.indexOf(wk)>0)&&(parseFloat(nua.split(wk)[1])>528));
-var _f1=d.isIE?"commentStrip":"nozip";
+var _9c=(d.isWebKit&&(nua.indexOf(wk)>0)&&(parseFloat(nua.split(wk)[1])>528));
+var _9d=d.isIE?"commentStrip":"nozip";
 var qsa="querySelectorAll";
-var _f3=(!!_6()[qsa]&&(!d.isSafari||(d.isSafari>3.1)||_f0));
-var _f4=function(_f5,_f6){
-if(_f3){
-var _f7=_e6[_f5];
-if(_f7&&!_f6){
-return _f7;
-}
-}
-var _f8=_e5[_f5];
-if(_f8){
-return _f8;
-}
-var qcz=_f5.charAt(0);
-var _fa=(-1==_f5.indexOf(" "));
-if((_f5.indexOf("#")>=0)&&(_fa)){
-_f6=true;
-}
-var _fb=(_f3&&(!_f6)&&(_9.indexOf(qcz)==-1)&&(!d.isIE||(_f5.indexOf(":")==-1))&&(!(_7&&(_f5.indexOf(".")>=0)))&&(_f5.indexOf(":contains")==-1)&&(_f5.indexOf("|=")==-1));
-if(_fb){
-var tq=(_9.indexOf(_f5.charAt(_f5.length-1))>=0)?(_f5+" *"):_f5;
-return _e6[_f5]=function(_fd){
+var _9e=(!!_4()[qsa]&&(!d.isSafari||(d.isSafari>3.1)||_9c));
+var _9f=/n\+\d|([^ ])?([>~+])([^ =])?/g;
+var _a0=function(_a1,pre,ch,_a2){
+return ch?(pre?pre+" ":"")+ch+(_a2?" "+_a2:""):_a1;
+};
+var _a3=function(_a4,_a5){
+_a4=_a4.replace(_9f,_a0);
+if(_9e){
+var _a6=_96[_a4];
+if(_a6&&!_a5){
+return _a6;
+}
+}
+var _a7=_95[_a4];
+if(_a7){
+return _a7;
+}
+var qcz=_a4.charAt(0);
+var _a8=(-1==_a4.indexOf(" "));
+if((_a4.indexOf("#")>=0)&&(_a8)){
+_a5=true;
+}
+var _a9=(_9e&&(!_a5)&&(_7.indexOf(qcz)==-1)&&(!d.isIE||(_a4.indexOf(":")==-1))&&(!(_5&&(_a4.indexOf(".")>=0)))&&(_a4.indexOf(":contains")==-1)&&(_a4.indexOf(":checked")==-1)&&(_a4.indexOf("|=")==-1));
+if(_a9){
+var tq=(_7.indexOf(_a4.charAt(_a4.length-1))>=0)?(_a4+" *"):_a4;
+return _96[_a4]=function(_aa){
 try{
-if(!((9==_fd.nodeType)||_fa)){
+if(!((9==_aa.nodeType)||_a8)){
 throw "";
 }
-var r=_fd[qsa](tq);
-r[_f1]=true;
+var r=_aa[qsa](tq);
+r[_9d]=true;
 return r;
 }
 catch(e){
-return _f4(_f5,true)(_fd);
+return _a3(_a4,true)(_aa);
 }
 };
 }else{
-var _ff=_f5.split(/\s*,\s*/);
-return _e5[_f5]=((_ff.length<2)?_e7(_f5):function(root){
-var _101=0,ret=[],tp;
-while((tp=_ff[_101++])){
-ret=ret.concat(_e7(tp)(root));
+var _ab=_a4.split(/\s*,\s*/);
+return _95[_a4]=((_ab.length<2)?_97(_a4):function(_ac){
+var _ad=0,ret=[],tp;
+while((tp=_ab[_ad++])){
+ret=ret.concat(_97(tp)(_ac));
 }
 return ret;
 });
 }
 };
-var _104=0;
-var _105=d.isIE?function(node){
-if(_a){
-return (node.getAttribute("_uid")||node.setAttribute("_uid",++_104)||_104);
+var _ae=0;
+var _af=d.isIE?function(_b0){
+if(_8){
+return (_b0.getAttribute("_uid")||_b0.setAttribute("_uid",++_ae)||_ae);
 }else{
-return node.uniqueID;
+return _b0.uniqueID;
 }
-}:function(node){
-return (node._uid||(node._uid=++_104));
+}:function(_b1){
+return (_b1._uid||(_b1._uid=++_ae));
 };
-var _a2=function(node,bag){
+var _76=function(_b2,bag){
 if(!bag){
 return 1;
 }
-var id=_105(node);
+var id=_af(_b2);
 if(!bag[id]){
 return bag[id]=1;
 }
 return 0;
 };
-var _10b="_zipIdx";
-var _zip=function(arr){
+var _b3="_zipIdx";
+var _b4=function(arr){
 if(arr&&arr.nozip){
-return (_4._wrap)?_4._wrap(arr):arr;
+return (_3._wrap)?_3._wrap(arr):arr;
 }
-var ret=new _4();
+var ret=new _3();
 if(!arr||!arr.length){
 return ret;
 }
@@ -717,21 +721,21 @@ ret.push(arr[0]);
 if(arr.length<2){
 return ret;
 }
-_104++;
-if(d.isIE&&_a){
-var _10f=_104+"";
-arr[0].setAttribute(_10b,_10f);
+_ae++;
+if(d.isIE&&_8){
+var _b5=_ae+"";
+arr[0].setAttribute(_b3,_b5);
 for(var x=1,te;te=arr[x];x++){
-if(arr[x].getAttribute(_10b)!=_10f){
+if(arr[x].getAttribute(_b3)!=_b5){
 ret.push(te);
 }
-te.setAttribute(_10b,_10f);
+te.setAttribute(_b3,_b5);
 }
 }else{
 if(d.isIE&&arr.commentStrip){
 try{
 for(var x=1,te;te=arr[x];x++){
-if(_2f(te)){
+if(_21(te)){
 ret.push(te);
 }
 }
@@ -740,54 +744,54 @@ catch(e){
 }
 }else{
 if(arr[0]){
-arr[0][_10b]=_104;
+arr[0][_b3]=_ae;
 }
 for(var x=1,te;te=arr[x];x++){
-if(arr[x][_10b]!=_104){
+if(arr[x][_b3]!=_ae){
 ret.push(te);
 }
-te[_10b]=_104;
+te[_b3]=_ae;
 }
 }
 }
 return ret;
 };
-d.query=function(_112,root){
-_4=d._queryListCtor;
-if(!_112){
-return new _4();
+d.query=function(_b6,_b7){
+_3=d._NodeListCtor;
+if(!_b6){
+return new _3();
 }
-if(_112.constructor==_4){
-return _112;
+if(_b6.constructor==_3){
+return _b6;
 }
-if(!_5(_112)){
-return new _4(_112);
+if(typeof _b6!="string"){
+return new _3(_b6);
 }
-if(_5(root)){
-root=d.byId(root);
-if(!root){
-return new _4();
+if(typeof _b7=="string"){
+_b7=d.byId(_b7);
+if(!_b7){
+return new _3();
 }
 }
-root=root||_6();
-var od=root.ownerDocument||root.documentElement;
-_a=(root.contentType&&root.contentType=="application/xml")||(d.isOpera&&(root.doctype||od.toString()=="[object XMLDocument]"))||(!!od)&&(d.isIE?od.xml:(root.xmlVersion||od.xmlVersion));
-var r=_f4(_112)(root);
-if(r&&r.nozip&&!_4._wrap){
+_b7=_b7||_4();
+var od=_b7.ownerDocument||_b7.documentElement;
+_8=(_b7.contentType&&_b7.contentType=="application/xml")||(d.isOpera&&(_b7.doctype||od.toString()=="[object XMLDocument]"))||(!!od)&&(d.isIE?od.xml:(_b7.xmlVersion||od.xmlVersion));
+var r=_a3(_b6)(_b7);
+if(r&&r.nozip&&!_3._wrap){
 return r;
 }
-return _zip(r);
+return _b4(r);
 };
-d.query.pseudos=_63;
-d._filterQueryResult=function(_116,_117){
-var _118=new d._queryListCtor();
-var _119=_7a(_c(_117)[0]);
-for(var x=0,te;te=_116[x];x++){
-if(_119(te)){
-_118.push(te);
+d.query.pseudos=_4c;
+d._filterQueryResult=function(_b8,_b9){
+var _ba=new d._NodeListCtor();
+var _bb=_5c(_a(_b9)[0]);
+for(var x=0,te;te=_b8[x];x++){
+if(_bb(te)){
+_ba.push(te);
 }
 }
-return _118;
+return _ba;
 };
 })(this["queryPortability"]||this["acme"]||dojo);
 }
diff --git a/dojo/_base/window.js b/dojo/_base/window.js
index a27d958..4e5f36d 100644
--- a/dojo/_base/window.js
+++ b/dojo/_base/window.js
@@ -27,20 +27,23 @@ dojo.global=_7;
 }
 };
 dojo.withDoc=function(_8,_9,_a,_b){
-var _c=dojo.doc,_d=dojo._bodyLtr;
+var _c=dojo.doc,_d=dojo._bodyLtr,_e=dojo.isQuirks;
 try{
 dojo.doc=_8;
 delete dojo._bodyLtr;
-if(_a&&dojo.isString(_9)){
+dojo.isQuirks=dojo.doc.compatMode=="BackCompat";
+if(_a&&typeof _9=="string"){
 _9=_a[_9];
 }
 return _9.apply(_a,_b||[]);
 }
 finally{
 dojo.doc=_c;
+delete dojo._bodyLtr;
 if(_d!==undefined){
 dojo._bodyLtr=_d;
 }
+dojo.isQuirks=_e;
 }
 };
 }
diff --git a/dojo/_base/xhr.js b/dojo/_base/xhr.js
index 8f739a7..0c7084e 100644
--- a/dojo/_base/xhr.js
+++ b/dojo/_base/xhr.js
@@ -13,126 +13,141 @@ dojo.require("dojo._base.json");
 dojo.require("dojo._base.lang");
 dojo.require("dojo._base.query");
 (function(){
-var _d=dojo;
-function _2(_3,_4,_5){
-var _6=_3[_4];
-if(_d.isString(_6)){
-_3[_4]=[_6,_5];
+var _1=dojo,_2=_1.config;
+function _3(_4,_5,_6){
+if(_6===null){
+return;
+}
+var _7=_4[_5];
+if(typeof _7=="string"){
+_4[_5]=[_7,_6];
 }else{
-if(_d.isArray(_6)){
-_6.push(_5);
+if(_1.isArray(_7)){
+_7.push(_6);
 }else{
-_3[_4]=_5;
+_4[_5]=_6;
 }
 }
 };
-dojo.formToObject=function(_7){
-var _8={};
-var _9="file|submit|image|reset|button|";
-_d.forEach(dojo.byId(_7).elements,function(_a){
+dojo.fieldToObject=function(_8){
+var _9=null;
+var _a=_1.byId(_8);
+if(_a){
 var _b=_a.name;
 var _c=(_a.type||"").toLowerCase();
-if(_b&&_c&&_9.indexOf(_c)==-1&&!_a.disabled){
+if(_b&&_c&&!_a.disabled){
 if(_c=="radio"||_c=="checkbox"){
 if(_a.checked){
-_2(_8,_b,_a.value);
+_9=_a.value;
 }
 }else{
 if(_a.multiple){
-_8[_b]=[];
-_d.query("option",_a).forEach(function(_d){
+_9=[];
+_1.query("option",_a).forEach(function(_d){
 if(_d.selected){
-_2(_8,_b,_d.value);
+_9.push(_d.value);
 }
 });
 }else{
-_2(_8,_b,_a.value);
-if(_c=="image"){
-_8[_b+".x"]=_8[_b+".y"]=_8[_b].x=_8[_b].y=0;
+_9=_a.value;
+}
+}
 }
 }
+return _9;
+};
+dojo.formToObject=function(_e){
+var _f={};
+var _10="file|submit|image|reset|button|";
+_1.forEach(dojo.byId(_e).elements,function(_11){
+var _12=_11.name;
+var _13=(_11.type||"").toLowerCase();
+if(_12&&_13&&_10.indexOf(_13)==-1&&!_11.disabled){
+_3(_f,_12,_1.fieldToObject(_11));
+if(_13=="image"){
+_f[_12+".x"]=_f[_12+".y"]=_f[_12].x=_f[_12].y=0;
 }
 }
 });
-return _8;
+return _f;
 };
-dojo.objectToQuery=function(_e){
-var _f=encodeURIComponent;
-var _10=[];
-var _11={};
-for(var _12 in _e){
-var _13=_e[_12];
-if(_13!=_11[_12]){
-var _14=_f(_12)+"=";
-if(_d.isArray(_13)){
-for(var i=0;i<_13.length;i++){
-_10.push(_14+_f(_13[i]));
+dojo.objectToQuery=function(map){
+var enc=encodeURIComponent;
+var _14=[];
+var _15={};
+for(var _16 in map){
+var _17=map[_16];
+if(_17!=_15[_16]){
+var _18=enc(_16)+"=";
+if(_1.isArray(_17)){
+for(var i=0;i<_17.length;i++){
+_14.push(_18+enc(_17[i]));
 }
 }else{
-_10.push(_14+_f(_13));
+_14.push(_18+enc(_17));
 }
 }
 }
-return _10.join("&");
+return _14.join("&");
 };
-dojo.formToQuery=function(_16){
-return _d.objectToQuery(_d.formToObject(_16));
+dojo.formToQuery=function(_19){
+return _1.objectToQuery(_1.formToObject(_19));
 };
-dojo.formToJson=function(_17,_18){
-return _d.toJson(_d.formToObject(_17),_18);
+dojo.formToJson=function(_1a,_1b){
+return _1.toJson(_1.formToObject(_1a),_1b);
 };
 dojo.queryToObject=function(str){
 var ret={};
 var qp=str.split("&");
 var dec=decodeURIComponent;
-_d.forEach(qp,function(_1d){
-if(_1d.length){
-var _1e=_1d.split("=");
-var _1f=dec(_1e.shift());
-var val=dec(_1e.join("="));
-if(_d.isString(ret[_1f])){
-ret[_1f]=[ret[_1f]];
-}
-if(_d.isArray(ret[_1f])){
-ret[_1f].push(val);
+_1.forEach(qp,function(_1c){
+if(_1c.length){
+var _1d=_1c.split("=");
+var _1e=dec(_1d.shift());
+var val=dec(_1d.join("="));
+if(typeof ret[_1e]=="string"){
+ret[_1e]=[ret[_1e]];
+}
+if(_1.isArray(ret[_1e])){
+ret[_1e].push(val);
 }else{
-ret[_1f]=val;
+ret[_1e]=val;
 }
 }
 });
 return ret;
 };
 dojo._blockAsync=false;
-dojo._contentHandlers={text:function(xhr){
+var _1f=_1._contentHandlers=dojo.contentHandlers={text:function(xhr){
 return xhr.responseText;
 },json:function(xhr){
-return _d.fromJson(xhr.responseText||null);
+return _1.fromJson(xhr.responseText||null);
 },"json-comment-filtered":function(xhr){
 if(!dojo.config.useCommentedJson){
 console.warn("Consider using the standard mimetype:application/json."+" json-commenting can introduce security issues. To"+" decrease the chances of hijacking, use the standard the 'json' handler and"+" prefix your json with: {}&&\n"+"Use djConfig.useCommentedJson=true to turn off this message.");
 }
-var _24=xhr.responseText;
-var _25=_24.indexOf("/*");
-var _26=_24.lastIndexOf("*/");
-if(_25==-1||_26==-1){
+var _20=xhr.responseText;
+var _21=_20.indexOf("/*");
+var _22=_20.lastIndexOf("*/");
+if(_21==-1||_22==-1){
 throw new Error("JSON was not comment filtered");
 }
-return _d.fromJson(_24.substring(_25+2,_26));
+return _1.fromJson(_20.substring(_21+2,_22));
 },javascript:function(xhr){
-return _d.eval(xhr.responseText);
+return _1.eval(xhr.responseText);
 },xml:function(xhr){
-var _29=xhr.responseXML;
-if(_d.isIE&&(!_29||!_29.documentElement)){
+var _23=xhr.responseXML;
+if(_1.isIE&&(!_23||!_23.documentElement)){
 var ms=function(n){
 return "MSXML"+n+".DOMDocument";
 };
 var dp=["Microsoft.XMLDOM",ms(6),ms(4),ms(3),ms(2)];
-_d.some(dp,function(p){
+_1.some(dp,function(p){
 try{
 var dom=new ActiveXObject(p);
 dom.async=false;
 dom.loadXML(xhr.responseText);
-_29=dom;
+_23=dom;
 }
 catch(e){
 return false;
@@ -140,67 +155,78 @@ return false;
 return true;
 });
 }
-return _29;
-}};
-dojo._contentHandlers["json-comment-optional"]=function(xhr){
-var _30=_d._contentHandlers;
-if(xhr.responseText&&xhr.responseText.indexOf("/*")!=-1){
-return _30["json-comment-filtered"](xhr);
+return _23;
+},"json-comment-optional":function(xhr){
+if(xhr.responseText&&/^[^{\[]*\/\*/.test(xhr.responseText)){
+return _1f["json-comment-filtered"](xhr);
 }else{
-return _30["json"](xhr);
+return _1f["json"](xhr);
 }
-};
-dojo._ioSetArgs=function(_31,_32,_33,_34){
-var _35={args:_31,url:_31.url};
-var _36=null;
-if(_31.form){
-var _37=_d.byId(_31.form);
-var _38=_37.getAttributeNode("action");
-_35.url=_35.url||(_38?_38.value:null);
-_36=_d.formToObject(_37);
-}
-var _39=[{}];
-if(_36){
-_39.push(_36);
-}
-if(_31.content){
-_39.push(_31.content);
-}
-if(_31.preventCache){
-_39.push({"dojo.preventCache":new Date().valueOf()});
-}
-_35.query=_d.objectToQuery(_d.mixin.apply(null,_39));
-_35.handleAs=_31.handleAs||"text";
-var d=new _d.Deferred(_32);
-d.addCallbacks(_33,function(_3b){
-return _34(_3b,d);
+}};
+dojo._ioSetArgs=function(_24,_25,_26,_27){
+var _28={args:_24,url:_24.url};
+var _29=null;
+if(_24.form){
+var _2a=_1.byId(_24.form);
+var _2b=_2a.getAttributeNode("action");
+_28.url=_28.url||(_2b?_2b.value:null);
+_29=_1.formToObject(_2a);
+}
+var _2c=[{}];
+if(_29){
+_2c.push(_29);
+}
+if(_24.content){
+_2c.push(_24.content);
+}
+if(_24.preventCache){
+_2c.push({"dojo.preventCache":new Date().valueOf()});
+}
+_28.query=_1.objectToQuery(_1.mixin.apply(null,_2c));
+_28.handleAs=_24.handleAs||"text";
+var d=new _1.Deferred(_25);
+d.addCallbacks(_26,function(_2d){
+return _27(_2d,d);
 });
-var ld=_31.load;
-if(ld&&_d.isFunction(ld)){
-d.addCallback(function(_3d){
-return ld.call(_31,_3d,_35);
+var ld=_24.load;
+if(ld&&_1.isFunction(ld)){
+d.addCallback(function(_2e){
+return ld.call(_24,_2e,_28);
 });
 }
-var err=_31.error;
-if(err&&_d.isFunction(err)){
-d.addErrback(function(_3f){
-return err.call(_31,_3f,_35);
+var err=_24.error;
+if(err&&_1.isFunction(err)){
+d.addErrback(function(_2f){
+return err.call(_24,_2f,_28);
 });
 }
-var _40=_31.handle;
-if(_40&&_d.isFunction(_40)){
-d.addBoth(function(_41){
-return _40.call(_31,_41,_35);
+var _30=_24.handle;
+if(_30&&_1.isFunction(_30)){
+d.addBoth(function(_31){
+return _30.call(_24,_31,_28);
 });
 }
-d.ioArgs=_35;
+if(_2.ioPublish&&_1.publish&&_28.args.ioPublish!==false){
+d.addCallbacks(function(res){
+_1.publish("/dojo/io/load",[d,res]);
+return res;
+},function(res){
+_1.publish("/dojo/io/error",[d,res]);
+return res;
+});
+d.addBoth(function(res){
+_1.publish("/dojo/io/done",[d,res]);
+return res;
+});
+}
+d.ioArgs=_28;
 return d;
 };
-var _42=function(dfd){
+var _32=function(dfd){
 dfd.canceled=true;
 var xhr=dfd.ioArgs.xhr;
-var _at=typeof xhr.abort;
-if(_at=="function"||_at=="object"||_at=="unknown"){
+var _33=typeof xhr.abort;
+if(_33=="function"||_33=="object"||_33=="unknown"){
 xhr.abort();
 }
 var err=dfd.ioArgs.error;
@@ -210,46 +236,60 @@ err.dojoType="cancel";
 }
 return err;
 };
-var _47=function(dfd){
-var ret=_d._contentHandlers[dfd.ioArgs.handleAs](dfd.ioArgs.xhr);
+var _34=function(dfd){
+var ret=_1f[dfd.ioArgs.handleAs](dfd.ioArgs.xhr);
 return ret===undefined?null:ret;
 };
-var _4a=function(_4b,dfd){
-console.error(_4b);
-return _4b;
+var _35=function(_36,dfd){
+if(!dfd.ioArgs.args.failOk){
+console.error(_36);
+}
+return _36;
 };
-var _4d=null;
-var _4e=[];
-var _4f=function(){
+var _37=null;
+var _38=[];
+var _39=0;
+var _3a=function(dfd){
+if(_39<=0){
+_39=0;
+if(_2.ioPublish&&_1.publish&&(!dfd||dfd&&dfd.ioArgs.args.ioPublish!==false)){
+_1.publish("/dojo/io/stop");
+}
+}
+};
+var _3b=function(){
 var now=(new Date()).getTime();
-if(!_d._blockAsync){
-for(var i=0,tif;i<_4e.length&&(tif=_4e[i]);i++){
+if(!_1._blockAsync){
+for(var i=0,tif;i<_38.length&&(tif=_38[i]);i++){
 var dfd=tif.dfd;
-var _54=function(){
+var _3c=function(){
 if(!dfd||dfd.canceled||!tif.validCheck(dfd)){
-_4e.splice(i--,1);
+_38.splice(i--,1);
+_39-=1;
 }else{
 if(tif.ioCheck(dfd)){
-_4e.splice(i--,1);
+_38.splice(i--,1);
 tif.resHandle(dfd);
+_39-=1;
 }else{
 if(dfd.startTime){
 if(dfd.startTime+(dfd.ioArgs.args.timeout||0)<now){
-_4e.splice(i--,1);
+_38.splice(i--,1);
 var err=new Error("timeout exceeded");
 err.dojoType="timeout";
 dfd.errback(err);
 dfd.cancel();
+_39-=1;
 }
 }
 }
 }
 };
 if(dojo.config.debugAtAllCosts){
-_54.call(this);
+_3c.call(this);
 }else{
 try{
-_54.call(this);
+_3c.call(this);
 }
 catch(e){
 dfd.errback(e);
@@ -257,15 +297,16 @@ dfd.errback(e);
 }
 }
 }
-if(!_4e.length){
-clearInterval(_4d);
-_4d=null;
+_3a(dfd);
+if(!_38.length){
+clearInterval(_37);
+_37=null;
 return;
 }
 };
 dojo._ioCancelAll=function(){
 try{
-_d.forEach(_4e,function(i){
+_1.forEach(_38,function(i){
 try{
 i.dfd.cancel();
 }
@@ -276,32 +317,41 @@ catch(e){
 catch(e){
 }
 };
-if(_d.isIE){
-_d.addOnWindowUnload(_d._ioCancelAll);
+if(_1.isIE){
+_1.addOnWindowUnload(_1._ioCancelAll);
+}
+_1._ioNotifyStart=function(dfd){
+if(_2.ioPublish&&_1.publish&&dfd.ioArgs.args.ioPublish!==false){
+if(!_39){
+_1.publish("/dojo/io/start");
 }
-_d._ioWatch=function(dfd,_58,_59,_5a){
-var _5b=dfd.ioArgs.args;
-if(_5b.timeout){
+_39+=1;
+_1.publish("/dojo/io/send",[dfd]);
+}
+};
+_1._ioWatch=function(dfd,_3d,_3e,_3f){
+var _40=dfd.ioArgs.args;
+if(_40.timeout){
 dfd.startTime=(new Date()).getTime();
 }
-_4e.push({dfd:dfd,validCheck:_58,ioCheck:_59,resHandle:_5a});
-if(!_4d){
-_4d=setInterval(_4f,50);
+_38.push({dfd:dfd,validCheck:_3d,ioCheck:_3e,resHandle:_3f});
+if(!_37){
+_37=setInterval(_3b,50);
 }
-if(_5b.sync){
-_4f();
+if(_40.sync){
+_3b();
 }
 };
-var _5c="application/x-www-form-urlencoded";
-var _5d=function(dfd){
+var _41="application/x-www-form-urlencoded";
+var _42=function(dfd){
 return dfd.ioArgs.xhr.readyState;
 };
-var _5f=function(dfd){
+var _43=function(dfd){
 return 4==dfd.ioArgs.xhr.readyState;
 };
-var _61=function(dfd){
+var _44=function(dfd){
 var xhr=dfd.ioArgs.xhr;
-if(_d._isDocumentOk(xhr)){
+if(_1._isDocumentOk(xhr)){
 dfd.callback(dfd);
 }else{
 var err=new Error("Unable to load "+dfd.ioArgs.url+" status:"+xhr.status);
@@ -310,68 +360,78 @@ err.responseText=xhr.responseText;
 dfd.errback(err);
 }
 };
-dojo._ioAddQueryToUrl=function(_65){
-if(_65.query.length){
-_65.url+=(_65.url.indexOf("?")==-1?"?":"&")+_65.query;
-_65.query=null;
+dojo._ioAddQueryToUrl=function(_45){
+if(_45.query.length){
+_45.url+=(_45.url.indexOf("?")==-1?"?":"&")+_45.query;
+_45.query=null;
 }
 };
-dojo.xhr=function(_66,_67,_68){
-var dfd=_d._ioSetArgs(_67,_42,_47,_4a);
-dfd.ioArgs.xhr=_d._xhrObj(dfd.ioArgs.args);
-if(_68){
-if("postData" in _67){
-dfd.ioArgs.query=_67.postData;
+dojo.xhr=function(_46,_47,_48){
+var dfd=_1._ioSetArgs(_47,_32,_34,_35);
+var _49=dfd.ioArgs;
+var xhr=_49.xhr=_1._xhrObj(_49.args);
+if(!xhr){
+dfd.cancel();
+return dfd;
+}
+if("postData" in _47){
+_49.query=_47.postData;
+}else{
+if("putData" in _47){
+_49.query=_47.putData;
 }else{
-if("putData" in _67){
-dfd.ioArgs.query=_67.putData;
+if("rawBody" in _47){
+_49.query=_47.rawBody;
+}else{
+if((arguments.length>2&&!_48)||"POST|PUT".indexOf(_46.toUpperCase())==-1){
+_1._ioAddQueryToUrl(_49);
 }
 }
+}
+}
+xhr.open(_46,_49.url,_47.sync!==true,_47.user||undefined,_47.password||undefined);
+if(_47.headers){
+for(var hdr in _47.headers){
+if(hdr.toLowerCase()==="content-type"&&!_47.contentType){
+_47.contentType=_47.headers[hdr];
 }else{
-_d._ioAddQueryToUrl(dfd.ioArgs);
-}
-var _6a=dfd.ioArgs;
-var xhr=_6a.xhr;
-xhr.open(_66,_6a.url,_67.sync!==true,_67.user||undefined,_67.password||undefined);
-if(_67.headers){
-for(var hdr in _67.headers){
-if(hdr.toLowerCase()==="content-type"&&!_67.contentType){
-_67.contentType=_67.headers[hdr];
-}else{
-xhr.setRequestHeader(hdr,_67.headers[hdr]);
+if(_47.headers[hdr]){
+xhr.setRequestHeader(hdr,_47.headers[hdr]);
+}
 }
 }
 }
-xhr.setRequestHeader("Content-Type",_67.contentType||_5c);
-if(!_67.headers||!_67.headers["X-Requested-With"]){
+xhr.setRequestHeader("Content-Type",_47.contentType||_41);
+if(!_47.headers||!("X-Requested-With" in _47.headers)){
 xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");
 }
+_1._ioNotifyStart(dfd);
 if(dojo.config.debugAtAllCosts){
-xhr.send(_6a.query);
+xhr.send(_49.query);
 }else{
 try{
-xhr.send(_6a.query);
+xhr.send(_49.query);
 }
 catch(e){
-dfd.ioArgs.error=e;
+_49.error=e;
 dfd.cancel();
 }
 }
-_d._ioWatch(dfd,_5d,_5f,_61);
+_1._ioWatch(dfd,_42,_43,_44);
 xhr=null;
 return dfd;
 };
-dojo.xhrGet=function(_6d){
-return _d.xhr("GET",_6d);
+dojo.xhrGet=function(_4a){
+return _1.xhr("GET",_4a);
 };
-dojo.rawXhrPost=dojo.xhrPost=function(_6e){
-return _d.xhr("POST",_6e,true);
+dojo.rawXhrPost=dojo.xhrPost=function(_4b){
+return _1.xhr("POST",_4b,true);
 };
-dojo.rawXhrPut=dojo.xhrPut=function(_6f){
-return _d.xhr("PUT",_6f,true);
+dojo.rawXhrPut=dojo.xhrPut=function(_4c){
+return _1.xhr("PUT",_4c,true);
 };
-dojo.xhrDelete=function(_70){
-return _d.xhr("DELETE",_70);
+dojo.xhrDelete=function(_4d){
+return _1.xhr("DELETE",_4d);
 };
 })();
 }
diff --git a/dojo/_firebug/firebug.js b/dojo/_firebug/firebug.js
index 0700287..1f83c31 100644
--- a/dojo/_firebug/firebug.js
+++ b/dojo/_firebug/firebug.js
@@ -25,8 +25,28 @@ _7+=" "+_6;
 }
 console.warn(_7);
 };
-if(!window.firebug&&!dojo.config.useCustomLogger&&!dojo.isAIR&&(!dojo.isMoz||(dojo.isMoz&&!("console" in window))||(dojo.isMoz&&!(window.loadFirebugConsole||console.firebug)))){
 (function(){
+var _8=(/Trident/.test(window.navigator.userAgent));
+if(_8){
+var _9=["log","info","debug","warn","error"];
+for(var i=0;i<_9.length;i++){
+var m=_9[i];
+var n="_"+_9[i];
+console[n]=console[m];
+console[m]=(function(){
+var _a=n;
+return function(){
+console[_a](Array.prototype.slice.call(arguments).join(" "));
+};
+})();
+}
+try{
+console.clear();
+}
+catch(e){
+}
+}
+if(!dojo.isFF&&(!dojo.isChrome||dojo.isChrome<3)&&(!dojo.isSafari||dojo.isSafari<4)&&!_8&&!window.firebug&&(typeof console!="undefined"&&!console.firebug)&&!dojo.config.useCustomLogger&&!dojo.isAIR){
 try{
 if(window!=window.parent){
 if(window.parent["console"]){
@@ -37,46 +57,46 @@ return;
 }
 catch(e){
 }
-var _8=document;
-var _9=window;
-var _a=0;
-var _b=null;
-var _c=null;
-var _d=null;
+var _b=document;
+var _c=window;
+var _d=0;
 var _e=null;
 var _f=null;
 var _10=null;
-var _11=false;
-var _12=[];
-var _13=[];
-var _14={};
-var _15={};
-var _16=null;
-var _17;
-var _18;
-var _19=false;
-var _1a=null;
-var _1b=document.createElement("div");
-var _1c;
-var _1d;
+var _11=null;
+var _12=null;
+var _13=null;
+var _14=false;
+var _15=[];
+var _16=[];
+var _17={};
+var _18={};
+var _19=null;
+var _1a;
+var _1b;
+var _1c=false;
+var _1d=null;
+var _1e=document.createElement("div");
+var _1f;
+var _20;
 window.console={_connects:[],log:function(){
-_1e(arguments,"");
+_21(arguments,"");
 },debug:function(){
-_1e(arguments,"debug");
+_21(arguments,"debug");
 },info:function(){
-_1e(arguments,"info");
+_21(arguments,"info");
 },warn:function(){
-_1e(arguments,"warning");
+_21(arguments,"warning");
 },error:function(){
-_1e(arguments,"error");
-},assert:function(_1f,_20){
-if(!_1f){
-var _21=[];
+_21(arguments,"error");
+},assert:function(_22,_23){
+if(!_22){
+var _24=[];
 for(var i=1;i<arguments.length;++i){
-_21.push(arguments[i]);
+_24.push(arguments[i]);
 }
-_1e(_21.length?_21:["Assertion Failure"],"error");
-throw _20?_20:"Assertion Failure";
+_21(_24.length?_24:["Assertion Failure"],"error");
+throw _23?_23:"Assertion Failure";
 }
 },dir:function(obj){
 var str=_25(obj);
@@ -92,33 +112,30 @@ _26(arguments,"group",_2a);
 },groupEnd:function(){
 _26(arguments,"",_2b);
 },time:function(_2c){
-_14[_2c]=new Date().getTime();
+_17[_2c]=new Date().getTime();
 },timeEnd:function(_2d){
-if(_2d in _14){
-var _2e=(new Date()).getTime()-_14[_2d];
-_1e([_2d+":",_2e+"ms"]);
-delete _14[_2d];
+if(_2d in _17){
+var _2e=(new Date()).getTime()-_17[_2d];
+_21([_2d+":",_2e+"ms"]);
+delete _17[_2d];
 }
 },count:function(_2f){
-if(!_15[_2f]){
-_15[_2f]=0;
+if(!_18[_2f]){
+_18[_2f]=0;
 }
-_15[_2f]++;
-_1e([_2f+": "+_15[_2f]]);
+_18[_2f]++;
+_21([_2f+": "+_18[_2f]]);
 },trace:function(_30){
 var _31=_30||3;
 var f=console.trace.caller;
-
 for(var i=0;i<_31;i++){
-var _34=f.toString();
-var _35=[];
+var _32=f.toString();
+var _33=[];
 for(var a=0;a<f.arguments.length;a++){
-_35.push(f.arguments[a]);
+_33.push(f.arguments[a]);
 }
 if(f.arguments.length){
-
 }else{
-
 }
 f=f.caller;
 }
@@ -126,73 +143,73 @@ f=f.caller;
 this.warn(["profile() not supported."]);
 },profileEnd:function(){
 },clear:function(){
-if(_c){
-while(_c.childNodes.length){
-dojo.destroy(_c.firstChild);
+if(_f){
+while(_f.childNodes.length){
+dojo.destroy(_f.firstChild);
 }
 }
 dojo.forEach(this._connects,dojo.disconnect);
 },open:function(){
-_37(true);
+_34(true);
 },close:function(){
-if(_11){
-_37();
+if(_14){
+_34();
 }
 },_restoreBorder:function(){
-if(_1c){
-_1c.style.border=_1d;
+if(_1f){
+_1f.style.border=_20;
 }
 },openDomInspector:function(){
-_19=true;
-_c.style.display="none";
-_16.style.display="block";
-_d.style.display="none";
+_1c=true;
+_f.style.display="none";
+_19.style.display="block";
+_10.style.display="none";
 document.body.style.cursor="pointer";
-_17=dojo.connect(document,"mousemove",function(evt){
-if(!_19){
+_1a=dojo.connect(document,"mousemove",function(evt){
+if(!_1c){
 return;
 }
-if(!_1a){
-_1a=setTimeout(function(){
-_1a=null;
+if(!_1d){
+_1d=setTimeout(function(){
+_1d=null;
 },50);
 }else{
 return;
 }
-var _39=evt.target;
-if(_39&&(_1c!==_39)){
-var _3a=true;
+var _35=evt.target;
+if(_35&&(_1f!==_35)){
+var _36=true;
 console._restoreBorder();
-var _3b=[];
-_29(_39,_3b);
-_16.innerHTML=_3b.join("");
-_1c=_39;
-_1d=_1c.style.border;
-_1c.style.border="#0000FF 1px solid";
+var _37=[];
+_29(_35,_37);
+_19.innerHTML=_37.join("");
+_1f=_35;
+_20=_1f.style.border;
+_1f.style.border="#0000FF 1px solid";
 }
 });
 setTimeout(function(){
-_18=dojo.connect(document,"click",function(evt){
+_1b=dojo.connect(document,"click",function(evt){
 document.body.style.cursor="";
-_19=!_19;
-dojo.disconnect(_18);
+_1c=!_1c;
+dojo.disconnect(_1b);
 });
 },30);
 },_closeDomInspector:function(){
 document.body.style.cursor="";
-dojo.disconnect(_17);
-dojo.disconnect(_18);
-_19=false;
+dojo.disconnect(_1a);
+dojo.disconnect(_1b);
+_1c=false;
 console._restoreBorder();
 },openConsole:function(){
-_c.style.display="block";
-_16.style.display="none";
-_d.style.display="none";
+_f.style.display="block";
+_19.style.display="none";
+_10.style.display="none";
 console._closeDomInspector();
 },openObjectInspector:function(){
-_c.style.display="none";
-_16.style.display="none";
-_d.style.display="block";
+_f.style.display="none";
+_19.style.display="none";
+_10.style.display="block";
 console._closeDomInspector();
 },recss:function(){
 var i,a,s;
@@ -205,55 +222,55 @@ s.href=h+(h.indexOf("?")>=0?"&":"?")+"forceReload="+new Date().valueOf();
 }
 }
 }};
-function _37(_41){
-_11=_41||!_11;
-if(_b){
-_b.style.display=_11?"block":"none";
+function _34(_38){
+_14=_38||!_14;
+if(_e){
+_e.style.display=_14?"block":"none";
 }
 };
-function _42(){
-_37(true);
-if(_f){
-_f.focus();
+function _39(){
+_34(true);
+if(_12){
+_12.focus();
 }
 };
-function _43(x,y,w,h){
+function _3a(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);
 }
-_4a(win);
-var _4b=win.document;
-var _4c="<html style=\"height:100%;\"><head><title>Firebug Lite</title></head>\n"+"<body bgColor=\"#ccc\" style=\"height:97%;\" onresize=\"opener.onFirebugResize()\">\n"+"<div id=\"fb\"></div>"+"</body></html>";
-_4b.write(_4c);
-_4b.close();
+_3b(win);
+var _3c=win.document;
+var _3d="<html style=\"height:100%;\"><head><title>Firebug Lite</title></head>\n"+"<body bgColor=\"#ccc\" style=\"height:97%;\" onresize=\"opener.onFirebugResize()\">\n"+"<div id=\"fb\"></div>"+"</body></html>";
+_3c.write(_3d);
+_3c.close();
 return win;
 };
-function _4a(wn){
+function _3b(wn){
 var d=new Date();
 d.setTime(d.getTime()+(60*24*60*60*1000));
 d=d.toUTCString();
-var dc=wn.document,_50;
+var dc=wn.document,_3e;
 if(wn.innerWidth){
-_50=function(){
+_3e=function(){
 return {w:wn.innerWidth,h:wn.innerHeight};
 };
 }else{
 if(dc.documentElement&&dc.documentElement.clientWidth){
-_50=function(){
+_3e=function(){
 return {w:dc.documentElement.clientWidth,h:dc.documentElement.clientHeight};
 };
 }else{
 if(dc.body){
-_50=function(){
+_3e=function(){
 return {w:dc.body.clientWidth,h:dc.body.clientHeight};
 };
 }
 }
 }
 window.onFirebugResize=function(){
-layout(_50().h);
+_4c(_3e().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;
@@ -261,201 +278,199 @@ document.cookie="_firebugPosition="+[x,y,w,h].join(",")+"; expires="+d+"; path=/
 },5000);
 };
 };
-function _55(){
-if(_b){
+function _3f(){
+if(_e){
 return;
 }
 if(dojo.config.popup){
-var _56="100%";
-var _57=document.cookie.match(/(?:^|; )_firebugPosition=([^;]*)/);
-var p=_57?_57[1].split(","):[2,2,320,480];
-_9=_43(p[0],p[1],p[2],p[3]);
-_8=_9.document;
+var _40="100%";
+var _41=document.cookie.match(/(?:^|; )_firebugPosition=([^;]*)/);
+var p=_41?_41[1].split(","):[2,2,320,480];
+_c=_3a(p[0],p[1],p[2],p[3]);
+_b=_c.document;
 dojo.config.debugContainerId="fb";
-_9.console=window.console;
-_9.dojo=window.dojo;
+_c.console=window.console;
+_c.dojo=window.dojo;
 }else{
-_8=document;
-_56=(dojo.config.debugHeight||300)+"px";
+_b=document;
+_40=(dojo.config.debugHeight||300)+"px";
 }
-var _59=_8.createElement("link");
-_59.href=dojo.moduleUrl("dojo._firebug","firebug.css");
-_59.rel="stylesheet";
-_59.type="text/css";
-var _5a=_8.getElementsByTagName("head");
-if(_5a){
-_5a=_5a[0];
+var _42=_b.createElement("link");
+_42.href=dojo.moduleUrl("dojo._firebug","firebug.css");
+_42.rel="stylesheet";
+_42.type="text/css";
+var _43=_b.getElementsByTagName("head");
+if(_43){
+_43=_43[0];
 }
-if(!_5a){
-_5a=_8.getElementsByTagName("html")[0];
+if(!_43){
+_43=_b.getElementsByTagName("html")[0];
 }
 if(dojo.isIE){
 window.setTimeout(function(){
-_5a.appendChild(_59);
+_43.appendChild(_42);
 },0);
 }else{
-_5a.appendChild(_59);
+_43.appendChild(_42);
 }
 if(dojo.config.debugContainerId){
-_b=_8.getElementById(dojo.config.debugContainerId);
-}
-if(!_b){
-_b=_8.createElement("div");
-_8.body.appendChild(_b);
-}
-_b.className+=" firebug";
-_b.style.height=_56;
-_b.style.display=(_11?"block":"none");
-var _5b=function(_5c,_5d,_5e,_5f){
-return "<li class=\""+_5f+"\"><a href=\"javascript:void(0);\" onclick=\"console."+_5e+"(); return false;\" title=\""+_5d+"\">"+_5c+"</a></li>";
-};
-_b.innerHTML="<div id=\"firebugToolbar\">"+"  <ul id=\"fireBugTabs\" class=\"tabs\">"+_5b("Clear","Remove All Console Logs","clear","")+_5b("ReCSS","Refresh CSS without reloading page","recss","")+_5b("Console","Show Console Logs","openConsole","gap")+_5b("DOM","Show DOM Inspector","openDomInspector","")+_5b("Object","Show Object Inspector","openObjectInspector","")+((dojo.config.popup)?"":_5b("Close","Close the console","close","gap"))+"\t</ul>"+"</div>"+"<input type=\"text\" id=\"fireb [...]
-_10=_8.getElementById("firebugToolbar");
-_f=_8.getElementById("firebugCommandLine");
-_60(_f,"keydown",_61);
-_60(_8,dojo.isIE||dojo.isSafari?"keydown":"keypress",_62);
-_c=_8.getElementById("firebugLog");
-_d=_8.getElementById("objectLog");
-_16=_8.getElementById("domInspect");
-_e=_8.getElementById("fireBugTabs");
-_63();
-_64();
-};
-dojo.addOnLoad(_55);
-function _65(){
-_8=null;
-if(_9.console){
-_9.console.clear();
-}
-_9=null;
+_e=_b.getElementById(dojo.config.debugContainerId);
+}
+if(!_e){
+_e=_b.createElement("div");
+_b.body.appendChild(_e);
+}
+_e.className+=" firebug";
+_e.style.height=_40;
+_e.style.display=(_14?"block":"none");
+var _44=function(_45,_46,_47,_48){
+return "<li class=\""+_48+"\"><a href=\"javascript:void(0);\" onclick=\"console."+_47+"(); return false;\" title=\""+_46+"\">"+_45+"</a></li>";
+};
+_e.innerHTML="<div id=\"firebugToolbar\">"+"  <ul id=\"fireBugTabs\" class=\"tabs\">"+_44("Clear","Remove All Console Logs","clear","")+_44("ReCSS","Refresh CSS without reloading page","recss","")+_44("Console","Show Console Logs","openConsole","gap")+_44("DOM","Show DOM Inspector","openDomInspector","")+_44("Object","Show Object Inspector","openObjectInspector","")+((dojo.config.popup)?"":_44("Close","Close the console","close","gap"))+"\t</ul>"+"</div>"+"<input type=\"text\" id=\"fireb [...]
+_13=_b.getElementById("firebugToolbar");
+_12=_b.getElementById("firebugCommandLine");
+_49(_12,"keydown",_4a);
+_49(_b,dojo.isIE||dojo.isSafari?"keydown":"keypress",_4b);
+_f=_b.getElementById("firebugLog");
+_10=_b.getElementById("objectLog");
+_19=_b.getElementById("domInspect");
+_11=_b.getElementById("fireBugTabs");
+_4c();
+_4d();
+};
+dojo.addOnLoad(_3f);
+function _4e(){
 _b=null;
+if(_c.console){
+_c.console.clear();
+}
 _c=null;
-_d=null;
-_16=null;
+_e=null;
 _f=null;
-_12=[];
-_13=[];
-_14={};
-};
-function _66(){
-var _67=_f.value;
-_f.value="";
-_26([">  ",_67],"command");
-var _68;
+_10=null;
+_19=null;
+_12=null;
+_15=[];
+_16=[];
+_17={};
+};
+function _4f(){
+var _50=_12.value;
+_12.value="";
+_26([">  ",_50],"command");
+var _51;
 try{
-_68=eval(_67);
+_51=eval(_50);
 }
 catch(e){
-
 }
-
 };
-function _63(h){
-var _6a=25;
-var _6b=h?h-(_6a+_f.offsetHeight+25+(h*0.01))+"px":(_b.offsetHeight-_6a-_f.offsetHeight)+"px";
-_c.style.top=_6a+"px";
-_c.style.height=_6b;
-_d.style.height=_6b;
-_d.style.top=_6a+"px";
-_16.style.height=_6b;
-_16.style.top=_6a+"px";
-_f.style.bottom=0;
-dojo.connect(window,"onunload",_65);
-};
-function _26(_6c,_6d,_6e){
-if(_c){
-_6f(_6c,_6d,_6e);
-}else{
-_12.push([_6c,_6d,_6e]);
-}
-};
-function _64(){
-var _70=_12;
-_12=[];
-for(var i=0;i<_70.length;++i){
-_6f(_70[i][0],_70[i][1],_70[i][2]);
-}
-};
-function _6f(_72,_73,_74){
-var _75=_c.scrollTop+_c.offsetHeight>=_c.scrollHeight;
-_74=_74||_76;
-_74(_72,_73);
-if(_75){
-_c.scrollTop=_c.scrollHeight-_c.offsetHeight;
-}
-};
-function _77(row){
-var _79=_13.length?_13[_13.length-1]:_c;
-_79.appendChild(row);
-};
-function _76(_7a,_7b){
-var row=_c.ownerDocument.createElement("div");
-row.className="logRow"+(_7b?" logRow-"+_7b:"");
-row.innerHTML=_7a.join("");
-_77(row);
-};
-function _2a(_7d,_7e){
-_1e(_7d,_7e);
-var _7f=_c.ownerDocument.createElement("div");
-_7f.className="logGroupBox";
-_77(_7f);
-_13.push(_7f);
+function _4c(h){
+var _52=25;
+var _53=h?h-(_52+_12.offsetHeight+25+(h*0.01))+"px":(_e.offsetHeight-_52-_12.offsetHeight)+"px";
+_f.style.top=_52+"px";
+_f.style.height=_53;
+_10.style.height=_53;
+_10.style.top=_52+"px";
+_19.style.height=_53;
+_19.style.top=_52+"px";
+_12.style.bottom=0;
+dojo.addOnWindowUnload(_4e);
+};
+function _26(_54,_55,_56){
+if(_f){
+_57(_54,_55,_56);
+}else{
+_15.push([_54,_55,_56]);
+}
+};
+function _4d(){
+var _58=_15;
+_15=[];
+for(var i=0;i<_58.length;++i){
+_57(_58[i][0],_58[i][1],_58[i][2]);
+}
+};
+function _57(_59,_5a,_5b){
+var _5c=_f.scrollTop+_f.offsetHeight>=_f.scrollHeight;
+_5b=_5b||_5d;
+_5b(_59,_5a);
+if(_5c){
+_f.scrollTop=_f.scrollHeight-_f.offsetHeight;
+}
+};
+function _5e(row){
+var _5f=_16.length?_16[_16.length-1]:_f;
+_5f.appendChild(row);
+};
+function _5d(_60,_61){
+var row=_f.ownerDocument.createElement("div");
+row.className="logRow"+(_61?" logRow-"+_61:"");
+row.innerHTML=_60.join("");
+_5e(row);
+};
+function _2a(_62,_63){
+_21(_62,_63);
+var _64=_f.ownerDocument.createElement("div");
+_64.className="logGroupBox";
+_5e(_64);
+_16.push(_64);
 };
 function _2b(){
-_13.pop();
+_16.pop();
 };
-function _1e(_80,_81){
-var _82=[];
-var _83=_80[0];
-var _84=0;
-if(typeof (_83)!="string"){
-_83="";
-_84=-1;
+function _21(_65,_66){
+var _67=[];
+var _68=_65[0];
+var _69=0;
+if(typeof (_68)!="string"){
+_68="";
+_69=-1;
 }
-var _85=_86(_83);
-for(var i=0;i<_85.length;++i){
-var _88=_85[i];
-if(_88&&typeof _88=="object"){
-_88.appender(_80[++_84],_82);
+var _6a=_6b(_68);
+for(var i=0;i<_6a.length;++i){
+var _6c=_6a[i];
+if(_6c&&typeof _6c=="object"){
+_6c.appender(_65[++_69],_67);
 }else{
-_89(_88,_82);
+_6d(_6c,_67);
 }
 }
 var ids=[];
 var obs=[];
-for(i=_84+1;i<_80.length;++i){
-_89(" ",_82);
-var _8c=_80[i];
-if(_8c===undefined||_8c===null){
-_8d(_8c,_82);
+for(i=_69+1;i<_65.length;++i){
+_6d(" ",_67);
+var _6e=_65[i];
+if(_6e===undefined||_6e===null){
+_6f(_6e,_67);
 }else{
-if(typeof (_8c)=="string"){
-_89(_8c,_82);
+if(typeof (_6e)=="string"){
+_6d(_6e,_67);
 }else{
-if(_8c instanceof Date){
-_89(_8c.toString(),_82);
+if(_6e instanceof Date){
+_6d(_6e.toString(),_67);
 }else{
-if(_8c.nodeType==9){
-_89("[ XmlDoc ]",_82);
+if(_6e.nodeType==9){
+_6d("[ XmlDoc ]",_67);
 }else{
-var id="_a"+_a++;
+var id="_a"+_d++;
 ids.push(id);
-obs.push(_8c);
-var str="<a id=\""+id+"\" href=\"javascript:void(0);\">"+_90(_8c)+"</a>";
-_91(str,_82);
+obs.push(_6e);
+var str="<a id=\""+id+"\" href=\"javascript:void(0);\">"+_70(_6e)+"</a>";
+_71(str,_67);
 }
 }
 }
 }
 }
-_26(_82,_81);
+_26(_67,_66);
 for(i=0;i<ids.length;i++){
-var btn=_8.getElementById(ids[i]);
+var btn=_b.getElementById(ids[i]);
 if(!btn){
 continue;
 }
 btn.obj=obs[i];
-_9.console._connects.push(dojo.connect(btn,"onclick",function(){
+_c.console._connects.push(dojo.connect(btn,"onclick",function(){
 console.openObjectInspector();
 try{
 _25(this.obj);
@@ -463,27 +478,27 @@ _25(this.obj);
 catch(e){
 this.obj=e;
 }
-_d.innerHTML="<pre>"+_25(this.obj)+"</pre>";
+_10.innerHTML="<pre>"+_25(this.obj)+"</pre>";
 }));
 }
 };
-function _86(_93){
-var _94=[];
+function _6b(_72){
+var _73=[];
 var reg=/((^%|[^\\]%)(\d+)?(\.)([a-zA-Z]))|((^%|[^\\]%)([a-zA-Z]))/;
-var _96={s:_89,d:_97,i:_97,f:_98};
-for(var m=reg.exec(_93);m;m=reg.exec(_93)){
-var _9a=m[8]?m[8]:m[5];
-var _9b=_9a in _96?_96[_9a]:_9c;
-var _9d=m[3]?parseInt(m[3]):(m[4]=="."?-1:0);
-_94.push(_93.substr(0,m[0][0]=="%"?m.index:m.index+1));
-_94.push({appender:_9b,precision:_9d});
-_93=_93.substr(m.index+m[0].length);
-}
-_94.push(_93);
-return _94;
-};
-function _9e(_9f){
-function _a0(ch){
+var _74={s:_6d,d:_75,i:_75,f:_76};
+for(var m=reg.exec(_72);m;m=reg.exec(_72)){
+var _77=m[8]?m[8]:m[5];
+var _78=_77 in _74?_74[_77]:_79;
+var _7a=m[3]?parseInt(m[3]):(m[4]=="."?-1:0);
+_73.push(_72.substr(0,m[0][0]=="%"?m.index:m.index+1));
+_73.push({appender:_78,precision:_7a});
+_72=_72.substr(m.index+m[0].length);
+}
+_73.push(_72);
+return _73;
+};
+function _7b(_7c){
+function _7d(ch){
 switch(ch){
 case "<":
 return "<";
@@ -498,61 +513,61 @@ return """;
 }
 return "?";
 };
-return String(_9f).replace(/[<>&"']/g,_a0);
+return String(_7c).replace(/[<>&"']/g,_7d);
 };
-function _a2(_a3){
+function _7e(_7f){
 try{
-return _a3+"";
+return _7f+"";
 }
 catch(e){
 return null;
 }
 };
-function _91(_a4,_a5){
-_a5.push(_a2(_a4));
+function _71(_80,_81){
+_81.push(_7e(_80));
 };
-function _89(_a6,_a7){
-_a7.push(_9e(_a2(_a6)));
+function _6d(_82,_83){
+_83.push(_7b(_7e(_82)));
 };
-function _8d(_a8,_a9){
-_a9.push("<span class=\"objectBox-null\">",_9e(_a2(_a8)),"</span>");
+function _6f(_84,_85){
+_85.push("<span class=\"objectBox-null\">",_7b(_7e(_84)),"</span>");
 };
-function _aa(_ab,_ac){
-_ac.push("<span class=\"objectBox-string\">"",_9e(_a2(_ab)),""</span>");
+function _86(_87,_88){
+_88.push("<span class=\"objectBox-string\">"",_7b(_7e(_87)),""</span>");
 };
-function _97(_ad,_ae){
-_ae.push("<span class=\"objectBox-number\">",_9e(_a2(_ad)),"</span>");
+function _75(_89,_8a){
+_8a.push("<span class=\"objectBox-number\">",_7b(_7e(_89)),"</span>");
 };
-function _98(_af,_b0){
-_b0.push("<span class=\"objectBox-number\">",_9e(_a2(_af)),"</span>");
+function _76(_8b,_8c){
+_8c.push("<span class=\"objectBox-number\">",_7b(_7e(_8b)),"</span>");
 };
-function _b1(_b2,_b3){
-_b3.push("<span class=\"objectBox-function\">",_90(_b2),"</span>");
+function _8d(_8e,_8f){
+_8f.push("<span class=\"objectBox-function\">",_70(_8e),"</span>");
 };
-function _9c(_b4,_b5){
+function _79(_90,_91){
 try{
-if(_b4===undefined){
-_8d("undefined",_b5);
+if(_90===undefined){
+_6f("undefined",_91);
 }else{
-if(_b4===null){
-_8d("null",_b5);
+if(_90===null){
+_6f("null",_91);
 }else{
-if(typeof _b4=="string"){
-_aa(_b4,_b5);
+if(typeof _90=="string"){
+_86(_90,_91);
 }else{
-if(typeof _b4=="number"){
-_97(_b4,_b5);
+if(typeof _90=="number"){
+_75(_90,_91);
 }else{
-if(typeof _b4=="function"){
-_b1(_b4,_b5);
+if(typeof _90=="function"){
+_8d(_90,_91);
 }else{
-if(_b4.nodeType==1){
-_b6(_b4,_b5);
+if(_90.nodeType==1){
+_92(_90,_91);
 }else{
-if(typeof _b4=="object"){
-_b7(_b4,_b5);
+if(typeof _90=="object"){
+_93(_90,_91);
 }else{
-_89(_b4,_b5);
+_6d(_90,_91);
 }
 }
 }
@@ -564,117 +579,117 @@ _89(_b4,_b5);
 catch(e){
 }
 };
-function _b7(_b8,_b9){
-var _ba=_a2(_b8);
-var _bb=/\[object (.*?)\]/;
-var m=_bb.exec(_ba);
-_b9.push("<span class=\"objectBox-object\">",m?m[1]:_ba,"</span>");
+function _93(_94,_95){
+var _96=_7e(_94);
+var _97=/\[object (.*?)\]/;
+var m=_97.exec(_96);
+_95.push("<span class=\"objectBox-object\">",m?m[1]:_96,"</span>");
 };
-function _b6(_bd,_be){
-_be.push("<span class=\"objectBox-selector\">");
-_be.push("<span class=\"selectorTag\">",_9e(_bd.nodeName.toLowerCase()),"</span>");
-if(_bd.id){
-_be.push("<span class=\"selectorId\">#",_9e(_bd.id),"</span>");
+function _92(_98,_99){
+_99.push("<span class=\"objectBox-selector\">");
+_99.push("<span class=\"selectorTag\">",_7b(_98.nodeName.toLowerCase()),"</span>");
+if(_98.id){
+_99.push("<span class=\"selectorId\">#",_7b(_98.id),"</span>");
 }
-if(_bd.className){
-_be.push("<span class=\"selectorClass\">.",_9e(_bd.className),"</span>");
+if(_98.className){
+_99.push("<span class=\"selectorClass\">.",_7b(_98.className),"</span>");
 }
-_be.push("</span>");
+_99.push("</span>");
 };
-function _29(_bf,_c0){
-if(_bf.nodeType==1){
-_c0.push("<div class=\"objectBox-element\">","<<span class=\"nodeTag\">",_bf.nodeName.toLowerCase(),"</span>");
-for(var i=0;i<_bf.attributes.length;++i){
-var _c2=_bf.attributes[i];
-if(!_c2.specified){
+function _29(_9a,_9b){
+if(_9a.nodeType==1){
+_9b.push("<div class=\"objectBox-element\">","<<span class=\"nodeTag\">",_9a.nodeName.toLowerCase(),"</span>");
+for(var i=0;i<_9a.attributes.length;++i){
+var _9c=_9a.attributes[i];
+if(!_9c.specified){
 continue;
 }
-_c0.push(" <span class=\"nodeName\">",_c2.nodeName.toLowerCase(),"</span>="<span class=\"nodeValue\">",_9e(_c2.nodeValue),"</span>"");
+_9b.push(" <span class=\"nodeName\">",_9c.nodeName.toLowerCase(),"</span>="<span class=\"nodeValue\">",_7b(_9c.nodeValue),"</span>"");
 }
-if(_bf.firstChild){
-_c0.push("></div><div class=\"nodeChildren\">");
-for(var _c3=_bf.firstChild;_c3;_c3=_c3.nextSibling){
-_29(_c3,_c0);
+if(_9a.firstChild){
+_9b.push("></div><div class=\"nodeChildren\">");
+for(var _9d=_9a.firstChild;_9d;_9d=_9d.nextSibling){
+_29(_9d,_9b);
 }
-_c0.push("</div><div class=\"objectBox-element\"></<span class=\"nodeTag\">",_bf.nodeName.toLowerCase(),"></span></div>");
+_9b.push("</div><div class=\"objectBox-element\"></<span class=\"nodeTag\">",_9a.nodeName.toLowerCase(),"></span></div>");
 }else{
-_c0.push("/></div>");
+_9b.push("/></div>");
 }
 }else{
-if(_bf.nodeType==3){
-_c0.push("<div class=\"nodeText\">",_9e(_bf.nodeValue),"</div>");
+if(_9a.nodeType==3){
+_9b.push("<div class=\"nodeText\">",_7b(_9a.nodeValue),"</div>");
 }
 }
 };
-function _60(_c4,_c5,_c6){
+function _49(_9e,_9f,_a0){
 if(document.all){
-_c4.attachEvent("on"+_c5,_c6);
+_9e.attachEvent("on"+_9f,_a0);
 }else{
-_c4.addEventListener(_c5,_c6,false);
+_9e.addEventListener(_9f,_a0,false);
 }
 };
-function _c7(_c8,_c9,_ca){
+function _a1(_a2,_a3,_a4){
 if(document.all){
-_c8.detachEvent("on"+_c9,_ca);
+_a2.detachEvent("on"+_a3,_a4);
 }else{
-_c8.removeEventListener(_c9,_ca,false);
+_a2.removeEventListener(_a3,_a4,false);
 }
 };
-function _cb(_cc){
+function _a5(_a6){
 if(document.all){
-_cc.cancelBubble=true;
+_a6.cancelBubble=true;
 }else{
-_cc.stopPropagation();
+_a6.stopPropagation();
 }
 };
-function _cd(msg,_cf,_d0){
-var _d1=_cf.lastIndexOf("/");
-var _d2=_d1==-1?_cf:_cf.substr(_d1+1);
-var _d3=["<span class=\"errorMessage\">",msg,"</span>","<div class=\"objectBox-sourceLink\">",_d2," (line ",_d0,")</div>"];
-_26(_d3,"error");
+function _a7(msg,_a8,_a9){
+var _aa=_a8.lastIndexOf("/");
+var _ab=_aa==-1?_a8:_a8.substr(_aa+1);
+var _ac=["<span class=\"errorMessage\">",msg,"</span>","<div class=\"objectBox-sourceLink\">",_ab," (line ",_a9,")</div>"];
+_26(_ac,"error");
 };
-var _d4=new Date().getTime();
-function _62(_d5){
-var _d6=(new Date()).getTime();
-if(_d6>_d4+200){
-_d5=dojo.fixEvent(_d5);
-var _d7=dojo.keys;
-var ekc=_d5.keyCode;
-_d4=_d6;
-if(ekc==_d7.F12){
-_37();
+var _ad=new Date().getTime();
+function _4b(_ae){
+var _af=(new Date()).getTime();
+if(_af>_ad+200){
+_ae=dojo.fixEvent(_ae);
+var _b0=dojo.keys;
+var ekc=_ae.keyCode;
+_ad=_af;
+if(ekc==_b0.F12){
+_34();
 }else{
-if((ekc==_d7.NUMPAD_ENTER||ekc==76)&&_d5.shiftKey&&(_d5.metaKey||_d5.ctrlKey)){
-_42();
+if((ekc==_b0.NUMPAD_ENTER||ekc==76)&&_ae.shiftKey&&(_ae.metaKey||_ae.ctrlKey)){
+_39();
 }else{
 return;
 }
 }
-_cb(_d5);
+_a5(_ae);
 }
 };
-function _61(e){
+function _4a(e){
 var dk=dojo.keys;
-if(e.keyCode==13&&_f.value){
-_db(_f.value);
-_66();
+if(e.keyCode==13&&_12.value){
+_b1(_12.value);
+_4f();
 }else{
 if(e.keyCode==27){
-_f.value="";
+_12.value="";
 }else{
 if(e.keyCode==dk.UP_ARROW||e.charCode==dk.UP_ARROW){
-_dc("older");
+_b2("older");
 }else{
 if(e.keyCode==dk.DOWN_ARROW||e.charCode==dk.DOWN_ARROW){
-_dc("newer");
+_b2("newer");
 }else{
 if(e.keyCode==dk.HOME||e.charCode==dk.HOME){
-_dd=1;
-_dc("older");
+_b3=1;
+_b2("older");
 }else{
 if(e.keyCode==dk.END||e.charCode==dk.END){
-_dd=999999;
-_dc("newer");
+_b3=999999;
+_b2("newer");
 }
 }
 }
@@ -682,96 +697,96 @@ _dc("newer");
 }
 }
 };
-var _dd=-1;
-var _de=null;
-function _db(_df){
-var _e0=_e1("firebug_history");
-_e0=(_e0)?dojo.fromJson(_e0):[];
-var pos=dojo.indexOf(_e0,_df);
+var _b3=-1;
+var _b4=null;
+function _b1(_b5){
+var _b6=_b7("firebug_history");
+_b6=(_b6)?dojo.fromJson(_b6):[];
+var pos=dojo.indexOf(_b6,_b5);
 if(pos!=-1){
-_e0.splice(pos,1);
+_b6.splice(pos,1);
 }
-_e0.push(_df);
-_e1("firebug_history",dojo.toJson(_e0),30);
-while(_e0.length&&!_e1("firebug_history")){
-_e0.shift();
-_e1("firebug_history",dojo.toJson(_e0),30);
+_b6.push(_b5);
+_b7("firebug_history",dojo.toJson(_b6),30);
+while(_b6.length&&!_b7("firebug_history")){
+_b6.shift();
+_b7("firebug_history",dojo.toJson(_b6),30);
 }
-_de=null;
-_dd=-1;
+_b4=null;
+_b3=-1;
 };
-function _dc(_e3){
-var _e4=_e1("firebug_history");
-_e4=(_e4)?dojo.fromJson(_e4):[];
-if(!_e4.length){
+function _b2(_b8){
+var _b9=_b7("firebug_history");
+_b9=(_b9)?dojo.fromJson(_b9):[];
+if(!_b9.length){
 return;
 }
-if(_de===null){
-_de=_f.value;
+if(_b4===null){
+_b4=_12.value;
 }
-if(_dd==-1){
-_dd=_e4.length;
+if(_b3==-1){
+_b3=_b9.length;
 }
-if(_e3=="older"){
---_dd;
-if(_dd<0){
-_dd=0;
+if(_b8=="older"){
+--_b3;
+if(_b3<0){
+_b3=0;
 }
 }else{
-if(_e3=="newer"){
-++_dd;
-if(_dd>_e4.length){
-_dd=_e4.length;
+if(_b8=="newer"){
+++_b3;
+if(_b3>_b9.length){
+_b3=_b9.length;
 }
 }
 }
-if(_dd==_e4.length){
-_f.value=_de;
-_de=null;
+if(_b3==_b9.length){
+_12.value=_b4;
+_b4=null;
 }else{
-_f.value=_e4[_dd];
+_12.value=_b9[_b3];
 }
 };
-function _e1(_e5,_e6){
+function _b7(_ba,_bb){
 var c=document.cookie;
 if(arguments.length==1){
-var _e8=c.match(new RegExp("(?:^|; )"+_e5+"=([^;]*)"));
-return _e8?decodeURIComponent(_e8[1]):undefined;
+var _bc=c.match(new RegExp("(?:^|; )"+_ba+"=([^;]*)"));
+return _bc?decodeURIComponent(_bc[1]):undefined;
 }else{
 var d=new Date();
 d.setMonth(d.getMonth()+1);
-document.cookie=_e5+"="+encodeURIComponent(_e6)+((d.toUtcString)?"; expires="+d.toUTCString():"");
+document.cookie=_ba+"="+encodeURIComponent(_bb)+((d.toUtcString)?"; expires="+d.toUTCString():"");
 }
 };
-function _ea(it){
+function _bd(it){
 return it&&it instanceof Array||typeof it=="array";
 };
-function _ec(o){
+function _be(o){
 var cnt=0;
 for(var nm in o){
 cnt++;
 }
 return cnt;
 };
-function _25(o,i,txt,_f3){
+function _25(o,i,txt,_bf){
 var ind=" \t";
 txt=txt||"";
 i=i||ind;
-_f3=_f3||[];
-var _f5;
+_bf=_bf||[];
+var _c0;
 if(o&&o.nodeType==1){
-var _f6=[];
-_29(o,_f6);
-return _f6.join("");
+var _c1=[];
+_29(o,_c1);
+return _c1.join("");
 }
-var br=",\n",cnt=0,_f9=_ec(o);
+var br=",\n",cnt=0,_c2=_be(o);
 if(o instanceof Date){
 return i+o.toString()+br;
 }
 looking:
 for(var nm in o){
 cnt++;
-if(cnt==_f9){
+if(cnt==_c2){
 br="\n";
 }
 if(o[nm]===window||o[nm]===document){
@@ -795,29 +810,29 @@ if(o[nm] instanceof Date){
 txt+=i+nm+" : "+o[nm].toString()+br;
 }else{
 if(typeof (o[nm])=="object"&&o[nm]){
-for(var j=0,_fc;_fc=_f3[j];j++){
-if(o[nm]===_fc){
+for(var j=0,_c3;_c3=_bf[j];j++){
+if(o[nm]===_c3){
 txt+=i+nm+" : RECURSION"+br;
 continue looking;
 }
 }
-_f3.push(o[nm]);
-_f5=(_ea(o[nm]))?["[","]"]:["{","}"];
-txt+=i+nm+" : "+_f5[0]+"\n";
-txt+=_25(o[nm],i+ind,"",_f3);
-txt+=i+_f5[1]+br;
+_bf.push(o[nm]);
+_c0=(_bd(o[nm]))?["[","]"]:["{","}"];
+txt+=i+nm+" : "+_c0[0]+"\n";
+txt+=_25(o[nm],i+ind,"",_bf);
+txt+=i+_c0[1]+br;
 }else{
 if(typeof o[nm]=="undefined"){
 txt+=i+nm+" : undefined"+br;
 }else{
 if(nm=="toString"&&typeof o[nm]=="function"){
-var _fd=o[nm]();
-if(typeof _fd=="string"&&_fd.match(/function ?(.*?)\(/)){
-_fd=_9e(_90(o[nm]));
+var _c4=o[nm]();
+if(typeof _c4=="string"&&_c4.match(/function ?(.*?)\(/)){
+_c4=_7b(_70(o[nm]));
 }
-txt+=i+nm+" : "+_fd+br;
+txt+=i+nm+" : "+_c4+br;
 }else{
-txt+=i+nm+" : "+_9e(_90(o[nm]))+br;
+txt+=i+nm+" : "+_7b(_70(o[nm]))+br;
 }
 }
 }
@@ -829,27 +844,27 @@ txt+=i+nm+" : "+_9e(_90(o[nm]))+br;
 }
 return txt;
 };
-function _90(obj){
-var _ff=(obj instanceof Error);
+function _70(obj){
+var _c5=(obj instanceof Error);
 if(obj.nodeType==1){
-return _9e("< "+obj.tagName.toLowerCase()+" id=\""+obj.id+"\" />");
+return _7b("< "+obj.tagName.toLowerCase()+" id=\""+obj.id+"\" />");
 }
 if(obj.nodeType==3){
-return _9e("[TextNode: \""+obj.nodeValue+"\"]");
+return _7b("[TextNode: \""+obj.nodeValue+"\"]");
 }
 var nm=(obj&&(obj.id||obj.name||obj.ObjectID||obj.widgetId));
-if(!_ff&&nm){
+if(!_c5&&nm){
 return "{"+nm+"}";
 }
-var _101=2;
-var _102=4;
+var _c6=2;
+var _c7=4;
 var cnt=0;
-if(_ff){
+if(_c5){
 nm="[ Error: "+(obj.message||obj.description||obj)+" ]";
 }else{
-if(_ea(obj)){
-nm="["+obj.slice(0,_102).join(",");
-if(obj.length>_102){
+if(_bd(obj)){
+nm="["+obj.slice(0,_c7).join(",");
+if(obj.length>_c7){
 nm+=" ... ("+obj.length+" items)";
 }
 nm+="]";
@@ -873,10 +888,10 @@ nm=obj+"";
 nm="{";
 for(var i in obj){
 cnt++;
-if(cnt>_101){
+if(cnt>_c6){
 break;
 }
-nm+=i+":"+_9e(obj[i])+"  ";
+nm+=i+":"+_7b(obj[i])+"  ";
 }
 nm+="}";
 }
@@ -885,10 +900,15 @@ nm+="}";
 }
 return nm;
 };
-_60(document,dojo.isIE||dojo.isSafari?"keydown":"keypress",_62);
+_49(document,dojo.isIE||dojo.isSafari?"keydown":"keypress",_4b);
 if((document.documentElement.getAttribute("debug")=="true")||(dojo.config.isDebug)){
-_37(true);
+_34(true);
 }
-})();
+dojo.addOnWindowUnload(function(){
+_a1(document,dojo.isIE||dojo.isSafari?"keydown":"keypress",_4b);
+window.onFirebugResize=null;
+window.console=null;
+});
 }
+})();
 }
diff --git a/dojo/back.js b/dojo/back.js
index 51eb86d..47dd3a8 100644
--- a/dojo/back.js
+++ b/dojo/back.js
@@ -17,122 +17,122 @@ h=h.substring(1);
 }
 return dojo.isMozilla?h:decodeURIComponent(h);
 };
-function _4(h){
+function _3(h){
 if(!h){
 h="";
 }
 window.location.hash=encodeURIComponent(h);
-_6=history.length;
+_4=history.length;
 };
 if(dojo.exists("tests.back-hash")){
 _1.getHash=_2;
-_1.setHash=_4;
+_1.setHash=_3;
 }
-var _7=(typeof (window)!=="undefined")?window.location.href:"";
-var _8=(typeof (window)!=="undefined")?_2():"";
+var _5=(typeof (window)!=="undefined")?window.location.href:"";
+var _6=(typeof (window)!=="undefined")?_2():"";
+var _7=null;
+var _8=null;
 var _9=null;
 var _a=null;
-var _b=null;
-var _c=null;
-var _d=[];
-var _e=[];
-var _f=false;
-var _10=false;
-var _6;
-function _11(){
-var _12=_e.pop();
-if(!_12){
+var _b=[];
+var _c=[];
+var _d=false;
+var _e=false;
+var _4;
+function _f(){
+var _10=_c.pop();
+if(!_10){
 return;
 }
-var _13=_e[_e.length-1];
-if(!_13&&_e.length==0){
-_13=_9;
+var _11=_c[_c.length-1];
+if(!_11&&_c.length==0){
+_11=_7;
 }
-if(_13){
-if(_13.kwArgs["back"]){
-_13.kwArgs["back"]();
+if(_11){
+if(_11.kwArgs["back"]){
+_11.kwArgs["back"]();
 }else{
-if(_13.kwArgs["backButton"]){
-_13.kwArgs["backButton"]();
+if(_11.kwArgs["backButton"]){
+_11.kwArgs["backButton"]();
 }else{
-if(_13.kwArgs["handle"]){
-_13.kwArgs.handle("back");
+if(_11.kwArgs["handle"]){
+_11.kwArgs.handle("back");
 }
 }
 }
 }
-_d.push(_12);
+_b.push(_10);
 };
-_1.goBack=_11;
-function _14(){
-var _15=_d.pop();
-if(!_15){
+_1.goBack=_f;
+function _12(){
+var _13=_b.pop();
+if(!_13){
 return;
 }
-if(_15.kwArgs["forward"]){
-_15.kwArgs.forward();
+if(_13.kwArgs["forward"]){
+_13.kwArgs.forward();
 }else{
-if(_15.kwArgs["forwardButton"]){
-_15.kwArgs.forwardButton();
+if(_13.kwArgs["forwardButton"]){
+_13.kwArgs.forwardButton();
 }else{
-if(_15.kwArgs["handle"]){
-_15.kwArgs.handle("forward");
+if(_13.kwArgs["handle"]){
+_13.kwArgs.handle("forward");
 }
 }
 }
-_e.push(_15);
+_c.push(_13);
 };
-_1.goForward=_14;
-function _16(url,_18,_19){
-return {"url":url,"kwArgs":_18,"urlHash":_19};
+_1.goForward=_12;
+function _14(url,_15,_16){
+return {"url":url,"kwArgs":_15,"urlHash":_16};
 };
-function _1a(url){
-var _1c=url.split("?");
-if(_1c.length<2){
+function _17(url){
+var _18=url.split("?");
+if(_18.length<2){
 return null;
 }else{
-return _1c[1];
+return _18[1];
 }
 };
-function _1d(){
+function _19(){
 var url=(dojo.config["dojoIframeHistoryUrl"]||dojo.moduleUrl("dojo","resources/iframe_history.html"))+"?"+(new Date()).getTime();
-_f=true;
-if(_c){
-dojo.isWebKit?_c.location=url:window.frames[_c.name].location=url;
+_d=true;
+if(_a){
+dojo.isWebKit?_a.location=url:window.frames[_a.name].location=url;
 }else{
 }
 return url;
 };
-function _1f(){
-if(!_10){
-var hsl=_e.length;
-var _21=_2();
-if((_21===_8||window.location.href==_7)&&(hsl==1)){
-_11();
+function _1a(){
+if(!_e){
+var hsl=_c.length;
+var _1b=_2();
+if((_1b===_6||window.location.href==_5)&&(hsl==1)){
+_f();
 return;
 }
-if(_d.length>0){
-if(_d[_d.length-1].urlHash===_21){
-_14();
+if(_b.length>0){
+if(_b[_b.length-1].urlHash===_1b){
+_12();
 return;
 }
 }
-if((hsl>=2)&&(_e[hsl-2])){
-if(_e[hsl-2].urlHash===_21){
-_11();
+if((hsl>=2)&&(_c[hsl-2])){
+if(_c[hsl-2].urlHash===_1b){
+_f();
 return;
 }
 }
 if(dojo.isSafari&&dojo.isSafari<3){
-var _22=history.length;
-if(_22>_6){
-_14();
+var _1c=history.length;
+if(_1c>_4){
+_12();
 }else{
-if(_22<_6){
-_11();
+if(_1c<_4){
+_f();
 }
 }
-_6=_22;
+_4=_1c;
 }
 }
 };
@@ -141,112 +141,116 @@ if(dojo.byId("dj_history")){
 return;
 }
 var src=dojo.config["dojoIframeHistoryUrl"]||dojo.moduleUrl("dojo","resources/iframe_history.html");
+if(dojo._postLoad){
+console.error("dojo.back.init() must be called before the DOM has loaded. "+"If using xdomain loading or djConfig.debugAtAllCosts, include dojo.back "+"in a build layer.");
+}else{
 document.write("<iframe style=\"border:0;width:1px;height:1px;position:absolute;visibility:hidden;bottom:0;right:0;\" name=\"dj_history\" id=\"dj_history\" src=\""+src+"\"></iframe>");
+}
 };
-_1.setInitialState=function(_24){
-_9=_16(_7,_24,_8);
+_1.setInitialState=function(_1d){
+_7=_14(_5,_1d,_6);
 };
-_1.addToHistory=function(_25){
-_d=[];
-var _26=null;
+_1.addToHistory=function(_1e){
+_b=[];
+var _1f=null;
 var url=null;
-if(!_c){
+if(!_a){
 if(dojo.config["useXDomain"]&&!dojo.config["dojoIframeHistoryUrl"]){
 console.warn("dojo.back: When using cross-domain Dojo builds,"+" please save iframe_history.html to your domain and set djConfig.dojoIframeHistoryUrl"+" to the path on your domain to iframe_history.html");
 }
-_c=window.frames["dj_history"];
+_a=window.frames["dj_history"];
 }
-if(!_b){
-_b=dojo.create("a",{style:{display:"none"}},dojo.body());
+if(!_9){
+_9=dojo.create("a",{style:{display:"none"}},dojo.body());
 }
-if(_25["changeUrl"]){
-_26=""+((_25["changeUrl"]!==true)?_25["changeUrl"]:(new Date()).getTime());
-if(_e.length==0&&_9.urlHash==_26){
-_9=_16(url,_25,_26);
+if(_1e["changeUrl"]){
+_1f=""+((_1e["changeUrl"]!==true)?_1e["changeUrl"]:(new Date()).getTime());
+if(_c.length==0&&_7.urlHash==_1f){
+_7=_14(url,_1e,_1f);
 return;
 }else{
-if(_e.length>0&&_e[_e.length-1].urlHash==_26){
-_e[_e.length-1]=_16(url,_25,_26);
+if(_c.length>0&&_c[_c.length-1].urlHash==_1f){
+_c[_c.length-1]=_14(url,_1e,_1f);
 return;
 }
 }
-_10=true;
+_e=true;
 setTimeout(function(){
-_4(_26);
-_10=false;
+_3(_1f);
+_e=false;
 },1);
-_b.href=_26;
+_9.href=_1f;
 if(dojo.isIE){
-url=_1d();
-var _28=_25["back"]||_25["backButton"]||_25["handle"];
-var tcb=function(_2a){
+url=_19();
+var _20=_1e["back"]||_1e["backButton"]||_1e["handle"];
+var tcb=function(_21){
 if(_2()!=""){
 setTimeout(function(){
-_4(_26);
+_3(_1f);
 },1);
 }
-_28.apply(this,[_2a]);
+_20.apply(this,[_21]);
 };
-if(_25["back"]){
-_25.back=tcb;
+if(_1e["back"]){
+_1e.back=tcb;
 }else{
-if(_25["backButton"]){
-_25.backButton=tcb;
+if(_1e["backButton"]){
+_1e.backButton=tcb;
 }else{
-if(_25["handle"]){
-_25.handle=tcb;
+if(_1e["handle"]){
+_1e.handle=tcb;
 }
 }
 }
-var _2b=_25["forward"]||_25["forwardButton"]||_25["handle"];
-var tfw=function(_2d){
+var _22=_1e["forward"]||_1e["forwardButton"]||_1e["handle"];
+var tfw=function(_23){
 if(_2()!=""){
-_4(_26);
+_3(_1f);
 }
-if(_2b){
-_2b.apply(this,[_2d]);
+if(_22){
+_22.apply(this,[_23]);
 }
 };
-if(_25["forward"]){
-_25.forward=tfw;
+if(_1e["forward"]){
+_1e.forward=tfw;
 }else{
-if(_25["forwardButton"]){
-_25.forwardButton=tfw;
+if(_1e["forwardButton"]){
+_1e.forwardButton=tfw;
 }else{
-if(_25["handle"]){
-_25.handle=tfw;
+if(_1e["handle"]){
+_1e.handle=tfw;
 }
 }
 }
 }else{
 if(!dojo.isIE){
-if(!_a){
-_a=setInterval(_1f,200);
+if(!_8){
+_8=setInterval(_1a,200);
 }
 }
 }
 }else{
-url=_1d();
+url=_19();
 }
-_e.push(_16(url,_25,_26));
+_c.push(_14(url,_1e,_1f));
 };
-_1._iframeLoaded=function(evt,_2f){
-var _30=_1a(_2f.href);
-if(_30==null){
-if(_e.length==1){
-_11();
+_1._iframeLoaded=function(evt,_24){
+var _25=_17(_24.href);
+if(_25==null){
+if(_c.length==1){
+_f();
 }
 return;
 }
-if(_f){
-_f=false;
+if(_d){
+_d=false;
 return;
 }
-if(_e.length>=2&&_30==_1a(_e[_e.length-2].url)){
-_11();
+if(_c.length>=2&&_25==_17(_c[_c.length-2].url)){
+_f();
 }else{
-if(_d.length>0&&_30==_1a(_d[_d.length-1].url)){
-_14();
+if(_b.length>0&&_25==_17(_b[_b.length-1].url)){
+_12();
 }
 }
 };
diff --git a/dojo/behavior.js b/dojo/behavior.js
index 6c6df5e..875b223 100644
--- a/dojo/behavior.js
+++ b/dojo/behavior.js
@@ -29,63 +29,63 @@ _8.call(_7,_6[x],x);
 }
 };
 this._behaviors={};
-this.add=function(_b){
-var _c={};
-_5(_b,this,function(_d,_e){
-var _f=_1(this._behaviors,_e);
-if(typeof _f["id"]!="number"){
-_f.id=_4++;
+this.add=function(_a){
+var _b={};
+_5(_a,this,function(_c,_d){
+var _e=_1(this._behaviors,_d);
+if(typeof _e["id"]!="number"){
+_e.id=_4++;
 }
-var _10=[];
-_f.push(_10);
-if((dojo.isString(_d))||(dojo.isFunction(_d))){
-_d={found:_d};
+var _f=[];
+_e.push(_f);
+if((dojo.isString(_c))||(dojo.isFunction(_c))){
+_c={found:_c};
 }
-_5(_d,function(_11,_12){
-_1(_10,_12).push(_11);
+_5(_c,function(_10,_11){
+_1(_f,_11).push(_10);
 });
 });
 };
-var _13=function(_14,_15,_16){
-if(dojo.isString(_15)){
-if(_16=="found"){
-dojo.publish(_15,[_14]);
+var _12=function(_13,_14,_15){
+if(dojo.isString(_14)){
+if(_15=="found"){
+dojo.publish(_14,[_13]);
 }else{
-dojo.connect(_14,_16,function(){
-dojo.publish(_15,arguments);
+dojo.connect(_13,_15,function(){
+dojo.publish(_14,arguments);
 });
 }
 }else{
-if(dojo.isFunction(_15)){
-if(_16=="found"){
-_15(_14);
+if(dojo.isFunction(_14)){
+if(_15=="found"){
+_14(_13);
 }else{
-dojo.connect(_14,_16,_15);
+dojo.connect(_13,_15,_14);
 }
 }
 }
 };
 this.apply=function(){
-_5(this._behaviors,function(_17,id){
-dojo.query(id).forEach(function(_19){
-var _1a=0;
-var bid="_dj_behavior_"+_17.id;
-if(typeof _19[bid]=="number"){
-_1a=_19[bid];
-if(_1a==(_17.length)){
+_5(this._behaviors,function(_16,id){
+dojo.query(id).forEach(function(_17){
+var _18=0;
+var bid="_dj_behavior_"+_16.id;
+if(typeof _17[bid]=="number"){
+_18=_17[bid];
+if(_18==(_16.length)){
 return;
 }
 }
-for(var x=_1a,_1d;_1d=_17[x];x++){
-_5(_1d,function(_1e,_1f){
-if(dojo.isArray(_1e)){
-dojo.forEach(_1e,function(_20){
-_13(_19,_20,_1f);
+for(var x=_18,_19;_19=_16[x];x++){
+_5(_19,function(_1a,_1b){
+if(dojo.isArray(_1a)){
+dojo.forEach(_1a,function(_1c){
+_12(_17,_1c,_1b);
 });
 }
 });
 }
-_19[bid]=_17.length;
+_17[bid]=_16.length;
 });
 });
 };
diff --git a/dojo/build.txt b/dojo/build.txt
index b8110cd..1fc0ef7 100644
--- a/dojo/build.txt
+++ b/dojo/build.txt
@@ -5,313 +5,304 @@ dojo.js:
 ./../../dojo/_base/_loader/bootstrap.js
 ./../../dojo/_base/_loader/loader.js
 ./../../dojo/_base/_loader/hostenv_browser.js
-./../../release/dojo-release-1.3.2/dojo/_base/lang.js
-./../../release/dojo-release-1.3.2/dojo/_base/declare.js
-./../../release/dojo-release-1.3.2/dojo/_base/connect.js
-./../../release/dojo-release-1.3.2/dojo/_base/Deferred.js
-./../../release/dojo-release-1.3.2/dojo/_base/json.js
-./../../release/dojo-release-1.3.2/dojo/_base/array.js
-./../../release/dojo-release-1.3.2/dojo/_base/Color.js
-./../../release/dojo-release-1.3.2/dojo/_base.js
-./../../release/dojo-release-1.3.2/dojo/_base/window.js
-./../../release/dojo-release-1.3.2/dojo/_base/event.js
-./../../release/dojo-release-1.3.2/dojo/_base/html.js
-./../../release/dojo-release-1.3.2/dojo/_base/NodeList.js
-./../../release/dojo-release-1.3.2/dojo/_base/query.js
-./../../release/dojo-release-1.3.2/dojo/_base/xhr.js
-./../../release/dojo-release-1.3.2/dojo/_base/fx.js
-./../../release/dojo-release-1.3.2/dojo/_base/browser.js
+./../../release/dojo-release-1.4.1/dojo/_base/lang.js
+./../../release/dojo-release-1.4.1/dojo/_base/array.js
+./../../release/dojo-release-1.4.1/dojo/_base/declare.js
+./../../release/dojo-release-1.4.1/dojo/_base/connect.js
+./../../release/dojo-release-1.4.1/dojo/_base/Deferred.js
+./../../release/dojo-release-1.4.1/dojo/_base/json.js
+./../../release/dojo-release-1.4.1/dojo/_base/Color.js
+./../../release/dojo-release-1.4.1/dojo/_base.js
+./../../release/dojo-release-1.4.1/dojo/_base/window.js
+./../../release/dojo-release-1.4.1/dojo/_base/event.js
+./../../release/dojo-release-1.4.1/dojo/_base/html.js
+./../../release/dojo-release-1.4.1/dojo/_base/NodeList.js
+./../../release/dojo-release-1.4.1/dojo/_base/query.js
+./../../release/dojo-release-1.4.1/dojo/_base/xhr.js
+./../../release/dojo-release-1.4.1/dojo/_base/fx.js
+./../../release/dojo-release-1.4.1/dojo/_base/browser.js
 ./jslib/dojoGuardEnd.jsfrag
 
 ../dijit/dijit.js:
-./../../release/dojo-release-1.3.2/dijit/_base/focus.js
-./../../release/dojo-release-1.3.2/dijit/_base/manager.js
-./../../release/dojo-release-1.3.2/dojo/AdapterRegistry.js
-./../../release/dojo-release-1.3.2/dijit/_base/place.js
-./../../release/dojo-release-1.3.2/dijit/_base/window.js
-./../../release/dojo-release-1.3.2/dijit/_base/popup.js
-./../../release/dojo-release-1.3.2/dijit/_base/scroll.js
-./../../release/dojo-release-1.3.2/dijit/_base/sniff.js
-./../../release/dojo-release-1.3.2/dijit/_base/typematic.js
-./../../release/dojo-release-1.3.2/dijit/_base/wai.js
-./../../release/dojo-release-1.3.2/dijit/_base.js
-./../../release/dojo-release-1.3.2/dojo/date/stamp.js
-./../../release/dojo-release-1.3.2/dojo/parser.js
-./../../release/dojo-release-1.3.2/dijit/_Widget.js
-./../../release/dojo-release-1.3.2/dojo/string.js
-./../../release/dojo-release-1.3.2/dijit/_Templated.js
-./../../release/dojo-release-1.3.2/dijit/_Container.js
-./../../release/dojo-release-1.3.2/dijit/_Contained.js
-./../../release/dojo-release-1.3.2/dijit/layout/_LayoutWidget.js
-./../../release/dojo-release-1.3.2/dijit/form/_FormWidget.js
-./../../release/dojo-release-1.3.2/dijit/dijit.js
+./../../release/dojo-release-1.4.1/dijit/_base/manager.js
+./../../release/dojo-release-1.4.1/dijit/_base/focus.js
+./../../release/dojo-release-1.4.1/dojo/AdapterRegistry.js
+./../../release/dojo-release-1.4.1/dijit/_base/place.js
+./../../release/dojo-release-1.4.1/dijit/_base/window.js
+./../../release/dojo-release-1.4.1/dijit/_base/popup.js
+./../../release/dojo-release-1.4.1/dijit/_base/scroll.js
+./../../release/dojo-release-1.4.1/dijit/_base/sniff.js
+./../../release/dojo-release-1.4.1/dijit/_base/typematic.js
+./../../release/dojo-release-1.4.1/dijit/_base/wai.js
+./../../release/dojo-release-1.4.1/dijit/_base.js
+./../../release/dojo-release-1.4.1/dojo/date/stamp.js
+./../../release/dojo-release-1.4.1/dojo/parser.js
+./../../release/dojo-release-1.4.1/dijit/_Widget.js
+./../../release/dojo-release-1.4.1/dojo/string.js
+./../../release/dojo-release-1.4.1/dojo/cache.js
+./../../release/dojo-release-1.4.1/dijit/_Templated.js
+./../../release/dojo-release-1.4.1/dijit/_Container.js
+./../../release/dojo-release-1.4.1/dijit/_Contained.js
+./../../release/dojo-release-1.4.1/dijit/layout/_LayoutWidget.js
+./../../release/dojo-release-1.4.1/dijit/form/_FormWidget.js
+./../../release/dojo-release-1.4.1/dijit/dijit.js
 
 ../dijit/dijit-all.js:
-./../../release/dojo-release-1.3.2/dojo/colors.js
-./../../release/dojo-release-1.3.2/dojo/i18n.js
-./../../release/dojo-release-1.3.2/dijit/ColorPalette.js
-./../../release/dojo-release-1.3.2/dijit/Declaration.js
-./../../release/dojo-release-1.3.2/dojo/dnd/common.js
-./../../release/dojo-release-1.3.2/dojo/dnd/autoscroll.js
-./../../release/dojo-release-1.3.2/dojo/dnd/Mover.js
-./../../release/dojo-release-1.3.2/dojo/dnd/Moveable.js
-./../../release/dojo-release-1.3.2/dojo/dnd/move.js
-./../../release/dojo-release-1.3.2/dojo/dnd/TimedMoveable.js
-./../../release/dojo-release-1.3.2/dojo/fx/Toggler.js
-./../../release/dojo-release-1.3.2/dojo/fx.js
-./../../release/dojo-release-1.3.2/dijit/form/_FormMixin.js
-./../../release/dojo-release-1.3.2/dijit/_DialogMixin.js
-./../../release/dojo-release-1.3.2/dijit/DialogUnderlay.js
-./../../release/dojo-release-1.3.2/dojo/html.js
-./../../release/dojo-release-1.3.2/dijit/layout/ContentPane.js
-./../../release/dojo-release-1.3.2/dijit/TooltipDialog.js
-./../../release/dojo-release-1.3.2/dijit/Dialog.js
-./../../release/dojo-release-1.3.2/dijit/_editor/selection.js
-./../../release/dojo-release-1.3.2/dijit/_editor/range.js
-./../../release/dojo-release-1.3.2/dijit/_editor/html.js
-./../../release/dojo-release-1.3.2/dijit/_editor/RichText.js
-./../../release/dojo-release-1.3.2/dijit/_KeyNavContainer.js
-./../../release/dojo-release-1.3.2/dijit/ToolbarSeparator.js
-./../../release/dojo-release-1.3.2/dijit/Toolbar.js
-./../../release/dojo-release-1.3.2/dijit/form/Button.js
-./../../release/dojo-release-1.3.2/dijit/_editor/_Plugin.js
-./../../release/dojo-release-1.3.2/dijit/_editor/plugins/EnterKeyHandling.js
-./../../release/dojo-release-1.3.2/dijit/Editor.js
-./../../release/dojo-release-1.3.2/dijit/MenuItem.js
-./../../release/dojo-release-1.3.2/dijit/PopupMenuItem.js
-./../../release/dojo-release-1.3.2/dijit/CheckedMenuItem.js
-./../../release/dojo-release-1.3.2/dijit/MenuSeparator.js
-./../../release/dojo-release-1.3.2/dijit/Menu.js
-./../../release/dojo-release-1.3.2/dijit/MenuBar.js
-./../../release/dojo-release-1.3.2/dijit/MenuBarItem.js
-./../../release/dojo-release-1.3.2/dijit/PopupMenuBarItem.js
-./../../release/dojo-release-1.3.2/dojo/regexp.js
-./../../release/dojo-release-1.3.2/dojo/number.js
-./../../release/dojo-release-1.3.2/dijit/ProgressBar.js
-./../../release/dojo-release-1.3.2/dijit/TitlePane.js
-./../../release/dojo-release-1.3.2/dijit/Tooltip.js
-./../../release/dojo-release-1.3.2/dojo/cookie.js
-./../../release/dojo-release-1.3.2/dijit/tree/TreeStoreModel.js
-./../../release/dojo-release-1.3.2/dijit/tree/ForestStoreModel.js
-./../../release/dojo-release-1.3.2/dijit/Tree.js
-./../../release/dojo-release-1.3.2/dijit/form/TextBox.js
-./../../release/dojo-release-1.3.2/dijit/InlineEditBox.js
-./../../release/dojo-release-1.3.2/dijit/form/CheckBox.js
-./../../release/dojo-release-1.3.2/dijit/form/ValidationTextBox.js
-./../../release/dojo-release-1.3.2/dojo/data/util/sorter.js
-./../../release/dojo-release-1.3.2/dojo/data/util/simpleFetch.js
-./../../release/dojo-release-1.3.2/dojo/data/util/filter.js
-./../../release/dojo-release-1.3.2/dijit/form/ComboBox.js
-./../../release/dojo-release-1.3.2/dojo/cldr/monetary.js
-./../../release/dojo-release-1.3.2/dojo/currency.js
-./../../release/dojo-release-1.3.2/dijit/form/NumberTextBox.js
-./../../release/dojo-release-1.3.2/dijit/form/CurrencyTextBox.js
-./../../release/dojo-release-1.3.2/dojo/cldr/supplemental.js
-./../../release/dojo-release-1.3.2/dojo/date.js
-./../../release/dojo-release-1.3.2/dojo/date/locale.js
-./../../release/dojo-release-1.3.2/dijit/_Calendar.js
-./../../release/dojo-release-1.3.2/dijit/form/_DateTimeTextBox.js
-./../../release/dojo-release-1.3.2/dijit/form/DateTextBox.js
-./../../release/dojo-release-1.3.2/dijit/form/FilteringSelect.js
-./../../release/dojo-release-1.3.2/dijit/form/_Spinner.js
-./../../release/dojo-release-1.3.2/dijit/form/NumberSpinner.js
-./../../release/dojo-release-1.3.2/dijit/form/HorizontalSlider.js
-./../../release/dojo-release-1.3.2/dijit/form/VerticalSlider.js
-./../../release/dojo-release-1.3.2/dijit/form/HorizontalRule.js
-./../../release/dojo-release-1.3.2/dijit/form/VerticalRule.js
-./../../release/dojo-release-1.3.2/dijit/form/HorizontalRuleLabels.js
-./../../release/dojo-release-1.3.2/dijit/form/VerticalRuleLabels.js
-./../../release/dojo-release-1.3.2/dijit/form/SimpleTextarea.js
-./../../release/dojo-release-1.3.2/dijit/form/Textarea.js
-./../../release/dojo-release-1.3.2/dijit/form/ToggleButton.js
-./../../release/dojo-release-1.3.2/dijit/layout/StackController.js
-./../../release/dojo-release-1.3.2/dijit/layout/StackContainer.js
-./../../release/dojo-release-1.3.2/dijit/layout/AccordionPane.js
-./../../release/dojo-release-1.3.2/dijit/layout/AccordionContainer.js
-./../../release/dojo-release-1.3.2/dijit/layout/BorderContainer.js
-./../../release/dojo-release-1.3.2/dijit/layout/LayoutContainer.js
-./../../release/dojo-release-1.3.2/dijit/layout/LinkPane.js
-./../../release/dojo-release-1.3.2/dijit/layout/SplitContainer.js
-./../../release/dojo-release-1.3.2/dijit/layout/TabController.js
-./../../release/dojo-release-1.3.2/dijit/layout/TabContainer.js
-./../../release/dojo-release-1.3.2/dijit/dijit-all.js
-
-../dojox/off/offline.js:
-./../../release/dojo-release-1.3.2/dojox/storage/Provider.js
-./../../release/dojo-release-1.3.2/dojox/storage/manager.js
-./../../release/dojo-release-1.3.2/dojo/gears.js
-./../../release/dojo-release-1.3.2/dojox/sql/_crypto.js
-./../../release/dojo-release-1.3.2/dojox/sql/_base.js
-./../../release/dojo-release-1.3.2/dojox/sql.js
-./../../release/dojo-release-1.3.2/dojox/storage/GearsStorageProvider.js
-./../../release/dojo-release-1.3.2/dojox/storage/WhatWGStorageProvider.js
-./../../release/dojo-release-1.3.2/dojo/AdapterRegistry.js
-./../../release/dojo-release-1.3.2/dijit/_base/place.js
-./../../release/dojo-release-1.3.2/dojox/flash/_base.js
-./../../release/dojo-release-1.3.2/dojox/flash.js
-./../../release/dojo-release-1.3.2/dojox/storage/FlashStorageProvider.js
-./../../release/dojo-release-1.3.2/dojox/storage/_common.js
-./../../release/dojo-release-1.3.2/dojox/storage.js
-./../../release/dojo-release-1.3.2/dojox/off/files.js
-./../../release/dojo-release-1.3.2/dojox/off/sync.js
-./../../release/dojo-release-1.3.2/dojox/off/_common.js
-./../../release/dojo-release-1.3.2/dojox/off.js
-./../../release/dojo-release-1.3.2/dojox/off/ui.js
-./../../release/dojo-release-1.3.2/dojox/off/offline.js
+./../../release/dojo-release-1.4.1/dojo/colors.js
+./../../release/dojo-release-1.4.1/dojo/i18n.js
+./../../release/dojo-release-1.4.1/dijit/ColorPalette.js
+./../../release/dojo-release-1.4.1/dijit/Declaration.js
+./../../release/dojo-release-1.4.1/dojo/dnd/common.js
+./../../release/dojo-release-1.4.1/dojo/dnd/autoscroll.js
+./../../release/dojo-release-1.4.1/dojo/dnd/Mover.js
+./../../release/dojo-release-1.4.1/dojo/dnd/Moveable.js
+./../../release/dojo-release-1.4.1/dojo/dnd/move.js
+./../../release/dojo-release-1.4.1/dojo/dnd/TimedMoveable.js
+./../../release/dojo-release-1.4.1/dojo/fx/Toggler.js
+./../../release/dojo-release-1.4.1/dojo/fx.js
+./../../release/dojo-release-1.4.1/dijit/form/_FormMixin.js
+./../../release/dojo-release-1.4.1/dijit/_DialogMixin.js
+./../../release/dojo-release-1.4.1/dijit/DialogUnderlay.js
+./../../release/dojo-release-1.4.1/dojo/html.js
+./../../release/dojo-release-1.4.1/dijit/layout/ContentPane.js
+./../../release/dojo-release-1.4.1/dijit/TooltipDialog.js
+./../../release/dojo-release-1.4.1/dijit/Dialog.js
+./../../release/dojo-release-1.4.1/dijit/_editor/selection.js
+./../../release/dojo-release-1.4.1/dijit/_editor/range.js
+./../../release/dojo-release-1.4.1/dijit/_editor/html.js
+./../../release/dojo-release-1.4.1/dijit/_editor/RichText.js
+./../../release/dojo-release-1.4.1/dijit/_KeyNavContainer.js
+./../../release/dojo-release-1.4.1/dijit/ToolbarSeparator.js
+./../../release/dojo-release-1.4.1/dijit/Toolbar.js
+./../../release/dojo-release-1.4.1/dijit/_HasDropDown.js
+./../../release/dojo-release-1.4.1/dijit/form/Button.js
+./../../release/dojo-release-1.4.1/dijit/_editor/_Plugin.js
+./../../release/dojo-release-1.4.1/dijit/_editor/plugins/EnterKeyHandling.js
+./../../release/dojo-release-1.4.1/dijit/Editor.js
+./../../release/dojo-release-1.4.1/dijit/MenuItem.js
+./../../release/dojo-release-1.4.1/dijit/PopupMenuItem.js
+./../../release/dojo-release-1.4.1/dijit/CheckedMenuItem.js
+./../../release/dojo-release-1.4.1/dijit/MenuSeparator.js
+./../../release/dojo-release-1.4.1/dijit/Menu.js
+./../../release/dojo-release-1.4.1/dijit/MenuBar.js
+./../../release/dojo-release-1.4.1/dijit/MenuBarItem.js
+./../../release/dojo-release-1.4.1/dijit/PopupMenuBarItem.js
+./../../release/dojo-release-1.4.1/dojo/regexp.js
+./../../release/dojo-release-1.4.1/dojo/number.js
+./../../release/dojo-release-1.4.1/dijit/ProgressBar.js
+./../../release/dojo-release-1.4.1/dijit/TitlePane.js
+./../../release/dojo-release-1.4.1/dijit/Tooltip.js
+./../../release/dojo-release-1.4.1/dojo/DeferredList.js
+./../../release/dojo-release-1.4.1/dojo/cookie.js
+./../../release/dojo-release-1.4.1/dijit/tree/TreeStoreModel.js
+./../../release/dojo-release-1.4.1/dijit/tree/ForestStoreModel.js
+./../../release/dojo-release-1.4.1/dijit/Tree.js
+./../../release/dojo-release-1.4.1/dijit/form/TextBox.js
+./../../release/dojo-release-1.4.1/dijit/InlineEditBox.js
+./../../release/dojo-release-1.4.1/dijit/form/Form.js
+./../../release/dojo-release-1.4.1/dijit/form/DropDownButton.js
+./../../release/dojo-release-1.4.1/dijit/form/ComboButton.js
+./../../release/dojo-release-1.4.1/dijit/form/ToggleButton.js
+./../../release/dojo-release-1.4.1/dijit/form/CheckBox.js
+./../../release/dojo-release-1.4.1/dijit/form/RadioButton.js
+./../../release/dojo-release-1.4.1/dijit/form/ValidationTextBox.js
+./../../release/dojo-release-1.4.1/dojo/cldr/monetary.js
+./../../release/dojo-release-1.4.1/dojo/currency.js
+./../../release/dojo-release-1.4.1/dijit/form/NumberTextBox.js
+./../../release/dojo-release-1.4.1/dijit/form/CurrencyTextBox.js
+./../../release/dojo-release-1.4.1/dojo/cldr/supplemental.js
+./../../release/dojo-release-1.4.1/dojo/date.js
+./../../release/dojo-release-1.4.1/dojo/date/locale.js
+./../../release/dojo-release-1.4.1/dijit/Calendar.js
+./../../release/dojo-release-1.4.1/dijit/form/_DateTimeTextBox.js
+./../../release/dojo-release-1.4.1/dijit/form/DateTextBox.js
+./../../release/dojo-release-1.4.1/dijit/form/_Spinner.js
+./../../release/dojo-release-1.4.1/dijit/form/NumberSpinner.js
+./../../release/dojo-release-1.4.1/dojo/data/util/sorter.js
+./../../release/dojo-release-1.4.1/dojo/data/util/simpleFetch.js
+./../../release/dojo-release-1.4.1/dojo/data/util/filter.js
+./../../release/dojo-release-1.4.1/dijit/form/ComboBox.js
+./../../release/dojo-release-1.4.1/dijit/form/FilteringSelect.js
+./../../release/dojo-release-1.4.1/dijit/form/MultiSelect.js
+./../../release/dojo-release-1.4.1/dijit/form/HorizontalSlider.js
+./../../release/dojo-release-1.4.1/dijit/form/VerticalSlider.js
+./../../release/dojo-release-1.4.1/dijit/form/HorizontalRule.js
+./../../release/dojo-release-1.4.1/dijit/form/VerticalRule.js
+./../../release/dojo-release-1.4.1/dijit/form/HorizontalRuleLabels.js
+./../../release/dojo-release-1.4.1/dijit/form/VerticalRuleLabels.js
+./../../release/dojo-release-1.4.1/dijit/form/SimpleTextarea.js
+./../../release/dojo-release-1.4.1/dijit/form/Textarea.js
+./../../release/dojo-release-1.4.1/dijit/layout/StackController.js
+./../../release/dojo-release-1.4.1/dijit/layout/StackContainer.js
+./../../release/dojo-release-1.4.1/dijit/layout/AccordionPane.js
+./../../release/dojo-release-1.4.1/dijit/layout/AccordionContainer.js
+./../../release/dojo-release-1.4.1/dijit/layout/BorderContainer.js
+./../../release/dojo-release-1.4.1/dijit/layout/LayoutContainer.js
+./../../release/dojo-release-1.4.1/dijit/layout/LinkPane.js
+./../../release/dojo-release-1.4.1/dijit/layout/SplitContainer.js
+./../../release/dojo-release-1.4.1/dijit/layout/_TabContainerBase.js
+./../../release/dojo-release-1.4.1/dijit/layout/TabController.js
+./../../release/dojo-release-1.4.1/dijit/layout/ScrollingTabController.js
+./../../release/dojo-release-1.4.1/dijit/layout/TabContainer.js
+./../../release/dojo-release-1.4.1/dijit/dijit-all.js
 
 ../dojox/grid/DataGrid.js:
-./../../release/dojo-release-1.3.2/dijit/_base/focus.js
-./../../release/dojo-release-1.3.2/dijit/_base/manager.js
-./../../release/dojo-release-1.3.2/dojo/AdapterRegistry.js
-./../../release/dojo-release-1.3.2/dijit/_base/place.js
-./../../release/dojo-release-1.3.2/dijit/_base/window.js
-./../../release/dojo-release-1.3.2/dijit/_base/popup.js
-./../../release/dojo-release-1.3.2/dijit/_base/scroll.js
-./../../release/dojo-release-1.3.2/dijit/_base/sniff.js
-./../../release/dojo-release-1.3.2/dijit/_base/typematic.js
-./../../release/dojo-release-1.3.2/dijit/_base/wai.js
-./../../release/dojo-release-1.3.2/dijit/_base.js
-./../../release/dojo-release-1.3.2/dojo/date/stamp.js
-./../../release/dojo-release-1.3.2/dojo/parser.js
-./../../release/dojo-release-1.3.2/dijit/_Widget.js
-./../../release/dojo-release-1.3.2/dojo/string.js
-./../../release/dojo-release-1.3.2/dijit/_Templated.js
-./../../release/dojo-release-1.3.2/dijit/_Container.js
-./../../release/dojo-release-1.3.2/dijit/_Contained.js
-./../../release/dojo-release-1.3.2/dijit/layout/_LayoutWidget.js
-./../../release/dojo-release-1.3.2/dijit/form/_FormWidget.js
-./../../release/dojo-release-1.3.2/dijit/dijit.js
-./../../release/dojo-release-1.3.2/dijit/_KeyNavContainer.js
-./../../release/dojo-release-1.3.2/dijit/MenuItem.js
-./../../release/dojo-release-1.3.2/dijit/PopupMenuItem.js
-./../../release/dojo-release-1.3.2/dijit/CheckedMenuItem.js
-./../../release/dojo-release-1.3.2/dijit/MenuSeparator.js
-./../../release/dojo-release-1.3.2/dijit/Menu.js
-./../../release/dojo-release-1.3.2/dojox/html/metrics.js
-./../../release/dojo-release-1.3.2/dojox/grid/util.js
-./../../release/dojo-release-1.3.2/dojox/grid/_Scroller.js
-./../../release/dojo-release-1.3.2/dojox/grid/cells/_base.js
-./../../release/dojo-release-1.3.2/dojox/grid/cells.js
-./../../release/dojo-release-1.3.2/dojo/dnd/common.js
-./../../release/dojo-release-1.3.2/dojo/dnd/autoscroll.js
-./../../release/dojo-release-1.3.2/dojo/dnd/Mover.js
-./../../release/dojo-release-1.3.2/dojo/dnd/Moveable.js
-./../../release/dojo-release-1.3.2/dojox/grid/_Builder.js
-./../../release/dojo-release-1.3.2/dojo/dnd/Container.js
-./../../release/dojo-release-1.3.2/dojo/dnd/Selector.js
-./../../release/dojo-release-1.3.2/dojo/dnd/Avatar.js
-./../../release/dojo-release-1.3.2/dojo/dnd/Manager.js
-./../../release/dojo-release-1.3.2/dojo/dnd/Source.js
-./../../release/dojo-release-1.3.2/dojox/grid/_View.js
-./../../release/dojo-release-1.3.2/dojox/grid/_RowSelector.js
-./../../release/dojo-release-1.3.2/dojox/grid/_Layout.js
-./../../release/dojo-release-1.3.2/dojox/grid/_ViewManager.js
-./../../release/dojo-release-1.3.2/dojox/grid/_RowManager.js
-./../../release/dojo-release-1.3.2/dojox/grid/_FocusManager.js
-./../../release/dojo-release-1.3.2/dojox/grid/_EditManager.js
-./../../release/dojo-release-1.3.2/dojox/grid/Selection.js
-./../../release/dojo-release-1.3.2/dojox/grid/_Events.js
-./../../release/dojo-release-1.3.2/dojo/i18n.js
-./../../release/dojo-release-1.3.2/dojox/grid/_Grid.js
-./../../release/dojo-release-1.3.2/dojox/grid/DataSelection.js
-./../../release/dojo-release-1.3.2/dojox/grid/DataGrid.js
+./../../release/dojo-release-1.4.1/dijit/_base/manager.js
+./../../release/dojo-release-1.4.1/dijit/_base/focus.js
+./../../release/dojo-release-1.4.1/dojo/AdapterRegistry.js
+./../../release/dojo-release-1.4.1/dijit/_base/place.js
+./../../release/dojo-release-1.4.1/dijit/_base/window.js
+./../../release/dojo-release-1.4.1/dijit/_base/popup.js
+./../../release/dojo-release-1.4.1/dijit/_base/scroll.js
+./../../release/dojo-release-1.4.1/dijit/_base/sniff.js
+./../../release/dojo-release-1.4.1/dijit/_base/typematic.js
+./../../release/dojo-release-1.4.1/dijit/_base/wai.js
+./../../release/dojo-release-1.4.1/dijit/_base.js
+./../../release/dojo-release-1.4.1/dojo/date/stamp.js
+./../../release/dojo-release-1.4.1/dojo/parser.js
+./../../release/dojo-release-1.4.1/dijit/_Widget.js
+./../../release/dojo-release-1.4.1/dojo/string.js
+./../../release/dojo-release-1.4.1/dojo/cache.js
+./../../release/dojo-release-1.4.1/dijit/_Templated.js
+./../../release/dojo-release-1.4.1/dijit/_Container.js
+./../../release/dojo-release-1.4.1/dijit/_Contained.js
+./../../release/dojo-release-1.4.1/dijit/layout/_LayoutWidget.js
+./../../release/dojo-release-1.4.1/dijit/form/_FormWidget.js
+./../../release/dojo-release-1.4.1/dijit/dijit.js
+./../../release/dojo-release-1.4.1/dijit/_KeyNavContainer.js
+./../../release/dojo-release-1.4.1/dijit/MenuItem.js
+./../../release/dojo-release-1.4.1/dijit/PopupMenuItem.js
+./../../release/dojo-release-1.4.1/dijit/CheckedMenuItem.js
+./../../release/dojo-release-1.4.1/dijit/MenuSeparator.js
+./../../release/dojo-release-1.4.1/dijit/Menu.js
+./../../release/dojo-release-1.4.1/dojox/html/metrics.js
+./../../release/dojo-release-1.4.1/dojox/grid/util.js
+./../../release/dojo-release-1.4.1/dojox/grid/_Scroller.js
+./../../release/dojo-release-1.4.1/dojox/grid/cells/_base.js
+./../../release/dojo-release-1.4.1/dojox/grid/cells.js
+./../../release/dojo-release-1.4.1/dojo/dnd/common.js
+./../../release/dojo-release-1.4.1/dojo/dnd/autoscroll.js
+./../../release/dojo-release-1.4.1/dojo/dnd/Mover.js
+./../../release/dojo-release-1.4.1/dojo/dnd/Moveable.js
+./../../release/dojo-release-1.4.1/dojox/grid/_Builder.js
+./../../release/dojo-release-1.4.1/dojo/dnd/Container.js
+./../../release/dojo-release-1.4.1/dojo/dnd/Selector.js
+./../../release/dojo-release-1.4.1/dojo/dnd/Avatar.js
+./../../release/dojo-release-1.4.1/dojo/dnd/Manager.js
+./../../release/dojo-release-1.4.1/dojo/dnd/Source.js
+./../../release/dojo-release-1.4.1/dojox/grid/_View.js
+./../../release/dojo-release-1.4.1/dojox/grid/_RowSelector.js
+./../../release/dojo-release-1.4.1/dojox/grid/_Layout.js
+./../../release/dojo-release-1.4.1/dojox/grid/_ViewManager.js
+./../../release/dojo-release-1.4.1/dojox/grid/_RowManager.js
+./../../release/dojo-release-1.4.1/dojox/grid/_FocusManager.js
+./../../release/dojo-release-1.4.1/dojox/grid/_EditManager.js
+./../../release/dojo-release-1.4.1/dojox/grid/Selection.js
+./../../release/dojo-release-1.4.1/dojox/grid/_Events.js
+./../../release/dojo-release-1.4.1/dojo/i18n.js
+./../../release/dojo-release-1.4.1/dojox/grid/_Grid.js
+./../../release/dojo-release-1.4.1/dojox/grid/DataSelection.js
+./../../release/dojo-release-1.4.1/dojox/grid/DataGrid.js
 
 ../dojox/gfx.js:
-./../../release/dojo-release-1.3.2/dojox/gfx/matrix.js
-./../../release/dojo-release-1.3.2/dojox/gfx/_base.js
-./../../release/dojo-release-1.3.2/dojox/gfx.js
+./../../release/dojo-release-1.4.1/dojox/gfx/matrix.js
+./../../release/dojo-release-1.4.1/dojox/gfx/_base.js
+./../../release/dojo-release-1.4.1/dojox/gfx.js
 
 ../dojox/charting/widget/Chart2D.js:
-./../../release/dojo-release-1.3.2/dijit/_base/focus.js
-./../../release/dojo-release-1.3.2/dijit/_base/manager.js
-./../../release/dojo-release-1.3.2/dojo/AdapterRegistry.js
-./../../release/dojo-release-1.3.2/dijit/_base/place.js
-./../../release/dojo-release-1.3.2/dijit/_base/window.js
-./../../release/dojo-release-1.3.2/dijit/_base/popup.js
-./../../release/dojo-release-1.3.2/dijit/_base/scroll.js
-./../../release/dojo-release-1.3.2/dijit/_base/sniff.js
-./../../release/dojo-release-1.3.2/dijit/_base/typematic.js
-./../../release/dojo-release-1.3.2/dijit/_base/wai.js
-./../../release/dojo-release-1.3.2/dijit/_base.js
-./../../release/dojo-release-1.3.2/dijit/_Widget.js
-./../../release/dojo-release-1.3.2/dojox/gfx/matrix.js
-./../../release/dojo-release-1.3.2/dojox/gfx/_base.js
-./../../release/dojo-release-1.3.2/dojox/gfx.js
-./../../release/dojo-release-1.3.2/dojox/lang/functional/lambda.js
-./../../release/dojo-release-1.3.2/dojox/lang/functional/array.js
-./../../release/dojo-release-1.3.2/dojox/lang/functional/object.js
-./../../release/dojo-release-1.3.2/dojox/lang/functional.js
-./../../release/dojo-release-1.3.2/dojox/lang/functional/fold.js
-./../../release/dojo-release-1.3.2/dojox/lang/functional/reversed.js
-./../../release/dojo-release-1.3.2/dojo/colors.js
-./../../release/dojo-release-1.3.2/dojox/color/_base.js
-./../../release/dojo-release-1.3.2/dojox/color.js
-./../../release/dojo-release-1.3.2/dojox/color/Palette.js
-./../../release/dojo-release-1.3.2/dojox/charting/Theme.js
-./../../release/dojo-release-1.3.2/dojox/charting/Element.js
-./../../release/dojo-release-1.3.2/dojox/charting/Series.js
-./../../release/dojo-release-1.3.2/dojox/charting/scaler/common.js
-./../../release/dojo-release-1.3.2/dojox/charting/scaler/linear.js
-./../../release/dojo-release-1.3.2/dojox/charting/axis2d/common.js
-./../../release/dojo-release-1.3.2/dojox/charting/axis2d/Base.js
-./../../release/dojo-release-1.3.2/dojo/string.js
-./../../release/dojo-release-1.3.2/dojox/lang/utils.js
-./../../release/dojo-release-1.3.2/dojox/charting/axis2d/Default.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/common.js
-./../../release/dojo-release-1.3.2/dojox/charting/scaler/primitive.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/Base.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/Default.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/Lines.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/Areas.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/Markers.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/MarkersOnly.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/Scatter.js
-./../../release/dojo-release-1.3.2/dojox/lang/functional/sequence.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/Stacked.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/StackedLines.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/StackedAreas.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/Columns.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/StackedColumns.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/ClusteredColumns.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/Bars.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/StackedBars.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/ClusteredBars.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/Grid.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/Pie.js
-./../../release/dojo-release-1.3.2/dojox/charting/plot2d/Bubble.js
-./../../release/dojo-release-1.3.2/dojox/charting/Chart2D.js
-./../../release/dojo-release-1.3.2/dojo/fx/easing.js
-./../../release/dojo-release-1.3.2/dojox/gfx/fx.js
-./../../release/dojo-release-1.3.2/dojox/charting/action2d/Base.js
-./../../release/dojo-release-1.3.2/dojox/charting/action2d/Highlight.js
-./../../release/dojo-release-1.3.2/dojo/fx/Toggler.js
-./../../release/dojo-release-1.3.2/dojo/fx.js
-./../../release/dojo-release-1.3.2/dojox/charting/action2d/Magnify.js
-./../../release/dojo-release-1.3.2/dojox/lang/functional/scan.js
-./../../release/dojo-release-1.3.2/dojox/charting/action2d/MoveSlice.js
-./../../release/dojo-release-1.3.2/dojox/charting/action2d/Shake.js
-./../../release/dojo-release-1.3.2/dojo/date/stamp.js
-./../../release/dojo-release-1.3.2/dojo/parser.js
-./../../release/dojo-release-1.3.2/dijit/_Templated.js
-./../../release/dojo-release-1.3.2/dijit/Tooltip.js
-./../../release/dojo-release-1.3.2/dojox/charting/action2d/Tooltip.js
-./../../release/dojo-release-1.3.2/dojox/charting/widget/Chart2D.js
-./../../release/dojo-release-1.3.2/dojox/charting/themes/ET/greys.js
-./../../release/dojo-release-1.3.2/dojox/charting/widget/Sparkline.js
-./../../release/dojo-release-1.3.2/dojox/charting/widget/Legend.js
+./../../release/dojo-release-1.4.1/dijit/_base/manager.js
+./../../release/dojo-release-1.4.1/dijit/_base/focus.js
+./../../release/dojo-release-1.4.1/dojo/AdapterRegistry.js
+./../../release/dojo-release-1.4.1/dijit/_base/place.js
+./../../release/dojo-release-1.4.1/dijit/_base/window.js
+./../../release/dojo-release-1.4.1/dijit/_base/popup.js
+./../../release/dojo-release-1.4.1/dijit/_base/scroll.js
+./../../release/dojo-release-1.4.1/dijit/_base/sniff.js
+./../../release/dojo-release-1.4.1/dijit/_base/typematic.js
+./../../release/dojo-release-1.4.1/dijit/_base/wai.js
+./../../release/dojo-release-1.4.1/dijit/_base.js
+./../../release/dojo-release-1.4.1/dijit/_Widget.js
+./../../release/dojo-release-1.4.1/dojox/gfx/matrix.js
+./../../release/dojo-release-1.4.1/dojox/gfx/_base.js
+./../../release/dojo-release-1.4.1/dojox/gfx.js
+./../../release/dojo-release-1.4.1/dojox/lang/functional/lambda.js
+./../../release/dojo-release-1.4.1/dojox/lang/functional/array.js
+./../../release/dojo-release-1.4.1/dojox/lang/functional/object.js
+./../../release/dojo-release-1.4.1/dojox/lang/functional.js
+./../../release/dojo-release-1.4.1/dojox/lang/functional/fold.js
+./../../release/dojo-release-1.4.1/dojox/lang/functional/reversed.js
+./../../release/dojo-release-1.4.1/dojo/colors.js
+./../../release/dojo-release-1.4.1/dojox/color/_base.js
+./../../release/dojo-release-1.4.1/dojox/color.js
+./../../release/dojo-release-1.4.1/dojox/color/Palette.js
+./../../release/dojo-release-1.4.1/dojox/charting/Theme.js
+./../../release/dojo-release-1.4.1/dojox/charting/Element.js
+./../../release/dojo-release-1.4.1/dojox/charting/Series.js
+./../../release/dojo-release-1.4.1/dojox/charting/scaler/common.js
+./../../release/dojo-release-1.4.1/dojox/charting/scaler/linear.js
+./../../release/dojo-release-1.4.1/dojox/charting/axis2d/common.js
+./../../release/dojo-release-1.4.1/dojox/charting/axis2d/Base.js
+./../../release/dojo-release-1.4.1/dojo/string.js
+./../../release/dojo-release-1.4.1/dojox/lang/utils.js
+./../../release/dojo-release-1.4.1/dojox/charting/axis2d/Default.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/common.js
+./../../release/dojo-release-1.4.1/dojox/charting/scaler/primitive.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/Base.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/Default.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/Lines.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/Areas.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/Markers.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/MarkersOnly.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/Scatter.js
+./../../release/dojo-release-1.4.1/dojox/lang/functional/sequence.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/Stacked.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/StackedLines.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/StackedAreas.js
+./../../release/dojo-release-1.4.1/dojox/gfx/fx.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/Columns.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/StackedColumns.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/ClusteredColumns.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/Bars.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/StackedBars.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/ClusteredBars.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/Grid.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/Pie.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/Bubble.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/Candlesticks.js
+./../../release/dojo-release-1.4.1/dojox/charting/plot2d/OHLC.js
+./../../release/dojo-release-1.4.1/dojox/charting/Chart2D.js
+./../../release/dojo-release-1.4.1/dojo/fx/easing.js
+./../../release/dojo-release-1.4.1/dojox/charting/action2d/Base.js
+./../../release/dojo-release-1.4.1/dojox/charting/action2d/Highlight.js
+./../../release/dojo-release-1.4.1/dojo/fx/Toggler.js
+./../../release/dojo-release-1.4.1/dojo/fx.js
+./../../release/dojo-release-1.4.1/dojox/charting/action2d/Magnify.js
+./../../release/dojo-release-1.4.1/dojox/lang/functional/scan.js
+./../../release/dojo-release-1.4.1/dojox/charting/action2d/MoveSlice.js
+./../../release/dojo-release-1.4.1/dojox/charting/action2d/Shake.js
+./../../release/dojo-release-1.4.1/dojo/date/stamp.js
+./../../release/dojo-release-1.4.1/dojo/parser.js
+./../../release/dojo-release-1.4.1/dojo/cache.js
+./../../release/dojo-release-1.4.1/dijit/_Templated.js
+./../../release/dojo-release-1.4.1/dijit/Tooltip.js
+./../../release/dojo-release-1.4.1/dojox/charting/action2d/Tooltip.js
+./../../release/dojo-release-1.4.1/dojox/charting/widget/Chart2D.js
+./../../release/dojo-release-1.4.1/dojox/charting/themes/ET/greys.js
+./../../release/dojo-release-1.4.1/dojox/charting/widget/Sparkline.js
+./../../release/dojo-release-1.4.1/dojox/charting/widget/Legend.js
 
 ../dojox/dtl.js:
-./../../release/dojo-release-1.3.2/dojox/string/Builder.js
-./../../release/dojo-release-1.3.2/dojox/string/tokenize.js
-./../../release/dojo-release-1.3.2/dojox/dtl/_base.js
-./../../release/dojo-release-1.3.2/dojox/dtl.js
-./../../release/dojo-release-1.3.2/dojox/dtl/Context.js
-./../../release/dojo-release-1.3.2/dojox/dtl/tag/logic.js
-./../../release/dojo-release-1.3.2/dojox/dtl/tag/loop.js
-./../../release/dojo-release-1.3.2/dojo/date.js
-./../../release/dojo-release-1.3.2/dojox/date/php.js
-./../../release/dojo-release-1.3.2/dojox/dtl/utils/date.js
-./../../release/dojo-release-1.3.2/dojox/dtl/tag/date.js
-./../../release/dojo-release-1.3.2/dojox/dtl/tag/loader.js
-./../../release/dojo-release-1.3.2/dojox/dtl/tag/misc.js
-./../../release/dojo-release-1.3.2/dojox/dtl/ext-dojo/NodeList.js
+./../../release/dojo-release-1.4.1/dojox/string/Builder.js
+./../../release/dojo-release-1.4.1/dojox/string/tokenize.js
+./../../release/dojo-release-1.4.1/dojox/dtl/_base.js
+./../../release/dojo-release-1.4.1/dojox/dtl.js
+./../../release/dojo-release-1.4.1/dojox/dtl/Context.js
+./../../release/dojo-release-1.4.1/dojox/dtl/tag/logic.js
+./../../release/dojo-release-1.4.1/dojox/dtl/tag/loop.js
+./../../release/dojo-release-1.4.1/dojo/date.js
+./../../release/dojo-release-1.4.1/dojox/date/php.js
+./../../release/dojo-release-1.4.1/dojox/dtl/utils/date.js
+./../../release/dojo-release-1.4.1/dojox/dtl/tag/date.js
+./../../release/dojo-release-1.4.1/dojox/dtl/tag/loader.js
+./../../release/dojo-release-1.4.1/dojox/dtl/tag/misc.js
+./../../release/dojo-release-1.4.1/dojox/dtl/ext-dojo/NodeList.js
diff --git a/dojo/cache.js b/dojo/cache.js
new file mode 100644
index 0000000..87c8f96
--- /dev/null
+++ b/dojo/cache.js
@@ -0,0 +1,54 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojo.cache"]){
+dojo._hasResource["dojo.cache"]=true;
+dojo.provide("dojo.cache");
+(function(){
+var _1={};
+dojo.cache=function(_2,_3,_4){
+if(typeof _2=="string"){
+var _5=dojo.moduleUrl(_2,_3);
+}else{
+_5=_2;
+_4=_3;
+}
+var _6=_5.toString();
+var _7=_4;
+if(_4!==undefined&&!dojo.isString(_4)){
+_7=("value" in _4?_4.value:undefined);
+}
+var _8=_4&&_4.sanitize?true:false;
+if(_7||_7===null){
+if(_7==null){
+delete _1[_6];
+}else{
+_7=_1[_6]=_8?dojo.cache._sanitize(_7):_7;
+}
+}else{
+if(!(_6 in _1)){
+_7=dojo._getText(_6);
+_1[_6]=_8?dojo.cache._sanitize(_7):_7;
+}
+_7=_1[_6];
+}
+return _7;
+};
+dojo.cache._sanitize=function(_9){
+if(_9){
+_9=_9.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,"");
+var _a=_9.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
+if(_a){
+_9=_a[1];
+}
+}else{
+_9="";
+}
+return _9;
+};
+})();
+}
diff --git a/dojo/cldr/nls/ar/currency.js b/dojo/cldr/nls/ar/currency.js
index 097e496..7f45459 100644
--- a/dojo/cldr/nls/ar/currency.js
+++ b/dojo/cldr/nls/ar/currency.js
@@ -1 +1 @@
-({"HKD_displayName":"دولار هونج كونج","CHF_displayName":"فرنك سويسرى","CAD_displayName":"دولار كندى","CNY_displayName":"يوان صيني","AUD_displayName":"دولار أسترالى","JPY_displayName":"ين ياباني","USD_displayName":"دولار أمريكي","GBP_displayName":"جنيه سترليني","EUR_displayName":"يورو","USD_symbol":"US$","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€"})
\ No newline at end of file
+({"HKD_displayName":"دولار هونج كونج","CHF_displayName":"فرنك سويسري","CAD_displayName":"دولار كندي","CNY_displayName":"يوان صيني","AUD_displayName":"دولار أسترالي","JPY_displayName":"ين ياباني","USD_displayName":"دولار أمريكي","CNY_symbol":"ي.ص","GBP_displayName":"جنيه إسترليني","EUR_displayName":"يورو","CHF_symbol":"Fr.","JPY_symbol":"JP¥","HKD_symbol":"HK$","USD_symbol":"US$","CAD_symbol":"CA$","EUR_symbol":"€","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/ar/gregorian.js b/dojo/cldr/nls/ar/gregorian.js
index 6dcbf22..bf36a39 100644
--- a/dojo/cldr/nls/ar/gregorian.js
+++ b/dojo/cldr/nls/ar/gregorian.js
@@ -1 +1 @@
-({"dateFormatItem-yM":"M/yyyy","field-dayperiod":"ص/م","dateFormatItem-yQ":"yyyy Q","field-minute":"الدقائق","eraNames":["قبل الميلاد","ميلادي"],"dateFormatItem-MMMEd":"E d MMM","field-weekday":"اليوم","dateFormatItem-yQQQ":"yyyy QQQ","dateFormatItem-MMdd":"dd‏/MM","days-standAlone-wide":["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"dateFormatItem-MMM":"LLL","patternChars":"GanjkHmsSEDFwWxhKzAeugXZvcL","months-standAlone-narrow":["ي","ف","م","أ","و","ن","ل","غ","س" [...]
\ No newline at end of file
+({"dateFormatItem-yM":"M‏/yyyy","field-dayperiod":"ص/م","dateFormatItem-yQ":"yyyy Q","field-minute":"الدقائق","eraNames":["قبل الميلاد","ميلادي"],"dateFormatItem-MMMEd":"E d MMM","field-weekday":"اليوم","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-MMdd":"dd‏/MM","days-standAlone-wide":["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["ي","ف","م","أ","و","ن","ل","غ","س","ك","ب","د"],"field-era":"العصر","field-hour": [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/ar/hebrew.js b/dojo/cldr/nls/ar/hebrew.js
new file mode 100644
index 0000000..c43bd65
--- /dev/null
+++ b/dojo/cldr/nls/ar/hebrew.js
@@ -0,0 +1 @@
+({"quarters-format-abbr":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormat-medium":"dd‏/MM‏/yyyy","dateFormatItem-MMMEd":"E d MMM","dateFormatItem-yMEd":"EEE، d/‏M/‏yyyy","timeFormat-full":"zzzz h:mm:ss a","dateFormatItem-Md":"d/‏M","months-standAlone-wide":["تشري","مرحشوان","كيسلو","طيفت","شباط","آذار الأول","آذار الثاني","نيسان","أيار","سيفان","تموز","آب"],"days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"dateFormatItem-MMMMEd":"E d MMMM","dateFormatItem-MM [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/ar/islamic-civil.js b/dojo/cldr/nls/ar/islamic-civil.js
index aad7fd9..2ca9a0e 100644
--- a/dojo/cldr/nls/ar/islamic-civil.js
+++ b/dojo/cldr/nls/ar/islamic-civil.js
@@ -1 +1 @@
-({"eraAbbr":["ه"],"patternChars":"GanjkHmsSEDFwWxhKzAeugXZvcL","months-format-wide":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"months at localeAlias1":{"bundle":"islamic","target":"months"},"era at localeAlias2":{"bundle":"islamic","target":"era"},"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"dateFormatItem-yQQQ":"yyyy QQQ","dateFormatIt [...]
\ No newline at end of file
+({"quarters-format-abbr":["الربع الأول","الربع الثاني","الربع الثالث","الربع الرابع"],"dateFormat-medium":"dd‏/MM‏/yyyy","dateFormatItem-MMMEd":"E d MMM","dateFormatItem-yMEd":"EEE، d/‏M/‏yyyy","eraNarrow":["ه"],"timeFormat-full":"zzzz h:mm:ss a","dateFormatItem-Md":"d/‏M","months-standAlone-narrow":["م","ص","ر","ر","ج","ج","ر","ش","ر","ش","ذ","ذ"],"months-standAlone-wide":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو ا [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/ar/islamic.js b/dojo/cldr/nls/ar/islamic.js
index 67ac743..59823f0 100644
--- a/dojo/cldr/nls/ar/islamic.js
+++ b/dojo/cldr/nls/ar/islamic.js
@@ -1 +1 @@
-({"eraAbbr":["ه"],"patternChars":"GanjkHmsSEDFwWxhKzAeugXZvcL","months-format-wide":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"am":"ص","pm":"م","months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"dateFormatItem-yQQQ":"yyyy QQQ","dateFormatItem-yMEd":"EEE, yyyy-M-d","dateFormatItem-MMMEd":"E MMM d","eraNarrow":["AH"],"dateTimeFormats-appe [...]
\ No newline at end of file
+({"dateFormatItem-yM":"M‏/yyyy","dateFormatItem-yQ":"yyyy Q","eraNames":["هـ"],"dateFormatItem-MMMEd":"E d MMM","months-standAlone-narrow":["م","ص","ر","ر","ج","ج","ر","ش","ر","ش","ذ","ذ"],"timeFormat-full":"zzzz h:mm:ss a","months-standAlone-abbr":["محرم","صفر","ربيع الأول","ربيع الآخر","جمادى الأولى","جمادى الآخرة","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],"dateFormatItem-yMMM":"MMM y","days-standAlone-narrow":["ح","ن","ث","ر","خ","ج","س"],"eraAbbr":["هـ"],"dateFormat-long": [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/ar/number.js b/dojo/cldr/nls/ar/number.js
index 9e5f250..543ccb3 100644
--- a/dojo/cldr/nls/ar/number.js
+++ b/dojo/cldr/nls/ar/number.js
@@ -1 +1 @@
-({"group":"٬","percentSign":"٪","exponential":"اس","list":"؛","decimal":"٫","nan":"ليس رقم","nativeZeroDigit":"٠","decimalFormat":"#,##0.###;#,##0.###-","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:dig [...]
\ No newline at end of file
+({"group":"٬","percentSign":"٪","exponential":"اس","list":"؛","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":"٫","nan":"ليس رقم","nativeZeroDigit":"٠","perMille":"؉","decimalFormat":"#,##0.###;#,##0.###-","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","plusSign":"+","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afte [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/ca/currency.js b/dojo/cldr/nls/ca/currency.js
index 44fdb19..9a3c0b3 100644
--- a/dojo/cldr/nls/ca/currency.js
+++ b/dojo/cldr/nls/ca/currency.js
@@ -1 +1 @@
-({"EUR_displayName":"Euro","CHF_displayName":"Franc suís","GBP_displayName":"Lliura esterlina britànica","JPY_displayName":"Ien japonès","CNY_displayName":"Iuan renmimbi xinès","USD_displayName":"Dòlar EUA","USD_symbol":"US$","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€"})
\ No newline at end of file
+({"HKD_displayName":"dòlar de Hong Kong","CHF_displayName":"franc suís","CAD_displayName":"dòlar canadenc","CNY_displayName":"iuan renmimbi xinès","AUD_displayName":"dòlar australià","JPY_displayName":"ien japonès","USD_displayName":"dòlar dels Estats Units","GBP_displayName":"lliura esterlina britànica","EUR_displayName":"euro","CHF_symbol":"Fr.","JPY_symbol":"JP¥","HKD_symbol":"HK$","USD_symbol":"US$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/ca/gregorian.js b/dojo/cldr/nls/ca/gregorian.js
index 078925b..f931281 100644
--- a/dojo/cldr/nls/ca/gregorian.js
+++ b/dojo/cldr/nls/ca/gregorian.js
@@ -1 +1 @@
-({"dateFormatItem-yM":"M/yyyy","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q yyyy","field-minute":"minut","eraNames":["aC","dC"],"dateFormatItem-MMMEd":"E MMM d","field-weekday":"dia de la setmana","dateFormatItem-yQQQ":"QQQ yyyy","days-standAlone-wide":["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],"dateFormatItem-MMM":"LLL","patternChars":"GuMtkHmsSEDFwWahKzUeygAZvcL","months-standAlone-narrow":["g","f","m","a","m","j","j","a","s","o","n","d"],"field-era [...]
\ No newline at end of file
+({"dateFormatItem-yM":"M/yyyy","field-dayperiod":"a.m./p.m.","dateFormatItem-yQ":"Q yyyy","field-minute":"minut","eraNames":["aC","dC"],"dateFormatItem-MMMEd":"E d MMM","field-weekday":"dia de la setmana","dateFormatItem-yQQQ":"QQQ y","days-standAlone-wide":["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["g","f","m","a","m","j","j","a","s","o","n","d"],"field-era":"era","field-hour":"hora","quarters-standA [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/cs/currency.js b/dojo/cldr/nls/cs/currency.js
index 1f0c2ff..64c8a42 100644
--- a/dojo/cldr/nls/cs/currency.js
+++ b/dojo/cldr/nls/cs/currency.js
@@ -1 +1 @@
-({"HKD_displayName":"Dolar hongkongský","CHF_displayName":"Frank švýcarský","CHF_symbol":"SwF","HKD_symbol":"HK$","CAD_displayName":"Dolar kanadský","CNY_displayName":"Juan renminbi","AUD_displayName":"Dolar australský","JPY_displayName":"Jen","CAD_symbol":"Can$","USD_displayName":"Dolar americký","CNY_symbol":"Y","GBP_displayName":"Libra šterlinků","AUD_symbol":"$A","EUR_displayName":"Euro","USD_symbol":"US$","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€"})
\ No newline at end of file
+({"HKD_displayName":"Dolar hongkongský","CHF_displayName":"Frank švýcarský","CAD_displayName":"Dolar kanadský","CNY_displayName":"Juan renminbi","AUD_displayName":"Dolar australský","JPY_displayName":"Jen","USD_displayName":"Dolar americký","GBP_displayName":"Libra šterlinků","EUR_displayName":"Euro","CHF_symbol":"Fr.","JPY_symbol":"JP¥","HKD_symbol":"HK$","USD_symbol":"US$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/cs/gregorian.js b/dojo/cldr/nls/cs/gregorian.js
index 4a01c78..3d35825 100644
--- a/dojo/cldr/nls/cs/gregorian.js
+++ b/dojo/cldr/nls/cs/gregorian.js
@@ -1 +1 @@
-({"quarters-standAlone-wide":["1. čtvrtletí","2. čtvrtletí","3. čtvrtletí","4. čtvrtletí"],"quarters-format-abbr":["1. čtvrtletí","2. čtvrtletí","3. čtvrtletí","4. čtvrtletí"],"dateFormat-medium":"d.M.yyyy","quarters-standAlone-abbr":["1. čtvrtletí","2. čtvrtletí","3. čtvrtletí","4. čtvrtletí"],"eraNarrow":["př.Kr.","po Kr."],"months-format-narrow":["l","ú","b","d","k","č","č","s","z","ř","l","p"],"pm":"odp.","months-standAlone-narrow":["l","ú","b","d","k","č","č","s","z","ř","l","p"],"m [...]
\ No newline at end of file
+({"quarters-standAlone-wide":["1. čtvrtletí","2. čtvrtletí","3. čtvrtletí","4. čtvrtletí"],"quarters-format-abbr":["1. čtvrtletí","2. čtvrtletí","3. čtvrtletí","4. čtvrtletí"],"dateFormat-medium":"d.M.yyyy","quarters-standAlone-abbr":["1. čtvrtletí","2. čtvrtletí","3. čtvrtletí","4. čtvrtletí"],"eraNarrow":["př.Kr.","po Kr."],"months-format-narrow":["l","ú","b","d","k","č","č","s","z","ř","l","p"],"pm":"odp.","months-standAlone-narrow":["l","ú","b","d","k","č","č","s","z","ř","l","p"],"m [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/currency.js b/dojo/cldr/nls/currency.js
index 742b390..5007016 100644
--- a/dojo/cldr/nls/currency.js
+++ b/dojo/cldr/nls/currency.js
@@ -1 +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
+({"CHF_symbol":"Fr.","JPY_symbol":"JP¥","HKD_symbol":"HK$","USD_symbol":"US$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/da/currency.js b/dojo/cldr/nls/da/currency.js
index 7bed5de..431592c 100644
--- a/dojo/cldr/nls/da/currency.js
+++ b/dojo/cldr/nls/da/currency.js
@@ -1 +1 @@
-({"HKD_displayName":"Hongkong dollar","CHF_displayName":"Schweizisk franc","CHF_symbol":"SwF","HKD_symbol":"HK$","CAD_displayName":"Canadisk dollar","CNY_displayName":"Kinesisk yuan renminbi","USD_symbol":"$","AUD_displayName":"Australsk dollar","JPY_displayName":"Japansk yen","CAD_symbol":"Can$","USD_displayName":"Amerikansk dollar","CNY_symbol":"Y","GBP_displayName":"Britisk pund","GBP_symbol":"£","AUD_symbol":"$A","EUR_displayName":"Euro","JPY_symbol":"JP¥","EUR_symbol":"€"})
\ No newline at end of file
+({"HKD_displayName":"Hongkong dollar","CHF_displayName":"Schweizisk franc","CAD_displayName":"Canadisk dollar","CNY_displayName":"Kinesisk yuan renminbi","USD_symbol":"$","AUD_displayName":"Australsk dollar","JPY_displayName":"Japansk yen","USD_displayName":"Amerikansk dollar","GBP_displayName":"Britisk pund","EUR_displayName":"Euro","CHF_symbol":"Fr.","JPY_symbol":"JP¥","HKD_symbol":"HK$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/da/gregorian.js b/dojo/cldr/nls/da/gregorian.js
index 76f2933..bfcca51 100644
--- a/dojo/cldr/nls/da/gregorian.js
+++ b/dojo/cldr/nls/da/gregorian.js
@@ -1 +1 @@
-({"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"ugedag","dateFormatItem-yQQQ":"QQQ yyyy","dateFormatItem-yMEd":"EEE. d-M-yyyy","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["f.Kr.","e.Kr."],"dateFormat-long":"d. MMM yyyy","months-format-wide":["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"],"dateFormat-full":"EEEE 'den' d. MMMM yyyy","dat [...]
\ No newline at end of file
+({"dateFormatItem-yM":"M-yyyy","field-dayperiod":"dagtid","dateFormatItem-yQ":"Q yyyy","field-minute":"minut","eraNames":["f.Kr.","e.Kr."],"dateFormatItem-MMMEd":"E d MMM","field-weekday":"ugedag","dateFormatItem-hms":"h.mm.ss a","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-MMdd":"dd/MM","days-standAlone-wide":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"dateFormatItem-MMM":"MMM","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-e [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/de/currency.js b/dojo/cldr/nls/de/currency.js
index 56d66a6..a80d3fc 100644
--- a/dojo/cldr/nls/de/currency.js
+++ b/dojo/cldr/nls/de/currency.js
@@ -1 +1 @@
-({"HKD_displayName":"Hongkong-Dollar","CHF_displayName":"Schweizer Franken","CHF_symbol":"SFr.","JPY_symbol":"¥","CAD_displayName":"Kanadischer Dollar","CNY_displayName":"Renminbi Yuan","USD_symbol":"$","AUD_displayName":"Australischer Dollar","JPY_displayName":"Yen","CAD_symbol":"Can$","USD_displayName":"US-Dollar","CNY_symbol":"Y","GBP_displayName":"Pfund Sterling","GBP_symbol":"£","AUD_symbol":"$A","EUR_displayName":"Euro","EUR_symbol":"€"})
\ No newline at end of file
+({"HKD_displayName":"Hongkong-Dollar","CHF_displayName":"Schweizer Franken","JPY_symbol":"¥","CAD_displayName":"Kanadischer Dollar","CNY_displayName":"Renminbi Yuan","USD_symbol":"$","AUD_displayName":"Australischer Dollar","JPY_displayName":"Yen","USD_displayName":"US-Dollar","GBP_displayName":"Pfund Sterling","EUR_displayName":"Euro","CHF_symbol":"Fr.","HKD_symbol":"HK$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/de/gregorian.js b/dojo/cldr/nls/de/gregorian.js
index f0d7994..31d54b6 100644
--- a/dojo/cldr/nls/de/gregorian.js
+++ b/dojo/cldr/nls/de/gregorian.js
@@ -1 +1 @@
-({"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Wochentag","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"QQQ yyyy","dateFormatItem-yMEd":"EEE, yyyy-M-d","dateFormatItem-MMMEd":"E d. MMM","eraNarrow":["v. Chr.","n. Chr."],"dateFormat-long":"d. MMMM yyyy","months-format-wide":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"dateF [...]
\ No newline at end of file
+({"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Wochentag","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE, yyyy-M-d","dateFormatItem-MMMEd":"E d. MMM","eraNarrow":["v. Chr.","n. Chr."],"dateFormat-long":"d. MMMM y","months-format-wide":["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],"dateTimeFor [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/el/currency.js b/dojo/cldr/nls/el/currency.js
index 9338e30..bc0d162 100644
--- a/dojo/cldr/nls/el/currency.js
+++ b/dojo/cldr/nls/el/currency.js
@@ -1 +1 @@
-({"HKD_displayName":"Δολάριο Χονγκ Κονγκ","CHF_displayName":"Φράγκο Ελβετίας","CHF_symbol":"SwF","HKD_symbol":"HK$","CAD_displayName":"Δολάριο Καναδά","CNY_displayName":"Γιουάν Ρενμίμπι Κίνας","AUD_displayName":"Δολάριο Αυστραλίας","JPY_displayName":"Γιεν Ιαπωνίας","CAD_symbol":"Can$","USD_displayName":"Δολάριο ΗΠΑ","CNY_symbol":"Y","GBP_displayName":"Λίρα Στερλίνα Βρετανίας","GBP_symbol":"GBP","AUD_symbol":"$A","EUR_displayName":"Ευρώ","USD_symbol":"US$","JPY_symbol":"JP¥","EUR_symbol":"€"})
\ No newline at end of file
+({"HKD_displayName":"Δολάριο Χονγκ Κονγκ","CHF_displayName":"Φράγκο Ελβετίας","CAD_displayName":"Δολάριο Καναδά","CNY_displayName":"Γιουάν Ρενμίμπι Κίνας","AUD_displayName":"Δολάριο Αυστραλίας","JPY_displayName":"Γιεν Ιαπωνίας","USD_displayName":"Δολάριο ΗΠΑ","GBP_displayName":"Λίρα Στερλίνα Βρετανίας","EUR_displayName":"Ευρώ","CHF_symbol":"Fr.","JPY_symbol":"JP¥","HKD_symbol":"HK$","USD_symbol":"US$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/el/gregorian.js b/dojo/cldr/nls/el/gregorian.js
index c7ebd97..affc062 100644
--- a/dojo/cldr/nls/el/gregorian.js
+++ b/dojo/cldr/nls/el/gregorian.js
@@ -1 +1 @@
-({"field-dayperiod":"ΠΜ/ΜΜ","field-minute":"Λεπτό","eraNames":["π.Χ.","μ.Χ."],"dateFormatItem-MMMEd":"E d MMM","field-weekday":"Ημέρα Εβδομάδας","dateFormatItem-MMdd":"dd/MM","days-standAlone-wide":["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],"patternChars":"GanjkHmsSEDFwWxhKzAeugXZvcL","months-standAlone-narrow":["Ι","Φ","Μ","Α","Μ","Ι","Ι","Α","Σ","Ο","Ν","Δ"],"field-era":"Περίοδος","field-hour":"Ώρα","quarters-standAlone-abbr":["Τ1","Τ2","Τ3","Τ4"],"timeForma [...]
\ No newline at end of file
+({"months-format-narrow":["Ι","Φ","Μ","Α","Μ","Ι","Ι","Α","Σ","Ο","Ν","Δ"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Ημέρα εβδομάδας","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, d/M/yyyy","dateFormatItem-MMMEd":"E, d MMM","eraNarrow":["π.Χ.","μ.Χ."],"dateFormat-long":"dd MMMM y","months-format-wide":["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβ [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/el/number.js b/dojo/cldr/nls/el/number.js
index 5b8929f..ff419fb 100644
--- a/dojo/cldr/nls/el/number.js
+++ b/dojo/cldr/nls/el/number.js
@@ -1 +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 [...]
\ No newline at end of file
+({"group":".","percentSign":"%","exponential":"e","percentFormat":"#,##0%","list":",","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","currencyFormat":"#,##0.00 ¤","plusSign":"+","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[: [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/en-au/currency.js b/dojo/cldr/nls/en-au/currency.js
index c9caa43..b1caa0e 100644
--- a/dojo/cldr/nls/en-au/currency.js
+++ b/dojo/cldr/nls/en-au/currency.js
@@ -1 +1 @@
-({"AUD_symbol":"$","USD_symbol":"US$","HKD_displayName":"Hong Kong Dollar","CHF_displayName":"Swiss Franc","CHF_symbol":"Fr.","JPY_symbol":"¥","HKD_symbol":"HK$","CAD_displayName":"Canadian Dollar","CNY_displayName":"Chinese Yuan Renminbi","AUD_displayName":"Australian Dollar","JPY_displayName":"Japanese Yen","CAD_symbol":"CA$","USD_displayName":"US Dollar","CNY_symbol":"RMB","GBP_displayName":"British Pound Sterling","GBP_symbol":"£","EUR_displayName":"Euro","EUR_symbol":"€"})
\ No newline at end of file
+({"AUD_symbol":"$","USD_symbol":"US$","HKD_displayName":"Hong Kong Dollar","CHF_displayName":"Swiss Franc","JPY_symbol":"¥","CAD_displayName":"Canadian Dollar","CNY_displayName":"Chinese Yuan Renminbi","AUD_displayName":"Australian Dollar","JPY_displayName":"Japanese Yen","USD_displayName":"US Dollar","GBP_displayName":"British Pound Sterling","EUR_displayName":"Euro","CHF_symbol":"Fr.","HKD_symbol":"HK$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/en-au/gregorian.js b/dojo/cldr/nls/en-au/gregorian.js
index e98939a..13145b6 100644
--- a/dojo/cldr/nls/en-au/gregorian.js
+++ b/dojo/cldr/nls/en-au/gregorian.js
@@ -1 +1 @@
-({"dateFormat-short":"d/MM/yy","dateFormatItem-MMdd":"dd/MM","dateFormat-medium":"dd/MM/yyyy","dateFormat-long":"d MMMM yyyy","dateFormatItem-MMMMd":"d MMMM","dateFormat-full":"EEEE, d MMMM yyyy","dateFormatItem-yyyyMM":"MM/yyyy","dateFormatItem-yyyyMMMM":"MMMM yyyy","dateFormatItem-yM":"M/yyyy","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q yyyy","field-minute":"Minute","eraNames":["Before Christ","Anno Domini"],"dateFormatItem-MMMEd":"E, MMM d","field-weekday":"Day of the Week","date [...]
\ No newline at end of file
+({"dateFormat-short":"d/MM/yy","dateFormatItem-MMdd":"dd/MM","dateFormat-medium":"dd/MM/yyyy","dateFormat-long":"d MMMM y","dateFormatItem-MMMMd":"d MMMM","dateFormat-full":"EEEE, d MMMM y","dateFormatItem-yyyyMM":"MM/yyyy","dateFormatItem-yyyyMMMM":"MMMM y","dateFormatItem-yM":"M/yyyy","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q yyyy","field-minute":"Minute","eraNames":["Before Christ","Anno Domini"],"dateFormatItem-MMMEd":"E, MMM d","dateTimeFormat-full":"{1} {0}","field-weekday": [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/en-ca/currency.js b/dojo/cldr/nls/en-ca/currency.js
index 516b0e1..0fede32 100644
--- a/dojo/cldr/nls/en-ca/currency.js
+++ b/dojo/cldr/nls/en-ca/currency.js
@@ -1 +1 @@
-({"CAD_symbol":"$","USD_symbol":"US$","HKD_displayName":"Hong Kong Dollar","CHF_displayName":"Swiss Franc","CHF_symbol":"Fr.","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":"RMB","GBP_displayName":"British Pound Sterling","GBP_symbol":"£","AUD_symbol":"A$","EUR_displayName":"Euro","EUR_symbol":"€"})
\ No newline at end of file
+({"CAD_symbol":"$","USD_symbol":"US$","HKD_displayName":"Hong Kong Dollar","CHF_displayName":"Swiss Franc","JPY_symbol":"¥","CAD_displayName":"Canadian Dollar","CNY_displayName":"Chinese Yuan Renminbi","AUD_displayName":"Australian Dollar","JPY_displayName":"Japanese Yen","USD_displayName":"US Dollar","GBP_displayName":"British Pound Sterling","EUR_displayName":"Euro","CHF_symbol":"Fr.","HKD_symbol":"HK$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/en-ca/gregorian.js b/dojo/cldr/nls/en-ca/gregorian.js
index 6dcb8ba..1eb4b3e 100644
--- a/dojo/cldr/nls/en-ca/gregorian.js
+++ b/dojo/cldr/nls/en-ca/gregorian.js
@@ -1 +1 @@
-({"dateFormat-short":"yy-MM-dd","dateFormatItem-MMdd":"MM-dd","dateFormat-medium":"yyyy-MM-dd","dateFormatItem-yyMMM":"MMM-yy","dateFormatItem-yM":"M/yyyy","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q yyyy","field-minute":"Minute","eraNames":["Before Christ","Anno Domini"],"dateFormatItem-MMMEd":"E, MMM d","field-weekday":"Day of the Week","dateFormatItem-yQQQ":"QQQ yyyy","days-standAlone-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"dateFormatItem-M [...]
\ No newline at end of file
+({"dateFormat-short":"yy-MM-dd","dateFormatItem-MMdd":"MM-dd","dateFormat-medium":"yyyy-MM-dd","dateFormatItem-yyMMM":"MMM-yy","dateFormatItem-yM":"M/yyyy","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q yyyy","field-minute":"Minute","eraNames":["Before Christ","Anno Domini"],"dateFormatItem-MMMEd":"E, MMM d","dateTimeFormat-full":"{1} {0}","field-weekday":"Day of the Week","dateFormatItem-yQQQ":"QQQ y","days-standAlone-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday", [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/en-gb/gregorian.js b/dojo/cldr/nls/en-gb/gregorian.js
index c463e9e..600dc9f 100644
--- a/dojo/cldr/nls/en-gb/gregorian.js
+++ b/dojo/cldr/nls/en-gb/gregorian.js
@@ -1 +1 @@
-({"dateFormatItem-yyMMM":"MMM yy","dateFormatItem-Md":"d/M","dateFormatItem-yMEd":"EEE, d/M/yyyy","dateFormatItem-yyyyMMMM":"MMMM yyyy","timeFormat-full":"HH:mm:ss v","timeFormat-medium":"HH:mm:ss","dateFormatItem-MEd":"E, d/M","dateFormat-medium":"d MMM yyyy","dateFormatItem-MMdd":"dd/MM","dateFormatItem-yyyyMM":"MM/yyyy","dateFormat-full":"EEEE, d MMMM yyyy","timeFormat-long":"HH:mm:ss z","timeFormat-short":"HH:mm","dateFormat-short":"dd/MM/yyyy","dateFormatItem-MMMMd":"d MMMM","dateFo [...]
\ No newline at end of file
+({"dateFormatItem-yyMMM":"MMM yy","dateFormatItem-Md":"d/M","dateFormatItem-yMEd":"EEE, d/M/yyyy","dateFormatItem-yyyyMMMM":"MMMM y","timeFormat-full":"HH:mm:ss zzzz","timeFormat-medium":"HH:mm:ss","dateFormatItem-MEd":"E, d/M","dateFormat-medium":"d MMM y","dateFormatItem-MMdd":"dd/MM","dateFormatItem-yyyyMM":"MM/yyyy","dateFormat-full":"EEEE, d MMMM y","timeFormat-long":"HH:mm:ss z","timeFormat-short":"HH:mm","dateFormat-short":"dd/MM/yyyy","dateFormatItem-MMMMd":"d MMMM","dateFormat-l [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/en-us/currency.js b/dojo/cldr/nls/en-us/currency.js
index ee32ca2..fdfe855 100644
--- a/dojo/cldr/nls/en-us/currency.js
+++ b/dojo/cldr/nls/en-us/currency.js
@@ -1 +1 @@
-({"USD_symbol":"$","HKD_displayName":"Hong Kong Dollar","CHF_displayName":"Swiss Franc","CHF_symbol":"Fr.","JPY_symbol":"¥","HKD_symbol":"HK$","CAD_displayName":"Canadian Dollar","CNY_displayName":"Chinese Yuan Renminbi","AUD_displayName":"Australian Dollar","JPY_displayName":"Japanese Yen","CAD_symbol":"CA$","USD_displayName":"US Dollar","CNY_symbol":"RMB","GBP_displayName":"British Pound Sterling","GBP_symbol":"£","AUD_symbol":"A$","EUR_displayName":"Euro","EUR_symbol":"€"})
\ No newline at end of file
+({"USD_symbol":"$","HKD_displayName":"Hong Kong Dollar","CHF_displayName":"Swiss Franc","JPY_symbol":"¥","CAD_displayName":"Canadian Dollar","CNY_displayName":"Chinese Yuan Renminbi","AUD_displayName":"Australian Dollar","JPY_displayName":"Japanese Yen","USD_displayName":"US Dollar","GBP_displayName":"British Pound Sterling","EUR_displayName":"Euro","CHF_symbol":"Fr.","HKD_symbol":"HK$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/en/currency.js b/dojo/cldr/nls/en/currency.js
index 1be18a5..20d9524 100644
--- a/dojo/cldr/nls/en/currency.js
+++ b/dojo/cldr/nls/en/currency.js
@@ -1 +1 @@
-({"HKD_displayName":"Hong Kong Dollar","CHF_displayName":"Swiss Franc","CHF_symbol":"Fr.","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":"CA$","USD_displayName":"US Dollar","CNY_symbol":"RMB","GBP_displayName":"British Pound Sterling","GBP_symbol":"£","AUD_symbol":"A$","EUR_displayName":"Euro","EUR_symbol":"€"})
\ No newline at end of file
+({"HKD_displayName":"Hong Kong Dollar","CHF_displayName":"Swiss Franc","JPY_symbol":"¥","CAD_displayName":"Canadian Dollar","CNY_displayName":"Chinese Yuan Renminbi","USD_symbol":"$","AUD_displayName":"Australian Dollar","JPY_displayName":"Japanese Yen","USD_displayName":"US Dollar","GBP_displayName":"British Pound Sterling","EUR_displayName":"Euro","CHF_symbol":"Fr.","HKD_symbol":"HK$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/en/gregorian.js b/dojo/cldr/nls/en/gregorian.js
index b8be379..4ed86f9 100644
--- a/dojo/cldr/nls/en/gregorian.js
+++ b/dojo/cldr/nls/en/gregorian.js
@@ -1 +1 @@
-({"dateFormatItem-yM":"M/yyyy","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q yyyy","field-minute":"Minute","eraNames":["Before Christ","Anno Domini"],"dateFormatItem-MMMEd":"E, MMM d","field-weekday":"Day of the Week","dateFormatItem-yQQQ":"QQQ yyyy","days-standAlone-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-era":"Era","field-hour":"Hour", [...]
\ No newline at end of file
+({"dateFormatItem-yM":"M/yyyy","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q yyyy","field-minute":"Minute","eraNames":["Before Christ","Anno Domini"],"dateFormatItem-MMMEd":"E, MMM d","dateTimeFormat-full":"{1} {0}","field-weekday":"Day of the Week","dateFormatItem-yQQQ":"QQQ y","days-standAlone-wide":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"dateTime [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/es-es/gregorian.js b/dojo/cldr/nls/es-es/gregorian.js
index 0b251df..f492831 100644
--- a/dojo/cldr/nls/es-es/gregorian.js
+++ b/dojo/cldr/nls/es-es/gregorian.js
@@ -1 +1 @@
-({"timeFormat-medium":"H:mm:ss","timeFormat-full":"HH'H'mm''ss\" v","timeFormat-short":"H:mm","months-format-narrow":["E","F","M","A","M","J","J","A","S","O","N","D"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"día de la semana","dateFormatItem-yyQQQQ":"QQQQ 'de' yy","dateFormatItem-yQQQ":"QQQ yyyy","dateFormatItem-yMEd":"EEE d/M/yyyy","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["a.C.","d.C."],"dateFormatItem-MMMdd":"dd-MMM","dateFormat-long":"d 'de' MMMM 'de' yyyy" [...]
\ No newline at end of file
+({"timeFormat-medium":"H:mm:ss","timeFormat-full":"HH'H'mm''ss\" v","timeFormat-short":"H:mm","months-format-narrow":["E","F","M","A","M","J","J","A","S","O","N","D"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"día de la semana","dateFormatItem-yyQQQQ":"QQQQ 'de' yy","dateFormatItem-yQQQ":"QQQ yyyy","dateFormatItem-yMEd":"EEE d/M/yyyy","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["a.C.","d.C."],"dateFormatItem-MMMdd":"dd-MMM","dateFormat-long":"d 'de' MMMM 'de' y","m [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/es-es/number.js b/dojo/cldr/nls/es-es/number.js
index 70e001f..89cefe8 100644
--- a/dojo/cldr/nls/es-es/number.js
+++ b/dojo/cldr/nls/es-es/number.js
@@ -1 +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:]","currencySpacin [...]
\ No newline at end of file
+({"currencyFormat":"#,##0.00 ¤","group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingM [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/es/currency.js b/dojo/cldr/nls/es/currency.js
index 40b4661..9b1ef69 100644
--- a/dojo/cldr/nls/es/currency.js
+++ b/dojo/cldr/nls/es/currency.js
@@ -1 +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_symb [...]
\ No newline at end of file
+({"HKD_displayName":"dólar de Hong Kong","CHF_displayName":"franco suizo","CAD_displayName":"dólar canadiense","CNY_displayName":"yuan renminbi chino","AUD_displayName":"dólar australiano","JPY_displayName":"yen japonés","USD_displayName":"dólar estadounidense","GBP_displayName":"libra esterlina británica","EUR_displayName":"euro","CHF_symbol":"Fr.","JPY_symbol":"JP¥","HKD_symbol":"HK$","USD_symbol":"US$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/es/gregorian.js b/dojo/cldr/nls/es/gregorian.js
index 94de3ee..2a2a51f 100644
--- a/dojo/cldr/nls/es/gregorian.js
+++ b/dojo/cldr/nls/es/gregorian.js
@@ -1 +1 @@
-({"months-format-narrow":["E","F","M","A","M","J","J","A","S","O","N","D"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"día de la semana","dateFormatItem-yyQQQQ":"QQQQ 'de' yy","dateFormatItem-yQQQ":"QQQ yyyy","dateFormatItem-yMEd":"EEE d/M/yyyy","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["a.C.","d.C."],"dateFormatItem-MMMdd":"dd-MMM","dateFormat-long":"d 'de' MMMM 'de' yyyy","months-format-wide":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","se [...]
\ No newline at end of file
+({"months-format-narrow":["E","F","M","A","M","J","J","A","S","O","N","D"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"día de la semana","dateFormatItem-yyQQQQ":"QQQQ 'de' yy","dateFormatItem-yQQQ":"QQQ yyyy","dateFormatItem-yMEd":"EEE d/M/yyyy","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["a.C.","d.C."],"dateFormatItem-MMMdd":"dd-MMM","dateFormat-long":"d 'de' MMMM 'de' y","months-format-wide":["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septi [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/es/number.js b/dojo/cldr/nls/es/number.js
index d878fb3..be433d8 100644
--- a/dojo/cldr/nls/es/number.js
+++ b/dojo/cldr/nls/es/number.js
@@ -1 +1 @@
-({"decimalFormat":"#,##0.###","group":".","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤ #,##0.00","decimal":",","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacin [...]
\ No newline at end of file
+({"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤ #,##0.00","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingM [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/fi/currency.js b/dojo/cldr/nls/fi/currency.js
index 635098a..42cc7dc 100644
--- a/dojo/cldr/nls/fi/currency.js
+++ b/dojo/cldr/nls/fi/currency.js
@@ -1 +1 @@
-({"HKD_displayName":"Hongkongin dollari","CHF_displayName":"Sveitsin frangi","JPY_symbol":"¥","CAD_displayName":"Kanadan dollari","CNY_displayName":"Kiinan yuan","USD_symbol":"$","AUD_displayName":"Australian dollari","JPY_displayName":"Japanin jeni","USD_displayName":"Yhdysvaltain dollari","GBP_displayName":"Englannin punta","GBP_symbol":"£","EUR_displayName":"euro","EUR_symbol":"€"})
\ No newline at end of file
+({"HKD_displayName":"Hongkongin dollari","CHF_displayName":"Sveitsin frangi","CHF_symbol":"CHF","JPY_symbol":"¥","HKD_symbol":"HKD","CAD_displayName":"Kanadan dollari","CNY_displayName":"Kiinan yuan","USD_symbol":"$","AUD_displayName":"Australian dollari","JPY_displayName":"Japanin jeni","CAD_symbol":"CAD","USD_displayName":"Yhdysvaltain dollari","CNY_symbol":"CNY","GBP_displayName":"Englannin punta","AUD_symbol":"AUD","EUR_displayName":"euro","EUR_symbol":"€","GBP_symbol":"£"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/fi/gregorian.js b/dojo/cldr/nls/fi/gregorian.js
index 41a404e..b907a4f 100644
--- a/dojo/cldr/nls/fi/gregorian.js
+++ b/dojo/cldr/nls/fi/gregorian.js
@@ -1 +1 @@
-({"months-format-narrow":["T","H","M","H","T","K","H","E","S","L","M","J"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"viikonpäivä","dateFormatItem-yQQQ":"QQQ yyyy","dateFormatItem-yMEd":"EEE d.M.yyyy","dateFormatItem-MMMEd":"E d. MMM","eraNarrow":["eKr.","jKr."],"dateFormat-long":"d. MMMM yyyy","months-format-wide":["tammikuuta","helmikuuta","maaliskuuta","huhtikuuta","toukokuuta","kesäkuuta","heinäkuuta","elokuuta","syyskuuta","lokakuuta","marraskuuta","joulukuuta"] [...]
\ No newline at end of file
+({"months-format-narrow":["T","H","M","H","T","K","H","E","S","L","M","J"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"viikonpäivä","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE d.M.yyyy","dateFormatItem-MMMEd":"E d. MMM","eraNarrow":["eKr.","jKr."],"dateFormat-long":"d. MMMM y","months-format-wide":["tammikuuta","helmikuuta","maaliskuuta","huhtikuuta","toukokuuta","kesäkuuta","heinäkuuta","elokuuta","syyskuuta","lokakuuta","marraskuuta","joulukuuta"],"date [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/fr/currency.js b/dojo/cldr/nls/fr/currency.js
index cb3b689..3d3eabe 100644
--- a/dojo/cldr/nls/fr/currency.js
+++ b/dojo/cldr/nls/fr/currency.js
@@ -1 +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 renminbi chinois","USD_symbol":"$US","AUD_displayName":"dollar australien","JPY_displayName":"yen japonais","CAD_symbol":"$Ca","USD_displayName":"dollar des États-Unis","CNY_symbol":"Ұ","GBP_displayName":"livre sterling","GBP_symbol":"£UK","AUD_symbol":"$A","EUR_displayName":"euro","EUR_symbol":"€"})
\ No newline at end of file
+({"HKD_displayName":"dollar de Hong Kong","CHF_displayName":"franc suisse","CHF_symbol":"CHF","JPY_symbol":"¥JP","HKD_symbol":"$HK","CAD_displayName":"dollar canadien","CNY_displayName":"yuan renminbi chinois","USD_symbol":"$US","AUD_displayName":"dollar australien","JPY_displayName":"yen japonais","CAD_symbol":"$CA","USD_displayName":"dollar des États-Unis","CNY_symbol":"Ұ","GBP_displayName":"livre sterling","GBP_symbol":"£UK","AUD_symbol":"$AU","EUR_displayName":"euro","EUR_symbol":"€"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/fr/gregorian.js b/dojo/cldr/nls/fr/gregorian.js
index 2f9fcd3..ea97b97 100644
--- a/dojo/cldr/nls/fr/gregorian.js
+++ b/dojo/cldr/nls/fr/gregorian.js
@@ -1 +1 @@
-({"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"jour de la semaine","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"QQQ yyyy","dateFormatItem-yMEd":"EEE d/M/yyyy","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["av. J.-C.","ap. J.-C."],"dateFormatItem-MMMdd":"dd MMM","dateFormat-long":"d MMMM yyyy","months-format-wide":["janvier","février","mars","avril","mai","juin","juillet","août","septem [...]
\ No newline at end of file
+({"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"jour de la semaine","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"EEE d/M/yyyy","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["av. J.-C.","ap. J.-C."],"dateFormatItem-MMMdd":"dd MMM","dateFormat-long":"d MMMM y","months-format-wide":["janvier","février","mars","avril","mai","juin","juillet","août","septembre"," [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/gregorian.js b/dojo/cldr/nls/gregorian.js
index fa60244..d8beca5 100644
--- a/dojo/cldr/nls/gregorian.js
+++ b/dojo/cldr/nls/gregorian.js
@@ -1 +1 @@
-({"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Day of the Week","dateFormatItem-yQQQ":"yyyy QQQ","dateFormatItem-yMEd":"EEE, yyyy-M-d","dateFormatItem-MMMEd":"E MMM d","eraNarrow":["BCE","CE"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"yyyy MMMM d","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateFormat-full":"EEEE, yyyy MMMM dd","dateFor [...]
\ No newline at end of file
+({"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Day of the Week","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, y-M-d","dateFormatItem-MMMEd":"E MMM d","eraNarrow":["BCE","CE"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"y MMMM d","months-format-wide":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd": [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/he/currency.js b/dojo/cldr/nls/he/currency.js
index 93a19fa..85d7c6c 100644
--- a/dojo/cldr/nls/he/currency.js
+++ b/dojo/cldr/nls/he/currency.js
@@ -1 +1 @@
-({"EUR_displayName":"אירו","CHF_displayName":"פרנק שוויצרי","HKD_displayName":"דולר הונג קונגי","CAD_displayName":"דולר קנדי","GBP_displayName":"לירה שטרלינג","JPY_displayName":"ין יפני","AUD_displayName":"דולר אוסטרלי","USD_displayName":"דולר אמריקאי","USD_symbol":"US$","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€"})
\ No newline at end of file
+({"HKD_displayName":"דולר הונג קונגי","CHF_displayName":"פרנק שוויצרי","CAD_displayName":"דולר קנדי","CNY_displayName":"יואן רנמינבי סיני","AUD_displayName":"דולר אוסטרלי","JPY_displayName":"ין יפני","USD_displayName":"דולר אמריקאי","GBP_displayName":"לירה שטרלינג","EUR_displayName":"אירו","CHF_symbol":"Fr.","JPY_symbol":"JP¥","HKD_symbol":"HK$","USD_symbol":"US$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/he/gregorian.js b/dojo/cldr/nls/he/gregorian.js
index ccd13f1..af48452 100644
--- a/dojo/cldr/nls/he/gregorian.js
+++ b/dojo/cldr/nls/he/gregorian.js
@@ -1 +1 @@
-({"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"יום בשבוע","dateFormatItem-yQQQ":"yyyy QQQ","dateFormatItem-yMEd":"EEE, yyyy-M-d","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["לפנה״ס","לסה״נ"],"dateFormat-long":"d MMMM yyyy","months-format-wide":["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],"dateFormat-full":"EEEE d MMMM yyyy","dateFormatItem-Md":"d/M","field-era":"תקופה","dateFormatItem-yM":"yyyy-M","months-standAlon [...]
\ No newline at end of file
+({"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"יום בשבוע","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, d.M.yyyy","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["לפנה״ס","לסה״נ"],"dateFormat-long":"d בMMMM y","months-format-wide":["ינואר","פברואר","מרס","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],"dateTimeFormat-medium":"{1} {0}","dateFormat-full":"EEEE, d בMMMM y","dateFormatItem-Md":"d/M","field-era":"תקופה","dateFormatItem-yM [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/he/hebrew.js b/dojo/cldr/nls/he/hebrew.js
index 158669a..570b58e 100644
--- a/dojo/cldr/nls/he/hebrew.js
+++ b/dojo/cldr/nls/he/hebrew.js
@@ -1 +1 @@
-({"eraAbbr":["לבה\"ע"],"patternChars":"GanjkHmsSEDFwWxhKzAeugXZvcL","months-format-wide":["תשרי","חשון","כסלו","טבת","שבט","אדר ראשון","אדר שני","ניסן","אייר","סיון","תמוז","אב","אלול"],"am":"לפנה\"צ","pm":"אחה\"צ","months-standAlone-abbr at localeAlias106":{"bundle":"hebrew","target":"months-format-wide"},"months-format-abbr at localeAlias103":{"bundle":"hebrew","target":"months-format-wide"},"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12","13"],"quarters-standAlone [...]
\ No newline at end of file
+({"quarters-format-abbr":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"dateFormat-medium":"dd/MM/yyyy","dateFormatItem-MMMEd":"E d MMM","dateFormatItem-yMEd":"EEE, d.M.yyyy","eraNarrow":["לבה\"ע"],"months-format-narrow":["תשרי","חשון","כסלו","טבת","שבט","אדר א'","אדר","ניסן","אייר","סיון","תמוז","אב","אלול"],"pm":"אחה\"צ","dateFormatItem-Md":"d/M","months-standAlone-narrow":["תשרי","חשון","כסלו","טבת","שבט","אדר א'","אדר","ניסן","אייר","סיון","תמוז","אב","אלול"],"months-standAlone-wide":["ת [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/he/islamic.js b/dojo/cldr/nls/he/islamic.js
new file mode 100644
index 0000000..0e5de97
--- /dev/null
+++ b/dojo/cldr/nls/he/islamic.js
@@ -0,0 +1 @@
+({"quarters-format-abbr":["רבעון 1","רבעון 2","רבעון 3","רבעון 4"],"dateFormat-medium":"dd/MM/yyyy","dateFormatItem-MMMEd":"E d MMM","dateFormatItem-yMEd":"EEE, d.M.yyyy","eraNarrow":["שנת היג׳רה"],"dateFormatItem-Md":"d/M","months-standAlone-wide":["מוחרם","ספר","רביע אל-אוואל","רביע אל-תני","ג׳ומדה אל-אוואל","ג׳ומדה אל-תני","רג׳אב","שעבאן","ראמדן","שוואל","זו אל-QI'DAH","זו אל-חיג׳ה"],"eraNames":["שנת היג׳רה"],"days-standAlone-narrow":["א","ב","ג","ד","ה","ו","ש"],"dateFormatItem-MMMMd [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/hebrew.js b/dojo/cldr/nls/hebrew.js
index da9132c..dbcf40a 100644
--- a/dojo/cldr/nls/hebrew.js
+++ b/dojo/cldr/nls/hebrew.js
@@ -1 +1 @@
-({"months-standAlone-abbr at localeAlias106":{"bundle":"hebrew","target":"months-format-wide"},"months-format-abbr at localeAlias103":{"bundle":"hebrew","target":"months-format-wide"},"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12","13"],"quarters-standAlone-narrow":["1","2","3","4"],"dateFormatItem-yQQQ":"yyyy QQQ","quarters at localeAlias114":{"bundle":"gregorian","target":"quarters"},"dateFormatItem-yMEd":"EEE, yyyy-M-d","dateFormatItem-MMMEd":"E MMM d","eraNarrow":[ [...]
\ No newline at end of file
+({"dateFormatItem-yM":"y-M","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateFormatItem-yQ":"y Q","eraNames":["AM"],"dateFormatItem-MMMEd":"E MMM d","dateTimeFormat-full":"{1} {0}","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-yQQQ":"y QQQ","days-standAlone-wide":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12","13"],"dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormat-short":"{1} {0 [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/hu/currency.js b/dojo/cldr/nls/hu/currency.js
index e979d4b..0d768b2 100644
--- a/dojo/cldr/nls/hu/currency.js
+++ b/dojo/cldr/nls/hu/currency.js
@@ -1 +1 @@
-({"HKD_displayName":"Hongkongi dollár","CHF_displayName":"Svájci frank","CHF_symbol":"SwF","HKD_symbol":"HK$","CAD_displayName":"Kanadai dollár","CNY_displayName":"Kínai jüan renminbi","USD_symbol":"USD","AUD_displayName":"Ausztrál dollár","JPY_displayName":"Japán jen","CAD_symbol":"Can$","USD_displayName":"USA dollár","CNY_symbol":"Y","GBP_displayName":"Brit font sterling","AUD_symbol":"$A","EUR_displayName":"Euro","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€"})
\ No newline at end of file
+({"HKD_displayName":"Hongkongi dollár","CHF_displayName":"Svájci frank","JPY_symbol":"¥","CAD_displayName":"Kanadai dollár","CNY_displayName":"Kínai jüan renminbi","USD_symbol":"$","AUD_displayName":"Ausztrál dollár","JPY_displayName":"Japán jen","USD_displayName":"USA dollár","GBP_displayName":"Brit font sterling","EUR_displayName":"Euro","CHF_symbol":"Fr.","HKD_symbol":"HK$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/hu/gregorian.js b/dojo/cldr/nls/hu/gregorian.js
index 0897bb8..90e8cb4 100644
--- a/dojo/cldr/nls/hu/gregorian.js
+++ b/dojo/cldr/nls/hu/gregorian.js
@@ -1 +1 @@
-({"field-dayperiod":"napszak","field-minute":"perc","eraNames":["időszámításunk előtt","időszámításunk szerint"],"field-weekday":"hét napja","dateFormatItem-MMdd":"MM.dd.","days-standAlone-wide":["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],"dateFormatItem-MMM":"LLL","patternChars":"GanjkHmsSEDFwWxhKzAeugXZvcL","months-standAlone-narrow":["J","F","M","Á","M","J","J","A","S","O","N","D"],"field-era":"éra","field-hour":"óra","quarters-standAlone-abbr":["N1","N2","N3", [...]
\ No newline at end of file
+({"field-dayperiod":"napszak","field-minute":"perc","eraNames":["időszámításunk előtt","időszámításunk szerint"],"field-weekday":"hét napja","dateFormatItem-MMdd":"MM.dd.","days-standAlone-wide":["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["J","F","M","Á","M","J","J","A","S","O","N","D"],"field-era":"éra","field-hour":"óra","quarters-standAlone-abbr":["N1","N2","N3","N4"],"timeFormat-full":"H:mm:ss zzzz","month [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/islamic-civil.js b/dojo/cldr/nls/islamic-civil.js
index e0373ec..6f9d07d 100644
--- a/dojo/cldr/nls/islamic-civil.js
+++ b/dojo/cldr/nls/islamic-civil.js
@@ -1 +1 @@
-({"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"dateFormatItem-yQQQ":"yyyy QQQ","dateFormatItem-yMEd":"EEE, yyyy-M-d","dateFormatItem-MMMEd":"E MMM d","eraNarrow":["AH"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","months-standAlone-abbr at localeAlias172":{"bundle":"islamic","target":"months-format-abbr"},"months-standAlone-abbr at localeAlias173":{"bundle":"islamic","target":"months-format-wide"},"dateFormat [...]
\ No newline at end of file
+({"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"*@localeAlias195":{"bundle":"islamic","target":"*"},"dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, y-M-d","dateFormatItem-MMMEd":"E MMM d","eraNarrow":["AH"],"eraNames at localeAlias213":{"bundle":"islamic","target":"eraAbbr"},"dateFormat at localeAlias215":{"bundle":"gregorian","target":"dateFormat"},"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFo [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/islamic.js b/dojo/cldr/nls/islamic.js
index b350e09..5fc0dd7 100644
--- a/dojo/cldr/nls/islamic.js
+++ b/dojo/cldr/nls/islamic.js
@@ -1 +1 @@
-({"months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"quarters-standAlone-narrow":["1","2","3","4"],"dateFormatItem-yQQQ":"yyyy QQQ","dateFormatItem-yMEd":"EEE, yyyy-M-d","dateFormatItem-MMMEd":"E MMM d","eraNarrow":["AH"],"dateTimeFormats-appendItem-Day-Of-Week":"{0} {1}","dateFormat-long":"yyyy MMMM d","months-format-wide":["Muharram","Safar","Rabiʻ I","Rabiʻ II","Jumada I","Jumada II","Rajab","Shaʻban","Ramadan","Shawwal","Dhuʻl-Qiʻdah","Dhuʻl-Hijjah"],"days-s [...]
\ No newline at end of file
+({"dateFormatItem-yM":"y-M","dateTimeFormats-appendItem-Second":"{0} ({2}: {1})","dateFormatItem-yQ":"y Q","eraNames":["AH"],"dateFormatItem-MMMEd":"E MMM d","dateTimeFormat-full":"{1} {0}","dateFormatItem-hms":"h:mm:ss a","dateFormatItem-yQQQ":"y QQQ","days-standAlone-wide":["1","2","3","4","5","6","7"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"dateTimeFormats-appendItem-Year":"{0} {1}","dateTimeFormat-short":"{1} {0}","d [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/it-it/gregorian.js b/dojo/cldr/nls/it-it/gregorian.js
index 6666338..c59394e 100644
--- a/dojo/cldr/nls/it-it/gregorian.js
+++ b/dojo/cldr/nls/it-it/gregorian.js
@@ -1 +1 @@
-({"timeFormat-long":"H:mm:ss z","dateFormatItem-yM":"M/yyyy","field-dayperiod":"periodo del giorno","dateFormatItem-yQ":"Q-yyyy","field-minute":"minuto","eraNames":["a.C.","d.C"],"dateFormatItem-MMMEd":"EEE d MMM","field-weekday":"giorno della settimana","dateFormatItem-yQQQ":"QQQ yyyy","dateFormatItem-MMdd":"dd/MM","days-standAlone-wide":["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["G","F","M","A","M","G" [...]
\ No newline at end of file
+({"timeFormat-long":"H:mm:ss z","dateFormatItem-yM":"M/yyyy","field-dayperiod":"periodo del giorno","dateFormatItem-yQ":"Q-yyyy","field-minute":"minuto","eraNames":["a.C.","d.C"],"dateFormatItem-MMMEd":"EEE d MMM","field-weekday":"giorno della settimana","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-MMdd":"dd/MM","days-standAlone-wide":["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["G","F","M","A","M","G","L [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/it/currency.js b/dojo/cldr/nls/it/currency.js
index 375ec67..3bde233 100644
--- a/dojo/cldr/nls/it/currency.js
+++ b/dojo/cldr/nls/it/currency.js
@@ -1 +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
+({"HKD_displayName":"Dollaro di Hong Kong","CHF_displayName":"Franco Svizzero","CAD_displayName":"Dollaro Canadese","CNY_displayName":"Renmimbi Cinese","AUD_displayName":"Dollaro Australiano","JPY_displayName":"Yen Giapponese","USD_displayName":"Dollaro Statunitense","GBP_displayName":"Sterlina Inglese","EUR_displayName":"Euro","CHF_symbol":"Fr.","JPY_symbol":"JP¥","HKD_symbol":"HK$","USD_symbol":"US$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/it/gregorian.js b/dojo/cldr/nls/it/gregorian.js
index 8a6289e..73f655e 100644
--- a/dojo/cldr/nls/it/gregorian.js
+++ b/dojo/cldr/nls/it/gregorian.js
@@ -1 +1 @@
-({"dateFormatItem-yM":"M/yyyy","field-dayperiod":"periodo del giorno","dateFormatItem-yQ":"Q-yyyy","field-minute":"minuto","eraNames":["a.C.","d.C"],"dateFormatItem-MMMEd":"EEE d MMM","field-weekday":"giorno della settimana","dateFormatItem-yQQQ":"QQQ yyyy","dateFormatItem-MMdd":"dd/MM","days-standAlone-wide":["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["G","F","M","A","M","G","L","A","S","O","N","D"],"fie [...]
\ No newline at end of file
+({"dateFormatItem-yM":"M/yyyy","field-dayperiod":"periodo del giorno","dateFormatItem-yQ":"Q-yyyy","field-minute":"minuto","eraNames":["a.C.","d.C"],"dateFormatItem-MMMEd":"EEE d MMM","field-weekday":"giorno della settimana","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-MMdd":"dd/MM","days-standAlone-wide":["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["G","F","M","A","M","G","L","A","S","O","N","D"],"field- [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/ja/currency.js b/dojo/cldr/nls/ja/currency.js
index 76cd3d9..e408a6c 100644
--- a/dojo/cldr/nls/ja/currency.js
+++ b/dojo/cldr/nls/ja/currency.js
@@ -1 +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
+({"HKD_displayName":"香港ドル","CHF_displayName":"スイス フラン","JPY_symbol":"¥","CAD_displayName":"カナダ ドル","CNY_displayName":"中国人民元","USD_symbol":"$","AUD_displayName":"オーストラリア ドル","JPY_displayName":"日本円","USD_displayName":"米ドル","CNY_symbol":"元","GBP_displayName":"英国ポンド","EUR_displayName":"ユーロ","CHF_symbol":"Fr.","HKD_symbol":"HK$","CAD_symbol":"CA$","EUR_symbol":"€","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/ja/gregorian.js b/dojo/cldr/nls/ja/gregorian.js
index 1322b2b..47d9ab7 100644
--- a/dojo/cldr/nls/ja/gregorian.js
+++ b/dojo/cldr/nls/ja/gregorian.js
@@ -1 +1 @@
-({"dateFormatItem-yM":"y/M","field-dayperiod":"午前/午後","dateFormatItem-yQ":"y/Q","dateFormatItem-GGGGyMd":"GGGGy年M月d日","field-minute":"分","eraNames":["紀元前","西暦"],"dateFormatItem-MMMEd":"M月d日(E)","field-weekday":"曜日","dateFormatItem-yQQQ":"yyyyQQQ","dateFormatItem-MMdd":"MM/dd","days-standAlone-wide":["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],"dateFormatItem-MMM":"LLL","patternChars":"GanjkHmsSEDFwWxhKzAeugXZvcL","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","1 [...]
\ No newline at end of file
+({"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"曜日","dateFormatItem-yQQQ":"yQQQ","dateFormatItem-yMEd":"y/M/d(EEE)","dateFormatItem-MMMEd":"M月d日(E)","eraNarrow":["紀元前","西暦"],"dateFormat-long":"y年M月d日","months-format-wide":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateTimeFormat-medium":"{1} {0}","dateFormat-full":"y年M月d日EEEE","dateFormatItem-Md":"M/d","dateFormatItem-yMd":"y/M/d","field-era":"時代","dateFormatItem-yM":"y/M","months-standAlone-wide" [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/ko-kr/gregorian.js b/dojo/cldr/nls/ko-kr/gregorian.js
index 9a375b3..efd1ca9 100644
--- a/dojo/cldr/nls/ko-kr/gregorian.js
+++ b/dojo/cldr/nls/ko-kr/gregorian.js
@@ -1 +1 @@
-({"timeFormat-medium":"a h:mm:ss","timeFormat-short":"a h:mm","months-format-narrow":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"요일","dateFormatItem-yQQQ":"yyyy년 QQQ","dateFormatItem-yMEd":"yyyy. M. d. EEE","dateFormatItem-MMMEd":"MMM d일 (E)","eraNarrow":["기원전","서기"],"dateFormat-long":"yyyy년 M월 d일","months-format-wide":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"dateFormat-full":"yy [...]
\ No newline at end of file
+({"timeFormat-medium":"a h:mm:ss","timeFormat-short":"a h:mm","months-format-narrow":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"요일","dateFormatItem-yQQQ":"y년 QQQ","dateFormatItem-yMEd":"yyyy. M. d. EEE","dateFormatItem-MMMEd":"MMM d일 (E)","eraNarrow":["기원전","서기"],"dateFormat-long":"y년 M월 d일","months-format-wide":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"dateTimeFormat-medium":"{1 [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/ko/currency.js b/dojo/cldr/nls/ko/currency.js
index bea8d9d..60a7d03 100644
--- a/dojo/cldr/nls/ko/currency.js
+++ b/dojo/cldr/nls/ko/currency.js
@@ -1 +1 @@
-({"HKD_displayName":"홍콩 달러","CHF_displayName":"스위스 프랑","JPY_symbol":"¥","HKD_symbol":"HK$","CAD_displayName":"캐나다 달러","CNY_displayName":"중국 위안 인민폐","AUD_displayName":"호주 달러","JPY_displayName":"일본 엔","CAD_symbol":"Can$","USD_displayName":"미국 달러","CNY_symbol":"¥","GBP_displayName":"영국령 파운드 스털링","AUD_symbol":"A$","EUR_displayName":"유로화","USD_symbol":"US$","GBP_symbol":"UK£","EUR_symbol":"€"})
\ No newline at end of file
+({"HKD_displayName":"홍콩 달러","CHF_displayName":"스위스 프랑","CAD_displayName":"캐나다 달러","CNY_displayName":"중국 위안 인민폐","AUD_displayName":"호주 달러","JPY_displayName":"일본 엔화","USD_displayName":"미국 달러","GBP_displayName":"영국령 파운드 스털링","EUR_displayName":"유로화","CHF_symbol":"Fr.","JPY_symbol":"JP¥","HKD_symbol":"HK$","USD_symbol":"US$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/ko/gregorian.js b/dojo/cldr/nls/ko/gregorian.js
index bb049e6..e5581ef 100644
--- a/dojo/cldr/nls/ko/gregorian.js
+++ b/dojo/cldr/nls/ko/gregorian.js
@@ -1 +1 @@
-({"months-format-narrow":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"요일","dateFormatItem-yQQQ":"yyyy년 QQQ","dateFormatItem-yMEd":"yyyy. M. d. EEE","dateFormatItem-MMMEd":"MMM d일 (E)","eraNarrow":["기원전","서기"],"dateFormat-long":"yyyy년 M월 d일","months-format-wide":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"dateFormat-full":"yyyy년 M월 d일 EEEE","dateFormatItem-Md":"M. d.","field-era":"연호" [...]
\ No newline at end of file
+({"months-format-narrow":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"요일","dateFormatItem-yQQQ":"y년 QQQ","dateFormatItem-yMEd":"yyyy. M. d. EEE","dateFormatItem-MMMEd":"MMM d일 (E)","eraNarrow":["기원전","서기"],"dateFormat-long":"y년 M월 d일","months-format-wide":["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],"dateTimeFormat-medium":"{1} {0}","dateFormatItem-EEEd":"d일 EEE","dateFormat-full":"y년  [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/nb/currency.js b/dojo/cldr/nls/nb/currency.js
index 0be3327..88fcff8 100644
--- a/dojo/cldr/nls/nb/currency.js
+++ b/dojo/cldr/nls/nb/currency.js
@@ -1 +1 @@
-({"HKD_displayName":"Hongkong-dollar","CHF_displayName":"sveitsiske franc","JPY_symbol":"JPY","CAD_displayName":"kanadiske dollar","CNY_displayName":"kinesiske yuan renminbi","USD_symbol":"USD","AUD_displayName":"australske dollar","JPY_displayName":"japanske yen","USD_displayName":"amerikanske dollar","EUR_symbol":"EUR","GBP_displayName":"britiske pund sterling","GBP_symbol":"GBP","EUR_displayName":"euro"})
\ No newline at end of file
+({"HKD_displayName":"Hongkong-dollar","CHF_displayName":"sveitsiske franc","CHF_symbol":"CHF","JPY_symbol":"JPY","CAD_displayName":"kanadiske dollar","CNY_displayName":"kinesiske yuan renminbi","USD_symbol":"USD","AUD_displayName":"australske dollar","JPY_displayName":"japanske yen","CAD_symbol":"CAD","USD_displayName":"amerikanske dollar","EUR_symbol":"EUR","CNY_symbol":"CNY","GBP_displayName":"britiske pund sterling","GBP_symbol":"GBP","AUD_symbol":"AUD","EUR_displayName":"euro","HKD_s [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/nb/gregorian.js b/dojo/cldr/nls/nb/gregorian.js
index 3cec677..db0857b 100644
--- a/dojo/cldr/nls/nb/gregorian.js
+++ b/dojo/cldr/nls/nb/gregorian.js
@@ -1 +1 @@
-({"dateFormatItem-yM":"M yyyy","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q yyyy","field-minute":"minutt","eraNames":["f.Kr.","e.Kr."],"dateFormatItem-MMMEd":"E d. MMM","field-weekday":"ukedag","dateFormatItem-yQQQ":"QQQ yyyy","dateFormatItem-MMdd":"dd.MM","days-standAlone-wide":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-era":"tidsalder","field-hour": [...]
\ No newline at end of file
+({"dateFormatItem-yM":"M yyyy","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q yyyy","field-minute":"minutt","eraNames":["f.Kr.","e.Kr."],"dateFormatItem-MMMEd":"E d. MMM","field-weekday":"ukedag","dateFormatItem-hms":"h.mm.ss a","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-MMdd":"dd.MM","days-standAlone-wide":["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field- [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/nl/currency.js b/dojo/cldr/nls/nl/currency.js
index 940d0a2..67d39ea 100644
--- a/dojo/cldr/nls/nl/currency.js
+++ b/dojo/cldr/nls/nl/currency.js
@@ -1 +1 @@
-({"HKD_displayName":"Hongkongse dollar","CHF_displayName":"Zwitserse franc","CHF_symbol":"SwF","HKD_symbol":"HK$","CAD_displayName":"Canadese dollar","CNY_displayName":"Chinese yuan renminbi","USD_symbol":"USD","AUD_displayName":"Australische dollar","JPY_displayName":"Japanse yen","CAD_symbol":"Can$","USD_displayName":"Amerikaanse dollar","CNY_symbol":"Y","GBP_displayName":"Brits pond sterling","GBP_symbol":"GBP","AUD_symbol":"$A","EUR_displayName":"euro","JPY_symbol":"JP¥","EUR_symbol":"€"})
\ No newline at end of file
+({"HKD_displayName":"Hongkongse dollar","CHF_displayName":"Zwitserse franc","CAD_displayName":"Canadese dollar","CNY_displayName":"Chinese yuan renminbi","AUD_displayName":"Australische dollar","JPY_displayName":"Japanse yen","USD_displayName":"Amerikaanse dollar","GBP_displayName":"Brits pond sterling","EUR_displayName":"Euro","CHF_symbol":"Fr.","JPY_symbol":"JP¥","HKD_symbol":"HK$","USD_symbol":"US$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/nl/gregorian.js b/dojo/cldr/nls/nl/gregorian.js
index 29ffd04..0e2d1dc 100644
--- a/dojo/cldr/nls/nl/gregorian.js
+++ b/dojo/cldr/nls/nl/gregorian.js
@@ -1 +1 @@
-({"dateFormatItem-yM":"M-yyyy","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q yyyy","field-minute":"Minuut","eraNames":["Voor Christus","Anno Domini"],"dateFormatItem-MMMEd":"E d MMM","field-weekday":"Dag van de week","dateFormatItem-yQQQ":"QQQ yyyy","dateFormatItem-MMdd":"dd-MM","days-standAlone-wide":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field- [...]
\ No newline at end of file
+({"dateFormatItem-yM":"M-yyyy","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q yyyy","field-minute":"Minuut","eraNames":["Voor Christus","Anno Domini"],"dateFormatItem-MMMEd":"E d MMM","field-weekday":"Dag van de week","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-MMdd":"dd-MM","days-standAlone-wide":["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"field-era [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/pl/currency.js b/dojo/cldr/nls/pl/currency.js
index f7356a7..6f0493c 100644
--- a/dojo/cldr/nls/pl/currency.js
+++ b/dojo/cldr/nls/pl/currency.js
@@ -1 +1 @@
-({"HKD_displayName":"dolar hongkoński","CHF_displayName":"frank szwajcarski","CHF_symbol":"SwF","JPY_symbol":"¥","HKD_symbol":"HK$","CAD_displayName":"dolar kanadyjski","CNY_displayName":"juan renminbi","USD_symbol":"$","AUD_displayName":"dolar australijski","JPY_displayName":"jen japoński","CAD_symbol":"Can$","USD_displayName":"dolar amerykański ","CNY_symbol":"Y","GBP_displayName":"funt szterling","GBP_symbol":"£","AUD_symbol":"$A","EUR_displayName":"euro","EUR_symbol":"€"})
\ No newline at end of file
+({"HKD_displayName":"dolar hongkoński","CHF_displayName":"frank szwajcarski","CAD_displayName":"dolar kanadyjski","CNY_displayName":"juan renminbi","AUD_displayName":"dolar australijski","JPY_displayName":"jen japoński","USD_displayName":"dolar amerykański ","GBP_displayName":"funt szterling","EUR_displayName":"euro","CHF_symbol":"Fr.","JPY_symbol":"JP¥","HKD_symbol":"HK$","USD_symbol":"US$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/pl/gregorian.js b/dojo/cldr/nls/pl/gregorian.js
index 9cfd94c..b4e3dd3 100644
--- a/dojo/cldr/nls/pl/gregorian.js
+++ b/dojo/cldr/nls/pl/gregorian.js
@@ -1 +1 @@
-({"dateFormatItem-yM":"yyyy-M","field-dayperiod":"Dayperiod","dateFormatItem-yQ":"yyyy Q","field-minute":"Minuta","eraNames":["p.n.e.","n.e."],"dateFormatItem-MMMEd":"d MMM E","field-weekday":"Dzień tygodnia","dateFormatItem-yQQQ":"yyyy QQQ","dateFormatItem-MMdd":"MM-dd","days-standAlone-wide":["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["s","l","m","k","m","c","l","s","w","p","l","g"],"field-era":"Era", [...]
\ No newline at end of file
+({"dateFormatItem-yM":"yyyy-M","field-dayperiod":"Dayperiod","dateFormatItem-yQ":"yyyy Q","field-minute":"Minuta","eraNames":["p.n.e.","n.e."],"dateFormatItem-MMMEd":"d MMM E","field-weekday":"Dzień tygodnia","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-MMdd":"MM-dd","days-standAlone-wide":["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["s","l","m","k","m","c","l","s","w","p","l","g"],"field-era":"Era","fi [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/pt-br/gregorian.js b/dojo/cldr/nls/pt-br/gregorian.js
index 88b8cb0..4144e28 100644
--- a/dojo/cldr/nls/pt-br/gregorian.js
+++ b/dojo/cldr/nls/pt-br/gregorian.js
@@ -1 +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","months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"quarters-standAlone-narrow":["1","2","3", [...]
\ No newline at end of file
+({"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","months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"quarters-standAlone-narrow":["1","2","3", [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/pt-pt/gregorian.js b/dojo/cldr/nls/pt-pt/gregorian.js
index f308b11..c4e4556 100644
--- a/dojo/cldr/nls/pt-pt/gregorian.js
+++ b/dojo/cldr/nls/pt-pt/gregorian.js
@@ -1 +1 @@
-({"quarters-standAlone-wide":["1.º trimestre","2.º trimestre","3.º trimestre","4.º trimestre"],"quarters-format-abbr":["1.º trimestre","2.º trimestre","3.º trimestre","4.º trimestre"],"dateFormat-medium":"yyyy/MM/dd","dateFormatItem-MMMEd":"E d MMM","quarters-standAlone-abbr":["1.º trimestre","2.º trimestre","3.º trimestre","4.º trimestre"],"pm":"Depois do meio-dia","timeFormat-full":"HH'H'mm'm'ss's' v","dateFormatItem-Md":"d-M","months-standAlone-wide":["Janeiro","Fevereiro","Março","Ab [...]
\ No newline at end of file
+({"dateFormatItem-yyQ":"QQQ 'de' yy","quarters-standAlone-wide":["1.º trimestre","2.º trimestre","3.º trimestre","4.º trimestre"],"quarters-format-abbr":["1.º trimestre","2.º trimestre","3.º trimestre","4.º trimestre"],"months-standAlone-abbr":["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],"dateFormat-medium":"d 'de' MMM 'de' yyyy","am":"Antes do meio-dia","months-format-abbr":["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],"dateFormat [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/pt/currency.js b/dojo/cldr/nls/pt/currency.js
index 7643be6..41baedf 100644
--- a/dojo/cldr/nls/pt/currency.js
+++ b/dojo/cldr/nls/pt/currency.js
@@ -1 +1 @@
-({"HKD_displayName":"Dólar de Hong Kong","CHF_displayName":"Franco suíço","CHF_symbol":"SwF","JPY_symbol":"¥","HKD_symbol":"HK$","CAD_displayName":"Dólar canadense","CNY_displayName":"Yuan Renminbi chinês","AUD_displayName":"Dólar australiano","JPY_displayName":"Iene japonês","CAD_symbol":"Can$","USD_displayName":"Dólar norte-americano","CNY_symbol":"Y","GBP_displayName":"Libra esterlina britânica","GBP_symbol":"£","AUD_symbol":"$A","EUR_displayName":"Euro","USD_symbol":"US$","EUR_symbol":"€"})
\ No newline at end of file
+({"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","CHF_symbol":"Fr.","JPY_symbol":"JP¥","HKD_symbol":"HK$","USD_symbol":"US$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symb [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/pt/gregorian.js b/dojo/cldr/nls/pt/gregorian.js
index 14276f1..2d90f8b 100644
--- a/dojo/cldr/nls/pt/gregorian.js
+++ b/dojo/cldr/nls/pt/gregorian.js
@@ -1 +1 @@
-({"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Dia da semana","dateFormatItem-yQQQ":"yyyy QQQ","dateFormatItem-yMEd":"EEE, dd/MM/yyyy","dateFormatItem-MMMEd":"EEE, d MMM","eraNarrow":["a.C.","d.C."],"dateFormat-long":"d 'de' MMMM 'de' yyyy","months-format-wide":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"dateFormat-full":"EEEE [...]
\ No newline at end of file
+({"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Dia da semana","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, dd/MM/yyyy","dateFormatItem-MMMEd":"EEE, d 'de' MMM","eraNarrow":["a.C.","d.C."],"dateFormat-long":"d 'de' MMMM 'de' y","months-format-wide":["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],"dateTimeFormat-medium": [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/ru/currency.js b/dojo/cldr/nls/ru/currency.js
index 890bb19..72cf7f0 100644
--- a/dojo/cldr/nls/ru/currency.js
+++ b/dojo/cldr/nls/ru/currency.js
@@ -1 +1 @@
-({"HKD_displayName":"Гонконгский доллар","CHF_displayName":"Швейцарский франк","CHF_symbol":"SwF","JPY_symbol":"¥","HKD_symbol":"HK$","CAD_displayName":"Канадский доллар","CNY_displayName":"Юань Ренминби","USD_symbol":"$","AUD_displayName":"Австралийский доллар","JPY_displayName":"Японская иена","CAD_symbol":"Can$","USD_displayName":"Доллар США","CNY_symbol":"Y","GBP_displayName":"Английский фунт стерлингов","GBP_symbol":"£","AUD_symbol":"$A","EUR_displayName":"Евро","EUR_symbol":"€"})
\ No newline at end of file
+({"HKD_displayName":"Гонконгский доллар","CHF_displayName":"Швейцарский франк","CAD_displayName":"Канадский доллар","CNY_displayName":"Юань Ренминби","USD_symbol":"$","AUD_displayName":"Австралийский доллар","JPY_displayName":"Японская иена","USD_displayName":"Доллар США","GBP_displayName":"Английский фунт стерлингов","EUR_displayName":"Евро","CHF_symbol":"Fr.","JPY_symbol":"JP¥","HKD_symbol":"HK$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/ru/gregorian.js b/dojo/cldr/nls/ru/gregorian.js
index 3725286..7643715 100644
--- a/dojo/cldr/nls/ru/gregorian.js
+++ b/dojo/cldr/nls/ru/gregorian.js
@@ -1 +1 @@
-({"months-format-narrow":["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"День недели","dateFormatItem-yQQQ":"yyyy QQQ","dateFormatItem-yMEd":"EEE, yyyy-M-d","dateFormatItem-yyyyLLLL":"LLLL yyyy","dateFormatItem-MMMEd":"E MMM d","eraNarrow":["до н.э.","н.э."],"dateFormat-long":"d MMMM yyyy 'г'.","months-format-wide":["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"]," [...]
\ No newline at end of file
+({"months-format-narrow":["Я","Ф","М","А","М","И","И","А","С","О","Н","Д"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"День недели","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, yyyy-M-d","dateFormatItem-yyyyLLLL":"LLLL y","dateFormatItem-MMMEd":"E MMM d","eraNarrow":["до н.э.","н.э."],"dateFormat-long":"d MMMM y 'г'.","months-format-wide":["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря"],"dateForma [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/sk/currency.js b/dojo/cldr/nls/sk/currency.js
index c7583ac..3dec918 100644
--- a/dojo/cldr/nls/sk/currency.js
+++ b/dojo/cldr/nls/sk/currency.js
@@ -1 +1 @@
-({"HKD_displayName":"Hong Kongský dolár","CHF_displayName":"Švajčiarský frank","CHF_symbol":"SwF","HKD_symbol":"HK$","CAD_displayName":"Kanadský dolár","CNY_displayName":"Čínsky Yuan Renminbi","AUD_displayName":"Austrálsky dolár","JPY_displayName":"Japonský yen","CAD_symbol":"Can$","USD_displayName":"US dolár","CNY_symbol":"Y","GBP_displayName":"Britská libra","AUD_symbol":"$A","EUR_displayName":"Euro","USD_symbol":"US$","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€"})
\ No newline at end of file
+({"HKD_displayName":"Hong Kongský dolár","CHF_displayName":"Švajčiarský frank","CAD_displayName":"Kanadský dolár","CNY_displayName":"Čínsky Yuan Renminbi","AUD_displayName":"Austrálsky dolár","JPY_displayName":"Japonský yen","USD_displayName":"US dolár","GBP_displayName":"Britská libra","EUR_displayName":"Euro","CHF_symbol":"Fr.","JPY_symbol":"JP¥","HKD_symbol":"HK$","USD_symbol":"US$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/sk/gregorian.js b/dojo/cldr/nls/sk/gregorian.js
index 701ab3d..4a8a5da 100644
--- a/dojo/cldr/nls/sk/gregorian.js
+++ b/dojo/cldr/nls/sk/gregorian.js
@@ -1 +1 @@
-({"field-minute":"minúta","eraNames":["pred n.l.","n.l."],"field-weekday":"deň v týždni","days-standAlone-wide":["Nedeľa","Pondelok","Utorok","Streda","Štvrtok","Piatok","Sobota"],"patternChars":"GanjkHmsSEDFwWxhKzAeugXZvcL","months-standAlone-narrow":["j","f","m","a","m","j","j","a","s","o","n","d"],"field-era":"éra","field-hour":"hodina","quarters-standAlone-abbr":["1. štvrťrok","2. štvrťrok","3. štvrťrok","4. štvrťrok"],"timeFormat-full":"H:mm:ss v","months-standAlone-abbr":["jan","fe [...]
\ No newline at end of file
+({"field-dayperiod":"Časť dňa","dateFormatItem-yQ":"Q yyyy","field-minute":"Minúta","eraNames":["pred n.l.","n.l."],"dateFormatItem-MMMEd":"E, d. MMM","field-weekday":"Deň v týždni","dateFormatItem-yQQQ":"QQQ y","days-standAlone-wide":["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],"months-standAlone-narrow":["j","f","m","a","m","j","j","a","s","o","n","d"],"field-era":"Éra","field-hour":"Hodina","timeFormat-full":"H:mm:ss zzzz","months-standAlone-abbr":["jan","feb"," [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/sl/currency.js b/dojo/cldr/nls/sl/currency.js
index 429c01a..c00d92b 100644
--- a/dojo/cldr/nls/sl/currency.js
+++ b/dojo/cldr/nls/sl/currency.js
@@ -1 +1 @@
-({"EUR_displayName":"Evro","GBP_displayName":"Britanski Funt Sterling","JPY_displayName":"Japonski Jen","CNY_displayName":"Kitajski Yuan Renminbi","USD_displayName":"Ameriški Dolar","USD_symbol":"US$","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€"})
\ No newline at end of file
+({"HKD_displayName":"hongkonški dolar","CHF_displayName":"švicarski frank","JPY_symbol":"¥","CAD_displayName":"kanadski dolar","CNY_displayName":"kitajski juan renminbi","USD_symbol":"$","AUD_displayName":"avstralski dolar","JPY_displayName":"japonski jen","USD_displayName":"ameriški dolar","GBP_displayName":"britanski funt","EUR_displayName":"evro","CHF_symbol":"Fr.","HKD_symbol":"HK$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/sl/gregorian.js b/dojo/cldr/nls/sl/gregorian.js
index 2c034ab..8479597 100644
--- a/dojo/cldr/nls/sl/gregorian.js
+++ b/dojo/cldr/nls/sl/gregorian.js
@@ -1 +1 @@
-({"dateFormat-medium":"d.M.yyyy","eraNarrow":["pr.n.š.","po Kr."],"months-format-narrow":["j","f","m","a","m","j","j","a","s","o","n","d"],"timeFormat-full":"H:mm:ss v","months-standAlone-narrow":["j","f","m","a","m","j","j","a","s","o","n","d"],"months-standAlone-wide":["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december"],"eraNames":["pr.n.š.","po Kr."],"days-standAlone-narrow":["n","p","t","s","č","p","s"],"dateFormatItem-MMMMd" [...]
\ No newline at end of file
+({"field-dayperiod":"Čas dneva","field-minute":"Minuta","eraNames":["pred našim štetjem","naše štetje"],"field-weekday":"Dan v tednu","days-standAlone-wide":["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],"months-standAlone-narrow":["j","f","m","a","m","j","j","a","s","o","n","d"],"field-era":"Doba","field-hour":"Ura","dateFormatItem-y":"y","timeFormat-full":"H:mm:ss zzzz","months-standAlone-abbr":["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/sl/number.js b/dojo/cldr/nls/sl/number.js
index 4179e25..cc62788 100644
--- a/dojo/cldr/nls/sl/number.js
+++ b/dojo/cldr/nls/sl/number.js
@@ -1 +1 @@
-({"group":".","percentSign":"%","exponential":"E","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","plusSign":"+","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing [...]
\ No newline at end of file
+({"group":".","percentSign":"%","exponential":"e","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCu [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/sv/currency.js b/dojo/cldr/nls/sv/currency.js
index 0c00416..4eaa2c6 100644
--- a/dojo/cldr/nls/sv/currency.js
+++ b/dojo/cldr/nls/sv/currency.js
@@ -1 +1 @@
-({"HKD_displayName":"Hongkong-dollar","CHF_displayName":"schweizisk franc","CHF_symbol":"SwF","HKD_symbol":"HK$","CAD_displayName":"kanadensisk dollar","CNY_displayName":"kinesisk yuan renminbi","AUD_displayName":"australisk dollar","JPY_displayName":"japansk yen","CAD_symbol":"Can$","USD_displayName":"US-dollar","CNY_symbol":"Y","GBP_displayName":"brittiskt pund sterling","AUD_symbol":"$A","EUR_displayName":"euro","USD_symbol":"US$","GBP_symbol":"UK£","JPY_symbol":"JP¥","EUR_symbol":"€"})
\ No newline at end of file
+({"HKD_displayName":"Hongkong-dollar","CHF_displayName":"schweizisk franc","CHF_symbol":"CHF","CAD_displayName":"kanadensisk dollar","CNY_displayName":"kinesisk yuan renminbi","AUD_displayName":"australisk dollar","JPY_displayName":"japansk yen","CAD_symbol":"CAD","USD_displayName":"US-dollar","CNY_symbol":"CNY","GBP_displayName":"brittiskt pund sterling","EUR_displayName":"euro","JPY_symbol":"JP¥","HKD_symbol":"HK$","USD_symbol":"US$","EUR_symbol":"€","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/sv/gregorian.js b/dojo/cldr/nls/sv/gregorian.js
index e218186..eb5f1e3 100644
--- a/dojo/cldr/nls/sv/gregorian.js
+++ b/dojo/cldr/nls/sv/gregorian.js
@@ -1 +1 @@
-({"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"veckodag","dateFormatItem-yQQQ":"yyyy QQQ","dateFormatItem-yMEd":"EEE, yyyy-MM-dd","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["f.Kr.","e.Kr."],"dateFormat-long":"d MMMM yyyy","months-format-wide":["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"],"dateFormat-full":"EEEE 'den' d MMMM yyyy" [...]
\ No newline at end of file
+({"months-format-narrow":["J","F","M","A","M","J","J","A","S","O","N","D"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"veckodag","dateFormatItem-yQQQ":"y QQQ","dateFormatItem-yMEd":"EEE, yyyy-MM-dd","dateFormatItem-MMMEd":"E d MMM","eraNarrow":["f.Kr.","e.Kr."],"dateFormat-long":"d MMMM y","months-format-wide":["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"],"dateFormat-full":"EEEE d MMMM y","dateFormatIte [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/sv/number.js b/dojo/cldr/nls/sv/number.js
index fa12589..de83eac 100644
--- a/dojo/cldr/nls/sv/number.js
+++ b/dojo/cldr/nls/sv/number.js
@@ -1 +1 @@
-({"group":" ","percentSign":"%","exponential":"×10^","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"−","decimal":",","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","currencySpacing-aft [...]
\ No newline at end of file
+({"group":" ","percentSign":"%","exponential":"×10^","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"−","decimal":",","nan":"¤¤¤","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-aft [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/th/buddhist.js b/dojo/cldr/nls/th/buddhist.js
new file mode 100644
index 0000000..716c2d3
--- /dev/null
+++ b/dojo/cldr/nls/th/buddhist.js
@@ -0,0 +1 @@
+({"dateFormatItem-yM":"M/yyyy","dateFormatItem-yQ":"Q yyyy","eraNames":["พุทธศักราช"],"dateFormatItem-MMMEd":"Eท d MMM","dateTimeFormat-full":"{1}, {0}","dateFormatItem-yQQQ":"QQQ y","months-standAlone-narrow":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],"dateTimeFormat-short":"{1}, {0}","dateTimeFormat-medium":"{1}, {0}","timeFormat-full":"H นาฬิกา m นาที ss วินาที zzzz","dateFormatItem-yMMM":"MMM yyyy","days-standAlone-narrow":["อ","จ","อ","พ [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/th/currency.js b/dojo/cldr/nls/th/currency.js
index 909e26f..2b39ee1 100644
--- a/dojo/cldr/nls/th/currency.js
+++ b/dojo/cldr/nls/th/currency.js
@@ -1 +1 @@
-({"HKD_displayName":"เหรียญฮ่องกง","CHF_displayName":"ฟรังก์สวิส","JPY_symbol":"¥","HKD_symbol":"HK$","CAD_displayName":"ดอลลาร์แคนาดา","CNY_displayName":"หยวนเหรินเหมินบี้","USD_symbol":"US$","AUD_displayName":"ดอลลาร์ออสเตรเลีย","JPY_displayName":"เยน","CAD_symbol":"Can$","USD_displayName":"ดอลลาร์สหรัฐ","EUR_symbol":"€","CNY_symbol":"¥","GBP_displayName":"ปอนด์สเตอร์ลิงอังกฤษ","GBP_symbol":"£","AUD_symbol":"$A","EUR_displayName":"ยูโร"})
\ No newline at end of file
+({"HKD_displayName":"ดอลลาร์ฮ่องกง","CHF_displayName":"ฟรังก์สวิส","JPY_symbol":"¥","CAD_displayName":"ดอลลาร์แคนาดา","CNY_displayName":"หยวนเหรินหมินปี้ (สาธารณรัฐประชาชนจีน)","AUD_displayName":"ดอลลาร์ออสเตรเลีย","JPY_displayName":"เยนญี่ปุ่น","USD_displayName":"ดอลลาร์สหรัฐ","GBP_displayName":"ปอนด์สเตอร์ลิง (สหราชอาณาจักร)","EUR_displayName":"ยูโร","CHF_symbol":"Fr.","HKD_symbol":"HK$","USD_symbol":"US$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_sym [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/th/gregorian.js b/dojo/cldr/nls/th/gregorian.js
index c0a0dc0..7088b42 100644
--- a/dojo/cldr/nls/th/gregorian.js
+++ b/dojo/cldr/nls/th/gregorian.js
@@ -1 +1 @@
-({"dateFormatItem-yM":"M/yyyy","field-dayperiod":"ช่วงวัน","dateFormatItem-yQ":"Q yyyy","field-minute":"นาที","eraNames":["ปีก่อนคริสต์ศักราชที่","คริสต์ศักราช"],"dateFormatItem-MMMEd":"E d MMM","field-weekday":"วันในสัปดาห์","dateFormatItem-yQQQ":"QQQ yyyy","days-standAlone-wide":["วันอาทิตย์","วันจันทร์","วันอังคาร","วันพุธ","วันพฤหัสบดี","วันศุกร์","วันเสาร์"],"dateFormatItem-MMM":"LLL","patternChars":"GanjkHmsSEDFwWxhKzAeugXZvcL","months-standAlone-narrow":["ม.ค.","ก.พ.","มี.ค.","เม. [...]
\ No newline at end of file
+({"dateFormatItem-yM":"M/yyyy","field-dayperiod":"ช่วงวัน","dateFormatItem-yQ":"Q yyyy","field-minute":"นาที","eraNames":["ปีก่อนคริสต์ศักราช","คริสต์ศักราช"],"dateFormatItem-MMMEd":"E d MMM","dateTimeFormat-full":"{1}, {0}","field-weekday":"วันในสัปดาห์","dateFormatItem-yQQQ":"QQQ y","days-standAlone-wide":["วันอาทิตย์","วันจันทร์","วันอังคาร","วันพุธ","วันพฤหัสบดี","วันศุกร์","วันเสาร์"],"dateFormatItem-MMM":"LLL","months-standAlone-narrow":["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย." [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/tr/currency.js b/dojo/cldr/nls/tr/currency.js
index 29318a3..c2ca1a4 100644
--- a/dojo/cldr/nls/tr/currency.js
+++ b/dojo/cldr/nls/tr/currency.js
@@ -1 +1 @@
-({"HKD_displayName":"Hong Kong Doları","CHF_displayName":"İsviçre Frangı","CHF_symbol":"SwF","JPY_symbol":"¥","HKD_symbol":"HK$","CAD_displayName":"Kanada Doları","CNY_displayName":"Çin Yuanı Renminbi","USD_symbol":"$","AUD_displayName":"Avustralya Doları","JPY_displayName":"Japon Yeni","CAD_symbol":"Can$","USD_displayName":"ABD Doları","CNY_symbol":"Y","GBP_displayName":"İngiliz Sterlini","GBP_symbol":"£","AUD_symbol":"$A","EUR_displayName":"Euro","EUR_symbol":"€"})
\ No newline at end of file
+({"HKD_displayName":"Hong Kong Doları","CHF_displayName":"İsviçre Frangı","JPY_symbol":"¥","CAD_displayName":"Kanada Doları","CNY_displayName":"Çin Yuanı Renminbi","USD_symbol":"$","AUD_displayName":"Avustralya Doları","JPY_displayName":"Japon Yeni","USD_displayName":"ABD Doları","GBP_displayName":"İngiliz Sterlini","EUR_displayName":"Euro","CHF_symbol":"Fr.","HKD_symbol":"HK$","CAD_symbol":"CA$","EUR_symbol":"€","CNY_symbol":"CN¥","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/tr/gregorian.js b/dojo/cldr/nls/tr/gregorian.js
index fcd3355..595c5bc 100644
--- a/dojo/cldr/nls/tr/gregorian.js
+++ b/dojo/cldr/nls/tr/gregorian.js
@@ -1 +1 @@
-({"dateFormatItem-yM":"M/yyyy","field-dayperiod":"AM/PM","dateFormatItem-yQ":"Q yyyy","field-minute":"Dakika","eraNames":["Milattan Önce","Milattan Sonra"],"dateFormatItem-MMMEd":"d MMM E","field-weekday":"Haftanın Günü","dateFormatItem-yQQQ":"QQQ yyyy","days-standAlone-wide":["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],"dateFormatItem-MMM":"LLL","patternChars":"GanjkHmsSEDFwWxhKzAeugXZvcL","months-standAlone-narrow":["O","Ş","M","N","M","H","T","A","E","E","K"," [...]
\ No newline at end of file
+({"months-format-narrow":["O","Ş","M","N","M","H","T","A","E","E","K","A"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"Haftanın Günü","dateFormatItem-yyQQQQ":"QQQQ yy","dateFormatItem-yQQQ":"QQQ y","dateFormatItem-yMEd":"dd.MM.yyyy EEE","dateFormatItem-MMMEd":"dd MMM E","eraNarrow":["MÖ","MS"],"dateFormat-long":"dd MMMM y","months-format-wide":["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],"dateFormatItem-EEEd":"d  [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/zh-cn/gregorian.js b/dojo/cldr/nls/zh-cn/gregorian.js
index e3e560f..5b4dbe5 100644
--- a/dojo/cldr/nls/zh-cn/gregorian.js
+++ b/dojo/cldr/nls/zh-cn/gregorian.js
@@ -1 +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","months-format-narrow":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"周天","dateFormatItem-yQQQ":"y年QQQ","dateFormatItem-yMEd":"yyyy年M月d日,E [...]
\ No newline at end of file
+({"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","months-format-narrow":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"周天","dateFormatItem-yQQQ":"y年QQQ","dateFormatItem-yMEd":"y年M月d日,E"," [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/zh-tw/currency.js b/dojo/cldr/nls/zh-tw/currency.js
index 4dc7389..ca5c927 100644
--- a/dojo/cldr/nls/zh-tw/currency.js
+++ b/dojo/cldr/nls/zh-tw/currency.js
@@ -1 +1 @@
-({"BRE_displayName":"巴西克魯賽羅 (1990-1993)","DEM_displayName":"德國馬克","KGS_symbol":"som","CUP_displayName":"古巴披索","HUF_symbol":"Ft","BDT_symbol":"Tk","LSL_symbol":"M","VEF_symbol":"BsF","MDL_displayName":"摩杜雲列伊","DOP_displayName":"多明尼加披索","MTL_symbol":"Lm","NGN_displayName":"奈及利亞奈拉","KZT_displayName":"卡扎克斯坦坦吉","BGL_symbol":"lev","LTT_displayName":"立陶宛特羅","LAK_displayName":"寮國基普","LKR_displayName":"斯里蘭卡盧布","AOR_displayName":"安哥拉新寬扎 Reajustado (1995-1999)","XEU_displayName":"歐洲貨幣單位 XEU","SYP_s [...]
\ No newline at end of file
+({"BRE_displayName":"巴西克魯賽羅 (1990-1993)","DEM_displayName":"德國馬克","KGS_symbol":"som","CUP_displayName":"古巴披索","HUF_symbol":"Ft","BDT_symbol":"Tk","LSL_symbol":"M","VEF_symbol":"BsF","MDL_displayName":"摩杜雲列伊","DOP_displayName":"多明尼加披索","MTL_symbol":"Lm","NGN_displayName":"奈及利亞奈拉","KZT_displayName":"卡扎克斯坦坦吉","BGL_symbol":"lev","LTT_displayName":"立陶宛特羅","LAK_displayName":"寮國基普","LKR_displayName":"斯里蘭卡盧布","AOR_displayName":"安哥拉新寬扎 Reajustado (1995-1999)","XEU_displayName":"歐洲貨幣單位 XEU","SYP_s [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/zh-tw/gregorian.js b/dojo/cldr/nls/zh-tw/gregorian.js
index 9889901..5cd1b16 100644
--- a/dojo/cldr/nls/zh-tw/gregorian.js
+++ b/dojo/cldr/nls/zh-tw/gregorian.js
@@ -1 +1 @@
-({"quarters-standAlone-wide":["第1季","第2季","第3季","第4季"],"quarters-format-abbr":["第1季","第2季","第3季","第4季"],"dateFormat-medium":"yyyy/M/d","field-second":"秒","quarters-standAlone-abbr":["第1季","第2季","第3季","第4季"],"dateFormatItem-MMdd":"MM/dd","dateFormatItem-MEd":"M-d(E)","dateFormatItem-yMEd":"yyyy/M/d(EEE)","field-week":"週","months-format-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"timeFormat-full":"ahh時mm分ss秒v","dateFormatItem-HHmmss":"H:mm:ss","dateTimeAvailableFormats":[ [...]
\ No newline at end of file
+({"dateFormatItem-yM":"yyyy/M","field-minute":"分鐘","eraNames":["西元前","西元"],"field-weekday":"週天","dateFormatItem-MMdd":"MM/dd","months-standAlone-narrow":["1","2","3","4","5","6","7","8","9","10","11","12"],"field-era":"年代","field-hour":"小時","quarters-standAlone-abbr":["第1季","第2季","第3季","第4季"],"timeFormat-full":"zzzzah時mm分ss秒","months-standAlone-abbr":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormatItem-Ed":"d日(E)","dateFormatItem-yMMM":"y年M月","timeFormat-mediu [...]
\ No newline at end of file
diff --git a/dojo/cldr/nls/zh/currency.js b/dojo/cldr/nls/zh/currency.js
index 50efc23..0c28db0 100644
--- a/dojo/cldr/nls/zh/currency.js
+++ b/dojo/cldr/nls/zh/currency.js
@@ -1 +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
+({"HKD_displayName":"港元","CHF_displayName":"瑞士法郎","CAD_displayName":"加拿大元","CNY_displayName":"人民币","AUD_displayName":"澳大利亚元","JPY_displayName":"日元","USD_displayName":"美元","CNY_symbol":"¥","GBP_displayName":"英镑","EUR_displayName":"欧元","CHF_symbol":"Fr.","JPY_symbol":"JP¥","HKD_symbol":"HK$","USD_symbol":"US$","CAD_symbol":"CA$","EUR_symbol":"€","GBP_symbol":"£","AUD_symbol":"AU$"})
\ No newline at end of file
diff --git a/dojo/cldr/nls/zh/gregorian.js b/dojo/cldr/nls/zh/gregorian.js
index 8126676..f9f2ae8 100644
--- a/dojo/cldr/nls/zh/gregorian.js
+++ b/dojo/cldr/nls/zh/gregorian.js
@@ -1 +1 @@
-({"months-format-narrow":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"周天","dateFormatItem-yQQQ":"y年QQQ","dateFormatItem-yMEd":"yyyy年M月d日,E","dateFormatItem-MMMEd":"MMMd日E","eraNarrow":["公元前","公元"],"dateFormat-long":"yyyy年M月d日","months-format-wide":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateFormat-full":"yyyy年M月d日EEEE","dateFormatItem-Md":"M-d","field-era":"时期","dateFormatItem-yM [...]
\ No newline at end of file
+({"months-format-narrow":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"quarters-standAlone-narrow":["1","2","3","4"],"field-weekday":"周天","dateFormatItem-yQQQ":"y年QQQ","dateFormatItem-yMEd":"y年M月d日,E","dateFormatItem-MMMEd":"MMMd日E","eraNarrow":["公元前","公元"],"dateFormat-long":"y年M月d日","months-format-wide":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],"dateTimeFormat-medium":"{1} {0}","dateFormat-full":"y年M月d日EEEE","dateFormatItem-Md":"M-d","field-era [...]
\ No newline at end of file
diff --git a/dojo/colors.js b/dojo/colors.js
index d373112..0aea35d 100644
--- a/dojo/colors.js
+++ b/dojo/colors.js
@@ -28,8 +28,8 @@ 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]+)\)/);
+dojo.colorFromRgb=function(_2,_3){
+var m=_2.toLowerCase().match(/^(rgba?|hsla?)\(([\s\.\-,%0-9]+)\)/);
 if(m){
 var c=m[2].split(/\s*,\s*/),l=c.length,t=m[1],a;
 if((t=="rgb"&&l==3)||(t=="rgba"&&l==4)){
@@ -41,9 +41,9 @@ return parseFloat(x)*2.56;
 if(l==4){
 a[3]=c[3];
 }
-return dojo.colorFromArray(a,_7);
+return dojo.colorFromArray(a,_3);
 }
-return dojo.colorFromArray(c,_7);
+return dojo.colorFromArray(c,_3);
 }
 if((t=="hsl"&&l==3)||(t=="hsla"&&l==4)){
 var H=((parseFloat(c[0])%360)+360)%360/360,S=parseFloat(c[1])/100,L=parseFloat(c[2])/100,m2=L<=0.5?L*(S+1):L+S-L*S,m1=2*L-m2;
@@ -51,21 +51,21 @@ 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 dojo.colorFromArray(a,_3);
 }
 }
 return null;
 };
-var _14=function(c,low,_17){
+var _4=function(c,_5,_6){
 c=Number(c);
-return isNaN(c)?_17:c<low?low:c>_17?_17:c;
+return isNaN(c)?_6:c<_5?_5:c>_6?_6: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);
+t.r=Math.round(_4(t.r,0,255));
+t.g=Math.round(_4(t.g,0,255));
+t.b=Math.round(_4(t.b,0,255));
+t.a=_4(t.a,0,1);
 return this;
 };
 })();
diff --git a/dojo/cookie.js b/dojo/cookie.js
index b80b672..aa708a0 100644
--- a/dojo/cookie.js
+++ b/dojo/cookie.js
@@ -12,29 +12,29 @@ dojo.require("dojo.regexp");
 dojo.cookie=function(_1,_2,_3){
 var c=document.cookie;
 if(arguments.length==1){
-var _5=c.match(new RegExp("(?:^|; )"+dojo.regexp.escapeString(_1)+"=([^;]*)"));
-return _5?decodeURIComponent(_5[1]):undefined;
+var _4=c.match(new RegExp("(?:^|; )"+dojo.regexp.escapeString(_1)+"=([^;]*)"));
+return _4?decodeURIComponent(_4[1]):undefined;
 }else{
 _3=_3||{};
-var _6=_3.expires;
-if(typeof _6=="number"){
+var _5=_3.expires;
+if(typeof _5=="number"){
 var d=new Date();
-d.setTime(d.getTime()+_6*24*60*60*1000);
-_6=_3.expires=d;
+d.setTime(d.getTime()+_5*24*60*60*1000);
+_5=_3.expires=d;
 }
-if(_6&&_6.toUTCString){
-_3.expires=_6.toUTCString();
+if(_5&&_5.toUTCString){
+_3.expires=_5.toUTCString();
 }
 _2=encodeURIComponent(_2);
-var _8=_1+"="+_2,_9;
-for(_9 in _3){
-_8+="; "+_9;
-var _a=_3[_9];
-if(_a!==true){
-_8+="="+_a;
+var _6=_1+"="+_2,_7;
+for(_7 in _3){
+_6+="; "+_7;
+var _8=_3[_7];
+if(_8!==true){
+_6+="="+_8;
 }
 }
-document.cookie=_8;
+document.cookie=_6;
 }
 };
 dojo.cookie.isSupported=function(){
diff --git a/dojo/data/ItemFileReadStore.js b/dojo/data/ItemFileReadStore.js
index c6b1c4b..5414641 100644
--- a/dojo/data/ItemFileReadStore.js
+++ b/dojo/data/ItemFileReadStore.js
@@ -16,7 +16,10 @@ this._arrayOfAllItems=[];
 this._arrayOfTopLevelItems=[];
 this._loadFinished=false;
 this._jsonFileUrl=_1.url;
+this._ccUrl=_1.url;
+this.url=_1.url;
 this._jsonData=_1.data;
+this.data=null;
 this._datatypeMap=_1.typeMap||{};
 if(!this._datatypeMap["Date"]){
 this._datatypeMap["Date"]={type:Date,deserialize:function(_2){
@@ -34,10 +37,16 @@ this._queuedFetches=[];
 if(_1.urlPreventCache!==undefined){
 this.urlPreventCache=_1.urlPreventCache?true:false;
 }
+if(_1.hierarchical!==undefined){
+this.hierarchical=_1.hierarchical?true:false;
+}
 if(_1.clearOnClose){
 this.clearOnClose=true;
 }
-},url:"",data:null,typeMap:null,clearOnClose:false,urlPreventCache:false,_assertIsItem:function(_3){
+if("failOk" in _1){
+this.failOk=_1.failOk?true:false;
+}
+},url:"",_ccUrl:"",data:null,typeMap:null,clearOnClose:false,urlPreventCache:false,failOk:false,hierarchical:true,_assertIsItem:function(_3){
 if(!this.isItem(_3)){
 throw new Error("dojo.data.ItemFileReadStore: Invalid item argument.");
 }
@@ -62,7 +71,9 @@ _c.push(_d);
 }
 return _c;
 },hasAttribute:function(_e,_f){
-return this.getValues(_e,_f).length>0;
+this._assertIsItem(_e);
+this._assertIsAttribute(_f);
+return (_f in _e);
 },containsValue:function(_10,_11,_12){
 var _13=undefined;
 if(typeof _12==="string"){
@@ -110,38 +121,42 @@ var _22=function(_23,_24){
 var _25=[];
 var i,key;
 if(_23.query){
-var _28;
-var _29=_23.queryOptions?_23.queryOptions.ignoreCase:false;
-var _2a={};
+var _26;
+var _27=_23.queryOptions?_23.queryOptions.ignoreCase:false;
+var _28={};
 for(key in _23.query){
-_28=_23.query[key];
-if(typeof _28==="string"){
-_2a[key]=dojo.data.util.filter.patternToRegExp(_28,_29);
+_26=_23.query[key];
+if(typeof _26==="string"){
+_28[key]=dojo.data.util.filter.patternToRegExp(_26,_27);
+}else{
+if(_26 instanceof RegExp){
+_28[key]=_26;
+}
 }
 }
 for(i=0;i<_24.length;++i){
-var _2b=true;
-var _2c=_24[i];
-if(_2c===null){
-_2b=false;
+var _29=true;
+var _2a=_24[i];
+if(_2a===null){
+_29=false;
 }else{
 for(key in _23.query){
-_28=_23.query[key];
-if(!_21._containsValue(_2c,key,_28,_2a[key])){
-_2b=false;
+_26=_23.query[key];
+if(!_21._containsValue(_2a,key,_26,_28[key])){
+_29=false;
 }
 }
 }
-if(_2b){
-_25.push(_2c);
+if(_29){
+_25.push(_2a);
 }
 }
 _1f(_25,_23);
 }else{
 for(i=0;i<_24.length;++i){
-var _2d=_24[i];
-if(_2d!==null){
-_25.push(_2d);
+var _2b=_24[i];
+if(_2b!==null){
+_25.push(_2b);
 }
 }
 _1f(_25,_23);
@@ -150,16 +165,30 @@ _1f(_25,_23);
 if(this._loadFinished){
 _22(_1e,this._getItemsArray(_1e.queryOptions));
 }else{
+if(this._jsonFileUrl!==this._ccUrl){
+dojo.deprecated("dojo.data.ItemFileReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl.  _jsonFileUrl support will be removed in 2.0");
+this._ccUrl=this._jsonFileUrl;
+this.url=this._jsonFileUrl;
+}else{
+if(this.url!==this._ccUrl){
+this._jsonFileUrl=this.url;
+this._ccUrl=this.url;
+}
+}
+if(this.data!=null&&this._jsonData==null){
+this._jsonData=this.data;
+this.data=null;
+}
 if(this._jsonFileUrl){
 if(this._loadInProgress){
 this._queuedFetches.push({args:_1e,filter:_22});
 }else{
 this._loadInProgress=true;
-var _2e={url:_21._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache};
-var _2f=dojo.xhrGet(_2e);
-_2f.addCallback(function(_30){
+var _2c={url:_21._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk};
+var _2d=dojo.xhrGet(_2c);
+_2d.addCallback(function(_2e){
 try{
-_21._getItemsFromLoadedData(_30);
+_21._getItemsFromLoadedData(_2e);
 _21._loadFinished=true;
 _21._loadInProgress=false;
 _22(_1e,_21._getItemsArray(_1e.queryOptions));
@@ -171,22 +200,22 @@ _21._loadInProgress=false;
 _20(e,_1e);
 }
 });
-_2f.addErrback(function(_31){
+_2d.addErrback(function(_2f){
 _21._loadInProgress=false;
-_20(_31,_1e);
+_20(_2f,_1e);
 });
-var _32=null;
+var _30=null;
 if(_1e.abort){
-_32=_1e.abort;
+_30=_1e.abort;
 }
 _1e.abort=function(){
-var df=_2f;
+var df=_2d;
 if(df&&df.fired===-1){
 df.cancel();
 df=null;
 }
-if(_32){
-_32.call(_1e);
+if(_30){
+_30.call(_1e);
 }
 };
 }
@@ -209,24 +238,26 @@ _20(new Error("dojo.data.ItemFileReadStore: No JSON source data was provided as
 },_handleQueuedFetches:function(){
 if(this._queuedFetches.length>0){
 for(var i=0;i<this._queuedFetches.length;i++){
-var _35=this._queuedFetches[i];
-var _36=_35.args;
-var _37=_35.filter;
-if(_37){
-_37(_36,this._getItemsArray(_36.queryOptions));
+var _31=this._queuedFetches[i];
+var _32=_31.args;
+var _33=_31.filter;
+if(_33){
+_33(_32,this._getItemsArray(_32.queryOptions));
 }else{
-this.fetchItemByIdentity(_36);
+this.fetchItemByIdentity(_32);
 }
 }
 this._queuedFetches=[];
 }
-},_getItemsArray:function(_38){
-if(_38&&_38.deep){
+},_getItemsArray:function(_34){
+if(_34&&_34.deep){
 return this._arrayOfAllItems;
 }
 return this._arrayOfTopLevelItems;
-},close:function(_39){
-if(this.clearOnClose&&(this._jsonFileUrl!=="")){
+},close:function(_35){
+if(this.clearOnClose&&this._loadFinished&&!this._loadInProgress){
+if(((this._jsonFileUrl==""||this._jsonFileUrl==null)&&(this.url==""||this.url==null))&&this.data==null){
+}
 this._arrayOfAllItems=[];
 this._arrayOfTopLevelItems=[];
 this._loadFinished=false;
@@ -234,91 +265,91 @@ this._itemsByIdentity=null;
 this._loadInProgress=false;
 this._queuedFetches=[];
 }
-},_getItemsFromLoadedData:function(_3a){
-var _3b=false;
-function _3c(_3d){
-var _3e=((_3d!==null)&&(typeof _3d==="object")&&(!dojo.isArray(_3d)||_3b)&&(!dojo.isFunction(_3d))&&(_3d.constructor==Object||dojo.isArray(_3d))&&(typeof _3d._reference==="undefined")&&(typeof _3d._type==="undefined")&&(typeof _3d._value==="undefined"));
-return _3e;
+},_getItemsFromLoadedData:function(_36){
+var _37=false;
+var _38=this;
+function _39(_3a){
+var _3b=((_3a!==null)&&(typeof _3a==="object")&&(!dojo.isArray(_3a)||_37)&&(!dojo.isFunction(_3a))&&(_3a.constructor==Object||dojo.isArray(_3a))&&(typeof _3a._reference==="undefined")&&(typeof _3a._type==="undefined")&&(typeof _3a._value==="undefined")&&_38.hierarchical);
+return _3b;
 };
-var _3f=this;
-function _40(_41){
-_3f._arrayOfAllItems.push(_41);
-for(var _42 in _41){
-var _43=_41[_42];
-if(_43){
-if(dojo.isArray(_43)){
-var _44=_43;
-for(var k=0;k<_44.length;++k){
-var _46=_44[k];
-if(_3c(_46)){
-_40(_46);
+function _3c(_3d){
+_38._arrayOfAllItems.push(_3d);
+for(var _3e in _3d){
+var _3f=_3d[_3e];
+if(_3f){
+if(dojo.isArray(_3f)){
+var _40=_3f;
+for(var k=0;k<_40.length;++k){
+var _41=_40[k];
+if(_39(_41)){
+_3c(_41);
 }
 }
 }else{
-if(_3c(_43)){
-_40(_43);
+if(_39(_3f)){
+_3c(_3f);
 }
 }
 }
 }
 };
-this._labelAttr=_3a.label;
+this._labelAttr=_36.label;
 var i;
-var _48;
+var _42;
 this._arrayOfAllItems=[];
-this._arrayOfTopLevelItems=_3a.items;
+this._arrayOfTopLevelItems=_36.items;
 for(i=0;i<this._arrayOfTopLevelItems.length;++i){
-_48=this._arrayOfTopLevelItems[i];
-if(dojo.isArray(_48)){
-_3b=true;
+_42=this._arrayOfTopLevelItems[i];
+if(dojo.isArray(_42)){
+_37=true;
 }
-_40(_48);
-_48[this._rootItemPropName]=true;
+_3c(_42);
+_42[this._rootItemPropName]=true;
 }
-var _49={};
+var _43={};
 var key;
 for(i=0;i<this._arrayOfAllItems.length;++i){
-_48=this._arrayOfAllItems[i];
-for(key in _48){
+_42=this._arrayOfAllItems[i];
+for(key in _42){
 if(key!==this._rootItemPropName){
-var _4b=_48[key];
-if(_4b!==null){
-if(!dojo.isArray(_4b)){
-_48[key]=[_4b];
+var _44=_42[key];
+if(_44!==null){
+if(!dojo.isArray(_44)){
+_42[key]=[_44];
 }
 }else{
-_48[key]=[null];
+_42[key]=[null];
 }
 }
-_49[key]=key;
+_43[key]=key;
 }
 }
-while(_49[this._storeRefPropName]){
+while(_43[this._storeRefPropName]){
 this._storeRefPropName+="_";
 }
-while(_49[this._itemNumPropName]){
+while(_43[this._itemNumPropName]){
 this._itemNumPropName+="_";
 }
-while(_49[this._reverseRefMap]){
+while(_43[this._reverseRefMap]){
 this._reverseRefMap+="_";
 }
-var _4c;
-var _4d=_3a.identifier;
-if(_4d){
+var _45;
+var _46=_36.identifier;
+if(_46){
 this._itemsByIdentity={};
-this._features["dojo.data.api.Identity"]=_4d;
+this._features["dojo.data.api.Identity"]=_46;
 for(i=0;i<this._arrayOfAllItems.length;++i){
-_48=this._arrayOfAllItems[i];
-_4c=_48[_4d];
-var _4e=_4c[0];
-if(!this._itemsByIdentity[_4e]){
-this._itemsByIdentity[_4e]=_48;
+_42=this._arrayOfAllItems[i];
+_45=_42[_46];
+var _47=_45[0];
+if(!this._itemsByIdentity[_47]){
+this._itemsByIdentity[_47]=_42;
 }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: ["+_4d+"].  Value collided: ["+_4e+"]");
+throw new Error("dojo.data.ItemFileReadStore:  The json data as specified by: ["+this._jsonFileUrl+"] is malformed.  Items within the list have identifier: ["+_46+"].  Value collided: ["+_47+"]");
 }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: ["+_4d+"].  Value collided: ["+_4e+"]");
+throw new Error("dojo.data.ItemFileReadStore:  The json data provided by the creation arguments is malformed.  Items within the list have identifier: ["+_46+"].  Value collided: ["+_47+"]");
 }
 }
 }
@@ -327,62 +358,62 @@ throw new Error("dojo.data.ItemFileReadStore:  The json data provided by the cre
 this._features["dojo.data.api.Identity"]=Number;
 }
 for(i=0;i<this._arrayOfAllItems.length;++i){
-_48=this._arrayOfAllItems[i];
-_48[this._storeRefPropName]=this;
-_48[this._itemNumPropName]=i;
+_42=this._arrayOfAllItems[i];
+_42[this._storeRefPropName]=this;
+_42[this._itemNumPropName]=i;
 }
 for(i=0;i<this._arrayOfAllItems.length;++i){
-_48=this._arrayOfAllItems[i];
-for(key in _48){
-_4c=_48[key];
-for(var j=0;j<_4c.length;++j){
-_4b=_4c[j];
-if(_4b!==null&&typeof _4b=="object"){
-if(_4b._type&&_4b._value){
-var _50=_4b._type;
-var _51=this._datatypeMap[_50];
-if(!_51){
-throw new Error("dojo.data.ItemFileReadStore: in the typeMap constructor arg, no object class was specified for the datatype '"+_50+"'");
+_42=this._arrayOfAllItems[i];
+for(key in _42){
+_45=_42[key];
+for(var j=0;j<_45.length;++j){
+_44=_45[j];
+if(_44!==null&&typeof _44=="object"){
+if(("_type" in _44)&&("_value" in _44)){
+var _48=_44._type;
+var _49=this._datatypeMap[_48];
+if(!_49){
+throw new Error("dojo.data.ItemFileReadStore: in the typeMap constructor arg, no object class was specified for the datatype '"+_48+"'");
 }else{
-if(dojo.isFunction(_51)){
-_4c[j]=new _51(_4b._value);
+if(dojo.isFunction(_49)){
+_45[j]=new _49(_44._value);
 }else{
-if(dojo.isFunction(_51.deserialize)){
-_4c[j]=_51.deserialize(_4b._value);
+if(dojo.isFunction(_49.deserialize)){
+_45[j]=_49.deserialize(_44._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(_4b._reference){
-var _52=_4b._reference;
-if(!dojo.isObject(_52)){
-_4c[j]=this._itemsByIdentity[_52];
+if(_44._reference){
+var _4a=_44._reference;
+if(!dojo.isObject(_4a)){
+_45[j]=this._itemsByIdentity[_4a];
 }else{
 for(var k=0;k<this._arrayOfAllItems.length;++k){
-var _54=this._arrayOfAllItems[k];
-var _55=true;
-for(var _56 in _52){
-if(_54[_56]!=_52[_56]){
-_55=false;
+var _4b=this._arrayOfAllItems[k];
+var _4c=true;
+for(var _4d in _4a){
+if(_4b[_4d]!=_4a[_4d]){
+_4c=false;
 }
 }
-if(_55){
-_4c[j]=_54;
+if(_4c){
+_45[j]=_4b;
 }
 }
 }
 if(this.referenceIntegrity){
-var _57=_4c[j];
-if(this.isItem(_57)){
-this._addReferenceToMap(_57,_48,key);
+var _4e=_45[j];
+if(this.isItem(_4e)){
+this._addReferenceToMap(_4e,_42,key);
 }
 }
 }else{
-if(this.isItem(_4b)){
+if(this.isItem(_44)){
 if(this.referenceIntegrity){
-this._addReferenceToMap(_4b,_48,key);
+this._addReferenceToMap(_44,_42,key);
 }
 }
 }
@@ -390,123 +421,150 @@ this._addReferenceToMap(_4b,_48,key);
 }
 }
 }
-},_addReferenceToMap:function(_58,_59,_5a){
-},getIdentity:function(_5b){
-var _5c=this._features["dojo.data.api.Identity"];
-if(_5c===Number){
-return _5b[this._itemNumPropName];
+},_addReferenceToMap:function(_4f,_50,_51){
+},getIdentity:function(_52){
+var _53=this._features["dojo.data.api.Identity"];
+if(_53===Number){
+return _52[this._itemNumPropName];
 }else{
-var _5d=_5b[_5c];
-if(_5d){
-return _5d[0];
+var _54=_52[_53];
+if(_54){
+return _54[0];
 }
 }
 return null;
-},fetchItemByIdentity:function(_5e){
-var _5f;
-var _60;
+},fetchItemByIdentity:function(_55){
+var _56;
+var _57;
 if(!this._loadFinished){
-var _61=this;
+var _58=this;
+if(this._jsonFileUrl!==this._ccUrl){
+dojo.deprecated("dojo.data.ItemFileReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl.  _jsonFileUrl support will be removed in 2.0");
+this._ccUrl=this._jsonFileUrl;
+this.url=this._jsonFileUrl;
+}else{
+if(this.url!==this._ccUrl){
+this._jsonFileUrl=this.url;
+this._ccUrl=this.url;
+}
+}
+if(this.data!=null&&this._jsonData==null){
+this._jsonData=this.data;
+this.data=null;
+}
 if(this._jsonFileUrl){
 if(this._loadInProgress){
-this._queuedFetches.push({args:_5e});
+this._queuedFetches.push({args:_55});
 }else{
 this._loadInProgress=true;
-var _62={url:_61._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache};
-var _63=dojo.xhrGet(_62);
-_63.addCallback(function(_64){
-var _65=_5e.scope?_5e.scope:dojo.global;
+var _59={url:_58._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk};
+var _5a=dojo.xhrGet(_59);
+_5a.addCallback(function(_5b){
+var _5c=_55.scope?_55.scope:dojo.global;
 try{
-_61._getItemsFromLoadedData(_64);
-_61._loadFinished=true;
-_61._loadInProgress=false;
-_5f=_61._getItemByIdentity(_5e.identity);
-if(_5e.onItem){
-_5e.onItem.call(_65,_5f);
+_58._getItemsFromLoadedData(_5b);
+_58._loadFinished=true;
+_58._loadInProgress=false;
+_56=_58._getItemByIdentity(_55.identity);
+if(_55.onItem){
+_55.onItem.call(_5c,_56);
 }
-_61._handleQueuedFetches();
+_58._handleQueuedFetches();
 }
 catch(error){
-_61._loadInProgress=false;
-if(_5e.onError){
-_5e.onError.call(_65,error);
+_58._loadInProgress=false;
+if(_55.onError){
+_55.onError.call(_5c,error);
 }
 }
 });
-_63.addErrback(function(_66){
-_61._loadInProgress=false;
-if(_5e.onError){
-var _67=_5e.scope?_5e.scope:dojo.global;
-_5e.onError.call(_67,_66);
+_5a.addErrback(function(_5d){
+_58._loadInProgress=false;
+if(_55.onError){
+var _5e=_55.scope?_55.scope:dojo.global;
+_55.onError.call(_5e,_5d);
 }
 });
 }
 }else{
 if(this._jsonData){
-_61._getItemsFromLoadedData(_61._jsonData);
-_61._jsonData=null;
-_61._loadFinished=true;
-_5f=_61._getItemByIdentity(_5e.identity);
-if(_5e.onItem){
-_60=_5e.scope?_5e.scope:dojo.global;
-_5e.onItem.call(_60,_5f);
+_58._getItemsFromLoadedData(_58._jsonData);
+_58._jsonData=null;
+_58._loadFinished=true;
+_56=_58._getItemByIdentity(_55.identity);
+if(_55.onItem){
+_57=_55.scope?_55.scope:dojo.global;
+_55.onItem.call(_57,_56);
 }
 }
 }
 }else{
-_5f=this._getItemByIdentity(_5e.identity);
-if(_5e.onItem){
-_60=_5e.scope?_5e.scope:dojo.global;
-_5e.onItem.call(_60,_5f);
+_56=this._getItemByIdentity(_55.identity);
+if(_55.onItem){
+_57=_55.scope?_55.scope:dojo.global;
+_55.onItem.call(_57,_56);
 }
 }
-},_getItemByIdentity:function(_68){
-var _69=null;
+},_getItemByIdentity:function(_5f){
+var _60=null;
 if(this._itemsByIdentity){
-_69=this._itemsByIdentity[_68];
+_60=this._itemsByIdentity[_5f];
 }else{
-_69=this._arrayOfAllItems[_68];
+_60=this._arrayOfAllItems[_5f];
 }
-if(_69===undefined){
-_69=null;
+if(_60===undefined){
+_60=null;
 }
-return _69;
-},getIdentityAttributes:function(_6a){
-var _6b=this._features["dojo.data.api.Identity"];
-if(_6b===Number){
+return _60;
+},getIdentityAttributes:function(_61){
+var _62=this._features["dojo.data.api.Identity"];
+if(_62===Number){
 return null;
 }else{
-return [_6b];
+return [_62];
 }
 },_forceLoad:function(){
-var _6c=this;
+var _63=this;
+if(this._jsonFileUrl!==this._ccUrl){
+dojo.deprecated("dojo.data.ItemFileReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl.  _jsonFileUrl support will be removed in 2.0");
+this._ccUrl=this._jsonFileUrl;
+this.url=this._jsonFileUrl;
+}else{
+if(this.url!==this._ccUrl){
+this._jsonFileUrl=this.url;
+this._ccUrl=this.url;
+}
+}
+if(this.data!=null&&this._jsonData==null){
+this._jsonData=this.data;
+this.data=null;
+}
 if(this._jsonFileUrl){
-var _6d={url:_6c._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,sync:true};
-var _6e=dojo.xhrGet(_6d);
-_6e.addCallback(function(_6f){
+var _64={url:this._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk,sync:true};
+var _65=dojo.xhrGet(_64);
+_65.addCallback(function(_66){
 try{
-if(_6c._loadInProgress!==true&&!_6c._loadFinished){
-_6c._getItemsFromLoadedData(_6f);
-_6c._loadFinished=true;
+if(_63._loadInProgress!==true&&!_63._loadFinished){
+_63._getItemsFromLoadedData(_66);
+_63._loadFinished=true;
 }else{
-if(_6c._loadInProgress){
+if(_63._loadInProgress){
 throw new Error("dojo.data.ItemFileReadStore:  Unable to perform a synchronous load, an async load is in progress.");
 }
 }
 }
 catch(e){
-
 throw e;
 }
 });
-_6e.addErrback(function(_70){
-throw _70;
+_65.addErrback(function(_67){
+throw _67;
 });
 }else{
 if(this._jsonData){
-_6c._getItemsFromLoadedData(_6c._jsonData);
-_6c._jsonData=null;
-_6c._loadFinished=true;
+_63._getItemsFromLoadedData(_63._jsonData);
+_63._jsonData=null;
+_63._loadFinished=true;
 }
 }
 }});
diff --git a/dojo/data/ItemFileWriteStore.js b/dojo/data/ItemFileWriteStore.js
index c9071d7..3f4c01b 100644
--- a/dojo/data/ItemFileWriteStore.js
+++ b/dojo/data/ItemFileWriteStore.js
@@ -97,430 +97,415 @@ _e=[_e];
 _9[_d]=_e;
 if(this.referenceIntegrity){
 for(var i=0;i<_e.length;i++){
-var val=_e[i];
-if(this.isItem(val)){
-this._addReferenceToMap(val,_9,_d);
+var _f=_e[i];
+if(this.isItem(_f)){
+this._addReferenceToMap(_f,_9,_d);
 }
 }
 }
 }
 this.onNew(_9,_a);
 return _9;
-},_removeArrayElement:function(_11,_12){
-var _13=dojo.indexOf(_11,_12);
-if(_13!=-1){
-_11.splice(_13,1);
+},_removeArrayElement:function(_10,_11){
+var _12=dojo.indexOf(_10,_11);
+if(_12!=-1){
+_10.splice(_12,1);
 return true;
 }
 return false;
-},deleteItem:function(_14){
+},deleteItem:function(_13){
 this._assert(!this._saveInProgress);
-this._assertIsItem(_14);
-var _15=_14[this._itemNumPropName];
-var _16=this.getIdentity(_14);
+this._assertIsItem(_13);
+var _14=_13[this._itemNumPropName];
+var _15=this.getIdentity(_13);
 if(this.referenceIntegrity){
-var _17=this.getAttributes(_14);
-if(_14[this._reverseRefMap]){
-_14["backup_"+this._reverseRefMap]=dojo.clone(_14[this._reverseRefMap]);
+var _16=this.getAttributes(_13);
+if(_13[this._reverseRefMap]){
+_13["backup_"+this._reverseRefMap]=dojo.clone(_13[this._reverseRefMap]);
 }
-dojo.forEach(_17,function(_18){
-dojo.forEach(this.getValues(_14,_18),function(_19){
-if(this.isItem(_19)){
-if(!_14["backupRefs_"+this._reverseRefMap]){
-_14["backupRefs_"+this._reverseRefMap]=[];
+dojo.forEach(_16,function(_17){
+dojo.forEach(this.getValues(_13,_17),function(_18){
+if(this.isItem(_18)){
+if(!_13["backupRefs_"+this._reverseRefMap]){
+_13["backupRefs_"+this._reverseRefMap]=[];
 }
-_14["backupRefs_"+this._reverseRefMap].push({id:this.getIdentity(_19),attr:_18});
-this._removeReferenceFromMap(_19,_14,_18);
+_13["backupRefs_"+this._reverseRefMap].push({id:this.getIdentity(_18),attr:_17});
+this._removeReferenceFromMap(_18,_13,_17);
 }
 },this);
 },this);
-var _1a=_14[this._reverseRefMap];
-if(_1a){
-for(var _1b in _1a){
-var _1c=null;
+var _19=_13[this._reverseRefMap];
+if(_19){
+for(var _1a in _19){
+var _1b=null;
 if(this._itemsByIdentity){
-_1c=this._itemsByIdentity[_1b];
+_1b=this._itemsByIdentity[_1a];
 }else{
-_1c=this._arrayOfAllItems[_1b];
+_1b=this._arrayOfAllItems[_1a];
 }
-if(_1c){
-for(var _1d in _1a[_1b]){
-var _1e=this.getValues(_1c,_1d)||[];
-var _1f=dojo.filter(_1e,function(_20){
-return !(this.isItem(_20)&&this.getIdentity(_20)==_16);
+if(_1b){
+for(var _1c in _19[_1a]){
+var _1d=this.getValues(_1b,_1c)||[];
+var _1e=dojo.filter(_1d,function(_1f){
+return !(this.isItem(_1f)&&this.getIdentity(_1f)==_15);
 },this);
-this._removeReferenceFromMap(_14,_1c,_1d);
-if(_1f.length<_1e.length){
-this._setValueOrValues(_1c,_1d,_1f,true);
+this._removeReferenceFromMap(_13,_1b,_1c);
+if(_1e.length<_1d.length){
+this._setValueOrValues(_1b,_1c,_1e,true);
 }
 }
 }
 }
 }
 }
-this._arrayOfAllItems[_15]=null;
-_14[this._storeRefPropName]=null;
+this._arrayOfAllItems[_14]=null;
+_13[this._storeRefPropName]=null;
 if(this._itemsByIdentity){
-delete this._itemsByIdentity[_16];
+delete this._itemsByIdentity[_15];
 }
-this._pending._deletedItems[_16]=_14;
-if(_14[this._rootItemPropName]){
-this._removeArrayElement(this._arrayOfTopLevelItems,_14);
+this._pending._deletedItems[_15]=_13;
+if(_13[this._rootItemPropName]){
+this._removeArrayElement(this._arrayOfTopLevelItems,_13);
 }
-this.onDelete(_14);
+this.onDelete(_13);
 return true;
-},setValue:function(_21,_22,_23){
-return this._setValueOrValues(_21,_22,_23,true);
-},setValues:function(_24,_25,_26){
-return this._setValueOrValues(_24,_25,_26,true);
-},unsetAttribute:function(_27,_28){
-return this._setValueOrValues(_27,_28,[],true);
-},_setValueOrValues:function(_29,_2a,_2b,_2c){
+},setValue:function(_20,_21,_22){
+return this._setValueOrValues(_20,_21,_22,true);
+},setValues:function(_23,_24,_25){
+return this._setValueOrValues(_23,_24,_25,true);
+},unsetAttribute:function(_26,_27){
+return this._setValueOrValues(_26,_27,[],true);
+},_setValueOrValues:function(_28,_29,_2a,_2b){
 this._assert(!this._saveInProgress);
-this._assertIsItem(_29);
-this._assert(dojo.isString(_2a));
-this._assert(typeof _2b!=="undefined");
-var _2d=this._getIdentifierAttribute();
-if(_2a==_2d){
+this._assertIsItem(_28);
+this._assert(dojo.isString(_29));
+this._assert(typeof _2a!=="undefined");
+var _2c=this._getIdentifierAttribute();
+if(_29==_2c){
 throw new Error("ItemFileWriteStore does not have support for changing the value of an item's identifier.");
 }
-var _2e=this._getValueOrValues(_29,_2a);
-var _2f=this.getIdentity(_29);
-if(!this._pending._modifiedItems[_2f]){
-var _30={};
-for(var key in _29){
+var _2d=this._getValueOrValues(_28,_29);
+var _2e=this.getIdentity(_28);
+if(!this._pending._modifiedItems[_2e]){
+var _2f={};
+for(var key in _28){
 if((key===this._storeRefPropName)||(key===this._itemNumPropName)||(key===this._rootItemPropName)){
-_30[key]=_29[key];
+_2f[key]=_28[key];
 }else{
 if(key===this._reverseRefMap){
-_30[key]=dojo.clone(_29[key]);
+_2f[key]=dojo.clone(_28[key]);
 }else{
-_30[key]=_29[key].slice(0,_29[key].length);
+_2f[key]=_28[key].slice(0,_28[key].length);
 }
 }
 }
-this._pending._modifiedItems[_2f]=_30;
+this._pending._modifiedItems[_2e]=_2f;
 }
-var _32=false;
-if(dojo.isArray(_2b)&&_2b.length===0){
-_32=delete _29[_2a];
-_2b=undefined;
-if(this.referenceIntegrity&&_2e){
-var _33=_2e;
-if(!dojo.isArray(_33)){
-_33=[_33];
+var _30=false;
+if(dojo.isArray(_2a)&&_2a.length===0){
+_30=delete _28[_29];
+_2a=undefined;
+if(this.referenceIntegrity&&_2d){
+var _31=_2d;
+if(!dojo.isArray(_31)){
+_31=[_31];
 }
-for(var i=0;i<_33.length;i++){
-var _35=_33[i];
-if(this.isItem(_35)){
-this._removeReferenceFromMap(_35,_29,_2a);
+for(var i=0;i<_31.length;i++){
+var _32=_31[i];
+if(this.isItem(_32)){
+this._removeReferenceFromMap(_32,_28,_29);
 }
 }
 }
 }else{
-var _36;
-if(dojo.isArray(_2b)){
-var _37=_2b;
-_36=_2b.slice(0,_2b.length);
+var _33;
+if(dojo.isArray(_2a)){
+var _34=_2a;
+_33=_2a.slice(0,_2a.length);
 }else{
-_36=[_2b];
+_33=[_2a];
 }
 if(this.referenceIntegrity){
-if(_2e){
-var _33=_2e;
-if(!dojo.isArray(_33)){
-_33=[_33];
+if(_2d){
+var _31=_2d;
+if(!dojo.isArray(_31)){
+_31=[_31];
 }
 var map={};
-dojo.forEach(_33,function(_39){
-if(this.isItem(_39)){
-var id=this.getIdentity(_39);
+dojo.forEach(_31,function(_35){
+if(this.isItem(_35)){
+var id=this.getIdentity(_35);
 map[id.toString()]=true;
 }
 },this);
-dojo.forEach(_36,function(_3b){
-if(this.isItem(_3b)){
-var id=this.getIdentity(_3b);
+dojo.forEach(_33,function(_36){
+if(this.isItem(_36)){
+var id=this.getIdentity(_36);
 if(map[id.toString()]){
 delete map[id.toString()];
 }else{
-this._addReferenceToMap(_3b,_29,_2a);
+this._addReferenceToMap(_36,_28,_29);
 }
 }
 },this);
 for(var rId in map){
-var _3e;
+var _37;
 if(this._itemsByIdentity){
-_3e=this._itemsByIdentity[rId];
+_37=this._itemsByIdentity[rId];
 }else{
-_3e=this._arrayOfAllItems[rId];
+_37=this._arrayOfAllItems[rId];
 }
-this._removeReferenceFromMap(_3e,_29,_2a);
+this._removeReferenceFromMap(_37,_28,_29);
 }
 }else{
-for(var i=0;i<_36.length;i++){
-var _35=_36[i];
-if(this.isItem(_35)){
-this._addReferenceToMap(_35,_29,_2a);
+for(var i=0;i<_33.length;i++){
+var _32=_33[i];
+if(this.isItem(_32)){
+this._addReferenceToMap(_32,_28,_29);
 }
 }
 }
 }
-_29[_2a]=_36;
-_32=true;
+_28[_29]=_33;
+_30=true;
 }
-if(_2c){
-this.onSet(_29,_2a,_2e,_2b);
+if(_2b){
+this.onSet(_28,_29,_2d,_2a);
 }
-return _32;
-},_addReferenceToMap:function(_3f,_40,_41){
-var _42=this.getIdentity(_40);
-var _43=_3f[this._reverseRefMap];
-if(!_43){
-_43=_3f[this._reverseRefMap]={};
+return _30;
+},_addReferenceToMap:function(_38,_39,_3a){
+var _3b=this.getIdentity(_39);
+var _3c=_38[this._reverseRefMap];
+if(!_3c){
+_3c=_38[this._reverseRefMap]={};
 }
-var _44=_43[_42];
-if(!_44){
-_44=_43[_42]={};
+var _3d=_3c[_3b];
+if(!_3d){
+_3d=_3c[_3b]={};
 }
-_44[_41]=true;
-},_removeReferenceFromMap:function(_45,_46,_47){
-var _48=this.getIdentity(_46);
-var _49=_45[this._reverseRefMap];
-var _4a;
-if(_49){
-for(_4a in _49){
-if(_4a==_48){
-delete _49[_4a][_47];
-if(this._isEmpty(_49[_4a])){
-delete _49[_4a];
+_3d[_3a]=true;
+},_removeReferenceFromMap:function(_3e,_3f,_40){
+var _41=this.getIdentity(_3f);
+var _42=_3e[this._reverseRefMap];
+var _43;
+if(_42){
+for(_43 in _42){
+if(_43==_41){
+delete _42[_43][_40];
+if(this._isEmpty(_42[_43])){
+delete _42[_43];
 }
 }
 }
-if(this._isEmpty(_49)){
-delete _45[this._reverseRefMap];
+if(this._isEmpty(_42)){
+delete _3e[this._reverseRefMap];
 }
 }
 },_dumpReferenceMap:function(){
 var i;
 for(i=0;i<this._arrayOfAllItems.length;i++){
-var _4c=this._arrayOfAllItems[i];
-if(_4c&&_4c[this._reverseRefMap]){
-
+var _44=this._arrayOfAllItems[i];
+if(_44&&_44[this._reverseRefMap]){
 }
 }
-},_getValueOrValues:function(_4d,_4e){
-var _4f=undefined;
-if(this.hasAttribute(_4d,_4e)){
-var _50=this.getValues(_4d,_4e);
-if(_50.length==1){
-_4f=_50[0];
+},_getValueOrValues:function(_45,_46){
+var _47=undefined;
+if(this.hasAttribute(_45,_46)){
+var _48=this.getValues(_45,_46);
+if(_48.length==1){
+_47=_48[0];
 }else{
-_4f=_50;
+_47=_48;
 }
 }
-return _4f;
-},_flatten:function(_51){
-if(this.isItem(_51)){
-var _52=_51;
-var _53=this.getIdentity(_52);
-var _54={_reference:_53};
-return _54;
+return _47;
+},_flatten:function(_49){
+if(this.isItem(_49)){
+var _4a=_49;
+var _4b=this.getIdentity(_4a);
+var _4c={_reference:_4b};
+return _4c;
 }else{
-if(typeof _51==="object"){
-for(var _55 in this._datatypeMap){
-var _56=this._datatypeMap[_55];
-if(dojo.isObject(_56)&&!dojo.isFunction(_56)){
-if(_51 instanceof _56.type){
-if(!_56.serialize){
-throw new Error("ItemFileWriteStore:  No serializer defined for type mapping: ["+_55+"]");
+if(typeof _49==="object"){
+for(var _4d in this._datatypeMap){
+var _4e=this._datatypeMap[_4d];
+if(dojo.isObject(_4e)&&!dojo.isFunction(_4e)){
+if(_49 instanceof _4e.type){
+if(!_4e.serialize){
+throw new Error("ItemFileWriteStore:  No serializer defined for type mapping: ["+_4d+"]");
 }
-return {_type:_55,_value:_56.serialize(_51)};
+return {_type:_4d,_value:_4e.serialize(_49)};
 }
 }else{
-if(_51 instanceof _56){
-return {_type:_55,_value:_51.toString()};
+if(_49 instanceof _4e){
+return {_type:_4d,_value:_49.toString()};
 }
 }
 }
 }
-return _51;
+return _49;
 }
 },_getNewFileContentString:function(){
-var _57={};
-var _58=this._getIdentifierAttribute();
-if(_58!==Number){
-_57.identifier=_58;
+var _4f={};
+var _50=this._getIdentifierAttribute();
+if(_50!==Number){
+_4f.identifier=_50;
 }
 if(this._labelAttr){
-_57.label=this._labelAttr;
+_4f.label=this._labelAttr;
 }
-_57.items=[];
+_4f.items=[];
 for(var i=0;i<this._arrayOfAllItems.length;++i){
-var _5a=this._arrayOfAllItems[i];
-if(_5a!==null){
-var _5b={};
-for(var key in _5a){
+var _51=this._arrayOfAllItems[i];
+if(_51!==null){
+var _52={};
+for(var key in _51){
 if(key!==this._storeRefPropName&&key!==this._itemNumPropName&&key!==this._reverseRefMap&&key!==this._rootItemPropName){
-var _5d=key;
-var _5e=this.getValues(_5a,_5d);
-if(_5e.length==1){
-_5b[_5d]=this._flatten(_5e[0]);
+var _53=key;
+var _54=this.getValues(_51,_53);
+if(_54.length==1){
+_52[_53]=this._flatten(_54[0]);
 }else{
-var _5f=[];
-for(var j=0;j<_5e.length;++j){
-_5f.push(this._flatten(_5e[j]));
-_5b[_5d]=_5f;
+var _55=[];
+for(var j=0;j<_54.length;++j){
+_55.push(this._flatten(_54[j]));
+_52[_53]=_55;
 }
 }
 }
 }
-_57.items.push(_5b);
+_4f.items.push(_52);
 }
 }
-var _61=true;
-return dojo.toJson(_57,_61);
-},_isEmpty:function(_62){
-var _63=true;
-if(dojo.isObject(_62)){
+var _56=true;
+return dojo.toJson(_4f,_56);
+},_isEmpty:function(_57){
+var _58=true;
+if(dojo.isObject(_57)){
 var i;
-for(i in _62){
-_63=false;
+for(i in _57){
+_58=false;
 break;
 }
 }else{
-if(dojo.isArray(_62)){
-if(_62.length>0){
-_63=false;
+if(dojo.isArray(_57)){
+if(_57.length>0){
+_58=false;
 }
 }
 }
-return _63;
-},save:function(_65){
+return _58;
+},save:function(_59){
 this._assert(!this._saveInProgress);
 this._saveInProgress=true;
-var _66=this;
-var _67=function(){
-_66._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};
-_66._saveInProgress=false;
-if(_65&&_65.onComplete){
-var _68=_65.scope||dojo.global;
-_65.onComplete.call(_68);
+var _5a=this;
+var _5b=function(){
+_5a._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};
+_5a._saveInProgress=false;
+if(_59&&_59.onComplete){
+var _5c=_59.scope||dojo.global;
+_59.onComplete.call(_5c);
 }
 };
-var _69=function(err){
-_66._saveInProgress=false;
-if(_65&&_65.onError){
-var _6b=_65.scope||dojo.global;
-_65.onError.call(_6b,err);
+var _5d=function(err){
+_5a._saveInProgress=false;
+if(_59&&_59.onError){
+var _5e=_59.scope||dojo.global;
+_59.onError.call(_5e,err);
 }
 };
 if(this._saveEverything){
-var _6c=this._getNewFileContentString();
-this._saveEverything(_67,_69,_6c);
+var _5f=this._getNewFileContentString();
+this._saveEverything(_5b,_5d,_5f);
 }
 if(this._saveCustom){
-this._saveCustom(_67,_69);
+this._saveCustom(_5b,_5d);
 }
 if(!this._saveEverything&&!this._saveCustom){
-_67();
+_5b();
 }
 },revert:function(){
 this._assert(!this._saveInProgress);
-var _6d;
-for(_6d in this._pending._modifiedItems){
-var _6e=this._pending._modifiedItems[_6d];
-var _6f=null;
+var _60;
+for(_60 in this._pending._modifiedItems){
+var _61=this._pending._modifiedItems[_60];
+var _62=null;
 if(this._itemsByIdentity){
-_6f=this._itemsByIdentity[_6d];
+_62=this._itemsByIdentity[_60];
 }else{
-_6f=this._arrayOfAllItems[_6d];
-}
-_6e[this._storeRefPropName]=this;
-_6f[this._storeRefPropName]=null;
-var _70=_6f[this._itemNumPropName];
-this._arrayOfAllItems[_70]=_6e;
-if(_6f[this._rootItemPropName]){
-var i;
-for(i=0;i<this._arrayOfTopLevelItems.length;i++){
-var _72=this._arrayOfTopLevelItems[i];
-if(this.getIdentity(_72)==_6d){
-this._arrayOfTopLevelItems[i]=_6e;
-break;
-}
+_62=this._arrayOfAllItems[_60];
 }
+_61[this._storeRefPropName]=this;
+for(key in _62){
+delete _62[key];
 }
-if(this._itemsByIdentity){
-this._itemsByIdentity[_6d]=_6e;
-}
+dojo.mixin(_62,_61);
 }
-var _73;
-for(_6d in this._pending._deletedItems){
-_73=this._pending._deletedItems[_6d];
-_73[this._storeRefPropName]=this;
-var _74=_73[this._itemNumPropName];
-if(_73["backup_"+this._reverseRefMap]){
-_73[this._reverseRefMap]=_73["backup_"+this._reverseRefMap];
-delete _73["backup_"+this._reverseRefMap];
+var _63;
+for(_60 in this._pending._deletedItems){
+_63=this._pending._deletedItems[_60];
+_63[this._storeRefPropName]=this;
+var _64=_63[this._itemNumPropName];
+if(_63["backup_"+this._reverseRefMap]){
+_63[this._reverseRefMap]=_63["backup_"+this._reverseRefMap];
+delete _63["backup_"+this._reverseRefMap];
 }
-this._arrayOfAllItems[_74]=_73;
+this._arrayOfAllItems[_64]=_63;
 if(this._itemsByIdentity){
-this._itemsByIdentity[_6d]=_73;
+this._itemsByIdentity[_60]=_63;
 }
-if(_73[this._rootItemPropName]){
-this._arrayOfTopLevelItems.push(_73);
+if(_63[this._rootItemPropName]){
+this._arrayOfTopLevelItems.push(_63);
 }
 }
-for(_6d in this._pending._deletedItems){
-_73=this._pending._deletedItems[_6d];
-if(_73["backupRefs_"+this._reverseRefMap]){
-dojo.forEach(_73["backupRefs_"+this._reverseRefMap],function(_75){
-var _76;
+for(_60 in this._pending._deletedItems){
+_63=this._pending._deletedItems[_60];
+if(_63["backupRefs_"+this._reverseRefMap]){
+dojo.forEach(_63["backupRefs_"+this._reverseRefMap],function(_65){
+var _66;
 if(this._itemsByIdentity){
-_76=this._itemsByIdentity[_75.id];
+_66=this._itemsByIdentity[_65.id];
 }else{
-_76=this._arrayOfAllItems[_75.id];
+_66=this._arrayOfAllItems[_65.id];
 }
-this._addReferenceToMap(_76,_73,_75.attr);
+this._addReferenceToMap(_66,_63,_65.attr);
 },this);
-delete _73["backupRefs_"+this._reverseRefMap];
+delete _63["backupRefs_"+this._reverseRefMap];
 }
 }
-for(_6d in this._pending._newItems){
-var _77=this._pending._newItems[_6d];
-_77[this._storeRefPropName]=null;
-this._arrayOfAllItems[_77[this._itemNumPropName]]=null;
-if(_77[this._rootItemPropName]){
-this._removeArrayElement(this._arrayOfTopLevelItems,_77);
+for(_60 in this._pending._newItems){
+var _67=this._pending._newItems[_60];
+_67[this._storeRefPropName]=null;
+this._arrayOfAllItems[_67[this._itemNumPropName]]=null;
+if(_67[this._rootItemPropName]){
+this._removeArrayElement(this._arrayOfTopLevelItems,_67);
 }
 if(this._itemsByIdentity){
-delete this._itemsByIdentity[_6d];
+delete this._itemsByIdentity[_60];
 }
 }
 this._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};
 return true;
-},isDirty:function(_78){
-if(_78){
-var _79=this.getIdentity(_78);
-return new Boolean(this._pending._newItems[_79]||this._pending._modifiedItems[_79]||this._pending._deletedItems[_79]).valueOf();
+},isDirty:function(_68){
+if(_68){
+var _69=this.getIdentity(_68);
+return new Boolean(this._pending._newItems[_69]||this._pending._modifiedItems[_69]||this._pending._deletedItems[_69]).valueOf();
 }else{
 if(!this._isEmpty(this._pending._newItems)||!this._isEmpty(this._pending._modifiedItems)||!this._isEmpty(this._pending._deletedItems)){
 return true;
 }
 return false;
 }
-},onSet:function(_7a,_7b,_7c,_7d){
-},onNew:function(_7e,_7f){
-},onDelete:function(_80){
-},close:function(_81){
+},onSet:function(_6a,_6b,_6c,_6d){
+},onNew:function(_6e,_6f){
+},onDelete:function(_70){
+},close:function(_71){
 if(this.clearOnClose){
 if(!this.isDirty()){
 this.inherited(arguments);
 }else{
-if(this._jsonFileUrl!==""){
 throw new Error("dojo.data.ItemFileWriteStore: There are unsaved changes present in the store.  Please save or revert the changes before invoking close.");
 }
 }
-}
 }});
 }
diff --git a/dojo/data/util/simpleFetch.js b/dojo/data/util/simpleFetch.js
index 69fa0f6..4e96d3e 100644
--- a/dojo/data/util/simpleFetch.js
+++ b/dojo/data/util/simpleFetch.js
@@ -44,18 +44,18 @@ _8.sort(dojo.data.util.sorter.createSortFunction(_9.sort,_2));
 }
 if(_9.onItem){
 for(var i=_c;(i<_8.length)&&(i<_d);++i){
-var _10=_8[i];
+var _f=_8[i];
 if(!_b){
-_9.onItem.call(_e,_10,_9);
+_9.onItem.call(_e,_f,_9);
 }
 }
 }
 if(_9.onComplete&&!_b){
-var _11=null;
+var _10=null;
 if(!_9.onItem){
-_11=_8.slice(_c,_d);
+_10=_8.slice(_c,_d);
 }
-_9.onComplete.call(_e,_11,_9);
+_9.onComplete.call(_e,_10,_9);
 }
 };
 this._fetchItems(_1,_7,_3);
diff --git a/dojo/data/util/sorter.js b/dojo/data/util/sorter.js
index a8699e5..5c8dcb4 100644
--- a/dojo/data/util/sorter.js
+++ b/dojo/data/util/sorter.js
@@ -25,35 +25,37 @@ r=1;
 }
 return r;
 };
-dojo.data.util.sorter.createSortFunction=function(_4,_5){
-var _6=[];
-function _7(_8,_9){
-return function(_a,_b){
-var a=_5.getValue(_a,_8);
-var b=_5.getValue(_b,_8);
-var _e=null;
-if(_5.comparatorMap){
-if(typeof _8!=="string"){
-_8=_5.getIdentity(_8);
-}
-_e=_5.comparatorMap[_8]||dojo.data.util.sorter.basicComparator;
-}
-_e=_e||dojo.data.util.sorter.basicComparator;
-return _9*_e(a,b);
+dojo.data.util.sorter.createSortFunction=function(_1,_2){
+var _3=[];
+function _4(_5,_6,_7,s){
+return function(_8,_9){
+var a=s.getValue(_8,_5);
+var b=s.getValue(_9,_5);
+return _6*_7(a,b);
 };
 };
-var _f;
-for(var i=0;i<_4.length;i++){
-_f=_4[i];
-if(_f.attribute){
-var _11=(_f.descending)?-1:1;
-_6.push(_7(_f.attribute,_11));
+var _a;
+var _b=_2.comparatorMap;
+var bc=dojo.data.util.sorter.basicComparator;
+for(var i=0;i<_1.length;i++){
+_a=_1[i];
+var _c=_a.attribute;
+if(_c){
+var _d=(_a.descending)?-1:1;
+var _e=bc;
+if(_b){
+if(typeof _c!=="string"&&("toString" in _c)){
+_c=_c.toString();
+}
+_e=_b[_c]||bc;
+}
+_3.push(_4(_c,_d,_e,_2));
 }
 }
-return function(_12,_13){
+return function(_f,_10){
 var i=0;
-while(i<_6.length){
-var ret=_6[i++](_12,_13);
+while(i<_3.length){
+var ret=_3[i++](_f,_10);
 if(ret!==0){
 return ret;
 }
diff --git a/dojo/date.js b/dojo/date.js
index 25e3ed5..67a8afd 100644
--- a/dojo/date.js
+++ b/dojo/date.js
@@ -23,196 +23,191 @@ return !(_5%400)||(!(_5%4)&&!!(_5%100));
 dojo.date.getTimezoneName=function(_6){
 var _7=_6.toString();
 var tz="";
-var _9;
-var _a=_7.indexOf("(");
-if(_a>-1){
-tz=_7.substring(++_a,_7.indexOf(")"));
+var _8;
+var _9=_7.indexOf("(");
+if(_9>-1){
+tz=_7.substring(++_9,_7.indexOf(")"));
 }else{
-var _b=/([A-Z\/]+) \d{4}$/;
-if((_9=_7.match(_b))){
-tz=_9[1];
+var _a=/([A-Z\/]+) \d{4}$/;
+if((_8=_7.match(_a))){
+tz=_8[1];
 }else{
 _7=_6.toLocaleString();
-_b=/ ([A-Z\/]+)$/;
-if((_9=_7.match(_b))){
-tz=_9[1];
+_a=/ ([A-Z\/]+)$/;
+if((_8=_7.match(_a))){
+tz=_8[1];
 }
 }
 }
 return (tz=="AM"||tz=="PM")?"":tz;
 };
-dojo.date.compare=function(_c,_d,_e){
-_c=new Date(Number(_c));
-_d=new Date(Number(_d||new Date()));
-if(_e!=="undefined"){
-if(_e=="date"){
+dojo.date.compare=function(_b,_c,_d){
+_b=new Date(+_b);
+_c=new Date(+(_c||new Date()));
+if(_d=="date"){
+_b.setHours(0,0,0,0);
 _c.setHours(0,0,0,0);
-_d.setHours(0,0,0,0);
 }else{
-if(_e=="time"){
+if(_d=="time"){
+_b.setFullYear(0,0,0);
 _c.setFullYear(0,0,0);
-_d.setFullYear(0,0,0);
 }
 }
-}
-if(_c>_d){
+if(_b>_c){
 return 1;
 }
-if(_c<_d){
+if(_b<_c){
 return -1;
 }
 return 0;
 };
-dojo.date.add=function(_f,_10,_11){
-var sum=new Date(Number(_f));
-var _13=false;
-var _14="Date";
-switch(_10){
+dojo.date.add=function(_e,_f,_10){
+var sum=new Date(+_e);
+var _11=false;
+var _12="Date";
+switch(_f){
 case "day":
 break;
 case "weekday":
-var _15,_16;
-var mod=_11%5;
+var _13,_14;
+var mod=_10%5;
 if(!mod){
-_15=(_11>0)?5:-5;
-_16=(_11>0)?((_11-5)/5):((_11+5)/5);
+_13=(_10>0)?5:-5;
+_14=(_10>0)?((_10-5)/5):((_10+5)/5);
 }else{
-_15=mod;
-_16=parseInt(_11/5);
+_13=mod;
+_14=parseInt(_10/5);
 }
-var _18=_f.getDay();
+var _15=_e.getDay();
 var adj=0;
-if(_18==6&&_11>0){
+if(_15==6&&_10>0){
 adj=1;
 }else{
-if(_18==0&&_11<0){
+if(_15==0&&_10<0){
 adj=-1;
 }
 }
-var _1a=_18+_15;
-if(_1a==0||_1a==6){
-adj=(_11>0)?2:-2;
+var _16=_15+_13;
+if(_16==0||_16==6){
+adj=(_10>0)?2:-2;
 }
-_11=(7*_16)+_15+adj;
+_10=(7*_14)+_13+adj;
 break;
 case "year":
-_14="FullYear";
-_13=true;
+_12="FullYear";
+_11=true;
 break;
 case "week":
-_11*=7;
+_10*=7;
 break;
 case "quarter":
-_11*=3;
+_10*=3;
 case "month":
-_13=true;
-_14="Month";
+_11=true;
+_12="Month";
 break;
-case "hour":
-case "minute":
-case "second":
-case "millisecond":
-_14="UTC"+_10.charAt(0).toUpperCase()+_10.substring(1)+"s";
+default:
+_12="UTC"+_f.charAt(0).toUpperCase()+_f.substring(1)+"s";
 }
-if(_14){
-sum["set"+_14](sum["get"+_14]()+_11);
+if(_12){
+sum["set"+_12](sum["get"+_12]()+_10);
 }
-if(_13&&(sum.getDate()<_f.getDate())){
+if(_11&&(sum.getDate()<_e.getDate())){
 sum.setDate(0);
 }
 return sum;
 };
-dojo.date.difference=function(_1b,_1c,_1d){
-_1c=_1c||new Date();
-_1d=_1d||"day";
-var _1e=_1c.getFullYear()-_1b.getFullYear();
-var _1f=1;
-switch(_1d){
+dojo.date.difference=function(_17,_18,_19){
+_18=_18||new Date();
+_19=_19||"day";
+var _1a=_18.getFullYear()-_17.getFullYear();
+var _1b=1;
+switch(_19){
 case "quarter":
-var m1=_1b.getMonth();
-var m2=_1c.getMonth();
+var m1=_17.getMonth();
+var m2=_18.getMonth();
 var q1=Math.floor(m1/3)+1;
 var q2=Math.floor(m2/3)+1;
-q2+=(_1e*4);
-_1f=q2-q1;
+q2+=(_1a*4);
+_1b=q2-q1;
 break;
 case "weekday":
-var _24=Math.round(dojo.date.difference(_1b,_1c,"day"));
-var _25=parseInt(dojo.date.difference(_1b,_1c,"week"));
-var mod=_24%7;
+var _1c=Math.round(dojo.date.difference(_17,_18,"day"));
+var _1d=parseInt(dojo.date.difference(_17,_18,"week"));
+var mod=_1c%7;
 if(mod==0){
-_24=_25*5;
+_1c=_1d*5;
 }else{
 var adj=0;
-var _28=_1b.getDay();
-var _29=_1c.getDay();
-_25=parseInt(_24/7);
-mod=_24%7;
-var _2a=new Date(_1b);
-_2a.setDate(_2a.getDate()+(_25*7));
-var _2b=_2a.getDay();
-if(_24>0){
+var _1e=_17.getDay();
+var _1f=_18.getDay();
+_1d=parseInt(_1c/7);
+mod=_1c%7;
+var _20=new Date(_17);
+_20.setDate(_20.getDate()+(_1d*7));
+var _21=_20.getDay();
+if(_1c>0){
 switch(true){
-case _28==6:
+case _1e==6:
 adj=-1;
 break;
-case _28==0:
+case _1e==0:
 adj=0;
 break;
-case _29==6:
+case _1f==6:
 adj=-1;
 break;
-case _29==0:
+case _1f==0:
 adj=-2;
 break;
-case (_2b+mod)>5:
+case (_21+mod)>5:
 adj=-2;
 }
 }else{
-if(_24<0){
+if(_1c<0){
 switch(true){
-case _28==6:
+case _1e==6:
 adj=0;
 break;
-case _28==0:
+case _1e==0:
 adj=1;
 break;
-case _29==6:
+case _1f==6:
 adj=2;
 break;
-case _29==0:
+case _1f==0:
 adj=1;
 break;
-case (_2b+mod)<0:
+case (_21+mod)<0:
 adj=2;
 }
 }
 }
-_24+=adj;
-_24-=(_25*2);
+_1c+=adj;
+_1c-=(_1d*2);
 }
-_1f=_24;
+_1b=_1c;
 break;
 case "year":
-_1f=_1e;
+_1b=_1a;
 break;
 case "month":
-_1f=(_1c.getMonth()-_1b.getMonth())+(_1e*12);
+_1b=(_18.getMonth()-_17.getMonth())+(_1a*12);
 break;
 case "week":
-_1f=parseInt(dojo.date.difference(_1b,_1c,"day")/7);
+_1b=parseInt(dojo.date.difference(_17,_18,"day")/7);
 break;
 case "day":
-_1f/=24;
+_1b/=24;
 case "hour":
-_1f/=60;
+_1b/=60;
 case "minute":
-_1f/=60;
+_1b/=60;
 case "second":
-_1f/=1000;
+_1b/=1000;
 case "millisecond":
-_1f*=_1c.getTime()-_1b.getTime();
+_1b*=_18.getTime()-_17.getTime();
 }
-return Math.round(_1f);
+return Math.round(_1b);
 };
 }
diff --git a/dojo/date/locale.js b/dojo/date/locale.js
index 1e3646f..13121b6 100644
--- a/dojo/date/locale.js
+++ b/dojo/date/locale.js
@@ -17,10 +17,7 @@ dojo.requireLocalization("dojo.cldr","gregorian",null,"ROOT,ar,ca,cs,da,de,el,en
 (function(){
 function _1(_2,_3,_4,_5){
 return _5.replace(/([a-z])\1*/ig,function(_6){
-var s,_8;
-var c=_6.charAt(0);
-var l=_6.length;
-var _b=["abbr","wide","narrow"];
+var s,_7,c=_6.charAt(0),l=_6.length,_8=["abbr","wide","narrow"];
 switch(c){
 case "G":
 s=_3[(l<4)?"eraAbbr":"eraNames"][_2.getFullYear()<0?0:1];
@@ -31,56 +28,56 @@ switch(l){
 case 1:
 break;
 case 2:
-if(!_4){
+if(!_4.fullYear){
 s=String(s);
 s=s.substr(s.length-2);
 break;
 }
 default:
-_8=true;
+_7=true;
 }
 break;
 case "Q":
 case "q":
 s=Math.ceil((_2.getMonth()+1)/3);
-_8=true;
+_7=true;
 break;
 case "M":
 var m=_2.getMonth();
 if(l<3){
 s=m+1;
-_8=true;
+_7=true;
 }else{
-var _d=["months","format",_b[l-3]].join("-");
-s=_3[_d][m];
+var _9=["months","format",_8[l-3]].join("-");
+s=_3[_9][m];
 }
 break;
 case "w":
-var _e=0;
-s=dojo.date.locale._getWeekOfYear(_2,_e);
-_8=true;
+var _a=0;
+s=dojo.date.locale._getWeekOfYear(_2,_a);
+_7=true;
 break;
 case "d":
 s=_2.getDate();
-_8=true;
+_7=true;
 break;
 case "D":
 s=dojo.date.locale._getDayOfYear(_2);
-_8=true;
+_7=true;
 break;
 case "E":
 var d=_2.getDay();
 if(l<3){
 s=d+1;
-_8=true;
+_7=true;
 }else{
-var _10=["days","format",_b[l-3]].join("-");
-s=_3[_10][d];
+var _b=["days","format",_8[l-3]].join("-");
+s=_3[_b][d];
 }
 break;
 case "a":
-var _11=(_2.getHours()<12)?"am":"pm";
-s=_3[_11];
+var _c=(_2.getHours()<12)?"am":"pm";
+s=_3[_c];
 break;
 case "h":
 case "H":
@@ -101,30 +98,30 @@ case "k":
 s=h||24;
 break;
 }
-_8=true;
+_7=true;
 break;
 case "m":
 s=_2.getMinutes();
-_8=true;
+_7=true;
 break;
 case "s":
 s=_2.getSeconds();
-_8=true;
+_7=true;
 break;
 case "S":
 s=Math.round(_2.getMilliseconds()*Math.pow(10,l-3));
-_8=true;
+_7=true;
 break;
 case "v":
 case "z":
-s=dojo.date.getTimezoneName(_2);
+s=dojo.date.locale._getZone(_2,true,_4);
 if(s){
 break;
 }
 l=4;
 case "Z":
-var _13=_2.getTimezoneOffset();
-var tz=[(_13<=0?"+":"-"),dojo.string.pad(Math.floor(Math.abs(_13)/60),2),dojo.string.pad(Math.abs(_13)%60,2)];
+var _d=dojo.date.locale._getZone(_2,false,_4);
+var tz=[(_d<=0?"+":"-"),dojo.string.pad(Math.floor(Math.abs(_d)/60),2),dojo.string.pad(Math.abs(_d)%60,2)];
 if(l==4){
 tz.splice(0,0,"GMT");
 tz.splice(3,0,":");
@@ -134,152 +131,140 @@ break;
 default:
 throw new Error("dojo.date.locale.format: invalid pattern char: "+_5);
 }
-if(_8){
+if(_7){
 s=dojo.string.pad(s,l);
 }
 return s;
 });
 };
-dojo.date.locale.format=function(_15,_16){
-_16=_16||{};
-var _17=dojo.i18n.normalizeLocale(_16.locale);
-var _18=_16.formatLength||"short";
-var _19=dojo.date.locale._getGregorianBundle(_17);
-var str=[];
-var _1b=dojo.hitch(this,_1,_15,_19,_16.fullYear);
-if(_16.selector=="year"){
-var _1c=_15.getFullYear();
-if(_17.match(/^zh|^ja/)){
-_1c+="年";
-}
-return _1c;
-}
-if(_16.selector!="time"){
-var _1d=_16.datePattern||_19["dateFormat-"+_18];
-if(_1d){
-str.push(_1e(_1d,_1b));
-}
-}
-if(_16.selector!="date"){
-var _1f=_16.timePattern||_19["timeFormat-"+_18];
-if(_1f){
-str.push(_1e(_1f,_1b));
-}
-}
-var _20=str.join(" ");
-return _20;
+dojo.date.locale._getZone=function(_e,_f,_10){
+if(_f){
+return dojo.date.getTimezoneName(_e);
+}else{
+return _e.getTimezoneOffset();
+}
+};
+dojo.date.locale.format=function(_11,_12){
+_12=_12||{};
+var _13=dojo.i18n.normalizeLocale(_12.locale),_14=_12.formatLength||"short",_15=dojo.date.locale._getGregorianBundle(_13),str=[],_16=dojo.hitch(this,_1,_11,_15,_12);
+if(_12.selector=="year"){
+return _17(_15["dateFormatItem-yyyy"]||"yyyy",_16);
+}
+var _18;
+if(_12.selector!="date"){
+_18=_12.timePattern||_15["timeFormat-"+_14];
+if(_18){
+str.push(_17(_18,_16));
+}
+}
+if(_12.selector!="time"){
+_18=_12.datePattern||_15["dateFormat-"+_14];
+if(_18){
+str.push(_17(_18,_16));
+}
+}
+return str.length==1?str[0]:_15["dateTimeFormat-"+_14].replace(/\{(\d+)\}/g,function(_19,key){
+return str[key];
+});
 };
-dojo.date.locale.regexp=function(_21){
-return dojo.date.locale._parseInfo(_21).regexp;
+dojo.date.locale.regexp=function(_1a){
+return dojo.date.locale._parseInfo(_1a).regexp;
 };
-dojo.date.locale._parseInfo=function(_22){
-_22=_22||{};
-var _23=dojo.i18n.normalizeLocale(_22.locale);
-var _24=dojo.date.locale._getGregorianBundle(_23);
-var _25=_22.formatLength||"short";
-var _26=_22.datePattern||_24["dateFormat-"+_25];
-var _27=_22.timePattern||_24["timeFormat-"+_25];
-var _28;
-if(_22.selector=="date"){
-_28=_26;
+dojo.date.locale._parseInfo=function(_1b){
+_1b=_1b||{};
+var _1c=dojo.i18n.normalizeLocale(_1b.locale),_1d=dojo.date.locale._getGregorianBundle(_1c),_1e=_1b.formatLength||"short",_1f=_1b.datePattern||_1d["dateFormat-"+_1e],_20=_1b.timePattern||_1d["timeFormat-"+_1e],_21;
+if(_1b.selector=="date"){
+_21=_1f;
 }else{
-if(_22.selector=="time"){
-_28=_27;
+if(_1b.selector=="time"){
+_21=_20;
 }else{
-_28=_26+" "+_27;
+_21=_1d["dateTimeFormat-"+_1e].replace(/\{(\d+)\}/g,function(_22,key){
+return [_20,_1f][key];
+});
 }
 }
-var _29=[];
-var re=_1e(_28,dojo.hitch(this,_2b,_29,_24,_22));
-return {regexp:re,tokens:_29,bundle:_24};
+var _23=[],re=_17(_21,dojo.hitch(this,_24,_23,_1d,_1b));
+return {regexp:re,tokens:_23,bundle:_1d};
 };
-dojo.date.locale.parse=function(_2c,_2d){
-var _2e=dojo.date.locale._parseInfo(_2d);
-var _2f=_2e.tokens,_30=_2e.bundle;
-var re=new RegExp("^"+_2e.regexp+"$",_2e.strict?"":"i");
-var _32=re.exec(_2c);
-if(!_32){
+dojo.date.locale.parse=function(_25,_26){
+var _27=dojo.date.locale._parseInfo(_26),_28=_27.tokens,_29=_27.bundle,re=new RegExp("^"+_27.regexp+"$",_27.strict?"":"i"),_2a=re.exec(_25);
+if(!_2a){
 return null;
 }
-var _33=["abbr","wide","narrow"];
-var _34=[1970,0,1,0,0,0,0];
-var _35="";
-var _36=dojo.every(_32,function(v,i){
+var _2b=["abbr","wide","narrow"],_2c=[1970,0,1,0,0,0,0],_2d="",_2e=dojo.every(_2a,function(v,i){
 if(!i){
 return true;
 }
-var _39=_2f[i-1];
-var l=_39.length;
-switch(_39.charAt(0)){
+var _2f=_28[i-1];
+var l=_2f.length;
+switch(_2f.charAt(0)){
 case "y":
-if(l!=2&&_2d.strict){
-_34[0]=v;
+if(l!=2&&_26.strict){
+_2c[0]=v;
 }else{
 if(v<100){
 v=Number(v);
-var _3b=""+new Date().getFullYear();
-var _3c=_3b.substring(0,2)*100;
-var _3d=Math.min(Number(_3b.substring(2,4))+20,99);
-var num=(v<_3d)?_3c+v:_3c-100+v;
-_34[0]=num;
+var _30=""+new Date().getFullYear(),_31=_30.substring(0,2)*100,_32=Math.min(Number(_30.substring(2,4))+20,99),num=(v<_32)?_31+v:_31-100+v;
+_2c[0]=num;
 }else{
-if(_2d.strict){
+if(_26.strict){
 return false;
 }
-_34[0]=v;
+_2c[0]=v;
 }
 }
 break;
 case "M":
 if(l>2){
-var _3f=_30["months-format-"+_33[l-3]].concat();
-if(!_2d.strict){
+var _33=_29["months-format-"+_2b[l-3]].concat();
+if(!_26.strict){
 v=v.replace(".","").toLowerCase();
-_3f=dojo.map(_3f,function(s){
+_33=dojo.map(_33,function(s){
 return s.replace(".","").toLowerCase();
 });
 }
-v=dojo.indexOf(_3f,v);
+v=dojo.indexOf(_33,v);
 if(v==-1){
 return false;
 }
 }else{
 v--;
 }
-_34[1]=v;
+_2c[1]=v;
 break;
 case "E":
 case "e":
-var _41=_30["days-format-"+_33[l-3]].concat();
-if(!_2d.strict){
+var _34=_29["days-format-"+_2b[l-3]].concat();
+if(!_26.strict){
 v=v.toLowerCase();
-_41=dojo.map(_41,function(d){
+_34=dojo.map(_34,function(d){
 return d.toLowerCase();
 });
 }
-v=dojo.indexOf(_41,v);
+v=dojo.indexOf(_34,v);
 if(v==-1){
 return false;
 }
 break;
 case "D":
-_34[1]=0;
+_2c[1]=0;
 case "d":
-_34[2]=v;
+_2c[2]=v;
 break;
 case "a":
-var am=_2d.am||_30.am;
-var pm=_2d.pm||_30.pm;
-if(!_2d.strict){
-var _45=/\./g;
-v=v.replace(_45,"").toLowerCase();
-am=am.replace(_45,"").toLowerCase();
-pm=pm.replace(_45,"").toLowerCase();
-}
-if(_2d.strict&&v!=am&&v!=pm){
+var am=_26.am||_29.am;
+var pm=_26.pm||_29.pm;
+if(!_26.strict){
+var _35=/\./g;
+v=v.replace(_35,"").toLowerCase();
+am=am.replace(_35,"").toLowerCase();
+pm=pm.replace(_35,"").toLowerCase();
+}
+if(_26.strict&&v!=am&&v!=pm){
 return false;
 }
-_35=(v==pm)?"p":(v==am)?"a":"";
+_2d=(v==pm)?"p":(v==am)?"a":"";
 break;
 case "K":
 if(v==24){
@@ -291,70 +276,66 @@ case "k":
 if(v>23){
 return false;
 }
-_34[3]=v;
+_2c[3]=v;
 break;
 case "m":
-_34[4]=v;
+_2c[4]=v;
 break;
 case "s":
-_34[5]=v;
+_2c[5]=v;
 break;
 case "S":
-_34[6]=v;
+_2c[6]=v;
 }
 return true;
 });
-var _46=+_34[3];
-if(_35==="p"&&_46<12){
-_34[3]=_46+12;
+var _36=+_2c[3];
+if(_2d==="p"&&_36<12){
+_2c[3]=_36+12;
 }else{
-if(_35==="a"&&_46==12){
-_34[3]=0;
+if(_2d==="a"&&_36==12){
+_2c[3]=0;
 }
 }
-var _47=new Date(_34[0],_34[1],_34[2],_34[3],_34[4],_34[5],_34[6]);
-if(_2d.strict){
-_47.setFullYear(_34[0]);
+var _37=new Date(_2c[0],_2c[1],_2c[2],_2c[3],_2c[4],_2c[5],_2c[6]);
+if(_26.strict){
+_37.setFullYear(_2c[0]);
 }
-var _48=_2f.join(""),_49=_48.indexOf("d")!=-1,_4a=_48.indexOf("M")!=-1;
-if(!_36||(_4a&&_47.getMonth()>_34[1])||(_49&&_47.getDate()>_34[2])){
+var _38=_28.join(""),_39=_38.indexOf("d")!=-1,_3a=_38.indexOf("M")!=-1;
+if(!_2e||(_3a&&_37.getMonth()>_2c[1])||(_39&&_37.getDate()>_2c[2])){
 return null;
 }
-if((_4a&&_47.getMonth()<_34[1])||(_49&&_47.getDate()<_34[2])){
-_47=dojo.date.add(_47,"hour",1);
+if((_3a&&_37.getMonth()<_2c[1])||(_39&&_37.getDate()<_2c[2])){
+_37=dojo.date.add(_37,"hour",1);
 }
-return _47;
+return _37;
 };
-function _1e(_4b,_4c,_4d,_4e){
-var _4f=function(x){
+function _17(_3b,_3c,_3d,_3e){
+var _3f=function(x){
 return x;
 };
-_4c=_4c||_4f;
-_4d=_4d||_4f;
-_4e=_4e||_4f;
-var _51=_4b.match(/(''|[^'])+/g);
-var _52=_4b.charAt(0)=="'";
-dojo.forEach(_51,function(_53,i){
-if(!_53){
-_51[i]="";
+_3c=_3c||_3f;
+_3d=_3d||_3f;
+_3e=_3e||_3f;
+var _40=_3b.match(/(''|[^'])+/g),_41=_3b.charAt(0)=="'";
+dojo.forEach(_40,function(_42,i){
+if(!_42){
+_40[i]="";
 }else{
-_51[i]=(_52?_4d:_4c)(_53);
-_52=!_52;
+_40[i]=(_41?_3d:_3c)(_42);
+_41=!_41;
 }
 });
-return _4e(_51.join(""));
+return _3e(_40.join(""));
 };
-function _2b(_55,_56,_57,_58){
-_58=dojo.regexp.escapeString(_58);
-if(!_57.strict){
-_58=_58.replace(" a"," ?a");
-}
-return _58.replace(/([a-z])\1*/ig,function(_59){
-var s;
-var c=_59.charAt(0);
-var l=_59.length;
-var p2="",p3="";
-if(_57.strict){
+function _24(_43,_44,_45,_46){
+_46=dojo.regexp.escapeString(_46);
+if(!_45.strict){
+_46=_46.replace(" a"," ?a");
+}
+return _46.replace(/([a-z])\1*/ig,function(_47){
+var s,c=_47.charAt(0),l=_47.length,p2="",p3="";
+if(_45.strict){
 if(l>1){
 p2="0"+"{"+(l-1)+"}";
 }
@@ -404,9 +385,9 @@ case "S":
 s="\\d{"+l+"}";
 break;
 case "a":
-var am=_57.am||_56.am||"AM";
-var pm=_57.pm||_56.pm||"PM";
-if(_57.strict){
+var am=_45.am||_44.am||"AM";
+var pm=_45.pm||_44.pm||"PM";
+if(_45.strict){
 s=am+"|"+pm;
 }else{
 s=am+"|"+pm;
@@ -425,66 +406,61 @@ break;
 default:
 s=".*";
 }
-if(_55){
-_55.push(_59);
+if(_43){
+_43.push(_47);
 }
 return "("+s+")";
 }).replace(/[\xa0 ]/g,"[\\s\\xa0]");
 };
 })();
 (function(){
-var _61=[];
-dojo.date.locale.addCustomFormats=function(_62,_63){
-_61.push({pkg:_62,name:_63});
+var _48=[];
+dojo.date.locale.addCustomFormats=function(_49,_4a){
+_48.push({pkg:_49,name:_4a});
 };
-dojo.date.locale._getGregorianBundle=function(_64){
-var _65={};
-dojo.forEach(_61,function(_66){
-var _67=dojo.i18n.getLocalization(_66.pkg,_66.name,_64);
-_65=dojo.mixin(_65,_67);
+dojo.date.locale._getGregorianBundle=function(_4b){
+var _4c={};
+dojo.forEach(_48,function(_4d){
+var _4e=dojo.i18n.getLocalization(_4d.pkg,_4d.name,_4b);
+_4c=dojo.mixin(_4c,_4e);
 },this);
-return _65;
+return _4c;
 };
 })();
 dojo.date.locale.addCustomFormats("dojo.cldr","gregorian");
-dojo.date.locale.getNames=function(_68,_69,_6a,_6b){
-var _6c;
-var _6d=dojo.date.locale._getGregorianBundle(_6b);
-var _6e=[_68,_6a,_69];
-if(_6a=="standAlone"){
-var key=_6e.join("-");
-_6c=_6d[key];
-if(_6c[0]==1){
-_6c=undefined;
-}
-}
-_6e[1]="format";
-return (_6c||_6d[_6e.join("-")]).concat();
+dojo.date.locale.getNames=function(_4f,_50,_51,_52){
+var _53,_54=dojo.date.locale._getGregorianBundle(_52),_55=[_4f,_51,_50];
+if(_51=="standAlone"){
+var key=_55.join("-");
+_53=_54[key];
+if(_53[0]==1){
+_53=undefined;
+}
+}
+_55[1]="format";
+return (_53||_54[_55.join("-")]).concat();
 };
-dojo.date.locale.isWeekend=function(_70,_71){
-var _72=dojo.cldr.supplemental.getWeekend(_71);
-var day=(_70||new Date()).getDay();
-if(_72.end<_72.start){
-_72.end+=7;
-if(day<_72.start){
+dojo.date.locale.isWeekend=function(_56,_57){
+var _58=dojo.cldr.supplemental.getWeekend(_57),day=(_56||new Date()).getDay();
+if(_58.end<_58.start){
+_58.end+=7;
+if(day<_58.start){
 day+=7;
 }
 }
-return day>=_72.start&&day<=_72.end;
+return day>=_58.start&&day<=_58.end;
 };
-dojo.date.locale._getDayOfYear=function(_74){
-return dojo.date.difference(new Date(_74.getFullYear(),0,1,_74.getHours()),_74)+1;
+dojo.date.locale._getDayOfYear=function(_59){
+return dojo.date.difference(new Date(_59.getFullYear(),0,1,_59.getHours()),_59)+1;
 };
-dojo.date.locale._getWeekOfYear=function(_75,_76){
+dojo.date.locale._getWeekOfYear=function(_5a,_5b){
 if(arguments.length==1){
-_76=0;
+_5b=0;
 }
-var _77=new Date(_75.getFullYear(),0,1).getDay();
-var adj=(_77-_76+7)%7;
-var _79=Math.floor((dojo.date.locale._getDayOfYear(_75)+adj-1)/7);
-if(_77==_76){
-_79++;
+var _5c=new Date(_5a.getFullYear(),0,1).getDay(),adj=(_5c-_5b+7)%7,_5d=Math.floor((dojo.date.locale._getDayOfYear(_5a)+adj-1)/7);
+if(_5c==_5b){
+_5d++;
 }
-return _79;
+return _5d;
 };
 }
diff --git a/dojo/date/stamp.js b/dojo/date/stamp.js
index 7f39a67..0bb4127 100644
--- a/dojo/date/stamp.js
+++ b/dojo/date/stamp.js
@@ -12,8 +12,7 @@ dojo.date.stamp.fromISOString=function(_1,_2){
 if(!dojo.date.stamp._isoRegExp){
 dojo.date.stamp._isoRegExp=/^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/;
 }
-var _3=dojo.date.stamp._isoRegExp.exec(_1);
-var _4=null;
+var _3=dojo.date.stamp._isoRegExp.exec(_1),_4=null;
 if(_3){
 _3.shift();
 if(_3[1]){
@@ -33,8 +32,10 @@ _3[_7]=_6;
 });
 }
 _4=new Date(_3[0]||1970,_3[1]||0,_3[2]||1,_3[3]||0,_3[4]||0,_3[5]||0,_3[6]||0);
-var _8=0;
-var _9=_3[7]&&_3[7].charAt(0);
+if(_3[0]<100){
+_4.setFullYear(_3[0]||1970);
+}
+var _8=0,_9=_3[7]&&_3[7].charAt(0);
 if(_9!="Z"){
 _8=((_3[8]||0)*60)+(Number(_3[9])||0);
 if(_9!="-"){
@@ -51,35 +52,33 @@ _4.setTime(_4.getTime()+_8*60000);
 return _4;
 };
 dojo.date.stamp.toISOString=function(_a,_b){
-var _=function(n){
+var _c=function(n){
 return (n<10)?"0"+n:n;
 };
 _b=_b||{};
-var _e=[];
-var _f=_b.zulu?"getUTC":"get";
-var _10="";
+var _d=[],_e=_b.zulu?"getUTC":"get",_f="";
 if(_b.selector!="time"){
-var _11=_a[_f+"FullYear"]();
-_10=["0000".substr((_11+"").length)+_11,_(_a[_f+"Month"]()+1),_(_a[_f+"Date"]())].join("-");
+var _10=_a[_e+"FullYear"]();
+_f=["0000".substr((_10+"").length)+_10,_c(_a[_e+"Month"]()+1),_c(_a[_e+"Date"]())].join("-");
 }
-_e.push(_10);
+_d.push(_f);
 if(_b.selector!="date"){
-var _12=[_(_a[_f+"Hours"]()),_(_a[_f+"Minutes"]()),_(_a[_f+"Seconds"]())].join(":");
-var _13=_a[_f+"Milliseconds"]();
+var _11=[_c(_a[_e+"Hours"]()),_c(_a[_e+"Minutes"]()),_c(_a[_e+"Seconds"]())].join(":");
+var _12=_a[_e+"Milliseconds"]();
 if(_b.milliseconds){
-_12+="."+(_13<100?"0":"")+_(_13);
+_11+="."+(_12<100?"0":"")+_c(_12);
 }
 if(_b.zulu){
-_12+="Z";
+_11+="Z";
 }else{
 if(_b.selector!="time"){
-var _14=_a.getTimezoneOffset();
-var _15=Math.abs(_14);
-_12+=(_14>0?"-":"+")+_(Math.floor(_15/60))+":"+_(_15%60);
+var _13=_a.getTimezoneOffset();
+var _14=Math.abs(_13);
+_11+=(_13>0?"-":"+")+_c(Math.floor(_14/60))+":"+_c(_14%60);
 }
 }
-_e.push(_12);
+_d.push(_11);
 }
-return _e.join("T");
+return _d.join("T");
 };
 }
diff --git a/dojo/dnd/Avatar.js b/dojo/dnd/Avatar.js
index a2ae36d..57342db 100644
--- a/dojo/dnd/Avatar.js
+++ b/dojo/dnd/Avatar.js
@@ -13,23 +13,24 @@ dojo.declare("dojo.dnd.Avatar",null,{constructor:function(_1){
 this.manager=_1;
 this.construct();
 },construct:function(){
-var a=dojo.create("table",{"class":"dojoDndAvatar",style:{position:"absolute",zIndex:"1999",margin:"0px"}}),b=dojo.create("tbody",null,a),tr=dojo.create("tr",null,b),td=dojo.create("td",{innerHTML:this._generateText()},tr),k=Math.min(5,this.manager.nodes.length),i=0,_8=this.manager.source,_9;
+this.isA11y=dojo.hasClass(dojo.body(),"dijit_a11y");
+var a=dojo.create("table",{"class":"dojoDndAvatar",style:{position:"absolute",zIndex:"1999",margin:"0px"}}),_2=this.manager.source,_3,b=dojo.create("tbody",null,a),tr=dojo.create("tr",null,b),td=dojo.create("td",null,tr),_4=this.isA11y?dojo.create("span",{id:"a11yIcon",innerHTML:this.manager.copy?"+":"<"},td):null,_5=dojo.create("span",{innerHTML:_2.generateText?this._generateText():""},td),k=Math.min(5,this.manager.nodes.length),i=0;
 dojo.attr(tr,{"class":"dojoDndAvatarHeader",style:{opacity:0.9}});
 for(;i<k;++i){
-if(_8.creator){
-_9=_8._normalizedCreator(_8.getItem(this.manager.nodes[i].id).data,"avatar").node;
+if(_2.creator){
+_3=_2._normalizedCreator(_2.getItem(this.manager.nodes[i].id).data,"avatar").node;
 }else{
-_9=this.manager.nodes[i].cloneNode(true);
-if(_9.tagName.toLowerCase()=="tr"){
-var _a=dojo.create("table"),_b=dojo.create("tbody",null,_a);
-_b.appendChild(_9);
-_9=_a;
+_3=this.manager.nodes[i].cloneNode(true);
+if(_3.tagName.toLowerCase()=="tr"){
+var _6=dojo.create("table"),_7=dojo.create("tbody",null,_6);
+_7.appendChild(_3);
+_3=_6;
 }
 }
-_9.id="";
+_3.id="";
 tr=dojo.create("tr",null,b);
 td=dojo.create("td",null,tr);
-td.appendChild(_9);
+td.appendChild(_3);
 dojo.attr(tr,{"class":"dojoDndAvatarItem",style:{opacity:(9-i)/10}});
 }
 this.node=a;
@@ -38,8 +39,24 @@ dojo.destroy(this.node);
 this.node=false;
 },update:function(){
 dojo[(this.manager.canDropFlag?"add":"remove")+"Class"](this.node,"dojoDndAvatarCanDrop");
-dojo.query("tr.dojoDndAvatarHeader td",this.node).forEach(function(_c){
-_c.innerHTML=this._generateText();
+if(this.isA11y){
+var _8=dojo.byId("a11yIcon");
+var _9="+";
+if(this.manager.canDropFlag&&!this.manager.copy){
+_9="< ";
+}else{
+if(!this.manager.canDropFlag&&!this.manager.copy){
+_9="o";
+}else{
+if(!this.manager.canDropFlag){
+_9="x";
+}
+}
+}
+_8.innerHTML=_9;
+}
+dojo.query(("tr.dojoDndAvatarHeader td span"+(this.isA11y?" span":"")),this.node).forEach(function(_a){
+_a.innerHTML=this._generateText();
 },this);
 },_generateText:function(){
 return this.manager.nodes.length.toString();
diff --git a/dojo/dnd/Container.js b/dojo/dnd/Container.js
index c2cf260..432013b 100644
--- a/dojo/dnd/Container.js
+++ b/dojo/dnd/Container.js
@@ -48,45 +48,45 @@ this.map={};
 },getAllNodes:function(){
 return dojo.query("> .dojoDndItem",this.parent);
 },sync:function(){
-var _c={};
-this.getAllNodes().forEach(function(_d){
-if(_d.id){
-var _e=this.getItem(_d.id);
-if(_e){
-_c[_d.id]=_e;
+var _7={};
+this.getAllNodes().forEach(function(_8){
+if(_8.id){
+var _9=this.getItem(_8.id);
+if(_9){
+_7[_8.id]=_9;
 return;
 }
 }else{
-_d.id=dojo.dnd.getUniqueId();
+_8.id=dojo.dnd.getUniqueId();
 }
-var _f=_d.getAttribute("dndType"),_10=_d.getAttribute("dndData");
-_c[_d.id]={data:_10||_d.innerHTML,type:_f?_f.split(/\s*,\s*/):["text"]};
+var _a=_8.getAttribute("dndType"),_b=_8.getAttribute("dndData");
+_7[_8.id]={data:_b||_8.innerHTML,type:_a?_a.split(/\s*,\s*/):["text"]};
 },this);
-this.map=_c;
+this.map=_7;
 return this;
-},insertNodes:function(_11,_12,_13){
+},insertNodes:function(_c,_d,_e){
 if(!this.parent.firstChild){
-_13=null;
+_e=null;
 }else{
-if(_12){
-if(!_13){
-_13=this.parent.firstChild;
+if(_d){
+if(!_e){
+_e=this.parent.firstChild;
 }
 }else{
-if(_13){
-_13=_13.nextSibling;
+if(_e){
+_e=_e.nextSibling;
 }
 }
 }
-if(_13){
-for(var i=0;i<_11.length;++i){
-var t=this._normalizedCreator(_11[i]);
+if(_e){
+for(var i=0;i<_c.length;++i){
+var t=this._normalizedCreator(_c[i]);
 this.setItem(t.node.id,{data:t.data,type:t.type});
-this.parent.insertBefore(t.node,_13);
+this.parent.insertBefore(t.node,_e);
 }
 }else{
-for(var i=0;i<_11.length;++i){
-var t=this._normalizedCreator(_11[i]);
+for(var i=0;i<_c.length;++i){
+var t=this._normalizedCreator(_c[i]);
 this.setItem(t.node.id,{data:t.data,type:t.type});
 this.parent.appendChild(t.node);
 }
@@ -96,9 +96,9 @@ return this;
 dojo.forEach(this.events,dojo.disconnect);
 this.clearItems();
 this.node=this.parent=this.current=null;
-},markupFactory:function(_16,_17){
-_16._skipStartup=true;
-return new dojo.dnd.Container(_17,_16);
+},markupFactory:function(_f,_10){
+_f._skipStartup=true;
+return new dojo.dnd.Container(_10,_f);
 },startup:function(){
 if(!this.parent){
 this.parent=this.node;
@@ -163,28 +163,28 @@ dojo.stopEvent(e);
 }
 },onOverEvent:function(){
 },onOutEvent:function(){
-},_changeState:function(_1e,_1f){
-var _20="dojoDnd"+_1e;
-var _21=_1e.toLowerCase()+"State";
-dojo.removeClass(this.node,_20+this[_21]);
-dojo.addClass(this.node,_20+_1f);
-this[_21]=_1f;
-},_addItemClass:function(_22,_23){
-dojo.addClass(_22,"dojoDndItem"+_23);
-},_removeItemClass:function(_24,_25){
-dojo.removeClass(_24,"dojoDndItem"+_25);
+},_changeState:function(_11,_12){
+var _13="dojoDnd"+_11;
+var _14=_11.toLowerCase()+"State";
+dojo.removeClass(this.node,_13+this[_14]);
+dojo.addClass(this.node,_13+_12);
+this[_14]=_12;
+},_addItemClass:function(_15,_16){
+dojo.addClass(_15,"dojoDndItem"+_16);
+},_removeItemClass:function(_17,_18){
+dojo.removeClass(_17,"dojoDndItem"+_18);
 },_getChildByEvent:function(e){
-var _27=e.target;
-if(_27){
-for(var _28=_27.parentNode;_28;_27=_28,_28=_27.parentNode){
-if(_28==this.parent&&dojo.hasClass(_27,"dojoDndItem")){
-return _27;
+var _19=e.target;
+if(_19){
+for(var _1a=_19.parentNode;_1a;_19=_1a,_1a=_19.parentNode){
+if(_1a==this.parent&&dojo.hasClass(_19,"dojoDndItem")){
+return _19;
 }
 }
 }
 return null;
-},_normalizedCreator:function(_29,_2a){
-var t=(this.creator||this.defaultCreator).call(this,_29,_2a);
+},_normalizedCreator:function(_1b,_1c){
+var t=(this.creator||this.defaultCreator).call(this,_1b,_1c);
 if(!dojo.isArray(t.type)){
 t.type=["text"];
 }
@@ -198,36 +198,36 @@ dojo.dnd._createNode=function(tag){
 if(!tag){
 return dojo.dnd._createSpan;
 }
-return function(_2d){
-return dojo.create(tag,{innerHTML:_2d});
+return function(_1d){
+return dojo.create(tag,{innerHTML:_1d});
 };
 };
-dojo.dnd._createTrTd=function(_2e){
+dojo.dnd._createTrTd=function(_1e){
 var tr=dojo.create("tr");
-dojo.create("td",{innerHTML:_2e},tr);
+dojo.create("td",{innerHTML:_1e},tr);
 return tr;
 };
-dojo.dnd._createSpan=function(_30){
-return dojo.create("span",{innerHTML:_30});
+dojo.dnd._createSpan=function(_1f){
+return dojo.create("span",{innerHTML:_1f});
 };
 dojo.dnd._defaultCreatorNodes={ul:"li",ol:"li",div:"div",p:"div"};
-dojo.dnd._defaultCreator=function(_31){
-var tag=_31.tagName.toLowerCase();
+dojo.dnd._defaultCreator=function(_20){
+var tag=_20.tagName.toLowerCase();
 var c=tag=="tbody"||tag=="thead"?dojo.dnd._createTrTd:dojo.dnd._createNode(dojo.dnd._defaultCreatorNodes[tag]);
-return function(_34,_35){
-var _36=_34&&dojo.isObject(_34),_37,_38,n;
-if(_36&&_34.tagName&&_34.nodeType&&_34.getAttribute){
-_37=_34.getAttribute("dndData")||_34.innerHTML;
-_38=_34.getAttribute("dndType");
-_38=_38?_38.split(/\s*,\s*/):["text"];
-n=_34;
+return function(_21,_22){
+var _23=_21&&dojo.isObject(_21),_24,_25,n;
+if(_23&&_21.tagName&&_21.nodeType&&_21.getAttribute){
+_24=_21.getAttribute("dndData")||_21.innerHTML;
+_25=_21.getAttribute("dndType");
+_25=_25?_25.split(/\s*,\s*/):["text"];
+n=_21;
 }else{
-_37=(_36&&_34.data)?_34.data:_34;
-_38=(_36&&_34.type)?_34.type:["text"];
-n=(_35=="avatar"?dojo.dnd._createSpan:c)(String(_37));
+_24=(_23&&_21.data)?_21.data:_21;
+_25=(_23&&_21.type)?_21.type:["text"];
+n=(_22=="avatar"?dojo.dnd._createSpan:c)(String(_24));
 }
 n.id=dojo.dnd.getUniqueId();
-return {node:n,data:_37,type:_38};
+return {node:n,data:_24,type:_25};
 };
 };
 }
diff --git a/dojo/dnd/Manager.js b/dojo/dnd/Manager.js
index eff1bcf..f23d2f4 100644
--- a/dojo/dnd/Manager.js
+++ b/dojo/dnd/Manager.js
@@ -47,10 +47,10 @@ dojo.publish("/dnd/start",[_3,_4,this.copy]);
 this.events=[dojo.connect(dojo.doc,"onmousemove",this,"onMouseMove"),dojo.connect(dojo.doc,"onmouseup",this,"onMouseUp"),dojo.connect(dojo.doc,"onkeydown",this,"onKeyDown"),dojo.connect(dojo.doc,"onkeyup",this,"onKeyUp"),dojo.connect(dojo.doc,"ondragstart",dojo.stopEvent),dojo.connect(dojo.body(),"onselectstart",dojo.stopEvent)];
 var c="dojoDnd"+(_5?"Copy":"Move");
 dojo.addClass(dojo.body(),c);
-},canDrop:function(_7){
-var _8=Boolean(this.target&&_7);
-if(this.canDropFlag!=_8){
-this.canDropFlag=_8;
+},canDrop:function(_6){
+var _7=Boolean(this.target&&_6);
+if(this.canDropFlag!=_7){
+this.canDropFlag=_7;
 this.avatar.update();
 }
 },stopDrag:function(){
@@ -73,17 +73,17 @@ dojo.dnd.autoScrollNodes(e);
 var s=a.node.style;
 s.left=(e.pageX+this.OFFSET_X)+"px";
 s.top=(e.pageY+this.OFFSET_Y)+"px";
-var _c=Boolean(this.source.copyState(dojo.dnd.getCopyKeyState(e)));
-if(this.copy!=_c){
-this._setCopyStatus(_c);
+var _8=Boolean(this.source.copyState(dojo.isCopyKey(e)));
+if(this.copy!=_8){
+this._setCopyStatus(_8);
 }
 }
 },onMouseUp:function(e){
 if(this.avatar){
 if(this.target&&this.canDropFlag){
-var _e=Boolean(this.source.copyState(dojo.dnd.getCopyKeyState(e))),_f=[this.source,this.nodes,_e,this.target];
-dojo.publish("/dnd/drop/before",_f);
-dojo.publish("/dnd/drop",_f);
+var _9=Boolean(this.source.copyState(dojo.isCopyKey(e))),_a=[this.source,this.nodes,_9,this.target];
+dojo.publish("/dnd/drop/before",_a);
+dojo.publish("/dnd/drop",_a);
 }else{
 dojo.publish("/dnd/cancel");
 }
@@ -93,9 +93,9 @@ this.stopDrag();
 if(this.avatar){
 switch(e.keyCode){
 case dojo.keys.CTRL:
-var _11=Boolean(this.source.copyState(true));
-if(this.copy!=_11){
-this._setCopyStatus(_11);
+var _b=Boolean(this.source.copyState(true));
+if(this.copy!=_b){
+this._setCopyStatus(_b);
 }
 break;
 case dojo.keys.ESCAPE:
@@ -106,13 +106,13 @@ break;
 }
 },onKeyUp:function(e){
 if(this.avatar&&e.keyCode==dojo.keys.CTRL){
-var _13=Boolean(this.source.copyState(false));
-if(this.copy!=_13){
-this._setCopyStatus(_13);
+var _c=Boolean(this.source.copyState(false));
+if(this.copy!=_c){
+this._setCopyStatus(_c);
 }
 }
-},_setCopyStatus:function(_14){
-this.copy=_14;
+},_setCopyStatus:function(_d){
+this.copy=_d;
 this.source._markDndStatus(this.copy);
 this.updateAvatar();
 dojo.removeClass(dojo.body(),"dojoDnd"+(this.copy?"Move":"Copy"));
diff --git a/dojo/dnd/Moveable.js b/dojo/dnd/Moveable.js
index f40872d..2f506a2 100644
--- a/dojo/dnd/Moveable.js
+++ b/dojo/dnd/Moveable.js
@@ -56,22 +56,22 @@ dojo.stopEvent(e);
 }
 },onDragDetected:function(e){
 new this.mover(this.node,e,this);
-},onMoveStart:function(_b){
-dojo.publish("/dnd/move/start",[_b]);
+},onMoveStart:function(_5){
+dojo.publish("/dnd/move/start",[_5]);
 dojo.addClass(dojo.body(),"dojoMove");
 dojo.addClass(this.node,"dojoMoveItem");
-},onMoveStop:function(_c){
-dojo.publish("/dnd/move/stop",[_c]);
+},onMoveStop:function(_6){
+dojo.publish("/dnd/move/stop",[_6]);
 dojo.removeClass(dojo.body(),"dojoMove");
 dojo.removeClass(this.node,"dojoMoveItem");
-},onFirstMove:function(_d){
-},onMove:function(_e,_f){
-this.onMoving(_e,_f);
-var s=_e.node.style;
-s.left=_f.l+"px";
-s.top=_f.t+"px";
-this.onMoved(_e,_f);
-},onMoving:function(_11,_12){
-},onMoved:function(_13,_14){
+},onFirstMove:function(_7){
+},onMove:function(_8,_9){
+this.onMoving(_8,_9);
+var s=_8.node.style;
+s.left=_9.l+"px";
+s.top=_9.t+"px";
+this.onMoved(_8,_9);
+},onMoving:function(_a,_b){
+},onMoved:function(_c,_d){
 }});
 }
diff --git a/dojo/dnd/Mover.js b/dojo/dnd/Mover.js
index aca35aa..8e2a010 100644
--- a/dojo/dnd/Mover.js
+++ b/dojo/dnd/Mover.js
@@ -10,12 +10,12 @@ 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(_1,e,_3){
+dojo.declare("dojo.dnd.Mover",null,{constructor:function(_1,e,_2){
 this.node=dojo.byId(_1);
 this.marginBox={l:e.pageX,t:e.pageY};
 this.mouseButton=e.button;
-var h=this.host=_3,d=_1.ownerDocument,_6=dojo.connect(d,"onmousemove",this,"onFirstMove");
-this.events=[dojo.connect(d,"onmousemove",this,"onMouseMove"),dojo.connect(d,"onmouseup",this,"onMouseUp"),dojo.connect(d,"ondragstart",dojo.stopEvent),dojo.connect(d.body,"onselectstart",dojo.stopEvent),_6];
+var h=this.host=_2,d=_1.ownerDocument,_3=dojo.connect(d,"onmousemove",this,"onFirstMove");
+this.events=[dojo.connect(d,"onmousemove",this,"onMouseMove"),dojo.connect(d,"onmouseup",this,"onMouseUp"),dojo.connect(d,"ondragstart",dojo.stopEvent),dojo.connect(d.body,"onselectstart",dojo.stopEvent),_3];
 if(h&&h.onMoveStart){
 h.onMoveStart(this);
 }
@@ -25,7 +25,7 @@ var m=this.marginBox;
 this.host.onMove(this,{l:m.l+e.pageX,t:m.t+e.pageY});
 dojo.stopEvent(e);
 },onMouseUp:function(e){
-if(dojo.isWebKit&&dojo.dnd._isMac&&this.mouseButton==2?e.button==0:this.mouseButton==e.button){
+if(dojo.isWebKit&&dojo.isMac&&this.mouseButton==2?e.button==0:this.mouseButton==e.button){
 this.destroy();
 }
 dojo.stopEvent(e);
diff --git a/dojo/dnd/Selector.js b/dojo/dnd/Selector.js
index c0b5c1f..7e4ef69 100644
--- a/dojo/dnd/Selector.js
+++ b/dojo/dnd/Selector.js
@@ -33,7 +33,7 @@ return t;
 },selectNone:function(){
 return this._removeSelection()._removeAnchor();
 },selectAll:function(){
-this.forInItems(function(_6,id){
+this.forInItems(function(_3,id){
 this._addItemClass(dojo.byId(id),"Selected");
 this.selection[id]=1;
 },this);
@@ -80,11 +80,11 @@ dojo.forEach(t,function(i){
 delete this.selection[i];
 },this);
 return this;
-},insertNodes:function(_14,_15,_16,_17){
-var _18=this._normalizedCreator;
-this._normalizedCreator=function(_19,_1a){
-var t=_18.call(this,_19,_1a);
-if(_14){
+},insertNodes:function(_4,_5,_6,_7){
+var _8=this._normalizedCreator;
+this._normalizedCreator=function(_9,_a){
+var t=_8.call(this,_9,_a);
+if(_4){
 if(!this.anchor){
 this.anchor=t.node;
 this._removeItemClass(t.node,"Selected");
@@ -102,15 +102,15 @@ this._removeItemClass(t.node,"Anchor");
 }
 return t;
 };
-dojo.dnd.Selector.superclass.insertNodes.call(this,_15,_16,_17);
-this._normalizedCreator=_18;
+dojo.dnd.Selector.superclass.insertNodes.call(this,_5,_6,_7);
+this._normalizedCreator=_8;
 return this;
 },destroy:function(){
 dojo.dnd.Selector.superclass.destroy.call(this);
 this.selection=this.anchor=null;
-},markupFactory:function(_1c,_1d){
-_1c._skipStartup=true;
-return new dojo.dnd.Selector(_1d,_1c);
+},markupFactory:function(_b,_c){
+_b._skipStartup=true;
+return new dojo.dnd.Selector(_c,_b);
 },onMouseDown:function(e){
 if(this.autoSync){
 this.sync();
@@ -118,15 +118,15 @@ this.sync();
 if(!this.current){
 return;
 }
-if(!this.singular&&!dojo.dnd.getCopyKeyState(e)&&!e.shiftKey&&(this.current.id in this.selection)){
+if(!this.singular&&!dojo.isCopyKey(e)&&!e.shiftKey&&(this.current.id in this.selection)){
 this.simpleSelection=true;
-if(e.button===dojo.dnd._lmb){
+if(e.button===dojo.mouseButtons.LEFT){
 dojo.stopEvent(e);
 }
 return;
 }
 if(!this.singular&&e.shiftKey){
-if(!dojo.dnd.getCopyKeyState(e)){
+if(!dojo.isCopyKey(e)){
 this._removeSelection();
 }
 var c=this.getAllNodes();
@@ -139,18 +139,18 @@ this.selection[this.anchor.id]=1;
 if(this.anchor!=this.current){
 var i=0;
 for(;i<c.length;++i){
-var _21=c[i];
-if(_21==this.anchor||_21==this.current){
+var _d=c[i];
+if(_d==this.anchor||_d==this.current){
 break;
 }
 }
 for(++i;i<c.length;++i){
-var _21=c[i];
-if(_21==this.anchor||_21==this.current){
+var _d=c[i];
+if(_d==this.anchor||_d==this.current){
 break;
 }
-this._addItemClass(_21,"Selected");
-this.selection[_21.id]=1;
+this._addItemClass(_d,"Selected");
+this.selection[_d.id]=1;
 }
 this._addItemClass(this.current,"Selected");
 this.selection[this.current.id]=1;
@@ -159,7 +159,7 @@ this.selection[this.current.id]=1;
 }else{
 if(this.singular){
 if(this.anchor==this.current){
-if(dojo.dnd.getCopyKeyState(e)){
+if(dojo.isCopyKey(e)){
 this.selectNone();
 }
 }else{
@@ -169,7 +169,7 @@ this._addItemClass(this.anchor,"Anchor");
 this.selection[this.current.id]=1;
 }
 }else{
-if(dojo.dnd.getCopyKeyState(e)){
+if(dojo.isCopyKey(e)){
 if(this.anchor==this.current){
 delete this.selection[this.anchor.id];
 this._removeAnchor();
@@ -222,9 +222,9 @@ for(var i in this.selection){
 if(i in e){
 continue;
 }
-var _26=dojo.byId(i);
-if(_26){
-this._removeItemClass(_26,"Selected");
+var _e=dojo.byId(i);
+if(_e){
+this._removeItemClass(_e,"Selected");
 }
 }
 this.selection={};
diff --git a/dojo/dnd/Source.js b/dojo/dnd/Source.js
index 0078417..e1131dd 100644
--- a/dojo/dnd/Source.js
+++ b/dojo/dnd/Source.js
@@ -10,7 +10,7 @@ dojo._hasResource["dojo.dnd.Source"]=true;
 dojo.provide("dojo.dnd.Source");
 dojo.require("dojo.dnd.Selector");
 dojo.require("dojo.dnd.Manager");
-dojo.declare("dojo.dnd.Source",dojo.dnd.Selector,{isSource:true,horizontal:false,copyOnly:false,selfCopy:false,selfAccept:true,skipForm:false,withHandles:false,autoSync:false,delay:0,accept:["text"],constructor:function(_1,_2){
+dojo.declare("dojo.dnd.Source",dojo.dnd.Selector,{isSource:true,horizontal:false,copyOnly:false,selfCopy:false,selfAccept:true,skipForm:false,withHandles:false,autoSync:false,delay:0,accept:["text"],generateText:true,constructor:function(_1,_2){
 dojo.mixin(this,dojo.mixin({},_2));
 var _3=this.accept;
 if(_3.length){
@@ -38,32 +38,32 @@ if(this.horizontal){
 dojo.addClass(this.node,"dojoDndHorizontal");
 }
 this.topics=[dojo.subscribe("/dnd/source/over",this,"onDndSourceOver"),dojo.subscribe("/dnd/start",this,"onDndStart"),dojo.subscribe("/dnd/drop",this,"onDndDrop"),dojo.subscribe("/dnd/cancel",this,"onDndCancel")];
-},checkAcceptance:function(_5,_6){
-if(this==_5){
+},checkAcceptance:function(_4,_5){
+if(this==_4){
 return !this.copyOnly||this.selfAccept;
 }
-for(var i=0;i<_6.length;++i){
-var _8=_5.getItem(_6[i].id).type;
-var _9=false;
-for(var j=0;j<_8.length;++j){
-if(_8[j] in this.accept){
-_9=true;
+for(var i=0;i<_5.length;++i){
+var _6=_4.getItem(_5[i].id).type;
+var _7=false;
+for(var j=0;j<_6.length;++j){
+if(_6[j] in this.accept){
+_7=true;
 break;
 }
 }
-if(!_9){
+if(!_7){
 return false;
 }
 }
 return true;
-},copyState:function(_b,_c){
-if(_b){
+},copyState:function(_8,_9){
+if(_8){
 return true;
 }
 if(arguments.length<2){
-_c=this==dojo.dnd.manager().target;
+_9=this==dojo.dnd.manager().target;
 }
-if(_c){
+if(_9){
 if(this.copyOnly){
 return this.selfCopy;
 }
@@ -75,9 +75,9 @@ return false;
 dojo.dnd.Source.superclass.destroy.call(this);
 dojo.forEach(this.topics,dojo.unsubscribe);
 this.targetAnchor=null;
-},markupFactory:function(_d,_e){
-_d._skipStartup=true;
-return new dojo.dnd.Source(_e,_d);
+},markupFactory:function(_a,_b){
+_a._skipStartup=true;
+return new dojo.dnd.Source(_b,_a);
 },onMouseMove:function(e){
 if(this.isDragging&&this.targetState=="Disabled"){
 return;
@@ -85,26 +85,26 @@ return;
 dojo.dnd.Source.superclass.onMouseMove.call(this,e);
 var m=dojo.dnd.manager();
 if(this.isDragging){
-var _11=false;
+var _c=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};
+this.targetBox=dojo.position(this.current,true);
 }
 if(this.horizontal){
-_11=(e.pageX-this.targetBox.xy.x)<(this.targetBox.w/2);
+_c=(e.pageX-this.targetBox.x)<(this.targetBox.w/2);
 }else{
-_11=(e.pageY-this.targetBox.xy.y)<(this.targetBox.h/2);
+_c=(e.pageY-this.targetBox.y)<(this.targetBox.h/2);
 }
 }
-if(this.current!=this.targetAnchor||_11!=this.before){
-this._markTargetAnchor(_11);
+if(this.current!=this.targetAnchor||_c!=this.before){
+this._markTargetAnchor(_c);
 m.canDrop(!this.current||m.source!=this||!(this.current.id in this.selection));
 }
 }else{
 if(this.mouseDown&&this.isSource&&(Math.abs(e.pageX-this._lastX)>this.delay||Math.abs(e.pageY-this._lastY)>this.delay)){
-var _12=this.getSelectedNodes();
-if(_12.length){
-m.startDrag(this,_12,this.copyState(dojo.dnd.getCopyKeyState(e),true));
+var _d=this.getSelectedNodes();
+if(_d.length){
+m.startDrag(this,_d,this.copyState(dojo.isCopyKey(e),true));
 }
 }
 }
@@ -120,8 +120,8 @@ if(this.mouseDown){
 this.mouseDown=false;
 dojo.dnd.Source.superclass.onMouseUp.call(this,e);
 }
-},onDndSourceOver:function(_15){
-if(this!=_15){
+},onDndSourceOver:function(_e){
+if(this!=_e){
 this.mouseDown=false;
 if(this.targetAnchor){
 this._unmarkTargetAnchor();
@@ -132,22 +132,22 @@ var m=dojo.dnd.manager();
 m.canDrop(this.targetState!="Disabled"&&(!this.current||m.source!=this||!(this.current.id in this.selection)));
 }
 }
-},onDndStart:function(_17,_18,_19){
+},onDndStart:function(_f,_10,_11){
 if(this.autoSync){
 this.sync();
 }
 if(this.isSource){
-this._changeState("Source",this==_17?(_19?"Copied":"Moved"):"");
+this._changeState("Source",this==_f?(_11?"Copied":"Moved"):"");
 }
-var _1a=this.accept&&this.checkAcceptance(_17,_18);
-this._changeState("Target",_1a?"":"Disabled");
-if(this==_17){
+var _12=this.accept&&this.checkAcceptance(_f,_10);
+this._changeState("Target",_12?"":"Disabled");
+if(this==_f){
 dojo.dnd.manager().overSource(this);
 }
 this.isDragging=true;
-},onDndDrop:function(_1b,_1c,_1d,_1e){
-if(this==_1e){
-this.onDrop(_1b,_1c,_1d);
+},onDndDrop:function(_13,_14,_15,_16){
+if(this==_16){
+this.onDrop(_13,_14,_15);
 }
 this.onDndCancel();
 },onDndCancel:function(){
@@ -160,57 +160,57 @@ this.isDragging=false;
 this.mouseDown=false;
 this._changeState("Source","");
 this._changeState("Target","");
-},onDrop:function(_1f,_20,_21){
-if(this!=_1f){
-this.onDropExternal(_1f,_20,_21);
+},onDrop:function(_17,_18,_19){
+if(this!=_17){
+this.onDropExternal(_17,_18,_19);
 }else{
-this.onDropInternal(_20,_21);
+this.onDropInternal(_18,_19);
 }
-},onDropExternal:function(_22,_23,_24){
-var _25=this._normalizedCreator;
+},onDropExternal:function(_1a,_1b,_1c){
+var _1d=this._normalizedCreator;
 if(this.creator){
-this._normalizedCreator=function(_26,_27){
-return _25.call(this,_22.getItem(_26.id).data,_27);
+this._normalizedCreator=function(_1e,_1f){
+return _1d.call(this,_1a.getItem(_1e.id).data,_1f);
 };
 }else{
-if(_24){
-this._normalizedCreator=function(_28,_29){
-var t=_22.getItem(_28.id);
-var n=_28.cloneNode(true);
+if(_1c){
+this._normalizedCreator=function(_20,_21){
+var t=_1a.getItem(_20.id);
+var n=_20.cloneNode(true);
 n.id=dojo.dnd.getUniqueId();
 return {node:n,data:t.data,type:t.type};
 };
 }else{
-this._normalizedCreator=function(_2c,_2d){
-var t=_22.getItem(_2c.id);
-_22.delItem(_2c.id);
-return {node:_2c,data:t.data,type:t.type};
+this._normalizedCreator=function(_22,_23){
+var t=_1a.getItem(_22.id);
+_1a.delItem(_22.id);
+return {node:_22,data:t.data,type:t.type};
 };
 }
 }
 this.selectNone();
-if(!_24&&!this.creator){
-_22.selectNone();
+if(!_1c&&!this.creator){
+_1a.selectNone();
 }
-this.insertNodes(true,_23,this.before,this.current);
-if(!_24&&this.creator){
-_22.deleteSelectedNodes();
+this.insertNodes(true,_1b,this.before,this.current);
+if(!_1c&&this.creator){
+_1a.deleteSelectedNodes();
 }
-this._normalizedCreator=_25;
-},onDropInternal:function(_2f,_30){
-var _31=this._normalizedCreator;
+this._normalizedCreator=_1d;
+},onDropInternal:function(_24,_25){
+var _26=this._normalizedCreator;
 if(this.current&&this.current.id in this.selection){
 return;
 }
-if(_30){
+if(_25){
 if(this.creator){
-this._normalizedCreator=function(_32,_33){
-return _31.call(this,this.getItem(_32.id).data,_33);
+this._normalizedCreator=function(_27,_28){
+return _26.call(this,this.getItem(_27.id).data,_28);
 };
 }else{
-this._normalizedCreator=function(_34,_35){
-var t=this.getItem(_34.id);
-var n=_34.cloneNode(true);
+this._normalizedCreator=function(_29,_2a){
+var t=this.getItem(_29.id);
+var n=_29.cloneNode(true);
 n.id=dojo.dnd.getUniqueId();
 return {node:n,data:t.data,type:t.type};
 };
@@ -219,14 +219,14 @@ return {node:n,data:t.data,type:t.type};
 if(!this.current){
 return;
 }
-this._normalizedCreator=function(_38,_39){
-var t=this.getItem(_38.id);
-return {node:_38,data:t.data,type:t.type};
+this._normalizedCreator=function(_2b,_2c){
+var t=this.getItem(_2b.id);
+return {node:_2b,data:t.data,type:t.type};
 };
 }
 this._removeSelection();
-this.insertNodes(true,_2f,this.before,this.current);
-this._normalizedCreator=_31;
+this.insertNodes(true,_24,this.before,this.current);
+this._normalizedCreator=_26;
 },onDraggingOver:function(){
 },onDraggingOut:function(){
 },onOverEvent:function(){
@@ -241,8 +241,8 @@ dojo.dnd.manager().outSource(this);
 if(this.isDragging&&this.targetState!="Disabled"){
 this.onDraggingOut();
 }
-},_markTargetAnchor:function(_3b){
-if(this.current==this.targetAnchor&&this.before==_3b){
+},_markTargetAnchor:function(_2d){
+if(this.current==this.targetAnchor&&this.before==_2d){
 return;
 }
 if(this.targetAnchor){
@@ -250,7 +250,7 @@ this._removeItemClass(this.targetAnchor,this.before?"Before":"After");
 }
 this.targetAnchor=this.current;
 this.targetBox=null;
-this.before=_3b;
+this.before=_2d;
 if(this.targetAnchor){
 this._addItemClass(this.targetAnchor,this.before?"Before":"After");
 }
@@ -262,36 +262,36 @@ this._removeItemClass(this.targetAnchor,this.before?"Before":"After");
 this.targetAnchor=null;
 this.targetBox=null;
 this.before=true;
-},_markDndStatus:function(_3c){
-this._changeState("Source",_3c?"Copied":"Moved");
+},_markDndStatus:function(_2e){
+this._changeState("Source",_2e?"Copied":"Moved");
 },_legalMouseDown:function(e){
-if(!dojo.dnd._isLmbPressed(e)){
+if(!dojo.mouseButtons.isLeft(e)){
 return false;
 }
 if(!this.withHandles){
 return true;
 }
-for(var _3e=e.target;_3e&&_3e!==this.node;_3e=_3e.parentNode){
-if(dojo.hasClass(_3e,"dojoDndHandle")){
+for(var _2f=e.target;_2f&&_2f!==this.node;_2f=_2f.parentNode){
+if(dojo.hasClass(_2f,"dojoDndHandle")){
 return true;
 }
-if(dojo.hasClass(_3e,"dojoDndItem")){
+if(dojo.hasClass(_2f,"dojoDndItem")||dojo.hasClass(_2f,"dojoDndIgnore")){
 break;
 }
 }
 return false;
 }});
-dojo.declare("dojo.dnd.Target",dojo.dnd.Source,{constructor:function(_3f,_40){
+dojo.declare("dojo.dnd.Target",dojo.dnd.Source,{constructor:function(_30,_31){
 this.isSource=false;
 dojo.removeClass(this.node,"dojoDndSource");
-},markupFactory:function(_41,_42){
-_41._skipStartup=true;
-return new dojo.dnd.Target(_42,_41);
+},markupFactory:function(_32,_33){
+_32._skipStartup=true;
+return new dojo.dnd.Target(_33,_32);
 }});
-dojo.declare("dojo.dnd.AutoSource",dojo.dnd.Source,{constructor:function(_43,_44){
+dojo.declare("dojo.dnd.AutoSource",dojo.dnd.Source,{constructor:function(_34,_35){
 this.autoSync=true;
-},markupFactory:function(_45,_46){
-_45._skipStartup=true;
-return new dojo.dnd.AutoSource(_46,_45);
+},markupFactory:function(_36,_37){
+_36._skipStartup=true;
+return new dojo.dnd.AutoSource(_37,_36);
 }});
 }
diff --git a/dojo/dnd/TimedMoveable.js b/dojo/dnd/TimedMoveable.js
index 669dd25..b512e58 100644
--- a/dojo/dnd/TimedMoveable.js
+++ b/dojo/dnd/TimedMoveable.js
@@ -29,10 +29,10 @@ dojo.dnd.Moveable.prototype.onMoveStop.apply(this,arguments);
 },onMove:function(_7,_8){
 _7._leftTop=_8;
 if(!_7._timer){
-var _t=this;
+var _9=this;
 _7._timer=setTimeout(function(){
 _7._timer=null;
-_1.call(_t,_7,_7._leftTop);
+_1.call(_9,_7,_7._leftTop);
 },this.timeout);
 }
 }});
diff --git a/dojo/dnd/autoscroll.js b/dojo/dnd/autoscroll.js
index 63a4a03..a5d091f 100644
--- a/dojo/dnd/autoscroll.js
+++ b/dojo/dnd/autoscroll.js
@@ -56,7 +56,7 @@ 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);
+var b=dojo._getContentBox(n,s),t=dojo.position(n,true);
 var w=Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL,b.w/2),h=Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL,b.h/2),rx=e.pageX-t.x,ry=e.pageY-t.y,dx=0,dy=0;
 if(dojo.isWebKit||dojo.isOpera){
 rx+=dojo.body().scrollLeft,ry+=dojo.body().scrollTop;
@@ -79,10 +79,10 @@ dy=h;
 }
 }
 }
-var _14=n.scrollLeft,_15=n.scrollTop;
+var _1=n.scrollLeft,_2=n.scrollTop;
 n.scrollLeft=n.scrollLeft+dx;
 n.scrollTop=n.scrollTop+dy;
-if(_14!=n.scrollLeft||_15!=n.scrollTop){
+if(_1!=n.scrollLeft||_2!=n.scrollTop){
 return;
 }
 }
diff --git a/dojo/dnd/common.js b/dojo/dnd/common.js
index 3a0b444..6ea4050 100644
--- a/dojo/dnd/common.js
+++ b/dojo/dnd/common.js
@@ -8,11 +8,6 @@
 if(!dojo._hasResource["dojo.dnd.common"]){
 dojo._hasResource["dojo.dnd.common"]=true;
 dojo.provide("dojo.dnd.common");
-dojo.dnd._isMac=navigator.appVersion.indexOf("Macintosh")>=0;
-dojo.dnd._copyKey=dojo.dnd._isMac?"metaKey":"ctrlKey";
-dojo.dnd.getCopyKeyState=function(e){
-return e[dojo.dnd._copyKey];
-};
 dojo.dnd._uniqueId=0;
 dojo.dnd.getUniqueId=function(){
 var id;
@@ -29,10 +24,4 @@ t=t.parentNode;
 }
 return " button textarea input select option ".indexOf(" "+t.tagName.toLowerCase()+" ")>=0;
 };
-dojo.dnd._lmb=dojo.isIE?1:0;
-dojo.dnd._isLmbPressed=dojo.isIE?function(e){
-return e.button&1;
-}:function(e){
-return e.button===0;
-};
 }
diff --git a/dojo/dnd/move.js b/dojo/dnd/move.js
index 54070f6..4556c14 100644
--- a/dojo/dnd/move.js
+++ b/dojo/dnd/move.js
@@ -28,36 +28,36 @@ var mb=dojo.marginBox(_5.node);
 c.r-=mb.w;
 c.b-=mb.h;
 }
-},onMove:function(_8,_9){
-var c=this.constraintBox,s=_8.node.style;
-s.left=(_9.l<c.l?c.l:c.r<_9.l?c.r:_9.l)+"px";
-s.top=(_9.t<c.t?c.t:c.b<_9.t?c.b:_9.t)+"px";
+},onMove:function(_6,_7){
+var c=this.constraintBox,s=_6.node.style;
+s.left=(_7.l<c.l?c.l:c.r<_7.l?c.r:_7.l)+"px";
+s.top=(_7.t<c.t?c.t:c.b<_7.t?c.b:_7.t)+"px";
 }});
-dojo.declare("dojo.dnd.move.boxConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{box:{},markupFactory:function(_c,_d){
-return new dojo.dnd.move.boxConstrainedMoveable(_d,_c);
-},constructor:function(_e,_f){
-var box=_f&&_f.box;
+dojo.declare("dojo.dnd.move.boxConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{box:{},markupFactory:function(_8,_9){
+return new dojo.dnd.move.boxConstrainedMoveable(_9,_8);
+},constructor:function(_a,_b){
+var _c=_b&&_b.box;
 this.constraints=function(){
-return box;
+return _c;
 };
 }});
-dojo.declare("dojo.dnd.move.parentConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{area:"content",markupFactory:function(_11,_12){
-return new dojo.dnd.move.parentConstrainedMoveable(_12,_11);
-},constructor:function(_13,_14){
-var _15=_14&&_14.area;
+dojo.declare("dojo.dnd.move.parentConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{area:"content",markupFactory:function(_d,_e){
+return new dojo.dnd.move.parentConstrainedMoveable(_e,_d);
+},constructor:function(_f,_10){
+var _11=_10&&_10.area;
 this.constraints=function(){
 var n=this.node.parentNode,s=dojo.getComputedStyle(n),mb=dojo._getMarginBox(n,s);
-if(_15=="margin"){
+if(_11=="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(_15=="border"){
+if(_11=="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(_15=="padding"){
+if(_11=="padding"){
 return mb;
 }
 t=dojo._getPadExtents(n,s);
@@ -65,13 +65,13 @@ mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;
 return mb;
 };
 }});
-dojo.dnd.move.constrainedMover=function(fun,_1b){
+dojo.dnd.move.constrainedMover=function(fun,_12){
 dojo.deprecated("dojo.dnd.move.constrainedMover, use dojo.dnd.move.constrainedMoveable instead");
-var _1c=function(_1d,e,_1f){
-dojo.dnd.Mover.call(this,_1d,e,_1f);
+var _13=function(_14,e,_15){
+dojo.dnd.Mover.call(this,_14,e,_15);
 };
-dojo.extend(_1c,dojo.dnd.Mover.prototype);
-dojo.extend(_1c,{onMouseMove:function(e){
+dojo.extend(_13,dojo.dnd.Mover.prototype);
+dojo.extend(_13,{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;
@@ -82,42 +82,42 @@ 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(_1b){
+if(_12){
 var mb=dojo.marginBox(this.node);
 c.r-=mb.w;
 c.b-=mb.h;
 }
 }});
-return _1c;
+return _13;
 };
-dojo.dnd.move.boxConstrainedMover=function(box,_28){
+dojo.dnd.move.boxConstrainedMover=function(box,_16){
 dojo.deprecated("dojo.dnd.move.boxConstrainedMover, use dojo.dnd.move.boxConstrainedMoveable instead");
 return dojo.dnd.move.constrainedMover(function(){
 return box;
-},_28);
+},_16);
 };
-dojo.dnd.move.parentConstrainedMover=function(_29,_2a){
+dojo.dnd.move.parentConstrainedMover=function(_17,_18){
 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(_29=="margin"){
+if(_17=="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(_29=="border"){
+if(_17=="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(_29=="padding"){
+if(_17=="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,_2a);
+return dojo.dnd.move.constrainedMover(fun,_18);
 };
 dojo.dnd.constrainedMover=dojo.dnd.move.constrainedMover;
 dojo.dnd.boxConstrainedMover=dojo.dnd.move.boxConstrainedMover;
diff --git a/dojo/dojo.js b/dojo/dojo.js
index d69fc40..60a2633 100644
--- a/dojo/dojo.js
+++ b/dojo/dojo.js
@@ -13,4 +13,4 @@
 	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._sco [...]
+(function(){var _1=null;if((_1||(typeof djConfig!="undefined"&&djConfig.scopeMap))&&(typeof window!="undefined")){var _2="",_3="",_4="",_5={},_6={};_1=_1||djConfig.scopeMap;for(var i=0;i<_1.length;i++){var _7=_1[i];_2+="var "+_7[0]+" = {}; "+_7[1]+" = "+_7[0]+";"+_7[1]+"._scopeName = '"+_7[1]+"';";_3+=(i==0?"":",")+_7[0];_4+=(i==0?"":",")+_7[1];_5[_7[0]]=_7[1];_6[_7[1]]=_7[0];}eval(_2+"dojo._scopeArgs = ["+_4+"];");dojo._scopePrefixArgs=_3;dojo._scopePrefix="(function("+_3+"){";dojo._sco [...]
diff --git a/dojo/dojo.js.uncompressed.js b/dojo/dojo.js.uncompressed.js
index 9cb49a8..2153165 100644
--- a/dojo/dojo.js.uncompressed.js
+++ b/dojo/dojo.js.uncompressed.js
@@ -128,7 +128,8 @@ djConfig = {
 	//		Indicates Dojo was added to the page after the page load. In this case
 	//		Dojo will not wait for the page DOMContentLoad/load events and fire
 	//		its dojo.addOnLoad callbacks after making sure all outstanding
-	//		dojo.required modules have loaded.
+	//		dojo.required modules have loaded. Only works with a built dojo.js,
+	//		it does not work the dojo.js directly from source control.
 	afterOnLoad: false,
 	// addOnLoad: Function or Array
 	//		Adds a callback via dojo.addOnLoad. Useful when Dojo is added after
@@ -141,7 +142,7 @@ djConfig = {
 	addOnLoad: null,
 	// require: Array
 	//		An array of module names to be loaded immediately after dojo.js has been included
-	//		in a page. 
+	//		in a page.
 	require: [],
 	// defaultDuration: Array
 	//		Default duration, in milliseconds, for wipe and fade animations within dijits.
@@ -152,9 +153,32 @@ djConfig = {
 	//		dojo.back, and dijit popup support in IE where an iframe is needed to make sure native
 	//		controls do not bleed through the popups. Normally this configuration variable 
 	//		does not need to be set, except when using cross-domain/CDN Dojo builds.
-	//		Save dojo/resources/blank.html to your domain and set `djConfig.dojoBlankHtmlUrl` 
+	//		Save dojo/resources/blank.html to your domain and set `djConfig.dojoBlankHtmlUrl`
 	//		to the path on your domain your copy of blank.html.
-	dojoBlankHtmlUrl: undefined
+	dojoBlankHtmlUrl: undefined,
+	//	ioPublish: Boolean?
+	//		Set this to true to enable publishing of topics for the different phases of
+	// 		IO operations. Publishing is done via dojo.publish. See dojo.__IoPublish for a list
+	// 		of topics that are published.
+	ioPublish: false,
+	//  useCustomLogger: Anything?
+	//		If set to a value that evaluates to true such as a string or array and
+	//		isDebug is true and Firebug is not available or running, then it bypasses
+	//		the creation of Firebug Lite allowing you to define your own console object.
+	useCustomLogger: undefined,
+	// transparentColor: Array
+	//		Array containing the r, g, b components used as transparent color in dojo.Color;
+	//		if undefined, [255,255,255] (white) will be used.
+	transparentColor: undefined,
+	// skipIeDomLoaded: Boolean
+	//		For IE only, skip the DOMContentLoaded hack used. Sometimes it can cause an Operation
+	//		Aborted error if the rest of the page triggers script defers before the DOM is ready.
+	//		If this is config value is set to true, then dojo.addOnLoad callbacks will not be
+	//		triggered until the page load event, which is after images and iframes load. If you
+	//		want to trigger the callbacks sooner, you can put a script block in the bottom of
+	//		your HTML that calls dojo._loadInit();. If you are using multiversion support, change
+	//		"dojo." to the appropriate scope name for dojo.
+	skipIeDomLoaded: false
 }
 =====*/
 
@@ -171,18 +195,19 @@ djConfig = {
 		var cn = [
 			"assert", "count", "debug", "dir", "dirxml", "error", "group",
 			"groupEnd", "info", "profile", "profileEnd", "time", "timeEnd",
-			"trace", "warn", "log" 
+			"trace", "warn", "log"
 		];
 		var i=0, tn;
 		while((tn=cn[i++])){
 			if(!console[tn]){
 				(function(){
 					var tcn = tn+"";
-					console[tcn] = ('log' in console) ? function(){ 
+					console[tcn] = ('log' in console) ? function(){
 						var a = Array.apply({}, arguments);
 						a.unshift(tcn+":");
 						console["log"](a.join(" "));
 					} : function(){}
+					console[tcn]._fake = true;
 				})();
 			}
 		}
@@ -191,7 +216,7 @@ djConfig = {
 	//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 = {
+		dojo = {
 			_scopeName: "dojo",
 			_scopePrefix: "",
 			_scopePrefixArgs: "",
@@ -205,12 +230,12 @@ djConfig = {
 
 	//Need placeholders for dijit and dojox for scoping code.
 	if(typeof dijit == "undefined"){
-		this.dijit = {_scopeName: "dijit"};
+		dijit = {_scopeName: "dijit"};
 	}
 	if(typeof dojox == "undefined"){
-		this.dojox = {_scopeName: "dojox"};
+		dojox = {_scopeName: "dojox"};
 	}
-	
+
 	if(!d._scopeArgs){
 		d._scopeArgs = [dojo, dijit, dojox];
 	}
@@ -246,22 +271,31 @@ dojo.global = {
 =====*/
 	dojo.locale = d.config.locale;
 
-	var rev = "$Rev: 18832 $".match(/\d+/); 
+	var rev = "$Rev: 21254 $".match(/\d+/);
 
-	dojo.version = {
-		// summary: 
-		//		version number of dojo
-		//	major: Integer
+/*=====
+	dojo.version = function(){
+		// summary:
+		//		Version number of the Dojo Toolkit
+		// major: Integer
 		//		Major version. If total version is "1.2.0beta1", will be 1
-		//	minor: Integer
+		// minor: Integer
 		//		Minor version. If total version is "1.2.0beta1", will be 2
-		//	patch: Integer
+		// patch: Integer
 		//		Patch version. If total version is "1.2.0beta1", will be 0
-		//	flag: String
+		// flag: String
 		//		Descriptor flag. If total version is "1.2.0beta1", will be "beta1"
-		//	revision: Number
+		// revision: Number
 		//		The SVN rev from which dojo was pulled
-		major: 1, minor: 3, patch: 2, flag: "",
+		this.major = 0;
+		this.minor = 0;
+		this.patch = 0;
+		this.flag = "";
+		this.revision = 0;
+	}
+=====*/
+	dojo.version = {
+		major: 1, minor: 4, patch: 1, flag: "",
 		revision: rev ? +rev[0] : NaN,
 		toString: function(){
 			with(d.version){
@@ -275,39 +309,48 @@ dojo.global = {
 		OpenAjax.hub.registerLibrary(dojo._scopeName, "http://dojotoolkit.org", d.version.toString());
 	}
 	
-	var tobj = {};
-	dojo._mixin = function(/*Object*/ obj, /*Object*/ props){
+	var extraNames, extraLen, empty = {};
+	for(var i in {toString: 1}){ extraNames = []; break; }
+	dojo._extraNames = extraNames = extraNames || ["hasOwnProperty", "valueOf", "isPrototypeOf",
+		"propertyIsEnumerable", "toLocaleString", "toString", "constructor"];
+	extraLen = extraNames.length;
+
+	dojo._mixin = function(/*Object*/ target, /*Object*/ source){
 		// summary:
-		//		Adds all properties and methods of props to obj. This addition
+		//		Adds all properties and methods of source to target. This addition
 		//		is "prototype extension safe", so that instances of objects
 		//		will not pass along prototype defaults.
-		for(var x in props){
-			// the "tobj" condition avoid copying properties in "props"
-			// inherited from Object.prototype.  For example, if obj has a custom
+		var name, s, i;
+		for(name in source){
+			// the "tobj" condition avoid copying properties in "source"
+			// inherited from Object.prototype.  For example, if target has a custom
 			// toString() method, don't overwrite it with the toString() method
-			// that 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;
+			// that source inherited from Object.prototype
+			s = source[name];
+			if(!(name in target) || (target[name] !== s && (!(name in empty) || empty[name] !== s))){
+				target[name] = s;
+			}
+		}
+				// IE doesn't recognize some custom functions in for..in
+		if(extraLen && source){
+			for(i = 0; i < extraLen; ++i){
+				name = extraNames[i];
+				s = source[name];
+				if(!(name in target) || (target[name] !== s && (!(name in empty) || empty[name] !== s))){
+					target[name] = s;
+				}
 			}
 		}
-				return obj; // Object
+				return target; // Object
 	}
 
 	dojo.mixin = function(/*Object*/obj, /*Object...*/props){
-		// summary:	
+		// 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
+		//		destination object which is then returned. Unlike regular
 		//		`for...in` iteration, `dojo.mixin` is also smart about avoiding
 		//		extensions which other toolkits may unwisely add to the root
 		//		object prototype
@@ -329,7 +372,7 @@ dojo.global = {
 		//	|			// property configuration:
 		//	|			dojo.mixin(this, properties);
 		//	|	
-		//	|			
+		//	|			console.log(this.quip);
 		//	|			//  ...
 		//	|		},
 		//	|		quip: "I wasn't born yesterday, you know - I've seen movies.",
@@ -351,9 +394,9 @@ dojo.global = {
 		//	|	);
 		//	|	
 		//	|	// will print "Carl Brutanananadilewski"
-		//	|	
+		//	|	console.log(flattened.name);
 		//	|	// will print "true"
-		//	|	
+		//	|	console.log(flattened.braces);
 		if(!obj){ obj = {}; }
 		for(var i=1, l=arguments.length; i<l; i++){
 			d._mixin(obj, arguments[i]);
@@ -364,8 +407,8 @@ dojo.global = {
 	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];
+			if(i == 0 && d._scopeMap[p]){
+				p = d._scopeMap[p];
 			}
 			obj = (p in obj ? obj[p] : (create ? obj[p]={} : undefined));
 		}
@@ -373,14 +416,14 @@ dojo.global = {
 	}
 
 	dojo.setObject = function(/*String*/name, /*Object*/value, /*Object?*/context){
-		// summary: 
+		// summary:
 		//		Set a property from a dot-separated string, such as "A.B.C"
-		//	description: 
+		//	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: 	
+		//	name:
 		//		Path to a property, in the form "A.B.C".
 		//	context:
 		//		Optional. Object to use as root of path. Defaults to
@@ -403,14 +446,14 @@ dojo.global = {
 	}
 
 	dojo.getObject = function(/*String*/name, /*Boolean?*/create, /*Object?*/context){
-		// summary: 
+		// summary:
 		//		Get a property from a dot-separated string, such as "A.B.C"
-		//	description: 
+		//	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: 	
+		//	name:
 		//		Path to an property, in the form "A.B.C".
-		//	create: 
+		//	create:
 		//		Optional. Defaults to `false`. If `true`, Objects will be
 		//		created at any point along the 'path' that is undefined.
 		//	context:
@@ -420,12 +463,15 @@ dojo.global = {
 	}
 
 	dojo.exists = function(/*String*/name, /*Object?*/obj){
-		//	summary: 
+		//	summary:
 		//		determine if an object supports a given method
-		//	description: 
+		//	description:
 		//		useful for longer api chains where you have to test each object in
-		//		the chain
-		//	name: 	
+		//		the chain. Useful only for object and method detection.
+		//		Not useful for testing generic properties on an object.
+		//		In particular, dojo.exists("foo.bar") when foo.bar = ""
+		//		will return false. Use ("bar" in foo) to test for those cases.
+		//	name:
 		//		Path to an object, in the form "A.B.C".
 		//	obj:
 		//		Object to use as root of path. Defaults to
@@ -448,10 +494,10 @@ dojo.global = {
 
 
 	dojo["eval"] = function(/*String*/ scriptFragment){
-		//	summary: 
+		//	summary:
 		//		Perform an evaluation in the global scope. Use this rather than
 		//		calling 'eval()' directly.
-		//	description: 
+		//	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.
@@ -473,7 +519,7 @@ dojo.global = {
 
 	/*=====
 		dojo.deprecated = function(behaviour, extra, removal){
-			//	summary: 
+			//	summary:
 			//		Log a debug message to indicate that a behavior has been
 			//		deprecated.
 			//	behaviour: String
@@ -492,7 +538,7 @@ dojo.global = {
 
 		dojo.experimental = function(moduleName, extra){
 			//	summary: Marks code as experimental.
-			//	description: 
+			//	description:
 			//	 	This can be used to mark a function, file, or module as
 			//	 	experimental.  Experimental code is not ready to be used, and the
 			//	 	APIs are subject to change without notice.  Experimental code may be
@@ -539,14 +585,14 @@ dojo.global = {
 
 		_moduleHasPrefix: function(/*String*/module){
 			// summary: checks to see if module has been established
-			var mp = this._modulePrefixes;
+			var mp = d._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)){
+			var mp = d._modulePrefixes;
+			if(d._moduleHasPrefix(module)){
 				return mp[module].value; // String
 			}
 			return module; // String
@@ -586,9 +632,9 @@ dojo.global = {
 		// cb: 
 		//		a callback function to pass the result of evaluating the script
 
-		var uri = ((relpath.charAt(0) == '/' || relpath.match(/^\w+:/)) ? "" : this.baseUrl) + relpath;
+		var uri = ((relpath.charAt(0) == '/' || relpath.match(/^\w+:/)) ? "" : d.baseUrl) + relpath;
 		try{
-			return !module ? this._loadUri(uri, cb) : this._loadUriAndCheck(uri, module, cb); // Boolean
+			return !module ? d._loadUri(uri, cb) : d._loadUriAndCheck(uri, module, cb); // Boolean
 		}catch(e){
 			console.error(e);
 			return false; // Boolean
@@ -609,24 +655,42 @@ dojo.global = {
 		//		as an expression, typically used by the resource bundle loader to
 		//		load JSON-style resources
 
-		if(this._loadedUrls[uri]){
+		if(d._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;
+		d._inFlightCount++; // block addOnLoad calls that arrive while we're busy downloading
+		var contents = d._getText(uri, true);
+		if(contents){ // not 404, et al
+			d._loadedUrls[uri] = true;
+			d._loadedUrls.push(uri);
+			if(cb){
+				contents = '('+contents+')';
+			}else{
+				//Only do the scoping if no callback. If a callback is specified,
+				//it is most likely the i18n bundle stuff.
+				contents = d._scopePrefix + contents + d._scopeSuffix;
+			}
+			if(!d.isIE){ contents += "\r\n//@ sourceURL=" + uri; } // debugging assist for Firebug
+			var value = d["eval"](contents);
+			if(cb){ cb(value); }
+		}
+		// Check to see if we need to call _callLoaded() due to an addOnLoad() that arrived while we were busy downloading
+		if(--d._inFlightCount == 0 && d._postLoad && d._loaders.length){
+			// We shouldn't be allowed to get here but Firefox allows an event 
+			// (mouse, keybd, async xhrGet) to interrupt a synchronous xhrGet. 
+			// If the current script block contains multiple require() statements, then after each
+			// require() returns, inFlightCount == 0, but we want to hold the _callLoaded() until
+			// all require()s are done since the out-of-sequence addOnLoad() presumably needs them all.
+			// setTimeout allows the next require() to start (if needed), and then we check this again.
+			setTimeout(function(){ 
+				// If inFlightCount > 0, then multiple require()s are running sequentially and 
+				// the next require() started after setTimeout() was executed but before we got here.
+				if(d._inFlightCount == 0){ 
+					d._callLoaded();
+				}
+			}, 0);
 		}
-		if(d.isMoz){ contents += "\r\n//@ sourceURL=" + uri; } // debugging assist for Firebug
-		var value = d["eval"](contents);
-		if(cb){ cb(value); }
-		return true; // Boolean
+		return !!contents; // Boolean: contents? true : false
 	}
 	
 	// FIXME: probably need to add logging to this method
@@ -634,11 +698,11 @@ dojo.global = {
 		// summary: calls loadUri then findModule and returns true if both succeed
 		var ok = false;
 		try{
-			ok = this._loadUri(uri, cb);
+			ok = d._loadUri(uri, cb);
 		}catch(e){
 			console.error("failed loading " + uri + " with error: " + e);
 		}
-		return !!(ok && this._loadedModules[moduleName]); // Boolean
+		return !!(ok && d._loadedModules[moduleName]); // Boolean
 	}
 
 	dojo.loaded = function(){
@@ -648,20 +712,20 @@ dojo.global = {
 		//		direct dojo.connect() to this method in order to handle
 		//		initialization tasks that require the environment to be
 		//		initialized. In a browser host,	declarative widgets will 
-		//		be constructed when this function	finishes runing.
-		this._loadNotifying = true;
-		this._postLoad = true;
+		//		be constructed when this function finishes runing.
+		d._loadNotifying = true;
+		d._postLoad = true;
 		var mll = d._loaders;
 
 		//Clear listeners so new ones can be added
 		//For other xdomain package loads after the initial load.
-		this._loaders = [];
+		d._loaders = [];
 
 		for(var x = 0; x < mll.length; x++){
 			mll[x]();
 		}
 
-		this._loadNotifying = false;
+		d._loadNotifying = false;
 		
 		//Make sure nothing else got added to the onload queue
 		//after this first run. If something did, and we are not waiting for any
@@ -692,18 +756,35 @@ dojo.global = {
 		}
 	}
 
-	dojo.addOnLoad = function(/*Object?*/obj, /*String|Function*/functionName){
+	dojo.ready = dojo.addOnLoad = function(/*Object*/obj, /*String|Function?*/functionName){
 		// summary:
+		//		Registers a function to be triggered after the DOM and dojo.require() calls 
+		//		have finished loading.
+		//
+		// description:
 		//		Registers a function to be triggered after the DOM has finished
-		//		loading and widgets declared in markup have been instantiated.
+		//		loading and `dojo.require` modules have loaded. Widgets declared in markup 
+		//		have been instantiated if `djConfig.parseOnLoad` is true when this fires. 
+		//
 		//		Images and CSS files may or may not have finished downloading when
 		//		the specified function is called.  (Note that widgets' CSS and HTML
 		//		code is guaranteed to be downloaded before said widgets are
-		//		instantiated.)
+		//		instantiated, though including css resouces BEFORE any script elements
+		//		is highly recommended).
+		//
+		// example:
+		//	Register an anonymous function to run when everything is ready
+		//	|	dojo.addOnLoad(function(){ doStuff(); });
+		//
+		// example:
+		//	Register a function to run when everything is ready by pointer:
+		//	|	var init = function(){ doStuff(); }
+		//	|	dojo.addOnLoad(init);
+		//
 		// example:
-		//	|	dojo.addOnLoad(functionPointer);
+		//	Register a function to run scoped to `object`, either by name or anonymously:
 		//	|	dojo.addOnLoad(object, "functionName");
-		//	|	dojo.addOnLoad(object, function(){ /* ... */});
+		//	|	dojo.addOnLoad(object, function(){ doStuff(); });
 
 		d._onto(d._loaders, obj, functionName);
 
@@ -742,12 +823,10 @@ dojo.global = {
 		// 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);
-			}
+		if(typeof setTimeout == "object" || (d.config.useXDomain && d.isOpera)){
+			setTimeout(
+				d.isAIR ? function(){ d.loaded(); } : d._scopeName + ".loaded();",
+				0);
 		}else{
 			d.loaded();
 		}
@@ -760,11 +839,11 @@ dojo.global = {
 		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)){		
+			if(i == 1 && !d._moduleHasPrefix(parentModule)){		
 				// Support default module directory (sibling of dojo) for top-level modules 
 				syms[0] = "../" + syms[0];
 			}else{
-				var parentModulePath = this._getModulePrefix(parentModule);
+				var parentModulePath = d._getModulePrefix(parentModule);
 				if(parentModulePath != parentModule){
 					syms.splice(0, i, parentModulePath);
 					break;
@@ -810,6 +889,47 @@ dojo.global = {
 		//		and exception will be throws whereas no exception is raised
 		//		when called as `dojo.require("a.b.c", true)`
 		//	description:
+		// 		Modules are loaded via dojo.require by using one of two loaders: the normal loader
+		// 		and the xdomain loader. The xdomain loader is used when dojo was built with a
+		// 		custom build that specified loader=xdomain and the module lives on a modulePath
+		// 		that is a whole URL, with protocol and a domain. The versions of Dojo that are on
+		// 		the Google and AOL CDNs use the xdomain loader.
+		// 
+		// 		If the module is loaded via the xdomain loader, it is an asynchronous load, since
+		// 		the module is added via a dynamically created script tag. This
+		// 		means that dojo.require() can return before the module has loaded. However, this 
+		// 		should only happen in the case where you do dojo.require calls in the top-level
+		// 		HTML page, or if you purposely avoid the loader checking for dojo.require
+		// 		dependencies in your module by using a syntax like dojo["require"] to load the module.
+		// 
+		// 		Sometimes it is useful to not have the loader detect the dojo.require calls in the
+		// 		module so that you can dynamically load the modules as a result of an action on the
+		// 		page, instead of right at module load time.
+		// 
+		// 		Also, for script blocks in an HTML page, the loader does not pre-process them, so
+		// 		it does not know to download the modules before the dojo.require calls occur.
+		// 
+		// 		So, in those two cases, when you want on-the-fly module loading or for script blocks
+		// 		in the HTML page, special care must be taken if the dojo.required code is loaded
+		// 		asynchronously. To make sure you can execute code that depends on the dojo.required
+		// 		modules, be sure to add the code that depends on the modules in a dojo.addOnLoad()
+		// 		callback. dojo.addOnLoad waits for all outstanding modules to finish loading before
+		// 		executing. Example:
+		// 
+		//	   	|	<script type="text/javascript">
+		//		|	dojo.require("foo");
+		//		|	dojo.require("bar");
+		//	   	|	dojo.addOnLoad(function(){
+		//	   	|		//you can now safely do something with foo and bar
+		//	   	|	});
+		//	   	|	</script>
+		// 
+		// 		This type of syntax works with both xdomain and normal loaders, so it is good
+		// 		practice to always use this idiom for on-the-fly code loading and in HTML script
+		// 		blocks. If at some point you change loaders and where the code is loaded from,
+		// 		it will all still work.
+		// 
+		// 		More on how dojo.require
 		//		`dojo.require("A.B")` first checks to see if symbol A.B is
 		//		defined. If it is, it is simply returned (nothing to do).
 		//	
@@ -819,7 +939,8 @@ dojo.global = {
 		//		`dojo.require` 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`.
+		//		It returns the object `A.B`, but note the caveats above about on-the-fly loading and
+		// 		HTML script blocks when the xdomain loader is loading a module.
 		//	
 		//		`dojo.require()` does nothing about importing symbols into
 		//		the current namespace.  It is presumed that the caller will
@@ -835,19 +956,19 @@ dojo.global = {
 		//		|	var B = dojo.require("A.B");
 		//	   	|	...
 		//	returns: the required namespace object
-		omitModuleCheck = this._global_omit_module_check || omitModuleCheck;
+		omitModuleCheck = d._global_omit_module_check || omitModuleCheck;
 
 		//Check if it is already loaded.
-		var module = this._loadedModules[moduleName];
+		var module = d._loadedModules[moduleName];
 		if(module){
 			return module;
 		}
 
 		// convert periods to slashes
-		var relpath = this._getModuleSymbols(moduleName).join("/") + '.js';
+		var relpath = d._getModuleSymbols(moduleName).join("/") + '.js';
 
-		var modArg = (!omitModuleCheck) ? moduleName : null;
-		var ok = this._loadPath(relpath, modArg);
+		var modArg = !omitModuleCheck ? moduleName : null;
+		var ok = d._loadPath(relpath, modArg);
 
 		if(!ok && !omitModuleCheck){
 			throw new Error("Could not load '" + moduleName + "'; last tried '" + relpath + "'");
@@ -855,9 +976,9 @@ dojo.global = {
 
 		// check that the symbol was defined
 		// Don't bother if we're doing xdomain (asynchronous) loading.
-		if(!omitModuleCheck && !this._isXDomain){
+		if(!omitModuleCheck && !d._isXDomain){
 			// pass in false so we can give better error
-			module = this._loadedModules[moduleName];
+			module = d._loadedModules[moduleName];
 			if(!module){
 				throw new Error("symbol '" + moduleName + "' is not defined after loading '" + relpath + "'"); 
 			}
@@ -868,15 +989,18 @@ dojo.global = {
 
 	dojo.provide = function(/*String*/ resourceName){
 		//	summary:
+		//		Register a resource with the package system. Works in conjunction with `dojo.require`
+		//
+		//	description:
+		//		Each javascript source file is called a resource.  When a
+		//		resource is loaded by the browser, `dojo.provide()` registers
+		//		that it has been loaded.
+		//
 		//		Each javascript source file must have at least one
 		//		`dojo.provide()` call at the top of the file, corresponding to
 		//		the file name.  For example, `js/dojo/foo.js` must have
 		//		`dojo.provide("dojo.foo");` before any calls to
 		//		`dojo.require()` are made.
-		//	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
@@ -891,6 +1015,13 @@ dojo.global = {
 		//		are combined into one bigger file (similar to a .lib or .jar
 		//		file), that file may contain multiple dojo.provide() calls, to
 		//		note that it includes multiple resources.
+		//
+		// resourceName: String
+		//		A dot-sperated string identifying a resource. 
+		//
+		// example:
+		//	Safely create a `my` object, and make dojo.require("my.CustomModule") work
+		//	|	dojo.provide("my.CustomModule"); 
 
 		//Make sure we have a string.
 		resourceName = resourceName + "";
@@ -938,8 +1069,12 @@ dojo.global = {
 
 	dojo.requireIf = function(/*Boolean*/ condition, /*String*/ resourceName){
 		// summary:
-		//		If the condition is true then call dojo.require() for the specified
+		//		If the condition is true then call `dojo.require()` for the specified
 		//		resource
+		//
+		// example:
+		//	|	dojo.requireIf(dojo.isBrowser, "my.special.Module");
+		
 		if(condition === true){
 			// FIXME: why do we support chained require()'s here? does the build system?
 			var args = [];
@@ -954,7 +1089,7 @@ dojo.global = {
 
 	dojo.registerModulePath = function(/*String*/module, /*String*/prefix){
 		//	summary: 
-		//		maps a module name to a path
+		//		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
@@ -1013,7 +1148,10 @@ dojo.global = {
 		//		bundle is found
 		//
 		// bundleName: 
-		//		bundle name, i.e. the filename without the '.js' suffix
+		//		bundle name, i.e. the filename without the '.js' suffix. Using "nls" as a
+		//		a bundle name is not supported, since "nls" is the name of the folder
+		//		that holds bundles. Using "nls" as the bundle name will cause problems
+		//		with the custom build.
 		//
 		// locale: 
 		//		the locale to load (optional)  By default, the browser's user
@@ -1057,10 +1195,10 @@ dojo.global = {
 	};
 
 
-	var ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$");
-	var ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$");
+	var ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"),
+		ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$");
 
-	dojo._Url = function(/*dojo._Url||String...*/){
+	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
@@ -1071,10 +1209,9 @@ dojo.global = {
 		//		the current document use:
 		//      	new dojo._Url(document.baseURI, url)
 
-		var n = null;
-
-		var _a = arguments;
-		var uri = [_a[0]];
+		var n = null,
+			_a = arguments,
+			uri = [_a[0]];
 		// resolve uri components relative to each other
 		for(var i = 1; i<_a.length; i++){
 			if(!_a[i]){ continue; }
@@ -1082,8 +1219,8 @@ dojo.global = {
 			// 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]+"");
+			var relobj = new d._Url(_a[i]+""),
+				uriobj = new d._Url(uri[0]+"");
 
 			if(
 				relobj.path == "" &&
@@ -1177,7 +1314,7 @@ dojo.global = {
 		//		Returns a `dojo._Url` object relative to a module.
 		//	example:
 		//	|	var pngPath = dojo.moduleUrl("acme","images/small.png");
-		//	|	 // list the object properties
+		//	|	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
@@ -1215,7 +1352,7 @@ dojo.global = {
 			loc = d.baseUrl + loc;
 		}
 
-		return new d._Url(loc, url); // String
+		return new d._Url(loc, url); // dojo._Url
 	}
 })();
 
@@ -1277,10 +1414,12 @@ dojo = {
 	isOpera: 0,
 	//	isSafari: Number | undefined
 	//		Version as a Number if client is Safari or iPhone. undefined otherwise.
-	isSafari: 0
+	isSafari: 0,
 	//	isChrome: Number | undefined
 	//		Version as a Number if client is Chrome browser. undefined otherwise.
 	isChrome: 0
+	//	isMac: Boolean
+	//		True if the client runs on Mac
 }
 =====*/
 
@@ -1334,6 +1473,7 @@ if(typeof window != 'undefined'){
 		d.isKhtml = (dav.indexOf("Konqueror") >= 0) ? tv : 0;
 		d.isWebKit = parseFloat(dua.split("WebKit/")[1]) || undefined;
 		d.isChrome = parseFloat(dua.split("Chrome/")[1]) || undefined;
+		d.isMac = dav.indexOf("Macintosh") >= 0;
 
 		// safari detection derived from:
 		//		http://developer.apple.com/internet/safari/faq.html#anchor2
@@ -1352,16 +1492,19 @@ if(typeof window != 'undefined'){
 				if(dua.indexOf("Gecko") >= 0 && !d.isKhtml && !d.isWebKit){ d.isMozilla = d.isMoz = tv; }
 		if(d.isMoz){
 			//We really need to get away from this. Consider a sane isGecko approach for the future.
-			d.isFF = parseFloat(dua.split("Firefox/")[1] || dua.split("Minefield/")[1] || dua.split("Shiretoko/")[1]) || undefined;
+			d.isFF = parseFloat(dua.split("Firefox/")[1] || dua.split("Minefield/")[1]) || undefined;
 		}
 		if(document.all && !d.isOpera){
 			d.isIE = parseFloat(dav.split("MSIE ")[1]) || undefined;
 			//In cases where the page has an HTTP header or META tag with
-			//X-UA-Compatible, then it is in emulation mode, for a previous
-			//version. Make sure isIE reflects the desired version.
+			//X-UA-Compatible, then it is in emulation mode.
+			//Make sure isIE reflects the desired version.
 			//document.documentMode of 5 means quirks mode.
-			if(d.isIE >= 8 && document.documentMode != 5){
-				d.isIE = document.documentMode;
+			//Only switch the value if documentMode's major version
+			//is different from isIE's major version.
+			var mode = document.documentMode;
+			if(mode && mode != 5 && Math.floor(d.isIE) != mode){
+				d.isIE = mode;
 			}
 		}
 
@@ -1371,8 +1514,7 @@ if(typeof window != 'undefined'){
 			dojo.config.ieForceActiveXXhr=true;
 		}
 		
-		var cm = document.compatMode;
-		d.isQuirks = cm == "BackCompat" || cm == "QuirksMode" || d.isIE < 6;
+		d.isQuirks = document.compatMode == "BackCompat";
 
 		// TODO: is the HTML LANG attribute relevant?
 		d.locale = dojo.config.locale || (d.isIE ? n.userLanguage : n.language).toLowerCase();
@@ -1411,11 +1553,12 @@ if(typeof window != 'undefined'){
 		}
 
 		d._isDocumentOk = function(http){
-			var stat = http.status || 0;
+			var stat = http.status || 0,
+				lp = location.protocol;
 			return (stat >= 200 && stat < 300) || 	// Boolean
 				stat == 304 || 						// allow any 2XX response code
 				stat == 1223 || 						// get it out of the cache
-				(!stat && (location.protocol=="file:" || location.protocol=="chrome:") ); // Internet Explorer mangled the status code
+				(!stat && (lp == "file:" || lp == "chrome:" || lp == "app:") ); // Internet Explorer mangled the status code OR we're Titanium requesting a local file
 		}
 
 		//See if base tag is in use.
@@ -1442,7 +1585,7 @@ if(typeof window != 'undefined'){
 			//		failure and failure is okay (an exception otherwise)
 
 			// NOTE: must be declared before scope switches ie. this._xhrObj()
-			var http = this._xhrObj();
+			var http = d._xhrObj();
 
 			if(!hasBase && dojo._Url){
 				uri = (new dojo._Url(owloc, uri)).toString();
@@ -1479,11 +1622,11 @@ if(typeof window != 'undefined'){
 			//		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(){
+			var _a = _w.attachEvent || _w.addEventListener;
+			evtName = _w.attachEvent ? evtName : evtName.substring(2);
+			_a(evtName, function(){
 				fp.apply(_w, arguments);
-				oldHandler.apply(_w, arguments);
-			};
+			}, false);
 		};
 
 
@@ -1568,53 +1711,33 @@ if(typeof window != 'undefined'){
 
 	})();
 
+	//START DOMContentLoaded
 	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._initFired){
+			dojo._initFired = true;
 
-		if(dojo._inFlightCount == 0){
-			dojo._modulesLoaded();
+			//Help out IE to avoid memory leak.
+			if(!dojo.config.afterOnLoad && window.detachEvent){
+				window.detachEvent("onload", dojo._loadInit);
+			}
+
+			if(dojo._inFlightCount == 0){
+				dojo._modulesLoaded();
+			}
 		}
 	}
 
 	if(!dojo.config.afterOnLoad){
-		//	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.isWebKit > 525 || 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(document.addEventListener){
+			//Standards. Hooray! Assumption here that if standards based,
+			//it knows about DOMContentLoaded. It is OK if it does not, the fall through
+			//to window onload should be good enough.
+			document.addEventListener("DOMContentLoaded", dojo._loadInit, false);
+			window.addEventListener("load", dojo._loadInit, false);
+		}else if(window.attachEvent){
+			window.attachEvent("onload", dojo._loadInit);
 		}
-			
-				if(dojo.isAIR){
-			window.addEventListener("load", dojo._loadInit, null);
-		}else if((dojo.isWebKit < 525) || dojo.isKhtml){
-			dojo._khtmlTimer = setInterval(function(){
-				if(/loaded|complete/.test(document.readyState)){
-					dojo._loadInit(); // call the onload handler
-				}
-			}, 10);
-		}
-				//	END DOMContentLoaded
 	}
 
 		if(dojo.isIE){
@@ -1623,7 +1746,7 @@ if(typeof window != 'undefined'){
 		// 	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){
+		if(!dojo.config.afterOnLoad && !dojo.config.skipIeDomLoaded){
 			document.write('<scr'+'ipt defer src="//:" '
 				+ 'onreadystatechange="if(this.readyState==\'complete\'){' + dojo._scopeName + '._loadInit();}">'
 				+ '</scr'+'ipt>'
@@ -1632,10 +1755,19 @@ if(typeof window != 'undefined'){
 
 		try{
 			document.namespaces.add("v","urn:schemas-microsoft-com:vml");
-			document.createStyleSheet().addRule("v\\:*", "behavior:url(#default#VML);  display:inline-block");
+			var vmlElems = ["*", "group", "roundrect", "oval", "shape", "rect", "imagedata"],
+				i = 0, l = 1, s = document.createStyleSheet();
+			if(dojo.isIE >= 8){
+				i = 1;
+				l = vmlElems.length;
+			}
+			for(; i < l; ++i){
+				s.addRule("v\\:" + vmlElems[i], "behavior:url(#default#VML); display:inline-block");
+			}
 		}catch(e){}
 	}
-	
+		//END DOMContentLoaded
+
 
 	/*
 	OpenAjax.subscribe("OpenAjax", "onload", function(){
@@ -1678,474 +1810,1623 @@ if(!dojo._hasResource["dojo._base.lang"]){ //_hasResource checks added by build.
 dojo._hasResource["dojo._base.lang"] = true;
 dojo.provide("dojo._base.lang");
 
-// Crockford (ish) functions
+(function(){
+	var d = dojo, opts = Object.prototype.toString;
 
-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
-}
+	// Crockford (ish) functions
 
-dojo.isArray = function(/*anything*/ it){
-	//	summary:
-	//		Return true if it is an Array
-	return it && (it instanceof Array || typeof it == "array"); // Boolean
-}
+	dojo.isString = function(/*anything*/ it){
+		//	summary:
+		//		Return true if it is a String
+		return (typeof it == "string" || it instanceof String); // Boolean
+	}
 
-/*=====
-dojo.isFunction = function(it){
-	// summary: Return true if it is a Function
-	// it: anything
-	return; // Boolean
-}
-=====*/
+	dojo.isArray = function(/*anything*/ it){
+		//	summary:
+		//		Return true if it is an Array.
+		//		Does not work on Arrays created in other windows.
+		return it && (it instanceof Array || typeof it == "array"); // Boolean
+	}
 
-dojo.isFunction = (function(){
-	var _isFunction = function(/*anything*/ it){
-		var t = typeof it; // must evaluate separately due to bizarre Opera bug. See #8937 
-		return it && (t == "function" || it instanceof Function); // Boolean
+	dojo.isFunction = function(/*anything*/ it){
+		// summary:
+		//		Return true if it is a Function
+		return opts.call(it) === "[object Function]";
 	};
 
-	return dojo.isSafari ?
-		// only slow this down w/ gratuitious casting in Safari (not WebKit)
-		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().
-	//	returns:
-	//		If it walks like a duck and quacks like a duck, return `true`
-	var d = dojo;
-	return it && it !== undefined && // Boolean
-		// keep out built-in constructors (Number, String, ...) which have length
-		// properties
-		!d.isString(it) && !d.isFunction(it) &&
-		!(it.tagName && it.tagName.toLowerCase() == 'form') &&
-		(d.isArray(it) || isFinite(it.length));
-}
-
-dojo.isAlien = function(/*anything*/ it){
-	// summary: 
-	//		Returns true if it is a built-in function or some other kind of
-	//		oddball that *should* report as a function but doesn't
-	return it && !dojo.isFunction(it) && /\{\s*\[native code\]\s*\}/.test(String(it)); // Boolean
-}
+	dojo.isObject = function(/*anything*/ it){
+		// summary:
+		//		Returns true if it is a JavaScript object (or an Array, a Function
+		//		or null)
+		return it !== undefined &&
+			(it === null || typeof it == "object" || d.isArray(it) || d.isFunction(it)); // Boolean
+	}
 
-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]);
+	dojo.isArrayLike = function(/*anything*/ it){
+		//	summary:
+		//		similar to dojo.isArray() but more permissive
+		//	description:
+		//		Doesn't strongly test for "arrayness".  Instead, settles for "isn't
+		//		a string or number and has a length property". Arguments objects
+		//		and DOM collections will return true when passed to
+		//		dojo.isArrayLike(), but will return false when passed to
+		//		dojo.isArray().
+		//	returns:
+		//		If it walks like a duck and quacks like a duck, return `true`
+		return it && it !== undefined && // Boolean
+			// keep out built-in constructors (Number, String, ...) which have length
+			// properties
+			!d.isString(it) && !d.isFunction(it) &&
+			!(it.tagName && it.tagName.toLowerCase() == 'form') &&
+			(d.isArray(it) || isFinite(it.length));
 	}
-	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.isAlien = function(/*anything*/ it){
+		// summary:
+		//		Returns true if it is a built-in function or some other kind of
+		//		oddball that *should* report as a function but doesn't
+		return it && !d.isFunction(it) && /\{\s*\[native code\]\s*\}/.test(String(it)); // Boolean
+	}
 
-dojo.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
+	dojo.extend = function(/*Object*/ constructor, /*Object...*/ props){
+		// summary:
+		//		Adds all properties and methods of props to constructor's
+		//		prototype, making them available to all instances created with
+		//		constructor.
+		for(var i=1, l=arguments.length; i<l; i++){
+			d._mixin(constructor.prototype, arguments[i]);
+		}
+		return constructor; // Object
 	}
-	if(!method){
-		method = scope;
-		scope = null;
+
+	dojo._hitchArgs = function(scope, method /*,...*/){
+		var pre = d._toArray(arguments, 2);
+		var named = d.isString(method);
+		return function(){
+			// arrayify arguments
+			var args = d._toArray(arguments);
+			// locate our method
+			var f = named ? (scope||d.global)[method] : method;
+			// invoke with collected args
+			return f && f.apply(scope || this, pre.concat(args)); // mixed
+		} // Function
 	}
-	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
+
+	dojo.hitch = function(/*Object*/scope, /*Function|String*/method /*,...*/){
+		//	summary:
+		//		Returns a function that will only ever execute in the a given scope.
+		//		This allows for easy use of object member functions
+		//		in callbacks and other places in which the "this" keyword may
+		//		otherwise not reference the expected scope.
+		//		Any number of default positional arguments may be passed as parameters 
+		//		beyond "method".
+		//		Each of these values will be used to "placehold" (similar to curry)
+		//		for the hitched function.
+		//	scope:
+		//		The scope to use when method executes. If method is a string,
+		//		scope is also the object containing method.
+		//	method:
+		//		A function to be hitched to scope, or the name of the method in
+		//		scope to be hitched.
+		//	example:
+		//	|	dojo.hitch(foo, "bar")();
+		//		runs foo.bar() in the scope of foo
+		//	example:
+		//	|	dojo.hitch(foo, myFunction);
+		//		returns a function that runs myFunction in the scope of foo
+		//	example:
+		//		Expansion on the default positional arguments passed along from
+		//		hitch. Passed args are mixed first, additional args after.
+		//	|	var foo = { bar: function(a, b, c){ console.log(a, b, c); } };
+		//	|	var fn = dojo.hitch(foo, "bar", 1, 2);
+		//	|	fn(3); // logs "1, 2, 3"
+		//	example:
+		//	|	var foo = { bar: 2 };
+		//	|	dojo.hitch(foo, function(){ this.bar = 10; })();
+		//		execute an anonymous function in scope of foo
+		
+		if(arguments.length > 2){
+			return d._hitchArgs.apply(d, arguments); // Function
+		}
+		if(!method){
+			method = scope;
+			scope = null;
+		}
+		if(d.isString(method)){
+			scope = scope || d.global;
+			if(!scope[method]){ throw(['dojo.hitch: scope["', method, '"] is null (scope="', scope, '")'].join('')); }
+			return function(){ return scope[method].apply(scope, arguments || []); }; // Function
+		}
+		return !scope ? method : function(){ return method.apply(scope, arguments || []); }; // Function
 	}
-	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 = function(obj, props){
+		//	summary:
+		//		Returns a new object which "looks" to obj for properties which it
+		//		does not have a value for. Optionally takes a bag of properties to
+		//		seed the returned object with initially.
+		//	description:
+		//		This is a small implementaton of the Boodman/Crockford delegation
+		//		pattern in JavaScript. An intermediate object constructor mediates
+		//		the prototype chain for the returned object, using it to delegate
+		//		down to obj for property lookup when object-local lookup fails.
+		//		This can be thought of similarly to ES4's "wrap", save that it does
+		//		not act on types but rather on pure objects.
+		//	obj:
+		//		The object to delegate to for properties not found directly on the
+		//		return object or in props.
+		//	props:
+		//		an object containing properties to assign to the returned object
+		//	returns:
+		//		an Object of anonymous type
+		//	example:
+		//	|	var foo = { bar: "baz" };
+		//	|	var thinger = dojo.delegate(foo, { thud: "xyzzy"});
+		//	|	thinger.bar == "baz"; // delegated to foo
+		//	|	foo.thud == undefined; // by definition
+		//	|	thinger.thud == "xyzzy"; // mixed in from props
+		//	|	foo.bar = "thonk";
+		//	|	thinger.bar == "thonk"; // still delegated to foo's bar
+	}
+	=====*/
 
-dojo.delegate = dojo._delegate = (function(){
-	// boodman/crockford delegation w/ cornford optimization
-	function TMP(){}
-	return function(obj, props){
-		TMP.prototype = obj;
-		var tmp = new TMP();
-		if(props){
-			dojo._mixin(tmp, props);
+	dojo.delegate = dojo._delegate = (function(){
+		// boodman/crockford delegation w/ cornford optimization
+		function TMP(){}
+		return function(obj, props){
+			TMP.prototype = obj;
+			var tmp = new TMP();
+			TMP.prototype = null;
+			if(props){
+				d._mixin(tmp, props);
+			}
+			return tmp; // Object
 		}
-		return tmp; // Object
-	}
-})();
+	})();
 
-/*=====
-dojo._toArray = function(obj, offset, startWith){
-	//	summary:
-	//		Converts an array-like object (i.e. arguments, DOMCollection) to an
-	//		array. Returns a new Array with the elements of obj.
-	//	obj: Object
-	//		the object to "arrayify". We expect the object to have, at a
-	//		minimum, a length property which corresponds to integer-indexed
-	//		properties.
-	//	offset: Number?
-	//		the location in obj to start iterating from. Defaults to 0.
-	//		Optional.
-	//	startWith: Array?
-	//		An array to pack with the properties of obj. If provided,
-	//		properties in obj are appended at the end of startWith and
-	//		startWith is the returned array.
-}
-=====*/
+	/*=====
+	dojo._toArray = function(obj, offset, startWith){
+		//	summary:
+		//		Converts an array-like object (i.e. arguments, DOMCollection) to an
+		//		array. Returns a new Array with the elements of obj.
+		//	obj: Object
+		//		the object to "arrayify". We expect the object to have, at a
+		//		minimum, a length property which corresponds to integer-indexed
+		//		properties.
+		//	offset: Number?
+		//		the location in obj to start iterating from. Defaults to 0.
+		//		Optional.
+		//	startWith: Array?
+		//		An array to pack with the properties of obj. If provided,
+		//		properties in obj are appended at the end of startWith and
+		//		startWith is the returned array.
+	}
+	=====*/
 
-(function(){
 	var efficient = function(obj, offset, startWith){
 		return (startWith||[]).concat(Array.prototype.slice.call(obj, offset||0));
 	};
 
 		var slow = function(obj, offset, startWith){
-		var arr = startWith||[]; 
-		for(var x = offset || 0; x < obj.length; x++){ 
-			arr.push(obj[x]); 
-		} 
+		var arr = startWith||[];
+		for(var x = offset || 0; x < obj.length; x++){
+			arr.push(obj[x]);
+		}
 		return arr;
 	};
 	
-	dojo._toArray = 
-				dojo.isIE ?  function(obj){
+	dojo._toArray =
+				d.isIE ?  function(obj){
 			return ((obj.item) ? slow : efficient).apply(this, arguments);
-		} : 
+		} :
 				efficient;
 
-})();
+	dojo.partial = function(/*Function|String*/method /*, ...*/){
+		//	summary:
+		//		similar to hitch() except that the scope object is left to be
+		//		whatever the execution context eventually becomes.
+		//	description:
+		//		Calling dojo.partial is the functional equivalent of calling:
+		//		|	dojo.hitch(null, funcName, ...);
+		var arr = [ null ];
+		return d.hitch.apply(d, arr.concat(d._toArray(arguments))); // Function
+	}
 
-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
-}
+	var extraNames = d._extraNames, extraLen = extraNames.length, empty = {};
 
-dojo.clone = function(/*anything*/ o){
-	// summary:
-	//		Clones objects (including DOM nodes) and all children.
-	//		Warning: do not clone cyclic structures.
-	if(!o){ return o; }
-	if(dojo.isArray(o)){
-		var r = [];
-		for(var i = 0; i < o.length; ++i){
-			r.push(dojo.clone(o[i]));
+	dojo.clone = function(/*anything*/ o){
+		// summary:
+		//		Clones objects (including DOM nodes) and all children.
+		//		Warning: do not clone cyclic structures.
+		if(!o || typeof o != "object" || d.isFunction(o)){
+			// null, undefined, any non-object, or function
+			return o;	// anything
+		}
+		if(o.nodeType && "cloneNode" in o){
+			// DOM Node
+			return o.cloneNode(true); // Node
+		}
+		if(o instanceof Date){
+			// Date
+			return new Date(o.getTime());	// Date
+		}
+		var r, i, l, s, name;
+		if(d.isArray(o)){
+			// array
+			r = [];
+			for(i = 0, l = o.length; i < l; ++i){
+				if(i in o){
+					r.push(d.clone(o[i]));
+				}
+			}
+// we don't clone functions for performance reasons
+//		}else if(d.isFunction(o)){
+//			// function
+//			r = function(){ return o.apply(this, arguments); };
+		}else{
+			// generic objects
+			r = o.constructor ? new o.constructor() : {};
 		}
-		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
-	r = new o.constructor(); // specific to dojo.declare()'d classes!
-	for(i in o){
-		if(!(i in r) || r[i] != o[i]){
-			r[i] = dojo.clone(o[i]);
+		for(name in o){
+			// the "tobj" condition avoid copying properties in "source"
+			// inherited from Object.prototype.  For example, if target has a custom
+			// toString() method, don't overwrite it with the toString() method
+			// that source inherited from Object.prototype
+			s = o[name];
+			if(!(name in r) || (r[name] !== s && (!(name in empty) || empty[name] !== s))){
+				r[name] = d.clone(s);
+			}
+		}
+				// IE doesn't recognize some custom functions in for..in
+		if(extraLen){
+			for(i = 0; i < extraLen; ++i){
+				name = extraNames[i];
+				s = o[name];
+				if(!(name in r) || (r[name] !== s && (!(name in empty) || empty[name] !== s))){
+					r[name] = s; // functions only, we don't clone them
+				}
+			}
 		}
+				return r; // Object
 	}
-	return r; // Object
-}
 
-/*=====
-dojo.trim = function(str){
-	//	summary:
-	//		Trims whitespace from both sides of the string
-	//	str: String
-	//		String to be trimmed
-	//	returns: String
-	//		Returns the trimmed string
-	//	description:
-	//		This version of trim() was selected for inclusion into the base due
-	//		to its compact size and relatively good performance
-	//		(see [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript)
-	//		Uses String.prototype.trim instead, if available.
-	//		The fastest but longest version of this function is located at
-	//		dojo.string.trim()
-	return "";	// String
-}
-=====*/
+	/*=====
+	dojo.trim = function(str){
+		//	summary:
+		//		Trims whitespace from both sides of the string
+		//	str: String
+		//		String to be trimmed
+		//	returns: String
+		//		Returns the trimmed string
+		//	description:
+		//		This version of trim() was selected for inclusion into the base due
+		//		to its compact size and relatively good performance
+		//		(see [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript)
+		//		Uses String.prototype.trim instead, if available.
+		//		The fastest but longest version of this function is located at
+		//		dojo.string.trim()
+		return "";	// String
+	}
+	=====*/
 
-dojo.trim = String.prototype.trim ?
-	function(str){ return str.trim(); } :
-	function(str){ return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); };
+	dojo.trim = String.prototype.trim ?
+		function(str){ return str.trim(); } :
+		function(str){ return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); };
 
-}
+	/*=====
+	dojo.replace = function(tmpl, map, pattern){
+		//	summary:
+		//		Performs parameterized substitutions on a string. Throws an
+		//		exception if any parameter is unmatched. 
+		//	tmpl: String
+		//		String to be used as a template.
+		//	map: Object|Function
+		//		If an object, it is used as a dictionary to look up substitutions.
+		//		If a function, it is called for every substitution with following
+		//		parameters: a whole match, a name, an offset, and the whole template
+		//		string (see https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/replace
+		//		for more details).
+		//	pattern: RegEx?
+		//		Optional regular expression objects that overrides the default pattern.
+		//		Must be global and match one item. The default is: /\{([^\}]+)\}/g,
+		//		which matches patterns like that: "{xxx}", where "xxx" is any sequence
+		//		of characters, which doesn't include "}".
+		//	returns: String
+		//		Returns the substituted string.
+		//	example:
+		//	|	// uses a dictionary for substitutions:
+		//	|	dojo.replace("Hello, {name.first} {name.last} AKA {nick}!",
+		//	|	  {
+		//	|	    nick: "Bob",
+		//	|	    name: {
+		//	|	      first:  "Robert",
+		//	|	      middle: "X",
+		//	|	      last:   "Cringely"
+		//	|	    }
+		//	|	  });
+		//	|	// returns: Hello, Robert Cringely AKA Bob!
+		//	example:
+		//	|	// uses an array for substitutions:
+		//	|	dojo.replace("Hello, {0} {2}!",
+		//	|	  ["Robert", "X", "Cringely"]);
+		//	|	// returns: Hello, Robert Cringely!
+		//	example:
+		//	|	// uses a function for substitutions:
+		//	|	function sum(a){
+		//	|	  var t = 0;
+		//	|	  dojo.forEach(a, function(x){ t += x; });
+		//	|	  return t;
+		//	|	}
+		//	|	dojo.replace(
+		//	|	  "{count} payments averaging {avg} USD per payment.",
+		//	|	  dojo.hitch(
+		//	|	    { payments: [11, 16, 12] },
+		//	|	    function(_, key){
+		//	|	      switch(key){
+		//	|	        case "count": return this.payments.length;
+		//	|	        case "min":   return Math.min.apply(Math, this.payments);
+		//	|	        case "max":   return Math.max.apply(Math, this.payments);
+		//	|	        case "sum":   return sum(this.payments);
+		//	|	        case "avg":   return sum(this.payments) / this.payments.length;
+		//	|	      }
+		//	|	    }
+		//	|	  )
+		//	|	);
+		//	|	// prints: 3 payments averaging 13 USD per payment.
+		//	example:
+		//	|	// uses an alternative PHP-like pattern for substitutions:
+		//	|	dojo.replace("Hello, ${0} ${2}!",
+		//	|	  ["Robert", "X", "Cringely"], /\$\{([^\}]+)\}/g);
+		//	|	// returns: Hello, Robert Cringely!
+		return "";	// String
+	}
+	=====*/
 
-if(!dojo._hasResource["dojo._base.declare"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo._base.declare"] = true;
-dojo.provide("dojo._base.declare");
+	var _pattern = /\{([^\}]+)\}/g;
+	dojo.replace = function(tmpl, map, pattern){
+		return tmpl.replace(pattern || _pattern, d.isFunction(map) ?
+			map : function(_, k){ return d.getObject(k, false, map); });
+	};
+})();
 
+}
 
-// this file courtesy of the TurboAjax Group, licensed under a Dojo CLA
+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.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 = arguments.callee, mixins;
-	if(dojo.isArray(superclass)){
-		mixins = superclass;
-		superclass = mixins.shift();
-	}
-	// construct intermediate classes for mixins
-	if(mixins){
-		dojo.forEach(mixins, function(m, i){
-			if(!m){ throw(className + ": mixin #" + i + " is null"); } // It's likely a required module is not loaded
-			superclass = dd._delegate(superclass, m);
-		});
-	}
-	// create constructor
-	var ctor = dd._delegate(superclass);
-	// extend with "props"
-	props = props || {};
-	ctor.extend(props);
-	// more prototype decoration
-	dojo.extend(ctor, {declaredClass: className, _constructor: props.constructor/*, preamble: null*/});
-	// special help for IE
-	ctor.prototype.constructor = ctor;
-	// create named reference
-	return dojo.setObject(className, ctor); // Function
-};
+dojo.provide("dojo._base.array");
 
-dojo.mixin(dojo.declare, {
-	_delegate: function(base, mixin){
-		var bp = (base||0).prototype, mp = (mixin||0).prototype, dd=dojo.declare;
-		// fresh constructor, fresh prototype
-		var ctor = dd._makeCtor();
-		// cache ancestry
-		dojo.mixin(ctor, {superclass: bp, mixin: mp, extend: dd._extend});
-		// chain prototypes
-		if(base){ctor.prototype = dojo._delegate(bp);}
-		// add mixin and core
-		dojo.extend(ctor, dd._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){
-		var i, fn;
-		for(i in props){ if(dojo.isFunction(fn=props[i]) && !0[i]){fn.nom=i;fn.ctor=this;} }
-		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._findMixin && (m=m._findMixin(mixin))){return m;}
-				c = p && p.constructor;
+(function(){
+	var _getParts = function(arr, obj, cb){
+		return [ 
+			(typeof arr == "string") ? arr.split("") : arr, 
+			obj || dojo.global,
+			// FIXME: cache the anonymous functions we create here?
+			(typeof cb == "string") ? new Function("item", "index", "array", cb) : cb
+		];
+	};
+
+	var everyOrSome = function(/*Boolean*/every, /*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
+		var _p = _getParts(arr, thisObject, callback); arr = _p[0];
+		for(var i=0,l=arr.length; i<l; ++i){
+			var result = !!_p[2].call(_p[1], arr[i], i, arr);
+			if(every ^ result){
+				return result; // Boolean
 			}
-		},
-		_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
-			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){
-				// start from memoized prototype, or
-				// find a prototype that has property 'name' == 'c'
-				mp = (c.ctor||0).superclass || this._findMethod(name, c, p, true);
-				if(!mp){throw(this.declaredClass + ': inherited method "' + name + '" mismatch');}
-				// find a prototype that has property 'name' != 'c'
-				p = this._findMethod(name, c, mp, false);
-			}
-			// we expect 'name' to be in prototype 'p'
-			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);
 		}
-	}
-});
-
-}
+		return every; // Boolean
+	};
 
-if(!dojo._hasResource["dojo._base.connect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+	dojo.mixin(dojo, {
+		indexOf: function(	/*Array*/		array, 
+							/*Object*/		value,
+							/*Integer?*/	fromIndex,
+							/*Boolean?*/	findLast){
+			// summary:
+			//		locates the first index of the provided value in the
+			//		passed array. If the value is not found, -1 is returned.
+			// description:
+			//		This method corresponds to the JavaScript 1.6 Array.indexOf method, with one difference: when
+			//		run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript 
+			//		1.6's indexOf skips the holes in the sparse array.
+			//		For details on this method, see:
+			//			https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/indexOf
+
+			var step = 1, end = array.length || 0, i = 0;
+			if(findLast){
+				i = end - 1;
+				step = end = -1;
+			}
+			if(fromIndex != undefined){ i = fromIndex; }
+			if((findLast && i > end) || i < end){
+				for(; i != end; i += step){
+					if(array[i] == value){ return i; }
+				}
+			}
+			return -1;	// Number
+		},
+
+		lastIndexOf: function(/*Array*/array, /*Object*/value, /*Integer?*/fromIndex){
+			// summary:
+			//		locates the last index of the provided value in the passed
+			//		array. If the value is not found, -1 is returned.
+			// description:
+			//		This method corresponds to the JavaScript 1.6 Array.lastIndexOf method, with one difference: when
+			//		run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript 
+			//		1.6's lastIndexOf skips the holes in the sparse array.
+			//		For details on this method, see:
+			// 			https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/lastIndexOf
+			return dojo.indexOf(array, value, fromIndex, true); // Number
+		},
+
+		forEach: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
+			//	summary:
+			//		for every item in arr, callback is invoked. Return values are ignored.
+			//		If you want to break out of the loop, consider using dojo.every() or dojo.some().
+			//		forEach does not allow breaking out of the loop over the items in arr.
+			//	arr:
+			//		the array to iterate over. If a string, operates on individual characters.
+			//	callback:
+			//		a function is invoked with three arguments: item, index, and array
+			//	thisObject:
+			//		may be used to scope the call to callback
+			//	description:
+			//		This function corresponds to the JavaScript 1.6 Array.forEach() method, with one difference: when 
+			//		run over sparse arrays, this implemenation passes the "holes" in the sparse array to
+			//		the callback function with a value of undefined. JavaScript 1.6's forEach skips the holes in the sparse array.
+			//		For more details, see:
+			//			https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/forEach
+			//	example:
+			//	|	// log out all members of the array:
+			//	|	dojo.forEach(
+			//	|		[ "thinger", "blah", "howdy", 10 ],
+			//	|		function(item){
+			//	|			console.log(item);
+			//	|		}
+			//	|	);
+			//	example:
+			//	|	// log out the members and their indexes
+			//	|	dojo.forEach(
+			//	|		[ "thinger", "blah", "howdy", 10 ],
+			//	|		function(item, idx, arr){
+			//	|			console.log(item, "at index:", idx);
+			//	|		}
+			//	|	);
+			//	example:
+			//	|	// use a scoped object member as the callback
+			//	|	
+			//	|	var obj = {
+			//	|		prefix: "logged via obj.callback:", 
+			//	|		callback: function(item){
+			//	|			console.log(this.prefix, item);
+			//	|		}
+			//	|	};
+			//	|	
+			//	|	// specifying the scope function executes the callback in that scope
+			//	|	dojo.forEach(
+			//	|		[ "thinger", "blah", "howdy", 10 ],
+			//	|		obj.callback,
+			//	|		obj
+			//	|	);
+			//	|	
+			//	|	// alternately, we can accomplish the same thing with dojo.hitch()
+			//	|	dojo.forEach(
+			//	|		[ "thinger", "blah", "howdy", 10 ],
+			//	|		dojo.hitch(obj, "callback")
+			//	|	);
+
+			// match the behavior of the built-in forEach WRT empty arrs
+			if(!arr || !arr.length){ return; }
+
+			// FIXME: there are several ways of handilng thisObject. Is
+			// dojo.global always the default context?
+			var _p = _getParts(arr, thisObject, callback); arr = _p[0];
+			for(var i=0,l=arr.length; i<l; ++i){ 
+				_p[2].call(_p[1], arr[i], i, arr);
+			}
+		},
+
+		every: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
+			// summary:
+			//		Determines whether or not every item in arr satisfies the
+			//		condition implemented by callback.
+			// arr:
+			//		the array to iterate on. If a string, operates on individual characters.
+			// callback:
+			//		a function is invoked with three arguments: item, index,
+			//		and array and returns true if the condition is met.
+			// thisObject:
+			//		may be used to scope the call to callback
+			// description:
+			//		This function corresponds to the JavaScript 1.6 Array.every() method, with one difference: when 
+			//		run over sparse arrays, this implemenation passes the "holes" in the sparse array to
+			//		the callback function with a value of undefined. JavaScript 1.6's every skips the holes in the sparse array.
+			//		For more details, see:
+			//			https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/every
+			// example:
+			//	|	// returns false
+			//	|	dojo.every([1, 2, 3, 4], function(item){ return item>1; });
+			// example:
+			//	|	// returns true 
+			//	|	dojo.every([1, 2, 3, 4], function(item){ return item>0; });
+			return everyOrSome(true, arr, callback, thisObject); // Boolean
+		},
+
+		some: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
+			// summary:
+			//		Determines whether or not any item in arr satisfies the
+			//		condition implemented by callback.
+			// arr:
+			//		the array to iterate over. If a string, operates on individual characters.
+			// callback:
+			//		a function is invoked with three arguments: item, index,
+			//		and array and returns true if the condition is met.
+			// thisObject:
+			//		may be used to scope the call to callback
+			// description:
+			//		This function corresponds to the JavaScript 1.6 Array.some() method, with one difference: when 
+			//		run over sparse arrays, this implemenation passes the "holes" in the sparse array to
+			//		the callback function with a value of undefined. JavaScript 1.6's some skips the holes in the sparse array.
+			//		For more details, see:
+			//			https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/some
+			// example:
+			//	|	// is true
+			//	|	dojo.some([1, 2, 3, 4], function(item){ return item>1; });
+			// example:
+			//	|	// is false
+			//	|	dojo.some([1, 2, 3, 4], function(item){ return item<1; });
+			return everyOrSome(false, arr, callback, thisObject); // Boolean
+		},
+
+		map: function(/*Array|String*/arr, /*Function|String*/callback, /*Function?*/thisObject){
+			// summary:
+			//		applies callback to each element of arr and returns
+			//		an Array with the results
+			// arr:
+			//		the array to iterate on. If a string, operates on
+			//		individual characters.
+			// callback:
+			//		a function is invoked with three arguments, (item, index,
+			//		array),  and returns a value
+			// thisObject:
+			//		may be used to scope the call to callback
+			// description:
+			//		This function corresponds to the JavaScript 1.6 Array.map() method, with one difference: when 
+			//		run over sparse arrays, this implemenation passes the "holes" in the sparse array to
+			//		the callback function with a value of undefined. JavaScript 1.6's map skips the holes in the sparse array.
+			//		For more details, see:
+			//			https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map
+			// example:
+			//	|	// returns [2, 3, 4, 5]
+			//	|	dojo.map([1, 2, 3, 4], function(item){ return item+1 });
+
+			var _p = _getParts(arr, thisObject, callback); arr = _p[0];
+			var outArr = (arguments[3] ? (new arguments[3]()) : []);
+			for(var i=0,l=arr.length; i<l; ++i){
+				outArr.push(_p[2].call(_p[1], arr[i], i, arr));
+			}
+			return outArr; // Array
+		},
+
+		filter: function(/*Array*/arr, /*Function|String*/callback, /*Object?*/thisObject){
+			// summary:
+			//		Returns a new Array with those items from arr that match the
+			//		condition implemented by callback.
+			// arr:
+			//		the array to iterate over.
+			// callback:
+			//		a function that is invoked with three arguments (item,
+			//		index, array). The return of this function is expected to
+			//		be a boolean which determines whether the passed-in item
+			//		will be included in the returned array.
+			// thisObject:
+			//		may be used to scope the call to callback
+			// description:
+			//		This function corresponds to the JavaScript 1.6 Array.filter() method, with one difference: when 
+			//		run over sparse arrays, this implemenation passes the "holes" in the sparse array to
+			//		the callback function with a value of undefined. JavaScript 1.6's filter skips the holes in the sparse array. 
+			//		For more details, see:
+			//			https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter
+			// example:
+			//	|	// returns [2, 3, 4]
+			//	|	dojo.filter([1, 2, 3, 4], function(item){ return item>1; });
+
+			var _p = _getParts(arr, thisObject, callback); arr = _p[0];
+			var outArr = [];
+			for(var i=0,l=arr.length; i<l; ++i){
+				if(_p[2].call(_p[1], arr[i], i, arr)){
+					outArr.push(arr[i]);
+				}
+			}
+			return outArr; // Array
+		}
+	});
+})();
+/*
+*/
+
+}
+
+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");
+
+
+
+
+(function(){
+	var d = dojo, mix = d._mixin, op = Object.prototype, opts = op.toString,
+		xtor = new Function, counter = 0, cname = "constructor";
+
+	function err(msg){ throw new Error("declare: " + msg); }
+
+	// C3 Method Resolution Order (see http://www.python.org/download/releases/2.3/mro/)
+	function c3mro(bases){
+		var result = [], roots = [{cls: 0, refs: []}], nameMap = {}, clsCount = 1,
+			l = bases.length, i = 0, j, lin, base, top, proto, rec, name, refs;
+
+		// build a list of bases naming them if needed
+		for(; i < l; ++i){
+			base = bases[i];
+			if(!base){
+				err("mixin #" + i + " is null");
+			}
+			lin = base._meta ? base._meta.bases : [base];
+			top = 0;
+			// add bases to the name map
+			for(j = lin.length - 1; j >= 0; --j){
+				proto = lin[j].prototype;
+				if(!proto.hasOwnProperty("declaredClass")){
+					proto.declaredClass = "uniqName_" + (counter++);
+				}
+				name = proto.declaredClass;
+				if(!nameMap.hasOwnProperty(name)){
+					nameMap[name] = {count: 0, refs: [], cls: lin[j]};
+					++clsCount;
+				}
+				rec = nameMap[name];
+				if(top && top !== rec){
+					rec.refs.push(top);
+					++top.count;
+				}
+				top = rec;
+			}
+			++top.count;
+			roots[0].refs.push(top);
+		}
+
+		// remove classes without external references recursively
+		while(roots.length){
+			top = roots.pop();
+			result.push(top.cls);
+			--clsCount;
+			// optimization: follow a single-linked chain
+			while(refs = top.refs, refs.length == 1){
+				top = refs[0];
+				if(!top || --top.count){
+					// branch or end of chain => do not end to roots
+					top = 0;
+					break;
+				}
+				result.push(top.cls);
+				--clsCount;
+			}
+			if(top){
+				// branch
+				for(i = 0, l = refs.length; i < l; ++i){
+					top = refs[i];
+					if(!--top.count){
+						roots.push(top);
+					}
+				}
+			}
+		}
+		if(clsCount){
+			err("can't build consistent linearization");
+		}
+
+		// calculate the superclass offset
+		base = bases[0];
+		result[0] = base ?
+			base._meta && base === result[result.length - base._meta.bases.length] ?
+				base._meta.bases.length : 1 : 0;
+
+		return result;
+	}
+
+	function inherited(args, a, f){
+		var name, chains, bases, caller, meta, base, proto, opf, pos,
+			cache = this._inherited = this._inherited || {};
+
+		// crack arguments
+		if(typeof args == "string"){
+			name = args;
+			args = a;
+			a = f;
+		}
+		f = 0;
+
+		caller = args.callee;
+		name = name || caller.nom;
+		if(!name){
+			err("can't deduce a name to call inherited()");
+		}
+
+		meta = this.constructor._meta;
+		bases = meta.bases;
+
+		pos = cache.p;
+		if(name != cname){
+			// method
+			if(cache.c !== caller){
+				// cache bust
+				pos = 0;
+				base = bases[0];
+				meta = base._meta;
+				if(meta.hidden[name] !== caller){
+					// error detection
+					chains = meta.chains;
+					if(chains && typeof chains[name] == "string"){
+						err("calling chained method with inherited: " + name);
+					}
+					// find caller
+					do{
+						meta = base._meta;
+						proto = base.prototype;
+						if(meta && (proto[name] === caller && proto.hasOwnProperty(name) || meta.hidden[name] === caller)){
+							break;
+						}
+					}while(base = bases[++pos]); // intentional assignment
+					pos = base ? pos : -1;
+				}
+			}
+			// find next
+			base = bases[++pos];
+			if(base){
+				proto = base.prototype;
+				if(base._meta && proto.hasOwnProperty(name)){
+					f = proto[name];
+				}else{
+					opf = op[name];
+					do{
+						proto = base.prototype;
+						f = proto[name];
+						if(f && (base._meta ? proto.hasOwnProperty(name) : f !== opf)){
+							break;
+						}
+					}while(base = bases[++pos]); // intentional assignment
+				}
+			}
+			f = base && f || op[name];
+		}else{
+			// constructor
+			if(cache.c !== caller){
+				// cache bust
+				pos = 0;
+				meta = bases[0]._meta;
+				if(meta && meta.ctor !== caller){
+					// error detection
+					chains = meta.chains;
+					if(!chains || chains.constructor !== "manual"){
+						err("calling chained constructor with inherited");
+					}
+					// find caller
+					while(base = bases[++pos]){ // intentional assignment
+						meta = base._meta;
+						if(meta && meta.ctor === caller){
+							break;
+						}
+					};
+					pos = base ? pos : -1;
+				}
+			}
+			// find next
+			while(base = bases[++pos]){	// intentional assignment
+				meta = base._meta;
+				f = meta ? meta.ctor : base;
+				if(f){
+					break;
+				}
+			}
+			f = base && f;
+		}
+
+		// cache the found super method
+		cache.c = f;
+		cache.p = pos;
+
+		// now we have the result
+		if(f){
+			return a === true ? f : f.apply(this, a || args);
+		}
+		// intentionally if a super method was not found
+	}
+
+	function getInherited(name, args){
+		if(typeof name == "string"){
+			return this.inherited(name, args, true);
+		}
+		return this.inherited(name, true);
+	}
+
+	// emulation of "instanceof"
+	function isInstanceOf(cls){
+		var bases = this.constructor._meta.bases;
+		for(var i = 0, l = bases.length; i < l; ++i){
+			if(bases[i] === cls){
+				return true;
+			}
+		}
+		return this instanceof cls;
+	}
+
+	// imlementation of safe mixin function
+	function safeMixin(target, source){
+		var name, t, i = 0, l = d._extraNames.length;
+		// add props adding metadata for incoming functions skipping a constructor
+		for(name in source){
+			t = source[name];
+			if((t !== op[name] || !(name in op)) && name != cname){
+				if(opts.call(t) == "[object Function]"){
+					// non-trivial function method => attach its name
+					t.nom = name;
+				}
+				target[name] = t;
+			}
+		}
+		// process unenumerable methods on IE
+		for(; i < l; ++i){
+			name = d._extraNames[i];
+			t = source[name];
+			if((t !== op[name] || !(name in op)) && name != cname){
+				if(opts.call(t) == "[object Function]"){
+					// non-trivial function method => attach its name
+					t.nom = name;
+				}
+				target[name] = t;
+			}
+		}
+		return target;
+	}
+
+	function extend(source){
+		safeMixin(this.prototype, source);
+		return this;
+	}
+
+	// chained constructor compatible with the legacy dojo.declare()
+	function chainedConstructor(bases, ctorSpecial){
+		return function(){
+			var a = arguments, args = a, a0 = a[0], f, i, m,
+				l = bases.length, preArgs;
+			//this._inherited = {};
+			// perform the shaman's rituals of the original dojo.declare()
+			// 1) call two types of the preamble
+			if(ctorSpecial && (a0 && a0.preamble || this.preamble)){
+				// full blown ritual
+				preArgs = new Array(bases.length);
+				// prepare parameters
+				preArgs[0] = a;
+				for(i = 0;;){
+					// process the preamble of the 1st argument
+					a0 = a[0];
+					if(a0){
+						f = a0.preamble;
+						if(f){
+							a = f.apply(this, a) || a;
+						}
+					}
+					// process the preamble of this class
+					f = bases[i].prototype;
+					f = f.hasOwnProperty("preamble") && f.preamble;
+					if(f){
+						a = f.apply(this, a) || a;
+					}
+					// one pecularity of the preamble:
+					// it is called if it is not needed,
+					// e.g., there is no constructor to call
+					// let's watch for the last constructor
+					// (see ticket #9795)
+					if(++i == l){
+						break;
+					}
+					preArgs[i] = a;
+				}
+			}
+			// 2) call all non-trivial constructors using prepared arguments
+			for(i = l - 1; i >= 0; --i){
+				f = bases[i];
+				m = f._meta;
+				f = m ? m.ctor : f;
+				if(f){
+					f.apply(this, preArgs ? preArgs[i] : a);
+				}
+			}
+			// 3) continue the original ritual: call the postscript
+			f = this.postscript;
+			if(f){
+				f.apply(this, args);
+			}
+		};
+	}
+
+
+	// chained constructor compatible with the legacy dojo.declare()
+	function singleConstructor(ctor, ctorSpecial){
+		return function(){
+			var a = arguments, t = a, a0 = a[0], f;
+			//this._inherited = {};
+			// perform the shaman's rituals of the original dojo.declare()
+			// 1) call two types of the preamble
+			if(ctorSpecial){
+				// full blown ritual
+				if(a0){
+					// process the preamble of the 1st argument
+					f = a0.preamble;
+					if(f){
+						t = f.apply(this, t) || t;
+					}
+				}
+				f = this.preamble;
+				if(f){
+					// process the preamble of this class
+					f.apply(this, t);
+					// one pecularity of the preamble:
+					// it is called even if it is not needed,
+					// e.g., there is no constructor to call
+					// let's watch for the last constructor
+					// (see ticket #9795)
+				}
+			}
+			// 2) call a constructor
+			if(ctor){
+				ctor.apply(this, a);
+			}
+			// 3) continue the original ritual: call the postscript
+			f = this.postscript;
+			if(f){
+				f.apply(this, a);
+			}
+		};
+	}
+
+	// plain vanilla constructor (can use inherited() to call its base constructor)
+	function simpleConstructor(bases){
+		return function(){
+			var a = arguments, i = 0, f;
+			//this._inherited = {};
+			// perform the shaman's rituals of the original dojo.declare()
+			// 1) do not call the preamble
+			// 2) call the top constructor (it can use this.inherited())
+			for(; f = bases[i]; ++i){ // intentional assignment
+				m = f._meta;
+				f = m ? m.ctor : f;
+				if(f){
+					f.apply(this, a);
+					break;
+				}
+			}
+			// 3) call the postscript
+			f = this.postscript;
+			if(f){
+				f.apply(this, a);
+			}
+		};
+	}
+
+	function chain(name, bases, reversed){
+		return function(){
+			var b, m, f, i = 0, step = 1;
+			if(reversed){
+				i = bases.length - 1;
+				step = -1;
+			}
+			for(; b = bases[i]; i += step){ // intentional assignment
+				m = b._meta;
+				f = (m ? m.hidden : b.prototype)[name];
+				if(f){
+					f.apply(this, arguments);
+				}
+			}
+		};
+	}
+
+	d.declare = function(className, superclass, props){
+		var proto, i, t, ctor, name, bases, chains, mixins = 1, parents = superclass;
+
+		// crack parameters
+		if(typeof className != "string"){
+			props = superclass;
+			superclass = className;
+			className = "";
+		}
+		props = props || {};
+
+		// build a prototype
+		if(opts.call(superclass) == "[object Array]"){
+			// C3 MRO
+			bases = c3mro(superclass);
+			t = bases[0];
+			mixins = bases.length - t;
+			superclass = bases[mixins];
+		}else{
+			bases = [0];
+			if(superclass){
+				t = superclass._meta;
+				bases = bases.concat(t ? t.bases : superclass);
+			}
+		}
+		if(superclass){
+			for(i = mixins - 1;; --i){
+				// delegation
+				xtor.prototype = superclass.prototype;
+				proto = new xtor;
+				if(!i){
+					// stop if nothing to add (the last base)
+					break;
+				}
+				// mix in properties
+				t = bases[i];
+				mix(proto, t._meta ? t._meta.hidden : t.prototype);
+				// chain in new constructor
+				ctor = new Function;
+				ctor.superclass = superclass;
+				ctor.prototype = proto;
+				superclass = proto.constructor = ctor;
+			}
+		}else{
+			proto = {};
+		}
+		// add all properties
+		safeMixin(proto, props);
+		// add constructor
+		t = props.constructor;
+		if(t !== op.constructor){
+			t.nom = cname;
+			proto.constructor = t;
+		}
+		xtor.prototype = 0;	// cleanup
+
+		// collect chains and flags
+		for(i = mixins - 1; i; --i){ // intentional assignment
+			t = bases[i]._meta;
+			if(t && t.chains){
+				chains = mix(chains || {}, t.chains);
+			}
+		}
+		if(proto["-chains-"]){
+			chains = mix(chains || {}, proto["-chains-"]);
+		}
+
+		// build ctor
+		t = !chains || !chains.hasOwnProperty(cname);
+		bases[0] = ctor = (chains && chains.constructor === "manual") ? simpleConstructor(bases) :
+			(bases.length == 1 ? singleConstructor(props.constructor, t) : chainedConstructor(bases, t));
+
+		// add meta information to the constructor
+		ctor._meta  = {bases: bases, hidden: props, chains: chains,
+			parents: parents, ctor: props.constructor};
+		ctor.superclass = superclass && superclass.prototype;
+		ctor.extend = extend;
+		ctor.prototype = proto;
+		proto.constructor = ctor;
+
+		// add "standard" methods to the ptototype
+		proto.getInherited = getInherited;
+		proto.inherited = inherited;
+		proto.isInstanceOf = isInstanceOf;
+
+		// add name if specified
+		if(className){
+			proto.declaredClass = className;
+			d.setObject(className, ctor);
+		}
+
+		// build chains and add them to the prototype
+		if(chains){
+			for(name in chains){
+				if(proto[name] && typeof chains[name] == "string" && name != cname){
+					t = proto[name] = chain(name, bases, chains[name] === "after");
+					t.nom = name;
+				}
+			}
+		}
+		// chained methods do not return values
+		// no need to chain "invisible" functions
+
+		return ctor;	// Function
+	};
+
+	d.safeMixin = safeMixin;
+
+	/*=====
+	dojo.declare = function(className, superclass, props){
+		//	summary:
+		//		Create a feature-rich constructor from compact notation.
+		//	className: String?:
+		//		The optional name of the constructor (loosely, a "class")
+		//		stored in the "declaredClass" property in the created prototype.
+		//		It will be used as a global name for a created constructor.
+		//	superclass: Function|Function[]:
+		//		May be null, a Function, or an Array of Functions. This argument
+		//		specifies a list of bases (the left-most one is the most deepest
+		//		base).
+		//	props: Object:
+		//		An object whose properties are copied to the created prototype.
+		//		Add an instance-initialization function by making it a property
+		//		named "constructor".
+		//	returns:
+		//		New constructor function.
+		//	description:
+		//		Create a constructor using a compact notation for inheritance and
+		//		prototype extension.
+		//
+		//		Mixin ancestors provide a type of multiple inheritance.
+		//		Prototypes of mixin ancestors are copied to the new class:
+		//		changes to mixin prototypes will not affect classes to which
+		//		they have been mixed in.
+		//
+		//		Ancestors can be compound classes created by this version of
+		//		dojo.declare. In complex cases all base classes are going to be
+		//		linearized according to C3 MRO algorithm
+		//		(see http://www.python.org/download/releases/2.3/mro/ for more
+		//		details).
+		//
+		//		"className" is cached in "declaredClass" property of the new class,
+		//		if it was supplied. The immediate super class will be cached in
+		//		"superclass" property of the new class.
+		//
+		//		Methods in "props" will be copied and modified: "nom" property
+		//		(the declared name of the method) will be added to all copied
+		//		functions to help identify them for the internal machinery. Be
+		//		very careful, while reusing methods: if you use the same
+		//		function under different names, it can produce errors in some
+		//		cases.
+		//
+		//		It is possible to use constructors created "manually" (without
+		//		dojo.declare) as bases. They will be called as usual during the
+		//		creation of an instance, their methods will be chained, and even
+		//		called by "this.inherited()".
+		//
+		//		Special property "-chains-" governs how to chain methods. It is
+		//		a dictionary, which uses method names as keys, and hint strings
+		//		as values. If a hint string is "after", this method will be
+		//		called after methods of its base classes. If a hint string is
+		//		"before", this method will be called before methods of its base
+		//		classes.
+		//
+		//		If "constructor" is not mentioned in "-chains-" property, it will
+		//		be chained using the legacy mode: using "after" chaining,
+		//		calling preamble() method before each constructor, if available,
+		//		and calling postscript() after all constructors were executed.
+		//		If the hint is "after", it is chained as a regular method, but
+		//		postscript() will be called after the chain of constructors.
+		//		"constructor" cannot be chained "before", but it allows
+		//		a special hint string: "manual", which means that constructors
+		//		are not going to be chained in any way, and programmer will call
+		//		them manually using this.inherited(). In the latter case
+		//		postscript() will be called after the construction.
+		//
+		//		All chaining hints are "inherited" from base classes and
+		//		potentially can be overridden. Be very careful when overriding
+		//		hints! Make sure that all chained methods can work in a proposed
+		//		manner of chaining.
+		//
+		//		Once a method was chained, it is impossible to unchain it. The
+		//		only exception is "constructor". You don't need to define a
+		//		method in order to supply a chaining hint.
+		//
+		//		If a method is chained, it cannot use this.inherited() because
+		//		all other methods in the hierarchy will be called automatically.
+		//
+		//		Usually constructors and initializers of any kind are chained
+		//		using "after" and destructors of any kind are chained as
+		//		"before". Note that chaining assumes that chained methods do not
+		//		return any value: any returned value will be discarded.
+		//
+		//	example:
+		//	|	dojo.declare("my.classes.bar", my.classes.foo, {
+		//	|		// properties to be added to the class prototype
+		//	|		someValue: 2,
+		//	|		// initialization function
+		//	|		constructor: function(){
+		//	|			this.myComplicatedObject = new ReallyComplicatedObject();
+		//	|		},
+		//	|		// other functions
+		//	|		someMethod: function(){
+		//	|			doStuff();
+		//	|		}
+		//	|	});
+		//
+		//	example:
+		//	|	var MyBase = dojo.declare(null, {
+		//	|		// constructor, properties, and methods go here
+		//	|		// ...
+		//	|	});
+		//	|	var MyClass1 = dojo.declare(MyBase, {
+		//	|		// constructor, properties, and methods go here
+		//	|		// ...
+		//	|	});
+		//	|	var MyClass2 = dojo.declare(MyBase, {
+		//	|		// constructor, properties, and methods go here
+		//	|		// ...
+		//	|	});
+		//	|	var MyDiamond = dojo.declare([MyClass1, MyClass2], {
+		//	|		// constructor, properties, and methods go here
+		//	|		// ...
+		//	|	});
+		//
+		//	example:
+		//	|	var F = function(){ console.log("raw constructor"); };
+		//	|	F.prototype.method = function(){
+		//	|		console.log("raw method");
+		//	|	};
+		//	|	var A = dojo.declare(F, {
+		//	|		constructor: function(){
+		//	|			console.log("A.constructor");
+		//	|		},
+		//	|		method: function(){
+		//	|			console.log("before calling F.method...");
+		//	|			this.inherited(arguments);
+		//	|			console.log("...back in A");
+		//	|		}
+		//	|	});
+		//	|	new A().method();
+		//	|	// will print:
+		//	|	// raw constructor
+		//	|	// A.constructor
+		//	|	// before calling F.method...
+		//	|	// raw method
+		//	|	// ...back in A
+		//
+		//	example:
+		//	|	var A = dojo.declare(null, {
+		//	|		"-chains-": {
+		//	|			destroy: "before"
+		//	|		}
+		//	|	});
+		//	|	var B = dojo.declare(A, {
+		//	|		constructor: function(){
+		//	|			console.log("B.constructor");
+		//	|		},
+		//	|		destroy: function(){
+		//	|			console.log("B.destroy");
+		//	|		}
+		//	|	});
+		//	|	var C = dojo.declare(B, {
+		//	|		constructor: function(){
+		//	|			console.log("C.constructor");
+		//	|		},
+		//	|		destroy: function(){
+		//	|			console.log("C.destroy");
+		//	|		}
+		//	|	});
+		//	|	new C().destroy();
+		//	|	// prints:
+		//	|	// B.constructor
+		//	|	// C.constructor
+		//	|	// C.destroy
+		//	|	// B.destroy
+		//
+		//	example:
+		//	|	var A = dojo.declare(null, {
+		//	|		"-chains-": {
+		//	|			constructor: "manual"
+		//	|		}
+		//	|	});
+		//	|	var B = dojo.declare(A, {
+		//	|		constructor: function(){
+		//	|			// ...
+		//	|			// call the base constructor with new parameters
+		//	|			this.inherited(arguments, [1, 2, 3]);
+		//	|			// ...
+		//	|		}
+		//	|	});
+		//
+		//	example:
+		//	|	var A = dojo.declare(null, {
+		//	|		"-chains-": {
+		//	|			m1: "before"
+		//	|		},
+		//	|		m1: function(){
+		//	|			console.log("A.m1");
+		//	|		},
+		//	|		m2: function(){
+		//	|			console.log("A.m2");
+		//	|		}
+		//	|	});
+		//	|	var B = dojo.declare(A, {
+		//	|		"-chains-": {
+		//	|			m2: "after"
+		//	|		},
+		//	|		m1: function(){
+		//	|			console.log("B.m1");
+		//	|		},
+		//	|		m2: function(){
+		//	|			console.log("B.m2");
+		//	|		}
+		//	|	});
+		//	|	var x = new B();
+		//	|	x.m1();
+		//	|	// prints:
+		//	|	// B.m1
+		//	|	// A.m1
+		//	|	x.m2();
+		//	|	// prints:
+		//	|	// A.m2
+		//	|	// B.m2
+		return new Function(); // Function
+	};
+	=====*/
+
+	/*=====
+	dojo.safeMixin = function(target, source){
+		//	summary:
+		//		Mix in properties skipping a constructor and decorating functions
+		//		like it is done by dojo.declare.
+		//	target: Object
+		//		Target object to accept new properties.
+		//	source: Object
+		//		Source object for new properties.
+		//	description:
+		//		This function is used to mix in properties like dojo._mixin does,
+		//		but it skips a constructor property and decorates functions like
+		//		dojo.declare does.
+		//
+		//		It is meant to be used with classes and objects produced with
+		//		dojo.declare. Functions mixed in with dojo.safeMixin can use
+		//		this.inherited() like normal methods.
+		//
+		//		This function is used to implement extend() method of a constructor
+		//		produced with dojo.declare().
+		//
+		//	example:
+		//	|	var A = dojo.declare(null, {
+		//	|		m1: function(){
+		//	|			console.log("A.m1");
+		//	|		},
+		//	|		m2: function(){
+		//	|			console.log("A.m2");
+		//	|		}
+		//	|	});
+		//	|	var B = dojo.declare(A, {
+		//	|		m1: function(){
+		//	|			this.inherited(arguments);
+		//	|			console.log("B.m1");
+		//	|		}
+		//	|	});
+		//	|	B.extend({
+		//	|		m2: function(){
+		//	|			this.inherited(arguments);
+		//	|			console.log("B.m2");
+		//	|		}
+		//	|	});
+		//	|	var x = new B();
+		//	|	dojo.safeMixin(x, {
+		//	|		m1: function(){
+		//	|			this.inherited(arguments);
+		//	|			console.log("X.m1");
+		//	|		},
+		//	|		m2: function(){
+		//	|			this.inherited(arguments);
+		//	|			console.log("X.m2");
+		//	|		}
+		//	|	});
+		//	|	x.m2();
+		//	|	// prints:
+		//	|	// A.m1
+		//	|	// B.m1
+		//	|	// X.m1
+	};
+	=====*/
+
+	/*=====
+	Object.inherited = function(name, args, newArgs){
+		//	summary:
+		//		Calls a super method.
+		//	name: String?
+		//		The optional method name. Should be the same as the caller's
+		//		name. Usually "name" is specified in complex dynamic cases, when
+		//		the calling method was dynamically added, undecorated by
+		//		dojo.declare, and it cannot be determined.
+		//	args: Arguments
+		//		The caller supply this argument, which should be the original
+		//		"arguments".
+		//	newArgs: Object?
+		//		If "true", the found function will be returned without
+		//		executing it.
+		//		If Array, it will be used to call a super method. Otherwise
+		//		"args" will be used.
+		//	returns:
+		//		Whatever is returned by a super method, or a super method itself,
+		//		if "true" was specified as newArgs.
+		//	description:
+		//		This method is used inside method of classes produced with
+		//		dojo.declare to call a super method (next in the chain). It is
+		//		used for manually controlled chaining. Consider using the regular
+		//		chaining, because it is faster. Use "this.inherited()" only in
+		//		complex cases.
+		//
+		//		This method cannot me called from automatically chained
+		//		constructors including the case of a special (legacy)
+		//		constructor chaining. It cannot be called from chained methods.
+		//
+		//		If "this.inherited()" cannot find the next-in-chain method, it
+		//		does nothing and returns "undefined". The last method in chain
+		//		can be a default method implemented in Object, which will be
+		//		called last.
+		//
+		//		If "name" is specified, it is assumed that the method that
+		//		received "args" is the parent method for this call. It is looked
+		//		up in the chain list and if it is found the next-in-chain method
+		//		is called. If it is not found, the first-in-chain method is
+		//		called.
+		//
+		//		If "name" is not specified, it will be derived from the calling
+		//		method (using a methoid property "nom").
+		//
+		//	example:
+		//	|	var B = dojo.declare(A, {
+		//	|		method1: function(a, b, c){
+		//	|			this.inherited(arguments);
+		//	|		},
+		//	|		method2: function(a, b){
+		//	|			return this.inherited(arguments, [a + b]);
+		//	|		}
+		//	|	});
+		//	|	// next method is not in the chain list because it is added
+		//	|	// manually after the class was created.
+		//	|	B.prototype.method3 = function(){
+		//	|		console.log("This is a dynamically-added method.");
+		//	|		this.inherited("method3", arguments);
+		//	|	};
+		//	example:
+		//	|	var B = dojo.declare(A, {
+		//	|		method: function(a, b){
+		//	|			var super = this.inherited(arguments, true);
+		//	|			// ...
+		//	|			if(!super){
+		//	|				console.log("there is no super method");
+		//	|				return 0;
+		//	|			}
+		//	|			return super.apply(this, arguments);
+		//	|		}
+		//	|	});
+		return	{};	// Object
+	}
+	=====*/
+
+	/*=====
+	Object.getInherited = function(name, args){
+		//	summary:
+		//		Returns a super method.
+		//	name: String?
+		//		The optional method name. Should be the same as the caller's
+		//		name. Usually "name" is specified in complex dynamic cases, when
+		//		the calling method was dynamically added, undecorated by
+		//		dojo.declare, and it cannot be determined.
+		//	args: Arguments
+		//		The caller supply this argument, which should be the original
+		//		"arguments".
+		//	returns:
+		//		Returns a super method (Function) or "undefined".
+		//	description:
+		//		This method is a convenience method for "this.inherited()".
+		//		It uses the same algorithm but instead of executing a super
+		//		method, it returns it, or "undefined" if not found.
+		//
+		//	example:
+		//	|	var B = dojo.declare(A, {
+		//	|		method: function(a, b){
+		//	|			var super = this.getInherited(arguments);
+		//	|			// ...
+		//	|			if(!super){
+		//	|				console.log("there is no super method");
+		//	|				return 0;
+		//	|			}
+		//	|			return super.apply(this, arguments);
+		//	|		}
+		//	|	});
+		return	{};	// Object
+	}
+	=====*/
+
+	/*=====
+	Object.isInstanceOf = function(cls){
+		//	summary:
+		//		Checks the inheritance cahin to see if it is inherited from this
+		//		class.
+		//	cls: Function
+		//		Class constructor.
+		//	returns:
+		//		"true", if this object is inherited from this class, "false"
+		//		otherwise.
+		//	description:
+		//		This method is used with instances of classes produced with
+		//		dojo.declare to determine of they support a certain interface or
+		//		not. It models "instanceof" operator.
+		//
+		//	example:
+		//	|	var A = dojo.declare(null, {
+		//	|		// constructor, properties, and methods go here
+		//	|		// ...
+		//	|	});
+		//	|	var B = dojo.declare(null, {
+		//	|		// constructor, properties, and methods go here
+		//	|		// ...
+		//	|	});
+		//	|	var C = dojo.declare([A, B], {
+		//	|		// constructor, properties, and methods go here
+		//	|		// ...
+		//	|	});
+		//	|	var D = dojo.declare(A, {
+		//	|		// constructor, properties, and methods go here
+		//	|		// ...
+		//	|	});
+		//	|
+		//	|	var a = new A(), b = new B(), c = new C(), d = new D();
+		//	|
+		//	|	console.log(a.isInstanceOf(A)); // true
+		//	|	console.log(b.isInstanceOf(A)); // false
+		//	|	console.log(c.isInstanceOf(A)); // true
+		//	|	console.log(d.isInstanceOf(A)); // true
+		//	|
+		//	|	console.log(a.isInstanceOf(B)); // false
+		//	|	console.log(b.isInstanceOf(B)); // true
+		//	|	console.log(c.isInstanceOf(B)); // true
+		//	|	console.log(d.isInstanceOf(B)); // false
+		//	|
+		//	|	console.log(a.isInstanceOf(C)); // false
+		//	|	console.log(b.isInstanceOf(C)); // false
+		//	|	console.log(c.isInstanceOf(C)); // true
+		//	|	console.log(d.isInstanceOf(C)); // false
+		//	|
+		//	|	console.log(a.isInstanceOf(D)); // false
+		//	|	console.log(b.isInstanceOf(D)); // false
+		//	|	console.log(c.isInstanceOf(D)); // false
+		//	|	console.log(d.isInstanceOf(D)); // true
+		return	{};	// Object
+	}
+	=====*/
+
+	/*=====
+	Object.extend = function(source){
+		//	summary:
+		//		Adds all properties and methods of source to constructor's
+		//		prototype, making them available to all instances created with
+		//		constructor. This method is specific to constructors created with
+		//		dojo.declare.
+		//	source: Object
+		//		Source object which properties are going to be copied to the
+		//		constructor's prototype.
+		//	description:
+		//		Adds source properties to the constructor's prototype. It can
+		//		override existing properties.
+		//
+		//		This method is similar to dojo.extend function, but it is specific
+		//		to constructors produced by dojo.declare. It is implemented
+		//		using dojo.safeMixin, and it skips a constructor property,
+		//		and properly decorates copied functions.
+		//
+		//	example:
+		//	|	var A = dojo.declare(null, {
+		//	|		m1: function(){},
+		//	|		s1: "Popokatepetl"
+		//	|	});
+		//	|	A.extend({
+		//	|		m1: function(){},
+		//	|		m2: function(){},
+		//	|		f1: true,
+		//	|		d1: 42
+		//	|	});
+	};
+	=====*/
+})();
+
+}
+
+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");
 
@@ -2225,45 +3506,59 @@ dojo._listener = {
 
 // 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.
+// 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){
+						/*Boolean?*/ dontFix){
 	// summary:
-	//		Create a link that calls one function when another executes. 
+	//		`dojo.connect` is the core event handling and delegation method in
+	//		Dojo. It allows one function to "listen in" on the execution of
+	//		any other, triggering the second whenever the first is called. Many
+	//		listeners may be attached to a function, and source functions may
+	//		be either regular function calls or DOM events.
 	//
 	// description:
-	//		Connects 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.
+	//		Connects listeners to actions, so that after event fires, a
+	//		listener is called with the same arguments passed to the orginal
+	//		function.
 	//
-	//		event must be a string. If obj is null, dojo.global is used.
+	//		Since `dojo.connect` allows the source of events to be either a
+	//		"regular" JavaScript function or a DOM event, it provides a uniform
+	//		interface for listening to all the types of events that an
+	//		application is likely to deal with though a single, unified
+	//		interface. DOM programmers may want to think of it as
+	//		"addEventListener for everything and anything".
 	//
-	//		null arguments may simply be omitted.
+	//		When setting up a connection, the `event` parameter must be a
+	//		string that is the name of the method/event to be listened for. If
+	//		`obj` is null, `dojo.global` is assumed, meaning that connections
+	//		to global methods are supported but also that you may inadvertantly
+	//		connect to a global by passing an incorrect object name or invalid
+	//		reference.
 	//
-	//		obj[event] can resolve to a function or undefined (null). 
-	//		If obj[event] is null, it is assigned a function.
+	//		`dojo.connect` generally is forgiving. If you pass the name of a
+	//		function or method that does not yet exist on `obj`, connect will
+	//		not fail, but will instead set up a stub method. Similarly, null
+	//		arguments may simply be omitted such that fewer than 4 arguments
+	//		may be required to set up a connection See the examples for deails.
 	//
 	//		The return value is a handle that is needed to 
-	//		remove this connection with dojo.disconnect.
+	//		remove this connection with `dojo.disconnect`.
 	//
 	// obj: 
 	//		The source object for the event function. 
-	//		Defaults to dojo.global if null.
+	//		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].
+	//		I.e. identifies a property `obj[event]`.
 	//
 	// context: 
 	//		The object that method will receive as "this".
@@ -2283,7 +3578,7 @@ dojo.connect = function(/*Object|null*/ obj,
 	//
 	// dontFix:
 	//		If obj is a DOM node, set dontFix to true to prevent delegation 
-	//		of this connection to the DOM event manager. 
+	//		of this connection to the DOM event manager.
 	//
 	// example:
 	//		When obj.onchange(), do ui.update():
@@ -2657,6 +3952,7 @@ dojo.Deferred = function(/*Function?*/ canceller){
 	this.results = [null, null];
 	this.canceller = canceller;
 	this.silentlyCancelled = false;
+	this.isFiring = false;
 };
 
 dojo.extend(dojo.Deferred, {
@@ -2790,7 +4086,7 @@ dojo.extend(dojo.Deferred, {
 		//		Add separate callback and errback to the end of the callback
 		//		sequence.
 		this.chain.push([cb, eb])
-		if(this.fired >= 0){
+		if(this.fired >= 0 && !this.isFiring){
 			this._fire();
 		}
 		return this; // dojo.Deferred
@@ -2800,6 +4096,7 @@ dojo.extend(dojo.Deferred, {
 		// summary: 
 		//		Used internally to exhaust the callback sequence when a result
 		//		is available.
+		this.isFiring = true;
 		var chain = this.chain;
 		var fired = this.fired;
 		var res = this.results[fired];
@@ -2848,6 +4145,7 @@ dojo.extend(dojo.Deferred, {
 		}
 		this.fired = fired;
 		this.results[fired] = res;
+		this.isFiring = false;
 		if((cb)&&(this.paused)){
 			// this is for "tail recursion" in case the dependent
 			// deferred is already fired
@@ -2864,7 +4162,10 @@ dojo.provide("dojo._base.json");
 
 dojo.fromJson = function(/*String*/ json){
 	// summary:
-	// 		Parses a [JSON](http://json.org) string to return a JavaScript object.  Throws for invalid JSON strings.
+	// 		Parses a [JSON](http://json.org) string to return a JavaScript object.
+	// description:
+	// 		Throws for invalid JSON strings, but it does not use a strict JSON parser. It
+	// 		delegates to eval().
 	// json: 
 	//		a string literal of a JSON item, for instance:
 	//			`'{ "foo": [ "bar", 1, { "baz": "thud" } ] }'`
@@ -2884,27 +4185,35 @@ dojo._escapeString = function(/*String*/str){
 
 dojo.toJsonIndentStr = "\t";
 dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint, /*String?*/ _indentStr){
-	// summary:
+	//	summary:
 	//		Returns a [JSON](http://json.org) serialization of an object.
-	//
-	// description:
+	//	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:
+	//	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:
+	//	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:
+	//		The variable `dojo.toJsonIndentStr` is used as the indent string --
+	//		to use something other than the default (tab), change that variable
+	//		before calling dojo.toJson().
+	//	_indentStr:
 	//		private variable for recursive calls when pretty printing, do not use.
+	//	example:
+	//		simple serialization of a trivial object
+	//		|	var jsonStr = dojo.toJson({ howdy: "stranger!", isStrange: true });
+	//		|	doh.is('{"howdy":"stranger!","isStrange":true}', jsonStr);
+	//	example:
+	//		a custom serializer for an objects of a particular class:
+	//		|	dojo.declare("Furby", null, {
+	//		|		furbies: "are strange",
+	//		|		furbyCount: 10,
+	//		|		__json__: function(){
+	//		|		},
+	//		|	});
 
 	if(it === undefined){
 		return "undefined";
@@ -2961,7 +4270,7 @@ dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint, /*String?*/ _ind
 		newObj = dojo.json.jsonRegistry.match(it);
 		return recurse(newObj, prettyPrint, nextIndent);
 	}catch(e){
-		// 
+		// console.log(e);
 	}
 	// it's a function with no adapter, skip it
 	*/
@@ -2994,244 +4303,6 @@ dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint, /*String?*/ _ind
 
 }
 
-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 over. If a string, operates on individual characters.
-			//	callback:
-			//		a function is invoked with three arguments: item, index, and array
-			//	thisObject:
-			//		may be used to scope the call to callback
-			//	description:
-			//		This function corresponds to the JavaScript 1.6
-			//		Array.forEach() method. For more details, see:
-			//			http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:forEach
-			//	example:
-			//	|	// log out all members of the array:
-			//	|	dojo.forEach(
-			//	|		[ "thinger", "blah", "howdy", 10 ],
-			//	|		function(item){
-			//	|			
-			//	|		}
-			//	|	);
-			//	example:
-			//	|	// log out the members and their indexes
-			//	|	dojo.forEach(
-			//	|		[ "thinger", "blah", "howdy", 10 ],
-			//	|		function(item, idx, arr){
-			//	|			
-			//	|		}
-			//	|	);
-			//	example:
-			//	|	// use a scoped object member as the callback
-			//	|	
-			//	|	var obj = {
-			//	|		prefix: "logged via obj.callback:", 
-			//	|		callback: function(item){
-			//	|			
-			//	|		}
-			//	|	};
-			//	|	
-			//	|	// specifying the scope function executes the callback in that scope
-			//	|	dojo.forEach(
-			//	|		[ "thinger", "blah", "howdy", 10 ],
-			//	|		obj.callback,
-			//	|		obj
-			//	|	);
-			//	|	
-			//	|	// alternately, we can accomplish the same thing with dojo.hitch()
-			//	|	dojo.forEach(
-			//	|		[ "thinger", "blah", "howdy", 10 ],
-			//	|		dojo.hitch(obj, "callback")
-			//	|	);
-
-			// match the behavior of the built-in forEach WRT empty arrs
-			if(!arr || !arr.length){ return; }
-
-			// FIXME: there are several ways of handilng thisObject. Is
-			// dojo.global always the default context?
-			var _p = _getParts(arr, thisObject, callback); arr = _p[0];
-			for(var i=0,l=arr.length; i<l; ++i){ 
-				_p[2].call(_p[1], arr[i], i, arr);
-			}
-		},
-
-		_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. For more details, see:
-			//			http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:every
-			// example:
-			//	|	// returns false
-			//	|	dojo.every([1, 2, 3, 4], function(item){ return item>1; });
-			// example:
-			//	|	// returns true 
-			//	|	dojo.every([1, 2, 3, 4], function(item){ return item>0; });
-			return dojo._everyOrSome(true, arr, callback, thisObject); // Boolean
-		},
-
-		some: function(/*Array|String*/arr, /*Function|String*/callback, /*Object?*/thisObject){
-			// summary:
-			//		Determines whether or not any item in arr satisfies the
-			//		condition implemented by callback.
-			// arr:
-			//		the array to iterate over. If a string, operates on individual characters.
-			// callback:
-			//		a function is invoked with three arguments: item, index,
-			//		and array and returns true if the condition is met.
-			// thisObject:
-			//		may be used to scope the call to callback
-			// description:
-			//		This function corresponds to the JavaScript 1.6
-			//		Array.some() method. For more details, see:
-			//			http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:some
-			// example:
-			//	|	// is true
-			//	|	dojo.some([1, 2, 3, 4], function(item){ return item>1; });
-			// example:
-			//	|	// is false
-			//	|	dojo.some([1, 2, 3, 4], function(item){ return item<1; });
-			return dojo._everyOrSome(false, arr, callback, thisObject); // Boolean
-		},
-
-		map: function(/*Array|String*/arr, /*Function|String*/callback, /*Function?*/thisObject){
-			// summary:
-			//		applies callback to each element of arr and returns
-			//		an Array with the results
-			// arr:
-			//		the array to iterate on. If a string, operates on
-			//		individual characters.
-			// callback:
-			//		a function is invoked with three arguments, (item, index,
-			//		array),  and returns a value
-			// thisObject:
-			//		may be used to scope the call to callback
-			// description:
-			//		This function corresponds to the JavaScript 1.6 Array.map()
-			//		method. For more details, see:
-			//			http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:map
-			// example:
-			//	|	// returns [2, 3, 4, 5]
-			//	|	dojo.map([1, 2, 3, 4], function(item){ return item+1 });
-
-			var _p = _getParts(arr, thisObject, callback); arr = _p[0];
-			var outArr = (arguments[3] ? (new arguments[3]()) : []);
-			for(var i=0,l=arr.length; i<l; ++i){
-				outArr.push(_p[2].call(_p[1], arr[i], i, arr));
-			}
-			return outArr; // Array
-		},
-
-		filter: function(/*Array*/arr, /*Function|String*/callback, /*Object?*/thisObject){
-			// summary:
-			//		Returns a new Array with those items from arr that match the
-			//		condition implemented by callback.
-			// arr:
-			//		the array to iterate over.
-			// callback:
-			//		a function that is invoked with three arguments (item,
-			//		index, array). The return of this function is expected to
-			//		be a boolean which determines whether the passed-in item
-			//		will be included in the returned array.
-			// thisObject:
-			//		may be used to scope the call to callback
-			// description:
-			//		This function corresponds to the JavaScript 1.6
-			//		Array.filter() method. For more details, see:
-			//			http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:filter
-			// example:
-			//	|	// returns [2, 3, 4]
-			//	|	dojo.filter([1, 2, 3, 4], function(item){ return item>1; });
-
-			var _p = _getParts(arr, thisObject, callback); arr = _p[0];
-			var outArr = [];
-			for(var i=0,l=arr.length; i<l; ++i){
-				if(_p[2].call(_p[1], arr[i], i, arr)){
-					outArr.push(arr[i]);
-				}
-			}
-			return outArr; // Array
-		}
-	});
-})();
-/*
-*/
-
-}
-
 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");
@@ -3239,32 +4310,34 @@ dojo.provide("dojo._base.Color");
 
 
 (function(){
-	
+
 	var d = dojo;
-		
+
 	dojo.Color = function(/*Array|String|Object*/ color){
 		// summary:
-		//		Takes a named string, hex string, array of rgb or rgba values,
-		//		an object with r, g, b, and a properties, or another `dojo.Color` object
-		//		and creates a new Color instance to work from.
+		//	 	Takes a named string, hex string, array of rgb or rgba values,
+		//	 	an object with r, g, b, and a properties, or another `dojo.Color` object
+		//	 	and creates a new Color instance to work from.
 		//
 		// example:
-		// 	Work with a Color instance:
-		//	| var c = new dojo.Color(); 
-		//	| c.setColor([0,0,0]); // black
-		//	| var hex = c.toHex(); // #000000
+		//		Work with a Color instance:
+		//	 | var c = new dojo.Color();
+		//	 | c.setColor([0,0,0]); // black
+		//	 | var hex = c.toHex(); // #000000
 		//
 		// example:
-		//	Work with a node's color:
-		//	| var color = dojo.style("someNode", "backgroundColor");
-		//	| var n = new dojo.Color(color);
-		//	| // adjust the color some
-		//	| n.r *= .5; 
-		//  |  // rgb(128, 255, 255);
+		//		Work with a node's color:
+		//	 | var color = dojo.style("someNode", "backgroundColor");
+		//	 | var n = new dojo.Color(color);
+		//	 | // adjust the color some
+		//	 | n.r *= .5;
+		//	 | console.log(n.toString()); // rgb(128, 255, 255);
 		if(color){ this.setColor(color); }
 	};
 
-	// FIXME: there's got to be a more space-efficient way to encode or discover these!!  Use hex?
+	// 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],
@@ -3281,7 +4354,8 @@ dojo.provide("dojo._base.Color");
 		navy:       [0,0,128],
 		blue:       [0,0,255],
 		teal:		[0,128,128],
-		aqua:		[0,255,255]
+		aqua:		[0,255,255],
+		transparent: d.config.transparentColor || [255,255,255]
 	};
 
 	dojo.extend(dojo.Color, {
@@ -3293,8 +4367,8 @@ dojo.provide("dojo._base.Color");
 			// summary:
 			//		Takes a named string, hex string, array of rgb or rgba values,
 			//		an object with r, g, b, and a properties, or another `dojo.Color` object
-			//		and sets this color instance to that value. 
-			// 
+			//		and sets this color instance to that value.
+			//
 			// example:
 			//	|	var c = new dojo.Color(); // no color
 			//	|	c.setColor("#ededed"); // greyish
@@ -3310,31 +4384,33 @@ dojo.provide("dojo._base.Color");
 		},
 		sanitize: function(){
 			// summary:
-			//		makes sure that the object has correct attributes
-			// description: 
+			//		Ensures the object has correct attributes
+			// description:
 			//		the default implementation does nothing, include dojo.colors to
-			//		augment it to real checks
+			//		augment it with real checks
 			return this;	// dojo.Color
 		},
 		toRgb: function(){
-			// summary: Returns 3 component array of rgb values
-			//
+			// summary:
+			//		Returns 3 component array of rgb values
 			// example:
-			//	| var c = new dojo.Color("#000000"); 
-			//	|  // [0,0,0] 
+			//	|	var c = new dojo.Color("#000000");
+			//	| 	console.log(c.toRgb()); // [0,0,0]
 			var t = this;
 			return [t.r, t.g, t.b];	// Array
 		},
 		toRgba: function(){
-			// summary: Returns a 4 component array of rgba values
+			// summary:
+			//		Returns a 4 component array of rgba values from the color
+			//		represented by this object.
 			var t = this;
 			return [t.r, t.g, t.b, t.a];	// Array
 		},
 		toHex: function(){
-			// summary: Returns a css color string in hexadecimal representation
-			//
-			// example: 
-			// | 	 // #000000
+			// summary:
+			//		Returns a CSS color string in hexadecimal representation
+			// example:
+			//	| 	console.log(new dojo.Color([0,0,0]).toHex()); // #000000
 			var arr = d.map(["r", "g", "b"], function(x){
 				var s = this[x].toString(16);
 				return s.length < 2 ? "0" + s : s;
@@ -3342,27 +4418,28 @@ dojo.provide("dojo._base.Color");
 			return "#" + arr.join("");	// String
 		},
 		toCss: function(/*Boolean?*/ includeAlpha){
-			// summary: Returns a css color string in rgb(a) representation
-			//
+			// summary:
+			//		Returns a css color string in rgb(a) representation
 			// example:
-			// |	var c = new dojo.Color("#FFF").toCss();
-			// |	 // rgb('255','255','255')
+			//	|	var c = new dojo.Color("#FFF").toCss();
+			//	|	console.log(c); // rgb('255','255','255')
 			var t = this, rgb = t.r + ", " + t.g + ", " + t.b;
 			return (includeAlpha ? "rgba(" + rgb + ", " + t.a : "rgb(" + rgb) + ")";	// String
 		},
 		toString: function(){
-			// summary: Returns a visual representation of the color
+			// summary:
+			//		Returns a visual representation of the color
 			return this.toCss(true); // String
 		}
 	});
 
 	dojo.blendColors = function(
-		/*dojo.Color*/ start, 
-		/*dojo.Color*/ end, 
+		/*dojo.Color*/ start,
+		/*dojo.Color*/ end,
 		/*Number*/ weight,
 		/*dojo.Color?*/ obj
 	){
-		// summary: 
+		// summary:
 		//		Blend colors end and start with weight from 0 to 1, 0.5 being a 50/50 blend,
 		//		can reuse a previously allocated dojo.Color object for the result
 		var t = obj || new d.Color();
@@ -3374,17 +4451,28 @@ dojo.provide("dojo._base.Color");
 	};
 
 	dojo.colorFromRgb = function(/*String*/ color, /*dojo.Color?*/ obj){
-		// summary: get rgb(a) array from css-style color declarations
+		// summary:
+		//		Returns a `dojo.Color` instance from a string of the form
+		//		"rgb(...)" or "rgba(...)". Optionally accepts a `dojo.Color`
+		//		object to update with the parsed value and return instead of
+		//		creating a new object.
+		// returns:
+		//		A dojo.Color object. If obj is passed, it will be the return value.
 		var m = color.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/);
 		return m && dojo.colorFromArray(m[1].split(/\s*,\s*/), obj);	// dojo.Color
 	};
 
 	dojo.colorFromHex = function(/*String*/ color, /*dojo.Color?*/ obj){
-		// summary: converts a hex string with a '#' prefix to a color object.
-		//	Supports 12-bit #rgb shorthand.
+		// summary:
+		//		Converts a hex string with a '#' prefix to a color object.
+		//		Supports 12-bit #rgb shorthand. Optionally accepts a
+		//		`dojo.Color` object to update with the parsed value.
+		//
+		// returns:
+		//		A dojo.Color object. If obj is passed, it will be the return value.
 		//
 		// example:
-		//	| var thing = dojo.colorFromHex("#ededed"); // grey, longhand
+		//	 | var thing = dojo.colorFromHex("#ededed"); // grey, longhand
 		//
 		// example:
 		//	| var thing = dojo.colorFromHex("#000"); // black, shorthand
@@ -3405,7 +4493,13 @@ dojo.provide("dojo._base.Color");
 	};
 
 	dojo.colorFromArray = function(/*Array*/ a, /*dojo.Color?*/ obj){
-		// summary: builds a color from 1, 2, 3, or 4 element array
+		// summary:
+		//		Builds a `dojo.Color` from a 3 or 4 element array, mapping each
+		//		element in sequence to the rgb(a) values of the color.
+		// example:
+		//		| var myColor = dojo.colorFromArray([237,237,237,0.5]); // grey, 50% alpha 
+		// returns:
+		//		A dojo.Color object. If obj is passed, it will be the return value.
 		var t = obj || new d.Color();
 		t._set(Number(a[0]), Number(a[1]), Number(a[2]), Number(a[3]));
 		if(isNaN(t.a)){ t.a = 1; }
@@ -3413,19 +4507,19 @@ dojo.provide("dojo._base.Color");
 	};
 
 	dojo.colorFromString = function(/*String*/ str, /*dojo.Color?*/ obj){
-		//	summary:
-		//		parses str for a color value.
-		//	description:
+		// summary:
+		//		Parses `str` for a color value. Accepts hex, rgb, and rgba
+		//		style color values.
+		// description:
 		//		Acceptable input values for str may include arrays of any form
 		//		accepted by dojo.colorFromArray, hex strings such as "#aaaaaa", or
 		//		rgb or rgba strings such as "rgb(133, 200, 16)" or "rgba(10, 10,
 		//		10, 50)"
-		//	returns:
-		//		a dojo.Color object. If obj is passed, it will be the return value.
+		// returns:
+		//		A dojo.Color object. If obj is passed, it will be the return value.
 		var a = d.Color.named[str];
 		return a && d.colorFromArray(a, obj) || d.colorFromRgb(str, obj) || d.colorFromHex(str, obj);
 	};
-
 })();
 
 }
@@ -3522,20 +4616,24 @@ dojo.withDoc = function(	/*DocumentElement*/documentObject,
 	//		be restored to its previous state.
 
 	var oldDoc = dojo.doc,
-		oldLtr = dojo._bodyLtr;
+		oldLtr = dojo._bodyLtr,
+		oldQ = dojo.isQuirks;
 
 	try{
 		dojo.doc = documentObject;
 		delete dojo._bodyLtr; // uncache
+		dojo.isQuirks = dojo.doc.compatMode == "BackCompat"; // no need to check for QuirksMode which was Opera 7 only
 
-		if(thisObject && dojo.isString(callback)){
+		if(thisObject && typeof callback == "string"){
 			callback = thisObject[callback];
 		}
 
 		return callback.apply(thisObject, cbArguments || []);
 	}finally{
 		dojo.doc = oldDoc;
+		delete dojo._bodyLtr; // in case it was undefined originally, and set to true/false by the alternate document
 		if(oldLtr !== undefined){ dojo._bodyLtr = oldLtr; }
+		dojo.isQuirks = oldQ;
 	}
 };
 	
@@ -3552,7 +4650,7 @@ dojo.provide("dojo._base.event");
 (function(){
 	// DOM event listener machinery
 	var del = (dojo._event_listener = {
-		add: function(/*DOMNode*/node, /*String*/name, /*Function*/fp){
+		add: function(/*DOMNode*/ node, /*String*/ name, /*Function*/ fp){
 			if(!node){return;} 
 			name = del._normalizeEventName(name);
 			fp = del._fixCallback(name, fp);
@@ -3564,14 +4662,7 @@ dojo.provide("dojo._base.event");
 				var ofp = fp;
 				//oname = name;
 				name = (name == "mouseenter") ? "mouseover" : "mouseout";
-				fp = function(e){		
-					if(dojo.isFF <= 2) {
-						// check tagName to fix a FF2 bug with invalid nodes (hidden child DIV of INPUT)
-						// which causes isDescendant to return false which causes
-						// spurious, and more importantly, incorrect mouse events to fire.
-						// TODO: remove tagName check when Firefox 2 is no longer supported
-						try{ e.relatedTarget.tagName; }catch(e2){ return; }
-					}
+				fp = function(e){
 					if(!dojo.isDescendant(e.relatedTarget, node)){
 						// e.type = oname; // FIXME: doesn't take? SJM: event.type is generally immutable.
 						return ofp.call(this, e); 
@@ -3581,7 +4672,7 @@ dojo.provide("dojo._base.event");
 			node.addEventListener(name, fp, false);
 			return fp; /*Handle*/
 		},
-		remove: function(/*DOMNode*/node, /*String*/event, /*Handle*/handle){
+		remove: function(/*DOMNode*/ node, /*String*/ event, /*Handle*/ handle){
 			// summary:
 			//		clobbers the listener from the node
 			// node:
@@ -3599,13 +4690,13 @@ dojo.provide("dojo._base.event");
 				node.removeEventListener(event, handle, false);
 			}
 		},
-		_normalizeEventName: function(/*String*/name){
+		_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){
+		_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.
@@ -3650,7 +4741,7 @@ dojo.provide("dojo._base.event");
 
 	// DOM events
 	
-	dojo.fixEvent = function(/*Event*/evt, /*DOMNode*/sender){
+	dojo.fixEvent = function(/*Event*/ evt, /*DOMNode*/ sender){
 		// summary:
 		//		normalizes properties on the event object including event
 		//		bubbling methods, keystroke normalization, and x/y positions
@@ -3661,7 +4752,7 @@ dojo.provide("dojo._base.event");
 		return del._fixEvent(evt, sender);
 	}
 
-	dojo.stopEvent = function(/*Event*/evt){
+	dojo.stopEvent = function(/*Event*/ evt){
 		// summary:
 		//		prevents propagation and clobbers the default action of the
 		//		passed event
@@ -3702,7 +4793,8 @@ dojo.provide("dojo._base.event");
 	// keyCode against these named constants, as the
 	// actual codes can vary by browser.
 	dojo.keys = {
-		// summary: definitions for common key values
+		// summary:
+		//		Definitions for common key values
 		BACKSPACE: 8,
 		TAB: 9,
 		CLEAR: 12,
@@ -3710,6 +4802,7 @@ dojo.provide("dojo._base.event");
 		SHIFT: 16,
 		CTRL: 17,
 		ALT: 18,
+		META: dojo.isSafari ? 91 : 224,		// the apple key on macs
 		PAUSE: 19,
 		CAPS_LOCK: 20,
 		ESCAPE: 27,
@@ -3760,8 +4853,91 @@ dojo.provide("dojo._base.event");
 		F14: 125,
 		F15: 126,
 		NUM_LOCK: 144,
-		SCROLL_LOCK: 145
+		SCROLL_LOCK: 145,
+		// virtual key mapping
+		copyKey: dojo.isMac && !dojo.isAIR ? (dojo.isSafari ? 91 : 224 ) : 17
+	};
+	
+	var evtCopyKey = dojo.isMac ? "metaKey" : "ctrlKey";
+	
+	dojo.isCopyKey = function(e){
+		// summary:
+		//		Checks an event for the copy key (meta on Mac, and ctrl anywhere else)
+		// e: Event
+		//		Event object to examine
+		return e[evtCopyKey];	// Boolean
+	};
+
+	// Public: decoding mouse buttons from events
+
+/*=====
+	dojo.mouseButtons = {
+		// LEFT: Number
+		//		Numeric value of the left mouse button for the platform.
+		LEFT:   0,
+		// MIDDLE: Number
+		//		Numeric value of the middle mouse button for the platform.
+		MIDDLE: 1,
+		// RIGHT: Number
+		//		Numeric value of the right mouse button for the platform.
+		RIGHT:  2,
+	
+		isButton: function(e, button){
+			// summary:
+			//		Checks an event object for a pressed button
+			// e: Event
+			//		Event object to examine
+			// button: Number
+			//		The button value (example: dojo.mouseButton.LEFT)
+			return e.button == button; // Boolean
+		},
+		isLeft: function(e){
+			// summary:
+			//		Checks an event object for the pressed left button
+			// e: Event
+			//		Event object to examine
+			return e.button == 0; // Boolean
+		},
+		isMiddle: function(e){
+			// summary:
+			//		Checks an event object for the pressed middle button
+			// e: Event
+			//		Event object to examine
+			return e.button == 1; // Boolean
+		},
+		isRight: function(e){
+			// summary:
+			//		Checks an event object for the pressed right button
+			// e: Event
+			//		Event object to examine
+			return e.button == 2; // Boolean
+		}
 	};
+=====*/
+
+		if(dojo.isIE){
+		dojo.mouseButtons = {
+			LEFT:   1,
+			MIDDLE: 4,
+			RIGHT:  2,
+			// helper functions
+			isButton: function(e, button){ return e.button & button; },
+			isLeft:   function(e){ return e.button & 1; },
+			isMiddle: function(e){ return e.button & 4; },
+			isRight:  function(e){ return e.button & 2; }
+		};
+	}else{
+			dojo.mouseButtons = {
+			LEFT:   0,
+			MIDDLE: 1,
+			RIGHT:  2,
+			// helper functions
+			isButton: function(e, button){ return e.button == button; },
+			isLeft:   function(e){ return e.button == 0; },
+			isMiddle: function(e){ return e.button == 1; },
+			isRight:  function(e){ return e.button == 2; }
+		};
+		}
 	
 		// IE event normalization
 	if(dojo.isIE){ 
@@ -3814,7 +4990,7 @@ dojo.provide("dojo._base.event");
 		}
 
 		dojo.mixin(del, {
-			add: function(/*DOMNode*/node, /*String*/event, /*Function*/fp){
+			add: function(/*DOMNode*/ node, /*String*/ event, /*Function*/ fp){
 				if(!node){return;} // undefined
 				event = del._normalizeEventName(event);
 				if(event=="onkeypress"){
@@ -3833,7 +5009,7 @@ dojo.provide("dojo._base.event");
 				}
 				return iel.add(node, event, del._fixCallback(fp));
 			},
-			remove: function(/*DOMNode*/node, /*String*/event, /*Handle*/handle){
+			remove: function(/*DOMNode*/ node, /*String*/ event, /*Handle*/ handle){
 				event = del._normalizeEventName(event);
 				iel.remove(node, event, handle); 
 				if(event=="onkeypress"){
@@ -3844,19 +5020,21 @@ dojo.provide("dojo._base.event");
 					}
 				}
 			},
-			_normalizeEventName: function(/*String*/eventName){
+			_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){
+			_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"
+				// 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; 
@@ -4006,7 +5184,7 @@ dojo.provide("dojo._base.event");
 		del._remove = del.remove;
 
 		dojo.mixin(del, {
-			add: function(/*DOMNode*/node, /*String*/event, /*Function*/fp){
+			add: function(/*DOMNode*/ node, /*String*/ event, /*Function*/ fp){
 				if(!node){return;} // undefined
 				var handle = del._add(node, event, fp);
 				if(del._normalizeEventName(event) == "keypress"){
@@ -4019,7 +5197,7 @@ dojo.provide("dojo._base.event");
 						var k=evt.keyCode;
 						// These are Windows Virtual Key Codes
 						// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp
-						var unprintable = k!=13 && k!=32 && k!=27 && (k<48 || k>90) && (k<96 || k>111) && (k<186 || k>192) && (k<219 || k>222);
+						var unprintable = k!=13 && k!=32 && (k<48 || k>90) && (k<96 || k>111) && (k<186 || k>192) && (k<219 || k>222);
 						// synthesize keypress for most unprintables and CTRL-keys
 						if(unprintable || evt.ctrlKey){
 							var c = unprintable ? 0 : k;
@@ -4043,7 +5221,7 @@ dojo.provide("dojo._base.event");
 				return handle; /*Handle*/
 			},
 
-			remove: function(/*DOMNode*/node, /*String*/event, /*Handle*/handle){
+			remove: function(/*DOMNode*/ node, /*String*/ event, /*Handle*/ handle){
 				if(node){
 					if(handle._stealthKeyDownHandle){
 						del._remove(node, "keydown", handle._stealthKeyDownHandle);
@@ -4070,7 +5248,11 @@ if(dojo.isIE){
 	// closing over 'iel' or 'ieh' b0rks leak prevention
 	// ls[i] is an index into the master handler array
 	dojo._ieDispatcher = function(args, sender){
-		var ap=Array.prototype, h=dojo._ie_listener.handlers, c=args.callee, ls=c[dojo._ieListenersName], t=h[c.target];
+		var ap = Array.prototype,
+			h = dojo._ie_listener.handlers,
+			c = args.callee,
+			ls = c[dojo._ieListenersName],
+			t = h[c.target];
 		// return value comes from original target function
 		var r = t && t.apply(sender, args);
 		// make local copy of listener array so it's immutable during processing
@@ -4117,9 +5299,8 @@ try{
 /*=====
 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.
+	//		Returns DOM node with matching `id` attribute or `null`
+	//		if not found. If `id` is a DomNode, this function is a no-op.
 	//
 	//	id: String|DOMNode
 	//	 	A string to match an HTML id attribute or a reference to a DOM Node
@@ -4128,70 +5309,74 @@ dojo.byId = function(id, doc){
 	//		Document to work in. Defaults to the current value of
 	//		dojo.doc.  Can be used to retrieve
 	//		node references from other documents.
-	// 
+	//
 	//	example:
 	//	Look up a node by ID:
-	//	| var n = dojo.byId("foo");
+	//	|	var n = dojo.byId("foo");
 	//
 	//	example:
-	//	Check if a node exists.
-	//	|	if(dojo.byId("bar")){ ... }
+	//	Check if a node exists, and use it.
+	//	|	var n = dojo.byId("bar");
+	//	|	if(n){ doStuff() ... }
 	//
 	//	example:
 	//	Allow string or DomNode references to be passed to a custom function:
-	//	| var foo = function(nodeOrId){ 
-	//	|	nodeOrId = dojo.byId(nodeOrId); 
-	//	|	// ... more stuff
-	//	| }
+	//	|	var foo = function(nodeOrId){
+	//	|		nodeOrId = dojo.byId(nodeOrId);
+	//	|		// ... more stuff
+	//	|	}
 =====*/
 
 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 || te.id == id)){
-				return te;
-			}else{
-				var eles = _d.all[id];
-				if(!eles || eles.nodeName){
-					eles = [eles];
-				}
-				// if more than 1, choose first with the correct id
-				var i=0;
-				while((te=eles[i++])){
-					if((te.attributes && te.attributes.id && te.attributes.id.value == id)
-						|| te.id == id){
-						return te;
-					}
+		if(typeof id != "string"){
+			return id;
+		}
+		var _d = doc || dojo.doc, te = _d.getElementById(id);
+		// attributes.id.value is better than just id in case the 
+		// user has a name=id inside a form
+		if(te && (te.attributes.id.value == id || te.id == id)){
+			return te;
+		}else{
+			var eles = _d.all[id];
+			if(!eles || eles.nodeName){
+				eles = [eles];
+			}
+			// if more than 1, choose first with the correct id
+			var i=0;
+			while((te=eles[i++])){
+				if((te.attributes && te.attributes.id && te.attributes.id.value == id)
+					|| te.id == id){
+					return te;
 				}
 			}
-		}else{
-			return id; // DomNode
 		}
 	};
 }else{
 	dojo.byId = function(id, doc){
-		return dojo.isString(id) ? (doc || dojo.doc).getElementById(id) : id; // DomNode
+		// inline'd type check
+		return (typeof id == "string") ? (doc || dojo.doc).getElementById(id) : id; // DomNode
 	};
 }
 /*=====
-}
+};
 =====*/
 
 (function(){
 	var d = dojo;
+	var byId = d.byId;
 
-	var _destroyContainer = null;
+	var _destroyContainer = null,
+		_destroyDoc;
 		d.addOnWindowUnload(function(){
 		_destroyContainer = null; //prevent IE leak
 	});
 	
 /*=====
 	dojo._destroyElement = function(node){
-		// summary: Existing alias for `dojo.destroy`. Deprecated, will be removed in 2.0
+		// summary:
+		// 		Existing alias for `dojo.destroy`. Deprecated, will be removed
+		// 		in 2.0
 	}
 =====*/
 	dojo._destroyElement = dojo.destroy = function(/*String|DomNode*/node){
@@ -4202,26 +5387,29 @@ if(dojo.isIE || dojo.isOpera){
 		//	description:
 		//		Removes a node from its parent, clobbering it and all of its
 		//		children. Function only works with DomNodes, and returns nothing.
-		//		
+		//
 		//	node:
 		//		A String ID or DomNode reference of the element to be destroyed
 		//
 		//	example:
 		//	Destroy a node byId:
-		//	| dojo.destroy("someId");
+		//	|	dojo.destroy("someId");
 		//
 		//	example:
 		//	Destroy all nodes in a list by reference:
-		//	| dojo.query(".someNode").forEach(dojo.destroy);
-		
-		node = d.byId(node);
+		//	|	dojo.query(".someNode").forEach(dojo.destroy);
+
+		node = byId(node);
 		try{
-			if(!_destroyContainer || _destroyContainer.ownerDocument != node.ownerDocument){
-				_destroyContainer = node.ownerDocument.createElement("div");
+			var doc = node.ownerDocument;
+			// cannot use _destroyContainer.ownerDocument since this can throw an exception on IE
+			if(!_destroyContainer || _destroyDoc != doc){
+				_destroyContainer = doc.createElement("div");
+				_destroyDoc = doc;
 			}
 			_destroyContainer.appendChild(node.parentNode ? node.parentNode.removeChild(node) : node);
 			// NOTE: see http://trac.dojotoolkit.org/ticket/2931. This may be a bug and not a feature
-			_destroyContainer.innerHTML = ""; 
+			_destroyContainer.innerHTML = "";
 		}catch(e){
 			/* squelch */
 		}
@@ -4232,11 +5420,15 @@ if(dojo.isIE || dojo.isOpera){
 		//		Returns true if node is a descendant of ancestor
 		//	node: string id or node reference to test
 		//	ancestor: string id or node reference of potential parent to test against
+		//
+		// example:
+		//	Test is node id="bar" is a descendant of node id="foo"
+		//	|	if(dojo.isDescendant("bar", "foo")){ ... }
 		try{
-			node = d.byId(node);
-			ancestor = d.byId(ancestor);
+			node = byId(node);
+			ancestor = byId(ancestor);
 			while(node){
-				if(node === ancestor){
+				if(node == ancestor){
 					return true; // Boolean
 				}
 				node = node.parentNode;
@@ -4246,13 +5438,20 @@ if(dojo.isIE || dojo.isOpera){
 	};
 
 	dojo.setSelectable = function(/*DomNode|String*/node, /*Boolean*/selectable){
-		//	summary: enable or disable selection on a node
+		//	summary: 
+		//		Enable or disable selection on a node
 		//	node:
 		//		id or reference to node
 		//	selectable:
 		//		state to put the node in. false indicates unselectable, true 
 		//		allows selection.
-		node = d.byId(node);
+		//	example:
+		//	Make the node id="bar" unselectable
+		//	|	dojo.setSelectable("bar"); 
+		//	example:
+		//	Make the node id="bar" selectable
+		//	|	dojo.setSelectable("bar", true);
+		node = byId(node);
 				if(d.isMozilla){
 			node.style.MozUserSelect = selectable ? "" : "none";
 		}else if(d.isKhtml || d.isWebKit){
@@ -4269,7 +5468,7 @@ if(dojo.isIE || dojo.isOpera){
 		if(parent){
 			parent.insertBefore(node, ref);
 		}
-	}
+	};
 
 	var _insertAfter = function(/*DomNode*/node, /*DomNode*/ref){
 		//	summary:
@@ -4282,12 +5481,12 @@ if(dojo.isIE || dojo.isOpera){
 				parent.insertBefore(node, ref.nextSibling);
 			}
 		}
-	}
+	};
 
 	dojo.place = function(node, refNode, position){
 		//	summary:
 		//		Attempt to insert node into the DOM, choosing from various positioning options.
-		//		Returns true if successful, false otherwise.
+		//		Returns the first argument resolved to a DOM node.
 		//
 		//	node: String|DomNode
 		//		id or node reference, or HTML fragment starting with "<" to place relative to refNode
@@ -4297,7 +5496,7 @@ if(dojo.isIE || dojo.isOpera){
 		//
 		//	position: String|Number?
 		//		string noting the position of node relative to refNode or a
-		//		number indicating the location in the childNodes collection of refNode. 
+		//		number indicating the location in the childNodes collection of refNode.
 		//		Accepted string values are:
 		//	|	* before
 		//	|	* after
@@ -4312,28 +5511,28 @@ if(dojo.isIE || dojo.isOpera){
 		//		Returned values is the first argument resolved to a DOM node.
 		//
 		//		.place() is also a method of `dojo.NodeList`, allowing `dojo.query` node lookups.
-		// 
+		//
 		// example:
-		// Place a node by string id as the last child of another node by string id:
-		// | 	dojo.place("someNode", "anotherNode");
+		//		Place a node by string id as the last child of another node by string id:
+		//	|	dojo.place("someNode", "anotherNode");
 		//
 		// example:
-		// Place a node by string id before another node by string id
-		// | 	dojo.place("someNode", "anotherNode", "before");
+		//		Place a node by string id before another node by string id
+		//	|	dojo.place("someNode", "anotherNode", "before");
 		//
 		// example:
-		// Create a Node, and place it in the body element (last child):
-		// | 	dojo.place(dojo.create('div'), dojo.body());
+		//		Create a Node, and place it in the body element (last child):
+		//	|	dojo.place("<div></div>", dojo.body());
 		//
 		// example:
-		// Put a new LI as the first child of a list by id:
-		// | 	dojo.place(dojo.create('li'), "someUl", "first");
+		//		Put a new LI as the first child of a list by id:
+		//	|	dojo.place("<li></li>", "someUl", "first");
 
-		refNode = d.byId(refNode);
-		if(d.isString(node)){
-			node = node.charAt(0) == "<" ? d._toDom(node, refNode.ownerDocument) : d.byId(node);
+		refNode = byId(refNode);
+		if(typeof node == "string"){ // inline'd type check
+			node = node.charAt(0) == "<" ? d._toDom(node, refNode.ownerDocument) : byId(node);
 		}
-		if(typeof position == "number"){
+		if(typeof position == "number"){ // inline'd type check
 			var cn = refNode.childNodes;
 			if(!cn.length || cn.length <= position){
 				refNode.appendChild(node);
@@ -4350,7 +5549,7 @@ if(dojo.isIE || dojo.isOpera){
 					break;
 				case "replace":
 					refNode.parentNode.replaceChild(node, refNode);
-					break; 
+					break;
 				case "only":
 					d.empty(refNode);
 					refNode.appendChild(node);
@@ -4371,12 +5570,12 @@ if(dojo.isIE || dojo.isOpera){
 	// 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.
@@ -4387,15 +5586,14 @@ if(dojo.isIE || dojo.isOpera){
 	// 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?
+		d.boxModel = document.compatMode == "BackCompat" ? "border-box" : "content-box";
 	}
 	
 	// =============================
 	// Style Functions
 	// =============================
-	
+
 	// getComputedStyle drives most of the style code.
 	// Wherever possible, reuse the returned object.
 	//
@@ -4403,7 +5601,7 @@ if(dojo.isIE || dojo.isOpera){
 	// 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. 
+	// multiple API functions.
 
 /*=====
 	dojo.getComputedStyle = function(node){
@@ -4412,7 +5610,7 @@ if(dojo.isIE || dojo.isOpera){
 		//
 		//	description:
 		//		Gets a "computed style" object which can be used to gather
-		//		information about the current state of the rendered node. 
+		//		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
@@ -4450,13 +5648,13 @@ if(dojo.isIE || dojo.isOpera){
 			if(node.nodeType == 1){
 				var dv = node.ownerDocument.defaultView;
 				s = dv.getComputedStyle(node, null);
-				if(!s && node.style){ 
-					node.style.display = ""; 
+				if(!s && node.style){
+					node.style.display = "";
 					s = dv.getComputedStyle(node, null);
 				}
 			}
 			return s || {};
-		}; 
+		};
 		}else if(d.isIE){
 		gcs = function(node){
 			// IE (as of 7) doesn't expose Element like sane browsers
@@ -4464,7 +5662,7 @@ if(dojo.isIE || dojo.isOpera){
 		};
 	}else{
 		gcs = function(node){
-			return node.nodeType == 1 ? 
+			return node.nodeType == 1 ?
 				node.ownerDocument.defaultView.getComputedStyle(node, null) : {};
 		};
 	}
@@ -4474,7 +5672,7 @@ if(dojo.isIE || dojo.isOpera){
 			d._toPixelValue = function(element, value){
 			// style values can be floats, client code may want
 			// to round for integer pixels.
-			return parseFloat(value) || 0; 
+			return parseFloat(value) || 0;
 		};
 		}else{
 		d._toPixelValue = function(element, avalue){
@@ -4521,22 +5719,22 @@ if(dojo.isIE || dojo.isOpera){
 	=====*/
 
 		var astr = "DXImageTransform.Microsoft.Alpha";
-	var af = function(n, f){ 
+	var af = function(n, f){
 		try{
 			return n.filters.item(astr);
 		}catch(e){
 			return f ? {} : null;
 		}
-	}
+	};
 
-		dojo._getOpacity = 
+		dojo._getOpacity =
 			d.isIE ? function(node){
 			try{
 				return af(node).Opacity / 100; // Number
 			}catch(e){
 				return 1; // Number
 			}
-		} : 
+		} :
 			function(node){
 			return gcs(node).opacity;
 		};
@@ -4556,7 +5754,7 @@ if(dojo.isIE || dojo.isOpera){
 	}
 	=====*/
 
-	dojo._setOpacity = 
+	dojo._setOpacity =
 				d.isIE ? function(/*DomNode*/node, /*Number*/opacity){
 			var ov = opacity * 100;
 			node.style.zoom = 1.0;
@@ -4577,7 +5775,7 @@ if(dojo.isIE || dojo.isOpera){
 				});
 			}
 			return opacity;
-		} : 
+		} :
 				function(node, opacity){
 			return node.style.opacity = opacity;
 		};
@@ -4605,16 +5803,16 @@ if(dojo.isIE || dojo.isOpera){
 			_pixelNamesCache[type] = _pixelRegExp.test(type);
 		}
 		return _pixelNamesCache[type] ? px(node, value) : value;
-	}
+	};
 
 	var _floatStyle = d.isIE ? "styleFloat" : "cssFloat",
 		_floatAliases = { "cssFloat": _floatStyle, "styleFloat": _floatStyle, "float": _floatStyle }
 	;
-	
+
 	// public API
-	
-	dojo.style = function(	/*DomNode|String*/ node, 
-							/*String?|Object?*/ style, 
+
+	dojo.style = function(	/*DomNode|String*/ node,
+							/*String?|Object?*/ style,
 							/*String?*/ value){
 		//	summary:
 		//		Accesses styles on a node. If 2 arguments are
@@ -4626,8 +5824,8 @@ if(dojo.isIE || dojo.isOpera){
 		//		Also when getting values, use specific style names,
 		//		like "borderBottomWidth" instead of "border" since compound values like
 		//		"border" are not necessarily reflected as expected.
-		//		If you want to get node dimensions, use dojo.marginBox() or
-		//		dojo.contentBox(). 
+		//		If you want to get node dimensions, use `dojo.marginBox()`, 
+		//		`dojo.contentBox()` or `dojo.position()`.
 		//	node:
 		//		id or reference to node to get/set style for
 		//	style:
@@ -4671,7 +5869,7 @@ if(dojo.isIE || dojo.isOpera){
 		//
 		//	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.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({
@@ -4679,7 +5877,7 @@ if(dojo.isIE || dojo.isOpera){
 		//	|		fontSize:"13pt"
 		//	|	});
 
-		var n = d.byId(node), args = arguments.length, op = (style == "opacity");
+		var n = byId(node), args = arguments.length, op = (style == "opacity");
 		style = _floatAliases[style] || style;
 		if(args == 3){
 			return op ? d._setOpacity(n, value) : n.style[style] = value; /*Number*/
@@ -4688,7 +5886,7 @@ if(dojo.isIE || dojo.isOpera){
 			return d._getOpacity(n);
 		}
 		var s = gcs(n);
-		if(args == 2 && !d.isString(style)){
+		if(args == 2 && typeof style != "string"){ // inline'd type check
 			for(var x in style){
 				d.style(node, x, style[x]);
 			}
@@ -4705,20 +5903,20 @@ if(dojo.isIE || dojo.isOpera){
 		//	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. 
+		//	description:
+		//		Returns an object with `w`, `h`, `l`, `t` properties:
+		//	|		l/t = left/top padding (respectively)
+		//	|		w = the total of the left and right padding 
+		//	|		h = the total of the top and bottom padding
+		//		If 'node' has position, l/t forms the origin for child nodes.
 		//		The w/h are used for calculating boxes.
 		//		Normally application code will not need to invoke this
 		//		directly, and will use the ...box... functions instead.
 		var 
-			s = computedStyle||gcs(n), 
-			l = px(n, s.paddingLeft), 
+			s = computedStyle||gcs(n),
+			l = px(n, s.paddingLeft),
 			t = px(n, s.paddingTop);
-		return { 
+		return {
 			l: l,
 			t: t,
 			w: l+px(n, s.paddingRight),
@@ -4730,7 +5928,7 @@ if(dojo.isIE || dojo.isOpera){
 		//	summary:
 		//		returns an object with properties useful for noting the border
 		//		dimensions.
-		//
+		//	description:
 		// 		* l/t = the sum of left/top border (respectively)
 		//		* w = the sum of the left and right border
 		//		* h = the sum of the top and bottom border
@@ -4740,10 +5938,10 @@ if(dojo.isIE || dojo.isOpera){
 		//		directly, and will use the ...box... functions instead.
 		var 
 			ne = "none",
-			s = computedStyle||gcs(n), 
+			s = computedStyle||gcs(n),
 			bl = (s.borderLeftStyle != ne ? px(n, s.borderLeftWidth) : 0),
 			bt = (s.borderTopStyle != ne ? px(n, s.borderTopWidth) : 0);
-		return { 
+		return {
 			l: bl,
 			t: bt,
 			w: bl + (s.borderRightStyle!=ne ? px(n, s.borderRightWidth) : 0),
@@ -4755,7 +5953,7 @@ if(dojo.isIE || dojo.isOpera){
 		//	summary:
 		//		Returns object with properties useful for box fitting with
 		//		regards to padding.
-		//
+		// description:
 		//		* l/t = the sum of left/top padding and left/top border (respectively)
 		//		* w = the sum of the left and right padding and border
 		//		* h = the sum of the top and bottom padding and border
@@ -4764,10 +5962,10 @@ if(dojo.isIE || dojo.isOpera){
 		//		Normally application code will not need to invoke this
 		//		directly, and will use the ...box... functions instead.
 		var 
-			s = computedStyle||gcs(n), 
+			s = computedStyle||gcs(n),
 			p = d._getPadExtents(n, s),
 			b = d._getBorderExtents(n, s);
-		return { 
+		return {
 			l: p.l + b.l,
 			t: p.t + b.t,
 			w: p.w + b.w,
@@ -4788,7 +5986,7 @@ if(dojo.isIE || dojo.isOpera){
 		//		Normally application code will not need to invoke this
 		//		directly, and will use the ...box... functions instead.
 		var 
-			s = computedStyle||gcs(n), 
+			s = computedStyle||gcs(n),
 			l = px(n, s.marginLeft),
 			t = px(n, s.marginTop),
 			r = px(n, s.marginRight),
@@ -4796,13 +5994,13 @@ if(dojo.isIE || dojo.isOpera){
 		if(d.isWebKit && (s.position != "absolute")){
 			// FIXME: Safari's version of the computed right margin
 			// is the space between our right edge and the right edge 
-			// of our offsetParent. 
+			// 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 { 
+		return {
 			l: l,
 			t: t,
 			w: l+r,
@@ -4824,7 +6022,7 @@ if(dojo.isIE || dojo.isOpera){
 	// 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
@@ -4859,14 +6057,14 @@ if(dojo.isIE || dojo.isOpera){
 				t -= be.t;
 			}
 		}
-				return { 
-			l: l, 
-			t: t, 
-			w: node.offsetWidth + me.w, 
+				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
@@ -4878,33 +6076,33 @@ if(dojo.isIE || dojo.isOpera){
 		var s = computedStyle || gcs(node),
 			pe = d._getPadExtents(node, s),
 			be = d._getBorderExtents(node, s),
-			w = node.clientWidth, 
+			w = node.clientWidth,
 			h
 		;
 		if(!w){
 			w = node.offsetWidth, h = node.offsetHeight;
 		}else{
-			h = node.clientHeight, be.w = be.h = 0; 
+			h = node.clientHeight, be.w = be.h = 0;
 		}
 		// On Opera, offsetLeft includes the parent's border
 				if(d.isOpera){ pe.l += be.l; pe.t += be.t; };
-				return { 
-			l: pe.l, 
-			t: pe.t, 
-			w: w - pe.w - be.w, 
+				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), 
+		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, 
+		return {
+			l: cb.l - pe.l,
+			t: cb.t - pe.t,
+			w: cb.w + pe.w,
 			h: cb.h + pe.h
 		};
 	}
@@ -4920,22 +6118,29 @@ if(dojo.isIE || dojo.isOpera){
 	//
 	// 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".
+		//	node:
+		//		DOM Node reference. Id string not supported for performance
+		//		reasons.
+		//	l:
+		//		left offset from parent.
+		//	t:
+		//		top offset from parent.
+		//	w:
+		//		width in current box model.
+		//	h:
+		//		width in current box model.
+		//	u:
+		//		unit measure to use for other measures. Defaults to "px".
 		u = u || "px";
 		var s = node.style;
 		if(!isNaN(l)){ s.left = l + u; }
@@ -4947,21 +6152,21 @@ if(dojo.isIE || dojo.isOpera){
 	dojo._isButtonTag = function(/*DomNode*/node) {
 		// summary:
 		//		True if the node is BUTTON or INPUT.type="button".
-		return node.tagName == "BUTTON" 
-			|| node.tagName=="INPUT" && node.getAttribute("type").toUpperCase() == "BUTTON"; // boolean
+		return node.tagName == "BUTTON"
+			|| node.tagName=="INPUT" && (node.getAttribute("type")||'').toUpperCase() == "BUTTON"; // boolean
 	}
-	
+
 	dojo._usesBorderBox = function(/*DomNode*/node){
-		//	summary: 
+		//	summary:
 		//		True if the node uses border-box layout.
 
 		// We could test the computed style of node to see if a particular box
 		// has been specified, but there are details and we choose not to bother.
-		
+
 		// TABLE and BUTTON (and INPUT type=button) are always border-box by default.
 		// If you have assigned a different box to either one via CSS then
 		// box functions will break.
-		
+
 		var n = node.tagName;
 		return d.boxModel=="border-box" || n=="TABLE" || d._isButtonTag(node); // boolean
 	}
@@ -4978,8 +6183,8 @@ if(dojo.isIE || dojo.isOpera){
 		d._setBox(node, NaN, NaN, widthPx, heightPx);
 	}
 
-	dojo._setMarginBox = function(/*DomNode*/node, 	/*Number?*/leftPx, /*Number?*/topPx, 
-													/*Number?*/widthPx, /*Number?*/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
@@ -4988,7 +6193,7 @@ if(dojo.isIE || dojo.isOpera){
 		//		you.
 
 		var s = computedStyle || gcs(node),
-		// Some elements have special padding, margin, and box-model settings. 
+		// Some elements have special padding, margin, and box-model settings.
 		// To use box functions you may need to set padding, margin explicitly.
 		// Controlling box-model is harder, in a pinch you might set dojo.boxModel.
 			bb = d._usesBorderBox(node),
@@ -5009,15 +6214,16 @@ if(dojo.isIE || dojo.isOpera){
 		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: 
+		//	description:
+		//		Getter/setter for the margin-box of node.
 		//		Returns an object in the expected format of box (regardless
 		//		if box is passed). The object might look like:
 		//			`{ l: 50, t: 200, w: 300: h: 150 }`
@@ -5030,7 +6236,17 @@ if(dojo.isIE || dojo.isOpera){
 		//		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;
+		//	example:
+		//	Retrieve the marginbox of a passed node
+		//	|	var box = dojo.marginBox("someNodeId");
+		//	|	console.dir(box);
+		//
+		//	example:
+		//	Set a node's marginbox to the size of another node
+		//	|	var box = dojo.marginBox("someNodeId");
+		//	|	dojo.marginBox("someOtherNode", box);
+		
+		var n = byId(node), s = gcs(n), b = box;
 		return !b ? d._getMarginBox(n, s) : d._setMarginBox(n, b.l, b.t, b.w, b.h, s); // Object
 	}
 
@@ -5052,14 +6268,14 @@ if(dojo.isIE || dojo.isOpera){
 		//		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 = d.byId(node), s = gcs(n), b = box;
+		var n = byId(node), s = gcs(n), b = box;
 		return !b ? d._getContentBox(n, s) : d._setContentSize(n, b.w, b.h, s); // Object
 	}
-	
+
 	// =============================
 	// Positioning 
 	// =============================
-	
+
 	var _sumAncestorProperties = function(node, prop){
 		if(!(node = (node||0).parentNode)){return 0}
 		var val, retVal = 0, _b = d.body();
@@ -5080,46 +6296,51 @@ if(dojo.isIE || dojo.isOpera){
 	}
 
 	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)
-		};
+		var n = d.global;
+		return "pageXOffset" in n? { x:n.pageXOffset, y:n.pageYOffset } :
+			(n=d.doc.documentElement, n.clientHeight? { x:d._fixIeBiDiScrollLeft(n.scrollLeft), y:n.scrollTop } :
+			(n=d.body(), { x:n.scrollLeft||0, y:n.scrollTop||0 }));
 	};
-	
+
 	dojo._isBodyLtr = function(){
-		//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 :
-			d._bodyLtr = gcs(d.body()).direction == "ltr"; // Boolean 
+		return "_bodyLtr" in d? d._bodyLtr :
+			d._bodyLtr = (d.body().dir || d.doc.documentElement.dir || "ltr").toLowerCase() == "ltr"; // Boolean 
 	}
-	
+
 		dojo._getIeDocumentElementOffset = function(){
-		// summary
+		//	summary:
+		//		returns the offset in x and y from the document body to the
+		//		visual edge of the page
+		//	description:
 		// The following values in IE contain an offset:
-		//     event.clientX
-		//     event.clientY
-		//     node.getBoundingClientRect().left
-		//     node.getBoundingClientRect().top
-		// But other position related values do not contain this offset, such as
-		// node.offsetLeft, node.offsetTop, node.style.left and node.style.top.
-		// The offset is always (2, 2) in LTR direction. When the body is in RTL
-		// direction, the offset counts the width of left scroll bar's width.
-		// This function computes the actual offset.
+		//	|		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;
+		var de = d.doc.documentElement; // only deal with HTML element here, _abs handles body/quirks 
 
-		if(d.isIE < 7){
-			return { x: d._isBodyLtr() || window.parent == window ?
-				de.clientLeft : de.offsetWidth - de.clientWidth - de.clientLeft, 
-				y: de.clientTop }; // Object
-		}else if(d.isIE < 8){
-			return {x: de.getBoundingClientRect().left, y: de.getBoundingClientRect().top};
+		if(d.isIE < 8){
+			var r = de.getBoundingClientRect(); // works well for IE6+
+			//console.debug('rect left,top = ' + r.left+','+r.top + ', html client left/top = ' + de.clientLeft+','+de.clientTop + ', rtl = ' + (!d._isBodyLtr()) + ', quirks = ' + d.isQuirks);
+			var l = r.left,
+			    t = r.top;
+			if(d.isIE < 7){
+				l += de.clientLeft;	// scrollbar size in strict/RTL, or,
+				t += de.clientTop;	// HTML border size in strict
+			}
+			return {
+				x: l < 0? 0 : l, // FRAME element border size can lead to inaccurate negative values
+				y: t < 0? 0 : t
+			};
 		}else{
 			return {
 				x: 0,
@@ -5128,7 +6349,7 @@ if(dojo.isIE || dojo.isOpera){
 		}
 
 	};
-		
+	
 	dojo._fixIeBiDiScrollLeft = function(/*Integer*/ scrollLeft){
 		// In RTL direction, scrollLeft should be a negative value, but IE < 8
 		// returns a positive one. All codes using documentElement.scrollLeft
@@ -5137,57 +6358,60 @@ if(dojo.isIE || dojo.isOpera){
 
 				var dd = d.doc;
 		if(d.isIE < 8 && !d._isBodyLtr()){
-			var de = dd.compatMode == "BackCompat" ? dd.body : dd.documentElement;
+			var de = d.isQuirks ? dd.body : dd.documentElement;
 			return scrollLeft + de.clientWidth - de.scrollWidth; // Integer
 		}
 				return scrollLeft; // Integer
 	}
 
-	dojo._abs = function(/*DomNode*/node, /*Boolean?*/includeScroll){
+	// FIXME: need a setter for coords or a moveTo!!
+	dojo._abs = dojo.position = function(/*DomNode*/node, /*Boolean?*/includeScroll){
 		//	summary:
-		//		Gets the position of the passed element relative to
+		//		Gets the position and size of the passed element relative to
 		//		the viewport (if includeScroll==false), or relative to the
 		//		document root (if includeScroll==true).
 		//
+		//	description:
 		//		Returns an object of the form:
-		//			{ x: 100, y: 300 }
-		//		if includeScroll is passed, the x and y values will include any
+		//			{ x: 100, y: 300, w: 20, h: 15 }
+		//		If includeScroll==true, the x and y values will include any
 		//		document offsets that may affect the position relative to the
 		//		viewport.
+		//		Uses the border-box model (inclusive of border and padding but
+		//		not margin).  Does not act as a setter.
 
-		// FIXME: need to decide in the brave-new-world if we're going to be
-		// margin-box or border-box.
-		
-		// targetBoxType == "border-box"
-		var db = d.body(), dh = d.body().parentNode, ret;
+		var db = d.body(), dh = db.parentNode, ret;
+		node = byId(node);
 		if(node["getBoundingClientRect"]){
 			// IE6+, FF3+, super-modern WebKit, and Opera 9.6+ all take this branch
-			var client = node.getBoundingClientRect();
-			ret = { x: client.left, y: client.top };
-					if(d.isFF >= 3){
-				// in FF3 you have to subtract the document element margins
-				var cs = gcs(dh);
-				ret.x -= px(dh, cs.marginLeft) + px(dh, cs.borderLeftWidth);
-				ret.y -= px(dh, cs.marginTop) + px(dh, cs.borderTopWidth);
-			}
-			if(d.isIE){
+			ret = node.getBoundingClientRect();
+			ret = { x: ret.left, y: ret.top, w: ret.right - ret.left, h: ret.bottom - ret.top };
+					if(d.isIE){
 				// On IE there's a 2px offset that we need to adjust for, see _getIeDocumentElementOffset()
 				var offset = d._getIeDocumentElementOffset();
 
 				// fixes the position in IE, quirks mode
-				ret.x -= offset.x + (d.isQuirks ? db.clientLeft : 0);
-				ret.y -= offset.y + (d.isQuirks ? db.clientTop : 0);
+				ret.x -= offset.x + (d.isQuirks ? db.clientLeft+db.offsetLeft : 0);
+				ret.y -= offset.y + (d.isQuirks ? db.clientTop+db.offsetTop : 0);
+			}else if(d.isFF == 3){
+				// In FF3 you have to subtract the document element margins.
+				// Fixed in FF3.5 though.
+				var cs = gcs(dh);
+				ret.x -= px(dh, cs.marginLeft) + px(dh, cs.borderLeftWidth);
+				ret.y -= px(dh, cs.marginTop) + px(dh, cs.borderTopWidth);
 			}
 				}else{
-			// FF2 and Safari
+			// FF2 and older WebKit
 			ret = {
 				x: 0,
-				y: 0
+				y: 0,
+				w: node.offsetWidth,
+				h: node.offsetHeight
 			};
 			if(node["offsetParent"]){
 				ret.x -= _sumAncestorProperties(node, "scrollLeft");
 				ret.y -= _sumAncestorProperties(node, "scrollTop");
-				
+
 				var curnode = node;
 				do{
 					var n = curnode.offsetLeft,
@@ -5197,7 +6421,7 @@ if(dojo.isIE || dojo.isOpera){
 
 					cs = gcs(curnode);
 					if(curnode != node){
-								if(d.isFF){
+								if(d.isMoz){
 							// tried left+right with differently sized left/right borders
 							// it really is 2xleft border in FF, not left+right, even in RTL!
 							ret.x += 2 * px(curnode,cs.borderLeftWidth);
@@ -5209,7 +6433,7 @@ if(dojo.isIE || dojo.isOpera){
 							}
 					// static children in a static div in FF2 are affected by the div's border as well
 					// but offsetParent will skip this div!
-							if(d.isFF && cs.position=="static"){
+							if(d.isMoz && cs.position=="static"){
 						var parent=curnode.parentNode;
 						while(parent!=curnode.offsetParent){
 							var pcs=gcs(parent);
@@ -5239,21 +6463,23 @@ if(dojo.isIE || dojo.isOpera){
 		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().
+		//		Deprecated: Use position() for border-box x/y/w/h
+		//		or marginBox() for margin-box w/h/l/t.
+		//		Returns an object representing a node's size and position.
 		//
 		//	description:
-		//		Returns an object that measures margin box width/height and
-		//		absolute positioning data from dojo._abs().
+		//		Returns an object that measures margin-box (w)idth/(h)eight
+		//		and absolute position x/y of the border-box. Also returned
+		//		is computed (l)eft and (t)op values in pixels from the
+		//		node's offsetParent as returned from marginBox().
 		//		Return value will be in the form:
-		//			`{ l: 50, t: 200, w: 300: h: 150, x: 100, y: 300 }`
+		//|			{ 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);
+		//		y params are affected as one would expect in dojo.position().
+		var n = byId(node), s = gcs(n), mb = d._getMarginBox(n, s);
+		var abs = d.position(n, includeScroll);
 		mb.x = abs.x;
 		mb.y = abs.y;
 		return mb;
@@ -5263,47 +6489,48 @@ if(dojo.isIE || dojo.isOpera){
 	// Element attribute Functions
 	// =============================
 
-		var ieLT8 = d.isIE < 8;
-	
-	var _fixAttrName = function(/*String*/name){
-		switch(name.toLowerCase()){
-			// Internet Explorer will only set or remove tabindex/readonly
-			// if it is spelled "tabIndex"/"readOnly"
-						case "tabindex":
-				return ieLT8 ? "tabIndex" : "tabindex";
-						case "readonly":
-				return "readOnly";
-			case "class":
-				return "className";
-						case "for": case "htmlfor":
-				// to pick up for attrib set in markup via getAttribute() IE<8 uses "htmlFor" and others use "for"
-				// get/setAttribute works in all as long use same value for both get/set
-				return ieLT8 ? "htmlFor" : "for";
-						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",
-		// the following attributes don't have the default but should be treated like properties
-		classname: "className",
-		innerhtml: "innerHTML"
-	}
+	// dojo.attr() should conform to http://www.w3.org/TR/DOM-Level-2-Core/
+
+	var _propNames = {
+			// properties renamed to avoid clashes with reserved words
+			"class":   "className",
+			"for":     "htmlFor",
+			// properties written as camelCase
+			tabindex:  "tabIndex",
+			readonly:  "readOnly",
+			colspan:   "colSpan",
+			frameborder: "frameBorder",
+			rowspan:   "rowSpan",
+			valuetype: "valueType"
+		},
+		_attrNames = {
+			// original attribute names
+			classname: "class",
+			htmlfor:   "for",
+			// for IE
+			tabindex:  "tabIndex",
+			readonly:  "readOnly"
+		},
+		_forcePropNames = {
+			innerHTML: 1,
+			className: 1,
+			htmlFor:   d.isIE,
+			value:     1
+		};
+
+	var _fixAttrName = function(/*String*/ name){
+		return _attrNames[name.toLowerCase()] || name;
+	};
+
+	var _hasAttr = function(node, name){
+		var attr = node.getAttributeNode && node.getAttributeNode(name);
+		return attr && attr.specified; // Boolean
+	};
+
+	// There is a difference in the presence of certain properties and their default values
+	// between browsers. For example, on IE "disabled" is present on all elements,
+	// but it is value is "false"; "tabIndex" of <div> returns 0 by default on IE, yet other browsers
+	// can return -1.
 
 	dojo.hasAttr = function(/*DomNode|String*/node, /*String*/name){
 		//	summary:
@@ -5316,11 +6543,8 @@ if(dojo.isIE || dojo.isOpera){
 		//	returns:
 		//		true if the requested attribute is specified on the
 		//		given element, and false otherwise
-		node = d.byId(node);
-		var fixName = _fixAttrName(name);
-		fixName = fixName == "htmlFor" ? "for" : fixName; //IE<8 uses htmlFor except in this case
-		var attr = node.getAttributeNode && node.getAttributeNode(fixName);
-		return attr ? attr.specified : false; // Boolean
+		var lc = name.toLowerCase();
+		return _forcePropNames[_propNames[lc] || name] || _hasAttr(byId(node), _attrNames[lc] || name);	// Boolean
 	}
 
 	var _evtHdlrMap = {}, _ctr = 0,
@@ -5337,8 +6561,8 @@ if(dojo.isIE || dojo.isOpera){
 		//		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
+		//
+		//		If a third argument is passed, or if the second argument is a
 		//		map of attributes, acts as a setter.
 		//
 		//		When passing functions as values, note that they will not be
@@ -5361,7 +6585,7 @@ if(dojo.isIE || dojo.isOpera){
 		//		or null if that attribute does not have a specified or
 		//		default value;
 		//
-		//		when used as a setter, undefined
+		//		when used as a setter, the DOM node
 		//
 		//	example:
 		//	|	// get the current value of the "foo" attribute on a node
@@ -5371,14 +6595,14 @@ if(dojo.isIE || dojo.isOpera){
 		//
 		//	example:
 		//	|	// use attr() to set the tab index
-		//	|	dojo.attr("nodeId", "tabindex", 3);
+		//	|	dojo.attr("nodeId", "tabIndex", 3);
 		//	|
 		//
 		//	example:
 		//	Set multiple values at once, including event handlers:
 		//	|	dojo.attr("formId", {
 		//	|		"foo": "bar",
-		//	|		"tabindex": -1,
+		//	|		"tabIndex": -1,
 		//	|		"method": "POST",
 		//	|		"onsubmit": function(e){
 		//	|			// stop submitting the form. Note that the IE behavior
@@ -5408,96 +6632,135 @@ if(dojo.isIE || dojo.isOpera){
 		//	|	var obj = { color:"#fff", backgroundColor:"#000" };
 		//	|	dojo.attr("someNode", "style", obj);
 		//	|
-		//	|	// though shorter to use `dojo.style` in this case:
+		//	|	// though shorter to use `dojo.style()` in this case:
 		//	|	dojo.style("someNode", obj);
-		
-		node = d.byId(node);
-		var args = arguments.length;
-		if(args == 2 && !d.isString(name)){
+
+		node = byId(node);
+		var args = arguments.length, prop;
+		if(args == 2 && typeof name != "string"){ // inline'd type check
 			// the object form of setter: the 2nd argument is a dictionary
-			for(var x in name){ d.attr(node, x, name[x]); }
-			// FIXME: return the node in this case? could be useful.
-			return;
+			for(var x in name){
+				d.attr(node, x, name[x]);
+			}
+			return node; // DomNode
 		}
-		name = _fixAttrName(name);
-		if(args == 3){ // setter
-			if(d.isFunction(value)){
-				// clobber if we can
-				var attrId = d.attr(node, _attrId);
-				if(!attrId){
-					attrId = _ctr++;
-					d.attr(node, _attrId, attrId);
+		var lc = name.toLowerCase(),
+			propName = _propNames[lc] || name,
+			forceProp = _forcePropNames[propName],
+			attrName = _attrNames[lc] || name;
+		if(args == 3){
+			// setter
+			do{
+				if(propName == "style" && typeof value != "string"){ // inline'd type check
+					// special case: setting a style
+					d.style(node, value);
+					break;
 				}
-				if(!_evtHdlrMap[attrId]){
-					_evtHdlrMap[attrId] = {};
+				if(propName == "innerHTML"){
+					// special case: assigning HTML
+										if(d.isIE && node.tagName.toLowerCase() in _roInnerHtml){
+						d.empty(node);
+						node.appendChild(d._toDom(value, node.ownerDocument));
+					}else{
+											node[propName] = value;
+										}
+										break;
 				}
-				var h = _evtHdlrMap[attrId][name];
-				if(h){
-					d.disconnect(h);
-				}else{
-					try{
-						delete node[name];
-					}catch(e){}
+				if(d.isFunction(value)){
+					// special case: assigning an event handler
+					// clobber if we can
+					var attrId = d.attr(node, _attrId);
+					if(!attrId){
+						attrId = _ctr++;
+						d.attr(node, _attrId, attrId);
+					}
+					if(!_evtHdlrMap[attrId]){
+						_evtHdlrMap[attrId] = {};
+					}
+					var h = _evtHdlrMap[attrId][propName];
+					if(h){
+						d.disconnect(h);
+					}else{
+						try{
+							delete node[propName];
+						}catch(e){}
+					}
+					// ensure that event objects are normalized, etc.
+					_evtHdlrMap[attrId][propName] = d.connect(node, propName, value);
+					break;
 				}
-
-				// ensure that event objects are normalized, etc.
-				_evtHdlrMap[attrId][name] = d.connect(node, name, value);
-
-			}else if(typeof value == "boolean"){ // e.g. onsubmit, disabled
-				node[name] = value;
-			}else if(name === "style" && !d.isString(value)){
-				// when the name is "style" and value is an object, pass along
-				d.style(node, value);
-			}else if(name == "className"){
-				node.className = value;
-			}else if(name === "innerHTML"){
-								if(d.isIE && node.tagName.toLowerCase() in _roInnerHtml){
-					d.empty(node);
-					node.appendChild(d._toDom(value, node.ownerDocument));
-				}else{
-									node[name] = value;
-								}
-							}else{
-				node.setAttribute(name, value);
-			}
-		}else{
-			// getter
-			// should we access this attribute via a property or
-			// via getAttribute()?
-			var prop = _attrProps[name.toLowerCase()];
-			if(prop){
-				return node[prop];
-			}
-			var attrValue = node[name];
-			return (typeof attrValue == 'boolean' || typeof attrValue == 'function') ? attrValue
-				: (d.hasAttr(node, name) ? node.getAttribute(name) : null);
+				if(forceProp || typeof value == "boolean"){
+					// special case: forcing assignment to the property
+					// special case: setting boolean to a property instead of attribute
+					node[propName] = value;
+					break;
+				}
+				// node's attribute
+				node.setAttribute(attrName, value);
+			}while(false);
+			return node; // DomNode
 		}
+		// getter
+		// should we access this attribute via a property or
+		// via getAttribute()?
+		value = node[propName];
+		if(forceProp && typeof value != "undefined"){
+			// node's property
+			return value;	// Anything
+		}
+		if(propName != "href" && (typeof value == "boolean" || d.isFunction(value))){
+			// node's property
+			return value;	// Anything
+		}
+		// node's attribute
+		// we need _hasAttr() here to guard against IE returning a default value
+		return _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything
 	}
 
-	dojo.removeAttr = function(/*DomNode|String*/node, /*String*/name){
+	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));
+		byId(node).removeAttribute(_fixAttrName(name));
 	}
-	
+
+	dojo.getNodeProp = function(/*DomNode|String*/ node, /*String*/ name){
+		//	summary:
+		//		Returns an effective value of a property or an attribute.
+		//	node:
+		//		id or reference to the element to remove the attribute from
+		//	name:
+		//		the name of the attribute
+		node = byId(node);
+		var lc = name.toLowerCase(),
+			propName = _propNames[lc] || name;
+		if((propName in node) && propName != "href"){
+			// node's property
+			return node[propName];	// Anything
+		}
+		// node's attribute
+		var attrName = _attrNames[lc] || name;
+		return _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything
+	}
+
 	dojo.create = function(tag, attrs, refNode, pos){
-		// summary: Create an element, allowing for optional attribute decoration
-		//		and placement. 
+		//	summary:
+		//		Create an element, allowing for optional attribute decoration
+		//		and placement.
 		//
 		// description:
 		//		A DOM Element creation function. A shorthand method for creating a node or
-		//		a fragment, and allowing for a convenient optional attribute setting step, 
+		//		a fragment, and allowing for a convenient optional attribute setting step,
 		//		as well as an optional DOM placement reference.
 		//|
 		//		Attributes are set by passing the optional object through `dojo.attr`.
-		//		See `dojo.attr` for noted caveats and nuances, and API if applicable. 
+		//		See `dojo.attr` for noted caveats and nuances, and API if applicable.
 		//|
 		//		Placement is done via `dojo.place`, assuming the new node to be the action 
-		//		node, passing along the optional reference node and position. 
+		//		node, passing along the optional reference node and position.
 		//
 		// tag: String|DomNode
 		//		A string of the element to create (eg: "div", "a", "p", "li", "script", "br"),
@@ -5512,7 +6775,7 @@ if(dojo.isIE || dojo.isOpera){
 		//		Optional reference node. Used by `dojo.place` to place the newly created
 		//		node somewhere in the dom relative to refNode. Can be a DomNode reference
 		//		or String ID of a node.
-		//	
+		//
 		// pos: String?
 		//		Optional positional reference. Defaults to "last" by way of `dojo.place`,
 		//		though can be set to "first","after","before","last", "replace" or "only"
@@ -5523,49 +6786,49 @@ if(dojo.isIE || dojo.isOpera){
 		//
 		// example:
 		//	Create a DIV:
-		//	| var n = dojo.create("div");
+		//	|	var n = dojo.create("div");
 		//
 		// example:
 		//	Create a DIV with content:
-		//	| var n = dojo.create("div", { innerHTML:"<p>hi</p>" });
+		//	|	var n = dojo.create("div", { innerHTML:"<p>hi</p>" });
 		//
 		// example:
 		//	Place a new DIV in the BODY, with no attributes set
-		//	| var n = dojo.create("div", null, dojo.body());
+		//	|	var n = dojo.create("div", null, dojo.body());
 		//
 		// example:
 		//	Create an UL, and populate it with LI's. Place the list as the first-child of a 
 		//	node with id="someId":
-		//	| var ul = dojo.create("ul", null, "someId", "first"); 
-		//	| var items = ["one", "two", "three", "four"];
-		//	| dojo.forEach(items, function(data){
-		//	|	dojo.create("li", { innerHTML: data }, ul);
-		//	| });
+		//	|	var ul = dojo.create("ul", null, "someId", "first");
+		//	|	var items = ["one", "two", "three", "four"];
+		//	|	dojo.forEach(items, function(data){
+		//	|		dojo.create("li", { innerHTML: data }, ul);
+		//	|	});
 		//
 		// example:
 		//	Create an anchor, with an href. Place in BODY:
-		//	| dojo.create("a", { href:"foo.html", title:"Goto FOO!" }, dojo.body());
+		//	|	dojo.create("a", { href:"foo.html", title:"Goto FOO!" }, dojo.body());
 		//
 		// example:
-		//	Create a `dojo.NodeList` from a new element (for syntatic sugar):
+		//	Create a `dojo.NodeList()` from a new element (for syntatic sugar):
 		//	|	dojo.query(dojo.create('div'))
 		//	|		.addClass("newDiv")
-		//	|		.onclick(function(e){  })
+		//	|		.onclick(function(e){ console.log('clicked', e.target) })
 		//	|		.place("#someNode"); // redundant, but cleaner.
 
 		var doc = d.doc;
-		if(refNode){		
-			refNode = d.byId(refNode);
+		if(refNode){
+			refNode = byId(refNode);
 			doc = refNode.ownerDocument;
 		}
-		if(d.isString(tag)){
+		if(typeof tag == "string"){ // inline'd type check
 			tag = doc.createElement(tag);
 		}
 		if(attrs){ d.attr(tag, attrs); }
 		if(refNode){ d.place(tag, refNode, pos); }
 		return tag; // DomNode
 	}
-	
+
 	/*=====
 	dojo.empty = function(node){
 			//	summary:
@@ -5574,23 +6837,23 @@ if(dojo.isIE || dojo.isOpera){
 			//		a reference to a DOM node or an id.
 			//	example:
 			//	Destroy node's children byId:
-			//	| dojo.empty("someId");
+			//	|	dojo.empty("someId");
 			//
 			//	example:
 			//	Destroy all nodes' children in a list by reference:
-			//	| dojo.query(".someNode").forEach(dojo.empty);
+			//	|	dojo.query(".someNode").forEach(dojo.empty);
 	}
 	=====*/
 
-	d.empty = 
+	d.empty =
 				d.isIE ?  function(node){
-			node = d.byId(node);
+			node = byId(node);
 			for(var c; c = node.lastChild;){ // intentional assignment
 				d.destroy(c);
 			}
 		} :
 				function(node){
-			d.byId(node).innerHTML = "";
+			byId(node).innerHTML = "";
 		};
 
 	/*=====
@@ -5606,7 +6869,7 @@ if(dojo.isIE || dojo.isOpera){
 			//
 			//	example:
 			//	Create a table row:
-			//	| var tr = dojo._toDom("<tr><td>First!</td></tr>");
+			//	|	var tr = dojo._toDom("<tr><td>First!</td></tr>");
 	}
 	=====*/
 
@@ -5640,7 +6903,8 @@ if(dojo.isIE || dojo.isOpera){
 	}
 
 	d._toDom = function(frag, doc){
-		// summary converts HTML string into DOM nodes.
+		//	summary:
+		// 		converts HTML string into DOM nodes.
 
 		doc = doc || d.doc;
 		var masterId = doc[masterName];
@@ -5671,7 +6935,7 @@ if(dojo.isIE || dojo.isOpera){
 		if(master.childNodes.length == 1){
 			return master.removeChild(master.firstChild); // DOMNode
 		}
-		
+
 		// return multiple nodes as a document fragment
 		df = doc.createDocumentFragment();
 		while(fc = master.firstChild){ // intentional assignment
@@ -5688,69 +6952,124 @@ if(dojo.isIE || dojo.isOpera){
 	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. 
+		//		class list currently applied to the node.
 		//
-		//	node: 
+		//	node:
 		//		String ID or DomNode reference to check the class for.
 		//
 		//	classStr:
 		//		A string class name to look for.
-		// 
+		//
 		//	example:
-		//	| if(dojo.hasClass("someNode","aSillyClassName")){ ... }
-		
-		return ((" "+ d.byId(node)[_className] +" ").indexOf(" "+ classStr +" ") >= 0);  // Boolean
+		//	Do something if a node with id="someNode" has class="aSillyClassName" present
+		//	|	if(dojo.hasClass("someNode","aSillyClassName")){ ... }
+
+		return ((" "+ byId(node)[_className] +" ").indexOf(" " + classStr + " ") >= 0);  // Boolean
 	};
 
-	dojo.addClass = function(/*DomNode|String*/node, /*String*/classStr){
+	var spaces = /\s+/, a1 = [""],
+		str2array = function(s){
+			if(typeof s == "string" || s instanceof String){
+				if(s.indexOf(" ") < 0){
+					a1[0] = s;
+					return a1;
+				}else{
+					return s.split(spaces);
+				}
+			}
+			// assumed to be an array
+			return s;
+		};
+
+	dojo.addClass = function(/*DomNode|String*/node, /*String|Array*/classStr){
 		//	summary:
 		//		Adds the specified classes to the end of the class list on the
-		//		passed node. Will not re-apply duplicate classes, except in edge
-		//		cases when adding multiple classes at once.
+		//		passed node. Will not re-apply duplicate classes.
 		//
-		//	node: String ID or DomNode reference to add a class string too
-		//	classStr: A String class name to add
+		//	node:
+		//		String ID or DomNode reference to add a class string too
+		//
+		//	classStr:
+		//		A String class name to add, or several space-separated class names,
+		//		or an array of class names.
 		//
 		// example:
-		//	Add A class to some node:
+		//	Add a class to some node:
 		//	|	dojo.addClass("someNode", "anewClass");
 		//
 		// example:
-		//	Add two classes at once (could potentially add duplicate):
-		//	| 	dojo.addClass("someNode", "firstClass secondClass");
+		//	Add two classes at once:
+		//	|	dojo.addClass("someNode", "firstClass secondClass");
+		//
+		// example:
+		//	Add two classes at once (using array):
+		//	|	dojo.addClass("someNode", ["firstClass", "secondClass"]);
 		//
 		// example:
 		//	Available in `dojo.NodeList` for multiple additions
-		//	| dojo.query("ul > li").addClass("firstLevel");
-		
-		node = d.byId(node);
-		var cls = node[_className];
-		if((" "+ cls +" ").indexOf(" " + classStr + " ") < 0){
-			node[_className] = cls + (cls ? ' ' : '') + classStr;
+		//	|	dojo.query("ul > li").addClass("firstLevel");
+
+		node = byId(node);
+		classStr = str2array(classStr);
+		var cls = " " + node[_className] + " ";
+		for(var i = 0, len = classStr.length, c; i < len; ++i){
+			c = classStr[i];
+			if(c && cls.indexOf(" " + c + " ") < 0){
+				cls += c + " ";
+			}
 		}
+		node[_className] = d.trim(cls);
 	};
 
-	dojo.removeClass = function(/*DomNode|String*/node, /*String*/classStr){
-		// summary: Removes the specified classes from node. No `dojo.hasClass` 
-		//		check is required. 
+	dojo.removeClass = function(/*DomNode|String*/node, /*String|Array?*/classStr){
+		// summary:
+		//		Removes the specified classes from node. No `dojo.hasClass`
+		//		check is required.
 		//
-		// node: String ID or DomNode reference to remove the class from.
+		// node:
+		// 		String ID or DomNode reference to remove the class from.
 		//
-		// classString: String class name to remove
+		// classStr:
+		//		An optional String class name to remove, or several space-separated
+		//		class names, or an array of class names. If omitted, all class names
+		//		will be deleted.
 		//
 		// example:
-		// 	| dojo.removeClass("someNode", "firstClass");
+		//	Remove a class from some node:
+		//	|	dojo.removeClass("someNode", "firstClass");
 		//
 		// example:
-		//	Available in `dojo.NodeList` for multiple removal
-		//	| dojo.query(".foo").removeClass("foo");
-		
-		node = d.byId(node);
-		var t = d.trim((" " + node[_className] + " ").replace(" " + classStr + " ", " "));
-		if(node[_className] != t){ node[_className] = t; }
+		//	Remove two classes from some node:
+		//	|	dojo.removeClass("someNode", "firstClass secondClass");
+		//
+		// example:
+		//	Remove two classes from some node (using array):
+		//	|	dojo.removeClass("someNode", ["firstClass", "secondClass"]);
+		//
+		// example:
+		//	Remove all classes from some node:
+		//	|	dojo.removeClass("someNode");
+		//
+		// example:
+		//	Available in `dojo.NodeList()` for multiple removal
+		//	|	dojo.query(".foo").removeClass("foo");
+
+		node = byId(node);
+		var cls;
+		if(classStr !== undefined){
+			classStr = str2array(classStr);
+			cls = " " + node[_className] + " ";
+			for(var i = 0, len = classStr.length; i < len; ++i){
+				cls = cls.replace(" " + classStr[i] + " ", " ");
+			}
+			cls = d.trim(cls);
+		}else{
+			cls = "";
+		}
+		if(node[_className] != cls){ node[_className] = cls; }
 	};
 
-	dojo.toggleClass = function(/*DomNode|String*/node, /*String*/classStr, /*Boolean?*/condition){
+	dojo.toggleClass = function(/*DomNode|String*/node, /*String|Array*/classStr, /*Boolean?*/condition){
 		//	summary:
 		//		Adds a class to node if not present, or removes if present.
 		//		Pass a boolean condition if you want to explicitly add or remove.
@@ -5758,16 +7077,16 @@ if(dojo.isIE || dojo.isOpera){
 		//		If passed, true means to add the class, false means to remove.
 		//
 		// example:
-		//	| dojo.toggleClass("someNode", "hovered");
+		//	|	dojo.toggleClass("someNode", "hovered");
 		//
 		// example:
-		// 	Forcefully add a class
-		//	| dojo.toggleClass("someNode", "hovered", true);
+		//	Forcefully add a class
+		//	|	dojo.toggleClass("someNode", "hovered", true);
 		//
 		// example:
-		//	Available in `dojo.NodeList` for multiple toggles
-		//	| dojo.query(".toggleMe").toggleClass("toggleMe");
-		
+		//	Available in `dojo.NodeList()` for multiple toggles
+		//	|	dojo.query(".toggleMe").toggleClass("toggleMe");
+
 		if(condition === undefined){
 			condition = !d.hasClass(node, classStr);
 		}
@@ -5789,27 +7108,40 @@ dojo.provide("dojo._base.NodeList");
 	var d = dojo;
 
 	var ap = Array.prototype, aps = ap.slice, apc = ap.concat;
-	
-	var tnl = function(a){
-		// decorate an array to make it look like a NodeList
-		a.constructor = d.NodeList;
-		dojo._mixin(a, d.NodeList.prototype);
-		return a;
-	};
 
-	var loopBody = function(f, a, o){
-		a = [0].concat(aps.call(a, 0));
+	var tnl = function(/*Array*/ a, /*dojo.NodeList?*/ parent, /*Function?*/ NodeListCtor){
+		// summary:
+		// 		decorate an array to make it look like a `dojo.NodeList`.
+		// a:
+		// 		Array of nodes to decorate.
+		// parent:
+		// 		An optional parent NodeList that generated the current
+		// 		list of nodes. Used to call _stash() so the parent NodeList
+		// 		can be accessed via end() later.
+		// NodeListCtor:
+		// 		An optional constructor function to use for any
+		// 		new NodeList calls. This allows a certain chain of
+		// 		NodeList calls to use a different object than dojo.NodeList.
 		if(!a.sort){
 			// make sure it's a real array before we pass it on to be wrapped
 			a = aps.call(a, 0);
 		}
+		var ctor = NodeListCtor || this._NodeListCtor || d._NodeListCtor;
+		a.constructor = ctor;
+		dojo._mixin(a, ctor.prototype);
+		a._NodeListCtor = ctor;
+		return parent ? a._stash(parent) : a;
+	};
+
+	var loopBody = function(f, a, o){
+		a = [0].concat(aps.call(a, 0));
 		o = o || d.global;
 		return function(node){
 			a[0] = node;
 			return f.apply(o, a);
 		};
 	};
-	
+
 	// adapters
 
 	var adaptAsForEach = function(f, o){
@@ -5839,7 +7171,7 @@ dojo.provide("dojo._base.NodeList");
 			return this.map(loopBody(f, arguments, o));
 		};
 	};
-	
+
 	var adaptAsFilter = function(f, o){
 		//	summary:
 		//		adapts a single node function to be used in the filter-type actions
@@ -5851,9 +7183,9 @@ dojo.provide("dojo._base.NodeList");
 			return this.filter(loopBody(f, arguments, o));
 		};
 	};
-	
+
 	var adaptWithCondition = function(f, g, o){
-		//	summary: 
+		//	summary:
 		//		adapts a single node function to be used in the map-type
 		//		actions, behaves like forEach() or map() depending on arguments
 		//	f: Function
@@ -5871,13 +7203,13 @@ dojo.provide("dojo._base.NodeList");
 			return this;	// self
 		};
 	};
-	
+
 	var magicGuard = function(a){
 		//	summary:
 		//		the guard function for dojo.attr() and dojo.style()
-		return a.length == 1 && d.isString(a[0])
+		return a.length == 1 && (typeof a[0] == "string"); // inline'd type check
 	};
-	
+
 	var orphan = function(node){
 		//	summary:
 		//		function to orphan nodes
@@ -5908,7 +7240,7 @@ dojo.provide("dojo._base.NodeList");
 		//		get a NodeList from a CSS query and iterate on it
 		//		|	var l = dojo.query(".thinger");
 		//		|	l.forEach(function(node, index, nodeList){
-		//		|		
+		//		|		console.log(index, node.innerHTML);
 		//		|	});
 		//	example:
 		//		use native and Dojo-provided array methods to manipulate a
@@ -5917,13 +7249,13 @@ dojo.provide("dojo._base.NodeList");
 		//		|	// since NodeLists are real arrays, they have a length
 		//		|	// property that is both readable and writable and
 		//		|	// push/pop/shift/unshift methods
-		//		|	
-		//		|	l.push(dojo.create("<span>howdy!</span>"));
+		//		|	console.log(l.length);
+		//		|	l.push(dojo.create("span"));
 		//		|
 		//		|	// dojo's normalized array methods work too:
-		//		|	
+		//		|	console.log( l.indexOf(dojo.byId("foo")) );
 		//		|	// ...including the special "function as string" shorthand
-		//		|	
+		//		|	console.log( l.every("item.nodeType == 1") );
 		//		|
 		//		|	// NodeLists can be [..] indexed, or you can use the at()
 		//		|	// function to get specific items wrapped in a new NodeList:
@@ -5970,47 +7302,206 @@ dojo.provide("dojo._base.NodeList");
 		return tnl(Array.apply(null, arguments));
 	};
 
+	//Allow things that new up a NodeList to use a delegated or alternate NodeList implementation.
+	d._NodeListCtor = d.NodeList;
+
 	var nl = d.NodeList, nlp = nl.prototype;
-	
+
 	// expose adapters and the wrapper as private functions
-	
-	nl._wrap = tnl;
+
+	nl._wrap = nlp._wrap = tnl;
 	nl._adaptAsMap = adaptAsMap;
 	nl._adaptAsForEach = adaptAsForEach;
 	nl._adaptAsFilter  = adaptAsFilter;
 	nl._adaptWithCondition = adaptWithCondition;
-	
+
 	// mass assignment
-	
+
 	// add array redirectors
 	d.forEach(["slice", "splice"], function(name){
 		var f = ap[name];
-		nlp[name] = function(){ return tnl(f.apply(this, arguments)); };
+		//Use a copy of the this array via this.slice() to allow .end() to work right in the splice case.
+		// CANNOT apply ._stash()/end() to splice since it currently modifies
+		// the existing this array -- it would break backward compatibility if we copy the array before
+		// the splice so that we can use .end(). So only doing the stash option to this._wrap for slice.
+		nlp[name] = function(){ return this._wrap(f.apply(this, arguments), name == "slice" ? this : null); };
 	});
 	// concat should be here but some browsers with native NodeList have problems with it
-	
+
 	// add array.js redirectors
 	d.forEach(["indexOf", "lastIndexOf", "every", "some"], function(name){
 		var f = d[name];
 		nlp[name] = function(){ return f.apply(d, [this].concat(aps.call(arguments, 0))); };
 	});
-	
+
 	// add conditional methods
 	d.forEach(["attr", "style"], function(name){
 		nlp[name] = adaptWithCondition(d[name], magicGuard);
 	});
-	
+
 	// add forEach actions
-	d.forEach(["connect", "addClass", "removeClass", "toggleClass", "empty"], function(name){
+	d.forEach(["connect", "addClass", "removeClass", "toggleClass", "empty", "removeAttr"], function(name){
 		nlp[name] = adaptAsForEach(d[name]);
 	});
 
 	dojo.extend(dojo.NodeList, {
+		_normalize: function(/*String||Element||Object||NodeList*/content, /*DOMNode?*/refNode){
+			// summary:
+			// 		normalizes data to an array of items to insert.
+			// description:
+			// 		If content is an object, it can have special properties "template" and
+			// 		"parse". If "template" is defined, then the template value is run through
+			// 		dojo.string.substitute (if dojo.string.substitute has been dojo.required elsewhere),
+			// 		or if templateFunc is a function on the content, that function will be used to
+			// 		transform the template into a final string to be used for for passing to dojo._toDom.
+			// 		If content.parse is true, then it is remembered for later, for when the content
+			// 		nodes are inserted into the DOM. At that point, the nodes will be parsed for widgets
+			// 		(if dojo.parser has been dojo.required elsewhere).
+
+			//Wanted to just use a DocumentFragment, but for the array/NodeList
+			//case that meant  using cloneNode, but we may not want that.
+			//Cloning should only happen if the node operations span
+			//multiple refNodes. Also, need a real array, not a NodeList from the
+			//DOM since the node movements could change those NodeLists.
+
+			var parse = content.parse === true ? true : false;
+
+			//Do we have an object that needs to be run through a template?
+			if(typeof content.template == "string"){
+				var templateFunc = content.templateFunc || (dojo.string && dojo.string.substitute);
+				content = templateFunc ? templateFunc(content.template, content) : content;
+			}
+
+			var type = (typeof content);
+			if(type == "string" || type == "number"){
+				content = dojo._toDom(content, (refNode && refNode.ownerDocument));
+				if(content.nodeType == 11){
+					//DocumentFragment. It cannot handle cloneNode calls, so pull out the children.
+					content = dojo._toArray(content.childNodes);
+				}else{
+					content = [content];
+				}
+			}else if(!dojo.isArrayLike(content)){
+				content = [content];
+			}else if(!dojo.isArray(content)){
+				//To get to this point, content is array-like, but
+				//not an array, which likely means a DOM NodeList. Convert it now.
+				content = dojo._toArray(content);
+			}
+
+			//Pass around the parse info
+			if(parse){
+				content._runParse = true;
+			}
+			return content; //Array
+		},
+
+		_cloneNode: function(/*DOMNode*/ node){
+			// summary:
+			// 		private utiltity to clone a node. Not very interesting in the vanilla
+			// 		dojo.NodeList case, but delegates could do interesting things like
+			// 		clone event handlers if that is derivable from the node.
+			return node.cloneNode(true);
+		},
+
+		_place: function(/*Array*/ary, /*DOMNode*/refNode, /*String*/position, /*Boolean*/useClone){
+			// summary:
+			// 		private utility to handle placing an array of nodes relative to another node.
+			// description:
+			// 		Allows for cloning the nodes in the array, and for
+			// 		optionally parsing widgets, if ary._runParse is true.
+
+			//Avoid a disallowed operation if trying to do an innerHTML on a non-element node.
+			if(refNode.nodeType != 1 && position == "only"){
+				return;
+			}
+			var rNode = refNode, tempNode;
+
+			//Always cycle backwards in case the array is really a
+			//DOM NodeList and the DOM operations take it out of the live collection.
+			var length = ary.length;
+			for(var i = length - 1; i >= 0; i--){
+				var node = (useClone ? this._cloneNode(ary[i]) : ary[i]);
+
+				//If need widget parsing, use a temp node, instead of waiting after inserting into
+				//real DOM because we need to start widget parsing at one node up from current node,
+				//which could cause some already parsed widgets to be parsed again.
+				if(ary._runParse && dojo.parser && dojo.parser.parse){
+					if(!tempNode){
+						tempNode = rNode.ownerDocument.createElement("div");
+					}
+					tempNode.appendChild(node);
+					dojo.parser.parse(tempNode);
+					node = tempNode.firstChild;
+					while(tempNode.firstChild){
+						tempNode.removeChild(tempNode.firstChild);
+					}
+				}
+
+				if(i == length - 1){
+					dojo.place(node, rNode, position);
+				}else{
+					rNode.parentNode.insertBefore(node, rNode);
+				}
+				rNode = node;
+			}
+		},
+
+		_stash: function(parent){
+			// summary:
+			// 		private function to hold to a parent NodeList. end() to return the parent NodeList.
+			//
+			// example:
+			// How to make a `dojo.NodeList` method that only returns the third node in
+			// the dojo.NodeList but allows access to the original NodeList by using this._stash:
+			//	|	dojo.extend(dojo.NodeList, {
+			//	|		third: function(){
+			//  |			var newNodeList = dojo.NodeList(this[2]);
+			//	|			return newNodeList._stash(this);
+			//	|		}
+			//	|	});
+			//	|	// then see how _stash applies a sub-list, to be .end()'ed out of
+			//	|	dojo.query(".foo")
+			//	|		.third()
+			//	|			.addClass("thirdFoo")
+			//	|		.end()
+			//	|		// access to the orig .foo list
+			//	|		.removeClass("foo")
+			//	|
+			//
+			this._parent = parent;
+			return this; //dojo.NodeList
+		},
+
+		end: function(){
+			// summary:
+			// 		Ends use of the current `dojo.NodeList` by returning the previous dojo.NodeList
+			// 		that generated the current dojo.NodeList.
+			// description:
+			// 		Returns the `dojo.NodeList` that generated the current `dojo.NodeList`. If there
+			// 		is no parent dojo.NodeList, an empty dojo.NodeList is returned.
+			// example:
+			//	|	dojo.query("a")
+			//	|		.filter(".disabled")
+			//	|			// operate on the anchors that only have a disabled class
+			//	|			.style("color", "grey")
+			//	|		.end()
+			//	|		// jump back to the list of anchors
+			//	|		.style(...)
+			//
+			if(this._parent){
+				return this._parent;
+			}else{
+				//Just return empy list.
+				return new this._NodeListCtor();
+			}
+		},
+
 		// http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array#Methods
 
 		// FIXME: handle return values for #3244
 		//		http://trac.dojotoolkit.org/ticket/3244
-		
+
 		// FIXME:
 		//		need to wrap or implement:
 		//			join (perhaps w/ innerHTML/outerHTML overload for toString() of items?)
@@ -6035,7 +7526,7 @@ dojo.provide("dojo._base.NodeList");
 			//		Optional parameter to describe what position relative to
 			//		the NodeList's zero index to end the slice at. Like begin,
 			//		can be positive or negative.
-			return tnl(a.slice.apply(this, arguments));
+			return this._wrap(a.slice.apply(this, arguments));
 		},
 
 		splice: function(index, howmany, item){
@@ -6048,6 +7539,8 @@ dojo.provide("dojo._base.NodeList");
 			//		with the caveat that it returns a dojo.NodeList and not a
 			//		raw Array. For more details, see Mozilla's (splice
 			//		documentation)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:splice]
+			// 		For backwards compatibility, calling .end() on the spliced NodeList
+			// 		does not return the original NodeList -- splice alters the NodeList in place.
 			// index: Integer
 			//		begin can be a positive or negative integer, with positive
 			//		integers noting the offset to begin at, and negative
@@ -6062,7 +7555,7 @@ dojo.provide("dojo._base.NodeList");
 			//		spliced into the NodeList
 			// returns:
 			//		dojo.NodeList
-			return tnl(a.splice.apply(this, arguments));
+			return this._wrap(a.splice.apply(this, arguments));
 		},
 
 		indexOf: function(value, fromIndex){
@@ -6138,10 +7631,10 @@ dojo.provide("dojo._base.NodeList");
 			//		spliced into the NodeList
 			// returns:
 			//		dojo.NodeList
-			
-			//return tnl(apc.apply(this, arguments));
+
+			//return this._wrap(apc.apply(this, arguments));
 			// the line above won't work for the native NodeList :-(
-			
+
 			// implementation notes:
 			// 1) Native NodeList is not an array, and cannot be used directly
 			// in concat() --- the latter doesn't recognize it as an array, and
@@ -6150,14 +7643,14 @@ dojo.provide("dojo._base.NodeList");
 			// read-only and cannot be changed. So we have to test for both
 			// native NodeList and dojo.NodeList in this property to recognize
 			// the node list.
-			
+
 			var t = d.isArray(this) ? this : aps.call(this, 0),
 				m = d.map(arguments, function(a){
 					return a && !d.isArray(a) &&
-						(a.constructor === NodeList || a.constructor == nl) ?
+						(typeof NodeList != "undefined" && a.constructor === NodeList || a.constructor === this._NodeListCtor) ?
 							aps.call(a, 0) : a;
 				});
-			return tnl(apc.apply(t, m));	// dojo.NodeList
+			return this._wrap(apc.apply(t, m), this);	// dojo.NodeList
 		},
 
 		map: function(/*Function*/ func, /*Function?*/ obj){
@@ -6166,32 +7659,42 @@ dojo.provide("dojo._base.NodeList");
 			//		array is implicitly this NodeList and the return is a
 			//		dojo.NodeList (a subclass of Array)
 			///return d.map(this, func, obj, d.NodeList); // dojo.NodeList
-			return tnl(d.map(this, func, obj)); // dojo.NodeList
+			return this._wrap(d.map(this, func, obj), this); // dojo.NodeList
 		},
 
 		forEach: function(callback, thisObj){
 			//	summary:
 			//		see `dojo.forEach()`. The primary difference is that the acted-on 
-			//		array is implicitly this NodeList
+			//		array is implicitly this NodeList. If you want the option to break out
+			//		of the forEach loop, use every() or some() instead.
 			d.forEach(this, callback, thisObj);
 			// non-standard return to allow easier chaining
 			return this; // dojo.NodeList 
 		},
 
-
 		/*=====
 		coords: function(){
 			//	summary:
-			// 		Returns the box objects all elements in a node list as
-			// 		an Array (*not* a NodeList)
-			
+			//		Returns the box objects of all elements in a node list as
+			//		an Array (*not* a NodeList). Acts like `dojo.coords`, though assumes
+			//		the node passed is each node in this list.
+
 			return d.map(this, d.coords); // Array
 		},
 
+		position: function(){
+			//	summary:
+			//		Returns border-box objects (x/y/w/h) of all elements in a node list
+			//		as an Array (*not* a NodeList). Acts like `dojo.position`, though
+			//		assumes the node passed is each node in this list. 
+
+			return d.map(this, d.position); // Array
+		},
+
 		attr: function(property, value){
 			//	summary:
 			//		gets or sets the DOM attribute for every element in the
-			//		NodeList
+			//		NodeList. See also `dojo.attr`
 			//	property: String
 			//		the attribute to get/set
 			//	value: String?
@@ -6199,6 +7702,16 @@ dojo.provide("dojo._base.NodeList");
 			//	returns:
 			//		if no value is passed, the result is an array of attribute values
 			//		If a value is passed, the return is this NodeList
+			//	example:
+			//		Make all nodes with a particular class focusabl:
+			//	|	dojo.query(".focusable").attr("tabIndex", -1);
+			//	example:
+			//		Disable a group of buttons:
+			//	|	dojo.query("button.group").attr("disalbed", true);
+			//	example:
+			//		innerHTML can be assigned or retreived as well:
+			//	|	// get the innerHTML (as an array) for each list item
+			//	|	var ih = dojo.query("li.replaceable").attr("innerHTML");
 			return; // dojo.NodeList
 			return; // Array
 		},
@@ -6208,7 +7721,7 @@ dojo.provide("dojo._base.NodeList");
 			//		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") 
+			//		("lineHieght" instead of "line-height")
 			//	value: String?
 			//		optional. The value to set the property to
 			//	returns:
@@ -6221,16 +7734,19 @@ dojo.provide("dojo._base.NodeList");
 		addClass: function(className){
 			//	summary:
 			//		adds the specified class to every node in the list
-			//	className: String
-			//		the CSS class to add
+			//	className: String|Array
+			//		A String class name to add, or several space-separated class names,
+			//		or an array of class names.
 			return; // dojo.NodeList
 		},
 
 		removeClass: function(className){
 			//	summary:
 			//		removes the specified class from every node in the list
-			//	className: String
-			//		the CSS class to add
+			//	className: String|Array?
+			//		An optional String class name to remove, or several space-separated
+			//		class names, or an array of class names. If omitted, all class names
+			//		will be deleted.
 			//	returns:
 			//		dojo.NodeList, this list
 			return; // dojo.NodeList
@@ -6266,7 +7782,7 @@ dojo.provide("dojo._base.NodeList");
 			//	example:
 			//		add an onclick handler to every button on the page
 			//		|	dojo.query("div:nth-child(odd)").connect("onclick", function(e){
-			//		|		
+			//		|		console.log("clicked!");
 			//		|	});
 			// example:
 			//		attach foo.bar() to every odd div's onmouseover
@@ -6282,9 +7798,10 @@ dojo.provide("dojo._base.NodeList");
 			// FIXME: should we be checking for and/or disposing of widgets below these nodes?
 		},
 		=====*/
-		
+
 		// useful html methods
 		coords:	adaptAsMap(d.coords),
+		position: adaptAsMap(d.position),
 
 		// FIXME: connectPublisher()? connectRunOnce()?
 
@@ -6350,7 +7867,7 @@ dojo.provide("dojo._base.NodeList");
 			//		|	"only"
 			//		|	"replace"
 			// 		or an offset in the childNodes property
-			return d.query(queryOrListOrNode).place(this[0], position);	// dojo.NodeList
+			return d.query(queryOrListOrNode).place(this[0], position)._stash(this);	// dojo.NodeList
 		},
 
 		// FIXME: do we need this?
@@ -6381,7 +7898,7 @@ dojo.provide("dojo._base.NodeList");
 				// FIXME: why would we ever get undefined here?
 				return d.query(queryStr, node).filter(function(subNode){ return subNode !== undefined; });
 			});
-			return tnl(apc.apply([], ret));	// dojo.NodeList
+			return this._wrap(apc.apply([], ret), this);	// dojo.NodeList
 		},
 
 		filter: function(/*String|Function*/ simpleFilter){
@@ -6407,18 +7924,18 @@ dojo.provide("dojo._base.NodeList");
 			//		|	dojo.query("*").filter("p").styles("backgroundColor", "yellow");
 
 			var a = arguments, items = this, start = 0;
-			if(d.isString(simpleFilter)){
+			if(typeof simpleFilter == "string"){ // inline'd type check
 				items = d._filterQueryResult(this, a[0]);
 				if(a.length == 1){
 					// if we only got a string query, pass back the filtered results
-					return items; // dojo.NodeList
+					return items._stash(this); // dojo.NodeList
 				}
 				// if we got a callback, run it over the filtered items
 				start = 1;
 			}
-			return tnl(d.filter(items, a[start], a[start + 1]));	// dojo.NodeList
+			return this._wrap(d.filter(items, a[start], a[start + 1]), this);	// dojo.NodeList
 		},
-		
+
 		/*
 		// FIXME: should this be "copyTo" and include parenting info?
 		clone: function(){
@@ -6428,9 +7945,9 @@ dojo.provide("dojo._base.NodeList");
 		},
 		*/
 
-		addContent: function(/*String|DomNode*/ content, /*String||Integer?*/ position){
+		addContent: function(/*String||DomNode||Object||dojo.NodeList*/ content, /*String||Integer?*/ position){
 			//	summary:
-			//		add a node or some HTML as a string to every item in the
+			//		add a node, NodeList or some HTML as a string to every item in the
 			//		list.  Returns the original list.
 			//	description:
 			//		a copy of the HTML content is added to each item in the
@@ -6438,14 +7955,24 @@ dojo.provide("dojo._base.NodeList");
 			//		argument is provided, the content is appended to the end of
 			//		each item.
 			//	content:
-			//		DOM node or HTML in string format to add at position to
-			//		every item
+			//		DOM node, HTML in string format, a NodeList or an Object. If a DOM node or
+			// 		NodeList, the content will be cloned if the current NodeList has more than one
+			// 		element. Only the DOM nodes are cloned, no event handlers. If it is an Object,
+			// 		it should be an object with at "template" String property that has the HTML string
+			// 		to insert. If dojo.string has already been dojo.required, then dojo.string.substitute
+			// 		will be used on the "template" to generate the final HTML string. Other allowed
+			// 		properties on the object are: "parse" if the HTML
+			// 		string should be parsed for widgets (dojo.require("dojo.parser") to get that
+			// 		option to work), and "templateFunc" if a template function besides dojo.string.substitute
+			// 		should be used to transform the "template".
 			//	position:
 			//		can be one of:
 			//		|	"last"||"end" (default)
 			//		|	"first||"start"
 			//		|	"before"
 			//		|	"after"
+			//		|	"replace" (replaces nodes in this NodeList with new content)
+			//		|	"only" (removes other children of the nodes so new content is hte only child)
 			// 		or an offset in the childNodes property
 			//	example:
 			//		appends content to the end if the position is ommitted
@@ -6461,28 +7988,43 @@ dojo.provide("dojo._base.NodeList");
 			//		add a clone of a DOM node to the end of every element in
 			//		the list, removing it from its existing parent.
 			//	|	dojo.query(".note").addContent(dojo.byId("foo"));
-			var c = d.isString(content) ? 
-						d._toDom(content, this[0] && this[0].ownerDocument) : 
-						content, 
-					i, 
-					l = this.length - 1;
-			for(i = 0; i < l; ++i){
-				d.place(c.cloneNode(true), this[i], position);
-			}
-			if(l >= 0){
-				d.place(c, this[l], position);
-			}
-			return this;	// dojo.NodeList
+			//  example:
+			//  	Append nodes from a templatized string.
+			// 		dojo.require("dojo.string");
+			// 		dojo.query(".note").addContent({
+			//  		template: '<b>${id}: </b><span>${name}</span>',
+			// 			id: "user332",
+			//  		name: "Mr. Anderson"
+			//  	});
+			//  example:
+			//  	Append nodes from a templatized string that also has widgets parsed.
+			//  	dojo.require("dojo.string");
+			//  	dojo.require("dojo.parser");
+			//  	var notes = dojo.query(".note").addContent({
+			//  		template: '<button dojoType="dijit.form.Button">${text}</button>',
+			//  		parse: true,
+			//  		text: "Send"
+			//  	});
+			content = this._normalize(content, this[0]);
+			for(var i = 0, node; node = this[i]; i++){
+				this._place(content, node, position, i > 0);
+			}
+			return this; //dojo.NodeList
 		},
 
 		instantiate: function(/*String|Object*/ declaredClass, /*Object?*/ properties){
 			//	summary:
 			//		Create a new instance of a specified class, using the
 			//		specified properties and each node in the nodeList as a
-			//		srcNodeRef
+			//		srcNodeRef.
+			//	example:
+			//		Grabs all buttons in the page and converts them to diji.form.Buttons.
+			//	|	var buttons = dojo.query("button").instantiate("dijit.form.Button", {showLabel: true});
 			var c = d.isFunction(declaredClass) ? declaredClass : d.getObject(declaredClass);
 			properties = properties || {};
-			return this.forEach(function(node){ new c(properties, node); });	// dojo.NodeList
+			return this.forEach(function(node){
+				new c(properties, node);
+			});	// dojo.NodeList
 		},
 
 		at: function(/*===== index =====*/){
@@ -6494,27 +8036,30 @@ dojo.provide("dojo._base.NodeList");
 			//		NodeList.
 			//	returns:
 			//		dojo.NodeList
-			var t = new dojo.NodeList();
+			var t = new this._NodeListCtor();
 			d.forEach(arguments, function(i){ if(this[i]){ t.push(this[i]); }}, this);
-			return t; // dojo.NodeList
+			return t._stash(this); // dojo.NodeList
 		}
 
 	});
 
-	// syntactic sugar for DOM events
-	d.forEach([
+	nl.events = [
+		// summary: list of all DOM events used in NodeList
 		"blur", "focus", "change", "click", "error", "keydown", "keypress",
 		"keyup", "load", "mousedown", "mouseenter", "mouseleave", "mousemove",
-		"mouseout", "mouseover", "mouseup", "submit" 
-		], function(evt){
+		"mouseout", "mouseover", "mouseup", "submit"
+	];
+
+	// syntactic sugar for DOM events
+	d.forEach(nl.events, function(evt){
 			var _oe = "on"+evt;
 			nlp[_oe] = function(a, b){
 				return this.connect(_oe, a, b);
 			}
 				// FIXME: should these events trigger publishes?
 				/*
-				return (a ? this.connect(_oe, a, b) : 
-							this.forEach(function(n){  
+				return (a ? this.connect(_oe, a, b) :
+							this.forEach(function(n){
 								// FIXME:
 								//		listeners get buried by
 								//		addEventListener and can't be dug back
@@ -6522,17 +8067,16 @@ dojo.provide("dojo._base.NodeList");
 								// see:
 								//		http://developer.mozilla.org/en/docs/DOM:element
 
-								
+								console.log(n, evt, _oe);
 
 								// FIXME: need synthetic event support!
 								var _e = { target: n, faux: true, type: evt };
 								// dojo._event_listener._synthesizeEvent({}, { target: n, faux: true, type: evt });
-								try{ n[evt](_e); }catch(e){  }
-								try{ n[_oe](_e); }catch(e){  }
+								try{ n[evt](_e); }catch(e){ console.log(e); }
+								try{ n[_oe](_e); }catch(e){ console.log(e); }
 							})
 				);
-			}
-			*/
+				*/
 		}
 	);
 
@@ -6600,8 +8144,7 @@ if(typeof dojo != "undefined"){
 	// 					d.isOpera; // float
 	// 					d.isWebKit; // float
 	// 					d.doc ; // document element
-	var qlc = d._queryListCtor = 		d.NodeList;
-	var isString = 		d.isString;
+	var qlc = d._NodeListCtor = 		d.NodeList;
 
 	var getDoc = function(){ return d.doc; };
 	// NOTE(alex): the spec is idiotic. CSS queries should ALWAYS be case-sensitive, but nooooooo
@@ -6775,7 +8318,10 @@ if(typeof dojo != "undefined"){
 				currentPart.infixOper = queryParts.pop();
 				currentPart.query = currentPart.infixOper.query + " " + currentPart.query;
 				/*
-				
+				console.debug(	"swapping out the infix", 
+								currentPart.infixOper, 
+								"and attaching it to", 
+								currentPart);
 				*/
 			}
 			queryParts.push(currentPart);
@@ -6948,7 +8494,7 @@ if(typeof dojo != "undefined"){
 
 	var getArr = function(i, arr){
 		// helps us avoid array alloc when we don't need it
-		var r = arr||[]; // FIXME: should this be 'new d._queryListCtor()' ?
+		var r = arr||[]; // FIXME: should this be 'new d._NodeListCtor()' ?
 		if(i){ r.push(i); }
 		return r;
 	};
@@ -7106,8 +8652,7 @@ if(typeof dojo != "undefined"){
 	var pseudos = {
 		"checked": function(name, condition){
 			return function(elem){
-				// FIXME: make this more portable!!
-				return !!d.attr(elem, "checked");
+				return !!("checked" in elem ? elem.checked : elem.selected);
 			}
 		},
 		"first-child": function(){ return _lookLeft; },
@@ -7559,7 +9104,7 @@ if(typeof dojo != "undefined"){
 				ret.nozip = true;
 			}
 			var gef = getElementsFunc(qp);
-			while(te = candidates[x--]){
+			for(var j = 0; (te = candidates[j]); j++){
 				// for every root, get the elements that match the descendant
 				// selector, adding them to the "ret" array and filtering them
 				// via membership in this level's bag. If there are more query
@@ -7650,8 +9195,20 @@ if(typeof dojo != "undefined"){
 		!!getDoc()[qsa] && 
 		// see #5832
 		(!d.isSafari || (d.isSafari > 3.1) || is525 )
-	); 
+	);
+
+	//Don't bother with n+3 type of matches, IE complains if we modify those.
+	var infixSpaceRe = /n\+\d|([^ ])?([>~+])([^ =])?/g;
+	var infixSpaceFunc = function(match, pre, ch, post) {
+		return ch ? (pre ? pre + " " : "") + ch + (post ? " " + post : "") : /*n+3*/ match;
+	};
+
 	var getQueryFunc = function(query, forceDOM){
+		//Normalize query. The CSS3 selectors spec allows for omitting spaces around
+		//infix operators, >, ~ and +
+		//Do the work here since detection for spaces is used as a simple "not use QSA"
+		//test below.
+		query = query.replace(infixSpaceRe, infixSpaceFunc);
 
 		if(qsaAvail){
 			// if we've got a cached variant and we think we can do it, run it!
@@ -7691,7 +9248,11 @@ if(typeof dojo != "undefined"){
 			// FIXME:
 			//		need to tighten up browser rules on ":contains" and "|=" to
 			//		figure out which aren't good
-			(query.indexOf(":contains") == -1) &&
+			//		Latest webkit (around 531.21.8) does not seem to do well with :checked on option
+			//		elements, even though according to spec, selected options should
+			//		match :checked. So go nonQSA for it:
+			//		http://bugs.dojotoolkit.org/ticket/5179
+			(query.indexOf(":contains") == -1) && (query.indexOf(":checked") == -1) && 
 			(query.indexOf("|=") == -1) // some browsers don't grok it
 		);
 
@@ -7787,7 +9348,7 @@ if(typeof dojo != "undefined"){
 		if(arr && arr.nozip){ 
 			return (qlc._wrap) ? qlc._wrap(arr) : arr;
 		}
-		// var ret = new d._queryListCtor();
+		// var ret = new d._NodeListCtor();
 		var ret = new qlc();
 		if(!arr || !arr.length){ return ret; }
 		if(arr[0]){
@@ -7978,7 +9539,7 @@ if(typeof dojo != "undefined"){
 
 		//Set list constructor to desired value. This can change
 		//between calls, so always re-assign here.
-		qlc = d._queryListCtor;
+		qlc = d._NodeListCtor;
 
 		if(!query){
 			return new qlc();
@@ -7987,10 +9548,10 @@ if(typeof dojo != "undefined"){
 		if(query.constructor == qlc){
 			return query;
 		}
-		if(!isString(query)){
+		if(typeof query != "string"){ // inline'd type check
 			return new qlc(query); // dojo.NodeList
 		}
-		if(isString(root)){
+		if(typeof root == "string"){ // inline'd type check
 			root = d.byId(root);
 			if(!root){ return new qlc(); }
 		}
@@ -8027,7 +9588,7 @@ if(typeof dojo != "undefined"){
 
 	// one-off function for filtering a NodeList based on a simple selector
 	d._filterQueryResult = function(nodeList, simpleFilter){
-		var tmpNodeList = new d._queryListCtor();
+		var tmpNodeList = new d._NodeListCtor();
 		var filterFunc = getSimpleFilterFunc(getQueryParts(simpleFilter)[0]);
 		for(var x = 0, te; te = nodeList[x]; x++){
 			if(filterFunc(te)){ tmpNodeList.push(te); }
@@ -8050,14 +9611,21 @@ dojo.provide("dojo._base.xhr");
 
 
 (function(){
-	var _d = dojo;
+	var _d = dojo, cfg = _d.config;
+
 	function setValue(/*Object*/obj, /*String*/name, /*String*/value){
 		//summary:
 		//		For the named property in object, set the value. If a value
 		//		already exists and it is a string, convert the value to be an
 		//		array of values.
+
+		//Skip it if there is no value
+		if(value === null){
+			return;
+		}
+
 		var val = obj[name];
-		if(_d.isString(val)){
+		if(typeof val == "string"){ // inline'd type check
 			obj[name] = [val, value];
 		}else if(_d.isArray(val)){
 			val.push(value);
@@ -8065,16 +9633,50 @@ dojo.provide("dojo._base.xhr");
 			obj[name] = value;
 		}
 	}
+	
+	dojo.fieldToObject = function(/*DOMNode||String*/ inputNode){
+		// summary:
+		//		Serialize a form field to a JavaScript object.
+		//
+		// description:
+		//		Returns the value encoded in a form field as
+		//		as a string or an array of strings. Disabled form elements
+		//		and unchecked radio and checkboxes are skipped.	Multi-select
+		//		elements are returned as an array of string values.
+		var ret = null;
+		var item = _d.byId(inputNode);
+		if(item){
+			var _in = item.name;
+			var type = (item.type||"").toLowerCase();
+			if(_in && type && !item.disabled){
+				if(type == "radio" || type == "checkbox"){
+					if(item.checked){ ret = item.value }
+				}else if(item.multiple){
+					ret = [];
+					_d.query("option", item).forEach(function(opt){
+						if(opt.selected){
+							ret.push(opt.value);
+						}
+					});
+				}else{
+					ret = item.value;
+				}
+			}
+		}
+		return ret; // Object
+	}
 
 	dojo.formToObject = function(/*DOMNode||String*/ formNode){
 		// summary:
-		//		dojo.formToObject returns the values encoded in an HTML form as
+		//		Serialize a form node to a JavaScript object.
+		// description:
+		//		Returns the values encoded in an HTML form as
 		//		string properties in an object which it then returns. Disabled form
 		//		elements, buttons, and other non-value form elements are skipped.
 		//		Multi-select elements are returned as an array of string values.
-		// description:
-		//		This form:
 		//
+		// example:
+		//		This form:
 		//		|	<form id="test_form">
 		//		|		<input type="text" name="blah" value="blah">
 		//		|		<input type="text" name="no_value" value="blah" disabled>
@@ -8103,20 +9705,9 @@ dojo.provide("dojo._base.xhr");
 			var _in = item.name;
 			var type = (item.type||"").toLowerCase();
 			if(_in && type && exclude.indexOf(type) == -1 && !item.disabled){
-				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;
-					}
+				setValue(ret, _in, _d.fieldToObject(item));
+				if(type == "image"){
+					ret[_in+".x"] = ret[_in+".y"] = ret[_in].x = ret[_in].y = 0;
 				}
 			}
 		});
@@ -8171,16 +9762,17 @@ dojo.provide("dojo._base.xhr");
 
 	dojo.formToJson = function(/*DOMNode||String*/ formNode, /*Boolean?*/prettyPrint){
 		// summary:
-		//		return a serialized JSON string from a form node or string
+		//		Create a serialized JSON string from a form node or string
 		//		ID identifying the form to serialize
 		return _d.toJson(_d.formToObject(formNode), prettyPrint); // String
 	}
 
 	dojo.queryToObject = function(/*String*/ str){
 		// summary:
-		//		returns an object representing a de-serialized query section of a
+		//		Create an object representing a de-serialized query section of a
 		//		URL. Query keys with multiple values are returned in an array.
-		// description:
+		//
+		// example:
 		//		This string:
 		//
 		//	|		"foo=bar&foo=baz&thinger=%20spaces%20=blah&zonk=blarg&"
@@ -8205,9 +9797,10 @@ dojo.provide("dojo._base.xhr");
 				var parts = item.split("=");
 				var name = dec(parts.shift());
 				var val = dec(parts.join("="));
-				if(_d.isString(ret[name])){
+				if(typeof ret[name] == "string"){ // inline'd type check
 					ret[name] = [ret[name]];
 				}
+
 				if(_d.isArray(ret[name])){
 					ret[name].push(val);
 				}else{
@@ -8218,43 +9811,58 @@ dojo.provide("dojo._base.xhr");
 		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; },
+	// MOW: remove dojo._contentHandlers alias in 2.0
+	var handlers = _d._contentHandlers = dojo.contentHandlers = {
+		// summary: 
+		//		A map of availble XHR transport handle types. Name matches the
+		//		`handleAs` attribute passed to XHR calls.
+		//
+		// description:
+		//		A map of availble XHR transport handle types. Name matches the
+		//		`handleAs` attribute passed to XHR calls. Each contentHandler is
+		//		called, passing the xhr object for manipulation. The return value
+		//		from the contentHandler will be passed to the `load` or `handle` 
+		//		functions defined in the original xhr call. 
+		//		
+		// example:
+		//		Creating a custom content-handler:
+		//	|	dojo.contentHandlers.makeCaps = function(xhr){
+		//	|		return xhr.responseText.toUpperCase();
+		//	|	}
+		//	|	// and later:
+		//	|	dojo.xhrGet({ 
+		//	|		url:"foo.txt",
+		//	|		handleAs:"makeCaps",
+		//	|		load: function(data){ /* data is a toUpper version of foo.txt */ }
+		//	|	});
+
+		text: function(xhr){ 
+			// summary: A contentHandler which simply returns the plaintext response data
+			return xhr.responseText; 
+		},
 		json: function(xhr){
+			// summary: A contentHandler which returns a JavaScript object created from the response data
 			return _d.fromJson(xhr.responseText || null);
 		},
 		"json-comment-filtered": function(xhr){ 
-			// NOTE: the json-comment-filtered option was implemented to prevent
-			// "JavaScript Hijacking", but it is less secure than standard JSON. Use
-			// standard JSON instead. JSON prefixing can be used to subvert hijacking.
+			// summary: A contentHandler which expects comment-filtered JSON. 
+			// description: 
+			//		A contentHandler which expects comment-filtered JSON. 
+			//		the json-comment-filtered option was implemented to prevent
+			//		"JavaScript Hijacking", but it is less secure than standard JSON. Use
+			//		standard JSON instead. JSON prefixing can be used to subvert hijacking.
+			//		
+			//		Will throw a notice suggesting to use application/json mimetype, as
+			//		json-commenting can introduce security issues. To decrease the chances of hijacking,
+			//		use the standard `json` contentHandler, and prefix your "JSON" with: {}&& 
+			//		
+			//		use djConfig.useCommentedJson = true to turn off the notice
 			if(!dojo.config.useCommentedJson){
 				console.warn("Consider using the standard mimetype:application/json."
 					+ " json-commenting can introduce security issues. To"
@@ -8272,12 +9880,17 @@ dojo.provide("dojo._base.xhr");
 			return _d.fromJson(value.substring(cStartIdx+2, cEndIdx));
 		},
 		javascript: function(xhr){ 
+			// summary: A contentHandler which evaluates the response data, expecting it to be valid JavaScript
+
 			// FIXME: try Moz and IE specific eval variants?
 			return _d.eval(xhr.responseText);
 		},
 		xml: function(xhr){
+			// summary: A contentHandler returning an XML Document parsed from the response data
 			var result = xhr.responseXML;
 						if(_d.isIE && (!result || !result.documentElement)){
+				//WARNING: this branch used by the xml handling in dojo.io.iframe,
+				//so be sure to test dojo.io.iframe if making changes below.
 				var ms = function(n){ return "MSXML" + n + ".DOMDocument"; }
 				var dp = ["Microsoft.XMLDOM", ms(6), ms(4), ms(3), ms(2)];
 				_d.some(dp, function(p){
@@ -8291,15 +9904,15 @@ dojo.provide("dojo._base.xhr");
 				});
 			}
 						return result; // DOMDocument
-		}
-	};
-
-	dojo._contentHandlers["json-comment-optional"] = function(xhr){
-		var handlers = _d._contentHandlers;
-		if(xhr.responseText && xhr.responseText.indexOf("\/*") != -1){
-			return handlers["json-comment-filtered"](xhr);
-		}else{
-			return handlers["json"](xhr);
+		},
+		"json-comment-optional": function(xhr){
+			// summary: A contentHandler which checks the presence of comment-filtered JSON and 
+			//		alternates between the `json` and `json-comment-filtered` contentHandlers.
+			if(xhr.responseText && /^[^{\[]*\/\*/.test(xhr.responseText)){
+				return handlers["json-comment-filtered"](xhr);
+			}else{
+				return handlers["json"](xhr);
+			}
 		}
 	};
 
@@ -8325,21 +9938,28 @@ dojo.provide("dojo._base.xhr");
 		//	handleAs: String?
 		//		Acceptable values depend on the type of IO
 		//		transport (see specific IO calls for more information).
+		// 	rawBody: String?
+		// 		Sets the raw body for an HTTP request. If this is used, then the content
+		// 		property is ignored. This is mostly useful for HTTP methods that have
+		// 		a body to their requests, like PUT or POST. This property can be used instead
+		// 		of postData and putData for dojo.rawXhrPost and dojo.rawXhrPut respectively.
+		//	ioPublish: Boolean?
+		//		Set this explicitly to false to prevent publishing of topics related to
+		// 		IO operations. Otherwise, if djConfig.ioPublish is set to true, topics
+		// 		will be published via dojo.publish for different phases of an IO operation.
+		// 		See dojo.__IoPublish for a list of topics that are published.
 		//	load: Function?
-		//		function(response, ioArgs){} response is of type Object, ioArgs
-		//		is of type dojo.__IoCallbackArgs.  This function will be
+		//		This function will be
 		//		called on a successful HTTP response code.
 		//	error: Function?
-		//		function(response, ioArgs){} response is of type Object, ioArgs
-		//		is of type dojo.__IoCallbackArgs. This function will
+		//		This function will
 		//		be called when the request fails due to a network or server error, the url
 		//		is invalid, etc. It will also be called if the load or handle callback throws an
 		//		exception, unless djConfig.debugAtAllCosts is true.  This allows deployed applications
 		//		to continue to run even when a logic error happens in the callback, while making
 		//		it easier to troubleshoot while in debug mode.
 		//	handle: Function?
-		//		function(response, ioArgs){} response is of type Object, ioArgs
-		//		is of type dojo.__IoCallbackArgs.  This function will
+		//		This function will
 		//		be called at the end of every request, whether or not an error occurs.
 		this.url = url;
 		this.content = content;
@@ -8347,9 +9967,28 @@ dojo.provide("dojo._base.xhr");
 		this.form = form;
 		this.preventCache = preventCache;
 		this.handleAs = handleAs;
-		this.load = load;
-		this.error = error;
-		this.handle = handle;
+		this.ioPublish = ioPublish;
+		this.load = function(response, ioArgs){
+			// ioArgs: dojo.__IoCallbackArgs
+			//		Provides additional information about the request.
+			// response: Object
+			//		The response in the format as defined with handleAs.
+		}
+		this.error = function(response, ioArgs){
+			// ioArgs: dojo.__IoCallbackArgs
+			//		Provides additional information about the request.
+			// response: Object
+			//		The response in the format as defined with handleAs.
+		}
+		this.handle = function(loadOrError, response, ioArgs){
+			// loadOrError: String
+			//		Provides a string that tells you whether this function
+			//		was called because of success (load) or failure (error).
+			// response: Object
+			//		The response in the format as defined with handleAs.
+			// ioArgs: dojo.__IoCallbackArgs
+			//		Provides additional information about the request.
+		}
 	}
 	=====*/
 
@@ -8400,6 +10039,45 @@ dojo.provide("dojo._base.xhr");
 	=====*/
 
 
+	/*=====
+	dojo.__IoPublish = function(){
+		// 	summary:
+		// 		This is a list of IO topics that can be published
+		// 		if djConfig.ioPublish is set to true. IO topics can be
+		// 		published for any Input/Output, network operation. So,
+		// 		dojo.xhr, dojo.io.script and dojo.io.iframe can all
+		// 		trigger these topics to be published.
+		//	start: String
+		//		"/dojo/io/start" is sent when there are no outstanding IO
+		// 		requests, and a new IO request is started. No arguments
+		// 		are passed with this topic.
+		//	send: String
+		//		"/dojo/io/send" is sent whenever a new IO request is started.
+		// 		It passes the dojo.Deferred for the request with the topic.
+		//	load: String
+		//		"/dojo/io/load" is sent whenever an IO request has loaded
+		// 		successfully. It passes the response and the dojo.Deferred
+		// 		for the request with the topic.
+		//	error: String
+		//		"/dojo/io/error" is sent whenever an IO request has errored.
+		// 		It passes the error and the dojo.Deferred
+		// 		for the request with the topic.
+		//	done: String
+		//		"/dojo/io/done" is sent whenever an IO request has completed,
+		// 		either by loading or by erroring. It passes the error and
+		// 		the dojo.Deferred for the request with the topic.
+		//	stop: String
+		//		"/dojo/io/stop" is sent when all outstanding IO requests have
+		// 		finished. No arguments are passed with this topic.
+		this.start = "/dojo/io/start";
+		this.send = "/dojo/io/send";
+		this.load = "/dojo/io/load";
+		this.error = "/dojo/io/error";
+		this.done = "/dojo/io/done";
+		this.stop = "/dojo/io/stop";
+	}
+	=====*/
+
 
 	dojo._ioSetArgs = function(/*dojo.__IoArgs*/args,
 			/*Function*/canceller,
@@ -8482,7 +10160,25 @@ dojo.provide("dojo._base.xhr");
 				return handle.call(args, value, ioArgs);
 			});
 		}
-		
+
+		//Plug in topic publishing, if dojo.publish is loaded.
+		if(cfg.ioPublish && _d.publish && ioArgs.args.ioPublish !== false){
+			d.addCallbacks(
+				function(res){
+					_d.publish("/dojo/io/load", [d, res]);
+					return res;
+				},
+				function(res){
+					_d.publish("/dojo/io/error", [d, res]);
+					return res;
+				}
+			);
+			d.addBoth(function(res){
+				_d.publish("/dojo/io/done", [d, res]);
+				return res;
+			});
+		}
+
 		d.ioArgs = ioArgs;
 	
 		// FIXME: need to wire up the xhr object's abort method to something
@@ -8491,7 +10187,7 @@ dojo.provide("dojo._base.xhr");
 	}
 
 	var _deferredCancel = function(/*Deferred*/dfd){
-		//summary: canceller function for dojo._ioSetArgs call.
+		// summary: canceller function for dojo._ioSetArgs call.
 		
 		dfd.canceled = true;
 		var xhr = dfd.ioArgs.xhr;
@@ -8507,15 +10203,17 @@ dojo.provide("dojo._base.xhr");
 		return err;
 	}
 	var _deferredOk = function(/*Deferred*/dfd){
-		//summary: okHandler function for dojo._ioSetArgs call.
+		// summary: okHandler function for dojo._ioSetArgs call.
 
-		var ret = _d._contentHandlers[dfd.ioArgs.handleAs](dfd.ioArgs.xhr);
+		var ret = handlers[dfd.ioArgs.handleAs](dfd.ioArgs.xhr);
 		return ret === undefined ? null : ret;
 	}
 	var _deferError = function(/*Error*/error, /*Deferred*/dfd){
-		//summary: errHandler function for dojo._ioSetArgs call.
+		// summary: errHandler function for dojo._ioSetArgs call.
 
-		console.error(error);
+		if(!dfd.ioArgs.args.failOk){
+			console.error(error);
+		}
 		return error;
 	}
 
@@ -8523,6 +10221,23 @@ dojo.provide("dojo._base.xhr");
 	// something fierece if we don't use unified loops.
 	var _inFlightIntvl = null;
 	var _inFlight = [];
+	
+	
+	//Use a separate count for knowing if we are starting/stopping io calls.
+	//Cannot use _inFlight.length since it can change at a different time than
+	//when we want to do this kind of test. We only want to decrement the count
+	//after a callback/errback has finished, since the callback/errback should be
+	//considered as part of finishing a request.
+	var _pubCount = 0;
+	var _checkPubCount = function(dfd){
+		if(_pubCount <= 0){
+			_pubCount = 0;
+			if(cfg.ioPublish && _d.publish && (!dfd || dfd && dfd.ioArgs.args.ioPublish !== false)){
+				_d.publish("/dojo/io/stop");
+			}
+		}
+	};
+
 	var _watchInFlight = function(){
 		//summary: 
 		//		internal method that checks each inflight XMLHttpRequest to see
@@ -8540,9 +10255,11 @@ dojo.provide("dojo._base.xhr");
 				var func = function(){
 					if(!dfd || dfd.canceled || !tif.validCheck(dfd)){
 						_inFlight.splice(i--, 1); 
+						_pubCount -= 1;
 					}else if(tif.ioCheck(dfd)){
 						_inFlight.splice(i--, 1);
 						tif.resHandle(dfd);
+						_pubCount -= 1;
 					}else if(dfd.startTime){
 						//did we timeout?
 						if(dfd.startTime + (dfd.ioArgs.args.timeout || 0) < now){
@@ -8552,6 +10269,7 @@ dojo.provide("dojo._base.xhr");
 							dfd.errback(err);
 							//Cancel the request so the io module can do appropriate cleanup.
 							dfd.cancel();
+							_pubCount -= 1;
 						}
 					}
 				};
@@ -8567,12 +10285,13 @@ dojo.provide("dojo._base.xhr");
 			}
 		}
 
+		_checkPubCount(dfd);
+
 		if(!_inFlight.length){
 			clearInterval(_inFlightIntvl);
 			_inFlightIntvl = null;
 			return;
 		}
-
 	}
 
 	dojo._ioCancelAll = function(){
@@ -8593,26 +10312,42 @@ dojo.provide("dojo._base.xhr");
 		_d.addOnWindowUnload(_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:
+	_d._ioNotifyStart = function(/*Deferred*/dfd){
+		// summary:
+		// 		If dojo.publish is available, publish topics
+		// 		about the start of a request queue and/or the
+		// 		the beginning of request.
+		// description:
+		// 		Used by IO transports. An IO transport should
+		// 		call this method before making the network connection.
+		if(cfg.ioPublish && _d.publish && dfd.ioArgs.args.ioPublish !== false){
+			if(!_pubCount){
+				_d.publish("/dojo/io/start");
+			}
+			_pubCount += 1;
+			_d.publish("/dojo/io/send", [dfd]);
+		}
+	}
+
+	_d._ioWatch = function(dfd, validCheck, ioCheck, resHandle){
+		// summary: 
+		//		Watches the io request represented by dfd to see if it completes.
+		// dfd: Deferred
 		//		The Deferred object to watch.
-		//validCheck:
+		// validCheck: Function
 		//		Function used to check if the IO request is still valid. Gets the dfd
 		//		object as its only argument.
-		//ioCheck:
+		// ioCheck: Function
 		//		Function used to check if basic IO call worked. Gets the dfd
 		//		object as its only argument.
-		//resHandle:
+		// resHandle: Function
 		//		Function used to process response. Gets the dfd
 		//		object as its only argument.
 		var args = dfd.ioArgs.args;
 		if(args.timeout){
 			dfd.startTime = (new Date()).getTime();
 		}
+		
 		_inFlight.push({dfd: dfd, validCheck: validCheck, ioCheck: ioCheck, resHandle: resHandle});
 		if(!_inFlightIntvl){
 			_inFlightIntvl = setInterval(_watchInFlight, 50);
@@ -8664,15 +10399,20 @@ dojo.provide("dojo._base.xhr");
 			//		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
+			//		json-comment-filtered, javascript, xml. See `dojo.contentHandlers`
 			//	sync: Boolean?
 			//		false is default. Indicates whether the request should
 			//		be a synchronous (blocking) request.
 			//	headers: Object?
 			//		Additional HTTP headers to send in the request.
+			//	failOk: Boolean?
+			//		false is default. Indicates whether a request should be
+			//		allowed to fail (and therefore no console error message in
+			//		the event of a failure)
 			this.handleAs = handleAs;
 			this.sync = sync;
 			this.headers = headers;
+			this.failOk = failOk;
 		}
 	});
 	=====*/
@@ -8692,47 +10432,58 @@ dojo.provide("dojo._base.xhr");
 
 		//Make the Deferred object for this xhr request.
 		var dfd = _d._ioSetArgs(args, _deferredCancel, _deferredOk, _deferError);
+		var ioArgs = dfd.ioArgs;
 
-		//Pass the args to _xhrObj, to allow xhr iframe proxy interceptions.
-		dfd.ioArgs.xhr = _d._xhrObj(dfd.ioArgs.args);
+		//Pass the args to _xhrObj, to allow alternate XHR calls based specific calls, like
+		//the one used for iframe proxies.
+		var xhr = ioArgs.xhr = _d._xhrObj(ioArgs.args);
+		//If XHR factory fails, cancel the deferred.
+		if(!xhr){
+			dfd.cancel();
+			return dfd;
+		}
 
-		if(hasBody){
-			if("postData" in args){
-				dfd.ioArgs.query = args.postData;
-			}else if("putData" in args){
-				dfd.ioArgs.query = args.putData;
-			}
-		}else{
-			_d._ioAddQueryToUrl(dfd.ioArgs);
+		//Allow for specifying the HTTP body completely.
+		if("postData" in args){
+			ioArgs.query = args.postData;
+		}else if("putData" in args){
+			ioArgs.query = args.putData;
+		}else if("rawBody" in args){
+			ioArgs.query = args.rawBody;
+		}else if((arguments.length > 2 && !hasBody) || "POST|PUT".indexOf(method.toUpperCase()) == -1){
+			//Check for hasBody being passed. If no hasBody,
+			//then only append query string if not a POST or PUT request.
+			_d._ioAddQueryToUrl(ioArgs);
 		}
 
 		// IE 6 is a steaming pile. It won't let you call apply() on the native function (xhr.open).
 		// workaround for IE6's apply() "issues"
-		var ioArgs = dfd.ioArgs;
-		var xhr = ioArgs.xhr;
 		xhr.open(method, ioArgs.url, args.sync !== true, args.user || undefined, args.password || undefined);
 		if(args.headers){
 			for(var hdr in args.headers){
 				if(hdr.toLowerCase() === "content-type" && !args.contentType){
 					args.contentType = args.headers[hdr];
-				}else{
+				}else if(args.headers[hdr]){
+					//Only add header if it has a value. This allows for instnace, skipping
+					//insertion of X-Requested-With by specifying empty value.
 					xhr.setRequestHeader(hdr, args.headers[hdr]);
 				}
 			}
 		}
 		// FIXME: is this appropriate for all content types?
 		xhr.setRequestHeader("Content-Type", args.contentType || _defaultContentType);
-		if(!args.headers || !args.headers["X-Requested-With"]){
+		if(!args.headers || !("X-Requested-With" in args.headers)){
 			xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
 		}
 		// FIXME: set other headers here!
+		_d._ioNotifyStart(dfd);
 		if(dojo.config.debugAtAllCosts){
 			xhr.send(ioArgs.query);
 		}else{
 			try{
 				xhr.send(ioArgs.query);
 			}catch(e){
-				dfd.ioArgs.error = e;
+				ioArgs.error = e;
 				dfd.cancel();
 			}
 		}
@@ -8794,15 +10545,13 @@ dojo.provide("dojo._base.fx");
 
 
 
-
 /*
-	Animation losely package based on Dan Pupius' work, contributed under CLA: 
+	Animation loosely package based on Dan Pupius' work, contributed under CLA: 
 		http://pupius.co.uk/js/Toolkit.Drawing.js
 */
 (function(){ 
-
 	var d = dojo;
-	var _mixin = d.mixin;
+	var _mixin = d._mixin;
 	
 	dojo._Line = function(/*int*/ start, /*int*/ end){
 		//	summary:
@@ -8814,109 +10563,130 @@ dojo.provide("dojo._base.fx");
 		//		Ending value for range
 		this.start = start;
 		this.end = end;
-	}
+	};
+	
 	dojo._Line.prototype.getValue = function(/*float*/ n){
 		//	summary: Returns the point on the line
 		//	n: a floating point number greater than 0 and less than 1
 		return ((this.end - this.start) * n) + this.start; // Decimal
-	}
+	};
 	
-	d.declare("dojo._Animation", null, {
-		//	summary
+	dojo.Animation = function(args){
+		//	summary:
+		//		A generic animation class that fires callbacks into its handlers
+		//		object at various states. 
+		//	description:
 		//		A generic animation class that fires callbacks into its handlers
 		//		object at various states. Nearly all dojo animation functions
 		//		return an instance of this method, usually without calling the
 		//		.play() method beforehand. Therefore, you will likely need to
-		//		call .play() on instances of dojo._Animation when one is
+		//		call .play() on instances of `dojo.Animation` when one is
 		//		returned.
-		constructor: function(/*Object*/ args){
-			_mixin(this, args);
-			if(d.isArray(this.curve)){
-				/* curve: Array
-					pId: a */
-				this.curve = new d._Line(this.curve[0], this.curve[1]);
-			}
-		},
+		// args: Object
+		//		The 'magic argument', mixing all the properties into this
+		//		animation instance. 
+		
+		_mixin(this, args);
+		if(d.isArray(this.curve)){
+			this.curve = new d._Line(this.curve[0], this.curve[1]);
+		}
 		
+	};
+	
+	// Alias to drop come 2.0:
+	d._Animation = d.Animation;
+	
+	d.extend(dojo.Animation, {
 		// duration: Integer
-		//	The time in milliseonds the animation will take to run
+		//		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: 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: 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: 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 */,
+		// rate: Integer?
+		//		the time in milliseconds to wait before advancing to next frame 
+		//		(used as a fps timer: 1000/rate = fps)
+		rate: 20 /* 50 fps */,
 	
 	/*===== 
-		// delay: Integer
-		// 	The time in milliseconds to wait before starting animation after it has been .play()'ed
+		// delay: 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: 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: 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: 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: 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: 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: Event?
+		//		Synthetic event fired when a `dojo.Animation` is paused
 		onPause: null,
 	
 		// onStop: Event
-		//	Synthetic event fires when a dojo._Animation is stopped
+		//		Synthetic event fires when a `dojo.Animation` is stopped
 		onStop: null,
 	
 	=====*/
 	
 		_percent: 0,
 		_startRepeatCount: 0,
-	
+
+		_getStep: function(){
+			var _p = this._percent,
+				_e = this.easing
+			;
+			return _e ? _e(_p) : _p;
+		},
 		_fire: function(/*Event*/ evt, /*Array?*/ args){
 			//	summary:
 			//		Convenience function.  Fire event "evt" and pass it the
 			//		arguments specified in "args".
+			//	description:
+			//		Convenience function.  Fire event "evt" and pass it the
+			//		arguments specified in "args".
+			//		Fires the callback in the scope of the `dojo.Animation` 
+			//		instance.
 			//	evt:
 			//		The event to fire.
 			//	args:
 			//		The arguments to pass to the event.
+			var a = args||[];
 			if(this[evt]){
-				if(dojo.config.debugAtAllCosts){
-					this[evt].apply(this, args||[]);
+				if(d.config.debugAtAllCosts){
+					this[evt].apply(this, a);
 				}else{
 					try{
-						this[evt].apply(this, args||[]);
+						this[evt].apply(this, a);
 					}catch(e){
 						// squelch and log because we shouldn't allow exceptions in
 						// synthetic event handlers to cause the internal timer to run
@@ -8928,7 +10698,7 @@ dojo.provide("dojo._base.fx");
 					}
 				}
 			}
-			return this; // dojo._Animation
+			return this; // dojo.Animation
 		},
 
 		play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){
@@ -8939,6 +10709,9 @@ dojo.provide("dojo._base.fx");
 			// gotoStart:
 			//		If true, starts the animation from the beginning; otherwise,
 			//		starts it from its current position.
+			// returns: dojo.Animation
+			//		The instance to allow chaining.
+
 			var _t = this;
 			if(_t._delayTimer){ _t._clearTimer(); }
 			if(gotoStart){
@@ -8946,17 +10719,17 @@ dojo.provide("dojo._base.fx");
 				_t._active = _t._paused = false;
 				_t._percent = 0;
 			}else if(_t._active && !_t._paused){
-				return _t; // dojo._Animation
+				return _t;
 			}
 	
-			_t._fire("beforeBegin");
+			_t._fire("beforeBegin", [_t.node]);
 	
 			var de = delay || _t.delay,
 				_p = dojo.hitch(_t, "_play", gotoStart);
 				
 			if(de > 0){
 				_t._delayTimer = setTimeout(_p, de);
-				return _t; // dojo._Animation
+				return _t;
 			}
 			_p();
 			return _t;
@@ -8973,8 +10746,7 @@ dojo.provide("dojo._base.fx");
 	
 			_t._active = true;
 			_t._paused = false;
-	
-			var value = _t.curve.getValue(_t._percent);
+			var value = _t.curve.getValue(_t._getStep());
 			if(!_t._percent){
 				if(!_t._startRepeatCount){
 					_t._startRepeatCount = _t.repeat;
@@ -8985,7 +10757,7 @@ dojo.provide("dojo._base.fx");
 			_t._fire("onPlay", [value]);
 	
 			_t._cycle();
-			return _t; // dojo._Animation
+			return _t; // dojo.Animation
 		},
 	
 		pause: function(){
@@ -8993,10 +10765,10 @@ dojo.provide("dojo._base.fx");
 			var _t = this;
 			if(_t._delayTimer){ _t._clearTimer(); }
 			_t._stopTimer();
-			if(!_t._active){ return _t; /*dojo._Animation*/ }
+			if(!_t._active){ return _t; /*dojo.Animation*/ }
 			_t._paused = true;
-			_t._fire("onPause", [_t.curve.getValue(_t._percent)]);
-			return _t; // dojo._Animation
+			_t._fire("onPause", [_t.curve.getValue(_t._getStep())]);
+			return _t; // dojo.Animation
 		},
 	
 		gotoPercent: function(/*Decimal*/ percent, /*Boolean?*/ andPlay){
@@ -9011,7 +10783,7 @@ dojo.provide("dojo._base.fx");
 			_t._active = _t._paused = true;
 			_t._percent = percent;
 			if(andPlay){ _t.play(); }
-			return _t; // dojo._Animation
+			return _t; // dojo.Animation
 		},
 	
 		stop: function(/*boolean?*/ gotoEnd){
@@ -9019,19 +10791,20 @@ dojo.provide("dojo._base.fx");
 			// gotoEnd: If true, the animation will end.
 			var _t = this;
 			if(_t._delayTimer){ _t._clearTimer(); }
-			if(!_t._timer){ return _t; /* dojo._Animation */ }
+			if(!_t._timer){ return _t; /* dojo.Animation */ }
 			_t._stopTimer();
 			if(gotoEnd){
 				_t._percent = 1;
 			}
-			_t._fire("onStop", [_t.curve.getValue(_t._percent)]);
+			_t._fire("onStop", [_t.curve.getValue(_t._getStep())]);
 			_t._active = _t._paused = false;
-			return _t; // dojo._Animation
+			return _t; // dojo.Animation
 		},
 	
 		status: function(){
-			// summary: Returns a string token representation of the status of
-			//			the animation, one of: "paused", "playing", "stopped"
+			// 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
 			}
@@ -9073,11 +10846,11 @@ dojo.provide("dojo._base.fx");
 						}
 					}
 					_t._percent = 0;
-					_t._fire("onEnd");
-					_t._stopTimer();
+					_t._fire("onEnd", [_t.node]);
+					!_t.repeat && _t._stopTimer();
 				}
 			}
-			return _t; // dojo._Animation
+			return _t; // dojo.Animation
 		},
 		
 		_clearTimer: function(){
@@ -9088,36 +10861,40 @@ dojo.provide("dojo._base.fx");
 		
 	});
 
+	// the local timer, stubbed into all Animation instances
 	var ctr = 0,
 		_globalTimerList = [],
 		timer = null,
 		runner = {
-			run: function(){ }
+			run: function(){}
 		};
 
-	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);
-		}
-	};
+	d.extend(d.Animation, {
 
-	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;
+		_startTimer: function(){
+			if(!this._timer){
+				this._timer = d.connect(runner, "run", this, "_cycle");
+				ctr++;
+			}
+			if(!timer){
+				timer = setInterval(d.hitch(runner, "run"), this.rate);
+			}
+		},
+
+		_stopTimer: function(){
+			if(this._timer){
+				d.disconnect(this._timer);
+				this._timer = null;
+				ctr--;
+			}
+			if(ctr <= 0){
+				clearInterval(timer);
+				timer = null;
+				ctr = 0;
+			}
 		}
-	};
+
+	});
 
 	var _makeFadeable = 
 				d.isIE ? function(node){
@@ -9151,8 +10928,8 @@ dojo.provide("dojo._base.fx");
 		var anim = d.animateProperty(fArgs);
 		d.connect(anim, "beforeBegin", d.partial(_makeFadeable, fArgs.node));
 
-		return anim; // dojo._Animation
-	}
+		return anim; // dojo.Animation
+	};
 
 	/*=====
 	dojo.__FadeArgs = function(node, duration, easing){
@@ -9172,20 +10949,20 @@ dojo.provide("dojo._base.fx");
 		// summary: 
 		//		Returns an animation that will fade node defined in 'args' from
 		//		its current opacity to fully opaque.
-		return d._fade(_mixin({ end: 1 }, args)); // dojo._Animation
-	}
+		return d._fade(_mixin({ end: 1 }, args)); // dojo.Animation
+	};
 
 	dojo.fadeOut = function(/*dojo.__FadeArgs*/  args){
 		// summary: 
 		//		Returns an animation that will fade node defined in 'args'
 		//		from its current opacity to fully transparent.
-		return d._fade(_mixin({ end: 0 }, args)); // dojo._Animation
-	}
+		return d._fade(_mixin({ end: 0 }, args)); // dojo.Animation
+	};
 
 	dojo._defaultEasing = function(/*Decimal?*/ n){
-		// summary: The default easing function for dojo._Animation(s)
-		return 0.5 + ((Math.sin((n + 1.5) * Math.PI))/2);
-	}
+		// 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
@@ -9200,7 +10977,7 @@ dojo.provide("dojo._base.fx");
 				prop.tempColor = new d.Color();
 			}
 		}
-	}
+	};
 
 	PropLine.prototype.getValue = function(r){
 		var ret = {};
@@ -9214,13 +10991,13 @@ dojo.provide("dojo._base.fx");
 			}
 		}
 		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
+		//	such as the properties of dojo._Line with an additional 'units' property
 		properties: {}
 		
 		//TODOC: add event callbacks
@@ -9228,18 +11005,18 @@ dojo.provide("dojo._base.fx");
 	=====*/
 
 	dojo.animateProperty = function(/*dojo.__AnimArgs*/ args){
-		//	summary: 
+		// summary: 
 		//		Returns an animation that will transition the properties of
-		//		node defined in 'args' depending how they are defined in
-		//		'args.properties'
+		//		node defined in `args` depending how they are defined in
+		//		`args.properties`
 		//
 		// description:
-		//		dojo.animateProperty is the foundation of most dojo.fx
+		//		`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:
+		// example:
 		//		A simple animation that changes the width of the specified node.
 		//	|	dojo.animateProperty({ 
 		//	|		node: "nodeId",
@@ -9248,22 +11025,22 @@ dojo.provide("dojo._base.fx");
 		//		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
+		//		can also specify directly. Defaults to 'px' if ommitted.
 		//
-		// 	example:
+		// 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" } 
+		//	|			width: { start: '200', end: '400', units:"px" },
+		//	|			height: { start:'200', end: '400', units:"px" },
+		//	|			paddingTop: { start:'5', end:'50', units:"px" } 
 		//	|		}
 		//	|	}).play();
 		//		Note 'paddingTop' is used over 'padding-top'. Multi-name CSS properties
 		//		are written using "mixed case", as the hyphen is illegal as an object key.
 		//		
-		// 	example:
+		// 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
@@ -9275,13 +11052,14 @@ dojo.provide("dojo._base.fx");
 		//	|		easing: function(n){
 		//	|			return (n==0) ? 0 : Math.pow(2, 10 * (n - 1));
 		//	|		},
-		//	|		onEnd: function(){
-		//	|			// called when the animation finishes
+		//	|		onEnd: function(node){
+		//	|			// called when the animation finishes. The animation
+		//	|			// target is passed to this function
 		//	|		}
 		//	|	}).play(500); // delay playing half a second
 		//
-		//	example:
-		//		Like all `dojo._Animation`s, animateProperty returns a handle to the
+		// example:
+		//		Like all `dojo.Animation`s, animateProperty returns a handle to the
 		//		Animation instance, which fires the events common to Dojo FX. Use `dojo.connect`
 		//		to access these events outside of the Animation definiton:
 		//	|	var anim = dojo.animateProperty({
@@ -9291,15 +11069,34 @@ dojo.provide("dojo._base.fx");
 		//	|		}
 		//	|	});
 		//	|	dojo.connect(anim,"onEnd", function(){
-		//	|		
+		//	|		console.log("animation ended");
 		//	|	});
 		//	|	// play the animation now:
 		//	|	anim.play();
-		
-		args.node = d.byId(args.node);
+		//
+		// example:
+		//		Each property can be a function whose return value is substituted along.
+		//		Additionally, each measurement (eg: start, end) can be a function. The node
+		//		reference is passed direcly to callbacks.
+		//	|	dojo.animateProperty({
+		//	|		node:"mine",
+		//	|		properties:{
+		//	|			height:function(node){
+		//	|				// shrink this node by 50%
+		//	|				return dojo.position(node).h / 2
+		//	|			},
+		//	|			width:{
+		//	|				start:function(node){ return 100; },
+		//	|				end:function(node){ return 200; }	
+		//	|			}
+		//	|		}
+		//	|	}).play();
+		//
+
+		var n = args.node = d.byId(args.node);
 		if(!args.easing){ args.easing = d._defaultEasing; }
 
-		var anim = new d._Animation(args);
+		var anim = new d.Animation(args);
 		d.connect(anim, "beforeBegin", anim, function(){
 			var pm = {};
 			for(var p in this.properties){
@@ -9311,26 +11108,29 @@ dojo.provide("dojo._base.fx");
 					this.node.display = "block";
 				}
 				var prop = this.properties[p];
+				if(d.isFunction(prop)){
+					prop = prop(n);
+				}
 				prop = pm[p] = _mixin({}, (d.isObject(prop) ? prop: { end: prop }));
 
 				if(d.isFunction(prop.start)){
-					prop.start = prop.start();
+					prop.start = prop.start(n);
 				}
 				if(d.isFunction(prop.end)){
-					prop.end = prop.end();
+					prop.end = prop.end(n);
 				}
 				var isColor = (p.toLowerCase().indexOf("color") >= 0);
 				function getStyle(node, p){
 					// dojo.style(node, "height") can return "auto" or "" on IE; this is more reliable:
-					var v = {height: node.offsetHeight, width: node.offsetWidth}[p];
+					var v = { height: node.offsetHeight, width: node.offsetWidth }[p];
 					if(v !== undefined){ return v; }
 					v = d.style(node, p);
 					return (p == "opacity") ? +v : (isColor ? v : parseFloat(v));
 				}
 				if(!("end" in prop)){
-					prop.end = getStyle(this.node, p);
+					prop.end = getStyle(n, p);
 				}else if(!("start" in prop)){
-					prop.start = getStyle(this.node, p);
+					prop.start = getStyle(n, p);
 				}
 
 				if(isColor){
@@ -9343,8 +11143,8 @@ dojo.provide("dojo._base.fx");
 			this.curve = new PropLine(pm);
 		});
 		d.connect(anim, "onAnimate", d.hitch(d, "style", anim.node));
-		return anim; // dojo._Animation
-	}
+		return anim; // dojo.Animation
+	};
 
 	dojo.anim = function(	/*DOMNode|String*/ 	node, 
 							/*Object*/ 			properties, 
@@ -9354,7 +11154,7 @@ dojo.provide("dojo._base.fx");
 							/*Integer?*/		delay){
 		//	summary:
 		//		A simpler interface to `dojo.animateProperty()`, also returns
-		//		an instance of `dojo._Animation` but begins the animation
+		//		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
@@ -9363,7 +11163,7 @@ dojo.provide("dojo._base.fx");
 		//		packed "property bag" which is used for other Dojo animation
 		//		methods.
 		//
-		//		The `dojo._Animation` object returned from `dojo.anim` will be
+		//		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:
@@ -9390,14 +11190,14 @@ dojo.provide("dojo._base.fx");
 		//	example:
 		//		Fade out a node over a full second
 		//	|	dojo.anim("id", { opacity: 0 }, 1000);
-		return d.animateProperty({ 
+		return d.animateProperty({ // dojo.Animation
 			node: node,
-			duration: duration||d._Animation.prototype.duration,
+			duration: duration || d.Animation.prototype.duration,
 			properties: properties,
 			easing: easing,
 			onEnd: onEnd 
-		}).play(delay||0);
-	}
+		}).play(delay || 0);
+	};
 })();
 
 }
diff --git a/dojo/fx.js b/dojo/fx.js
index d94211f..adf889f 100644
--- a/dojo/fx.js
+++ b/dojo/fx.js
@@ -10,15 +10,15 @@ dojo._hasResource["dojo.fx"]=true;
 dojo.provide("dojo.fx");
 dojo.require("dojo.fx.Toggler");
 (function(){
-var d=dojo,_2={_fire:function(_3,_4){
-if(this[_3]){
-this[_3].apply(this,_4||[]);
+var d=dojo,_1={_fire:function(_2,_3){
+if(this[_2]){
+this[_2].apply(this,_3||[]);
 }
 return this;
 }};
-var _5=function(_6){
+var _4=function(_5){
 this._index=-1;
-this._animations=_6||[];
+this._animations=_5||[];
 this._current=this._onAnimateCtx=this._onEndCtx=null;
 this.duration=0;
 d.forEach(this._animations,function(a){
@@ -28,7 +28,7 @@ this.duration+=a.delay;
 }
 },this);
 };
-d.extend(_5,{_onAnimate:function(){
+d.extend(_4,{_onAnimate:function(){
 this._fire("onAnimate",arguments);
 },_onEnd:function(){
 d.disconnect(this._onAnimateCtx);
@@ -42,22 +42,22 @@ this._onAnimateCtx=d.connect(this._current,"onAnimate",this,"_onAnimate");
 this._onEndCtx=d.connect(this._current,"onEnd",this,"_onEnd");
 this._current.play(0,true);
 }
-},play:function(_8,_9){
+},play:function(_6,_7){
 if(!this._current){
 this._current=this._animations[this._index=0];
 }
-if(!_9&&this._current.status()=="playing"){
+if(!_7&&this._current.status()=="playing"){
 return this;
 }
-var _a=d.connect(this._current,"beforeBegin",this,function(){
+var _8=d.connect(this._current,"beforeBegin",this,function(){
 this._fire("beforeBegin");
-}),_b=d.connect(this._current,"onBegin",this,function(_c){
+}),_9=d.connect(this._current,"onBegin",this,function(_a){
 this._fire("onBegin",arguments);
-}),_d=d.connect(this._current,"onPlay",this,function(_e){
+}),_b=d.connect(this._current,"onPlay",this,function(_c){
 this._fire("onPlay",arguments);
-d.disconnect(_a);
+d.disconnect(_8);
+d.disconnect(_9);
 d.disconnect(_b);
-d.disconnect(_d);
 });
 if(this._onAnimateCtx){
 d.disconnect(this._onAnimateCtx);
@@ -71,32 +71,32 @@ this._current.play.apply(this._current,arguments);
 return this;
 },pause:function(){
 if(this._current){
-var e=d.connect(this._current,"onPause",this,function(arg){
+var e=d.connect(this._current,"onPause",this,function(_d){
 this._fire("onPause",arguments);
 d.disconnect(e);
 });
 this._current.pause();
 }
 return this;
-},gotoPercent:function(_11,_12){
+},gotoPercent:function(_e,_f){
 this.pause();
-var _13=this.duration*_11;
+var _10=this.duration*_e;
 this._current=null;
 d.some(this._animations,function(a){
-if(a.duration<=_13){
+if(a.duration<=_10){
 this._current=a;
 return true;
 }
-_13-=a.duration;
+_10-=a.duration;
 return false;
 });
 if(this._current){
-this._current.gotoPercent(_13/this._current.duration,_12);
+this._current.gotoPercent(_10/this._current.duration,_f);
 }
 return this;
-},stop:function(_15){
+},stop:function(_11){
 if(this._current){
-if(_15){
+if(_11){
 for(;this._index+1<this._animations.length;++this._index){
 this._animations[this._index].stop(true);
 }
@@ -119,46 +119,46 @@ if(this._onEndCtx){
 d.disconnect(this._onEndCtx);
 }
 }});
-d.extend(_5,_2);
-dojo.fx.chain=function(_18){
-return new _5(_18);
+d.extend(_4,_1);
+dojo.fx.chain=function(_12){
+return new _4(_12);
 };
-var _19=function(_1a){
-this._animations=_1a||[];
+var _13=function(_14){
+this._animations=_14||[];
 this._connects=[];
 this._finished=0;
 this.duration=0;
-d.forEach(_1a,function(a){
-var _1c=a.duration;
+d.forEach(_14,function(a){
+var _15=a.duration;
 if(a.delay){
-_1c+=a.delay;
+_15+=a.delay;
 }
-if(this.duration<_1c){
-this.duration=_1c;
+if(this.duration<_15){
+this.duration=_15;
 }
 this._connects.push(d.connect(a,"onEnd",this,"_onEnd"));
 },this);
-this._pseudoAnimation=new d._Animation({curve:[0,1],duration:this.duration});
-var _1d=this;
-d.forEach(["beforeBegin","onBegin","onPlay","onAnimate","onPause","onStop"],function(evt){
-_1d._connects.push(d.connect(_1d._pseudoAnimation,evt,function(){
-_1d._fire(evt,arguments);
+this._pseudoAnimation=new d.Animation({curve:[0,1],duration:this.duration});
+var _16=this;
+d.forEach(["beforeBegin","onBegin","onPlay","onAnimate","onPause","onStop","onEnd"],function(evt){
+_16._connects.push(d.connect(_16._pseudoAnimation,evt,function(){
+_16._fire(evt,arguments);
 }));
 });
 };
-d.extend(_19,{_doAction:function(_1f,_20){
+d.extend(_13,{_doAction:function(_17,_18){
 d.forEach(this._animations,function(a){
-a[_1f].apply(a,_20);
+a[_17].apply(a,_18);
 });
 return this;
 },_onEnd:function(){
-if(++this._finished==this._animations.length){
+if(++this._finished>this._animations.length){
 this._fire("onEnd");
 }
-},_call:function(_22,_23){
+},_call:function(_19,_1a){
 var t=this._pseudoAnimation;
-t[_22].apply(t,_23);
-},play:function(_25,_26){
+t[_19].apply(t,_1a);
+},play:function(_1b,_1c){
 this._finished=0;
 this._doAction("play",arguments);
 this._call("play",arguments);
@@ -167,14 +167,14 @@ return this;
 this._doAction("pause",arguments);
 this._call("pause",arguments);
 return this;
-},gotoPercent:function(_27,_28){
-var ms=this.duration*_27;
+},gotoPercent:function(_1d,_1e){
+var ms=this.duration*_1d;
 d.forEach(this._animations,function(a){
-a.gotoPercent(a.duration<ms?1:(ms/a.duration),_28);
+a.gotoPercent(a.duration<ms?1:(ms/a.duration),_1e);
 });
 this._call("gotoPercent",arguments);
 return this;
-},stop:function(_2b){
+},stop:function(_1f){
 this._doAction("stop",arguments);
 this._call("stop",arguments);
 return this;
@@ -183,14 +183,13 @@ return this._pseudoAnimation.status();
 },destroy:function(){
 d.forEach(this._connects,dojo.disconnect);
 }});
-d.extend(_19,_2);
-dojo.fx.combine=function(_2c){
-return new _19(_2c);
+d.extend(_13,_1);
+dojo.fx.combine=function(_20){
+return new _13(_20);
 };
-dojo.fx.wipeIn=function(_2d){
-_2d.node=d.byId(_2d.node);
-var _2e=_2d.node,s=_2e.style,o;
-var _31=d.animateProperty(d.mixin({properties:{height:{start:function(){
+dojo.fx.wipeIn=function(_21){
+var _22=_21.node=d.byId(_21.node),s=_22.style,o;
+var _23=d.animateProperty(d.mixin({properties:{height:{start:function(){
 o=s.overflow;
 s.overflow="hidden";
 if(s.visibility=="hidden"||s.display=="none"){
@@ -199,55 +198,55 @@ s.display="";
 s.visibility="";
 return 1;
 }else{
-var _32=d.style(_2e,"height");
-return Math.max(_32,1);
+var _24=d.style(_22,"height");
+return Math.max(_24,1);
 }
 },end:function(){
-return _2e.scrollHeight;
-}}}},_2d));
-d.connect(_31,"onEnd",function(){
+return _22.scrollHeight;
+}}}},_21));
+d.connect(_23,"onEnd",function(){
 s.height="auto";
 s.overflow=o;
 });
-return _31;
+return _23;
 };
-dojo.fx.wipeOut=function(_33){
-var _34=_33.node=d.byId(_33.node),s=_34.style,o;
-var _37=d.animateProperty(d.mixin({properties:{height:{end:1}}},_33));
-d.connect(_37,"beforeBegin",function(){
+dojo.fx.wipeOut=function(_25){
+var _26=_25.node=d.byId(_25.node),s=_26.style,o;
+var _27=d.animateProperty(d.mixin({properties:{height:{end:1}}},_25));
+d.connect(_27,"beforeBegin",function(){
 o=s.overflow;
 s.overflow="hidden";
 s.display="";
 });
-d.connect(_37,"onEnd",function(){
+d.connect(_27,"onEnd",function(){
 s.overflow=o;
 s.height="auto";
 s.display="none";
 });
-return _37;
+return _27;
 };
-dojo.fx.slideTo=function(_38){
-var _39=_38.node=d.byId(_38.node),top=null,_3b=null;
-var _3c=(function(n){
+dojo.fx.slideTo=function(_28){
+var _29=_28.node=d.byId(_28.node),top=null,_2a=null;
+var _2b=(function(n){
 return function(){
 var cs=d.getComputedStyle(n);
 var pos=cs.position;
 top=(pos=="absolute"?n.offsetTop:parseInt(cs.top)||0);
-_3b=(pos=="absolute"?n.offsetLeft:parseInt(cs.left)||0);
+_2a=(pos=="absolute"?n.offsetLeft:parseInt(cs.left)||0);
 if(pos!="absolute"&&pos!="relative"){
-var ret=d.coords(n,true);
+var ret=d.position(n,true);
 top=ret.y;
-_3b=ret.x;
+_2a=ret.x;
 n.style.position="absolute";
 n.style.top=top+"px";
-n.style.left=_3b+"px";
+n.style.left=_2a+"px";
 }
 };
-})(_39);
-_3c();
-var _41=d.animateProperty(d.mixin({properties:{top:_38.top||0,left:_38.left||0}},_38));
-d.connect(_41,"beforeBegin",_41,_3c);
-return _41;
+})(_29);
+_2b();
+var _2c=d.animateProperty(d.mixin({properties:{top:_28.top||0,left:_28.left||0}},_28));
+d.connect(_2c,"beforeBegin",_2c,_2b);
+return _2c;
 };
 })();
 }
diff --git a/dojo/fx/Toggler.js b/dojo/fx/Toggler.js
index 210cf3e..51032d9 100644
--- a/dojo/fx/Toggler.js
+++ b/dojo/fx/Toggler.js
@@ -8,21 +8,21 @@
 if(!dojo._hasResource["dojo.fx.Toggler"]){
 dojo._hasResource["dojo.fx.Toggler"]=true;
 dojo.provide("dojo.fx.Toggler");
-dojo.declare("dojo.fx.Toggler",null,{constructor:function(_1){
-var _t=this;
-dojo.mixin(_t,_1);
-_t.node=_1.node;
-_t._showArgs=dojo.mixin({},_1);
-_t._showArgs.node=_t.node;
-_t._showArgs.duration=_t.showDuration;
-_t.showAnim=_t.showFunc(_t._showArgs);
-_t._hideArgs=dojo.mixin({},_1);
-_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(_3){
+dojo.declare("dojo.fx.Toggler",null,{node:null,showFunc:dojo.fadeIn,hideFunc:dojo.fadeOut,showDuration:200,hideDuration:200,constructor:function(_1){
+var _2=this;
+dojo.mixin(_2,_1);
+_2.node=_1.node;
+_2._showArgs=dojo.mixin({},_1);
+_2._showArgs.node=_2.node;
+_2._showArgs.duration=_2.showDuration;
+_2.showAnim=_2.showFunc(_2._showArgs);
+_2._hideArgs=dojo.mixin({},_1);
+_2._hideArgs.node=_2.node;
+_2._hideArgs.duration=_2.hideDuration;
+_2.hideAnim=_2.hideFunc(_2._hideArgs);
+dojo.connect(_2.showAnim,"beforeBegin",dojo.hitch(_2.hideAnim,"stop",true));
+dojo.connect(_2.hideAnim,"beforeBegin",dojo.hitch(_2.showAnim,"stop",true));
+},show:function(_3){
 return this.showAnim.play(_3||0);
 },hide:function(_4){
 return this.hideAnim.play(_4||0);
diff --git a/dojo/hash.js b/dojo/hash.js
new file mode 100644
index 0000000..9f2cebc
--- /dev/null
+++ b/dojo/hash.js
@@ -0,0 +1,133 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojo.hash"]){
+dojo._hasResource["dojo.hash"]=true;
+dojo.provide("dojo.hash");
+(function(){
+dojo.hash=function(_1,_2){
+if(!arguments.length){
+return _3();
+}
+if(_1.charAt(0)=="#"){
+_1=_1.substring(1);
+}
+if(_2){
+_4(_1);
+}else{
+location.href="#"+_1;
+}
+return _1;
+};
+var _5=null,_6=null,_7=dojo.config.hashPollFrequency||100;
+function _3(){
+var h=location.href,i=h.indexOf("#");
+return (i>=0)?h.substring(i+1):"";
+};
+function _8(){
+dojo.publish("/dojo/hashchange",[_3()]);
+};
+function _9(){
+if(_3()===_5){
+return;
+}
+_5=_3();
+_8();
+};
+function _4(_a){
+if(_6){
+if(_6.isTransitioning()){
+setTimeout(dojo.hitch(null,_4,_a),_7);
+return;
+}
+var _b=_6.iframe.location.href;
+var _c=_b.indexOf("?");
+_6.iframe.location.replace(_b.substring(0,_c)+"?"+_a);
+return;
+}
+location.replace("#"+_a);
+_9();
+};
+function _d(){
+var _e=document.createElement("iframe"),_f="dojo-hash-iframe",_10=dojo.config.dojoBlankHtmlUrl||dojo.moduleUrl("dojo","resources/blank.html");
+_e.id=_f;
+_e.src=_10+"?"+_3();
+_e.style.display="none";
+document.body.appendChild(_e);
+this.iframe=dojo.global[_f];
+var _11,_12,_13,_14,_15,_16=this.iframe.location,_17=dojo.global.location;
+function _18(){
+_5=_17.hash;
+_11=_15?_5:_16.search;
+_12=false;
+_13=null;
+};
+this.isTransitioning=function(){
+return _12;
+};
+this.pollLocation=function(){
+if(!_15){
+try{
+_16.search;
+if(document.title!=_14){
+_14=this.iframe.document.title=document.title;
+}
+}
+catch(e){
+_15=true;
+console.error("dojo.hash: Error adding history entry. Server unreachable.");
+}
+}
+if(_12&&_5===_17.hash){
+if(_15||_16.search===_13){
+_18();
+_8();
+}else{
+setTimeout(dojo.hitch(this,this.pollLocation),0);
+return;
+}
+}else{
+if(_5===_17.hash&&(_15||_11===_16.search)){
+}else{
+if(_5!==_17.hash){
+_5=_17.hash;
+_12=true;
+_13="?"+_3();
+_e.src=_10+_13;
+_15=false;
+setTimeout(dojo.hitch(this,this.pollLocation),0);
+return;
+}else{
+if(!_15){
+_17.href="#"+_16.search.substring(1);
+_18();
+_8();
+}
+}
+}
+}
+setTimeout(dojo.hitch(this,this.pollLocation),_7);
+};
+_18();
+setTimeout(dojo.hitch(this,this.pollLocation),_7);
+};
+dojo.addOnLoad(function(){
+if("onhashchange" in dojo.global&&(!dojo.isIE||(dojo.isIE>=8&&document.compatMode!="BackCompat"))){
+dojo.connect(dojo.global,"onhashchange",_8);
+}else{
+if(document.addEventListener){
+_5=_3();
+setInterval(_9,_7);
+}else{
+if(document.attachEvent){
+_6=new _d();
+}
+}
+}
+});
+})();
+}
diff --git a/dojo/html.js b/dojo/html.js
index a697000..57700a7 100644
--- a/dojo/html.js
+++ b/dojo/html.js
@@ -10,94 +10,65 @@ dojo._hasResource["dojo.html"]=true;
 dojo.provide("dojo.html");
 dojo.require("dojo.parser");
 (function(){
-var _1=0;
+var _1=0,d=dojo;
 dojo.html._secureForInnerHtml=function(_2){
 return _2.replace(/(?:\s*<!DOCTYPE\s[^>]+>|<title[^>]*>[\s\S]*?<\/title>)/ig,"");
 };
 dojo.html._emptyNode=dojo.empty;
-dojo.html._setNodeContent=function(_3,_4,_5){
-if(_5){
-dojo.html._emptyNode(_3);
-}
+dojo.html._setNodeContent=function(_3,_4){
+d.empty(_3);
+if(_4){
 if(typeof _4=="string"){
-var _6="",_7="",_8=0,_9=_3.nodeName.toLowerCase();
-switch(_9){
-case "tr":
-_6="<tr>";
-_7="</tr>";
-_8+=1;
-case "tbody":
-case "thead":
-_6="<tbody>"+_6;
-_7+="</tbody>";
-_8+=1;
-case "table":
-_6="<table>"+_6;
-_7+="</table>";
-_8+=1;
-break;
-}
-if(_8){
-var n=_3.ownerDocument.createElement("div");
-n.innerHTML=_6+_4+_7;
-do{
-n=n.firstChild;
-}while(--_8);
-dojo.forEach(n.childNodes,function(n){
-_3.appendChild(n.cloneNode(true));
-});
-}else{
-_3.innerHTML=_4;
+_4=d._toDom(_4,_3.ownerDocument);
+}
+if(!_4.nodeType&&d.isArrayLike(_4)){
+for(var _5=_4.length,i=0;i<_4.length;i=_5==_4.length?i+1:0){
+d.place(_4[i],_3,"last");
 }
 }else{
-if(_4.nodeType){
-_3.appendChild(_4);
-}else{
-dojo.forEach(_4,function(n){
-_3.appendChild(n.cloneNode(true));
-});
+d.place(_4,_3,"last");
 }
 }
 return _3;
 };
-dojo.declare("dojo.html._ContentSetter",null,{node:"",content:"",id:"",cleanContent:false,extractContent:false,parseContent:false,constructor:function(_d,_e){
-dojo.mixin(this,_d||{});
-_e=this.node=dojo.byId(this.node||_e);
+dojo.declare("dojo.html._ContentSetter",null,{node:"",content:"",id:"",cleanContent:false,extractContent:false,parseContent:false,constructor:function(_6,_7){
+dojo.mixin(this,_6||{});
+_7=this.node=dojo.byId(this.node||_7);
 if(!this.id){
-this.id=["Setter",(_e)?_e.id||_e.tagName:"",_1++].join("_");
+this.id=["Setter",(_7)?_7.id||_7.tagName:"",_1++].join("_");
 }
-if(!(this.node||_e)){
+if(!(this.node||_7)){
 new Error(this.declaredClass+": no node provided to "+this.id);
 }
-},set:function(_f,_10){
-if(undefined!==_f){
-this.content=_f;
+},set:function(_8,_9){
+if(undefined!==_8){
+this.content=_8;
 }
-if(_10){
-this._mixin(_10);
+if(_9){
+this._mixin(_9);
 }
 this.onBegin();
 this.setContent();
 this.onEnd();
 return this.node;
 },setContent:function(){
-var _11=this.node;
-if(!_11){
+var _a=this.node;
+if(!_a){
 console.error("setContent given no node");
 }
 try{
-_11=dojo.html._setNodeContent(_11,this.content);
+_a=dojo.html._setNodeContent(_a,this.content);
 }
 catch(e){
-var _12=this.onContentError(e);
+var _b=this.onContentError(e);
 try{
-_11.innerHTML=_12;
+_a.innerHTML=_b;
 }
 catch(e){
 console.error("Fatal "+this.declaredClass+".setContent could not change content due to "+e.message,e);
 }
 }
-this.node=_11;
+this.node=_a;
 },empty:function(){
 if(this.parseResults&&this.parseResults.length){
 dojo.forEach(this.parseResults,function(w){
@@ -109,20 +80,20 @@ delete this.parseResults;
 }
 dojo.html._emptyNode(this.node);
 },onBegin:function(){
-var _14=this.content;
-if(dojo.isString(_14)){
+var _c=this.content;
+if(dojo.isString(_c)){
 if(this.cleanContent){
-_14=dojo.html._secureForInnerHtml(_14);
+_c=dojo.html._secureForInnerHtml(_c);
 }
 if(this.extractContent){
-var _15=_14.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
-if(_15){
-_14=_15[1];
+var _d=_c.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
+if(_d){
+_c=_d[1];
 }
 }
 }
 this.empty();
-this.content=_14;
+this.content=_c;
 return this.node;
 },onEnd:function(){
 if(this.parseContent){
@@ -133,43 +104,43 @@ return this.node;
 delete this.parseResults;
 delete this.node;
 delete this.content;
-},onContentError:function(err){
-return "Error occured setting content: "+err;
-},_mixin:function(_17){
-var _18={},key;
-for(key in _17){
-if(key in _18){
+},onContentError:function(_e){
+return "Error occured setting content: "+_e;
+},_mixin:function(_f){
+var _10={},key;
+for(key in _f){
+if(key in _10){
 continue;
 }
-this[key]=_17[key];
+this[key]=_f[key];
 }
 },_parse:function(){
-var _1a=this.node;
+var _11=this.node;
 try{
-this.parseResults=dojo.parser.parse(_1a,true);
+this.parseResults=dojo.parser.parse(_11,true);
 }
 catch(e){
 this._onError("Content",e,"Error parsing in _ContentSetter#"+this.id);
 }
-},_onError:function(_1b,err,_1d){
-var _1e=this["on"+_1b+"Error"].call(this,err);
-if(_1d){
-console.error(_1d,err);
+},_onError:function(_12,err,_13){
+var _14=this["on"+_12+"Error"].call(this,err);
+if(_13){
+console.error(_13,err);
 }else{
-if(_1e){
-dojo.html._setNodeContent(this.node,_1e,true);
+if(_14){
+dojo.html._setNodeContent(this.node,_14,true);
 }
 }
 }});
-dojo.html.set=function(_1f,_20,_21){
-if(undefined==_20){
+dojo.html.set=function(_15,_16,_17){
+if(undefined==_16){
 console.warn("dojo.html.set: no cont argument provided, using empty string");
-_20="";
+_16="";
 }
-if(!_21){
-return dojo.html._setNodeContent(_1f,_20,true);
+if(!_17){
+return dojo.html._setNodeContent(_15,_16,true);
 }else{
-var op=new dojo.html._ContentSetter(dojo.mixin(_21,{content:_20,node:_1f}));
+var op=new dojo.html._ContentSetter(dojo.mixin(_17,{content:_16,node:_15}));
 return op.set();
 }
 };
diff --git a/dojo/i18n.js b/dojo/i18n.js
index fd1ac48..2b0f1a3 100644
--- a/dojo/i18n.js
+++ b/dojo/i18n.js
@@ -16,9 +16,9 @@ var _6=dojo._loadedModules[_5];
 if(_6){
 var _7;
 for(var i=_4.length;i>0;i--){
-var _9=_4.slice(0,i).join("_");
-if(_6[_9]){
-_7=_6[_9];
+var _8=_4.slice(0,i).join("_");
+if(_6[_8]){
+_7=_6[_8];
 break;
 }
 }
@@ -26,146 +26,146 @@ if(!_7){
 _7=_6.ROOT;
 }
 if(_7){
-var _a=function(){
+var _9=function(){
 };
-_a.prototype=_7;
-return new _a();
+_9.prototype=_7;
+return new _9();
 }
 }
 throw new Error("Bundle not found: "+_2+" in "+_1+" , locale="+_3);
 };
-dojo.i18n.normalizeLocale=function(_b){
-var _c=_b?_b.toLowerCase():dojo.locale;
-if(_c=="root"){
-_c="ROOT";
+dojo.i18n.normalizeLocale=function(_a){
+var _b=_a?_a.toLowerCase():dojo.locale;
+if(_b=="root"){
+_b="ROOT";
 }
-return _c;
+return _b;
 };
-dojo.i18n._requireLocalization=function(_d,_e,_f,_10){
-var _11=dojo.i18n.normalizeLocale(_f);
-var _12=[_d,"nls",_e].join(".");
-var _13="";
-if(_10){
-var _14=_10.split(",");
-for(var i=0;i<_14.length;i++){
-if(_11["indexOf"](_14[i])==0){
-if(_14[i].length>_13.length){
-_13=_14[i];
+dojo.i18n._requireLocalization=function(_c,_d,_e,_f){
+var _10=dojo.i18n.normalizeLocale(_e);
+var _11=[_c,"nls",_d].join(".");
+var _12="";
+if(_f){
+var _13=_f.split(",");
+for(var i=0;i<_13.length;i++){
+if(_10["indexOf"](_13[i])==0){
+if(_13[i].length>_12.length){
+_12=_13[i];
 }
 }
 }
-if(!_13){
-_13="ROOT";
+if(!_12){
+_12="ROOT";
 }
 }
-var _16=_10?_13:_11;
-var _17=dojo._loadedModules[_12];
-var _18=null;
-if(_17){
-if(dojo.config.localizationComplete&&_17._built){
+var _14=_f?_12:_10;
+var _15=dojo._loadedModules[_11];
+var _16=null;
+if(_15){
+if(dojo.config.localizationComplete&&_15._built){
 return;
 }
-var _19=_16.replace(/-/g,"_");
-var _1a=_12+"."+_19;
-_18=dojo._loadedModules[_1a];
-}
-if(!_18){
-_17=dojo["provide"](_12);
-var _1b=dojo._getModuleSymbols(_d);
-var _1c=_1b.concat("nls").join("/");
-var _1d;
-dojo.i18n._searchLocalePath(_16,_10,function(loc){
-var _1f=loc.replace(/-/g,"_");
-var _20=_12+"."+_1f;
-var _21=false;
-if(!dojo._loadedModules[_20]){
-dojo["provide"](_20);
-var _22=[_1c];
+var _17=_14.replace(/-/g,"_");
+var _18=_11+"."+_17;
+_16=dojo._loadedModules[_18];
+}
+if(!_16){
+_15=dojo["provide"](_11);
+var _19=dojo._getModuleSymbols(_c);
+var _1a=_19.concat("nls").join("/");
+var _1b;
+dojo.i18n._searchLocalePath(_14,_f,function(loc){
+var _1c=loc.replace(/-/g,"_");
+var _1d=_11+"."+_1c;
+var _1e=false;
+if(!dojo._loadedModules[_1d]){
+dojo["provide"](_1d);
+var _1f=[_1a];
 if(loc!="ROOT"){
-_22.push(loc);
+_1f.push(loc);
 }
-_22.push(_e);
-var _23=_22.join("/")+".js";
-_21=dojo._loadPath(_23,null,function(_24){
-var _25=function(){
+_1f.push(_d);
+var _20=_1f.join("/")+".js";
+_1e=dojo._loadPath(_20,null,function(_21){
+var _22=function(){
 };
-_25.prototype=_1d;
-_17[_1f]=new _25();
-for(var j in _24){
-_17[_1f][j]=_24[j];
+_22.prototype=_1b;
+_15[_1c]=new _22();
+for(var j in _21){
+_15[_1c][j]=_21[j];
 }
 });
 }else{
-_21=true;
+_1e=true;
 }
-if(_21&&_17[_1f]){
-_1d=_17[_1f];
+if(_1e&&_15[_1c]){
+_1b=_15[_1c];
 }else{
-_17[_1f]=_1d;
+_15[_1c]=_1b;
 }
-if(_10){
+if(_f){
 return true;
 }
 });
 }
-if(_10&&_11!=_13){
-_17[_11.replace(/-/g,"_")]=_17[_13.replace(/-/g,"_")];
+if(_f&&_10!=_12){
+_15[_10.replace(/-/g,"_")]=_15[_12.replace(/-/g,"_")];
 }
 };
 (function(){
-var _27=dojo.config.extraLocale;
-if(_27){
-if(!_27 instanceof Array){
-_27=[_27];
+var _23=dojo.config.extraLocale;
+if(_23){
+if(!_23 instanceof Array){
+_23=[_23];
 }
 var req=dojo.i18n._requireLocalization;
-dojo.i18n._requireLocalization=function(m,b,_2b,_2c){
-req(m,b,_2b,_2c);
-if(_2b){
+dojo.i18n._requireLocalization=function(m,b,_24,_25){
+req(m,b,_24,_25);
+if(_24){
 return;
 }
-for(var i=0;i<_27.length;i++){
-req(m,b,_27[i],_2c);
+for(var i=0;i<_23.length;i++){
+req(m,b,_23[i],_25);
 }
 };
 }
 })();
-dojo.i18n._searchLocalePath=function(_2e,_2f,_30){
-_2e=dojo.i18n.normalizeLocale(_2e);
-var _31=_2e.split("-");
-var _32=[];
-for(var i=_31.length;i>0;i--){
-_32.push(_31.slice(0,i).join("-"));
-}
-_32.push(false);
-if(_2f){
-_32.reverse();
-}
-for(var j=_32.length-1;j>=0;j--){
-var loc=_32[j]||"ROOT";
-var _36=_30(loc);
-if(_36){
+dojo.i18n._searchLocalePath=function(_26,_27,_28){
+_26=dojo.i18n.normalizeLocale(_26);
+var _29=_26.split("-");
+var _2a=[];
+for(var i=_29.length;i>0;i--){
+_2a.push(_29.slice(0,i).join("-"));
+}
+_2a.push(false);
+if(_27){
+_2a.reverse();
+}
+for(var j=_2a.length-1;j>=0;j--){
+var loc=_2a[j]||"ROOT";
+var _2b=_28(loc);
+if(_2b){
 break;
 }
 }
 };
-dojo.i18n._preloadLocalizations=function(_37,_38){
-function _39(_3a){
-_3a=dojo.i18n.normalizeLocale(_3a);
-dojo.i18n._searchLocalePath(_3a,true,function(loc){
-for(var i=0;i<_38.length;i++){
-if(_38[i]==loc){
-dojo["require"](_37+"_"+loc);
+dojo.i18n._preloadLocalizations=function(_2c,_2d){
+function _2e(_2f){
+_2f=dojo.i18n.normalizeLocale(_2f);
+dojo.i18n._searchLocalePath(_2f,true,function(loc){
+for(var i=0;i<_2d.length;i++){
+if(_2d[i]==loc){
+dojo["require"](_2c+"_"+loc);
 return true;
 }
 }
 return false;
 });
 };
-_39();
-var _3d=dojo.config.extraLocale||[];
-for(var i=0;i<_3d.length;i++){
-_39(_3d[i]);
+_2e();
+var _30=dojo.config.extraLocale||[];
+for(var i=0;i<_30.length;i++){
+_2e(_30[i]);
 }
 };
 }
diff --git a/dojo/io/iframe.js b/dojo/io/iframe.js
index dcd0b30..12068b4 100644
--- a/dojo/io/iframe.js
+++ b/dojo/io/iframe.js
@@ -73,10 +73,9 @@ _a.location.replace(_8);
 }
 }
 catch(e){
-
 }
 },doc:function(_b){
-var _c=_b.contentDocument||(((_b.name)&&(_b.document)&&(document.getElementsByTagName("iframe")[_b.name].contentWindow)&&(document.getElementsByTagName("iframe")[_b.name].contentWindow.document)))||((_b.name)&&(document.frames[_b.name])&&(document.frames[_b.name].document))||null;
+var _c=_b.contentDocument||(((_b.name)&&(_b.document)&&(dojo.doc.getElementsByTagName("iframe")[_b.name].contentWindow)&&(dojo.doc.getElementsByTagName("iframe")[_b.name].contentWindow.document)))||((_b.name)&&(dojo.doc.frames[_b.name])&&(dojo.doc.frames[_b.name].document))||null;
 return _c;
 },send:function(_d){
 if(!this["_frame"]){
@@ -86,46 +85,46 @@ var _e=dojo._ioSetArgs(_d,function(_f){
 _f.canceled=true;
 _f.ioArgs._callNext();
 },function(dfd){
-var _11=null;
+var _10=null;
 try{
-var _12=dfd.ioArgs;
+var _11=dfd.ioArgs;
 var dii=dojo.io.iframe;
 var ifd=dii.doc(dii._frame);
-var _15=_12.handleAs;
-_11=ifd;
-if(_15!="html"){
-if(_15=="xml"){
+var _12=_11.handleAs;
+_10=ifd;
+if(_12!="html"){
+if(_12=="xml"){
 if(dojo.isIE){
 dojo.query("a",dii._frame.contentWindow.document.documentElement).orphan();
-var _16=(dii._frame.contentWindow.document).documentElement.innerText;
-_16=_16.replace(/>\s+</g,"><");
-_16=dojo.trim(_16);
-var _17={responseText:_16};
-_11=dojo._contentHandlers["xml"](_17);
+var _13=(dii._frame.contentWindow.document).documentElement.innerText;
+_13=_13.replace(/>\s+</g,"><");
+_13=dojo.trim(_13);
+var _14={responseText:_13};
+_10=dojo._contentHandlers["xml"](_14);
 }
 }else{
-_11=ifd.getElementsByTagName("textarea")[0].value;
-if(_15=="json"){
-_11=dojo.fromJson(_11);
+_10=ifd.getElementsByTagName("textarea")[0].value;
+if(_12=="json"){
+_10=dojo.fromJson(_10);
 }else{
-if(_15=="javascript"){
-_11=dojo.eval(_11);
+if(_12=="javascript"){
+_10=dojo.eval(_10);
 }
 }
 }
 }
 }
 catch(e){
-_11=e;
+_10=e;
 }
 finally{
-_12._callNext();
+_11._callNext();
 }
-return _11;
-},function(_18,dfd){
+return _10;
+},function(_15,dfd){
 dfd.ioArgs._hasError=true;
 dfd.ioArgs._callNext();
-return _18;
+return _15;
 });
 _e.ioArgs._callNext=function(){
 if(!this["_calledNext"]){
@@ -153,72 +152,80 @@ try{
 if((this._currentDfd)||(this._dfdQueue.length==0)){
 return;
 }
+do{
 var dfd=this._currentDfd=this._dfdQueue.shift();
-var _1e=dfd.ioArgs;
-var _1f=_1e.args;
-_1e._contentToClean=[];
-var fn=dojo.byId(_1f["form"]);
-var _21=_1f["content"]||{};
+}while(dfd&&dfd.canceled&&this._dfdQueue.length);
+if(!dfd||dfd.canceled){
+this._currentDfd=null;
+return;
+}
+var _16=dfd.ioArgs;
+var _17=_16.args;
+_16._contentToClean=[];
+var fn=dojo.byId(_17["form"]);
+var _18=_17["content"]||{};
 if(fn){
-if(_21){
-var _22=function(_23,_24){
+if(_18){
+var _19=function(_1a,_1b){
 var tn;
 if(dojo.isIE){
-tn=dojo.doc.createElement("<input type='hidden' name='"+_23+"'>");
+tn=dojo.doc.createElement("<input type='hidden' name='"+_1a+"'>");
 }else{
 tn=dojo.doc.createElement("input");
 tn.type="hidden";
-tn.name=_23;
+tn.name=_1a;
 }
-tn.value=_24;
+tn.value=_1b;
 fn.appendChild(tn);
-_1e._contentToClean.push(_23);
+_16._contentToClean.push(_1a);
 };
-for(var x in _21){
-var val=_21[x];
+for(var x in _18){
+var val=_18[x];
 if(dojo.isArray(val)&&val.length>1){
 var i;
 for(i=0;i<val.length;i++){
-_22(x,val[i]);
+_19(x,val[i]);
 }
 }else{
 if(!fn[x]){
-_22(x,val);
+_19(x,val);
 }else{
 fn[x].value=val;
 }
 }
 }
 }
-var _29=fn.getAttributeNode("action");
-var _2a=fn.getAttributeNode("method");
-var _2b=fn.getAttributeNode("target");
-if(_1f["url"]){
-_1e._originalAction=_29?_29.value:null;
-if(_29){
-_29.value=_1f.url;
+var _1c=fn.getAttributeNode("action");
+var _1d=fn.getAttributeNode("method");
+var _1e=fn.getAttributeNode("target");
+if(_17["url"]){
+_16._originalAction=_1c?_1c.value:null;
+if(_1c){
+_1c.value=_17.url;
 }else{
-fn.setAttribute("action",_1f.url);
+fn.setAttribute("action",_17.url);
 }
 }
-if(!_2a||!_2a.value){
-if(_2a){
-_2a.value=(_1f["method"])?_1f["method"]:"post";
+if(!_1d||!_1d.value){
+if(_1d){
+_1d.value=(_17["method"])?_17["method"]:"post";
 }else{
-fn.setAttribute("method",(_1f["method"])?_1f["method"]:"post");
+fn.setAttribute("method",(_17["method"])?_17["method"]:"post");
 }
 }
-_1e._originalTarget=_2b?_2b.value:null;
-if(_2b){
-_2b.value=this._iframeName;
+_16._originalTarget=_1e?_1e.value:null;
+if(_1e){
+_1e.value=this._iframeName;
 }else{
 fn.setAttribute("target",this._iframeName);
 }
 fn.target=this._iframeName;
+dojo._ioNotifyStart(dfd);
 fn.submit();
 }else{
-var _2c=_1f.url+(_1f.url.indexOf("?")>-1?"&":"?")+_1e.query;
-this.setSrc(this._frame,_2c,true);
+var _1f=_17.url+(_17.url.indexOf("?")>-1?"&":"?")+_16.query;
+dojo._ioNotifyStart(dfd);
+this.setSrc(this._frame,_1f,true);
 }
 }
 catch(e){
@@ -230,29 +237,29 @@ if(!dfd){
 this._fireNextRequest();
 return;
 }
-var _2e=dfd.ioArgs;
-var _2f=_2e.args;
-var _30=dojo.byId(_2f.form);
-if(_30){
-var _31=_2e._contentToClean;
-for(var i=0;i<_31.length;i++){
-var key=_31[i];
-for(var j=0;j<_30.childNodes.length;j++){
-var _35=_30.childNodes[j];
-if(_35.name==key){
-dojo.destroy(_35);
+var _20=dfd.ioArgs;
+var _21=_20.args;
+var _22=dojo.byId(_21.form);
+if(_22){
+var _23=_20._contentToClean;
+for(var i=0;i<_23.length;i++){
+var key=_23[i];
+for(var j=0;j<_22.childNodes.length;j++){
+var _24=_22.childNodes[j];
+if(_24.name==key){
+dojo.destroy(_24);
 break;
 }
 }
 }
-if(_2e["_originalAction"]){
-_30.setAttribute("action",_2e._originalAction);
+if(_20["_originalAction"]){
+_22.setAttribute("action",_20._originalAction);
 }
-if(_2e["_originalTarget"]){
-_30.setAttribute("target",_2e._originalTarget);
-_30.target=_2e._originalTarget;
+if(_20["_originalTarget"]){
+_22.setAttribute("target",_20._originalTarget);
+_22.target=_20._originalTarget;
 }
 }
-_2e._finished=true;
+_20._finished=true;
 }};
 }
diff --git a/dojo/io/script.js b/dojo/io/script.js
index 585cf44..c173d87 100644
--- a/dojo/io/script.js
+++ b/dojo/io/script.js
@@ -8,72 +8,80 @@
 if(!dojo._hasResource["dojo.io.script"]){
 dojo._hasResource["dojo.io.script"]=true;
 dojo.provide("dojo.io.script");
-dojo.io.script={get:function(_1){
-var _2=this._makeScriptDeferred(_1);
-var _3=_2.ioArgs;
-dojo._ioAddQueryToUrl(_3);
-if(this._canAttach(_3)){
-this.attach(_3.id,_3.url,_1.frameDoc);
-}
-dojo._ioWatch(_2,this._validCheck,this._ioCheck,this._resHandle);
-return _2;
-},attach:function(id,_5,_6){
-var _7=(_6||dojo.doc);
-var _8=_7.createElement("script");
-_8.type="text/javascript";
-_8.src=_5;
-_8.id=id;
-_8.charset="utf-8";
-_7.getElementsByTagName("head")[0].appendChild(_8);
-},remove:function(id,_a){
-dojo.destroy(dojo.byId(id,_a));
+(function(){
+var _1=dojo.isIE?"onreadystatechange":"load",_2=/complete|loaded/;
+dojo.io.script={get:function(_3){
+var _4=this._makeScriptDeferred(_3);
+var _5=_4.ioArgs;
+dojo._ioAddQueryToUrl(_5);
+dojo._ioNotifyStart(_4);
+if(this._canAttach(_5)){
+var _6=this.attach(_5.id,_5.url,_3.frameDoc);
+if(!_5.jsonp&&!_5.args.checkString){
+var _7=dojo.connect(_6,_1,function(_8){
+if(_8.type=="load"||_2.test(_6.readyState)){
+dojo.disconnect(_7);
+_5.scriptLoaded=_8;
+}
+});
+}
+}
+dojo._ioWatch(_4,this._validCheck,this._ioCheck,this._resHandle);
+return _4;
+},attach:function(id,_9,_a){
+var _b=(_a||dojo.doc);
+var _c=_b.createElement("script");
+_c.type="text/javascript";
+_c.src=_9;
+_c.id=id;
+_c.charset="utf-8";
+return _b.getElementsByTagName("head")[0].appendChild(_c);
+},remove:function(id,_d){
+dojo.destroy(dojo.byId(id,_d));
 if(this["jsonp_"+id]){
 delete this["jsonp_"+id];
 }
-},_makeScriptDeferred:function(_b){
-var _c=dojo._ioSetArgs(_b,this._deferredCancel,this._deferredOk,this._deferredError);
-var _d=_c.ioArgs;
-_d.id=dojo._scopeName+"IoScript"+(this._counter++);
-_d.canDelete=false;
-if(_b.callbackParamName){
-_d.query=_d.query||"";
-if(_d.query.length>0){
-_d.query+="&";
-}
-_d.query+=_b.callbackParamName+"="+(_b.frameDoc?"parent.":"")+dojo._scopeName+".io.script.jsonp_"+_d.id+"._jsonpCallback";
-_d.frameDoc=_b.frameDoc;
-_d.canDelete=true;
-_c._jsonpCallback=this._jsonpCallback;
-this["jsonp_"+_d.id]=_c;
-}
-return _c;
-},_deferredCancel:function(_e){
-_e.canceled=true;
-if(_e.ioArgs.canDelete){
-dojo.io.script._addDeadScript(_e.ioArgs);
-}
-},_deferredOk:function(_f){
-if(_f.ioArgs.canDelete){
-dojo.io.script._addDeadScript(_f.ioArgs);
-}
-if(_f.ioArgs.json){
-return _f.ioArgs.json;
-}else{
-return _f.ioArgs;
+},_makeScriptDeferred:function(_e){
+var _f=dojo._ioSetArgs(_e,this._deferredCancel,this._deferredOk,this._deferredError);
+var _10=_f.ioArgs;
+_10.id=dojo._scopeName+"IoScript"+(this._counter++);
+_10.canDelete=false;
+_10.jsonp=_e.callbackParamName||_e.jsonp;
+if(_10.jsonp){
+_10.query=_10.query||"";
+if(_10.query.length>0){
+_10.query+="&";
+}
+_10.query+=_10.jsonp+"="+(_e.frameDoc?"parent.":"")+dojo._scopeName+".io.script.jsonp_"+_10.id+"._jsonpCallback";
+_10.frameDoc=_e.frameDoc;
+_10.canDelete=true;
+_f._jsonpCallback=this._jsonpCallback;
+this["jsonp_"+_10.id]=_f;
 }
-},_deferredError:function(_10,dfd){
+return _f;
+},_deferredCancel:function(dfd){
+dfd.canceled=true;
 if(dfd.ioArgs.canDelete){
-if(_10.dojoType=="timeout"){
+dojo.io.script._addDeadScript(dfd.ioArgs);
+}
+},_deferredOk:function(dfd){
+var _11=dfd.ioArgs;
+if(_11.canDelete){
+dojo.io.script._addDeadScript(_11);
+}
+return _11.json||_11.scriptLoaded||_11;
+},_deferredError:function(_12,dfd){
+if(dfd.ioArgs.canDelete){
+if(_12.dojoType=="timeout"){
 dojo.io.script.remove(dfd.ioArgs.id,dfd.ioArgs.frameDoc);
 }else{
 dojo.io.script._addDeadScript(dfd.ioArgs);
 }
 }
-
-return _10;
-},_deadScripts:[],_counter:1,_addDeadScript:function(_12){
-dojo.io.script._deadScripts.push({id:_12.id,frameDoc:_12.frameDoc});
-_12.frameDoc=null;
+return _12;
+},_deadScripts:[],_counter:1,_addDeadScript:function(_13){
+dojo.io.script._deadScripts.push({id:_13.id,frameDoc:_13.frameDoc});
+_13.frameDoc=null;
 },_validCheck:function(dfd){
 var _14=dojo.io.script;
 var _15=_14._deadScripts;
@@ -86,11 +94,12 @@ dojo.io.script._deadScripts=[];
 }
 return true;
 },_ioCheck:function(dfd){
-if(dfd.ioArgs.json){
+var _16=dfd.ioArgs;
+if(_16.json||(_16.scriptLoaded&&!_16.args.checkString)){
 return true;
 }
-var _18=dfd.ioArgs.args.checkString;
-if(_18&&eval("typeof("+_18+") != 'undefined'")){
+var _17=_16.args.checkString;
+if(_17&&eval("typeof("+_17+") != 'undefined'")){
 return true;
 }
 return false;
@@ -100,9 +109,10 @@ dfd.callback(dfd);
 }else{
 dfd.errback(new Error("inconceivable dojo.io.script._resHandle error"));
 }
-},_canAttach:function(_1a){
+},_canAttach:function(_18){
 return true;
-},_jsonpCallback:function(_1b){
-this.ioArgs.json=_1b;
+},_jsonpCallback:function(_19){
+this.ioArgs.json=_19;
 }};
+})();
 }
diff --git a/dojo/number.js b/dojo/number.js
index d748d72..7bb1129 100644
--- a/dojo/number.js
+++ b/dojo/number.js
@@ -77,230 +77,230 @@ return _15(v,p,m)+(v>0?d:-d);
 };
 })();
 }
-dojo.number._formatAbsolute=function(_1b,_1c,_1d){
-_1d=_1d||{};
-if(_1d.places===true){
-_1d.places=0;
-}
-if(_1d.places===Infinity){
-_1d.places=6;
-}
-var _1e=_1c.split(".");
-var _1f=(_1d.places>=0)?_1d.places:(_1e[1]&&_1e[1].length)||0;
-if(!(_1d.round<0)){
-_1b=dojo.number.round(_1b,_1f,_1d.round);
-}
-var _20=String(Math.abs(_1b)).split(".");
-var _21=_20[1]||"";
-if(_1d.places){
-var _22=dojo.isString(_1d.places)&&_1d.places.indexOf(",");
-if(_22){
-_1d.places=_1d.places.substring(_22+1);
-}
-_20[1]=dojo.string.pad(_21.substr(0,_1d.places),_1d.places,"0",true);
+dojo.number._formatAbsolute=function(_16,_17,_18){
+_18=_18||{};
+if(_18.places===true){
+_18.places=0;
+}
+if(_18.places===Infinity){
+_18.places=6;
+}
+var _19=_17.split(".");
+var _1a=(_18.places>=0)?_18.places:(_19[1]&&_19[1].length)||0;
+if(!(_18.round<0)){
+_16=dojo.number.round(_16,_1a,_18.round);
+}
+var _1b=String(Math.abs(_16)).split(".");
+var _1c=_1b[1]||"";
+if(_18.places){
+var _1d=dojo.isString(_18.places)&&_18.places.indexOf(",");
+if(_1d){
+_18.places=_18.places.substring(_1d+1);
+}
+_1b[1]=dojo.string.pad(_1c.substr(0,_18.places),_18.places,"0",true);
 }else{
-if(_1e[1]&&_1d.places!==0){
-var pad=_1e[1].lastIndexOf("0")+1;
-if(pad>_21.length){
-_20[1]=dojo.string.pad(_21,pad,"0",true);
+if(_19[1]&&_18.places!==0){
+var pad=_19[1].lastIndexOf("0")+1;
+if(pad>_1c.length){
+_1b[1]=dojo.string.pad(_1c,pad,"0",true);
 }
-var _24=_1e[1].length;
-if(_24<_21.length){
-_20[1]=_21.substr(0,_24);
+var _1e=_19[1].length;
+if(_1e<_1c.length){
+_1b[1]=_1c.substr(0,_1e);
 }
 }else{
-if(_20[1]){
-_20.pop();
+if(_1b[1]){
+_1b.pop();
 }
 }
 }
-var _25=_1e[0].replace(",","");
-pad=_25.indexOf("0");
+var _1f=_19[0].replace(",","");
+pad=_1f.indexOf("0");
 if(pad!=-1){
-pad=_25.length-pad;
-if(pad>_20[0].length){
-_20[0]=dojo.string.pad(_20[0],pad);
+pad=_1f.length-pad;
+if(pad>_1b[0].length){
+_1b[0]=dojo.string.pad(_1b[0],pad);
 }
-if(_25.indexOf("#")==-1){
-_20[0]=_20[0].substr(_20[0].length-pad);
+if(_1f.indexOf("#")==-1){
+_1b[0]=_1b[0].substr(_1b[0].length-pad);
 }
 }
-var _26=_1e[0].lastIndexOf(",");
-var _27,_28;
-if(_26!=-1){
-_27=_1e[0].length-_26-1;
-var _29=_1e[0].substr(0,_26);
-_26=_29.lastIndexOf(",");
-if(_26!=-1){
-_28=_29.length-_26-1;
+var _20=_19[0].lastIndexOf(",");
+var _21,_22;
+if(_20!=-1){
+_21=_19[0].length-_20-1;
+var _23=_19[0].substr(0,_20);
+_20=_23.lastIndexOf(",");
+if(_20!=-1){
+_22=_23.length-_20-1;
 }
 }
-var _2a=[];
-for(var _2b=_20[0];_2b;){
-var off=_2b.length-_27;
-_2a.push((off>0)?_2b.substr(off):_2b);
-_2b=(off>0)?_2b.slice(0,off):"";
-if(_28){
-_27=_28;
-delete _28;
+var _24=[];
+for(var _25=_1b[0];_25;){
+var off=_25.length-_21;
+_24.push((off>0)?_25.substr(off):_25);
+_25=(off>0)?_25.slice(0,off):"";
+if(_22){
+_21=_22;
+delete _22;
 }
 }
-_20[0]=_2a.reverse().join(_1d.group||",");
-return _20.join(_1d.decimal||".");
+_1b[0]=_24.reverse().join(_18.group||",");
+return _1b.join(_18.decimal||".");
 };
-dojo.number.regexp=function(_2d){
-return dojo.number._parseInfo(_2d).regexp;
+dojo.number.regexp=function(_26){
+return dojo.number._parseInfo(_26).regexp;
 };
-dojo.number._parseInfo=function(_2e){
-_2e=_2e||{};
-var _2f=dojo.i18n.normalizeLocale(_2e.locale);
-var _30=dojo.i18n.getLocalization("dojo.cldr","number",_2f);
-var _31=_2e.pattern||_30[(_2e.type||"decimal")+"Format"];
-var _32=_30.group;
-var _33=_30.decimal;
-var _34=1;
-if(_31.indexOf("%")!=-1){
-_34/=100;
+dojo.number._parseInfo=function(_27){
+_27=_27||{};
+var _28=dojo.i18n.normalizeLocale(_27.locale);
+var _29=dojo.i18n.getLocalization("dojo.cldr","number",_28);
+var _2a=_27.pattern||_29[(_27.type||"decimal")+"Format"];
+var _2b=_29.group;
+var _2c=_29.decimal;
+var _2d=1;
+if(_2a.indexOf("%")!=-1){
+_2d/=100;
 }else{
-if(_31.indexOf("‰")!=-1){
-_34/=1000;
+if(_2a.indexOf("‰")!=-1){
+_2d/=1000;
 }else{
-var _35=_31.indexOf("¤")!=-1;
-if(_35){
-_32=_30.currencyGroup||_32;
-_33=_30.currencyDecimal||_33;
+var _2e=_2a.indexOf("¤")!=-1;
+if(_2e){
+_2b=_29.currencyGroup||_2b;
+_2c=_29.currencyDecimal||_2c;
 }
 }
 }
-var _36=_31.split(";");
-if(_36.length==1){
-_36.push("-"+_36[0]);
+var _2f=_2a.split(";");
+if(_2f.length==1){
+_2f.push("-"+_2f[0]);
 }
-var re=dojo.regexp.buildGroupRE(_36,function(_38){
-_38="(?:"+dojo.regexp.escapeString(_38,".")+")";
-return _38.replace(dojo.number._numberPatternRE,function(_39){
-var _3a={signed:false,separator:_2e.strict?_32:[_32,""],fractional:_2e.fractional,decimal:_33,exponent:false};
-var _3b=_39.split(".");
-var _3c=_2e.places;
-if(_3b.length==1||_3c===0){
-_3a.fractional=false;
+var re=dojo.regexp.buildGroupRE(_2f,function(_30){
+_30="(?:"+dojo.regexp.escapeString(_30,".")+")";
+return _30.replace(dojo.number._numberPatternRE,function(_31){
+var _32={signed:false,separator:_27.strict?_2b:[_2b,""],fractional:_27.fractional,decimal:_2c,exponent:false};
+var _33=_31.split(".");
+var _34=_27.places;
+if(_33.length==1||_34===0){
+_32.fractional=false;
 }else{
-if(_3c===undefined){
-_3c=_2e.pattern?_3b[1].lastIndexOf("0")+1:Infinity;
+if(_34===undefined){
+_34=_27.pattern?_33[1].lastIndexOf("0")+1:Infinity;
 }
-if(_3c&&_2e.fractional==undefined){
-_3a.fractional=true;
+if(_34&&_27.fractional==undefined){
+_32.fractional=true;
 }
-if(!_2e.places&&(_3c<_3b[1].length)){
-_3c+=","+_3b[1].length;
+if(!_27.places&&(_34<_33[1].length)){
+_34+=","+_33[1].length;
 }
-_3a.places=_3c;
+_32.places=_34;
 }
-var _3d=_3b[0].split(",");
-if(_3d.length>1){
-_3a.groupSize=_3d.pop().length;
-if(_3d.length>1){
-_3a.groupSize2=_3d.pop().length;
+var _35=_33[0].split(",");
+if(_35.length>1){
+_32.groupSize=_35.pop().length;
+if(_35.length>1){
+_32.groupSize2=_35.pop().length;
 }
 }
-return "("+dojo.number._realNumberRegexp(_3a)+")";
+return "("+dojo.number._realNumberRegexp(_32)+")";
 });
 },true);
-if(_35){
-re=re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g,function(_3e,_3f,_40,_41){
-var _42=["symbol","currency","displayName"][_40.length-1];
-var _43=dojo.regexp.escapeString(_2e[_42]||_2e.currency||"");
-_3f=_3f?"[\\s\\xa0]":"";
-_41=_41?"[\\s\\xa0]":"";
-if(!_2e.strict){
-if(_3f){
-_3f+="*";
-}
-if(_41){
-_41+="*";
-}
-return "(?:"+_3f+_43+_41+")?";
-}
-return _3f+_43+_41;
+if(_2e){
+re=re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g,function(_36,_37,_38,_39){
+var _3a=["symbol","currency","displayName"][_38.length-1];
+var _3b=dojo.regexp.escapeString(_27[_3a]||_27.currency||"");
+_37=_37?"[\\s\\xa0]":"";
+_39=_39?"[\\s\\xa0]":"";
+if(!_27.strict){
+if(_37){
+_37+="*";
+}
+if(_39){
+_39+="*";
+}
+return "(?:"+_37+_3b+_39+")?";
+}
+return _37+_3b+_39;
 });
 }
-return {regexp:re.replace(/[\xa0 ]/g,"[\\s\\xa0]"),group:_32,decimal:_33,factor:_34};
+return {regexp:re.replace(/[\xa0 ]/g,"[\\s\\xa0]"),group:_2b,decimal:_2c,factor:_2d};
 };
-dojo.number.parse=function(_44,_45){
-var _46=dojo.number._parseInfo(_45);
-var _47=(new RegExp("^"+_46.regexp+"$")).exec(_44);
-if(!_47){
+dojo.number.parse=function(_3c,_3d){
+var _3e=dojo.number._parseInfo(_3d);
+var _3f=(new RegExp("^"+_3e.regexp+"$")).exec(_3c);
+if(!_3f){
 return NaN;
 }
-var _48=_47[1];
-if(!_47[1]){
-if(!_47[2]){
+var _40=_3f[1];
+if(!_3f[1]){
+if(!_3f[2]){
 return NaN;
 }
-_48=_47[2];
-_46.factor*=-1;
+_40=_3f[2];
+_3e.factor*=-1;
 }
-_48=_48.replace(new RegExp("["+_46.group+"\\s\\xa0"+"]","g"),"").replace(_46.decimal,".");
-return _48*_46.factor;
+_40=_40.replace(new RegExp("["+_3e.group+"\\s\\xa0"+"]","g"),"").replace(_3e.decimal,".");
+return _40*_3e.factor;
 };
-dojo.number._realNumberRegexp=function(_49){
-_49=_49||{};
-if(!("places" in _49)){
-_49.places=Infinity;
+dojo.number._realNumberRegexp=function(_41){
+_41=_41||{};
+if(!("places" in _41)){
+_41.places=Infinity;
 }
-if(typeof _49.decimal!="string"){
-_49.decimal=".";
+if(typeof _41.decimal!="string"){
+_41.decimal=".";
 }
-if(!("fractional" in _49)||/^0/.test(_49.places)){
-_49.fractional=[true,false];
+if(!("fractional" in _41)||/^0/.test(_41.places)){
+_41.fractional=[true,false];
 }
-if(!("exponent" in _49)){
-_49.exponent=[true,false];
+if(!("exponent" in _41)){
+_41.exponent=[true,false];
 }
-if(!("eSigned" in _49)){
-_49.eSigned=[true,false];
+if(!("eSigned" in _41)){
+_41.eSigned=[true,false];
 }
-var _4a=dojo.number._integerRegexp(_49);
-var _4b=dojo.regexp.buildGroupRE(_49.fractional,function(q){
+var _42=dojo.number._integerRegexp(_41);
+var _43=dojo.regexp.buildGroupRE(_41.fractional,function(q){
 var re="";
-if(q&&(_49.places!==0)){
-re="\\"+_49.decimal;
-if(_49.places==Infinity){
+if(q&&(_41.places!==0)){
+re="\\"+_41.decimal;
+if(_41.places==Infinity){
 re="(?:"+re+"\\d+)?";
 }else{
-re+="\\d{"+_49.places+"}";
+re+="\\d{"+_41.places+"}";
 }
 }
 return re;
 },true);
-var _4e=dojo.regexp.buildGroupRE(_49.exponent,function(q){
+var _44=dojo.regexp.buildGroupRE(_41.exponent,function(q){
 if(q){
-return "([eE]"+dojo.number._integerRegexp({signed:_49.eSigned})+")";
+return "([eE]"+dojo.number._integerRegexp({signed:_41.eSigned})+")";
 }
 return "";
 });
-var _50=_4a+_4b;
-if(_4b){
-_50="(?:(?:"+_50+")|(?:"+_4b+"))";
+var _45=_42+_43;
+if(_43){
+_45="(?:(?:"+_45+")|(?:"+_43+"))";
 }
-return _50+_4e;
+return _45+_44;
 };
-dojo.number._integerRegexp=function(_51){
-_51=_51||{};
-if(!("signed" in _51)){
-_51.signed=[true,false];
+dojo.number._integerRegexp=function(_46){
+_46=_46||{};
+if(!("signed" in _46)){
+_46.signed=[true,false];
 }
-if(!("separator" in _51)){
-_51.separator="";
+if(!("separator" in _46)){
+_46.separator="";
 }else{
-if(!("groupSize" in _51)){
-_51.groupSize=3;
+if(!("groupSize" in _46)){
+_46.groupSize=3;
 }
 }
-var _52=dojo.regexp.buildGroupRE(_51.signed,function(q){
+var _47=dojo.regexp.buildGroupRE(_46.signed,function(q){
 return q?"[-+]":"";
 },true);
-var _54=dojo.regexp.buildGroupRE(_51.separator,function(sep){
+var _48=dojo.regexp.buildGroupRE(_46.separator,function(sep){
 if(!sep){
 return "(?:\\d+)";
 }
@@ -312,13 +312,13 @@ if(sep==" "){
 sep="\\s\\xa0";
 }
 }
-var grp=_51.groupSize,_57=_51.groupSize2;
-if(_57){
-var _58="(?:0|[1-9]\\d{0,"+(_57-1)+"}(?:["+sep+"]\\d{"+_57+"})*["+sep+"]\\d{"+grp+"})";
-return ((grp-_57)>0)?"(?:"+_58+"|(?:0|[1-9]\\d{0,"+(grp-1)+"}))":_58;
+var grp=_46.groupSize,_49=_46.groupSize2;
+if(_49){
+var _4a="(?:0|[1-9]\\d{0,"+(_49-1)+"}(?:["+sep+"]\\d{"+_49+"})*["+sep+"]\\d{"+grp+"})";
+return ((grp-_49)>0)?"(?:"+_4a+"|(?:0|[1-9]\\d{0,"+(grp-1)+"}))":_4a;
 }
 return "(?:0|[1-9]\\d{0,"+(grp-1)+"}(?:["+sep+"]\\d{"+grp+"})*)";
 },true);
-return _52+_54;
+return _47+_48;
 };
 }
diff --git a/dojo/parser.js b/dojo/parser.js
index 0302637..d7c753e 100644
--- a/dojo/parser.js
+++ b/dojo/parser.js
@@ -11,218 +11,212 @@ dojo.provide("dojo.parser");
 dojo.require("dojo.date.stamp");
 dojo.parser=new function(){
 var d=dojo;
-var _2=d._scopeName+"Type";
-var _3="["+_2+"]";
-var _4=0,_5={};
-var _6=function(_7,_8){
-var _9=_8||_5;
-if(dojo.isIE){
-var cn=_7["__dojoNameCache"];
-if(cn&&_9[cn]===_7){
-return cn;
-}
-}
-var _b;
-do{
-_b="__"+_4++;
-}while(_b in _9);
-_9[_b]=_7;
-return _b;
-};
-function _c(_d){
-if(d.isString(_d)){
+this._attrName=d._scopeName+"Type";
+this._query="["+this._attrName+"]";
+function _1(_2){
+if(d.isString(_2)){
 return "string";
 }
-if(typeof _d=="number"){
+if(typeof _2=="number"){
 return "number";
 }
-if(typeof _d=="boolean"){
+if(typeof _2=="boolean"){
 return "boolean";
 }
-if(d.isFunction(_d)){
+if(d.isFunction(_2)){
 return "function";
 }
-if(d.isArray(_d)){
+if(d.isArray(_2)){
 return "array";
 }
-if(_d instanceof Date){
+if(_2 instanceof Date){
 return "date";
 }
-if(_d instanceof d._Url){
+if(_2 instanceof d._Url){
 return "url";
 }
 return "object";
 };
-function _e(_f,_10){
-switch(_10){
+function _3(_4,_5){
+switch(_5){
 case "string":
-return _f;
+return _4;
 case "number":
-return _f.length?Number(_f):NaN;
+return _4.length?Number(_4):NaN;
 case "boolean":
-return typeof _f=="boolean"?_f:!(_f.toLowerCase()=="false");
+return typeof _4=="boolean"?_4:!(_4.toLowerCase()=="false");
 case "function":
-if(d.isFunction(_f)){
-_f=_f.toString();
-_f=d.trim(_f.substring(_f.indexOf("{")+1,_f.length-1));
+if(d.isFunction(_4)){
+_4=_4.toString();
+_4=d.trim(_4.substring(_4.indexOf("{")+1,_4.length-1));
 }
 try{
-if(_f.search(/[^\w\.]+/i)!=-1){
-_f=_6(new Function(_f),this);
+if(_4.search(/[^\w\.]+/i)!=-1){
+return new Function(_4);
+}else{
+return d.getObject(_4,false);
 }
-return d.getObject(_f,false);
 }
 catch(e){
 return new Function();
 }
 case "array":
-return _f?_f.split(/\s*,\s*/):[];
+return _4?_4.split(/\s*,\s*/):[];
 case "date":
-switch(_f){
+switch(_4){
 case "":
 return new Date("");
 case "now":
 return new Date();
 default:
-return d.date.stamp.fromISOString(_f);
+return d.date.stamp.fromISOString(_4);
 }
 case "url":
-return d.baseUrl+_f;
+return d.baseUrl+_4;
 default:
-return d.fromJson(_f);
+return d.fromJson(_4);
 }
 };
-var _11={};
-function _12(_13){
-if(!_11[_13]){
-var cls=d.getObject(_13);
-if(!d.isFunction(cls)){
-throw new Error("Could not load class '"+_13+"'. Did you spell the name correctly and use a full path, like 'dijit.form.Button'?");
-}
-var _15=cls.prototype;
-var _16={},_17={};
-for(var _18 in _15){
-if(_18.charAt(0)=="_"){
+var _6={};
+dojo.connect(dojo,"extend",function(){
+_6={};
+});
+function _7(_8){
+if(!_6[_8]){
+var _9=d.getObject(_8);
+if(!d.isFunction(_9)){
+throw new Error("Could not load class '"+_8+"'. Did you spell the name correctly and use a full path, like 'dijit.form.Button'?");
+}
+var _a=_9.prototype;
+var _b={},_c={};
+for(var _d in _a){
+if(_d.charAt(0)=="_"){
 continue;
 }
-if(_18 in _17){
+if(_d in _c){
 continue;
 }
-var _19=_15[_18];
-_16[_18]=_c(_19);
+var _e=_a[_d];
+_b[_d]=_1(_e);
 }
-_11[_13]={cls:cls,params:_16};
+_6[_8]={cls:_9,params:_b};
 }
-return _11[_13];
+return _6[_8];
 };
-this._functionFromScript=function(_1a){
-var _1b="";
-var _1c="";
-var _1d=_1a.getAttribute("args");
-if(_1d){
-d.forEach(_1d.split(/\s*,\s*/),function(_1e,idx){
-_1b+="var "+_1e+" = arguments["+idx+"]; ";
+this._functionFromScript=function(_f){
+var _10="";
+var _11="";
+var _12=_f.getAttribute("args");
+if(_12){
+d.forEach(_12.split(/\s*,\s*/),function(_13,idx){
+_10+="var "+_13+" = arguments["+idx+"]; ";
 });
 }
-var _20=_1a.getAttribute("with");
-if(_20&&_20.length){
-d.forEach(_20.split(/\s*,\s*/),function(_21){
-_1b+="with("+_21+"){";
-_1c+="}";
+var _14=_f.getAttribute("with");
+if(_14&&_14.length){
+d.forEach(_14.split(/\s*,\s*/),function(_15){
+_10+="with("+_15+"){";
+_11+="}";
 });
 }
-return new Function(_1b+_1a.innerHTML+_1c);
+return new Function(_10+_f.innerHTML+_11);
 };
-this.instantiate=function(_22,_23){
-var _24=[];
-_23=_23||{};
-d.forEach(_22,function(_25){
-if(!_25){
+this.instantiate=function(_16,_17,_18){
+var _19=[],dp=dojo.parser;
+_17=_17||{};
+_18=_18||{};
+d.forEach(_16,function(_1a){
+if(!_1a){
 return;
 }
-var _26=_2 in _23?_23[_2]:_25.getAttribute(_2);
-if(!_26||!_26.length){
+var _1b=dp._attrName in _17?_17[dp._attrName]:_1a.getAttribute(dp._attrName);
+if(!_1b||!_1b.length){
 return;
 }
-var _27=_12(_26),_28=_27.cls,ps=_28._noScript||_28.prototype._noScript;
-var _2a={},_2b=_25.attributes;
-for(var _2c in _27.params){
-var _2d=_2c in _23?{value:_23[_2c],specified:true}:_2b.getNamedItem(_2c);
-if(!_2d||(!_2d.specified&&(!dojo.isIE||_2c.toLowerCase()!="value"))){
+var _1c=_7(_1b),_1d=_1c.cls,ps=_1d._noScript||_1d.prototype._noScript;
+var _1e={},_1f=_1a.attributes;
+for(var _20 in _1c.params){
+var _21=_20 in _17?{value:_17[_20],specified:true}:_1f.getNamedItem(_20);
+if(!_21||(!_21.specified&&(!dojo.isIE||_20.toLowerCase()!="value"))){
 continue;
 }
-var _2e=_2d.value;
-switch(_2c){
+var _22=_21.value;
+switch(_20){
 case "class":
-_2e="className" in _23?_23.className:_25.className;
+_22="className" in _17?_17.className:_1a.className;
 break;
 case "style":
-_2e="style" in _23?_23.style:(_25.style&&_25.style.cssText);
+_22="style" in _17?_17.style:(_1a.style&&_1a.style.cssText);
 }
-var _2f=_27.params[_2c];
-if(typeof _2e=="string"){
-_2a[_2c]=_e(_2e,_2f);
+var _23=_1c.params[_20];
+if(typeof _22=="string"){
+_1e[_20]=_3(_22,_23);
 }else{
-_2a[_2c]=_2e;
+_1e[_20]=_22;
 }
 }
 if(!ps){
-var _30=[],_31=[];
-d.query("> script[type^='dojo/']",_25).orphan().forEach(function(_32){
-var _33=_32.getAttribute("event"),_26=_32.getAttribute("type"),nf=d.parser._functionFromScript(_32);
-if(_33){
-if(_26=="dojo/connect"){
-_30.push({event:_33,func:nf});
+var _24=[],_25=[];
+d.query("> script[type^='dojo/']",_1a).orphan().forEach(function(_26){
+var _27=_26.getAttribute("event"),_1b=_26.getAttribute("type"),nf=d.parser._functionFromScript(_26);
+if(_27){
+if(_1b=="dojo/connect"){
+_24.push({event:_27,func:nf});
 }else{
-_2a[_33]=nf;
+_1e[_27]=nf;
 }
 }else{
-_31.push(nf);
+_25.push(nf);
 }
 });
 }
-var _35=_28["markupFactory"];
-if(!_35&&_28["prototype"]){
-_35=_28.prototype["markupFactory"];
-}
-var _36=_35?_35(_2a,_25,_28):new _28(_2a,_25);
-_24.push(_36);
-var _37=_25.getAttribute("jsId");
-if(_37){
-d.setObject(_37,_36);
+var _28=_1d.markupFactory||_1d.prototype&&_1d.prototype.markupFactory;
+var _29=_28?_28(_1e,_1a,_1d):new _1d(_1e,_1a);
+_19.push(_29);
+var _2a=_1a.getAttribute("jsId");
+if(_2a){
+d.setObject(_2a,_29);
 }
 if(!ps){
-d.forEach(_30,function(_38){
-d.connect(_36,_38.event,null,_38.func);
+d.forEach(_24,function(_2b){
+d.connect(_29,_2b.event,null,_2b.func);
 });
-d.forEach(_31,function(_39){
-_39.call(_36);
+d.forEach(_25,function(_2c){
+_2c.call(_29);
 });
 }
 });
-d.forEach(_24,function(_3a){
-if(_3a&&_3a.startup&&!_3a._started&&(!_3a.getParent||!_3a.getParent())){
-_3a.startup();
+if(!_17._started){
+d.forEach(_19,function(_2d){
+if(!_18.noStart&&_2d&&_2d.startup&&!_2d._started&&(!_2d.getParent||!_2d.getParent())){
+_2d.startup();
 }
 });
-return _24;
+}
+return _19;
 };
-this.parse=function(_3b){
-var _3c=d.query(_3,_3b);
-var _3d=this.instantiate(_3c);
-return _3d;
+this.parse=function(_2e,_2f){
+var _30;
+if(!_2f&&_2e&&_2e.rootNode){
+_2f=_2e;
+_30=_2f.rootNode;
+}else{
+_30=_2e;
+}
+var _31=d.query(this._query,_30);
+return this.instantiate(_31,null,_2f);
 };
 }();
 (function(){
-var _3e=function(){
-if(dojo.config["parseOnLoad"]==true){
+var _32=function(){
+if(dojo.config.parseOnLoad){
 dojo.parser.parse();
 }
 };
 if(dojo.exists("dijit.wai.onload")&&(dijit.wai.onload===dojo._loaders[0])){
-dojo._loaders.splice(1,0,_3e);
+dojo._loaders.splice(1,0,_32);
 }else{
-dojo._loaders.unshift(_3e);
+dojo._loaders.unshift(_32);
 }
 })();
 }
diff --git a/dojo/regexp.js b/dojo/regexp.js
index 7018bad..834c72d 100644
--- a/dojo/regexp.js
+++ b/dojo/regexp.js
@@ -16,17 +16,17 @@ return ch;
 return "\\"+ch;
 });
 };
-dojo.regexp.buildGroupRE=function(_4,re,_6){
-if(!(_4 instanceof Array)){
-return re(_4);
+dojo.regexp.buildGroupRE=function(_3,re,_4){
+if(!(_3 instanceof Array)){
+return re(_3);
 }
 var b=[];
-for(var i=0;i<_4.length;i++){
-b.push(re(_4[i]));
+for(var i=0;i<_3.length;i++){
+b.push(re(_3[i]));
 }
-return dojo.regexp.group(b.join("|"),_6);
+return dojo.regexp.group(b.join("|"),_4);
 };
-dojo.regexp.group=function(_9,_a){
-return "("+(_a?"?:":"")+_9+")";
+dojo.regexp.group=function(_5,_6){
+return "("+(_6?"?:":"")+_5+")";
 };
 }
diff --git a/dojo/resources/dnd.css b/dojo/resources/dnd.css
index 8bf39e7..def28fc 100644
--- a/dojo/resources/dnd.css
+++ b/dojo/resources/dnd.css
@@ -7,3 +7,8 @@
 .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;}
+.dojoDndHandle {cursor: move;}
+.dojoDndIgnore {cursor: default;}
+.dijit_a11y .dojoDndAvatar { font-size: 1em; font-weight:bold;}
+.dijit_a11y .dojoDndAvatarHeader td {padding-left:2px !important;}
+.dijit_a11y .dojoDndAvatarHeader td span {padding-right: 5px;}
diff --git a/dojo/resources/iframe_history.html b/dojo/resources/iframe_history.html
index aee368f..8f28f51 100644
--- a/dojo/resources/iframe_history.html
+++ b/dojo/resources/iframe_history.html
@@ -4,7 +4,7 @@
 <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>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 	<script type="text/javascript">
 	// <!--
 	var noInit = false;
diff --git a/dojo/resources/images/dndNoCopy.png b/dojo/resources/images/dndNoCopy.png
index 87f3aa0..998c2f2 100644
Binary files a/dojo/resources/images/dndNoCopy.png and b/dojo/resources/images/dndNoCopy.png differ
diff --git a/dojo/resources/images/dndNoMove.png b/dojo/resources/images/dndNoMove.png
index d75ed86..e909173 100644
Binary files a/dojo/resources/images/dndNoMove.png and b/dojo/resources/images/dndNoMove.png differ
diff --git a/dojo/robot.js b/dojo/robot.js
index 2703058..89949cb 100644
--- a/dojo/robot.js
+++ b/dojo/robot.js
@@ -11,37 +11,32 @@ dojo.provide("dojo.robot");
 dojo.experimental("dojo.robot");
 dojo.require("doh.robot");
 (function(){
-dojo.mixin(doh.robot,{_scrollIntoView:function(_1){
-if(typeof _1=="function"){
-_1=_1();
+dojo.mixin(doh.robot,{_resolveNode:function(n){
+if(typeof n=="function"){
+n=n();
 }
+return n?dojo.byId(n):null;
+},_scrollIntoView:function(_1){
 _1.scrollIntoView(false);
+},_position:function(n){
+return dojo.position(n,false);
 },scrollIntoView:function(_2,_3){
 doh.robot.sequence(function(){
-doh.robot._scrollIntoView(_2);
+doh.robot._scrollIntoView(doh.robot._resolveNode(_2));
 },_3);
 },mouseMoveAt:function(_4,_5,_6,_7,_8){
 doh.robot._assertRobot();
 _6=_6||100;
 this.sequence(function(){
-if(typeof _4=="function"){
-_4=_4();
-}
-if(!_4){
-return;
-}
-_4=dojo.byId(_4);
+_4=doh.robot._resolveNode(_4);
+doh.robot._scrollIntoView(_4);
+var _9=doh.robot._position(_4);
 if(_8===undefined){
-var _9=dojo.contentBox(_4);
 _7=_9.w/2;
 _8=_9.h/2;
 }
-var x=_7;
-var y=_8;
-doh.robot._scrollIntoView(_4);
-var c=dojo.coords(_4);
-x+=c.x;
-y+=c.y;
+var x=_9.x+_7;
+var y=_9.y+_8;
 doh.robot._mouseMove(x,y,false,_6);
 },_5,_6);
 }});
diff --git a/dojo/rpc/RpcService.js b/dojo/rpc/RpcService.js
index 1eb10bb..f7f546a 100644
--- a/dojo/rpc/RpcService.js
+++ b/dojo/rpc/RpcService.js
@@ -43,37 +43,37 @@ return function(_6){
 _5.errback(_6.message);
 };
 },resultCallback:function(_7){
-var tf=dojo.hitch(this,function(_9){
-if(_9.error!=null){
-var _a;
-if(typeof _9.error=="object"){
-_a=new Error(_9.error.message);
-_a.code=_9.error.code;
-_a.error=_9.error.error;
+var tf=dojo.hitch(this,function(_8){
+if(_8.error!=null){
+var _9;
+if(typeof _8.error=="object"){
+_9=new Error(_8.error.message);
+_9.code=_8.error.code;
+_9.error=_8.error.error;
 }else{
-_a=new Error(_9.error);
+_9=new Error(_8.error);
 }
-_a.id=_9.id;
-_a.errorObject=_9;
-_7.errback(_a);
+_9.id=_8.id;
+_9.errorObject=_8;
+_7.errback(_9);
 }else{
-_7.callback(this.parseResults(_9));
+_7.callback(this.parseResults(_8));
 }
 });
 return tf;
-},generateMethod:function(_b,_c,_d){
+},generateMethod:function(_a,_b,_c){
 return dojo.hitch(this,function(){
-var _e=new dojo.Deferred();
-if((this.strictArgChecks)&&(_c!=null)&&(arguments.length!=_c.length)){
+var _d=new dojo.Deferred();
+if((this.strictArgChecks)&&(_b!=null)&&(arguments.length!=_b.length)){
 throw new Error("Invalid number of parameters for remote method.");
 }else{
-this.bind(_b,dojo._toArray(arguments),_e,_d);
+this.bind(_a,dojo._toArray(arguments),_d,_c);
 }
-return _e;
+return _d;
 });
-},processSmd:function(_f){
-if(_f.methods){
-dojo.forEach(_f.methods,function(m){
+},processSmd:function(_e){
+if(_e.methods){
+dojo.forEach(_e.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])){
@@ -82,8 +82,8 @@ throw new Error("RpcService: Failed to create"+m.name+"()");
 }
 },this);
 }
-this.serviceUrl=_f.serviceUrl||_f.serviceURL;
-this.required=_f.required;
-this.smd=_f;
+this.serviceUrl=_e.serviceUrl||_e.serviceURL;
+this.required=_e.required;
+this.smd=_e;
 }});
 }
diff --git a/dojo/string.js b/dojo/string.js
index eef037a..4ff946d 100644
--- a/dojo/string.js
+++ b/dojo/string.js
@@ -24,24 +24,24 @@ _1+=_1;
 }
 return _3.join("");
 };
-dojo.string.pad=function(_4,_5,ch,_7){
+dojo.string.pad=function(_4,_5,ch,_6){
 if(!ch){
 ch="0";
 }
-var _8=String(_4),_9=dojo.string.rep(ch,Math.ceil((_5-_8.length)/ch.length));
-return _7?_8+_9:_9+_8;
+var _7=String(_4),_8=dojo.string.rep(ch,Math.ceil((_5-_7.length)/ch.length));
+return _6?_7+_8:_8+_7;
 };
-dojo.string.substitute=function(_a,_b,_c,_d){
-_d=_d||dojo.global;
-_c=(!_c)?function(v){
+dojo.string.substitute=function(_9,_a,_b,_c){
+_c=_c||dojo.global;
+_b=_b?dojo.hitch(_c,_b):function(v){
 return v;
-}:dojo.hitch(_d,_c);
-return _a.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,function(_f,key,_11){
-var _12=dojo.getObject(key,false,_b);
-if(_11){
-_12=dojo.getObject(_11,false,_d).call(_d,_12,key);
+};
+return _9.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,function(_d,_e,_f){
+var _10=dojo.getObject(_e,false,_a);
+if(_f){
+_10=dojo.getObject(_f,false,_c).call(_c,_10,_e);
 }
-return _c(_12,key).toString();
+return _b(_10,_e).toString();
 });
 };
 dojo.string.trim=String.prototype.trim?dojo.trim:function(str){
diff --git a/dojox/analytics/README b/dojox/analytics/README
index 6304903..7299925 100644
--- a/dojox/analytics/README
+++ b/dojox/analytics/README
@@ -24,7 +24,7 @@ back to the server.  Plugins included at this time:
 	idle - reports idle/activity 
 	consoleMessages - reports console.* messages to the server	
 
-	Additionally, a Google Ananlytics (Urchin tracker) helper is included
+	Additionally, a Google Analytics (Urchin tracker) helper is included
 	in this project, though is unrelated to the Core dojox.analytics 
 	project code. 
 
diff --git a/dojox/analytics/Urchin.js b/dojox/analytics/Urchin.js
index f45fb9e..31d6cfc 100644
--- a/dojox/analytics/Urchin.js
+++ b/dojox/analytics/Urchin.js
@@ -8,23 +8,20 @@
 if(!dojo._hasResource["dojox.analytics.Urchin"]){
 dojo._hasResource["dojox.analytics.Urchin"]=true;
 dojo.provide("dojox.analytics.Urchin");
-dojo.declare("dojox.analytics.Urchin",null,{acct:dojo.config.urchin,loadInterval:42,decay:0.5,timeout:4200,constructor:function(_1){
+dojo.declare("dojox.analytics.Urchin",null,{acct:"",constructor:function(_1){
 this.tracker=null;
 dojo.mixin(this,_1);
-this._loadGA();
-},_loadGA:function(){
-var _2=("https:"==document.location.protocol)?"https://ssl.":"http://www.";
-dojo.create("script",{src:_2+"google-analytics.com/ga.js"},dojo.doc.getElementsByTagName("head")[0]);
-setTimeout(dojo.hitch(this,"_checkGA"),this.loadInterval);
-},_checkGA:function(){
-if(this.loadInterval>this.timeout){
-return;
+this.acct=this.acct||dojo.config.urchin;
+var re=/loaded|complete/,_2=("https:"==dojo.doc.location.protocol)?"https://ssl.":"http://www.",h=dojo.doc.getElementsByTagName("head")[0],n=dojo.create("script",{src:_2+"google-analytics.com/ga.js"},h);
+n.onload=n.onreadystatechange=dojo.hitch(this,function(e){
+if(e&&e.type=="load"||re.test(n.readyState)){
+n.onload=n.onreadystatechange=null;
+this._gotGA();
+h.removeChild(n);
 }
-setTimeout(dojo.hitch(this,!window["_gat"]?"_checkGA":"_gotGA"),this.loadInterval);
-this.loadInterval*=(this.decay+1);
+});
 },_gotGA:function(){
 this.tracker=_gat._getTracker(this.acct);
-this.tracker._initData();
 this.GAonLoad.apply(this,arguments);
 },GAonLoad:function(){
 this.trackPageView();
diff --git a/dojox/analytics/_base.js b/dojox/analytics/_base.js
index 4602d42..f7db8a2 100644
--- a/dojox/analytics/_base.js
+++ b/dojox/analytics/_base.js
@@ -43,32 +43,32 @@ this.schedulePusher();
 if(this._data.length){
 this._inTransit=this._data;
 this._data=[];
-var _6;
+var _4;
 switch(this.sendMethod){
 case "script":
-_6=dojo.io.script.get({url:this.getQueryPacket(),preventCache:1,callbackParamName:"callback"});
+_4=dojo.io.script.get({url:this.getQueryPacket(),preventCache:1,callbackParamName:"callback"});
 break;
 case "xhrPost":
 default:
-_6=dojo.xhrPost({url:this.dataUrl,content:{id:this._id++,data:dojo.toJson(this._inTransit)}});
+_4=dojo.xhrPost({url:this.dataUrl,content:{id:this._id++,data:dojo.toJson(this._inTransit)}});
 break;
 }
-_6.addCallback(this,"onPushComplete");
-return _6;
+_4.addCallback(this,"onPushComplete");
+return _4;
 }
 return false;
 },getQueryPacket:function(){
 while(true){
-var _7={id:this._id++,data:dojo.toJson(this._inTransit)};
-var _8=this.dataUrl+"?"+dojo.objectToQuery(_7);
-if(_8.length>this.maxRequestSize){
+var _5={id:this._id++,data:dojo.toJson(this._inTransit)};
+var _6=this.dataUrl+"?"+dojo.objectToQuery(_5);
+if(_6.length>this.maxRequestSize){
 this._data.unshift(this._inTransit.pop());
 this._split=1;
 }else{
-return _8;
+return _6;
 }
 }
-},onPushComplete:function(_9){
+},onPushComplete:function(_7){
 if(this._inTransit){
 delete this._inTransit;
 }
diff --git a/dojox/analytics/logger/dojoxAnalytics.php b/dojox/analytics/logger/dojoxAnalytics.php
index 0f7f849..dfc7ac8 100644
--- a/dojox/analytics/logger/dojoxAnalytics.php
+++ b/dojox/analytics/logger/dojoxAnalytics.php
@@ -23,7 +23,7 @@
 
 	$response = "{'eventsRecieved': '" . sizeof($items) . "', 'id': '" . $id . "'}";
 	if ($_REQUEST["callback"]){
-		print $_REQUEST["callback"] . "(" . $response . ");";
+		print htmlentities($_REQUEST["callback"]) . "(" . $response . ");";
 	}else{
 		print $response;
 	}
diff --git a/dojox/analytics/plugins/consoleMessages.js b/dojox/analytics/plugins/consoleMessages.js
index 17b4866..013df09 100644
--- a/dojox/analytics/plugins/consoleMessages.js
+++ b/dojox/analytics/plugins/consoleMessages.js
@@ -7,6 +7,7 @@
 
 if(!dojo._hasResource["dojox.analytics.plugins.consoleMessages"]){
 dojo._hasResource["dojox.analytics.plugins.consoleMessages"]=true;
+dojo.require("dojox.analytics._base");
 dojo.provide("dojox.analytics.plugins.consoleMessages");
 dojox.analytics.plugins.consoleMessages=new (function(){
 this.addData=dojo.hitch(dojox.analytics,"addData","consoleMessages");
diff --git a/dojox/analytics/plugins/dojo.js b/dojox/analytics/plugins/dojo.js
index 5ecd2ba..bf431ee 100644
--- a/dojox/analytics/plugins/dojo.js
+++ b/dojox/analytics/plugins/dojo.js
@@ -1,5 +1,6 @@
 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.require("dojox.analytics._base");
 dojo.provide("dojox.analytics.plugins.dojo");
 
 dojox.analytics.plugins.dojo = new (function(){
diff --git a/dojox/analytics/plugins/idle.js b/dojox/analytics/plugins/idle.js
index 86b82be..7a3a6fd 100644
--- a/dojox/analytics/plugins/idle.js
+++ b/dojox/analytics/plugins/idle.js
@@ -7,6 +7,7 @@
 
 if(!dojo._hasResource["dojox.analytics.plugins.idle"]){
 dojo._hasResource["dojox.analytics.plugins.idle"]=true;
+dojo.require("dojox.analytics._base");
 dojo.provide("dojox.analytics.plugins.idle");
 dojox.analytics.plugins.idle=new (function(){
 this.addData=dojo.hitch(dojox.analytics,"addData","idle");
diff --git a/dojox/analytics/plugins/mouseClick.js b/dojox/analytics/plugins/mouseClick.js
index 0c58c3c..c8142a5 100644
--- a/dojox/analytics/plugins/mouseClick.js
+++ b/dojox/analytics/plugins/mouseClick.js
@@ -7,6 +7,7 @@
 
 if(!dojo._hasResource["dojox.analytics.plugins.mouseClick"]){
 dojo._hasResource["dojox.analytics.plugins.mouseClick"]=true;
+dojo.require("dojox.analytics._base");
 dojo.provide("dojox.analytics.plugins.mouseClick");
 dojox.analytics.plugins.mouseClick=new (function(){
 this.addData=dojo.hitch(dojox.analytics,"addData","mouseClick");
@@ -21,16 +22,16 @@ switch(i){
 case "target":
 case "originalTarget":
 case "explicitOriginalTarget":
-var _5=["id","className","nodeName","localName","href","spellcheck","lang"];
+var _1=["id","className","nodeName","localName","href","spellcheck","lang"];
 t[i]={};
-for(var j=0;j<_5.length;j++){
-if(e[i][_5[j]]){
-if(_5[j]=="text"||_5[j]=="textContent"){
+for(var j=0;j<_1.length;j++){
+if(e[i][_1[j]]){
+if(_1[j]=="text"||_1[j]=="textContent"){
 if((e[i]["localName"]!="HTML")&&(e[i]["localName"]!="BODY")){
-t[i][_5[j]]=e[i][_5[j]].substr(0,50);
+t[i][_1[j]]=e[i][_1[j]].substr(0,50);
 }
 }else{
-t[i][_5[j]]=e[i][_5[j]];
+t[i][_1[j]]=e[i][_1[j]];
 }
 }
 }
diff --git a/dojox/analytics/plugins/mouseOver.js b/dojox/analytics/plugins/mouseOver.js
index 4705880..1b187cc 100644
--- a/dojox/analytics/plugins/mouseOver.js
+++ b/dojox/analytics/plugins/mouseOver.js
@@ -7,6 +7,7 @@
 
 if(!dojo._hasResource["dojox.analytics.plugins.mouseOver"]){
 dojo._hasResource["dojox.analytics.plugins.mouseOver"]=true;
+dojo.require("dojox.analytics._base");
 dojo.provide("dojox.analytics.plugins.mouseOver");
 dojox.analytics.plugins.mouseOver=new (function(){
 this.watchMouse=dojo.config["watchMouseOver"]||true;
@@ -45,16 +46,16 @@ var t={};
 for(var i in e){
 switch(i){
 case "target":
-var _5=this.targetProps;
+var _1=this.targetProps;
 t[i]={};
-for(var j=0;j<_5.length;j++){
-if(dojo.isObject(e[i])&&_5[j] in e[i]){
-if(_5[j]=="text"||_5[j]=="textContent"){
+for(var j=0;j<_1.length;j++){
+if(dojo.isObject(e[i])&&_1[j] in e[i]){
+if(_1[j]=="text"||_1[j]=="textContent"){
 if(e[i]["localName"]&&(e[i]["localName"]!="HTML")&&(e[i]["localName"]!="BODY")){
-t[i][_5[j]]=e[i][_5[j]].substr(0,50);
+t[i][_1[j]]=e[i][_1[j]].substr(0,50);
 }
 }else{
-t[i][_5[j]]=e[i][_5[j]];
+t[i][_1[j]]=e[i][_1[j]];
 }
 }
 }
@@ -62,8 +63,8 @@ break;
 case "x":
 case "y":
 if(e[i]){
-var _7=e[i];
-t[i]=_7+"";
+var _2=e[i];
+t[i]=_2+"";
 }
 break;
 default:
diff --git a/dojox/analytics/plugins/window.js b/dojox/analytics/plugins/window.js
index 47ac2f3..a7d2f56 100644
--- a/dojox/analytics/plugins/window.js
+++ b/dojox/analytics/plugins/window.js
@@ -7,6 +7,7 @@
 
 if(!dojo._hasResource["dojox.analytics.plugins.window"]){
 dojo._hasResource["dojox.analytics.plugins.window"]=true;
+dojo.require("dojox.analytics._base");
 dojo.provide("dojox.analytics.plugins.window");
 dojox.analytics.plugins.window=new (function(){
 this.addData=dojo.hitch(dojox.analytics,"addData","window");
@@ -15,22 +16,22 @@ 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 _2={};
+var _1={};
 for(var i in window){
 if(dojo.isObject(window[i])){
 switch(i){
 case "location":
 case "console":
-_2[i]=window[i];
+_1[i]=window[i];
 break;
 default:
 break;
 }
 }else{
-_2[i]=window[i];
+_1[i]=window[i];
 }
 }
-this.addData(_2);
+this.addData(_1);
 }));
 })();
 }
diff --git a/dojox/atom/io/Connection.js b/dojox/atom/io/Connection.js
index 7211358..369d0e1 100644
--- a/dojox/atom/io/Connection.js
+++ b/dojox/atom/io/Connection.js
@@ -23,245 +23,233 @@ if(!_15){
 _15=dojo.global;
 }
 var ae=this.alertsEnabled;
-var _17={url:_f,handleAs:"xml",sync:this.sync,preventCache:this.preventCache,load:function(_18,_19){
-var _1a=null;
-var _1b=_18;
-var _1c;
-if(_1b){
-if(typeof (_1b.getElementsByTagNameNS)!="undefined"){
-_1c=_1b.getElementsByTagNameNS(_12,_10);
-if(_1c&&_1c.length>0){
-_1a=_1c.item(0);
-}else{
-if(_1b.lastChild){
-_1a=_1b.lastChild;
-}
-}
-}else{
-if(typeof (_1b.getElementsByTagName)!="undefined"){
-_1c=_1b.getElementsByTagName(_10);
-if(_1c&&_1c.length>0){
-for(var i=0;i<_1c.length;i++){
-if(_1c[i].namespaceURI==_12){
-_1a=_1c[i];
+var _16={url:_f,handleAs:"xml",sync:this.sync,preventCache:this.preventCache,load:function(_17,_18){
+var _19=null;
+var _1a=_17;
+var _1b;
+if(_1a){
+if(typeof (_1a.getElementsByTagNameNS)!="undefined"){
+_1b=_1a.getElementsByTagNameNS(_12,_10);
+if(_1b&&_1b.length>0){
+_19=_1b.item(0);
+}else{
+if(_1a.lastChild){
+_19=_1a.lastChild;
+}
+}
+}else{
+if(typeof (_1a.getElementsByTagName)!="undefined"){
+_1b=_1a.getElementsByTagName(_10);
+if(_1b&&_1b.length>0){
+for(var i=0;i<_1b.length;i++){
+if(_1b[i].namespaceURI==_12){
+_19=_1b[i];
 break;
 }
 }
 }else{
-if(_1b.lastChild){
-_1a=_1b.lastChild;
+if(_1a.lastChild){
+_19=_1a.lastChild;
 }
 }
 }else{
-if(_1b.lastChild){
-_1a=_1b.lastChild;
+if(_1a.lastChild){
+_19=_1a.lastChild;
 }else{
-_13.call(_15,null,null,_19);
+_13.call(_15,null,null,_18);
 return;
 }
 }
 }
-_11.buildFromDom(_1a);
+_11.buildFromDom(_19);
 if(_13){
-_13.call(_15,_11,_1b,_19);
+_13.call(_15,_11,_1a,_18);
 }else{
 if(ae){
-var _1e=dojo.i18n.getLocalization("dojox.atom.io","messages");
-throw new Error(_1e.noCallback);
+throw new Error("The callback value does not exist.");
 }
 }
 }else{
-_13.call(_15,null,null,_19);
+_13.call(_15,null,null,_18);
 }
 }};
 if(this.user&&this.user!==null){
-_17.user=this.user;
+_16.user=this.user;
 }
 if(this.password&&this.password!==null){
-_17.password=this.password;
+_16.password=this.password;
 }
 if(_14){
-_17.error=function(_1f,_20){
-_14.call(_15,_1f,_20);
+_16.error=function(_1c,_1d){
+_14.call(_15,_1c,_1d);
 };
 }else{
-_17.error=function(){
-var _21=dojo.i18n.getLocalization("dojox.atom.io","messages");
-throw new Error(_21.failedXhr);
+_16.error=function(){
+throw new Error("The URL requested cannot be accessed");
 };
 }
-dojo.xhrGet(_17);
-},updateEntry:function(_22,_23,_24,_25,_26,_27){
-if(!_27){
-_27=dojo.global;
+dojo.xhrGet(_16);
+},updateEntry:function(_1e,_1f,_20,_21,_22,_23){
+if(!_23){
+_23=dojo.global;
 }
-_22.updated=new Date();
-var url=_22.getEditHref();
+_1e.updated=new Date();
+var url=_1e.getEditHref();
 if(!url){
-var _29=dojo.i18n.getLocalization("dojox.atom.io","messages");
-throw new Error(_29.missingEditUrl);
+throw new Error("A URL has not been specified for editing this entry.");
 }
-var _2a=this;
+var _24=this;
 var ae=this.alertsEnabled;
-var _2c={url:url,handleAs:"text",contentType:"text/xml",sync:this.sync,preventCache:this.preventCache,load:function(_2d,_2e){
-var _2f=null;
-if(_25){
-_2f=_2e.xhr.getResponseHeader("Location");
-if(!_2f){
-_2f=url;
-}
-var _30=function(_31,dom,_33){
-if(_23){
-_23.call(_27,_31,_2f,_33);
+var _25={url:url,handleAs:"text",contentType:"text/xml",sync:this.sync,preventCache:this.preventCache,load:function(_26,_27){
+var _28=null;
+if(_21){
+_28=_27.xhr.getResponseHeader("Location");
+if(!_28){
+_28=url;
+}
+var _29=function(_2a,dom,_2b){
+if(_1f){
+_1f.call(_23,_2a,_28,_2b);
 }else{
 if(ae){
-var _34=dojo.i18n.getLocalization("dojox.atom.io","messages");
-throw new Error(_34.noCallback);
+throw new Error("The callback value does not exist.");
 }
 }
 };
-_2a.getEntry(_2f,_30);
+_24.getEntry(_28,_29);
 }else{
-if(_23){
-_23.call(_27,_22,_2e.xhr.getResponseHeader("Location"),_2e);
+if(_1f){
+_1f.call(_23,_1e,_27.xhr.getResponseHeader("Location"),_27);
 }else{
 if(ae){
-var _35=dojo.i18n.getLocalization("dojox.atom.io","messages");
-throw new Error(_35.noCallback);
+throw new Error("The callback value does not exist.");
 }
 }
 }
-return _2d;
+return _26;
 }};
 if(this.user&&this.user!==null){
-_2c.user=this.user;
+_25.user=this.user;
 }
 if(this.password&&this.password!==null){
-_2c.password=this.password;
+_25.password=this.password;
 }
-if(_24){
-_2c.error=function(_36,_37){
-_24.call(_27,_36,_37);
+if(_20){
+_25.error=function(_2c,_2d){
+_20.call(_23,_2c,_2d);
 };
 }else{
-_2c.error=function(){
-var _38=dojo.i18n.getLocalization("dojox.atom.io","messages");
-throw new Error(_38.failedXhr);
+_25.error=function(){
+throw new Error("The URL requested cannot be accessed");
 };
 }
-if(_26){
-_2c.postData=_22.toString(true);
-_2c.headers={"X-Method-Override":"PUT"};
-dojo.rawXhrPost(_2c);
+if(_22){
+_25.postData=_1e.toString(true);
+_25.headers={"X-Method-Override":"PUT"};
+dojo.rawXhrPost(_25);
 }else{
-_2c.putData=_22.toString(true);
-var xhr=dojo.rawXhrPut(_2c);
+_25.putData=_1e.toString(true);
+var xhr=dojo.rawXhrPut(_25);
 }
-},addEntry:function(_3a,url,_3c,_3d,_3e,_3f){
-if(!_3f){
-_3f=dojo.global;
+},addEntry:function(_2e,url,_2f,_30,_31,_32){
+if(!_32){
+_32=dojo.global;
 }
-_3a.published=new Date();
-_3a.updated=new Date();
-var _40=_3a.feedUrl;
+_2e.published=new Date();
+_2e.updated=new Date();
+var _33=_2e.feedUrl;
 var ae=this.alertsEnabled;
-if(!url&&_40){
-url=_40;
+if(!url&&_33){
+url=_33;
 }
 if(!url){
 if(ae){
-var _42=dojo.i18n.getLocalization("dojox.atom.io","messages");
-throw new Error(_42.missingUrl);
+throw new Error("The request cannot be processed because the URL parameter is missing.");
 }
 return;
 }
-var _43=this;
-var _44={url:url,handleAs:"text",contentType:"text/xml",sync:this.sync,preventCache:this.preventCache,postData:_3a.toString(true),load:function(_45,_46){
-var _47=_46.xhr.getResponseHeader("Location");
-if(!_47){
-_47=url;
+var _34=this;
+var _35={url:url,handleAs:"text",contentType:"text/xml",sync:this.sync,preventCache:this.preventCache,postData:_2e.toString(true),load:function(_36,_37){
+var _38=_37.xhr.getResponseHeader("Location");
+if(!_38){
+_38=url;
 }
-if(!_46.retrieveEntry){
-if(_3c){
-_3c.call(_3f,_3a,_47,_46);
+if(!_37.retrieveEntry){
+if(_2f){
+_2f.call(_32,_2e,_38,_37);
 }else{
 if(ae){
-var _48=dojo.i18n.getLocalization("dojox.atom.io","messages");
-throw new Error(_48.noCallback);
+throw new Error("The callback value does not exist.");
 }
 }
 }else{
-var _49=function(_4a,dom,_4c){
-if(_3c){
-_3c.call(_3f,_4a,_47,_4c);
+var _39=function(_3a,dom,_3b){
+if(_2f){
+_2f.call(_32,_3a,_38,_3b);
 }else{
 if(ae){
-var _4d=dojo.i18n.getLocalization("dojox.atom.io","messages");
-throw new Error(_4d.noCallback);
+throw new Error("The callback value does not exist.");
 }
 }
 };
-_43.getEntry(_47,_49);
+_34.getEntry(_38,_39);
 }
-return _45;
+return _36;
 }};
 if(this.user&&this.user!==null){
-_44.user=this.user;
+_35.user=this.user;
 }
 if(this.password&&this.password!==null){
-_44.password=this.password;
+_35.password=this.password;
 }
-if(_3d){
-_44.error=function(_4e,_4f){
-_3d.call(_3f,_4e,_4f);
+if(_30){
+_35.error=function(_3c,_3d){
+_30.call(_32,_3c,_3d);
 };
 }else{
-_44.error=function(){
-var _50=dojo.i18n.getLocalization("dojox.atom.io","messages");
-throw new Error(_50.failedXhr);
+_35.error=function(){
+throw new Error("The URL requested cannot be accessed");
 };
 }
-dojo.rawXhrPost(_44);
-},deleteEntry:function(_51,_52,_53,_54,_55){
-if(!_55){
-_55=dojo.global;
+dojo.rawXhrPost(_35);
+},deleteEntry:function(_3e,_3f,_40,_41,_42){
+if(!_42){
+_42=dojo.global;
 }
 var url=null;
-if(typeof (_51)=="string"){
-url=_51;
+if(typeof (_3e)=="string"){
+url=_3e;
 }else{
-url=_51.getEditHref();
+url=_3e.getEditHref();
 }
 if(!url){
-var _57=dojo.i18n.getLocalization("dojox.atom.io","messages");
-_52.call(_55,false,null);
-throw new Error(_57.missingUrl);
+_3f.call(_42,false,null);
+throw new Error("The request cannot be processed because the URL parameter is missing.");
 }
-var _58={url:url,handleAs:"text",sync:this.sync,preventCache:this.preventCache,load:function(_59,_5a){
-_52.call(_55,_5a);
-return _59;
+var _43={url:url,handleAs:"text",sync:this.sync,preventCache:this.preventCache,load:function(_44,_45){
+_3f.call(_42,_45);
+return _44;
 }};
 if(this.user&&this.user!==null){
-_58.user=this.user;
+_43.user=this.user;
 }
 if(this.password&&this.password!==null){
-_58.password=this.password;
+_43.password=this.password;
 }
-if(_53){
-_58.error=function(_5b,_5c){
-_53.call(_55,_5b,_5c);
+if(_40){
+_43.error=function(_46,_47){
+_40.call(_42,_46,_47);
 };
 }else{
-_58.error=function(){
-var _5d=dojo.i18n.getLocalization("dojox.atom.io","messages");
-throw new Error(_5d.failedXhr);
+_43.error=function(){
+throw new Error("The URL requested cannot be accessed");
 };
 }
-if(_54){
-_58.headers={"X-Method-Override":"DELETE"};
-dojo.xhrPost(_58);
+if(_41){
+_43.headers={"X-Method-Override":"DELETE"};
+dojo.xhrPost(_43);
 }else{
-dojo.xhrDelete(_58);
+dojo.xhrDelete(_43);
 }
 }});
 }
diff --git a/dojox/atom/io/model.js b/dojox/atom/io/model.js
index e18e10f..d89bdf0 100644
--- a/dojox/atom/io/model.js
+++ b/dojox/atom/io/model.js
@@ -11,7 +11,6 @@ dojo.provide("dojox.atom.io.model");
 dojo.require("dojox.xml.parser");
 dojo.require("dojo.string");
 dojo.require("dojo.date.stamp");
-dojo.requireLocalization("dojox.atom.io","messages",null,"");
 dojox.atom.io.model._Constants={"ATOM_URI":"http://www.w3.org/2005/Atom","ATOM_NS":"http://www.w3.org/2005/Atom","PURL_NS":"http://purl.org/atom/app#","APP_NS":"http://www.w3.org/2007/app"};
 dojox.atom.io.model._actions={"link":function(_1,_2){
 if(_1.links===null){
@@ -45,98 +44,94 @@ _a.categories.push(_c);
 _d.icon=dojox.xml.parser.textContent(_e);
 },"id":function(_f,_10){
 _f.id=dojox.xml.parser.textContent(_10);
-},"rights":function(obj,_12){
-obj.rights=dojox.xml.parser.textContent(_12);
-},"subtitle":function(obj,_14){
+},"rights":function(obj,_11){
+obj.rights=dojox.xml.parser.textContent(_11);
+},"subtitle":function(obj,_12){
 var cnt=new dojox.atom.io.model.Content("subtitle");
-cnt.buildFromDom(_14);
+cnt.buildFromDom(_12);
 obj.subtitle=cnt;
-},"title":function(obj,_17){
+},"title":function(obj,_13){
 var cnt=new dojox.atom.io.model.Content("title");
-cnt.buildFromDom(_17);
+cnt.buildFromDom(_13);
 obj.title=cnt;
-},"updated":function(obj,_1a){
-obj.updated=dojox.atom.io.model.util.createDate(_1a);
-},"issued":function(obj,_1c){
-obj.issued=dojox.atom.io.model.util.createDate(_1c);
-},"modified":function(obj,_1e){
-obj.modified=dojox.atom.io.model.util.createDate(_1e);
-},"published":function(obj,_20){
-obj.published=dojox.atom.io.model.util.createDate(_20);
-},"entry":function(obj,_22){
+},"updated":function(obj,_14){
+obj.updated=dojox.atom.io.model.util.createDate(_14);
+},"issued":function(obj,_15){
+obj.issued=dojox.atom.io.model.util.createDate(_15);
+},"modified":function(obj,_16){
+obj.modified=dojox.atom.io.model.util.createDate(_16);
+},"published":function(obj,_17){
+obj.published=dojox.atom.io.model.util.createDate(_17);
+},"entry":function(obj,_18){
 if(obj.entries===null){
 obj.entries=[];
 }
-var _23=obj.createEntry?obj.createEntry():new dojox.atom.io.model.Entry();
-_23.buildFromDom(_22);
-obj.entries.push(_23);
-},"content":function(obj,_25){
+var _19=obj.createEntry?obj.createEntry():new dojox.atom.io.model.Entry();
+_19.buildFromDom(_18);
+obj.entries.push(_19);
+},"content":function(obj,_1a){
 var cnt=new dojox.atom.io.model.Content("content");
-cnt.buildFromDom(_25);
+cnt.buildFromDom(_1a);
 obj.content=cnt;
-},"summary":function(obj,_28){
-var _29=new dojox.atom.io.model.Content("summary");
-_29.buildFromDom(_28);
-obj.summary=_29;
-},"name":function(obj,_2b){
-obj.name=dojox.xml.parser.textContent(_2b);
-},"email":function(obj,_2d){
-obj.email=dojox.xml.parser.textContent(_2d);
-},"uri":function(obj,_2f){
-obj.uri=dojox.xml.parser.textContent(_2f);
-},"generator":function(obj,_31){
+},"summary":function(obj,_1b){
+var _1c=new dojox.atom.io.model.Content("summary");
+_1c.buildFromDom(_1b);
+obj.summary=_1c;
+},"name":function(obj,_1d){
+obj.name=dojox.xml.parser.textContent(_1d);
+},"email":function(obj,_1e){
+obj.email=dojox.xml.parser.textContent(_1e);
+},"uri":function(obj,_1f){
+obj.uri=dojox.xml.parser.textContent(_1f);
+},"generator":function(obj,_20){
 obj.generator=new dojox.atom.io.model.Generator();
-obj.generator.buildFromDom(_31);
+obj.generator.buildFromDom(_20);
 }};
-dojox.atom.io.model.util={createDate:function(_32){
-var _33=dojox.xml.parser.textContent(_32);
-if(_33){
-return dojo.date.stamp.fromISOString(dojo.trim(_33));
+dojox.atom.io.model.util={createDate:function(_21){
+var _22=dojox.xml.parser.textContent(_21);
+if(_22){
+return dojo.date.stamp.fromISOString(dojo.trim(_22));
 }
 return null;
 },escapeHtml:function(str){
-str=str.replace(/&/gm,"&").replace(/</gm,"<").replace(/>/gm,">").replace(/"/gm,""");
-str=str.replace(/'/gm,"'");
-return str;
+return str.replace(/&/gm,"&").replace(/</gm,"<").replace(/>/gm,">").replace(/"/gm,""").replace(/'/gm,"'");
 },unEscapeHtml:function(str){
-str=str.replace(/&/gm,"&").replace(/</gm,"<").replace(/>/gm,">").replace(/"/gm,"\"");
-str=str.replace(/'/gm,"'");
-return str;
-},getNodename:function(_36){
-var _37=null;
-if(_36!==null){
-_37=_36.localName?_36.localName:_36.nodeName;
-if(_37!==null){
-var _38=_37.indexOf(":");
-if(_38!==-1){
-_37=_37.substring((_38+1),_37.length);
+return str.replace(/</gm,"<").replace(/>/gm,">").replace(/"/gm,"\"").replace(/'/gm,"'").replace(/&/gm,"&");
+},getNodename:function(_23){
+var _24=null;
+if(_23!==null){
+_24=_23.localName?_23.localName:_23.nodeName;
+if(_24!==null){
+var _25=_24.indexOf(":");
+if(_25!==-1){
+_24=_24.substring((_25+1),_24.length);
 }
 }
 }
-return _37;
+return _24;
 }};
-dojo.declare("dojox.atom.io.model.Node",null,{constructor:function(_39,_3a,_3b,_3c,_3d){
-this.name_space=_39;
-this.name=_3a;
+dojo.declare("dojox.atom.io.model.Node",null,{constructor:function(_26,_27,_28,_29,_2a){
+this.name_space=_26;
+this.name=_27;
 this.attributes=[];
-if(_3b){
-this.attributes=_3b;
+if(_28){
+this.attributes=_28;
 }
 this.content=[];
 this.rawNodes=[];
 this.textContent=null;
-if(_3c){
-this.content.push(_3c);
+if(_29){
+this.content.push(_29);
 }
-this.shortNs=_3d;
+this.shortNs=_2a;
 this._objName="Node";
-},buildFromDom:function(_3e){
-this._saveAttributes(_3e);
-this.name_space=_3e.namespaceURI;
-this.shortNs=_3e.prefix;
-this.name=dojox.atom.io.model.util.getNodename(_3e);
-for(var x=0;x<_3e.childNodes.length;x++){
-var c=_3e.childNodes[x];
+},buildFromDom:function(_2b){
+this._saveAttributes(_2b);
+this.name_space=_2b.namespaceURI;
+this.shortNs=_2b.prefix;
+this.name=dojox.atom.io.model.util.getNodename(_2b);
+for(var x=0;x<_2b.childNodes.length;x++){
+var c=_2b.childNodes[x];
 if(dojox.atom.io.model.util.getNodename(c)!="#text"){
 this.rawNodes.push(c);
 var n=new dojox.atom.io.model.Node();
@@ -146,51 +141,51 @@ this.content.push(n);
 this.content.push(c.nodeValue);
 }
 }
-this.textContent=dojox.xml.parser.textContent(_3e);
-},_saveAttributes:function(_42){
+this.textContent=dojox.xml.parser.textContent(_2b);
+},_saveAttributes:function(_2c){
 if(!this.attributes){
 this.attributes=[];
 }
-var _43=function(_44){
-var _45=_44.attributes;
-if(_45===null){
+var _2d=function(_2e){
+var _2f=_2e.attributes;
+if(_2f===null){
 return false;
 }
-return (_45.length!==0);
+return (_2f.length!==0);
 };
-if(_43(_42)&&this._getAttributeNames){
-var _46=this._getAttributeNames(_42);
-if(_46&&_46.length>0){
-for(var x in _46){
-var _48=_42.getAttribute(_46[x]);
-if(_48){
-this.attributes[_46[x]]=_48;
+if(_2d(_2c)&&this._getAttributeNames){
+var _30=this._getAttributeNames(_2c);
+if(_30&&_30.length>0){
+for(var x in _30){
+var _31=_2c.getAttribute(_30[x]);
+if(_31){
+this.attributes[_30[x]]=_31;
 }
 }
 }
 }
-},addAttribute:function(_49,_4a){
-this.attributes[_49]=_4a;
-},getAttribute:function(_4b){
-return this.attributes[_4b];
-},_getAttributeNames:function(_4c){
-var _4d=[];
-for(var i=0;i<_4c.attributes.length;i++){
-_4d.push(_4c.attributes[i].nodeName);
+},addAttribute:function(_32,_33){
+this.attributes[_32]=_33;
+},getAttribute:function(_34){
+return this.attributes[_34];
+},_getAttributeNames:function(_35){
+var _36=[];
+for(var i=0;i<_35.attributes.length;i++){
+_36.push(_35.attributes[i].nodeName);
 }
-return _4d;
+return _36;
 },toString:function(){
 var xml=[];
 var x;
-var _51=(this.shortNs?this.shortNs+":":"")+this.name;
-var _52=(this.name=="#cdata-section");
-if(_52){
+var _37=(this.shortNs?this.shortNs+":":"")+this.name;
+var _38=(this.name=="#cdata-section");
+if(_38){
 xml.push("<![CDATA[");
 xml.push(this.textContent);
 xml.push("]]>");
 }else{
 xml.push("<");
-xml.push(_51);
+xml.push(_37);
 if(this.name_space){
 xml.push(" xmlns='"+this.name_space+"'");
 }
@@ -204,16 +199,16 @@ xml.push(">");
 for(x in this.content){
 xml.push(this.content[x]);
 }
-xml.push("</"+_51+">\n");
+xml.push("</"+_37+">\n");
 }else{
 xml.push("/>\n");
 }
 }
 return xml.join("");
-},addContent:function(_53){
-this.content.push(_53);
+},addContent:function(_39){
+this.content.push(_39);
 }});
-dojo.declare("dojox.atom.io.model.AtomItem",dojox.atom.io.model.Node,{constructor:function(_54){
+dojo.declare("dojox.atom.io.model.AtomItem",dojox.atom.io.model.Node,{constructor:function(_3a){
 this.ATOM_URI=dojox.atom.io.model._Constants.ATOM_URI;
 this.links=null;
 this.authors=null;
@@ -233,147 +228,147 @@ return null;
 },_accepts:{},accept:function(tag){
 return Boolean(this._accepts[tag]);
 },_postBuild:function(){
-},buildFromDom:function(_56){
+},buildFromDom:function(_3b){
 var i,c,n;
-for(i=0;i<_56.attributes.length;i++){
-c=_56.attributes.item(i);
+for(i=0;i<_3b.attributes.length;i++){
+c=_3b.attributes.item(i);
 n=dojox.atom.io.model.util.getNodename(c);
 if(c.prefix=="xmlns"&&c.prefix!=n){
 this.addNamespace(c.nodeValue,n);
 }
 }
-c=_56.childNodes;
+c=_3b.childNodes;
 for(i=0;i<c.length;i++){
 if(c[i].nodeType==1){
-var _5a=dojox.atom.io.model.util.getNodename(c[i]);
-if(!_5a){
+var _3c=dojox.atom.io.model.util.getNodename(c[i]);
+if(!_3c){
 continue;
 }
-if(c[i].namespaceURI!=dojox.atom.io.model._Constants.ATOM_NS&&_5a!="#text"){
+if(c[i].namespaceURI!=dojox.atom.io.model._Constants.ATOM_NS&&_3c!="#text"){
 if(!this.extensions){
 this.extensions=[];
 }
-var _5b=new dojox.atom.io.model.Node();
-_5b.buildFromDom(c[i]);
-this.extensions.push(_5b);
+var _3d=new dojox.atom.io.model.Node();
+_3d.buildFromDom(c[i]);
+this.extensions.push(_3d);
 }
-if(!this.accept(_5a.toLowerCase())){
+if(!this.accept(_3c.toLowerCase())){
 continue;
 }
-var fn=dojox.atom.io.model._actions[_5a];
+var fn=dojox.atom.io.model._actions[_3c];
 if(fn){
 fn(this,c[i]);
 }
 }
 }
-this._saveAttributes(_56);
+this._saveAttributes(_3b);
 if(this._postBuild){
 this._postBuild();
 }
-},addNamespace:function(_5d,_5e){
-if(_5d&&_5e){
-this.name_spaces[_5e]=_5d;
+},addNamespace:function(_3e,_3f){
+if(_3e&&_3f){
+this.name_spaces[_3f]=_3e;
 }
-},addAuthor:function(_5f,_60,uri){
+},addAuthor:function(_40,_41,uri){
 if(!this.authors){
 this.authors=[];
 }
-this.authors.push(new dojox.atom.io.model.Person("author",_5f,_60,uri));
-},addContributor:function(_62,_63,uri){
+this.authors.push(new dojox.atom.io.model.Person("author",_40,_41,uri));
+},addContributor:function(_42,_43,uri){
 if(!this.contributors){
 this.contributors=[];
 }
-this.contributors.push(new dojox.atom.io.model.Person("contributor",_62,_63,uri));
-},addLink:function(_65,rel,_67,_68,_69){
+this.contributors.push(new dojox.atom.io.model.Person("contributor",_42,_43,uri));
+},addLink:function(_44,rel,_45,_46,_47){
 if(!this.links){
 this.links=[];
 }
-this.links.push(new dojox.atom.io.model.Link(_65,rel,_67,_68,_69));
-},removeLink:function(_6a,rel){
+this.links.push(new dojox.atom.io.model.Link(_44,rel,_45,_46,_47));
+},removeLink:function(_48,rel){
 if(!this.links||!dojo.isArray(this.links)){
 return;
 }
-var _6c=0;
+var _49=0;
 for(var i=0;i<this.links.length;i++){
-if((!_6a||this.links[i].href===_6a)&&(!rel||this.links[i].rel===rel)){
+if((!_48||this.links[i].href===_48)&&(!rel||this.links[i].rel===rel)){
 this.links.splice(i,1);
-_6c++;
+_49++;
 }
 }
-return _6c;
+return _49;
 },removeBasicLinks:function(){
 if(!this.links){
 return;
 }
-var _6e=0;
+var _4a=0;
 for(var i=0;i<this.links.length;i++){
 if(!this.links[i].rel){
 this.links.splice(i,1);
-_6e++;
+_4a++;
 i--;
 }
 }
-return _6e;
-},addCategory:function(_70,_71,_72){
+return _4a;
+},addCategory:function(_4b,_4c,_4d){
 if(!this.categories){
 this.categories=[];
 }
-this.categories.push(new dojox.atom.io.model.Category(_70,_71,_72));
-},getCategories:function(_73){
-if(!_73){
+this.categories.push(new dojox.atom.io.model.Category(_4b,_4c,_4d));
+},getCategories:function(_4e){
+if(!_4e){
 return this.categories;
 }
 var arr=[];
 for(var x in this.categories){
-if(this.categories[x].scheme===_73){
+if(this.categories[x].scheme===_4e){
 arr.push(this.categories[x]);
 }
 }
 return arr;
-},removeCategories:function(_76,_77){
+},removeCategories:function(_4f,_50){
 if(!this.categories){
 return;
 }
-var _78=0;
+var _51=0;
 for(var i=0;i<this.categories.length;i++){
-if((!_76||this.categories[i].scheme===_76)&&(!_77||this.categories[i].term===_77)){
+if((!_4f||this.categories[i].scheme===_4f)&&(!_50||this.categories[i].term===_50)){
 this.categories.splice(i,1);
-_78++;
+_51++;
 i--;
 }
 }
-return _78;
-},setTitle:function(str,_7b){
+return _51;
+},setTitle:function(str,_52){
 if(!str){
 return;
 }
 this.title=new dojox.atom.io.model.Content("title");
 this.title.value=str;
-if(_7b){
-this.title.type=_7b;
+if(_52){
+this.title.type=_52;
 }
-},addExtension:function(_7c,_7d,_7e,_7f,_80){
+},addExtension:function(_53,_54,_55,_56,_57){
 if(!this.extensions){
 this.extensions=[];
 }
-this.extensions.push(new dojox.atom.io.model.Node(_7c,_7d,_7e,_7f,_80||"ns"+this.extensions.length));
-},getExtensions:function(_81,_82){
+this.extensions.push(new dojox.atom.io.model.Node(_53,_54,_55,_56,_57||"ns"+this.extensions.length));
+},getExtensions:function(_58,_59){
 var arr=[];
 if(!this.extensions){
 return arr;
 }
 for(var x in this.extensions){
-if((this.extensions[x].name_space===_81||this.extensions[x].shortNs===_81)&&(!_82||this.extensions[x].name===_82)){
+if((this.extensions[x].name_space===_58||this.extensions[x].shortNs===_58)&&(!_59||this.extensions[x].name===_59)){
 arr.push(this.extensions[x]);
 }
 }
 return arr;
-},removeExtensions:function(_85,_86){
+},removeExtensions:function(_5a,_5b){
 if(!this.extensions){
 return;
 }
 for(var i=0;i<this.extensions.length;i++){
-if((this.extensions[i].name_space==_85||this.extensions[i].shortNs===_85)&&this.extensions[i].name===_86){
+if((this.extensions[i].name_space==_5a||this.extensions[i].shortNs===_5a)&&this.extensions[i].name===_5b){
 this.extensions.splice(i,1);
 i--;
 }
@@ -391,10 +386,10 @@ this.content=null;
 this.extensions=null;
 this.entries=null;
 }});
-dojo.declare("dojox.atom.io.model.Category",dojox.atom.io.model.Node,{constructor:function(_88,_89,_8a){
-this.scheme=_88;
-this.term=_89;
-this.label=_8a;
+dojo.declare("dojox.atom.io.model.Category",dojox.atom.io.model.Node,{constructor:function(_5c,_5d,_5e){
+this.scheme=_5c;
+this.term=_5d;
+this.label=_5e;
 this._objName="Category";
 },_postBuild:function(){
 },_getAttributeNames:function(){
@@ -413,8 +408,8 @@ s.push(" term=\""+this.term+"\" ");
 }
 s.push("/>\n");
 return s.join("");
-},buildFromDom:function(_8c){
-this._saveAttributes(_8c);
+},buildFromDom:function(_5f){
+this._saveAttributes(_5f);
 this.label=this.attributes.label;
 this.scheme=this.attributes.scheme;
 this.term=this.attributes.term;
@@ -422,12 +417,12 @@ if(this._postBuild){
 this._postBuild();
 }
 }});
-dojo.declare("dojox.atom.io.model.Content",dojox.atom.io.model.Node,{constructor:function(_8d,_8e,src,_90,_91){
-this.tagName=_8d;
-this.value=_8e;
+dojo.declare("dojox.atom.io.model.Content",dojox.atom.io.model.Node,{constructor:function(_60,_61,src,_62,_63){
+this.tagName=_60;
+this.value=_61;
 this.src=src;
-this.type=_90;
-this.xmlLang=_91;
+this.type=_62;
+this.xmlLang=_63;
 this.HTML="html";
 this.TEXT="text";
 this.XHTML="xhtml";
@@ -436,13 +431,35 @@ this._useTextContent="true";
 },_getAttributeNames:function(){
 return ["type","src"];
 },_postBuild:function(){
-},buildFromDom:function(_92){
-if(_92.innerHTML){
-this.value=_92.innerHTML;
+},buildFromDom:function(_64){
+var _65=_64.getAttribute("type");
+if(_65){
+_65=_65.toLowerCase();
+if(_65=="xml"||"text/xml"){
+_65=this.XML;
+}
+}else{
+_65="text";
+}
+if(_65===this.XML){
+if(_64.firstChild){
+var i;
+this.value="";
+for(i=0;i<_64.childNodes.length;i++){
+var c=_64.childNodes[i];
+if(c){
+this.value+=dojox.xml.parser.innerXML(c);
+}
+}
+}
 }else{
-this.value=dojox.xml.parser.textContent(_92);
+if(_64.innerHTML){
+this.value=_64.innerHTML;
+}else{
+this.value=dojox.xml.parser.textContent(_64);
+}
 }
-this._saveAttributes(_92);
+this._saveAttributes(_64);
 if(this.attributes){
 this.type=this.attributes.type;
 this.scheme=this.attributes.scheme;
@@ -451,8 +468,8 @@ this.term=this.attributes.term;
 if(!this.type){
 this.type="text";
 }
-var _93=this.type.toLowerCase();
-if(_93==="html"||_93==="text/html"||_93==="xhtml"||_93==="text/xhtml"){
+var _66=this.type.toLowerCase();
+if(_66==="html"||_66==="text/html"||_66==="xhtml"||_66==="text/xhtml"){
 this.value=dojox.atom.io.model.util.unEscapeHtml(this.value);
 }
 if(this._postBuild){
@@ -481,17 +498,17 @@ s.push(">"+this.value+"</"+this.tagName+">\n");
 var ret=s.join("");
 return ret;
 }});
-dojo.declare("dojox.atom.io.model.Link",dojox.atom.io.model.Node,{constructor:function(_96,rel,_98,_99,_9a){
-this.href=_96;
-this.hrefLang=_98;
+dojo.declare("dojox.atom.io.model.Link",dojox.atom.io.model.Node,{constructor:function(_67,rel,_68,_69,_6a){
+this.href=_67;
+this.hrefLang=_68;
 this.rel=rel;
-this.title=_99;
-this.type=_9a;
+this.title=_69;
+this.type=_6a;
 },_getAttributeNames:function(){
 return ["href","jrefLang","rel","title","type"];
 },_postBuild:function(){
-},buildFromDom:function(_9b){
-this._saveAttributes(_9b);
+},buildFromDom:function(_6b){
+this._saveAttributes(_6b);
 this.href=this.attributes.href;
 this.hrefLang=this.attributes.hreflang;
 this.rel=this.attributes.rel;
@@ -521,15 +538,15 @@ s.push(" type = \""+this.type+"\" ");
 s.push("/>\n");
 return s.join("");
 }});
-dojo.declare("dojox.atom.io.model.Person",dojox.atom.io.model.Node,{constructor:function(_9d,_9e,_9f,uri){
+dojo.declare("dojox.atom.io.model.Person",dojox.atom.io.model.Node,{constructor:function(_6c,_6d,_6e,uri){
 this.author="author";
 this.contributor="contributor";
-if(!_9d){
-_9d=this.author;
+if(!_6c){
+_6c=this.author;
 }
-this.personType=_9d;
-this.name=_9e||"";
-this.email=_9f||"";
+this.personType=_6c;
+this.name=_6d||"";
+this.email=_6e||"";
 this.uri=uri||"";
 this._objName="Person";
 },_getAttributeNames:function(){
@@ -537,30 +554,30 @@ return null;
 },_postBuild:function(){
 },accept:function(tag){
 return Boolean(this._accepts[tag]);
-},buildFromDom:function(_a2){
-var c=_a2.childNodes;
+},buildFromDom:function(_6f){
+var c=_6f.childNodes;
 for(var i=0;i<c.length;i++){
-var _a5=dojox.atom.io.model.util.getNodename(c[i]);
-if(!_a5){
+var _70=dojox.atom.io.model.util.getNodename(c[i]);
+if(!_70){
 continue;
 }
-if(c[i].namespaceURI!=dojox.atom.io.model._Constants.ATOM_NS&&_a5!="#text"){
+if(c[i].namespaceURI!=dojox.atom.io.model._Constants.ATOM_NS&&_70!="#text"){
 if(!this.extensions){
 this.extensions=[];
 }
-var _a6=new dojox.atom.io.model.Node();
-_a6.buildFromDom(c[i]);
-this.extensions.push(_a6);
+var _71=new dojox.atom.io.model.Node();
+_71.buildFromDom(c[i]);
+this.extensions.push(_71);
 }
-if(!this.accept(_a5.toLowerCase())){
+if(!this.accept(_70.toLowerCase())){
 continue;
 }
-var fn=dojox.atom.io.model._actions[_a5];
+var fn=dojox.atom.io.model._actions[_70];
 if(fn){
 fn(this,c[i]);
 }
 }
-this._saveAttributes(_a2);
+this._saveAttributes(_6f);
 if(this._postBuild){
 this._postBuild();
 }
@@ -579,14 +596,14 @@ s.push("\t<uri>"+this.uri+"</uri>\n");
 s.push("</"+this.personType+">\n");
 return s.join("");
 }});
-dojo.declare("dojox.atom.io.model.Generator",dojox.atom.io.model.Node,{constructor:function(uri,_aa,_ab){
+dojo.declare("dojox.atom.io.model.Generator",dojox.atom.io.model.Node,{constructor:function(uri,_72,_73){
 this.uri=uri;
-this.version=_aa;
-this.value=_ab;
+this.version=_72;
+this.value=_73;
 },_postBuild:function(){
-},buildFromDom:function(_ac){
-this.value=dojox.xml.parser.textContent(_ac);
-this._saveAttributes(_ac);
+},buildFromDom:function(_74){
+this.value=dojox.xml.parser.textContent(_74);
+this._saveAttributes(_74);
 this.uri=this.attributes.uri;
 this.version=this.attributes.version;
 if(this._postBuild){
@@ -611,10 +628,10 @@ this._objName="Entry";
 this.feedUrl=null;
 },_getAttributeNames:function(){
 return null;
-},_accepts:{"author":true,"content":true,"category":true,"contributor":true,"created":true,"id":true,"link":true,"published":true,"rights":true,"summary":true,"title":true,"updated":true,"xmlbase":true,"issued":true,"modified":true},toString:function(_b0){
+},_accepts:{"author":true,"content":true,"category":true,"contributor":true,"created":true,"id":true,"link":true,"published":true,"rights":true,"summary":true,"title":true,"updated":true,"xmlbase":true,"issued":true,"modified":true},toString:function(_75){
 var s=[];
 var i;
-if(_b0){
+if(_75){
 s.push("<?xml version='1.0' encoding='UTF-8'?>");
 s.push("<entry xmlns='"+dojox.atom.io.model._Constants.ATOM_URI+"'");
 }else{
@@ -658,11 +675,11 @@ s.push(this.title.toString());
 if(this.summary){
 s.push(this.summary.toString());
 }
-var _b3=[this.authors,this.categories,this.links,this.contributors,this.extensions];
-for(var x in _b3){
-if(_b3[x]){
-for(var y in _b3[x]){
-s.push(_b3[x][y]);
+var _76=[this.authors,this.categories,this.links,this.contributors,this.extensions];
+for(var x in _76){
+if(_76[x]){
+for(var y in _76[x]){
+s.push(_76[x][y]);
 }
 }
 }
@@ -693,46 +710,45 @@ return;
 }
 this.addLink(url,"edit");
 }});
-dojo.declare("dojox.atom.io.model.Feed",dojox.atom.io.model.AtomItem,{_accepts:{"author":true,"content":true,"category":true,"contributor":true,"created":true,"id":true,"link":true,"published":true,"rights":true,"summary":true,"title":true,"updated":true,"xmlbase":true,"entry":true,"logo":true,"issued":true,"modified":true,"icon":true,"subtitle":true},addEntry:function(_b9){
-if(!_b9.id){
-var _ba=dojo.i18n.getLocalization("dojox.atom.io","messages");
-throw new Error(_ba.noId);
+dojo.declare("dojox.atom.io.model.Feed",dojox.atom.io.model.AtomItem,{_accepts:{"author":true,"content":true,"category":true,"contributor":true,"created":true,"id":true,"link":true,"published":true,"rights":true,"summary":true,"title":true,"updated":true,"xmlbase":true,"entry":true,"logo":true,"issued":true,"modified":true,"icon":true,"subtitle":true},addEntry:function(_77){
+if(!_77.id){
+throw new Error("The entry object must be assigned an ID attribute.");
 }
 if(!this.entries){
 this.entries=[];
 }
-_b9.feedUrl=this.getSelfHref();
-this.entries.push(_b9);
+_77.feedUrl=this.getSelfHref();
+this.entries.push(_77);
 },getFirstEntry:function(){
 if(!this.entries||this.entries.length===0){
 return null;
 }
 return this.entries[0];
-},getEntry:function(_bb){
+},getEntry:function(_78){
 if(!this.entries){
 return null;
 }
 for(var x in this.entries){
-if(this.entries[x].id==_bb){
+if(this.entries[x].id==_78){
 return this.entries[x];
 }
 }
 return null;
-},removeEntry:function(_bd){
+},removeEntry:function(_79){
 if(!this.entries){
 return;
 }
-var _be=0;
+var _7a=0;
 for(var i=0;i<this.entries.length;i++){
-if(this.entries[i]===_bd){
+if(this.entries[i]===_79){
 this.entries.splice(i,1);
-_be++;
+_7a++;
 }
 }
-return _be;
-},setEntries:function(_c0){
-for(var x in _c0){
-this.addEntry(_c0[x]);
+return _7a;
+},setEntries:function(_7b){
+for(var x in _7b){
+this.addEntry(_7b[x]);
 }
 },toString:function(){
 var s=[];
@@ -786,20 +802,20 @@ s.push(this.subtitle.toString());
 if(this.tagline){
 s.push(this.tagline.toString());
 }
-var _c4=[this.alternateLinks,this.authors,this.categories,this.contributors,this.otherLinks,this.extensions,this.entries];
-for(i in _c4){
-if(_c4[i]){
-for(var x in _c4[i]){
-s.push(_c4[i][x]);
+var _7c=[this.alternateLinks,this.authors,this.categories,this.contributors,this.otherLinks,this.extensions,this.entries];
+for(i in _7c){
+if(_7c[i]){
+for(var x in _7c[i]){
+s.push(_7c[i][x]);
 }
 }
 }
 s.push("</feed>");
 return s.join("");
 },createEntry:function(){
-var _c6=new dojox.atom.io.model.Entry();
-_c6.feedUrl=this.getSelfHref();
-return _c6;
+var _7d=new dojox.atom.io.model.Entry();
+_7d.feedUrl=this.getSelfHref();
+return _7d;
 },getSelfHref:function(){
 if(this.links===null||this.links.length===0){
 return null;
@@ -811,123 +827,118 @@ return this.links[x].href;
 }
 return null;
 }});
-dojo.declare("dojox.atom.io.model.Service",dojox.atom.io.model.AtomItem,{constructor:function(_c8){
-this.href=_c8;
-},buildFromDom:function(_c9){
-var _ca;
+dojo.declare("dojox.atom.io.model.Service",dojox.atom.io.model.AtomItem,{constructor:function(_7e){
+this.href=_7e;
+},buildFromDom:function(_7f){
 var i;
-var len=_c9.childNodes?_c9.childNodes.length:0;
 this.workspaces=[];
-if(_c9.tagName!="service"){
+if(_7f.tagName!="service"){
 return;
 }
-if(_c9.namespaceURI!=dojox.atom.io.model._Constants.PURL_NS&&_c9.namespaceURI!=dojox.atom.io.model._Constants.APP_NS){
+if(_7f.namespaceURI!=dojox.atom.io.model._Constants.PURL_NS&&_7f.namespaceURI!=dojox.atom.io.model._Constants.APP_NS){
 return;
 }
-var ns=_c9.namespaceURI;
-this.name_space=_c9.namespaceURI;
-var _ce;
-if(typeof (_c9.getElementsByTagNameNS)!="undefined"){
-_ce=_c9.getElementsByTagNameNS(ns,"workspace");
+var ns=_7f.namespaceURI;
+this.name_space=_7f.namespaceURI;
+var _80;
+if(typeof (_7f.getElementsByTagNameNS)!="undefined"){
+_80=_7f.getElementsByTagNameNS(ns,"workspace");
 }else{
-_ce=[];
-var _cf=_c9.getElementsByTagName("workspace");
-for(i=0;i<_cf.length;i++){
-if(_cf[i].namespaceURI==ns){
-_ce.push(_cf[i]);
+_80=[];
+var _81=_7f.getElementsByTagName("workspace");
+for(i=0;i<_81.length;i++){
+if(_81[i].namespaceURI==ns){
+_80.push(_81[i]);
 }
 }
 }
-if(_ce&&_ce.length>0){
-var _d0=0;
-var _d1;
-for(i=0;i<_ce.length;i++){
-_d1=(typeof (_ce.item)==="undefined"?_ce[i]:_ce.item(i));
-var _d2=new dojox.atom.io.model.Workspace();
-_d2.buildFromDom(_d1);
-this.workspaces[_d0++]=_d2;
+if(_80&&_80.length>0){
+var _82=0;
+var _83;
+for(i=0;i<_80.length;i++){
+_83=(typeof (_80.item)==="undefined"?_80[i]:_80.item(i));
+var _84=new dojox.atom.io.model.Workspace();
+_84.buildFromDom(_83);
+this.workspaces[_82++]=_84;
 }
 }
 },getCollection:function(url){
 for(var i=0;i<this.workspaces.length;i++){
-var _d5=this.workspaces[i].collections;
-for(var j=0;j<_d5.length;j++){
-if(_d5[j].href==url){
-return _d5;
+var _85=this.workspaces[i].collections;
+for(var j=0;j<_85.length;j++){
+if(_85[j].href==url){
+return _85;
 }
 }
 }
 return null;
 }});
-dojo.declare("dojox.atom.io.model.Workspace",dojox.atom.io.model.AtomItem,{constructor:function(_d7){
-this.title=_d7;
+dojo.declare("dojox.atom.io.model.Workspace",dojox.atom.io.model.AtomItem,{constructor:function(_86){
+this.title=_86;
 this.collections=[];
-},buildFromDom:function(_d8){
-var _d9=dojox.atom.io.model.util.getNodename(_d8);
-if(_d9!="workspace"){
+},buildFromDom:function(_87){
+var _88=dojox.atom.io.model.util.getNodename(_87);
+if(_88!="workspace"){
 return;
 }
-var c=_d8.childNodes;
+var c=_87.childNodes;
 var len=0;
 for(var i=0;i<c.length;i++){
-var _dd=c[i];
-if(_dd.nodeType===1){
-_d9=dojox.atom.io.model.util.getNodename(_dd);
-if(_dd.namespaceURI==dojox.atom.io.model._Constants.PURL_NS||_dd.namespaceURI==dojox.atom.io.model._Constants.APP_NS){
-if(_d9==="collection"){
-var _de=new dojox.atom.io.model.Collection();
-_de.buildFromDom(_dd);
-this.collections[len++]=_de;
+var _89=c[i];
+if(_89.nodeType===1){
+_88=dojox.atom.io.model.util.getNodename(_89);
+if(_89.namespaceURI==dojox.atom.io.model._Constants.PURL_NS||_89.namespaceURI==dojox.atom.io.model._Constants.APP_NS){
+if(_88==="collection"){
+var _8a=new dojox.atom.io.model.Collection();
+_8a.buildFromDom(_89);
+this.collections[len++]=_8a;
 }
 }else{
-if(_dd.namespaceURI===dojox.atom.io.model._Constants.ATOM_NS){
-if(_d9==="title"){
-this.title=dojox.xml.parser.textContent(_dd);
+if(_89.namespaceURI===dojox.atom.io.model._Constants.ATOM_NS){
+if(_88==="title"){
+this.title=dojox.xml.parser.textContent(_89);
 }
-}else{
-var _df=dojo.i18n.getLocalization("dojox.atom.io","messages");
-throw new Error(_df.badNS);
 }
 }
 }
 }
 }});
-dojo.declare("dojox.atom.io.model.Collection",dojox.atom.io.model.AtomItem,{constructor:function(_e0,_e1){
-this.href=_e0;
-this.title=_e1;
+dojo.declare("dojox.atom.io.model.Collection",dojox.atom.io.model.AtomItem,{constructor:function(_8b,_8c){
+this.href=_8b;
+this.title=_8c;
 this.attributes=[];
 this.features=[];
 this.children=[];
 this.memberType=null;
 this.id=null;
-},buildFromDom:function(_e2){
-this.href=_e2.getAttribute("href");
-var c=_e2.childNodes;
+},buildFromDom:function(_8d){
+this.href=_8d.getAttribute("href");
+var c=_8d.childNodes;
 for(var i=0;i<c.length;i++){
-var _e5=c[i];
-if(_e5.nodeType===1){
-var _e6=dojox.atom.io.model.util.getNodename(_e5);
-if(_e5.namespaceURI==dojox.atom.io.model._Constants.PURL_NS||_e5.namespaceURI==dojox.atom.io.model._Constants.APP_NS){
-if(_e6==="member-type"){
-this.memberType=dojox.xml.parser.textContent(_e5);
+var _8e=c[i];
+if(_8e.nodeType===1){
+var _8f=dojox.atom.io.model.util.getNodename(_8e);
+if(_8e.namespaceURI==dojox.atom.io.model._Constants.PURL_NS||_8e.namespaceURI==dojox.atom.io.model._Constants.APP_NS){
+if(_8f==="member-type"){
+this.memberType=dojox.xml.parser.textContent(_8e);
 }else{
-if(_e6=="feature"){
-if(_e5.getAttribute("id")){
-this.features.push(_e5.getAttribute("id"));
+if(_8f=="feature"){
+if(_8e.getAttribute("id")){
+this.features.push(_8e.getAttribute("id"));
 }
 }else{
-var _e7=new dojox.atom.io.model.Node();
-_e7.buildFromDom(_e5);
-this.children.push(_e7);
+var _90=new dojox.atom.io.model.Node();
+_90.buildFromDom(_8e);
+this.children.push(_90);
 }
 }
 }else{
-if(_e5.namespaceURI===dojox.atom.io.model._Constants.ATOM_NS){
-if(_e6==="id"){
-this.id=dojox.xml.parser.textContent(_e5);
+if(_8e.namespaceURI===dojox.atom.io.model._Constants.ATOM_NS){
+if(_8f==="id"){
+this.id=dojox.xml.parser.textContent(_8e);
 }else{
-if(_e6==="title"){
-this.title=dojox.xml.parser.textContent(_e5);
+if(_8f==="title"){
+this.title=dojox.xml.parser.textContent(_8e);
 }
 }
 }
diff --git a/dojox/atom/widget/FeedEntryEditor.js b/dojox/atom/widget/FeedEntryEditor.js
index 26d4a5b..ff585f3 100644
--- a/dojox/atom/widget/FeedEntryEditor.js
+++ b/dojox/atom/widget/FeedEntryEditor.js
@@ -18,7 +18,7 @@ dojo.require("dijit.form.SimpleTextarea");
 dojo.requireLocalization("dojox.atom.widget","FeedEntryEditor",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
 dojo.requireLocalization("dojox.atom.widget","PeopleEditor",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
 dojo.experimental("dojox.atom.widget.FeedEntryEditor");
-dojo.declare("dojox.atom.widget.FeedEntryEditor",dojox.atom.widget.FeedEntryViewer,{_contentEditor:null,_oldContent:null,_setObject:null,enableEdit:false,_contentEditorCreator:null,_editors:{},entryNewButton:null,_editable:false,templateString:"<div class=\"feedEntryViewer\">\n    <table border=\"0\" width=\"100%\" class=\"feedEntryViewerMenuTable\" dojoAttachPoint=\"feedEntryViewerMenu\" style=\"display: none;\">\n        <tr width=\"100%\"  dojoAttachPoint=\"entryCheckBoxDisplayOptions [...]
+dojo.declare("dojox.atom.widget.FeedEntryEditor",dojox.atom.widget.FeedEntryViewer,{_contentEditor:null,_oldContent:null,_setObject:null,enableEdit:false,_contentEditorCreator:null,_editors:{},entryNewButton:null,_editable:false,templateString:dojo.cache("dojox.atom","widget/templates/FeedEntryEditor.html","<div class=\"feedEntryViewer\">\n    <table border=\"0\" width=\"100%\" class=\"feedEntryViewerMenuTable\" dojoAttachPoint=\"feedEntryViewerMenu\" style=\"display: none;\">\n        < [...]
 if(this.entrySelectionTopic!==""){
 this._subscriptions=[dojo.subscribe(this.entrySelectionTopic,this,"_handleEvent")];
 }
@@ -81,398 +81,398 @@ break;
 }
 }
 return _7;
-},setTitle:function(_9,_a,_b){
-if(!_a){
-dojox.atom.widget.FeedEntryEditor.superclass.setTitle.call(this,_9,_a,_b);
-if(_b.title&&_b.title.value&&_b.title.value!==null){
+},setTitle:function(_8,_9,_a){
+if(!_9){
+dojox.atom.widget.FeedEntryEditor.superclass.setTitle.call(this,_8,_9,_a);
+if(_a.title&&_a.title.value&&_a.title.value!==null){
 this.setFieldValidity("title",true);
 }
 }else{
-if(_b.title&&_b.title.value&&_b.title.value!==null){
+if(_a.title&&_a.title.value&&_a.title.value!==null){
 if(!this._toLoad){
 this._toLoad=[];
 }
-this.entryTitleSelect.value=_b.title.type;
-var _c=this._createEditor(_9,_b.title,true,_b.title.type==="html"||_b.title.type==="xhtml");
-_c.name="title";
-this._toLoad.push(_c);
+this.entryTitleSelect.value=_a.title.type;
+var _b=this._createEditor(_8,_a.title,true,_a.title.type==="html"||_a.title.type==="xhtml");
+_b.name="title";
+this._toLoad.push(_b);
 this.setFieldValidity("titleedit",true);
 this.setFieldValidity("title",true);
 }
 }
-},setAuthors:function(_d,_e,_f){
-if(!_e){
-dojox.atom.widget.FeedEntryEditor.superclass.setAuthors.call(this,_d,_e,_f);
-if(_f.authors&&_f.authors.length>0){
+},setAuthors:function(_c,_d,_e){
+if(!_d){
+dojox.atom.widget.FeedEntryEditor.superclass.setAuthors.call(this,_c,_d,_e);
+if(_e.authors&&_e.authors.length>0){
 this.setFieldValidity("authors",true);
 }
 }else{
-if(_f.authors&&_f.authors.length>0){
-this._editors.authors=this._createPeopleEditor(this.entryAuthorNode,{data:_f.authors,name:"Author"});
+if(_e.authors&&_e.authors.length>0){
+this._editors.authors=this._createPeopleEditor(this.entryAuthorNode,{data:_e.authors,name:"Author"});
 this.setFieldValidity("authors",true);
 }
 }
-},setContributors:function(_10,_11,_12){
-if(!_11){
-dojox.atom.widget.FeedEntryEditor.superclass.setContributors.call(this,_10,_11,_12);
-if(_12.contributors&&_12.contributors.length>0){
+},setContributors:function(_f,_10,_11){
+if(!_10){
+dojox.atom.widget.FeedEntryEditor.superclass.setContributors.call(this,_f,_10,_11);
+if(_11.contributors&&_11.contributors.length>0){
 this.setFieldValidity("contributors",true);
 }
 }else{
-if(_12.contributors&&_12.contributors.length>0){
-this._editors.contributors=this._createPeopleEditor(this.entryContributorNode,{data:_12.contributors,name:"Contributor"});
+if(_11.contributors&&_11.contributors.length>0){
+this._editors.contributors=this._createPeopleEditor(this.entryContributorNode,{data:_11.contributors,name:"Contributor"});
 this.setFieldValidity("contributors",true);
 }
 }
-},setId:function(_13,_14,_15){
-if(!_14){
-dojox.atom.widget.FeedEntryEditor.superclass.setId.call(this,_13,_14,_15);
-if(_15.id&&_15.id!==null){
+},setId:function(_12,_13,_14){
+if(!_13){
+dojox.atom.widget.FeedEntryEditor.superclass.setId.call(this,_12,_13,_14);
+if(_14.id&&_14.id!==null){
 this.setFieldValidity("id",true);
 }
 }else{
-if(_15.id&&_15.id!==null){
-this._editors.id=this._createEditor(_13,_15.id);
+if(_14.id&&_14.id!==null){
+this._editors.id=this._createEditor(_12,_14.id);
 this.setFieldValidity("id",true);
 }
 }
-},setUpdated:function(_16,_17,_18){
-if(!_17){
-dojox.atom.widget.FeedEntryEditor.superclass.setUpdated.call(this,_16,_17,_18);
-if(_18.updated&&_18.updated!==null){
+},setUpdated:function(_15,_16,_17){
+if(!_16){
+dojox.atom.widget.FeedEntryEditor.superclass.setUpdated.call(this,_15,_16,_17);
+if(_17.updated&&_17.updated!==null){
 this.setFieldValidity("updated",true);
 }
 }else{
-if(_18.updated&&_18.updated!==null){
-this._editors.updated=this._createEditor(_16,_18.updated);
+if(_17.updated&&_17.updated!==null){
+this._editors.updated=this._createEditor(_15,_17.updated);
 this.setFieldValidity("updated",true);
 }
 }
-},setSummary:function(_19,_1a,_1b){
-if(!_1a){
-dojox.atom.widget.FeedEntryEditor.superclass.setSummary.call(this,_19,_1a,_1b);
-if(_1b.summary&&_1b.summary.value&&_1b.summary.value!==null){
+},setSummary:function(_18,_19,_1a){
+if(!_19){
+dojox.atom.widget.FeedEntryEditor.superclass.setSummary.call(this,_18,_19,_1a);
+if(_1a.summary&&_1a.summary.value&&_1a.summary.value!==null){
 this.setFieldValidity("summary",true);
 }
 }else{
-if(_1b.summary&&_1b.summary.value&&_1b.summary.value!==null){
+if(_1a.summary&&_1a.summary.value&&_1a.summary.value!==null){
 if(!this._toLoad){
 this._toLoad=[];
 }
-this.entrySummarySelect.value=_1b.summary.type;
-var _1c=this._createEditor(_19,_1b.summary,true,_1b.summary.type==="html"||_1b.summary.type==="xhtml");
-_1c.name="summary";
-this._toLoad.push(_1c);
+this.entrySummarySelect.value=_1a.summary.type;
+var _1b=this._createEditor(_18,_1a.summary,true,_1a.summary.type==="html"||_1a.summary.type==="xhtml");
+_1b.name="summary";
+this._toLoad.push(_1b);
 this.setFieldValidity("summaryedit",true);
 this.setFieldValidity("summary",true);
 }
 }
-},setContent:function(_1d,_1e,_1f){
-if(!_1e){
-dojox.atom.widget.FeedEntryEditor.superclass.setContent.call(this,_1d,_1e,_1f);
-if(_1f.content&&_1f.content.value&&_1f.content.value!==null){
+},setContent:function(_1c,_1d,_1e){
+if(!_1d){
+dojox.atom.widget.FeedEntryEditor.superclass.setContent.call(this,_1c,_1d,_1e);
+if(_1e.content&&_1e.content.value&&_1e.content.value!==null){
 this.setFieldValidity("content",true);
 }
 }else{
-if(_1f.content&&_1f.content.value&&_1f.content.value!==null){
+if(_1e.content&&_1e.content.value&&_1e.content.value!==null){
 if(!this._toLoad){
 this._toLoad=[];
 }
-this.entryContentSelect.value=_1f.content.type;
-var _20=this._createEditor(_1d,_1f.content,true,_1f.content.type==="html"||_1f.content.type==="xhtml");
-_20.name="content";
-this._toLoad.push(_20);
+this.entryContentSelect.value=_1e.content.type;
+var _1f=this._createEditor(_1c,_1e.content,true,_1e.content.type==="html"||_1e.content.type==="xhtml");
+_1f.name="content";
+this._toLoad.push(_1f);
 this.setFieldValidity("contentedit",true);
 this.setFieldValidity("content",true);
 }
 }
-},_createEditor:function(_21,_22,_23,rte){
-var _25;
+},_createEditor:function(_20,_21,_22,rte){
+var _23;
 var box;
-if(!_22){
+if(!_21){
 if(rte){
-return {anchorNode:_21,entryValue:"",editor:null,generateEditor:function(){
-var _27=document.createElement("div");
-_27.innerHTML=this.entryValue;
-this.anchorNode.appendChild(_27);
-var _28=new dijit.Editor({},_27);
-this.editor=_28;
-return _28;
+return {anchorNode:_20,entryValue:"",editor:null,generateEditor:function(){
+var _24=document.createElement("div");
+_24.innerHTML=this.entryValue;
+this.anchorNode.appendChild(_24);
+var _25=new dijit.Editor({},_24);
+this.editor=_25;
+return _25;
 }};
 }
-if(_23){
-_25=document.createElement("textarea");
-_21.appendChild(_25);
-dojo.style(_25,"width","90%");
-box=new dijit.form.SimpleTextarea({},_25);
+if(_22){
+_23=document.createElement("textarea");
+_20.appendChild(_23);
+dojo.style(_23,"width","90%");
+box=new dijit.form.SimpleTextarea({},_23);
 }else{
-_25=document.createElement("input");
-_21.appendChild(_25);
-dojo.style(_25,"width","95%");
-box=new dijit.form.TextBox({},_25);
+_23=document.createElement("input");
+_20.appendChild(_23);
+dojo.style(_23,"width","95%");
+box=new dijit.form.TextBox({},_23);
 }
 box.attr("value","");
 return box;
 }
-var _29;
-if(_22.value!==undefined){
-_29=_22.value;
+var _26;
+if(_21.value!==undefined){
+_26=_21.value;
 }else{
-if(_22.attr){
-_29=_22.attr("value");
+if(_21.attr){
+_26=_21.attr("value");
 }else{
-_29=_22;
+_26=_21;
 }
 }
 if(rte){
-if(_29.indexOf("<")!=-1){
-_29=_29.replace(/</g,"<");
-}
-return {anchorNode:_21,entryValue:_29,editor:null,generateEditor:function(){
-var _2a=document.createElement("div");
-_2a.innerHTML=this.entryValue;
-this.anchorNode.appendChild(_2a);
-var _2b=new dijit.Editor({},_2a);
-this.editor=_2b;
-return _2b;
+if(_26.indexOf("<")!=-1){
+_26=_26.replace(/</g,"<");
+}
+return {anchorNode:_20,entryValue:_26,editor:null,generateEditor:function(){
+var _27=document.createElement("div");
+_27.innerHTML=this.entryValue;
+this.anchorNode.appendChild(_27);
+var _28=new dijit.Editor({},_27);
+this.editor=_28;
+return _28;
 }};
 }
-if(_23){
-_25=document.createElement("textarea");
-_21.appendChild(_25);
-dojo.style(_25,"width","90%");
-box=new dijit.form.SimpleTextarea({},_25);
+if(_22){
+_23=document.createElement("textarea");
+_20.appendChild(_23);
+dojo.style(_23,"width","90%");
+box=new dijit.form.SimpleTextarea({},_23);
 }else{
-_25=document.createElement("input");
-_21.appendChild(_25);
-dojo.style(_25,"width","95%");
-box=new dijit.form.TextBox({},_25);
+_23=document.createElement("input");
+_20.appendChild(_23);
+dojo.style(_23,"width","95%");
+box=new dijit.form.TextBox({},_23);
 }
-box.attr("value",_29);
+box.attr("value",_26);
 return box;
-},_switchEditor:function(_2c){
-var _2d=null;
-var _2e=null;
-var _2f=null;
+},_switchEditor:function(_29){
+var _2a=null;
+var _2b=null;
+var _2c=null;
 if(dojo.isIE){
-_2e=_2c.srcElement;
+_2b=_29.srcElement;
 }else{
-_2e=_2c.target;
+_2b=_29.target;
 }
-if(_2e===this.entryTitleSelect){
-_2f=this.entryTitleNode;
-_2d="title";
+if(_2b===this.entryTitleSelect){
+_2c=this.entryTitleNode;
+_2a="title";
 }else{
-if(_2e===this.entrySummarySelect){
-_2f=this.entrySummaryNode;
-_2d="summary";
+if(_2b===this.entrySummarySelect){
+_2c=this.entrySummaryNode;
+_2a="summary";
 }else{
-_2f=this.entryContentNode;
-_2d="content";
+_2c=this.entryContentNode;
+_2a="content";
 }
 }
-var _30=this._editors[_2d];
-var _31;
-var _32;
-if(_2e.value==="text"){
-if(_30.declaredClass==="dijit.Editor"){
-_32=_30.attr("value",false);
-_30.close(false,true);
-_30.destroy();
-while(_2f.firstChild){
-dojo.destroy(_2f.firstChild);
+var _2d=this._editors[_2a];
+var _2e;
+var _2f;
+if(_2b.value==="text"){
+if(_2d.declaredClass==="dijit.Editor"){
+_2f=_2d.attr("value",false);
+_2d.close(false,true);
+_2d.destroy();
+while(_2c.firstChild){
+dojo.destroy(_2c.firstChild);
 }
-_31=this._createEditor(_2f,{value:_32},true,false);
-this._editors[_2d]=_31;
+_2e=this._createEditor(_2c,{value:_2f},true,false);
+this._editors[_2a]=_2e;
 }
 }else{
-if(_30.declaredClass!="dijit.Editor"){
-_32=_30.attr("value");
-_30.destroy();
-while(_2f.firstChild){
-dojo.destroy(_2f.firstChild);
+if(_2d.declaredClass!="dijit.Editor"){
+_2f=_2d.attr("value");
+_2d.destroy();
+while(_2c.firstChild){
+dojo.destroy(_2c.firstChild);
 }
-_31=this._createEditor(_2f,{value:_32},true,true);
-_31=dojo.hitch(_31,_31.generateEditor)();
-this._editors[_2d]=_31;
+_2e=this._createEditor(_2c,{value:_2f},true,true);
+_2e=dojo.hitch(_2e,_2e.generateEditor)();
+this._editors[_2a]=_2e;
 }
 }
-},_createPeopleEditor:function(_33,_34){
-var _35=document.createElement("div");
-_33.appendChild(_35);
-return new dojox.atom.widget.PeopleEditor(_34,_35);
+},_createPeopleEditor:function(_30,_31){
+var _32=document.createElement("div");
+_30.appendChild(_32);
+return new dojox.atom.widget.PeopleEditor(_31,_32);
 },saveEdits:function(){
 dojo.style(this.entrySaveCancelButtons,"display","none");
 dojo.style(this.entryEditButton,"display","");
 dojo.style(this.entryNewButton,"display","");
-var _36=false;
-var _37;
+var _33=false;
+var _34;
 var i;
-var _39;
-var _3a;
-var _3b;
-var _3c;
+var _35;
+var _36;
+var _37;
+var _38;
 if(!this._new){
-_3a=this.getEntry();
-if(this._editors.title&&(this._editors.title.attr("value")!=_3a.title.value||this.entryTitleSelect.value!=_3a.title.type)){
-_37=this._editors.title.attr("value");
+_36=this.getEntry();
+if(this._editors.title&&(this._editors.title.attr("value")!=_36.title.value||this.entryTitleSelect.value!=_36.title.type)){
+_34=this._editors.title.attr("value");
 if(this.entryTitleSelect.value==="xhtml"){
-_37=this._enforceXhtml(_37);
-if(_37.indexOf("<div xmlns=\"http://www.w3.org/1999/xhtml\">")!==0){
-_37="<div xmlns=\"http://www.w3.org/1999/xhtml\">"+_37+"</div>";
+_34=this._enforceXhtml(_34);
+if(_34.indexOf("<div xmlns=\"http://www.w3.org/1999/xhtml\">")!==0){
+_34="<div xmlns=\"http://www.w3.org/1999/xhtml\">"+_34+"</div>";
 }
 }
-_3a.title=new dojox.atom.io.model.Content("title",_37,null,this.entryTitleSelect.value);
-_36=true;
+_36.title=new dojox.atom.io.model.Content("title",_34,null,this.entryTitleSelect.value);
+_33=true;
 }
-if(this._editors.id.attr("value")!=_3a.id){
-_3a.id=this._editors.id.attr("value");
-_36=true;
+if(this._editors.id.attr("value")!=_36.id){
+_36.id=this._editors.id.attr("value");
+_33=true;
 }
-if(this._editors.summary&&(this._editors.summary.attr("value")!=_3a.summary.value||this.entrySummarySelect.value!=_3a.summary.type)){
-_37=this._editors.summary.attr("value");
+if(this._editors.summary&&(this._editors.summary.attr("value")!=_36.summary.value||this.entrySummarySelect.value!=_36.summary.type)){
+_34=this._editors.summary.attr("value");
 if(this.entrySummarySelect.value==="xhtml"){
-_37=this._enforceXhtml(_37);
-if(_37.indexOf("<div xmlns=\"http://www.w3.org/1999/xhtml\">")!==0){
-_37="<div xmlns=\"http://www.w3.org/1999/xhtml\">"+_37+"</div>";
+_34=this._enforceXhtml(_34);
+if(_34.indexOf("<div xmlns=\"http://www.w3.org/1999/xhtml\">")!==0){
+_34="<div xmlns=\"http://www.w3.org/1999/xhtml\">"+_34+"</div>";
 }
 }
-_3a.summary=new dojox.atom.io.model.Content("summary",_37,null,this.entrySummarySelect.value);
-_36=true;
+_36.summary=new dojox.atom.io.model.Content("summary",_34,null,this.entrySummarySelect.value);
+_33=true;
 }
-if(this._editors.content&&(this._editors.content.attr("value")!=_3a.content.value||this.entryContentSelect.value!=_3a.content.type)){
-_37=this._editors.content.attr("value");
+if(this._editors.content&&(this._editors.content.attr("value")!=_36.content.value||this.entryContentSelect.value!=_36.content.type)){
+_34=this._editors.content.attr("value");
 if(this.entryContentSelect.value==="xhtml"){
-_37=this._enforceXhtml(_37);
-if(_37.indexOf("<div xmlns=\"http://www.w3.org/1999/xhtml\">")!==0){
-_37="<div xmlns=\"http://www.w3.org/1999/xhtml\">"+_37+"</div>";
+_34=this._enforceXhtml(_34);
+if(_34.indexOf("<div xmlns=\"http://www.w3.org/1999/xhtml\">")!==0){
+_34="<div xmlns=\"http://www.w3.org/1999/xhtml\">"+_34+"</div>";
 }
 }
-_3a.content=new dojox.atom.io.model.Content("content",_37,null,this.entryContentSelect.value);
-_36=true;
+_36.content=new dojox.atom.io.model.Content("content",_34,null,this.entryContentSelect.value);
+_33=true;
 }
 if(this._editors.authors){
-if(_36){
-_3a.authors=[];
-_3b=this._editors.authors.getValues();
-for(i in _3b){
-if(_3b[i].name||_3b[i].email||_3b[i].uri){
-_3a.addAuthor(_3b[i].name,_3b[i].email,_3b[i].uri);
+if(_33){
+_36.authors=[];
+_37=this._editors.authors.getValues();
+for(i in _37){
+if(_37[i].name||_37[i].email||_37[i].uri){
+_36.addAuthor(_37[i].name,_37[i].email,_37[i].uri);
 }
 }
 }else{
-var _3d=_3a.authors;
-var _3e=function(_3f,_40,uri){
-for(i in _3d){
-if(_3d[i].name===_3f&&_3d[i].email===_40&&_3d[i].uri===uri){
+var _39=_36.authors;
+var _3a=function(_3b,_3c,uri){
+for(i in _39){
+if(_39[i].name===_3b&&_39[i].email===_3c&&_39[i].uri===uri){
 return true;
 }
 }
 return false;
 };
-_3b=this._editors.authors.getValues();
-_39=false;
-for(i in _3b){
-if(!_3e(_3b[i].name,_3b[i].email,_3b[i].uri)){
-_39=true;
+_37=this._editors.authors.getValues();
+_35=false;
+for(i in _37){
+if(!_3a(_37[i].name,_37[i].email,_37[i].uri)){
+_35=true;
 break;
 }
 }
-if(_39){
-_3a.authors=[];
-for(i in _3b){
-if(_3b[i].name||_3b[i].email||_3b[i].uri){
-_3a.addAuthor(_3b[i].name,_3b[i].email,_3b[i].uri);
+if(_35){
+_36.authors=[];
+for(i in _37){
+if(_37[i].name||_37[i].email||_37[i].uri){
+_36.addAuthor(_37[i].name,_37[i].email,_37[i].uri);
 }
 }
-_36=true;
+_33=true;
 }
 }
 }
 if(this._editors.contributors){
-if(_36){
-_3a.contributors=[];
-_3c=this._editors.contributors.getValues();
-for(i in _3c){
-if(_3c[i].name||_3c[i].email||_3c[i].uri){
-_3a.addAuthor(_3c[i].name,_3c[i].email,_3c[i].uri);
+if(_33){
+_36.contributors=[];
+_38=this._editors.contributors.getValues();
+for(i in _38){
+if(_38[i].name||_38[i].email||_38[i].uri){
+_36.addAuthor(_38[i].name,_38[i].email,_38[i].uri);
 }
 }
 }else{
-var _42=_3a.contributors;
-var _43=function(_44,_45,uri){
-for(i in _42){
-if(_42[i].name===_44&&_42[i].email===_45&&_42[i].uri===uri){
+var _3d=_36.contributors;
+var _3e=function(_3f,_40,uri){
+for(i in _3d){
+if(_3d[i].name===_3f&&_3d[i].email===_40&&_3d[i].uri===uri){
 return true;
 }
 }
 return false;
 };
-_3c=this._editors.contributors.getValues();
-_39=false;
-for(i in _3c){
-if(_43(_3c[i].name,_3c[i].email,_3c[i].uri)){
-_39=true;
+_38=this._editors.contributors.getValues();
+_35=false;
+for(i in _38){
+if(_3e(_38[i].name,_38[i].email,_38[i].uri)){
+_35=true;
 break;
 }
 }
-if(_39){
-_3a.contributors=[];
-for(i in _3c){
-if(_3c[i].name||_3c[i].email||_3c[i].uri){
-_3a.addContributor(_3c[i].name,_3c[i].email,_3c[i].uri);
+if(_35){
+_36.contributors=[];
+for(i in _38){
+if(_38[i].name||_38[i].email||_38[i].uri){
+_36.addContributor(_38[i].name,_38[i].email,_38[i].uri);
 }
 }
-_36=true;
+_33=true;
 }
 }
 }
-if(_36){
-dojo.publish(this.entrySelectionTopic,[{action:"update",source:this,entry:_3a,callback:this._handleSave}]);
+if(_33){
+dojo.publish(this.entrySelectionTopic,[{action:"update",source:this,entry:_36,callback:this._handleSave}]);
 }
 }else{
 this._new=false;
-_3a=new dojox.atom.io.model.Entry();
-_37=this._editors.title.attr("value");
+_36=new dojox.atom.io.model.Entry();
+_34=this._editors.title.attr("value");
 if(this.entryTitleSelect.value==="xhtml"){
-_37=this._enforceXhtml(_37);
-_37="<div xmlns=\"http://www.w3.org/1999/xhtml\">"+_37+"</div>";
+_34=this._enforceXhtml(_34);
+_34="<div xmlns=\"http://www.w3.org/1999/xhtml\">"+_34+"</div>";
 }
-_3a.setTitle(_37,this.entryTitleSelect.value);
-_3a.id=this._editors.id.attr("value");
-_3b=this._editors.authors.getValues();
-for(i in _3b){
-if(_3b[i].name||_3b[i].email||_3b[i].uri){
-_3a.addAuthor(_3b[i].name,_3b[i].email,_3b[i].uri);
+_36.setTitle(_34,this.entryTitleSelect.value);
+_36.id=this._editors.id.attr("value");
+_37=this._editors.authors.getValues();
+for(i in _37){
+if(_37[i].name||_37[i].email||_37[i].uri){
+_36.addAuthor(_37[i].name,_37[i].email,_37[i].uri);
 }
 }
-_3c=this._editors.contributors.getValues();
-for(i in _3c){
-if(_3c[i].name||_3c[i].email||_3c[i].uri){
-_3a.addContributor(_3c[i].name,_3c[i].email,_3c[i].uri);
+_38=this._editors.contributors.getValues();
+for(i in _38){
+if(_38[i].name||_38[i].email||_38[i].uri){
+_36.addContributor(_38[i].name,_38[i].email,_38[i].uri);
 }
 }
-_37=this._editors.summary.attr("value");
+_34=this._editors.summary.attr("value");
 if(this.entrySummarySelect.value==="xhtml"){
-_37=this._enforceXhtml(_37);
-_37="<div xmlns=\"http://www.w3.org/1999/xhtml\">"+_37+"</div>";
+_34=this._enforceXhtml(_34);
+_34="<div xmlns=\"http://www.w3.org/1999/xhtml\">"+_34+"</div>";
 }
-_3a.summary=new dojox.atom.io.model.Content("summary",_37,null,this.entrySummarySelect.value);
-_37=this._editors.content.attr("value");
+_36.summary=new dojox.atom.io.model.Content("summary",_34,null,this.entrySummarySelect.value);
+_34=this._editors.content.attr("value");
 if(this.entryContentSelect.value==="xhtml"){
-_37=this._enforceXhtml(_37);
-_37="<div xmlns=\"http://www.w3.org/1999/xhtml\">"+_37+"</div>";
+_34=this._enforceXhtml(_34);
+_34="<div xmlns=\"http://www.w3.org/1999/xhtml\">"+_34+"</div>";
 }
-_3a.content=new dojox.atom.io.model.Content("content",_37,null,this.entryContentSelect.value);
+_36.content=new dojox.atom.io.model.Content("content",_34,null,this.entryContentSelect.value);
 dojo.style(this.entryNewButton,"display","");
-dojo.publish(this.entrySelectionTopic,[{action:"post",source:this,entry:_3a}]);
+dojo.publish(this.entrySelectionTopic,[{action:"post",source:this,entry:_36}]);
 }
 this._editMode=false;
-this.setEntry(_3a,this._feed,true);
-},_handleSave:function(_47,_48){
+this.setEntry(_36,this._feed,true);
+},_handleSave:function(_41,_42){
 this._editMode=false;
 this.clear();
-this.setEntry(_47,this.getFeed(),true);
+this.setEntry(_41,this.getFeed(),true);
 },cancelEdits:function(){
 this._new=false;
 dojo.style(this.entrySaveCancelButtons,"display","none");
@@ -499,39 +499,39 @@ this._editors[key].close(false,true);
 this._editors[key].destroy();
 }
 this._editors={};
-},_enforceXhtml:function(_4a){
-var _4b=null;
-if(_4a){
-var _4c=/<br>/g;
-_4b=_4a.replace(_4c,"<br/>");
-_4b=this._closeTag(_4b,"hr");
-_4b=this._closeTag(_4b,"img");
-}
-return _4b;
-},_closeTag:function(_4d,tag){
-var _4f="<"+tag;
-var _50=_4d.indexOf(_4f);
-if(_50!==-1){
-while(_50!==-1){
-var _51="";
-var _52=false;
-for(var i=0;i<_4d.length;i++){
-var c=_4d.charAt(i);
-if(i<=_50||_52){
-_51+=c;
+},_enforceXhtml:function(_43){
+var _44=null;
+if(_43){
+var _45=/<br>/g;
+_44=_43.replace(_45,"<br/>");
+_44=this._closeTag(_44,"hr");
+_44=this._closeTag(_44,"img");
+}
+return _44;
+},_closeTag:function(_46,tag){
+var _47="<"+tag;
+var _48=_46.indexOf(_47);
+if(_48!==-1){
+while(_48!==-1){
+var _49="";
+var _4a=false;
+for(var i=0;i<_46.length;i++){
+var c=_46.charAt(i);
+if(i<=_48||_4a){
+_49+=c;
 }else{
 if(c===">"){
-_51+="/";
-_52=true;
+_49+="/";
+_4a=true;
 }
-_51+=c;
+_49+=c;
 }
 }
-_4d=_51;
-_50=_4d.indexOf(_4f,_50+1);
+_46=_49;
+_48=_46.indexOf(_47,_48+1);
 }
 }
-return _4d;
+return _46;
 },_toggleNew:function(){
 dojo.style(this.entryNewButton,"display","none");
 dojo.style(this.entryEditButton,"display","none");
@@ -541,34 +541,34 @@ this.entryContentSelect.value="text";
 this.entryTitleSelect.value="text";
 this.clearNodes();
 this._new=true;
-var _55=dojo.i18n.getLocalization("dojox.atom.widget","FeedEntryViewer");
-var _56=new dojox.atom.widget.EntryHeader({title:_55.title});
-this.entryTitleHeader.appendChild(_56.domNode);
+var _4b=dojo.i18n.getLocalization("dojox.atom.widget","FeedEntryViewer");
+var _4c=new dojox.atom.widget.EntryHeader({title:_4b.title});
+this.entryTitleHeader.appendChild(_4c.domNode);
 this._editors.title=this._createEditor(this.entryTitleNode,null);
 this.setFieldValidity("title",true);
-var _57=new dojox.atom.widget.EntryHeader({title:_55.authors});
-this.entryAuthorHeader.appendChild(_57.domNode);
+var _4d=new dojox.atom.widget.EntryHeader({title:_4b.authors});
+this.entryAuthorHeader.appendChild(_4d.domNode);
 this._editors.authors=this._createPeopleEditor(this.entryAuthorNode,{name:"Author"});
 this.setFieldValidity("authors",true);
-var _58=new dojox.atom.widget.EntryHeader({title:_55.contributors});
-this.entryContributorHeader.appendChild(_58.domNode);
+var _4e=new dojox.atom.widget.EntryHeader({title:_4b.contributors});
+this.entryContributorHeader.appendChild(_4e.domNode);
 this._editors.contributors=this._createPeopleEditor(this.entryContributorNode,{name:"Contributor"});
 this.setFieldValidity("contributors",true);
-var _59=new dojox.atom.widget.EntryHeader({title:_55.id});
-this.entryIdHeader.appendChild(_59.domNode);
+var _4f=new dojox.atom.widget.EntryHeader({title:_4b.id});
+this.entryIdHeader.appendChild(_4f.domNode);
 this._editors.id=this._createEditor(this.entryIdNode,null);
 this.setFieldValidity("id",true);
-var _5a=new dojox.atom.widget.EntryHeader({title:_55.updated});
-this.entryUpdatedHeader.appendChild(_5a.domNode);
+var _50=new dojox.atom.widget.EntryHeader({title:_4b.updated});
+this.entryUpdatedHeader.appendChild(_50.domNode);
 this._editors.updated=this._createEditor(this.entryUpdatedNode,null);
 this.setFieldValidity("updated",true);
-var _5b=new dojox.atom.widget.EntryHeader({title:_55.summary});
-this.entrySummaryHeader.appendChild(_5b.domNode);
+var _51=new dojox.atom.widget.EntryHeader({title:_4b.summary});
+this.entrySummaryHeader.appendChild(_51.domNode);
 this._editors.summary=this._createEditor(this.entrySummaryNode,null,true);
 this.setFieldValidity("summaryedit",true);
 this.setFieldValidity("summary",true);
-var _5c=new dojox.atom.widget.EntryHeader({title:_55.content});
-this.entryContentHeader.appendChild(_5c.domNode);
+var _52=new dojox.atom.widget.EntryHeader({title:_4b.content});
+this.entryContentHeader.appendChild(_52.domNode);
 this._editors.content=this._createEditor(this.entryContentNode,null,true);
 this.setFieldValidity("contentedit",true);
 this.setFieldValidity("content",true);
@@ -589,30 +589,30 @@ dojo.style(this.entryTitleSelect,"display","");
 dojox.atom.widget.FeedEntryEditor.superclass._displaySections.apply(this);
 if(this._toLoad){
 for(var i in this._toLoad){
-var _5e;
+var _53;
 if(this._toLoad[i].generateEditor){
-_5e=dojo.hitch(this._toLoad[i],this._toLoad[i].generateEditor)();
+_53=dojo.hitch(this._toLoad[i],this._toLoad[i].generateEditor)();
 }else{
-_5e=this._toLoad[i];
+_53=this._toLoad[i];
 }
-this._editors[this._toLoad[i].name]=_5e;
+this._editors[this._toLoad[i].name]=_53;
 this._toLoad[i]=null;
 }
 this._toLoad=null;
 }
 }});
-dojo.declare("dojox.atom.widget.PeopleEditor",[dijit._Widget,dijit._Templated,dijit._Container],{templateString:"<div class=\"peopleEditor\">\n\t<table style=\"width: 100%\">\n\t\t<tbody dojoAttachPoint=\"peopleEditorEditors\"></tbody>\n\t</table>\n\t<span class=\"peopleEditorButton\" dojoAttachPoint=\"peopleEditorButton\" dojoAttachEvent=\"onclick:_add\"></span>\n</div>\n",_rows:[],_editors:[],_index:0,_numRows:0,postCreate:function(){
-var _5f=dojo.i18n.getLocalization("dojox.atom.widget","PeopleEditor");
+dojo.declare("dojox.atom.widget.PeopleEditor",[dijit._Widget,dijit._Templated,dijit._Container],{templateString:dojo.cache("dojox.atom","widget/templates/PeopleEditor.html","<div class=\"peopleEditor\">\n\t<table style=\"width: 100%\">\n\t\t<tbody dojoAttachPoint=\"peopleEditorEditors\"></tbody>\n\t</table>\n\t<span class=\"peopleEditorButton\" dojoAttachPoint=\"peopleEditorButton\" dojoAttachEvent=\"onclick:_add\"></span>\n</div>\n"),_rows:[],_editors:[],_index:0,_numRows:0,postCreate:f [...]
+var _54=dojo.i18n.getLocalization("dojox.atom.widget","PeopleEditor");
 if(this.name){
 if(this.name=="Author"){
-this.peopleEditorButton.appendChild(document.createTextNode("["+_5f.addAuthor+"]"));
+this.peopleEditorButton.appendChild(document.createTextNode("["+_54.addAuthor+"]"));
 }else{
 if(this.name=="Contributor"){
-this.peopleEditorButton.appendChild(document.createTextNode("["+_5f.addContributor+"]"));
+this.peopleEditorButton.appendChild(document.createTextNode("["+_54.addContributor+"]"));
 }
 }
 }else{
-this.peopleEditorButton.appendChild(document.createTextNode("["+_5f.add+"]"));
+this.peopleEditorButton.appendChild(document.createTextNode("["+_54.add+"]"));
 }
 this._editors=[];
 if(!this.data||this.data.length===0){
@@ -627,96 +627,96 @@ this._numRows++;
 }
 },destroy:function(){
 for(var key in this._editors){
-for(var _62 in this._editors[key]){
-this._editors[key][_62].destroy();
+for(var _55 in this._editors[key]){
+this._editors[key][_55].destroy();
 }
 }
 this._editors=[];
-},_createEditors:function(_63,_64,uri,_66,_67){
+},_createEditors:function(_56,_57,uri,_58,_59){
 var row=document.createElement("tr");
 this.peopleEditorEditors.appendChild(row);
-row.id="removeRow"+_66;
-var _69=document.createElement("td");
-_69.setAttribute("align","right");
-row.appendChild(_69);
-_69.colSpan=2;
+row.id="removeRow"+_58;
+var _5a=document.createElement("td");
+_5a.setAttribute("align","right");
+row.appendChild(_5a);
+_5a.colSpan=2;
 if(this._numRows>0){
 var hr=document.createElement("hr");
-_69.appendChild(hr);
-hr.id="hr"+_66;
+_5a.appendChild(hr);
+hr.id="hr"+_58;
 }
 row=document.createElement("span");
-_69.appendChild(row);
+_5a.appendChild(row);
 row.className="peopleEditorButton";
 dojo.style(row,"font-size","x-small");
 dojo.connect(row,"onclick",this,"_removeEditor");
-row.id="remove"+_66;
-_69=document.createTextNode("[X]");
-row.appendChild(_69);
+row.id="remove"+_58;
+_5a=document.createTextNode("[X]");
+row.appendChild(_5a);
 row=document.createElement("tr");
 this.peopleEditorEditors.appendChild(row);
-row.id="editorsRow"+_66;
-var _6b=document.createElement("td");
-row.appendChild(_6b);
-dojo.style(_6b,"width","20%");
-_69=document.createElement("td");
-row.appendChild(_69);
+row.id="editorsRow"+_58;
+var _5b=document.createElement("td");
+row.appendChild(_5b);
+dojo.style(_5b,"width","20%");
+_5a=document.createElement("td");
+row.appendChild(_5a);
 row=document.createElement("table");
-_6b.appendChild(row);
+_5b.appendChild(row);
 dojo.style(row,"width","100%");
-_6b=document.createElement("tbody");
-row.appendChild(_6b);
+_5b=document.createElement("tbody");
+row.appendChild(_5b);
 row=document.createElement("table");
-_69.appendChild(row);
+_5a.appendChild(row);
 dojo.style(row,"width","100%");
-_69=document.createElement("tbody");
-row.appendChild(_69);
-this._editors[_66]=[];
-this._editors[_66].push(this._createEditor(_63,_67+"name"+_66,"Name:",_6b,_69));
-this._editors[_66].push(this._createEditor(_64,_67+"email"+_66,"Email:",_6b,_69));
-this._editors[_66].push(this._createEditor(uri,_67+"uri"+_66,"URI:",_6b,_69));
-},_createEditor:function(_6c,id,_6e,_6f,_70){
+_5a=document.createElement("tbody");
+row.appendChild(_5a);
+this._editors[_58]=[];
+this._editors[_58].push(this._createEditor(_56,_59+"name"+_58,"Name:",_5b,_5a));
+this._editors[_58].push(this._createEditor(_57,_59+"email"+_58,"Email:",_5b,_5a));
+this._editors[_58].push(this._createEditor(uri,_59+"uri"+_58,"URI:",_5b,_5a));
+},_createEditor:function(_5c,id,_5d,_5e,_5f){
 var row=document.createElement("tr");
-_6f.appendChild(row);
-var _72=document.createElement("label");
-_72.setAttribute("for",id);
-_72.appendChild(document.createTextNode(_6e));
-_6f=document.createElement("td");
-_6f.appendChild(_72);
-row.appendChild(_6f);
+_5e.appendChild(row);
+var _60=document.createElement("label");
+_60.setAttribute("for",id);
+_60.appendChild(document.createTextNode(_5d));
+_5e=document.createElement("td");
+_5e.appendChild(_60);
+row.appendChild(_5e);
 row=document.createElement("tr");
-_70.appendChild(row);
-_70=document.createElement("td");
-row.appendChild(_70);
-var _73=document.createElement("input");
-_73.setAttribute("id",id);
-_70.appendChild(_73);
-dojo.style(_73,"width","95%");
-var box=new dijit.form.TextBox({},_73);
-box.attr("value",_6c);
+_5f.appendChild(row);
+_5f=document.createElement("td");
+row.appendChild(_5f);
+var _61=document.createElement("input");
+_61.setAttribute("id",id);
+_5f.appendChild(_61);
+dojo.style(_61,"width","95%");
+var box=new dijit.form.TextBox({},_61);
+box.attr("value",_5c);
 return box;
-},_removeEditor:function(_75){
-var _76=null;
+},_removeEditor:function(_62){
+var _63=null;
 if(dojo.isIE){
-_76=_75.srcElement;
+_63=_62.srcElement;
 }else{
-_76=_75.target;
+_63=_62.target;
 }
-var id=_76.id;
+var id=_63.id;
 id=id.substring(6);
 for(var key in this._editors[id]){
 this._editors[id][key].destroy();
 }
-var _79=dojo.byId("editorsRow"+id);
-var _7a=_79.parentNode;
-_7a.removeChild(_79);
-_79=dojo.byId("removeRow"+id);
-_7a=_79.parentNode;
-_7a.removeChild(_79);
+var _64=dojo.byId("editorsRow"+id);
+var _65=_64.parentNode;
+_65.removeChild(_64);
+_64=dojo.byId("removeRow"+id);
+_65=_64.parentNode;
+_65.removeChild(_64);
 this._numRows--;
-if(this._numRows===1&&_7a.firstChild.firstChild.firstChild.tagName.toLowerCase()==="hr"){
-_79=_7a.firstChild.firstChild;
-_79.removeChild(_79.firstChild);
+if(this._numRows===1&&_65.firstChild.firstChild.firstChild.tagName.toLowerCase()==="hr"){
+_64=_65.firstChild.firstChild;
+_64.removeChild(_64.firstChild);
 }
 this._editors[id]=null;
 },_add:function(){
@@ -724,12 +724,12 @@ this._createEditors(null,null,null,this._index);
 this._index++;
 this._numRows++;
 },getValues:function(){
-var _7b=[];
+var _66=[];
 for(var i in this._editors){
 if(this._editors[i]){
-_7b.push({name:this._editors[i][0].attr("value"),email:this._editors[i][1].attr("value"),uri:this._editors[i][2].attr("value")});
+_66.push({name:this._editors[i][0].attr("value"),email:this._editors[i][1].attr("value"),uri:this._editors[i][2].attr("value")});
 }
 }
-return _7b;
+return _66;
 }});
 }
diff --git a/dojox/atom/widget/FeedEntryViewer.js b/dojox/atom/widget/FeedEntryViewer.js
index d6d58c0..f0c3a22 100644
--- a/dojox/atom/widget/FeedEntryViewer.js
+++ b/dojox/atom/widget/FeedEntryViewer.js
@@ -16,7 +16,7 @@ dojo.require("dijit.layout.ContentPane");
 dojo.require("dojox.atom.io.Connection");
 dojo.requireLocalization("dojox.atom.widget","FeedEntryViewer",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
 dojo.experimental("dojox.atom.widget.FeedEntryViewer");
-dojo.declare("dojox.atom.widget.FeedEntryViewer",[dijit._Widget,dijit._Templated,dijit._Container],{entrySelectionTopic:"",_validEntryFields:{},displayEntrySections:"",_displayEntrySections:null,enableMenu:false,enableMenuFade:false,_optionButtonDisplayed:true,templateString:"<div class=\"feedEntryViewer\">\n    <table border=\"0\" width=\"100%\" class=\"feedEntryViewerMenuTable\" dojoAttachPoint=\"feedEntryViewerMenu\" style=\"display: none;\">\n        <tr width=\"100%\"  dojoAttachPoi [...]
+dojo.declare("dojox.atom.widget.FeedEntryViewer",[dijit._Widget,dijit._Templated,dijit._Container],{entrySelectionTopic:"",_validEntryFields:{},displayEntrySections:"",_displayEntrySections:null,enableMenu:false,enableMenuFade:false,_optionButtonDisplayed:true,templateString:dojo.cache("dojox.atom","widget/templates/FeedEntryViewer.html","<div class=\"feedEntryViewer\">\n    <table border=\"0\" width=\"100%\" class=\"feedEntryViewerMenuTable\" dojoAttachPoint=\"feedEntryViewerMenu\" styl [...]
 if(this.entrySelectionTopic!==""){
 this._subscriptions=[dojo.subscribe(this.entrySelectionTopic,this,"_handleEvent")];
 }
@@ -136,94 +136,95 @@ var _14=new dojox.atom.widget.EntryHeader({title:_13.authors});
 _11.appendChild(_14.domNode);
 }
 },setAuthors:function(_15,_16,_17){
+_15.innerHTML="";
 if(_17.authors&&_17.authors.length>0){
 for(var i in _17.authors){
 if(_17.authors[i].name){
-var _19=_15;
+var _18=_15;
 if(_17.authors[i].uri){
-var _1a=document.createElement("a");
-_19.appendChild(_1a);
-_1a.href=_17.authors[i].uri;
-_19=_1a;
+var _19=document.createElement("a");
+_18.appendChild(_19);
+_19.href=_17.authors[i].uri;
+_18=_19;
 }
-var _1b=_17.authors[i].name;
+var _1a=_17.authors[i].name;
 if(_17.authors[i].email){
-_1b=_1b+" ("+_17.authors[i].email+")";
+_1a=_1a+" ("+_17.authors[i].email+")";
 }
-var _1c=document.createTextNode(_1b);
-_19.appendChild(_1c);
-var _1d=document.createElement("br");
-_15.appendChild(_1d);
+var _1b=document.createTextNode(_1a);
+_18.appendChild(_1b);
+var _1c=document.createElement("br");
+_15.appendChild(_1c);
 this.setFieldValidity("authors",true);
 }
 }
 }
-},setContributorsHeader:function(_1e,_1f){
-if(_1f.contributors&&_1f.contributors.length>0){
-var _20=dojo.i18n.getLocalization("dojox.atom.widget","FeedEntryViewer");
-var _21=new dojox.atom.widget.EntryHeader({title:_20.contributors});
-_1e.appendChild(_21.domNode);
+},setContributorsHeader:function(_1d,_1e){
+if(_1e.contributors&&_1e.contributors.length>0){
+var _1f=dojo.i18n.getLocalization("dojox.atom.widget","FeedEntryViewer");
+var _20=new dojox.atom.widget.EntryHeader({title:_1f.contributors});
+_1d.appendChild(_20.domNode);
 }
-},setContributors:function(_22,_23,_24){
-if(_24.contributors&&_24.contributors.length>0){
-for(var i in _24.contributors){
-var _26=document.createTextNode(_24.contributors[i].name);
-_22.appendChild(_26);
-var _27=document.createElement("br");
-_22.appendChild(_27);
+},setContributors:function(_21,_22,_23){
+if(_23.contributors&&_23.contributors.length>0){
+for(var i in _23.contributors){
+var _24=document.createTextNode(_23.contributors[i].name);
+_21.appendChild(_24);
+var _25=document.createElement("br");
+_21.appendChild(_25);
 this.setFieldValidity("contributors",true);
 }
 }
-},setIdHeader:function(_28,_29){
-if(_29.id&&_29.id!==null){
-var _2a=dojo.i18n.getLocalization("dojox.atom.widget","FeedEntryViewer");
-var _2b=new dojox.atom.widget.EntryHeader({title:_2a.id});
-_28.appendChild(_2b.domNode);
+},setIdHeader:function(_26,_27){
+if(_27.id&&_27.id!==null){
+var _28=dojo.i18n.getLocalization("dojox.atom.widget","FeedEntryViewer");
+var _29=new dojox.atom.widget.EntryHeader({title:_28.id});
+_26.appendChild(_29.domNode);
 }
-},setId:function(_2c,_2d,_2e){
-if(_2e.id&&_2e.id!==null){
-var _2f=document.createTextNode(_2e.id);
-_2c.appendChild(_2f);
+},setId:function(_2a,_2b,_2c){
+if(_2c.id&&_2c.id!==null){
+var _2d=document.createTextNode(_2c.id);
+_2a.appendChild(_2d);
 this.setFieldValidity("id",true);
 }
-},setUpdatedHeader:function(_30,_31){
-if(_31.updated&&_31.updated!==null){
-var _32=dojo.i18n.getLocalization("dojox.atom.widget","FeedEntryViewer");
-var _33=new dojox.atom.widget.EntryHeader({title:_32.updated});
-_30.appendChild(_33.domNode);
+},setUpdatedHeader:function(_2e,_2f){
+if(_2f.updated&&_2f.updated!==null){
+var _30=dojo.i18n.getLocalization("dojox.atom.widget","FeedEntryViewer");
+var _31=new dojox.atom.widget.EntryHeader({title:_30.updated});
+_2e.appendChild(_31.domNode);
 }
-},setUpdated:function(_34,_35,_36){
-if(_36.updated&&_36.updated!==null){
-var _37=document.createTextNode(_36.updated);
-_34.appendChild(_37);
+},setUpdated:function(_32,_33,_34){
+if(_34.updated&&_34.updated!==null){
+var _35=document.createTextNode(_34.updated);
+_32.appendChild(_35);
 this.setFieldValidity("updated",true);
 }
-},setSummaryHeader:function(_38,_39){
-if(_39.summary&&_39.summary.value&&_39.summary.value!==null){
-var _3a=dojo.i18n.getLocalization("dojox.atom.widget","FeedEntryViewer");
-var _3b=new dojox.atom.widget.EntryHeader({title:_3a.summary});
-_38.appendChild(_3b.domNode);
-}
-},setSummary:function(_3c,_3d,_3e){
-if(_3e.summary&&_3e.summary.value&&_3e.summary.value!==null){
-var _3f=document.createElement("span");
-var _40=new dijit.layout.ContentPane({refreshOnShow:true,executeScripts:false},_3f);
-_40.attr("content",_3e.summary.value);
-_3c.appendChild(_40.domNode);
+},setSummaryHeader:function(_36,_37){
+if(_37.summary&&_37.summary.value&&_37.summary.value!==null){
+var _38=dojo.i18n.getLocalization("dojox.atom.widget","FeedEntryViewer");
+var _39=new dojox.atom.widget.EntryHeader({title:_38.summary});
+_36.appendChild(_39.domNode);
+}
+},setSummary:function(_3a,_3b,_3c){
+if(_3c.summary&&_3c.summary.value&&_3c.summary.value!==null){
+var _3d=document.createElement("span");
+var _3e=new dijit.layout.ContentPane({refreshOnShow:true,executeScripts:false},_3d);
+_3e.attr("content",_3c.summary.value);
+_3a.appendChild(_3e.domNode);
 this.setFieldValidity("summary",true);
 }
-},setContentHeader:function(_41,_42){
-if(_42.content&&_42.content.value&&_42.content.value!==null){
-var _43=dojo.i18n.getLocalization("dojox.atom.widget","FeedEntryViewer");
-var _44=new dojox.atom.widget.EntryHeader({title:_43.content});
-_41.appendChild(_44.domNode);
-}
-},setContent:function(_45,_46,_47){
-if(_47.content&&_47.content.value&&_47.content.value!==null){
-var _48=document.createElement("span");
-var _49=new dijit.layout.ContentPane({refreshOnShow:true,executeScripts:false},_48);
-_49.attr("content",_47.content.value);
-_45.appendChild(_49.domNode);
+},setContentHeader:function(_3f,_40){
+if(_40.content&&_40.content.value&&_40.content.value!==null){
+var _41=dojo.i18n.getLocalization("dojox.atom.widget","FeedEntryViewer");
+var _42=new dojox.atom.widget.EntryHeader({title:_41.content});
+_3f.appendChild(_42.domNode);
+}
+},setContent:function(_43,_44,_45){
+if(_45.content&&_45.content.value&&_45.content.value!==null){
+var _46=document.createElement("span");
+var _47=new dijit.layout.ContentPane({refreshOnShow:true,executeScripts:false},_46);
+_47.attr("content",_45.content.value);
+_43.appendChild(_47.domNode);
 this.setFieldValidity("content",true);
 }
 },_displaySections:function(){
@@ -235,93 +236,93 @@ dojo.style(this.entryContentRow,"display","none");
 dojo.style(this.entryIdRow,"display","none");
 dojo.style(this.entryUpdatedRow,"display","none");
 for(var i in this._displayEntrySections){
-var _4b=this._displayEntrySections[i].toLowerCase();
-if(_4b==="title"&&this.isFieldValid("title")){
+var _48=this._displayEntrySections[i].toLowerCase();
+if(_48==="title"&&this.isFieldValid("title")){
 dojo.style(this.entryTitleRow,"display","");
 }
-if(_4b==="authors"&&this.isFieldValid("authors")){
+if(_48==="authors"&&this.isFieldValid("authors")){
 dojo.style(this.entryAuthorRow,"display","");
 }
-if(_4b==="contributors"&&this.isFieldValid("contributors")){
+if(_48==="contributors"&&this.isFieldValid("contributors")){
 dojo.style(this.entryContributorRow,"display","");
 }
-if(_4b==="summary"&&this.isFieldValid("summary")){
+if(_48==="summary"&&this.isFieldValid("summary")){
 dojo.style(this.entrySummaryRow,"display","");
 }
-if(_4b==="content"&&this.isFieldValid("content")){
+if(_48==="content"&&this.isFieldValid("content")){
 dojo.style(this.entryContentRow,"display","");
 }
-if(_4b==="id"&&this.isFieldValid("id")){
+if(_48==="id"&&this.isFieldValid("id")){
 dojo.style(this.entryIdRow,"display","");
 }
-if(_4b==="updated"&&this.isFieldValid("updated")){
+if(_48==="updated"&&this.isFieldValid("updated")){
 dojo.style(this.entryUpdatedRow,"display","");
 }
 }
-},setDisplaySections:function(_4c){
-if(_4c!==null){
-this._displayEntrySections=_4c;
+},setDisplaySections:function(_49){
+if(_49!==null){
+this._displayEntrySections=_49;
 this._displaySections();
 }else{
 this._displayEntrySections=["title","authors","contributors","summary","content","id","updated"];
 }
 },_setDisplaySectionsCheckboxes:function(){
-var _4d=["title","authors","contributors","summary","content","id","updated"];
-for(var i in _4d){
-if(dojo.indexOf(this._displayEntrySections,_4d[i])==-1){
-dojo.style(this["feedEntryCell"+_4d[i]],"display","none");
+var _4a=["title","authors","contributors","summary","content","id","updated"];
+for(var i in _4a){
+if(dojo.indexOf(this._displayEntrySections,_4a[i])==-1){
+dojo.style(this["feedEntryCell"+_4a[i]],"display","none");
 }else{
-this["feedEntryCheckBox"+_4d[i].substring(0,1).toUpperCase()+_4d[i].substring(1)].checked=true;
+this["feedEntryCheckBox"+_4a[i].substring(0,1).toUpperCase()+_4a[i].substring(1)].checked=true;
 }
 }
 },_readDisplaySections:function(){
-var _4f=[];
+var _4b=[];
 if(this.feedEntryCheckBoxTitle.checked){
-_4f.push("title");
+_4b.push("title");
 }
 if(this.feedEntryCheckBoxAuthors.checked){
-_4f.push("authors");
+_4b.push("authors");
 }
 if(this.feedEntryCheckBoxContributors.checked){
-_4f.push("contributors");
+_4b.push("contributors");
 }
 if(this.feedEntryCheckBoxSummary.checked){
-_4f.push("summary");
+_4b.push("summary");
 }
 if(this.feedEntryCheckBoxContent.checked){
-_4f.push("content");
+_4b.push("content");
 }
 if(this.feedEntryCheckBoxId.checked){
-_4f.push("id");
+_4b.push("id");
 }
 if(this.feedEntryCheckBoxUpdated.checked){
-_4f.push("updated");
+_4b.push("updated");
 }
-this._displayEntrySections=_4f;
-},_toggleCheckbox:function(_50){
-if(_50.checked){
-_50.checked=false;
+this._displayEntrySections=_4b;
+},_toggleCheckbox:function(_4c){
+if(_4c.checked){
+_4c.checked=false;
 }else{
-_50.checked=true;
+_4c.checked=true;
 }
 this._readDisplaySections();
 this._displaySections();
-},_toggleOptions:function(_51){
+},_toggleOptions:function(_4d){
 if(this.enableMenu){
-var _52=null;
-var _53;
-var _54;
+var _4e=null;
+var _4f;
+var _50;
 if(this._optionButtonDisplayed){
 if(this.enableMenuFade){
-_53=dojo.fadeOut({node:this.entryCheckBoxDisplayOptions,duration:250});
-dojo.connect(_53,"onEnd",this,function(){
+_4f=dojo.fadeOut({node:this.entryCheckBoxDisplayOptions,duration:250});
+dojo.connect(_4f,"onEnd",this,function(){
 dojo.style(this.entryCheckBoxDisplayOptions,"display","none");
 dojo.style(this.entryCheckBoxRow,"display","");
 dojo.style(this.entryCheckBoxRow2,"display","");
 dojo.fadeIn({node:this.entryCheckBoxRow,duration:250}).play();
 dojo.fadeIn({node:this.entryCheckBoxRow2,duration:250}).play();
 });
-_53.play();
+_4f.play();
 }else{
 dojo.style(this.entryCheckBoxDisplayOptions,"display","none");
 dojo.style(this.entryCheckBoxRow,"display","");
@@ -330,16 +331,16 @@ dojo.style(this.entryCheckBoxRow2,"display","");
 this._optionButtonDisplayed=false;
 }else{
 if(this.enableMenuFade){
-_53=dojo.fadeOut({node:this.entryCheckBoxRow,duration:250});
-_54=dojo.fadeOut({node:this.entryCheckBoxRow2,duration:250});
-dojo.connect(_53,"onEnd",this,function(){
+_4f=dojo.fadeOut({node:this.entryCheckBoxRow,duration:250});
+_50=dojo.fadeOut({node:this.entryCheckBoxRow2,duration:250});
+dojo.connect(_4f,"onEnd",this,function(){
 dojo.style(this.entryCheckBoxRow,"display","none");
 dojo.style(this.entryCheckBoxRow2,"display","none");
 dojo.style(this.entryCheckBoxDisplayOptions,"display","");
 dojo.fadeIn({node:this.entryCheckBoxDisplayOptions,duration:250}).play();
 });
-_53.play();
-_54.play();
+_4f.play();
+_50.play();
 }else{
 dojo.style(this.entryCheckBoxRow,"display","none");
 dojo.style(this.entryCheckBoxRow2,"display","none");
@@ -348,23 +349,23 @@ dojo.style(this.entryCheckBoxDisplayOptions,"display","");
 this._optionButtonDisplayed=true;
 }
 }
-},_handleEvent:function(_55){
-if(_55.source!=this){
-if(_55.action=="set"&&_55.entry){
-this.setEntry(_55.entry,_55.feed);
+},_handleEvent:function(_51){
+if(_51.source!=this){
+if(_51.action=="set"&&_51.entry){
+this.setEntry(_51.entry,_51.feed);
 }else{
-if(_55.action=="delete"&&_55.entry&&_55.entry==this._entry){
+if(_51.action=="delete"&&_51.entry&&_51.entry==this._entry){
 this.clear();
 }
 }
 }
-},setFieldValidity:function(_56,_57){
-if(_56){
-var _58=_56.toLowerCase();
-this._validEntryFields[_56]=_57;
+},setFieldValidity:function(_52,_53){
+if(_52){
+var _54=_52.toLowerCase();
+this._validEntryFields[_52]=_53;
 }
-},isFieldValid:function(_59){
-return this._validEntryFields[_59.toLowerCase()];
+},isFieldValid:function(_55){
+return this._validEntryFields[_55.toLowerCase()];
 },getEntry:function(){
 return this._entry;
 },getFeed:function(){
@@ -373,15 +374,15 @@ return this._feed;
 this.clear();
 dojo.forEach(this._subscriptions,dojo.unsubscribe);
 }});
-dojo.declare("dojox.atom.widget.EntryHeader",[dijit._Widget,dijit._Templated,dijit._Container],{title:"",templateString:"<span dojoAttachPoint=\"entryHeaderNode\" class=\"entryHeaderNode\"></span>\n",postCreate:function(){
+dojo.declare("dojox.atom.widget.EntryHeader",[dijit._Widget,dijit._Templated,dijit._Container],{title:"",templateString:dojo.cache("dojox.atom","widget/templates/EntryHeader.html","<span dojoAttachPoint=\"entryHeaderNode\" class=\"entryHeaderNode\"></span>\n"),postCreate:function(){
 this.setListHeader();
-},setListHeader:function(_5a){
+},setListHeader:function(_56){
 this.clear();
-if(_5a){
-this.title=_5a;
+if(_56){
+this.title=_56;
 }
-var _5b=document.createTextNode(this.title);
-this.entryHeaderNode.appendChild(_5b);
+var _57=document.createTextNode(this.title);
+this.entryHeaderNode.appendChild(_57);
 },clear:function(){
 this.destroyDescendants();
 if(this.entryHeaderNode){
diff --git a/dojox/atom/widget/FeedViewer.js b/dojox/atom/widget/FeedViewer.js
index 707df1b..61fc72f 100644
--- a/dojox/atom/widget/FeedViewer.js
+++ b/dojox/atom/widget/FeedViewer.js
@@ -14,7 +14,7 @@ dojo.require("dijit._Container");
 dojo.require("dojox.atom.io.Connection");
 dojo.requireLocalization("dojox.atom.widget","FeedViewerEntry",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
 dojo.experimental("dojox.atom.widget.FeedViewer");
-dojo.declare("dojox.atom.widget.FeedViewer",[dijit._Widget,dijit._Templated,dijit._Container],{feedViewerTableBody:null,feedViewerTable:null,entrySelectionTopic:"",url:"",xmethod:false,localSaveOnly:false,templateString:"<div class=\"feedViewerContainer\" dojoAttachPoint=\"feedViewerContainerNode\">\n\t<table cellspacing=\"0\" cellpadding=\"0\" class=\"feedViewerTable\">\n\t\t<tbody dojoAttachPoint=\"feedViewerTableBody\" class=\"feedViewerTableBody\">\n\t\t</tbody>\n\t</table>\n</div>\n [...]
+dojo.declare("dojox.atom.widget.FeedViewer",[dijit._Widget,dijit._Templated,dijit._Container],{feedViewerTableBody:null,feedViewerTable:null,entrySelectionTopic:"",url:"",xmethod:false,localSaveOnly:false,templateString:dojo.cache("dojox.atom","widget/templates/FeedViewer.html","<div class=\"feedViewerContainer\" dojoAttachPoint=\"feedViewerContainerNode\">\n\t<table cellspacing=\"0\" cellpadding=\"0\" class=\"feedViewerTable\">\n\t\t<tbody dojoAttachPoint=\"feedViewerTableBody\" class=\ [...]
 this._includeFilters=[];
 if(this.entrySelectionTopic!==""){
 this._subscriptions=[dojo.subscribe(this.entrySelectionTopic,this,"_handleEvent")];
@@ -25,10 +25,10 @@ this.childWidgets=[];
 this.containerNode=this.feedViewerTableBody;
 var _1=this.getDescendants();
 for(var i in _1){
-var _3=_1[i];
-if(_3&&_3.isFilter){
-this._includeFilters.push(new dojox.atom.widget.FeedViewer.CategoryIncludeFilter(_3.scheme,_3.term,_3.label));
-_3.destroy();
+var _2=_1[i];
+if(_2&&_2.isFilter){
+this._includeFilters.push(new dojox.atom.widget.FeedViewer.CategoryIncludeFilter(_2.scheme,_2.term,_2.label));
+_2.destroy();
 }
 }
 if(this.url!==""){
@@ -36,136 +36,136 @@ this.setFeedFromUrl(this.url);
 }
 },clear:function(){
 this.destroyDescendants();
-},setFeedFromUrl:function(_4){
-if(_4!==""){
-if(this._isRelativeURL(_4)){
-var _5="";
-if(_4.charAt(0)!=="/"){
-_5=this._calculateBaseURL(window.location.href,true);
+},setFeedFromUrl:function(_3){
+if(_3!==""){
+if(this._isRelativeURL(_3)){
+var _4="";
+if(_3.charAt(0)!=="/"){
+_4=this._calculateBaseURL(window.location.href,true);
 }else{
-_5=this._calculateBaseURL(window.location.href,false);
+_4=this._calculateBaseURL(window.location.href,false);
 }
-this.url=_5+_4;
+this.url=_4+_3;
 }
-this.atomIO.getFeed(_4,dojo.hitch(this,this.setFeed));
+this.atomIO.getFeed(_3,dojo.hitch(this,this.setFeed));
 }
-},setFeed:function(_6){
-this._feed=_6;
+},setFeed:function(_5){
+this._feed=_5;
 this.clear();
-var _7=function(a,b){
-var _a=this._displayDateForEntry(a);
-var _b=this._displayDateForEntry(b);
-if(_a>_b){
+var _6=function(a,b){
+var _7=this._displayDateForEntry(a);
+var _8=this._displayDateForEntry(b);
+if(_7>_8){
 return -1;
 }
-if(_a<_b){
+if(_7<_8){
 return 1;
 }
 return 0;
 };
-var _c=function(_d){
-var _e=_d.split(",");
-_e.pop();
-return _e.join(",");
+var _9=function(_a){
+var _b=_a.split(",");
+_b.pop();
+return _b.join(",");
 };
-var _f=_6.entries.sort(dojo.hitch(this,_7));
-if(_6){
-var _10=null;
-for(var i=0;i<_f.length;i++){
-var _12=_f[i];
-if(this._isFilterAccepted(_12)){
-var _13=this._displayDateForEntry(_12);
-var _14="";
-if(_13!==null){
-_14=_c(_13.toLocaleString());
-if(_14===""){
-_14=""+(_13.getMonth()+1)+"/"+_13.getDate()+"/"+_13.getFullYear();
+var _c=_5.entries.sort(dojo.hitch(this,_6));
+if(_5){
+var _d=null;
+for(var i=0;i<_c.length;i++){
+var _e=_c[i];
+if(this._isFilterAccepted(_e)){
+var _f=this._displayDateForEntry(_e);
+var _10="";
+if(_f!==null){
+_10=_9(_f.toLocaleString());
+if(_10===""){
+_10=""+(_f.getMonth()+1)+"/"+_f.getDate()+"/"+_f.getFullYear();
 }
 }
-if((_10===null)||(_10!=_14)){
-this.appendGrouping(_14);
-_10=_14;
+if((_d===null)||(_d!=_10)){
+this.appendGrouping(_10);
+_d=_10;
 }
-this.appendEntry(_12);
+this.appendEntry(_e);
 }
 }
 }
-},_displayDateForEntry:function(_15){
-if(_15.updated){
-return _15.updated;
+},_displayDateForEntry:function(_11){
+if(_11.updated){
+return _11.updated;
 }
-if(_15.modified){
-return _15.modified;
+if(_11.modified){
+return _11.modified;
 }
-if(_15.issued){
-return _15.issued;
+if(_11.issued){
+return _11.issued;
 }
 return new Date();
-},appendGrouping:function(_16){
-var _17=new dojox.atom.widget.FeedViewerGrouping({});
-_17.setText(_16);
-this.addChild(_17);
-this.childWidgets.push(_17);
-},appendEntry:function(_18){
-var _19=new dojox.atom.widget.FeedViewerEntry({"xmethod":this.xmethod});
-_19.setTitle(_18.title.value);
-_19.setTime(this._displayDateForEntry(_18).toLocaleTimeString());
-_19.entrySelectionTopic=this.entrySelectionTopic;
-_19.feed=this;
-this.addChild(_19);
-this.childWidgets.push(_19);
-this.connect(_19,"onClick","_rowSelected");
-_18.domNode=_19.entryNode;
-_18._entryWidget=_19;
-_19.entry=_18;
-},deleteEntry:function(_1a){
+},appendGrouping:function(_12){
+var _13=new dojox.atom.widget.FeedViewerGrouping({});
+_13.setText(_12);
+this.addChild(_13);
+this.childWidgets.push(_13);
+},appendEntry:function(_14){
+var _15=new dojox.atom.widget.FeedViewerEntry({"xmethod":this.xmethod});
+_15.setTitle(_14.title.value);
+_15.setTime(this._displayDateForEntry(_14).toLocaleTimeString());
+_15.entrySelectionTopic=this.entrySelectionTopic;
+_15.feed=this;
+this.addChild(_15);
+this.childWidgets.push(_15);
+this.connect(_15,"onClick","_rowSelected");
+_14.domNode=_15.entryNode;
+_14._entryWidget=_15;
+_15.entry=_14;
+},deleteEntry:function(_16){
 if(!this.localSaveOnly){
-this.atomIO.deleteEntry(_1a.entry,dojo.hitch(this,this._removeEntry,_1a),null,this.xmethod);
+this.atomIO.deleteEntry(_16.entry,dojo.hitch(this,this._removeEntry,_16),null,this.xmethod);
 }else{
-this._removeEntry(_1a,true);
-}
-dojo.publish(this.entrySelectionTopic,[{action:"delete",source:this,entry:_1a.entry}]);
-},_removeEntry:function(_1b,_1c){
-if(_1c){
-var idx=dojo.indexOf(this.childWidgets,_1b);
-var _1e=this.childWidgets[idx-1];
-var _1f=this.childWidgets[idx+1];
-if(_1e.declaredClass==="dojox.atom.widget.FeedViewerGrouping"&&(_1f===undefined||_1f.declaredClass==="dojox.atom.widget.FeedViewerGrouping")){
-_1e.destroy();
-}
-_1b.destroy();
+this._removeEntry(_16,true);
+}
+dojo.publish(this.entrySelectionTopic,[{action:"delete",source:this,entry:_16.entry}]);
+},_removeEntry:function(_17,_18){
+if(_18){
+var idx=dojo.indexOf(this.childWidgets,_17);
+var _19=this.childWidgets[idx-1];
+var _1a=this.childWidgets[idx+1];
+if(_19.declaredClass==="dojox.atom.widget.FeedViewerGrouping"&&(_1a===undefined||_1a.declaredClass==="dojox.atom.widget.FeedViewerGrouping")){
+_19.destroy();
+}
+_17.destroy();
 }else{
 }
 },_rowSelected:function(evt){
-var _21=evt.target;
-while(_21){
-if(_21.attributes){
-var _22=_21.attributes.getNamedItem("widgetid");
-if(_22&&_22.value.indexOf("FeedViewerEntry")!=-1){
+var _1b=evt.target;
+while(_1b){
+if(_1b.attributes){
+var _1c=_1b.attributes.getNamedItem("widgetid");
+if(_1c&&_1c.value.indexOf("FeedViewerEntry")!=-1){
 break;
 }
 }
-_21=_21.parentNode;
+_1b=_1b.parentNode;
 }
 for(var i=0;i<this._feed.entries.length;i++){
-var _24=this._feed.entries[i];
-if((_21===_24.domNode)&&(this._currentSelection!==_24)){
-dojo.addClass(_24.domNode,"feedViewerEntrySelected");
-dojo.removeClass(_24._entryWidget.timeNode,"feedViewerEntryUpdated");
-dojo.addClass(_24._entryWidget.timeNode,"feedViewerEntryUpdatedSelected");
-this.onEntrySelected(_24);
+var _1d=this._feed.entries[i];
+if((_1b===_1d.domNode)&&(this._currentSelection!==_1d)){
+dojo.addClass(_1d.domNode,"feedViewerEntrySelected");
+dojo.removeClass(_1d._entryWidget.timeNode,"feedViewerEntryUpdated");
+dojo.addClass(_1d._entryWidget.timeNode,"feedViewerEntryUpdatedSelected");
+this.onEntrySelected(_1d);
 if(this.entrySelectionTopic!==""){
-dojo.publish(this.entrySelectionTopic,[{action:"set",source:this,feed:this._feed,entry:_24}]);
+dojo.publish(this.entrySelectionTopic,[{action:"set",source:this,feed:this._feed,entry:_1d}]);
 }
-if(this._isEditable(_24)){
-_24._entryWidget.enableDelete();
+if(this._isEditable(_1d)){
+_1d._entryWidget.enableDelete();
 }
 this._deselectCurrentSelection();
-this._currentSelection=_24;
+this._currentSelection=_1d;
 break;
 }else{
-if((_21===_24.domNode)&&(this._currentSelection===_24)){
-dojo.publish(this.entrySelectionTopic,[{action:"delete",source:this,entry:_24}]);
+if((_1b===_1d.domNode)&&(this._currentSelection===_1d)){
+dojo.publish(this.entrySelectionTopic,[{action:"delete",source:this,entry:_1d}]);
 this._deselectCurrentSelection();
 break;
 }
@@ -179,180 +179,180 @@ dojo.removeClass(this._currentSelection._entryWidget.timeNode,"feedViewerEntryUp
 this._currentSelection._entryWidget.disableDelete();
 this._currentSelection=null;
 }
-},_isEditable:function(_25){
-var _26=false;
-if(_25&&_25!==null&&_25.links&&_25.links!==null){
-for(var x in _25.links){
-if(_25.links[x].rel&&_25.links[x].rel=="edit"){
-_26=true;
+},_isEditable:function(_1e){
+var _1f=false;
+if(_1e&&_1e!==null&&_1e.links&&_1e.links!==null){
+for(var x in _1e.links){
+if(_1e.links[x].rel&&_1e.links[x].rel=="edit"){
+_1f=true;
 break;
 }
 }
 }
-return _26;
-},onEntrySelected:function(_28){
+return _1f;
+},onEntrySelected:function(_20){
 },_isRelativeURL:function(url){
-function _2a(url){
-var _2c=false;
+var _21=function(url){
+var _22=false;
 if(url.indexOf("file://")===0){
-_2c=true;
+_22=true;
 }
-return _2c;
+return _22;
 };
-function _2d(url){
-var _2f=false;
+var _23=function(url){
+var _24=false;
 if(url.indexOf("http://")===0){
-_2f=true;
+_24=true;
 }
-return _2f;
+return _24;
 };
-var _30=false;
+var _25=false;
 if(url!==null){
-if(!_2a(url)&&!_2d(url)){
-_30=true;
-}
-}
-return _30;
-},_calculateBaseURL:function(_31,_32){
-var _33=null;
-if(_31!==null){
-var _34=_31.indexOf("?");
-if(_34!=-1){
-_31=_31.substring(0,_34);
-}
-if(_32){
-_34=_31.lastIndexOf("/");
-if((_34>0)&&(_34<_31.length)&&(_34!==(_31.length-1))){
-_33=_31.substring(0,(_34+1));
+if(!_21(url)&&!_23(url)){
+_25=true;
+}
+}
+return _25;
+},_calculateBaseURL:function(_26,_27){
+var _28=null;
+if(_26!==null){
+var _29=_26.indexOf("?");
+if(_29!=-1){
+_26=_26.substring(0,_29);
+}
+if(_27){
+_29=_26.lastIndexOf("/");
+if((_29>0)&&(_29<_26.length)&&(_29!==(_26.length-1))){
+_28=_26.substring(0,(_29+1));
 }else{
-_33=_31;
+_28=_26;
 }
 }else{
-_34=_31.indexOf("://");
-if(_34>0){
-_34=_34+3;
-var _35=_31.substring(0,_34);
-var _36=_31.substring(_34,_31.length);
-_34=_36.indexOf("/");
-if((_34<_36.length)&&(_34>0)){
-_33=_35+_36.substring(0,_34);
+_29=_26.indexOf("://");
+if(_29>0){
+_29=_29+3;
+var _2a=_26.substring(0,_29);
+var _2b=_26.substring(_29,_26.length);
+_29=_2b.indexOf("/");
+if((_29<_2b.length)&&(_29>0)){
+_28=_2a+_2b.substring(0,_29);
 }else{
-_33=_35+_36;
+_28=_2a+_2b;
 }
 }
 }
 }
-return _33;
-},_isFilterAccepted:function(_37){
-var _38=false;
+return _28;
+},_isFilterAccepted:function(_2c){
+var _2d=false;
 if(this._includeFilters&&(this._includeFilters.length>0)){
 for(var i=0;i<this._includeFilters.length;i++){
-var _3a=this._includeFilters[i];
-if(_3a.match(_37)){
-_38=true;
+var _2e=this._includeFilters[i];
+if(_2e.match(_2c)){
+_2d=true;
 break;
 }
 }
 }else{
-_38=true;
+_2d=true;
 }
-return _38;
-},addCategoryIncludeFilter:function(_3b){
-if(_3b){
-var _3c=_3b.scheme;
-var _3d=_3b.term;
-var _3e=_3b.label;
-var _3f=true;
-if(!_3c){
-_3c=null;
+return _2d;
+},addCategoryIncludeFilter:function(_2f){
+if(_2f){
+var _30=_2f.scheme;
+var _31=_2f.term;
+var _32=_2f.label;
+var _33=true;
+if(!_30){
+_30=null;
 }
-if(!_3d){
-_3c=null;
+if(!_31){
+_30=null;
 }
-if(!_3e){
-_3c=null;
+if(!_32){
+_30=null;
 }
 if(this._includeFilters&&this._includeFilters.length>0){
 for(var i=0;i<this._includeFilters.length;i++){
-var _41=this._includeFilters[i];
-if((_41.term===_3d)&&(_41.scheme===_3c)&&(_41.label===_3e)){
-_3f=false;
+var _34=this._includeFilters[i];
+if((_34.term===_31)&&(_34.scheme===_30)&&(_34.label===_32)){
+_33=false;
 break;
 }
 }
 }
-if(_3f){
-this._includeFilters.push(dojox.atom.widget.FeedViewer.CategoryIncludeFilter(_3c,_3d,_3e));
+if(_33){
+this._includeFilters.push(dojox.atom.widget.FeedViewer.CategoryIncludeFilter(_30,_31,_32));
 }
 }
-},removeCategoryIncludeFilter:function(_42){
-if(_42){
-var _43=_42.scheme;
-var _44=_42.term;
-var _45=_42.label;
-if(!_43){
-_43=null;
+},removeCategoryIncludeFilter:function(_35){
+if(_35){
+var _36=_35.scheme;
+var _37=_35.term;
+var _38=_35.label;
+if(!_36){
+_36=null;
 }
-if(!_44){
-_43=null;
+if(!_37){
+_36=null;
 }
-if(!_45){
-_43=null;
+if(!_38){
+_36=null;
 }
-var _46=[];
+var _39=[];
 if(this._includeFilters&&this._includeFilters.length>0){
 for(var i=0;i<this._includeFilters.length;i++){
-var _48=this._includeFilters[i];
-if(!((_48.term===_44)&&(_48.scheme===_43)&&(_48.label===_45))){
-_46.push(_48);
+var _3a=this._includeFilters[i];
+if(!((_3a.term===_37)&&(_3a.scheme===_36)&&(_3a.label===_38))){
+_39.push(_3a);
 }
 }
-this._includeFilters=_46;
+this._includeFilters=_39;
 }
 }
-},_handleEvent:function(_49){
-if(_49.source!=this){
-if(_49.action=="update"&&_49.entry){
-var evt=_49;
+},_handleEvent:function(_3b){
+if(_3b.source!=this){
+if(_3b.action=="update"&&_3b.entry){
+var evt=_3b;
 if(!this.localSaveOnly){
 this.atomIO.updateEntry(evt.entry,dojo.hitch(evt.source,evt.callback),null,true);
 }
 this._currentSelection._entryWidget.setTime(this._displayDateForEntry(evt.entry).toLocaleTimeString());
 this._currentSelection._entryWidget.setTitle(evt.entry.title.value);
 }else{
-if(_49.action=="post"&&_49.entry){
+if(_3b.action=="post"&&_3b.entry){
 if(!this.localSaveOnly){
-this.atomIO.addEntry(_49.entry,this.url,dojo.hitch(this,this._addEntry));
+this.atomIO.addEntry(_3b.entry,this.url,dojo.hitch(this,this._addEntry));
 }else{
-this._addEntry(_49.entry);
+this._addEntry(_3b.entry);
 }
 }
 }
 }
-},_addEntry:function(_4b){
-this._feed.addEntry(_4b);
+},_addEntry:function(_3c){
+this._feed.addEntry(_3c);
 this.setFeed(this._feed);
-dojo.publish(this.entrySelectionTopic,[{action:"set",source:this,feed:this._feed,entry:_4b}]);
+dojo.publish(this.entrySelectionTopic,[{action:"set",source:this,feed:this._feed,entry:_3c}]);
 },destroy:function(){
 this.clear();
 dojo.forEach(this._subscriptions,dojo.unsubscribe);
 }});
-dojo.declare("dojox.atom.widget.FeedViewerEntry",[dijit._Widget,dijit._Templated],{templateString:"<tr class=\"feedViewerEntry\" dojoAttachPoint=\"entryNode\" dojoAttachEvent=\"onclick:onClick\">\n    <td class=\"feedViewerEntryUpdated\" dojoAttachPoint=\"timeNode\">\n    </td>\n    <td>\n        <table border=\"0\" width=\"100%\" dojoAttachPoint=\"titleRow\">\n            <tr padding=\"0\" border=\"0\">\n                <td class=\"feedViewerEntryTitle\" dojoAttachPoint=\"titleNode\">\n [...]
-var _4c=dojo.i18n.getLocalization("dojox.atom.widget","FeedViewerEntry");
-this.deleteButton.innerHTML=_4c.deleteButton;
-},setTitle:function(_4d){
+dojo.declare("dojox.atom.widget.FeedViewerEntry",[dijit._Widget,dijit._Templated],{templateString:dojo.cache("dojox.atom","widget/templates/FeedViewerEntry.html","<tr class=\"feedViewerEntry\" dojoAttachPoint=\"entryNode\" dojoAttachEvent=\"onclick:onClick\">\n    <td class=\"feedViewerEntryUpdated\" dojoAttachPoint=\"timeNode\">\n    </td>\n    <td>\n        <table border=\"0\" width=\"100%\" dojoAttachPoint=\"titleRow\">\n            <tr padding=\"0\" border=\"0\">\n                <td [...]
+var _3d=dojo.i18n.getLocalization("dojox.atom.widget","FeedViewerEntry");
+this.deleteButton.innerHTML=_3d.deleteButton;
+},setTitle:function(_3e){
 if(this.titleNode.lastChild){
 this.titleNode.removeChild(this.titleNode.lastChild);
 }
-var _4e=document.createElement("div");
-_4e.innerHTML=_4d;
-this.titleNode.appendChild(_4e);
-},setTime:function(_4f){
+var _3f=document.createElement("div");
+_3f.innerHTML=_3e;
+this.titleNode.appendChild(_3f);
+},setTime:function(_40){
 if(this.timeNode.lastChild){
 this.timeNode.removeChild(this.timeNode.lastChild);
 }
-var _50=document.createTextNode(_4f);
-this.timeNode.appendChild(_50);
+var _41=document.createTextNode(_40);
+this.timeNode.appendChild(_41);
 },enableDelete:function(){
 if(this.deleteButton!==null){
 this.deleteButton.style.display="inline";
@@ -361,50 +361,50 @@ this.deleteButton.style.display="inline";
 if(this.deleteButton!==null){
 this.deleteButton.style.display="none";
 }
-},deleteEntry:function(_51){
-_51.preventDefault();
-_51.stopPropagation();
+},deleteEntry:function(_42){
+_42.preventDefault();
+_42.stopPropagation();
 this.feed.deleteEntry(this);
 },onClick:function(e){
 }});
-dojo.declare("dojox.atom.widget.FeedViewerGrouping",[dijit._Widget,dijit._Templated],{templateString:"<tr dojoAttachPoint=\"groupingNode\" class=\"feedViewerGrouping\">\n\t<td colspan=\"2\" dojoAttachPoint=\"titleNode\" class=\"feedViewerGroupingTitle\">\n\t</td>\n</tr>\n",groupingNode:null,titleNode:null,setText:function(_53){
+dojo.declare("dojox.atom.widget.FeedViewerGrouping",[dijit._Widget,dijit._Templated],{templateString:dojo.cache("dojox.atom","widget/templates/FeedViewerGrouping.html","<tr dojoAttachPoint=\"groupingNode\" class=\"feedViewerGrouping\">\n\t<td colspan=\"2\" dojoAttachPoint=\"titleNode\" class=\"feedViewerGroupingTitle\">\n\t</td>\n</tr>\n"),groupingNode:null,titleNode:null,setText:function(_43){
 if(this.titleNode.lastChild){
 this.titleNode.removeChild(this.titleNode.lastChild);
 }
-var _54=document.createTextNode(_53);
-this.titleNode.appendChild(_54);
+var _44=document.createTextNode(_43);
+this.titleNode.appendChild(_44);
 }});
 dojo.declare("dojox.atom.widget.AtomEntryCategoryFilter",[dijit._Widget,dijit._Templated],{scheme:"",term:"",label:"",isFilter:true});
-dojo.declare("dojox.atom.widget.FeedViewer.CategoryIncludeFilter",null,{constructor:function(_55,_56,_57){
-this.scheme=_55;
-this.term=_56;
-this.label=_57;
-},match:function(_58){
-var _59=false;
-if(_58!==null){
-var _5a=_58.categories;
-if(_5a!==null){
-for(var i=0;i<_5a.length;i++){
-var _5c=_5a[i];
+dojo.declare("dojox.atom.widget.FeedViewer.CategoryIncludeFilter",null,{constructor:function(_45,_46,_47){
+this.scheme=_45;
+this.term=_46;
+this.label=_47;
+},match:function(_48){
+var _49=false;
+if(_48!==null){
+var _4a=_48.categories;
+if(_4a!==null){
+for(var i=0;i<_4a.length;i++){
+var _4b=_4a[i];
 if(this.scheme!==""){
-if(this.scheme!==_5c.scheme){
+if(this.scheme!==_4b.scheme){
 break;
 }
 }
 if(this.term!==""){
-if(this.term!==_5c.term){
+if(this.term!==_4b.term){
 break;
 }
 }
 if(this.label!==""){
-if(this.label!==_5c.label){
+if(this.label!==_4b.label){
 break;
 }
 }
-_59=true;
+_49=true;
 }
 }
 }
-return _59;
+return _49;
 }});
 }
diff --git a/dojox/atom/widget/nls/sl/FeedEntryEditor.js b/dojox/atom/widget/nls/sl/FeedEntryEditor.js
index 63c1380..8610736 100644
--- a/dojox/atom/widget/nls/sl/FeedEntryEditor.js
+++ b/dojox/atom/widget/nls/sl/FeedEntryEditor.js
@@ -1 +1 @@
-({"edit":"[uredi]","save":"[shrani]","cancel":"[prekliči]","doNew":"[novo]"})
\ No newline at end of file
+({"edit":"[urejanje]","save":"[shrani]","cancel":"[prekliči]","doNew":"[novo]"})
\ No newline at end of file
diff --git a/dojox/charting/Chart2D.js b/dojox/charting/Chart2D.js
index bf0cf7a..35eb86b 100644
--- a/dojox/charting/Chart2D.js
+++ b/dojox/charting/Chart2D.js
@@ -33,15 +33,17 @@ dojo.require("dojox.charting.plot2d.ClusteredBars");
 dojo.require("dojox.charting.plot2d.Grid");
 dojo.require("dojox.charting.plot2d.Pie");
 dojo.require("dojox.charting.plot2d.Bubble");
+dojo.require("dojox.charting.plot2d.Candlesticks");
+dojo.require("dojox.charting.plot2d.OHLC");
 (function(){
-var df=dojox.lang.functional,dc=dojox.charting,_3=df.lambda("item.clear()"),_4=df.lambda("item.purgeGroup()"),_5=df.lambda("item.destroy()"),_6=df.lambda("item.dirty = false"),_7=df.lambda("item.dirty = true");
-dojo.declare("dojox.charting.Chart2D",null,{constructor:function(_8,_9){
-if(!_9){
-_9={};
-}
-this.margins=_9.margins?_9.margins:{l:10,t:10,r:10,b:10};
-this.stroke=_9.stroke;
-this.fill=_9.fill;
+var df=dojox.lang.functional,dc=dojox.charting,_1=df.lambda("item.clear()"),_2=df.lambda("item.purgeGroup()"),_3=df.lambda("item.destroy()"),_4=df.lambda("item.dirty = false"),_5=df.lambda("item.dirty = true");
+dojo.declare("dojox.charting.Chart2D",null,{constructor:function(_6,_7){
+if(!_7){
+_7={};
+}
+this.margins=_7.margins?_7.margins:{l:10,t:10,r:10,b:10};
+this.stroke=_7.stroke;
+this.fill=_7.fill;
 this.theme=null;
 this.axes={};
 this.stack=[];
@@ -50,89 +52,89 @@ this.series=[];
 this.runs={};
 this.dirty=true;
 this.coords=null;
-this.node=dojo.byId(_8);
-var _a=dojo.marginBox(_8);
-this.surface=dojox.gfx.createSurface(this.node,_a.w,_a.h);
+this.node=dojo.byId(_6);
+var _8=dojo.marginBox(_6);
+this.surface=dojox.gfx.createSurface(this.node,_8.w,_8.h);
 },destroy:function(){
-dojo.forEach(this.series,_5);
-dojo.forEach(this.stack,_5);
-df.forIn(this.axes,_5);
+dojo.forEach(this.series,_3);
+dojo.forEach(this.stack,_3);
+df.forIn(this.axes,_3);
 this.surface.destroy();
 },getCoords:function(){
 if(!this.coords){
 this.coords=dojo.coords(this.node,true);
 }
 return this.coords;
-},setTheme:function(_b){
-this.theme=_b._clone();
+},setTheme:function(_9){
+this.theme=_9._clone();
 this.dirty=true;
 return this;
-},addAxis:function(_c,_d){
-var _e;
-if(!_d||!("type" in _d)){
-_e=new dc.axis2d.Default(this,_d);
+},addAxis:function(_a,_b){
+var _c;
+if(!_b||!("type" in _b)){
+_c=new dc.axis2d.Default(this,_b);
 }else{
-_e=typeof _d.type=="string"?new dc.axis2d[_d.type](this,_d):new _d.type(this,_d);
+_c=typeof _b.type=="string"?new dc.axis2d[_b.type](this,_b):new _b.type(this,_b);
 }
-_e.name=_c;
-_e.dirty=true;
-if(_c in this.axes){
-this.axes[_c].destroy();
+_c.name=_a;
+_c.dirty=true;
+if(_a in this.axes){
+this.axes[_a].destroy();
 }
-this.axes[_c]=_e;
+this.axes[_a]=_c;
 this.dirty=true;
 return this;
-},getAxis:function(_f){
-return this.axes[_f];
-},removeAxis:function(_10){
-if(_10 in this.axes){
-this.axes[_10].destroy();
-delete this.axes[_10];
+},getAxis:function(_d){
+return this.axes[_d];
+},removeAxis:function(_e){
+if(_e in this.axes){
+this.axes[_e].destroy();
+delete this.axes[_e];
 this.dirty=true;
 }
 return this;
-},addPlot:function(_11,_12){
-var _13;
-if(!_12||!("type" in _12)){
-_13=new dc.plot2d.Default(this,_12);
+},addPlot:function(_f,_10){
+var _11;
+if(!_10||!("type" in _10)){
+_11=new dc.plot2d.Default(this,_10);
 }else{
-_13=typeof _12.type=="string"?new dc.plot2d[_12.type](this,_12):new _12.type(this,_12);
+_11=typeof _10.type=="string"?new dc.plot2d[_10.type](this,_10):new _10.type(this,_10);
 }
-_13.name=_11;
-_13.dirty=true;
-if(_11 in this.plots){
-this.stack[this.plots[_11]].destroy();
-this.stack[this.plots[_11]]=_13;
+_11.name=_f;
+_11.dirty=true;
+if(_f in this.plots){
+this.stack[this.plots[_f]].destroy();
+this.stack[this.plots[_f]]=_11;
 }else{
-this.plots[_11]=this.stack.length;
-this.stack.push(_13);
+this.plots[_f]=this.stack.length;
+this.stack.push(_11);
 }
 this.dirty=true;
 return this;
-},removePlot:function(_14){
-if(_14 in this.plots){
-var _15=this.plots[_14];
-delete this.plots[_14];
-this.stack[_15].destroy();
-this.stack.splice(_15,1);
-df.forIn(this.plots,function(idx,_17,_18){
-if(idx>_15){
-_18[_17]=idx-1;
+},removePlot:function(_12){
+if(_12 in this.plots){
+var _13=this.plots[_12];
+delete this.plots[_12];
+this.stack[_13].destroy();
+this.stack.splice(_13,1);
+df.forIn(this.plots,function(idx,_14,_15){
+if(idx>_13){
+_15[_14]=idx-1;
 }
 });
 this.dirty=true;
 }
 return this;
-},addSeries:function(_19,_1a,_1b){
-var run=new dc.Series(this,_1a,_1b);
-if(_19 in this.runs){
-this.series[this.runs[_19]].destroy();
-this.series[this.runs[_19]]=run;
+},addSeries:function(_16,_17,_18){
+var run=new dc.Series(this,_17,_18);
+if(_16 in this.runs){
+this.series[this.runs[_16]].destroy();
+this.series[this.runs[_16]]=run;
 }else{
-this.runs[_19]=this.series.length;
+this.runs[_16]=this.series.length;
 this.series.push(run);
 }
-run.name=_19;
+run.name=_16;
 this.dirty=true;
 if(!("ymin" in run)&&"min" in run){
 run.ymin=run.min;
@@ -141,40 +143,40 @@ if(!("ymax" in run)&&"max" in run){
 run.ymax=run.max;
 }
 return this;
-},removeSeries:function(_1d){
-if(_1d in this.runs){
-var _1e=this.runs[_1d],_1f=this.series[_1e].plot;
-delete this.runs[_1d];
-this.series[_1e].destroy();
-this.series.splice(_1e,1);
-df.forIn(this.runs,function(idx,_21,_22){
-if(idx>_1e){
-_22[_21]=idx-1;
+},removeSeries:function(_19){
+if(_19 in this.runs){
+var _1a=this.runs[_19],_1b=this.series[_1a].plot;
+delete this.runs[_19];
+this.series[_1a].destroy();
+this.series.splice(_1a,1);
+df.forIn(this.runs,function(idx,_1c,_1d){
+if(idx>_1a){
+_1d[_1c]=idx-1;
 }
 });
 this.dirty=true;
 }
 return this;
-},updateSeries:function(_23,_24){
-if(_23 in this.runs){
-var run=this.series[this.runs[_23]];
-run.data=_24;
+},updateSeries:function(_1e,_1f){
+if(_1e in this.runs){
+var run=this.series[this.runs[_1e]];
+run.data=_1f;
 run.dirty=true;
 this._invalidateDependentPlots(run.plot,false);
 this._invalidateDependentPlots(run.plot,true);
 }
 return this;
-},resize:function(_26,_27){
+},resize:function(_20,_21){
 var box;
 switch(arguments.length){
 case 0:
 box=dojo.marginBox(this.node);
 break;
 case 1:
-box=_26;
+box=_20;
 break;
 default:
-box={w:_26,h:_27};
+box={w:_20,h:_21};
 break;
 }
 dojo.marginBox(this.node,box);
@@ -184,87 +186,87 @@ this.coords=null;
 return this.render();
 },getGeometry:function(){
 var ret={};
-df.forIn(this.axes,function(_2a){
-if(_2a.initialized()){
-ret[_2a.name]={name:_2a.name,vertical:_2a.vertical,scaler:_2a.scaler,ticks:_2a.ticks};
+df.forIn(this.axes,function(_22){
+if(_22.initialized()){
+ret[_22.name]={name:_22.name,vertical:_22.vertical,scaler:_22.scaler,ticks:_22.ticks};
 }
 });
 return ret;
-},setAxisWindow:function(_2b,_2c,_2d){
-var _2e=this.axes[_2b];
-if(_2e){
-_2e.setWindow(_2c,_2d);
+},setAxisWindow:function(_23,_24,_25){
+var _26=this.axes[_23];
+if(_26){
+_26.setWindow(_24,_25);
 }
 return this;
 },setWindow:function(sx,sy,dx,dy){
 if(!("plotArea" in this)){
 this.calculateGeometry();
 }
-df.forIn(this.axes,function(_33){
-var _34,_35,_36=_33.getScaler().bounds,s=_36.span/(_36.upper-_36.lower);
-if(_33.vertical){
-_34=sy;
-_35=dy/s/_34;
+df.forIn(this.axes,function(_27){
+var _28,_29,_2a=_27.getScaler().bounds,s=_2a.span/(_2a.upper-_2a.lower);
+if(_27.vertical){
+_28=sy;
+_29=dy/s/_28;
 }else{
-_34=sx;
-_35=dx/s/_34;
+_28=sx;
+_29=dx/s/_28;
 }
-_33.setWindow(_34,_35);
+_27.setWindow(_28,_29);
 });
 return this;
 },calculateGeometry:function(){
 if(this.dirty){
 return this.fullGeometry();
 }
-dojo.forEach(this.stack,function(_38){
-if(_38.dirty||(_38.hAxis&&this.axes[_38.hAxis].dirty)||(_38.vAxis&&this.axes[_38.vAxis].dirty)){
-_38.calculateAxes(this.plotArea);
+dojo.forEach(this.stack,function(_2b){
+if(_2b.dirty||(_2b.hAxis&&this.axes[_2b.hAxis].dirty)||(_2b.vAxis&&this.axes[_2b.vAxis].dirty)){
+_2b.calculateAxes(this.plotArea);
 }
 },this);
 return this;
 },fullGeometry:function(){
 this._makeDirty();
-dojo.forEach(this.stack,_3);
+dojo.forEach(this.stack,_1);
 if(!this.theme){
 this.setTheme(new dojox.charting.Theme(dojox.charting._def));
 }
 dojo.forEach(this.series,function(run){
 if(!(run.plot in this.plots)){
-var _3a=new dc.plot2d.Default(this,{});
-_3a.name=run.plot;
+var _2c=new dc.plot2d.Default(this,{});
+_2c.name=run.plot;
 this.plots[run.plot]=this.stack.length;
-this.stack.push(_3a);
+this.stack.push(_2c);
 }
 this.stack[this.plots[run.plot]].addSeries(run);
 },this);
-dojo.forEach(this.stack,function(_3b){
-if(_3b.hAxis){
-_3b.setAxis(this.axes[_3b.hAxis]);
+dojo.forEach(this.stack,function(_2d){
+if(_2d.hAxis){
+_2d.setAxis(this.axes[_2d.hAxis]);
 }
-if(_3b.vAxis){
-_3b.setAxis(this.axes[_3b.vAxis]);
+if(_2d.vAxis){
+_2d.setAxis(this.axes[_2d.vAxis]);
 }
 },this);
 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,_3);
-dojo.forEach(this.stack,function(_3d){
-_3d.calculateAxes(dim);
+df.forIn(this.axes,_1);
+dojo.forEach(this.stack,function(p){
+p.calculateAxes(dim);
 });
-var _3e=this.offsets={l:0,r:0,t:0,b:0};
-df.forIn(this.axes,function(_3f){
-df.forIn(_3f.getOffsets(),function(o,i){
-_3e[i]+=o;
+var _2e=this.offsets={l:0,r:0,t:0,b:0};
+df.forIn(this.axes,function(_2f){
+df.forIn(_2f.getOffsets(),function(o,i){
+_2e[i]+=o;
 });
 });
 df.forIn(this.margins,function(o,i){
-_3e[i]+=o;
+_2e[i]+=o;
 });
-this.plotArea={width:dim.width-_3e.l-_3e.r,height:dim.height-_3e.t-_3e.b};
-df.forIn(this.axes,_3);
-dojo.forEach(this.stack,function(_44){
-_44.calculateAxes(this.plotArea);
+this.plotArea={width:dim.width-_2e.l-_2e.r,height:dim.height-_2e.t-_2e.b};
+df.forIn(this.axes,_1);
+dojo.forEach(this.stack,function(_30){
+_30.calculateAxes(this.plotArea);
 },this);
 return this;
 },render:function(){
@@ -275,11 +277,11 @@ if(this.dirty){
 return this.fullRender();
 }
 this.calculateGeometry();
-df.forEachRev(this.stack,function(_45){
-_45.render(this.dim,this.offsets);
+df.forEachRev(this.stack,function(_31){
+_31.render(this.dim,this.offsets);
 },this);
-df.forIn(this.axes,function(_46){
-_46.render(this.dim,this.offsets);
+df.forIn(this.axes,function(_32){
+_32.render(this.dim,this.offsets);
 },this);
 this._makeClean();
 if(this.surface.render){
@@ -288,84 +290,84 @@ this.surface.render();
 return this;
 },fullRender:function(){
 this.fullGeometry();
-var _47=this.offsets,dim=this.dim;
-var _49=df.foldl(this.stack,"z + plot.getRequiredColors()",0);
-this.theme.defineColors({num:_49,cache:false});
-dojo.forEach(this.series,_4);
-df.forIn(this.axes,_4);
-dojo.forEach(this.stack,_4);
+var _33=this.offsets,dim=this.dim;
+var _34=df.foldl(this.stack,"z + plot.getRequiredColors()",0);
+this.theme.defineColors({num:_34,cache:false});
+dojo.forEach(this.series,_2);
+df.forIn(this.axes,_2);
+dojo.forEach(this.stack,_2);
 this.surface.clear();
-var t=this.theme,_4b=t.plotarea&&t.plotarea.fill,_4c=t.plotarea&&t.plotarea.stroke;
-if(_4b){
-this.surface.createRect({x:_47.l,y:_47.t,width:dim.width-_47.l-_47.r,height:dim.height-_47.t-_47.b}).setFill(_4b);
+var t=this.theme,_35=t.plotarea&&t.plotarea.fill,_36=t.plotarea&&t.plotarea.stroke;
+if(_35){
+this.surface.createRect({x:_33.l,y:_33.t,width:dim.width-_33.l-_33.r,height:dim.height-_33.t-_33.b}).setFill(_35);
 }
-if(_4c){
-this.surface.createRect({x:_47.l,y:_47.t,width:dim.width-_47.l-_47.r-1,height:dim.height-_47.t-_47.b-1}).setStroke(_4c);
+if(_36){
+this.surface.createRect({x:_33.l,y:_33.t,width:dim.width-_33.l-_33.r-1,height:dim.height-_33.t-_33.b-1}).setStroke(_36);
 }
-df.foldr(this.stack,function(z,_4e){
-return _4e.render(dim,_47),0;
+df.foldr(this.stack,function(z,_37){
+return _37.render(dim,_33),0;
 },0);
-_4b=this.fill?this.fill:(t.chart&&t.chart.fill);
-_4c=this.stroke?this.stroke:(t.chart&&t.chart.stroke);
-if(_4b=="inherit"){
-var _4f=this.node,_4b=new dojo.Color(dojo.style(_4f,"backgroundColor"));
-while(_4b.a==0&&_4f!=document.documentElement){
-_4b=new dojo.Color(dojo.style(_4f,"backgroundColor"));
-_4f=_4f.parentNode;
+_35=this.fill?this.fill:(t.chart&&t.chart.fill);
+_36=this.stroke?this.stroke:(t.chart&&t.chart.stroke);
+if(_35=="inherit"){
+var _38=this.node,_35=new dojo.Color(dojo.style(_38,"backgroundColor"));
+while(_35.a==0&&_38!=document.documentElement){
+_35=new dojo.Color(dojo.style(_38,"backgroundColor"));
+_38=_38.parentNode;
 }
 }
-if(_4b){
-if(_47.l){
-this.surface.createRect({width:_47.l,height:dim.height+1}).setFill(_4b);
+if(_35){
+if(_33.l){
+this.surface.createRect({width:_33.l,height:dim.height+1}).setFill(_35);
 }
-if(_47.r){
-this.surface.createRect({x:dim.width-_47.r,width:_47.r+1,height:dim.height+1}).setFill(_4b);
+if(_33.r){
+this.surface.createRect({x:dim.width-_33.r,width:_33.r+1,height:dim.height+1}).setFill(_35);
 }
-if(_47.t){
-this.surface.createRect({width:dim.width+1,height:_47.t}).setFill(_4b);
+if(_33.t){
+this.surface.createRect({width:dim.width+1,height:_33.t}).setFill(_35);
 }
-if(_47.b){
-this.surface.createRect({y:dim.height-_47.b,width:dim.width+1,height:_47.b+2}).setFill(_4b);
+if(_33.b){
+this.surface.createRect({y:dim.height-_33.b,width:dim.width+1,height:_33.b+2}).setFill(_35);
 }
 }
-if(_4c){
-this.surface.createRect({width:dim.width-1,height:dim.height-1}).setStroke(_4c);
+if(_36){
+this.surface.createRect({width:dim.width-1,height:dim.height-1}).setStroke(_36);
 }
-df.forIn(this.axes,function(_50){
-_50.render(dim,_47);
+df.forIn(this.axes,function(_39){
+_39.render(dim,_33);
 });
 this._makeClean();
 if(this.surface.render){
 this.surface.render();
 }
 return this;
-},connectToPlot:function(_51,_52,_53){
-return _51 in this.plots?this.stack[this.plots[_51]].connect(_52,_53):null;
+},connectToPlot:function(_3a,_3b,_3c){
+return _3a in this.plots?this.stack[this.plots[_3a]].connect(_3b,_3c):null;
 },_makeClean:function(){
-dojo.forEach(this.axes,_6);
-dojo.forEach(this.stack,_6);
-dojo.forEach(this.series,_6);
+dojo.forEach(this.axes,_4);
+dojo.forEach(this.stack,_4);
+dojo.forEach(this.series,_4);
 this.dirty=false;
 },_makeDirty:function(){
-dojo.forEach(this.axes,_7);
-dojo.forEach(this.stack,_7);
-dojo.forEach(this.series,_7);
+dojo.forEach(this.axes,_5);
+dojo.forEach(this.stack,_5);
+dojo.forEach(this.series,_5);
 this.dirty=true;
-},_invalidateDependentPlots:function(_54,_55){
-if(_54 in this.plots){
-var _56=this.stack[this.plots[_54]],_57,_58=_55?"vAxis":"hAxis";
-if(_56[_58]){
-_57=this.axes[_56[_58]];
-if(_57.dependOnData()){
-_57.dirty=true;
+},_invalidateDependentPlots:function(_3d,_3e){
+if(_3d in this.plots){
+var _3f=this.stack[this.plots[_3d]],_40,_41=_3e?"vAxis":"hAxis";
+if(_3f[_41]){
+_40=this.axes[_3f[_41]];
+if(_40&&_40.dependOnData()){
+_40.dirty=true;
 dojo.forEach(this.stack,function(p){
-if(p[_58]&&p[_58]==_56[_58]){
+if(p[_41]&&p[_41]==_3f[_41]){
 p.dirty=true;
 }
 });
 }
 }else{
-_56.dirty=true;
+_3f.dirty=true;
 }
 }
 }});
diff --git a/dojox/charting/Chart3D.js b/dojox/charting/Chart3D.js
index 9452f82..ecd9137 100644
--- a/dojox/charting/Chart3D.js
+++ b/dojox/charting/Chart3D.js
@@ -11,13 +11,13 @@ dojo.provide("dojox.charting.Chart3D");
 dojo.require("dojox.gfx3d");
 (function(){
 var _1={x:0,y:0,z:1},v=dojox.gfx3d.vector,n=dojox.gfx.normalizedLength;
-dojo.declare("dojox.charting.Chart3D",null,{constructor:function(_4,_5,_6,_7){
-this.node=dojo.byId(_4);
+dojo.declare("dojox.charting.Chart3D",null,{constructor:function(_2,_3,_4,_5){
+this.node=dojo.byId(_2);
 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(_5.lights,_5.ambient,_5.specular);
-this.view.setCameraTransform(_6);
-this.theme=_7;
+this.view.setLights(_3.lights,_3.ambient,_3.specular);
+this.view.setCameraTransform(_4);
+this.theme=_5;
 this.walls=[];
 this.plots=[];
 },generate:function(){
@@ -28,27 +28,27 @@ return this;
 },render:function(){
 this.view.render();
 return this;
-},addPlot:function(_8){
-return this._add(this.plots,_8);
-},removePlot:function(_9){
-return this._remove(this.plots,_9);
-},addWall:function(_a){
-return this._add(this.walls,_a);
-},removeWall:function(_b){
-return this._remove(this.walls,_b);
-},_add:function(_c,_d){
-if(!dojo.some(_c,function(i){
-return i==_d;
+},addPlot:function(_6){
+return this._add(this.plots,_6);
+},removePlot:function(_7){
+return this._remove(this.plots,_7);
+},addWall:function(_8){
+return this._add(this.walls,_8);
+},removeWall:function(_9){
+return this._remove(this.walls,_9);
+},_add:function(_a,_b){
+if(!dojo.some(_a,function(i){
+return i==_b;
 })){
-_c.push(_d);
+_a.push(_b);
 this.view.invalidate();
 }
 return this;
-},_remove:function(_f,_10){
-var a=dojo.filter(_f,function(i){
-return i!=_10;
+},_remove:function(_c,_d){
+var a=dojo.filter(_c,function(i){
+return i!=_d;
 });
-return a.length<_f.length?(_f=a,this.invalidate()):this;
+return a.length<_c.length?(_c=a,this.invalidate()):this;
 },_generateWalls:function(){
 for(var i=0;i<this.walls.length;++i){
 if(v.dotProduct(_1,this.walls[i].normal)>0){
@@ -57,15 +57,15 @@ this.walls[i].generate(this);
 }
 return this;
 },_generatePlots:function(){
-var _14=0,m=dojox.gfx3d.matrix,i=0;
+var _e=0,m=dojox.gfx3d.matrix,i=0;
 for(;i<this.plots.length;++i){
-_14+=this.plots[i].getDepth();
+_e+=this.plots[i].getDepth();
 }
 for(--i;i>=0;--i){
-var _17=this.view.createScene();
-_17.setTransform(m.translate(0,0,-_14));
-this.plots[i].generate(this,_17);
-_14-=this.plots[i].getDepth();
+var _f=this.view.createScene();
+_f.setTransform(m.translate(0,0,-_e));
+this.plots[i].generate(this,_f);
+_e-=this.plots[i].getDepth();
 }
 return this;
 }});
diff --git a/dojox/charting/DataChart.js b/dojox/charting/DataChart.js
index 7bc0218..5dd0bf3 100644
--- a/dojox/charting/DataChart.js
+++ b/dojox/charting/DataChart.js
@@ -61,9 +61,9 @@ this.query=_7||this.query;
 this.fieldName=_8||this.fieldName;
 this.label=this.store.getLabelAttributes();
 this.queryOptions=_9||_9;
-this.fetch();
 dojo.connect(this.store,"onSet",this,"onSet");
 dojo.connect(this.store,"onError",this,"onError");
+this.fetch();
 },show:function(){
 if(!this.showing){
 dojo.style(this.domNode,"display","");
@@ -84,35 +84,35 @@ this.onSetItems[nm]=_a;
 }
 this.onSetInterval=setTimeout(dojo.hitch(this,function(){
 clearTimeout(this.onSetInterval);
-var _c=[];
+var _b=[];
 for(var nm in this.onSetItems){
-_c.push(this.onSetItems[nm]);
+_b.push(this.onSetItems[nm]);
 }
-this.onData(_c);
+this.onData(_b);
 this.onSetItems={};
 }),200);
 }
-},onError:function(_e){
-console.error(_e);
-},onDataReceived:function(_f){
-},getProperty:function(_10,_11){
-if(_11==this.label){
-return this.store.getLabel(_10);
+},onError:function(_c){
+console.error("DataChart Error:",_c);
+},onDataReceived:function(_d){
+},getProperty:function(_e,_f){
+if(_f==this.label){
+return this.store.getLabel(_e);
 }
-if(_11=="id"){
-return this.store.getIdentity(_10);
+if(_f=="id"){
+return this.store.getIdentity(_e);
 }
-var _12=this.store.getValues(_10,_11);
-if(_12.length<2){
-_12=this.store.getValue(_10,_11);
+var _10=this.store.getValues(_e,_f);
+if(_10.length<2){
+_10=this.store.getValue(_e,_f);
 }
-return _12;
-},onData:function(_13){
-if(!_13.length){
+return _10;
+},onData:function(_11){
+if(!_11||!_11.length){
 return;
 }
-if(this.items&&this.items.length!=_13.length){
-dojo.forEach(_13,function(m){
+if(this.items&&this.items.length!=_11.length){
+dojo.forEach(_11,function(m){
 var id=this.getProperty(m,"id");
 dojo.forEach(this.items,function(m2,i){
 if(this.getProperty(m2,"id")==id){
@@ -120,66 +120,66 @@ this.items[i]=m2;
 }
 },this);
 },this);
-_13=this.items;
+_11=this.items;
 }
 if(this.stretchToFit){
-this.displayRange=_13.length;
+this.displayRange=_11.length;
 }
-this.onDataReceived(_13);
-this.items=_13;
+this.onDataReceived(_11);
+this.items=_11;
 if(this.comparative){
 var nm="default";
 this.seriesData[nm]=[];
 this.seriesDataBk[nm]=[];
-dojo.forEach(_13,function(m,i){
-var _1b=this.getProperty(m,this.fieldName);
-this.seriesData[nm].push(_1b);
+dojo.forEach(_11,function(m,i){
+var _12=this.getProperty(m,this.fieldName);
+this.seriesData[nm].push(_12);
 },this);
 }else{
-dojo.forEach(_13,function(m,i){
+dojo.forEach(_11,function(m,i){
 var nm=this.store.getLabel(m);
 if(!this.seriesData[nm]){
 this.seriesData[nm]=[];
 this.seriesDataBk[nm]=[];
 }
-var _1f=this.getProperty(m,this.fieldName);
-if(dojo.isArray(_1f)){
-this.seriesData[nm]=_1f;
+var _13=this.getProperty(m,this.fieldName);
+if(dojo.isArray(_13)){
+this.seriesData[nm]=_13;
 }else{
 if(!this.scroll){
 var ar=dojo.map(new Array(i+1),function(){
 return 0;
 });
-ar.push(Number(_1f));
+ar.push(Number(_13));
 this.seriesData[nm]=ar;
 }else{
 if(this.seriesDataBk[nm].length>this.seriesData[nm].length){
 this.seriesData[nm]=this.seriesDataBk[nm];
 }
-this.seriesData[nm].push(Number(_1f));
+this.seriesData[nm].push(Number(_13));
 }
-this.seriesDataBk[nm].push(Number(_1f));
+this.seriesDataBk[nm].push(Number(_13));
 }
 },this);
 }
-var _21;
+var _14;
 if(this.firstRun){
 this.firstRun=false;
 for(nm in this.seriesData){
 this.addSeries(nm,this.seriesData[nm]);
-_21=this.seriesData[nm];
+_14=this.seriesData[nm];
 }
 }else{
 for(nm in this.seriesData){
-_21=this.seriesData[nm];
-if(this.scroll&&_21.length>this.displayRange){
-this.dataOffset=_21.length-this.displayRange-1;
-_21=_21.slice(_21.length-this.displayRange,_21.length);
+_14=this.seriesData[nm];
+if(this.scroll&&_14.length>this.displayRange){
+this.dataOffset=_14.length-this.displayRange-1;
+_14=_14.slice(_14.length-this.displayRange,_14.length);
 }
-this.updateSeries(nm,_21);
+this.updateSeries(nm,_14);
 }
 }
-this.dataLength=_21.length;
+this.dataLength=_14.length;
 if(this.showing){
 this.render();
 }
@@ -187,12 +187,16 @@ this.render();
 if(!this.store){
 return;
 }
-this.store.fetch({query:this.query,queryOptions:this.queryOptions,start:this.start,count:this.count,sort:this.sort,onComplete:dojo.hitch(this,"onData"),onError:dojo.hitch(this,"onError")});
-},convertLabels:function(_22){
-if(!_22.labels||dojo.isObject(_22.labels[0])){
+this.store.fetch({query:this.query,queryOptions:this.queryOptions,start:this.start,count:this.count,sort:this.sort,onComplete:dojo.hitch(this,function(_15){
+setTimeout(dojo.hitch(this,function(){
+this.onData(_15);
+}),0);
+}),onError:dojo.hitch(this,"onError")});
+},convertLabels:function(_16){
+if(!_16.labels||dojo.isObject(_16.labels[0])){
 return null;
 }
-_22.labels=dojo.map(_22.labels,function(ele,i){
+_16.labels=dojo.map(_16.labels,function(ele,i){
 return {value:i,text:ele};
 });
 return null;
diff --git a/dojox/charting/Theme.js b/dojox/charting/Theme.js
index 075a367..78b6520 100644
--- a/dojox/charting/Theme.js
+++ b/dojox/charting/Theme.js
@@ -24,34 +24,34 @@ this.antiAlias=("antiAlias" in _2)?_2.antiAlias:true;
 this.assignColors=("assignColors" in _2)?_2.assignColors:true;
 this.assignMarkers=("assignMarkers" in _2)?_2.assignMarkers:true;
 _2.colors=_2.colors||_3.colors;
-dojo.forEach(_2.colors,function(_5){
-this.colors.push(_5);
+dojo.forEach(_2.colors,function(_4){
+this.colors.push(_4);
 },this);
 this._current={color:0,marker:0};
 this._markers=[];
 this._buildMarkerArray();
 };
 _1.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"};
-_1.Theme._def={chart:{stroke:null,fill:"white"},plotarea:{stroke:null,fill:"white"},axis:{stroke:{color:"#333",width:1},majorTick:{color:"#666",width:1,length:6,position:"center"},minorTick:{color:"#666",width:0.8,length:3,position:"center"},font:"normal normal normal 7pt Tahoma",fontColor:"#333"},series:{outline:{width:0.1,color:"#ccc"},stroke:{width:1.5,color:"#333"},fill:"#ccc",font:"normal normal normal 7pt Tahoma",fontColor:"#000"},marker:{stroke:{width:1},fill:"#333",font:"normal n [...]
-dojo.extend(_1.Theme,{defineColors:function(_6){
-var _7=_6||{};
-var c=[],n=_7.num||5;
-if(_7.colors){
-var l=_7.colors.length;
+_1.Theme._def={chart:{stroke:null,fill:"white"},plotarea:{stroke:null,fill:"white"},axis:{stroke:{color:"#333",width:1},majorTick:{color:"#666",width:1,length:6,position:"center"},minorTick:{color:"#666",width:0.8,length:3,position:"center"},microTick:{color:"#666",width:0.5,length:1,position:"center"},font:"normal normal normal 7pt Tahoma",fontColor:"#333"},series:{outline:{width:0.1,color:"#ccc"},stroke:{width:1.5,color:"#333"},fill:"#ccc",font:"normal normal normal 7pt Tahoma",fontCol [...]
+dojo.extend(_1.Theme,{defineColors:function(_5){
+var _6=_5||{};
+var c=[],n=_6.num||5;
+if(_6.colors){
+var l=_6.colors.length;
 for(var i=0;i<n;i++){
-c.push(_7.colors[i%l]);
+c.push(_6.colors[i%l]);
 }
 this.colors=c;
 }else{
-if(_7.hue){
-var s=_7.saturation||100;
-var st=_7.low||30;
-var _e=_7.high||90;
-var l=(_e+st)/2;
-this.colors=dojox.color.Palette.generate(dojox.color.fromHsv(_7.hue,s,l),"monochromatic").colors;
+if(_6.hue){
+var s=_6.saturation||100;
+var st=_6.low||30;
+var _7=_6.high||90;
+var l=(_7+st)/2;
+this.colors=dojox.color.Palette.generate(dojox.color.fromHsv(_6.hue,s,l),"monochromatic").colors;
 }else{
-if(_7.generator){
-this.colors=dojox.color.Palette.generate(_7.base,_7.generator).colors;
+if(_6.generator){
+this.colors=dojox.color.Palette.generate(_6.base,_6.generator).colors;
 }
 }
 }
@@ -63,14 +63,14 @@ this._markers.push(this.markers[p]);
 this._current.marker=0;
 },_clone:function(){
 return new _1.Theme({chart:this.chart,plotarea:this.plotarea,axis:this.axis,series:this.series,marker:this.marker,antiAlias:this.antiAlias,assignColors:this.assignColors,assignMarkers:this.assigneMarkers,colors:dojo.delegate(this.colors)});
-},addMarker:function(_10,_11){
-this.markers[_10]=_11;
+},addMarker:function(_8,_9){
+this.markers[_8]=_9;
 this._buildMarkerArray();
-},setMarkers:function(obj){
-this.markers=obj;
+},setMarkers:function(_a){
+this.markers=_a;
 this._buildMarkerArray();
-},next:function(_13){
-if(_13=="marker"){
+},next:function(_b){
+if(_b=="marker"){
 return this._markers[this._current.marker++%this._markers.length];
 }else{
 return this.colors[this._current.color++%this.colors.length];
diff --git a/dojox/charting/action2d/Base.js b/dojox/charting/action2d/Base.js
index 222d75e..0b63494 100644
--- a/dojox/charting/action2d/Base.js
+++ b/dojox/charting/action2d/Base.js
@@ -13,15 +13,15 @@ dojo.require("dojox.lang.functional.object");
 dojo.require("dojox.gfx.fx");
 (function(){
 var _1=400,_2=dojo.fx.easing.backOut,df=dojox.lang.functional;
-dojo.declare("dojox.charting.action2d.Base",null,{overOutEvents:{onmouseover:1,onmouseout:1},constructor:function(_4,_5,_6){
-this.chart=_4;
-this.plot=_5?_5:"default";
+dojo.declare("dojox.charting.action2d.Base",null,{overOutEvents:{onmouseover:1,onmouseout:1},constructor:function(_3,_4,_5){
+this.chart=_3;
+this.plot=_4?_4:"default";
 this.anim={};
-if(!_6){
-_6={};
+if(!_5){
+_5={};
 }
-this.duration=_6.duration?_6.duration:_1;
-this.easing=_6.easing?_6.easing:_2;
+this.duration=_5.duration?_5.duration:_1;
+this.easing=_5.easing?_5.easing:_2;
 },connect:function(){
 this.handle=this.chart.connectToPlot(this.plot,this,"process");
 },disconnect:function(){
@@ -35,8 +35,8 @@ if(this.handle){
 this.disconnect();
 }
 df.forIn(this.anim,function(o){
-df.forIn(o,function(_8){
-_8.action.stop(true);
+df.forIn(o,function(_6){
+_6.action.stop(true);
 });
 });
 this.anim={};
diff --git a/dojox/charting/action2d/Highlight.js b/dojox/charting/action2d/Highlight.js
index d602ae7..1c45dbd 100644
--- a/dojox/charting/action2d/Highlight.js
+++ b/dojox/charting/action2d/Highlight.js
@@ -11,12 +11,12 @@ dojo.provide("dojox.charting.action2d.Highlight");
 dojo.require("dojox.charting.action2d.Base");
 dojo.require("dojox.color");
 (function(){
-var _1=100,_2=75,_3=50,c=dojox.color,cc=function(_6){
+var _1=100,_2=75,_3=50,c=dojox.color,cc=function(_4){
 return function(){
-return _6;
+return _4;
 };
-},hl=function(_8){
-var a=new c.Color(_8),x=a.toHsl();
+},hl=function(_5){
+var a=new c.Color(_5),x=a.toHsl();
 if(x.s==0){
 x.l=x.l<50?100:0;
 }else{
@@ -33,44 +33,44 @@ x.l=x.l-_3>_2-x.l?_3:_2;
 }
 return c.fromHsl(x);
 };
-dojo.declare("dojox.charting.action2d.Highlight",dojox.charting.action2d.Base,{defaultParams:{duration:400,easing:dojo.fx.easing.backOut},optionalParams:{highlight:"red"},constructor:function(_b,_c,_d){
-var a=_d&&_d.highlight;
+dojo.declare("dojox.charting.action2d.Highlight",dojox.charting.action2d.Base,{defaultParams:{duration:400,easing:dojo.fx.easing.backOut},optionalParams:{highlight:"red"},constructor:function(_6,_7,_8){
+var a=_8&&_8.highlight;
 this.colorFun=a?(dojo.isFunction(a)?a:cc(a)):hl;
 this.connect();
 },process:function(o){
 if(!o.shape||!(o.type in this.overOutEvents)){
 return;
 }
-var _10=o.run.name,_11=o.index,_12,_13,_14;
-if(_10 in this.anim){
-_12=this.anim[_10][_11];
+var _9=o.run.name,_a=o.index,_b,_c,_d;
+if(_9 in this.anim){
+_b=this.anim[_9][_a];
 }else{
-this.anim[_10]={};
+this.anim[_9]={};
 }
-if(_12){
-_12.action.stop(true);
+if(_b){
+_b.action.stop(true);
 }else{
-var _15=o.shape.getFill();
-if(!_15||!(_15 instanceof dojo.Color)){
+var _e=o.shape.getFill();
+if(!_e||!(_e instanceof dojo.Color)){
 return;
 }
-this.anim[_10][_11]=_12={start:_15,end:this.colorFun(_15)};
+this.anim[_9][_a]=_b={start:_e,end:this.colorFun(_e)};
 }
-var _16=_12.start,end=_12.end;
+var _f=_b.start,end=_b.end;
 if(o.type=="onmouseout"){
-var t=_16;
-_16=end;
+var t=_f;
+_f=end;
 end=t;
 }
-_12.action=dojox.gfx.fx.animateFill({shape:o.shape,duration:this.duration,easing:this.easing,color:{start:_16,end:end}});
+_b.action=dojox.gfx.fx.animateFill({shape:o.shape,duration:this.duration,easing:this.easing,color:{start:_f,end:end}});
 if(o.type=="onmouseout"){
-dojo.connect(_12.action,"onEnd",this,function(){
-if(this.anim[_10]){
-delete this.anim[_10][_11];
+dojo.connect(_b.action,"onEnd",this,function(){
+if(this.anim[_9]){
+delete this.anim[_9][_a];
 }
 });
 }
-_12.action.play();
+_b.action.play();
 }});
 })();
 }
diff --git a/dojox/charting/action2d/Magnify.js b/dojox/charting/action2d/Magnify.js
index f3f42b7..73b0df8 100644
--- a/dojox/charting/action2d/Magnify.js
+++ b/dojox/charting/action2d/Magnify.js
@@ -13,56 +13,56 @@ dojo.require("dojox.gfx.matrix");
 dojo.require("dojo.fx");
 (function(){
 var _1=2,m=dojox.gfx.matrix,gf=dojox.gfx.fx;
-dojo.declare("dojox.charting.action2d.Magnify",dojox.charting.action2d.Base,{defaultParams:{duration:400,easing:dojo.fx.easing.backOut,scale:_1},optionalParams:{},constructor:function(_4,_5,_6){
-this.scale=_6&&typeof _6.scale=="number"?_6.scale:_1;
+dojo.declare("dojox.charting.action2d.Magnify",dojox.charting.action2d.Base,{defaultParams:{duration:400,easing:dojo.fx.easing.backOut,scale:_1},optionalParams:{},constructor:function(_2,_3,_4){
+this.scale=_4&&typeof _4.scale=="number"?_4.scale:_1;
 this.connect();
 },process:function(o){
 if(!o.shape||!(o.type in this.overOutEvents)||!("cx" in o)||!("cy" in o)){
 return;
 }
-var _8=o.run.name,_9=o.index,_a=[],_b,_c,_d;
-if(_8 in this.anim){
-_b=this.anim[_8][_9];
+var _5=o.run.name,_6=o.index,_7=[],_8,_9,_a;
+if(_5 in this.anim){
+_8=this.anim[_5][_6];
 }else{
-this.anim[_8]={};
+this.anim[_5]={};
 }
-if(_b){
-_b.action.stop(true);
+if(_8){
+_8.action.stop(true);
 }else{
-this.anim[_8][_9]=_b={};
+this.anim[_5][_6]=_8={};
 }
 if(o.type=="onmouseover"){
-_c=m.identity;
-_d=this.scale;
+_9=m.identity;
+_a=this.scale;
 }else{
-_c=m.scaleAt(this.scale,o.cx,o.cy);
-_d=1/this.scale;
+_9=m.scaleAt(this.scale,o.cx,o.cy);
+_a=1/this.scale;
 }
-var _e={shape:o.shape,duration:this.duration,easing:this.easing,transform:[{name:"scaleAt",start:[1,o.cx,o.cy],end:[_d,o.cx,o.cy]},_c]};
+var _b={shape:o.shape,duration:this.duration,easing:this.easing,transform:[{name:"scaleAt",start:[1,o.cx,o.cy],end:[_a,o.cx,o.cy]},_9]};
 if(o.shape){
-_a.push(gf.animateTransform(_e));
+_7.push(gf.animateTransform(_b));
 }
 if(o.oultine){
-_e.shape=o.outline;
-_a.push(gf.animateTransform(_e));
+_b.shape=o.outline;
+_7.push(gf.animateTransform(_b));
 }
 if(o.shadow){
-_e.shape=o.shadow;
-_a.push(gf.animateTransform(_e));
+_b.shape=o.shadow;
+_7.push(gf.animateTransform(_b));
 }
-if(!_a.length){
-delete this.anim[_8][_9];
+if(!_7.length){
+delete this.anim[_5][_6];
 return;
 }
-_b.action=dojo.fx.combine(_a);
+_8.action=dojo.fx.combine(_7);
 if(o.type=="onmouseout"){
-dojo.connect(_b.action,"onEnd",this,function(){
-if(this.anim[_8]){
-delete this.anim[_8][_9];
+dojo.connect(_8.action,"onEnd",this,function(){
+if(this.anim[_5]){
+delete this.anim[_5][_6];
 }
 });
 }
-_b.action.play();
+_8.action.play();
 }});
 })();
 }
diff --git a/dojox/charting/action2d/MoveSlice.js b/dojox/charting/action2d/MoveSlice.js
index bdcf8c7..11d2747 100644
--- a/dojox/charting/action2d/MoveSlice.js
+++ b/dojox/charting/action2d/MoveSlice.js
@@ -15,12 +15,12 @@ dojo.require("dojox.lang.functional.scan");
 dojo.require("dojox.lang.functional.fold");
 (function(){
 var _1=1.05,_2=7,m=dojox.gfx.matrix,gf=dojox.gfx.fx,df=dojox.lang.functional;
-dojo.declare("dojox.charting.action2d.MoveSlice",dojox.charting.action2d.Base,{defaultParams:{duration:400,easing:dojo.fx.easing.backOut,scale:_1,shift:_2},optionalParams:{},constructor:function(_6,_7,_8){
-if(!_8){
-_8={};
+dojo.declare("dojox.charting.action2d.MoveSlice",dojox.charting.action2d.Base,{defaultParams:{duration:400,easing:dojo.fx.easing.backOut,scale:_1,shift:_2},optionalParams:{},constructor:function(_3,_4,_5){
+if(!_5){
+_5={};
 }
-this.scale=typeof _8.scale=="number"?_8.scale:_1;
-this.shift=typeof _8.shift=="number"?_8.shift:_2;
+this.scale=typeof _5.scale=="number"?_5.scale:_1;
+this.shift=typeof _5.shift=="number"?_5.shift:_2;
 this.connect();
 },process:function(o){
 if(!o.shape||o.element!="slice"||!(o.type in this.overOutEvents)){
@@ -33,29 +33,31 @@ this.angles=df.map(df.scanl(o.run.data,"+",0),"* 2 * Math.PI / this",df.foldl(o.
 this.angles=df.map(df.scanl(o.run.data,"a + b.y",0),"* 2 * Math.PI / this",df.foldl(o.run.data,"a + b.y",0));
 }
 }
-var _a=o.index,_b,_c,_d,_e,_f=(this.angles[_a]+this.angles[_a+1])/2,_10=m.rotateAt(-_f,o.cx,o.cy),_11=m.rotateAt(_f,o.cx,o.cy);
-_b=this.anim[_a];
-if(_b){
-_b.action.stop(true);
+var _6=o.index,_7,_8,_9,_a,_b,_c=(this.angles[_6]+this.angles[_6+1])/2,_d=m.rotateAt(-_c,o.cx,o.cy),_e=m.rotateAt(_c,o.cx,o.cy);
+_7=this.anim[_6];
+if(_7){
+_7.action.stop(true);
 }else{
-this.anim[_a]=_b={};
+this.anim[_6]=_7={};
 }
 if(o.type=="onmouseover"){
-_d=0;
-_e=this.shift;
-_c=this.scale;
+_a=0;
+_b=this.shift;
+_8=1;
+_9=this.scale;
 }else{
-_d=this.shift;
-_e=0;
-_c=1/this.scale;
+_a=this.shift;
+_b=0;
+_8=this.scale;
+_9=1;
 }
-_b.action=dojox.gfx.fx.animateTransform({shape:o.shape,duration:this.duration,easing:this.easing,transform:[_11,{name:"translate",start:[_d,0],end:[_e,0]},{name:"scaleAt",start:[1,o.cx,o.cy],end:[_c,o.cx,o.cy]},_10]});
+_7.action=dojox.gfx.fx.animateTransform({shape:o.shape,duration:this.duration,easing:this.easing,transform:[_e,{name:"translate",start:[_a,0],end:[_b,0]},{name:"scaleAt",start:[_8,o.cx,o.cy],end:[_9,o.cx,o.cy]},_d]});
 if(o.type=="onmouseout"){
-dojo.connect(_b.action,"onEnd",this,function(){
-delete this.anim[_a];
+dojo.connect(_7.action,"onEnd",this,function(){
+delete this.anim[_6];
 });
 }
-_b.action.play();
+_7.action.play();
 },reset:function(){
 delete this.angles;
 }});
diff --git a/dojox/charting/action2d/Shake.js b/dojox/charting/action2d/Shake.js
index 45cc082..4863b30 100644
--- a/dojox/charting/action2d/Shake.js
+++ b/dojox/charting/action2d/Shake.js
@@ -13,53 +13,53 @@ dojo.require("dojox.gfx.matrix");
 dojo.require("dojo.fx");
 (function(){
 var _1=3,m=dojox.gfx.matrix,gf=dojox.gfx.fx;
-dojo.declare("dojox.charting.action2d.Shake",dojox.charting.action2d.Base,{defaultParams:{duration:400,easing:dojo.fx.easing.backOut,shiftX:_1,shiftY:_1},optionalParams:{},constructor:function(_4,_5,_6){
-if(!_6){
-_6={};
+dojo.declare("dojox.charting.action2d.Shake",dojox.charting.action2d.Base,{defaultParams:{duration:400,easing:dojo.fx.easing.backOut,shiftX:_1,shiftY:_1},optionalParams:{},constructor:function(_2,_3,_4){
+if(!_4){
+_4={};
 }
-this.shiftX=typeof _6.shiftX=="number"?_6.shiftX:_1;
-this.shiftY=typeof _6.shiftY=="number"?_6.shiftY:_1;
+this.shiftX=typeof _4.shiftX=="number"?_4.shiftX:_1;
+this.shiftY=typeof _4.shiftY=="number"?_4.shiftY:_1;
 this.connect();
 },process:function(o){
 if(!o.shape||!(o.type in this.overOutEvents)){
 return;
 }
-var _8=o.run.name,_9=o.index,_a=[],_b,_c=o.type=="onmouseover"?this.shiftX:-this.shiftX,_d=o.type=="onmouseover"?this.shiftY:-this.shiftY;
-if(_8 in this.anim){
-_b=this.anim[_8][_9];
+var _5=o.run.name,_6=o.index,_7=[],_8,_9=o.type=="onmouseover"?this.shiftX:-this.shiftX,_a=o.type=="onmouseover"?this.shiftY:-this.shiftY;
+if(_5 in this.anim){
+_8=this.anim[_5][_6];
 }else{
-this.anim[_8]={};
+this.anim[_5]={};
 }
-if(_b){
-_b.action.stop(true);
+if(_8){
+_8.action.stop(true);
 }else{
-this.anim[_8][_9]=_b={};
+this.anim[_5][_6]=_8={};
 }
-var _e={shape:o.shape,duration:this.duration,easing:this.easing,transform:[{name:"translate",start:[this.shiftX,this.shiftY],end:[0,0]},m.identity]};
+var _b={shape:o.shape,duration:this.duration,easing:this.easing,transform:[{name:"translate",start:[this.shiftX,this.shiftY],end:[0,0]},m.identity]};
 if(o.shape){
-_a.push(gf.animateTransform(_e));
+_7.push(gf.animateTransform(_b));
 }
 if(o.oultine){
-_e.shape=o.outline;
-_a.push(gf.animateTransform(_e));
+_b.shape=o.outline;
+_7.push(gf.animateTransform(_b));
 }
 if(o.shadow){
-_e.shape=o.shadow;
-_a.push(gf.animateTransform(_e));
+_b.shape=o.shadow;
+_7.push(gf.animateTransform(_b));
 }
-if(!_a.length){
-delete this.anim[_8][_9];
+if(!_7.length){
+delete this.anim[_5][_6];
 return;
 }
-_b.action=dojo.fx.combine(_a);
+_8.action=dojo.fx.combine(_7);
 if(o.type=="onmouseout"){
-dojo.connect(_b.action,"onEnd",this,function(){
-if(this.anim[_8]){
-delete this.anim[_8][_9];
+dojo.connect(_8.action,"onEnd",this,function(){
+if(this.anim[_5]){
+delete this.anim[_5][_6];
 }
 });
 }
-_b.action.play();
+_8.action.play();
 }});
 })();
 }
diff --git a/dojox/charting/action2d/Tooltip.js b/dojox/charting/action2d/Tooltip.js
index a57958a..58cd265 100644
--- a/dojox/charting/action2d/Tooltip.js
+++ b/dojox/charting/action2d/Tooltip.js
@@ -16,14 +16,17 @@ dojo.require("dojox.lang.functional.fold");
 (function(){
 var _1=function(o){
 var t=o.run&&o.run.data&&o.run.data[o.index];
-if(t&&typeof t=="object"&&t.tooltip){
-return t.tooltip;
+if(t&&typeof t!="number"&&(t.tooltip||t.text)){
+return t.tooltip||t.text;
+}
+if(o.element=="candlestick"){
+return "<table cellpadding=\"1\" cellspacing=\"0\" border=\"0\" style=\"font-size:0.9em;\">"+"<tr><td>Open:</td><td align=\"right\"><strong>"+o.data.open+"</strong></td></tr>"+"<tr><td>High:</td><td align=\"right\"><strong>"+o.data.high+"</strong></td></tr>"+"<tr><td>Low:</td><td align=\"right\"><strong>"+o.data.low+"</strong></td></tr>"+"<tr><td>Close:</td><td align=\"right\"><strong>"+o.data.close+"</strong></td></tr>"+(o.data.mid!==undefined?"<tr><td>Mid:</td><td align=\"right\"><stro [...]
 }
 return o.element=="bar"?o.x:o.y;
 };
-var df=dojox.lang.functional,_5=Math.PI/4,_6=Math.PI/2;
-dojo.declare("dojox.charting.action2d.Tooltip",dojox.charting.action2d.Base,{defaultParams:{text:_1},optionalParams:{},constructor:function(_7,_8,_9){
-this.text=_9&&_9.text?_9.text:_1;
+var df=dojox.lang.functional,_2=Math.PI/4,_3=Math.PI/2;
+dojo.declare("dojox.charting.action2d.Tooltip",dojox.charting.action2d.Base,{defaultParams:{text:_1},optionalParams:{},constructor:function(_4,_5,_6){
+this.text=_6&&_6.text?_6.text:_1;
 this.connect();
 },process:function(o){
 if(o.type==="onplotreset"||o.type==="onmouseout"){
@@ -34,22 +37,28 @@ return;
 if(!o.shape||o.type!=="onmouseover"){
 return;
 }
-var _b={type:"rect"},_c=["after","before"];
+var _7={type:"rect"},_8=["after","before"];
 switch(o.element){
 case "marker":
-_b.x=o.cx;
-_b.y=o.cy;
-_b.width=_b.height=1;
+_7.x=o.cx;
+_7.y=o.cy;
+_7.width=_7.height=1;
 break;
 case "circle":
-_b.x=o.cx-o.cr;
-_b.y=o.cy-o.cr;
-_b.width=_b.height=2*o.cr;
+_7.x=o.cx-o.cr;
+_7.y=o.cy-o.cr;
+_7.width=_7.height=2*o.cr;
 break;
 case "column":
-_c=["above","below"];
+_8=["above","below"];
 case "bar":
-_b=dojo.clone(o.shape.getShape());
+_7=dojo.clone(o.shape.getShape());
+break;
+case "candlestick":
+_7.x=o.x;
+_7.y=o.y;
+_7.width=o.width;
+_7.height=o.height;
 break;
 default:
 if(!this.angles){
@@ -59,20 +68,20 @@ this.angles=df.map(df.scanl(o.run.data,"+",0),"* 2 * Math.PI / this",df.foldl(o.
 this.angles=df.map(df.scanl(o.run.data,"a + b.y",0),"* 2 * Math.PI / this",df.foldl(o.run.data,"a + b.y",0));
 }
 }
-var _d=(this.angles[o.index]+this.angles[o.index+1])/2;
-_b.x=o.cx+o.cr*Math.cos(_d);
-_b.y=o.cy+o.cr*Math.sin(_d);
-_b.width=_b.height=1;
-if(_d<_5){
+var _9=(this.angles[o.index]+this.angles[o.index+1])/2;
+_7.x=o.cx+o.cr*Math.cos(_9);
+_7.y=o.cy+o.cr*Math.sin(_9);
+_7.width=_7.height=1;
+if(_9<_2){
 }else{
-if(_d<_6+_5){
-_c=["below","above"];
+if(_9<_3+_2){
+_8=["below","above"];
 }else{
-if(_d<Math.PI+_5){
-_c=["before","after"];
+if(_9<Math.PI+_2){
+_8=["before","after"];
 }else{
-if(_d<2*Math.PI-_5){
-_c=["above","below"];
+if(_9<2*Math.PI-_2){
+_8=["above","below"];
 }
 }
 }
@@ -80,14 +89,14 @@ _c=["above","below"];
 break;
 }
 var lt=dojo.coords(this.chart.node,true);
-_b.x+=lt.x;
-_b.y+=lt.y;
-_b.x=Math.round(_b.x);
-_b.y=Math.round(_b.y);
-_b.width=Math.ceil(_b.width);
-_b.height=Math.ceil(_b.height);
-this.aroundRect=_b;
-dijit.showTooltip(this.text(o),this.aroundRect,_c);
+_7.x+=lt.x;
+_7.y+=lt.y;
+_7.x=Math.round(_7.x);
+_7.y=Math.round(_7.y);
+_7.width=Math.ceil(_7.width);
+_7.height=Math.ceil(_7.height);
+this.aroundRect=_7;
+dijit.showTooltip(this.text(o),this.aroundRect,_8);
 }});
 })();
 }
diff --git a/dojox/charting/axis2d/Default.js b/dojox/charting/axis2d/Default.js
index 62c0bac..45a975c 100644
--- a/dojox/charting/axis2d/Default.js
+++ b/dojox/charting/axis2d/Default.js
@@ -17,10 +17,10 @@ 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,_5=dc.scaler.linear,_6=4;
-dojo.declare("dojox.charting.axis2d.Default",dojox.charting.axis2d.Base,{defaultParams:{vertical:false,fixUpper:"none",fixLower:"none",natural:false,leftBottom:true,includeZero:false,fixed:true,majorLabels:true,minorTicks:true,minorLabels:true,microTicks:false,htmlLabels:true},optionalParams:{min:0,max:1,from:0,to:1,majorTickStep:4,minorTickStep:2,microTickStep:1,labels:[],labelFunc:null,maxLabelSize:0,stroke:{},majorTick:{},minorTick:{},microTick:{},font:"",fontColor:""},constructor:fun [...]
-this.opt=dojo.delegate(this.defaultParams,_8);
-du.updateWithPattern(this.opt,_8,this.optionalParams);
+var dc=dojox.charting,df=dojox.lang.functional,du=dojox.lang.utils,g=dojox.gfx,_1=dc.scaler.linear,_2=4;
+dojo.declare("dojox.charting.axis2d.Default",dojox.charting.axis2d.Base,{defaultParams:{vertical:false,fixUpper:"none",fixLower:"none",natural:false,leftBottom:true,includeZero:false,fixed:true,majorLabels:true,minorTicks:true,minorLabels:true,microTicks:false,htmlLabels:true},optionalParams:{min:0,max:1,from:0,to:1,majorTickStep:4,minorTickStep:2,microTickStep:1,labels:[],labelFunc:null,maxLabelSize:0,stroke:{},majorTick:{},minorTick:{},microTick:{},font:"",fontColor:""},constructor:fun [...]
+this.opt=dojo.delegate(this.defaultParams,_4);
+du.updateWithPattern(this.opt,_4,this.optionalParams);
 },dependOnData:function(){
 return !("min" in this.opt)||!("max" in this.opt);
 },clear:function(){
@@ -30,207 +30,210 @@ this.dirty=true;
 return this;
 },initialized:function(){
 return "scaler" in this&&!(this.dirty&&this.dependOnData());
-},setWindow:function(_9,_a){
-this.scale=_9;
-this.offset=_a;
+},setWindow:function(_5,_6){
+this.scale=_5;
+this.offset=_6;
 return this.clear();
 },getWindowScale:function(){
 return "scale" in this?this.scale:1;
 },getWindowOffset:function(){
 return "offset" in this?this.offset:0;
-},calculate:function(_b,_c,_d,_e){
+},_groupLabelWidth:function(_7,_8){
+if(_7[0]["text"]){
+_7=df.map(_7,function(_9){
+return _9.text;
+});
+}
+var s=_7.join("<br>");
+return dojox.gfx._base._getTextBox(s,{font:_8}).w||0;
+},calculate:function(_a,_b,_c,_d){
 if(this.initialized()){
 return this;
 }
-this.labels="labels" in this.opt?this.opt.labels:_e;
-this.scaler=_5.buildScaler(_b,_c,_d,this.opt);
+var o=this.opt;
+this.labels="labels" in o?o.labels:_d;
+this.scaler=_1.buildScaler(_a,_b,_c,o);
+var _e=this.scaler.bounds;
 if("scale" in this){
-this.opt.from=this.scaler.bounds.lower+this.offset;
-this.opt.to=(this.scaler.bounds.upper-this.scaler.bounds.lower)/this.scale+this.opt.from;
-if(!isFinite(this.opt.from)||isNaN(this.opt.from)||!isFinite(this.opt.to)||isNaN(this.opt.to)||this.opt.to-this.opt.from>=this.scaler.bounds.upper-this.scaler.bounds.lower){
-delete this.opt.from;
-delete this.opt.to;
+o.from=_e.lower+this.offset;
+o.to=(_e.upper-_e.lower)/this.scale+o.from;
+if(!isFinite(o.from)||isNaN(o.from)||!isFinite(o.to)||isNaN(o.to)||o.to-o.from>=_e.upper-_e.lower){
+delete o.from;
+delete o.to;
 delete this.scale;
 delete this.offset;
 }else{
-if(this.opt.from<this.scaler.bounds.lower){
-this.opt.to+=this.scaler.bounds.lower-this.opt.from;
-this.opt.from=this.scaler.bounds.lower;
+if(o.from<_e.lower){
+o.to+=_e.lower-o.from;
+o.from=_e.lower;
 }else{
-if(this.opt.to>this.scaler.bounds.upper){
-this.opt.from+=this.scaler.bounds.upper-this.opt.to;
-this.opt.to=this.scaler.bounds.upper;
+if(o.to>_e.upper){
+o.from+=_e.upper-o.to;
+o.to=_e.upper;
 }
 }
-this.offset=this.opt.from-this.scaler.bounds.lower;
+this.offset=o.from-_e.lower;
 }
-this.scaler=_5.buildScaler(_b,_c,_d,this.opt);
+this.scaler=_1.buildScaler(_a,_b,_c,o);
+_e=this.scaler.bounds;
 if(this.scale==1&&this.offset==0){
 delete this.scale;
 delete this.offset;
 }
 }
-var _f=0,ta=this.chart.theme.axis,_11="font" in this.opt?this.opt.font:ta.font,_12=_11?g.normalizedLength(g.splitFontString(_11).size):0;
+var _f=0,ta=this.chart.theme.axis,_10="font" in o?o.font:ta.font,_11=_10?g.normalizedLength(g.splitFontString(_10).size):0;
 if(this.vertical){
-if(_12){
-_f=_12+_6;
+if(_11){
+_f=_11+_2;
 }
 }else{
-if(_12){
-var _13,i;
-if(this.opt.labelFunc&&this.opt.maxLabelSize){
-_13=this.opt.maxLabelSize;
+if(_11){
+var _12,i;
+if(o.labelFunc&&o.maxLabelSize){
+_12=o.maxLabelSize;
 }else{
 if(this.labels){
-_13=df.foldl(df.map(this.labels,function(_15){
-return dojox.gfx._base._getTextBox(_15.text,{font:_11}).w;
-}),"Math.max(a, b)",0);
+_12=this._groupLabelWidth(this.labels,_10);
 }else{
-var _16=Math.ceil(Math.log(Math.max(Math.abs(this.scaler.bounds.from),Math.abs(this.scaler.bounds.to)))/Math.LN10),t=[];
-if(this.scaler.bounds.from<0||this.scaler.bounds.to<0){
+var _13=Math.ceil(Math.log(Math.max(Math.abs(_e.from),Math.abs(_e.to)))/Math.LN10),t=[];
+if(_e.from<0||_e.to<0){
 t.push("-");
 }
-t.push(dojo.string.rep("9",_16));
-var _18=Math.floor(Math.log(this.scaler.bounds.to-this.scaler.bounds.from)/Math.LN10);
-if(_18>0){
+t.push(dojo.string.rep("9",_13));
+var _14=Math.floor(Math.log(_e.to-_e.from)/Math.LN10);
+if(_14>0){
 t.push(".");
-for(i=0;i<_18;++i){
+for(i=0;i<_14;++i){
 t.push("9");
 }
 }
-_13=dojox.gfx._base._getTextBox(t.join(""),{font:_11}).w;
+_12=dojox.gfx._base._getTextBox(t.join(""),{font:_10}).w;
 }
 }
-_f=_13+_6;
+_f=_12+_2;
 }
 }
 this.scaler.minMinorStep=_f;
-this.ticks=_5.buildTicks(this.scaler,this.opt);
+this.ticks=_1.buildTicks(this.scaler,o);
 return this;
 },getScaler:function(){
 return this.scaler;
 },getTicks:function(){
 return this.ticks;
 },getOffsets:function(){
-var _19={l:0,r:0,t:0,b:0},_1a,a,b,c,d,gtb=dojox.gfx._base._getTextBox,gl=dc.scaler.common.getNumericLabel,_21=0,ta=this.chart.theme.axis,_23="font" in this.opt?this.opt.font:ta.font,_24="majorTick" in this.opt?this.opt.majorTick:ta.majorTick,_25="minorTick" in this.opt?this.opt.minorTick:ta.minorTick,_26=_23?g.normalizedLength(g.splitFontString(_23).size):0,s=this.scaler;
+var o=this.opt;
+var _15={l:0,r:0,t:0,b:0},_16,a,b,c,d,gl=dc.scaler.common.getNumericLabel,_17=0,ta=this.chart.theme.axis,_18="font" in o?o.font:ta.font,_19="majorTick" in o?o.majorTick:ta.majorTick,_1a="minorTick" in o?o.minorTick:ta.minorTick,_1b=_18?g.normalizedLength(g.splitFontString(_18).size):0,s=this.scaler;
 if(!s){
-return _19;
+return _15;
 }
+var ma=s.major,mi=s.minor;
 if(this.vertical){
-if(_26){
-if(this.opt.labelFunc&&this.opt.maxLabelSize){
-_1a=this.opt.maxLabelSize;
+if(_1b){
+if(o.labelFunc&&o.maxLabelSize){
+_16=o.maxLabelSize;
 }else{
 if(this.labels){
-_1a=df.foldl(df.map(this.labels,function(_28){
-return dojox.gfx._base._getTextBox(_28.text,{font:_23}).w;
-}),"Math.max(a, b)",0);
+_16=this._groupLabelWidth(this.labels,_18);
 }else{
-a=gtb(gl(s.major.start,s.major.prec,this.opt),{font:_23}).w;
-b=gtb(gl(s.major.start+s.major.count*s.major.tick,s.major.prec,this.opt),{font:_23}).w;
-c=gtb(gl(s.minor.start,s.minor.prec,this.opt),{font:_23}).w;
-d=gtb(gl(s.minor.start+s.minor.count*s.minor.tick,s.minor.prec,this.opt),{font:_23}).w;
-_1a=Math.max(a,b,c,d);
+_16=this._groupLabelWidth([gl(ma.start,ma.prec,o),gl(ma.start+ma.count*ma.tick,ma.prec,o),gl(mi.start,mi.prec,o),gl(mi.start+mi.count*mi.tick,mi.prec,o)],_18);
 }
 }
-_21=_1a+_6;
+_17=_16+_2;
 }
-_21+=_6+Math.max(_24.length,_25.length);
-_19[this.opt.leftBottom?"l":"r"]=_21;
-_19.t=_19.b=_26/2;
+_17+=_2+Math.max(_19.length,_1a.length);
+_15[o.leftBottom?"l":"r"]=_17;
+_15.t=_15.b=_1b/2;
 }else{
-if(_26){
-_21=_26+_6;
-}
-_21+=_6+Math.max(_24.length,_25.length);
-_19[this.opt.leftBottom?"b":"t"]=_21;
-if(_26){
-if(this.opt.labelFunc&&this.opt.maxLabelSize){
-_1a=this.opt.maxLabelSize;
+if(_1b){
+_17=_1b+_2;
+}
+_17+=_2+Math.max(_19.length,_1a.length);
+_15[o.leftBottom?"b":"t"]=_17;
+if(_1b){
+if(o.labelFunc&&o.maxLabelSize){
+_16=o.maxLabelSize;
 }else{
 if(this.labels){
-_1a=df.foldl(df.map(this.labels,function(_29){
-return dojox.gfx._base._getTextBox(_29.text,{font:_23}).w;
-}),"Math.max(a, b)",0);
+_16=this._groupLabelWidth(this.labels,_18);
 }else{
-a=gtb(gl(s.major.start,s.major.prec,this.opt),{font:_23}).w;
-b=gtb(gl(s.major.start+s.major.count*s.major.tick,s.major.prec,this.opt),{font:_23}).w;
-c=gtb(gl(s.minor.start,s.minor.prec,this.opt),{font:_23}).w;
-d=gtb(gl(s.minor.start+s.minor.count*s.minor.tick,s.minor.prec,this.opt),{font:_23}).w;
-_1a=Math.max(a,b,c,d);
+_16=this._groupLabelWidth([gl(ma.start,ma.prec,o),gl(ma.start+ma.count*ma.tick,ma.prec,o),gl(mi.start,mi.prec,o),gl(mi.start+mi.count*mi.tick,mi.prec,o)],_18);
 }
 }
-_19.l=_19.r=_1a/2;
+_15.l=_15.r=_16/2;
 }
 }
-return _19;
-},render:function(dim,_2b){
+if(_16){
+this._cachedLabelWidth=_16;
+}
+return _15;
+},render:function(dim,_1c){
 if(!this.dirty){
 return this;
 }
-var _2c,_2d,_2e,_2f,_30,_31,ta=this.chart.theme.axis,_33="stroke" in this.opt?this.opt.stroke:ta.stroke,_34="majorTick" in this.opt?this.opt.majorTick:ta.majorTick,_35="minorTick" in this.opt?this.opt.minorTick:ta.minorTick,_36="microTick" in this.opt?this.opt.microTick:ta.minorTick,_37="font" in this.opt?this.opt.font:ta.font,_38="fontColor" in this.opt?this.opt.fontColor:ta.fontColor,_39=Math.max(_34.length,_35.length),_3a=_37?g.normalizedLength(g.splitFontString(_37).size):0;
+var o=this.opt;
+var _1d,_1e,_1f,_20,_21,_22,ta=this.chart.theme.axis,_23="stroke" in o?o.stroke:ta.stroke,_24="majorTick" in o?o.majorTick:ta.majorTick,_25="minorTick" in o?o.minorTick:ta.minorTick,_26="microTick" in o?o.microTick:ta.minorTick,_27="font" in o?o.font:ta.font,_28="fontColor" in o?o.fontColor:ta.fontColor,_29=Math.max(_24.length,_25.length),_2a=_27?g.normalizedLength(g.splitFontString(_27).size):0;
 if(this.vertical){
-_2c={y:dim.height-_2b.b};
-_2d={y:_2b.t};
-_2e={x:0,y:-1};
-if(this.opt.leftBottom){
-_2c.x=_2d.x=_2b.l;
-_2f={x:-1,y:0};
-_31="end";
+_1d={y:dim.height-_1c.b};
+_1e={y:_1c.t};
+_1f={x:0,y:-1};
+if(o.leftBottom){
+_1d.x=_1e.x=_1c.l;
+_20={x:-1,y:0};
+_22="end";
 }else{
-_2c.x=_2d.x=dim.width-_2b.r;
-_2f={x:1,y:0};
-_31="start";
+_1d.x=_1e.x=dim.width-_1c.r;
+_20={x:1,y:0};
+_22="start";
 }
-_30={x:_2f.x*(_39+_6),y:_3a*0.4};
+_21={x:_20.x*(_29+_2),y:_2a*0.4};
 }else{
-_2c={x:_2b.l};
-_2d={x:dim.width-_2b.r};
-_2e={x:1,y:0};
-_31="middle";
-if(this.opt.leftBottom){
-_2c.y=_2d.y=dim.height-_2b.b;
-_2f={x:0,y:1};
-_30={y:_39+_6+_3a};
+_1d={x:_1c.l};
+_1e={x:dim.width-_1c.r};
+_1f={x:1,y:0};
+_22="middle";
+if(o.leftBottom){
+_1d.y=_1e.y=dim.height-_1c.b;
+_20={x:0,y:1};
+_21={y:_29+_2+_2a};
 }else{
-_2c.y=_2d.y=_2b.t;
-_2f={x:0,y:-1};
-_30={y:-_39-_6};
+_1d.y=_1e.y=_1c.t;
+_20={x:0,y:-1};
+_21={y:-_29-_2};
 }
-_30.x=0;
+_21.x=0;
 }
 this.cleanGroup();
 try{
-var s=this.group,c=this.scaler,t=this.ticks,_3e,f=_5.getTransformerFromModel(this.scaler),_40=dojox.gfx.renderer=="canvas",_41=_40||this.opt.htmlLabels&&!dojo.isIE&&!dojo.isOpera?"html":"gfx",dx=_2f.x*_34.length,dy=_2f.y*_34.length;
-s.createLine({x1:_2c.x,y1:_2c.y,x2:_2d.x,y2:_2d.y}).setStroke(_33);
-dojo.forEach(t.major,function(_44){
-var _45=f(_44.value),_46,x=_2c.x+_2e.x*_45,y=_2c.y+_2e.y*_45;
-s.createLine({x1:x,y1:y,x2:x+dx,y2:y+dy}).setStroke(_34);
-if(_44.label){
-_46=dc.axis2d.common.createText[_41](this.chart,s,x+_30.x,y+_30.y,_31,_44.label,_37,_38);
-if(_41=="html"){
-this.htmlElements.push(_46);
+var s=this.group,c=this.scaler,t=this.ticks,_2b,f=_1.getTransformerFromModel(this.scaler),_2c=(dojox.gfx.renderer=="canvas"),_2d=_2c||this.opt.htmlLabels&&!dojo.isIE&&!dojo.isOpera?"html":"gfx",dx=_20.x*_24.length,dy=_20.y*_24.length;
+s.createLine({x1:_1d.x,y1:_1d.y,x2:_1e.x,y2:_1e.y}).setStroke(_23);
+dojo.forEach(t.major,function(_2e){
+var _2f=f(_2e.value),_30,x=_1d.x+_1f.x*_2f,y=_1d.y+_1f.y*_2f;
+s.createLine({x1:x,y1:y,x2:x+dx,y2:y+dy}).setStroke(_24);
+if(_2e.label){
+_30=dc.axis2d.common.createText[_2d](this.chart,s,x+_21.x,y+_21.y,_22,_2e.label,_27,_28,this._cachedLabelWidth);
+if(_2d=="html"){
+this.htmlElements.push(_30);
 }
 }
 },this);
-dx=_2f.x*_35.length;
-dy=_2f.y*_35.length;
-_3e=c.minMinorStep<=c.minor.tick*c.bounds.scale;
-dojo.forEach(t.minor,function(_49){
-var _4a=f(_49.value),_4b,x=_2c.x+_2e.x*_4a,y=_2c.y+_2e.y*_4a;
-s.createLine({x1:x,y1:y,x2:x+dx,y2:y+dy}).setStroke(_35);
-if(_3e&&_49.label){
-_4b=dc.axis2d.common.createText[_41](this.chart,s,x+_30.x,y+_30.y,_31,_49.label,_37,_38);
-if(_41=="html"){
-this.htmlElements.push(_4b);
+dx=_20.x*_25.length;
+dy=_20.y*_25.length;
+_2b=c.minMinorStep<=c.minor.tick*c.bounds.scale;
+dojo.forEach(t.minor,function(_31){
+var _32=f(_31.value),_33,x=_1d.x+_1f.x*_32,y=_1d.y+_1f.y*_32;
+s.createLine({x1:x,y1:y,x2:x+dx,y2:y+dy}).setStroke(_25);
+if(_2b&&_31.label){
+_33=dc.axis2d.common.createText[_2d](this.chart,s,x+_21.x,y+_21.y,_22,_31.label,_27,_28,this._cachedLabelWidth);
+if(_2d=="html"){
+this.htmlElements.push(_33);
 }
 }
 },this);
-dx=_2f.x*_36.length;
-dy=_2f.y*_36.length;
-dojo.forEach(t.micro,function(_4e){
-var _4f=f(_4e.value),_50,x=_2c.x+_2e.x*_4f,y=_2c.y+_2e.y*_4f;
-s.createLine({x1:x,y1:y,x2:x+dx,y2:y+dy}).setStroke(_36);
+dx=_20.x*_26.length;
+dy=_20.y*_26.length;
+dojo.forEach(t.micro,function(_34){
+var _35=f(_34.value),_36,x=_1d.x+_1f.x*_35,y=_1d.y+_1f.y*_35;
+s.createLine({x1:x,y1:y,x2:x+dx,y2:y+dy}).setStroke(_26);
 },this);
 }
 catch(e){
diff --git a/dojox/charting/axis2d/common.js b/dojox/charting/axis2d/common.js
index f0b5f90..66529c0 100644
--- a/dojox/charting/axis2d/common.js
+++ b/dojox/charting/axis2d/common.js
@@ -11,7 +11,7 @@ dojo.provide("dojox.charting.axis2d.common");
 dojo.require("dojox.gfx");
 (function(){
 var g=dojox.gfx;
-function _2(s){
+var _1=function(s){
 s.marginLeft="0px";
 s.marginTop="0px";
 s.marginRight="0px";
@@ -25,39 +25,68 @@ s.borderTopWidth="0px";
 s.borderRightWidth="0px";
 s.borderBottomWidth="0px";
 };
-dojo.mixin(dojox.charting.axis2d.common,{createText:{gfx:function(_4,_5,x,y,_8,_9,_a,_b){
-return _5.createText({x:x,y:y,text:_9,align:_8}).setFont(_a).setFill(_b);
-},html:function(_c,_d,x,y,_10,_11,_12,_13){
-var p=dojo.doc.createElement("div"),s=p.style;
-_2(s);
-s.font=_12;
-p.innerHTML=String(_11).replace(/\s/g," ");
-s.color=_13;
+var _2=function(n){
+if(n["getBoundingClientRect"]){
+var _3=n.getBoundingClientRect();
+return _3.width||(_3.right-_3.left);
+}else{
+return dojo.marginBox(n).w;
+}
+};
+dojo.mixin(dojox.charting.axis2d.common,{createText:{gfx:function(_4,_5,x,y,_6,_7,_8,_9){
+return _5.createText({x:x,y:y,text:_7,align:_6}).setFont(_8).setFill(_9);
+},html:function(_a,_b,x,y,_c,_d,_e,_f,_10){
+var p=dojo.doc.createElement("div"),s=p.style,_11;
+_1(s);
+s.font=_e;
+p.innerHTML=String(_d).replace(/\s/g," ");
+s.color=_f;
 s.position="absolute";
 s.left="-10000px";
 dojo.body().appendChild(p);
-var _16=g.normalizedLength(g.splitFontString(_12).size),box=dojo.marginBox(p);
+var _12=g.normalizedLength(g.splitFontString(_e).size);
+if(!_10){
+_11=_2(p);
+}
 dojo.body().removeChild(p);
 s.position="relative";
-switch(_10){
+if(_10){
+s.width=_10+"px";
+switch(_c){
 case "middle":
-s.left=Math.floor(x-box.w/2)+"px";
+s.textAlign="center";
+s.left=(x-_10/2)+"px";
 break;
 case "end":
-s.left=Math.floor(x-box.w)+"px";
+s.textAlign="right";
+s.left=(x-_10)+"px";
+break;
+default:
+s.left=x+"px";
+s.textAlign="left";
+break;
+}
+}else{
+switch(_c){
+case "middle":
+s.left=Math.floor(x-_11/2)+"px";
+break;
+case "end":
+s.left=Math.floor(x-_11)+"px";
 break;
 default:
 s.left=Math.floor(x)+"px";
 break;
 }
-s.top=Math.floor(y-_16)+"px";
-var _18=dojo.doc.createElement("div"),w=_18.style;
-_2(w);
+}
+s.top=Math.floor(y-_12)+"px";
+var _13=dojo.doc.createElement("div"),w=_13.style;
+_1(w);
 w.width="0px";
 w.height="0px";
-_18.appendChild(p);
-_c.node.insertBefore(_18,_c.node.firstChild);
-return _18;
+_13.appendChild(p);
+_a.node.insertBefore(_13,_a.node.firstChild);
+return _13;
 }}});
 })();
 }
diff --git a/dojox/charting/plot2d/Bars.js b/dojox/charting/plot2d/Bars.js
index a2dca87..ca2f862 100644
--- a/dojox/charting/plot2d/Bars.js
+++ b/dojox/charting/plot2d/Bars.js
@@ -10,40 +10,42 @@ 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.gfx.fx");
 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,_4=df.lambda("item.purgeGroup()");
-dojo.declare("dojox.charting.plot2d.Bars",dojox.charting.plot2d.Base,{defaultParams:{hAxis:"x",vAxis:"y",gap:0,shadows:null},optionalParams:{minBarSize:1,maxBarSize:1},constructor:function(_5,_6){
+var df=dojox.lang.functional,du=dojox.lang.utils,dc=dojox.charting.plot2d.common,_1=df.lambda("item.purgeGroup()");
+dojo.declare("dojox.charting.plot2d.Bars",dojox.charting.plot2d.Base,{defaultParams:{hAxis:"x",vAxis:"y",gap:0,shadows:null,animate:null},optionalParams:{minBarSize:1,maxBarSize:1},constructor:function(_2,_3){
 this.opt=dojo.clone(this.defaultParams);
-du.updateWithObject(this.opt,_6);
-du.updateWithPattern(this.opt,_6,this.optionalParams);
+du.updateWithObject(this.opt,_3);
+du.updateWithPattern(this.opt,_3,this.optionalParams);
 this.series=[];
 this.hAxis=this.opt.hAxis;
 this.vAxis=this.opt.vAxis;
-},calculateAxes:function(_7){
-var _8=dc.collectSimpleStats(this.series),t;
-_8.hmin-=0.5;
-_8.hmax+=0.5;
-t=_8.hmin,_8.hmin=_8.vmin,_8.vmin=t;
-t=_8.hmax,_8.hmax=_8.vmax,_8.vmax=t;
-this._calc(_7,_8);
+this.animate=this.opt.animate;
+},calculateAxes:function(_4){
+var _5=dc.collectSimpleStats(this.series),t;
+_5.hmin-=0.5;
+_5.hmax+=0.5;
+t=_5.hmin,_5.hmin=_5.vmin,_5.vmin=t;
+t=_5.hmax,_5.hmax=_5.vmax,_5.vmax=t;
+this._calc(_4,_5);
 return this;
-},render:function(_a,_b){
+},render:function(_6,_7){
 this.dirty=this.isDirty();
 if(this.dirty){
-dojo.forEach(this.series,_4);
+dojo.forEach(this.series,_1);
 this.cleanGroup();
 var s=this.group;
-df.forEachRev(this.series,function(_d){
-_d.cleanGroup(s);
+df.forEachRev(this.series,function(_8){
+_8.cleanGroup(s);
 });
 }
-var t=this.chart.theme,_f,_10,_11,f,gap,_14,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_17=Math.max(0,this._hScaler.bounds.lower),_18=ht(_17),_19=this.events();
+var t=this.chart.theme,_9,_a,_b,f,_c,_d,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_e=Math.max(0,this._hScaler.bounds.lower),_f=ht(_e),_10=this.events();
 f=dc.calculateBarSize(this._vScaler.bounds.scale,this.opt);
-gap=f.gap;
-_14=f.size;
+_c=f.gap;
+_d=f.size;
 this.resetEvents();
 for(var i=this.series.length-1;i>=0;--i){
 var run=this.series[i];
@@ -53,19 +55,41 @@ continue;
 run.cleanGroup();
 var s=run.group;
 if(!run.fill||!run.stroke){
-_f=run.dyn.color=new dojo.Color(t.next("color"));
+_9=run.dyn.color=new dojo.Color(t.next("color"));
 }
-_10=run.stroke?run.stroke:dc.augmentStroke(t.series.stroke,_f);
-_11=run.fill?run.fill:dc.augmentFill(t.series.fill,_f);
+_a=run.stroke?run.stroke:dc.augmentStroke(t.series.stroke,_9);
+_b=run.fill?run.fill:dc.augmentFill(t.series.fill,_9);
 for(var j=0;j<run.data.length;++j){
-var v=run.data[j],hv=ht(v),_1f=hv-_18,w=Math.abs(_1f);
-if(w>=1&&_14>=1){
-var _21=s.createRect({x:_b.l+(v<_17?hv:_18),y:_a.height-_b.b-vt(j+1.5)+gap,width:w,height:_14}).setFill(_11).setStroke(_10);
-run.dyn.fill=_21.getFill();
-run.dyn.stroke=_21.getStroke();
-if(_19){
-var o={element:"bar",index:j,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_21,x:v,y:j+1.5};
-this._connectEvents(_21,o);
+var _11=run.data[j],v=typeof _11=="number"?_11:_11.y,hv=ht(v),_12=hv-_f,w=Math.abs(_12),_13=_9,_14=_b,_15=_a;
+if(typeof _11!="number"){
+if(_11.color){
+_13=new dojo.Color(_11.color);
+}
+if("fill" in _11){
+_14=_11.fill;
+}else{
+if(_11.color){
+_14=dc.augmentFill(t.series.fill,_13);
+}
+}
+if("stroke" in _11){
+_15=_11.stroke;
+}else{
+if(_11.color){
+_15=dc.augmentStroke(t.series.stroke,_13);
+}
+}
+}
+if(w>=1&&_d>=1){
+var _16=s.createRect({x:_7.l+(v<_e?hv:_f),y:_6.height-_7.b-vt(j+1.5)+_c,width:w,height:_d}).setFill(_14).setStroke(_15);
+run.dyn.fill=_16.getFill();
+run.dyn.stroke=_16.getStroke();
+if(_10){
+var o={element:"bar",index:j,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_16,x:v,y:j+1.5};
+this._connectEvents(_16,o);
+}
+if(this.animate){
+this._animateBar(_16,_7.l+_f,-w);
 }
 }
 }
@@ -73,6 +97,8 @@ run.dirty=false;
 }
 this.dirty=false;
 return this;
+},_animateBar:function(_17,_18,_19){
+dojox.gfx.fx.animateTransform(dojo.delegate({shape:_17,duration:1200,transform:[{name:"translate",start:[_18-(_18/_19),0],end:[0,0]},{name:"scale",start:[1/_19,1],end:[1,1]},{name:"original"}]},this.animate)).play();
 }});
 })();
 }
diff --git a/dojox/charting/plot2d/Base.js b/dojox/charting/plot2d/Base.js
index c753966..1faff35 100644
--- a/dojox/charting/plot2d/Base.js
+++ b/dojox/charting/plot2d/Base.js
@@ -37,9 +37,9 @@ return this;
 },getRequiredColors:function(){
 return this.series.length;
 },plotEvent:function(o){
-},connect:function(_7,_8){
+},connect:function(_6,_7){
 this.dirty=true;
-return dojo.connect(this,"plotEvent",_7,_8);
+return dojo.connect(this,"plotEvent",_6,_7);
 },events:function(){
 var ls=this.plotEvent._listeners;
 if(!ls||!ls.length){
@@ -53,35 +53,35 @@ return true;
 return false;
 },resetEvents:function(){
 this.plotEvent({type:"onplotreset",plot:this});
-},_calc:function(_b,_c){
+},_calc:function(_8,_9){
 if(this._hAxis){
 if(!this._hAxis.initialized()){
-this._hAxis.calculate(_c.hmin,_c.hmax,_b.width);
+this._hAxis.calculate(_9.hmin,_9.hmax,_8.width);
 }
 this._hScaler=this._hAxis.getScaler();
 }else{
-this._hScaler=dojox.charting.scaler.primitive.buildScaler(_c.hmin,_c.hmax,_b.width);
+this._hScaler=dojox.charting.scaler.primitive.buildScaler(_9.hmin,_9.hmax,_8.width);
 }
 if(this._vAxis){
 if(!this._vAxis.initialized()){
-this._vAxis.calculate(_c.vmin,_c.vmax,_b.height);
+this._vAxis.calculate(_9.vmin,_9.vmax,_8.height);
 }
 this._vScaler=this._vAxis.getScaler();
 }else{
-this._vScaler=dojox.charting.scaler.primitive.buildScaler(_c.vmin,_c.vmax,_b.height);
+this._vScaler=dojox.charting.scaler.primitive.buildScaler(_9.vmin,_9.vmax,_8.height);
 }
-},_connectEvents:function(_d,o){
-_d.connect("onmouseover",this,function(e){
+},_connectEvents:function(_a,o){
+_a.connect("onmouseover",this,function(e){
 o.type="onmouseover";
 o.event=e;
 this.plotEvent(o);
 });
-_d.connect("onmouseout",this,function(e){
+_a.connect("onmouseout",this,function(e){
 o.type="onmouseout";
 o.event=e;
 this.plotEvent(o);
 });
-_d.connect("onclick",this,function(e){
+_a.connect("onclick",this,function(e){
 o.type="onclick";
 o.event=e;
 this.plotEvent(o);
diff --git a/dojox/charting/plot2d/Bubble.js b/dojox/charting/plot2d/Bubble.js
index 5bebb7b..134ecee 100644
--- a/dojox/charting/plot2d/Bubble.js
+++ b/dojox/charting/plot2d/Bubble.js
@@ -11,85 +11,85 @@ dojo.provide("dojox.charting.plot2d.Bubble");
 dojo.require("dojox.charting.plot2d.Base");
 dojo.require("dojox.lang.functional");
 (function(){
-var df=dojox.lang.functional,du=dojox.lang.utils,dc=dojox.charting.plot2d.common,_4=df.lambda("item.purgeGroup()");
-dojo.declare("dojox.charting.plot2d.Bubble",dojox.charting.plot2d.Base,{defaultParams:{hAxis:"x",vAxis:"y"},optionalParams:{},constructor:function(_5,_6){
+var df=dojox.lang.functional,du=dojox.lang.utils,dc=dojox.charting.plot2d.common,_1=df.lambda("item.purgeGroup()");
+dojo.declare("dojox.charting.plot2d.Bubble",dojox.charting.plot2d.Base,{defaultParams:{hAxis:"x",vAxis:"y"},optionalParams:{},constructor:function(_2,_3){
 this.opt=dojo.clone(this.defaultParams);
-du.updateWithObject(this.opt,_6);
+du.updateWithObject(this.opt,_3);
 this.series=[];
 this.hAxis=this.opt.hAxis;
 this.vAxis=this.opt.vAxis;
-},calculateAxes:function(_7){
-this._calc(_7,dc.collectSimpleStats(this.series));
+},calculateAxes:function(_4){
+this._calc(_4,dc.collectSimpleStats(this.series));
 return this;
-},render:function(_8,_9){
+},render:function(_5,_6){
 this.dirty=this.isDirty();
 if(this.dirty){
-dojo.forEach(this.series,_4);
+dojo.forEach(this.series,_1);
 this.cleanGroup();
 var s=this.group;
-df.forEachRev(this.series,function(_b){
-_b.cleanGroup(s);
+df.forEachRev(this.series,function(_7){
+_7.cleanGroup(s);
 });
 }
-var t=this.chart.theme,_d,_e,_f,_10,_11,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_14=this.events();
+var t=this.chart.theme,_8,_9,_a,_b,_c,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_d=this.events();
 this.resetEvents();
 for(var i=this.series.length-1;i>=0;--i){
-var run=this.series[i];
-if(!this.dirty&&!run.dirty){
+var _e=this.series[i];
+if(!this.dirty&&!_e.dirty){
 continue;
 }
-run.cleanGroup();
-if(!run.data.length){
-run.dirty=false;
+_e.cleanGroup();
+if(!_e.data.length){
+_e.dirty=false;
 continue;
 }
-if(typeof run.data[0]=="number"){
-console.warn("dojox.charting.plot2d.Bubble: the data in the following series cannot be rendered as a bubble chart; ",run);
+if(typeof _e.data[0]=="number"){
+console.warn("dojox.charting.plot2d.Bubble: the data in the following series cannot be rendered as a bubble chart; ",_e);
 continue;
 }
-var s=run.group,_17=dojo.map(run.data,function(v,i){
-return {x:ht(v.x)+_9.l,y:_8.height-_9.b-vt(v.y),radius:this._vScaler.bounds.scale*(v.size/2)};
+var s=_e.group,_f=dojo.map(_e.data,function(v,i){
+return {x:ht(v.x)+_6.l,y:_5.height-_6.b-vt(v.y),radius:this._vScaler.bounds.scale*(v.size/2)};
 },this);
-if(run.fill){
-_f=run.fill;
+if(_e.fill){
+_a=_e.fill;
 }else{
-if(run.stroke){
-_f=run.stroke;
+if(_e.stroke){
+_a=_e.stroke;
 }else{
-_f=run.dyn.color=new dojo.Color(t.next("color"));
+_a=_e.dyn.color=new dojo.Color(t.next("color"));
 }
 }
-run.dyn.fill=_f;
-_d=run.dyn.stroke=run.stroke?dc.makeStroke(run.stroke):dc.augmentStroke(t.series.stroke,_f);
-var _1a=null,_1b=null,_1c=null;
-if(this.opt.shadows&&_d){
-var sh=this.opt.shadows,_11=new dojo.Color([0,0,0,0.2]),_10=dojo.clone(_e?_e:_d);
-_10.color=_11;
-_10.width+=sh.dw?sh.dw:0;
-run.dyn.shadow=_10;
-var _1e=dojo.map(_17,function(_1f){
+_e.dyn.fill=_a;
+_8=_e.dyn.stroke=_e.stroke?dc.makeStroke(_e.stroke):dc.augmentStroke(t.series.stroke,_a);
+var _10=null,_11=null,_12=null;
+if(this.opt.shadows&&_8){
+var sh=this.opt.shadows,_c=new dojo.Color([0,0,0,0.2]),_b=dojo.clone(_9?_9:_8);
+_b.color=_c;
+_b.width+=sh.dw?sh.dw:0;
+_e.dyn.shadow=_b;
+var _13=dojo.map(_f,function(_14){
 var sh=this.opt.shadows;
-return s.createCircle({cx:_1f.x+sh.dx,cy:_1f.y+sh.dy,r:_1f.radius}).setStroke(_10).setFill(_11);
+return s.createCircle({cx:_14.x+sh.dx,cy:_14.y+sh.dy,r:_14.radius}).setStroke(_b).setFill(_c);
 },this);
 }
-if(run.outline||t.series.outline){
-_e=dc.makeStroke(run.outline?run.outline:t.series.outline);
-_e.width=2*_e.width+_d.width;
-run.dyn.outline=_e;
-_1b=dojo.map(_17,function(_21){
-s.createCircle({cx:_21.x,cy:_21.y,r:_21.radius}).setStroke(_e);
+if(_e.outline||t.series.outline){
+_9=dc.makeStroke(_e.outline?_e.outline:t.series.outline);
+_9.width=2*_9.width+_8.width;
+_e.dyn.outline=_9;
+_11=dojo.map(_f,function(_15){
+s.createCircle({cx:_15.x,cy:_15.y,r:_15.radius}).setStroke(_9);
 },this);
 }
-_1a=dojo.map(_17,function(_22){
-return s.createCircle({cx:_22.x,cy:_22.y,r:_22.radius}).setStroke(_d).setFill(_f);
+_10=dojo.map(_f,function(_16){
+return s.createCircle({cx:_16.x,cy:_16.y,r:_16.radius}).setStroke(_8).setFill(_a);
 },this);
-if(_14){
-dojo.forEach(_1a,function(s,i){
-var o={element:"circle",index:i,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:s,outline:_1b&&_1b[i]||null,shadow:_1c&&_1c[i]||null,x:run.data[i].x,y:run.data[i].y,r:run.data[i].size/2,cx:_17[i].x,cy:_17[i].y,cr:_17[i].radius};
+if(_d){
+dojo.forEach(_10,function(s,i){
+var o={element:"circle",index:i,run:_e,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:s,outline:_11&&_11[i]||null,shadow:_12&&_12[i]||null,x:_e.data[i].x,y:_e.data[i].y,r:_e.data[i].size/2,cx:_f[i].x,cy:_f[i].y,cr:_f[i].radius};
 this._connectEvents(s,o);
 },this);
 }
-run.dirty=false;
+_e.dirty=false;
 }
 this.dirty=false;
 return this;
diff --git a/dojox/charting/plot2d/Candlesticks.js b/dojox/charting/plot2d/Candlesticks.js
new file mode 100644
index 0000000..7dc74e8
--- /dev/null
+++ b/dojox/charting/plot2d/Candlesticks.js
@@ -0,0 +1,119 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.charting.plot2d.Candlesticks"]){
+dojo._hasResource["dojox.charting.plot2d.Candlesticks"]=true;
+dojo.provide("dojox.charting.plot2d.Candlesticks");
+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,_1=df.lambda("item.purgeGroup()");
+dojo.declare("dojox.charting.plot2d.Candlesticks",dojox.charting.plot2d.Base,{defaultParams:{hAxis:"x",vAxis:"y",gap:2,shadows:null},optionalParams:{minBarSize:1,maxBarSize:1},constructor:function(_2,_3){
+this.opt=dojo.clone(this.defaultParams);
+du.updateWithObject(this.opt,_3);
+du.updateWithPattern(this.opt,_3,this.optionalParams);
+this.series=[];
+this.hAxis=this.opt.hAxis;
+this.vAxis=this.opt.vAxis;
+},collectStats:function(_4){
+var _5=dojo.clone(dc.defaultStats);
+for(var i=0;i<_4.length;i++){
+var _6=_4[i];
+if(!_6.data.length){
+continue;
+}
+var _7=_5.vmin,_8=_5.vmax;
+if(!("ymin" in _6)||!("ymax" in _6)){
+dojo.forEach(_6.data,function(_9,_a){
+var x=_9.x||_a+1;
+_5.hmin=Math.min(_5.hmin,x);
+_5.hmax=Math.max(_5.hmax,x);
+_5.vmin=Math.min(_5.vmin,_9.open,_9.close,_9.high,_9.low);
+_5.vmax=Math.max(_5.vmax,_9.open,_9.close,_9.high,_9.low);
+});
+}
+if("ymin" in _6){
+_5.vmin=Math.min(_7,_6.ymin);
+}
+if("ymax" in _6){
+_5.vmax=Math.max(_8,_6.ymax);
+}
+}
+return _5;
+},calculateAxes:function(_b){
+var _c=this.collectStats(this.series),t;
+_c.hmin-=0.5;
+_c.hmax+=0.5;
+this._calc(_b,_c);
+return this;
+},render:function(_d,_e){
+this.dirty=this.isDirty();
+if(this.dirty){
+dojo.forEach(this.series,_1);
+this.cleanGroup();
+var s=this.group;
+df.forEachRev(this.series,function(_f){
+_f.cleanGroup(s);
+});
+}
+var t=this.chart.theme,_10,_11,_12,f,gap,_13,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_14=Math.max(0,this._vScaler.bounds.lower),_15=vt(_14),_16=this.events();
+f=dc.calculateBarSize(this._hScaler.bounds.scale,this.opt);
+gap=f.gap;
+_13=f.size;
+this.resetEvents();
+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){
+_10=run.dyn.color=new dojo.Color(t.next("color"));
+}
+_11=run.stroke?run.stroke:dc.augmentStroke(t.series.stroke,_10);
+_12=run.fill?run.fill:dc.augmentFill(t.series.fill,_10);
+for(var j=0;j<run.data.length;++j){
+var v=run.data[j];
+var x=ht(v.x||(j+0.5))+_e.l+gap,y=_d.height-_e.b,_17=vt(v.open),_18=vt(v.close),_19=vt(v.high),low=vt(v.low);
+if("mid" in v){
+var mid=vt(v.mid);
+}
+if(low>_19){
+var tmp=_19;
+_19=low;
+low=tmp;
+}
+if(_13>=1){
+var _1a=_17>_18;
+var _1b={x1:_13/2,x2:_13/2,y1:y-_19,y2:y-low},_1c={x:0,y:y-Math.max(_17,_18),width:_13,height:Math.max(_1a?_17-_18:_18-_17,1)};
+shape=s.createGroup();
+shape.setTransform({dx:x,dy:0});
+var _1d=shape.createGroup();
+_1d.createLine(_1b).setStroke(_11);
+_1d.createRect(_1c).setStroke(_11).setFill(_1a?_12:"white");
+if("mid" in v){
+_1d.createLine({x1:(_11.width||1),x2:_13-(_11.width||1),y1:y-mid,y2:y-mid}).setStroke(_1a?{color:"white"}:_11);
+}
+run.dyn.fill=_12;
+run.dyn.stroke=_11;
+if(_16){
+var o={element:"candlestick",index:j,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_1d,x:x,y:y-Math.max(_17,_18),cx:_13/2,cy:(y-Math.max(_17,_18))+(Math.max(_1a?_17-_18:_18-_17,1)/2),width:_13,height:Math.max(_1a?_17-_18:_18-_17,1),data:v};
+this._connectEvents(shape,o);
+}
+}
+}
+run.dirty=false;
+}
+this.dirty=false;
+return this;
+}});
+})();
+}
diff --git a/dojox/charting/plot2d/ClusteredBars.js b/dojox/charting/plot2d/ClusteredBars.js
index 434b4d0..4187590 100644
--- a/dojox/charting/plot2d/ClusteredBars.js
+++ b/dojox/charting/plot2d/ClusteredBars.js
@@ -13,47 +13,69 @@ 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,_3=df.lambda("item.purgeGroup()");
-dojo.declare("dojox.charting.plot2d.ClusteredBars",dojox.charting.plot2d.Bars,{render:function(_4,_5){
+var df=dojox.lang.functional,dc=dojox.charting.plot2d.common,_1=df.lambda("item.purgeGroup()");
+dojo.declare("dojox.charting.plot2d.ClusteredBars",dojox.charting.plot2d.Bars,{render:function(_2,_3){
 this.dirty=this.isDirty();
 if(this.dirty){
-dojo.forEach(this.series,_3);
+dojo.forEach(this.series,_1);
 this.cleanGroup();
 var s=this.group;
-df.forEachRev(this.series,function(_7){
-_7.cleanGroup(s);
+df.forEachRev(this.series,function(_4){
+_4.cleanGroup(s);
 });
 }
-var t=this.chart.theme,_9,_a,_b,f,_d,_e,_f,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_12=Math.max(0,this._hScaler.bounds.lower),_13=ht(_12),_14=this.events();
+var t=this.chart.theme,_5,_6,_7,f,_8,_9,_a,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_b=Math.max(0,this._hScaler.bounds.lower),_c=ht(_b),_d=this.events();
 f=dc.calculateBarSize(this._vScaler.bounds.scale,this.opt,this.series.length);
-_d=f.gap;
-_e=_f=f.size;
+_8=f.gap;
+_9=_a=f.size;
 this.resetEvents();
 for(var i=this.series.length-1;i>=0;--i){
-var run=this.series[i],_17=_f*(this.series.length-i-1);
-if(!this.dirty&&!run.dirty){
+var _e=this.series[i],_f=_a*(this.series.length-i-1);
+if(!this.dirty&&!_e.dirty){
 continue;
 }
-run.cleanGroup();
-var s=run.group;
-if(!run.fill||!run.stroke){
-_9=run.dyn.color=new dojo.Color(t.next("color"));
+_e.cleanGroup();
+var s=_e.group;
+if(!_e.fill||!_e.stroke){
+_5=_e.dyn.color=new dojo.Color(t.next("color"));
 }
-_a=run.stroke?run.stroke:dc.augmentStroke(t.series.stroke,_9);
-_b=run.fill?run.fill:dc.augmentFill(t.series.fill,_9);
-for(var j=0;j<run.data.length;++j){
-var v=run.data[j],hv=ht(v),_1b=hv-_13,w=Math.abs(_1b);
-if(w>=1&&_e>=1){
-var _1d=s.createRect({x:_5.l+(v<_12?hv:_13),y:_4.height-_5.b-vt(j+1.5)+_d+_17,width:w,height:_e}).setFill(_b).setStroke(_a);
-run.dyn.fill=_1d.getFill();
-run.dyn.stroke=_1d.getStroke();
-if(_14){
-var o={element:"bar",index:j,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_1d,x:v,y:j+1.5};
-this._connectEvents(_1d,o);
+_6=_e.stroke?_e.stroke:dc.augmentStroke(t.series.stroke,_5);
+_7=_e.fill?_e.fill:dc.augmentFill(t.series.fill,_5);
+for(var j=0;j<_e.data.length;++j){
+var _10=_e.data[j],v=typeof _10=="number"?_10:_10.y,hv=ht(v),_11=hv-_c,w=Math.abs(_11),_12=_5,_13=_7,_14=_6;
+if(typeof _10!="number"){
+if(_10.color){
+_12=new dojo.Color(_10.color);
 }
+if("fill" in _10){
+_13=_10.fill;
+}else{
+if(_10.color){
+_13=dc.augmentFill(t.series.fill,_12);
 }
 }
-run.dirty=false;
+if("stroke" in _10){
+_14=_10.stroke;
+}else{
+if(_10.color){
+_14=dc.augmentStroke(t.series.stroke,_12);
+}
+}
+}
+if(w>=1&&_9>=1){
+var _15=s.createRect({x:_3.l+(v<_b?hv:_c),y:_2.height-_3.b-vt(j+1.5)+_8+_f,width:w,height:_9}).setFill(_13).setStroke(_14);
+_e.dyn.fill=_15.getFill();
+_e.dyn.stroke=_15.getStroke();
+if(_d){
+var o={element:"bar",index:j,run:_e,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_15,x:v,y:j+1.5};
+this._connectEvents(_15,o);
+}
+if(this.animate){
+this._animateBar(_15,_3.l+_c,-_11);
+}
+}
+}
+_e.dirty=false;
 }
 this.dirty=false;
 return this;
diff --git a/dojox/charting/plot2d/ClusteredColumns.js b/dojox/charting/plot2d/ClusteredColumns.js
index 8899aed..cba2af4 100644
--- a/dojox/charting/plot2d/ClusteredColumns.js
+++ b/dojox/charting/plot2d/ClusteredColumns.js
@@ -13,47 +13,69 @@ 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,_3=df.lambda("item.purgeGroup()");
-dojo.declare("dojox.charting.plot2d.ClusteredColumns",dojox.charting.plot2d.Columns,{render:function(_4,_5){
+var df=dojox.lang.functional,dc=dojox.charting.plot2d.common,_1=df.lambda("item.purgeGroup()");
+dojo.declare("dojox.charting.plot2d.ClusteredColumns",dojox.charting.plot2d.Columns,{render:function(_2,_3){
 this.dirty=this.isDirty();
 if(this.dirty){
-dojo.forEach(this.series,_3);
+dojo.forEach(this.series,_1);
 this.cleanGroup();
 var s=this.group;
-df.forEachRev(this.series,function(_7){
-_7.cleanGroup(s);
+df.forEachRev(this.series,function(_4){
+_4.cleanGroup(s);
 });
 }
-var t=this.chart.theme,_9,_a,_b,f,_d,_e,_f,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_12=Math.max(0,this._vScaler.bounds.lower),_13=vt(_12),_14=this.events();
+var t=this.chart.theme,_5,_6,_7,f,_8,_9,_a,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_b=Math.max(0,this._vScaler.bounds.lower),_c=vt(_b),_d=this.events();
 f=dc.calculateBarSize(this._hScaler.bounds.scale,this.opt,this.series.length);
-_d=f.gap;
-_e=_f=f.size;
+_8=f.gap;
+_9=_a=f.size;
 this.resetEvents();
 for(var i=0;i<this.series.length;++i){
-var run=this.series[i],_17=_f*i;
-if(!this.dirty&&!run.dirty){
+var _e=this.series[i],_f=_a*i;
+if(!this.dirty&&!_e.dirty){
 continue;
 }
-run.cleanGroup();
-var s=run.group;
-if(!run.fill||!run.stroke){
-_9=run.dyn.color=new dojo.Color(t.next("color"));
+_e.cleanGroup();
+var s=_e.group;
+if(!_e.fill||!_e.stroke){
+_5=_e.dyn.color=new dojo.Color(t.next("color"));
 }
-_a=run.stroke?run.stroke:dc.augmentStroke(t.series.stroke,_9);
-_b=run.fill?run.fill:dc.augmentFill(t.series.fill,_9);
-for(var j=0;j<run.data.length;++j){
-var v=run.data[j],vv=vt(v),_1b=vv-_13,h=Math.abs(_1b);
-if(_e>=1&&h>=1){
-var _1d=s.createRect({x:_5.l+ht(j+0.5)+_d+_17,y:_4.height-_5.b-(v>_12?vv:_13),width:_e,height:h}).setFill(_b).setStroke(_a);
-run.dyn.fill=_1d.getFill();
-run.dyn.stroke=_1d.getStroke();
-if(_14){
-var o={element:"column",index:j,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_1d,x:j+0.5,y:v};
-this._connectEvents(_1d,o);
+_6=_e.stroke?_e.stroke:dc.augmentStroke(t.series.stroke,_5);
+_7=_e.fill?_e.fill:dc.augmentFill(t.series.fill,_5);
+for(var j=0;j<_e.data.length;++j){
+var _10=_e.data[j],v=typeof _10=="number"?_10:_10.y,vv=vt(v),_11=vv-_c,h=Math.abs(_11),_12=_5,_13=_7,_14=_6;
+if(typeof _10!="number"){
+if(_10.color){
+_12=new dojo.Color(_10.color);
 }
+if("fill" in _10){
+_13=_10.fill;
+}else{
+if(_10.color){
+_13=dc.augmentFill(t.series.fill,_12);
 }
 }
-run.dirty=false;
+if("stroke" in _10){
+_14=_10.stroke;
+}else{
+if(_10.color){
+_14=dc.augmentStroke(t.series.stroke,_12);
+}
+}
+}
+if(_9>=1&&h>=1){
+var _15=s.createRect({x:_3.l+ht(j+0.5)+_8+_f,y:_2.height-_3.b-(v>_b?vv:_c),width:_9,height:h}).setFill(_13).setStroke(_14);
+_e.dyn.fill=_15.getFill();
+_e.dyn.stroke=_15.getStroke();
+if(_d){
+var o={element:"column",index:j,run:_e,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_15,x:j+0.5,y:v};
+this._connectEvents(_15,o);
+}
+if(this.animate){
+this._animateColumn(_15,_2.height-_3.b-_c,h);
+}
+}
+}
+_e.dirty=false;
 }
 this.dirty=false;
 return this;
diff --git a/dojox/charting/plot2d/Columns.js b/dojox/charting/plot2d/Columns.js
index 4374a8b..b68e9ed 100644
--- a/dojox/charting/plot2d/Columns.js
+++ b/dojox/charting/plot2d/Columns.js
@@ -10,38 +10,40 @@ 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.gfx.fx");
 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,_4=df.lambda("item.purgeGroup()");
-dojo.declare("dojox.charting.plot2d.Columns",dojox.charting.plot2d.Base,{defaultParams:{hAxis:"x",vAxis:"y",gap:0,shadows:null},optionalParams:{minBarSize:1,maxBarSize:1},constructor:function(_5,_6){
+var df=dojox.lang.functional,du=dojox.lang.utils,dc=dojox.charting.plot2d.common,_1=df.lambda("item.purgeGroup()");
+dojo.declare("dojox.charting.plot2d.Columns",dojox.charting.plot2d.Base,{defaultParams:{hAxis:"x",vAxis:"y",gap:0,shadows:null,animate:null},optionalParams:{minBarSize:1,maxBarSize:1},constructor:function(_2,_3){
 this.opt=dojo.clone(this.defaultParams);
-du.updateWithObject(this.opt,_6);
-du.updateWithPattern(this.opt,_6,this.optionalParams);
+du.updateWithObject(this.opt,_3);
+du.updateWithPattern(this.opt,_3,this.optionalParams);
 this.series=[];
 this.hAxis=this.opt.hAxis;
 this.vAxis=this.opt.vAxis;
-},calculateAxes:function(_7){
-var _8=dc.collectSimpleStats(this.series);
-_8.hmin-=0.5;
-_8.hmax+=0.5;
-this._calc(_7,_8);
+this.animate=this.opt.animate;
+},calculateAxes:function(_4){
+var _5=dc.collectSimpleStats(this.series);
+_5.hmin-=0.5;
+_5.hmax+=0.5;
+this._calc(_4,_5);
 return this;
-},render:function(_9,_a){
+},render:function(_6,_7){
 this.dirty=this.isDirty();
 if(this.dirty){
-dojo.forEach(this.series,_4);
+dojo.forEach(this.series,_1);
 this.cleanGroup();
 var s=this.group;
-df.forEachRev(this.series,function(_c){
-_c.cleanGroup(s);
+df.forEachRev(this.series,function(_8){
+_8.cleanGroup(s);
 });
 }
-var t=this.chart.theme,_e,_f,_10,f,gap,_13,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_16=Math.max(0,this._vScaler.bounds.lower),_17=vt(_16),_18=this.events();
+var t=this.chart.theme,_9,_a,_b,f,_c,_d,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_e=Math.max(0,this._vScaler.bounds.lower),_f=vt(_e),_10=this.events();
 f=dc.calculateBarSize(this._hScaler.bounds.scale,this.opt);
-gap=f.gap;
-_13=f.size;
+_c=f.gap;
+_d=f.size;
 this.resetEvents();
 for(var i=this.series.length-1;i>=0;--i){
 var run=this.series[i];
@@ -51,19 +53,41 @@ continue;
 run.cleanGroup();
 var s=run.group;
 if(!run.fill||!run.stroke){
-_e=run.dyn.color=new dojo.Color(t.next("color"));
+_9=run.dyn.color=new dojo.Color(t.next("color"));
 }
-_f=run.stroke?run.stroke:dc.augmentStroke(t.series.stroke,_e);
-_10=run.fill?run.fill:dc.augmentFill(t.series.fill,_e);
+_a=run.stroke?run.stroke:dc.augmentStroke(t.series.stroke,_9);
+_b=run.fill?run.fill:dc.augmentFill(t.series.fill,_9);
 for(var j=0;j<run.data.length;++j){
-var v=run.data[j],vv=vt(v),_1e=vv-_17,h=Math.abs(_1e);
-if(_13>=1&&h>=1){
-var _20={x:_a.l+ht(j+0.5)+gap,y:_9.height-_a.b-(v>_16?vv:_17),width:_13,height:h},_21=s.createRect(_20).setFill(_10).setStroke(_f);
-run.dyn.fill=_21.getFill();
-run.dyn.stroke=_21.getStroke();
-if(_18){
-var o={element:"column",index:j,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_21,x:j+0.5,y:v};
-this._connectEvents(_21,o);
+var _11=run.data[j],v=typeof _11=="number"?_11:_11.y,vv=vt(v),_12=vv-_f,h=Math.abs(_12),_13=_9,_14=_b,_15=_a;
+if(typeof _11!="number"){
+if(_11.color){
+_13=new dojo.Color(_11.color);
+}
+if("fill" in _11){
+_14=_11.fill;
+}else{
+if(_11.color){
+_14=dc.augmentFill(t.series.fill,_13);
+}
+}
+if("stroke" in _11){
+_15=_11.stroke;
+}else{
+if(_11.color){
+_15=dc.augmentStroke(t.series.stroke,_13);
+}
+}
+}
+if(_d>=1&&h>=1){
+var _16=s.createRect({x:_7.l+ht(j+0.5)+_c,y:_6.height-_7.b-(v>_e?vv:_f),width:_d,height:h}).setFill(_14).setStroke(_15);
+run.dyn.fill=_16.getFill();
+run.dyn.stroke=_16.getStroke();
+if(_10){
+var o={element:"column",index:j,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_16,x:j+0.5,y:v};
+this._connectEvents(_16,o);
+}
+if(this.animate){
+this._animateColumn(_16,_6.height-_7.b-_f,h);
 }
 }
 }
@@ -71,6 +95,8 @@ run.dirty=false;
 }
 this.dirty=false;
 return this;
+},_animateColumn:function(_17,_18,_19){
+dojox.gfx.fx.animateTransform(dojo.delegate({shape:_17,duration:1200,transform:[{name:"translate",start:[0,_18-(_18/_19)],end:[0,0]},{name:"scale",start:[1,1/_19],end:[1,1]},{name:"original"}]},this.animate)).play();
 }});
 })();
 }
diff --git a/dojox/charting/plot2d/Default.js b/dojox/charting/plot2d/Default.js
index a8ed52f..7ba5628 100644
--- a/dojox/charting/plot2d/Default.js
+++ b/dojox/charting/plot2d/Default.js
@@ -14,134 +14,134 @@ 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,_4=df.lambda("item.purgeGroup()");
-dojo.declare("dojox.charting.plot2d.Default",dojox.charting.plot2d.Base,{defaultParams:{hAxis:"x",vAxis:"y",lines:true,areas:false,markers:false,shadows:0,tension:0},optionalParams:{},constructor:function(_5,_6){
+var df=dojox.lang.functional,du=dojox.lang.utils,dc=dojox.charting.plot2d.common,_1=df.lambda("item.purgeGroup()");
+dojo.declare("dojox.charting.plot2d.Default",dojox.charting.plot2d.Base,{defaultParams:{hAxis:"x",vAxis:"y",lines:true,areas:false,markers:false,shadows:0,tension:0},optionalParams:{},constructor:function(_2,_3){
 this.opt=dojo.clone(this.defaultParams);
-du.updateWithObject(this.opt,_6);
+du.updateWithObject(this.opt,_3);
 this.series=[];
 this.hAxis=this.opt.hAxis;
 this.vAxis=this.opt.vAxis;
-},calculateAxes:function(_7){
-this._calc(_7,dc.collectSimpleStats(this.series));
+},calculateAxes:function(_4){
+this._calc(_4,dc.collectSimpleStats(this.series));
 return this;
-},render:function(_8,_9){
+},render:function(_5,_6){
 this.dirty=this.isDirty();
 if(this.dirty){
-dojo.forEach(this.series,_4);
+dojo.forEach(this.series,_1);
 this.cleanGroup();
 var s=this.group;
-df.forEachRev(this.series,function(_b){
-_b.cleanGroup(s);
+df.forEachRev(this.series,function(_7){
+_7.cleanGroup(s);
 });
 }
-var t=this.chart.theme,_d,_e,_f,_10,_11=this.events();
+var t=this.chart.theme,_8,_9,_a,_b,_c=this.events();
 this.resetEvents();
 for(var i=this.series.length-1;i>=0;--i){
-var run=this.series[i];
-if(!this.dirty&&!run.dirty){
+var _d=this.series[i];
+if(!this.dirty&&!_d.dirty){
 continue;
 }
-run.cleanGroup();
-if(!run.data.length){
-run.dirty=false;
+_d.cleanGroup();
+if(!_d.data.length){
+_d.dirty=false;
 continue;
 }
-var s=run.group,_14,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler);
-if(typeof run.data[0]=="number"){
-_14=dojo.map(run.data,function(v,i){
-return {x:ht(i+1)+_9.l,y:_8.height-_9.b-vt(v)};
+var s=_d.group,_e,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler);
+if(typeof _d.data[0]=="number"){
+_e=dojo.map(_d.data,function(v,i){
+return {x:ht(i+1)+_6.l,y:_5.height-_6.b-vt(v)};
 },this);
 }else{
-_14=dojo.map(run.data,function(v,i){
-return {x:ht(v.x)+_9.l,y:_8.height-_9.b-vt(v.y)};
+_e=dojo.map(_d.data,function(v,i){
+return {x:ht(v.x)+_6.l,y:_5.height-_6.b-vt(v.y)};
 },this);
 }
-if(!run.fill||!run.stroke){
-_f=run.dyn.color=new dojo.Color(t.next("color"));
+if(!_d.fill||!_d.stroke){
+_a=_d.dyn.color=new dojo.Color(t.next("color"));
 }
-var _1b=this.opt.tension?dc.curve(_14,this.opt.tension):"";
+var _f=this.opt.tension?dc.curve(_e,this.opt.tension):"";
 if(this.opt.areas){
-var _1c=run.fill?run.fill:dc.augmentFill(t.series.fill,_f);
-var _1d=dojo.clone(_14);
+var _10=_d.fill?_d.fill:dc.augmentFill(t.series.fill,_a);
+var _11=dojo.clone(_e);
 if(this.opt.tension){
-var _1e="L"+_1d[_1d.length-1].x+","+(_8.height-_9.b)+" L"+_1d[0].x+","+(_8.height-_9.b)+" L"+_1d[0].x+","+_1d[0].y;
-run.dyn.fill=s.createPath(_1b+" "+_1e).setFill(_1c).getFill();
+var _12="L"+_11[_11.length-1].x+","+(_5.height-_6.b)+" L"+_11[0].x+","+(_5.height-_6.b)+" L"+_11[0].x+","+_11[0].y;
+_d.dyn.fill=s.createPath(_f+" "+_12).setFill(_10).getFill();
 }else{
-_1d.push({x:_14[_14.length-1].x,y:_8.height-_9.b});
-_1d.push({x:_14[0].x,y:_8.height-_9.b});
-_1d.push(_14[0]);
-run.dyn.fill=s.createPolyline(_1d).setFill(_1c).getFill();
+_11.push({x:_e[_e.length-1].x,y:_5.height-_6.b});
+_11.push({x:_e[0].x,y:_5.height-_6.b});
+_11.push(_e[0]);
+_d.dyn.fill=s.createPolyline(_11).setFill(_10).getFill();
 }
 }
 if(this.opt.lines||this.opt.markers){
-_d=run.stroke?dc.makeStroke(run.stroke):dc.augmentStroke(t.series.stroke,_f);
-if(run.outline||t.series.outline){
-_e=dc.makeStroke(run.outline?run.outline:t.series.outline);
-_e.width=2*_e.width+_d.width;
+_8=_d.dyn.stroke=_d.stroke?dc.makeStroke(_d.stroke):dc.augmentStroke(t.series.stroke,_a);
+if(_d.outline||t.series.outline){
+_9=_d.dyn.outline=dc.makeStroke(_d.outline?_d.outline:t.series.outline);
+_9.width=2*_9.width+_8.width;
 }
 }
 if(this.opt.markers){
-_10=run.dyn.marker=run.marker?run.marker:t.next("marker");
+_b=_d.dyn.marker=_d.marker?_d.marker:t.next("marker");
 }
-var _1f=null,_20=null,_21=null;
-if(this.opt.shadows&&_d){
-var sh=this.opt.shadows,_23=new dojo.Color([0,0,0,0.3]),_24=dojo.map(_14,function(c){
+var _13=null,_14=null,_15=null;
+if(this.opt.shadows&&_8){
+var sh=this.opt.shadows,_16=new dojo.Color([0,0,0,0.3]),_17=dojo.map(_e,function(c){
 return {x:c.x+sh.dx,y:c.y+sh.dy};
-}),_26=dojo.clone(_e?_e:_d);
-_26.color=_23;
-_26.width+=sh.dw?sh.dw:0;
+}),_18=dojo.clone(_9?_9:_8);
+_18.color=_16;
+_18.width+=sh.dw?sh.dw:0;
 if(this.opt.lines){
 if(this.opt.tension){
-run.dyn.shadow=s.createPath(dc.curve(_24,this.opt.tension)).setStroke(_26).getStroke();
+_d.dyn.shadow=s.createPath(dc.curve(_17,this.opt.tension)).setStroke(_18).getStroke();
 }else{
-run.dyn.shadow=s.createPolyline(_24).setStroke(_26).getStroke();
+_d.dyn.shadow=s.createPolyline(_17).setStroke(_18).getStroke();
 }
 }
 if(this.opt.markers){
-_21=dojo.map(_24,function(c){
-return s.createPath("M"+c.x+" "+c.y+" "+_10).setStroke(_26).setFill(_23);
+_15=dojo.map(_17,function(c){
+return s.createPath("M"+c.x+" "+c.y+" "+_b).setStroke(_18).setFill(_16);
 },this);
 }
 }
 if(this.opt.lines){
-if(_e){
+if(_9){
 if(this.opt.tension){
-run.dyn.outline=s.createPath(_1b).setStroke(_e).getStroke();
+_d.dyn.outline=s.createPath(_f).setStroke(_9).getStroke();
 }else{
-run.dyn.outline=s.createPolyline(_14).setStroke(_e).getStroke();
+_d.dyn.outline=s.createPolyline(_e).setStroke(_9).getStroke();
 }
 }
 if(this.opt.tension){
-run.dyn.stroke=s.createPath(_1b).setStroke(_d).getStroke();
+_d.dyn.stroke=s.createPath(_f).setStroke(_8).getStroke();
 }else{
-run.dyn.stroke=s.createPolyline(_14).setStroke(_d).getStroke();
+_d.dyn.stroke=s.createPolyline(_e).setStroke(_8).getStroke();
 }
 }
 if(this.opt.markers){
-_1f=new Array(_14.length);
-_20=new Array(_14.length);
-dojo.forEach(_14,function(c,i){
-var _2a="M"+c.x+" "+c.y+" "+_10;
-if(_e){
-_20[i]=s.createPath(_2a).setStroke(_e);
-}
-_1f[i]=s.createPath(_2a).setStroke(_d).setFill(_d.color);
+_13=new Array(_e.length);
+_14=new Array(_e.length);
+dojo.forEach(_e,function(c,i){
+var _19="M"+c.x+" "+c.y+" "+_b;
+if(_9){
+_14[i]=s.createPath(_19).setStroke(_9);
+}
+_13[i]=s.createPath(_19).setStroke(_8).setFill(_8.color);
 },this);
-if(_11){
-dojo.forEach(_1f,function(s,i){
-var o={element:"marker",index:i,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:s,outline:_20[i]||null,shadow:_21&&_21[i]||null,cx:_14[i].x,cy:_14[i].y};
-if(typeof run.data[0]=="number"){
+if(_c){
+dojo.forEach(_13,function(s,i){
+var o={element:"marker",index:i,run:_d,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:s,outline:_14[i]||null,shadow:_15&&_15[i]||null,cx:_e[i].x,cy:_e[i].y};
+if(typeof _d.data[0]=="number"){
 o.x=i+1;
-o.y=run.data[i];
+o.y=_d.data[i];
 }else{
-o.x=run.data[i].x;
-o.y=run.data[i].y;
+o.x=_d.data[i].x;
+o.y=_d.data[i].y;
 }
 this._connectEvents(s,o);
 },this);
 }
 }
-run.dirty=false;
+_d.dirty=false;
 }
 this.dirty=false;
 return this;
diff --git a/dojox/charting/plot2d/Grid.js b/dojox/charting/plot2d/Grid.js
index 767ccfc..f905407 100644
--- a/dojox/charting/plot2d/Grid.js
+++ b/dojox/charting/plot2d/Grid.js
@@ -13,9 +13,9 @@ 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",vAxis:"y",hMajorLines:true,hMinorLines:false,vMajorLines:true,vMinorLines:false,hStripes:"none",vStripes:"none"},optionalParams:{},constructor:function(_2,_3){
+dojo.declare("dojox.charting.plot2d.Grid",dojox.charting.Element,{defaultParams:{hAxis:"x",vAxis:"y",hMajorLines:true,hMinorLines:false,vMajorLines:true,vMinorLines:false,hStripes:"none",vStripes:"none"},optionalParams:{},constructor:function(_1,_2){
 this.opt=dojo.clone(this.defaultParams);
-du.updateWithObject(this.opt,_3);
+du.updateWithObject(this.opt,_2);
 this.hAxis=this.opt.hAxis;
 this.vAxis=this.opt.vAxis;
 this.dirty=true;
@@ -24,20 +24,20 @@ this._hAxis=null;
 this._vAxis=null;
 this.dirty=true;
 return this;
-},setAxis:function(_4){
-if(_4){
-this[_4.vertical?"_vAxis":"_hAxis"]=_4;
+},setAxis:function(_3){
+if(_3){
+this[_3.vertical?"_vAxis":"_hAxis"]=_3;
 }
 return this;
-},addSeries:function(_5){
+},addSeries:function(_4){
 return this;
-},calculateAxes:function(_6){
+},calculateAxes:function(_5){
 return this;
 },isDirty:function(){
 return this.dirty||this._hAxis&&this._hAxis.dirty||this._vAxis&&this._vAxis.dirty;
 },getRequiredColors:function(){
 return 0;
-},render:function(_7,_8){
+},render:function(_6,_7){
 this.dirty=this.isDirty();
 if(!this.dirty){
 return this;
@@ -45,34 +45,34 @@ return this;
 this.cleanGroup();
 var s=this.group,ta=this.chart.theme.axis;
 try{
-var _b=this._vAxis.getScaler(),vt=_b.scaler.getTransformerFromModel(_b),_d=this._vAxis.getTicks();
+var _8=this._vAxis.getScaler(),vt=_8.scaler.getTransformerFromModel(_8),_9=this._vAxis.getTicks();
 if(this.opt.hMinorLines){
-dojo.forEach(_d.minor,function(_e){
-var y=_7.height-_8.b-vt(_e.value);
-s.createLine({x1:_8.l,y1:y,x2:_7.width-_8.r,y2:y}).setStroke(ta.minorTick);
+dojo.forEach(_9.minor,function(_a){
+var y=_6.height-_7.b-vt(_a.value);
+s.createLine({x1:_7.l,y1:y,x2:_6.width-_7.r,y2:y}).setStroke(ta.minorTick);
 });
 }
 if(this.opt.hMajorLines){
-dojo.forEach(_d.major,function(_10){
-var y=_7.height-_8.b-vt(_10.value);
-s.createLine({x1:_8.l,y1:y,x2:_7.width-_8.r,y2:y}).setStroke(ta.majorTick);
+dojo.forEach(_9.major,function(_b){
+var y=_6.height-_7.b-vt(_b.value);
+s.createLine({x1:_7.l,y1:y,x2:_6.width-_7.r,y2:y}).setStroke(ta.majorTick);
 });
 }
 }
 catch(e){
 }
 try{
-var _12=this._hAxis.getScaler(),ht=_12.scaler.getTransformerFromModel(_12),_d=this._hAxis.getTicks();
-if(_d&&this.opt.vMinorLines){
-dojo.forEach(_d.minor,function(_14){
-var x=_8.l+ht(_14.value);
-s.createLine({x1:x,y1:_8.t,x2:x,y2:_7.height-_8.b}).setStroke(ta.minorTick);
+var _c=this._hAxis.getScaler(),ht=_c.scaler.getTransformerFromModel(_c),_9=this._hAxis.getTicks();
+if(_9&&this.opt.vMinorLines){
+dojo.forEach(_9.minor,function(_d){
+var x=_7.l+ht(_d.value);
+s.createLine({x1:x,y1:_7.t,x2:x,y2:_6.height-_7.b}).setStroke(ta.minorTick);
 });
 }
-if(_d&&this.opt.vMajorLines){
-dojo.forEach(_d.major,function(_16){
-var x=_8.l+ht(_16.value);
-s.createLine({x1:x,y1:_8.t,x2:x,y2:_7.height-_8.b}).setStroke(ta.majorTick);
+if(_9&&this.opt.vMajorLines){
+dojo.forEach(_9.major,function(_e){
+var x=_7.l+ht(_e.value);
+s.createLine({x1:x,y1:_7.t,x2:x,y2:_6.height-_7.b}).setStroke(ta.majorTick);
 });
 }
 }
diff --git a/dojox/charting/plot2d/OHLC.js b/dojox/charting/plot2d/OHLC.js
new file mode 100644
index 0000000..49ac45b
--- /dev/null
+++ b/dojox/charting/plot2d/OHLC.js
@@ -0,0 +1,113 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.charting.plot2d.OHLC"]){
+dojo._hasResource["dojox.charting.plot2d.OHLC"]=true;
+dojo.provide("dojox.charting.plot2d.OHLC");
+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,_1=df.lambda("item.purgeGroup()");
+dojo.declare("dojox.charting.plot2d.OHLC",dojox.charting.plot2d.Base,{defaultParams:{hAxis:"x",vAxis:"y",gap:2,shadows:null},optionalParams:{minBarSize:1,maxBarSize:1},constructor:function(_2,_3){
+this.opt=dojo.clone(this.defaultParams);
+du.updateWithObject(this.opt,_3);
+du.updateWithPattern(this.opt,_3,this.optionalParams);
+this.series=[];
+this.hAxis=this.opt.hAxis;
+this.vAxis=this.opt.vAxis;
+},collectStats:function(_4){
+var _5=dojo.clone(dc.defaultStats);
+for(var i=0;i<_4.length;i++){
+var _6=_4[i];
+if(!_6.data.length){
+continue;
+}
+var _7=_5.vmin,_8=_5.vmax;
+if(!("ymin" in _6)||!("ymax" in _6)){
+dojo.forEach(_6.data,function(_9,_a){
+var x=_9.x||_a+1;
+_5.hmin=Math.min(_5.hmin,x);
+_5.hmax=Math.max(_5.hmax,x);
+_5.vmin=Math.min(_5.vmin,_9.open,_9.close,_9.high,_9.low);
+_5.vmax=Math.max(_5.vmax,_9.open,_9.close,_9.high,_9.low);
+});
+}
+if("ymin" in _6){
+_5.vmin=Math.min(_7,_6.ymin);
+}
+if("ymax" in _6){
+_5.vmax=Math.max(_8,_6.ymax);
+}
+}
+return _5;
+},calculateAxes:function(_b){
+var _c=this.collectStats(this.series),t;
+_c.hmin-=0.5;
+_c.hmax+=0.5;
+this._calc(_b,_c);
+return this;
+},render:function(_d,_e){
+this.dirty=this.isDirty();
+if(this.dirty){
+dojo.forEach(this.series,_1);
+this.cleanGroup();
+var s=this.group;
+df.forEachRev(this.series,function(_f){
+_f.cleanGroup(s);
+});
+}
+var t=this.chart.theme,_10,_11,_12,f,gap,_13,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_14=Math.max(0,this._vScaler.bounds.lower),_15=vt(_14),_16=this.events();
+f=dc.calculateBarSize(this._hScaler.bounds.scale,this.opt);
+gap=f.gap;
+_13=f.size;
+this.resetEvents();
+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){
+_10=run.dyn.color=new dojo.Color(t.next("color"));
+}
+_11=run.stroke?run.stroke:dc.augmentStroke(t.series.stroke,_10);
+_12=run.fill?run.fill:dc.augmentFill(t.series.fill,_10);
+for(var j=0;j<run.data.length;++j){
+var v=run.data[j];
+var x=ht(v.x||(j+0.5))+_e.l+gap,y=_d.height-_e.b,_17=vt(v.open),_18=vt(v.close),_19=vt(v.high),low=vt(v.low);
+if(low>_19){
+var tmp=_19;
+_19=low;
+low=tmp;
+}
+if(_13>=1){
+var hl={x1:_13/2,x2:_13/2,y1:y-_19,y2:y-low},op={x1:0,x2:((_13/2)+((_11.width||1)/2)),y1:y-_17,y2:y-_17},cl={x1:((_13/2)-((_11.width||1)/2)),x2:_13,y1:y-_18,y2:y-_18};
+shape=s.createGroup();
+shape.setTransform({dx:x,dy:0});
+var _1a=shape.createGroup();
+_1a.createLine(hl).setStroke(_11);
+_1a.createLine(op).setStroke(_11);
+_1a.createLine(cl).setStroke(_11);
+run.dyn.fill=_12;
+run.dyn.stroke=_11;
+if(_16){
+var o={element:"candlestick",index:j,run:run,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_1a,x:x,y:y-Math.max(_17,_18),cx:_13/2,cy:(y-Math.max(_17,_18))+(Math.max(_17>_18?_17-_18:_18-_17,1)/2),width:_13,height:Math.max(_17>_18?_17-_18:_18-_17,1),data:v};
+this._connectEvents(shape,o);
+}
+}
+}
+run.dirty=false;
+}
+this.dirty=false;
+return this;
+}});
+})();
+}
diff --git a/dojox/charting/plot2d/Pie.js b/dojox/charting/plot2d/Pie.js
index a77f516..f859134 100644
--- a/dojox/charting/plot2d/Pie.js
+++ b/dojox/charting/plot2d/Pie.js
@@ -15,10 +15,10 @@ 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",htmlLabels:true},optionalParams:{font:"",fontColor:"",radius:0},constructor:function(_6,_7){
+dojo.declare("dojox.charting.plot2d.Pie",dojox.charting.Element,{defaultParams:{labels:true,ticks:false,fixed:true,precision:1,labelOffset:20,labelStyle:"default",htmlLabels:true},optionalParams:{font:"",fontColor:"",radius:0},constructor:function(_1,_2){
 this.opt=dojo.clone(this.defaultParams);
-du.updateWithObject(this.opt,_7);
-du.updateWithPattern(this.opt,_7,this.optionalParams);
+du.updateWithObject(this.opt,_2);
+du.updateWithPattern(this.opt,_2,this.optionalParams);
 this.run=null;
 this.dyn=[];
 },destroy:function(){
@@ -29,19 +29,19 @@ this.dirty=true;
 this.dyn=[];
 this.run=null;
 return this;
-},setAxis:function(_8){
+},setAxis:function(_3){
 return this;
-},addSeries:function(_9){
-this.run=_9;
+},addSeries:function(_4){
+this.run=_4;
 return this;
-},calculateAxes:function(_a){
+},calculateAxes:function(_5){
 return this;
 },getRequiredColors:function(){
 return this.run?this.run.data.length:0;
 },plotEvent:function(o){
-},connect:function(_c,_d){
+},connect:function(_6,_7){
 this.dirty=true;
-return dojo.connect(this,"plotEvent",_c,_d);
+return dojo.connect(this,"plotEvent",_6,_7);
 },events:function(){
 var ls=this.plotEvent._listeners;
 if(!ls||!ls.length){
@@ -55,53 +55,53 @@ return true;
 return false;
 },resetEvents:function(){
 this.plotEvent({type:"onplotreset",plot:this});
-},_connectEvents:function(_10,o){
-_10.connect("onmouseover",this,function(e){
+},_connectEvents:function(_8,o){
+_8.connect("onmouseover",this,function(e){
 o.type="onmouseover";
 o.event=e;
 this.plotEvent(o);
 });
-_10.connect("onmouseout",this,function(e){
+_8.connect("onmouseout",this,function(e){
 o.type="onmouseout";
 o.event=e;
 this.plotEvent(o);
 });
-_10.connect("onclick",this,function(e){
+_8.connect("onclick",this,function(e){
 o.type="onclick";
 o.event=e;
 this.plotEvent(o);
 });
-},render:function(dim,_16){
+},render:function(_9,_a){
 if(!this.dirty){
 return this;
 }
 this.dirty=false;
 this.cleanGroup();
-var s=this.group,_18,t=this.chart.theme;
+var s=this.group,_b,t=this.chart.theme;
 this.resetEvents();
 if(!this.run||!this.run.data.length){
 return this;
 }
-var rx=(dim.width-_16.l-_16.r)/2,ry=(dim.height-_16.t-_16.b)/2,r=Math.min(rx,ry),_1d="font" in this.opt?this.opt.font:t.axis.font,_1e=_1d?g.normalizedLength(g.splitFontString(_1d).size):0,_1f="fontColor" in this.opt?this.opt.fontColor:t.axis.fontColor,_20=0,_21,_22,_23,_24,_25,_26,run=this.run.data,_28=this.events();
+var rx=(_9.width-_a.l-_a.r)/2,ry=(_9.height-_a.t-_a.b)/2,r=Math.min(rx,ry),_c="font" in this.opt?this.opt.font:t.axis.font,_d=_c?g.normalizedLength(g.splitFontString(_c).size):0,_e="fontColor" in this.opt?this.opt.fontColor:t.axis.fontColor,_f=0,_10,_11,_12,_13,_14,_15,run=this.run.data,_16=this.events();
 if(typeof run[0]=="number"){
-_22=df.map(run,"Math.max(x, 0)");
-if(df.every(_22,"<= 0")){
+_11=df.map(run,"Math.max(x, 0)");
+if(df.every(_11,"<= 0")){
 return this;
 }
-_23=df.map(_22,"/this",df.foldl(_22,"+",0));
+_12=df.map(_11,"/this",df.foldl(_11,"+",0));
 if(this.opt.labels){
-_24=dojo.map(_23,function(x){
+_13=dojo.map(_12,function(x){
 return x>0?this._getLabel(x*100)+"%":"";
 },this);
 }
 }else{
-_22=df.map(run,"Math.max(x.y, 0)");
-if(df.every(_22,"<= 0")){
+_11=df.map(run,"Math.max(x.y, 0)");
+if(df.every(_11,"<= 0")){
 return this;
 }
-_23=df.map(_22,"/this",df.foldl(_22,"+",0));
+_12=df.map(_11,"/this",df.foldl(_11,"+",0));
 if(this.opt.labels){
-_24=dojo.map(_23,function(x,i){
+_13=dojo.map(_12,function(x,i){
 if(x<=0){
 return "";
 }
@@ -111,97 +111,97 @@ return "text" in v?v.text:this._getLabel(x*100)+"%";
 }
 }
 if(this.opt.labels){
-_25=df.foldl1(df.map(_24,function(_2d){
-return dojox.gfx._base._getTextBox(_2d,{font:_1d}).w;
+_14=df.foldl1(df.map(_13,function(_17){
+return dojox.gfx._base._getTextBox(_17,{font:_c}).w;
 },this),"Math.max(a, b)")/2;
 if(this.opt.labelOffset<0){
-r=Math.min(rx-2*_25,ry-_1e)+this.opt.labelOffset;
+r=Math.min(rx-2*_14,ry-_d)+this.opt.labelOffset;
 }
-_26=r-this.opt.labelOffset;
+_15=r-this.opt.labelOffset;
 }
 if("radius" in this.opt){
 r=this.opt.radius;
-_26=r-this.opt.labelOffset;
+_15=r-this.opt.labelOffset;
 }
-var _2e={cx:_16.l+rx,cy:_16.t+ry,r:r};
+var _18={cx:_a.l+rx,cy:_a.t+ry,r:r};
 this.dyn=[];
-dojo.some(_23,function(_2f,i){
-if(_2f<=0){
+dojo.some(_12,function(_19,i){
+if(_19<=0){
 return false;
 }
 var v=run[i];
-if(_2f>=1){
-var _32,_33,_34;
+if(_19>=1){
+var _1a,_1b,_1c;
 if(typeof v=="object"){
-_32="color" in v?v.color:new dojo.Color(t.next("color"));
-_33="fill" in v?v.fill:dc.augmentFill(t.series.fill,_32);
-_34="stroke" in v?v.stroke:dc.augmentStroke(t.series.stroke,_32);
+_1a="color" in v?v.color:new dojo.Color(t.next("color"));
+_1b="fill" in v?v.fill:dc.augmentFill(t.series.fill,_1a);
+_1c="stroke" in v?v.stroke:dc.augmentStroke(t.series.stroke,_1a);
 }else{
-_32=new dojo.Color(t.next("color"));
-_33=dc.augmentFill(t.series.fill,_32);
-_34=dc.augmentStroke(t.series.stroke,_32);
+_1a=new dojo.Color(t.next("color"));
+_1b=dc.augmentFill(t.series.fill,_1a);
+_1c=dc.augmentStroke(t.series.stroke,_1a);
 }
-var _35=s.createCircle(_2e).setFill(_33).setStroke(_34);
-this.dyn.push({color:_32,fill:_33,stroke:_34});
-if(_28){
-var o={element:"slice",index:i,run:this.run,plot:this,shape:_35,x:i,y:typeof v=="number"?v:v.y,cx:_2e.cx,cy:_2e.cy,cr:r};
-this._connectEvents(_35,o);
+var _1d=s.createCircle(_18).setFill(_1b).setStroke(_1c);
+this.dyn.push({color:_1a,fill:_1b,stroke:_1c});
+if(_16){
+var o={element:"slice",index:i,run:this.run,plot:this,shape:_1d,x:i,y:typeof v=="number"?v:v.y,cx:_18.cx,cy:_18.cy,cr:r};
+this._connectEvents(_1d,o);
 }
 return true;
 }
-var end=_20+_2f*2*Math.PI;
-if(i+1==_23.length){
+var end=_f+_19*2*Math.PI;
+if(i+1==_12.length){
 end=2*Math.PI;
 }
-var _38=end-_20,x1=_2e.cx+r*Math.cos(_20),y1=_2e.cy+r*Math.sin(_20),x2=_2e.cx+r*Math.cos(end),y2=_2e.cy+r*Math.sin(end);
-var _32,_33,_34;
+var _1e=end-_f,x1=_18.cx+r*Math.cos(_f),y1=_18.cy+r*Math.sin(_f),x2=_18.cx+r*Math.cos(end),y2=_18.cy+r*Math.sin(end);
+var _1a,_1b,_1c;
 if(typeof v=="object"){
-_32="color" in v?v.color:new dojo.Color(t.next("color"));
-_33="fill" in v?v.fill:dc.augmentFill(t.series.fill,_32);
-_34="stroke" in v?v.stroke:dc.augmentStroke(t.series.stroke,_32);
+_1a="color" in v?v.color:new dojo.Color(t.next("color"));
+_1b="fill" in v?v.fill:dc.augmentFill(t.series.fill,_1a);
+_1c="stroke" in v?v.stroke:dc.augmentStroke(t.series.stroke,_1a);
 }else{
-_32=new dojo.Color(t.next("color"));
-_33=dc.augmentFill(t.series.fill,_32);
-_34=dc.augmentStroke(t.series.stroke,_32);
+_1a=new dojo.Color(t.next("color"));
+_1b=dc.augmentFill(t.series.fill,_1a);
+_1c=dc.augmentStroke(t.series.stroke,_1a);
 }
-var _35=s.createPath({}).moveTo(_2e.cx,_2e.cy).lineTo(x1,y1).arcTo(r,r,0,_38>Math.PI,true,x2,y2).lineTo(_2e.cx,_2e.cy).closePath().setFill(_33).setStroke(_34);
-this.dyn.push({color:_32,fill:_33,stroke:_34});
-if(_28){
-var o={element:"slice",index:i,run:this.run,plot:this,shape:_35,x:i,y:typeof v=="number"?v:v.y,cx:_2e.cx,cy:_2e.cy,cr:r};
-this._connectEvents(_35,o);
+var _1d=s.createPath({}).moveTo(_18.cx,_18.cy).lineTo(x1,y1).arcTo(r,r,0,_1e>Math.PI,true,x2,y2).lineTo(_18.cx,_18.cy).closePath().setFill(_1b).setStroke(_1c);
+this.dyn.push({color:_1a,fill:_1b,stroke:_1c});
+if(_16){
+var o={element:"slice",index:i,run:this.run,plot:this,shape:_1d,x:i,y:typeof v=="number"?v:v.y,cx:_18.cx,cy:_18.cy,cr:r};
+this._connectEvents(_1d,o);
 }
-_20=end;
+_f=end;
 return false;
 },this);
 if(this.opt.labels){
-_20=0;
-dojo.some(_23,function(_3d,i){
-if(_3d<=0){
+_f=0;
+dojo.some(_12,function(_1f,i){
+if(_1f<=0){
 return false;
 }
-if(_3d>=1){
-var v=run[i],_40=da.createText[this.opt.htmlLabels&&dojox.gfx.renderer!="vml"?"html":"gfx"](this.chart,s,_2e.cx,_2e.cy+_1e/2,"middle",_24[i],_1d,(typeof v=="object"&&"fontColor" in v)?v.fontColor:_1f);
+if(_1f>=1){
+var v=run[i],_20=da.createText[this.opt.htmlLabels&&dojox.gfx.renderer!="vml"?"html":"gfx"](this.chart,s,_18.cx,_18.cy+_d/2,"middle",_13[i],_c,(typeof v=="object"&&"fontColor" in v)?v.fontColor:_e);
 if(this.opt.htmlLabels){
-this.htmlElements.push(_40);
+this.htmlElements.push(_20);
 }
 return true;
 }
-var end=_20+_3d*2*Math.PI,v=run[i];
-if(i+1==_23.length){
+var end=_f+_1f*2*Math.PI,v=run[i];
+if(i+1==_12.length){
 end=2*Math.PI;
 }
-var _42=(_20+end)/2,x=_2e.cx+_26*Math.cos(_42),y=_2e.cy+_26*Math.sin(_42)+_1e/2;
-var _40=da.createText[this.opt.htmlLabels&&dojox.gfx.renderer!="vml"?"html":"gfx"](this.chart,s,x,y,"middle",_24[i],_1d,(typeof v=="object"&&"fontColor" in v)?v.fontColor:_1f);
+var _21=(_f+end)/2,x=_18.cx+_15*Math.cos(_21),y=_18.cy+_15*Math.sin(_21)+_d/2;
+var _20=da.createText[this.opt.htmlLabels&&dojox.gfx.renderer!="vml"?"html":"gfx"](this.chart,s,x,y,"middle",_13[i],_c,(typeof v=="object"&&"fontColor" in v)?v.fontColor:_e);
 if(this.opt.htmlLabels){
-this.htmlElements.push(_40);
+this.htmlElements.push(_20);
 }
-_20=end;
+_f=end;
 return false;
 },this);
 }
 return this;
-},_getLabel:function(_45){
-return this.opt.fixed?_45.toFixed(this.opt.precision):_45.toString();
+},_getLabel:function(_22){
+return this.opt.fixed?_22.toFixed(this.opt.precision):_22.toString();
 }});
 })();
 }
diff --git a/dojox/charting/plot2d/Stacked.js b/dojox/charting/plot2d/Stacked.js
index c4e8f71..4f07fe6 100644
--- a/dojox/charting/plot2d/Stacked.js
+++ b/dojox/charting/plot2d/Stacked.js
@@ -14,133 +14,133 @@ 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,_3=df.lambda("item.purgeGroup()");
-dojo.declare("dojox.charting.plot2d.Stacked",dojox.charting.plot2d.Default,{calculateAxes:function(_4){
-var _5=dc.collectStackedStats(this.series);
-this._maxRunLength=_5.hmax;
-this._calc(_4,_5);
+var df=dojox.lang.functional,dc=dojox.charting.plot2d.common,_1=df.lambda("item.purgeGroup()");
+dojo.declare("dojox.charting.plot2d.Stacked",dojox.charting.plot2d.Default,{calculateAxes:function(_2){
+var _3=dc.collectStackedStats(this.series);
+this._maxRunLength=_3.hmax;
+this._calc(_2,_3);
 return this;
-},render:function(_6,_7){
+},render:function(_4,_5){
 if(this._maxRunLength<=0){
 return this;
 }
-var _8=df.repeat(this._maxRunLength,"-> 0",0);
+var _6=df.repeat(this._maxRunLength,"-> 0",0);
 for(var i=0;i<this.series.length;++i){
-var _a=this.series[i];
-for(var j=0;j<_a.data.length;++j){
-var v=_a.data[j];
+var _7=this.series[i];
+for(var j=0;j<_7.data.length;++j){
+var v=_7.data[j];
 if(isNaN(v)){
 v=0;
 }
-_8[j]+=v;
+_6[j]+=v;
 }
 }
 this.dirty=this.isDirty();
 if(this.dirty){
-dojo.forEach(this.series,_3);
+dojo.forEach(this.series,_1);
 this.cleanGroup();
 var s=this.group;
-df.forEachRev(this.series,function(_e){
-_e.cleanGroup(s);
+df.forEachRev(this.series,function(_8){
+_8.cleanGroup(s);
 });
 }
-var t=this.chart.theme,_10,_11,_12,_13,_14=this.events(),ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler);
+var t=this.chart.theme,_9,_a,_b,_c,_d=this.events(),ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler);
 this.resetEvents();
 for(var i=this.series.length-1;i>=0;--i){
-var _a=this.series[i];
-if(!this.dirty&&!_a.dirty){
+var _7=this.series[i];
+if(!this.dirty&&!_7.dirty){
 continue;
 }
-_a.cleanGroup();
-var s=_a.group,_17=dojo.map(_8,function(v,i){
-return {x:ht(i+1)+_7.l,y:_6.height-_7.b-vt(v)};
+_7.cleanGroup();
+var s=_7.group,_e=dojo.map(_6,function(v,i){
+return {x:ht(i+1)+_5.l,y:_4.height-_5.b-vt(v)};
 },this);
-if(!_a.fill||!_a.stroke){
-_12=new dojo.Color(t.next("color"));
+if(!_7.fill||!_7.stroke){
+_b=new dojo.Color(t.next("color"));
 }
-var _1a=this.opt.tension?dc.curve(_17,this.opt.tension):"";
+var _f=this.opt.tension?dc.curve(_e,this.opt.tension):"";
 if(this.opt.areas){
-var _1b=dojo.clone(_17);
-var _1c=_a.fill?_a.fill:dc.augmentFill(t.series.fill,_12);
+var _10=dojo.clone(_e);
+var _11=_7.fill?_7.fill:dc.augmentFill(t.series.fill,_b);
 if(this.opt.tension){
-var p=dc.curve(_1b,this.opt.tension);
-p+=" L"+_17[_17.length-1].x+","+(_6.height-_7.b)+" L"+_17[0].x+","+(_6.height-_7.b)+" L"+_17[0].x+","+_17[0].y;
-_a.dyn.fill=s.createPath(p).setFill(_1c).getFill();
+var p=dc.curve(_10,this.opt.tension);
+p+=" L"+_e[_e.length-1].x+","+(_4.height-_5.b)+" L"+_e[0].x+","+(_4.height-_5.b)+" L"+_e[0].x+","+_e[0].y;
+_7.dyn.fill=s.createPath(p).setFill(_11).getFill();
 }else{
-_1b.push({x:_17[_17.length-1].x,y:_6.height-_7.b});
-_1b.push({x:_17[0].x,y:_6.height-_7.b});
-_1b.push(_17[0]);
-_a.dyn.fill=s.createPolyline(_1b).setFill(_1c).getFill();
+_10.push({x:_e[_e.length-1].x,y:_4.height-_5.b});
+_10.push({x:_e[0].x,y:_4.height-_5.b});
+_10.push(_e[0]);
+_7.dyn.fill=s.createPolyline(_10).setFill(_11).getFill();
 }
 }
 if(this.opt.lines||this.opt.markers){
-_10=_a.stroke?dc.makeStroke(_a.stroke):dc.augmentStroke(t.series.stroke,_12);
-if(_a.outline||t.series.outline){
-_11=dc.makeStroke(_a.outline?_a.outline:t.series.outline);
-_11.width=2*_11.width+_10.width;
+_9=_7.stroke?dc.makeStroke(_7.stroke):dc.augmentStroke(t.series.stroke,_b);
+if(_7.outline||t.series.outline){
+_a=dc.makeStroke(_7.outline?_7.outline:t.series.outline);
+_a.width=2*_a.width+_9.width;
 }
 }
 if(this.opt.markers){
-_13=_a.dyn.marker=_a.marker?_a.marker:t.next("marker");
+_c=_7.dyn.marker=_7.marker?_7.marker:t.next("marker");
 }
-var _1e,_1f,_20;
-if(this.opt.shadows&&_10){
-var sh=this.opt.shadows,_22=new dojo.Color([0,0,0,0.3]),_23=dojo.map(_17,function(c){
+var _12,_13,_14;
+if(this.opt.shadows&&_9){
+var sh=this.opt.shadows,_15=new dojo.Color([0,0,0,0.3]),_16=dojo.map(_e,function(c){
 return {x:c.x+sh.dx,y:c.y+sh.dy};
-}),_25=dojo.clone(_11?_11:_10);
-_25.color=_22;
-_25.width+=sh.dw?sh.dw:0;
+}),_17=dojo.clone(_a?_a:_9);
+_17.color=_15;
+_17.width+=sh.dw?sh.dw:0;
 if(this.opt.lines){
 if(this.opt.tension){
-_a.dyn.shadow=s.createPath(dc.curve(_23,this.opt.tension)).setStroke(_25).getStroke();
+_7.dyn.shadow=s.createPath(dc.curve(_16,this.opt.tension)).setStroke(_17).getStroke();
 }else{
-_a.dyn.shadow=s.createPolyline(_23).setStroke(_25).getStroke();
+_7.dyn.shadow=s.createPolyline(_16).setStroke(_17).getStroke();
 }
 }
 if(this.opt.markers){
-_20=dojo.map(_23,function(c){
-return s.createPath("M"+c.x+" "+c.y+" "+_13).setStroke(_25).setFill(_22);
+_14=dojo.map(_16,function(c){
+return s.createPath("M"+c.x+" "+c.y+" "+_c).setStroke(_17).setFill(_15);
 },this);
 }
 }
 if(this.opt.lines){
-if(_11){
+if(_a){
 if(this.opt.tension){
-_a.dyn.outline=s.createPath(_1a).setStroke(_11).getStroke();
+_7.dyn.outline=s.createPath(_f).setStroke(_a).getStroke();
 }else{
-_a.dyn.outline=s.createPolyline(_17).setStroke(_11).getStroke();
+_7.dyn.outline=s.createPolyline(_e).setStroke(_a).getStroke();
 }
 }
 if(this.opt.tension){
-_a.dyn.stroke=s.createPath(_1a).setStroke(_10).getStroke();
+_7.dyn.stroke=s.createPath(_f).setStroke(_9).getStroke();
 }else{
-_a.dyn.stroke=s.createPolyline(_17).setStroke(_10).getStroke();
+_7.dyn.stroke=s.createPolyline(_e).setStroke(_9).getStroke();
 }
 }
 if(this.opt.markers){
-_1e=new Array(_17.length);
-_1f=new Array(_17.length);
-dojo.forEach(_17,function(c,i){
-var _29="M"+c.x+" "+c.y+" "+_13;
-if(_11){
-_1f[i]=s.createPath(_29).setStroke(_11);
-}
-_1e[i]=s.createPath(_29).setStroke(_10).setFill(_10.color);
+_12=new Array(_e.length);
+_13=new Array(_e.length);
+dojo.forEach(_e,function(c,i){
+var _18="M"+c.x+" "+c.y+" "+_c;
+if(_a){
+_13[i]=s.createPath(_18).setStroke(_a);
+}
+_12[i]=s.createPath(_18).setStroke(_9).setFill(_9.color);
 },this);
-if(_14){
-dojo.forEach(_1e,function(s,i){
-var o={element:"marker",index:i,run:_a,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:s,outline:_1f[i]||null,shadow:_20&&_20[i]||null,cx:_17[i].x,cy:_17[i].y,x:i+1,y:_a.data[i]};
+if(_d){
+dojo.forEach(_12,function(s,i){
+var o={element:"marker",index:i,run:_7,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:s,outline:_13[i]||null,shadow:_14&&_14[i]||null,cx:_e[i].x,cy:_e[i].y,x:i+1,y:_7.data[i]};
 this._connectEvents(s,o);
 },this);
 }
 }
-_a.dirty=false;
-for(var j=0;j<_a.data.length;++j){
-var v=_a.data[j];
+_7.dirty=false;
+for(var j=0;j<_7.data.length;++j){
+var v=_7.data[j];
 if(isNaN(v)){
 v=0;
 }
-_8[j]-=v;
+_6[j]-=v;
 }
 }
 this.dirty=false;
diff --git a/dojox/charting/plot2d/StackedBars.js b/dojox/charting/plot2d/StackedBars.js
index 0cb7f9b..8422f33 100644
--- a/dojox/charting/plot2d/StackedBars.js
+++ b/dojox/charting/plot2d/StackedBars.js
@@ -13,76 +13,98 @@ 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,_3=df.lambda("item.purgeGroup()");
-dojo.declare("dojox.charting.plot2d.StackedBars",dojox.charting.plot2d.Bars,{calculateAxes:function(_4){
-var _5=dc.collectStackedStats(this.series),t;
-this._maxRunLength=_5.hmax;
-_5.hmin-=0.5;
-_5.hmax+=0.5;
-t=_5.hmin,_5.hmin=_5.vmin,_5.vmin=t;
-t=_5.hmax,_5.hmax=_5.vmax,_5.vmax=t;
-this._calc(_4,_5);
+var df=dojox.lang.functional,dc=dojox.charting.plot2d.common,_1=df.lambda("item.purgeGroup()");
+dojo.declare("dojox.charting.plot2d.StackedBars",dojox.charting.plot2d.Bars,{calculateAxes:function(_2){
+var _3=dc.collectStackedStats(this.series),t;
+this._maxRunLength=_3.hmax;
+_3.hmin-=0.5;
+_3.hmax+=0.5;
+t=_3.hmin,_3.hmin=_3.vmin,_3.vmin=t;
+t=_3.hmax,_3.hmax=_3.vmax,_3.vmax=t;
+this._calc(_2,_3);
 return this;
-},render:function(_7,_8){
+},render:function(_4,_5){
 if(this._maxRunLength<=0){
 return this;
 }
-var _9=df.repeat(this._maxRunLength,"-> 0",0);
+var _6=df.repeat(this._maxRunLength,"-> 0",0);
 for(var i=0;i<this.series.length;++i){
-var _b=this.series[i];
-for(var j=0;j<_b.data.length;++j){
-var v=_b.data[j];
+var _7=this.series[i];
+for(var j=0;j<_7.data.length;++j){
+var _8=_7.data[j],v=typeof _8=="number"?_8:_8.y;
 if(isNaN(v)){
 v=0;
 }
-_9[j]+=v;
+_6[j]+=v;
 }
 }
 this.dirty=this.isDirty();
 if(this.dirty){
-dojo.forEach(this.series,_3);
+dojo.forEach(this.series,_1);
 this.cleanGroup();
 var s=this.group;
-df.forEachRev(this.series,function(_f){
-_f.cleanGroup(s);
+df.forEachRev(this.series,function(_9){
+_9.cleanGroup(s);
 });
 }
-var t=this.chart.theme,_11,_12,_13,f,gap,_16,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_19=this.events();
+var t=this.chart.theme,_a,_b,_c,f,_d,_e,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_f=this.events();
 f=dc.calculateBarSize(this._vScaler.bounds.scale,this.opt);
-gap=f.gap;
-_16=f.size;
+_d=f.gap;
+_e=f.size;
 this.resetEvents();
 for(var i=this.series.length-1;i>=0;--i){
-var _b=this.series[i];
-if(!this.dirty&&!_b.dirty){
+var _7=this.series[i];
+if(!this.dirty&&!_7.dirty){
 continue;
 }
-_b.cleanGroup();
-var s=_b.group;
-if(!_b.fill||!_b.stroke){
-_11=_b.dyn.color=new dojo.Color(t.next("color"));
+_7.cleanGroup();
+var s=_7.group;
+if(!_7.fill||!_7.stroke){
+_a=_7.dyn.color=new dojo.Color(t.next("color"));
 }
-_12=_b.stroke?_b.stroke:dc.augmentStroke(t.series.stroke,_11);
-_13=_b.fill?_b.fill:dc.augmentFill(t.series.fill,_11);
-for(var j=0;j<_9.length;++j){
-var v=_9[j],_1a=ht(v);
-if(_1a>=1&&_16>=1){
-var _1b=s.createRect({x:_8.l,y:_7.height-_8.b-vt(j+1.5)+gap,width:_1a,height:_16}).setFill(_13).setStroke(_12);
-_b.dyn.fill=_1b.getFill();
-_b.dyn.stroke=_1b.getStroke();
-if(_19){
-var o={element:"bar",index:j,run:_b,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_1b,x:v,y:j+1.5};
-this._connectEvents(_1b,o);
+_b=_7.stroke?_7.stroke:dc.augmentStroke(t.series.stroke,_a);
+_c=_7.fill?_7.fill:dc.augmentFill(t.series.fill,_a);
+for(var j=0;j<_6.length;++j){
+var v=_6[j],_10=ht(v),_8=_7.data[j],_11=_a,_12=_c,_13=_b;
+if(typeof _8!="number"){
+if(_8.color){
+_11=new dojo.Color(_8.color);
 }
+if("fill" in _8){
+_12=_8.fill;
+}else{
+if(_8.color){
+_12=dc.augmentFill(t.series.fill,_11);
 }
 }
-_b.dirty=false;
-for(var j=0;j<_b.data.length;++j){
-var v=_b.data[j];
+if("stroke" in _8){
+_13=_8.stroke;
+}else{
+if(_8.color){
+_13=dc.augmentStroke(t.series.stroke,_11);
+}
+}
+}
+if(_10>=1&&_e>=1){
+var _14=s.createRect({x:_5.l,y:_4.height-_5.b-vt(j+1.5)+_d,width:_10,height:_e}).setFill(_12).setStroke(_13);
+_7.dyn.fill=_14.getFill();
+_7.dyn.stroke=_14.getStroke();
+if(_f){
+var o={element:"bar",index:j,run:_7,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_14,x:v,y:j+1.5};
+this._connectEvents(_14,o);
+}
+if(this.animate){
+this._animateBar(_14,_5.l,-_10);
+}
+}
+}
+_7.dirty=false;
+for(var j=0;j<_7.data.length;++j){
+var _8=_7.data[j],v=typeof _8=="number"?_8:_8.y;
 if(isNaN(v)){
 v=0;
 }
-_9[j]-=v;
+_6[j]-=v;
 }
 }
 this.dirty=false;
diff --git a/dojox/charting/plot2d/StackedColumns.js b/dojox/charting/plot2d/StackedColumns.js
index bad43b0..edee16c 100644
--- a/dojox/charting/plot2d/StackedColumns.js
+++ b/dojox/charting/plot2d/StackedColumns.js
@@ -13,74 +13,96 @@ 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,_3=df.lambda("item.purgeGroup()");
-dojo.declare("dojox.charting.plot2d.StackedColumns",dojox.charting.plot2d.Columns,{calculateAxes:function(_4){
-var _5=dc.collectStackedStats(this.series);
-this._maxRunLength=_5.hmax;
-_5.hmin-=0.5;
-_5.hmax+=0.5;
-this._calc(_4,_5);
+var df=dojox.lang.functional,dc=dojox.charting.plot2d.common,_1=df.lambda("item.purgeGroup()");
+dojo.declare("dojox.charting.plot2d.StackedColumns",dojox.charting.plot2d.Columns,{calculateAxes:function(_2){
+var _3=dc.collectStackedStats(this.series);
+this._maxRunLength=_3.hmax;
+_3.hmin-=0.5;
+_3.hmax+=0.5;
+this._calc(_2,_3);
 return this;
-},render:function(_6,_7){
+},render:function(_4,_5){
 if(this._maxRunLength<=0){
 return this;
 }
-var _8=df.repeat(this._maxRunLength,"-> 0",0);
+var _6=df.repeat(this._maxRunLength,"-> 0",0);
 for(var i=0;i<this.series.length;++i){
-var _a=this.series[i];
-for(var j=0;j<_a.data.length;++j){
-var v=_a.data[j];
+var _7=this.series[i];
+for(var j=0;j<_7.data.length;++j){
+var _8=_7.data[j],v=typeof _8=="number"?_8:_8.y;
 if(isNaN(v)){
 v=0;
 }
-_8[j]+=v;
+_6[j]+=v;
 }
 }
 this.dirty=this.isDirty();
 if(this.dirty){
-dojo.forEach(this.series,_3);
+dojo.forEach(this.series,_1);
 this.cleanGroup();
 var s=this.group;
-df.forEachRev(this.series,function(_e){
-_e.cleanGroup(s);
+df.forEachRev(this.series,function(_9){
+_9.cleanGroup(s);
 });
 }
-var t=this.chart.theme,_10,_11,_12,f,gap,_15,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_18=this.events();
+var t=this.chart.theme,_a,_b,_c,f,_d,_e,ht=this._hScaler.scaler.getTransformerFromModel(this._hScaler),vt=this._vScaler.scaler.getTransformerFromModel(this._vScaler),_f=this.events();
 f=dc.calculateBarSize(this._hScaler.bounds.scale,this.opt);
-gap=f.gap;
-_15=f.size;
+_d=f.gap;
+_e=f.size;
 this.resetEvents();
 for(var i=this.series.length-1;i>=0;--i){
-var _a=this.series[i];
-if(!this.dirty&&!_a.dirty){
+var _7=this.series[i];
+if(!this.dirty&&!_7.dirty){
 continue;
 }
-_a.cleanGroup();
-var s=_a.group;
-if(!_a.fill||!_a.stroke){
-_10=_a.dyn.color=new dojo.Color(t.next("color"));
+_7.cleanGroup();
+var s=_7.group;
+if(!_7.fill||!_7.stroke){
+_a=_7.dyn.color=new dojo.Color(t.next("color"));
 }
-_11=_a.stroke?_a.stroke:dc.augmentStroke(t.series.stroke,_10);
-_12=_a.fill?_a.fill:dc.augmentFill(t.series.fill,_10);
-for(var j=0;j<_8.length;++j){
-var v=_8[j],_19=vt(v);
-if(_15>=1&&_19>=1){
-var _1a=s.createRect({x:_7.l+ht(j+0.5)+gap,y:_6.height-_7.b-vt(v),width:_15,height:_19}).setFill(_12).setStroke(_11);
-_a.dyn.fill=_1a.getFill();
-_a.dyn.stroke=_1a.getStroke();
-if(_18){
-var o={element:"column",index:j,run:_a,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_1a,x:j+0.5,y:v};
-this._connectEvents(_1a,o);
+_b=_7.stroke?_7.stroke:dc.augmentStroke(t.series.stroke,_a);
+_c=_7.fill?_7.fill:dc.augmentFill(t.series.fill,_a);
+for(var j=0;j<_6.length;++j){
+var v=_6[j],_10=vt(v),_8=_7.data[j],_11=_a,_12=_c,_13=_b;
+if(typeof _8!="number"){
+if(_8.color){
+_11=new dojo.Color(_8.color);
 }
+if("fill" in _8){
+_12=_8.fill;
+}else{
+if(_8.color){
+_12=dc.augmentFill(t.series.fill,_11);
 }
 }
-_a.dirty=false;
-for(var j=0;j<_a.data.length;++j){
-var v=_a.data[j];
+if("stroke" in _8){
+_13=_8.stroke;
+}else{
+if(_8.color){
+_13=dc.augmentStroke(t.series.stroke,_11);
+}
+}
+}
+if(_e>=1&&_10>=1){
+var _14=s.createRect({x:_5.l+ht(j+0.5)+_d,y:_4.height-_5.b-vt(v),width:_e,height:_10}).setFill(_12).setStroke(_13);
+_7.dyn.fill=_14.getFill();
+_7.dyn.stroke=_14.getStroke();
+if(_f){
+var o={element:"column",index:j,run:_7,plot:this,hAxis:this.hAxis||null,vAxis:this.vAxis||null,shape:_14,x:j+0.5,y:v};
+this._connectEvents(_14,o);
+}
+if(this.animate){
+this._animateColumn(_14,_4.height-_5.b,_10);
+}
+}
+}
+_7.dirty=false;
+for(var j=0;j<_7.data.length;++j){
+var _8=_7.data[j],v=typeof _8=="number"?_8:_8.y;
 if(isNaN(v)){
 v=0;
 }
-_8[j]-=v;
+_6[j]-=v;
 }
 }
 this.dirty=false;
diff --git a/dojox/charting/plot2d/common.js b/dojox/charting/plot2d/common.js
index a15dd5b..d7b8dc3 100644
--- a/dojox/charting/plot2d/common.js
+++ b/dojox/charting/plot2d/common.js
@@ -13,144 +13,144 @@ 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(_3){
-if(!_3){
-return _3;
+dojo.mixin(dojox.charting.plot2d.common,{makeStroke:function(_1){
+if(!_1){
+return _1;
 }
-if(typeof _3=="string"||_3 instanceof dojo.Color){
-_3={color:_3};
+if(typeof _1=="string"||_1 instanceof dojo.Color){
+_1={color:_1};
 }
-return dojox.gfx.makeParameters(dojox.gfx.defaultStroke,_3);
-},augmentColor:function(_4,_5){
-var t=new dojo.Color(_4),c=new dojo.Color(_5);
+return dojox.gfx.makeParameters(dojox.gfx.defaultStroke,_1);
+},augmentColor:function(_2,_3){
+var t=new dojo.Color(_2),c=new dojo.Color(_3);
 c.a=t.a;
 return c;
-},augmentStroke:function(_8,_9){
-var s=dc.makeStroke(_8);
+},augmentStroke:function(_4,_5){
+var s=dc.makeStroke(_4);
 if(s){
-s.color=dc.augmentColor(s.color,_9);
+s.color=dc.augmentColor(s.color,_5);
 }
 return s;
-},augmentFill:function(_b,_c){
-var fc,c=new dojo.Color(_c);
-if(typeof _b=="string"||_b instanceof dojo.Color){
-return dc.augmentColor(_b,_c);
-}
-return _b;
-},defaultStats:{hmin:Number.POSITIVE_INFINITY,hmax:Number.NEGATIVE_INFINITY,vmin:Number.POSITIVE_INFINITY,vmax:Number.NEGATIVE_INFINITY},collectSimpleStats:function(_f){
-var _10=dojo.clone(dc.defaultStats);
-for(var i=0;i<_f.length;++i){
-var run=_f[i];
-if(!run.data.length){
+},augmentFill:function(_6,_7){
+var fc,c=new dojo.Color(_7);
+if(typeof _6=="string"||_6 instanceof dojo.Color){
+return dc.augmentColor(_6,_7);
+}
+return _6;
+},defaultStats:{hmin:Number.POSITIVE_INFINITY,hmax:Number.NEGATIVE_INFINITY,vmin:Number.POSITIVE_INFINITY,vmax:Number.NEGATIVE_INFINITY},collectSimpleStats:function(_8){
+var _9=dojo.clone(dc.defaultStats);
+for(var i=0;i<_8.length;++i){
+var _a=_8[i];
+if(!_a.data.length){
 continue;
 }
-if(typeof run.data[0]=="number"){
-var _13=_10.vmin,_14=_10.vmax;
-if(!("ymin" in run)||!("ymax" in run)){
-dojo.forEach(run.data,function(val,i){
-var x=i+1,y=val;
+if(typeof _a.data[0]=="number"){
+var _b=_9.vmin,_c=_9.vmax;
+if(!("ymin" in _a)||!("ymax" in _a)){
+dojo.forEach(_a.data,function(_d,i){
+var x=i+1,y=_d;
 if(isNaN(y)){
 y=0;
 }
-_10.hmin=Math.min(_10.hmin,x);
-_10.hmax=Math.max(_10.hmax,x);
-_10.vmin=Math.min(_10.vmin,y);
-_10.vmax=Math.max(_10.vmax,y);
+_9.hmin=Math.min(_9.hmin,x);
+_9.hmax=Math.max(_9.hmax,x);
+_9.vmin=Math.min(_9.vmin,y);
+_9.vmax=Math.max(_9.vmax,y);
 });
 }
-if("ymin" in run){
-_10.vmin=Math.min(_13,run.ymin);
+if("ymin" in _a){
+_9.vmin=Math.min(_b,_a.ymin);
 }
-if("ymax" in run){
-_10.vmax=Math.max(_14,run.ymax);
+if("ymax" in _a){
+_9.vmax=Math.max(_c,_a.ymax);
 }
 }else{
-var _19=_10.hmin,_1a=_10.hmax,_13=_10.vmin,_14=_10.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;
+var _e=_9.hmin,_f=_9.hmax,_b=_9.vmin,_c=_9.vmax;
+if(!("xmin" in _a)||!("xmax" in _a)||!("ymin" in _a)||!("ymax" in _a)){
+dojo.forEach(_a.data,function(val,i){
+var x="x" in val?val.x:i+1,y=val.y;
 if(isNaN(x)){
 x=0;
 }
 if(isNaN(y)){
 y=0;
 }
-_10.hmin=Math.min(_10.hmin,x);
-_10.hmax=Math.max(_10.hmax,x);
-_10.vmin=Math.min(_10.vmin,y);
-_10.vmax=Math.max(_10.vmax,y);
+_9.hmin=Math.min(_9.hmin,x);
+_9.hmax=Math.max(_9.hmax,x);
+_9.vmin=Math.min(_9.vmin,y);
+_9.vmax=Math.max(_9.vmax,y);
 });
 }
-if("xmin" in run){
-_10.hmin=Math.min(_19,run.xmin);
+if("xmin" in _a){
+_9.hmin=Math.min(_e,_a.xmin);
 }
-if("xmax" in run){
-_10.hmax=Math.max(_1a,run.xmax);
+if("xmax" in _a){
+_9.hmax=Math.max(_f,_a.xmax);
 }
-if("ymin" in run){
-_10.vmin=Math.min(_13,run.ymin);
+if("ymin" in _a){
+_9.vmin=Math.min(_b,_a.ymin);
 }
-if("ymax" in run){
-_10.vmax=Math.max(_14,run.ymax);
+if("ymax" in _a){
+_9.vmax=Math.max(_c,_a.ymax);
 }
 }
 }
-return _10;
-},calculateBarSize:function(_1f,opt,_21){
-if(!_21){
-_21=1;
+return _9;
+},calculateBarSize:function(_10,opt,_11){
+if(!_11){
+_11=1;
 }
-var gap=opt.gap,_23=(_1f-2*gap)/_21;
+var gap=opt.gap,_12=(_10-2*gap)/_11;
 if("minBarSize" in opt){
-_23=Math.max(_23,opt.minBarSize);
+_12=Math.max(_12,opt.minBarSize);
 }
 if("maxBarSize" in opt){
-_23=Math.min(_23,opt.maxBarSize);
-}
-_23=Math.max(_23,1);
-gap=(_1f-_23*_21)/2;
-return {size:_23,gap:gap};
-},collectStackedStats:function(_24){
-var _25=dojo.clone(dc.defaultStats);
-if(_24.length){
-_25.hmin=Math.min(_25.hmin,1);
-_25.hmax=df.foldl(_24,"seed, run -> Math.max(seed, run.data.length)",_25.hmax);
-for(var i=0;i<_25.hmax;++i){
-var v=_24[0].data[i];
+_12=Math.min(_12,opt.maxBarSize);
+}
+_12=Math.max(_12,1);
+gap=(_10-_12*_11)/2;
+return {size:_12,gap:gap};
+},collectStackedStats:function(_13){
+var _14=dojo.clone(dc.defaultStats);
+if(_13.length){
+_14.hmin=Math.min(_14.hmin,1);
+_14.hmax=df.foldl(_13,"seed, run -> Math.max(seed, run.data.length)",_14.hmax);
+for(var i=0;i<_14.hmax;++i){
+var v=_13[0].data[i];
 if(isNaN(v)){
 v=0;
 }
-_25.vmin=Math.min(_25.vmin,v);
-for(var j=1;j<_24.length;++j){
-var t=_24[j].data[i];
+_14.vmin=Math.min(_14.vmin,v);
+for(var j=1;j<_13.length;++j){
+var t=_13[j].data[i];
 if(isNaN(t)){
 t=0;
 }
 v+=t;
 }
-_25.vmax=Math.max(_25.vmax,v);
+_14.vmax=Math.max(_14.vmax,v);
 }
 }
-return _25;
-},curve:function(a,_2b){
+return _14;
+},curve:function(a,_15){
 var arr=a.slice(0);
-if(_2b=="x"){
+if(_15=="x"){
 arr[arr.length]=arr[0];
 }
-var p=dojo.map(arr,function(_2e,i){
+var p=dojo.map(arr,function(_16,i){
 if(i==0){
-return "M"+_2e.x+","+_2e.y;
+return "M"+_16.x+","+_16.y;
 }
-if(!isNaN(_2b)){
-var dx=_2e.x-arr[i-1].x,dy=arr[i-1].y;
-return "C"+(_2e.x-(_2b-1)*(dx/_2b))+","+dy+" "+(_2e.x-(dx/_2b))+","+_2e.y+" "+_2e.x+","+_2e.y;
+if(!isNaN(_15)){
+var dx=_16.x-arr[i-1].x,dy=arr[i-1].y;
+return "C"+(_16.x-(_15-1)*(dx/_15))+","+dy+" "+(_16.x-(dx/_15))+","+_16.y+" "+_16.x+","+_16.y;
 }else{
-if(_2b=="X"||_2b=="x"||_2b=="S"){
+if(_15=="X"||_15=="x"||_15=="S"){
 var p0,p1=arr[i-1],p2=arr[i],p3;
-var _36,_37,_38,_39;
+var _17,_18,_19,_1a;
 var f=1/6;
 if(i==1){
-if(_2b=="x"){
+if(_15=="x"){
 p0=arr[arr.length-2];
 }else{
 p0=p1;
@@ -160,7 +160,7 @@ f=1/3;
 p0=arr[i-2];
 }
 if(i==(arr.length-1)){
-if(_2b=="x"){
+if(_15=="x"){
 p3=arr[1];
 }else{
 p3=p2;
@@ -169,40 +169,40 @@ f=1/3;
 }else{
 p3=arr[i+1];
 }
-var _3b=Math.sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y));
-var _3c=Math.sqrt((p2.x-p0.x)*(p2.x-p0.x)+(p2.y-p0.y)*(p2.y-p0.y));
-var _3d=Math.sqrt((p3.x-p1.x)*(p3.x-p1.x)+(p3.y-p1.y)*(p3.y-p1.y));
-var _3e=_3c*f;
-var _3f=_3d*f;
-if(_3e>_3b/2&&_3f>_3b/2){
-_3e=_3b/2;
-_3f=_3b/2;
+var _1b=Math.sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y));
+var _1c=Math.sqrt((p2.x-p0.x)*(p2.x-p0.x)+(p2.y-p0.y)*(p2.y-p0.y));
+var _1d=Math.sqrt((p3.x-p1.x)*(p3.x-p1.x)+(p3.y-p1.y)*(p3.y-p1.y));
+var _1e=_1c*f;
+var _1f=_1d*f;
+if(_1e>_1b/2&&_1f>_1b/2){
+_1e=_1b/2;
+_1f=_1b/2;
 }else{
-if(_3e>_3b/2){
-_3e=_3b/2;
-_3f=_3b/2*_3d/_3c;
+if(_1e>_1b/2){
+_1e=_1b/2;
+_1f=_1b/2*_1d/_1c;
 }else{
-if(_3f>_3b/2){
-_3f=_3b/2;
-_3e=_3b/2*_3c/_3d;
+if(_1f>_1b/2){
+_1f=_1b/2;
+_1e=_1b/2*_1c/_1d;
 }
 }
 }
-if(_2b=="S"){
+if(_15=="S"){
 if(p0==p1){
-_3e=0;
+_1e=0;
 }
 if(p2==p3){
-_3f=0;
+_1f=0;
 }
 }
-_36=p1.x+_3e*(p2.x-p0.x)/_3c;
-_37=p1.y+_3e*(p2.y-p0.y)/_3c;
-_38=p2.x-_3f*(p3.x-p1.x)/_3d;
-_39=p2.y-_3f*(p3.y-p1.y)/_3d;
+_17=p1.x+_1e*(p2.x-p0.x)/_1c;
+_18=p1.y+_1e*(p2.y-p0.y)/_1c;
+_19=p2.x-_1f*(p3.x-p1.x)/_1d;
+_1a=p2.y-_1f*(p3.y-p1.y)/_1d;
 }
 }
-return "C"+(_36+","+_37+" "+_38+","+_39+" "+p2.x+","+p2.y);
+return "C"+(_17+","+_18+" "+_19+","+_1a+" "+p2.x+","+p2.y);
 });
 return p.join(" ");
 }});
diff --git a/dojox/charting/plot3d/Bars.js b/dojox/charting/plot3d/Bars.js
index 82a371a..73dc48e 100644
--- a/dojox/charting/plot3d/Bars.js
+++ b/dojox/charting/plot3d/Bars.js
@@ -18,20 +18,20 @@ for(var i=1;i<a.length;z=f.call(o,z,a[i++])){
 }
 return z;
 };
-dojo.declare("dojox.charting.plot3d.Bars",dojox.charting.plot3d.Base,{constructor:function(_7,_8,_9){
+dojo.declare("dojox.charting.plot3d.Bars",dojox.charting.plot3d.Base,{constructor:function(_2,_3,_4){
 this.depth="auto";
 this.gap=0;
 this.data=[];
 this.material={type:"plastic",finish:"dull",color:"lime"};
-if(_9){
-if("depth" in _9){
-this.depth=_9.depth;
+if(_4){
+if("depth" in _4){
+this.depth=_4.depth;
 }
-if("gap" in _9){
-this.gap=_9.gap;
+if("gap" in _4){
+this.gap=_4.gap;
 }
-if("material" in _9){
-var m=_9.material;
+if("material" in _4){
+var m=_4.material;
 if(typeof m=="string"||m instanceof dojo.Color){
 this.material.color=m;
 }else{
@@ -48,16 +48,16 @@ w=w/this.data.length;
 return w-2*this.gap;
 }
 return this.depth;
-},generate:function(_c,_d){
+},generate:function(_5,_6){
 if(!this.data){
 return this;
 }
-var _e=this.width/this.data.length,_f=0,_10=this.depth=="auto"?_e-2*this.gap:this.depth,_11=this.height/_1(this.data,Math.max);
-if(!_d){
-_d=_c.view;
+var _7=this.width/this.data.length,_8=0,_9=this.depth=="auto"?_7-2*this.gap:this.depth,_a=this.height/_1(this.data,Math.max);
+if(!_6){
+_6=_5.view;
 }
-for(var i=0;i<this.data.length;++i,_f+=_e){
-_d.createCube({bottom:{x:_f+this.gap,y:0,z:0},top:{x:_f+_e-this.gap,y:this.data[i]*_11,z:_10}}).setFill(this.material);
+for(var i=0;i<this.data.length;++i,_8+=_7){
+_6.createCube({bottom:{x:_8+this.gap,y:0,z:0},top:{x:_8+_7-this.gap,y:this.data[i]*_a,z:_9}}).setFill(this.material);
 }
 }});
 })();
diff --git a/dojox/charting/plot3d/Cylinders.js b/dojox/charting/plot3d/Cylinders.js
index 5344570..ed528a1 100644
--- a/dojox/charting/plot3d/Cylinders.js
+++ b/dojox/charting/plot3d/Cylinders.js
@@ -18,29 +18,29 @@ for(var i=1;i<a.length;z=f.call(o,z,a[i++])){
 }
 return z;
 };
-dojo.declare("dojox.charting.plot3d.Cylinders",dojox.charting.plot3d.Base,{constructor:function(_7,_8,_9){
+dojo.declare("dojox.charting.plot3d.Cylinders",dojox.charting.plot3d.Base,{constructor:function(_2,_3,_4){
 this.depth="auto";
 this.gap=0;
 this.data=[];
 this.material={type:"plastic",finish:"shiny",color:"lime"};
 this.outline=null;
-if(_9){
-if("depth" in _9){
-this.depth=_9.depth;
+if(_4){
+if("depth" in _4){
+this.depth=_4.depth;
 }
-if("gap" in _9){
-this.gap=_9.gap;
+if("gap" in _4){
+this.gap=_4.gap;
 }
-if("material" in _9){
-var m=_9.material;
+if("material" in _4){
+var m=_4.material;
 if(typeof m=="string"||m instanceof dojo.Color){
 this.material.color=m;
 }else{
 this.material=m;
 }
 }
-if("outline" in _9){
-this.outline=_9.outline;
+if("outline" in _4){
+this.outline=_4.outline;
 }
 }
 },getDepth:function(){
@@ -52,16 +52,16 @@ w=w/this.data.length;
 return w-2*this.gap;
 }
 return this.depth;
-},generate:function(_c,_d){
+},generate:function(_5,_6){
 if(!this.data){
 return this;
 }
-var _e=this.width/this.data.length,_f=0,_10=this.height/_1(this.data,Math.max);
-if(!_d){
-_d=_c.view;
+var _7=this.width/this.data.length,_8=0,_9=this.height/_1(this.data,Math.max);
+if(!_6){
+_6=_5.view;
 }
-for(var i=0;i<this.data.length;++i,_f+=_e){
-_d.createCylinder({center:{x:_f+_e/2,y:0,z:0},radius:_e/2-this.gap,height:this.data[i]*_10}).setTransform(dojox.gfx3d.matrix.rotateXg(-90)).setFill(this.material).setStroke(this.outline);
+for(var i=0;i<this.data.length;++i,_8+=_7){
+_6.createCylinder({center:{x:_8+_7/2,y:0,z:0},radius:_7/2-this.gap,height:this.data[i]*_9}).setTransform(dojox.gfx3d.matrix.rotateXg(-90)).setFill(this.material).setStroke(this.outline);
 }
 }});
 })();
diff --git a/dojox/charting/scaler/common.js b/dojox/charting/scaler/common.js
index 1fd86bb..47cfa05 100644
--- a/dojox/charting/scaler/common.js
+++ b/dojox/charting/scaler/common.js
@@ -12,45 +12,45 @@ dojo.provide("dojox.charting.scaler.common");
 var eq=function(a,b){
 return Math.abs(a-b)<=0.000001*(Math.abs(a)+Math.abs(b));
 };
-dojo.mixin(dojox.charting.scaler.common,{findString:function(_4,_5){
-_4=_4.toLowerCase();
-for(var i=0;i<_5.length;++i){
-if(_4==_5[i]){
+dojo.mixin(dojox.charting.scaler.common,{findString:function(_1,_2){
+_1=_1.toLowerCase();
+for(var i=0;i<_2.length;++i){
+if(_1==_2[i]){
 return true;
 }
 }
 return false;
-},getNumericLabel:function(_7,_8,_9){
-var _a=_9.fixed?_7.toFixed(_8<0?-_8:0):_7.toString();
-if(_9.labelFunc){
-var r=_9.labelFunc(_a,_7,_8);
+},getNumericLabel:function(_3,_4,_5){
+var _6=_5.fixed?_3.toFixed(_4<0?-_4:0):_3.toString();
+if(_5.labelFunc){
+var r=_5.labelFunc(_6,_3,_4);
 if(r){
 return r;
 }
 }
-if(_9.labels){
-var l=_9.labels,lo=0,hi=l.length;
+if(_5.labels){
+var l=_5.labels,lo=0,hi=l.length;
 while(lo<hi){
-var _f=Math.floor((lo+hi)/2),val=l[_f].value;
-if(val<_7){
-lo=_f+1;
+var _7=Math.floor((lo+hi)/2),_8=l[_7].value;
+if(_8<_3){
+lo=_7+1;
 }else{
-hi=_f;
+hi=_7;
 }
 }
-if(lo<l.length&&eq(l[lo].value,_7)){
+if(lo<l.length&&eq(l[lo].value,_3)){
 return l[lo].text;
 }
 --lo;
-if(lo>=0&&lo<l.length&&eq(l[lo].value,_7)){
+if(lo>=0&&lo<l.length&&eq(l[lo].value,_3)){
 return l[lo].text;
 }
 lo+=2;
-if(lo<l.length&&eq(l[lo].value,_7)){
+if(lo<l.length&&eq(l[lo].value,_3)){
 return l[lo].text;
 }
 }
-return _a;
+return _6;
 }});
 })();
 }
diff --git a/dojox/charting/scaler/linear.js b/dojox/charting/scaler/linear.js
index 8a614f1..a2edac9 100644
--- a/dojox/charting/scaler/linear.js
+++ b/dojox/charting/scaler/linear.js
@@ -10,66 +10,66 @@ dojo._hasResource["dojox.charting.scaler.linear"]=true;
 dojo.provide("dojox.charting.scaler.linear");
 dojo.require("dojox.charting.scaler.common");
 (function(){
-var _1=3,dc=dojox.charting,_3=dc.scaler,_4=_3.common,_5=_4.findString,_6=_4.getNumericLabel;
-var _7=function(_8,_9,_a,_b,_c,_d,_e){
-_a=dojo.delegate(_a);
-if(!_b){
-if(_a.fixUpper=="major"){
-_a.fixUpper="minor";
+var _1=3,dc=dojox.charting,_2=dc.scaler,_3=_2.common,_4=_3.findString,_5=_3.getNumericLabel;
+var _6=function(_7,_8,_9,_a,_b,_c,_d){
+_9=dojo.delegate(_9);
+if(!_a){
+if(_9.fixUpper=="major"){
+_9.fixUpper="minor";
 }
-if(_a.fixLower=="major"){
-_a.fixLower="minor";
+if(_9.fixLower=="major"){
+_9.fixLower="minor";
 }
 }
-if(!_c){
-if(_a.fixUpper=="minor"){
-_a.fixUpper="micro";
+if(!_b){
+if(_9.fixUpper=="minor"){
+_9.fixUpper="micro";
 }
-if(_a.fixLower=="minor"){
-_a.fixLower="micro";
+if(_9.fixLower=="minor"){
+_9.fixLower="micro";
 }
 }
-if(!_d){
-if(_a.fixUpper=="micro"){
-_a.fixUpper="none";
+if(!_c){
+if(_9.fixUpper=="micro"){
+_9.fixUpper="none";
 }
-if(_a.fixLower=="micro"){
-_a.fixLower="none";
+if(_9.fixLower=="micro"){
+_9.fixLower="none";
 }
 }
-var _f=_5(_a.fixLower,["major"])?Math.floor(_a.min/_b)*_b:_5(_a.fixLower,["minor"])?Math.floor(_a.min/_c)*_c:_5(_a.fixLower,["micro"])?Math.floor(_a.min/_d)*_d:_a.min,_10=_5(_a.fixUpper,["major"])?Math.ceil(_a.max/_b)*_b:_5(_a.fixUpper,["minor"])?Math.ceil(_a.max/_c)*_c:_5(_a.fixUpper,["micro"])?Math.ceil(_a.max/_d)*_d:_a.max;
-if(_a.useMin){
-_8=_f;
+var _e=_4(_9.fixLower,["major"])?Math.floor(_9.min/_a)*_a:_4(_9.fixLower,["minor"])?Math.floor(_9.min/_b)*_b:_4(_9.fixLower,["micro"])?Math.floor(_9.min/_c)*_c:_9.min,_f=_4(_9.fixUpper,["major"])?Math.ceil(_9.max/_a)*_a:_4(_9.fixUpper,["minor"])?Math.ceil(_9.max/_b)*_b:_4(_9.fixUpper,["micro"])?Math.ceil(_9.max/_c)*_c:_9.max;
+if(_9.useMin){
+_7=_e;
 }
-if(_a.useMax){
-_9=_10;
+if(_9.useMax){
+_8=_f;
 }
-var _11=(!_b||_a.useMin&&_5(_a.fixLower,["major"]))?_8:Math.ceil(_8/_b)*_b,_12=(!_c||_a.useMin&&_5(_a.fixLower,["major","minor"]))?_8:Math.ceil(_8/_c)*_c,_13=(!_d||_a.useMin&&_5(_a.fixLower,["major","minor","micro"]))?_8:Math.ceil(_8/_d)*_d,_14=!_b?0:(_a.useMax&&_5(_a.fixUpper,["major"])?Math.round((_9-_11)/_b):Math.floor((_9-_11)/_b))+1,_15=!_c?0:(_a.useMax&&_5(_a.fixUpper,["major","minor"])?Math.round((_9-_12)/_c):Math.floor((_9-_12)/_c))+1,_16=!_d?0:(_a.useMax&&_5(_a.fixUpper,["major" [...]
-if(!isFinite(_1b)){
-_1b=1;
+var _10=(!_a||_9.useMin&&_4(_9.fixLower,["major"]))?_7:Math.ceil(_7/_a)*_a,_11=(!_b||_9.useMin&&_4(_9.fixLower,["major","minor"]))?_7:Math.ceil(_7/_b)*_b,_12=(!_c||_9.useMin&&_4(_9.fixLower,["major","minor","micro"]))?_7:Math.ceil(_7/_c)*_c,_13=!_a?0:(_9.useMax&&_4(_9.fixUpper,["major"])?Math.round((_8-_10)/_a):Math.floor((_8-_10)/_a))+1,_14=!_b?0:(_9.useMax&&_4(_9.fixUpper,["major","minor"])?Math.round((_8-_11)/_b):Math.floor((_8-_11)/_b))+1,_15=!_c?0:(_9.useMax&&_4(_9.fixUpper,["major" [...]
+if(!isFinite(_1a)){
+_1a=1;
 }
-return {bounds:{lower:_f,upper:_10,from:_8,to:_9,scale:_1b,span:_e},major:{tick:_b,start:_11,count:_14,prec:_19},minor:{tick:_c,start:_12,count:_15,prec:_1a},micro:{tick:_d,start:_13,count:_16,prec:0},minorPerMajor:_17,microPerMinor:_18,scaler:_3.linear};
+return {bounds:{lower:_e,upper:_f,from:_7,to:_8,scale:_1a,span:_d},major:{tick:_a,start:_10,count:_13,prec:_18},minor:{tick:_b,start:_11,count:_14,prec:_19},micro:{tick:_c,start:_12,count:_15,prec:0},minorPerMajor:_16,microPerMinor:_17,scaler:_2.linear};
 };
-dojo.mixin(dojox.charting.scaler.linear,{buildScaler:function(min,max,_1e,_1f){
+dojo.mixin(dojox.charting.scaler.linear,{buildScaler:function(min,max,_1b,_1c){
 var h={fixUpper:"none",fixLower:"none",natural:false};
-if(_1f){
-if("fixUpper" in _1f){
-h.fixUpper=String(_1f.fixUpper);
+if(_1c){
+if("fixUpper" in _1c){
+h.fixUpper=String(_1c.fixUpper);
 }
-if("fixLower" in _1f){
-h.fixLower=String(_1f.fixLower);
+if("fixLower" in _1c){
+h.fixLower=String(_1c.fixLower);
 }
-if("natural" in _1f){
-h.natural=Boolean(_1f.natural);
+if("natural" in _1c){
+h.natural=Boolean(_1c.natural);
 }
 }
-if("min" in _1f){
-min=_1f.min;
+if("min" in _1c){
+min=_1c.min;
 }
-if("max" in _1f){
-max=_1f.max;
+if("max" in _1c){
+max=_1c.max;
 }
-if(_1f.includeZero){
+if(_1c.includeZero){
 if(min>0){
 min=0;
 }
@@ -81,136 +81,136 @@ h.min=min;
 h.useMin=true;
 h.max=max;
 h.useMax=true;
-if("from" in _1f){
-min=_1f.from;
+if("from" in _1c){
+min=_1c.from;
 h.useMin=false;
 }
-if("to" in _1f){
-max=_1f.to;
+if("to" in _1c){
+max=_1c.to;
 h.useMax=false;
 }
 if(max<=min){
-return _7(min,max,h,0,0,0,_1e);
+return _6(min,max,h,0,0,0,_1b);
 }
-var mag=Math.floor(Math.log(max-min)/Math.LN10),_22=_1f&&("majorTickStep" in _1f)?_1f.majorTickStep:Math.pow(10,mag),_23=0,_24=0,_25;
-if(_1f&&("minorTickStep" in _1f)){
-_23=_1f.minorTickStep;
+var mag=Math.floor(Math.log(max-min)/Math.LN10),_1d=_1c&&("majorTickStep" in _1c)?_1c.majorTickStep:Math.pow(10,mag),_1e=0,_1f=0,_20;
+if(_1c&&("minorTickStep" in _1c)){
+_1e=_1c.minorTickStep;
 }else{
 do{
-_23=_22/10;
-if(!h.natural||_23>0.9){
-_25=_7(min,max,h,_22,_23,0,_1e);
-if(_25.bounds.scale*_25.minor.tick>_1){
+_1e=_1d/10;
+if(!h.natural||_1e>0.9){
+_20=_6(min,max,h,_1d,_1e,0,_1b);
+if(_20.bounds.scale*_20.minor.tick>_1){
 break;
 }
 }
-_23=_22/5;
-if(!h.natural||_23>0.9){
-_25=_7(min,max,h,_22,_23,0,_1e);
-if(_25.bounds.scale*_25.minor.tick>_1){
+_1e=_1d/5;
+if(!h.natural||_1e>0.9){
+_20=_6(min,max,h,_1d,_1e,0,_1b);
+if(_20.bounds.scale*_20.minor.tick>_1){
 break;
 }
 }
-_23=_22/2;
-if(!h.natural||_23>0.9){
-_25=_7(min,max,h,_22,_23,0,_1e);
-if(_25.bounds.scale*_25.minor.tick>_1){
+_1e=_1d/2;
+if(!h.natural||_1e>0.9){
+_20=_6(min,max,h,_1d,_1e,0,_1b);
+if(_20.bounds.scale*_20.minor.tick>_1){
 break;
 }
 }
-return _7(min,max,h,_22,0,0,_1e);
+return _6(min,max,h,_1d,0,0,_1b);
 }while(false);
 }
-if(_1f&&("microTickStep" in _1f)){
-_24=_1f.microTickStep;
-_25=_7(min,max,h,_22,_23,_24,_1e);
+if(_1c&&("microTickStep" in _1c)){
+_1f=_1c.microTickStep;
+_20=_6(min,max,h,_1d,_1e,_1f,_1b);
 }else{
 do{
-_24=_23/10;
-if(!h.natural||_24>0.9){
-_25=_7(min,max,h,_22,_23,_24,_1e);
-if(_25.bounds.scale*_25.micro.tick>_1){
+_1f=_1e/10;
+if(!h.natural||_1f>0.9){
+_20=_6(min,max,h,_1d,_1e,_1f,_1b);
+if(_20.bounds.scale*_20.micro.tick>_1){
 break;
 }
 }
-_24=_23/5;
-if(!h.natural||_24>0.9){
-_25=_7(min,max,h,_22,_23,_24,_1e);
-if(_25.bounds.scale*_25.micro.tick>_1){
+_1f=_1e/5;
+if(!h.natural||_1f>0.9){
+_20=_6(min,max,h,_1d,_1e,_1f,_1b);
+if(_20.bounds.scale*_20.micro.tick>_1){
 break;
 }
 }
-_24=_23/2;
-if(!h.natural||_24>0.9){
-_25=_7(min,max,h,_22,_23,_24,_1e);
-if(_25.bounds.scale*_25.micro.tick>_1){
+_1f=_1e/2;
+if(!h.natural||_1f>0.9){
+_20=_6(min,max,h,_1d,_1e,_1f,_1b);
+if(_20.bounds.scale*_20.micro.tick>_1){
 break;
 }
 }
-_24=0;
+_1f=0;
 }while(false);
 }
-return _24?_25:_7(min,max,h,_22,_23,0,_1e);
-},buildTicks:function(_26,_27){
-var _28,_29,_2a,_2b=_26.major.start,_2c=_26.minor.start,_2d=_26.micro.start;
-if(_27.microTicks&&_26.micro.tick){
-_28=_26.micro.tick,_29=_2d;
+return _1f?_20:_6(min,max,h,_1d,_1e,0,_1b);
+},buildTicks:function(_21,_22){
+var _23,_24,_25,_26=_21.major.start,_27=_21.minor.start,_28=_21.micro.start;
+if(_22.microTicks&&_21.micro.tick){
+_23=_21.micro.tick,_24=_28;
 }else{
-if(_27.minorTicks&&_26.minor.tick){
-_28=_26.minor.tick,_29=_2c;
+if(_22.minorTicks&&_21.minor.tick){
+_23=_21.minor.tick,_24=_27;
 }else{
-if(_26.major.tick){
-_28=_26.major.tick,_29=_2b;
+if(_21.major.tick){
+_23=_21.major.tick,_24=_26;
 }else{
 return null;
 }
 }
 }
-var _2e=1/_26.bounds.scale;
-if(_26.bounds.to<=_26.bounds.from||isNaN(_2e)||!isFinite(_2e)||_28<=0||isNaN(_28)||!isFinite(_28)){
+var _29=1/_21.bounds.scale;
+if(_21.bounds.to<=_21.bounds.from||isNaN(_29)||!isFinite(_29)||_23<=0||isNaN(_23)||!isFinite(_23)){
 return null;
 }
-var _2f=[],_30=[],_31=[];
-while(_29<=_26.bounds.to+_2e){
-if(Math.abs(_2b-_29)<_28/2){
-_2a={value:_2b};
-if(_27.majorLabels){
-_2a.label=_6(_2b,_26.major.prec,_27);
-}
-_2f.push(_2a);
-_2b+=_26.major.tick;
-_2c+=_26.minor.tick;
-_2d+=_26.micro.tick;
+var _2a=[],_2b=[],_2c=[];
+while(_24<=_21.bounds.to+_29){
+if(Math.abs(_26-_24)<_23/2){
+_25={value:_26};
+if(_22.majorLabels){
+_25.label=_5(_26,_21.major.prec,_22);
+}
+_2a.push(_25);
+_26+=_21.major.tick;
+_27+=_21.minor.tick;
+_28+=_21.micro.tick;
 }else{
-if(Math.abs(_2c-_29)<_28/2){
-if(_27.minorTicks){
-_2a={value:_2c};
-if(_27.minorLabels&&(_26.minMinorStep<=_26.minor.tick*_26.bounds.scale)){
-_2a.label=_6(_2c,_26.minor.prec,_27);
+if(Math.abs(_27-_24)<_23/2){
+if(_22.minorTicks){
+_25={value:_27};
+if(_22.minorLabels&&(_21.minMinorStep<=_21.minor.tick*_21.bounds.scale)){
+_25.label=_5(_27,_21.minor.prec,_22);
 }
-_30.push(_2a);
+_2b.push(_25);
 }
-_2c+=_26.minor.tick;
-_2d+=_26.micro.tick;
+_27+=_21.minor.tick;
+_28+=_21.micro.tick;
 }else{
-if(_27.microTicks){
-_31.push({value:_2d});
+if(_22.microTicks){
+_2c.push({value:_28});
 }
-_2d+=_26.micro.tick;
+_28+=_21.micro.tick;
 }
 }
-_29+=_28;
+_24+=_23;
 }
-return {major:_2f,minor:_30,micro:_31};
-},getTransformerFromModel:function(_32){
-var _33=_32.bounds.from,_34=_32.bounds.scale;
+return {major:_2a,minor:_2b,micro:_2c};
+},getTransformerFromModel:function(_2d){
+var _2e=_2d.bounds.from,_2f=_2d.bounds.scale;
 return function(x){
-return (x-_33)*_34;
+return (x-_2e)*_2f;
 };
-},getTransformerFromPlot:function(_36){
-var _37=_36.bounds.from,_38=_36.bounds.scale;
+},getTransformerFromPlot:function(_30){
+var _31=_30.bounds.from,_32=_30.bounds.scale;
 return function(x){
-return x/_38+_37;
+return x/_32+_31;
 };
 }});
 })();
diff --git a/dojox/charting/scaler/primitive.js b/dojox/charting/scaler/primitive.js
index 63efb7e..bfea710 100644
--- a/dojox/charting/scaler/primitive.js
+++ b/dojox/charting/scaler/primitive.js
@@ -17,10 +17,10 @@ var _8=_7.bounds.from,_9=_7.bounds.scale;
 return function(x){
 return (x-_8)*_9;
 };
-},getTransformerFromPlot:function(_b){
-var _c=_b.bounds.from,_d=_b.bounds.scale;
+},getTransformerFromPlot:function(_a){
+var _b=_a.bounds.from,_c=_a.bounds.scale;
 return function(x){
-return x/_d+_c;
+return x/_c+_b;
 };
 }};
 }
diff --git a/dojox/charting/themes/Distinctive.js b/dojox/charting/themes/Distinctive.js
new file mode 100644
index 0000000..bc053ea
--- /dev/null
+++ b/dojox/charting/themes/Distinctive.js
@@ -0,0 +1,16 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.charting.themes.Distinctive"]){
+dojo._hasResource["dojox.charting.themes.Distinctive"]=true;
+dojo.provide("dojox.charting.themes.Distinctive");
+dojo.require("dojox.charting.Theme");
+(function(){
+var _1=dojox.charting;
+_1.themes.Distinctive=new _1.Theme({colors:["#497c91","#ada9d6","#768b4e","#eeea99","#b39c53","#c28b69","#815454","#bebebe","#59a0bd","#c9c6e4","#677e13","#f0eebb","#e9c756","#cfb09b","#a05a5a","#d8d8d8","#9dc7d9","#7b78a4","#a8c179","#b7b35c","#ebcf81","#956649","#c99999","#868686","#c7e0e9","#8d88c7","#c0d0a0","#e8e667","#efdeb0","#b17044","#ddc0c0","#a5a5a5"]});
+})();
+}
diff --git a/dojox/charting/themes/Harmony.js b/dojox/charting/themes/Harmony.js
new file mode 100644
index 0000000..21dcfc3
--- /dev/null
+++ b/dojox/charting/themes/Harmony.js
@@ -0,0 +1,16 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.charting.themes.Harmony"]){
+dojo._hasResource["dojox.charting.themes.Harmony"]=true;
+dojo.provide("dojox.charting.themes.Harmony");
+dojo.require("dojox.charting.Theme");
+(function(){
+var _1=dojox.charting;
+_1.themes.Harmony=new _1.Theme({colors:["#497c91","#59a0bd","#9dc7d9","#c7e0e9","#7b78a4","#8d88c7","#ada9d6","#c9c6e4","#768b4e","#677e13","#a8c179","#c0d0a0","#b7b35c","#e8e667","#eeea99","#f0eebb","#b39c53","#e9c756","#ebcf81","#efdeb0","#956649","#b17044","#c28b69","#cfb09b","#815454","#a05a5a","#c99999","#ddc0c0","#868686","#a5a5a5","#bebebe","#d8d8d8"]});
+})();
+}
diff --git a/dojox/charting/widget/Chart2D.js b/dojox/charting/widget/Chart2D.js
index 1e1eef0..45d6b8e 100644
--- a/dojox/charting/widget/Chart2D.js
+++ b/dojox/charting/widget/Chart2D.js
@@ -13,4 +13,4 @@
 	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.doc;if(_1.selection){var s=_1.selection;if(s.type=="Text"){return !s.createRange().htmlText.length;}else{return !s.createRange().length;}}else{var _3=dojo.global;var _4=_3.getSelection();if(dojo.isString(_4)){return !_4;}else{return !_4||_4.isCollapsed||!_4.toString();}}},getBookmark:f [...]
+if(!dojo._hasResource["dijit._base.manager"]){dojo._hasResource["dijit._base.manager"]=true;dojo.provide("dijit._base.manager");dojo.declare("dijit.WidgetSet",null,{constructor:function(){this._hash={};this.length=0;},add:function(_1){if(this._hash[_1.id]){throw new Error("Tried to register widget with id=="+_1.id+" but that id is already registered");}this._hash[_1.id]=_1;this.length++;},remove:function(id){if(this._hash[id]){delete this._hash[id];this.length--;}},forEach:function(_2,_3 [...]
diff --git a/dojox/charting/widget/Chart2D.js.uncompressed.js b/dojox/charting/widget/Chart2D.js.uncompressed.js
index 3010d7c..30ed287 100644
--- a/dojox/charting/widget/Chart2D.js.uncompressed.js
+++ b/dojox/charting/widget/Chart2D.js.uncompressed.js
@@ -13,522 +13,231 @@
 	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,
+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");
 
-	// _prevFocus: DomNode
-	//		Previously focused item on screen
-	_prevFocus: null,
+dojo.declare("dijit.WidgetSet", null, {
+	// summary:
+	//		A set of widgets indexed by id. A default instance of this class is
+	//		available as `dijit.registry`
+	//
+	// example:
+	//		Create a small list of widgets:
+	//		|	var ws = new dijit.WidgetSet();
+	//		|	ws.add(dijit.byId("one"));
+	//		| 	ws.add(dijit.byId("two"));
+	//		|	// destroy both:
+	//		|	ws.forEach(function(w){ w.destroy(); });
+	//
+	// example:
+	//		Using dijit.registry:
+	//		|	dijit.registry.forEach(function(w){ /* do something */ });
 
-	isCollapsed: function(){
-		// summary:
-		//		Returns true if there is no text selected
-		var _document = dojo.doc;
-		if(_document.selection){ // IE
-			var s=_document.selection;
-			if(s.type=='Text'){
-				return !s.createRange().htmlText.length; // Boolean
-			}else{ //Control range
-				return !s.createRange().length; // Boolean
-			}
-		}else{
-			var _window = dojo.global;
-			var selection = _window.getSelection();
-			
-			if(dojo.isString(selection)){ // Safari
-				// TODO: this is dead code; safari is taking the else branch.  remove after 1.3.
-				return !selection; // Boolean
-			}else{ // Mozilla/W3
-				return !selection || selection.isCollapsed || !selection.toString(); // Boolean
-			}
-		}
+	constructor: function(){
+		this._hash = {};
+		this.length = 0;
 	},
 
-	getBookmark: function(){
+	add: function(/*dijit._Widget*/ widget){
 		// 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!");
-			}
+		//		Add a widget to this list. If a duplicate ID is detected, a error is thrown.
+		//
+		// widget: dijit._Widget
+		//		Any dijit._Widget subclass.
+		if(this._hash[widget.id]){
+			throw new Error("Tried to register widget with id==" + widget.id + " but that id is already registered");
 		}
-		return bookmark; // Array
+		this._hash[widget.id] = widget;
+		this.length++;
 	},
 
-	moveToBookmark: function(/*Object*/bookmark){
+	remove: function(/*String*/ id){
 		// 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();
-				//range.addElement does not have call/apply method, so can not call it directly
-				//range is not available in "range.addElement(item)", so can't use that either
-				dojo.forEach(bookmark, function(n){
-					range.addElement(n);
-				});
-			}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!");
-			}
+		//		Remove a widget from this WidgetSet. Does not destroy the widget; simply
+		//		removes the reference.
+		if(this._hash[id]){
+			delete this._hash[id];
+			this.length--;
 		}
 	},
 
-	getFocus: function(/*Widget?*/menu, /*Window?*/openedForWindow){
+	forEach: function(/*Function*/ func, /* Object? */thisObj){
 		// 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
+		//		Call specified function for each widget in this set.
 		//
-		// menu:
-		//		The menu that's being opened
+		// func:
+		//		A callback function to run for each item. Is passed the widget, the index
+		//		in the iteration, and the full hash, similar to `dojo.forEach`.
 		//
-		// openedForWindow:
-		//		iframe in which menu was opened
+		// thisObj:
+		//		An optional scope parameter
+		//
+		// example:
+		//		Using the default `dijit.registry` instance:
+		//		|	dijit.registry.forEach(function(widget){
+		//		|		console.log(widget.declaredClass);
+		//		|	});
 		//
 		// returns:
-		//		A handle to restore focus/selection
+		//		Returns self, in order to allow for further chaining.
 
-		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
+		thisObj = thisObj || dojo.global;
+		var i = 0, id;
+		for(id in this._hash){
+			func.call(thisObj, this._hash[id], i++, this._hash);
+		}
+		return this;	// dijit.WidgetSet
 	},
 
-	focus: function(/*Object || DomNode */ handle){
+	filter: function(/*Function*/ filter, /* Object? */thisObj){
 		// 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);
-		}
+		//		Filter down this WidgetSet to a smaller new WidgetSet
+		//		Works the same as `dojo.filter` and `dojo.NodeList.filter`
+		//
+		// filter:
+		//		Callback function to test truthiness. Is passed the widget
+		//		reference and the pseudo-index in the object.
+		//
+		// thisObj: Object?
+		//		Option scope to use for the filter function.
+		//
+		// example:
+		//		Arbitrary: select the odd widgets in this list
+		//		|	dijit.registry.filter(function(w, i){
+		//		|		return i % 2 == 0;
+		//		|	}).forEach(function(w){ /* odd ones */ });
 
-		// 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 */
+		thisObj = thisObj || dojo.global;
+		var res = new dijit.WidgetSet(), i = 0, id;
+		for(id in this._hash){
+			var w = this._hash[id];
+			if(filter.call(thisObj, w, i++, this._hash)){
+				res.add(w);
 			}
 		}
+		return res; // dijit.WidgetSet
 	},
 
-	// _activeStack: Array
-	//		List of currently active widgets (focused widget and it's ancestors)
-	_activeStack: [],
-
-	registerIframe: function(/*DomNode*/ iframe){
+	byId: function(/*String*/ id){
 		// summary:
-		//		Registers listeners on the specified iframe so that any click
-		//		or focus event on that iframe (or anything in it) is reported
-		//		as a focus/click event on the <iframe> itself.
-		// description:
-		//		Currently only used by editor.
-		dijit.registerWin(iframe.contentWindow, iframe);
+		//		Find a widget in this list by it's id.
+		// example:
+		//		Test if an id is in a particular WidgetSet
+		//		| var ws = new dijit.WidgetSet();
+		//		| ws.add(dijit.byId("bar"));
+		//		| var t = ws.byId("bar") // returns a widget
+		//		| var x = ws.byId("foo"); // returns undefined
+
+		return this._hash[id];	// dijit._Widget
 	},
-		
 
-	registerWin: function(/*Window?*/targetWindow, /*DomNode?*/ effectiveNode){
+	byClass: function(/*String*/ cls){
 		// summary:
-		//		Registers listeners on the specified window (either the main
-		//		window or an iframe's window) to detect when the user has clicked somewhere
-		//		or focused somewhere.
-		// description:
-		//		Users should call registerIframe() instead of this method.
-		// targetWindow:
-		//		If specified this is the window associated with the iframe,
-		//		i.e. iframe.contentWindow.
-		// effectiveNode:
-		//		If specified, report any focus events inside targetWindow as
-		//		an event on effectiveNode, rather than on evt.target.
-
-		// TODO: make this function private in 2.0; Editor/users should call registerIframe(),
-		// or if Editor stops using <iframe> altogether than we can probably just drop
-		// the whole public API.
-
-		dojo.connect(targetWindow.document, "onmousedown", function(evt){
-			dijit._justMouseDowned = true;
-			setTimeout(function(){ dijit._justMouseDowned = false; }, 0);
-			dijit._onTouchNode(effectiveNode||evt.target||evt.srcElement);
-		});
-		//dojo.connect(targetWindow, "onscroll", ???);
+		//		Reduce this widgetset to a new WidgetSet of a particular `declaredClass`
+		//
+		// cls: String
+		//		The Class to scan for. Full dot-notated string.
+		//
+		// example:
+		//		Find all `dijit.TitlePane`s in a page:
+		//		|	dijit.registry.byClass("dijit.TitlePane").forEach(function(tp){ tp.close(); });
 
-		// Listen for blur and focus events on targetWindow's document.
-		// IIRC, I'm using attachEvent() rather than dojo.connect() because focus/blur events don't bubble
-		// through dojo.connect(), and also maybe to catch the focus events early, before onfocus handlers
-		// fire.
-		var doc = targetWindow.document;
-		if(doc){
-			if(dojo.isIE){
-				doc.attachEvent('onactivate', function(evt){
-					if(evt.srcElement.tagName.toLowerCase() != "#document"){
-						dijit._onFocusNode(effectiveNode||evt.srcElement);
-					}
-				});
-				doc.attachEvent('ondeactivate', function(evt){
-					dijit._onBlurNode(effectiveNode||evt.srcElement);
-				});
-			}else{
-				doc.addEventListener('focus', function(evt){
-					dijit._onFocusNode(effectiveNode||evt.target);
-				}, true);
-				doc.addEventListener('blur', function(evt){
-					dijit._onBlurNode(effectiveNode||evt.target);
-				}, true);
+		var res = new dijit.WidgetSet(), id, widget;
+		for(id in this._hash){
+			widget = this._hash[id];
+			if(widget.declaredClass == cls){
+				res.add(widget);
 			}
-		}
-		doc = null;	// prevent memory leak (apparent circular reference via closure)
-	},
+		 }
+		 return res; // dijit.WidgetSet
+},
 
-	_onBlurNode: function(/*DomNode*/ node){
+	toArray: function(){
 		// 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;
+		//		Convert this WidgetSet into a true Array
+		//
+		// example:
+		//		Work with the widget .domNodes in a real Array
+		//		|	dojo.map(dijit.registry.toArray(), function(w){ return w.domNode; });
 
-		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;
+		var ar = [];
+		for(var id in this._hash){
+			ar.push(this._hash[id]);
 		}
+		return ar;	// dijit._Widget[]
+},
 
-		// 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);
+	map: function(/* Function */func, /* Object? */thisObj){
+		// summary:
+		//		Create a new Array from this WidgetSet, following the same rules as `dojo.map`
+		// example:
+		//		|	var nodes = dijit.registry.map(function(w){ return w.domNode; });
+		//
+		// returns:
+		//		A new array of the returned values.
+		return dojo.map(this.toArray(), func, thisObj); // Array
 	},
 
-	_onTouchNode: function(/*DomNode*/ node){
+	every: function(func, thisObj){
 		// summary:
-		//		Callback when node is focused or mouse-downed
-
-		// ignore the recent blurNode event
-		if(dijit._clearActiveWidgetsTimer){
-			clearTimeout(dijit._clearActiveWidgetsTimer);
-			delete dijit._clearActiveWidgetsTimer;
-		}
+		// 		A synthetic clone of `dojo.every` acting explictly on this WidgetSet
+		//
+		// func: Function
+		//		A callback function run for every widget in this list. Exits loop
+		//		when the first false return is encountered.
+		//
+		// thisObj: Object?
+		//		Optional scope parameter to use for the callback
 
-		// 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;
-				}
+		thisObj = thisObj || dojo.global;
+		var x = 0, i;
+		for(i in this._hash){
+			if(!func.call(thisObj, this._hash[i], x++, this._hash)){
+				return false; // Boolean
 			}
-		}catch(e){ /* squelch */ }
-
-		dijit._setStack(newStack);
+		}
+		return true; // Boolean
 	},
 
-	_onFocusNode: function(/*DomNode*/ node){
+	some: function(func, thisObj){
 		// summary:
-		//		Callback when node is focused
+		// 		A synthetic clone of `dojo.some` acting explictly on this WidgetSet
+		//
+		// func: Function
+		//		A callback function run for every widget in this list. Exits loop
+		//		when the first true return is encountered.
+		//
+		// thisObj: Object?
+		//		Optional scope parameter to use for the callback
 
-		if(!node){
-			return;
+		thisObj = thisObj || dojo.global;
+		var x = 0, i;
+		for(i in this._hash){
+			if(func.call(thisObj, this._hash[i], x++, this._hash)){
+				return true; // Boolean
+			}
 		}
+		return false; // Boolean
+	}
 
-		if(node.nodeType == 9){
-			// Ignore focus events on the document itself.  This is here so that
-			// (for example) clicking the up/down arrows of a spinner
-			// (which don't get focus) won't cause that widget to blur. (FF issue)
-			return;
-		}
-
-		dijit._onTouchNode(node);
-
-		if(node==dijit._curFocus){ return; }
-		if(dijit._curFocus){
-			dijit._prevFocus = dijit._curFocus;
-		}
-		dijit._curFocus = node;
-		dojo.publish("focusNode", [node]);
-	},
-
-	_setStack: function(newStack){
-		// summary:
-		//		The stack of active widgets has changed.  Send out appropriate events and records 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(function(){dijit.registerWin(window); });
-
-}
-
-if(!dojo._hasResource["dijit._base.manager"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._base.manager"] = true;
-dojo.provide("dijit._base.manager");
-
-dojo.declare("dijit.WidgetSet", null, {
-	// summary:
-	//		A set of widgets indexed by id. A default instance of this class is 
-	//		available as `dijit.registry`
-	//
-	// example:
-	//		Create a small list of widgets:
-	//		|	var ws = new dijit.WidgetSet();
-	//		|	ws.add(dijit.byId("one"));
-	//		| 	ws.add(dijit.byId("two"));
-	//		|	// destroy both:
-	//		|	ws.forEach(function(w){ w.destroy(); });
-	//
-	// example:
-	//		Using dijit.registry:
-	//		|	dijit.registry.forEach(function(w){ /* do something */ });
-	
-	constructor: function(){
-		this._hash = {};
-	},
-
-	add: function(/*Widget*/ widget){
-		// summary:
-		//		Add a widget to this list. If a duplicate ID is detected, a error is thrown.
-		//
-		// widget: dijit._Widget
-		//		Any dijit._Widget subclass.
-		if(this._hash[widget.id]){
-			throw new Error("Tried to register widget with id==" + widget.id + " but that id is already registered");
-		}
-		this._hash[widget.id]=widget;
-	},
-
-	remove: function(/*String*/ id){
-		// summary:
-		//		Remove a widget from this WidgetSet. Does not destroy the widget; simply
-		//		removes the reference.
-		delete this._hash[id];
-	},
-
-	forEach: function(/*Function*/ func){
-		// summary:
-		//		Call specified function for each widget in this set.
-		//
-		// func:
-		//		A callback function to run for each item. Is passed a the widget.
-		//
-		// example:
-		//		Using the default `dijit.registry` instance:
-		//		|	dijit.registry.forEach(function(widget){
-		//		|			
-		//		|	});
-		for(var id in this._hash){
-			func(this._hash[id]);
-		}
-	},
-
-	filter: function(/*Function*/ filter){
-		// summary:
-		//		Filter down this WidgetSet to a smaller new WidgetSet
-		//		Works the same as `dojo.filter` and `dojo.NodeList.filter`
-		//		
-		// filter:
-		//		Callback function to test truthiness.
-		//
-		// example:
-		//		Arbitrary: select the odd widgets in this list
-		//		|	var i = 0;
-		//		|	dijit.registry.filter(function(w){
-		//		|		return ++i % 2 == 0;
-		//		|	}).forEach(function(w){ /* odd ones */ });
-
-		var res = new dijit.WidgetSet();
-		this.forEach(function(widget){
-			if(filter(widget)){ res.add(widget); }
-		});
-		return res; // dijit.WidgetSet
-	},
-
-	byId: function(/*String*/ id){
-		// summary:
-		//		Find a widget in this list by it's id. 
-		// example:
-		//		Test if an id is in a particular WidgetSet
-		//		| var ws = new dijit.WidgetSet();
-		//		| ws.add(dijit.byId("bar"));
-		//		| var t = ws.byId("bar") // returns a widget
-		//		| var x = ws.byId("foo"); // returns undefined
-		
-		return this._hash[id];	// dijit._Widget
-	},
-
-	byClass: function(/*String*/ cls){
-		// summary:
-		//		Reduce this widgetset to a new WidgetSet of a particular declaredClass
-		// 
-		// example:
-		//		Find all titlePane's in a page:
-		//		|	dijit.registry.byClass("dijit.TitlePane").forEach(function(tp){ tp.close(); });
-		
-		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`
+	// summary:
+	//		A list of widgets on a page.
+	// description:
+	//		Is an instance of `dijit.WidgetSet`
 };
 =====*/
-dijit.registry = new dijit.WidgetSet();
+dijit.registry= new dijit.WidgetSet();
 
 dijit._widgetTypeCtr = {};
 
 dijit.getUniqueId = function(/*String*/widgetType){
-	// summary: Generates a unique id for a given widgetType
+	// summary:
+	//		Generates a unique id for a given widgetType
 
 	var id;
 	do{
@@ -541,21 +250,21 @@ dijit.getUniqueId = function(/*String*/widgetType){
 
 dijit.findWidgets = function(/*DomNode*/ root){
 	// summary:
-	//		Search subtree under root, putting found widgets in outAry.
-	//		Doesn't search for nested widgets (ie, widgets inside other widgets)
-	
+	//		Search subtree under root returning widgets found.
+	//		Doesn't search for nested widgets (ie, widgets inside other widgets).
+
 	var outAry = [];
 
 	function getChildrenHelper(root){
-		var list = dojo.isIE ? root.children : root.childNodes, i = 0, node;
-		while(node = list[i++]){
-			if(node.nodeType != 1){ continue; }
-			var widgetId = node.getAttribute("widgetId");
-			if(widgetId){
-				var widget = dijit.byId(widgetId);
-				outAry.push(widget);
-			}else{
-				getChildrenHelper(node);
+		for(var node = root.firstChild; node; node = node.nextSibling){
+			if(node.nodeType == 1){
+				var widgetId = node.getAttribute("widgetId");
+				if(widgetId){
+					var widget = dijit.byId(widgetId);
+					outAry.push(widget);
+				}else{
+					getChildrenHelper(node);
+				}
 			}
 		}
 	}
@@ -564,30 +273,47 @@ dijit.findWidgets = function(/*DomNode*/ root){
 	return outAry;
 };
 
-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.addOnWindowUnload(function(){
-		dojo.forEach(dijit.findWidgets(dojo.body()), function(widget){
+dijit._destroyAll = function(){
+	// summary:
+	//		Code to destroy all widgets and do other cleanup on page unload
+
+	// Clean up focus manager lingering references to widgets and nodes
+	dijit._curFocus = null;
+	dijit._prevFocus = null;
+	dijit._activeStack = [];
+
+	// Destroy all the widgets, top down
+	dojo.forEach(dijit.findWidgets(dojo.body()), function(widget){
+		// Avoid double destroy of widgets like Menu that are attached to <body>
+		// even though they are logically children of other widgets.
+		if(!widget._destroyed){
 			if(widget.destroyRecursive){
 				widget.destroyRecursive();
 			}else if(widget.destroy){
 				widget.destroy();
 			}
-		});
+		}
+	});
+};
+
+if(dojo.isIE){
+	// Only run _destroyAll() for IE because we think it's only necessary in that case,
+	// and because it causes problems on FF.  See bug #3531 for details.
+	dojo.addOnWindowUnload(function(){
+		dijit._destroyAll();
 	});
 }
 
 dijit.byId = function(/*String|Widget*/id){
 	// summary:
 	//		Returns a widget by it's id, or if passed a widget, no-op (like dojo.byId())
-	return (dojo.isString(id)) ? dijit.registry.byId(id) : id; // Widget
+	return typeof id == "string" ? dijit.registry._hash[id] : id; // dijit._Widget
 };
 
 dijit.byNode = function(/* DOMNode */ node){
 	// summary:
 	//		Returns the widget corresponding to the given DOMNode
-	return dijit.registry.byId(node.getAttribute("widgetId")); // Widget
+	return dijit.registry.byId(node.getAttribute("widgetId")); // dijit._Widget
 };
 
 dijit.getEnclosingWidget = function(/* DOMNode */ node){
@@ -595,25 +321,15 @@ dijit.getEnclosingWidget = function(/* DOMNode */ node){
 	//		Returns the widget whose DOM tree contains the specified DOMNode, or null if
 	//		the node is not contained within the DOM tree of any widget
 	while(node){
-		if(node.getAttribute && node.getAttribute("widgetId")){
-			return dijit.registry.byId(node.getAttribute("widgetId"));
+		var id = node.getAttribute && node.getAttribute("widgetId");
+		if(id){
+			return dijit.byId(id);
 		}
 		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")
@@ -625,19 +341,44 @@ dijit._isElementShown = function(/*Element*/elem){
 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
+
+	// TODO: convert (and rename method) to return effectivite tabIndex; will save time in _getTabNavigable()
+	if(dojo.attr(elem, "disabled")){
+		return false;
+	}else if(dojo.hasAttr(elem, "tabIndex")){
+		// Explicit tab index setting
+		return dojo.attr(elem, "tabIndex") >= 0; // boolean
+	}else{
+		// No explicit tabIndex setting, need to investigate node type
+		switch(elem.nodeName.toLowerCase()){
+			case "a":
+				// An <a> w/out a tabindex is only navigable if it has an href
+				return dojo.hasAttr(elem, "href");
+			case "area":
+			case "button":
+			case "input":
+			case "object":
+			case "select":
+			case "textarea":
+				// These are navigable by default
+				return true;
+			case "iframe":
+				// If it's an editor <iframe> then it's tab navigable.
+				if(dojo.isMoz){
+					return elem.contentDocument.designMode == "on";
+				}else if(dojo.isWebKit){
+					var doc = elem.contentDocument,
+						body = doc && doc.body;
+					return body && body.contentEditable == 'true';
+				}else{
+					doc = elem.contentWindow.document;
+					body = doc && doc.body;
+					return body && body.firstChild && body.firstChild.contentEditable == 'true';
+				}
+			default:
+				return elem.contentEditable == 'true';
+		}
 	}
-	return false; // boolean
 };
 
 dijit._getTabNavigable = function(/*DOMNode*/root){
@@ -647,20 +388,20 @@ dijit._getTabNavigable = function(/*DOMNode*/root){
 	// description:
 	//		Finds the following descendants of the specified root node:
 	//		* the first tab-navigable element in document order
-	//		  without a tabindex or with tabindex="0"
+	//		  without a tabIndex or with tabIndex="0"
 	//		* the last tab-navigable element in document order
-	//		  without a tabindex or with tabindex="0"
+	//		  without a tabIndex or with tabIndex="0"
 	//		* the first element in document order with the lowest
-	//		  positive tabindex value
+	//		  positive tabIndex value
 	//		* the last element in document order with the highest
-	//		  positive tabindex value
+	//		  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){
+				var tabindex = dojo.attr(child, "tabIndex");
+				if(!dojo.hasAttr(child, "tabIndex") || tabindex == 0){
 					if(!first){ first = child; }
 					last = child;
 				}else if(tabindex > 0){
@@ -700,8 +441,8 @@ dijit.getLastInTabbingOrder = function(/*String|DOMNode*/root){
 dojo.mixin(dijit, {
 	// defaultDuration: Integer
 	//		The default animation speed (in ms) to use for all Dijit
-	//		transitional animations, unless otherwise specified 
-	//		on a per-instance basis. Defaults to 200, overrided by 
+	//		transitional animations, unless otherwise specified
+	//		on a per-instance basis. Defaults to 200, overrided by
 	//		`djConfig.defaultDuration`
 	defaultDuration: 300
 });
@@ -711,72 +452,585 @@ dijit.defaultDuration = dojo.config["defaultDuration"] || 200;
 
 }
 
-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");
+if(!dojo._hasResource["dijit._base.focus"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.focus"] = true;
+dojo.provide("dijit._base.focus");
 
-dojo.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
+	// for dijit.isTabNavigable()
 
-	this.pairs = [];
-	this.returnWrappers = returnWrappers || false; // Boolean
-}
+// summary:
+//		These functions are used to query or set the focus and selection.
+//
+//		Also, they trace when widgets become activated/deactivated,
+//		so that the widget can fire _onFocus/_onBlur events.
+//		"Active" here means something similar to "focused", but
+//		"focus" isn't quite the right word because we keep track of
+//		a whole stack of "active" widgets.  Example: ComboButton --> Menu -->
+//		MenuItem.  The onBlur event for ComboButton doesn't fire due to focusing
+//		on the Menu or a MenuItem, since they are considered part of the
+//		ComboButton widget.  It only happens when focus is shifted
+//		somewhere completely different.
 
-dojo.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]);
+dojo.mixin(dijit, {
+	// _curFocus: DomNode
+	//		Currently focused item on screen
+	_curFocus: null,
+
+	// _prevFocus: DomNode
+	//		Previously focused item on screen
+	_prevFocus: null,
+
+	isCollapsed: function(){
+		// summary:
+		//		Returns true if there is no text selected
+		return dijit.getBookmark().isCollapsed;
 	},
 
-	match: function(/* ... */){
+	getBookmark: function(){
 		// summary:
-		//		Find an adapter for the given arguments. If no suitable adapter
-		//		is found, throws an exception. match() accepts any number of
+		//		Retrieves a bookmark that can be used with moveToBookmark to return to the same range
+		var bm, rg, tg, sel = dojo.doc.selection, cf = dijit._curFocus;
+
+		if(dojo.global.getSelection){
+			//W3C Range API for selections.
+			sel = dojo.global.getSelection();
+			if(sel){
+				if(sel.isCollapsed){
+					tg = cf? cf.tagName : "";
+					if(tg){
+						//Create a fake rangelike item to restore selections.
+						tg = tg.toLowerCase();
+						if(tg == "textarea" ||
+								(tg == "input" && (!cf.type || cf.type.toLowerCase() == "text"))){
+							sel = {
+								start: cf.selectionStart,
+								end: cf.selectionEnd,
+								node: cf,
+								pRange: true
+							};
+							return {isCollapsed: (sel.end <= sel.start), mark: sel}; //Object.
+						}
+					}
+					bm = {isCollapsed:true};
+				}else{
+					rg = sel.getRangeAt(0);
+					bm = {isCollapsed: false, mark: rg.cloneRange()};
+				}
+			}
+		}else if(sel){
+			// If the current focus was a input of some sort and no selection, don't bother saving
+			// a native bookmark.  This is because it causes issues with dialog/page selection restore.
+			// So, we need to create psuedo bookmarks to work with.
+			tg = cf ? cf.tagName : "";
+			tg = tg.toLowerCase();
+			if(cf && tg && (tg == "button" || tg == "textarea" || tg == "input")){
+				if(sel.type && sel.type.toLowerCase() == "none"){
+					return {
+						isCollapsed: true,
+						mark: null
+					}
+				}else{
+					rg = sel.createRange();
+					return {
+						isCollapsed: rg.text && rg.text.length?false:true,
+						mark: {
+							range: rg,
+							pRange: true
+						}
+					};
+				}
+			}
+			bm = {};
+
+			//'IE' way for selections.
+			try{
+				// createRange() throws exception when dojo in iframe
+				//and nothing selected, see #9632
+				rg = sel.createRange();
+				bm.isCollapsed = !(sel.type == 'Text' ? rg.htmlText.length : rg.length);
+			}catch(e){
+				bm.isCollapsed = true;
+				return bm;
+			}
+			if(sel.type.toUpperCase() == 'CONTROL'){
+				if(rg.length){
+					bm.mark=[];
+					var i=0,len=rg.length;
+					while(i<len){
+						bm.mark.push(rg.item(i++));
+					}
+				}else{
+					bm.isCollapsed = true;
+					bm.mark = null;
+				}
+			}else{
+				bm.mark = rg.getBookmark();
+			}
+		}else{
+			console.warn("No idea how to store the current selection for this browser!");
+		}
+		return bm; // Object
+	},
+
+	moveToBookmark: function(/*Object*/bookmark){
+		// summary:
+		//		Moves current selection to a bookmark
+		// bookmark:
+		//		This should be a returned object from dijit.getBookmark()
+
+		var _doc = dojo.doc,
+			mark = bookmark.mark;
+		if(mark){
+			if(dojo.global.getSelection){
+				//W3C Rangi API (FF, WebKit, Opera, etc)
+				var sel = dojo.global.getSelection();
+				if(sel && sel.removeAllRanges){
+					if(mark.pRange){
+						var r = mark;
+						var n = r.node;
+						n.selectionStart = r.start;
+						n.selectionEnd = r.end;
+					}else{
+						sel.removeAllRanges();
+						sel.addRange(mark);
+					}
+				}else{
+					console.warn("No idea how to restore selection for this browser!");
+				}
+			}else if(_doc.selection && mark){
+				//'IE' way.
+				var rg;
+				if(mark.pRange){
+					rg = mark.range;
+				}else if(dojo.isArray(mark)){
+					rg = _doc.body.createControlRange();
+					//rg.addElement does not have call/apply method, so can not call it directly
+					//rg is not available in "range.addElement(item)", so can't use that either
+					dojo.forEach(mark, function(n){
+						rg.addElement(n);
+					});
+				}else{
+					rg = _doc.body.createTextRange();
+					rg.moveToBookmark(mark);
+				}
+				rg.select();
+			}
+		}
+	},
+
+	getFocus: function(/*Widget?*/ menu, /*Window?*/ openedForWindow){
+		// summary:
+		//		Called as getFocus(), this returns an Object showing the current focus
+		//		and selected text.
+		//
+		//		Called as getFocus(widget), where widget is a (widget representing) a button
+		//		that was just pressed, it returns where focus was before that button
+		//		was pressed.   (Pressing the button may have either shifted focus to the button,
+		//		or removed focus altogether.)   In this case the selected text is not returned,
+		//		since it can't be accurately determined.
+		//
+		// menu: dijit._Widget or {domNode: DomNode} structure
+		//		The button that was just pressed.  If focus has disappeared or moved
+		//		to this button, returns the previous focus.  In this case the bookmark
+		//		information is already lost, and null is returned.
+		//
+		// openedForWindow:
+		//		iframe in which menu was opened
+		//
+		// returns:
+		//		A handle to restore focus/selection, to be passed to `dijit.focus`
+		var node = !dijit._curFocus || (menu && dojo.isDescendant(dijit._curFocus, menu.domNode)) ? dijit._prevFocus : dijit._curFocus;
+		return {
+			node: node,
+			bookmark: (node == dijit._curFocus) && dojo.withGlobal(openedForWindow || dojo.global, dijit.getBookmark),
+			openedForWindow: openedForWindow
+		}; // Object
+	},
+
+	focus: function(/*Object || DomNode */ handle){
+		// summary:
+		//		Sets the focused node and the selection according to argument.
+		//		To set focus to an iframe's content, pass in the iframe itself.
+		// handle:
+		//		object returned by get(), or a DomNode
+
+		if(!handle){ return; }
+
+		var node = "node" in handle ? handle.node : handle,		// because handle is either DomNode or a composite object
+			bookmark = handle.bookmark,
+			openedForWindow = handle.openedForWindow,
+			collapsed = bookmark ? bookmark.isCollapsed : false;
+
+		// Set the focus
+		// Note that for iframe's we need to use the <iframe> to follow the parentNode chain,
+		// but we need to set focus to iframe.contentWindow
+		if(node){
+			var focusNode = (node.tagName.toLowerCase() == "iframe") ? node.contentWindow : node;
+			if(focusNode && focusNode.focus){
+				try{
+					// Gecko throws sometimes if setting focus is impossible,
+					// node not displayed or something like that
+					focusNode.focus();
+				}catch(e){/*quiet*/}
+			}
+			dijit._onFocusNode(node);
+		}
+
+		// set the selection
+		// do not need to restore if current selection is not empty
+		// (use keyboard to select a menu item) or if previous selection was collapsed
+		// as it may cause focus shift (Esp in IE).
+		if(bookmark && dojo.withGlobal(openedForWindow || dojo.global, dijit.isCollapsed) && !collapsed){
+			if(openedForWindow){
+				openedForWindow.focus();
+			}
+			try{
+				dojo.withGlobal(openedForWindow || dojo.global, dijit.moveToBookmark, null, [bookmark]);
+			}catch(e2){
+				/*squelch IE internal error, see http://trac.dojotoolkit.org/ticket/1984 */
+			}
+		}
+	},
+
+	// _activeStack: dijit._Widget[]
+	//		List of currently active widgets (focused widget and it's ancestors)
+	_activeStack: [],
+
+	registerIframe: function(/*DomNode*/ iframe){
+		// summary:
+		//		Registers listeners on the specified iframe so that any click
+		//		or focus event on that iframe (or anything in it) is reported
+		//		as a focus/click event on the <iframe> itself.
+		// description:
+		//		Currently only used by editor.
+		// returns:
+		//		Handle to pass to unregisterIframe()
+		return dijit.registerWin(iframe.contentWindow, iframe);
+	},
+
+	unregisterIframe: function(/*Object*/ handle){
+		// summary:
+		//		Unregisters listeners on the specified iframe created by registerIframe.
+		//		After calling be sure to delete or null out the handle itself.
+		// handle:
+		//		Handle returned by registerIframe()
+
+		dijit.unregisterWin(handle);
+	},
+
+	registerWin: function(/*Window?*/targetWindow, /*DomNode?*/ effectiveNode){
+		// summary:
+		//		Registers listeners on the specified window (either the main
+		//		window or an iframe's window) to detect when the user has clicked somewhere
+		//		or focused somewhere.
+		// description:
+		//		Users should call registerIframe() instead of this method.
+		// targetWindow:
+		//		If specified this is the window associated with the iframe,
+		//		i.e. iframe.contentWindow.
+		// effectiveNode:
+		//		If specified, report any focus events inside targetWindow as
+		//		an event on effectiveNode, rather than on evt.target.
+		// returns:
+		//		Handle to pass to unregisterWin()
+
+		// TODO: make this function private in 2.0; Editor/users should call registerIframe(),
+
+		var mousedownListener = function(evt){
+			dijit._justMouseDowned = true;
+			setTimeout(function(){ dijit._justMouseDowned = false; }, 0);
+			dijit._onTouchNode(effectiveNode || evt.target || evt.srcElement, "mouse");
+		};
+		//dojo.connect(targetWindow, "onscroll", ???);
+
+		// Listen for blur and focus events on targetWindow's document.
+		// IIRC, I'm using attachEvent() rather than dojo.connect() because focus/blur events don't bubble
+		// through dojo.connect(), and also maybe to catch the focus events early, before onfocus handlers
+		// fire.
+		// Connect to <html> (rather than document) on IE to avoid memory leaks, but document on other browsers because
+		// (at least for FF) the focus event doesn't fire on <html> or <body>.
+		var doc = dojo.isIE ? targetWindow.document.documentElement : targetWindow.document;
+		if(doc){
+			if(dojo.isIE){
+				doc.attachEvent('onmousedown', mousedownListener);
+				var activateListener = function(evt){
+					// IE reports that nodes like <body> have gotten focus, even though they have tabIndex=-1,
+					// Should consider those more like a mouse-click than a focus....
+					if(evt.srcElement.tagName.toLowerCase() != "#document" &&
+						dijit.isTabNavigable(evt.srcElement)){
+						dijit._onFocusNode(effectiveNode || evt.srcElement);
+					}else{
+						dijit._onTouchNode(effectiveNode || evt.srcElement);
+					}
+				};
+				doc.attachEvent('onactivate', activateListener);
+				var deactivateListener =  function(evt){
+					dijit._onBlurNode(effectiveNode || evt.srcElement);
+				};
+				doc.attachEvent('ondeactivate', deactivateListener);
+
+				return function(){
+					doc.detachEvent('onmousedown', mousedownListener);
+					doc.detachEvent('onactivate', activateListener);
+					doc.detachEvent('ondeactivate', deactivateListener);
+					doc = null;	// prevent memory leak (apparent circular reference via closure)
+				};
+			}else{
+				doc.addEventListener('mousedown', mousedownListener, true);
+				var focusListener = function(evt){
+					dijit._onFocusNode(effectiveNode || evt.target);
+				};
+				doc.addEventListener('focus', focusListener, true);
+				var blurListener = function(evt){
+					dijit._onBlurNode(effectiveNode || evt.target);
+				};
+				doc.addEventListener('blur', blurListener, true);
+
+				return function(){
+					doc.removeEventListener('mousedown', mousedownListener, true);
+					doc.removeEventListener('focus', focusListener, true);
+					doc.removeEventListener('blur', blurListener, true);
+					doc = null;	// prevent memory leak (apparent circular reference via closure)
+				};
+			}
+		}
+	},
+
+	unregisterWin: function(/*Handle*/ handle){
+		// summary:
+		//		Unregisters listeners on the specified window (either the main
+		//		window or an iframe's window) according to handle returned from registerWin().
+		//		After calling be sure to delete or null out the handle itself.
+
+		// Currently our handle is actually a function
+		handle && handle();
+	},
+
+	_onBlurNode: function(/*DomNode*/ node){
+		// summary:
+		// 		Called when focus leaves a node.
+		//		Usually ignored, _unless_ it *isn't* follwed by touching another node,
+		//		which indicates that we tabbed off the last field on the page,
+		//		in which case every widget is marked inactive
+		dijit._prevFocus = dijit._curFocus;
+		dijit._curFocus = null;
+
+		if(dijit._justMouseDowned){
+			// the mouse down caused a new widget to be marked as active; this blur event
+			// is coming late, so ignore it.
+			return;
+		}
+
+		// if the blur event isn't followed by a focus event then mark all widgets as inactive.
+		if(dijit._clearActiveWidgetsTimer){
+			clearTimeout(dijit._clearActiveWidgetsTimer);
+		}
+		dijit._clearActiveWidgetsTimer = setTimeout(function(){
+			delete dijit._clearActiveWidgetsTimer;
+			dijit._setStack([]);
+			dijit._prevFocus = null;
+		}, 100);
+	},
+
+	_onTouchNode: function(/*DomNode*/ node, /*String*/ by){
+		// summary:
+		//		Callback when node is focused or mouse-downed
+		// node:
+		//		The node that was touched.
+		// by:
+		//		"mouse" if the focus/touch was caused by a mouse down event
+
+		// ignore the recent blurNode event
+		if(dijit._clearActiveWidgetsTimer){
+			clearTimeout(dijit._clearActiveWidgetsTimer);
+			delete dijit._clearActiveWidgetsTimer;
+		}
+
+		// compute stack of active widgets (ex: ComboButton --> Menu --> MenuItem)
+		var newStack=[];
+		try{
+			while(node){
+				var popupParent = dojo.attr(node, "dijitPopupParent");
+				if(popupParent){
+					node=dijit.byId(popupParent).domNode;
+				}else if(node.tagName && node.tagName.toLowerCase() == "body"){
+					// is this the root of the document or just the root of an iframe?
+					if(node === dojo.body()){
+						// node is the root of the main document
+						break;
+					}
+					// otherwise, find the iframe this node refers to (can't access it via parentNode,
+					// need to do this trick instead). window.frameElement is supported in IE/FF/Webkit
+					node=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, by);
+	},
+
+	_onFocusNode: function(/*DomNode*/ node){
+		// summary:
+		//		Callback when node is focused
+
+		if(!node){
+			return;
+		}
+
+		if(node.nodeType == 9){
+			// Ignore focus events on the document itself.  This is here so that
+			// (for example) clicking the up/down arrows of a spinner
+			// (which don't get focus) won't cause that widget to blur. (FF issue)
+			return;
+		}
+
+		dijit._onTouchNode(node);
+
+		if(node == dijit._curFocus){ return; }
+		if(dijit._curFocus){
+			dijit._prevFocus = dijit._curFocus;
+		}
+		dijit._curFocus = node;
+		dojo.publish("focusNode", [node]);
+	},
+
+	_setStack: function(/*String[]*/ newStack, /*String*/ by){
+		// summary:
+		//		The stack of active widgets has changed.  Send out appropriate events and records new stack.
+		// newStack:
+		//		array of widget id's, starting from the top (outermost) widget
+		// by:
+		//		"mouse" if the focus/touch was caused by a mouse down event
+
+		var oldStack = dijit._activeStack;
+		dijit._activeStack = newStack;
+
+		// compare old stack to new stack to see how many elements they have in common
+		for(var nCommon=0; nCommon<Math.min(oldStack.length, newStack.length); nCommon++){
+			if(oldStack[nCommon] != newStack[nCommon]){
+				break;
+			}
+		}
+
+		var widget;
+		// for all elements that have gone out of focus, send blur event
+		for(var i=oldStack.length-1; i>=nCommon; i--){
+			widget = dijit.byId(oldStack[i]);
+			if(widget){
+				widget._focused = false;
+				widget._hasBeenBlurred = true;
+				if(widget._onBlur){
+					widget._onBlur(by);
+				}
+				if(widget._setStateClass){
+					widget._setStateClass();
+				}
+				dojo.publish("widgetBlur", [widget, by]);
+			}
+		}
+
+		// for all element that have come into focus, send focus event
+		for(i=nCommon; i<newStack.length; i++){
+			widget = dijit.byId(newStack[i]);
+			if(widget){
+				widget._focused = true;
+				if(widget._onFocus){
+					widget._onFocus(by);
+				}
+				if(widget._setStateClass){
+					widget._setStateClass();
+				}
+				dojo.publish("widgetFocus", [widget, by]);
+			}
+		}
+	}
+});
+
+// register top window and all the iframes it contains
+dojo.addOnLoad(function(){
+	var handle = dijit.registerWin(window);
+	if(dojo.isIE){
+		dojo.addOnWindowUnload(function(){
+			dijit.unregisterWin(handle);
+			handle = null;
+		})
+	}
+});
+
+}
+
+if(!dojo._hasResource["dojo.AdapterRegistry"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.AdapterRegistry"] = true;
+dojo.provide("dojo.AdapterRegistry");
+
+dojo.AdapterRegistry = function(/*Boolean?*/ returnWrappers){
+	//	summary:
+	//		A registry to make contextual calling/searching easier.
+	//	description:
+	//		Objects of this class keep list of arrays in the form [name, check,
+	//		wrap, directReturn] that are used to determine what the contextual
+	//		result of a set of checked arguments is. All check/wrap functions
+	//		in this registry should be of the same arity.
+	//	example:
+	//	|	// create a new registry
+	//	|	var reg = new dojo.AdapterRegistry();
+	//	|	reg.register("handleString",
+	//	|		dojo.isString,
+	//	|		function(str){
+	//	|			// do something with the string here
+	//	|		}
+	//	|	);
+	//	|	reg.register("handleArr",
+	//	|		dojo.isArray,
+	//	|		function(arr){
+	//	|			// do something with the array here
+	//	|		}
+	//	|	);
+	//	|
+	//	|	// now we can pass reg.match() *either* an array or a string and
+	//	|	// the value we pass will get handled by the right function
+	//	|	reg.match("someValue"); // will call the first function
+	//	|	reg.match(["someValue"]); // will call the second
+
+	this.pairs = [];
+	this.returnWrappers = returnWrappers || false; // Boolean
+}
+
+dojo.extend(dojo.AdapterRegistry, {
+	register: function(/*String*/ name, /*Function*/ check, /*Function*/ wrap, /*Boolean?*/ directReturn, /*Boolean?*/ override){
+		//	summary: 
+		//		register a check function to determine if the wrap function or
+		//		object gets selected
+		//	name:
+		//		a way to identify this matcher.
+		//	check:
+		//		a function that arguments are passed to from the adapter's
+		//		match() function.  The check function should return true if the
+		//		given arguments are appropriate for the wrap function.
+		//	directReturn:
+		//		If directReturn is true, the value passed in for wrap will be
+		//		returned instead of being called. Alternately, the
+		//		AdapterRegistry can be set globally to "return not call" using
+		//		the returnWrappers property. Either way, this behavior allows
+		//		the registry to act as a "search" function instead of a
+		//		function interception library.
+		//	override:
+		//		If override is given and true, the check function will be given
+		//		highest priority. Otherwise, it will be the lowest priority
+		//		adapter.
+		this.pairs[((override) ? "unshift" : "push")]([name, check, wrap, directReturn]);
+	},
+
+	match: function(/* ... */){
+		// summary:
+		//		Find an adapter for the given arguments. If no suitable adapter
+		//		is found, throws an exception. match() accepts any number of
 		//		arguments, all of which are passed to all matching functions
 		//		from the registered pairs.
 		for(var i = 0; i < this.pairs.length; i++){
@@ -848,10 +1102,10 @@ dijit.placeOnScreen = function(
 	/* dijit.__Position */	pos,
 	/* String[] */			corners,
 	/* dijit.__Position? */	padding){
-	//	summary:
+	// summary:
 	//		Positions one of the node's corners at specified position
 	//		such that node is fully visible in viewport.
-	//	description:
+	// description:
 	//		NOTE: node is assumed to be absolutely or relatively positioned.
 	//	pos:
 	//		Object like {x: 10, y: 20}
@@ -864,7 +1118,7 @@ dijit.placeOnScreen = function(
 	//			* "TR" - top right
 	//	padding:
 	//		set padding to put some buffer around the element you want to position.
-	//	example:	
+	// example:
 	//		Try to place node's top right corner at (10,20).
 	//		If that makes node go (partially) off screen, then try placing
 	//		bottom left corner at (10,20).
@@ -876,7 +1130,7 @@ dijit.placeOnScreen = function(
 			c.pos.x += corner.charAt(1) == 'L' ? padding.x : -padding.x;
 			c.pos.y += corner.charAt(0) == 'T' ? padding.y : -padding.y;
 		}
-		return c; 
+		return c;
 	});
 
 	return dijit._place(node, choices);
@@ -928,10 +1182,10 @@ dijit._place = function(/*DomNode*/ node, /* Array */ choices, /* Function */ la
 
 		// 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),
+		var startX = Math.max(view.l, corner.charAt(1) == 'L' ? pos.x : (pos.x - mb.w)),
+			startY = Math.max(view.t, corner.charAt(0) == 'T' ? pos.y : (pos.y - mb.h)),
+			endX = Math.min(view.l + view.w, corner.charAt(1) == 'L' ? (startX + mb.w) : pos.x),
+			endY = Math.min(view.t + view.h, corner.charAt(0) == 'T' ? (startY + mb.h) : pos.y),
 			width = endX - startX,
 			height = endY - startY,
 			overflow = (mb.w - width) + (mb.h - height);
@@ -978,7 +1232,7 @@ dijit.placeOnScreenAroundNode = function(
 	//		where the key corresponds to the aroundNode's corner, and
 	//		the value corresponds to the node's corner:
 	//
-	//	|	{ aroundNodeCorner1: nodeCorner1, aroundNodeCorner2: nodeCorner2,  ...}
+	//	|	{ aroundNodeCorner1: nodeCorner1, aroundNodeCorner2: nodeCorner2, ...}
 	//
 	//		The following strings are used to represent the four corners:
 	//			* "BL" - bottom left
@@ -991,7 +1245,7 @@ dijit.placeOnScreenAroundNode = function(
 	//		based on their orientation relative to the parent.   This adjusts the popup based on orientation.
 	//
 	// example:
-	//	|	dijit.placeOnScreenAroundNode(node, aroundNode, {'BL':'TL', 'TR':'BR'}); 
+	//	|	dijit.placeOnScreenAroundNode(node, aroundNode, {'BL':'TL', 'TR':'BR'});
 	//		This will try to position node such that node's top-left corner is at the same position
 	//		as the bottom left corner of the aroundNode (ie, put node below
 	//		aroundNode, with left edges aligned).  If that fails it will try to put
@@ -1004,14 +1258,12 @@ dijit.placeOnScreenAroundNode = function(
 	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);
+	var aroundNodePos = dojo.position(aroundNode, true);
 	aroundNode.style.display=oldDisplay;
 
 	// place the node around the calculated rectangle
-	return dijit._placeOnScreenAroundRect(node, 
-		aroundNodePos.x, aroundNodePos.y, aroundNodeW, aroundNodeH,	// rectangle
+	return dijit._placeOnScreenAroundRect(node,
+		aroundNodePos.x, aroundNodePos.y, aroundNodePos.w, aroundNodePos.h,	// rectangle
 		aroundCorners, layoutNode);
 };
 
@@ -1026,9 +1278,9 @@ dijit.__Rectangle = function(){
 	// height: Integer
 	//		height in pixels
 
-	thix.x = x;
+	this.x = x;
 	this.y = y;
-	thix.width = width;
+	this.width = width;
 	this.height = height;
 }
 =====*/
@@ -1045,7 +1297,7 @@ dijit.placeOnScreenAroundRectangle = function(
 	//		parameter is an arbitrary rectangle on the screen (x, y, width, height)
 	//		instead of a dom node.
 
-	return dijit._placeOnScreenAroundRect(node, 
+	return dijit._placeOnScreenAroundRect(node,
 		aroundRect.x, aroundRect.y, aroundRect.width, aroundRect.height,	// rectangle
 		aroundCorners, layoutNode);
 };
@@ -1081,7 +1333,7 @@ dijit._placeOnScreenAroundRect = function(
 	return dijit._place(node, choices, layoutNode);
 };
 
-dijit.placementRegistry = new dojo.AdapterRegistry();
+dijit.placementRegistry= new dojo.AdapterRegistry();
 dijit.placementRegistry.register("node",
 	function(n, x){
 		return typeof x == "object" &&
@@ -1108,6 +1360,97 @@ dijit.placeOnScreenAroundElement = function(
 	return dijit.placementRegistry.match.apply(dijit.placementRegistry, arguments);
 };
 
+dijit.getPopupAlignment = function(/*Array*/ position, /*Boolean*/ leftToRight){
+	// summary:
+	//		Transforms the passed array of preferred positions into a format suitable for passing as the aroundCorners argument to dijit.placeOnScreenAroundElement.
+	//
+	// position: String[]
+	//		This variable controls the position of the drop down.
+	//		It's an array of strings with the following values:
+	//
+	//			* before: places drop down to the left of the target node/widget, or to the right in
+	//			  the case of RTL scripts like Hebrew and Arabic
+	//			* after: places drop down to the right of the target node/widget, or to the left in
+	//			  the case of RTL scripts like Hebrew and Arabic
+	//			* above: drop down goes above target node
+	//			* below: drop down goes below target node
+	//
+	//		The list is positions is tried, in order, until a position is found where the drop down fits
+	//		within the viewport.
+	//
+	// leftToRight: Boolean
+	//		Whether the popup will be displaying in leftToRight mode.
+	//
+	var align = {};
+	dojo.forEach(position, function(pos){
+		switch(pos){
+			case "after":
+				align[leftToRight ? "BR" : "BL"] = leftToRight ? "BL" : "BR";
+				break;
+			case "before":
+				align[leftToRight ? "BL" : "BR"] = leftToRight ? "BR" : "BL";
+				break;
+			case "below":
+				// first try to align left borders, next try to align right borders (or reverse for RTL mode)
+				align[leftToRight ? "BL" : "BR"] = leftToRight ? "TL" : "TR";
+				align[leftToRight ? "BR" : "BL"] = leftToRight ? "TR" : "TL";
+				break;
+			case "above":
+			default:
+				// first try to align left borders, next try to align right borders (or reverse for RTL mode)
+				align[leftToRight ? "TL" : "TR"] = leftToRight ? "BL" : "BR";
+				align[leftToRight ? "TR" : "TL"] = leftToRight ? "BR" : "BL";
+				break;
+		}
+	});
+	return align;
+};
+dijit.getPopupAroundAlignment = function(/*Array*/ position, /*Boolean*/ leftToRight){
+	// summary:
+	//		Transforms the passed array of preferred positions into a format suitable for passing as the aroundCorners argument to dijit.placeOnScreenAroundElement.
+	//
+	// position: String[]
+	//		This variable controls the position of the drop down.
+	//		It's an array of strings with the following values:
+	//
+	//			* before: places drop down to the left of the target node/widget, or to the right in
+	//			  the case of RTL scripts like Hebrew and Arabic
+	//			* after: places drop down to the right of the target node/widget, or to the left in
+	//			  the case of RTL scripts like Hebrew and Arabic
+	//			* above: drop down goes above target node
+	//			* below: drop down goes below target node
+	//
+	//		The list is positions is tried, in order, until a position is found where the drop down fits
+	//		within the viewport.
+	//
+	// leftToRight: Boolean
+	//		Whether the popup will be displaying in leftToRight mode.
+	//
+	var align = {};
+	dojo.forEach(position, function(pos){
+		switch(pos){
+			case "after":
+				align[leftToRight ? "BR" : "BL"] = leftToRight ? "BL" : "BR";
+				break;
+			case "before":
+				align[leftToRight ? "BL" : "BR"] = leftToRight ? "BR" : "BL";
+				break;
+			case "below":
+				// first try to align left borders, next try to align right borders (or reverse for RTL mode)
+				align[leftToRight ? "BL" : "BR"] = leftToRight ? "TL" : "TR";
+				align[leftToRight ? "BR" : "BL"] = leftToRight ? "TR" : "TL";
+				break;
+			case "above":
+			default:
+				// first try to align left borders, next try to align right borders (or reverse for RTL mode)
+				align[leftToRight ? "TL" : "TR"] = leftToRight ? "BL" : "BR";
+				align[leftToRight ? "TR" : "TL"] = leftToRight ? "BR" : "BL";
+				break;
+		}
+	});
+	return align;
+};
+
 }
 
 if(!dojo._hasResource["dijit._base.window"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
@@ -1158,9 +1501,10 @@ dijit.popup = new function(){
 		beginZIndex=1000,
 		idGen = 1;
 
-	this.prepare = function(/*DomNode*/ node){
+	this.moveOffScreen = function(/*DomNode*/ node){
 		// summary:
-		//		Prepares a node to be used as a popup
+		//		Moves node offscreen without hiding it (so that all layout widgets included 
+		//		in this node can still layout properly)
 		//
 		// description:
 		//		Attaches node to dojo.doc.body, and
@@ -1192,7 +1536,7 @@ dijit.popup.__OpenArgs = function(){
 	// y: Integer
 	//		Absolute vertical position (in pixels) to place node at.  (Specity this *or* "around" parameter.)
 	// orient: Object || String
-	//		When the around parameter is specified, orient should be an 
+	//		When the around parameter is specified, orient should be an
 	//		ordered list of tuples of the form (around-node-corner, popup-node-corner).
 	//		dijit.popup.open() tries to position the popup according to each tuple in the list, in order,
 	//		until the popup appears fully within the viewport.
@@ -1233,6 +1577,17 @@ dijit.popup.__OpenArgs = function(){
 	this.padding = padding;
 }
 =====*/
+
+	// 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];
+	};
+
+	var wrappers=[];
 	this.open = function(/*dijit.popup.__OpenArgs*/ args){
 		// summary:
 		//		Popup the widget at the specified position
@@ -1243,36 +1598,48 @@ dijit.popup.__OpenArgs = function(){
 		//
 		// example:
 		//		opening the widget as a dropdown
-		//		|		dijit.popup.open({parent: this, popup: menuWidget, around: this.domNode, onClose: function(){...}  });
+		//		|		dijit.popup.open({parent: this, popup: menuWidget, around: this.domNode, onClose: function(){...}});
 		//
 		//		Note that whatever widget called dijit.popup.open() should also listen to its own _onBlur callback
 		//		(fired from _base/focus.js) to know that focus has moved somewhere else and thus the popup should be closed.
 
 		var widget = args.popup,
-			orient = args.orient || {'BL':'TL', 'TL':'BL'},
+			orient = args.orient || (
+				dojo._isBodyLtr() ?
+				{'BL':'TL', 'BR':'TR', 'TL':'BL', 'TR':'BR'} :
+				{'BR':'TR', 'BL':'TL', 'TR':'BR', 'TL':'BL'}
+			),
 			around = args.around,
 			id = (args.around && args.around.id) ? (args.around.id+"_dropdown") : ("popup_"+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.create("div",{
-			id: id, 
-			"class":"dijitPopup",
-			style:{
-				zIndex: beginZIndex + stack.length,
-				visibility:"hidden"
-			}
-		}, dojo.body());
-		dijit.setWaiRole(wrapper, "presentation");
-		
-		// prevent transient scrollbar causing misalign (#5776)
-		wrapper.style.left = wrapper.style.top = "0px";		
 
-		if(args.parent){
-			wrapper.dijitPopupParent=args.parent.id;
+		var wrapperobj = wrappers.pop(), wrapper, iframe;
+		if(!wrapperobj){
+			wrapper = dojo.create("div",{
+				"class":"dijitPopup"
+			}, dojo.body());
+			dijit.setWaiRole(wrapper, "presentation");
+		}else{
+			// recycled a old wrapper, so that we don't need to reattach the iframe
+			// which is slow even if the iframe is empty, see #10167
+			wrapper = wrapperobj[0];
+			iframe = wrapperobj[1];
 		}
 
+		dojo.attr(wrapper,{
+			id: id,
+			style:{
+				zIndex: beginZIndex + stack.length,
+				visibility:"hidden",
+				// prevent transient scrollbar causing misalign (#5776), and initial flash in upper left (#10111)
+				top: "-9999px"
+			},
+			dijitPopupParent: args.parent ? args.parent.id : ""
+		});
+
 		var s = widget.domNode.style;
 		s.display = "";
 		s.visibility = "";
@@ -1280,7 +1647,11 @@ dijit.popup.__OpenArgs = function(){
 		s.top = "0px";
 		wrapper.appendChild(widget.domNode);
 
-		var iframe = new dijit.BackgroundIframe(wrapper);
+		if(!iframe){
+			iframe = new dijit.BackgroundIframe(wrapper);
+		}else{
+			iframe.resize(wrapper)
+		}
 
 		// position the wrapper node
 		var best = around ?
@@ -1292,15 +1663,6 @@ dijit.popup.__OpenArgs = function(){
 
 		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){
@@ -1319,10 +1681,10 @@ dijit.popup.__OpenArgs = function(){
 		// 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, "onCancel", args.onCancel));
 		}
 
-		handlers.push(dojo.connect(widget, widget.onExecute ? "onExecute" : "onChange", null, function(){
+		handlers.push(dojo.connect(widget, widget.onExecute ? "onExecute" : "onChange", function(){
 			var topPopup = getTopPopup();
 			if(topPopup && topPopup.onExecute){
 				topPopup.onExecute();
@@ -1341,35 +1703,46 @@ dijit.popup.__OpenArgs = function(){
 		});
 
 		if(widget.onOpen){
+			// TODO: in 2.0 standardize onShow() (used by StackContainer) and onOpen() (used here)
 			widget.onOpen(best);
 		}
 
 		return best;
 	};
 
-	this.close = function(/*Widget*/ popup){
+	this.close = function(/*dijit._Widget*/ popup){
 		// summary:
 		//		Close specified popup and any popups that it parented
+		
+		// Basically work backwards from the top of the stack closing popups
+		// until we hit the specified popup, but IIRC there was some issue where closing
+		// a popup would cause others to close too.  Thus if we are trying to close B in [A,B,C]
+		// closing C might close B indirectly and then the while() condition will run where stack==[A]...
+		// so the while condition is constructed defensively.
 		while(dojo.some(stack, function(elem){return elem.widget == popup;})){
 			var top = stack.pop(),
 				wrapper = top.wrapper,
 				iframe = top.iframe,
 				widget = top.widget,
 				onClose = top.onClose;
-	
+
 			if(widget.onClose){
+				// TODO: in 2.0 standardize onHide() (used by StackContainer) and onClose() (used here)
 				widget.onClose();
 			}
 			dojo.forEach(top.handlers, dojo.disconnect);
-	
-			// #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.destroy(wrapper);
-	
+			// Move the widget offscreen, unless it has already been destroyed in above onClose() etc.
+			if(widget && widget.domNode){
+				this.moveOffScreen(widget.domNode);
+			}
+                        
+			// recycle the wrapper plus iframe, so we prevent reattaching iframe everytime an popup opens
+			// don't use moveOffScreen which would also reattach the wrapper to body, which causes reloading of iframe
+			wrapper.style.top = "-9999px";
+			wrapper.style.visibility = "hidden";
+			wrappers.push([wrapper,iframe]);
+
 			if(onClose){
 				onClose();
 			}
@@ -1378,7 +1751,8 @@ dijit.popup.__OpenArgs = function(){
 }();
 
 dijit._frames = new function(){
-	// summary: cache of iframes
+	// summary:
+	//		cache of iframes
 	var queue = [];
 
 	this.pop = function(){
@@ -1397,19 +1771,15 @@ dijit._frames = new function(){
 			 	iframe = dojo.create("iframe");
 				iframe.src = 'javascript:""';
 				iframe.className = "dijitBackgroundIframe";
+				dojo.style(iframe, "opacity", 0.1);
 			}
 			iframe.tabIndex = -1; // Magic to prevent iframe from getting focus on tab keypress - as style didnt work.
-			dojo.body().appendChild(iframe);
 		}
 		return iframe;
 	};
 
 	this.push = function(iframe){
 		iframe.style.display="none";
-		if(dojo.isIE){
-			iframe.style.removeExpression("width");
-			iframe.style.removeExpression("height");
-		}
 		queue.push(iframe);
 	}
 }();
@@ -1417,7 +1787,7 @@ dijit._frames = new function(){
 
 dijit.BackgroundIframe = function(/* DomNode */node){
 	// summary:
-	//		For IE z-index schenanigans. id attribute is required.
+	//		For IE/FF z-index schenanigans. id attribute is required.
 	//
 	// description:
 	//		new dijit.BackgroundIframe(node)
@@ -1425,20 +1795,46 @@ dijit.BackgroundIframe = function(/* DomNode */node){
 	//			area (and position) of node
 
 	if(!node.id){ throw new Error("no id"); }
-	if(dojo.isIE < 7 || (dojo.isFF < 3 && dojo.hasClass(dojo.body(), "dijit_a11y"))){
+	if(dojo.isIE || dojo.isMoz){
 		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");
+		if(dojo.isIE<7){
+			this.resize(node);
+			this._conn = dojo.connect(node, 'onresize', this, function(){
+				this.resize(node);
+			});
+		}else{
+			dojo.style(iframe, {
+				width: '100%',
+				height: '100%'
+			});
 		}
 		this.iframe = iframe;
 	}
 };
 
 dojo.extend(dijit.BackgroundIframe, {
+	resize: function(node){
+		// summary:
+		// 		resize the iframe so its the same size as node
+		// description:
+		//		this function is a no-op in all browsers except
+		//		IE6, which does not support 100% width/height 
+		//		of absolute positioned iframes
+		if(this.iframe && dojo.isIE<7){
+			dojo.style(this.iframe, {
+				width: node.offsetWidth + 'px',
+				height: node.offsetHeight + 'px'
+			});
+		}
+	},
 	destroy: function(){
-		//	summary: destroy the iframe
+		// summary:
+		//		destroy the iframe
+		if(this._conn){
+			dojo.disconnect(this._conn);
+			this._conn = null;
+		}
 		if(this.iframe){
 			dijit._frames.push(this.iframe);
 			delete this.iframe;
@@ -1452,221 +1848,96 @@ if(!dojo._hasResource["dijit._base.scroll"]){ //_hasResource checks added by bui
 dojo._hasResource["dijit._base.scroll"] = true;
 dojo.provide("dijit._base.scroll");
 
-dijit.scrollIntoView = function(/* DomNode */node){
+dijit.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){
 	// summary:
-	//		Scroll the passed node into view, if it is not.
-
+	//		Scroll the passed node into view, if it is not already.
+	
 	// 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
-	// 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 testdir="H"; //debug
+
 	try{ // catch unexpected/unrecreatable errors (#7808) since we can recover using a semi-acceptable native method
 	node = dojo.byId(node);
-	var doc = dojo.doc;
-	var body = dojo.body();
-	var html = body.parentNode;
-	// if FF2 (which is perfect) or an untested browser, then use the native method
-
-	if((!(dojo.isFF >= 3 || dojo.isIE || dojo.isWebKit) || node == body || node == html) && (typeof node.scrollIntoView == "function")){ // FF2 is perfect, too bad FF3 is not
+	var doc = node.ownerDocument || dojo.doc,
+		body = doc.body || dojo.body(),
+		html = doc.documentElement || body.parentNode,
+		isIE = dojo.isIE, isWK = dojo.isWebKit;
+	// if an untested browser, then use the native method
+	if((!(dojo.isMoz || isIE || isWK) || node == body || node == html) && (typeof node.scrollIntoView != "undefined")){
 		node.scrollIntoView(false); // short-circuit to native if possible
 		return;
 	}
-	var ltr = dojo._isBodyLtr();
-	var isIE8strict = dojo.isIE >= 8 && !compatMode;
-	var rtl = !ltr && !isIE8strict; // IE8 flips scrolling so pretend it's ltr
-	// body and html elements are all messed up due to browser bugs and inconsistencies related to doctype
-	// normalize the values before proceeding (FF2 is not listed since its native behavior is perfect)
-	// for computation simplification, client and offset width and height are the same for body and html
-	// strict:       html:       |      body:       | compatMode:
-	//           width   height  |  width   height  |------------
-	//    ie*:  clientW  clientH | scrollW  clientH | CSS1Compat
-	//    ff3:  clientW  clientH |HscrollW  clientH | CSS1Compat
-	//    sf3:  clientW  clientH | clientW HclientH | CSS1Compat
-	//    op9:  clientW  clientH |HscrollW  clientH | CSS1Compat
-	// ---------------------------------------------|-----------
-	//   none:        html:      |      body:       |
-	//           width    height |  width   height  |
-	//    ie*: BclientW BclientH | clientW  clientH | BackCompat
-	//    ff3: BclientW BclientH | clientW  clientH | BackCompat
-	//    sf3:  clientW  clientH | clientW HclientH | CSS1Compat
-	//    op9: BclientW BclientH | clientW  clientH | BackCompat
-	// ---------------------------------------------|-----------
-	//  loose:        html:      |      body:       |
-	//           width    height |  width   height  |
-	//    ie*:  clientW  clientH | scrollW  clientH | CSS1Compat
-	//    ff3: BclientW BclientH | clientW  clientH | BackCompat
-	//    sf3:  clientW  clientH | clientW HclientH | CSS1Compat
-	//    op9:  clientW  clientH |HscrollW  clientH | CSS1Compat
-	var scrollRoot = body;
-	var compatMode = doc.compatMode == 'BackCompat';
-	if(compatMode){ // BODY is scrollable, HTML has same client size
-		// body client values already OK
-		html._offsetWidth = html._clientWidth = body._offsetWidth = body.clientWidth;
-		html._offsetHeight = html._clientHeight = body._offsetHeight = body.clientHeight;
-	}else{
-		if(dojo.isWebKit){
-			body._offsetWidth = body._clientWidth  = html.clientWidth;
-			body._offsetHeight = body._clientHeight = html.clientHeight;
-		}else{
-			scrollRoot = html;
-		}
-		html._offsetHeight = html.clientHeight;
-		html._offsetWidth  = html.clientWidth;
-	}
-
-	function isFixedPosition(element){
-		var ie = dojo.isIE;
-		return ((ie <= 6 || (ie >= 7 && compatMode))? false : (dojo.style(element, 'position').toLowerCase() == "fixed"));
-	}
-
-	function addPseudoAttrs(element){
-		var parent = element.parentNode;
-		var offsetParent = element.offsetParent;
-		if(offsetParent == null || isFixedPosition(element)){ // position:fixed has no real offsetParent
-			offsetParent = html; // prevents exeptions
-			parent = (element == body)? html : null;
-		}
-		// all the V/H object members below are to reuse code for both directions
-		element._offsetParent = offsetParent;
-		element._parent = parent;
-		//
-		//
-		var bp = dojo._getBorderExtents(element);
-		element._borderStart = { H:(isIE8strict && !ltr)? (bp.w-bp.l):bp.l, V:bp.t };
-		element._borderSize = { H:bp.w, V:bp.h };
-		element._scrolledAmount = { H:element.scrollLeft, V:element.scrollTop };
-		element._offsetSize = { H: element._offsetWidth||element.offsetWidth, V: element._offsetHeight||element.offsetHeight };
-		//
-		// IE8 flips everything in rtl mode except offsetLeft and borderLeft - so manually change offsetLeft to offsetRight here 
-		element._offsetStart = { H:(isIE8strict && !ltr)? offsetParent.clientWidth-element.offsetLeft-element._offsetSize.H:element.offsetLeft, V:element.offsetTop };
-		//
-		element._clientSize = { H:element._clientWidth||element.clientWidth, V:element._clientHeight||element.clientHeight };
-		if(element != body && element != html && element != node){
-			for(var dir in element._offsetSize){ // for both x and y directions
-				var scrollBarSize = element._offsetSize[dir] - element._clientSize[dir] - element._borderSize[dir];
-				//if(dir==testdir)
-				var hasScrollBar = element._clientSize[dir] > 0 && scrollBarSize > 0; // can't check for a specific scrollbar size since it changes dramatically as you zoom
-				//if(dir==testdir)
-				if(hasScrollBar){
-					element._offsetSize[dir] -= scrollBarSize;
-					if(dojo.isIE && rtl && dir=="H"){ element._offsetStart[dir] += scrollBarSize; }
-				}
-			}
-		}
-	}
-
-	var element = node;
-	while(element != null){
-		if(isFixedPosition(element)){ node.scrollIntoView(false); return; } //TODO: handle without native call
-		addPseudoAttrs(element);
-		element = element._parent;
-	}
-	if(dojo.isIE && node._parent){ // if no parent, then offsetParent._borderStart may not tbe set
-		var offsetParent = node._offsetParent;
-		//
-		node._offsetStart.H += offsetParent._borderStart.H;
-		node._offsetStart.V += offsetParent._borderStart.V;
-	}
-	if(dojo.isIE >= 7 && scrollRoot == html && rtl && body._offsetStart && body._offsetStart.H == 0){ // IE7 bug
-		var scroll = html.scrollWidth - html._offsetSize.H;
-		if(scroll > 0){
-			//
-			body._offsetStart.H = -scroll;
-		}
-	}
-	if(dojo.isIE <= 6 && !compatMode){
-		html._offsetSize.H += html._borderSize.H;
-		html._offsetSize.V += html._borderSize.V;
-	}
-	// eliminate offsetLeft/Top oddities by tweaking scroll for ease of computation
-	if(rtl && body._offsetStart && scrollRoot == html && html._scrolledAmount){
-		var ofs = body._offsetStart.H;
-		if(ofs < 0){
-			html._scrolledAmount.H += ofs;
-			body._offsetStart.H = 0;
-		}
-	}
-	element = node;
-	while(element){
-		var parent = element._parent;
-		if(!parent){ break; }
-			//
-			if(parent.tagName == "TD"){
-				var table = parent._parent._parent._parent; // point to TABLE
-				if(parent != element._offsetParent && parent._offsetParent != element._offsetParent){
-					parent = table; // child of TD has the same offsetParent as TABLE, so skip TD, TR, and TBODY (ie. verticalslider)
+	var backCompat = doc.compatMode == 'BackCompat',
+		clientAreaRoot = backCompat? body : html,
+		scrollRoot = isWK ? body : clientAreaRoot,
+		rootWidth = clientAreaRoot.clientWidth,
+		rootHeight = clientAreaRoot.clientHeight,
+		rtl = !dojo._isBodyLtr(),
+		nodePos = pos || dojo.position(node),
+		el = node.parentNode,
+		isFixed = function(el){
+			return ((isIE <= 6 || (isIE && backCompat))? false : (dojo.style(el, 'position').toLowerCase() == "fixed"));
+		};
+	if(isFixed(node)){ return; } // nothing to do
+	while(el){
+		if(el == body){ el = scrollRoot; }
+		var elPos = dojo.position(el),
+			fixedPos = isFixed(el);
+		with(elPos){
+			if(el == scrollRoot){
+				w = rootWidth, h = rootHeight;
+				if(scrollRoot == html && isIE && rtl){ x += scrollRoot.offsetWidth-w; } // IE workaround where scrollbar causes negative x
+				if(x < 0 || !isIE){ x = 0; } // IE can have values > 0
+				if(y < 0 || !isIE){ y = 0; }
+			}else{
+				var pb = dojo._getPadBorderExtents(el);
+				w -= pb.w; h -= pb.h; x += pb.l; y += pb.t;
+			}
+			with(el){
+				if(el != scrollRoot){ // body, html sizes already have the scrollbar removed
+					var clientSize = clientWidth,
+						scrollBarSize = w - clientSize;
+					if(clientSize > 0 && scrollBarSize > 0){
+						w = clientSize;
+						if(isIE && rtl){ x += scrollBarSize; }
+					}
+					clientSize = clientHeight;
+					scrollBarSize = h - clientSize;
+					if(clientSize > 0 && scrollBarSize > 0){
+						h = clientSize;
+					}
 				}
-			}
-			// check if this node and its parent share the same offsetParent
-			var relative = element._offsetParent == parent;
-			//
-			for(var dir in element._offsetStart){ // for both x and y directions
-				var otherDir = dir=="H"? "V" : "H";
-				if(rtl && dir=="H" && (parent != html) && (parent != body) && (dojo.isIE || dojo.isWebKit) && parent._clientSize.H > 0 && parent.scrollWidth > parent._clientSize.H){ // scroll starts on the right
-					var delta = parent.scrollWidth - parent._clientSize.H;
-					//
-					if(delta > 0){
-						parent._scrolledAmount.H -= delta;
-					} // match FF3 which has cool negative scrollLeft values
-				}
-				if(parent._offsetParent.tagName == "TABLE"){ // make it consistent
-					if(dojo.isIE){ // make it consistent with Safari and FF3 and exclude the starting TABLE border of TABLE children
-						parent._offsetStart[dir] -= parent._offsetParent._borderStart[dir];
-						parent._borderStart[dir] = parent._borderSize[dir] = 0;
+				if(fixedPos){ // bounded by viewport, not parents
+					if(y < 0){
+						h += y, y = 0;
 					}
-					else{
-						parent._offsetStart[dir] += parent._offsetParent._borderStart[dir];
+					if(x < 0){
+						w += x, x = 0;
+					}
+					if(y + h > rootHeight){
+						h = rootHeight - y;
+					}
+					if(x + w > rootWidth){
+						w = rootWidth - x;
 					}
 				}
-				//if(dir==testdir)
-				if(dojo.isIE){
-					//if(dir==testdir)
-					parent._offsetStart[dir] += parent._offsetParent._borderStart[dir];
-				}
-				//if(dir==testdir)
-				// underflow = visible gap between parent and this node taking scrolling into account
-				// if negative, part of the node is obscured by the parent's beginning and should be scrolled to become visible
-				var underflow = element._offsetStart[dir] - parent._scrolledAmount[dir] - (relative? 0 : parent._offsetStart[dir]) - parent._borderStart[dir];
-				// if overflow is positive, number of pixels obscured by the parent's end
-				var overflow = underflow + element._offsetSize[dir] - parent._offsetSize[dir] + parent._borderSize[dir];
-				//if(dir==testdir)
-				var scrollAttr = (dir=="H")? "scrollLeft" : "scrollTop";
-				// see if we should scroll forward or backward
-				var reverse = dir=="H" && rtl; // flip everything
-				var underflowScroll = reverse? -overflow : underflow;
-				var overflowScroll = reverse? -underflow : overflow;
-				// don't scroll if the over/underflow signs are opposite since that means that
-				// the node extends beyond parent's boundary in both/neither directions
-				var scrollAmount = (underflowScroll*overflowScroll <= 0)? 0 : Math[(underflowScroll < 0)? "max" : "min"](underflowScroll, overflowScroll);
-				//if(dir==testdir)
-				if(scrollAmount != 0){
-					var oldScroll = parent[scrollAttr];
-					parent[scrollAttr] += (reverse)? -scrollAmount : scrollAmount; // actually perform the scroll
-					var scrolledAmount = parent[scrollAttr] - oldScroll; // in case the scroll failed
-					//if(dir==testdir)
-				}
-				if(relative){
-					element._offsetStart[dir] += parent._offsetStart[dir];
-				}
-				element._offsetStart[dir] -= parent[scrollAttr];
-			}
-			element._parent = parent._parent;
-			element._offsetParent = parent._offsetParent;
-	}
-	parent = node;
-	var next;
-	while(parent && parent.removeAttribute){
-		next = parent.parentNode;
-		parent.removeAttribute('_offsetParent');
-		parent.removeAttribute('_parent');
-		parent = next;
+				// calculate overflow in all 4 directions
+				var l = nodePos.x - x, // beyond left: < 0
+					t = nodePos.y - Math.max(y, 0), // beyond top: < 0
+					r = l + nodePos.w - w, // beyond right: > 0
+					bot = t + nodePos.h - h; // beyond bottom: > 0
+				if(r * l > 0){
+					var s = Math[l < 0? "max" : "min"](l, r);
+					nodePos.x += scrollLeft;
+					scrollLeft += (isIE >= 8 && !backCompat && rtl)? -s : s;
+					nodePos.x -= scrollLeft;
+				}
+				if(bot * t > 0){
+					nodePos.y += scrollTop;
+					scrollTop += Math[t < 0? "max" : "min"](t, bot);
+					nodePos.y -= scrollTop;
+				}
+			}
+		}
+		el = (el != scrollRoot) && !fixedPos && el.parentNode;
 	}
 	}catch(error){
 		console.error('scrollIntoView: ' + error);
@@ -1694,7 +1965,7 @@ dojo._hasResource["dijit._base.sniff"] = true;
 dojo.provide("dijit._base.sniff");
 
 (function(){
-	
+
 	var d = dojo,
 		html = d.doc.documentElement,
 		ie = d.isIE,
@@ -1702,26 +1973,29 @@ dojo.provide("dijit._base.sniff");
 		maj = Math.floor,
 		ff = d.isFF,
 		boxModel = d.boxModel.replace(/-/,''),
+
 		classes = {
 			dj_ie: ie,
-//			dj_ie55: ie == 5.5,
 			dj_ie6: maj(ie) == 6,
 			dj_ie7: maj(ie) == 7,
+			dj_ie8: maj(ie) == 8,
 			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_webkit: d.isWebKit,
 			dj_safari: d.isSafari,
+			dj_chrome: d.isChrome,
+
 			dj_gecko: d.isMozilla,
-			dj_ff2: maj(ff) == 2,
 			dj_ff3: maj(ff) == 3
 		}; // no dojo unsupported browsers
-		
+
 	classes["dj_" + boxModel] = true;
-	
+
 	// apply browser, browser version, and box model class names
 	for(var p in classes){
 		if(classes[p]){
@@ -1746,7 +2020,7 @@ dojo.provide("dijit._base.sniff");
 			}
 		}
 	});
-	
+
 })();
 
 }
@@ -1765,16 +2039,22 @@ 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));
+		
+		// Schedule next event, reducing the timer a little bit each iteration, bottoming-out at 10 to avoid
+		// browser overload (particularly avoiding starving DOH robot so it never gets to send a mouseup)
+		this._currentTimeout = Math.max(
+			this._currentTimeout < 0 ? this._initialDelay :
+				(this._subsequentDelay > 1 ? this._subsequentDelay : Math.round(this._currentTimeout * this._subsequentDelay)),
+			10);
 		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.
+		//		Start a timed, repeating callback sequence.
+		//		If already started, the function call is ignored.
+		//		This method is not normally called by the user but can be
+		//		when the normal listener code is insufficient.
 		// evt:
 		//		key or mouse event object to pass to the user callback
 		// _this:
@@ -1812,7 +2092,7 @@ dijit.typematic = {
 
 	stop: function(){
 		// summary:
-		//	  Stop an ongoing timed, repeating callback sequence.
+		//		Stop an ongoing timed, repeating callback sequence.
 		if(this._timer){
 			clearTimeout(this._timer);
 			this._timer = null;
@@ -1857,8 +2137,9 @@ dijit.typematic = {
 			dojo.connect(node, "onkeypress", this, function(evt){
 				if(evt.charOrCode == keyObject.charOrCode &&
 				(keyObject.ctrlKey === undefined || keyObject.ctrlKey == evt.ctrlKey) &&
-				(keyObject.altKey === undefined || keyObject.altKey == evt.ctrlKey) &&
-				(keyObject.shiftKey === undefined || keyObject.shiftKey == evt.ctrlKey)){
+				(keyObject.altKey === undefined || keyObject.altKey == evt.altKey) &&
+				(keyObject.metaKey === undefined || keyObject.metaKey == (evt.metaKey || false)) && // IE doesn't even set metaKey
+				(keyObject.shiftKey === undefined || keyObject.shiftKey == evt.shiftKey)){
 					dojo.stopEvent(evt);
 					dijit.typematic.trigger(keyObject, _this, node, callback, keyObject, subsequentDelay, initialDelay);
 				}else if(dijit.typematic._obj == keyObject){
@@ -1955,7 +2236,7 @@ dijit.wai = {
 		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:)" ));
+			var needsA11y = (cs.borderTopColor == cs.borderRightColor) || (bkImg != null && (bkImg == "none" || bkImg == "url(invalid-url:)" ));
 			dojo[needsA11y ? "addClass" : "removeClass"](dojo.body(), "dijit_a11y");
 			if(dojo.isIE){
 				div.outerHTML = "";		// prevent mixed-content warning, see http://support.microsoft.com/kb/925014
@@ -1972,8 +2253,7 @@ if(dojo.isIE || dojo.isMoz){	// NOTE: checking in Safari messes things up
 	dojo._loaders.unshift(dijit.wai.onload);
 }
 
-dojo.mixin(dijit,
-{
+dojo.mixin(dijit, {
 	_XhtmlRoles: /banner|contentinfo|definition|main|navigation|search|note|secondary|seealso/,
 
 	hasWaiRole: function(/*Element*/ elem, /*String*/ role){
@@ -1981,9 +2261,9 @@ dojo.mixin(dijit,
 		//		Determines if an element has a particular non-XHTML role.
 		// returns:
 		//		True if elem has the specific non-XHTML role attribute and false if not.
-		// 		For backwards compatibility if role parameter not provided, 
-		// 		returns true if has non XHTML role 
-		var waiRole = this.getWaiRole(elem);		
+		// 		For backwards compatibility if role parameter not provided,
+		// 		returns true if has non XHTML role
+		var waiRole = this.getWaiRole(elem);
 		return role ? (waiRole.indexOf(role) > -1) : (waiRole.length > 0);
 	},
 
@@ -2000,21 +2280,18 @@ dojo.mixin(dijit,
 		// summary:
 		//		Sets the role on an element.
 		// description:
-		//		In other than FF2 replace existing role attribute with new role.
-		//		FF3 supports XHTML and ARIA roles so    
-		//		if elem already has an XHTML role, append this role to XHTML role 
+		//		Replace existing role attribute with new role.
+		//		If elem already has an XHTML role, append this role to XHTML role
 		//		and remove other ARIA roles.
-		//		On Firefox 2 and below, "wairole:" is
-		//		prepended to the provided role value.
 
 		var curRole = dojo.attr(elem, "role") || "";
-		if(dojo.isFF < 3 || !this._XhtmlRoles.test(curRole)){
-			dojo.attr(elem, "role", dojo.isFF < 3 ? "wairole:" + role : role);
+		if(!this._XhtmlRoles.test(curRole)){
+			dojo.attr(elem, "role", role);
 		}else{
 			if((" "+ curRole +" ").indexOf(" " + role + " ") < 0){
 				var clearXhtml = dojo.trim(curRole.replace(this._XhtmlRoles, ""));
-				var cleanRole = dojo.trim(curRole.replace(clearXhtml, ""));	 
-         		dojo.attr(elem, "role", cleanRole + (cleanRole ? ' ' : '') + role);
+				var cleanRole = dojo.trim(curRole.replace(clearXhtml, ""));
+				dojo.attr(elem, "role", cleanRole + (cleanRole ? ' ' : '') + role);
 			}
 		}
 	},
@@ -2024,14 +2301,13 @@ dojo.mixin(dijit,
 		//		Removes the specified non-XHTML role from an element.
 		// 		Removes role attribute if no specific role provided (for backwards compat.)
 
-		var roleValue = dojo.attr(elem, "role"); 
+		var roleValue = dojo.attr(elem, "role");
 		if(!roleValue){ return; }
 		if(role){
-			var searchRole = dojo.isFF < 3 ? "wairole:" + role : role;
-			var t = dojo.trim((" " + roleValue + " ").replace(" " + searchRole + " ", " "));
+			var t = dojo.trim((" " + roleValue + " ").replace(" " + role + " ", " "));
 			dojo.attr(elem, "role", t);
 		}else{
-			elem.removeAttribute("role");	
+			elem.removeAttribute("role");
 		}
 	},
 
@@ -2039,16 +2315,11 @@ dojo.mixin(dijit,
 		// 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.
+		//		Checks for an attribute called "aria-"+state.
 		// returns:
 		//		true if elem has a value for the given state and
 		//		false if it does not.
-		if(dojo.isFF < 3){
-			return elem.hasAttributeNS("http://www.w3.org/2005/07/aaa", state);
-		}
+
 		return elem.hasAttribute ? elem.hasAttribute("aria-"+state) : !!elem.getAttribute("aria-"+state);
 	},
 
@@ -2056,16 +2327,11 @@ dojo.mixin(dijit,
 		// 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.
+		//		Checks for an attribute called "aria-"+state.
 		// returns:
 		//		The value of the requested state on elem
 		//		or an empty string if elem has no value for state.
-		if(dojo.isFF < 3){
-			return elem.getAttributeNS("http://www.w3.org/2005/07/aaa", state);
-		}
+
 		return elem.getAttribute("aria-"+state) || "";
 	},
 
@@ -2073,31 +2339,18 @@ dojo.mixin(dijit,
 		// 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 < 3){
-			elem.setAttributeNS("http://www.w3.org/2005/07/aaa",
-				"aaa:"+state, value);
-		}else{
-			elem.setAttribute("aria-"+state, value);
-		}
+		//		Sets an attribute called "aria-"+state.
+
+		elem.setAttribute("aria-"+state, value);
 	},
 
 	removeWaiState: function(/*Element*/ elem, /*String*/ state){
 		// summary:
 		//		Removes a state from an element.
 		// description:
-		//		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 < 3){
-			elem.removeAttributeNS("http://www.w3.org/2005/07/aaa", state);
-		}else{
-			elem.removeAttribute("aria-"+state);
-		}
+		//		Sets an attribute called "aria-"+state.
+
+		elem.removeAttribute("aria-"+state);
 	}
 });
 
@@ -2125,8 +2378,11 @@ dojo.provide("dijit._Widget");
 
 dojo.require( "dijit._base" );
 
-dojo.connect(dojo, "connect", 
-	function(/*Widget*/ widget, /*String*/ event){
+
+// This code is to assist deferring dojo.connect() calls in widgets (connecting to events on the widgets'
+// DOM nodes) until someone actually needs to monitor that event.
+dojo.connect(dojo, "_connect",
+	function(/*dijit._Widget*/ widget, /*String*/ event){
 		if(widget && dojo.isFunction(widget._onConnect)){
 			widget._onConnect(event);
 		}
@@ -2134,27 +2390,53 @@ dojo.connect(dojo, "connect",
 
 dijit._connectOnUseEventHandler = function(/*Event*/ event){};
 
+// Keep track of where the last keydown event was, to help avoid generating
+// spurious ondijitclick events when:
+// 1. focus is on a <button> or <a>
+// 2. user presses then releases the ENTER key
+// 3. onclick handler fires and shifts focus to another node, with an ondijitclick handler
+// 4. onkeyup event fires, causing the ondijitclick handler to fire
+dijit._lastKeyDownNode = null;
+if(dojo.isIE){
+	(function(){
+		var keydownCallback = function(evt){
+			dijit._lastKeyDownNode = evt.srcElement;
+		};
+		dojo.doc.attachEvent('onkeydown', keydownCallback);
+		dojo.addOnWindowUnload(function(){
+			dojo.doc.detachEvent('onkeydown', keydownCallback);
+		});
+	})();
+}else{
+	dojo.doc.addEventListener('keydown', function(evt){
+		dijit._lastKeyDownNode = evt.target;
+	}, true);
+}
+
 (function(){
 
-var _attrReg = {};
-var getAttrReg = function(dc){
-	if(!_attrReg[dc]){
-		var r = [];
-		var attrs;
-		var proto = dojo.getObject(dc).prototype;
-		for(var fxName in proto){
-			if(dojo.isFunction(proto[fxName]) && (attrs = fxName.match(/^_set([a-zA-Z]*)Attr$/)) && attrs[1]){
-				r.push(attrs[1].charAt(0).toLowerCase() + attrs[1].substr(1));
+var _attrReg = {},	// cached results from getSetterAttributes
+	getSetterAttributes = function(widget){
+		// summary:
+		//		Returns list of attributes with custom setters for specified widget
+		var dc = widget.declaredClass;
+		if(!_attrReg[dc]){
+			var r = [],
+				attrs,
+				proto = widget.constructor.prototype;
+			for(var fxName in proto){
+				if(dojo.isFunction(proto[fxName]) && (attrs = fxName.match(/^_set([a-zA-Z]*)Attr$/)) && attrs[1]){
+					r.push(attrs[1].charAt(0).toLowerCase() + attrs[1].substr(1));
+				}
 			}
-		}
-		_attrReg[dc] = r;
-	}
-	return _attrReg[dc]||[];
-}
+			_attrReg[dc] = r;
+		}
+		return _attrReg[dc] || [];	// String[]
+	};
 
 dojo.declare("dijit._Widget", null, {
 	// summary:
-	//		Base class for all dijit widgets. 	
+	//		Base class for all Dijit widgets.
 
 	// id: [const] String
 	//		A unique, opaque ID string that can be assigned by users or by the
@@ -2186,11 +2468,22 @@ dojo.declare("dijit._Widget", null, {
 	style: "",
 
 	// title: String
-	//		HTML title attribute, used to specify the title of tabs, accordion panes, etc.
+	//		HTML title attribute.
+	//
+	//		For form widgets this specifies a tooltip to display when hovering over
+	//		the widget (just like the native HTML title attribute).
+	//
+	//		For TitlePane or for when this widget is a child of a TabContainer, AccordionContainer,
+	//		etc., it's used to specify the tab label, accordion pane title, etc.
 	title: "",
 
+	// tooltip: String
+	//		When this widget's title attribute is used to for a tab label, accordion pane title, etc.,
+	//		this specifies the tooltip to appear when the mouse is hovered over that text.
+	tooltip: "",
+
 	// srcNodeRef: [readonly] DomNode
-	//		pointer to original dom node
+	//		pointer to original DOM node
 	srcNodeRef: null,
 
 	// domNode: [readonly] DomNode
@@ -2201,21 +2494,21 @@ dojo.declare("dijit._Widget", null, {
 	domNode: null,
 
 	// containerNode: [readonly] DomNode
-	//		Designates where children of the source dom node will be placed.
-	//		"Children" in this case refers to both dom nodes and widgets.
+	//		Designates where children of the source DOM node will be placed.
+	//		"Children" in this case refers to both DOM nodes and widgets.
 	//		For example, for myWidget:
 	//
 	//		|	<div dojoType=myWidget>
-	//		|		<b> here's a plain dom node
+	//		|		<b> here's a plain DOM node
 	//		|		<span dojoType=subWidget>and a widget</span>
-	//		|		<i> and another plain dom node </i>
+	//		|		<i> and another plain DOM node </i>
 	//		|	</div>
 	//
 	//		containerNode would point to:
 	//
-	//		|		<b> here's a plain dom node
+	//		|		<b> here's a plain DOM node
 	//		|		<span dojoType=subWidget>and a widget</span>
-	//		|		<i> and another plain dom node </i>
+	//		|		<i> and another plain DOM node </i>
 	//
 	//		In templated widgets, "containerNode" is set via a
 	//		dojoAttachPoint assignment.
@@ -2225,10 +2518,16 @@ dojo.declare("dijit._Widget", null, {
 	//		is null for widgets that don't, like TextBox.
 	containerNode: null,
 
+/*=====
+	// _started: Boolean
+	//		startup() has completed.
+	_started: false,
+=====*/
+
 	// attributeMap: [protected] Object
 	//		attributeMap sets up a "binding" between attributes (aka properties)
 	//		of the widget and the widget's DOM.
-	//		Changes to widget attributes listed in attributeMap will be 
+	//		Changes to widget attributes listed in attributeMap will be
 	//		reflected into the DOM.
 	//
 	//		For example, calling attr('title', 'hello')
@@ -2246,6 +2545,10 @@ dojo.declare("dijit._Widget", null, {
 	//	|		title: { node: "titleNode", type: "innerHTML" }
 	//		Maps this.title to this.titleNode.innerHTML
 	//
+	//		- DOM node innerText
+	//	|		title: { node: "titleNode", type: "innerText" }
+	//		Maps this.title to this.titleNode.innerText
+	//
 	//		- DOM node CSS class
 	// |		myClass: { node: "domNode", type: "class" }
 	//		Maps this.myClass to this.domNode.className
@@ -2273,12 +2576,13 @@ dojo.declare("dijit._Widget", null, {
 		onMouseOver: "",
 		onMouseLeave: "",
 		onMouseEnter: "",
-		onMouseUp: ""},
+		onMouseUp: ""
+	},
 
 	onClick: dijit._connectOnUseEventHandler,
 	/*=====
 	onClick: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of mouse click events.
 		// event:
 		//		mouse Event
@@ -2289,7 +2593,7 @@ dojo.declare("dijit._Widget", null, {
 	onDblClick: dijit._connectOnUseEventHandler,
 	/*=====
 	onDblClick: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of mouse double click events.
 		// event:
 		//		mouse Event
@@ -2300,7 +2604,7 @@ dojo.declare("dijit._Widget", null, {
 	onKeyDown: dijit._connectOnUseEventHandler,
 	/*=====
 	onKeyDown: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of keys being pressed down.
 		// event:
 		//		key Event
@@ -2311,7 +2615,7 @@ dojo.declare("dijit._Widget", null, {
 	onKeyPress: dijit._connectOnUseEventHandler,
 	/*=====
 	onKeyPress: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of printable keys being typed.
 		// event:
 		//		key Event
@@ -2322,7 +2626,7 @@ dojo.declare("dijit._Widget", null, {
 	onKeyUp: dijit._connectOnUseEventHandler,
 	/*=====
 	onKeyUp: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of keys being released.
 		// event:
 		//		key Event
@@ -2333,7 +2637,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseDown: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseDown: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse button is pressed down.
 		// event:
 		//		mouse Event
@@ -2344,7 +2648,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseMove: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseMove: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse moves over nodes contained within this widget.
 		// event:
 		//		mouse Event
@@ -2355,7 +2659,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseOut: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseOut: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse moves off of nodes contained within this widget.
 		// event:
 		//		mouse Event
@@ -2366,7 +2670,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseOver: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseOver: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse moves onto nodes contained within this widget.
 		// event:
 		//		mouse Event
@@ -2377,7 +2681,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseLeave: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseLeave: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse moves off of this widget.
 		// event:
 		//		mouse Event
@@ -2388,7 +2692,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseEnter: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseEnter: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse moves onto this widget.
 		// event:
 		//		mouse Event
@@ -2399,7 +2703,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseUp: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseUp: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse button is released.
 		// event:
 		//		mouse Event
@@ -2409,10 +2713,11 @@ dojo.declare("dijit._Widget", null, {
 	=====*/
 
 	// Constants used in templates
-	
-	// _blankGif: [protected] URL
-	//		Used by <img> nodes in templates that really get there image via CSS background-image
-	_blankGif: (dojo.config.blankGif || dojo.moduleUrl("dojo", "resources/blank.gif")),
+
+	// _blankGif: [protected] String
+	//		Path to a blank 1x1 image.
+	//		Used by <img> nodes in templates that really get their image via CSS background-image.
+	_blankGif: (dojo.config.blankGif || dojo.moduleUrl("dojo", "resources/blank.gif")).toString(),
 
 	//////////// INITIALIZATION METHODS ///////////////////////////////////////
 
@@ -2432,45 +2737,33 @@ dojo.declare("dijit._Widget", null, {
 		//		scalar values (like title, duration etc.) and functions,
 		//		typically callbacks like onClick.
 		// srcNodeRef:
-		//		If a srcNodeRef (dom node) is specified:
+		//		If a srcNodeRef (DOM node) is specified:
 		//			- use srcNodeRef.innerHTML as my contents
 		//			- if this is a behavioral widget then apply behavior
-		//			  to that srcNodeRef 
+		//			  to that srcNodeRef
 		//			- otherwise, replace srcNodeRef with my generated DOM
 		//			  tree
 		// 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:
+		//		Create calls a number of widget methods (postMixInProperties, buildRendering, postCreate,
+		//		etc.), some of which of you'll want to override. See http://docs.dojocampus.org/dijit/_Widget
+		//		for a discussion of the widget creation lifecycle.
 		//
-		// * 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
+		//		Of course, adventurous developers could override create entirely, but this should
+		//		only be done as a last resort.
 		// tags:
 		//		private
 
-		// store pointer to original dom tree
+		// store pointer to original DOM tree
 		this.srcNodeRef = dojo.byId(srcNodeRef);
 
 		// For garbage collection.  An array of handles returned by Widget.connect()
 		// Each handle returned from Widget.connect() is an array of handles from dojo.connect()
 		this._connects = [];
 
+		// For garbage collection.  An array of handles returned by Widget.subscribe()
+		// The handle returned from Widget.subscribe() is the handle returned from dojo.subscribe()
+		this._subscribes = [];
+
 		// To avoid double-connects, remove entries from _deferredConnects
 		// that have been setup manually by a subclass (ex, by dojoAttachEvent).
 		// If a subclass has redefined a callback (ex: onClick) then assume it's being
@@ -2514,12 +2807,12 @@ dojo.declare("dijit._Widget", null, {
 
 			// If the developer has specified a handler as a widget parameter
 			// (ex: new Button({onClick: ...})
-			// then naturally need to connect from dom node to that handler immediately, 
+			// then naturally need to connect from DOM node to that handler immediately,
 			for(attr in this.params){
 				this._onConnect(attr);
 			}
 		}
-		
+
 		if(this.domNode){
 			this.domNode.setAttribute("widgetId", this.id);
 		}
@@ -2528,7 +2821,7 @@ dojo.declare("dijit._Widget", null, {
 		// If srcNodeRef has been processed and removed from the DOM (e.g. TemplatedWidget) then delete it to allow GC.
 		if(this.srcNodeRef && !this.srcNodeRef.parentNode){
 			delete this.srcNodeRef;
-		}	
+		}
 
 		this._created = true;
 	},
@@ -2548,14 +2841,18 @@ dojo.declare("dijit._Widget", null, {
 		// tags:
 		//		private
 		var condAttrApply = function(attr, scope){
-			if( (scope.params && attr in scope.params) || scope[attr]){
+			if((scope.params && attr in scope.params) || scope[attr]){
 				scope.attr(attr, scope[attr]);
 			}
 		};
+
+		// Do the attributes in attributeMap
 		for(var attr in this.attributeMap){
 			condAttrApply(attr, this);
 		}
-		dojo.forEach(getAttrReg(this.declaredClass), function(a){
+
+		// And also any attributes with custom setters
+		dojo.forEach(getSetterAttributes(this), function(a){
 			if(!(a in this.attributeMap)){
 				condAttrApply(a, this);
 			}
@@ -2574,8 +2871,9 @@ dojo.declare("dijit._Widget", null, {
 
 	buildRendering: function(){
 		// summary:
-		//		Construct the UI for this widget, setting this.domNode.  Most
-		//		widgets will mixin `dijit._Templated`, which implements this
+		//		Construct the UI for this widget, setting this.domNode
+		// description:
+		//		Most widgets will mixin `dijit._Templated`, which implements this
 		//		method.
 		// tags:
 		//		protected
@@ -2584,15 +2882,21 @@ dojo.declare("dijit._Widget", null, {
 
 	postCreate: function(){
 		// summary:
-		//		Called after a widget's dom has been setup
+		//		Processing after the DOM fragment is created
+		// description:
+		//		Called after the DOM fragment has been created, but not necessarily
+		//		added to the document.  Do not include any operations which rely on
+		//		node dimensions or placement.
 		// tags:
 		//		protected
 	},
 
 	startup: function(){
 		// summary:
-		//		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.
+		//		Processing after the DOM fragment is added to the document
+		// description:
+		//		Called after a widget and its children have been created and added to the page,
+		//		and all related widgets have finished their create() cycle, up through postCreate().
 		//		This is useful for composite widgets that need to control or layout sub-widgets.
 		//		Many layout widgets can use this as a wiring phase.
 		this._started = true;
@@ -2602,15 +2906,17 @@ dojo.declare("dijit._Widget", null, {
 
 	destroyRecursive: function(/*Boolean?*/ preserveDom){
 		// 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.
+		// 		Destroy this widget and its descendants
+		// description:
+		//		This is the generic "destructor" function that all widget users
+		// 		should call to cleanly discard with a widget. Once a widget is
+		// 		destroyed, it is removed from the manager object.
 		// preserveDom:
-		//		If true, this method will leave the original Dom structure
+		//		If true, this method will leave the original DOM structure
 		//		alone of descendant Widgets. Note: This will NOT work with
 		//		dijit._Templated widgets.
 
+		this._beingDestroyed = true;
 		this.destroyDescendants(preserveDom);
 		this.destroy(preserveDom);
 	},
@@ -2618,34 +2924,44 @@ dojo.declare("dijit._Widget", null, {
 	destroy: function(/*Boolean*/ preserveDom){
 		// summary:
 		// 		Destroy this widget, but not its descendants.
-		//		Will, however, destroy internal widgets such as those used within a template.
+		//		This method will, however, destroy internal widgets such as those used within a template.
 		// preserveDom: Boolean
-		//		If true, this method will leave the original Dom structure alone.
+		//		If true, this method will leave the original DOM structure alone.
 		//		Note: This will not yet work with _Templated widgets
 
+		this._beingDestroyed = true;
 		this.uninitialize();
-		dojo.forEach(this._connects, function(array){
-			dojo.forEach(array, dojo.disconnect);
+		var d = dojo,
+			dfe = d.forEach,
+			dun = d.unsubscribe;
+		dfe(this._connects, function(array){
+			dfe(array, d.disconnect);
+		});
+		dfe(this._subscribes, function(handle){
+			dun(handle);
 		});
 
 		// destroy widgets created as part of template, etc.
-		dojo.forEach(this._supportingWidgets||[], function(w){ 
-			if(w.destroy){
+		dfe(this._supportingWidgets || [], function(w){
+			if(w.destroyRecursive){
+				w.destroyRecursive();
+			}else if(w.destroy){
 				w.destroy();
 			}
 		});
-		
+
 		this.destroyRendering(preserveDom);
 		dijit.registry.remove(this.id);
+		this._destroyed = true;
 	},
 
 	destroyRendering: function(/*Boolean?*/ preserveDom){
 		// summary:
 		//		Destroys the DOM nodes associated with this widget
 		// preserveDom:
-		//		If true, this method will leave the original Dom structure alone
+		//		If true, this method will leave the original DOM structure alone
 		//		during tear-down. Note: this will not work with _Templated
-		//		widgets yet. 
+		//		widgets yet.
 		// tags:
 		//		protected
 
@@ -2681,7 +2997,7 @@ dojo.declare("dijit._Widget", null, {
 		//		widgets.
 
 		// get all direct descendants and destroy them recursively
-		dojo.forEach(this.getChildren(), function(widget){ 
+		dojo.forEach(this.getChildren(), function(widget){
 			if(widget.destroyRecursive){
 				widget.destroyRecursive(preserveDom);
 			}
@@ -2747,7 +3063,7 @@ dojo.declare("dijit._Widget", null, {
 		// tags:
 		//		private
 		if(event in this._deferredConnects){
-			var mapNode = this[this._deferredConnects[event]||'domNode'];
+			var mapNode = this[this._deferredConnects[event] || 'domNode'];
 			this.connect(mapNode, event.toLowerCase(), event);
 			delete this._deferredConnects[event];
 		}
@@ -2758,7 +3074,7 @@ dojo.declare("dijit._Widget", null, {
 		//		Custom setter for the CSS "class" attribute
 		// tags:
 		//		protected
-		var mapNode = this[this.attributeMap["class"]||'domNode'];
+		var mapNode = this[this.attributeMap["class"] || 'domNode'];
 		dojo.removeClass(mapNode, this["class"])
 		this["class"] = value;
 		dojo.addClass(mapNode, value);
@@ -2775,8 +3091,8 @@ dojo.declare("dijit._Widget", null, {
 		// tags:
 		//		protected
 
-		var mapNode = this[this.attributeMap["style"]||'domNode'];
-		
+		var mapNode = this[this.attributeMap.style || 'domNode'];
+
 		// Note: technically we should revert any style setting made in a previous call
 		// to his method, but that's difficult to keep track of.
 
@@ -2790,7 +3106,7 @@ dojo.declare("dijit._Widget", null, {
 			}
 		}
 
-		this["style"] = value;
+		this.style = value;
 	},
 
 	setAttribute: function(/*String*/ attr, /*anything*/ value){
@@ -2801,7 +3117,7 @@ dojo.declare("dijit._Widget", null, {
 		dojo.deprecated(this.declaredClass+"::setAttribute() is deprecated. Use attr() instead.", "", "2.0");
 		this.attr(attr, value);
 	},
-	
+
 	_attrToDom: function(/*String*/ attr, /*String*/ value){
 		// summary:
 		//		Reflect a widget attribute (title, tabIndex, duration etc.) to
@@ -2816,21 +3132,29 @@ dojo.declare("dijit._Widget", null, {
 		//		private
 
 		var commands = this.attributeMap[attr];
-		dojo.forEach( dojo.isArray(commands) ? commands : [commands], function(command){
+		dojo.forEach(dojo.isArray(commands) ? commands : [commands], function(command){
 
 			// Get target node and what we are doing to that node
 			var mapNode = this[command.node || command || "domNode"];	// DOM node
-			var type = command.type || "attribute";	// class, innerHTML, or attribute
-	
+			var type = command.type || "attribute";	// class, innerHTML, innerText, or attribute
+
 			switch(type){
 				case "attribute":
 					if(dojo.isFunction(value)){ // functions execute in the context of the widget
 						value = dojo.hitch(this, value);
 					}
-					if(/^on[A-Z][a-zA-Z]*$/.test(attr)){ // eg. onSubmit needs to be onsubmit
-						attr = attr.toLowerCase();
-					}
-					dojo.attr(mapNode, attr, value);
+
+					// Get the name of the DOM node attribute; usually it's the same
+					// as the name of the attribute in the widget (attr), but can be overridden.
+					// Also maps handler names to lowercase, like onSubmit --> onsubmit
+					var attrName = command.attribute ? command.attribute :
+						(/^on[A-Z][a-zA-Z]*$/.test(attr) ? attr.toLowerCase() : attr);
+
+					dojo.attr(mapNode, attrName, value);
+					break;
+				case "innerText":
+					mapNode.innerHTML = "";
+					mapNode.appendChild(dojo.doc.createTextNode(value));
 					break;
 				case "innerHTML":
 					mapNode.innerHTML = value;
@@ -2845,7 +3169,7 @@ dojo.declare("dijit._Widget", null, {
 	},
 
 	attr: function(/*String|Object*/name, /*Object?*/value){
-		//	summary:
+		// summary:
 		//		Set or get properties on a widget instance.
 		//	name:
 		//		The property to get or set. If an object is passed here and not
@@ -2854,7 +3178,7 @@ dojo.declare("dijit._Widget", null, {
 		//	value:
 		//		Optional. If provided, attr() operates as a setter. If omitted,
 		//		the current value of the named property is returned.
-		//	description:
+		// description:
 		//		Get or set named properties on a widget. If no value is
 		//		provided, the current value of the attribute is returned,
 		//		potentially via a getter method. If a value is provided, then
@@ -2877,7 +3201,7 @@ dojo.declare("dijit._Widget", null, {
 		//		will do
 		//	|	myTitlePane.title = "Howdy!";
 		//	|	myTitlePane.title.innerHTML = "Howdy!";
-		//		It works for dom node attributes too.  Calling
+		//		It works for DOM node attributes too.  Calling
 		//	|	widget.attr("disabled", true)
 		//		will set the disabled attribute on the widget's focusNode,
 		//		among other housekeeping for a change in disabled state.
@@ -2893,10 +3217,11 @@ dojo.declare("dijit._Widget", null, {
 			return this;
 		}
 		var names = this._getAttrNames(name);
-		if(args == 2){ // setter
+		if(args >= 2){ // setter
 			if(this[names.s]){
 				// use the explicit setter
-				return this[names.s](value) || this;
+				args = dojo._toArray(arguments, 1);
+				return this[names.s].apply(this, args) || this;
 			}else{
 				// if param is specified as DOM node attribute, copy it
 				if(name in this.attributeMap){
@@ -2908,11 +3233,7 @@ dojo.declare("dijit._Widget", null, {
 			}
 			return this;
 		}else{ // getter
-			if(this[names.g]){
-				return this[names.g]();
-			}else{
-				return this[name];
-			}
+			return this[names.g] ? this[names.g]() : this[name];
 		}
 	},
 
@@ -2927,45 +3248,37 @@ dojo.declare("dijit._Widget", null, {
 		var apn = this._attrPairNames;
 		if(apn[name]){ return apn[name]; }
 		var uc = name.charAt(0).toUpperCase() + name.substr(1);
-		return apn[name] = {
+		return (apn[name] = {
 			n: name+"Node",
 			s: "_set"+uc+"Attr",
 			g: "_get"+uc+"Attr"
-		};
+		});
 	},
 
 	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
+		//		Returns a string that represents the widget
+		// description:
+		//		When a widget is cast to a string, this method will be used to generate the
+		//		output. Currently, it does not implement any sort of reversible
 		//		serialization.
 		return '[Widget ' + this.declaredClass + ', ' + (this.id || 'NO ID') + ']'; // String
 	},
 
 	getDescendants: function(){
 		// summary:
-		//		Returns all the widgets that contained by this, i.e., all widgets underneath this.containerNode.
+		//		Returns all the widgets contained by this, i.e., all widgets underneath this.containerNode.
 		//		This method should generally be avoided as it returns widgets declared in templates, which are
 		//		supposed to be internal/hidden, but it's left here for back-compat reasons.
 
-		if(this.containerNode){
-			var list = dojo.query('[widgetId]', this.containerNode);
-			return list.map(dijit.byNode);		// Array
-		}else{
-			return [];
-		}
+		return this.containerNode ? dojo.query('[widgetId]', this.containerNode).map(dijit.byNode) : []; // dijit._Widget[]
 	},
 
 	getChildren: function(){
 		// summary:
 		//		Returns all the widgets contained by this, i.e., all widgets underneath this.containerNode.
 		//		Does not return nested widgets, nor widgets that are part of this widget's template.
-		if(this.containerNode){
-			return dijit.findWidgets(this.containerNode);
-		}else{
-			return [];
-		}
+		return this.containerNode ? dijit.findWidgets(this.containerNode) : []; // dijit._Widget[]
 	},
 
 	// nodesWithKeyClick: [private] String[]
@@ -2984,68 +3297,67 @@ dojo.declare("dijit._Widget", null, {
 		//		Provide widget-specific analog to dojo.connect, except with the
 		//		implicit use of this widget as the target object.
 		//		This version of connect also provides a special "ondijitclick"
-		//		event which triggers on a click or space-up, enter-down in IE
-		//		or enter press in FF (since often can't cancel enter onkeydown
-		//		in FF)
+		//		event which triggers on a click or space or enter keyup
+		// returns:
+		//		A handle that can be passed to `disconnect` in order to disconnect before
+		//		the widget is destroyed.
 		// example:
 		//	|	var btn = new dijit.form.Button();
 		//	|	// when foo.bar() is called, call the listener we're going to
 		//	|	// provide in the scope of btn
-		//	|	btn.connect(foo, "bar", function(){ 
-		//	|		
+		//	|	btn.connect(foo, "bar", function(){
+		//	|		console.debug(this.toString());
 		//	|	});
 		// tags:
 		//		protected
 
-		var d = dojo;
-		var dc = dojo.connect;
-		var handles =[];
+		var d = dojo,
+			dc = d._connect,
+			handles = [];
 		if(event == "ondijitclick"){
 			// add key based click activation for unsupported nodes.
-			if(!this.nodesWithKeyClick[obj.nodeName]){
+			// do all processing onkey up to prevent spurious clicks
+			// for details see comments at top of this file where _lastKeyDownNode is defined
+			if(!this.nodesWithKeyClick[obj.tagName.toLowerCase()]){
 				var m = d.hitch(this, method);
 				handles.push(
 					dc(obj, "onkeydown", this, function(e){
-						if(!d.isFF && e.keyCode == d.keys.ENTER &&
+						//console.log(this.id + ": onkeydown, e.target = ", e.target, ", lastKeyDownNode was ", dijit._lastKeyDownNode, ", equality is ", (e.target === dijit._lastKeyDownNode));
+						if((e.keyCode == d.keys.ENTER || e.keyCode == d.keys.SPACE) &&
 							!e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey){
-							return m(e);
-						}else if(e.keyCode == d.keys.SPACE){
-							// stop space down as it causes IE to scroll
-							// the browser window
-							d.stopEvent(e);
+							// needed on IE for when focus changes between keydown and keyup - otherwise dropdown menus do not work
+							dijit._lastKeyDownNode = e.target;
+							d.stopEvent(e);		// stop event to prevent scrolling on space key in IE
 						}
 			 		}),
 					dc(obj, "onkeyup", this, function(e){
-						if(e.keyCode == d.keys.SPACE && 
-							!e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey){ return m(e); }
+						//console.log(this.id + ": onkeyup, e.target = ", e.target, ", lastKeyDownNode was ", dijit._lastKeyDownNode, ", equality is ", (e.target === dijit._lastKeyDownNode));
+						if( (e.keyCode == d.keys.ENTER || e.keyCode == d.keys.SPACE) &&
+							e.target === dijit._lastKeyDownNode &&
+							!e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey){
+								//need reset here or have problems in FF when focus returns to trigger element after closing popup/alert
+								dijit._lastKeyDownNode = null;
+								return m(e);
+						}
 					})
 				);
-			 	if(d.isFF){
-					handles.push(
-						dc(obj, "onkeypress", this, function(e){
-							if(e.keyCode == d.keys.ENTER &&
-								!e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey){ return m(e); }
-						})
-					);
-			 	}
 			}
 			event = "onclick";
 		}
 		handles.push(dc(obj, event, this, method));
 
-		// return handles for FormElement and ComboBox
 		this._connects.push(handles);
-		return handles;
+		return handles;		// _Widget.Handle
 	},
 
-	disconnect: function(/*Object*/ handles){
+	disconnect: function(/* _Widget.Handle */ handles){
 		// summary:
-		//		Disconnects handle created by this.connect.
-		//		Also removes handle from this widget's list of connects
+		//		Disconnects handle created by `connect`.
+		//		Also removes handle from this widget's list of connects.
 		// tags:
 		//		protected
 		for(var i=0; i<this._connects.length; i++){
-			if(this._connects[i]==handles){
+			if(this._connects[i] == handles){
 				dojo.forEach(handles, dojo.disconnect);
 				this._connects.splice(i, 1);
 				return;
@@ -3053,6 +3365,43 @@ dojo.declare("dijit._Widget", null, {
 		}
 	},
 
+	subscribe: function(
+			/*String*/ topic,
+			/*String|Function*/ method){
+		// summary:
+		//		Subscribes to the specified topic and calls the specified method
+		//		of this object and registers for unsubscribe() on widget destroy.
+		// description:
+		//		Provide widget-specific analog to dojo.subscribe, except with the
+		//		implicit use of this widget as the target object.
+		// example:
+		//	|	var btn = new dijit.form.Button();
+		//	|	// when /my/topic is published, this button changes its label to
+		//	|   // be the parameter of the topic.
+		//	|	btn.subscribe("/my/topic", function(v){
+		//	|		this.attr("label", v);
+		//	|	});
+		var d = dojo,
+			handle = d.subscribe(topic, this, method);
+
+		// return handles for Any widget that may need them
+		this._subscribes.push(handle);
+		return handle;
+	},
+
+	unsubscribe: function(/*Object*/ handle){
+		// summary:
+		//		Unsubscribes handle created by this.subscribe.
+		//		Also removes handle from this widget's list of subscriptions
+		for(var i=0; i<this._subscribes.length; i++){
+			if(this._subscribes[i] == handle){
+				dojo.unsubscribe(handle);
+				this._subscribes.splice(i, 1);
+				return;
+			}
+		}
+	},
+
 	isLeftToRight: function(){
 		// summary:
 		//		Checks the page for text direction
@@ -3067,7 +3416,7 @@ dojo.declare("dijit._Widget", null, {
 		//		and false if not
 		return this.focus && (dojo.style(this.domNode, "display") != "none");
 	},
-	
+
 	placeAt: function(/* String|DomNode|_Widget */reference, /* String?|Int? */position){
 		// summary:
 		//		Place this widget's domNode reference somewhere in the DOM based
@@ -3079,29 +3428,30 @@ dojo.declare("dijit._Widget", null, {
 		//		shorthand mechanism to put an existing (or newly created) Widget
 		//		somewhere in the dom, and allow chaining.
 		//
-		// reference: 
-		//		The String id of a domNode, a domNode reference, or a reference to a Widget posessing 
+		// reference:
+		//		The String id of a domNode, a domNode reference, or a reference to a Widget posessing
 		//		an addChild method.
 		//
-		// position: 
+		// position:
 		//		If passed a string or domNode reference, the position argument
-		//		accepts a string just as dojo.place does, one of: "first", "last", 
-		//		"before", or "after". 
+		//		accepts a string just as dojo.place does, one of: "first", "last",
+		//		"before", or "after".
 		//
-		//		If passed a _Widget reference, and that widget reference has an ".addChild" method, 
+		//		If passed a _Widget reference, and that widget reference has an ".addChild" method,
 		//		it will be called passing this widget instance into that method, supplying the optional
 		//		position index passed.
 		//
-		// returns: dijit._Widget
-		//		Provides a useful return of the newly created dijit._Widget instance so you 
+		// returns:
+		//		dijit._Widget
+		//		Provides a useful return of the newly created dijit._Widget instance so you
 		//		can "chain" this function by instantiating, placing, then saving the return value
-		//		to a variable. 
+		//		to a variable.
 		//
 		// example:
 		// | 	// create a Button with no srcNodeRef, and place it in the body:
 		// | 	var button = new dijit.form.Button({ label:"click" }).placeAt(dojo.body());
 		// | 	// now, 'button' is still the widget reference to the newly created button
-		// | 	dojo.connect(button, "onClick", function(e){  });
+		// | 	dojo.connect(button, "onClick", function(e){ console.log('click'); });
 		//
 		// example:
 		// |	// create a button out of a node with id="src" and append it to id="wrapper":
@@ -3111,19 +3461,47 @@ dojo.declare("dijit._Widget", null, {
 		// |	// place a new button as the first element of some div
 		// |	var button = new dijit.form.Button({ label:"click" }).placeAt("wrapper","first");
 		//
-		// example: 
+		// example:
 		// |	// create a contentpane and add it to a TabContainer
 		// |	var tc = dijit.byId("myTabs");
 		// |	new dijit.layout.ContentPane({ href:"foo.html", title:"Wow!" }).placeAt(tc)
 
-		if(reference["declaredClass"] && reference["addChild"]){
+		if(reference.declaredClass && reference.addChild){
 			reference.addChild(this, position);
 		}else{
 			dojo.place(this.domNode, reference, position);
 		}
 		return this;
-	}
+	},
+
+	_onShow: function(){
+		// summary:
+		//		Internal method called when this widget is made visible.
+		//		See `onShow` for details.
+		this.onShow();
+	},
+
+	onShow: function(){
+		// summary:
+		//		Called when this widget becomes the selected pane in a
+		//		`dijit.layout.TabContainer`, `dijit.layout.StackContainer`,
+		//		`dijit.layout.AccordionContainer`, etc.
+		//
+		//		Also called to indicate display of a `dijit.Dialog`, `dijit.TooltipDialog`, or `dijit.TitlePane`.
+		// tags:
+		//		callback
+	},
 
+	onHide: function(){
+		// summary:
+			//		Called when another widget becomes the selected pane in a
+			//		`dijit.layout.TabContainer`, `dijit.layout.StackContainer`,
+			//		`dijit.layout.AccordionContainer`, etc.
+			//
+			//		Also called to indicate hide of a `dijit.Dialog`, `dijit.TooltipDialog`, or `dijit.TitlePane`.
+			// tags:
+			//		callback
+	}
 });
 
 })();
@@ -3672,8 +4050,10 @@ dojo.provide("dojox.gfx._base");
 	// candidate for dojox.html.metrics
 
 	var measuringNode = null, empty = {};
-	b._getTextBox = function(/* String */ text, /* Object */ style, /* String? */ className){
-		var m, s;
+	b._getTextBox = function(	/*String*/ text,
+								/*Object*/ style,
+								/*String?*/ className){
+		var m, s, al = arguments.length;
 		if(!measuringNode){
 			m = measuringNode = dojo.doc.createElement("div");
 			s = m.style;
@@ -3692,19 +4072,25 @@ dojo.provide("dojox.gfx._base");
 		s.padding = "0";
 		s.outline = "0";
 		// set new style
-		if(arguments.length > 1 && style){
+		if(al > 1 && style){
 			for(var i in style){
 				if(i in empty){ continue; }
 				s[i] = style[i];
 			}
 		}
 		// set classes
-		if(arguments.length > 2 && className){
+		if(al > 2 && className){
 			m.className = className;
 		}
 		// take a measure
 		m.innerHTML = text;
-		return dojo.marginBox(m);
+
+		if(m["getBoundingClientRect"]){
+			var bcr = m.getBoundingClientRect();
+			return {l: bcr.left, t: bcr.top, w: bcr.width || (bcr.right - bcr.left), h: bcr.height || (bcr.bottom - bcr.top)};
+		}else{
+			return dojo.marginBox(m);
+		}
 	};
 
 	// candidate for dojo.dom
@@ -3788,7 +4174,7 @@ dojo.mixin(dojox.gfx, {
 			if(t){
 				return new t();
 			}
-			t = typeCtorCache[type] = function(){};
+			t = typeCtorCache[type] = new Function;
 			t.prototype = dojox.gfx[ "default" + type ];
 			return new t();
 		}
@@ -3864,31 +4250,36 @@ dojo.mixin(dojox.gfx, {
 		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
+		// summary:
+		//		converts a CSS font string to a font object
+		// description:
+		//		Converts a CSS font string to a gfx font object. The CSS font
+		//		string components should follow the W3C specified order
+		//		(see http://www.w3.org/TR/CSS2/fonts.html#font-shorthand):
+		//		style, variant, weight, size, optional line height (will be
+		//		ignored), and family.
+		// str: String
+		//		a CSS font string
 		var font = dojox.gfx.getDefault("Font");
 		var t = str.split(/\s+/);
 		do{
 			if(t.length < 5){ break; }
-			font.style  = t[0];
-			font.varian = t[1];
-			font.weight = t[2];
+			font.style   = t[0];
+			font.variant = 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) == "/"){
+				}else if(t[4].charAt(0) == "/"){
 					j = 5;
-					break;
 				}
 			}
-			if(j + 3 > t.length){ break; }
-			font.size = t[j];
-			font.family = t[j + 1];
+			if(j < t.length){
+				font.family = t.slice(j).join(" ");
+			}
 		}while(false);
 		return font;	// Object
 	},
@@ -3953,6 +4344,12 @@ dojo.loadInit(function(){
 	//has not been defined yet.
 	var gfx = dojo.getObject("dojox.gfx", true), sl, flag, match;
 	if(!gfx.renderer){
+		//Have a way to force a GFX renderer, if so desired.
+		//Useful for being able to serialize GFX data in a particular format.
+		if(dojo.config.forceGfxRenderer){
+			dojox.gfx.renderer = dojo.config.forceGfxRenderer;
+			return;
+		}
 		var renderers = (typeof dojo.config.gfxRenderer == "string" ?
 			dojo.config.gfxRenderer : "svg,vml,silverlight,canvas").split(",");
 
@@ -4028,7 +4425,7 @@ dojo.loadInit(function(){
 			if(dojox.gfx.renderer){ break; }
 		}
 		if(dojo.config.isDebug){
-			
+			console.log("gfx renderer = " + dojox.gfx.renderer);
 		}
 	}
 });
@@ -5151,7 +5548,7 @@ dojo.provide("dojox.color.Palette");
 				a: Math.min(1, Math.max(0, a))
 			}));
 		});
-		
+		console.log("The return colors are ", ret.colors, " from the original colors ", p.colors);
 		return ret;
 	}
 
@@ -5538,6 +5935,12 @@ dojo.provide("dojox.charting.Theme");
 				length:3, 
 				position:"center"
 			},	
+			microTick:	{ //	minor ticks on axis, and used for minor gridlines
+				color:"#666", 
+				width:0.5, 
+				length:1, 
+				position:"center"
+			},	
 			font: "normal normal normal 7pt Tahoma", //	labels on axis
 			fontColor:"#333"						//	color of labels
 		},
@@ -6061,7 +6464,7 @@ dojo.provide("dojox.charting.axis2d.common");
 (function(){
 	var g = dojox.gfx;
 	
-	function clearNode(s){
+	var clearNode = function(s){
 		s.marginLeft   = "0px";
 		s.marginTop    = "0px";
 		s.marginRight  = "0px";
@@ -6074,7 +6477,17 @@ dojo.provide("dojox.charting.axis2d.common");
 		s.borderTopWidth    = "0px";
 		s.borderRightWidth  = "0px";
 		s.borderBottomWidth = "0px";
-	}
+	};
+	
+	var getBoxWidth = function(n){
+		// marginBox is incredibly slow, so avoid it if we can
+		if(n["getBoundingClientRect"]){
+			var bcr = n.getBoundingClientRect();
+			return bcr.width || (bcr.right - bcr.left);
+		}else{
+			return dojo.marginBox(n).w;
+		}
+	};
 	
 	dojo.mixin(dojox.charting.axis2d.common, {
 		createText: {
@@ -6083,9 +6496,9 @@ dojo.provide("dojox.charting.axis2d.common");
 					x: x, y: y, text: text, align: align
 				}).setFont(font).setFill(fontColor);
 			},
-			html: function(chart, creator, x, y, align, text, font, fontColor){
+			html: function(chart, creator, x, y, align, text, font, fontColor, labelWidth){
 				// setup the text node
-				var p = dojo.doc.createElement("div"), s = p.style;
+				var p = dojo.doc.createElement("div"), s = p.style, boxWidth;
 				clearNode(s);
 				s.font = font;
 				p.innerHTML = String(text).replace(/\s/g, " ");
@@ -6094,22 +6507,49 @@ dojo.provide("dojox.charting.axis2d.common");
 				s.position = "absolute";
 				s.left = "-10000px";
 				dojo.body().appendChild(p);
-				var size = g.normalizedLength(g.splitFontString(font).size),
-					box = dojo.marginBox(p);
+				var size = g.normalizedLength(g.splitFontString(font).size);
+				
+				// do we need to calculate the label width?
+				if(!labelWidth){
+					boxWidth = getBoxWidth(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;
+				if(labelWidth){
+					s.width = labelWidth + "px";
+					// s.border = "1px dotted grey";
+					switch(align){
+						case "middle":
+							s.textAlign = "center";
+							s.left = (x - labelWidth / 2) + "px";
+							break;
+						case "end":
+							s.textAlign = "right";
+							s.left = (x - labelWidth) + "px";
+							break;
+						default:
+							s.left = x + "px";
+							s.textAlign = "left";
+							break;
+					}
+				}else{
+					switch(align){
+						case "middle":
+							s.left = Math.floor(x - boxWidth / 2) + "px";
+							// s.left = Math.floor(x - p.offsetWidth / 2) + "px";
+							break;
+						case "end":
+							s.left = Math.floor(x - boxWidth) + "px";
+							// s.left = Math.floor(x - p.offsetWidth) + "px";
+							break;
+						//case "start":
+						default:
+							s.left = Math.floor(x) + "px";
+							break;
+					}
 				}
 				s.top = Math.floor(y - size) + "px";
 				// setup the wrapper node
@@ -6233,24 +6673,28 @@ dojo.string.substitute = function(	/*String*/		template,
 	//		hash to search for substitutions
 	//	transform: 
 	//		a function to process all parameters before substitution takes
-	//		place, e.g. dojo.string.encodeXML
+	//		place, e.g. mylib.encodeXML
 	//	thisObject: 
 	//		where to look for optional format function; default to the global
 	//		namespace
 	//	example:
+	//		Substitutes two expressions in a string from an Array or Object
 	//	|	// returns "File 'foo.html' is not found in directory '/temp'."
+	//	|	// by providing substitution data in an Array
 	//	|	dojo.string.substitute(
 	//	|		"File '${0}' is not found in directory '${1}'.",
 	//	|		["foo.html","/temp"]
 	//	|	);
 	//	|
 	//	|	// also returns "File 'foo.html' is not found in directory '/temp'."
+	//	|	// but provides substitution data in an Object structure.  Dotted
+	//	|	// notation may be used to traverse the structure.
 	//	|	dojo.string.substitute(
 	//	|		"File '${name}' is not found in directory '${info.dir}'.",
 	//	|		{ name: "foo.html", info: { dir: "/temp" } }
 	//	|	);
 	//	example:
-	//		use a transform function to modify the values:
+	//		Use a transform function to modify the values:
 	//	|	// returns "file 'foo.html' is not found in directory '/temp'."
 	//	|	dojo.string.substitute(
 	//	|		"${0} is not found in ${1}.",
@@ -6262,7 +6706,7 @@ dojo.string.substitute = function(	/*String*/		template,
 	//	|		}
 	//	|	);
 	//	example:
-	//		use a formatter
+	//		Use a formatter
 	//	|	// returns "thinger -- howdy"
 	//	|	dojo.string.substitute(
 	//	|		"${0:postfix}", ["thinger"], null, {
@@ -6272,18 +6716,18 @@ dojo.string.substitute = function(	/*String*/		template,
 	//	|		}
 	//	|	);
 
-	thisObject = thisObject||dojo.global;
-	transform = (!transform) ? 
-					function(v){ return v; } : 
-					dojo.hitch(thisObject, transform);
+	thisObject = thisObject || dojo.global;
+	transform = transform ? 
+		dojo.hitch(thisObject, transform) : function(v){ return v; };
 
-	return template.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g, function(match, key, format){
-		var value = dojo.getObject(key, false, map);
-		if(format){
-			value = dojo.getObject(format, false, thisObject).call(thisObject, value, key);
-		}
-		return transform(value, key).toString();
-	}); // string
+	return template.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,
+		function(match, key, format){
+			var value = dojo.getObject(key, false, map);
+			if(format){
+				value = dojo.getObject(format, false, thisObject).call(thisObject, value, key);
+			}
+			return transform(value, key).toString();
+		}); // String
 };
 
 /*=====
@@ -6473,36 +6917,52 @@ dojo.provide("dojox.charting.axis2d.Default");
 		getWindowOffset: function(){
 			return "offset" in this ? this.offset : 0;
 		},
+		_groupLabelWidth: function(labels, font){
+			if(labels[0]["text"]){
+				labels = df.map(labels, function(label){ return label.text; });
+			}
+			var s = labels.join("<br>");
+			return dojox.gfx._base._getTextBox(s, {font: font}).w || 0;
+		},
 		calculate: function(min, max, span, labels){
-			if(this.initialized()){ return this; }
-			this.labels = "labels" in this.opt ? this.opt.labels : labels;
-			this.scaler = lin.buildScaler(min, max, span, this.opt);
+			if(this.initialized()){
+				return this;
+			}
+			var o = this.opt;
+			this.labels = "labels" in o  ? o.labels : labels;
+			this.scaler = lin.buildScaler(min, max, span, o);
+			var tsb = this.scaler.bounds;
 			if("scale" in this){
 				// calculate new range
-				this.opt.from = this.scaler.bounds.lower + this.offset;
-				this.opt.to   = (this.scaler.bounds.upper - this.scaler.bounds.lower) / this.scale + this.opt.from;
+				o.from = tsb.lower + this.offset;
+				o.to   = (tsb.upper - tsb.lower) / this.scale + o.from;
 				// make sure that bounds are correct
-				if(!isFinite(this.opt.from) || isNaN(this.opt.from) || !isFinite(this.opt.to) || isNaN(this.opt.to) ||
-						this.opt.to - this.opt.from >= this.scaler.bounds.upper - this.scaler.bounds.lower){
+				if( !isFinite(o.from) ||
+					isNaN(o.from) ||
+					!isFinite(o.to) ||
+					isNaN(o.to) ||
+					o.to - o.from >= tsb.upper - tsb.lower
+				){
 					// any error --- remove from/to bounds
-					delete this.opt.from;
-					delete this.opt.to;
+					delete o.from;
+					delete o.to;
 					delete this.scale;
 					delete this.offset;
 				}else{
 					// shift the window, if we are out of bounds
-					if(this.opt.from < this.scaler.bounds.lower){
-						this.opt.to   += this.scaler.bounds.lower - this.opt.from;
-						this.opt.from  = this.scaler.bounds.lower;
-					}else if(this.opt.to > this.scaler.bounds.upper){
-						this.opt.from += this.scaler.bounds.upper - this.opt.to;
-						this.opt.to    = this.scaler.bounds.upper;
+					if(o.from < tsb.lower){
+						o.to += tsb.lower - o.from;
+						o.from = tsb.lower;
+					}else if(o.to > tsb.upper){
+						o.from += tsb.upper - o.to;
+						o.to = tsb.upper;
 					}
 					// update the offset
-					this.offset = this.opt.from - this.scaler.bounds.lower;
+					this.offset = o.from - tsb.lower;
 				}
 				// re-calculate the scaler
-				this.scaler = lin.buildScaler(min, max, span, this.opt);
+				this.scaler = lin.buildScaler(min, max, span, o);
+				tsb = this.scaler.bounds;
 				// cleanup
 				if(this.scale == 1 && this.offset == 0){
 					delete this.scale;
@@ -6510,7 +6970,7 @@ dojo.provide("dojox.charting.axis2d.Default");
 				}
 			}
 			var minMinorStep = 0, ta = this.chart.theme.axis,
-				taFont = "font" in this.opt ? this.opt.font : ta.font,
+				taFont = "font" in o ? o.font : ta.font,
 				size = taFont ? g.normalizedLength(g.splitFontString(taFont).size) : 0;
 			if(this.vertical){
 				if(size){
@@ -6519,30 +6979,43 @@ dojo.provide("dojox.charting.axis2d.Default");
 			}else{
 				if(size){
 					var labelWidth, i;
-					if(this.opt.labelFunc && this.opt.maxLabelSize){
-						labelWidth = this.opt.maxLabelSize;
+					if(o.labelFunc && o.maxLabelSize){
+						labelWidth = o.maxLabelSize;
 					}else 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);
+						labelWidth = this._groupLabelWidth(this.labels, taFont);
 					}else{
-						var labelLength = Math.ceil(Math.log(Math.max(Math.abs(this.scaler.bounds.from),
-								Math.abs(this.scaler.bounds.to))) / Math.LN10),
+						var labelLength = Math.ceil(
+								Math.log(
+									Math.max(
+										Math.abs(tsb.from),
+										Math.abs(tsb.to)
+									)
+								) / Math.LN10
+							),
 							t = [];
-						if(this.scaler.bounds.from < 0 || this.scaler.bounds.to < 0){ t.push("-"); }
+						if(tsb.from < 0 || tsb.to < 0){
+							t.push("-");
+						}
 						t.push(dojo.string.rep("9", labelLength));
-						var precision = Math.floor(Math.log(this.scaler.bounds.to - this.scaler.bounds.from) / Math.LN10);
+						var precision = Math.floor(
+							Math.log( tsb.to - tsb.from ) / Math.LN10
+						);
 						if(precision > 0){
 							t.push(".");
-							for(i = 0; i < precision; ++i){ t.push("9"); }
+							for(i = 0; i < precision; ++i){
+								t.push("9");
+							}
 						}
-						labelWidth = dojox.gfx._base._getTextBox(t.join(""), {font: taFont}).w;
+						labelWidth = dojox.gfx._base._getTextBox(
+							t.join(""),
+							{ font: taFont }
+						).w;
 					}
 					minMinorStep = labelWidth + labelGap;
 				}
 			}
 			this.scaler.minMinorStep = minMinorStep;
-			this.ticks = lin.buildTicks(this.scaler, this.opt);
+			this.ticks = lin.buildTicks(this.scaler, o);
 			return this;
 		},
 		getScaler: function(){
@@ -6552,102 +7025,125 @@ dojo.provide("dojox.charting.axis2d.Default");
 			return this.ticks;
 		},
 		getOffsets: function(){
-			var offsets = {l: 0, r: 0, t: 0, b: 0}, labelWidth, a, b, c, d,
-				gtb = dojox.gfx._base._getTextBox, gl = dc.scaler.common.getNumericLabel,
-				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,
+			var o = this.opt;
+			var offsets = { l: 0, r: 0, t: 0, b: 0 },
+				labelWidth,
+				a,
+				b,
+				c,
+				d,
+				gl = dc.scaler.common.getNumericLabel,
+				offset = 0,
+				ta = this.chart.theme.axis,
+				taFont = "font" in o ? o.font : ta.font,
+				taMajorTick = "majorTick" in o ? o.majorTick : ta.majorTick,
+				taMinorTick = "minorTick" in o ? o.minorTick : ta.minorTick,
 				size = taFont ? g.normalizedLength(g.splitFontString(taFont).size) : 0,
 				s = this.scaler;
 			if(!s){
 				return offsets;
 			}
+			var ma = s.major, mi = s.minor;
 			if(this.vertical){
 				if(size){
-					if(this.opt.labelFunc && this.opt.maxLabelSize){
-						labelWidth = this.opt.maxLabelSize;
+					if(o.labelFunc && o.maxLabelSize){
+						labelWidth = o.maxLabelSize;
 					}else 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);
+						labelWidth = this._groupLabelWidth(
+							this.labels,
+							taFont
+						);
 					}else{
-						a = gtb(gl(s.major.start, s.major.prec, this.opt), {font: taFont}).w;
-						b = gtb(gl(s.major.start + s.major.count * s.major.tick, s.major.prec, this.opt), {font: taFont}).w;
-						c = gtb(gl(s.minor.start, s.minor.prec, this.opt), {font: taFont}).w;
-						d = gtb(gl(s.minor.start + s.minor.count * s.minor.tick, s.minor.prec, this.opt), {font: taFont}).w;
-						labelWidth = Math.max(a, b, c, d);
+						labelWidth = this._groupLabelWidth([
+							gl(ma.start, ma.prec, o),
+							gl(ma.start + ma.count * ma.tick, ma.prec, o),
+							gl(mi.start, mi.prec, o),
+							gl(mi.start + mi.count * mi.tick, mi.prec, o)
+						], taFont);
 					}
 					offset = labelWidth + labelGap;
 				}
 				offset += labelGap + Math.max(taMajorTick.length, taMinorTick.length);
-				offsets[this.opt.leftBottom ? "l" : "r"] = offset;
+				offsets[o.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;
+				offsets[o.leftBottom ? "b" : "t"] = offset;
 				if(size){
-					if(this.opt.labelFunc && this.opt.maxLabelSize){
-						labelWidth = this.opt.maxLabelSize;
+					if(o.labelFunc && o.maxLabelSize){
+						labelWidth = o.maxLabelSize;
 					}else 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);
+						labelWidth = this._groupLabelWidth(this.labels, taFont);
 					}else{
-						a = gtb(gl(s.major.start, s.major.prec, this.opt), {font: taFont}).w;
-						b = gtb(gl(s.major.start + s.major.count * s.major.tick, s.major.prec, this.opt), {font: taFont}).w;
-						c = gtb(gl(s.minor.start, s.minor.prec, this.opt), {font: taFont}).w;
-						d = gtb(gl(s.minor.start + s.minor.count * s.minor.tick, s.minor.prec, this.opt), {font: taFont}).w;
-						labelWidth = Math.max(a, b, c, d);
+						labelWidth = this._groupLabelWidth([
+							gl(ma.start, ma.prec, o),
+							gl(ma.start + ma.count * ma.tick, ma.prec, o),
+							gl(mi.start, mi.prec, o),
+							gl(mi.start + mi.count * mi.tick, mi.prec, o)
+						], taFont);
 					}
 					offsets.l = offsets.r = labelWidth / 2;
 				}
 			}
+			if(labelWidth){
+				this._cachedLabelWidth = labelWidth;
+			}
 			return offsets;
 		},
 		render: function(dim, offsets){
-			if(!this.dirty){ return this; }
+			if(!this.dirty){
+				return this;
+			}
 			// prepare variable
-			var start, stop, axisVector, tickVector, labelOffset, labelAlign,
+			var o = this.opt;
+			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,
-				taMicroTick = "microTick" in this.opt ? this.opt.microTick : ta.minorTick,
-				taFont = "font" in this.opt ? this.opt.font : ta.font,
-				taFontColor = "fontColor" in this.opt ? this.opt.fontColor : ta.fontColor,
+				taStroke = "stroke" in o ? o.stroke : ta.stroke,
+				taMajorTick = "majorTick" in o ? o.majorTick : ta.majorTick,
+				taMinorTick = "minorTick" in o ? o.minorTick : ta.minorTick,
+				taMicroTick = "microTick" in o ? o.microTick : ta.minorTick,
+				taFont = "font" in o ? o.font : ta.font,
+				taFontColor = "fontColor" in o ? o.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 = { y: dim.height - offsets.b };
+				stop  = { y: offsets.t };
+				axisVector = { x: 0, y: -1 };
+				if(o.leftBottom){
 					start.x = stop.x = offsets.l;
-					tickVector = {x: -1, y: 0};
+					tickVector = { x: -1, y: 0 };
 					labelAlign = "end";
 				}else{
 					start.x = stop.x = dim.width - offsets.r;
-					tickVector = {x: 1, y: 0};
+					tickVector = { x: 1, y: 0 };
 					labelAlign = "start";
 				}
-				labelOffset = {x: tickVector.x * (tickSize + labelGap), y: size * 0.4};
+				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};
+				start = { x: offsets.l };
+				stop  = { x: dim.width - offsets.r };
+				axisVector = { x: 1, y: 0 };
 				labelAlign = "middle";
-				if(this.opt.leftBottom){
+				if(o.leftBottom){
 					start.y = stop.y = dim.height - offsets.b;
-					tickVector = {x: 0, y: 1};
-					labelOffset = {y: tickSize + labelGap + size};
+					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};
+					tickVector = { x: 0, y: -1 };
+					labelOffset = { y: -tickSize - labelGap };
 				}
 				labelOffset.x = 0;
 			}
@@ -6657,14 +7153,22 @@ dojo.provide("dojox.charting.axis2d.Default");
 			this.cleanGroup();
 
 			try{
-				var s = this.group, c = this.scaler, t = this.ticks, canLabel,
+				var s = this.group,
+					c = this.scaler,
+					t = this.ticks,
+					canLabel,
 					f = lin.getTransformerFromModel(this.scaler),
-					forceHtmlLabels = dojox.gfx.renderer == "canvas",
+					forceHtmlLabels = (dojox.gfx.renderer == "canvas"),
 					labelType = forceHtmlLabels || this.opt.htmlLabels && !dojo.isIE && !dojo.isOpera ? "html" : "gfx",
 					dx = tickVector.x * taMajorTick.length,
 					dy = tickVector.y * taMajorTick.length;
 
-				s.createLine({x1: start.x, y1: start.y, x2: stop.x, y2: stop.y}).setStroke(taStroke);
+				s.createLine({
+					x1: start.x,
+					y1: start.y,
+					x2: stop.x,
+					y2: stop.y
+				}).setStroke(taStroke);
 
 				dojo.forEach(t.major, function(tick){
 					var offset = f(tick.value), elem,
@@ -6676,10 +7180,20 @@ dojo.provide("dojox.charting.axis2d.Default");
 							y2: y + dy
 						}).setStroke(taMajorTick);
 						if(tick.label){
-							elem = dc.axis2d.common.createText[labelType]
-											(this.chart, s, x + labelOffset.x, y + labelOffset.y, labelAlign,
-												tick.label, taFont, taFontColor);
-							if(labelType == "html"){ this.htmlElements.push(elem); }
+							elem = dc.axis2d.common.createText[labelType](
+								this.chart,
+								s,
+								x + labelOffset.x,
+								y + labelOffset.y,
+								labelAlign,
+								tick.label,
+								taFont,
+								taFontColor,
+								this._cachedLabelWidth
+							);
+							if(labelType == "html"){
+								this.htmlElements.push(elem);
+							}
 						}
 				}, this);
 
@@ -6696,10 +7210,20 @@ dojo.provide("dojox.charting.axis2d.Default");
 							y2: y + dy
 						}).setStroke(taMinorTick);
 						if(canLabel && tick.label){
-							elem = dc.axis2d.common.createText[labelType]
-											(this.chart, s, x + labelOffset.x, y + labelOffset.y, labelAlign,
-												tick.label, taFont, taFontColor);
-							if(labelType == "html"){ this.htmlElements.push(elem); }
+							elem = dc.axis2d.common.createText[labelType](
+								this.chart,
+								s,
+								x + labelOffset.x,
+								y + labelOffset.y,
+								labelAlign,
+								tick.label,
+								taFont,
+								taFontColor,
+								this._cachedLabelWidth
+							);
+							if(labelType == "html"){
+								this.htmlElements.push(elem);
+							}
 						}
 				}, this);
 
@@ -6767,8 +7291,10 @@ dojo.provide("dojox.charting.plot2d.common");
 			return fill;
 		},
 
-		defaultStats: {hmin: Number.POSITIVE_INFINITY, hmax: Number.NEGATIVE_INFINITY,
-			vmin: Number.POSITIVE_INFINITY, vmax: Number.NEGATIVE_INFINITY},
+		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);
@@ -6796,7 +7322,7 @@ dojo.provide("dojox.charting.plot2d.common");
 						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;
+							var x = "x" in val ? val.x : i + 1, y = val.y;
 							if(isNaN(x)){ x = 0; }
 							if(isNaN(y)){ y = 0; }
 							stats.hmin = Math.min(stats.hmin, x);
@@ -7169,9 +7695,9 @@ dojo.provide("dojox.charting.plot2d.Default");
 				}
 				if(this.opt.lines || this.opt.markers){
 					// need a stroke
-					stroke = run.stroke ? dc.makeStroke(run.stroke) : dc.augmentStroke(t.series.stroke, color);
+					stroke = run.dyn.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 = run.dyn.outline = dc.makeStroke(run.outline ? run.outline : t.series.outline);
 						outline.width = 2 * outline.width + stroke.width;
 					}
 				}
@@ -7550,40 +8076,322 @@ dojo.provide("dojox.charting.plot2d.Stacked");
 					acc[j] -= v;
 				}
 			}
-			this.dirty = false;
-			return this;
+			this.dirty = false;
+			return this;
+		}
+	});
+})();
+
+}
+
+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.declare("dojox.charting.plot2d.StackedLines", dojox.charting.plot2d.Stacked, {
+	constructor: function(){
+		this.opt.lines = true;
+	}
+});
+
+}
+
+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.declare("dojox.charting.plot2d.StackedAreas", dojox.charting.plot2d.Stacked, {
+	constructor: function(){
+		this.opt.lines = true;
+		this.opt.areas = true;
+	}
+});
+
+}
+
+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");
+
+
+
+(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, units){
+		this.start = start, this.end = end;
+		this.units = units;
+	};
+	d.extend(InterpolUnit, {
+		getValue: function(r){
+			return (this.end - this.start) * r + this.start + this.units;
+		}
+	});
+
+	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;
 		}
 	});
-})();
-
-}
-
-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");
 
+	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);
 
-dojo.declare("dojox.charting.plot2d.StackedLines", dojox.charting.plot2d.Stacked, {
-	constructor: function(){
-		this.opt.lines = true;
-	}
-});
+	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);
+	};
 
-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");
+	g.fx.animateStroke = function(/*Object*/ args){
+		// summary:
+		//	Returns an 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; // dojo.Animation
+	};
 
+	g.fx.animateFill = function(/*Object*/ args){
+		// summary:
+		//	Returns an 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; // dojo.Animation
+	};
 
+	g.fx.animateFont = function(/*Object*/ args){
+		// summary:
+		//	Returns an 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, units: "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.units){
+				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.units);
+			}
+			this.curve = new InterpolObject(values, font);
+		});
+		d.connect(anim, "onAnimate", shape, "setFont");
+		return anim; // dojo.Animation
+	};
 
-dojo.declare("dojox.charting.plot2d.StackedAreas", dojox.charting.plot2d.Stacked, {
-	constructor: function(){
-		this.opt.lines = true;
-		this.opt.areas = true;
-	}
-});
+	g.fx.animateTransform = function(/*Object*/ args){
+		// summary:
+		//	Returns an 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; // dojo.Animation
+	};
+})();
 
 }
 
@@ -7598,6 +8406,7 @@ dojo.provide("dojox.charting.plot2d.Columns");
 
 
 
+
 (function(){
 	var df = dojox.lang.functional, du = dojox.lang.utils,
 		dc = dojox.charting.plot2d.common,
@@ -7608,7 +8417,8 @@ dojo.provide("dojox.charting.plot2d.Columns");
 			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
+			shadows: null,	// draw shadows
+			animate: null   // animate bars into place
 		},
 		optionalParams: {
 			minBarSize: 1,	// minimal bar size in pixels
@@ -7622,6 +8432,7 @@ dojo.provide("dojox.charting.plot2d.Columns");
 			this.series = [];
 			this.hAxis = this.opt.hAxis;
 			this.vAxis = this.opt.vAxis;
+			this.animate = this.opt.animate;
 		},
 
 		calculateAxes: function(dim){
@@ -7661,17 +8472,35 @@ dojo.provide("dojox.charting.plot2d.Columns");
 				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 < run.data.length; ++j){
-					var v = run.data[j],
+					var value = run.data[j],
+						v = typeof value == "number" ? value : value.y,
 						vv = vt(v),
 						height = vv - baselineHeight,
-						h = Math.abs(height);
+						h = Math.abs(height),
+						specialColor  = color,
+						specialFill   = fill,
+						specialStroke = stroke;
+					if(typeof value != "number"){
+						if(value.color){
+							specialColor = new dojo.Color(value.color);
+						}
+						if("fill" in value){
+							specialFill = value.fill;
+						}else if(value.color){
+							specialFill = dc.augmentFill(t.series.fill, specialColor);
+						}
+						if("stroke" in value){
+							specialStroke = value.stroke;
+						}else if(value.color){
+							specialStroke = dc.augmentStroke(t.series.stroke, specialColor);
+						}
+					}
 					if(width >= 1 && h >= 1){
-						var rect = {
+						var shape = s.createRect({
 								x: offsets.l + ht(j + 0.5) + gap,
 								y: dim.height - offsets.b - (v > baseline ? vv : baselineHeight),
 								width: width, height: h
-							},
-							shape = s.createRect(rect).setFill(fill).setStroke(stroke);
+							}).setFill(specialFill).setStroke(specialStroke);
 						run.dyn.fill   = shape.getFill();
 						run.dyn.stroke = shape.getStroke();
 						if(events){
@@ -7688,12 +8517,26 @@ dojo.provide("dojox.charting.plot2d.Columns");
 							};
 							this._connectEvents(shape, o);
 						}
+						if(this.animate){
+							this._animateColumn(shape, dim.height - offsets.b - baselineHeight, h);
+						}
 					}
 				}
 				run.dirty = false;
 			}
 			this.dirty = false;
 			return this;
+		},
+		_animateColumn: function(shape, voffset, vsize){
+			dojox.gfx.fx.animateTransform(dojo.delegate({
+				shape: shape,
+				duration: 1200,
+				transform: [
+					{name: "translate", start: [0, voffset - (voffset/vsize)], end: [0, 0]},
+					{name: "scale", start: [1, 1/vsize], end: [1, 1]},
+					{name: "original"}
+				]
+			}, this.animate)).play();
 		}
 	});
 })();
@@ -7733,7 +8576,7 @@ dojo.provide("dojox.charting.plot2d.StackedColumns");
 			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];
+					var value = run.data[j], v = typeof value == "number" ? value : value.y;
 					if(isNaN(v)){ v = 0; }
 					acc[j] += v;
 				}
@@ -7767,13 +8610,32 @@ dojo.provide("dojox.charting.plot2d.StackedColumns");
 				fill = run.fill ? run.fill : dc.augmentFill(t.series.fill, color);
 				for(var j = 0; j < acc.length; ++j){
 					var v = acc[j],
-						height = vt(v);
+						height = vt(v),
+						value = run.data[j],
+						specialColor  = color,
+						specialFill   = fill,
+						specialStroke = stroke;
+					if(typeof value != "number"){
+						if(value.color){
+							specialColor = new dojo.Color(value.color);
+						}
+						if("fill" in value){
+							specialFill = value.fill;
+						}else if(value.color){
+							specialFill = dc.augmentFill(t.series.fill, specialColor);
+						}
+						if("stroke" in value){
+							specialStroke = value.stroke;
+						}else if(value.color){
+							specialStroke = dc.augmentStroke(t.series.stroke, specialColor);
+						}
+					}
 					if(width >= 1 && height >= 1){
 						var shape = s.createRect({
 							x: offsets.l + ht(j + 0.5) + gap,
 							y: dim.height - offsets.b - vt(v),
 							width: width, height: height
-						}).setFill(fill).setStroke(stroke);
+						}).setFill(specialFill).setStroke(specialStroke);
 						run.dyn.fill   = shape.getFill();
 						run.dyn.stroke = shape.getStroke();
 						if(events){
@@ -7790,12 +8652,15 @@ dojo.provide("dojox.charting.plot2d.StackedColumns");
 							};
 							this._connectEvents(shape, o);
 						}
+						if(this.animate){
+							this._animateColumn(shape, dim.height - offsets.b, height);
+						}
 					}
 				}
 				run.dirty = false;
 				// update the accumulator
 				for(var j = 0; j < run.data.length; ++j){
-					var v = run.data[j];
+					var value = run.data[j], v = typeof value == "number" ? value : value.y;
 					if(isNaN(v)){ v = 0; }
 					acc[j] -= v;
 				}
@@ -7853,16 +8718,35 @@ dojo.provide("dojox.charting.plot2d.ClusteredColumns");
 				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 < run.data.length; ++j){
-					var v = run.data[j],
+					var value = run.data[j],
+						v = typeof value == "number" ? value : value.y,
 						vv = vt(v),
 						height = vv - baselineHeight,
-						h = Math.abs(height);
+						h = Math.abs(height),
+						specialColor  = color,
+						specialFill   = fill,
+						specialStroke = stroke;
+					if(typeof value != "number"){
+						if(value.color){
+							specialColor = new dojo.Color(value.color);
+						}
+						if("fill" in value){
+							specialFill = value.fill;
+						}else if(value.color){
+							specialFill = dc.augmentFill(t.series.fill, specialColor);
+						}
+						if("stroke" in value){
+							specialStroke = value.stroke;
+						}else if(value.color){
+							specialStroke = dc.augmentStroke(t.series.stroke, specialColor);
+						}
+					}
 					if(width >= 1 && h >= 1){
 						var shape = s.createRect({
 							x: offsets.l + ht(j + 0.5) + gap + shift,
 							y: dim.height - offsets.b - (v > baseline ? vv : baselineHeight),
 							width: width, height: h
-						}).setFill(fill).setStroke(stroke);
+						}).setFill(specialFill).setStroke(specialStroke);
 						run.dyn.fill   = shape.getFill();
 						run.dyn.stroke = shape.getStroke();
 						if(events){
@@ -7879,6 +8763,9 @@ dojo.provide("dojox.charting.plot2d.ClusteredColumns");
 							};
 							this._connectEvents(shape, o);
 						}
+						if(this.animate){
+							this._animateColumn(shape, dim.height - offsets.b - baselineHeight, h);
+						}
 					}
 				}
 				run.dirty = false;
@@ -7902,6 +8789,7 @@ dojo.provide("dojox.charting.plot2d.Bars");
 
 
 
+
 (function(){
 	var df = dojox.lang.functional, du = dojox.lang.utils,
 		dc = dojox.charting.plot2d.common,
@@ -7912,7 +8800,8 @@ dojo.provide("dojox.charting.plot2d.Bars");
 			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
+			shadows: null,	// draw shadows
+			animate: null   // animate bars into place
 		},
 		optionalParams: {
 			minBarSize: 1,	// minimal bar size in pixels
@@ -7926,6 +8815,7 @@ dojo.provide("dojox.charting.plot2d.Bars");
 			this.series = [];
 			this.hAxis = this.opt.hAxis;
 			this.vAxis = this.opt.vAxis;
+			this.animate = this.opt.animate;
 		},
 
 		calculateAxes: function(dim){
@@ -7967,16 +8857,35 @@ dojo.provide("dojox.charting.plot2d.Bars");
 				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 < run.data.length; ++j){
-					var v = run.data[j],
+					var value = run.data[j],
+						v = typeof value == "number" ? value : value.y,
 						hv = ht(v),
 						width = hv - baselineWidth,
-						w = Math.abs(width);
+						w = Math.abs(width),
+						specialColor  = color,
+						specialFill   = fill,
+						specialStroke = stroke;
+					if(typeof value != "number"){
+						if(value.color){
+							specialColor = new dojo.Color(value.color);
+						}
+						if("fill" in value){
+							specialFill = value.fill;
+						}else if(value.color){
+							specialFill = dc.augmentFill(t.series.fill, specialColor);
+						}
+						if("stroke" in value){
+							specialStroke = value.stroke;
+						}else if(value.color){
+							specialStroke = dc.augmentStroke(t.series.stroke, specialColor);
+						}
+					}
 					if(w >= 1 && height >= 1){
 						var shape = s.createRect({
 							x: offsets.l + (v < baseline ? hv : baselineWidth),
 							y: dim.height - offsets.b - vt(j + 1.5) + gap,
 							width: w, height: height
-						}).setFill(fill).setStroke(stroke);
+						}).setFill(specialFill).setStroke(specialStroke);
 						run.dyn.fill   = shape.getFill();
 						run.dyn.stroke = shape.getStroke();
 						if(events){
@@ -7993,12 +8902,26 @@ dojo.provide("dojox.charting.plot2d.Bars");
 							};
 							this._connectEvents(shape, o);
 						}
+						if(this.animate){
+							this._animateBar(shape, offsets.l + baselineWidth, -w);
+						}
 					}
 				}
 				run.dirty = false;
 			}
 			this.dirty = false;
 			return this;
+		},
+		_animateBar: function(shape, hoffset, hsize){
+			dojox.gfx.fx.animateTransform(dojo.delegate({
+				shape: shape,
+				duration: 1200,
+				transform: [
+					{name: "translate", start: [hoffset - (hoffset/hsize), 0], end: [0, 0]},
+					{name: "scale", start: [1/hsize, 1], end: [1, 1]},
+					{name: "original"}
+				]
+			}, this.animate)).play();
 		}
 	});
 })();
@@ -8040,7 +8963,7 @@ dojo.provide("dojox.charting.plot2d.StackedBars");
 			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];
+					var value = run.data[j], v = typeof value == "number" ? value : value.y;
 					if(isNaN(v)){ v = 0; }
 					acc[j] += v;
 				}
@@ -8074,13 +8997,32 @@ dojo.provide("dojox.charting.plot2d.StackedBars");
 				fill = run.fill ? run.fill : dc.augmentFill(t.series.fill, color);
 				for(var j = 0; j < acc.length; ++j){
 					var v = acc[j],
-						width  = ht(v);
+						width = ht(v),
+						value = run.data[j],
+						specialColor  = color,
+						specialFill   = fill,
+						specialStroke = stroke;
+					if(typeof value != "number"){
+						if(value.color){
+							specialColor = new dojo.Color(value.color);
+						}
+						if("fill" in value){
+							specialFill = value.fill;
+						}else if(value.color){
+							specialFill = dc.augmentFill(t.series.fill, specialColor);
+						}
+						if("stroke" in value){
+							specialStroke = value.stroke;
+						}else if(value.color){
+							specialStroke = dc.augmentStroke(t.series.stroke, specialColor);
+						}
+					}
 					if(width >= 1 && height >= 1){
 						var shape = s.createRect({
 							x: offsets.l,
 							y: dim.height - offsets.b - vt(j + 1.5) + gap,
 							width: width, height: height
-						}).setFill(fill).setStroke(stroke);
+						}).setFill(specialFill).setStroke(specialStroke);
 						run.dyn.fill   = shape.getFill();
 						run.dyn.stroke = shape.getStroke();
 						if(events){
@@ -8097,12 +9039,15 @@ dojo.provide("dojox.charting.plot2d.StackedBars");
 							};
 							this._connectEvents(shape, o);
 						}
+						if(this.animate){
+							this._animateBar(shape, offsets.l, -width);
+						}
 					}
 				}
 				run.dirty = false;
 				// update the accumulator
 				for(var j = 0; j < run.data.length; ++j){
-					var v = run.data[j];
+					var value = run.data[j], v = typeof value == "number" ? value : value.y;
 					if(isNaN(v)){ v = 0; }
 					acc[j] -= v;
 				}
@@ -8160,16 +9105,35 @@ dojo.provide("dojox.charting.plot2d.ClusteredBars");
 				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 < run.data.length; ++j){
-					var v = run.data[j],
+					var value = run.data[j],
+						v = typeof value == "number" ? value : value.y,
 						hv = ht(v),
 						width = hv - baselineWidth,
-						w = Math.abs(width);
+						w = Math.abs(width),
+						specialColor  = color,
+						specialFill   = fill,
+						specialStroke = stroke;
+					if(typeof value != "number"){
+						if(value.color){
+							specialColor = new dojo.Color(value.color);
+						}
+						if("fill" in value){
+							specialFill = value.fill;
+						}else if(value.color){
+							specialFill = dc.augmentFill(t.series.fill, specialColor);
+						}
+						if("stroke" in value){
+							specialStroke = value.stroke;
+						}else if(value.color){
+							specialStroke = dc.augmentStroke(t.series.stroke, specialColor);
+						}
+					}
 					if(w >= 1 && height >= 1){
 						var shape = s.createRect({
 							x: offsets.l + (v < baseline ? hv : baselineWidth),
 							y: dim.height - offsets.b - vt(j + 1.5) + gap + shift,
 							width: w, height: height
-						}).setFill(fill).setStroke(stroke);
+						}).setFill(specialFill).setStroke(specialStroke);
 						run.dyn.fill   = shape.getFill();
 						run.dyn.stroke = shape.getStroke();
 						if(events){
@@ -8186,6 +9150,9 @@ dojo.provide("dojox.charting.plot2d.ClusteredBars");
 							};
 							this._connectEvents(shape, o);
 						}
+						if(this.animate){
+							this._animateBar(shape, offsets.l + baselineWidth, -width);
+						}
 					}
 				}
 				run.dirty = false;
@@ -8785,6 +9752,346 @@ dojo.provide("dojox.charting.plot2d.Bubble");
 
 }
 
+if(!dojo._hasResource["dojox.charting.plot2d.Candlesticks"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.Candlesticks"] = true;
+dojo.provide("dojox.charting.plot2d.Candlesticks");
+
+
+
+
+
+
+
+
+(function(){
+	var df = dojox.lang.functional, du = dojox.lang.utils,
+		dc = dojox.charting.plot2d.common,
+		purgeGroup = df.lambda("item.purgeGroup()");
+
+	//	Candlesticks are based on the Bars plot type; we expect the following passed
+	//	as values in a series: 
+	//	{ x?, open, close, high, low, mid? }
+	//	if x is not provided, the array index is used.
+	//	failing to provide the OHLC values will throw an error.
+	dojo.declare("dojox.charting.plot2d.Candlesticks", dojox.charting.plot2d.Base, {
+		defaultParams: {
+			hAxis: "x",		// use a horizontal axis named "x"
+			vAxis: "y",		// use a vertical axis named "y"
+			gap:	2,		// gap between columns in pixels
+			shadows: null	// draw shadows
+		},
+		optionalParams: {
+			minBarSize: 1,	// minimal bar size in pixels
+			maxBarSize: 1	// maximal bar size in pixels
+		},
+
+		constructor: function(chart, kwArgs){
+			this.opt = dojo.clone(this.defaultParams);
+			du.updateWithObject(this.opt, kwArgs);
+			du.updateWithPattern(this.opt, kwArgs, this.optionalParams);
+			this.series = [];
+			this.hAxis = this.opt.hAxis;
+			this.vAxis = this.opt.vAxis;
+		},
+
+		collectStats: function(series){
+			//	we have to roll our own, since we need to use all four passed
+			//	values to figure out our stats, and common only assumes x and y.
+			var stats = dojo.clone(dc.defaultStats);
+			for(var i=0; i<series.length; i++){
+				var run = series[i];
+				if(!run.data.length){ continue; }
+				var old_vmin = stats.vmin, old_vmax = stats.vmax;
+				if(!("ymin" in run) || !("ymax" in run)){
+					dojo.forEach(run.data, function(val, idx){
+						var x = val.x || idx + 1;
+						stats.hmin = Math.min(stats.hmin, x);
+						stats.hmax = Math.max(stats.hmax, x);
+						stats.vmin = Math.min(stats.vmin, val.open, val.close, val.high, val.low);
+						stats.vmax = Math.max(stats.vmax, val.open, val.close, val.high, val.low);
+					});
+				}
+				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;
+		},
+
+		calculateAxes: function(dim){
+			var stats = this.collectStats(this.series), t;
+			stats.hmin -= 0.5;
+			stats.hmax += 0.5;
+			this._calc(dim, stats);
+			return this;
+		},
+
+		render: function(dim, offsets){
+			this.dirty = this.isDirty();
+			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, width,
+				ht = this._hScaler.scaler.getTransformerFromModel(this._hScaler),
+				vt = this._vScaler.scaler.getTransformerFromModel(this._vScaler),
+				baseline = Math.max(0, this._vScaler.bounds.lower),
+				baselineHeight = vt(baseline),
+				events = this.events();
+			f = dc.calculateBarSize(this._hScaler.bounds.scale, this.opt);
+			gap = f.gap;
+			width = f.size;
+			this.resetEvents();
+			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 < run.data.length; ++j){
+					var v = run.data[j];
+
+					//	calculate the points we need for OHLC
+					var x = ht(v.x || (j+0.5)) + offsets.l + gap,
+						y = dim.height - offsets.b,
+						open = vt(v.open),
+						close = vt(v.close),
+						high = vt(v.high),
+						low = vt(v.low);
+					if("mid" in v){
+						var mid = vt(v.mid);
+					}
+					if(low > high){
+						var tmp = high;
+						high = low;
+						low = tmp;
+					}
+
+					if(width >= 1){
+						//	draw the line and rect, set up as a group and pass that to the events.
+						var doFill = open > close;
+						var line = { x1: width/2, x2: width/2, y1: y - high, y2: y - low },
+							rect = {
+								x: 0, y: y-Math.max(open, close),
+								width: width, height: Math.max(doFill ? open-close : close-open, 1)
+							};
+						shape = s.createGroup();
+						shape.setTransform({dx: x, dy: 0 });
+						var inner = shape.createGroup();
+						inner.createLine(line).setStroke(stroke);
+						inner.createRect(rect).setStroke(stroke).setFill(doFill?fill:"white");
+						if("mid" in v){
+							//	add the mid line.
+							inner.createLine({ x1: (stroke.width||1), x2: width-(stroke.width||1), y1: y - mid, y2: y - mid})
+								.setStroke(doFill?{color:"white"}:stroke);
+						}
+
+						//	TODO: double check this.
+						run.dyn.fill   = fill;
+						run.dyn.stroke = stroke;
+						if(events){
+							var o = {
+								element: "candlestick",
+								index:   j,
+								run:     run,
+								plot:    this,
+								hAxis:   this.hAxis || null,
+								vAxis:   this.vAxis || null,
+								shape:   inner,
+								x:       x,
+								y:       y-Math.max(open, close),
+								cx:		 width/2,
+								cy:		 (y-Math.max(open, close)) + (Math.max(doFill ? open-close : close-open, 1)/2),
+								width:	 width,
+								height:  Math.max(doFill ? open-close : close-open, 1),
+								data:	 v
+							};
+							this._connectEvents(shape, o);
+						}
+					}
+				}
+				run.dirty = false;
+			}
+			this.dirty = false;
+			return this;
+		}
+	});
+})();
+
+}
+
+if(!dojo._hasResource["dojox.charting.plot2d.OHLC"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojox.charting.plot2d.OHLC"] = true;
+dojo.provide("dojox.charting.plot2d.OHLC");
+
+
+
+
+
+
+
+
+(function(){
+	var df = dojox.lang.functional, du = dojox.lang.utils,
+		dc = dojox.charting.plot2d.common,
+		purgeGroup = df.lambda("item.purgeGroup()");
+
+	//	Candlesticks are based on the Bars plot type; we expect the following passed
+	//	as values in a series: 
+	//	{ x?, open, close, high, low }
+	//	if x is not provided, the array index is used.
+	//	failing to provide the OHLC values will throw an error.
+	dojo.declare("dojox.charting.plot2d.OHLC", dojox.charting.plot2d.Base, {
+		defaultParams: {
+			hAxis: "x",		// use a horizontal axis named "x"
+			vAxis: "y",		// use a vertical axis named "y"
+			gap:	2,		// gap between columns in pixels
+			shadows: null	// draw shadows
+		},
+		optionalParams: {
+			minBarSize: 1,	// minimal bar size in pixels
+			maxBarSize: 1	// maximal bar size in pixels
+		},
+
+		constructor: function(chart, kwArgs){
+			this.opt = dojo.clone(this.defaultParams);
+			du.updateWithObject(this.opt, kwArgs);
+			du.updateWithPattern(this.opt, kwArgs, this.optionalParams);
+			this.series = [];
+			this.hAxis = this.opt.hAxis;
+			this.vAxis = this.opt.vAxis;
+		},
+
+		collectStats: function(series){
+			//	we have to roll our own, since we need to use all four passed
+			//	values to figure out our stats, and common only assumes x and y.
+			var stats = dojo.clone(dc.defaultStats);
+			for(var i=0; i<series.length; i++){
+				var run = series[i];
+				if(!run.data.length){ continue; }
+				var old_vmin = stats.vmin, old_vmax = stats.vmax;
+				if(!("ymin" in run) || !("ymax" in run)){
+					dojo.forEach(run.data, function(val, idx){
+						var x = val.x || idx + 1;
+						stats.hmin = Math.min(stats.hmin, x);
+						stats.hmax = Math.max(stats.hmax, x);
+						stats.vmin = Math.min(stats.vmin, val.open, val.close, val.high, val.low);
+						stats.vmax = Math.max(stats.vmax, val.open, val.close, val.high, val.low);
+					});
+				}
+				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;
+		},
+
+		calculateAxes: function(dim){
+			var stats = this.collectStats(this.series), t;
+			stats.hmin -= 0.5;
+			stats.hmax += 0.5;
+			this._calc(dim, stats);
+			return this;
+		},
+
+		render: function(dim, offsets){
+			this.dirty = this.isDirty();
+			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, width,
+				ht = this._hScaler.scaler.getTransformerFromModel(this._hScaler),
+				vt = this._vScaler.scaler.getTransformerFromModel(this._vScaler),
+				baseline = Math.max(0, this._vScaler.bounds.lower),
+				baselineHeight = vt(baseline),
+				events = this.events();
+			f = dc.calculateBarSize(this._hScaler.bounds.scale, this.opt);
+			gap = f.gap;
+			width = f.size;
+			this.resetEvents();
+			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"));
+				}
+				//	note that fill does not get used with this
+				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 < run.data.length; ++j){
+					var v = run.data[j];
+
+					//	calculate the points we need for OHLC
+					var x = ht(v.x || (j+0.5)) + offsets.l + gap,
+						y = dim.height - offsets.b,
+						open = vt(v.open),
+						close = vt(v.close),
+						high = vt(v.high),
+						low = vt(v.low);
+					if(low > high){
+						var tmp = high;
+						high = low;
+						low = tmp;
+					}
+
+					if(width >= 1){
+						var hl = { x1: width/2, x2: width/2, y1: y - high, y2: y - low },
+							op = { x1: 0, x2: ((width/2) + ((stroke.width||1)/2)), y1: y-open, y2: y-open},
+							cl = { x1: ((width/2) - ((stroke.width||1)/2)), x2: width, y1: y-close, y2: y-close };
+						shape = s.createGroup();
+						shape.setTransform({dx: x, dy: 0 });
+						var inner = shape.createGroup();
+						inner.createLine(hl).setStroke(stroke);
+						inner.createLine(op).setStroke(stroke);
+						inner.createLine(cl).setStroke(stroke);
+
+						//	TODO: double check this.
+						run.dyn.fill   = fill;
+						run.dyn.stroke = stroke;
+						if(events){
+							var o = {
+								element: "candlestick",
+								index:   j,
+								run:     run,
+								plot:    this,
+								hAxis:   this.hAxis || null,
+								vAxis:   this.vAxis || null,
+								shape:	 inner,
+								x:       x,
+								y:       y-Math.max(open, close),
+								cx:		 width/2,
+								cy:		 (y-Math.max(open, close)) + (Math.max(open > close ? open-close : close-open, 1)/2),
+								width:	 width,
+								height:  Math.max(open > close ? open-close : close-open, 1),
+								data:	 v
+							};
+							this._connectEvents(shape, o);
+						}
+					}
+				}
+				run.dirty = false;
+			}
+			this.dirty = false;
+			return this;
+		}
+	});
+})();
+
+}
+
 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");
@@ -8820,6 +10127,8 @@ dojo.provide("dojox.charting.Chart2D");
 
 
 
+
+
 (function(){
 	var df = dojox.lang.functional, dc = dojox.charting,
 		clear = df.lambda("item.clear()"),
@@ -8996,7 +10305,7 @@ dojo.provide("dojox.charting.Chart2D");
 					box = width;
 					break;
 				default:
-					box = {w: width, h: height};
+					box = { w: width, h: height };
 					break;
 			}
 			dojo.marginBox(this.node, box);
@@ -9051,8 +10360,10 @@ dojo.provide("dojox.charting.Chart2D");
 
 			// 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)){
+				if(	plot.dirty ||
+					(plot.hAxis && this.axes[plot.hAxis].dirty) ||
+					(plot.vAxis && this.axes[plot.vAxis].dirty)
+				){
 					plot.calculateAxes(this.plotArea);
 				}
 			}, this);
@@ -9099,10 +10410,10 @@ dojo.provide("dojox.charting.Chart2D");
 			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); });
+			dojo.forEach(this.stack, function(p){ p.calculateAxes(dim); });
 
 			// assumption: we don't have stacked axes yet
-			var offsets = this.offsets = {l: 0, r: 0, t: 0, b: 0};
+			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; });
 			});
@@ -9110,7 +10421,10 @@ dojo.provide("dojox.charting.Chart2D");
 			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};
+			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);
 
@@ -9263,7 +10577,7 @@ dojo.provide("dojox.charting.Chart2D");
 					axisName = verticalAxis ? "vAxis" : "hAxis";
 				if(plot[axisName]){
 					axis = this.axes[plot[axisName]];
-					if(axis.dependOnData()){
+					if(axis && axis.dependOnData()){
 						axis.dirty = true;
 						// find all plots and mark them dirty
 						dojo.forEach(this.stack, function(p){
@@ -9287,26 +10601,33 @@ dojo._hasResource["dojo.fx.easing"] = true;
 dojo.provide("dojo.fx.easing");
 
 dojo.fx.easing = {
-	// summary: Collection of easing functions to use beyond the default dojo._defaultEasing
+	// summary: 
+	//		Collection of easing functions to use beyond the default 
+	//		`dojo._defaultEasing` function.
 	// 
 	// 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.
+	//
+	//		Easing functions are used to manipulate the iteration through
+	//		an `dojo.Animation`s _Line. _Line being the properties of an Animation,
+	//		and the easing function progresses through that Line determing
+	//		how quickly (or slowly) it should go. Or more accurately: modify
+	//		the value of the _Line based on the percentage of animation completed.
 	//	
-	//	All functions follow a simple naming convention of "ease type" + "when".
-	//	If the name of the function ends in Out, the easing described appears
-	//	towards the end of the animation. "In" means during the beginning,
-	//	and InOut means both ranges of the Animation will applied, both beginning
-	//	and end. 
+	//		All functions follow a simple naming convention of "ease type" + "when".
+	//		If the name of the function ends in Out, the easing described appears
+	//		towards the end of the animation. "In" means during the beginning,
+	//		and InOut means both ranges of the Animation will applied, both
+	//		beginning and end. 
+	//
+	//		One does not call the easing function directly, it must be passed to 
+	//		the `easing` property of an animation.
 	//
 	//	example:
 	//	|	
 	//	|	var anim = dojo.fadeOut({
 	//	|		node: 'node',	
 	//	|		duration: 2000,
+	//	|		//	note there is no () 
 	//	|		easing: dojo.fx.easing.quadIn
 	//	|	}).play();
 	//
@@ -9421,22 +10742,39 @@ dojo.fx.easing = {
 	},
 
 	backIn: function(/* Decimal? */n){
-		// summary: An easing function that starts away from the target, and 
-		//		quickly accelerates towards the end value
+		// summary: 
+		//		An easing function that starts away from the target, 
+		//		and quickly accelerates towards the end value.
+		// 
+		//		Use caution when the easing will cause values to become 
+		//		negative as some properties cannot be set to negative values.
 		var s = 1.70158;
 		return Math.pow(n, 2) * ((s + 1) * n - s);
 	},
 
 	backOut: function(/* Decimal? */n){
-		// summary: An easing function that pops past the range briefly, and 
-		// 	slowly comes back. 
+		// summary: 
+		//		An easing function that pops past the range briefly, and slowly comes back. 
+		//
+		// description:
+		//		An easing function that pops past the range briefly, and slowly comes back. 
+		//
+		//		Use caution when the easing will cause values to become negative as some 
+		//		properties cannot be set to negative values.
+		
 		n = n - 1;
 		var s = 1.70158;
 		return Math.pow(n, 2) * ((s + 1) * n + s) + 1;
 	},
 
 	backInOut: function(/* Decimal? */n){
-		// summary: An easing function combining the effects of backIn and backOut
+		// summary: 
+		//		An easing function combining the effects of `backIn` and `backOut`
+		//
+		// description:
+		//		An easing function combining the effects of `backIn` and `backOut`.
+		//		Use caution when the easing will cause values to become negative 
+		//		as some properties cannot be set to negative values.
 		var s = 1.70158 * 1.525;
 		n = n * 2;
 		if(n < 1){ return (Math.pow(n, 2) * ((s + 1) * n - s)) / 2; }
@@ -9445,7 +10783,14 @@ dojo.fx.easing = {
 	},
 
 	elasticIn: function(/* Decimal? */n){
-		// summary: An easing function the elastically snaps from the start value
+		// summary: 
+		//		An easing function the elastically snaps from the start value
+		//
+		// description:
+		//		An easing function the elastically snaps from the start value
+		//	
+		//		Use caution when the elasticity will cause values to become negative 
+		//		as some properties cannot be set to negative values.
 		if(n == 0 || n == 1){ return n; }
 		var p = .3;
 		var s = p / 4;
@@ -9454,7 +10799,16 @@ dojo.fx.easing = {
 	},
 
 	elasticOut: function(/* Decimal? */n){
-		// summary: An easing function that elasticly snaps around the target value, near the end of the Animation
+		// summary: 
+		//		An easing function that elasticly snaps around the target value,
+		//		near the end of the Animation
+		//
+		// description:
+		//		An easing function that elasticly snaps around the target value,
+		//		near the end of the Animation
+		//
+		//		Use caution when the elasticity will cause values to become 
+		//		negative as some properties cannot be set to negative values.
 		if(n==0 || n == 1){ return n; }
 		var p = .3;
 		var s = p / 4;
@@ -9462,7 +10816,16 @@ dojo.fx.easing = {
 	},
 
 	elasticInOut: function(/* Decimal? */n){
-		// summary: An easing function that elasticly snaps around the value, near the beginning and end of the Animation		
+		// summary: 
+		//		An easing function that elasticly snaps around the value, near
+		//		the beginning and end of the Animation.
+		//
+		// description:
+		//		An easing function that elasticly snaps around the value, near
+		//		the beginning and end of the Animation.
+		//
+		//		Use caution when the elasticity will cause values to become 
+		//		negative as some properties cannot be set to negative values.
 		if(n == 0) return 0;
 		n = n * 2;
 		if(n == 2) return 1;
@@ -9477,12 +10840,14 @@ dojo.fx.easing = {
 	},
 
 	bounceIn: function(/* Decimal? */n){
-		// summary: An easing function that "bounces" near the beginning of an Animation
+		// summary: 
+		//		An easing function that 'bounces' near the beginning of an Animation
 		return (1 - dojo.fx.easing.bounceOut(1 - n)); // Decimal
 	},
 
 	bounceOut: function(/* Decimal? */n){
-		// summary: An easing function that "bounces" near the end of an Animation
+		// summary:
+		//		An easing function that 'bounces' near the end of an Animation
 		var s = 7.5625;
 		var p = 2.75;
 		var l; 
@@ -9499,296 +10864,15 @@ dojo.fx.easing = {
 			l = s * Math.pow(n, 2) + .984375;
 		}
 		return l;
-	},
-
-	bounceInOut: function(/* Decimal? */n){
-		// summary: An easing function that "bounces" at the beginning and end of the Animation
-		if(n < 0.5){ return dojo.fx.easing.bounceIn(n * 2) / 2; }
-		return (dojo.fx.easing.bounceOut(n * 2 - 1) / 2) + 0.5; // Decimal
-	}
-};
-
-}
-
-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");
-
-
-
-(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 an 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; // dojo._Animation
-	};
-
-	g.fx.animateFill = function(/*Object*/ args){
-		// summary:
-		//	Returns an 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; // dojo._Animation
-	};
-
-	g.fx.animateFont = function(/*Object*/ args){
-		// summary:
-		//	Returns an 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; // dojo._Animation
-	};
+	},
 
-	g.fx.animateTransform = function(/*Object*/ args){
-		// summary:
-		//	Returns an 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; // dojo._Animation
-	};
-})();
+	bounceInOut: function(/* Decimal? */n){
+		// summary: 
+		//		An easing function that 'bounces' at the beginning and end of the Animation
+		if(n < 0.5){ return dojo.fx.easing.bounceIn(n * 2) / 2; }
+		return (dojo.fx.easing.bounceOut(n * 2 - 1) / 2) + 0.5; // Decimal
+	}
+};
 
 }
 
@@ -9965,65 +11049,54 @@ dojo.provide("dojo.fx.Toggler");
 
 dojo.declare("dojo.fx.Toggler", null, {
 	// summary:
+	//		A simple `dojo.Animation` toggler API.
+	//
+	// description:
 	//		class constructor for an animation toggler. It accepts a packed
 	//		set of arguments about what type of animation to use in each
-	//		direction, duration, etc.
+	//		direction, duration, etc. All available members are mixed into 
+	//		these animations from the constructor (for example, `node`, 
+	//		`showDuration`, `hideDuration`). 
 	//
 	// example:
 	//	|	var t = new dojo.fx.Toggler({
 	//	|		node: "nodeId",
 	//	|		showDuration: 500,
 	//	|		// hideDuration will default to "200"
-	//	|		showFunc: dojo.wipeIn, 
+	//	|		showFunc: dojo.fx.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
+	//		the node to target for the showing and hiding animations
 	node: null,
 
 	// showFunc: Function
-	//	The function that returns the dojo._Animation to show the node
+	//		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
+	//		The function that returns the `dojo.Animation` to hide the node
 	hideFunc: dojo.fadeOut,
 
 	// showDuration:
-	//	Time in milliseconds to run the show Animation
+	//		Time in milliseconds to run the show Animation
 	showDuration: 200,
 
 	// hideDuration:
-	//	Time in milliseconds to run the hide Animation
+	//		Time in milliseconds to run the hide Animation
 	hideDuration: 200,
 
+	// FIXME: need a policy for where the toggler should "be" the next
+	// time show/hide are called if we're stopped somewhere in the
+	// middle.
+	// FIXME: also would be nice to specify individual showArgs/hideArgs mixed into
+	// each animation individually. 
+	// FIXME: also would be nice to have events from the animations exposed/bridged
+
 	/*=====
 	_showArgs: null,
 	_showAnim: null,
@@ -10035,13 +11108,36 @@ dojo.declare("dojo.fx.Toggler", null, {
 	_isHiding: false,
 	=====*/
 
+	constructor: function(args){
+		var _t = this;
+
+		dojo.mixin(_t, args);
+		_t.node = args.node;
+		_t._showArgs = dojo.mixin({}, args);
+		_t._showArgs.node = _t.node;
+		_t._showArgs.duration = _t.showDuration;
+		_t.showAnim = _t.showFunc(_t._showArgs);
+
+		_t._hideArgs = dojo.mixin({}, args);
+		_t._hideArgs.node = _t.node;
+		_t._hideArgs.duration = _t.hideDuration;
+		_t.hideAnim = _t.hideFunc(_t._hideArgs);
+
+		dojo.connect(_t.showAnim, "beforeBegin", dojo.hitch(_t.hideAnim, "stop", true));
+		dojo.connect(_t.hideAnim, "beforeBegin", dojo.hitch(_t.showAnim, "stop", true));
+	},
+
 	show: function(delay){
 		// summary: Toggle the node to showing
+		// delay: Integer?
+		//		Ammount of time to stall playing the show animation
 		return this.showAnim.play(delay || 0);
 	},
 
 	hide: function(delay){
 		// summary: Toggle the node to hidden
+		// delay: Integer?
+		//		Ammount of time to stall playing the hide animation
 		return this.hideAnim.play(delay || 0);
 	}
 });
@@ -10051,7 +11147,7 @@ dojo.declare("dojo.fx.Toggler", null, {
 if(!dojo._hasResource["dojo.fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
 dojo._hasResource["dojo.fx"] = true;
 dojo.provide("dojo.fx");
-
+ // FIXME: remove this back-compat require in 2.0 
 /*=====
 dojo.fx = {
 	// summary: Effects library on top of Base animations
@@ -10177,15 +11273,25 @@ dojo.fx = {
 	});
 	d.extend(_chain, _baseObj);
 
-	dojo.fx.chain = function(/*dojo._Animation[]*/ animations){
-		// summary: Chain a list of dojo._Animation s to run in sequence
+	dojo.fx.chain = function(/*dojo.Animation[]*/ animations){
+		// summary: 
+		//		Chain a list of `dojo.Animation`s to run in sequence
+		//
+		// description:
+		//		Return a `dojo.Animation` which will play all passed
+		//		`dojo.Animation` instances in sequence, firing its own
+		//		synthesized events simulating a single animation. (eg:
+		//		onEnd of this animation means the end of the chain, 
+		//		not the individual animations within)
+		//
 		// example:
+		//	Once `node` is faded out, fade in `otherNode`
 		//	|	dojo.fx.chain([
 		//	|		dojo.fadeIn({ node:node }),
 		//	|		dojo.fadeOut({ node:otherNode })
 		//	|	]).play();
 		//
-		return new _chain(animations) // dojo._Animation
+		return new _chain(animations) // dojo.Animation
 	};
 
 	var _combine = function(animations){
@@ -10201,9 +11307,9 @@ dojo.fx = {
 			this._connects.push(d.connect(a, "onEnd", this, "_onEnd"));
 		}, this);
 		
-		this._pseudoAnimation = new d._Animation({curve: [0, 1], duration: this.duration});
+		this._pseudoAnimation = new d.Animation({curve: [0, 1], duration: this.duration});
 		var self = this;
-		d.forEach(["beforeBegin", "onBegin", "onPlay", "onAnimate", "onPause", "onStop"], 
+		d.forEach(["beforeBegin", "onBegin", "onPlay", "onAnimate", "onPause", "onStop", "onEnd"], 
 			function(evt){
 				self._connects.push(d.connect(self._pseudoAnimation, evt,
 					function(){ self._fire(evt, arguments); }
@@ -10219,7 +11325,7 @@ dojo.fx = {
 			return this;
 		},
 		_onEnd: function(){
-			if(++this._finished == this._animations.length){
+			if(++this._finished > this._animations.length){
 				this._fire("onEnd");
 			}
 		},
@@ -10260,15 +11366,17 @@ dojo.fx = {
 	});
 	d.extend(_combine, _baseObj);
 
-	dojo.fx.combine = function(/*dojo._Animation[]*/ animations){
-		// summary: Combine an array of `dojo._Animation`s to run in parallel
+	dojo.fx.combine = function(/*dojo.Animation[]*/ animations){
+		// summary: 
+		//		Combine a list of `dojo.Animation`s to run in parallel
 		//
 		// description:
-		//		Combine an array of `dojo._Animation`s to run in parallel, 
-		//		providing a new `dojo._Animation` instance encompasing each
+		//		Combine an array of `dojo.Animation`s to run in parallel, 
+		//		providing a new `dojo.Animation` instance encompasing each
 		//		animation, firing standard animation events.
 		//
 		// example:
+		//	Fade out `node` while fading in `otherNode` simultaneously
 		//	|	dojo.fx.combine([
 		//	|		dojo.fadeIn({ node:node }),
 		//	|		dojo.fadeOut({ node:otherNode })
@@ -10276,7 +11384,7 @@ dojo.fx = {
 		//
 		// example:
 		//	When the longest animation ends, execute a function:
-		//	| 	var anim = dojo.fx.combine([
+		//	|	var anim = dojo.fx.combine([
 		//	|		dojo.fadeIn({ node: n, duration:700 }),
 		//	|		dojo.fadeOut({ node: otherNode, duration: 300 })
 		//	|	]);
@@ -10285,17 +11393,28 @@ dojo.fx = {
 		//	|	});
 		//	|	anim.play(); // play the animation
 		//
-		return new _combine(animations); // dojo._Animation
+		return new _combine(animations); // dojo.Animation
 	};
 
 	dojo.fx.wipeIn = function(/*Object*/ args){
 		// summary:
+		//		Expand a node to it's natural height.
+		//
+		// description:
 		//		Returns an animation that will expand the
 		//		node defined in 'args' object from it's current height to
 		//		it's natural height (with no scrollbar).
 		//		Node must have no margin/border/padding.
-		args.node = d.byId(args.node);
-		var node = args.node, s = node.style, o;
+		//
+		// args: Object
+		//		A hash-map of standard `dojo.Animation` constructor properties
+		//		(such as easing: node: duration: and so on)
+		//
+		// example:
+		//	|	dojo.fx.wipeIn({
+		//	|		node:"someId"
+		//	|	}).play()
+		var node = args.node = d.byId(args.node), s = node.style, o;
 
 		var anim = d.animateProperty(d.mixin({
 			properties: {
@@ -10305,11 +11424,11 @@ dojo.fx = {
 						// start at current [computed] height, but use 1px rather than 0
 						// because 0 causes IE to display the whole panel
 						o = s.overflow;
-						s.overflow="hidden";
-						if(s.visibility=="hidden"||s.display=="none"){
-							s.height="1px";
-							s.display="";
-							s.visibility="";
+						s.overflow = "hidden";
+						if(s.visibility == "hidden" || s.display == "none"){
+							s.height = "1px";
+							s.display = "";
+							s.visibility = "";
 							return 1;
 						}else{
 							var height = d.style(node, "height");
@@ -10328,13 +11447,24 @@ dojo.fx = {
 			s.overflow = o;
 		});
 
-		return anim; // dojo._Animation
+		return anim; // dojo.Animation
 	}
 
 	dojo.fx.wipeOut = function(/*Object*/ args){
 		// summary:
+		//		Shrink a node to nothing and hide it. 
+		//
+		// description:
 		//		Returns an animation that will shrink node defined in "args"
 		//		from it's current height to 1px, and then hide it.
+		//
+		// args: Object
+		//		A hash-map of standard `dojo.Animation` constructor properties
+		//		(such as easing: node: duration: and so on)
+		// 
+		// example:
+		//	|	dojo.fx.wipeOut({ node:"someId" }).play()
+		
 		var node = args.node = d.byId(args.node), s = node.style, o;
 		
 		var anim = d.animateProperty(d.mixin({
@@ -10356,16 +11486,25 @@ dojo.fx = {
 			s.display = "none";
 		});
 
-		return anim; // dojo._Animation
+		return anim; // dojo.Animation
 	}
 
-	dojo.fx.slideTo = function(/*Object?*/ args){
+	dojo.fx.slideTo = function(/*Object*/ args){
 		// summary:
+		//		Slide a node to a new top/left position
+		//
+		// description:
 		//		Returns an animation that will slide "node" 
 		//		defined in args Object from its current position to
 		//		the position defined by (args.left, args.top).
+		//
+		// args: Object
+		//		A hash-map of standard `dojo.Animation` constructor properties
+		//		(such as easing: node: duration: and so on). Special args members
+		//		are `top` and `left`, which indicate the new position to slide to.
+		//
 		// example:
-		//	|	dojo.fx.slideTo({ node: node, left:"40", top:"50", unit:"px" }).play()
+		//	|	dojo.fx.slideTo({ node: node, left:"40", top:"50", units:"px" }).play()
 
 		var node = args.node = d.byId(args.node), 
 			top = null, left = null;
@@ -10377,7 +11516,7 @@ dojo.fx = {
 				top = (pos == 'absolute' ? n.offsetTop : parseInt(cs.top) || 0);
 				left = (pos == 'absolute' ? n.offsetLeft : parseInt(cs.left) || 0);
 				if(pos != 'absolute' && pos != 'relative'){
-					var ret = d.coords(n, true);
+					var ret = d.position(n, true);
 					top = ret.y;
 					left = ret.x;
 					n.style.position="absolute";
@@ -10396,7 +11535,7 @@ dojo.fx = {
 		}, args));
 		d.connect(anim, "beforeBegin", anim, init);
 
-		return anim; // dojo._Animation
+		return anim; // dojo.Animation
 	}
 
 })();
@@ -10661,7 +11800,7 @@ dojo.provide("dojox.charting.action2d.MoveSlice");
 				}
 			}
 
-			var index = o.index, anim, endScale, startOffset, endOffset,
+			var index = o.index, anim, startScale, endScale, startOffset, endOffset,
 				angle = (this.angles[index] + this.angles[index + 1]) / 2,
 				rotateTo0  = m.rotateAt(-angle, o.cx, o.cy),
 				rotateBack = m.rotateAt( angle, o.cx, o.cy);
@@ -10677,11 +11816,13 @@ dojo.provide("dojox.charting.action2d.MoveSlice");
 			if(o.type == "onmouseover"){
 				startOffset = 0;
 				endOffset   = this.shift;
+				startScale  = 1;
 				endScale    = this.scale;
 			}else{
 				startOffset = this.shift;
 				endOffset   = 0;
-				endScale    = 1 / this.scale;
+				startScale  = this.scale;
+				endScale    = 1;
 			}
 			
 			anim.action = dojox.gfx.fx.animateTransform({
@@ -10691,7 +11832,7 @@ dojo.provide("dojox.charting.action2d.MoveSlice");
 				transform: [
 					rotateBack,
 					{name: "translate", start: [startOffset, 0], end: [endOffset, 0]},
-					{name: "scaleAt",   start: [1, o.cx, o.cy],  end: [endScale, o.cx, o.cy]},
+					{name: "scaleAt",   start: [startScale, o.cx, o.cy],  end: [endScale, o.cx, o.cy]},
 					rotateTo0
 				]
 			});
@@ -10849,8 +11990,8 @@ dojo.date.stamp.fromISOString = function(/*String*/formattedString, /*Number?*/d
 			/^(?:(\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;
+	var match = dojo.date.stamp._isoRegExp.exec(formattedString),
+		result = null;
 
 	if(match){
 		match.shift();
@@ -10868,11 +12009,13 @@ dojo.date.stamp.fromISOString = function(/*String*/formattedString, /*Number?*/d
 				}
 			});
 		}
-		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
+		result = new Date(match[0]||1970, match[1]||0, match[2]||1, match[3]||0, match[4]||0, match[5]||0, match[6]||0); //TODO: UTC defaults
+		if(match[0] < 100){
+			result.setFullYear(match[0] || 1970);
+		}
 
-		var offset = 0;
-		var zoneSign = match[7] && match[7].charAt(0);
+		var offset = 0,
+			zoneSign = match[7] && match[7].charAt(0);
 		if(zoneSign != 'Z'){
 			offset = ((match[8] || 0) * 60) + (Number(match[9]) || 0);
 			if(zoneSign != '-'){ offset *= -1; }
@@ -10917,9 +12060,9 @@ dojo.date.stamp.toISOString = function(/*Date*/dateObject, /*dojo.date.stamp.__O
 
 	var _ = function(n){ return (n < 10) ? "0" + n : n; };
 	options = options || {};
-	var formattedDate = [];
-	var getter = options.zulu ? "getUTC" : "get";
-	var date = "";
+	var formattedDate = [],
+		getter = options.zulu ? "getUTC" : "get",
+		date = "";
 	if(options.selector != "time"){
 		var year = dateObject[getter+"FullYear"]();
 		date = ["0000".substr((year+"").length)+year, _(dateObject[getter+"Month"]()+1), _(dateObject[getter+"Date"]())].join('-');
@@ -10955,28 +12098,8 @@ dojo.parser = new function(){
 	// summary: The Dom/Widget parsing package
 
 	var d = dojo;
-	var dtName = d._scopeName + "Type";
-	var qry = "[" + dtName + "]";
-
-	var _anonCtr = 0, _anon = {};
-	var 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 nso = thisObj || _anon;
-		if(dojo.isIE){
-			var cn = anonFuncPtr["__dojoNameCache"];
-			if(cn && nso[cn] === anonFuncPtr){
-				return cn;
-			}
-		}
-		var name;
-		do{
-			name = "__" + _anonCtr++;
-		}while(name in nso)
-		nso[name] = anonFuncPtr;
-		return name; // String
-	}
+	this._attrName = d._scopeName + "Type";
+	this._query = "[" + this._attrName + "]";
 
 	function val2type(/*Object*/ value){
 		// summary:
@@ -11013,10 +12136,12 @@ dojo.parser = new function(){
 				}
 				try{
 					if(value.search(/[^\w\.]+/i) != -1){
-						// TODO: "this" here won't work
-						value = nameAnonFunc(new Function(value), this);
+						// The user has specified some text for a function like "return x+5"
+						return new Function(value);
+					}else{
+						// The user has specified the name of a function like "myOnClick"
+						return d.getObject(value, false);
 					}
-					return d.getObject(value, false);
 				}catch(e){ return new Function(); }
 			case "array":
 				return value ? value.split(/\s*,\s*/) : [];
@@ -11037,7 +12162,14 @@ dojo.parser = new function(){
 		// map from fully qualified name (like "dijit.Button") to structure like
 		// { cls: dijit.Button, params: {label: "string", disabled: "boolean"} }
 	};
-	
+
+	// Widgets like BorderContainer add properties to _Widget via dojo.extend().
+	// If BorderContainer is loaded after _Widget's parameter list has been cached,
+	// we need to refresh that parameter list (for _Widget and all widgets that extend _Widget).
+	dojo.connect(dojo, "extend", function(){
+		instanceClasses = {};
+	});
+
 	function getClassInfo(/*String*/ className){
 		// className:
 		//		fully qualified name (like "dijit.form.Button")
@@ -11090,20 +12222,25 @@ dojo.parser = new function(){
 		return new Function(preamble+script.innerHTML+suffix);
 	}
 
-	this.instantiate = function(/* Array */nodes, /* Object? */mixin){
+	this.instantiate = function(/* Array */nodes, /* Object? */mixin, /* Object? */args){
 		// 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		
-		// mixin: Object
+		// mixin: Object?
 		//		An object that will be mixed in with each node in the array.
 		//		Values in the mixin will override values in the node, if they
 		//		exist.
-		var thelist = [];
+		// args: Object?
+		//		An object used to hold kwArgs for instantiation.
+		//		Only supports 'noStart' currently.
+		var thelist = [], dp = dojo.parser;
 		mixin = mixin||{};
+		args = args||{};
+		
 		d.forEach(nodes, function(node){
 			if(!node){ return; }
-			var type = dtName in mixin?mixin[dtName]:node.getAttribute(dtName);
+			var type = dp._attrName in mixin?mixin[dp._attrName]:node.getAttribute(dp._attrName);
 			if(!type || !type.length){ return; }
 			var clsInfo = getClassInfo(type),
 				clazz = clsInfo.cls,
@@ -11159,10 +12296,7 @@ dojo.parser = new function(){
 				});
 			}
 
-			var markupFactory = clazz["markupFactory"];
-			if(!markupFactory && clazz["prototype"]){
-				markupFactory = clazz.prototype["markupFactory"];
-			}
+			var markupFactory = clazz.markupFactory || clazz.prototype && clazz.prototype.markupFactory;
 			// create the instance
 			var instance = markupFactory ? markupFactory(params, node, clazz) : new clazz(params, node);
 			thelist.push(instance);
@@ -11187,27 +12321,77 @@ dojo.parser = new function(){
 		// 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();
-			}
-		});
+		if(!mixin._started){
+			d.forEach(thelist, function(instance){
+				if(	!args.noStart && instance  && 
+					instance.startup &&
+					!instance._started && 
+					(!instance.getParent || !instance.getParent())
+				){
+					instance.startup();
+				}
+			});
+		}
 		return thelist;
 	};
 
-	this.parse = function(/*DomNode?*/ rootNode){
+	this.parse = function(/*DomNode?*/ rootNode, /* Object? */ args){
 		// summary:
+		//		Scan the DOM for class instances, and instantiate them.
+		//
+		// description:
 		//		Search specified node (or root node) recursively for class instances,
 		//		and instantiate them Searches for
 		//		dojoType="qualified.class.name"
-		var list = d.query(qry, rootNode);
-		// go build the object instances
-		var instances = this.instantiate(list);
-		return instances;
+		//
+		// rootNode: DomNode?
+		//		A default starting root node from which to start the parsing. Can be
+		//		omitted, defaulting to the entire document. If omitted, the `args`
+		//		object can be passed in this place. If the `args` object has a 
+		//		`rootNode` member, that is used.
+		//
+		// args:
+		//		a kwArgs object passed along to instantiate()
+		//		
+		//			* noStart: Boolean?
+		//				when set will prevent the parser from calling .startup()
+		//				when locating the nodes. 
+		//			* rootNode: DomNode?
+		//				identical to the function's `rootNode` argument, though
+		//				allowed to be passed in via this `args object. 
+		//
+		// example:
+		//		Parse all widgets on a page:
+		//	|		dojo.parser.parse();
+		//
+		// example:
+		//		Parse all classes within the node with id="foo"
+		//	|		dojo.parser.parse(dojo.byId(foo));
+		//
+		// example:
+		//		Parse all classes in a page, but do not call .startup() on any 
+		//		child
+		//	|		dojo.parser.parse({ noStart: true })
+		//
+		// example:
+		//		Parse all classes in a node, but do not call .startup()
+		//	|		dojo.parser.parse(someNode, { noStart:true });
+		//	|		// or
+		// 	|		dojo.parser.parse({ noStart:true, rootNode: someNode });
+
+		// determine the root node based on the passed arguments.
+		var root;
+		if(!args && rootNode && rootNode.rootNode){
+			args = rootNode;
+			root = args.rootNode;
+		}else{
+			root = rootNode;
+		}
+
+		var	list = d.query(this._query, root);
+			// go build the object instances
+		return this.instantiate(list, null, args); // Array
+
 	};
 }();
 
@@ -11216,7 +12400,7 @@ dojo.parser = new function(){
 
 (function(){
 	var parseRunner = function(){ 
-		if(dojo.config["parseOnLoad"] == true){
+		if(dojo.config.parseOnLoad){
 			dojo.parser.parse(); 
 		}
 	};
@@ -11231,6 +12415,128 @@ dojo.parser = new function(){
 
 }
 
+if(!dojo._hasResource["dojo.cache"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.cache"] = true;
+dojo.provide("dojo.cache");
+
+/*=====
+dojo.cache = { 
+	// summary:
+	// 		A way to cache string content that is fetchable via `dojo.moduleUrl`.
+};
+=====*/
+
+(function(){
+	var cache = {};
+	dojo.cache = function(/*String||Object*/module, /*String*/url, /*String||Object?*/value){
+		// summary:
+		// 		A getter and setter for storing the string content associated with the
+		// 		module and url arguments.
+		// description:
+		// 		module and url are used to call `dojo.moduleUrl()` to generate a module URL.
+		// 		If value is specified, the cache value for the moduleUrl will be set to
+		// 		that value. Otherwise, dojo.cache will fetch the moduleUrl and store it
+		// 		in its internal cache and return that cached value for the URL. To clear
+		// 		a cache value pass null for value. Since XMLHttpRequest (XHR) is used to fetch the
+		// 		the URL contents, only modules on the same domain of the page can use this capability.
+		// 		The build system can inline the cache values though, to allow for xdomain hosting.
+		// module: String||Object
+		// 		If a String, the module name to use for the base part of the URL, similar to module argument
+		// 		to `dojo.moduleUrl`. If an Object, something that has a .toString() method that
+		// 		generates a valid path for the cache item. For example, a dojo._Url object.
+		// url: String
+		// 		The rest of the path to append to the path derived from the module argument. If
+		// 		module is an object, then this second argument should be the "value" argument instead.
+		// value: String||Object?
+		// 		If a String, the value to use in the cache for the module/url combination.
+		// 		If an Object, it can have two properties: value and sanitize. The value property
+		// 		should be the value to use in the cache, and sanitize can be set to true or false,
+		// 		to indicate if XML declarations should be removed from the value and if the HTML
+		// 		inside a body tag in the value should be extracted as the real value. The value argument
+		// 		or the value property on the value argument are usually only used by the build system
+		// 		as it inlines cache content.
+		//	example:
+		//		To ask dojo.cache to fetch content and store it in the cache (the dojo["cache"] style
+		// 		of call is used to avoid an issue with the build system erroneously trying to intern
+		// 		this example. To get the build system to intern your dojo.cache calls, use the
+		// 		"dojo.cache" style of call):
+		// 		|	//If template.html contains "<h1>Hello</h1>" that will be
+		// 		|	//the value for the text variable.
+		//		|	var text = dojo["cache"]("my.module", "template.html");
+		//	example:
+		//		To ask dojo.cache to fetch content and store it in the cache, and sanitize the input
+		// 		 (the dojo["cache"] style of call is used to avoid an issue with the build system 
+		// 		erroneously trying to intern this example. To get the build system to intern your
+		// 		dojo.cache calls, use the "dojo.cache" style of call):
+		// 		|	//If template.html contains "<html><body><h1>Hello</h1></body></html>", the
+		// 		|	//text variable will contain just "<h1>Hello</h1>".
+		//		|	var text = dojo["cache"]("my.module", "template.html", {sanitize: true});
+		//	example:
+		//		Same example as previous, but demostrates how an object can be passed in as
+		//		the first argument, then the value argument can then be the second argument.
+		// 		|	//If template.html contains "<html><body><h1>Hello</h1></body></html>", the
+		// 		|	//text variable will contain just "<h1>Hello</h1>".
+		//		|	var text = dojo["cache"](new dojo._Url("my/module/template.html"), {sanitize: true});
+
+		//Module could be a string, or an object that has a toString() method
+		//that will return a useful path. If it is an object, then the "url" argument
+		//will actually be the value argument.
+		if(typeof module == "string"){
+			var pathObj = dojo.moduleUrl(module, url);
+		}else{
+			pathObj = module;
+			value = url;
+		}
+		var key = pathObj.toString();
+
+		var val = value;
+		if(value !== undefined && !dojo.isString(value)){
+			val = ("value" in value ? value.value : undefined);
+		}
+
+		var sanitize = value && value.sanitize ? true : false;
+
+		if(val || val === null){
+			//We have a value, either clear or set the cache value.
+			if(val == null){
+				delete cache[key];
+			}else{
+				val = cache[key] = sanitize ? dojo.cache._sanitize(val) : val;
+			}
+		}else{
+			//Allow cache values to be empty strings. If key property does
+			//not exist, fetch it.
+			if(!(key in cache)){
+				val = dojo._getText(key);
+				cache[key] = sanitize ? dojo.cache._sanitize(val) : val;
+			}
+			val = cache[key];
+		}
+		return val; //String
+	};
+
+	dojo.cache._sanitize = function(/*String*/val){
+		// summary: 
+		//		Strips <?xml ...?> declarations so that external SVG and XML
+		// 		documents can be added to a document without worry. Also, if the string
+		//		is an HTML document, only the part inside the body tag is returned.
+		// description:
+		// 		Copied from dijit._Templated._sanitizeTemplateString.
+		if(val){
+			val = val.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, "");
+			var matches = val.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
+			if(matches){
+				val = matches[1];
+			}
+		}else{
+			val = "";
+		}
+		return val; //String
+	};
+})();
+
+}
+
 if(!dojo._hasResource["dijit._Templated"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
 dojo._hasResource["dijit._Templated"] = true;
 dojo.provide("dijit._Templated");
@@ -11239,22 +12545,25 @@ dojo.provide("dijit._Templated");
 
 
 
+
 dojo.declare("dijit._Templated",
 	null,
 	{
-		//	summary:
+		// summary:
 		//		Mixin for widgets that are instantiated from a template
-		// 
 
 		// templateString: [protected] String
 		//		A string that represents the widget template. Pre-empts the
 		//		templatePath. In builds that have their strings "interned", the
 		//		templatePath is converted to an inline templateString, thereby
 		//		preventing a synchronous network call.
+		//
+		//		Use in conjunction with dojo.cache() to load from a file.
 		templateString: null,
 
-		// templatePath: [protected] String
-		//		Path to template (HTML file) for this widget relative to dojo.baseUrl
+		// templatePath: [protected deprecated] String
+		//		Path to template (HTML file) for this widget relative to dojo.baseUrl.
+		//		Deprecated: use templateString with dojo.cache() instead.
 		templatePath: null,
 
 		// widgetsInTemplate: [protected] Boolean
@@ -11268,6 +12577,26 @@ dojo.declare("dijit._Templated",
 		//		that its template is always re-built from a string
 		_skipNodeCache: false,
 
+		// _earlyTemplatedStartup: Boolean
+		//		A fallback to preserve the 1.0 - 1.3 behavior of children in
+		//		templates having their startup called before the parent widget
+		//		fires postCreate. Defaults to 'false', causing child widgets to
+		//		have their .startup() called immediately before a parent widget
+		//		.startup(), but always after the parent .postCreate(). Set to
+		//		'true' to re-enable to previous, arguably broken, behavior.
+		_earlyTemplatedStartup: false,
+
+		// _attachPoints: [private] String[]
+		//		List of widget attribute names associated with dojoAttachPoint=... in the
+		//		template, ex: ["containerNode", "labelNode"]
+/*=====
+ 		_attachPoints: [],
+ =====*/
+
+		constructor: function(){
+			this._attachPoints = [];
+		},
+
 		_stringRepl: function(tmpl){
 			// summary:
 			//		Does substitution of ${foo} type properties in template string
@@ -11305,6 +12634,10 @@ dojo.declare("dijit._Templated",
 			var node;
 			if(dojo.isString(cached)){
 				node = dojo._toDom(this._stringRepl(cached));
+				if(node.nodeType != 1){
+					// Flag common problems such as templates with multiple top level nodes (nodeType == 11)
+					throw new Error("Invalid template: " + cached);
+				}
 			}else{
 				// if it's a node, all we have to do is clone it
 				node = cached.cloneNode(true);
@@ -11317,7 +12650,29 @@ dojo.declare("dijit._Templated",
 			this._attachTemplateNodes(node);
 
 			if(this.widgetsInTemplate){
-				var cw = (this._supportingWidgets = dojo.parser.parse(node));
+				// Make sure dojoType is used for parsing widgets in template.
+				// The dojo.parser.query could be changed from multiversion support.
+				var parser = dojo.parser, qry, attr;
+				if(parser._query != "[dojoType]"){
+					qry = parser._query;
+					attr = parser._attrName;
+					parser._query = "[dojoType]";
+					parser._attrName = "dojoType";
+				}
+
+				// Store widgets that we need to start at a later point in time
+				var cw = (this._startupWidgets = dojo.parser.parse(node, {
+					noStart: !this._earlyTemplatedStartup
+				}));
+
+				// Restore the query.
+				if(qry){
+					parser._query = qry;
+					parser._attrName = attr;
+				}
+
+				this._supportingWidgets = dijit.findWidgets(node);
+
 				this._attachTemplateNodes(cw, function(n,p){
 					return n[p];
 				});
@@ -11342,13 +12697,13 @@ dojo.declare("dijit._Templated",
 
 		_attachTemplateNodes: function(rootNode, getAttrFunc){
 			// summary:
-			//		Iterate through the template and attach functions and nodes accordingly.	
-			// description:		
+			//		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	
+			//			* dojoAttachEvent
 			//			* waiRole
 			//			* waiState
 			// rootNode: DomNode|Array[Widgets]
@@ -11378,6 +12733,7 @@ dojo.declare("dijit._Templated",
 						}else{
 							this[point]=baseNode;
 						}
+						this._attachPoints.push(point);
 					}
 				}
 
@@ -11422,6 +12778,25 @@ dojo.declare("dijit._Templated",
 					});
 				}
 			}
+		},
+
+		startup: function(){
+			dojo.forEach(this._startupWidgets, function(w){
+				if(w && !w._started && w.startup){
+					w.startup();
+				}
+			});
+			this.inherited(arguments);
+		},
+
+		destroyRendering: function(){
+			// Delete all attach points to prevent IE6 memory leaks.
+			dojo.forEach(this._attachPoints, function(point){
+				delete this[point];
+			}, this);
+			this._attachPoints = [];
+
+			this.inherited(arguments);
 		}
 	}
 );
@@ -11433,8 +12808,8 @@ dijit._Templated.getCachedTemplate = function(templatePath, templateString, alwa
 	// 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.
+	// templatePath: String||dojo.uri.Uri
+	//		The URL to get the template from.
 	// templateString: String?
 	//		a string to use in lieu of fetching the template from a URL. Takes precedence
 	//		over templatePath
@@ -11447,19 +12822,20 @@ dijit._Templated.getCachedTemplate = function(templatePath, templateString, alwa
 	var key = templateString || templatePath;
 	var cached = tmplts[key];
 	if(cached){
-		if(!cached.ownerDocument || cached.ownerDocument == dojo.doc){
-			// string or node of the same document
-			return cached;
-		}
-		// destroy the old cached node of a different document
+		try{
+			// if the cached value is an innerHTML string (no ownerDocument) or a DOM tree created within the current document, then use the current cached value
+			if(!cached.ownerDocument || cached.ownerDocument == dojo.doc){
+				// string or node of the same document
+				return cached;
+			}
+		}catch(e){ /* squelch */ } // IE can throw an exception if cached.ownerDocument was reloaded
 		dojo.destroy(cached);
 	}
 
 	// If necessary, load template string from template path
 	if(!templateString){
-		templateString = dijit._Templated._sanitizeTemplateString(dojo.trim(dojo._getText(templatePath)));
+		templateString = dojo.cache(templatePath, {sanitize: true});
 	}
-
 	templateString = dojo.string.trim(templateString);
 
 	if(alwaysUseString || templateString.match(/\$\{([^\}]+)\}/g)){
@@ -11467,34 +12843,20 @@ dijit._Templated.getCachedTemplate = function(templatePath, templateString, alwa
 		return (tmplts[key] = templateString); //String
 	}else{
 		// there are no variables in the template so we can cache the DOM tree
-		return (tmplts[key] = dojo._toDom(templateString)); //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];
+		var node = dojo._toDom(templateString);
+		if(node.nodeType != 1){
+			throw new Error("Invalid template: " + templateString);
 		}
-	}else{
-		tString = "";
+		return (tmplts[key] = node); //Node
 	}
-	return tString; //String
 };
 
-
 if(dojo.isIE){
 	dojo.addOnWindowUnload(function(){
 		var cache = dijit._Templated._templateCache;
 		for(var key in cache){
 			var value = cache[key];
-			if(!isNaN(value.nodeType)){ // isNode equivalent
+			if(typeof value == "object"){ // value is either a string or a DOM node template
 				dojo.destroy(value);
 			}
 			delete cache[key];
@@ -11537,7 +12899,7 @@ dojo.declare(
 		//		Milliseconds to fade in/fade out
 		duration: dijit.defaultDuration,
 
-		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",
+		templateString: dojo.cache("dijit", "templates/Tooltip.html", "<div class=\"dijitTooltip dijitTooltipLeft\" id=\"dojoTooltip\">\n\t<div class=\"dijitTooltipContainer dijitTooltipContents\" dojoAttachPoint=\"containerNode\" waiRole='alert'></div>\n\t<div class=\"dijitTooltipConnector\"></div>\n</div>\n"),
 
 		postCreate: function(){
 			dojo.body().appendChild(this.domNode);
@@ -11570,31 +12932,7 @@ dojo.declare(
 			// 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"));
+			var pos = dijit.placeOnScreenAroundElement(this.domNode, aroundNode, dijit.getPopupAroundAlignment((position && position.length) ? position : dijit.Tooltip.defaultPosition, this.isLeftToRight()), dojo.hitch(this, "orient"));
 
 			// show it
 			dojo.style(this.domNode, "opacity", 0);
@@ -11687,7 +13025,7 @@ dojo.declare(
 	"dijit.Tooltip",
 	dijit._Widget,
 	{
-		// summary
+		// summary:
 		//		Pops up a tooltip (a help message) when you hover over a node.
 
 		// label: String
@@ -11714,34 +13052,72 @@ dojo.declare(
 		//		See description of `dijit.Tooltip.defaultPosition` for details on position parameter.
 		position: [],
 
-		_setConnectIdAttr: function(ids){
-			// TODO: erase old conections
+		constructor: function(){
+			// Map id's of nodes I'm connected to to a list of the this.connect() handles
+			this._nodeConnectionsById = {};
+		},
 
-			this._connectNodes = [];
+		_setConnectIdAttr: function(newIds){
+			for(var oldId in this._nodeConnectionsById){
+				this.removeTarget(oldId);
+			}
+			dojo.forEach(dojo.isArrayLike(newIds) ? newIds : [newIds], this.addTarget, this);
+		},
 
-			// TODO: rename connectId to connectIds for 2.0, and remove this code converting from string to array
-			this.connectId = dojo.isArrayLike(ids) ? ids : [ids];
-			
-			dojo.forEach(this.connectId, function(id) {
-				var node = dojo.byId(id);
-				if (node) {
-					this._connectNodes.push(node);
-					dojo.forEach(["onMouseEnter", "onMouseLeave", "onFocus", "onBlur"], function(event){
-						this.connect(node, event.toLowerCase(), "_"+event);
-					}, this);
-					if(dojo.isIE){
-						// BiDi workaround
-						node.style.zoom = 1;
-					}
-				}
-			}, this);
+		_getConnectIdAttr: function(){
+			var ary = [];
+			for(var id in this._nodeConnectionsById){
+				ary.push(id);
+			}
+			return ary;
+		},
+
+		addTarget: function(/*DOMNODE || String*/ id){
+			// summary:
+			//		Attach tooltip to specified node, if it's not already connected
+			var node = dojo.byId(id);
+			if(!node){ return; }
+			if(node.id in this._nodeConnectionsById){ return; }//Already connected
+
+			this._nodeConnectionsById[node.id] = [
+				this.connect(node, "onmouseenter", "_onTargetMouseEnter"),
+				this.connect(node, "onmouseleave", "_onTargetMouseLeave"),
+				this.connect(node, "onfocus", "_onTargetFocus"),
+				this.connect(node, "onblur", "_onTargetBlur")
+			];
+			if(dojo.isIE && !node.style.zoom){//preserve zoom
+				// BiDi workaround
+				node.style.zoom = 1;
+			}
+		},
+
+		removeTarget: function(/*DOMNODE || String*/ node){
+			// summary:
+			//		Detach tooltip from specified node
+
+			// map from DOMNode back to plain id string
+			var id = node.id || node;
+
+			if(id in this._nodeConnectionsById){
+				dojo.forEach(this._nodeConnectionsById[id], this.disconnect, this);
+				delete this._nodeConnectionsById[id];
+			}
 		},
 
-		postCreate: function(){	
+		postCreate: function(){
 			dojo.addClass(this.domNode,"dijitTooltipData");
 		},
 
-		_onMouseEnter: function(/*Event*/ e){
+		startup: function(){
+			this.inherited(arguments);
+
+			// If this tooltip was created in a template, or for some other reason the specified connectId[s]
+			// didn't exist during the widget's initialization, then connect now.
+			var ids = this.connectId;
+			dojo.forEach(dojo.isArrayLike(ids) ? ids : [ids], this.addTarget, this);
+		},
+
+		_onTargetMouseEnter: function(/*Event*/ e){
 			// summary:
 			//		Handler for mouseenter event on the target node
 			// tags:
@@ -11749,7 +13125,7 @@ dojo.declare(
 			this._onHover(e);
 		},
 
-		_onMouseLeave: function(/*Event*/ e){
+		_onTargetMouseLeave: function(/*Event*/ e){
 			// summary:
 			//		Handler for mouseleave event on the target node
 			// tags:
@@ -11757,32 +13133,24 @@ dojo.declare(
 			this._onUnHover(e);
 		},
 
-		_onFocus: function(/*Event*/ e){
+		_onTargetFocus: function(/*Event*/ e){
 			// summary:
 			//		Handler for focus event on the target node
 			// tags:
 			//		private
 
-			// TODO: this is dangerously named, as the dijit focus manager calls
-			// _onFocus() on any widget that gets focus (whereas in this class we
-			// are connecting onfocus on the *target* DOM node to this method
-
 			this._focus = true;
 			this._onHover(e);
-			this.inherited(arguments);
 		},
-		
-		_onBlur: function(/*Event*/ e){
+
+		_onTargetBlur: function(/*Event*/ e){
 			// summary:
 			//		Handler for blur event on the target node
 			// tags:
 			//		private
 
-			// TODO: rename; see above comment
-
 			this._focus = false;
 			this._onUnHover(e);
-			this.inherited(arguments);
 		},
 
 		_onHover: function(/*Event*/ e){
@@ -11821,16 +13189,14 @@ dojo.declare(
 			// tags:
 			//		private
 
-			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;
+			this.onShow(target, this.position);
 		},
 
 		close: function(){
@@ -11843,6 +13209,7 @@ dojo.declare(
 				// if tooltip is currently shown
 				dijit.hideTooltip(this._connectNode);
 				delete this._connectNode;
+				this.onHide();
 			}
 			if(this._showTimer){
 				// if tooltip is scheduled to be shown (after a brief delay)
@@ -11851,8 +13218,23 @@ dojo.declare(
 			}
 		},
 
+		onShow: function(target, position){
+			// summary:
+			//		Called when the tooltip is shown
+			// tags:
+			//		callback
+		},
+
+		onHide: function(){
+			// summary:
+			//		Called when the tooltip is hidden
+			// tags:
+			//		callback
+		},
+
 		uninitialize: function(){
 			this.close();
+			this.inherited(arguments);
 		}
 	}
 );
@@ -11894,8 +13276,17 @@ dojo.provide("dojox.charting.action2d.Tooltip");
 (function(){
 	var DEFAULT_TEXT = function(o){
 		var t = o.run && o.run.data && o.run.data[o.index];
-		if(t && typeof t == "object" && t.tooltip){
-			return t.tooltip;
+		if(t && typeof t != "number" && (t.tooltip || t.text)){
+			return t.tooltip || t.text;
+		}
+		if(o.element == "candlestick"){
+			return '<table cellpadding="1" cellspacing="0" border="0" style="font-size:0.9em;">'
+				+ '<tr><td>Open:</td><td align="right"><strong>' + o.data.open + '</strong></td></tr>'
+				+ '<tr><td>High:</td><td align="right"><strong>' + o.data.high + '</strong></td></tr>'
+				+ '<tr><td>Low:</td><td align="right"><strong>' + o.data.low + '</strong></td></tr>'
+				+ '<tr><td>Close:</td><td align="right"><strong>' + o.data.close + '</strong></td></tr>'
+				+ (o.data.mid !== undefined ? '<tr><td>Mid:</td><td align="right"><strong>' + o.data.mid + '</strong></td></tr>' : '')
+				+ '</table>';
 		}
 		return o.element == "bar" ? o.x : o.y;
 	};
@@ -11940,9 +13331,16 @@ dojo.provide("dojox.charting.action2d.Tooltip");
 					break;
 				case "column":
 					position = ["above", "below"];
+					// intentional fall down
 				case "bar":
 					aroundRect = dojo.clone(o.shape.getShape());
 					break;
+				case "candlestick":
+					aroundRect.x = o.x;
+					aroundRect.y = o.y;
+					aroundRect.width = o.width;
+					aroundRect.height = o.height;
+					break;
 				default:
 				//case "slice":
 					if(!this.angles){
@@ -12401,6 +13799,7 @@ dojo.declare("dojox.charting.widget.Legend", [dijit._Widget, dijit._Templated],
 	
 	chartRef:   "",
 	horizontal: true,
+	swatchSize: 18,
 	
 	templateString: "<table dojoAttachPoint='legendNode' class='dojoxLegendNode'><tbody dojoAttachPoint='legendBody'></tbody></table>",
 	
@@ -12416,7 +13815,7 @@ dojo.declare("dojox.charting.widget.Legend", [dijit._Widget, dijit._Templated],
 				if(node){
 					this.chart = dijit.byNode(node);
 				}else{
-					
+					console.log("Could not find chart instance with id: " + this.chartRef);
 					return;
 				}
 			}
@@ -12483,8 +13882,8 @@ dojo.declare("dojox.charting.widget.Legend", [dijit._Widget, dijit._Templated],
 			div  = dojo.doc.createElement("div");
 		dojo.addClass(icon, "dojoxLegendIcon");
 		dojo.addClass(text, "dojoxLegendText");
-		div.style.width  = "20px";
-		div.style.height = "20px";
+		div.style.width  = this.swatchSize + "px";
+		div.style.height = this.swatchSize + "px";
 		icon.appendChild(div);
 		
 		// create a skeleton
@@ -12505,7 +13904,7 @@ dojo.declare("dojox.charting.widget.Legend", [dijit._Widget, dijit._Templated],
 		text.innerHTML = String(label);
 	},
 	_makeIcon: function(div, dyn){
-		var mb = {h: 14, w: 14};
+		var mb = { h: this.swatchSize, w: this.swatchSize };
 		var surface = dojox.gfx.createSurface(div, mb.w, mb.h);
 		this._surfaces.push(surface);
 		if(dyn.fill){
diff --git a/dojox/charting/widget/Legend.js b/dojox/charting/widget/Legend.js
index c11ce45..60c87bc 100644
--- a/dojox/charting/widget/Legend.js
+++ b/dojox/charting/widget/Legend.js
@@ -12,7 +12,7 @@ dojo.require("dijit._Widget");
 dojo.require("dijit._Templated");
 dojo.require("dojox.lang.functional.array");
 dojo.require("dojox.lang.functional.fold");
-dojo.declare("dojox.charting.widget.Legend",[dijit._Widget,dijit._Templated],{chartRef:"",horizontal:true,templateString:"<table dojoAttachPoint='legendNode' class='dojoxLegendNode'><tbody dojoAttachPoint='legendBody'></tbody></table>",legendNode:null,legendBody:null,postCreate:function(){
+dojo.declare("dojox.charting.widget.Legend",[dijit._Widget,dijit._Templated],{chartRef:"",horizontal:true,swatchSize:18,templateString:"<table dojoAttachPoint='legendNode' class='dojoxLegendNode'><tbody dojoAttachPoint='legendBody'></tbody></table>",legendNode:null,legendBody:null,postCreate:function(){
 if(!this.chart){
 if(!this.chartRef){
 return;
@@ -23,7 +23,6 @@ var _1=dojo.byId(this.chartRef);
 if(_1){
 this.chart=dijit.byNode(_1);
 }else{
-
 return;
 }
 }
@@ -35,8 +34,8 @@ this.refresh();
 },refresh:function(){
 var df=dojox.lang.functional;
 if(this._surfaces){
-dojo.forEach(this._surfaces,function(_3){
-_3.destroy();
+dojo.forEach(this._surfaces,function(_2){
+_2.destroy();
 });
 }
 this._surfaces=[];
@@ -55,12 +54,12 @@ return;
 if(s[0].chart.stack[0].declaredClass=="dojox.charting.plot2d.Pie"){
 var t=s[0].chart.stack[0];
 if(typeof t.run.data[0]=="number"){
-var _6=df.map(t.run.data,"Math.max(x, 0)");
-if(df.every(_6,"<= 0")){
+var _3=df.map(t.run.data,"Math.max(x, 0)");
+if(df.every(_3,"<= 0")){
 return;
 }
-var _7=df.map(_6,"/this",df.foldl(_6,"+",0));
-dojo.forEach(_7,function(x,i){
+var _4=df.map(_3,"/this",df.foldl(_3,"+",0));
+dojo.forEach(_4,function(x,i){
 this._addLabel(t.dyn[i],t._getLabel(x*100)+"%");
 },this);
 }else{
@@ -73,48 +72,48 @@ dojo.forEach(s,function(x){
 this._addLabel(x.dyn,x.legend||x.name);
 },this);
 }
-},_addLabel:function(_d,_e){
-var _f=dojo.doc.createElement("td"),_10=dojo.doc.createElement("td"),div=dojo.doc.createElement("div");
-dojo.addClass(_f,"dojoxLegendIcon");
-dojo.addClass(_10,"dojoxLegendText");
-div.style.width="20px";
-div.style.height="20px";
-_f.appendChild(div);
+},_addLabel:function(_5,_6){
+var _7=dojo.doc.createElement("td"),_8=dojo.doc.createElement("td"),_9=dojo.doc.createElement("div");
+dojo.addClass(_7,"dojoxLegendIcon");
+dojo.addClass(_8,"dojoxLegendText");
+_9.style.width=this.swatchSize+"px";
+_9.style.height=this.swatchSize+"px";
+_7.appendChild(_9);
 if(this._tr){
-this._tr.appendChild(_f);
-this._tr.appendChild(_10);
+this._tr.appendChild(_7);
+this._tr.appendChild(_8);
 }else{
 var tr=dojo.doc.createElement("tr");
 this.legendBody.appendChild(tr);
-tr.appendChild(_f);
-tr.appendChild(_10);
-}
-this._makeIcon(div,_d);
-_10.innerHTML=String(_e);
-},_makeIcon:function(div,dyn){
-var mb={h:14,w:14};
-var _16=dojox.gfx.createSurface(div,mb.w,mb.h);
-this._surfaces.push(_16);
-if(dyn.fill){
-_16.createRect({x:2,y:2,width:mb.w-4,height:mb.h-4}).setFill(dyn.fill).setStroke(dyn.stroke);
+tr.appendChild(_7);
+tr.appendChild(_8);
+}
+this._makeIcon(_9,_5);
+_8.innerHTML=String(_6);
+},_makeIcon:function(_a,_b){
+var mb={h:this.swatchSize,w:this.swatchSize};
+var _c=dojox.gfx.createSurface(_a,mb.w,mb.h);
+this._surfaces.push(_c);
+if(_b.fill){
+_c.createRect({x:2,y:2,width:mb.w-4,height:mb.h-4}).setFill(_b.fill).setStroke(_b.stroke);
 }else{
-if(dyn.stroke||dyn.marker){
-var _17={x1:0,y1:mb.h/2,x2:mb.w,y2:mb.h/2};
-if(dyn.stroke){
-_16.createLine(_17).setStroke(dyn.stroke);
+if(_b.stroke||_b.marker){
+var _d={x1:0,y1:mb.h/2,x2:mb.w,y2:mb.h/2};
+if(_b.stroke){
+_c.createLine(_d).setStroke(_b.stroke);
 }
-if(dyn.marker){
+if(_b.marker){
 var c={x:mb.w/2,y:mb.h/2};
-if(dyn.stroke){
-_16.createPath({path:"M"+c.x+" "+c.y+" "+dyn.marker}).setFill(dyn.stroke.color).setStroke(dyn.stroke);
+if(_b.stroke){
+_c.createPath({path:"M"+c.x+" "+c.y+" "+_b.marker}).setFill(_b.stroke.color).setStroke(_b.stroke);
 }else{
-_16.createPath({path:"M"+c.x+" "+c.y+" "+dyn.marker}).setFill(dyn.color).setStroke(dyn.color);
+_c.createPath({path:"M"+c.x+" "+c.y+" "+_b.marker}).setFill(_b.color).setStroke(_b.color);
 }
 }
 }else{
-_16.createRect({x:2,y:2,width:mb.w-4,height:mb.h-4}).setStroke("black");
-_16.createLine({x1:2,y1:2,x2:mb.w-2,y2:mb.h-2}).setStroke("black");
-_16.createLine({x1:2,y1:mb.h-2,x2:mb.w-2,y2:2}).setStroke("black");
+_c.createRect({x:2,y:2,width:mb.w-4,height:mb.h-4}).setStroke("black");
+_c.createLine({x1:2,y1:2,x2:mb.w-2,y2:mb.h-2}).setStroke("black");
+_c.createLine({x1:2,y1:mb.h-2,x2:mb.w-2,y2:2}).setStroke("black");
 }
 }
 }});
diff --git a/dojox/charting/widget/Sparkline.js b/dojox/charting/widget/Sparkline.js
index f1c791f..ebd9e86 100644
--- a/dojox/charting/widget/Sparkline.js
+++ b/dojox/charting/widget/Sparkline.js
@@ -15,17 +15,17 @@ var d=dojo;
 dojo.declare("dojox.charting.widget.Sparkline",dojox.charting.widget.Chart2D,{theme:dojox.charting.themes.ET.greys,margins:{l:0,r:0,t:0,b:0},type:"Lines",valueFn:"Number(x)",store:"",field:"",query:"",queryOptions:"",start:"0",count:"Infinity",sort:"",data:"",name:"default",buildRendering:function(){
 var n=this.srcNodeRef;
 if(!n.childNodes.length||!d.query("> .axis, > .plot, > .action, > .series",n).length){
-var _3=document.createElement("div");
-d.attr(_3,{"class":"plot","name":"default","type":this.type});
-n.appendChild(_3);
-var _4=document.createElement("div");
-d.attr(_4,{"class":"series",plot:"default",name:this.name,start:this.start,count:this.count,valueFn:this.valueFn});
+var _1=document.createElement("div");
+d.attr(_1,{"class":"plot","name":"default","type":this.type});
+n.appendChild(_1);
+var _2=document.createElement("div");
+d.attr(_2,{"class":"series",plot:"default",name:this.name,start:this.start,count:this.count,valueFn:this.valueFn});
 d.forEach(["store","field","query","queryOptions","sort","data"],function(i){
 if(this[i].length){
-d.attr(_4,i,this[i]);
+d.attr(_2,i,this[i]);
 }
 },this);
-n.appendChild(_4);
+n.appendChild(_2);
 }
 this.inherited(arguments);
 }});
diff --git a/dojox/collections/ArrayList.js b/dojox/collections/ArrayList.js
index 924798c..b6fabaf 100644
--- a/dojox/collections/ArrayList.js
+++ b/dojox/collections/ArrayList.js
@@ -40,37 +40,37 @@ this.count=0;
 this.clone=function(){
 return new dojox.collections.ArrayList(_2);
 };
-this.contains=function(_7){
+this.contains=function(_4){
 for(var i=0;i<_2.length;i++){
-if(_2[i]==_7){
+if(_2[i]==_4){
 return true;
 }
 }
 return false;
 };
-this.forEach=function(fn,_a){
-dojo.forEach(_2,fn,_a);
+this.forEach=function(fn,_5){
+dojo.forEach(_2,fn,_5);
 };
 this.getIterator=function(){
 return new dojox.collections.Iterator(_2);
 };
-this.indexOf=function(_b){
+this.indexOf=function(_6){
 for(var i=0;i<_2.length;i++){
-if(_2[i]==_b){
+if(_2[i]==_6){
 return i;
 }
 }
 return -1;
 };
-this.insert=function(i,_e){
-_2.splice(i,0,_e);
+this.insert=function(i,_7){
+_2.splice(i,0,_7);
 this.count=_2.length;
 };
 this.item=function(i){
 return _2[i];
 };
-this.remove=function(obj){
-var i=this.indexOf(obj);
+this.remove=function(_8){
+var i=this.indexOf(_8);
 if(i>=0){
 _2.splice(i,1);
 }
@@ -90,15 +90,15 @@ _2.sort(fn);
 _2.sort();
 }
 };
-this.setByIndex=function(i,obj){
-_2[i]=obj;
+this.setByIndex=function(i,_9){
+_2[i]=_9;
 this.count=_2.length;
 };
 this.toArray=function(){
 return [].concat(_2);
 };
-this.toString=function(_16){
-return _2.join((_16||","));
+this.toString=function(_a){
+return _2.join((_a||","));
 };
 };
 }
diff --git a/dojox/collections/BinaryTree.js b/dojox/collections/BinaryTree.js
index 3b4a3d7..341dd88 100644
--- a/dojox/collections/BinaryTree.js
+++ b/dojox/collections/BinaryTree.js
@@ -48,85 +48,85 @@ return -1;
 return 0;
 };
 };
-function _9(_a,a){
-if(_a){
-_9(_a.left,a);
-a.push(_a.value);
-_9(_a.right,a);
+function _6(_7,a){
+if(_7){
+_6(_7.left,a);
+a.push(_7.value);
+_6(_7.right,a);
 }
 };
-function _c(_d,_e){
+function _8(_9,_a){
 var s="";
-if(_d){
-s=_d.value.toString()+_e;
-s+=_c(_d.left,_e);
-s+=_c(_d.right,_e);
+if(_9){
+s=_9.value.toString()+_a;
+s+=_8(_9.left,_a);
+s+=_8(_9.right,_a);
 }
 return s;
 };
-function _10(_11,sep){
+function _b(_c,_d){
 var s="";
-if(_11){
-s=_10(_11.left,sep);
-s+=_11.value.toString()+sep;
-s+=_10(_11.right,sep);
+if(_c){
+s=_b(_c.left,_d);
+s+=_c.value.toString()+_d;
+s+=_b(_c.right,_d);
 }
 return s;
 };
-function _14(_15,sep){
+function _e(_f,sep){
 var s="";
-if(_15){
-s=_14(_15.left,sep);
-s+=_14(_15.right,sep);
-s+=_15.value.toString()+sep;
+if(_f){
+s=_e(_f.left,sep);
+s+=_e(_f.right,sep);
+s+=_f.value.toString()+sep;
 }
 return s;
 };
-function _18(_19,_1a){
-if(!_19){
+function _10(_11,_12){
+if(!_11){
 return null;
 }
-var i=_19.compareData(_1a);
+var i=_11.compareData(_12);
 if(i==0){
-return _19;
+return _11;
 }
 if(i>0){
-return _18(_19.left,_1a);
+return _10(_11.left,_12);
 }else{
-return _18(_19.right,_1a);
+return _10(_11.right,_12);
 }
 };
-this.add=function(_1c){
-var n=new _2(_1c);
+this.add=function(_13){
+var n=new _2(_13);
 var i;
-var _1f=_20;
-var _21=null;
-while(_1f){
-i=_1f.compare(n);
+var _14=_15;
+var _16=null;
+while(_14){
+i=_14.compare(n);
 if(i==0){
 return;
 }
-_21=_1f;
+_16=_14;
 if(i>0){
-_1f=_1f.left;
+_14=_14.left;
 }else{
-_1f=_1f.right;
+_14=_14.right;
 }
 }
 this.count++;
-if(!_21){
-_20=n;
+if(!_16){
+_15=n;
 }else{
-i=_21.compare(n);
+i=_16.compare(n);
 if(i>0){
-_21.left=n;
+_16.left=n;
 }else{
-_21.right=n;
+_16.right=n;
 }
 }
 };
 this.clear=function(){
-_20=null;
+_15=null;
 this.count=0;
 };
 this.clone=function(){
@@ -137,75 +137,75 @@ c.add(itr.get());
 }
 return c;
 };
-this.contains=function(_24){
-return this.search(_24)!=null;
+this.contains=function(_17){
+return this.search(_17)!=null;
 };
-this.deleteData=function(_25){
-var _26=_20;
-var _27=null;
-var i=_26.compareData(_25);
-while(i!=0&&_26!=null){
+this.deleteData=function(_18){
+var _19=_15;
+var _1a=null;
+var i=_19.compareData(_18);
+while(i!=0&&_19!=null){
 if(i>0){
-_27=_26;
-_26=_26.left;
+_1a=_19;
+_19=_19.left;
 }else{
 if(i<0){
-_27=_26;
-_26=_26.right;
+_1a=_19;
+_19=_19.right;
 }
 }
-i=_26.compareData(_25);
+i=_19.compareData(_18);
 }
-if(!_26){
+if(!_19){
 return;
 }
 this.count--;
-if(!_26.right){
-if(!_27){
-_20=_26.left;
+if(!_19.right){
+if(!_1a){
+_15=_19.left;
 }else{
-i=_27.compare(_26);
+i=_1a.compare(_19);
 if(i>0){
-_27.left=_26.left;
+_1a.left=_19.left;
 }else{
 if(i<0){
-_27.right=_26.left;
+_1a.right=_19.left;
 }
 }
 }
 }else{
-if(!_26.right.left){
-if(!_27){
-_20=_26.right;
+if(!_19.right.left){
+if(!_1a){
+_15=_19.right;
 }else{
-i=_27.compare(_26);
+i=_1a.compare(_19);
 if(i>0){
-_27.left=_26.right;
+_1a.left=_19.right;
 }else{
 if(i<0){
-_27.right=_26.right;
+_1a.right=_19.right;
 }
 }
 }
 }else{
-var _29=_26.right.left;
-var _2a=_26.right;
-while(_29.left!=null){
-_2a=_29;
-_29=_29.left;
-}
-_2a.left=_29.right;
-_29.left=_26.left;
-_29.right=_26.right;
-if(!_27){
-_20=_29;
+var _1b=_19.right.left;
+var _1c=_19.right;
+while(_1b.left!=null){
+_1c=_1b;
+_1b=_1b.left;
+}
+_1c.left=_1b.right;
+_1b.left=_19.left;
+_1b.right=_19.right;
+if(!_1a){
+_15=_1b;
 }else{
-i=_27.compare(_26);
+i=_1a.compare(_19);
 if(i>0){
-_27.left=_29;
+_1a.left=_1b;
 }else{
 if(i<0){
-_27.right=_29;
+_1a.right=_1b;
 }
 }
 }
@@ -214,29 +214,29 @@ _27.right=_29;
 };
 this.getIterator=function(){
 var a=[];
-_9(_20,a);
+_6(_15,a);
 return new dojox.collections.Iterator(a);
 };
-this.search=function(_2c){
-return _18(_20,_2c);
+this.search=function(_1d){
+return _10(_15,_1d);
 };
-this.toString=function(_2d,sep){
-if(!_2d){
-_2d=dojox.collections.BinaryTree.TraversalMethods.Inorder;
+this.toString=function(_1e,sep){
+if(!_1e){
+_1e=dojox.collections.BinaryTree.TraversalMethods.Inorder;
 }
 if(!sep){
 sep=",";
 }
 var s="";
-switch(_2d){
+switch(_1e){
 case dojox.collections.BinaryTree.TraversalMethods.Preorder:
-s=_c(_20,sep);
+s=_8(_15,sep);
 break;
 case dojox.collections.BinaryTree.TraversalMethods.Inorder:
-s=_10(_20,sep);
+s=_b(_15,sep);
 break;
 case dojox.collections.BinaryTree.TraversalMethods.Postorder:
-s=_14(_20,sep);
+s=_e(_15,sep);
 break;
 }
 if(s.length==0){
@@ -246,7 +246,7 @@ return s.substring(0,s.length-sep.length);
 }
 };
 this.count=0;
-var _20=this.root=null;
+var _15=this.root=null;
 if(_1){
 this.add(_1);
 }
diff --git a/dojox/collections/Dictionary.js b/dojox/collections/Dictionary.js
index ddcdb5a..c6f1a18 100644
--- a/dojox/collections/Dictionary.js
+++ b/dojox/collections/Dictionary.js
@@ -45,23 +45,23 @@ return false;
 this.entry=function(k){
 return _2[k];
 };
-this.forEach=function(fn,_c){
+this.forEach=function(fn,_4){
 var a=[];
 for(var p in _2){
 if(!_3[p]){
 a.push(_2[p]);
 }
 }
-dojo.forEach(a,fn,_c);
+dojo.forEach(a,fn,_4);
 };
 this.getKeyList=function(){
-return (this.getIterator()).map(function(_f){
-return _f.key;
+return (this.getIterator()).map(function(_5){
+return _5.key;
 });
 };
 this.getValueList=function(){
-return (this.getIterator()).map(function(_10){
-return _10.value;
+return (this.getIterator()).map(function(_6){
+return _6.value;
 });
 };
 this.item=function(k){
diff --git a/dojox/collections/Queue.js b/dojox/collections/Queue.js
index fde50aa..f689e8a 100644
--- a/dojox/collections/Queue.js
+++ b/dojox/collections/Queue.js
@@ -30,8 +30,8 @@ return true;
 }
 return false;
 };
-this.copyTo=function(_5,i){
-_5.splice(i,0,q);
+this.copyTo=function(_2,i){
+_2.splice(i,0,q);
 };
 this.dequeue=function(){
 var r=q.shift();
@@ -41,8 +41,8 @@ return r;
 this.enqueue=function(o){
 this.count=q.push(o);
 };
-this.forEach=function(fn,_a){
-dojo.forEach(q,fn,_a);
+this.forEach=function(fn,_3){
+dojo.forEach(q,fn,_3);
 };
 this.getIterator=function(){
 return new dojox.collections.Iterator(q);
diff --git a/dojox/collections/Set.js b/dojox/collections/Set.js
index 47218bb..667214d 100644
--- a/dojox/collections/Set.js
+++ b/dojox/collections/Set.js
@@ -24,56 +24,56 @@ _5=_2(_5);
 var _6=new dojox.collections.ArrayList(_4.toArray());
 var e=_5.getIterator();
 while(!e.atEnd()){
-var _8=e.get();
-if(!_6.contains(_8)){
-_6.add(_8);
+var _7=e.get();
+if(!_6.contains(_7)){
+_6.add(_7);
 }
 }
 return _6;
 };
-this.intersection=function(_9,_a){
+this.intersection=function(_8,_9){
+_8=_2(_8);
 _9=_2(_9);
-_a=_2(_a);
-var _b=new dojox.collections.ArrayList();
-var e=_a.getIterator();
+var _a=new dojox.collections.ArrayList();
+var e=_9.getIterator();
 while(!e.atEnd()){
-var _d=e.get();
-if(_9.contains(_d)){
-_b.add(_d);
+var _b=e.get();
+if(_8.contains(_b)){
+_a.add(_b);
 }
 }
-return _b;
+return _a;
 };
-this.difference=function(_e,_f){
-_e=_2(_e);
-_f=_2(_f);
-var _10=new dojox.collections.ArrayList();
-var e=_e.getIterator();
+this.difference=function(_c,_d){
+_c=_2(_c);
+_d=_2(_d);
+var _e=new dojox.collections.ArrayList();
+var e=_c.getIterator();
 while(!e.atEnd()){
-var _12=e.get();
-if(!_f.contains(_12)){
-_10.add(_12);
+var _f=e.get();
+if(!_d.contains(_f)){
+_e.add(_f);
 }
 }
-return _10;
+return _e;
 };
-this.isSubSet=function(_13,_14){
-_13=_2(_13);
-_14=_2(_14);
-var e=_13.getIterator();
+this.isSubSet=function(_10,_11){
+_10=_2(_10);
+_11=_2(_11);
+var e=_10.getIterator();
 while(!e.atEnd()){
-if(!_14.contains(e.get())){
+if(!_11.contains(e.get())){
 return false;
 }
 }
 return true;
 };
-this.isSuperSet=function(_16,_17){
-_16=_2(_16);
-_17=_2(_17);
-var e=_17.getIterator();
+this.isSuperSet=function(_12,_13){
+_12=_2(_12);
+_13=_2(_13);
+var e=_13.getIterator();
 while(!e.atEnd()){
-if(!_16.contains(e.get())){
+if(!_12.contains(e.get())){
 return false;
 }
 }
diff --git a/dojox/collections/SortedList.js b/dojox/collections/SortedList.js
index 6e2d831..c7e4c56 100644
--- a/dojox/collections/SortedList.js
+++ b/dojox/collections/SortedList.js
@@ -13,7 +13,7 @@ dojox.collections.SortedList=function(_1){
 var _2=this;
 var _3={};
 var q=[];
-var _5=function(a,b){
+var _4=function(a,b){
 if(a.key>b.key){
 return 1;
 }
@@ -22,21 +22,21 @@ return -1;
 }
 return 0;
 };
-var _8=function(){
+var _5=function(){
 q=[];
 var e=_2.getIterator();
 while(!e.atEnd()){
 q.push(e.get());
 }
-q.sort(_5);
+q.sort(_4);
 };
-var _a={};
+var _6={};
 this.count=q.length;
 this.add=function(k,v){
 if(!_3[k]){
 _3[k]=new dojox.collections.DictionaryEntry(k,v);
 this.count=q.push(_3[k]);
-q.sort(_5);
+q.sort(_4);
 }
 };
 this.clear=function(){
@@ -48,7 +48,7 @@ this.clone=function(){
 return new dojox.collections.SortedList(this);
 };
 this.contains=this.containsKey=function(k){
-if(_a[k]){
+if(_6[k]){
 return false;
 }
 return (_3[k]!=null);
@@ -56,26 +56,26 @@ return (_3[k]!=null);
 this.containsValue=function(o){
 var e=this.getIterator();
 while(!e.atEnd()){
-var _10=e.get();
-if(_10.value==o){
+var _7=e.get();
+if(_7.value==o){
 return true;
 }
 }
 return false;
 };
-this.copyTo=function(arr,i){
+this.copyTo=function(_8,i){
 var e=this.getIterator();
-var idx=i;
+var _9=i;
 while(!e.atEnd()){
-arr.splice(idx,0,e.get());
-idx++;
+_8.splice(_9,0,e.get());
+_9++;
 }
 };
 this.entry=function(k){
 return _3[k];
 };
-this.forEach=function(fn,_17){
-dojo.forEach(q,fn,_17);
+this.forEach=function(fn,_a){
+dojo.forEach(q,fn,_a);
 };
 this.getByIndex=function(i){
 return q[i].valueOf();
@@ -87,20 +87,20 @@ this.getKey=function(i){
 return q[i].key;
 };
 this.getKeyList=function(){
-var arr=[];
+var _b=[];
 var e=this.getIterator();
 while(!e.atEnd()){
-arr.push(e.get().key);
+_b.push(e.get().key);
 }
-return arr;
+return _b;
 };
 this.getValueList=function(){
-var arr=[];
+var _c=[];
 var e=this.getIterator();
 while(!e.atEnd()){
-arr.push(e.get().value);
+_c.push(e.get().value);
 }
-return arr;
+return _c;
 };
 this.indexOfKey=function(k){
 for(var i=0;i<q.length;i++){
@@ -119,19 +119,19 @@ return i;
 return -1;
 };
 this.item=function(k){
-if(k in _3&&!_a[k]){
+if(k in _3&&!_6[k]){
 return _3[k].valueOf();
 }
 return undefined;
 };
 this.remove=function(k){
 delete _3[k];
-_8();
+_5();
 this.count=q.length;
 };
 this.removeAt=function(i){
 delete _3[q[i].key];
-_8();
+_5();
 this.count=q.length;
 };
 this.replace=function(k,v){
@@ -140,22 +140,22 @@ this.add(k,v);
 return false;
 }else{
 _3[k]=new dojox.collections.DictionaryEntry(k,v);
-_8();
+_5();
 return true;
 }
 };
 this.setByIndex=function(i,o){
 _3[q[i].key].value=o;
-_8();
+_5();
 this.count=q.length;
 };
 if(_1){
 var e=_1.getIterator();
 while(!e.atEnd()){
-var _2a=e.get();
-q[q.length]=_3[_2a.key]=new dojox.collections.DictionaryEntry(_2a.key,_2a.value);
+var _d=e.get();
+q[q.length]=_3[_d.key]=new dojox.collections.DictionaryEntry(_d.key,_d.value);
 }
-q.sort(_5);
+q.sort(_4);
 }
 };
 }
diff --git a/dojox/collections/Stack.js b/dojox/collections/Stack.js
index 51c86ac..91f949b 100644
--- a/dojox/collections/Stack.js
+++ b/dojox/collections/Stack.js
@@ -30,11 +30,11 @@ return true;
 }
 return false;
 };
-this.copyTo=function(_5,i){
-_5.splice(i,0,q);
+this.copyTo=function(_2,i){
+_2.splice(i,0,q);
 };
-this.forEach=function(fn,_8){
-dojo.forEach(q,fn,_8);
+this.forEach=function(fn,_3){
+dojo.forEach(q,fn,_3);
 };
 this.getIterator=function(){
 return new dojox.collections.Iterator(q);
diff --git a/dojox/collections/_base.js b/dojox/collections/_base.js
index 6c4860a..e2e6405 100644
--- a/dojox/collections/_base.js
+++ b/dojox/collections/_base.js
@@ -18,54 +18,54 @@ this.toString=function(){
 return String(this.value);
 };
 };
-dojox.collections.Iterator=function(_3){
-var a=_3;
-var _5=0;
-this.element=a[_5]||null;
+dojox.collections.Iterator=function(_1){
+var a=_1;
+var _2=0;
+this.element=a[_2]||null;
 this.atEnd=function(){
-return (_5>=a.length);
+return (_2>=a.length);
 };
 this.get=function(){
 if(this.atEnd()){
 return null;
 }
-this.element=a[_5++];
+this.element=a[_2++];
 return this.element;
 };
-this.map=function(fn,_7){
-return dojo.map(a,fn,_7);
+this.map=function(fn,_3){
+return dojo.map(a,fn,_3);
 };
 this.reset=function(){
-_5=0;
-this.element=a[_5];
+_2=0;
+this.element=a[_2];
 };
 };
-dojox.collections.DictionaryIterator=function(_8){
+dojox.collections.DictionaryIterator=function(_4){
 var a=[];
-var _a={};
-for(var p in _8){
-if(!_a[p]){
-a.push(_8[p]);
+var _5={};
+for(var p in _4){
+if(!_5[p]){
+a.push(_4[p]);
 }
 }
-var _c=0;
-this.element=a[_c]||null;
+var _6=0;
+this.element=a[_6]||null;
 this.atEnd=function(){
-return (_c>=a.length);
+return (_6>=a.length);
 };
 this.get=function(){
 if(this.atEnd()){
 return null;
 }
-this.element=a[_c++];
+this.element=a[_6++];
 return this.element;
 };
-this.map=function(fn,_e){
-return dojo.map(a,fn,_e);
+this.map=function(fn,_7){
+return dojo.map(a,fn,_7);
 };
 this.reset=function(){
-_c=0;
-this.element=a[_c];
+_6=0;
+this.element=a[_6];
 };
 };
 }
diff --git a/dojox/color/Colorspace.js b/dojox/color/Colorspace.js
index 08c6131..931d126 100644
--- a/dojox/color/Colorspace.js
+++ b/dojox/color/Colorspace.js
@@ -19,33 +19,33 @@ var _6={"XYZ scaling":{ma:[[1,0,0],[0,1,0],[0,0,1]],mai:[[1,0,0],[0,1,0],[0,0,1]
 var _7={"XYZ":{"xyY":function(_8,_9){
 _9=dojo.mixin({whitepoint:"D65",observer:"10",useApproximation:true},_9||{});
 var wp=_3.whitepoint(_9.whitepoint,_9.observer);
-var _b=_8.X+_8.Y+_8.Z;
-if(_b==0){
+var _a=_8.X+_8.Y+_8.Z;
+if(_a==0){
 var x=wp.x,y=wp.y;
 }else{
-var x=_8.X/_b,y=_8.Y/_b;
+var x=_8.X/_a,y=_8.Y/_a;
 }
 return {x:x,y:y,Y:_8.Y};
-},"Lab":function(_e,_f){
-_f=dojo.mixin({whitepoint:"D65",observer:"10",useApproximation:true},_f||{});
-var _10=_3.kappa(_f.useApproximation),_11=_3.epsilon(_f.useApproximation);
-var wp=_3.whitepoint(_f.whitepoint,_f.observer);
-var xr=_e.X/wp.x,yr=_e.Y/wp.y,zr=_e.z/wp.z;
-var fx=(xr>_11)?Math.pow(xr,1/3):(_10*xr+16)/116;
-var fy=(yr>_11)?Math.pow(yr,1/3):(_10*yr+16)/116;
-var fz=(zr>_11)?Math.pow(zr,1/3):(_10*zr+16)/116;
+},"Lab":function(_b,_c){
+_c=dojo.mixin({whitepoint:"D65",observer:"10",useApproximation:true},_c||{});
+var _d=_3.kappa(_c.useApproximation),_e=_3.epsilon(_c.useApproximation);
+var wp=_3.whitepoint(_c.whitepoint,_c.observer);
+var xr=_b.X/wp.x,yr=_b.Y/wp.y,zr=_b.z/wp.z;
+var fx=(xr>_e)?Math.pow(xr,1/3):(_d*xr+16)/116;
+var fy=(yr>_e)?Math.pow(yr,1/3):(_d*yr+16)/116;
+var fz=(zr>_e)?Math.pow(zr,1/3):(_d*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,_1d){
-_1d=dojo.mixin({whitepoint:"D65",observer:"10",useApproximation:true},_1d||{});
-var _1e=_3.kappa(_1d.useApproximation),_1f=_3.epsilon(_1d.useApproximation);
-var wp=_3.whitepoint(_1d.whitepoint,_1d.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);
+},"Luv":function(_f,_10){
+_10=dojo.mixin({whitepoint:"D65",observer:"10",useApproximation:true},_10||{});
+var _11=_3.kappa(_10.useApproximation),_12=_3.epsilon(_10.useApproximation);
+var wp=_3.whitepoint(_10.whitepoint,_10.observer);
+var ud=(4*_f.X)/(_f.X+15*_f.Y+3*_f.Z);
+var vd=(9*_f.Y)/(_f.X+15*_f.Y+3*_f.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>_1f)?116*Math.pow(yr,1/3)-16:_1e*yr;
+var yr=_f.Y/wp.y;
+var L=(yr>_12)?116*Math.pow(yr,1/3)-16:_11*yr;
 var u=13*L*(ud-udr);
 var v=13*L*(vd-vdr);
 return {L:L,u:u,v:v};
@@ -58,17 +58,17 @@ 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,_2e){
-_2e=dojo.mixin({whitepoint:"D65",observer:"10",useApproximation:true},_2e||{});
-var b=_2e.useApproximation,_30=_3.kappa(b),_31=_3.epsilon(b);
-var wp=_3.whitepoint(_2e.whitepoint,_2e.observer);
-var yr=(lab.L>(_30*_31))?Math.pow((lab.L+16)/116,3):lab.L/_30;
-var fy=(yr>_31)?(lab.L+16)/116:(_30*yr+16)/116;
+}},"Lab":{"XYZ":function(lab,_13){
+_13=dojo.mixin({whitepoint:"D65",observer:"10",useApproximation:true},_13||{});
+var b=_13.useApproximation,_14=_3.kappa(b),_15=_3.epsilon(b);
+var wp=_3.whitepoint(_13.whitepoint,_13.observer);
+var yr=(lab.L>(_14*_15))?Math.pow((lab.L+16)/116,3):lab.L/_14;
+var fy=(yr>_15)?(lab.L+16)/116:(_14*yr+16)/116;
 var fx=(lab.a/500)+fy;
 var fz=fy-(lab.b/200);
-var _37=Math.pow(fx,3),_38=Math.pow(fz,3);
-var xr=(_37>_31)?_37:(116*fx-16)/_30;
-var zr=(_38>_31)?_38:(116*fz-16)/_30;
+var _16=Math.pow(fx,3),_17=Math.pow(fz,3);
+var xr=(_16>_15)?_16:(116*fx-16)/_14;
+var zr=(_17>_15)?_17:(116*fz-16)/_14;
 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);
@@ -80,7 +80,7 @@ H-=360;
 }
 return {L:L,C:C,H:H};
 }},"LCHab":{"Lab":function(lch){
-var _40=lch.H*(Math.PI/180),L=lch.L,a=lch.C/Math.pow(Math.pow(Math.tan(_40),2)+1,0.5);
+var _18=lch.H*(Math.PI/180),L=lch.L,a=lch.C/Math.pow(Math.pow(Math.tan(_18),2)+1,0.5);
 if(90<lchH&&lch.H<270){
 a=-a;
 }
@@ -89,13 +89,13 @@ if(lch.H>180){
 b=-b;
 }
 return {L:L,a:a,b:b};
-}},"Luv":{"XYZ":function(Luv,_45){
-_45=dojo.mixin({whitepoint:"D65",observer:"10",useApproximation:true},_45||{});
-var b=_45.useApproximation,_47=_3.kappa(b),_48=_3.epsilon(b);
-var wp=_3.whitepoint(_45.whitepoint,_45.observer);
+}},"Luv":{"XYZ":function(Luv,_19){
+_19=dojo.mixin({whitepoint:"D65",observer:"10",useApproximation:true},_19||{});
+var b=_19.useApproximation,_1a=_3.kappa(b),_1b=_3.epsilon(b);
+var wp=_3.whitepoint(_19.whitepoint,_19.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>_47*_48)?Math.pow((Luv.L+16)/116,3):Luv.L/_47;
+var Y=(Luv.L>_1a*_1b)?Math.pow((Luv.L+16)/116,3):Luv.L/_1a;
 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;
@@ -110,8 +110,8 @@ H-=360;
 }
 return {L:L,C:C,H:H};
 }},"LCHuv":{"Luv":function(LCH){
-var _57=LCH.H*(Math.PI/180);
-var L=LCH.L,u=LCH.C/Math.pow(Math.pow(Math.tan(_57),2)+1,0.5);
+var _1c=LCH.H*(Math.PI/180);
+var L=LCH.L,u=LCH.C/Math.pow(Math.pow(Math.tan(_1c),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;
@@ -121,236 +121,236 @@ v*=-1;
 }
 return {L:L,u:u,v:v};
 }}};
-var _5b={"CMY":{"CMYK":function(obj,_5d){
+var _1d={"CMY":{"CMYK":function(obj,_1e){
 return _1.fromCmy(obj).toCmyk();
-},"HSL":function(obj,_5f){
+},"HSL":function(obj,_1f){
 return _1.fromCmy(obj).toHsl();
-},"HSV":function(obj,_61){
+},"HSV":function(obj,_20){
 return _1.fromCmy(obj).toHsv();
-},"Lab":function(obj,_63){
-return _7["XYZ"]["Lab"](_1.fromCmy(obj).toXYZ(_63));
-},"LCHab":function(obj,_65){
-return _7["Lab"]["LCHab"](_5b["CMY"]["Lab"](obj));
-},"LCHuv":function(obj,_67){
-return _7["LCHuv"]["Luv"](_7["Luv"]["XYZ"](_1.fromCmy(obj).toXYZ(_67)));
-},"Luv":function(obj,_69){
-return _7["Luv"]["XYZ"](_1.fromCmy(obj).toXYZ(_69));
-},"RGB":function(obj,_6b){
+},"Lab":function(obj,_21){
+return _7["XYZ"]["Lab"](_1.fromCmy(obj).toXYZ(_21));
+},"LCHab":function(obj,_22){
+return _7["Lab"]["LCHab"](_1d["CMY"]["Lab"](obj));
+},"LCHuv":function(obj,_23){
+return _7["LCHuv"]["Luv"](_7["Luv"]["XYZ"](_1.fromCmy(obj).toXYZ(_23)));
+},"Luv":function(obj,_24){
+return _7["Luv"]["XYZ"](_1.fromCmy(obj).toXYZ(_24));
+},"RGB":function(obj,_25){
 return _1.fromCmy(obj);
-},"XYZ":function(obj,_6d){
-return _1.fromCmy(obj).toXYZ(_6d);
-},"xyY":function(obj,_6f){
-return _7["XYZ"]["xyY"](_1.fromCmy(obj).toXYZ(_6f));
-}},"CMYK":{"CMY":function(obj,_71){
+},"XYZ":function(obj,_26){
+return _1.fromCmy(obj).toXYZ(_26);
+},"xyY":function(obj,_27){
+return _7["XYZ"]["xyY"](_1.fromCmy(obj).toXYZ(_27));
+}},"CMYK":{"CMY":function(obj,_28){
 return _1.fromCmyk(obj).toCmy();
-},"HSL":function(obj,_73){
+},"HSL":function(obj,_29){
 return _1.fromCmyk(obj).toHsl();
-},"HSV":function(obj,_75){
+},"HSV":function(obj,_2a){
 return _1.fromCmyk(obj).toHsv();
-},"Lab":function(obj,_77){
-return _7["XYZ"]["Lab"](_1.fromCmyk(obj).toXYZ(_77));
-},"LCHab":function(obj,_79){
-return _7["Lab"]["LCHab"](_5b["CMYK"]["Lab"](obj));
-},"LCHuv":function(obj,_7b){
-return _7["LCHuv"]["Luv"](_7["Luv"]["XYZ"](_1.fromCmyk(obj).toXYZ(_7b)));
-},"Luv":function(obj,_7d){
-return _7["Luv"]["XYZ"](_1.fromCmyk(obj).toXYZ(_7d));
-},"RGB":function(obj,_7f){
+},"Lab":function(obj,_2b){
+return _7["XYZ"]["Lab"](_1.fromCmyk(obj).toXYZ(_2b));
+},"LCHab":function(obj,_2c){
+return _7["Lab"]["LCHab"](_1d["CMYK"]["Lab"](obj));
+},"LCHuv":function(obj,_2d){
+return _7["LCHuv"]["Luv"](_7["Luv"]["XYZ"](_1.fromCmyk(obj).toXYZ(_2d)));
+},"Luv":function(obj,_2e){
+return _7["Luv"]["XYZ"](_1.fromCmyk(obj).toXYZ(_2e));
+},"RGB":function(obj,_2f){
 return _1.fromCmyk(obj);
-},"XYZ":function(obj,_81){
-return _1.fromCmyk(obj).toXYZ(_81);
-},"xyY":function(obj,_83){
-return _7["XYZ"]["xyY"](_1.fromCmyk(obj).toXYZ(_83));
-}},"HSL":{"CMY":function(obj,_85){
+},"XYZ":function(obj,_30){
+return _1.fromCmyk(obj).toXYZ(_30);
+},"xyY":function(obj,_31){
+return _7["XYZ"]["xyY"](_1.fromCmyk(obj).toXYZ(_31));
+}},"HSL":{"CMY":function(obj,_32){
 return _1.fromHsl(obj).toCmy();
-},"CMYK":function(obj,_87){
+},"CMYK":function(obj,_33){
 return _1.fromHsl(obj).toCmyk();
-},"HSV":function(obj,_89){
+},"HSV":function(obj,_34){
 return _1.fromHsl(obj).toHsv();
-},"Lab":function(obj,_8b){
-return _7["XYZ"]["Lab"](_1.fromHsl(obj).toXYZ(_8b));
-},"LCHab":function(obj,_8d){
-return _7["Lab"]["LCHab"](_5b["CMYK"]["Lab"](obj));
-},"LCHuv":function(obj,_8f){
-return _7["LCHuv"]["Luv"](_7["Luv"]["XYZ"](_1.fromHsl(obj).toXYZ(_8f)));
-},"Luv":function(obj,_91){
-return _7["Luv"]["XYZ"](_1.fromHsl(obj).toXYZ(_91));
-},"RGB":function(obj,_93){
+},"Lab":function(obj,_35){
+return _7["XYZ"]["Lab"](_1.fromHsl(obj).toXYZ(_35));
+},"LCHab":function(obj,_36){
+return _7["Lab"]["LCHab"](_1d["CMYK"]["Lab"](obj));
+},"LCHuv":function(obj,_37){
+return _7["LCHuv"]["Luv"](_7["Luv"]["XYZ"](_1.fromHsl(obj).toXYZ(_37)));
+},"Luv":function(obj,_38){
+return _7["Luv"]["XYZ"](_1.fromHsl(obj).toXYZ(_38));
+},"RGB":function(obj,_39){
 return _1.fromHsl(obj);
-},"XYZ":function(obj,_95){
-return _1.fromHsl(obj).toXYZ(_95);
-},"xyY":function(obj,_97){
-return _7["XYZ"]["xyY"](_1.fromHsl(obj).toXYZ(_97));
-}},"HSV":{"CMY":function(obj,_99){
+},"XYZ":function(obj,_3a){
+return _1.fromHsl(obj).toXYZ(_3a);
+},"xyY":function(obj,_3b){
+return _7["XYZ"]["xyY"](_1.fromHsl(obj).toXYZ(_3b));
+}},"HSV":{"CMY":function(obj,_3c){
 return _1.fromHsv(obj).toCmy();
-},"CMYK":function(obj,_9b){
+},"CMYK":function(obj,_3d){
 return _1.fromHsv(obj).toCmyk();
-},"HSL":function(obj,_9d){
+},"HSL":function(obj,_3e){
 return _1.fromHsv(obj).toHsl();
-},"Lab":function(obj,_9f){
-return _7["XYZ"]["Lab"](_1.fromHsv(obj).toXYZ(_9f));
-},"LCHab":function(obj,_a1){
-return _7["Lab"]["LCHab"](_5b["CMYK"]["Lab"](obj));
-},"LCHuv":function(obj,_a3){
-return _7["LCHuv"]["Luv"](_7["Luv"]["XYZ"](_1.fromHsv(obj).toXYZ(_a3)));
-},"Luv":function(obj,_a5){
-return _7["Luv"]["XYZ"](_1.fromHsv(obj).toXYZ(_a5));
-},"RGB":function(obj,_a7){
+},"Lab":function(obj,_3f){
+return _7["XYZ"]["Lab"](_1.fromHsv(obj).toXYZ(_3f));
+},"LCHab":function(obj,_40){
+return _7["Lab"]["LCHab"](_1d["CMYK"]["Lab"](obj));
+},"LCHuv":function(obj,_41){
+return _7["LCHuv"]["Luv"](_7["Luv"]["XYZ"](_1.fromHsv(obj).toXYZ(_41)));
+},"Luv":function(obj,_42){
+return _7["Luv"]["XYZ"](_1.fromHsv(obj).toXYZ(_42));
+},"RGB":function(obj,_43){
 return _1.fromHsv(obj);
-},"XYZ":function(obj,_a9){
-return _1.fromHsv(obj).toXYZ(_a9);
-},"xyY":function(obj,_ab){
-return _7["XYZ"]["xyY"](_1.fromHsv(obj).toXYZ(_ab));
-}},"Lab":{"CMY":function(obj,_ad){
-return _1.fromXYZ(_7["Lab"]["XYZ"](obj,_ad)).toCmy();
-},"CMYK":function(obj,_af){
-return _1.fromXYZ(_7["Lab"]["XYZ"](obj,_af)).toCmyk();
-},"HSL":function(obj,_b1){
-return _1.fromXYZ(_7["Lab"]["XYZ"](obj,_b1)).toHsl();
-},"HSV":function(obj,_b3){
-return _1.fromXYZ(_7["Lab"]["XYZ"](obj,_b3)).toHsv();
-},"LCHab":function(obj,_b5){
-return _7["Lab"]["LCHab"](obj,_b5);
-},"LCHuv":function(obj,_b7){
-return _7["Luv"]["LCHuv"](_7["Lab"]["XYZ"](obj,_b7),_b7);
-},"Luv":function(obj,_b9){
-return _7["XYZ"]["Luv"](_7["Lab"]["XYZ"](obj,_b9),_b9);
-},"RGB":function(obj,_bb){
-return _1.fromXYZ(_7["Lab"]["XYZ"](obj,_bb));
-},"XYZ":function(obj,_bd){
-return _7["Lab"]["XYZ"](obj,_bd);
-},"xyY":function(obj,_bf){
-return _7["XYZ"]["xyY"](_7["Lab"]["XYZ"](obj,_bf),_bf);
-}},"LCHab":{"CMY":function(obj,_c1){
-return _1.fromXYZ(_7["Lab"]["XYZ"](_7["LCHab"]["Lab"](obj),_c1),_c1).toCmy();
-},"CMYK":function(obj,_c3){
-return _1.fromXYZ(_7["Lab"]["XYZ"](_7["LCHab"]["Lab"](obj),_c3),_c3).toCmyk();
-},"HSL":function(obj,_c5){
-return _1.fromXYZ(_7["Lab"]["XYZ"](_7["LCHab"]["Lab"](obj),_c5),_c5).toHsl();
-},"HSV":function(obj,_c7){
-return _1.fromXYZ(_7["Lab"]["XYZ"](_7["LCHab"]["Lab"](obj),_c7),_c7).toHsv();
-},"Lab":function(obj,_c9){
-return _7["Lab"]["LCHab"](obj,_c9);
-},"LCHuv":function(obj,_cb){
-return _7["Luv"]["LCHuv"](_7["XYZ"]["Luv"](_7["Lab"]["XYZ"](_7["LCHab"]["Lab"](obj),_cb),_cb),_cb);
-},"Luv":function(obj,_cd){
-return _7["XYZ"]["Luv"](_7["Lab"]["XYZ"](_7["LCHab"]["Lab"](obj),_cd),_cd);
-},"RGB":function(obj,_cf){
-return _1.fromXYZ(_7["Lab"]["XYZ"](_7["LCHab"]["Lab"](obj),_cf),_cf);
-},"XYZ":function(obj,_d1){
-return _7["Lab"]["XYZ"](_7["LCHab"]["Lab"](obj,_d1),_d1);
-},"xyY":function(obj,_d3){
-return _7["XYZ"]["xyY"](_7["Lab"]["XYZ"](_7["LCHab"]["Lab"](obj),_d3),_d3);
-}},"LCHuv":{"CMY":function(obj,_d5){
-return _1.fromXYZ(_7["Luv"]["XYZ"](_7["LCHuv"]["Luv"](obj),_d5),_d5).toCmy();
-},"CMYK":function(obj,_d7){
-return _1.fromXYZ(_7["Luv"]["XYZ"](_7["LCHuv"]["Luv"](obj),_d7),_d7).toCmyk();
-},"HSL":function(obj,_d9){
-return _1.fromXYZ(_7["Luv"]["XYZ"](_7["LCHuv"]["Luv"](obj),_d9),_d9).toHsl();
-},"HSV":function(obj,_db){
-return _1.fromXYZ(_7["Luv"]["XYZ"](_7["LCHuv"]["Luv"](obj),_db),_db).toHsv();
-},"Lab":function(obj,_dd){
-return _7["XYZ"]["Lab"](_7["Luv"]["XYZ"](_7["LCHuv"]["Luv"](obj),_dd),_dd);
-},"LCHab":function(obj,_df){
-return _7["Lab"]["LCHab"](_7["XYZ"]["Lab"](_7["Luv"]["XYZ"](_7["LCHuv"]["Luv"](obj),_df),_df),_df);
-},"Luv":function(obj,_e1){
-return _7["LCHuv"]["Luv"](obj,_e1);
-},"RGB":function(obj,_e3){
-return _1.fromXYZ(_7["Luv"]["XYZ"](_7["LCHuv"]["Luv"](obj),_e3),_e3);
-},"XYZ":function(obj,_e5){
-return _7["Luv"]["XYZ"](_7["LCHuv"]["Luv"](obj),_e5);
-},"xyY":function(obj,_e7){
-return _7["XYZ"]["xyY"](_7["Luv"]["XYZ"](_7["LCHuv"]["Luv"](obj),_e7),_e7);
-}},"Luv":{"CMY":function(obj,_e9){
-return _1.fromXYZ(_7["Luv"]["XYZ"](obj,_e9),_e9).toCmy();
-},"CMYK":function(obj,_eb){
-return _1.fromXYZ(_7["Luv"]["XYZ"](obj,_eb),_eb).toCmyk();
-},"HSL":function(obj,_ed){
-return _1.fromXYZ(_7["Luv"]["XYZ"](obj,_ed),_ed).toHsl();
-},"HSV":function(obj,_ef){
-return _1.fromXYZ(_7["Luv"]["XYZ"](obj,_ef),_ef).toHsv();
-},"Lab":function(obj,_f1){
-return _7["XYZ"]["Lab"](_7["Luv"]["XYZ"](obj,_f1),_f1);
-},"LCHab":function(obj,_f3){
-return _7["Lab"]["LCHab"](_7["XYZ"]["Lab"](_7["Luv"]["XYZ"](obj,_f3),_f3),_f3);
-},"LCHuv":function(obj,_f5){
-return _7["Luv"]["LCHuv"](obj,_f5);
-},"RGB":function(obj,_f7){
-return _1.fromXYZ(_7["Luv"]["XYZ"](obj,_f7),_f7);
-},"XYZ":function(obj,_f9){
-return _7["Luv"]["XYZ"](obj,_f9);
-},"xyY":function(obj,_fb){
-return _7["XYZ"]["xyY"](_7["Luv"]["XYZ"](obj,_fb),_fb);
-}},"RGB":{"CMY":function(obj,_fd){
+},"XYZ":function(obj,_44){
+return _1.fromHsv(obj).toXYZ(_44);
+},"xyY":function(obj,_45){
+return _7["XYZ"]["xyY"](_1.fromHsv(obj).toXYZ(_45));
+}},"Lab":{"CMY":function(obj,_46){
+return _1.fromXYZ(_7["Lab"]["XYZ"](obj,_46)).toCmy();
+},"CMYK":function(obj,_47){
+return _1.fromXYZ(_7["Lab"]["XYZ"](obj,_47)).toCmyk();
+},"HSL":function(obj,_48){
+return _1.fromXYZ(_7["Lab"]["XYZ"](obj,_48)).toHsl();
+},"HSV":function(obj,_49){
+return _1.fromXYZ(_7["Lab"]["XYZ"](obj,_49)).toHsv();
+},"LCHab":function(obj,_4a){
+return _7["Lab"]["LCHab"](obj,_4a);
+},"LCHuv":function(obj,_4b){
+return _7["Luv"]["LCHuv"](_7["Lab"]["XYZ"](obj,_4b),_4b);
+},"Luv":function(obj,_4c){
+return _7["XYZ"]["Luv"](_7["Lab"]["XYZ"](obj,_4c),_4c);
+},"RGB":function(obj,_4d){
+return _1.fromXYZ(_7["Lab"]["XYZ"](obj,_4d));
+},"XYZ":function(obj,_4e){
+return _7["Lab"]["XYZ"](obj,_4e);
+},"xyY":function(obj,_4f){
+return _7["XYZ"]["xyY"](_7["Lab"]["XYZ"](obj,_4f),_4f);
+}},"LCHab":{"CMY":function(obj,_50){
+return _1.fromXYZ(_7["Lab"]["XYZ"](_7["LCHab"]["Lab"](obj),_50),_50).toCmy();
+},"CMYK":function(obj,_51){
+return _1.fromXYZ(_7["Lab"]["XYZ"](_7["LCHab"]["Lab"](obj),_51),_51).toCmyk();
+},"HSL":function(obj,_52){
+return _1.fromXYZ(_7["Lab"]["XYZ"](_7["LCHab"]["Lab"](obj),_52),_52).toHsl();
+},"HSV":function(obj,_53){
+return _1.fromXYZ(_7["Lab"]["XYZ"](_7["LCHab"]["Lab"](obj),_53),_53).toHsv();
+},"Lab":function(obj,_54){
+return _7["Lab"]["LCHab"](obj,_54);
+},"LCHuv":function(obj,_55){
+return _7["Luv"]["LCHuv"](_7["XYZ"]["Luv"](_7["Lab"]["XYZ"](_7["LCHab"]["Lab"](obj),_55),_55),_55);
+},"Luv":function(obj,_56){
+return _7["XYZ"]["Luv"](_7["Lab"]["XYZ"](_7["LCHab"]["Lab"](obj),_56),_56);
+},"RGB":function(obj,_57){
+return _1.fromXYZ(_7["Lab"]["XYZ"](_7["LCHab"]["Lab"](obj),_57),_57);
+},"XYZ":function(obj,_58){
+return _7["Lab"]["XYZ"](_7["LCHab"]["Lab"](obj,_58),_58);
+},"xyY":function(obj,_59){
+return _7["XYZ"]["xyY"](_7["Lab"]["XYZ"](_7["LCHab"]["Lab"](obj),_59),_59);
+}},"LCHuv":{"CMY":function(obj,_5a){
+return _1.fromXYZ(_7["Luv"]["XYZ"](_7["LCHuv"]["Luv"](obj),_5a),_5a).toCmy();
+},"CMYK":function(obj,_5b){
+return _1.fromXYZ(_7["Luv"]["XYZ"](_7["LCHuv"]["Luv"](obj),_5b),_5b).toCmyk();
+},"HSL":function(obj,_5c){
+return _1.fromXYZ(_7["Luv"]["XYZ"](_7["LCHuv"]["Luv"](obj),_5c),_5c).toHsl();
+},"HSV":function(obj,_5d){
+return _1.fromXYZ(_7["Luv"]["XYZ"](_7["LCHuv"]["Luv"](obj),_5d),_5d).toHsv();
+},"Lab":function(obj,_5e){
+return _7["XYZ"]["Lab"](_7["Luv"]["XYZ"](_7["LCHuv"]["Luv"](obj),_5e),_5e);
+},"LCHab":function(obj,_5f){
+return _7["Lab"]["LCHab"](_7["XYZ"]["Lab"](_7["Luv"]["XYZ"](_7["LCHuv"]["Luv"](obj),_5f),_5f),_5f);
+},"Luv":function(obj,_60){
+return _7["LCHuv"]["Luv"](obj,_60);
+},"RGB":function(obj,_61){
+return _1.fromXYZ(_7["Luv"]["XYZ"](_7["LCHuv"]["Luv"](obj),_61),_61);
+},"XYZ":function(obj,_62){
+return _7["Luv"]["XYZ"](_7["LCHuv"]["Luv"](obj),_62);
+},"xyY":function(obj,_63){
+return _7["XYZ"]["xyY"](_7["Luv"]["XYZ"](_7["LCHuv"]["Luv"](obj),_63),_63);
+}},"Luv":{"CMY":function(obj,_64){
+return _1.fromXYZ(_7["Luv"]["XYZ"](obj,_64),_64).toCmy();
+},"CMYK":function(obj,_65){
+return _1.fromXYZ(_7["Luv"]["XYZ"](obj,_65),_65).toCmyk();
+},"HSL":function(obj,_66){
+return _1.fromXYZ(_7["Luv"]["XYZ"](obj,_66),_66).toHsl();
+},"HSV":function(obj,_67){
+return _1.fromXYZ(_7["Luv"]["XYZ"](obj,_67),_67).toHsv();
+},"Lab":function(obj,_68){
+return _7["XYZ"]["Lab"](_7["Luv"]["XYZ"](obj,_68),_68);
+},"LCHab":function(obj,_69){
+return _7["Lab"]["LCHab"](_7["XYZ"]["Lab"](_7["Luv"]["XYZ"](obj,_69),_69),_69);
+},"LCHuv":function(obj,_6a){
+return _7["Luv"]["LCHuv"](obj,_6a);
+},"RGB":function(obj,_6b){
+return _1.fromXYZ(_7["Luv"]["XYZ"](obj,_6b),_6b);
+},"XYZ":function(obj,_6c){
+return _7["Luv"]["XYZ"](obj,_6c);
+},"xyY":function(obj,_6d){
+return _7["XYZ"]["xyY"](_7["Luv"]["XYZ"](obj,_6d),_6d);
+}},"RGB":{"CMY":function(obj,_6e){
 return obj.toCmy();
-},"CMYK":function(obj,_ff){
+},"CMYK":function(obj,_6f){
 return obj.toCmyk();
-},"HSL":function(obj,_101){
+},"HSL":function(obj,_70){
 return obj.toHsl();
-},"HSV":function(obj,_103){
+},"HSV":function(obj,_71){
 return obj.toHsv();
-},"Lab":function(obj,_105){
-return _7["XYZ"]["Lab"](obj.toXYZ(_105),_105);
-},"LCHab":function(obj,_107){
-return _7["LCHab"]["Lab"](_7["XYZ"]["Lab"](obj.toXYZ(_107),_107),_107);
-},"LCHuv":function(obj,_109){
-return _7["LCHuv"]["Luv"](_7["XYZ"]["Luv"](obj.toXYZ(_109),_109),_109);
-},"Luv":function(obj,_10b){
-return _7["XYZ"]["Luv"](obj.toXYZ(_10b),_10b);
-},"XYZ":function(obj,_10d){
-return obj.toXYZ(_10d);
-},"xyY":function(obj,_10f){
-return _7["XYZ"]["xyY"](obj.toXYZ(_10f),_10f);
-}},"XYZ":{"CMY":function(obj,_111){
-return _1.fromXYZ(obj,_111).toCmy();
-},"CMYK":function(obj,_113){
-return _1.fromXYZ(obj,_113).toCmyk();
-},"HSL":function(obj,_115){
-return _1.fromXYZ(obj,_115).toHsl();
-},"HSV":function(obj,_117){
-return _1.fromXYZ(obj,_117).toHsv();
-},"Lab":function(obj,_119){
-return _7["XYZ"]["Lab"](obj,_119);
-},"LCHab":function(obj,_11b){
-return _7["Lab"]["LCHab"](_7["XYZ"]["Lab"](obj,_11b),_11b);
-},"LCHuv":function(obj,_11d){
-return _7["Luv"]["LCHuv"](_7["XYZ"]["Luv"](obj,_11d),_11d);
-},"Luv":function(obj,_11f){
-return _7["XYZ"]["Luv"](obj,_11f);
-},"RGB":function(obj,_121){
-return _1.fromXYZ(obj,_121);
-},"xyY":function(obj,_123){
-return _7["XYZ"]["xyY"](_1.fromXYZ(obj,_123),_123);
-}},"xyY":{"CMY":function(obj,_125){
-return _1.fromXYZ(_7["xyY"]["XYZ"](obj,_125),_125).toCmy();
-},"CMYK":function(obj,_127){
-return _1.fromXYZ(_7["xyY"]["XYZ"](obj,_127),_127).toCmyk();
-},"HSL":function(obj,_129){
-return _1.fromXYZ(_7["xyY"]["XYZ"](obj,_129),_129).toHsl();
-},"HSV":function(obj,_12b){
-return _1.fromXYZ(_7["xyY"]["XYZ"](obj,_12b),_12b).toHsv();
-},"Lab":function(obj,_12d){
-return _7["Lab"]["XYZ"](_7["xyY"]["XYZ"](obj,_12d),_12d);
-},"LCHab":function(obj,_12f){
-return _7["LCHab"]["Lab"](_7["Lab"]["XYZ"](_7["xyY"]["XYZ"](obj,_12f),_12f),_12f);
-},"LCHuv":function(obj,_131){
-return _7["LCHuv"]["Luv"](_7["Luv"]["XYZ"](_7["xyY"]["XYZ"](obj,_131),_131),_131);
-},"Luv":function(obj,_133){
-return _7["Luv"]["XYZ"](_7["xyY"]["XYZ"](obj,_133),_133);
-},"RGB":function(obj,_135){
-return _1.fromXYZ(_7["xyY"]["XYZ"](obj,_135),_135);
-},"XYZ":function(obj,_137){
-return _7["xyY"]["XYZ"](obj,_137);
+},"Lab":function(obj,_72){
+return _7["XYZ"]["Lab"](obj.toXYZ(_72),_72);
+},"LCHab":function(obj,_73){
+return _7["LCHab"]["Lab"](_7["XYZ"]["Lab"](obj.toXYZ(_73),_73),_73);
+},"LCHuv":function(obj,_74){
+return _7["LCHuv"]["Luv"](_7["XYZ"]["Luv"](obj.toXYZ(_74),_74),_74);
+},"Luv":function(obj,_75){
+return _7["XYZ"]["Luv"](obj.toXYZ(_75),_75);
+},"XYZ":function(obj,_76){
+return obj.toXYZ(_76);
+},"xyY":function(obj,_77){
+return _7["XYZ"]["xyY"](obj.toXYZ(_77),_77);
+}},"XYZ":{"CMY":function(obj,_78){
+return _1.fromXYZ(obj,_78).toCmy();
+},"CMYK":function(obj,_79){
+return _1.fromXYZ(obj,_79).toCmyk();
+},"HSL":function(obj,_7a){
+return _1.fromXYZ(obj,_7a).toHsl();
+},"HSV":function(obj,_7b){
+return _1.fromXYZ(obj,_7b).toHsv();
+},"Lab":function(obj,_7c){
+return _7["XYZ"]["Lab"](obj,_7c);
+},"LCHab":function(obj,_7d){
+return _7["Lab"]["LCHab"](_7["XYZ"]["Lab"](obj,_7d),_7d);
+},"LCHuv":function(obj,_7e){
+return _7["Luv"]["LCHuv"](_7["XYZ"]["Luv"](obj,_7e),_7e);
+},"Luv":function(obj,_7f){
+return _7["XYZ"]["Luv"](obj,_7f);
+},"RGB":function(obj,_80){
+return _1.fromXYZ(obj,_80);
+},"xyY":function(obj,_81){
+return _7["XYZ"]["xyY"](_1.fromXYZ(obj,_81),_81);
+}},"xyY":{"CMY":function(obj,_82){
+return _1.fromXYZ(_7["xyY"]["XYZ"](obj,_82),_82).toCmy();
+},"CMYK":function(obj,_83){
+return _1.fromXYZ(_7["xyY"]["XYZ"](obj,_83),_83).toCmyk();
+},"HSL":function(obj,_84){
+return _1.fromXYZ(_7["xyY"]["XYZ"](obj,_84),_84).toHsl();
+},"HSV":function(obj,_85){
+return _1.fromXYZ(_7["xyY"]["XYZ"](obj,_85),_85).toHsv();
+},"Lab":function(obj,_86){
+return _7["Lab"]["XYZ"](_7["xyY"]["XYZ"](obj,_86),_86);
+},"LCHab":function(obj,_87){
+return _7["LCHab"]["Lab"](_7["Lab"]["XYZ"](_7["xyY"]["XYZ"](obj,_87),_87),_87);
+},"LCHuv":function(obj,_88){
+return _7["LCHuv"]["Luv"](_7["Luv"]["XYZ"](_7["xyY"]["XYZ"](obj,_88),_88),_88);
+},"Luv":function(obj,_89){
+return _7["Luv"]["XYZ"](_7["xyY"]["XYZ"](obj,_89),_89);
+},"RGB":function(obj,_8a){
+return _1.fromXYZ(_7["xyY"]["XYZ"](obj,_8a),_8a);
+},"XYZ":function(obj,_8b){
+return _7["xyY"]["XYZ"](obj,_8b);
 }}};
-this.whitepoint=function(_138,_139){
-_139=_139||"10";
+this.whitepoint=function(_8c,_8d){
+_8d=_8d||"10";
 var x=0,y=0,t=0;
-if(_4[_139]&&_4[_139][_138]){
-x=_4[_139][_138].x;
-y=_4[_139][_138].y;
-t=_4[_139][_138].t;
+if(_4[_8d]&&_4[_8d][_8c]){
+x=_4[_8d][_8c].x;
+y=_4[_8d][_8c].y;
+t=_4[_8d][_8c].t;
 }else{
-console.warn("dojox.color.Colorspace::whitepoint: either the observer or the whitepoint name was not found. ",_139,_138);
+console.warn("dojox.color.Colorspace::whitepoint: either the observer or the whitepoint name was not found. ",_8d,_8c);
 }
 var wp={x:x,y:y,z:(1-x-y),t:t,Y:1};
 return this.convert(wp,"xyY","XYZ");
@@ -365,54 +365,54 @@ console.warn("dojox.color.Colorspace::tempToWhitepoint: can't find a white point
 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);
+var _8e=Math.pow(10,9),_8f=Math.pow(10,6),_90=Math.pow(10,3);
 if(t<=7000){
-var x=(-4.607*ten9/t3)+(2.9678*ten6/t2)+(0.09911*ten3/t)+0.2444063;
+var x=(-4.607*_8e/t3)+(2.9678*_8f/t2)+(0.09911*_90/t)+0.2444063;
 }else{
-var x=(-2.0064*ten9/t3)+(1.9018*ten6/t2)+(0.24748*ten3/t)+0.23704;
+var x=(-2.0064*_8e/t3)+(1.9018*_8f/t2)+(0.24748*_90/t)+0.23704;
 }
 var y=-3*x*x+2.87*x-0.275;
 return {x:x,y:y};
 };
-this.primaries=function(_147){
-_147=dojo.mixin({profile:"sRGB",whitepoint:"D65",observer:"10",adaptor:"Bradford"},_147||{});
+this.primaries=function(_91){
+_91=dojo.mixin({profile:"sRGB",whitepoint:"D65",observer:"10",adaptor:"Bradford"},_91||{});
 var m=[];
-if(_5[_147.profile]){
-m=_5[_147.profile].slice(0);
+if(_5[_91.profile]){
+m=_5[_91.profile].slice(0);
 }else{
-console.warn("dojox.color.Colorspace::primaries: the passed profile was not found.  ","Available profiles include: ",_5,".  The profile passed was ",_147.profile);
+console.warn("dojox.color.Colorspace::primaries: the passed profile was not found.  ","Available profiles include: ",_5,".  The profile passed was ",_91.profile);
 }
-var _149={name:_147.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]};
-if(_147.whitepoint!=_149.whitepoint){
-var r=this.convert(this.adapt({color:this.convert({x:xr,y:yr,Y:Yr},"xyY","XYZ"),adaptor:_147.adaptor,source:_149.whitepoint,destination:_147.whitepoint}),"XYZ","xyY");
-var g=this.convert(this.adapt({color:this.convert({x:xg,y:yg,Y:Yg},"xyY","XYZ"),adaptor:_147.adaptor,source:_149.whitepoint,destination:_147.whitepoint}),"XYZ","xyY");
-var b=this.convert(this.adapt({color:this.convert({x:xb,y:yb,Y:Yb},"xyY","XYZ"),adaptor:_147.adaptor,source:_149.whitepoint,destination:_147.whitepoint}),"XYZ","xyY");
-_149=dojo.mixin(_149,{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:_147.whitepoint});
+var _92={name:_91.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]};
+if(_91.whitepoint!=_92.whitepoint){
+var r=this.convert(this.adapt({color:this.convert({x:xr,y:yr,Y:Yr},"xyY","XYZ"),adaptor:_91.adaptor,source:_92.whitepoint,destination:_91.whitepoint}),"XYZ","xyY");
+var g=this.convert(this.adapt({color:this.convert({x:xg,y:yg,Y:Yg},"xyY","XYZ"),adaptor:_91.adaptor,source:_92.whitepoint,destination:_91.whitepoint}),"XYZ","xyY");
+var b=this.convert(this.adapt({color:this.convert({x:xb,y:yb,Y:Yb},"xyY","XYZ"),adaptor:_91.adaptor,source:_92.whitepoint,destination:_91.whitepoint}),"XYZ","xyY");
+_92=dojo.mixin(_92,{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:_91.whitepoint});
 }
-return dojo.mixin(_149,{zr:1-_149.xr-_149.yr,zg:1-_149.xg-_149.yg,zb:1-_149.xb-_149.yb});
+return dojo.mixin(_92,{zr:1-_92.xr-_92.yr,zg:1-_92.xg-_92.yg,zb:1-_92.xb-_92.yb});
 };
-this.adapt=function(_14d){
-if(!_14d.color||!_14d.source){
-console.error("dojox.color.Colorspace::adapt: color and source arguments are required. ",_14d);
+this.adapt=function(_93){
+if(!_93.color||!_93.source){
+console.error("dojox.color.Colorspace::adapt: color and source arguments are required. ",_93);
 }
-_14d=dojo.mixin({adaptor:"Bradford",destination:"D65"},_14d);
-var swp=this.whitepoint(_14d.source);
-var dwp=this.whitepoint(_14d.destination);
-if(_6[_14d.adaptor]){
-var ma=_6[_14d.adaptor].ma;
-var mai=_6[_14d.adaptor].mai;
+_93=dojo.mixin({adaptor:"Bradford",destination:"D65"},_93);
+var swp=this.whitepoint(_93.source);
+var dwp=this.whitepoint(_93.destination);
+if(_6[_93.adaptor]){
+var ma=_6[_93.adaptor].ma;
+var mai=_6[_93.adaptor].mai;
 }else{
-console.warn("dojox.color.Colorspace::adapt: the passed adaptor '",_14d.adaptor,"' was not found.");
+console.warn("dojox.color.Colorspace::adapt: the passed adaptor '",_93.adaptor,"' was not found.");
 }
-var dSrc=_2.multiply([[swp.x,swp.y,swp.z]],ma);
-var _153=_2.multiply([[dwp.x,dwp.y,dwp.z]],ma);
-var _154=[[_153[0][0]/dSrc[0][0],0,0],[0,_153[0][1]/dSrc[0][1],0],[0,0,_153[0][2]/dSrc[0][2]]];
-var m=_2.multiply(_2.multiply(ma,_154),mai);
-var r=_2.multiply([[_14d.color.X,_14d.color.Y,_14d.color.Z]],m)[0];
+var _94=_2.multiply([[swp.x,swp.y,swp.z]],ma);
+var _95=_2.multiply([[dwp.x,dwp.y,dwp.z]],ma);
+var _96=[[_95[0][0]/_94[0][0],0,0],[0,_95[0][1]/_94[0][1],0],[0,0,_95[0][2]/_94[0][2]]];
+var m=_2.multiply(_2.multiply(ma,_96),mai);
+var r=_2.multiply([[_93.color.X,_93.color.Y,_93.color.Z]],m)[0];
 return {X:r[0],Y:r[1],Z:r[2]};
 };
-this.matrix=function(to,_158){
-var wp=this.whitepoint(_158.whitepoint);
+this.matrix=function(to,_97){
+var wp=this.whitepoint(_97.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;
@@ -420,28 +420,28 @@ 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 _168=[[Sr*Xr,Sr*Yr,Sr*Zr],[Sg*Xg,Sg*Yg,Sg*Zg],[Sb*Xb,Sb*Yb,Sb*Zb]];
+var _98=[[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(_168);
+return dojox.math.inverse(_98);
 }
-return _168;
+return _98;
 };
-this.epsilon=function(_169){
-return (_169||typeof (_169)=="undefined")?0.008856:216/24289;
+this.epsilon=function(_99){
+return (_99||typeof (_99)=="undefined")?0.008856:216/24289;
 };
-this.kappa=function(_16a){
-return (_16a||typeof (_16a)=="undefined")?903.3:24389/27;
+this.kappa=function(_9a){
+return (_9a||typeof (_9a)=="undefined")?903.3:24389/27;
 };
-this.convert=function(_16b,from,to,_16e){
-if(_5b[from]&&_5b[from][to]){
-return _5b[from][to](obj,_16e);
+this.convert=function(_9b,_9c,to,_9d){
+if(_1d[_9c]&&_1d[_9c][to]){
+return _1d[_9c][to](obj,_9d);
 }
-console.warn("dojox.color.Colorspace::convert: Can't convert ",_16b," from ",from," to ",to,".");
+console.warn("dojox.color.Colorspace::convert: Can't convert ",_9b," from ",_9c," to ",to,".");
 };
 })();
-dojo.mixin(dojox.color,{fromXYZ:function(xyz,_170){
-_170=_170||{};
-var p=dojox.color.Colorspace.primaries(_170);
+dojo.mixin(dojox.color,{fromXYZ:function(xyz,_9e){
+_9e=_9e||{};
+var p=dojox.color.Colorspace.primaries(_9e);
 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];
@@ -454,17 +454,17 @@ 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(_17a){
-_17a=_17a||{};
-var p=dojox.color.Colorspace.primaries(_17a);
+dojo.extend(dojox.color.Color,{toXYZ:function(_9f){
+_9f=_9f||{};
+var p=dojox.color.Colorspace.primaries(_9f);
 var m=dojox.color.Colorspace.matrix("XYZ",p);
-var _r=this.r/255,_g=this.g/255,_b=this.b/255;
+var _a0=this.r/255,_a1=this.g/255,_a2=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;
+var r=(_a0>0.04045)?Math.pow(((_a0+0.055)/1.055),2.4):_a0/12.92;
+var g=(_a1>0.04045)?Math.pow(((_a1+0.055)/1.055),2.4):_a1/12.92;
+var b=(_a2>0.04045)?Math.pow(((_a2+0.055)/1.055),2.4):_a2/12.92;
 }else{
-var r=Math.pow(_r,p.gamma),g=Math.pow(_g,p.gamma),b=Math.pow(_b,p.gamma);
+var r=Math.pow(_a0,p.gamma),g=Math.pow(_a1,p.gamma),b=Math.pow(_a2,p.gamma);
 }
 var xyz=dojox.math.matrix([[r,g,b]],m);
 return {X:xyz[0][0],Y:xyz[0][1],Z:xyz[0][2]};
diff --git a/dojox/color/Palette.js b/dojox/color/Palette.js
index 76c739e..b8f6ea3 100644
--- a/dojox/color/Palette.js
+++ b/dojox/color/Palette.js
@@ -34,142 +34,141 @@ this.colors=[null,null,new dojox.color.Color(_2),null,null];
 }
 }
 };
-function _4(p,_6,_7){
-var _8=new dojox.color.Palette();
-_8.colors=[];
-dojo.forEach(p.colors,function(_9){
-var r=(_6=="dr")?_9.r+_7:_9.r,g=(_6=="dg")?_9.g+_7:_9.g,b=(_6=="db")?_9.b+_7:_9.b,a=(_6=="da")?_9.a+_7:_9.a;
-_8.colors.push(new dojox.color.Color({r:Math.min(255,Math.max(0,r)),g:Math.min(255,Math.max(0,g)),b:Math.min(255,Math.max(0,b)),a:Math.min(1,Math.max(0,a))}));
+function _4(p,_5,_6){
+var _7=new dojox.color.Palette();
+_7.colors=[];
+dojo.forEach(p.colors,function(_8){
+var r=(_5=="dr")?_8.r+_6:_8.r,g=(_5=="dg")?_8.g+_6:_8.g,b=(_5=="db")?_8.b+_6:_8.b,a=(_5=="da")?_8.a+_6:_8.a;
+_7.colors.push(new dojox.color.Color({r:Math.min(255,Math.max(0,r)),g:Math.min(255,Math.max(0,g)),b:Math.min(255,Math.max(0,b)),a:Math.min(1,Math.max(0,a))}));
 });
-
-return _8;
+return _7;
 };
-function _e(p,_10,val){
-var ret=new dojox.color.Palette();
-ret.colors=[];
-dojo.forEach(p.colors,function(_13){
-var o=_13.toCmy(),c=(_10=="dc")?o.c+val:o.c,m=(_10=="dm")?o.m+val:o.m,y=(_10=="dy")?o.y+val:o.y;
-ret.colors.push(dojox.color.fromCmy(Math.min(100,Math.max(0,c)),Math.min(100,Math.max(0,m)),Math.min(100,Math.max(0,y))));
+function _9(p,_a,_b){
+var _c=new dojox.color.Palette();
+_c.colors=[];
+dojo.forEach(p.colors,function(_d){
+var o=_d.toCmy(),c=(_a=="dc")?o.c+_b:o.c,m=(_a=="dm")?o.m+_b:o.m,y=(_a=="dy")?o.y+_b:o.y;
+_c.colors.push(dojox.color.fromCmy(Math.min(100,Math.max(0,c)),Math.min(100,Math.max(0,m)),Math.min(100,Math.max(0,y))));
 });
-return ret;
+return _c;
 };
-function _18(p,_1a,val){
+function _e(p,_f,val){
 var ret=new dojox.color.Palette();
 ret.colors=[];
-dojo.forEach(p.colors,function(_1d){
-var o=_1d.toCmyk(),c=(_1a=="dc")?o.c+val:o.c,m=(_1a=="dm")?o.m+val:o.m,y=(_1a=="dy")?o.y+val:o.y,k=(_1a=="dk")?o.b+val:o.b;
+dojo.forEach(p.colors,function(_10){
+var o=_10.toCmyk(),c=(_f=="dc")?o.c+val:o.c,m=(_f=="dm")?o.m+val:o.m,y=(_f=="dy")?o.y+val:o.y,k=(_f=="dk")?o.b+val:o.b;
 ret.colors.push(dojox.color.fromCmyk(Math.min(100,Math.max(0,c)),Math.min(100,Math.max(0,m)),Math.min(100,Math.max(0,y)),Math.min(100,Math.max(0,k))));
 });
 return ret;
 };
-function _23(p,_25,val){
+function _11(p,_12,val){
 var ret=new dojox.color.Palette();
 ret.colors=[];
-dojo.forEach(p.colors,function(_28){
-var o=_28.toHsl(),h=(_25=="dh")?o.h+val:o.h,s=(_25=="ds")?o.s+val:o.s,l=(_25=="dl")?o.l+val:o.l;
+dojo.forEach(p.colors,function(_13){
+var o=_13.toHsl(),h=(_12=="dh")?o.h+val:o.h,s=(_12=="ds")?o.s+val:o.s,l=(_12=="dl")?o.l+val:o.l;
 ret.colors.push(dojox.color.fromHsl(h%360,Math.min(100,Math.max(0,s)),Math.min(100,Math.max(0,l))));
 });
 return ret;
 };
-function _2d(p,_2f,val){
+function _14(p,_15,val){
 var ret=new dojox.color.Palette();
 ret.colors=[];
-dojo.forEach(p.colors,function(_32){
-var o=_32.toHsv(),h=(_2f=="dh")?o.h+val:o.h,s=(_2f=="ds")?o.s+val:o.s,v=(_2f=="dv")?o.v+val:o.v;
+dojo.forEach(p.colors,function(_16){
+var o=_16.toHsv(),h=(_15=="dh")?o.h+val:o.h,s=(_15=="ds")?o.s+val:o.s,v=(_15=="dv")?o.v+val:o.v;
 ret.colors.push(dojox.color.fromHsv(h%360,Math.min(100,Math.max(0,s)),Math.min(100,Math.max(0,v))));
 });
 return ret;
 };
-function _37(val,low,_3a){
-return _3a-((_3a-val)*((_3a-low)/_3a));
+function _17(val,low,_18){
+return _18-((_18-val)*((_18-low)/_18));
 };
-dojo.extend(_1.Palette,{transform:function(_3b){
+dojo.extend(_1.Palette,{transform:function(_19){
 var fn=_4;
-if(_3b.use){
-var use=_3b.use.toLowerCase();
+if(_19.use){
+var use=_19.use.toLowerCase();
 if(use.indexOf("hs")==0){
 if(use.charAt(2)=="l"){
-fn=_23;
+fn=_11;
 }else{
-fn=_2d;
+fn=_14;
 }
 }else{
 if(use.indexOf("cmy")==0){
 if(use.charAt(3)=="k"){
-fn=_18;
-}else{
 fn=_e;
+}else{
+fn=_9;
 }
 }
 }
 }else{
-if("dc" in _3b||"dm" in _3b||"dy" in _3b){
-if("dk" in _3b){
-fn=_18;
-}else{
+if("dc" in _19||"dm" in _19||"dy" in _19){
+if("dk" in _19){
 fn=_e;
+}else{
+fn=_9;
 }
 }else{
-if("dh" in _3b||"ds" in _3b){
-if("dv" in _3b){
-fn=_2d;
+if("dh" in _19||"ds" in _19){
+if("dv" in _19){
+fn=_14;
 }else{
-fn=_23;
+fn=_11;
 }
 }
 }
 }
-var _3e=this;
-for(var p in _3b){
+var _1a=this;
+for(var p in _19){
 if(p=="use"){
 continue;
 }
-_3e=fn(_3e,p,_3b[p]);
+_1a=fn(_1a,p,_19[p]);
 }
-return _3e;
+return _1a;
 },clone:function(){
 return new _1.Palette(this);
 }});
-dojo.mixin(_1.Palette,{generators:{analogous:function(_40){
-var _41=_40.high||60,low=_40.low||18,_43=dojo.isString(_40.base)?new dojox.color.Color(_40.base):_40.base,hsv=_43.toHsv();
-var h=[(hsv.h+low+360)%360,(hsv.h+Math.round(low/2)+360)%360,hsv.h,(hsv.h-Math.round(_41/2)+360)%360,(hsv.h-_41+360)%360];
+dojo.mixin(_1.Palette,{generators:{analogous:function(_1b){
+var _1c=_1b.high||60,low=_1b.low||18,_1d=dojo.isString(_1b.base)?new dojox.color.Color(_1b.base):_1b.base,hsv=_1d.toHsv();
+var h=[(hsv.h+low+360)%360,(hsv.h+Math.round(low/2)+360)%360,hsv.h,(hsv.h-Math.round(_1c/2)+360)%360,(hsv.h-_1c+360)%360];
 var s1=Math.max(10,(hsv.s<=95)?hsv.s+5:(100-(hsv.s-95))),s2=(hsv.s>1)?hsv.s-1:21-hsv.s,v1=(hsv.v>=92)?hsv.v-9:Math.max(hsv.v+9,20),v2=(hsv.v<=90)?Math.max(hsv.v+5,20):(95+Math.ceil((hsv.v-90)/2)),s=[s1,s2,hsv.s,s1,s1],v=[v1,v2,hsv.v,v1,v2];
 return new _1.Palette(dojo.map(h,function(hue,i){
 return dojox.color.fromHsv(hue,s[i],v[i]);
 }));
-},monochromatic:function(_4e){
-var _4f=dojo.isString(_4e.base)?new dojox.color.Color(_4e.base):_4e.base,hsv=_4f.toHsv();
-var s1=(hsv.s-30>9)?hsv.s-30:hsv.s+30,s2=hsv.s,v1=_37(hsv.v,20,100),v2=(hsv.v-20>20)?hsv.v-20:hsv.v+60,v3=(hsv.v-50>20)?hsv.v-50:hsv.v+30;
-return new _1.Palette([dojox.color.fromHsv(hsv.h,s1,v1),dojox.color.fromHsv(hsv.h,s2,v3),_4f,dojox.color.fromHsv(hsv.h,s1,v3),dojox.color.fromHsv(hsv.h,s2,v2)]);
-},triadic:function(_56){
-var _57=dojo.isString(_56.base)?new dojox.color.Color(_56.base):_56.base,hsv=_57.toHsv();
+},monochromatic:function(_1e){
+var _1f=dojo.isString(_1e.base)?new dojox.color.Color(_1e.base):_1e.base,hsv=_1f.toHsv();
+var s1=(hsv.s-30>9)?hsv.s-30:hsv.s+30,s2=hsv.s,v1=_17(hsv.v,20,100),v2=(hsv.v-20>20)?hsv.v-20:hsv.v+60,v3=(hsv.v-50>20)?hsv.v-50:hsv.v+30;
+return new _1.Palette([dojox.color.fromHsv(hsv.h,s1,v1),dojox.color.fromHsv(hsv.h,s2,v3),_1f,dojox.color.fromHsv(hsv.h,s1,v3),dojox.color.fromHsv(hsv.h,s2,v2)]);
+},triadic:function(_20){
+var _21=dojo.isString(_20.base)?new dojox.color.Color(_20.base):_20.base,hsv=_21.toHsv();
 var h1=(hsv.h+57+360)%360,h2=(hsv.h-157+360)%360,s1=(hsv.s>20)?hsv.s-10:hsv.s+10,s2=(hsv.s>90)?hsv.s-10:hsv.s+10,s3=(hsv.s>95)?hsv.s-5:hsv.s+5,v1=(hsv.v-20>20)?hsv.v-20:hsv.v+20,v2=(hsv.v-30>20)?hsv.v-30:hsv.v+30,v3=(hsv.v-30>70)?hsv.v-30:hsv.v+30;
-return new _1.Palette([dojox.color.fromHsv(h1,s1,hsv.v),dojox.color.fromHsv(hsv.h,s2,v2),_57,dojox.color.fromHsv(h2,s2,v1),dojox.color.fromHsv(h2,s3,v3)]);
-},complementary:function(_61){
-var _62=dojo.isString(_61.base)?new dojox.color.Color(_61.base):_61.base,hsv=_62.toHsv();
-var h1=((hsv.h*2)+137<360)?(hsv.h*2)+137:Math.floor(hsv.h/2)-137,s1=Math.max(hsv.s-10,0),s2=_37(hsv.s,10,100),s3=Math.min(100,hsv.s+20),v1=Math.min(100,hsv.v+30),v2=(hsv.v>20)?hsv.v-30:hsv.v+30;
-return new _1.Palette([dojox.color.fromHsv(hsv.h,s1,v1),dojox.color.fromHsv(hsv.h,s2,v2),_62,dojox.color.fromHsv(h1,s3,v2),dojox.color.fromHsv(h1,hsv.s,hsv.v)]);
-},splitComplementary:function(_6a){
-var _6b=dojo.isString(_6a.base)?new dojox.color.Color(_6a.base):_6a.base,_6c=_6a.da||30,hsv=_6b.toHsv();
-var _6e=((hsv.h*2)+137<360)?(hsv.h*2)+137:Math.floor(hsv.h/2)-137,h1=(_6e-_6c+360)%360,h2=(_6e+_6c)%360,s1=Math.max(hsv.s-10,0),s2=_37(hsv.s,10,100),s3=Math.min(100,hsv.s+20),v1=Math.min(100,hsv.v+30),v2=(hsv.v>20)?hsv.v-30:hsv.v+30;
-return new _1.Palette([dojox.color.fromHsv(h1,s1,v1),dojox.color.fromHsv(h1,s2,v2),_6b,dojox.color.fromHsv(h2,s3,v2),dojox.color.fromHsv(h2,hsv.s,hsv.v)]);
-},compound:function(_76){
-var _77=dojo.isString(_76.base)?new dojox.color.Color(_76.base):_76.base,hsv=_77.toHsv();
+return new _1.Palette([dojox.color.fromHsv(h1,s1,hsv.v),dojox.color.fromHsv(hsv.h,s2,v2),_21,dojox.color.fromHsv(h2,s2,v1),dojox.color.fromHsv(h2,s3,v3)]);
+},complementary:function(_22){
+var _23=dojo.isString(_22.base)?new dojox.color.Color(_22.base):_22.base,hsv=_23.toHsv();
+var h1=((hsv.h*2)+137<360)?(hsv.h*2)+137:Math.floor(hsv.h/2)-137,s1=Math.max(hsv.s-10,0),s2=_17(hsv.s,10,100),s3=Math.min(100,hsv.s+20),v1=Math.min(100,hsv.v+30),v2=(hsv.v>20)?hsv.v-30:hsv.v+30;
+return new _1.Palette([dojox.color.fromHsv(hsv.h,s1,v1),dojox.color.fromHsv(hsv.h,s2,v2),_23,dojox.color.fromHsv(h1,s3,v2),dojox.color.fromHsv(h1,hsv.s,hsv.v)]);
+},splitComplementary:function(_24){
+var _25=dojo.isString(_24.base)?new dojox.color.Color(_24.base):_24.base,_26=_24.da||30,hsv=_25.toHsv();
+var _27=((hsv.h*2)+137<360)?(hsv.h*2)+137:Math.floor(hsv.h/2)-137,h1=(_27-_26+360)%360,h2=(_27+_26)%360,s1=Math.max(hsv.s-10,0),s2=_17(hsv.s,10,100),s3=Math.min(100,hsv.s+20),v1=Math.min(100,hsv.v+30),v2=(hsv.v>20)?hsv.v-30:hsv.v+30;
+return new _1.Palette([dojox.color.fromHsv(h1,s1,v1),dojox.color.fromHsv(h1,s2,v2),_25,dojox.color.fromHsv(h2,s3,v2),dojox.color.fromHsv(h2,hsv.s,hsv.v)]);
+},compound:function(_28){
+var _29=dojo.isString(_28.base)?new dojox.color.Color(_28.base):_28.base,hsv=_29.toHsv();
 var h1=((hsv.h*2)+18<360)?(hsv.h*2)+18:Math.floor(hsv.h/2)-18,h2=((hsv.h*2)+120<360)?(hsv.h*2)+120:Math.floor(hsv.h/2)-120,h3=((hsv.h*2)+99<360)?(hsv.h*2)+99:Math.floor(hsv.h/2)-99,s1=(hsv.s-40>10)?hsv.s-40:hsv.s+40,s2=(hsv.s-10>80)?hsv.s-10:hsv.s+10,s3=(hsv.s-25>10)?hsv.s-25:hsv.s+25,v1=(hsv.v-40>10)?hsv.v-40:hsv.v+40,v2=(hsv.v-20>80)?hsv.v-20:hsv.v+20,v3=Math.max(hsv.v,20);
-return new _1.Palette([dojox.color.fromHsv(h1,s1,v1),dojox.color.fromHsv(h1,s2,v2),_77,dojox.color.fromHsv(h2,s3,v3),dojox.color.fromHsv(h3,s2,v2)]);
-},shades:function(_82){
-var _83=dojo.isString(_82.base)?new dojox.color.Color(_82.base):_82.base,hsv=_83.toHsv();
+return new _1.Palette([dojox.color.fromHsv(h1,s1,v1),dojox.color.fromHsv(h1,s2,v2),_29,dojox.color.fromHsv(h2,s3,v3),dojox.color.fromHsv(h3,s2,v2)]);
+},shades:function(_2a){
+var _2b=dojo.isString(_2a.base)?new dojox.color.Color(_2a.base):_2a.base,hsv=_2b.toHsv();
 var s=(hsv.s==100&&hsv.v==0)?0:hsv.s,v1=(hsv.v-50>20)?hsv.v-50:hsv.v+30,v2=(hsv.v-25>=20)?hsv.v-25:hsv.v+55,v3=(hsv.v-75>=20)?hsv.v-75:hsv.v+5,v4=Math.max(hsv.v-10,20);
-return new _1.Palette([new dojox.color.fromHsv(hsv.h,s,v1),new dojox.color.fromHsv(hsv.h,s,v2),_83,new dojox.color.fromHsv(hsv.h,s,v3),new dojox.color.fromHsv(hsv.h,s,v4)]);
-}},generate:function(_8a,_8b){
-if(dojo.isFunction(_8b)){
-return _8b({base:_8a});
+return new _1.Palette([new dojox.color.fromHsv(hsv.h,s,v1),new dojox.color.fromHsv(hsv.h,s,v2),_2b,new dojox.color.fromHsv(hsv.h,s,v3),new dojox.color.fromHsv(hsv.h,s,v4)]);
+}},generate:function(_2c,_2d){
+if(dojo.isFunction(_2d)){
+return _2d({base:_2c});
 }else{
-if(_1.Palette.generators[_8b]){
-return _1.Palette.generators[_8b]({base:_8a});
+if(_1.Palette.generators[_2d]){
+return _1.Palette.generators[_2d]({base:_2c});
 }
 }
-throw new Error("dojox.color.Palette.generate: the specified generator ('"+_8b+"') does not exist.");
+throw new Error("dojox.color.Palette.generate: the specified generator ('"+_2d+"') does not exist.");
 }});
 })();
 }
diff --git a/dojox/color/_base.js b/dojox/color/_base.js
index 0078645..5ee28c1 100644
--- a/dojox/color/_base.js
+++ b/dojox/color/_base.js
@@ -27,129 +27,129 @@ _2=_1.m,_3=_1.y,_1=_1.c;
 _1/=100,_2/=100,_3/=100;
 var r=1-_1,g=1-_2,b=1-_3;
 return new dojox.color.Color({r:Math.round(r*255),g:Math.round(g*255),b:Math.round(b*255)});
-},fromCmyk:function(_7,_8,_9,_a){
-if(dojo.isArray(_7)){
-_8=_7[1],_9=_7[2],_a=_7[3],_7=_7[0];
+},fromCmyk:function(_4,_5,_6,_7){
+if(dojo.isArray(_4)){
+_5=_4[1],_6=_4[2],_7=_4[3],_4=_4[0];
 }else{
-if(dojo.isObject(_7)){
-_8=_7.m,_9=_7.y,_a=_7.b,_7=_7.c;
+if(dojo.isObject(_4)){
+_5=_4.m,_6=_4.y,_7=_4.b,_4=_4.c;
 }
 }
-_7/=100,_8/=100,_9/=100,_a/=100;
+_4/=100,_5/=100,_6/=100,_7/=100;
 var r,g,b;
-r=1-Math.min(1,_7*(1-_a)+_a);
-g=1-Math.min(1,_8*(1-_a)+_a);
-b=1-Math.min(1,_9*(1-_a)+_a);
+r=1-Math.min(1,_4*(1-_7)+_7);
+g=1-Math.min(1,_5*(1-_7)+_7);
+b=1-Math.min(1,_6*(1-_7)+_7);
 return new dojox.color.Color({r:Math.round(r*255),g:Math.round(g*255),b:Math.round(b*255)});
-},fromHsl:function(_e,_f,_10){
-if(dojo.isArray(_e)){
-_f=_e[1],_10=_e[2],_e=_e[0];
+},fromHsl:function(_8,_9,_a){
+if(dojo.isArray(_8)){
+_9=_8[1],_a=_8[2],_8=_8[0];
 }else{
-if(dojo.isObject(_e)){
-_f=_e.s,_10=_e.l,_e=_e.h;
+if(dojo.isObject(_8)){
+_9=_8.s,_a=_8.l,_8=_8.h;
 }
 }
-_f/=100;
-_10/=100;
-while(_e<0){
-_e+=360;
+_9/=100;
+_a/=100;
+while(_8<0){
+_8+=360;
 }
-while(_e>=360){
-_e-=360;
+while(_8>=360){
+_8-=360;
 }
 var r,g,b;
-if(_e<120){
-r=(120-_e)/60,g=_e/60,b=0;
+if(_8<120){
+r=(120-_8)/60,g=_8/60,b=0;
 }else{
-if(_e<240){
-r=0,g=(240-_e)/60,b=(_e-120)/60;
+if(_8<240){
+r=0,g=(240-_8)/60,b=(_8-120)/60;
 }else{
-r=(_e-240)/60,g=0,b=(360-_e)/60;
+r=(_8-240)/60,g=0,b=(360-_8)/60;
 }
 }
-r=2*_f*Math.min(r,1)+(1-_f);
-g=2*_f*Math.min(g,1)+(1-_f);
-b=2*_f*Math.min(b,1)+(1-_f);
-if(_10<0.5){
-r*=_10,g*=_10,b*=_10;
+r=2*_9*Math.min(r,1)+(1-_9);
+g=2*_9*Math.min(g,1)+(1-_9);
+b=2*_9*Math.min(b,1)+(1-_9);
+if(_a<0.5){
+r*=_a,g*=_a,b*=_a;
 }else{
-r=(1-_10)*r+2*_10-1;
-g=(1-_10)*g+2*_10-1;
-b=(1-_10)*b+2*_10-1;
+r=(1-_a)*r+2*_a-1;
+g=(1-_a)*g+2*_a-1;
+b=(1-_a)*b+2*_a-1;
 }
 return new dojox.color.Color({r:Math.round(r*255),g:Math.round(g*255),b:Math.round(b*255)});
-},fromHsv:function(hue,_15,_16){
-if(dojo.isArray(hue)){
-_15=hue[1],_16=hue[2],hue=hue[0];
+},fromHsv:function(_b,_c,_d){
+if(dojo.isArray(_b)){
+_c=_b[1],_d=_b[2],_b=_b[0];
 }else{
-if(dojo.isObject(hue)){
-_15=hue.s,_16=hue.v,hue=hue.h;
+if(dojo.isObject(_b)){
+_c=_b.s,_d=_b.v,_b=_b.h;
 }
 }
-if(hue==360){
-hue=0;
+if(_b==360){
+_b=0;
 }
-_15/=100;
-_16/=100;
+_c/=100;
+_d/=100;
 var r,g,b;
-if(_15==0){
-r=_16,b=_16,g=_16;
+if(_c==0){
+r=_d,b=_d,g=_d;
 }else{
-var _1a=hue/60,i=Math.floor(_1a),f=_1a-i;
-var p=_16*(1-_15);
-var q=_16*(1-(_15*f));
-var t=_16*(1-(_15*(1-f)));
+var _e=_b/60,i=Math.floor(_e),f=_e-i;
+var p=_d*(1-_c);
+var q=_d*(1-(_c*f));
+var t=_d*(1-(_c*(1-f)));
 switch(i){
 case 0:
-r=_16,g=t,b=p;
+r=_d,g=t,b=p;
 break;
 case 1:
-r=q,g=_16,b=p;
+r=q,g=_d,b=p;
 break;
 case 2:
-r=p,g=_16,b=t;
+r=p,g=_d,b=t;
 break;
 case 3:
-r=p,g=q,b=_16;
+r=p,g=q,b=_d;
 break;
 case 4:
-r=t,g=p,b=_16;
+r=t,g=p,b=_d;
 break;
 case 5:
-r=_16,g=p,b=q;
+r=_d,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)});
 }});
 dojo.extend(dojox.color.Color,{toCmy:function(){
-var _20=1-(this.r/255),_21=1-(this.g/255),_22=1-(this.b/255);
-return {c:Math.round(_20*100),m:Math.round(_21*100),y:Math.round(_22*100)};
+var _f=1-(this.r/255),_10=1-(this.g/255),_11=1-(this.b/255);
+return {c:Math.round(_f*100),m:Math.round(_10*100),y:Math.round(_11*100)};
 },toCmyk:function(){
-var _23,_24,_25,_26;
+var _12,_13,_14,_15;
 var r=this.r/255,g=this.g/255,b=this.b/255;
-_26=Math.min(1-r,1-g,1-b);
-_23=(1-r-_26)/(1-_26);
-_24=(1-g-_26)/(1-_26);
-_25=(1-b-_26)/(1-_26);
-return {c:Math.round(_23*100),m:Math.round(_24*100),y:Math.round(_25*100),b:Math.round(_26*100)};
+_15=Math.min(1-r,1-g,1-b);
+_12=(1-r-_15)/(1-_15);
+_13=(1-g-_15)/(1-_15);
+_14=(1-b-_15)/(1-_15);
+return {c:Math.round(_12*100),m:Math.round(_13*100),y:Math.round(_14*100),b:Math.round(_15*100)};
 },toHsl:function(){
 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 _2f=max-min;
+var _16=max-min;
 var h=0,s=0,l=(min+max)/2;
 if(l>0&&l<1){
-s=_2f/((l<0.5)?(2*l):(2-2*l));
+s=_16/((l<0.5)?(2*l):(2-2*l));
 }
-if(_2f>0){
+if(_16>0){
 if(max==r&&max!=g){
-h+=(g-b)/_2f;
+h+=(g-b)/_16;
 }
 if(max==g&&max!=b){
-h+=(2+(b-r)/_2f);
+h+=(2+(b-r)/_16);
 }
 if(max==b&&max!=r){
-h+=(4+(r-g)/_2f);
+h+=(4+(r-g)/_16);
 }
 h*=60;
 }
@@ -157,18 +157,18 @@ return {h:h,s:Math.round(s*100),l:Math.round(l*100)};
 },toHsv:function(){
 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 _38=max-min;
-var h=null,s=(max==0)?0:(_38/max);
+var _17=max-min;
+var h=null,s=(max==0)?0:(_17/max);
 if(s==0){
 h=0;
 }else{
 if(r==max){
-h=60*(g-b)/_38;
+h=60*(g-b)/_17;
 }else{
 if(g==max){
-h=120+60*(b-r)/_38;
+h=120+60*(b-r)/_17;
 }else{
-h=240+60*(r-g)/_38;
+h=240+60*(r-g)/_17;
 }
 }
 if(h<0){
diff --git a/dojox/cometd/RestChannels.js b/dojox/cometd/RestChannels.js
index cfcdcf7..896c376 100644
--- a/dojox/cometd/RestChannels.js
+++ b/dojox/cometd/RestChannels.js
@@ -17,89 +17,85 @@ if(dojox.rpc.Rest&&this.autoSubscribeRoot){
 var _2=dojox.rpc.Rest._get;
 var _3=this;
 dojox.rpc.Rest._get=function(_4,id){
-var _6=dojo.xhrGet;
+var _5=dojo.xhrGet;
 dojo.xhrGet=function(r){
-var _8=_3.autoSubscribeRoot;
-return (_8&&r.url.substring(0,_8.length)==_8)?_3.get(r.url,r):_6(r);
+var _6=_3.autoSubscribeRoot;
+return (_6&&r.url.substring(0,_6.length)==_6)?_3.get(r.url,r):_5(r);
 };
-var _9=_2.apply(this,arguments);
-dojo.xhrGet=_6;
-return _9;
+var _7=_2.apply(this,arguments);
+dojo.xhrGet=_5;
+return _7;
 };
 }
-if(dojox.data&&dojox.data.restListener){
-this.receive=dojox.data.restListener;
-}
-},absoluteUrl:function(_a,_b){
-return new dojo._Url(_a,_b)+"";
+},absoluteUrl:function(_8,_9){
+return new dojo._Url(_8,_9)+"";
 },acceptType:"application/rest+json,application/http;q=0.9,*/*;q=0.7",subscriptions:{},subCallbacks:{},autoReconnectTime:3000,reloadDataOnReconnect:true,sendAsJson:false,url:"/channels",autoSubscribeRoot:"/",open:function(){
 this.started=true;
 if(!this.connected){
 this.connectionId=dojox.rpc.Client.clientId;
-var _c=this.createdClientId?"Client-Id":"Create-Client-Id";
+var _a=this.createdClientId?"Client-Id":"Create-Client-Id";
 this.createdClientId=true;
-var _d={Accept:this.acceptType};
-_d[_c]=this.connectionId;
-var _e=dojo.xhrPost({headers:_d,url:this.url,noStatus:true});
-var _f=this;
+var _b={Accept:this.acceptType};
+_b[_a]=this.connectionId;
+var _c=dojo.xhrPost({headers:_b,url:this.url,noStatus:true});
+var _d=this;
 this.lastIndex=0;
-var _10,_11=function(_12){
+var _e,_f=function(_10){
 if(typeof dojo=="undefined"){
 return null;
 }
 if(xhr&&xhr.status>400){
-return _10(true);
+return _e(true);
 }
-if(typeof _12=="string"){
-_12=_12.substring(_f.lastIndex);
+if(typeof _10=="string"){
+_10=_10.substring(_d.lastIndex);
 }
-var _14=xhr&&(xhr.contentType||xhr.getResponseHeader("Content-Type"))||(typeof _12!="string"&&"already json");
-var _15=_f.onprogress(xhr,_12,_14);
-if(_15){
-if(_10()){
-return new Error(_15);
+var _11=xhr&&(xhr.contentType||xhr.getResponseHeader("Content-Type"))||(typeof _10!="string"&&"already json");
+var _12=_d.onprogress(xhr,_10,_11);
+if(_12){
+if(_e()){
+return new Error(_12);
 }
 }
 if(!xhr||xhr.readyState==4){
 xhr=null;
-if(_f.connected){
-_f.connected=false;
-_f.open();
+if(_d.connected){
+_d.connected=false;
+_d.open();
 }
 }
-return _12;
+return _10;
 };
-_10=function(_16){
+_e=function(_13){
 if(xhr&&xhr.status==409){
-
-_f.disconnected();
+_d.disconnected();
 return null;
 }
-_f.createdClientId=false;
-_f.disconnected();
-return _16;
+_d.createdClientId=false;
+_d.disconnected();
+return _13;
 };
-_e.addCallbacks(_11,_10);
-var xhr=_e.ioArgs.xhr;
+_c.addCallbacks(_f,_e);
+var xhr=_c.ioArgs.xhr;
 if(xhr){
 xhr.onreadystatechange=function(){
-var _17;
+var _14;
 try{
 if(xhr.readyState==3){
-_f.readyState=3;
-_17=xhr.responseText;
+_d.readyState=3;
+_14=xhr.responseText;
 }
 }
 catch(e){
 }
-if(typeof _17=="string"){
-_11(_17);
+if(typeof _14=="string"){
+_f(_14);
 }
 };
 }
 if(window.attachEvent){
 window.attachEvent("onunload",function(){
-_f.connected=false;
+_d.connected=false;
 if(xhr){
 xhr.abort();
 }
@@ -107,134 +103,134 @@ xhr.abort();
 }
 this.connected=true;
 }
-},_send:function(_18,_19,_1a){
+},_send:function(_15,_16,_17){
 if(this.sendAsJson){
-_19.postBody=dojo.toJson({target:_19.url,method:_18,content:_1a,params:_19.content,subscribe:_19.headers["Subscribe"]});
-_19.url=this.url;
-_18="POST";
+_16.postData=dojo.toJson({target:_16.url,method:_15,content:_17,params:_16.content,subscribe:_16.headers["Subscribe"]});
+_16.url=this.url;
+_15="POST";
 }else{
-_19.postData=dojo.toJson(_1a);
-}
-return dojo.xhr(_18,_19,_19.postBody);
-},subscribe:function(_1b,_1c){
-_1c=_1c||{};
-_1c.url=this.absoluteUrl(this.url,_1b);
-if(_1c.headers){
-delete _1c.headers.Range;
-}
-var _1d=this.subscriptions[_1b];
-var _1e=_1c.method||"HEAD";
-var _1f=_1c.since;
-var _20=_1c.callback;
-var _21=_1c.headers||(_1c.headers={});
-this.subscriptions[_1b]=_1f||_1d||0;
-var _22=this.subCallbacks[_1b];
-if(_20){
-this.subCallbacks[_1b]=_22?function(m){
-_22(m);
-_20(m);
-}:_20;
+_16.postData=dojo.toJson(_17);
+}
+return dojo.xhr(_15,_16,_16.postData);
+},subscribe:function(_18,_19){
+_19=_19||{};
+_19.url=this.absoluteUrl(this.url,_18);
+if(_19.headers){
+delete _19.headers.Range;
+}
+var _1a=this.subscriptions[_18];
+var _1b=_19.method||"HEAD";
+var _1c=_19.since;
+var _1d=_19.callback;
+var _1e=_19.headers||(_19.headers={});
+this.subscriptions[_18]=_1c||_1a||0;
+var _1f=this.subCallbacks[_18];
+if(_1d){
+this.subCallbacks[_18]=_1f?function(m){
+_1f(m);
+_1d(m);
+}:_1d;
 }
 if(!this.connected){
 this.open();
 }
-if(_1d===undefined||_1d!=_1f){
-_21["Cache-Control"]="max-age=0";
-_1f=typeof _1f=="number"?new Date(_1f).toUTCString():_1f;
-if(_1f){
-_21["Subscribe-Since"]=_1f;
+if(_1a===undefined||_1a!=_1c){
+_1e["Cache-Control"]="max-age=0";
+_1c=typeof _1c=="number"?new Date(_1c).toUTCString():_1c;
+if(_1c){
+_1e["Subscribe-Since"]=_1c;
 }
-_21["Subscribe"]=_1c.unsubscribe?"none":"*";
-var dfd=this._send(_1e,_1c);
-var _25=this;
-dfd.addBoth(function(_26){
+_1e["Subscribe"]=_19.unsubscribe?"none":"*";
+var dfd=this._send(_1b,_19);
+var _20=this;
+dfd.addBoth(function(_21){
 var xhr=dfd.ioArgs.xhr;
-if(!(_26 instanceof Error)){
-if(_1c.confirmation){
-_1c.confirmation();
+if(!(_21 instanceof Error)){
+if(_19.confirmation){
+_19.confirmation();
 }
 }
 if(xhr&&xhr.getResponseHeader("Subscribed")=="OK"){
-var _28=xhr.getResponseHeader("Last-Modified");
+var _22=xhr.getResponseHeader("Last-Modified");
 if(xhr.responseText){
-_25.subscriptions[_1b]=_28||new Date().toUTCString();
+_20.subscriptions[_18]=_22||new Date().toUTCString();
 }else{
 return null;
 }
 }else{
-if(xhr&&!(_26 instanceof Error)){
-delete _25.subscriptions[_1b];
+if(xhr&&!(_21 instanceof Error)){
+delete _20.subscriptions[_18];
 }
 }
-if(!(_26 instanceof Error)){
-var _29={responseText:xhr&&xhr.responseText,channel:_1b,getResponseHeader:function(_2a){
-return xhr.getResponseHeader(_2a);
+if(!(_21 instanceof Error)){
+var _23={responseText:xhr&&xhr.responseText,channel:_18,getResponseHeader:function(_24){
+return xhr.getResponseHeader(_24);
 },getAllResponseHeaders:function(){
 return xhr.getAllResponseHeaders();
-},result:_26};
-if(_25.subCallbacks[_1b]){
-_25.subCallbacks[_1b](_29);
+},result:_21};
+if(_20.subCallbacks[_18]){
+_20.subCallbacks[_18](_23);
 }
 }else{
-if(_25.subCallbacks[_1b]){
-_25.subCallbacks[_1b](xhr);
+if(_20.subCallbacks[_18]){
+_20.subCallbacks[_18](xhr);
 }
 }
-return _26;
+return _21;
 });
 return dfd;
 }
 return null;
-},publish:function(_2b,_2c){
-return this._send("POST",{url:_2b,contentType:"application/json"},_2c);
-},_processMessage:function(_2d){
-_2d.event=_2d.event||_2d.getResponseHeader("Event");
-if(_2d.event=="connection-conflict"){
+},publish:function(_25,_26){
+return this._send("POST",{url:_25,contentType:"application/json"},_26);
+},_processMessage:function(_27){
+_27.event=_27.event||_27.getResponseHeader("Event");
+if(_27.event=="connection-conflict"){
 return "conflict";
 }
 try{
-_2d.result=_2d.result||dojo.fromJson(_2d.responseText);
+_27.result=_27.result||dojo.fromJson(_27.responseText);
 }
 catch(e){
 }
-var _2e=this;
-var loc=_2d.channel=new dojo._Url(this.url,_2d.source||_2d.getResponseHeader("Content-Location"))+"";
-if(loc in this.subscriptions&&_2d.getResponseHeader){
-this.subscriptions[loc]=_2d.getResponseHeader("Last-Modified");
+var _28=this;
+var loc=_27.channel=new dojo._Url(this.url,_27.source||_27.getResponseHeader("Content-Location"))+"";
+if(loc in this.subscriptions&&_27.getResponseHeader){
+this.subscriptions[loc]=_27.getResponseHeader("Last-Modified");
 }
 if(this.subCallbacks[loc]){
 setTimeout(function(){
-_2e.subCallbacks[loc](_2d);
+_28.subCallbacks[loc](_27);
 },0);
 }
-this.receive(_2d);
+this.receive(_27);
 return null;
-},onprogress:function(xhr,_31,_32){
-if(!_32||_32.match(/application\/rest\+json/)){
-var _33=_31.length;
-_31=_31.replace(/^\s*[,\[]?/,"[").replace(/[,\]]?\s*$/,"]");
+},onprogress:function(xhr,_29,_2a){
+if(!_2a||_2a.match(/application\/rest\+json/)){
+var _2b=_29.length;
+_29=_29.replace(/^\s*[,\[]?/,"[").replace(/[,\]]?\s*$/,"]");
 try{
-var _34=dojo.fromJson(_31);
-this.lastIndex+=_33;
+var _2c=dojo.fromJson(_29);
+this.lastIndex+=_2b;
 }
 catch(e){
 }
 }else{
-if(dojox.io&&dojox.io.httpParse&&_32.match(/application\/http/)){
-var _35="";
+if(dojox.io&&dojox.io.httpParse&&_2a.match(/application\/http/)){
+var _2d="";
 if(xhr&&xhr.getAllResponseHeaders){
-_35=xhr.getAllResponseHeaders();
+_2d=xhr.getAllResponseHeaders();
 }
-_34=dojox.io.httpParse(_31,_35,xhr.readyState!=4);
+_2c=dojox.io.httpParse(_29,_2d,xhr.readyState!=4);
 }else{
-if(typeof _31=="object"){
-_34=_31;
+if(typeof _29=="object"){
+_2c=_29;
 }
 }
 }
-if(_34){
-for(var i=0;i<_34.length;i++){
-if(this._processMessage(_34[i])){
+if(_2c){
+for(var i=0;i<_2c.length;i++){
+if(this._processMessage(_2c[i])){
 return "conflict";
 }
 }
@@ -250,81 +246,84 @@ if(xhr.__proto__){
 xhr={channel:"channel",__proto__:xhr};
 }
 return this._processMessage(xhr);
-},get:function(_37,_38){
-(_38=_38||{}).method="GET";
-return this.subscribe(_37,_38);
-},receive:function(_39){
+},get:function(_2e,_2f){
+(_2f=_2f||{}).method="GET";
+return this.subscribe(_2e,_2f);
+},receive:function(_30){
+if(dojox.data&&dojox.data.restListener){
+dojox.data.restListener(_30);
+}
 },disconnected:function(){
-var _3a=this;
+var _31=this;
 if(this.connected){
 this.connected=false;
 if(this.started){
 setTimeout(function(){
-var _3b=_3a.subscriptions;
-_3a.subscriptions={};
-for(var i in _3b){
-if(_3a.reloadDataOnReconnect&&dojox.rpc.JsonRest){
+var _32=_31.subscriptions;
+_31.subscriptions={};
+for(var i in _32){
+if(_31.reloadDataOnReconnect&&dojox.rpc.JsonRest){
 delete dojox.rpc.Rest._index[i];
 dojox.rpc.JsonRest.fetch(i);
 }else{
-_3a.subscribe(i,{since:_3b[i]});
+_31.subscribe(i,{since:_32[i]});
 }
 }
-_3a.open();
+_31.open();
 },this.autoReconnectTime);
 }
 }
-},unsubscribe:function(_3d,_3e){
-_3e=_3e||{};
-_3e.unsubscribe=true;
-this.subscribe(_3d,_3e);
+},unsubscribe:function(_33,_34){
+_34=_34||{};
+_34.unsubscribe=true;
+this.subscribe(_33,_34);
 },disconnect:function(){
 this.started=false;
 this.xhr.abort();
 }});
-var _3f=dojox.cometd.RestChannels.defaultInstance=new dojox.cometd.RestChannels();
+var _35=dojox.cometd.RestChannels.defaultInstance=new dojox.cometd.RestChannels();
 if(dojox.cometd.connectionTypes){
-_3f.startup=function(_40){
-_3f.open();
+_35.startup=function(_36){
+_35.open();
 this._cometd._deliver({channel:"/meta/connect",successful:true});
 };
-_3f.check=function(_41,_42,_43){
-for(var i=0;i<_41.length;i++){
-if(_41[i]=="rest-channels"){
-return !_43;
+_35.check=function(_37,_38,_39){
+for(var i=0;i<_37.length;i++){
+if(_37[i]=="rest-channels"){
+return !_39;
 }
 }
 return false;
 };
-_3f.deliver=function(_45){
+_35.deliver=function(_3a){
 };
-dojo.connect(this,"receive",null,function(_46){
-_46.data=_46.result;
-this._cometd._deliver(_46);
+dojo.connect(this,"receive",null,function(_3b){
+_3b.data=_3b.result;
+this._cometd._deliver(_3b);
 });
-_3f.sendMessages=function(_47){
-for(var i=0;i<_47.length;i++){
-var _49=_47[i];
-var _4a=_49.channel;
-var _4b=this._cometd;
-var _4c={confirmation:function(){
-_4b._deliver({channel:_4a,successful:true});
+_35.sendMessages=function(_3c){
+for(var i=0;i<_3c.length;i++){
+var _3d=_3c[i];
+var _3e=_3d.channel;
+var _3f=this._cometd;
+var _40={confirmation:function(){
+_3f._deliver({channel:_3e,successful:true});
 }};
-if(_4a=="/meta/subscribe"){
-this.subscribe(_49.subscription,_4c);
+if(_3e=="/meta/subscribe"){
+this.subscribe(_3d.subscription,_40);
 }else{
-if(_4a=="/meta/unsubscribe"){
-this.unsubscribe(_49.subscription,_4c);
+if(_3e=="/meta/unsubscribe"){
+this.unsubscribe(_3d.subscription,_40);
 }else{
-if(_4a=="/meta/connect"){
-_4c.confirmation();
+if(_3e=="/meta/connect"){
+_40.confirmation();
 }else{
-if(_4a=="/meta/disconnect"){
-_3f.disconnect();
-_4c.confirmation();
+if(_3e=="/meta/disconnect"){
+_35.disconnect();
+_40.confirmation();
 }else{
-if(_4a.substring(0,6)!="/meta/"){
-this.publish(_4a,_49.data);
+if(_3e.substring(0,6)!="/meta/"){
+this.publish(_3e,_3d.data);
 }
 }
 }
@@ -332,7 +331,7 @@ this.publish(_4a,_49.data);
 }
 }
 };
-dojox.cometd.connectionTypes.register("rest-channels",_3f.check,_3f,false,true);
+dojox.cometd.connectionTypes.register("rest-channels",_35.check,_35,false,true);
 }
 })();
 }
diff --git a/dojox/cometd/_base.js b/dojox/cometd/_base.js
index 4843e43..393395c 100644
--- a/dojox/cometd/_base.js
+++ b/dojox/cometd/_base.js
@@ -54,10 +54,10 @@ if(_4){
 dojo.mixin(_c,_4);
 }
 this._props=_3;
-for(var _f in this._subscriptions){
-for(var sub in this._subscriptions[_f]){
-if(this._subscriptions[_f][sub].topic){
-dojo.unsubscribe(this._subscriptions[_f][sub].topic);
+for(var _e in this._subscriptions){
+for(var _f in this._subscriptions[_e]){
+if(this._subscriptions[_e][_f].topic){
+dojo.unsubscribe(this._subscriptions[_e][_f].topic);
 }
 }
 }
@@ -76,81 +76,81 @@ r=dojo.xhrPost(_c);
 }
 return r;
 };
-this.publish=function(_12,_13,_14){
-var _15={data:_13,channel:_12};
-if(_14){
-dojo.mixin(_15,_14);
+this.publish=function(_10,_11,_12){
+var _13={data:_11,channel:_10};
+if(_12){
+dojo.mixin(_13,_12);
 }
-this._sendMessage(_15);
+this._sendMessage(_13);
 };
-this.subscribe=function(_16,_17,_18,_19){
-_19=_19||{};
-if(_17){
-var _1a=_1+_16;
-var _1b=this._subscriptions[_1a];
-if(!_1b||_1b.length==0){
-_1b=[];
-_19.channel="/meta/subscribe";
-_19.subscription=_16;
-this._sendMessage(_19);
-var _ds=this._deferredSubscribes;
-if(_ds[_16]){
-_ds[_16].cancel();
-delete _ds[_16];
-}
-_ds[_16]=new dojo.Deferred();
-}
-for(var i in _1b){
-if(_1b[i].objOrFunc===_17&&(!_1b[i].funcName&&!_18||_1b[i].funcName==_18)){
+this.subscribe=function(_14,_15,_16,_17){
+_17=_17||{};
+if(_15){
+var _18=_1+_14;
+var _19=this._subscriptions[_18];
+if(!_19||_19.length==0){
+_19=[];
+_17.channel="/meta/subscribe";
+_17.subscription=_14;
+this._sendMessage(_17);
+var _1a=this._deferredSubscribes;
+if(_1a[_14]){
+_1a[_14].cancel();
+delete _1a[_14];
+}
+_1a[_14]=new dojo.Deferred();
+}
+for(var i in _19){
+if(_19[i].objOrFunc===_15&&(!_19[i].funcName&&!_16||_19[i].funcName==_16)){
 return null;
 }
 }
-var _1e=dojo.subscribe(_1a,_17,_18);
-_1b.push({topic:_1e,objOrFunc:_17,funcName:_18});
-this._subscriptions[_1a]=_1b;
+var _1b=dojo.subscribe(_18,_15,_16);
+_19.push({topic:_1b,objOrFunc:_15,funcName:_16});
+this._subscriptions[_18]=_19;
 }
-var ret=this._deferredSubscribes[_16]||{};
+var ret=this._deferredSubscribes[_14]||{};
 ret.args=dojo._toArray(arguments);
 return ret;
 };
-this.unsubscribe=function(_20,_21,_22,_23){
-if((arguments.length==1)&&(!dojo.isString(_20))&&(_20.args)){
-return this.unsubscribe.apply(this,_20.args);
+this.unsubscribe=function(_1c,_1d,_1e,_1f){
+if((arguments.length==1)&&(!dojo.isString(_1c))&&(_1c.args)){
+return this.unsubscribe.apply(this,_1c.args);
 }
-var _24=_1+_20;
-var _25=this._subscriptions[_24];
-if(!_25||_25.length==0){
+var _20=_1+_1c;
+var _21=this._subscriptions[_20];
+if(!_21||_21.length==0){
 return null;
 }
 var s=0;
-for(var i in _25){
-var sb=_25[i];
-if((!_21)||(sb.objOrFunc===_21&&(!sb.funcName&&!_22||sb.funcName==_22))){
-dojo.unsubscribe(_25[i].topic);
-delete _25[i];
+for(var i in _21){
+var sb=_21[i];
+if((!_1d)||(sb.objOrFunc===_1d&&(!sb.funcName&&!_1e||sb.funcName==_1e))){
+dojo.unsubscribe(_21[i].topic);
+delete _21[i];
 }else{
 s++;
 }
 }
 if(s==0){
-_23=_23||{};
-_23.channel="/meta/unsubscribe";
-_23.subscription=_20;
-delete this._subscriptions[_24];
-this._sendMessage(_23);
-this._deferredUnsubscribes[_20]=new dojo.Deferred();
-if(this._deferredSubscribes[_20]){
-this._deferredSubscribes[_20].cancel();
-delete this._deferredSubscribes[_20];
-}
-}
-return this._deferredUnsubscribes[_20];
+_1f=_1f||{};
+_1f.channel="/meta/unsubscribe";
+_1f.subscription=_1c;
+delete this._subscriptions[_20];
+this._sendMessage(_1f);
+this._deferredUnsubscribes[_1c]=new dojo.Deferred();
+if(this._deferredSubscribes[_1c]){
+this._deferredSubscribes[_1c].cancel();
+delete this._deferredSubscribes[_1c];
+}
+}
+return this._deferredUnsubscribes[_1c];
 };
 this.disconnect=function(){
-for(var _29 in this._subscriptions){
-for(var sub in this._subscriptions[_29]){
-if(this._subscriptions[_29][sub].topic){
-dojo.unsubscribe(this._subscriptions[_29][sub].topic);
+for(var _22 in this._subscriptions){
+for(var sub in this._subscriptions[_22]){
+if(this._subscriptions[_22][sub].topic){
+dojo.unsubscribe(this._subscriptions[_22][sub].topic);
 }
 }
 }
@@ -168,11 +168,11 @@ this._handshook=false;
 this._status="disconnected";
 this._publishMeta("disconnect",true);
 };
-this.subscribed=function(_2b,_2c){
+this.subscribed=function(_23,_24){
 };
-this.unsubscribed=function(_2d,_2e){
+this.unsubscribed=function(_25,_26){
 };
-this.tunnelInit=function(_2f,_30){
+this.tunnelInit=function(_27,_28){
 };
 this.tunnelCollapse=function(){
 };
@@ -194,181 +194,177 @@ this._backoffInterval=0;
 this._interval=function(){
 var i=this._backoffInterval+(this._advice?(this._advice.interval?this._advice.interval:0):0);
 if(i>0){
-
 }
 return i;
 };
-this._publishMeta=function(_32,_33,_34){
+this._publishMeta=function(_29,_2a,_2b){
 try{
-var _35={cometd:this,action:_32,successful:_33,state:this.state()};
-if(_34){
-dojo.mixin(_35,_34);
+var _2c={cometd:this,action:_29,successful:_2a,state:this.state()};
+if(_2b){
+dojo.mixin(_2c,_2b);
 }
-dojo.publish(this.prefix+"/meta",[_35]);
+dojo.publish(this.prefix+"/meta",[_2c]);
 }
 catch(e){
-
 }
 };
-this._finishInit=function(_36){
+this._finishInit=function(_2d){
 if(this._status!="handshaking"){
 return;
 }
-var _37=this._handshook;
-var _38=false;
-var _39={};
-if(_36 instanceof Error){
-dojo.mixin(_39,{reestablish:false,failure:true,error:_36,advice:this._advice});
+var _2e=this._handshook;
+var _2f=false;
+var _30={};
+if(_2d instanceof Error){
+dojo.mixin(_30,{reestablish:false,failure:true,error:_2d,advice:this._advice});
 }else{
-_36=_36[0];
-_36=this._extendIn(_36);
-this.handshakeReturn=_36;
-if(_36["advice"]){
-this._advice=_36.advice;
-}
-_38=_36.successful?_36.successful:false;
-if(_36.version<this.minimumVersion){
+_2d=_2d[0];
+_2d=this._extendIn(_2d);
+this.handshakeReturn=_2d;
+if(_2d["advice"]){
+this._advice=_2d.advice;
+}
+_2f=_2d.successful?_2d.successful:false;
+if(_2d.version<this.minimumVersion){
 if(console.log){
-
 }
-_38=false;
+_2f=false;
 this._advice.reconnect="none";
 }
-dojo.mixin(_39,{reestablish:_38&&_37,response:_36});
+dojo.mixin(_30,{reestablish:_2f&&_2e,response:_2d});
 }
-this._publishMeta("handshake",_38,_39);
+this._publishMeta("handshake",_2f,_30);
 if(this._status!="handshaking"){
 return;
 }
-if(_38){
+if(_2f){
 this._status="connecting";
 this._handshook=true;
-this.currentTransport=dojox.cometd.connectionTypes.match(_36.supportedConnectionTypes,_36.version,this._isXD);
-var _3a=this.currentTransport;
-_3a._cometd=this;
-_3a.version=_36.version;
-this.clientId=_36.clientId;
-this.tunnelInit=_3a.tunnelInit&&dojo.hitch(_3a,"tunnelInit");
-this.tunnelCollapse=_3a.tunnelCollapse&&dojo.hitch(_3a,"tunnelCollapse");
-_3a.startup(_36);
+this.currentTransport=dojox.cometd.connectionTypes.match(_2d.supportedConnectionTypes,_2d.version,this._isXD);
+var _31=this.currentTransport;
+_31._cometd=this;
+_31.version=_2d.version;
+this.clientId=_2d.clientId;
+this.tunnelInit=_31.tunnelInit&&dojo.hitch(_31,"tunnelInit");
+this.tunnelCollapse=_31.tunnelCollapse&&dojo.hitch(_31,"tunnelCollapse");
+_31.startup(_2d);
 }else{
 if(!this._advice||this._advice["reconnect"]!="none"){
 setTimeout(dojo.hitch(this,"init",this.url,this._props),this._interval());
 }
 }
 };
-this._extendIn=function(_3b){
+this._extendIn=function(_32){
 dojo.forEach(dojox.cometd._extendInList,function(f){
-_3b=f(_3b)||_3b;
+_32=f(_32)||_32;
 });
-return _3b;
+return _32;
 };
-this._extendOut=function(_3d){
+this._extendOut=function(_33){
 dojo.forEach(dojox.cometd._extendOutList,function(f){
-_3d=f(_3d)||_3d;
+_33=f(_33)||_33;
 });
-return _3d;
+return _33;
 };
-this.deliver=function(_3f){
-dojo.forEach(_3f,this._deliver,this);
-return _3f;
+this.deliver=function(_34){
+dojo.forEach(_34,this._deliver,this);
+return _34;
 };
-this._deliver=function(_40){
-_40=this._extendIn(_40);
-if(!_40["channel"]){
-if(_40["success"]!==true){
+this._deliver=function(_35){
+_35=this._extendIn(_35);
+if(!_35["channel"]){
+if(_35["success"]!==true){
 return;
 }
 }
-this.lastMessage=_40;
-if(_40.advice){
-this._advice=_40.advice;
+this.lastMessage=_35;
+if(_35.advice){
+this._advice=_35.advice;
 }
-var _41=null;
-if((_40["channel"])&&(_40.channel.length>5)&&(_40.channel.substr(0,5)=="/meta")){
-switch(_40.channel){
+var _36=null;
+if((_35["channel"])&&(_35.channel.length>5)&&(_35.channel.substr(0,5)=="/meta")){
+switch(_35.channel){
 case "/meta/connect":
-var _42={response:_40};
-if(_40.successful){
+var _37={response:_35};
+if(_35.successful){
 if(this._status!="connected"){
 this._status="connected";
 this.endBatch();
 }
 }
 if(this._initialized){
-this._publishMeta("connect",_40.successful,_42);
+this._publishMeta("connect",_35.successful,_37);
 }
 break;
 case "/meta/subscribe":
-_41=this._deferredSubscribes[_40.subscription];
+_36=this._deferredSubscribes[_35.subscription];
 try{
-if(!_40.successful){
-if(_41){
-_41.errback(new Error(_40.error));
+if(!_35.successful){
+if(_36){
+_36.errback(new Error(_35.error));
 }
 this.currentTransport.cancelConnect();
 return;
 }
-if(_41){
-_41.callback(true);
+if(_36){
+_36.callback(true);
 }
-this.subscribed(_40.subscription,_40);
+this.subscribed(_35.subscription,_35);
 }
 catch(e){
 log.warn(e);
 }
 break;
 case "/meta/unsubscribe":
-_41=this._deferredUnsubscribes[_40.subscription];
+_36=this._deferredUnsubscribes[_35.subscription];
 try{
-if(!_40.successful){
-if(_41){
-_41.errback(new Error(_40.error));
+if(!_35.successful){
+if(_36){
+_36.errback(new Error(_35.error));
 }
 this.currentTransport.cancelConnect();
 return;
 }
-if(_41){
-_41.callback(true);
+if(_36){
+_36.callback(true);
 }
-this.unsubscribed(_40.subscription,_40);
+this.unsubscribed(_35.subscription,_35);
 }
 catch(e){
 log.warn(e);
 }
 break;
 default:
-if(_40.successful&&!_40.successful){
+if(_35.successful&&!_35.successful){
 this.currentTransport.cancelConnect();
 return;
 }
 }
 }
-this.currentTransport.deliver(_40);
-if(_40.data){
+this.currentTransport.deliver(_35);
+if(_35.data){
 try{
-var _43=[_40];
-var _44=_1+_40.channel;
-var _45=_40.channel.split("/");
-var _46=_1;
-for(var i=1;i<_45.length-1;i++){
-dojo.publish(_46+"/**",_43);
-_46+="/"+_45[i];
-}
-dojo.publish(_46+"/**",_43);
-dojo.publish(_46+"/*",_43);
-dojo.publish(_44,_43);
+var _38=[_35];
+var _39=_1+_35.channel;
+var _3a=_35.channel.split("/");
+var _3b=_1;
+for(var i=1;i<_3a.length-1;i++){
+dojo.publish(_3b+"/**",_38);
+_3b+="/"+_3a[i];
+}
+dojo.publish(_3b+"/**",_38);
+dojo.publish(_3b+"/*",_38);
+dojo.publish(_39,_38);
 }
 catch(e){
-
 }
 }
 };
-this._sendMessage=function(_48){
+this._sendMessage=function(_3c){
 if(this.currentTransport&&!this.batch){
-return this.currentTransport.sendMessages([_48]);
+return this.currentTransport.sendMessages([_3c]);
 }else{
-this._messageQ.push(_48);
+this._messageQ.push(_3c);
 return null;
 }
 };
@@ -378,10 +374,10 @@ this.batch++;
 this.endBatch=function(){
 if(--this.batch<=0&&this.currentTransport&&this._status=="connected"){
 this.batch=0;
-var _49=this._messageQ;
+var _3d=this._messageQ;
 this._messageQ=[];
-if(_49.length>0){
-this.currentTransport.sendMessages(_49);
+if(_3d.length>0){
+this.currentTransport.sendMessages(_3d);
 }
 }
 };
@@ -389,14 +385,14 @@ this._onUnload=function(){
 dojo.addOnUnload(dojox.cometd,"disconnect");
 };
 this._connectTimeout=function(){
-var _4a=0;
+var _3e=0;
 if(this._advice&&this._advice.timeout&&this.expectedNetworkDelay>0){
-_4a=this._advice.timeout+this.expectedNetworkDelay;
+_3e=this._advice.timeout+this.expectedNetworkDelay;
 }
-if(this.connectTimeout>0&&this.connectTimeout<_4a){
+if(this.connectTimeout>0&&this.connectTimeout<_3e){
 return this.connectTimeout;
 }
-return _4a;
+return _3e;
 };
 },connectionTypes:new dojo.AdapterRegistry(true)};
 dojox.cometd.Connection.call(dojox.cometd,"/cometd");
diff --git a/dojox/cometd/callbackPollTransport.js b/dojox/cometd/callbackPollTransport.js
index d36e455..86d816b 100644
--- a/dojox/cometd/callbackPollTransport.js
+++ b/dojox/cometd/callbackPollTransport.js
@@ -50,12 +50,12 @@ _b[i].clientId=this._cometd.clientId;
 _b[i].id=""+this._cometd.messageId++;
 _b[i]=this._cometd._extendOut(_b[i]);
 }
-var _d={url:this._cometd.url||dojo.config["cometdRoot"],load:dojo.hitch(this._cometd,"deliver"),callbackParamName:"jsonp",content:{message:dojo.toJson(_b)},error:dojo.hitch(this,function(_e){
+var _c={url:this._cometd.url||dojo.config["cometdRoot"],load:dojo.hitch(this._cometd,"deliver"),callbackParamName:"jsonp",content:{message:dojo.toJson(_b)},error:dojo.hitch(this,function(_d){
 this._cometd._publishMeta("publish",false,{messages:_b});
 }),timeout:this._cometd.expectedNetworkDelay};
-return dojo.io.script.get(_d);
+return dojo.io.script.get(_c);
 };
-this.startup=function(_f){
+this.startup=function(_e){
 if(this._cometd._connected){
 return;
 }
@@ -63,9 +63,9 @@ this.tunnelInit();
 };
 this.disconnect=dojox.cometd.longPollTransport.disconnect;
 this.disconnect=function(){
-var _10={channel:"/meta/disconnect",clientId:this._cometd.clientId,id:""+this._cometd.messageId++};
-_10=this._cometd._extendOut(_10);
-dojo.io.script.get({url:this._cometd.url||dojo.config["cometdRoot"],callbackParamName:"jsonp",content:{message:dojo.toJson([_10])}});
+var _f={channel:"/meta/disconnect",clientId:this._cometd.clientId,id:""+this._cometd.messageId++};
+_f=this._cometd._extendOut(_f);
+dojo.io.script.get({url:this._cometd.url||dojo.config["cometdRoot"],callbackParamName:"jsonp",content:{message:dojo.toJson([_f])}});
 };
 this.cancelConnect=function(){
 };
diff --git a/dojox/cometd/longPollTransportFormEncoded.js b/dojox/cometd/longPollTransportFormEncoded.js
index 1c60e89..077e450 100644
--- a/dojox/cometd/longPollTransportFormEncoded.js
+++ b/dojox/cometd/longPollTransportFormEncoded.js
@@ -90,16 +90,16 @@ return dojo.xhrPost({url:this._cometd.url||dojo.config["cometdRoot"],handleAs:th
 this._cometd._publishMeta("publish",false,{messages:_f});
 }),timeout:this._cometd.expectedNetworkDelay});
 };
-this.startup=function(_12){
+this.startup=function(_10){
 if(this._cometd._status=="connected"){
 return;
 }
 this.tunnelInit();
 };
 this.disconnect=function(){
-var _13={channel:"/meta/disconnect",clientId:this._cometd.clientId,id:""+this._cometd.messageId++};
-_13=this._cometd._extendOut(_13);
-dojo.xhrPost({url:this._cometd.url||dojo.config["cometdRoot"],handleAs:this._cometd.handleAs,content:{message:dojo.toJson([_13])}});
+var _11={channel:"/meta/disconnect",clientId:this._cometd.clientId,id:""+this._cometd.messageId++};
+_11=this._cometd._extendOut(_11);
+dojo.xhrPost({url:this._cometd.url||dojo.config["cometdRoot"],handleAs:this._cometd.handleAs,content:{message:dojo.toJson([_11])}});
 };
 this.cancelConnect=function(){
 if(this._poll){
diff --git a/dojox/cometd/longPollTransportJsonEncoded.js b/dojox/cometd/longPollTransportJsonEncoded.js
index 8d0a07a..75d1888 100644
--- a/dojox/cometd/longPollTransportJsonEncoded.js
+++ b/dojox/cometd/longPollTransportJsonEncoded.js
@@ -87,20 +87,20 @@ _e[i].clientId=this._cometd.clientId;
 _e[i].id=""+this._cometd.messageId++;
 _e[i]=this._cometd._extendOut(_e[i]);
 }
-return dojo.rawXhrPost({url:this._cometd.url||dojo.config["cometdRoot"],handleAs:this._cometd.handleAs,load:dojo.hitch(this._cometd,"deliver"),postData:dojo.toJson(_e),contentType:"text/json;charset=UTF-8",error:dojo.hitch(this,function(err){
+return dojo.rawXhrPost({url:this._cometd.url||dojo.config["cometdRoot"],handleAs:this._cometd.handleAs,load:dojo.hitch(this._cometd,"deliver"),postData:dojo.toJson(_e),contentType:"text/json;charset=UTF-8",error:dojo.hitch(this,function(_f){
 this._cometd._publishMeta("publish",false,{messages:_e});
 }),timeout:this._cometd.expectedNetworkDelay});
 };
-this.startup=function(_11){
+this.startup=function(_10){
 if(this._cometd._status=="connected"){
 return;
 }
 this.tunnelInit();
 };
 this.disconnect=function(){
-var _12={channel:"/meta/disconnect",clientId:this._cometd.clientId,id:""+this._cometd.messageId++};
-_12=this._cometd._extendOut(_12);
-dojo.rawXhrPost({url:this._cometd.url||dojo.config["cometdRoot"],handleAs:this._cometd.handleAs,postData:dojo.toJson([_12]),contentType:"text/json;charset=UTF-8"});
+var _11={channel:"/meta/disconnect",clientId:this._cometd.clientId,id:""+this._cometd.messageId++};
+_11=this._cometd._extendOut(_11);
+dojo.rawXhrPost({url:this._cometd.url||dojo.config["cometdRoot"],handleAs:this._cometd.handleAs,postData:dojo.toJson([_11]),contentType:"text/json;charset=UTF-8"});
 };
 this.cancelConnect=function(){
 if(this._poll){
diff --git a/dojox/cometd/timesync.js b/dojox/cometd/timesync.js
index 7df1eb5..9e75172 100644
--- a/dojox/cometd/timesync.js
+++ b/dojox/cometd/timesync.js
@@ -25,20 +25,20 @@ return new Date(this.getServerTime());
 this.setTimeout=function(_1,_2){
 var ts=(_2 instanceof Date)?_2.getTime():(0+_2);
 var tc=ts-this.offset;
-var _5=tc-new Date().getTime();
-if(_5<=0){
-_5=1;
+var _3=tc-new Date().getTime();
+if(_3<=0){
+_3=1;
 }
-return setTimeout(_1,_5);
+return setTimeout(_1,_3);
 };
-this._in=function(_6){
-var _7=_6.channel;
-if(_7&&_7.indexOf("/meta/")==0){
-if(_6.ext&&_6.ext.timesync){
-var _8=_6.ext.timesync;
-var _9=new Date().getTime();
-var l=(_9-_8.tc-_8.p)/2-_8.a;
-var o=_8.ts-_8.tc-l;
+this._in=function(_4){
+var _5=_4.channel;
+if(_5&&_5.indexOf("/meta/")==0){
+if(_4.ext&&_4.ext.timesync){
+var _6=_4.ext.timesync;
+var _7=new Date().getTime();
+var l=(_7-_6.tc-_6.p)/2-_6.a;
+var o=_6.ts-_6.tc-l;
 this._lags.push(l);
 this._offsets.push(o);
 if(this._offsets.length>this._window){
@@ -56,18 +56,18 @@ this.offset=parseInt((o/this._offsets.length).toFixed());
 this.lag=parseInt((l/this._lags.length).toFixed());
 }
 }
-return _6;
+return _4;
 };
-this._out=function(_d){
-var _e=_d.channel;
-if(_e&&_e.indexOf("/meta/")==0){
-var _f=new Date().getTime();
-if(!_d.ext){
-_d.ext={};
+this._out=function(_8){
+var _9=_8.channel;
+if(_9&&_9.indexOf("/meta/")==0){
+var _a=new Date().getTime();
+if(!_8.ext){
+_8.ext={};
 }
-_d.ext.timesync={tc:_f,l:this.lag,o:this.offset};
+_8.ext.timesync={tc:_a,l:this.lag,o:this.offset};
 }
-return _d;
+return _8;
 };
 };
 dojox.cometd._extendInList.push(dojo.hitch(dojox.cometd.timesync,"_in"));
diff --git a/dojox/data/AndOrReadStore.js b/dojox/data/AndOrReadStore.js
index b8a154b..0b357db 100644
--- a/dojox/data/AndOrReadStore.js
+++ b/dojox/data/AndOrReadStore.js
@@ -16,7 +16,10 @@ this._arrayOfAllItems=[];
 this._arrayOfTopLevelItems=[];
 this._loadFinished=false;
 this._jsonFileUrl=_1.url;
+this._ccUrl=_1.url;
+this.url=_1.url;
 this._jsonData=_1.data;
+this.data=null;
 this._datatypeMap=_1.typeMap||{};
 if(!this._datatypeMap["Date"]){
 this._datatypeMap["Date"]={type:Date,deserialize:function(_2){
@@ -34,10 +37,13 @@ this._queuedFetches=[];
 if(_1.urlPreventCache!==undefined){
 this.urlPreventCache=_1.urlPreventCache?true:false;
 }
+if(_1.hierarchical!==undefined){
+this.hierarchical=_1.hierarchical?true:false;
+}
 if(_1.clearOnClose){
 this.clearOnClose=true;
 }
-},url:"",data:null,typeMap:null,clearOnClose:false,urlPreventCache:false,_assertIsItem:function(_3){
+},url:"",_ccUrl:"",data:null,typeMap:null,clearOnClose:false,urlPreventCache:false,hierarchical:true,_assertIsItem:function(_3){
 if(!this.isItem(_3)){
 throw new Error("dojox.data.AndOrReadStore: Invalid item argument.");
 }
@@ -62,7 +68,9 @@ _c.push(_d);
 }
 return _c;
 },hasAttribute:function(_e,_f){
-return this.getValues(_e,_f).length>0;
+this._assertIsItem(_e);
+this._assertIsAttribute(_f);
+return (_f in _e);
 },containsValue:function(_10,_11,_12){
 var _13=undefined;
 if(typeof _12==="string"){
@@ -118,139 +126,142 @@ _27++;
 }
 if(_27>1&&_26.complexQuery){
 var cq=_26.complexQuery;
-var _2a=false;
+var _28=false;
 for(p in _26){
 if(p!=="complexQuery"){
-if(!_2a){
+if(!_28){
 cq="( "+cq+" )";
-_2a=true;
+_28=true;
+}
+var v=_23.query[p];
+if(dojo.isString(v)){
+v="'"+v+"'";
 }
-cq+=" AND "+p+":"+_23.query[p];
+cq+=" AND "+p+":"+v;
 delete _26[p];
 }
 }
 _26.complexQuery=cq;
 }
 }
-var _2b=_23.queryOptions?_23.queryOptions.ignoreCase:false;
+var _29=_23.queryOptions?_23.queryOptions.ignoreCase:false;
 if(typeof _26!="string"){
 _26=dojo.toJson(_26);
 _26=_26.replace(/\\\\/g,"\\");
 }
 _26=_26.replace(/\\"/g,"\"");
-var _2c=dojo.trim(_26.replace(/{|}/g,""));
-var _2d,i;
-if(_2c.match(/"? *complexQuery *"?:/)){
-_2c=dojo.trim(_2c.replace(/"?\s*complexQuery\s*"?:/,""));
-var _2f=["'","\""];
-var _30,_31;
-var _32=false;
-for(i=0;i<_2f.length;i++){
-_30=_2c.indexOf(_2f[i]);
-_2d=_2c.indexOf(_2f[i],1);
-_31=_2c.indexOf(":",1);
-if(_30===0&&_2d!=-1&&_31<_2d){
-_32=true;
+var _2a=dojo.trim(_26.replace(/{|}/g,""));
+var _2b,i;
+if(_2a.match(/"? *complexQuery *"?:/)){
+_2a=dojo.trim(_2a.replace(/"?\s*complexQuery\s*"?:/,""));
+var _2c=["'","\""];
+var _2d,_2e;
+var _2f=false;
+for(i=0;i<_2c.length;i++){
+_2d=_2a.indexOf(_2c[i]);
+_2b=_2a.indexOf(_2c[i],1);
+_2e=_2a.indexOf(":",1);
+if(_2d===0&&_2b!=-1&&_2e<_2b){
+_2f=true;
 break;
 }
 }
-if(_32){
-_2c=_2c.replace(/^\"|^\'|\"$|\'$/g,"");
+if(_2f){
+_2a=_2a.replace(/^\"|^\'|\"$|\'$/g,"");
 }
 }
-var _33=_2c;
-var _34=/^,|^NOT |^AND |^OR |^\(|^\)|^!|^&&|^\|\|/i;
-var _35="";
+var _30=_2a;
+var _31=/^,|^NOT |^AND |^OR |^\(|^\)|^!|^&&|^\|\|/i;
+var _32="";
 var op="";
 var val="";
 var pos=-1;
 var err=false;
 var key="";
-var _3b="";
+var _33="";
 var tok="";
-_2d=-1;
+_2b=-1;
 for(i=0;i<_24.length;++i){
-var _3d=true;
-var _3e=_24[i];
-if(_3e===null){
-_3d=false;
-}else{
-_2c=_33;
-_35="";
-while(_2c.length>0&&!err){
-op=_2c.match(_34);
+var _34=true;
+var _35=_24[i];
+if(_35===null){
+_34=false;
+}else{
+_2a=_30;
+_32="";
+while(_2a.length>0&&!err){
+op=_2a.match(_31);
 while(op&&!err){
-_2c=dojo.trim(_2c.replace(op[0],""));
+_2a=dojo.trim(_2a.replace(op[0],""));
 op=dojo.trim(op[0]).toUpperCase();
 op=op=="NOT"?"!":op=="AND"||op==","?"&&":op=="OR"?"||":op;
 op=" "+op+" ";
-_35+=op;
-op=_2c.match(_34);
+_32+=op;
+op=_2a.match(_31);
 }
-if(_2c.length>0){
-pos=_2c.indexOf(":");
+if(_2a.length>0){
+pos=_2a.indexOf(":");
 if(pos==-1){
 err=true;
 break;
 }else{
-key=dojo.trim(_2c.substring(0,pos).replace(/\"|\'/g,""));
-_2c=dojo.trim(_2c.substring(pos+1));
-tok=_2c.match(/^\'|^\"/);
+key=dojo.trim(_2a.substring(0,pos).replace(/\"|\'/g,""));
+_2a=dojo.trim(_2a.substring(pos+1));
+tok=_2a.match(/^\'|^\"/);
 if(tok){
 tok=tok[0];
-pos=_2c.indexOf(tok);
-_2d=_2c.indexOf(tok,pos+1);
-if(_2d==-1){
+pos=_2a.indexOf(tok);
+_2b=_2a.indexOf(tok,pos+1);
+if(_2b==-1){
 err=true;
 break;
 }
-_3b=_2c.substring(pos+1,_2d);
-if(_2d==_2c.length-1){
-_2c="";
+_33=_2a.substring(pos+1,_2b);
+if(_2b==_2a.length-1){
+_2a="";
 }else{
-_2c=dojo.trim(_2c.substring(_2d+1));
+_2a=dojo.trim(_2a.substring(_2b+1));
 }
-_35+=_21._containsValue(_3e,key,_3b,dojo.data.util.filter.patternToRegExp(_3b,_2b));
+_32+=_21._containsValue(_35,key,_33,dojo.data.util.filter.patternToRegExp(_33,_29));
 }else{
-tok=_2c.match(/\s|\)|,/);
+tok=_2a.match(/\s|\)|,/);
 if(tok){
-var _3f=new Array(tok.length);
+var _36=new Array(tok.length);
 for(var j=0;j<tok.length;j++){
-_3f[j]=_2c.indexOf(tok[j]);
+_36[j]=_2a.indexOf(tok[j]);
 }
-pos=_3f[0];
-if(_3f.length>1){
-for(var j=1;j<_3f.length;j++){
-pos=Math.min(pos,_3f[j]);
+pos=_36[0];
+if(_36.length>1){
+for(var j=1;j<_36.length;j++){
+pos=Math.min(pos,_36[j]);
 }
 }
-_3b=dojo.trim(_2c.substring(0,pos));
-_2c=dojo.trim(_2c.substring(pos));
+_33=dojo.trim(_2a.substring(0,pos));
+_2a=dojo.trim(_2a.substring(pos));
 }else{
-_3b=dojo.trim(_2c);
-_2c="";
+_33=dojo.trim(_2a);
+_2a="";
 }
-_35+=_21._containsValue(_3e,key,_3b,dojo.data.util.filter.patternToRegExp(_3b,_2b));
+_32+=_21._containsValue(_35,key,_33,dojo.data.util.filter.patternToRegExp(_33,_29));
 }
 }
 }
 }
-_3d=eval(_35);
+_34=eval(_32);
 }
-if(_3d){
-_25.push(_3e);
+if(_34){
+_25.push(_35);
 }
 }
 if(err){
 _25=[];
-
 }
 _1f(_25,_23);
 }else{
 for(var i=0;i<_24.length;++i){
-var _41=_24[i];
-if(_41!==null){
-_25.push(_41);
+var _37=_24[i];
+if(_37!==null){
+_25.push(_37);
 }
 }
 _1f(_25,_23);
@@ -259,16 +270,30 @@ _1f(_25,_23);
 if(this._loadFinished){
 _22(_1e,this._getItemsArray(_1e.queryOptions));
 }else{
+if(this._jsonFileUrl!==this._ccUrl){
+dojo.deprecated("dojox.data.AndOrReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl.  _jsonFileUrl support will be removed in 2.0");
+this._ccUrl=this._jsonFileUrl;
+this.url=this._jsonFileUrl;
+}else{
+if(this.url!==this._ccUrl){
+this._jsonFileUrl=this.url;
+this._ccUrl=this.url;
+}
+}
+if(this.data!=null&&this._jsonData==null){
+this._jsonData=this.data;
+this.data=null;
+}
 if(this._jsonFileUrl){
 if(this._loadInProgress){
 this._queuedFetches.push({args:_1e,filter:_22});
 }else{
 this._loadInProgress=true;
-var _42={url:_21._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache};
-var _43=dojo.xhrGet(_42);
-_43.addCallback(function(_44){
+var _38={url:_21._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache};
+var _39=dojo.xhrGet(_38);
+_39.addCallback(function(_3a){
 try{
-_21._getItemsFromLoadedData(_44);
+_21._getItemsFromLoadedData(_3a);
 _21._loadFinished=true;
 _21._loadInProgress=false;
 _22(_1e,_21._getItemsArray(_1e.queryOptions));
@@ -280,22 +305,22 @@ _21._loadInProgress=false;
 _20(e,_1e);
 }
 });
-_43.addErrback(function(_45){
+_39.addErrback(function(_3b){
 _21._loadInProgress=false;
-_20(_45,_1e);
+_20(_3b,_1e);
 });
-var _46=null;
+var _3c=null;
 if(_1e.abort){
-_46=_1e.abort;
+_3c=_1e.abort;
 }
 _1e.abort=function(){
-var df=_43;
+var df=_39;
 if(df&&df.fired===-1){
 df.cancel();
 df=null;
 }
-if(_46){
-_46.call(_1e);
+if(_3c){
+_3c.call(_1e);
 }
 };
 }
@@ -318,24 +343,26 @@ _20(new Error("dojox.data.AndOrReadStore: No JSON source data was provided as ei
 },_handleQueuedFetches:function(){
 if(this._queuedFetches.length>0){
 for(var i=0;i<this._queuedFetches.length;i++){
-var _49=this._queuedFetches[i];
-var _4a=_49.args;
-var _4b=_49.filter;
-if(_4b){
-_4b(_4a,this._getItemsArray(_4a.queryOptions));
+var _3d=this._queuedFetches[i];
+var _3e=_3d.args;
+var _3f=_3d.filter;
+if(_3f){
+_3f(_3e,this._getItemsArray(_3e.queryOptions));
 }else{
-this.fetchItemByIdentity(_4a);
+this.fetchItemByIdentity(_3e);
 }
 }
 this._queuedFetches=[];
 }
-},_getItemsArray:function(_4c){
-if(_4c&&_4c.deep){
+},_getItemsArray:function(_40){
+if(_40&&_40.deep){
 return this._arrayOfAllItems;
 }
 return this._arrayOfTopLevelItems;
-},close:function(_4d){
-if(this.clearOnClose&&(this._jsonFileUrl!=="")){
+},close:function(_41){
+if(this.clearOnClose&&this._loadFinished&&!this._loadInProgress){
+if(((this._jsonFileUrl==""||this._jsonFileUrl==null)&&(this.url==""||this.url==null))&&this.data==null){
+}
 this._arrayOfAllItems=[];
 this._arrayOfTopLevelItems=[];
 this._loadFinished=false;
@@ -343,87 +370,87 @@ this._itemsByIdentity=null;
 this._loadInProgress=false;
 this._queuedFetches=[];
 }
-},_getItemsFromLoadedData:function(_4e){
-function _4f(_50){
-var _51=((_50!==null)&&(typeof _50==="object")&&(!dojo.isArray(_50))&&(!dojo.isFunction(_50))&&(_50.constructor==Object)&&(typeof _50._reference==="undefined")&&(typeof _50._type==="undefined")&&(typeof _50._value==="undefined"));
-return _51;
+},_getItemsFromLoadedData:function(_42){
+var _43=this;
+function _44(_45){
+var _46=((_45!==null)&&(typeof _45==="object")&&(!dojo.isArray(_45))&&(!dojo.isFunction(_45))&&(_45.constructor==Object)&&(typeof _45._reference==="undefined")&&(typeof _45._type==="undefined")&&(typeof _45._value==="undefined")&&_43.hierarchical);
+return _46;
 };
-var _52=this;
-function _53(_54){
-_52._arrayOfAllItems.push(_54);
-for(var _55 in _54){
-var _56=_54[_55];
-if(_56){
-if(dojo.isArray(_56)){
-var _57=_56;
-for(var k=0;k<_57.length;++k){
-var _59=_57[k];
-if(_4f(_59)){
-_53(_59);
+function _47(_48){
+_43._arrayOfAllItems.push(_48);
+for(var _49 in _48){
+var _4a=_48[_49];
+if(_4a){
+if(dojo.isArray(_4a)){
+var _4b=_4a;
+for(var k=0;k<_4b.length;++k){
+var _4c=_4b[k];
+if(_44(_4c)){
+_47(_4c);
 }
 }
 }else{
-if(_4f(_56)){
-_53(_56);
+if(_44(_4a)){
+_47(_4a);
 }
 }
 }
 }
 };
-this._labelAttr=_4e.label;
+this._labelAttr=_42.label;
 var i;
-var _5b;
+var _4d;
 this._arrayOfAllItems=[];
-this._arrayOfTopLevelItems=_4e.items;
+this._arrayOfTopLevelItems=_42.items;
 for(i=0;i<this._arrayOfTopLevelItems.length;++i){
-_5b=this._arrayOfTopLevelItems[i];
-_53(_5b);
-_5b[this._rootItemPropName]=true;
+_4d=this._arrayOfTopLevelItems[i];
+_47(_4d);
+_4d[this._rootItemPropName]=true;
 }
-var _5c={};
+var _4e={};
 var key;
 for(i=0;i<this._arrayOfAllItems.length;++i){
-_5b=this._arrayOfAllItems[i];
-for(key in _5b){
+_4d=this._arrayOfAllItems[i];
+for(key in _4d){
 if(key!==this._rootItemPropName){
-var _5e=_5b[key];
-if(_5e!==null){
-if(!dojo.isArray(_5e)){
-_5b[key]=[_5e];
+var _4f=_4d[key];
+if(_4f!==null){
+if(!dojo.isArray(_4f)){
+_4d[key]=[_4f];
 }
 }else{
-_5b[key]=[null];
+_4d[key]=[null];
 }
 }
-_5c[key]=key;
+_4e[key]=key;
 }
 }
-while(_5c[this._storeRefPropName]){
+while(_4e[this._storeRefPropName]){
 this._storeRefPropName+="_";
 }
-while(_5c[this._itemNumPropName]){
+while(_4e[this._itemNumPropName]){
 this._itemNumPropName+="_";
 }
-while(_5c[this._reverseRefMap]){
+while(_4e[this._reverseRefMap]){
 this._reverseRefMap+="_";
 }
-var _5f;
-var _60=_4e.identifier;
-if(_60){
+var _50;
+var _51=_42.identifier;
+if(_51){
 this._itemsByIdentity={};
-this._features["dojo.data.api.Identity"]=_60;
+this._features["dojo.data.api.Identity"]=_51;
 for(i=0;i<this._arrayOfAllItems.length;++i){
-_5b=this._arrayOfAllItems[i];
-_5f=_5b[_60];
-var _61=_5f[0];
-if(!this._itemsByIdentity[_61]){
-this._itemsByIdentity[_61]=_5b;
+_4d=this._arrayOfAllItems[i];
+_50=_4d[_51];
+var _52=_50[0];
+if(!this._itemsByIdentity[_52]){
+this._itemsByIdentity[_52]=_4d;
 }else{
 if(this._jsonFileUrl){
-throw new Error("dojox.data.AndOrReadStore:  The json data as specified by: ["+this._jsonFileUrl+"] is malformed.  Items within the list have identifier: ["+_60+"].  Value collided: ["+_61+"]");
+throw new Error("dojox.data.AndOrReadStore:  The json data as specified by: ["+this._jsonFileUrl+"] is malformed.  Items within the list have identifier: ["+_51+"].  Value collided: ["+_52+"]");
 }else{
 if(this._jsonData){
-throw new Error("dojox.data.AndOrReadStore:  The json data provided by the creation arguments is malformed.  Items within the list have identifier: ["+_60+"].  Value collided: ["+_61+"]");
+throw new Error("dojox.data.AndOrReadStore:  The json data provided by the creation arguments is malformed.  Items within the list have identifier: ["+_51+"].  Value collided: ["+_52+"]");
 }
 }
 }
@@ -432,62 +459,62 @@ throw new Error("dojox.data.AndOrReadStore:  The json data provided by the creat
 this._features["dojo.data.api.Identity"]=Number;
 }
 for(i=0;i<this._arrayOfAllItems.length;++i){
-_5b=this._arrayOfAllItems[i];
-_5b[this._storeRefPropName]=this;
-_5b[this._itemNumPropName]=i;
+_4d=this._arrayOfAllItems[i];
+_4d[this._storeRefPropName]=this;
+_4d[this._itemNumPropName]=i;
 }
 for(i=0;i<this._arrayOfAllItems.length;++i){
-_5b=this._arrayOfAllItems[i];
-for(key in _5b){
-_5f=_5b[key];
-for(var j=0;j<_5f.length;++j){
-_5e=_5f[j];
-if(_5e!==null&&typeof _5e=="object"){
-if(_5e._type&&_5e._value){
-var _63=_5e._type;
-var _64=this._datatypeMap[_63];
-if(!_64){
-throw new Error("dojox.data.AndOrReadStore: in the typeMap constructor arg, no object class was specified for the datatype '"+_63+"'");
-}else{
-if(dojo.isFunction(_64)){
-_5f[j]=new _64(_5e._value);
-}else{
-if(dojo.isFunction(_64.deserialize)){
-_5f[j]=_64.deserialize(_5e._value);
+_4d=this._arrayOfAllItems[i];
+for(key in _4d){
+_50=_4d[key];
+for(var j=0;j<_50.length;++j){
+_4f=_50[j];
+if(_4f!==null&&typeof _4f=="object"){
+if(("_type" in _4f)&&("_value" in _4f)){
+var _53=_4f._type;
+var _54=this._datatypeMap[_53];
+if(!_54){
+throw new Error("dojox.data.AndOrReadStore: in the typeMap constructor arg, no object class was specified for the datatype '"+_53+"'");
+}else{
+if(dojo.isFunction(_54)){
+_50[j]=new _54(_4f._value);
+}else{
+if(dojo.isFunction(_54.deserialize)){
+_50[j]=_54.deserialize(_4f._value);
 }else{
 throw new Error("dojox.data.AndOrReadStore: Value provided in typeMap was neither a constructor, nor a an object with a deserialize function");
 }
 }
 }
 }
-if(_5e._reference){
-var _65=_5e._reference;
-if(!dojo.isObject(_65)){
-_5f[j]=this._itemsByIdentity[_65];
+if(_4f._reference){
+var _55=_4f._reference;
+if(!dojo.isObject(_55)){
+_50[j]=this._itemsByIdentity[_55];
 }else{
 for(var k=0;k<this._arrayOfAllItems.length;++k){
-var _67=this._arrayOfAllItems[k];
-var _68=true;
-for(var _69 in _65){
-if(_67[_69]!=_65[_69]){
-_68=false;
+var _56=this._arrayOfAllItems[k];
+var _57=true;
+for(var _58 in _55){
+if(_56[_58]!=_55[_58]){
+_57=false;
 }
 }
-if(_68){
-_5f[j]=_67;
+if(_57){
+_50[j]=_56;
 }
 }
 }
 if(this.referenceIntegrity){
-var _6a=_5f[j];
-if(this.isItem(_6a)){
-this._addReferenceToMap(_6a,_5b,key);
+var _59=_50[j];
+if(this.isItem(_59)){
+this._addReferenceToMap(_59,_4d,key);
 }
 }
 }else{
-if(this.isItem(_5e)){
+if(this.isItem(_4f)){
 if(this.referenceIntegrity){
-this._addReferenceToMap(_5e,_5b,key);
+this._addReferenceToMap(_4f,_4d,key);
 }
 }
 }
@@ -495,121 +522,148 @@ this._addReferenceToMap(_5e,_5b,key);
 }
 }
 }
-},_addReferenceToMap:function(_6b,_6c,_6d){
-},getIdentity:function(_6e){
-var _6f=this._features["dojo.data.api.Identity"];
-if(_6f===Number){
-return _6e[this._itemNumPropName];
+},_addReferenceToMap:function(_5a,_5b,_5c){
+},getIdentity:function(_5d){
+var _5e=this._features["dojo.data.api.Identity"];
+if(_5e===Number){
+return _5d[this._itemNumPropName];
 }else{
-var _70=_6e[_6f];
-if(_70){
-return _70[0];
+var _5f=_5d[_5e];
+if(_5f){
+return _5f[0];
 }
 }
 return null;
-},fetchItemByIdentity:function(_71){
+},fetchItemByIdentity:function(_60){
 if(!this._loadFinished){
-var _72=this;
+var _61=this;
+if(this._jsonFileUrl!==this._ccUrl){
+dojo.deprecated("dojox.data.AndOrReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl.  _jsonFileUrl support will be removed in 2.0");
+this._ccUrl=this._jsonFileUrl;
+this.url=this._jsonFileUrl;
+}else{
+if(this.url!==this._ccUrl){
+this._jsonFileUrl=this.url;
+this._ccUrl=this.url;
+}
+}
+if(this.data!=null&&this._jsonData==null){
+this._jsonData=this.data;
+this.data=null;
+}
 if(this._jsonFileUrl){
 if(this._loadInProgress){
-this._queuedFetches.push({args:_71});
+this._queuedFetches.push({args:_60});
 }else{
 this._loadInProgress=true;
-var _73={url:_72._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache};
-var _74=dojo.xhrGet(_73);
-_74.addCallback(function(_75){
-var _76=_71.scope?_71.scope:dojo.global;
+var _62={url:_61._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache};
+var _63=dojo.xhrGet(_62);
+_63.addCallback(function(_64){
+var _65=_60.scope?_60.scope:dojo.global;
 try{
-_72._getItemsFromLoadedData(_75);
-_72._loadFinished=true;
-_72._loadInProgress=false;
-var _77=_72._getItemByIdentity(_71.identity);
-if(_71.onItem){
-_71.onItem.call(_76,_77);
+_61._getItemsFromLoadedData(_64);
+_61._loadFinished=true;
+_61._loadInProgress=false;
+var _66=_61._getItemByIdentity(_60.identity);
+if(_60.onItem){
+_60.onItem.call(_65,_66);
 }
-_72._handleQueuedFetches();
+_61._handleQueuedFetches();
 }
 catch(error){
-_72._loadInProgress=false;
-if(_71.onError){
-_71.onError.call(_76,error);
+_61._loadInProgress=false;
+if(_60.onError){
+_60.onError.call(_65,error);
 }
 }
 });
-_74.addErrback(function(_78){
-_72._loadInProgress=false;
-if(_71.onError){
-var _79=_71.scope?_71.scope:dojo.global;
-_71.onError.call(_79,_78);
+_63.addErrback(function(_67){
+_61._loadInProgress=false;
+if(_60.onError){
+var _68=_60.scope?_60.scope:dojo.global;
+_60.onError.call(_68,_67);
 }
 });
 }
 }else{
 if(this._jsonData){
-_72._getItemsFromLoadedData(_72._jsonData);
-_72._jsonData=null;
-_72._loadFinished=true;
-var _7a=_72._getItemByIdentity(_71.identity);
-if(_71.onItem){
-var _7b=_71.scope?_71.scope:dojo.global;
-_71.onItem.call(_7b,_7a);
+_61._getItemsFromLoadedData(_61._jsonData);
+_61._jsonData=null;
+_61._loadFinished=true;
+var _69=_61._getItemByIdentity(_60.identity);
+if(_60.onItem){
+var _6a=_60.scope?_60.scope:dojo.global;
+_60.onItem.call(_6a,_69);
 }
 }
 }
 }else{
-var _7a=this._getItemByIdentity(_71.identity);
-if(_71.onItem){
-var _7b=_71.scope?_71.scope:dojo.global;
-_71.onItem.call(_7b,_7a);
+var _69=this._getItemByIdentity(_60.identity);
+if(_60.onItem){
+var _6a=_60.scope?_60.scope:dojo.global;
+_60.onItem.call(_6a,_69);
 }
 }
-},_getItemByIdentity:function(_7c){
-var _7d=null;
+},_getItemByIdentity:function(_6b){
+var _6c=null;
 if(this._itemsByIdentity){
-_7d=this._itemsByIdentity[_7c];
+_6c=this._itemsByIdentity[_6b];
 }else{
-_7d=this._arrayOfAllItems[_7c];
+_6c=this._arrayOfAllItems[_6b];
 }
-if(_7d===undefined){
-_7d=null;
+if(_6c===undefined){
+_6c=null;
 }
-return _7d;
-},getIdentityAttributes:function(_7e){
-var _7f=this._features["dojo.data.api.Identity"];
-if(_7f===Number){
+return _6c;
+},getIdentityAttributes:function(_6d){
+var _6e=this._features["dojo.data.api.Identity"];
+if(_6e===Number){
 return null;
 }else{
-return [_7f];
+return [_6e];
 }
 },_forceLoad:function(){
-var _80=this;
+var _6f=this;
+if(this._jsonFileUrl!==this._ccUrl){
+dojo.deprecated("dojox.data.AndOrReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl.  _jsonFileUrl support will be removed in 2.0");
+this._ccUrl=this._jsonFileUrl;
+this.url=this._jsonFileUrl;
+}else{
+if(this.url!==this._ccUrl){
+this._jsonFileUrl=this.url;
+this._ccUrl=this.url;
+}
+}
+if(this.data!=null&&this._jsonData==null){
+this._jsonData=this.data;
+this.data=null;
+}
 if(this._jsonFileUrl){
-var _81={url:_80._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,sync:true};
-var _82=dojo.xhrGet(_81);
-_82.addCallback(function(_83){
+var _70={url:_6f._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,sync:true};
+var _71=dojo.xhrGet(_70);
+_71.addCallback(function(_72){
 try{
-if(_80._loadInProgress!==true&&!_80._loadFinished){
-_80._getItemsFromLoadedData(_83);
-_80._loadFinished=true;
+if(_6f._loadInProgress!==true&&!_6f._loadFinished){
+_6f._getItemsFromLoadedData(_72);
+_6f._loadFinished=true;
 }else{
-if(_80._loadInProgress){
+if(_6f._loadInProgress){
 throw new Error("dojox.data.AndOrReadStore:  Unable to perform a synchronous load, an async load is in progress.");
 }
 }
 }
 catch(e){
-
 throw e;
 }
 });
-_82.addErrback(function(_84){
-throw _84;
+_71.addErrback(function(_73){
+throw _73;
 });
 }else{
 if(this._jsonData){
-_80._getItemsFromLoadedData(_80._jsonData);
-_80._jsonData=null;
-_80._loadFinished=true;
+_6f._getItemsFromLoadedData(_6f._jsonData);
+_6f._jsonData=null;
+_6f._loadFinished=true;
 }
 }
 }});
diff --git a/dojox/data/AndOrWriteStore.js b/dojox/data/AndOrWriteStore.js
index 0f5c046..3115746 100644
--- a/dojox/data/AndOrWriteStore.js
+++ b/dojox/data/AndOrWriteStore.js
@@ -97,430 +97,415 @@ _e=[_e];
 _9[_d]=_e;
 if(this.referenceIntegrity){
 for(var i=0;i<_e.length;i++){
-var val=_e[i];
-if(this.isItem(val)){
-this._addReferenceToMap(val,_9,_d);
+var _f=_e[i];
+if(this.isItem(_f)){
+this._addReferenceToMap(_f,_9,_d);
 }
 }
 }
 }
 this.onNew(_9,_a);
 return _9;
-},_removeArrayElement:function(_11,_12){
-var _13=dojo.indexOf(_11,_12);
-if(_13!=-1){
-_11.splice(_13,1);
+},_removeArrayElement:function(_10,_11){
+var _12=dojo.indexOf(_10,_11);
+if(_12!=-1){
+_10.splice(_12,1);
 return true;
 }
 return false;
-},deleteItem:function(_14){
+},deleteItem:function(_13){
 this._assert(!this._saveInProgress);
-this._assertIsItem(_14);
-var _15=_14[this._itemNumPropName];
-var _16=this.getIdentity(_14);
+this._assertIsItem(_13);
+var _14=_13[this._itemNumPropName];
+var _15=this.getIdentity(_13);
 if(this.referenceIntegrity){
-var _17=this.getAttributes(_14);
-if(_14[this._reverseRefMap]){
-_14["backup_"+this._reverseRefMap]=dojo.clone(_14[this._reverseRefMap]);
+var _16=this.getAttributes(_13);
+if(_13[this._reverseRefMap]){
+_13["backup_"+this._reverseRefMap]=dojo.clone(_13[this._reverseRefMap]);
 }
-dojo.forEach(_17,function(_18){
-dojo.forEach(this.getValues(_14,_18),function(_19){
-if(this.isItem(_19)){
-if(!_14["backupRefs_"+this._reverseRefMap]){
-_14["backupRefs_"+this._reverseRefMap]=[];
+dojo.forEach(_16,function(_17){
+dojo.forEach(this.getValues(_13,_17),function(_18){
+if(this.isItem(_18)){
+if(!_13["backupRefs_"+this._reverseRefMap]){
+_13["backupRefs_"+this._reverseRefMap]=[];
 }
-_14["backupRefs_"+this._reverseRefMap].push({id:this.getIdentity(_19),attr:_18});
-this._removeReferenceFromMap(_19,_14,_18);
+_13["backupRefs_"+this._reverseRefMap].push({id:this.getIdentity(_18),attr:_17});
+this._removeReferenceFromMap(_18,_13,_17);
 }
 },this);
 },this);
-var _1a=_14[this._reverseRefMap];
-if(_1a){
-for(var _1b in _1a){
-var _1c=null;
+var _19=_13[this._reverseRefMap];
+if(_19){
+for(var _1a in _19){
+var _1b=null;
 if(this._itemsByIdentity){
-_1c=this._itemsByIdentity[_1b];
+_1b=this._itemsByIdentity[_1a];
 }else{
-_1c=this._arrayOfAllItems[_1b];
+_1b=this._arrayOfAllItems[_1a];
 }
-if(_1c){
-for(var _1d in _1a[_1b]){
-var _1e=this.getValues(_1c,_1d)||[];
-var _1f=dojo.filter(_1e,function(_20){
-return !(this.isItem(_20)&&this.getIdentity(_20)==_16);
+if(_1b){
+for(var _1c in _19[_1a]){
+var _1d=this.getValues(_1b,_1c)||[];
+var _1e=dojo.filter(_1d,function(_1f){
+return !(this.isItem(_1f)&&this.getIdentity(_1f)==_15);
 },this);
-this._removeReferenceFromMap(_14,_1c,_1d);
-if(_1f.length<_1e.length){
-this._setValueOrValues(_1c,_1d,_1f);
+this._removeReferenceFromMap(_13,_1b,_1c);
+if(_1e.length<_1d.length){
+this._setValueOrValues(_1b,_1c,_1e);
 }
 }
 }
 }
 }
 }
-this._arrayOfAllItems[_15]=null;
-_14[this._storeRefPropName]=null;
+this._arrayOfAllItems[_14]=null;
+_13[this._storeRefPropName]=null;
 if(this._itemsByIdentity){
-delete this._itemsByIdentity[_16];
+delete this._itemsByIdentity[_15];
 }
-this._pending._deletedItems[_16]=_14;
-if(_14[this._rootItemPropName]){
-this._removeArrayElement(this._arrayOfTopLevelItems,_14);
+this._pending._deletedItems[_15]=_13;
+if(_13[this._rootItemPropName]){
+this._removeArrayElement(this._arrayOfTopLevelItems,_13);
 }
-this.onDelete(_14);
+this.onDelete(_13);
 return true;
-},setValue:function(_21,_22,_23){
-return this._setValueOrValues(_21,_22,_23,true);
-},setValues:function(_24,_25,_26){
-return this._setValueOrValues(_24,_25,_26,true);
-},unsetAttribute:function(_27,_28){
-return this._setValueOrValues(_27,_28,[],true);
-},_setValueOrValues:function(_29,_2a,_2b,_2c){
+},setValue:function(_20,_21,_22){
+return this._setValueOrValues(_20,_21,_22,true);
+},setValues:function(_23,_24,_25){
+return this._setValueOrValues(_23,_24,_25,true);
+},unsetAttribute:function(_26,_27){
+return this._setValueOrValues(_26,_27,[],true);
+},_setValueOrValues:function(_28,_29,_2a,_2b){
 this._assert(!this._saveInProgress);
-this._assertIsItem(_29);
-this._assert(dojo.isString(_2a));
-this._assert(typeof _2b!=="undefined");
-var _2d=this._getIdentifierAttribute();
-if(_2a==_2d){
+this._assertIsItem(_28);
+this._assert(dojo.isString(_29));
+this._assert(typeof _2a!=="undefined");
+var _2c=this._getIdentifierAttribute();
+if(_29==_2c){
 throw new Error("ItemFileWriteStore does not have support for changing the value of an item's identifier.");
 }
-var _2e=this._getValueOrValues(_29,_2a);
-var _2f=this.getIdentity(_29);
-if(!this._pending._modifiedItems[_2f]){
-var _30={};
-for(var key in _29){
+var _2d=this._getValueOrValues(_28,_29);
+var _2e=this.getIdentity(_28);
+if(!this._pending._modifiedItems[_2e]){
+var _2f={};
+for(var key in _28){
 if((key===this._storeRefPropName)||(key===this._itemNumPropName)||(key===this._rootItemPropName)){
-_30[key]=_29[key];
+_2f[key]=_28[key];
 }else{
 if(key===this._reverseRefMap){
-_30[key]=dojo.clone(_29[key]);
+_2f[key]=dojo.clone(_28[key]);
 }else{
-_30[key]=_29[key].slice(0,_29[key].length);
+_2f[key]=_28[key].slice(0,_28[key].length);
 }
 }
 }
-this._pending._modifiedItems[_2f]=_30;
+this._pending._modifiedItems[_2e]=_2f;
 }
-var _32=false;
-if(dojo.isArray(_2b)&&_2b.length===0){
-_32=delete _29[_2a];
-_2b=undefined;
-if(this.referenceIntegrity&&_2e){
-var _33=_2e;
-if(!dojo.isArray(_33)){
-_33=[_33];
+var _30=false;
+if(dojo.isArray(_2a)&&_2a.length===0){
+_30=delete _28[_29];
+_2a=undefined;
+if(this.referenceIntegrity&&_2d){
+var _31=_2d;
+if(!dojo.isArray(_31)){
+_31=[_31];
 }
-for(var i=0;i<_33.length;i++){
-var _35=_33[i];
-if(this.isItem(_35)){
-this._removeReferenceFromMap(_35,_29,_2a);
+for(var i=0;i<_31.length;i++){
+var _32=_31[i];
+if(this.isItem(_32)){
+this._removeReferenceFromMap(_32,_28,_29);
 }
 }
 }
 }else{
-var _36;
-if(dojo.isArray(_2b)){
-var _37=_2b;
-_36=_2b.slice(0,_2b.length);
+var _33;
+if(dojo.isArray(_2a)){
+var _34=_2a;
+_33=_2a.slice(0,_2a.length);
 }else{
-_36=[_2b];
+_33=[_2a];
 }
 if(this.referenceIntegrity){
-if(_2e){
-var _33=_2e;
-if(!dojo.isArray(_33)){
-_33=[_33];
+if(_2d){
+var _31=_2d;
+if(!dojo.isArray(_31)){
+_31=[_31];
 }
 var map={};
-dojo.forEach(_33,function(_39){
-if(this.isItem(_39)){
-var id=this.getIdentity(_39);
+dojo.forEach(_31,function(_35){
+if(this.isItem(_35)){
+var id=this.getIdentity(_35);
 map[id.toString()]=true;
 }
 },this);
-dojo.forEach(_36,function(_3b){
-if(this.isItem(_3b)){
-var id=this.getIdentity(_3b);
+dojo.forEach(_33,function(_36){
+if(this.isItem(_36)){
+var id=this.getIdentity(_36);
 if(map[id.toString()]){
 delete map[id.toString()];
 }else{
-this._addReferenceToMap(_3b,_29,_2a);
+this._addReferenceToMap(_36,_28,_29);
 }
 }
 },this);
 for(var rId in map){
-var _3e;
+var _37;
 if(this._itemsByIdentity){
-_3e=this._itemsByIdentity[rId];
+_37=this._itemsByIdentity[rId];
 }else{
-_3e=this._arrayOfAllItems[rId];
+_37=this._arrayOfAllItems[rId];
 }
-this._removeReferenceFromMap(_3e,_29,_2a);
+this._removeReferenceFromMap(_37,_28,_29);
 }
 }else{
-for(var i=0;i<_36.length;i++){
-var _35=_36[i];
-if(this.isItem(_35)){
-this._addReferenceToMap(_35,_29,_2a);
+for(var i=0;i<_33.length;i++){
+var _32=_33[i];
+if(this.isItem(_32)){
+this._addReferenceToMap(_32,_28,_29);
 }
 }
 }
 }
-_29[_2a]=_36;
-_32=true;
+_28[_29]=_33;
+_30=true;
 }
-if(_2c){
-this.onSet(_29,_2a,_2e,_2b);
+if(_2b){
+this.onSet(_28,_29,_2d,_2a);
 }
-return _32;
-},_addReferenceToMap:function(_3f,_40,_41){
-var _42=this.getIdentity(_40);
-var _43=_3f[this._reverseRefMap];
-if(!_43){
-_43=_3f[this._reverseRefMap]={};
+return _30;
+},_addReferenceToMap:function(_38,_39,_3a){
+var _3b=this.getIdentity(_39);
+var _3c=_38[this._reverseRefMap];
+if(!_3c){
+_3c=_38[this._reverseRefMap]={};
 }
-var _44=_43[_42];
-if(!_44){
-_44=_43[_42]={};
+var _3d=_3c[_3b];
+if(!_3d){
+_3d=_3c[_3b]={};
 }
-_44[_41]=true;
-},_removeReferenceFromMap:function(_45,_46,_47){
-var _48=this.getIdentity(_46);
-var _49=_45[this._reverseRefMap];
-var _4a;
-if(_49){
-for(_4a in _49){
-if(_4a==_48){
-delete _49[_4a][_47];
-if(this._isEmpty(_49[_4a])){
-delete _49[_4a];
+_3d[_3a]=true;
+},_removeReferenceFromMap:function(_3e,_3f,_40){
+var _41=this.getIdentity(_3f);
+var _42=_3e[this._reverseRefMap];
+var _43;
+if(_42){
+for(_43 in _42){
+if(_43==_41){
+delete _42[_43][_40];
+if(this._isEmpty(_42[_43])){
+delete _42[_43];
 }
 }
 }
-if(this._isEmpty(_49)){
-delete _45[this._reverseRefMap];
+if(this._isEmpty(_42)){
+delete _3e[this._reverseRefMap];
 }
 }
 },_dumpReferenceMap:function(){
 var i;
 for(i=0;i<this._arrayOfAllItems.length;i++){
-var _4c=this._arrayOfAllItems[i];
-if(_4c&&_4c[this._reverseRefMap]){
-
+var _44=this._arrayOfAllItems[i];
+if(_44&&_44[this._reverseRefMap]){
 }
 }
-},_getValueOrValues:function(_4d,_4e){
-var _4f=undefined;
-if(this.hasAttribute(_4d,_4e)){
-var _50=this.getValues(_4d,_4e);
-if(_50.length==1){
-_4f=_50[0];
+},_getValueOrValues:function(_45,_46){
+var _47=undefined;
+if(this.hasAttribute(_45,_46)){
+var _48=this.getValues(_45,_46);
+if(_48.length==1){
+_47=_48[0];
 }else{
-_4f=_50;
+_47=_48;
 }
 }
-return _4f;
-},_flatten:function(_51){
-if(this.isItem(_51)){
-var _52=_51;
-var _53=this.getIdentity(_52);
-var _54={_reference:_53};
-return _54;
+return _47;
+},_flatten:function(_49){
+if(this.isItem(_49)){
+var _4a=_49;
+var _4b=this.getIdentity(_4a);
+var _4c={_reference:_4b};
+return _4c;
 }else{
-if(typeof _51==="object"){
-for(var _55 in this._datatypeMap){
-var _56=this._datatypeMap[_55];
-if(dojo.isObject(_56)&&!dojo.isFunction(_56)){
-if(_51 instanceof _56.type){
-if(!_56.serialize){
-throw new Error("ItemFileWriteStore:  No serializer defined for type mapping: ["+_55+"]");
+if(typeof _49==="object"){
+for(var _4d in this._datatypeMap){
+var _4e=this._datatypeMap[_4d];
+if(dojo.isObject(_4e)&&!dojo.isFunction(_4e)){
+if(_49 instanceof _4e.type){
+if(!_4e.serialize){
+throw new Error("ItemFileWriteStore:  No serializer defined for type mapping: ["+_4d+"]");
 }
-return {_type:_55,_value:_56.serialize(_51)};
+return {_type:_4d,_value:_4e.serialize(_49)};
 }
 }else{
-if(_51 instanceof _56){
-return {_type:_55,_value:_51.toString()};
+if(_49 instanceof _4e){
+return {_type:_4d,_value:_49.toString()};
 }
 }
 }
 }
-return _51;
+return _49;
 }
 },_getNewFileContentString:function(){
-var _57={};
-var _58=this._getIdentifierAttribute();
-if(_58!==Number){
-_57.identifier=_58;
+var _4f={};
+var _50=this._getIdentifierAttribute();
+if(_50!==Number){
+_4f.identifier=_50;
 }
 if(this._labelAttr){
-_57.label=this._labelAttr;
+_4f.label=this._labelAttr;
 }
-_57.items=[];
+_4f.items=[];
 for(var i=0;i<this._arrayOfAllItems.length;++i){
-var _5a=this._arrayOfAllItems[i];
-if(_5a!==null){
-var _5b={};
-for(var key in _5a){
+var _51=this._arrayOfAllItems[i];
+if(_51!==null){
+var _52={};
+for(var key in _51){
 if(key!==this._storeRefPropName&&key!==this._itemNumPropName&&key!==this._reverseRefMap&&key!==this._rootItemPropName){
-var _5d=key;
-var _5e=this.getValues(_5a,_5d);
-if(_5e.length==1){
-_5b[_5d]=this._flatten(_5e[0]);
+var _53=key;
+var _54=this.getValues(_51,_53);
+if(_54.length==1){
+_52[_53]=this._flatten(_54[0]);
 }else{
-var _5f=[];
-for(var j=0;j<_5e.length;++j){
-_5f.push(this._flatten(_5e[j]));
-_5b[_5d]=_5f;
+var _55=[];
+for(var j=0;j<_54.length;++j){
+_55.push(this._flatten(_54[j]));
+_52[_53]=_55;
 }
 }
 }
 }
-_57.items.push(_5b);
+_4f.items.push(_52);
 }
 }
-var _61=true;
-return dojo.toJson(_57,_61);
-},_isEmpty:function(_62){
-var _63=true;
-if(dojo.isObject(_62)){
+var _56=true;
+return dojo.toJson(_4f,_56);
+},_isEmpty:function(_57){
+var _58=true;
+if(dojo.isObject(_57)){
 var i;
-for(i in _62){
-_63=false;
+for(i in _57){
+_58=false;
 break;
 }
 }else{
-if(dojo.isArray(_62)){
-if(_62.length>0){
-_63=false;
+if(dojo.isArray(_57)){
+if(_57.length>0){
+_58=false;
 }
 }
 }
-return _63;
-},save:function(_65){
+return _58;
+},save:function(_59){
 this._assert(!this._saveInProgress);
 this._saveInProgress=true;
-var _66=this;
-var _67=function(){
-_66._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};
-_66._saveInProgress=false;
-if(_65&&_65.onComplete){
-var _68=_65.scope||dojo.global;
-_65.onComplete.call(_68);
+var _5a=this;
+var _5b=function(){
+_5a._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};
+_5a._saveInProgress=false;
+if(_59&&_59.onComplete){
+var _5c=_59.scope||dojo.global;
+_59.onComplete.call(_5c);
 }
 };
-var _69=function(){
-_66._saveInProgress=false;
-if(_65&&_65.onError){
-var _6a=_65.scope||dojo.global;
-_65.onError.call(_6a);
+var _5d=function(){
+_5a._saveInProgress=false;
+if(_59&&_59.onError){
+var _5e=_59.scope||dojo.global;
+_59.onError.call(_5e);
 }
 };
 if(this._saveEverything){
-var _6b=this._getNewFileContentString();
-this._saveEverything(_67,_69,_6b);
+var _5f=this._getNewFileContentString();
+this._saveEverything(_5b,_5d,_5f);
 }
 if(this._saveCustom){
-this._saveCustom(_67,_69);
+this._saveCustom(_5b,_5d);
 }
 if(!this._saveEverything&&!this._saveCustom){
-_67();
+_5b();
 }
 },revert:function(){
 this._assert(!this._saveInProgress);
-var _6c;
-for(_6c in this._pending._modifiedItems){
-var _6d=this._pending._modifiedItems[_6c];
-var _6e=null;
+var _60;
+for(_60 in this._pending._modifiedItems){
+var _61=this._pending._modifiedItems[_60];
+var _62=null;
 if(this._itemsByIdentity){
-_6e=this._itemsByIdentity[_6c];
+_62=this._itemsByIdentity[_60];
 }else{
-_6e=this._arrayOfAllItems[_6c];
-}
-_6d[this._storeRefPropName]=this;
-_6e[this._storeRefPropName]=null;
-var _6f=_6e[this._itemNumPropName];
-this._arrayOfAllItems[_6f]=_6d;
-if(_6e[this._rootItemPropName]){
-var i;
-for(i=0;i<this._arrayOfTopLevelItems.length;i++){
-var _71=this._arrayOfTopLevelItems[i];
-if(this.getIdentity(_71)==_6c){
-this._arrayOfTopLevelItems[i]=_6d;
-break;
-}
+_62=this._arrayOfAllItems[_60];
 }
+_61[this._storeRefPropName]=this;
+for(key in _62){
+delete _62[key];
 }
-if(this._itemsByIdentity){
-this._itemsByIdentity[_6c]=_6d;
-}
+dojo.mixin(_62,_61);
 }
-var _72;
-for(_6c in this._pending._deletedItems){
-_72=this._pending._deletedItems[_6c];
-_72[this._storeRefPropName]=this;
-var _73=_72[this._itemNumPropName];
-if(_72["backup_"+this._reverseRefMap]){
-_72[this._reverseRefMap]=_72["backup_"+this._reverseRefMap];
-delete _72["backup_"+this._reverseRefMap];
+var _63;
+for(_60 in this._pending._deletedItems){
+_63=this._pending._deletedItems[_60];
+_63[this._storeRefPropName]=this;
+var _64=_63[this._itemNumPropName];
+if(_63["backup_"+this._reverseRefMap]){
+_63[this._reverseRefMap]=_63["backup_"+this._reverseRefMap];
+delete _63["backup_"+this._reverseRefMap];
 }
-this._arrayOfAllItems[_73]=_72;
+this._arrayOfAllItems[_64]=_63;
 if(this._itemsByIdentity){
-this._itemsByIdentity[_6c]=_72;
+this._itemsByIdentity[_60]=_63;
 }
-if(_72[this._rootItemPropName]){
-this._arrayOfTopLevelItems.push(_72);
+if(_63[this._rootItemPropName]){
+this._arrayOfTopLevelItems.push(_63);
 }
 }
-for(_6c in this._pending._deletedItems){
-_72=this._pending._deletedItems[_6c];
-if(_72["backupRefs_"+this._reverseRefMap]){
-dojo.forEach(_72["backupRefs_"+this._reverseRefMap],function(_74){
-var _75;
+for(_60 in this._pending._deletedItems){
+_63=this._pending._deletedItems[_60];
+if(_63["backupRefs_"+this._reverseRefMap]){
+dojo.forEach(_63["backupRefs_"+this._reverseRefMap],function(_65){
+var _66;
 if(this._itemsByIdentity){
-_75=this._itemsByIdentity[_74.id];
+_66=this._itemsByIdentity[_65.id];
 }else{
-_75=this._arrayOfAllItems[_74.id];
+_66=this._arrayOfAllItems[_65.id];
 }
-this._addReferenceToMap(_75,_72,_74.attr);
+this._addReferenceToMap(_66,_63,_65.attr);
 },this);
-delete _72["backupRefs_"+this._reverseRefMap];
+delete _63["backupRefs_"+this._reverseRefMap];
 }
 }
-for(_6c in this._pending._newItems){
-var _76=this._pending._newItems[_6c];
-_76[this._storeRefPropName]=null;
-this._arrayOfAllItems[_76[this._itemNumPropName]]=null;
-if(_76[this._rootItemPropName]){
-this._removeArrayElement(this._arrayOfTopLevelItems,_76);
+for(_60 in this._pending._newItems){
+var _67=this._pending._newItems[_60];
+_67[this._storeRefPropName]=null;
+this._arrayOfAllItems[_67[this._itemNumPropName]]=null;
+if(_67[this._rootItemPropName]){
+this._removeArrayElement(this._arrayOfTopLevelItems,_67);
 }
 if(this._itemsByIdentity){
-delete this._itemsByIdentity[_6c];
+delete this._itemsByIdentity[_60];
 }
 }
 this._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};
 return true;
-},isDirty:function(_77){
-if(_77){
-var _78=this.getIdentity(_77);
-return new Boolean(this._pending._newItems[_78]||this._pending._modifiedItems[_78]||this._pending._deletedItems[_78]).valueOf();
+},isDirty:function(_68){
+if(_68){
+var _69=this.getIdentity(_68);
+return new Boolean(this._pending._newItems[_69]||this._pending._modifiedItems[_69]||this._pending._deletedItems[_69]).valueOf();
 }else{
 if(!this._isEmpty(this._pending._newItems)||!this._isEmpty(this._pending._modifiedItems)||!this._isEmpty(this._pending._deletedItems)){
 return true;
 }
 return false;
 }
-},onSet:function(_79,_7a,_7b,_7c){
-},onNew:function(_7d,_7e){
-},onDelete:function(_7f){
-},close:function(_80){
+},onSet:function(_6a,_6b,_6c,_6d){
+},onNew:function(_6e,_6f){
+},onDelete:function(_70){
+},close:function(_71){
 if(this.clearOnClose){
 if(!this.isDirty()){
 this.inherited(arguments);
 }else{
-if(this._jsonFileUrl!==""){
 throw new Error("dojox.data.AndOrWriteStore: There are unsaved changes present in the store.  Please save or revert the changes before invoking close.");
 }
 }
-}
 }});
 }
diff --git a/dojox/data/AppStore.js b/dojox/data/AppStore.js
index 6416d77..b65a12e 100644
--- a/dojox/data/AppStore.js
+++ b/dojox/data/AppStore.js
@@ -30,18 +30,18 @@ this._feed.entries[i].store=this;
 }
 if(this._requests){
 for(i=0;i<this._requests.length;i++){
-var _5=this._requests[i];
-if(_5.request&&_5.fh&&_5.eh){
-this._finishFetchItems(_5.request,_5.fh,_5.eh);
+var _4=this._requests[i];
+if(_4.request&&_4.fh&&_4.eh){
+this._finishFetchItems(_4.request,_4.fh,_4.eh);
 }else{
-if(_5.clear){
+if(_4.clear){
 this._feed=null;
 }else{
-if(_5.add){
-this._feed.addEntry(_5.add);
+if(_4.add){
+this._feed.addEntry(_4.add);
 }else{
-if(_5.remove){
-this._feed.removeEntry(_5.remove);
+if(_4.remove){
+this._feed.removeEntry(_4.remove);
 }
 }
 }
@@ -50,207 +50,207 @@ this._feed.removeEntry(_5.remove);
 }
 this._requests=null;
 },_getAllItems:function(){
-var _6=[];
+var _5=[];
 for(var i=0;i<this._feed.entries.length;i++){
-_6.push(this._feed.entries[i]);
+_5.push(this._feed.entries[i]);
 }
-return _6;
-},_assertIsItem:function(_8){
-if(!this.isItem(_8)){
+return _5;
+},_assertIsItem:function(_6){
+if(!this.isItem(_6)){
 throw new Error("This error message is provided when a function is called in the following form: "+"getAttribute(argument, attributeName).  The argument variable represents the member "+"or owner of the object. The error is created when an item that does not belong "+"to this store is specified as an argument.");
 }
-},_assertIsAttribute:function(_9){
-if(typeof _9!=="string"){
+},_assertIsAttribute:function(_7){
+if(typeof _7!=="string"){
 throw new Error("The attribute argument must be a string. The error is created "+"when a different type of variable is specified such as an array or object.");
 }
-for(var _a in dojox.atom.io.model._actions){
-if(_a==_9){
+for(var _8 in dojox.atom.io.model._actions){
+if(_8==_7){
 return true;
 }
 }
 return false;
-},_addUpdate:function(_b){
+},_addUpdate:function(_9){
 if(!this._updates){
-this._updates=[_b];
+this._updates=[_9];
 }else{
-this._updates.push(_b);
+this._updates.push(_9);
 }
-},getValue:function(_c,_d,_e){
-var _f=this.getValues(_c,_d);
-return (_f.length>0)?_f[0]:_e;
-},getValues:function(_10,_11){
-this._assertIsItem(_10);
-var _12=this._assertIsAttribute(_11);
-if(_12){
-if((_11==="author"||_11==="contributor"||_11==="link")&&_10[_11+"s"]){
-return _10[_11+"s"];
+},getValue:function(_a,_b,_c){
+var _d=this.getValues(_a,_b);
+return (_d.length>0)?_d[0]:_c;
+},getValues:function(_e,_f){
+this._assertIsItem(_e);
+var _10=this._assertIsAttribute(_f);
+if(_10){
+if((_f==="author"||_f==="contributor"||_f==="link")&&_e[_f+"s"]){
+return _e[_f+"s"];
 }
-if(_11==="category"&&_10.categories){
-return _10.categories;
+if(_f==="category"&&_e.categories){
+return _e.categories;
 }
-if(_10[_11]){
-_10=_10[_11];
-if(_10.declaredClass=="dojox.atom.io.model.Content"){
-return [_10.value];
+if(_e[_f]){
+_e=_e[_f];
+if(_e.declaredClass=="dojox.atom.io.model.Content"){
+return [_e.value];
 }
-return [_10];
+return [_e];
 }
 }
 return [];
-},getAttributes:function(_13){
-this._assertIsItem(_13);
-var _14=[];
+},getAttributes:function(_11){
+this._assertIsItem(_11);
+var _12=[];
 for(var key in dojox.atom.io.model._actions){
-if(this.hasAttribute(_13,key)){
-_14.push(key);
-}
-}
-return _14;
-},hasAttribute:function(_16,_17){
-return this.getValues(_16,_17).length>0;
-},containsValue:function(_18,_19,_1a){
-var _1b=undefined;
-if(typeof _1a==="string"){
-_1b=dojo.data.util.filter.patternToRegExp(_1a,false);
-}
-return this._containsValue(_18,_19,_1a,_1b);
-},_containsValue:function(_1c,_1d,_1e,_1f,_20){
-var _21=this.getValues(_1c,_1d);
-for(var i=0;i<_21.length;++i){
-var _23=_21[i];
-if(typeof _23==="string"&&_1f){
-if(_20){
-_23=_23.replace(new RegExp(/^\s+/),"");
-_23=_23.replace(new RegExp(/\s+$/),"");
-}
-_23=_23.replace(/\r|\n|\r\n/g,"");
-return (_23.match(_1f)!==null);
+if(this.hasAttribute(_11,key)){
+_12.push(key);
+}
+}
+return _12;
+},hasAttribute:function(_13,_14){
+return this.getValues(_13,_14).length>0;
+},containsValue:function(_15,_16,_17){
+var _18=undefined;
+if(typeof _17==="string"){
+_18=dojo.data.util.filter.patternToRegExp(_17,false);
+}
+return this._containsValue(_15,_16,_17,_18);
+},_containsValue:function(_19,_1a,_1b,_1c,_1d){
+var _1e=this.getValues(_19,_1a);
+for(var i=0;i<_1e.length;++i){
+var _1f=_1e[i];
+if(typeof _1f==="string"&&_1c){
+if(_1d){
+_1f=_1f.replace(new RegExp(/^\s+/),"");
+_1f=_1f.replace(new RegExp(/\s+$/),"");
+}
+_1f=_1f.replace(/\r|\n|\r\n/g,"");
+return (_1f.match(_1c)!==null);
 }else{
-if(_1e===_23){
+if(_1b===_1f){
 return true;
 }
 }
 }
 return false;
-},isItem:function(_24){
-return _24&&_24.store&&_24.store===this;
-},isItemLoaded:function(_25){
-return this.isItem(_25);
-},loadItem:function(_26){
-this._assertIsItem(_26.item);
-},_fetchItems:function(_27,_28,_29){
+},isItem:function(_20){
+return _20&&_20.store&&_20.store===this;
+},isItemLoaded:function(_21){
+return this.isItem(_21);
+},loadItem:function(_22){
+this._assertIsItem(_22.item);
+},_fetchItems:function(_23,_24,_25){
 if(this._feed){
-this._finishFetchItems(_27,_28,_29);
+this._finishFetchItems(_23,_24,_25);
 }else{
-var _2a=false;
+var _26=false;
 if(!this._requests){
 this._requests=[];
-_2a=true;
+_26=true;
 }
-this._requests.push({request:_27,fh:_28,eh:_29});
-if(_2a){
+this._requests.push({request:_23,fh:_24,eh:_25});
+if(_26){
 this._atomIO=new dojox.atom.io.Connection(false,this.urlPreventCache);
 this._atomIO.getFeed(this.url,this._setFeed,null,this);
 }
 }
-},_finishFetchItems:function(_2b,_2c,_2d){
-var _2e=null;
-var _2f=this._getAllItems();
-if(_2b.query){
-var _30=_2b.queryOptions?_2b.queryOptions.ignoreCase:false;
-_2e=[];
-var _31={};
+},_finishFetchItems:function(_27,_28,_29){
+var _2a=null;
+var _2b=this._getAllItems();
+if(_27.query){
+var _2c=_27.queryOptions?_27.queryOptions.ignoreCase:false;
+_2a=[];
+var _2d={};
 var key;
-var _33;
-for(key in _2b.query){
-_33=_2b.query[key]+"";
-if(typeof _33==="string"){
-_31[key]=dojo.data.util.filter.patternToRegExp(_33,_30);
+var _2e;
+for(key in _27.query){
+_2e=_27.query[key]+"";
+if(typeof _2e==="string"){
+_2d[key]=dojo.data.util.filter.patternToRegExp(_2e,_2c);
 }
 }
-for(var i=0;i<_2f.length;++i){
-var _35=true;
-var _36=_2f[i];
-for(key in _2b.query){
-_33=_2b.query[key]+"";
-if(!this._containsValue(_36,key,_33,_31[key],_2b.trim)){
-_35=false;
+for(var i=0;i<_2b.length;++i){
+var _2f=true;
+var _30=_2b[i];
+for(key in _27.query){
+_2e=_27.query[key]+"";
+if(!this._containsValue(_30,key,_2e,_2d[key],_27.trim)){
+_2f=false;
 }
 }
-if(_35){
-_2e.push(_36);
+if(_2f){
+_2a.push(_30);
 }
 }
 }else{
-if(_2f.length>0){
-_2e=_2f.slice(0,_2f.length);
+if(_2b.length>0){
+_2a=_2b.slice(0,_2b.length);
 }
 }
 try{
-_2c(_2e,_2b);
+_28(_2a,_27);
 }
 catch(e){
-_2d(e,_2b);
+_29(e,_27);
 }
 },getFeatures:function(){
 return {"dojo.data.api.Read":true,"dojo.data.api.Write":true,"dojo.data.api.Identity":true};
-},close:function(_37){
+},close:function(_31){
 this._feed=null;
-},getLabel:function(_38){
-if(this.isItem(_38)){
-return this.getValue(_38,"title","No Title");
+},getLabel:function(_32){
+if(this.isItem(_32)){
+return this.getValue(_32,"title","No Title");
 }
 return undefined;
-},getLabelAttributes:function(_39){
+},getLabelAttributes:function(_33){
 return ["title"];
-},getIdentity:function(_3a){
-this._assertIsItem(_3a);
-return this.getValue(_3a,"id");
-},getIdentityAttributes:function(_3b){
+},getIdentity:function(_34){
+this._assertIsItem(_34);
+return this.getValue(_34,"id");
+},getIdentityAttributes:function(_35){
 return ["id"];
-},fetchItemByIdentity:function(_3c){
-this._fetchItems({query:{id:_3c.identity},onItem:_3c.onItem,scope:_3c.scope},function(_3d,_3e){
-var _3f=_3e.scope;
-if(!_3f){
-_3f=dojo.global;
-}
-if(_3d.length<1){
-_3e.onItem.call(_3f,null);
+},fetchItemByIdentity:function(_36){
+this._fetchItems({query:{id:_36.identity},onItem:_36.onItem,scope:_36.scope},function(_37,_38){
+var _39=_38.scope;
+if(!_39){
+_39=dojo.global;
+}
+if(_37.length<1){
+_38.onItem.call(_39,null);
 }else{
-_3e.onItem.call(_3f,_3d[0]);
+_38.onItem.call(_39,_37[0]);
 }
-},_3c.onError);
-},newItem:function(_40){
-var _41=new dojox.atom.io.model.Entry();
-var _42=null;
-var _43=null;
+},_36.onError);
+},newItem:function(_3a){
+var _3b=new dojox.atom.io.model.Entry();
+var _3c=null;
+var _3d=null;
 var i;
-for(var key in _40){
+for(var key in _3a){
 if(this._assertIsAttribute(key)){
-_42=_40[key];
+_3c=_3a[key];
 switch(key){
 case "link":
-for(i in _42){
-_43=_42[i];
-_41.addLink(_43.href,_43.rel,_43.hrefLang,_43.title,_43.type);
+for(i in _3c){
+_3d=_3c[i];
+_3b.addLink(_3d.href,_3d.rel,_3d.hrefLang,_3d.title,_3d.type);
 }
 break;
 case "author":
-for(i in _42){
-_43=_42[i];
-_41.addAuthor(_43.name,_43.email,_43.uri);
+for(i in _3c){
+_3d=_3c[i];
+_3b.addAuthor(_3d.name,_3d.email,_3d.uri);
 }
 break;
 case "contributor":
-for(i in _42){
-_43=_42[i];
-_41.addContributor(_43.name,_43.email,_43.uri);
+for(i in _3c){
+_3d=_3c[i];
+_3b.addContributor(_3d.name,_3d.email,_3d.uri);
 }
 break;
 case "category":
-for(i in _42){
-_43=_42[i];
-_41.addCategory(_43.scheme,_43.term,_43.label);
+for(i in _3c){
+_3d=_3c[i];
+_3b.addCategory(_3d.scheme,_3d.term,_3d.label);
 }
 break;
 case "icon":
@@ -258,264 +258,264 @@ case "id":
 case "logo":
 case "xmlBase":
 case "rights":
-_41[key]=_42;
+_3b[key]=_3c;
 break;
 case "updated":
 case "published":
 case "issued":
 case "modified":
-_41[key]=dojox.atom.io.model.util.createDate(_42);
+_3b[key]=dojox.atom.io.model.util.createDate(_3c);
 break;
 case "content":
 case "summary":
 case "title":
 case "subtitle":
-_41[key]=new dojox.atom.io.model.Content(key);
-_41[key].value=_42;
+_3b[key]=new dojox.atom.io.model.Content(key);
+_3b[key].value=_3c;
 break;
 default:
-_41[key]=_42;
+_3b[key]=_3c;
 break;
 }
 }
 }
-_41.store=this;
-_41.isDirty=true;
+_3b.store=this;
+_3b.isDirty=true;
 if(!this._adds){
-this._adds=[_41];
+this._adds=[_3b];
 }else{
-this._adds.push(_41);
+this._adds.push(_3b);
 }
 if(this._feed){
-this._feed.addEntry(_41);
+this._feed.addEntry(_3b);
 }else{
 if(this._requests){
-this._requests.push({add:_41});
+this._requests.push({add:_3b});
 }else{
-this._requests=[{add:_41}];
+this._requests=[{add:_3b}];
 this._atomIO=new dojox.atom.io.Connection(false,this.urlPreventCache);
 this._atomIO.getFeed(this.url,dojo.hitch(this,this._setFeed));
 }
 }
 return true;
-},deleteItem:function(_46){
-this._assertIsItem(_46);
+},deleteItem:function(_3e){
+this._assertIsItem(_3e);
 if(!this._deletes){
-this._deletes=[_46];
+this._deletes=[_3e];
 }else{
-this._deletes.push(_46);
+this._deletes.push(_3e);
 }
 if(this._feed){
-this._feed.removeEntry(_46);
+this._feed.removeEntry(_3e);
 }else{
 if(this._requests){
-this._requests.push({remove:_46});
+this._requests.push({remove:_3e});
 }else{
-this._requests=[{remove:_46}];
+this._requests=[{remove:_3e}];
 this._atomIO=new dojox.atom.io.Connection(false,this.urlPreventCache);
 this._atomIO.getFeed(this.url,dojo.hitch(this,this._setFeed));
 }
 }
-_46=null;
+_3e=null;
 return true;
-},setValue:function(_47,_48,_49){
-this._assertIsItem(_47);
-var _4a={item:_47};
-if(this._assertIsAttribute(_48)){
-switch(_48){
+},setValue:function(_3f,_40,_41){
+this._assertIsItem(_3f);
+var _42={item:_3f};
+if(this._assertIsAttribute(_40)){
+switch(_40){
 case "link":
-_4a.links=_47.links;
-this._addUpdate(_4a);
-_47.links=null;
-_47.addLink(_49.href,_49.rel,_49.hrefLang,_49.title,_49.type);
-_47.isDirty=true;
+_42.links=_3f.links;
+this._addUpdate(_42);
+_3f.links=null;
+_3f.addLink(_41.href,_41.rel,_41.hrefLang,_41.title,_41.type);
+_3f.isDirty=true;
 return true;
 case "author":
-_4a.authors=_47.authors;
-this._addUpdate(_4a);
-_47.authors=null;
-_47.addAuthor(_49.name,_49.email,_49.uri);
-_47.isDirty=true;
+_42.authors=_3f.authors;
+this._addUpdate(_42);
+_3f.authors=null;
+_3f.addAuthor(_41.name,_41.email,_41.uri);
+_3f.isDirty=true;
 return true;
 case "contributor":
-_4a.contributors=_47.contributors;
-this._addUpdate(_4a);
-_47.contributors=null;
-_47.addContributor(_49.name,_49.email,_49.uri);
-_47.isDirty=true;
+_42.contributors=_3f.contributors;
+this._addUpdate(_42);
+_3f.contributors=null;
+_3f.addContributor(_41.name,_41.email,_41.uri);
+_3f.isDirty=true;
 return true;
 case "category":
-_4a.categories=_47.categories;
-this._addUpdate(_4a);
-_47.categories=null;
-_47.addCategory(_49.scheme,_49.term,_49.label);
-_47.isDirty=true;
+_42.categories=_3f.categories;
+this._addUpdate(_42);
+_3f.categories=null;
+_3f.addCategory(_41.scheme,_41.term,_41.label);
+_3f.isDirty=true;
 return true;
 case "icon":
 case "id":
 case "logo":
 case "xmlBase":
 case "rights":
-_4a[_48]=_47[_48];
-this._addUpdate(_4a);
-_47[_48]=_49;
-_47.isDirty=true;
+_42[_40]=_3f[_40];
+this._addUpdate(_42);
+_3f[_40]=_41;
+_3f.isDirty=true;
 return true;
 case "updated":
 case "published":
 case "issued":
 case "modified":
-_4a[_48]=_47[_48];
-this._addUpdate(_4a);
-_47[_48]=dojox.atom.io.model.util.createDate(_49);
-_47.isDirty=true;
+_42[_40]=_3f[_40];
+this._addUpdate(_42);
+_3f[_40]=dojox.atom.io.model.util.createDate(_41);
+_3f.isDirty=true;
 return true;
 case "content":
 case "summary":
 case "title":
 case "subtitle":
-_4a[_48]=_47[_48];
-this._addUpdate(_4a);
-_47[_48]=new dojox.atom.io.model.Content(_48);
-_47[_48].value=_49;
-_47.isDirty=true;
+_42[_40]=_3f[_40];
+this._addUpdate(_42);
+_3f[_40]=new dojox.atom.io.model.Content(_40);
+_3f[_40].value=_41;
+_3f.isDirty=true;
 return true;
 default:
-_4a[_48]=_47[_48];
-this._addUpdate(_4a);
-_47[_48]=_49;
-_47.isDirty=true;
+_42[_40]=_3f[_40];
+this._addUpdate(_42);
+_3f[_40]=_41;
+_3f.isDirty=true;
 return true;
 }
 }
 return false;
-},setValues:function(_4b,_4c,_4d){
-if(_4d.length===0){
-return this.unsetAttribute(_4b,_4c);
+},setValues:function(_43,_44,_45){
+if(_45.length===0){
+return this.unsetAttribute(_43,_44);
 }
-this._assertIsItem(_4b);
-var _4e={item:_4b};
-var _4f;
+this._assertIsItem(_43);
+var _46={item:_43};
+var _47;
 var i;
-if(this._assertIsAttribute(_4c)){
-switch(_4c){
+if(this._assertIsAttribute(_44)){
+switch(_44){
 case "link":
-_4e.links=_4b.links;
-_4b.links=null;
-for(i in _4d){
-_4f=_4d[i];
-_4b.addLink(_4f.href,_4f.rel,_4f.hrefLang,_4f.title,_4f.type);
+_46.links=_43.links;
+_43.links=null;
+for(i in _45){
+_47=_45[i];
+_43.addLink(_47.href,_47.rel,_47.hrefLang,_47.title,_47.type);
 }
-_4b.isDirty=true;
+_43.isDirty=true;
 return true;
 case "author":
-_4e.authors=_4b.authors;
-_4b.authors=null;
-for(i in _4d){
-_4f=_4d[i];
-_4b.addAuthor(_4f.name,_4f.email,_4f.uri);
+_46.authors=_43.authors;
+_43.authors=null;
+for(i in _45){
+_47=_45[i];
+_43.addAuthor(_47.name,_47.email,_47.uri);
 }
-_4b.isDirty=true;
+_43.isDirty=true;
 return true;
 case "contributor":
-_4e.contributors=_4b.contributors;
-_4b.contributors=null;
-for(i in _4d){
-_4f=_4d[i];
-_4b.addContributor(_4f.name,_4f.email,_4f.uri);
+_46.contributors=_43.contributors;
+_43.contributors=null;
+for(i in _45){
+_47=_45[i];
+_43.addContributor(_47.name,_47.email,_47.uri);
 }
-_4b.isDirty=true;
+_43.isDirty=true;
 return true;
 case "categories":
-_4e.categories=_4b.categories;
-_4b.categories=null;
-for(i in _4d){
-_4f=_4d[i];
-_4b.addCategory(_4f.scheme,_4f.term,_4f.label);
+_46.categories=_43.categories;
+_43.categories=null;
+for(i in _45){
+_47=_45[i];
+_43.addCategory(_47.scheme,_47.term,_47.label);
 }
-_4b.isDirty=true;
+_43.isDirty=true;
 return true;
 case "icon":
 case "id":
 case "logo":
 case "xmlBase":
 case "rights":
-_4e[_4c]=_4b[_4c];
-_4b[_4c]=_4d[0];
-_4b.isDirty=true;
+_46[_44]=_43[_44];
+_43[_44]=_45[0];
+_43.isDirty=true;
 return true;
 case "updated":
 case "published":
 case "issued":
 case "modified":
-_4e[_4c]=_4b[_4c];
-_4b[_4c]=dojox.atom.io.model.util.createDate(_4d[0]);
-_4b.isDirty=true;
+_46[_44]=_43[_44];
+_43[_44]=dojox.atom.io.model.util.createDate(_45[0]);
+_43.isDirty=true;
 return true;
 case "content":
 case "summary":
 case "title":
 case "subtitle":
-_4e[_4c]=_4b[_4c];
-_4b[_4c]=new dojox.atom.io.model.Content(_4c);
-_4b[_4c].values[0]=_4d[0];
-_4b.isDirty=true;
+_46[_44]=_43[_44];
+_43[_44]=new dojox.atom.io.model.Content(_44);
+_43[_44].values[0]=_45[0];
+_43.isDirty=true;
 return true;
 default:
-_4e[_4c]=_4b[_4c];
-_4b[_4c]=_4d[0];
-_4b.isDirty=true;
+_46[_44]=_43[_44];
+_43[_44]=_45[0];
+_43.isDirty=true;
 return true;
 }
 }
-this._addUpdate(_4e);
+this._addUpdate(_46);
 return false;
-},unsetAttribute:function(_51,_52){
-this._assertIsItem(_51);
-if(this._assertIsAttribute(_52)){
-if(_51[_52]!==null){
-var _53={item:_51};
-switch(_52){
+},unsetAttribute:function(_48,_49){
+this._assertIsItem(_48);
+if(this._assertIsAttribute(_49)){
+if(_48[_49]!==null){
+var _4a={item:_48};
+switch(_49){
 case "author":
 case "contributor":
 case "link":
-_53[_52+"s"]=_51[_52+"s"];
+_4a[_49+"s"]=_48[_49+"s"];
 break;
 case "category":
-_53.categories=_51.categories;
+_4a.categories=_48.categories;
 break;
 default:
-_53[_52]=_51[_52];
+_4a[_49]=_48[_49];
 break;
 }
-_51.isDirty=true;
-_51[_52]=null;
-this._addUpdate(_53);
+_48.isDirty=true;
+_48[_49]=null;
+this._addUpdate(_4a);
 return true;
 }
 }
 return false;
-},save:function(_54){
+},save:function(_4b){
 var i;
 for(i in this._adds){
 this._atomIO.addEntry(this._adds[i],null,function(){
-},_54.onError,false,_54.scope);
+},_4b.onError,false,_4b.scope);
 }
 this._adds=null;
 for(i in this._updates){
 this._atomIO.updateEntry(this._updates[i].item,function(){
-},_54.onError,false,this.xmethod,_54.scope);
+},_4b.onError,false,this.xmethod,_4b.scope);
 }
 this._updates=null;
 for(i in this._deletes){
 this._atomIO.removeEntry(this._deletes[i],function(){
-},_54.onError,this.xmethod,_54.scope);
+},_4b.onError,this.xmethod,_4b.scope);
 }
 this._deletes=null;
 this._atomIO.getFeed(this.url,dojo.hitch(this,this._setFeed));
-if(_54.onComplete){
-var _56=_54.scope||dojo.global;
-_54.onComplete.call(_56);
+if(_4b.onComplete){
+var _4c=_4b.scope||dojo.global;
+_4b.onComplete.call(_4c);
 }
 },revert:function(){
 var i;
@@ -523,13 +523,13 @@ for(i in this._adds){
 this._feed.removeEntry(this._adds[i]);
 }
 this._adds=null;
-var _58,_59,key;
+var _4d,_4e,key;
 for(i in this._updates){
-_58=this._updates[i];
-_59=_58.item;
-for(key in _58){
+_4d=this._updates[i];
+_4e=_4d.item;
+for(key in _4d){
 if(key!=="item"){
-_59[key]=_58[key];
+_4e[key]=_4d[key];
 }
 }
 }
@@ -539,10 +539,10 @@ this._feed.addEntry(this._deletes[i]);
 }
 this._deletes=null;
 return true;
-},isDirty:function(_5b){
-if(_5b){
-this._assertIsItem(_5b);
-return _5b.isDirty?true:false;
+},isDirty:function(_4f){
+if(_4f){
+this._assertIsItem(_4f);
+return _4f.isDirty?true:false;
 }
 return (this._adds!==null||this._updates!==null);
 }});
diff --git a/dojox/data/AtomReadStore.js b/dojox/data/AtomReadStore.js
index 1db2b95..10083e5 100644
--- a/dojox/data/AtomReadStore.js
+++ b/dojox/data/AtomReadStore.js
@@ -19,11 +19,14 @@ this.rewriteUrl=_1.rewriteUrl;
 this.label=_1.label||this.label;
 this.sendQuery=(_1.sendQuery||_1.sendquery||this.sendQuery);
 this.unescapeHTML=_1.unescapeHTML;
+if("urlPreventCache" in _1){
+this.urlPreventCache=_1.urlPreventCache?true:false;
+}
 }
 if(!this.url){
 throw new Error("AtomReadStore: a URL must be specified when creating the data store");
 }
-},url:"",label:"title",sendQuery:false,unescapeHTML:false,getValue:function(_2,_3,_4){
+},url:"",label:"title",sendQuery:false,unescapeHTML:false,urlPreventCache:false,getValue:function(_2,_3,_4){
 this._assertIsItem(_2);
 this._assertIsAttribute(_3);
 this._initItem(_2);
@@ -68,270 +71,268 @@ for(var x in _c._attribs){
 _d.push(x);
 }
 return _d;
-},hasAttribute:function(_f,_10){
-return (this.getValue(_f,_10)!==undefined);
-},containsValue:function(_11,_12,_13){
-var _14=this.getValues(_11,_12);
-for(var i=0;i<_14.length;i++){
-if((typeof _13==="string")){
-if(_14[i].toString&&_14[i].toString()===_13){
+},hasAttribute:function(_e,_f){
+return (this.getValue(_e,_f)!==undefined);
+},containsValue:function(_10,_11,_12){
+var _13=this.getValues(_10,_11);
+for(var i=0;i<_13.length;i++){
+if((typeof _12==="string")){
+if(_13[i].toString&&_13[i].toString()===_12){
 return true;
 }
 }else{
-if(_14[i]===_13){
+if(_13[i]===_12){
 return true;
 }
 }
 }
 return false;
-},isItem:function(_16){
-if(_16&&_16.element&&_16.store&&_16.store===this){
+},isItem:function(_14){
+if(_14&&_14.element&&_14.store&&_14.store===this){
 return true;
 }
 return false;
-},isItemLoaded:function(_17){
-return this.isItem(_17);
-},loadItem:function(_18){
+},isItemLoaded:function(_15){
+return this.isItem(_15);
+},loadItem:function(_16){
 },getFeatures:function(){
-var _19={"dojo.data.api.Read":true};
-return _19;
-},getLabel:function(_1a){
-if((this.label!=="")&&this.isItem(_1a)){
-var _1b=this.getValue(_1a,this.label);
-if(_1b&&_1b.text){
-return _1b.text;
+var _17={"dojo.data.api.Read":true};
+return _17;
+},getLabel:function(_18){
+if((this.label!=="")&&this.isItem(_18)){
+var _19=this.getValue(_18,this.label);
+if(_19&&_19.text){
+return _19.text;
 }else{
-if(_1b){
-return _1b.toString();
+if(_19){
+return _19.toString();
 }else{
 return undefined;
 }
 }
 }
 return undefined;
-},getLabelAttributes:function(_1c){
+},getLabelAttributes:function(_1a){
 if(this.label!==""){
 return [this.label];
 }
 return null;
-},getFeedValue:function(_1d,_1e){
-var _1f=this.getFeedValues(_1d,_1e);
-if(dojo.isArray(_1f)){
-return _1f[0];
+},getFeedValue:function(_1b,_1c){
+var _1d=this.getFeedValues(_1b,_1c);
+if(dojo.isArray(_1d)){
+return _1d[0];
 }
-return _1f;
-},getFeedValues:function(_20,_21){
+return _1d;
+},getFeedValues:function(_1e,_1f){
 if(!this.doc){
-return _21;
+return _1f;
 }
 if(!this._feedMetaData){
 this._feedMetaData={element:this.doc.getElementsByTagName("feed")[0],store:this,_attribs:{}};
 this._parseItem(this._feedMetaData);
 }
-return this._feedMetaData._attribs[_20]||_21;
-},_initItem:function(_22){
-if(!_22._attribs){
-_22._attribs={};
+return this._feedMetaData._attribs[_1e]||_1f;
+},_initItem:function(_20){
+if(!_20._attribs){
+_20._attribs={};
 }
-},_fetchItems:function(_23,_24,_25){
-var url=this._getFetchUrl(_23);
+},_fetchItems:function(_21,_22,_23){
+var url=this._getFetchUrl(_21);
 if(!url){
-_25(new Error("No URL specified."));
+_23(new Error("No URL specified."));
 return;
 }
-var _27=(!this.sendQuery?_23:null);
-var _28=this;
-var _29=function(_2a){
-_28.doc=_2a;
-var _2b=_28._getItems(_2a,_27);
-var _2c=_23.query;
-if(_2c){
-if(_2c.id){
-_2b=dojo.filter(_2b,function(_2d){
-return (_28.getValue(_2d,"id")==_2c.id);
+var _24=(!this.sendQuery?_21:null);
+var _25=this;
+var _26=function(_27){
+_25.doc=_27;
+var _28=_25._getItems(_27,_24);
+var _29=_21.query;
+if(_29){
+if(_29.id){
+_28=dojo.filter(_28,function(_2a){
+return (_25.getValue(_2a,"id")==_29.id);
 });
 }else{
-if(_2c.category){
-_2b=dojo.filter(_2b,function(_2e){
-var _2f=_28.getValues(_2e,"category");
-if(!_2f){
+if(_29.category){
+_28=dojo.filter(_28,function(_2b){
+var _2c=_25.getValues(_2b,"category");
+if(!_2c){
 return false;
 }
-return dojo.some(_2f,"return item.term=='"+_2c.category+"'");
+return dojo.some(_2c,"return item.term=='"+_29.category+"'");
 });
 }
 }
 }
-if(_2b&&_2b.length>0){
-_24(_2b,_23);
+if(_28&&_28.length>0){
+_22(_28,_21);
 }else{
-_24([],_23);
+_22([],_21);
 }
 };
 if(this.doc){
-_29(this.doc);
+_26(this.doc);
 }else{
-var _30={url:url,handleAs:"xml"};
-var _31=dojo.xhrGet(_30);
-_31.addCallback(_29);
-_31.addErrback(function(_32){
-_25(_32,_23);
+var _2d={url:url,handleAs:"xml",preventCache:this.urlPreventCache};
+var _2e=dojo.xhrGet(_2d);
+_2e.addCallback(_26);
+_2e.addErrback(function(_2f){
+_23(_2f,_21);
 });
 }
-},_getFetchUrl:function(_33){
+},_getFetchUrl:function(_30){
 if(!this.sendQuery){
 return this.url;
 }
-var _34=_33.query;
-if(!_34){
+var _31=_30.query;
+if(!_31){
 return this.url;
 }
-if(dojo.isString(_34)){
-return this.url+_34;
+if(dojo.isString(_31)){
+return this.url+_31;
 }
-var _35="";
-for(var _36 in _34){
-var _37=_34[_36];
-if(_37){
-if(_35){
-_35+="&";
+var _32="";
+for(var _33 in _31){
+var _34=_31[_33];
+if(_34){
+if(_32){
+_32+="&";
 }
-_35+=(_36+"="+_37);
+_32+=(_33+"="+_34);
 }
 }
-if(!_35){
+if(!_32){
 return this.url;
 }
-var _38=this.url;
-if(_38.indexOf("?")<0){
-_38+="?";
+var _35=this.url;
+if(_35.indexOf("?")<0){
+_35+="?";
 }else{
-_38+="&";
+_35+="&";
 }
-return _38+_35;
-},_getItems:function(_39,_3a){
+return _35+_32;
+},_getItems:function(_36,_37){
 if(this._items){
 return this._items;
 }
-var _3b=[];
-var _3c=[];
-if(_39.childNodes.length<1){
-this._items=_3b;
-
-return _3b;
+var _38=[];
+var _39=[];
+if(_36.childNodes.length<1){
+this._items=_38;
+return _38;
 }
-var _3d=dojo.filter(_39.childNodes,"return item.tagName && item.tagName.toLowerCase() == 'feed'");
-var _3e=_3a.query;
-if(!_3d||_3d.length!=1){
-
-return _3b;
+var _3a=dojo.filter(_36.childNodes,"return item.tagName && item.tagName.toLowerCase() == 'feed'");
+var _3b=_37.query;
+if(!_3a||_3a.length!=1){
+return _38;
 }
-_3c=dojo.filter(_3d[0].childNodes,"return item.tagName && item.tagName.toLowerCase() == 'entry'");
-if(_3a.onBegin){
-_3a.onBegin(_3c.length,this.sendQuery?_3a:{});
+_39=dojo.filter(_3a[0].childNodes,"return item.tagName && item.tagName.toLowerCase() == 'entry'");
+if(_37.onBegin){
+_37.onBegin(_39.length,this.sendQuery?_37:{});
 }
-for(var i=0;i<_3c.length;i++){
-var _40=_3c[i];
-if(_40.nodeType!=1){
+for(var i=0;i<_39.length;i++){
+var _3c=_39[i];
+if(_3c.nodeType!=1){
 continue;
 }
-_3b.push(this._getItem(_40));
-}
-this._items=_3b;
-return _3b;
-},close:function(_41){
-},_getItem:function(_42){
-return {element:_42,store:this};
-},_parseItem:function(_43){
-var _44=_43._attribs;
-var _45=this;
-var _46,_47;
-function _48(_49){
-var txt=_49.textContent||_49.innerHTML||_49.innerXML;
-if(!txt&&_49.childNodes[0]){
-var _4b=_49.childNodes[0];
-if(_4b&&(_4b.nodeType==3||_4b.nodeType==4)){
-txt=_49.childNodes[0].nodeValue;
+_38.push(this._getItem(_3c));
+}
+this._items=_38;
+return _38;
+},close:function(_3d){
+},_getItem:function(_3e){
+return {element:_3e,store:this};
+},_parseItem:function(_3f){
+var _40=_3f._attribs;
+var _41=this;
+var _42,_43;
+function _44(_45){
+var txt=_45.textContent||_45.innerHTML||_45.innerXML;
+if(!txt&&_45.childNodes[0]){
+var _46=_45.childNodes[0];
+if(_46&&(_46.nodeType==3||_46.nodeType==4)){
+txt=_45.childNodes[0].nodeValue;
 }
 }
 return txt;
 };
-function _4c(_4d){
-return {text:_48(_4d),type:_4d.getAttribute("type")};
+function _47(_48){
+return {text:_44(_48),type:_48.getAttribute("type")};
 };
-dojo.forEach(_43.element.childNodes,function(_4e){
-var _4f=_4e.tagName?_4e.tagName.toLowerCase():"";
-switch(_4f){
+dojo.forEach(_3f.element.childNodes,function(_49){
+var _4a=_49.tagName?_49.tagName.toLowerCase():"";
+switch(_4a){
 case "title":
-_44[_4f]={text:_48(_4e),type:_4e.getAttribute("type")};
+_40[_4a]={text:_44(_49),type:_49.getAttribute("type")};
 break;
 case "subtitle":
 case "summary":
 case "content":
-_44[_4f]=_4c(_4e);
+_40[_4a]=_47(_49);
 break;
 case "author":
-var _50,_51;
-dojo.forEach(_4e.childNodes,function(_52){
-if(!_52.tagName){
+var _4b,_4c;
+dojo.forEach(_49.childNodes,function(_4d){
+if(!_4d.tagName){
 return;
 }
-switch(_52.tagName.toLowerCase()){
+switch(_4d.tagName.toLowerCase()){
 case "name":
-_50=_52;
+_4b=_4d;
 break;
 case "uri":
-_51=_52;
+_4c=_4d;
 break;
 }
 });
-var _53={};
-if(_50&&_50.length==1){
-_53.name=_48(_50[0]);
+var _4e={};
+if(_4b&&_4b.length==1){
+_4e.name=_44(_4b[0]);
 }
-if(_51&&_51.length==1){
-_53.uri=_48(_51[0]);
+if(_4c&&_4c.length==1){
+_4e.uri=_44(_4c[0]);
 }
-_44[_4f]=_53;
+_40[_4a]=_4e;
 break;
 case "id":
-_44[_4f]=_48(_4e);
+_40[_4a]=_44(_49);
 break;
 case "updated":
-_44[_4f]=dojo.date.stamp.fromISOString(_48(_4e));
+_40[_4a]=dojo.date.stamp.fromISOString(_44(_49));
 break;
 case "published":
-_44[_4f]=dojo.date.stamp.fromISOString(_48(_4e));
+_40[_4a]=dojo.date.stamp.fromISOString(_44(_49));
 break;
 case "category":
-if(!_44[_4f]){
-_44[_4f]=[];
+if(!_40[_4a]){
+_40[_4a]=[];
 }
-_44[_4f].push({scheme:_4e.getAttribute("scheme"),term:_4e.getAttribute("term")});
+_40[_4a].push({scheme:_49.getAttribute("scheme"),term:_49.getAttribute("term")});
 break;
 case "link":
-if(!_44[_4f]){
-_44[_4f]=[];
+if(!_40[_4a]){
+_40[_4a]=[];
 }
-var _54={rel:_4e.getAttribute("rel"),href:_4e.getAttribute("href"),type:_4e.getAttribute("type")};
-_44[_4f].push(_54);
-if(_54.rel=="alternate"){
-_44["alternate"]=_54;
+var _4f={rel:_49.getAttribute("rel"),href:_49.getAttribute("href"),type:_49.getAttribute("type")};
+_40[_4a].push(_4f);
+if(_4f.rel=="alternate"){
+_40["alternate"]=_4f;
 }
 break;
 default:
 break;
 }
 });
-},_unescapeHTML:function(_55){
-_55=_55.replace(/’/m,"'").replace(/″/m,"\"").replace(/</m,">").replace(/>/m,"<").replace(/&/m,"&");
-return _55;
-},_assertIsItem:function(_56){
-if(!this.isItem(_56)){
+},_unescapeHTML:function(_50){
+_50=_50.replace(/’/m,"'").replace(/″/m,"\"").replace(/</m,">").replace(/>/m,"<").replace(/&/m,"&");
+return _50;
+},_assertIsItem:function(_51){
+if(!this.isItem(_51)){
 throw new Error("dojox.data.AtomReadStore: Invalid item argument.");
 }
-},_assertIsAttribute:function(_57){
-if(typeof _57!=="string"){
+},_assertIsAttribute:function(_52){
+if(typeof _52!=="string"){
 throw new Error("dojox.data.AtomReadStore: Invalid attribute argument.");
 }
 }});
diff --git a/dojox/data/CdfStore.js b/dojox/data/CdfStore.js
new file mode 100644
index 0000000..b7596f8
--- /dev/null
+++ b/dojox/data/CdfStore.js
@@ -0,0 +1,318 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.data.CdfStore"]){
+dojo._hasResource["dojox.data.CdfStore"]=true;
+dojo.provide("dojox.data.CdfStore");
+dojo.require("dojo.data.util.sorter");
+dojox.data.ASYNC_MODE=0;
+dojox.data.SYNC_MODE=1;
+dojo.declare("dojox.data.CdfStore",null,{identity:"jsxid",url:"",xmlStr:"",data:null,label:"",mode:dojox.data.ASYNC_MODE,constructor:function(_1){
+if(_1){
+this.url=_1.url;
+this.xmlStr=_1.xmlStr||_1.str;
+if(_1.data){
+this.xmlStr=this._makeXmlString(_1.data);
+}
+this.identity=_1.identity||this.identity;
+this.label=_1.label||this.label;
+this.mode=_1.mode!==undefined?_1.mode:this.mode;
+}
+this._modifiedItems={};
+this.byId=this.fetchItemByIdentity;
+},getValue:function(_2,_3,_4){
+return _2.getAttribute(_3)||_4;
+},getValues:function(_5,_6){
+var v=this.getValue(_5,_6,[]);
+return dojo.isArray(v)?v:[v];
+},getAttributes:function(_7){
+return _7.getAttributeNames();
+},hasAttribute:function(_8,_9){
+return (this.getValue(_8,_9)!==undefined);
+},hasProperty:function(_a,_b){
+return this.hasAttribute(_a,_b);
+},containsValue:function(_c,_d,_e){
+var _f=this.getValues(_c,_d);
+for(var i=0;i<_f.length;i++){
+if(_f[i]===null){
+continue;
+}
+if((typeof _e==="string")){
+if(_f[i].toString&&_f[i].toString()===_e){
+return true;
+}
+}else{
+if(_f[i]===_e){
+return true;
+}
+}
+}
+return false;
+},isItem:function(_10){
+if(_10.getClass&&_10.getClass().equals(jsx3.xml.Entity.jsxclass)){
+return true;
+}
+return false;
+},isItemLoaded:function(_11){
+return this.isItem(_11);
+},loadItem:function(_12){
+},getFeatures:function(){
+return {"dojo.data.api.Read":true,"dojo.data.api.Write":true,"dojo.data.api.Identity":true};
+},getLabel:function(_13){
+if((this.label!=="")&&this.isItem(_13)){
+var _14=this.getValue(_13,this.label);
+if(_14){
+return _14.toString();
+}
+}
+return undefined;
+},getLabelAttributes:function(_15){
+if(this.label!==""){
+return [this.label];
+}
+return null;
+},fetch:function(_16){
+_16=_16||{};
+if(!_16.store){
+_16.store=this;
+}
+if(_16.mode!==undefined){
+this.mode=_16.mode;
+}
+var _17=this;
+var _18=function(_19){
+if(_16.onError){
+var _1a=_16.scope||dojo.global;
+_16.onError.call(_1a,_19,_16);
+}else{
+console.error("cdfStore Error:",_19);
+}
+};
+var _1b=function(_1c,_1d){
+_1d=_1d||_16;
+var _1e=_1d.abort||null;
+var _1f=false;
+var _20=_1d.start?_1d.start:0;
+var _21=(_1d.count&&(_1d.count!==Infinity))?(_20+_1d.count):_1c.length;
+_1d.abort=function(){
+_1f=true;
+if(_1e){
+_1e.call(_1d);
+}
+};
+var _22=_1d.scope||dojo.global;
+if(!_1d.store){
+_1d.store=_17;
+}
+if(_1d.onBegin){
+_1d.onBegin.call(_22,_1c.length,_1d);
+}
+if(_1d.sort){
+_1c.sort(dojo.data.util.sorter.createSortFunction(_1d.sort,_17));
+}
+if(_1d.onItem){
+for(var i=_20;(i<_1c.length)&&(i<_21);++i){
+var _23=_1c[i];
+if(!_1f){
+_1d.onItem.call(_22,_23,_1d);
+}
+}
+}
+if(_1d.onComplete&&!_1f){
+if(!_1d.onItem){
+_1c=_1c.slice(_20,_21);
+if(_1d.byId){
+_1c=_1c[0];
+}
+}
+_1d.onComplete.call(_22,_1c,_1d);
+}else{
+_1c=_1c.slice(_20,_21);
+if(_1d.byId){
+_1c=_1c[0];
+}
+}
+return _1c;
+};
+if(!this.url&&!this.data&&!this.xmlStr){
+_18(new Error("No URL or data specified."));
+return false;
+}
+var _24=_16||"*";
+if(this.mode==dojox.data.SYNC_MODE){
+var res=this._loadCDF();
+if(res instanceof Error){
+if(_16.onError){
+_16.onError.call(_16.scope||dojo.global,res,_16);
+}else{
+console.error("CdfStore Error:",res);
+}
+return res;
+}
+this.cdfDoc=res;
+var _25=this._getItems(this.cdfDoc,_24);
+if(_25&&_25.length>0){
+_25=_1b(_25,_16);
+}else{
+_25=_1b([],_16);
+}
+return _25;
+}else{
+var dfd=this._loadCDF();
+dfd.addCallbacks(dojo.hitch(this,function(_26){
+var _27=this._getItems(this.cdfDoc,_24);
+if(_27&&_27.length>0){
+_1b(_27,_16);
+}else{
+_1b([],_16);
+}
+}),dojo.hitch(this,function(err){
+_18(err,_16);
+}));
+return dfd;
+}
+},_loadCDF:function(){
+var dfd=new dojo.Deferred();
+if(this.cdfDoc){
+if(this.mode==dojox.data.SYNC_MODE){
+return this.cdfDoc;
+}else{
+setTimeout(dojo.hitch(this,function(){
+dfd.callback(this.cdfDoc);
+}),0);
+return dfd;
+}
+}
+this.cdfDoc=jsx3.xml.CDF.Document.newDocument();
+this.cdfDoc.subscribe("response",this,function(evt){
+dfd.callback(this.cdfDoc);
+});
+this.cdfDoc.subscribe("error",this,function(err){
+dfd.errback(err);
+});
+this.cdfDoc.setAsync(!this.mode);
+if(this.url){
+this.cdfDoc.load(this.url);
+}else{
+if(this.xmlStr){
+this.cdfDoc.loadXML(this.xmlStr);
+if(this.cdfDoc.getError().code){
+return new Error(this.cdfDoc.getError().description);
+}
+}
+}
+if(this.mode==dojox.data.SYNC_MODE){
+return this.cdfDoc;
+}else{
+return dfd;
+}
+},_getItems:function(_28,_29){
+var itr=_28.selectNodes(_29.query,false,1);
+var _2a=[];
+while(itr.hasNext()){
+_2a.push(itr.next());
+}
+return _2a;
+},close:function(_2b){
+},newItem:function(_2c,_2d){
+_2c=(_2c||{});
+if(_2c.tagName){
+if(_2c.tagName!="record"){
+console.warn("Only record inserts are supported at this time");
+}
+delete _2c.tagName;
+}
+_2c.jsxid=_2c.jsxid||this.cdfDoc.getKey();
+if(this.isItem(_2d)){
+_2d=this.getIdentity(_2d);
+}
+var _2e=this.cdfDoc.insertRecord(_2c,_2d);
+this._makeDirty(_2e);
+return _2e;
+},deleteItem:function(_2f){
+this.cdfDoc.deleteRecord(this.getIdentity(_2f));
+this._makeDirty(_2f);
+return true;
+},setValue:function(_30,_31,_32){
+this._makeDirty(_30);
+_30.setAttribute(_31,_32);
+return true;
+},setValues:function(_33,_34,_35){
+this._makeDirty(_33);
+console.warn("cdfStore.setValues only partially implemented.");
+return _33.setAttribute(_34,_35);
+},unsetAttribute:function(_36,_37){
+this._makeDirty(_36);
+_36.removeAttribute(_37);
+return true;
+},revert:function(){
+delete this.cdfDoc;
+this._modifiedItems={};
+return true;
+},isDirty:function(_38){
+if(_38){
+return !!this._modifiedItems[this.getIdentity(_38)];
+}else{
+var _39=false;
+for(var nm in this._modifiedItems){
+_39=true;
+break;
+}
+return _39;
+}
+},_makeDirty:function(_3a){
+var id=this.getIdentity(_3a);
+this._modifiedItems[id]=_3a;
+},_makeXmlString:function(obj){
+var _3b=function(obj,_3c){
+var _3d="";
+var nm;
+if(dojo.isArray(obj)){
+for(var i=0;i<obj.length;i++){
+_3d+=_3b(obj[i],_3c);
+}
+}else{
+if(dojo.isObject(obj)){
+_3d+="<"+_3c+" ";
+for(nm in obj){
+if(!dojo.isObject(obj[nm])){
+_3d+=nm+"=\""+obj[nm]+"\" ";
+}
+}
+_3d+=">";
+for(nm in obj){
+if(dojo.isObject(obj[nm])){
+_3d+=_3b(obj[nm],nm);
+}
+}
+_3d+="</"+_3c+">";
+}
+}
+return _3d;
+};
+return _3b(obj,"data");
+},getIdentity:function(_3e){
+return this.getValue(_3e,this.identity);
+},getIdentityAttributes:function(_3f){
+return [this.identity];
+},fetchItemByIdentity:function(_40){
+if(dojo.isString(_40)){
+var id=_40;
+_40={query:"//record[@jsxid='"+id+"']",mode:dojox.data.SYNC_MODE};
+}else{
+if(_40){
+_40.query="//record[@jsxid='"+_40.identity+"']";
+}
+if(!_40.mode){
+_40.mode=this.mode;
+}
+}
+_40.byId=true;
+return this.fetch(_40);
+},byId:function(_41){
+}});
+}
diff --git a/dojox/data/ClientFilter.js b/dojox/data/ClientFilter.js
index 6de020b..f160a90 100644
--- a/dojox/data/ClientFilter.js
+++ b/dojox/data/ClientFilter.js
@@ -11,158 +11,174 @@ dojo.provide("dojox.data.ClientFilter");
 dojo.require("dojo.data.util.filter");
 (function(){
 var cf;
-var _2=function(_3,_4,_5){
-return function(_6){
-_3._updates.push({create:_4&&_6,remove:_5&&_6});
+var _1=function(_2,_3,_4){
+return function(_5){
+_2._updates.push({create:_3&&_5,remove:_4&&_5});
 cf.onUpdate();
 };
 };
-cf=dojo.declare("dojox.data.ClientFilter",null,{constructor:function(){
-this.onSet=_2(this,true,true);
-this.onNew=_2(this,true,false);
-this.onDelete=_2(this,false,true);
+cf=dojo.declare("dojox.data.ClientFilter",null,{cacheByDefault:false,constructor:function(){
+this.onSet=_1(this,true,true);
+this.onNew=_1(this,true,false);
+this.onDelete=_1(this,false,true);
 this._updates=[];
 this._fetchCache=[];
-},updateResultSet:function(_7,_8){
-if(this.isUpdateable(_8)){
-for(var i=_8._version||0;i<this._updates.length;i++){
-var _a=this._updates[i].create;
-var _b=this._updates[i].remove;
-if(_b){
-for(var j=0;j<_7.length;j++){
-if(_7[j]==_b){
-_7.splice(j--,1);
-var _d=true;
+},clearCache:function(){
+this._fetchCache=[];
+},updateResultSet:function(_6,_7){
+if(this.isUpdateable(_7)){
+for(var i=_7._version||0;i<this._updates.length;i++){
+var _8=this._updates[i].create;
+var _9=this._updates[i].remove;
+if(_9){
+for(var j=0;j<_6.length;j++){
+if(_6[j]==_9){
+_6.splice(j--,1);
+var _a=true;
 }
 }
 }
-if(_a&&this.matchesQuery(_a,_8)&&dojo.indexOf(_7,_a)==-1){
-_7.push(_a);
-_d=true;
+if(_8&&this.matchesQuery(_8,_7)&&dojo.indexOf(_6,_8)==-1){
+_6.push(_8);
+_a=true;
 }
 }
-if(_8.sort&&_d){
-_7.sort(this.makeComparator(_8.sort.concat()));
+if(_7.sort&&_a){
+_6.sort(this.makeComparator(_7.sort.concat()));
 }
-if(_8.count&&_d){
-_7.splice(_8.count,_7.length);
+_6._fullLength=_6.length;
+if(_7.count&&_a&&_7.count!==Infinity){
+_6.splice(_7.count,_6.length);
 }
-_8._version=this._updates.length;
-return _d?2:1;
+_7._version=this._updates.length;
+return _a?2:1;
 }
 return 0;
-},querySuperSet:function(_e,_f){
-if(_e.query==_f.query){
+},querySuperSet:function(_b,_c){
+if(_b.query==_c.query){
 return {};
 }
-if(!(_f.query instanceof Object&&(!_e.query||typeof _e.query=="object"))){
+if(!(_c.query instanceof Object&&(!_b.query||typeof _b.query=="object"))){
 return false;
 }
-var _10=dojo.mixin({},_f.query);
-for(var i in _e.query){
-if(_10[i]==_e.query[i]){
-delete _10[i];
+var _d=dojo.mixin({},_c.query);
+for(var i in _b.query){
+if(_d[i]==_b.query[i]){
+delete _d[i];
 }else{
-if(!(typeof _e.query[i]=="string"&&dojo.data.util.filter.patternToRegExp(_e.query[i]).test(_10[i]))){
+if(!(typeof _b.query[i]=="string"&&dojo.data.util.filter.patternToRegExp(_b.query[i]).test(_d[i]))){
 return false;
 }
 }
 }
-return _10;
-},serverVersion:0,cachingFetch:function(_12){
-var _13=this;
+return _d;
+},serverVersion:0,cachingFetch:function(_e){
+var _f=this;
 for(var i=0;i<this._fetchCache.length;i++){
-var _15=this._fetchCache[i];
-var _16=this.querySuperSet(_15,_12);
-if(_16!==false){
-var _17=_15._loading;
-if(!_17){
-_17=new dojo.Deferred();
-_17.callback(_15.cacheResults);
-}
-_17.addCallback(function(_18){
-_18=_13.clientSideFetch({query:_16,sort:_12.sort,start:_12.start,count:_12.count},_18);
-_17.fullLength=_18._fullLength;
-return _18;
+var _10=this._fetchCache[i];
+var _11=this.querySuperSet(_10,_e);
+if(_11!==false){
+var _12=_10._loading;
+if(!_12){
+_12=new dojo.Deferred();
+_12.callback(_10.cacheResults);
+}
+_12.addCallback(function(_13){
+_13=_f.clientSideFetch(dojo.mixin(dojo.mixin({},_e),{query:_11}),_13);
+_12.fullLength=_13._fullLength;
+return _13;
+});
+_e._version=_10._version;
+break;
+}
+}
+if(!_12){
+var _14=dojo.mixin({},_e);
+var _15=(_e.queryOptions||0).cache;
+var _16=this._fetchCache;
+if(_15===undefined?this.cacheByDefault:_15){
+if(_e.start||_e.count){
+delete _14.start;
+delete _14.count;
+_e.clientQuery=dojo.mixin(_e.clientQuery||{},{start:_e.start,count:_e.count});
+}
+_e=_14;
+_16.push(_e);
+}
+_12=_e._loading=this._doQuery(_e);
+_12.addErrback(function(){
+_16.splice(dojo.indexOf(_16,_e),1);
 });
 }
+var _17=this.serverVersion;
+_12.addCallback(function(_18){
+delete _e._loading;
+if(_18){
+_e._version=typeof _e._version=="number"?_e._version:_17;
+_f.updateResultSet(_18,_e);
+_e.cacheResults=_18;
+if(!_e.count||_18.length<_e.count){
+_12.fullLength=((_e.start)?_e.start:0)+_18.length;
 }
-if(!_17){
-var _19=dojo.mixin({},_12);
-var _1a=(_12.queryOptions||0).cache;
-if(_1a===undefined?this.cacheByDefault:_1a){
-if(_12.start||_12.count){
-delete _19.start;
-delete _19.count;
-_12.clientQuery=dojo.mixin(_12.clientQuery||{},{start:_12.start,count:_12.count});
-}
-_12=_19;
-this._fetchCache.push(_12);
-}
-_17=_12._loading=this._doQuery(_12);
-}
-var _1b=this.serverVersion;
-_17.addCallback(function(_1c){
-delete _12._loading;
-if(_1c){
-_12._version=_1b;
-_13.updateResultSet(_1c,_12);
-_12.cacheResults=_1c;
 }
-return _1c;
+return _18;
 });
-return _17;
-},isUpdateable:function(_1d){
-return typeof _1d.query=="object";
-},clientSideFetch:function(_1e,_1f){
-if(_1e.query){
-var _20=[];
-for(var i=0;i<_1f.length;i++){
-var _22=_1f[i];
-if(_22&&this.matchesQuery(_22,_1e)){
-_20.push(_1f[i]);
+return _12;
+},isUpdateable:function(_19){
+return typeof _19.query=="object";
+},clientSideFetch:function(_1a,_1b){
+if(_1a.queryOptions&&_1a.queryOptions.results){
+_1b=_1a.queryOptions.results;
+}
+if(_1a.query){
+var _1c=[];
+for(var i=0;i<_1b.length;i++){
+var _1d=_1b[i];
+if(_1d&&this.matchesQuery(_1d,_1a)){
+_1c.push(_1b[i]);
 }
 }
 }else{
-_20=_1e.sort?_1f.concat():_1f;
-}
-if(_1e.sort){
-_20.sort(this.makeComparator(_1e.sort.concat()));
-}
-return this.clientSidePaging(_1e,_20);
-},clientSidePaging:function(_23,_24){
-var _25=_23.start||0;
-var _26=(_25||_23.count)?_24.slice(_25,_25+(_23.count||_24.length)):_24;
-_26._fullLength=_24.length;
-return _26;
-},matchesQuery:function(_27,_28){
-var _29=_28.query;
-var _2a=_28.queryOptions&&_28.queryOptions.ignoreCase;
-for(var i in _29){
-var _2c=_29[i];
-var _2d=this.getValue(_27,i);
-if((typeof _2c=="string"&&(_2c.match(/[\*\.]/)||_2a))?!dojo.data.util.filter.patternToRegExp(_2c,_2a).test(_2d):_2d!=_2c){
+_1c=_1a.sort?_1b.concat():_1b;
+}
+if(_1a.sort){
+_1c.sort(this.makeComparator(_1a.sort.concat()));
+}
+return this.clientSidePaging(_1a,_1c);
+},clientSidePaging:function(_1e,_1f){
+var _20=_1e.start||0;
+var _21=(_20||_1e.count)?_1f.slice(_20,_20+(_1e.count||_1f.length)):_1f;
+_21._fullLength=_1f.length;
+return _21;
+},matchesQuery:function(_22,_23){
+var _24=_23.query;
+var _25=_23.queryOptions&&_23.queryOptions.ignoreCase;
+for(var i in _24){
+var _26=_24[i];
+var _27=this.getValue(_22,i);
+if((typeof _26=="string"&&(_26.match(/[\*\.]/)||_25))?!dojo.data.util.filter.patternToRegExp(_26,_25).test(_27):_27!=_26){
 return false;
 }
 }
 return true;
-},makeComparator:function(_2e){
-var _2f=_2e.shift();
-if(!_2f){
+},makeComparator:function(_28){
+var _29=_28.shift();
+if(!_29){
 return function(){
+return 0;
 };
 }
-var _30=_2f.attribute;
-var _31=!!_2f.descending;
-var _32=this.makeComparator(_2e);
-var _33=this;
+var _2a=_29.attribute;
+var _2b=!!_29.descending;
+var _2c=this.makeComparator(_28);
+var _2d=this;
 return function(a,b){
-var av=_33.getValue(a,_30);
-var bv=_33.getValue(b,_30);
+var av=_2d.getValue(a,_2a);
+var bv=_2d.getValue(b,_2a);
 if(av!=bv){
-return av<bv==_31?1:-1;
+return av<bv==_2b?1:-1;
 }
-return _32(a,b);
+return _2c(a,b);
 };
 }});
 cf.onUpdate=function(){
diff --git a/dojox/data/CouchDBRestStore.js b/dojox/data/CouchDBRestStore.js
index 24760cb..629d91e 100644
--- a/dojox/data/CouchDBRestStore.js
+++ b/dojox/data/CouchDBRestStore.js
@@ -13,52 +13,53 @@ dojo.declare("dojox.data.CouchDBRestStore",dojox.data.JsonRestStore,{save:functi
 var _2=this.inherited(arguments);
 var _3=this.service.servicePath;
 for(var i=0;i<_2.length;i++){
-(function(_5,_6){
-_6.addCallback(function(_7){
-if(_7){
-_5.__id=_3+_7.id;
-_5._rev=_7.rev;
+(function(_4,_5){
+_5.addCallback(function(_6){
+if(_6){
+_4.__id=_3+_6.id;
+_4._rev=_6.rev;
 }
-return _7;
+return _6;
 });
 })(_2[i].content,_2[i].deferred);
 }
-},fetch:function(_8){
-_8.query=_8.query||"_all_docs?";
-if(_8.start){
-_8.query=(_8.query?(_8.query+"&"):"")+"startkey="+_8.start;
-delete _8.start;
+},fetch:function(_7){
+_7.query=_7.query||"_all_docs?";
+if(_7.start){
+_7.query=(_7.query?(_7.query+"&"):"")+"startkey="+_7.start;
+delete _7.start;
 }
-if(_8.count){
-_8.query=(_8.query?(_8.query+"&"):"")+"count="+_8.count;
-delete _8.count;
+if(_7.count){
+_7.query=(_7.query?(_7.query+"&"):"")+"limit="+_7.count;
+delete _7.count;
 }
 return this.inherited(arguments);
-},_processResults:function(_9){
-var _a=_9.rows;
-if(_a){
-var _b=this.service.servicePath;
-var _c=this;
-for(var i=0;i<_a.length;i++){
-_a[i]={__id:_b+_a[i].id,_id:_a[i].id,_loadObject:function(_e){
-_c.fetchItemByIdentity({identity:this._id,onItem:_e});
-delete this._loadObject;
-}};
+},_processResults:function(_8){
+var _9=_8.rows;
+if(_9){
+var _a=this.service.servicePath;
+var _b=this;
+for(var i=0;i<_9.length;i++){
+var _c=_9[i].value;
+_c.__id=_a+_9[i].id;
+_c._id=_9[i].id;
+_c._loadObject=dojox.rpc.JsonRest._loader;
+_9[i]=_c;
 }
-return {totalCount:_9.total_rows,items:_9.rows};
+return {totalCount:_8.total_rows,items:_8.rows};
 }else{
-return {items:_9};
+return {items:_8};
 }
 }});
-dojox.data.CouchDBRestStore.getStores=function(_f){
-var dfd=dojo.xhrGet({url:_f+"_all_dbs",handleAs:"json",sync:true});
-var _11={};
-dfd.addBoth(function(dbs){
+dojox.data.CouchDBRestStore.getStores=function(_d){
+var _e=dojo.xhrGet({url:_d+"_all_dbs",handleAs:"json",sync:true});
+var _f={};
+_e.addBoth(function(dbs){
 for(var i=0;i<dbs.length;i++){
-_11[dbs[i]]=new dojox.data.CouchDBRestStore({target:_f+dbs[i],idAttribute:"_id"});
+_f[dbs[i]]=new dojox.data.CouchDBRestStore({target:_d+dbs[i],idAttribute:"_id"});
 }
-return _11;
+return _f;
 });
-return _11;
+return _f;
 };
 }
diff --git a/dojox/data/CssClassStore.js b/dojox/data/CssClassStore.js
index bd5c1cb..a928f4e 100644
--- a/dojox/data/CssClassStore.js
+++ b/dojox/data/CssClassStore.js
@@ -36,69 +36,69 @@ return _8;
 var _c={};
 var s=_9["selectorText"].split(" ");
 for(var j=0;j<s.length;j++){
-var _f=s[j];
-var _10=_f.indexOf(".");
-if(_f&&_f.length>0&&_10!==-1){
-var _11=_f.indexOf(",")||_f.indexOf("[");
-_f=_f.substring(_10,((_11!==-1&&_11>_10)?_11:_f.length));
-_c[_f]=true;
+var _d=s[j];
+var _e=_d.indexOf(".");
+if(_d&&_d.length>0&&_e!==-1){
+var _f=_d.indexOf(",")||_d.indexOf("[");
+_d=_d.substring(_e,((_f!==-1&&_f>_e)?_f:_d.length));
+_c[_d]=true;
 }
 }
 for(var key in _c){
 if(!this._allItems[key]){
-var _13={};
-_13.className=key;
-_13[this._storeRef]=this;
-this._allItems[key]=_13;
+var _10={};
+_10.className=key;
+_10[this._storeRef]=this;
+this._allItems[key]=_10;
 }
 }
 },_handleReturn:function(){
-var _14=[];
-var _15={};
+var _11=[];
+var _12={};
 for(var i in this._allItems){
-_15[i]=this._allItems[i];
+_12[i]=this._allItems[i];
 }
-var _17;
+var _13;
 while(this._pending.length){
-_17=this._pending.pop();
-_17.request._items=_15;
-_14.push(_17);
-}
-while(_14.length){
-_17=_14.pop();
-if(_17.fetch){
-this._handleFetchReturn(_17.request);
+_13=this._pending.pop();
+_13.request._items=_12;
+_11.push(_13);
+}
+while(_11.length){
+_13=_11.pop();
+if(_13.fetch){
+this._handleFetchReturn(_13.request);
 }else{
-this._handleFetchByIdentityReturn(_17.request);
+this._handleFetchByIdentityReturn(_13.request);
 }
 }
-},_handleFetchByIdentityReturn:function(_18){
-var _19=_18._items;
-var _1a=_19[(dojo.isWebKit?_18.identity.toLowerCase():_18.identity)];
-if(!this.isItem(_1a)){
-_1a=null;
+},_handleFetchByIdentityReturn:function(_14){
+var _15=_14._items;
+var _16=_15[(dojo.isWebKit?_14.identity.toLowerCase():_14.identity)];
+if(!this.isItem(_16)){
+_16=null;
 }
-if(_18.onItem){
-var _1b=_18.scope||dojo.global;
-_18.onItem.call(_1b,_1a);
+if(_14.onItem){
+var _17=_14.scope||dojo.global;
+_14.onItem.call(_17,_16);
 }
-},getIdentity:function(_1c){
-this._assertIsItem(_1c);
-return this.getValue(_1c,this._idAttribute);
-},getIdentityAttributes:function(_1d){
-this._assertIsItem(_1d);
+},getIdentity:function(_18){
+this._assertIsItem(_18);
+return this.getValue(_18,this._idAttribute);
+},getIdentityAttributes:function(_19){
+this._assertIsItem(_19);
 return [this._idAttribute];
-},fetchItemByIdentity:function(_1e){
-_1e=_1e||{};
-if(!_1e.store){
-_1e.store=this;
+},fetchItemByIdentity:function(_1a){
+_1a=_1a||{};
+if(!_1a.store){
+_1a.store=this;
 }
 if(this._pending&&this._pending.length>0){
-this._pending.push({request:_1e});
+this._pending.push({request:_1a});
 }else{
-this._pending=[{request:_1e}];
-this._fetch(_1e);
+this._pending=[{request:_1a}];
+this._fetch(_1a);
 }
-return _1e;
+return _1a;
 }});
 }
diff --git a/dojox/data/CssRuleStore.js b/dojox/data/CssRuleStore.js
index 4daa93c..b0a1b8d 100644
--- a/dojox/data/CssRuleStore.js
+++ b/dojox/data/CssRuleStore.js
@@ -191,142 +191,142 @@ this._handleReturn();
 },_handleRule:function(_23,_24,_25){
 var _26=_23["selectorText"];
 var s=_26.split(" ");
-var _28=[];
+var _27=[];
 for(var j=0;j<s.length;j++){
 var tmp=s[j];
-var _2b=tmp.indexOf(".");
-if(tmp&&tmp.length>0&&_2b!==-1){
-var _2c=tmp.indexOf(",")||tmp.indexOf("[");
-tmp=tmp.substring(_2b,((_2c!==-1&&_2c>_2b)?_2c:tmp.length));
-_28.push(tmp);
-}
-}
-var _2d={};
-_2d.rule=_23;
-_2d.styleSheet=_24;
-_2d.href=_25;
-_2d.classes=_28;
-_2d[this._storeRef]=this;
+var _28=tmp.indexOf(".");
+if(tmp&&tmp.length>0&&_28!==-1){
+var _29=tmp.indexOf(",")||tmp.indexOf("[");
+tmp=tmp.substring(_28,((_29!==-1&&_29>_28)?_29:tmp.length));
+_27.push(tmp);
+}
+}
+var _2a={};
+_2a.rule=_23;
+_2a.styleSheet=_24;
+_2a.href=_25;
+_2a.classes=_27;
+_2a[this._storeRef]=this;
 if(!this._allItems[_26]){
 this._allItems[_26]=[];
 }
-this._allItems[_26].push(_2d);
+this._allItems[_26].push(_2a);
 },_handleReturn:function(){
-var _2e=[];
-var _2f=[];
-var _30=null;
+var _2b=[];
+var _2c=[];
+var _2d=null;
 for(var i in this._allItems){
-_30=this._allItems[i];
-for(var j in _30){
-_2f.push(_30[j]);
+_2d=this._allItems[i];
+for(var j in _2d){
+_2c.push(_2d[j]);
 }
 }
-var _33;
+var _2e;
 while(this._pending.length){
-_33=this._pending.pop();
-_33.request._items=_2f;
-_2e.push(_33);
-}
-while(_2e.length){
-_33=_2e.pop();
-this._handleFetchReturn(_33.request);
-}
-},_handleFetchReturn:function(_34){
-var _35=_34.scope||dojo.global;
-var _36=[];
-var _37="all";
+_2e=this._pending.pop();
+_2e.request._items=_2c;
+_2b.push(_2e);
+}
+while(_2b.length){
+_2e=_2b.pop();
+this._handleFetchReturn(_2e.request);
+}
+},_handleFetchReturn:function(_2f){
+var _30=_2f.scope||dojo.global;
+var _31=[];
+var _32="all";
 var i;
-if(_34.query){
-_37=dojo.toJson(_34.query);
+if(_2f.query){
+_32=dojo.toJson(_2f.query);
 }
-if(this._cache[_37]){
-_36=this._cache[_37];
+if(this._cache[_32]){
+_31=this._cache[_32];
 }else{
-if(_34.query){
-for(i in _34._items){
-var _39=_34._items[i];
-var _3a=dojo.isWebKit?true:(_34.queryOptions?_34.queryOptions.ignoreCase:false);
-var _3b={};
+if(_2f.query){
+for(i in _2f._items){
+var _33=_2f._items[i];
+var _34=dojo.isWebKit?true:(_2f.queryOptions?_2f.queryOptions.ignoreCase:false);
+var _35={};
 var key;
-var _3d;
-for(key in _34.query){
-_3d=_34.query[key];
-if(typeof _3d==="string"){
-_3b[key]=dojo.data.util.filter.patternToRegExp(_3d,_3a);
+var _36;
+for(key in _2f.query){
+_36=_2f.query[key];
+if(typeof _36==="string"){
+_35[key]=dojo.data.util.filter.patternToRegExp(_36,_34);
 }
 }
-var _3e=true;
-for(key in _34.query){
-_3d=_34.query[key];
-if(!this._containsValue(_39,key,_3d,_3b[key])){
-_3e=false;
+var _37=true;
+for(key in _2f.query){
+_36=_2f.query[key];
+if(!this._containsValue(_33,key,_36,_35[key])){
+_37=false;
 }
 }
-if(_3e){
-_36.push(_39);
+if(_37){
+_31.push(_33);
 }
 }
-this._cache[_37]=_36;
+this._cache[_32]=_31;
 }else{
-for(i in _34._items){
-_36.push(_34._items[i]);
+for(i in _2f._items){
+_31.push(_2f._items[i]);
 }
 }
 }
-var _3f=_36.length;
-if(_34.sort){
-_36.sort(dojo.data.util.sorter.createSortFunction(_34.sort,this));
+var _38=_31.length;
+if(_2f.sort){
+_31.sort(dojo.data.util.sorter.createSortFunction(_2f.sort,this));
 }
-var _40=0;
-var _41=_36.length;
-if(_34.start>0&&_34.start<_36.length){
-_40=_34.start;
+var _39=0;
+var _3a=_31.length;
+if(_2f.start>0&&_2f.start<_31.length){
+_39=_2f.start;
 }
-if(_34.count&&_34.count){
-_41=_34.count;
+if(_2f.count&&_2f.count){
+_3a=_2f.count;
 }
-var _42=_40+_41;
-if(_42>_36.length){
-_42=_36.length;
+var _3b=_39+_3a;
+if(_3b>_31.length){
+_3b=_31.length;
 }
-_36=_36.slice(_40,_42);
-if(_34.onBegin){
-_34.onBegin.call(_35,_3f,_34);
+_31=_31.slice(_39,_3b);
+if(_2f.onBegin){
+_2f.onBegin.call(_30,_38,_2f);
 }
-if(_34.onItem){
-if(dojo.isArray(_36)){
-for(i=0;i<_36.length;i++){
-_34.onItem.call(_35,_36[i],_34);
+if(_2f.onItem){
+if(dojo.isArray(_31)){
+for(i=0;i<_31.length;i++){
+_2f.onItem.call(_30,_31[i],_2f);
 }
-if(_34.onComplete){
-_34.onComplete.call(_35,null,_34);
+if(_2f.onComplete){
+_2f.onComplete.call(_30,null,_2f);
 }
 }
 }else{
-if(_34.onComplete){
-_34.onComplete.call(_35,_36,_34);
+if(_2f.onComplete){
+_2f.onComplete.call(_30,_31,_2f);
 }
 }
-return _34;
+return _2f;
 },close:function(){
 this._cache={};
 this._allItems=null;
-},_assertIsItem:function(_43){
-if(!this.isItem(_43)){
+},_assertIsItem:function(_3c){
+if(!this.isItem(_3c)){
 throw new Error(this._cName+": Invalid item argument.");
 }
-},_assertIsAttribute:function(_44){
-if(typeof _44!=="string"){
+},_assertIsAttribute:function(_3d){
+if(typeof _3d!=="string"){
 throw new Error(this._cName+": Invalid attribute argument.");
 }
-},_containsValue:function(_45,_46,_47,_48){
-return dojo.some(this.getValues(_45,_46),function(_49){
-if(_49!==null&&!dojo.isObject(_49)&&_48){
-if(_49.toString().match(_48)){
+},_containsValue:function(_3e,_3f,_40,_41){
+return dojo.some(this.getValues(_3e,_3f),function(_42){
+if(_42!==null&&!dojo.isObject(_42)&&_41){
+if(_42.toString().match(_41)){
 return true;
 }
 }else{
-if(_47===_49){
+if(_40===_42){
 return true;
 }
 }
diff --git a/dojox/data/CsvStore.js b/dojox/data/CsvStore.js
index 5e8456b..4a5353b 100644
--- a/dojox/data/CsvStore.js
+++ b/dojox/data/CsvStore.js
@@ -38,274 +38,294 @@ delete this.identifier;
 }else{
 this._idMap={};
 }
-},url:"",label:"",identifier:"",_assertIsItem:function(_2){
+if("separator" in _1){
+this.separator=_1.separator;
+}
+if("urlPreventCache" in _1){
+this.urlPreventCache=_1.urlPreventCache?true:false;
+}
+},url:"",label:"",identifier:"",separator:",",urlPreventCache:false,_assertIsItem:function(_2){
 if(!this.isItem(_2)){
 throw new Error(this.declaredClass+": a function was passed an item argument that was not an item");
 }
-},_assertIsAttribute:function(_3){
-if(!dojo.isString(_3)){
-throw new Error(this.declaredClass+": a function was passed an attribute argument that was not an attribute object nor an attribute name string");
-}
-},_getIndex:function(_4){
-var _5=this.getIdentity(_4);
+},_getIndex:function(_3){
+var _4=this.getIdentity(_3);
 if(this.identifier){
-_5=this._idMap[_5];
-}
-return _5;
-},getValue:function(_6,_7,_8){
-this._assertIsItem(_6);
-this._assertIsAttribute(_7);
-var _9=_8;
-if(this.hasAttribute(_6,_7)){
-var _a=this._dataArray[this._getIndex(_6)];
-_9=_a[this._attributeIndexes[_7]];
-}
-return _9;
-},getValues:function(_b,_c){
-var _d=this.getValue(_b,_c);
-return (_d?[_d]:[]);
-},getAttributes:function(_e){
-this._assertIsItem(_e);
-var _f=[];
-var _10=this._dataArray[this._getIndex(_e)];
-for(var i=0;i<_10.length;i++){
-if(_10[i]!==""){
-_f.push(this._attributes[i]);
-}
-}
-return _f;
-},hasAttribute:function(_12,_13){
-this._assertIsItem(_12);
-this._assertIsAttribute(_13);
-var _14=this._attributeIndexes[_13];
-var _15=this._dataArray[this._getIndex(_12)];
-return (typeof _14!=="undefined"&&_14<_15.length&&_15[_14]!=="");
-},containsValue:function(_16,_17,_18){
-var _19=undefined;
-if(typeof _18==="string"){
-_19=dojo.data.util.filter.patternToRegExp(_18,false);
-}
-return this._containsValue(_16,_17,_18,_19);
-},_containsValue:function(_1a,_1b,_1c,_1d){
-var _1e=this.getValues(_1a,_1b);
-for(var i=0;i<_1e.length;++i){
-var _20=_1e[i];
-if(typeof _20==="string"&&_1d){
-return (_20.match(_1d)!==null);
+_4=this._idMap[_4];
+}
+return _4;
+},getValue:function(_5,_6,_7){
+this._assertIsItem(_5);
+var _8=_7;
+if(typeof _6==="string"){
+var ai=this._attributeIndexes[_6];
+if(ai!=null){
+var _9=this._dataArray[this._getIndex(_5)];
+_8=_9[ai]||_7;
+}
+}else{
+throw new Error(this.declaredClass+": a function was passed an attribute argument that was not a string");
+}
+return _8;
+},getValues:function(_a,_b){
+var _c=this.getValue(_a,_b);
+return (_c?[_c]:[]);
+},getAttributes:function(_d){
+this._assertIsItem(_d);
+var _e=[];
+var _f=this._dataArray[this._getIndex(_d)];
+for(var i=0;i<_f.length;i++){
+if(_f[i]!==""){
+_e.push(this._attributes[i]);
+}
+}
+return _e;
+},hasAttribute:function(_10,_11){
+this._assertIsItem(_10);
+if(typeof _11==="string"){
+var _12=this._attributeIndexes[_11];
+var _13=this._dataArray[this._getIndex(_10)];
+return (typeof _12!=="undefined"&&_12<_13.length&&_13[_12]!=="");
+}else{
+throw new Error(this.declaredClass+": a function was passed an attribute argument that was not a string");
+}
+},containsValue:function(_14,_15,_16){
+var _17=undefined;
+if(typeof _16==="string"){
+_17=dojo.data.util.filter.patternToRegExp(_16,false);
+}
+return this._containsValue(_14,_15,_16,_17);
+},_containsValue:function(_18,_19,_1a,_1b){
+var _1c=this.getValues(_18,_19);
+for(var i=0;i<_1c.length;++i){
+var _1d=_1c[i];
+if(typeof _1d==="string"&&_1b){
+return (_1d.match(_1b)!==null);
 }else{
-if(_1c===_20){
+if(_1a===_1d){
 return true;
 }
 }
 }
 return false;
-},isItem:function(_21){
-if(_21&&_21[this._storeProp]===this){
-var _22=_21[this._idProp];
+},isItem:function(_1e){
+if(_1e&&_1e[this._storeProp]===this){
+var _1f=_1e[this._idProp];
 if(this.identifier){
-var _23=this._dataArray[this._idMap[_22]];
-if(_23){
+var _20=this._dataArray[this._idMap[_1f]];
+if(_20){
 return true;
 }
 }else{
-if(_22>=0&&_22<this._dataArray.length){
+if(_1f>=0&&_1f<this._dataArray.length){
 return true;
 }
 }
 }
 return false;
-},isItemLoaded:function(_24){
-return this.isItem(_24);
-},loadItem:function(_25){
+},isItemLoaded:function(_21){
+return this.isItem(_21);
+},loadItem:function(_22){
 },getFeatures:function(){
 return this._features;
-},getLabel:function(_26){
-if(this.label&&this.isItem(_26)){
-return this.getValue(_26,this.label);
+},getLabel:function(_23){
+if(this.label&&this.isItem(_23)){
+return this.getValue(_23,this.label);
 }
 return undefined;
-},getLabelAttributes:function(_27){
+},getLabelAttributes:function(_24){
 if(this.label){
 return [this.label];
 }
 return null;
-},_fetchItems:function(_28,_29,_2a){
-var _2b=this;
-var _2c=function(_2d,_2e){
-var _2f=null;
-if(_2d.query){
-var key,_31;
-_2f=[];
-var _32=_2d.queryOptions?_2d.queryOptions.ignoreCase:false;
-var _33={};
-for(key in _2d.query){
-_31=_2d.query[key];
-if(typeof _31==="string"){
-_33[key]=dojo.data.util.filter.patternToRegExp(_31,_32);
-}
-}
-for(var i=0;i<_2e.length;++i){
-var _35=true;
-var _36=_2e[i];
-for(key in _2d.query){
-_31=_2d.query[key];
-if(!_2b._containsValue(_36,key,_31,_33[key])){
-_35=false;
-}
-}
-if(_35){
-_2f.push(_36);
+},_fetchItems:function(_25,_26,_27){
+var _28=this;
+var _29=function(_2a,_2b){
+var _2c=null;
+if(_2a.query){
+var key,_2d;
+_2c=[];
+var _2e=_2a.queryOptions?_2a.queryOptions.ignoreCase:false;
+var _2f={};
+for(key in _2a.query){
+_2d=_2a.query[key];
+if(typeof _2d==="string"){
+_2f[key]=dojo.data.util.filter.patternToRegExp(_2d,_2e);
+}
+}
+for(var i=0;i<_2b.length;++i){
+var _30=true;
+var _31=_2b[i];
+for(key in _2a.query){
+_2d=_2a.query[key];
+if(!_28._containsValue(_31,key,_2d,_2f[key])){
+_30=false;
+}
+}
+if(_30){
+_2c.push(_31);
 }
 }
 }else{
-if(_2e.length>0){
-_2f=_2e.slice(0,_2e.length);
+_2c=_2b.slice(0,_2b.length);
 }
-}
-_29(_2f,_2d);
+_26(_2c,_2a);
 };
 if(this._loadFinished){
-_2c(_28,this._arrayOfAllItems);
+_29(_25,this._arrayOfAllItems);
 }else{
 if(this.url!==""){
 if(this._loadInProgress){
-this._queuedFetches.push({args:_28,filter:_2c});
+this._queuedFetches.push({args:_25,filter:_29});
 }else{
 this._loadInProgress=true;
-var _37={url:_2b.url,handleAs:"text"};
-var _38=dojo.xhrGet(_37);
-_38.addCallback(function(_39){
+var _32={url:_28.url,handleAs:"text",preventCache:_28.urlPreventCache};
+var _33=dojo.xhrGet(_32);
+_33.addCallback(function(_34){
 try{
-_2b._processData(_39);
-_2c(_28,_2b._arrayOfAllItems);
-_2b._handleQueuedFetches();
+_28._processData(_34);
+_29(_25,_28._arrayOfAllItems);
+_28._handleQueuedFetches();
 }
 catch(e){
-_2a(e,_28);
+_27(e,_25);
 }
 });
-_38.addErrback(function(_3a){
-_2b._loadInProgress=false;
-if(_2a){
-_2a(_3a,_28);
+_33.addErrback(function(_35){
+_28._loadInProgress=false;
+if(_27){
+_27(_35,_25);
 }else{
-throw _3a;
+throw _35;
 }
 });
+var _36=null;
+if(_25.abort){
+_36=_25.abort;
+}
+_25.abort=function(){
+var df=_33;
+if(df&&df.fired===-1){
+df.cancel();
+df=null;
+}
+if(_36){
+_36.call(_25);
+}
+};
 }
 }else{
 if(this._csvData){
 try{
 this._processData(this._csvData);
 this._csvData=null;
-_2c(_28,this._arrayOfAllItems);
+_29(_25,this._arrayOfAllItems);
 }
 catch(e){
-_2a(e,_28);
+_27(e,_25);
 }
 }else{
-var _3b=new Error(this.declaredClass+": No CSV source data was provided as either URL or String data input.");
-if(_2a){
-_2a(_3b,_28);
+var _37=new Error(this.declaredClass+": No CSV source data was provided as either URL or String data input.");
+if(_27){
+_27(_37,_25);
 }else{
-throw _3b;
+throw _37;
 }
 }
 }
 }
-},close:function(_3c){
-},_getArrayOfArraysFromCsvFileContents:function(_3d){
-if(dojo.isString(_3d)){
-var _3e=new RegExp("\r\n|\n|\r");
-var _3f=new RegExp("^\\s+","g");
-var _40=new RegExp("\\s+$","g");
-var _41=new RegExp("\"\"","g");
-var _42=[];
+},close:function(_38){
+},_getArrayOfArraysFromCsvFileContents:function(_39){
+if(dojo.isString(_39)){
+var _3a=new RegExp("^\\s+","g");
+var _3b=new RegExp("\\s+$","g");
+var _3c=new RegExp("\"\"","g");
+var _3d=[];
 var i;
-var _44=this._splitLines(_3d);
-for(i=0;i<_44.length;++i){
-var _45=_44[i];
-if(_45.length>0){
-var _46=_45.split(",");
+var _3e=this._splitLines(_39);
+for(i=0;i<_3e.length;++i){
+var _3f=_3e[i];
+if(_3f.length>0){
+var _40=_3f.split(this.separator);
 var j=0;
-while(j<_46.length){
-var _48=_46[j];
-var _49=_48.replace(_3f,"");
-var _4a=_49.replace(_40,"");
-var _4b=_4a.charAt(0);
-var _4c=_4a.charAt(_4a.length-1);
-var _4d=_4a.charAt(_4a.length-2);
-var _4e=_4a.charAt(_4a.length-3);
-if(_4a.length===2&&_4a=="\"\""){
-_46[j]="";
+while(j<_40.length){
+var _41=_40[j];
+var _42=_41.replace(_3a,"");
+var _43=_42.replace(_3b,"");
+var _44=_43.charAt(0);
+var _45=_43.charAt(_43.length-1);
+var _46=_43.charAt(_43.length-2);
+var _47=_43.charAt(_43.length-3);
+if(_43.length===2&&_43=="\"\""){
+_40[j]="";
 }else{
-if((_4b=="\"")&&((_4c!="\"")||((_4c=="\"")&&(_4d=="\"")&&(_4e!="\"")))){
-if(j+1===_46.length){
-return null;
+if((_44=="\"")&&((_45!="\"")||((_45=="\"")&&(_46=="\"")&&(_47!="\"")))){
+if(j+1===_40.length){
+return;
 }
-var _4f=_46[j+1];
-_46[j]=_49+","+_4f;
-_46.splice(j+1,1);
+var _48=_40[j+1];
+_40[j]=_42+this.separator+_48;
+_40.splice(j+1,1);
 }else{
-if((_4b=="\"")&&(_4c=="\"")){
-_4a=_4a.slice(1,(_4a.length-1));
-_4a=_4a.replace(_41,"\"");
+if((_44=="\"")&&(_45=="\"")){
+_43=_43.slice(1,(_43.length-1));
+_43=_43.replace(_3c,"\"");
 }
-_46[j]=_4a;
+_40[j]=_43;
 j+=1;
 }
 }
 }
-_42.push(_46);
+_3d.push(_40);
 }
 }
-this._attributes=_42.shift();
+this._attributes=_3d.shift();
 for(i=0;i<this._attributes.length;i++){
 this._attributeIndexes[this._attributes[i]]=i;
 }
-this._dataArray=_42;
+this._dataArray=_3d;
 }
-},_splitLines:function(_50){
-var _51=[];
+},_splitLines:function(_49){
+var _4a=[];
 var i;
-var _53="";
-var _54=false;
-for(i=0;i<_50.length;i++){
-var c=_50.charAt(i);
+var _4b="";
+var _4c=false;
+for(i=0;i<_49.length;i++){
+var c=_49.charAt(i);
 switch(c){
 case "\"":
-_54=!_54;
-_53+=c;
+_4c=!_4c;
+_4b+=c;
 break;
 case "\r":
-if(_54){
-_53+=c;
+if(_4c){
+_4b+=c;
 }else{
-_51.push(_53);
-_53="";
-if(i<(_50.length-1)&&_50.charAt(i+1)=="\n"){
+_4a.push(_4b);
+_4b="";
+if(i<(_49.length-1)&&_49.charAt(i+1)=="\n"){
 i++;
 }
 }
 break;
 case "\n":
-if(_54){
-_53+=c;
+if(_4c){
+_4b+=c;
 }else{
-_51.push(_53);
-_53="";
+_4a.push(_4b);
+_4b="";
 }
 break;
 default:
-_53+=c;
+_4b+=c;
 }
 }
-if(_53!==""){
-_51.push(_53);
+if(_4b!==""){
+_4a.push(_4b);
 }
-return _51;
-},_processData:function(_56){
-this._getArrayOfArraysFromCsvFileContents(_56);
+return _4a;
+},_processData:function(_4d){
+this._getArrayOfArraysFromCsvFileContents(_4d);
 this._arrayOfAllItems=[];
 if(this.identifier){
 if(this._attributeIndexes[this.identifier]===undefined){
@@ -315,91 +335,91 @@ throw new Error(this.declaredClass+": Identity specified is not a column header
 for(var i=0;i<this._dataArray.length;i++){
 var id=i;
 if(this.identifier){
-var _59=this._dataArray[i];
-id=_59[this._attributeIndexes[this.identifier]];
+var _4e=this._dataArray[i];
+id=_4e[this._attributeIndexes[this.identifier]];
 this._idMap[id]=i;
 }
 this._arrayOfAllItems.push(this._createItemFromIdentity(id));
 }
 this._loadFinished=true;
 this._loadInProgress=false;
-},_createItemFromIdentity:function(_5a){
-var _5b={};
-_5b[this._storeProp]=this;
-_5b[this._idProp]=_5a;
-return _5b;
-},getIdentity:function(_5c){
-if(this.isItem(_5c)){
-return _5c[this._idProp];
+},_createItemFromIdentity:function(_4f){
+var _50={};
+_50[this._storeProp]=this;
+_50[this._idProp]=_4f;
+return _50;
+},getIdentity:function(_51){
+if(this.isItem(_51)){
+return _51[this._idProp];
 }
 return null;
-},fetchItemByIdentity:function(_5d){
-var _5e;
-var _5f=_5d.scope?_5d.scope:dojo.global;
+},fetchItemByIdentity:function(_52){
+var _53;
+var _54=_52.scope?_52.scope:dojo.global;
 if(!this._loadFinished){
-var _60=this;
+var _55=this;
 if(this.url!==""){
 if(this._loadInProgress){
-this._queuedFetches.push({args:_5d});
+this._queuedFetches.push({args:_52});
 }else{
 this._loadInProgress=true;
-var _61={url:_60.url,handleAs:"text"};
-var _62=dojo.xhrGet(_61);
-_62.addCallback(function(_63){
+var _56={url:_55.url,handleAs:"text"};
+var _57=dojo.xhrGet(_56);
+_57.addCallback(function(_58){
 try{
-_60._processData(_63);
-var _64=_60._createItemFromIdentity(_5d.identity);
-if(!_60.isItem(_64)){
-_64=null;
+_55._processData(_58);
+var _59=_55._createItemFromIdentity(_52.identity);
+if(!_55.isItem(_59)){
+_59=null;
 }
-if(_5d.onItem){
-_5d.onItem.call(_5f,_64);
+if(_52.onItem){
+_52.onItem.call(_54,_59);
 }
-_60._handleQueuedFetches();
+_55._handleQueuedFetches();
 }
 catch(error){
-if(_5d.onError){
-_5d.onError.call(_5f,error);
+if(_52.onError){
+_52.onError.call(_54,error);
 }
 }
 });
-_62.addErrback(function(_65){
+_57.addErrback(function(_5a){
 this._loadInProgress=false;
-if(_5d.onError){
-_5d.onError.call(_5f,_65);
+if(_52.onError){
+_52.onError.call(_54,_5a);
 }
 });
 }
 }else{
 if(this._csvData){
 try{
-_60._processData(_60._csvData);
-_60._csvData=null;
-_5e=_60._createItemFromIdentity(_5d.identity);
-if(!_60.isItem(_5e)){
-_5e=null;
+_55._processData(_55._csvData);
+_55._csvData=null;
+_53=_55._createItemFromIdentity(_52.identity);
+if(!_55.isItem(_53)){
+_53=null;
 }
-if(_5d.onItem){
-_5d.onItem.call(_5f,_5e);
+if(_52.onItem){
+_52.onItem.call(_54,_53);
 }
 }
 catch(e){
-if(_5d.onError){
-_5d.onError.call(_5f,e);
+if(_52.onError){
+_52.onError.call(_54,e);
 }
 }
 }
 }
 }else{
-_5e=this._createItemFromIdentity(_5d.identity);
-if(!this.isItem(_5e)){
-_5e=null;
+_53=this._createItemFromIdentity(_52.identity);
+if(!this.isItem(_53)){
+_53=null;
 }
-if(_5d.onItem){
-_5d.onItem.call(_5f,_5e);
+if(_52.onItem){
+_52.onItem.call(_54,_53);
 }
 }
-},getIdentityAttributes:function(_66){
+},getIdentityAttributes:function(_5b){
 if(this.identifier){
 return [this.identifier];
 }else{
@@ -408,13 +428,13 @@ return null;
 },_handleQueuedFetches:function(){
 if(this._queuedFetches.length>0){
 for(var i=0;i<this._queuedFetches.length;i++){
-var _68=this._queuedFetches[i];
-var _69=_68.filter;
-var _6a=_68.args;
-if(_69){
-_69(_6a,this._arrayOfAllItems);
+var _5c=this._queuedFetches[i];
+var _5d=_5c.filter;
+var _5e=_5c.args;
+if(_5d){
+_5d(_5e,this._arrayOfAllItems);
 }else{
-this.fetchItemByIdentity(_68.args);
+this.fetchItemByIdentity(_5c.args);
 }
 }
 this._queuedFetches=[];
diff --git a/dojox/data/FileStore.js b/dojox/data/FileStore.js
index e2e1733..dd7b37b 100644
--- a/dojox/data/FileStore.js
+++ b/dojox/data/FileStore.js
@@ -27,7 +27,10 @@ this.options=_1.options.split(",");
 if(_1&&_1.pathAsQueryParam){
 this.pathAsQueryParam=true;
 }
-},url:"",_storeRef:"_S",label:"name",_identifier:"path",_attributes:["children","directory","name","path","modified","size","parentDir"],pathSeparator:"/",options:[],_assertIsItem:function(_2){
+if(_1&&"urlPreventCache" in _1){
+this.urlPreventCache=_1.urlPreventCache?true:false;
+}
+},url:"",_storeRef:"_S",label:"name",_identifier:"path",_attributes:["children","directory","name","path","modified","size","parentDir"],pathSeparator:"/",options:[],failOk:false,urlPreventCache:true,_assertIsItem:function(_2){
 if(!this.isItem(_2)){
 throw new Error("dojox.data.FileStore: a function was passed an item argument that was not an item");
 }
@@ -39,201 +42,198 @@ throw new Error("dojox.data.FileStore: a function was passed an attribute argume
 return {"dojo.data.api.Read":true,"dojo.data.api.Identity":true};
 },getValue:function(_4,_5,_6){
 var _7=this.getValues(_4,_5);
-var _8=_6;
 if(_7&&_7.length>0){
-_8=_7[0];
+return _7[0];
 }
-return _8;
-},getAttributes:function(_9){
+return _6;
+},getAttributes:function(_8){
 return this._attributes;
-},hasAttribute:function(_a,_b){
-if(this.getValue(_a,_b)){
-return true;
-}
-return false;
-},getIdentity:function(_c){
-return this.getValue(_c,this._identifier);
-},getIdentityAttributes:function(_d){
+},hasAttribute:function(_9,_a){
+this._assertIsItem(_9);
+this._assertIsAttribute(_a);
+return (_a in _9);
+},getIdentity:function(_b){
+return this.getValue(_b,this._identifier);
+},getIdentityAttributes:function(_c){
 return [this._identifier];
-},isItemLoaded:function(_e){
-var _f=this.isItem(_e);
-if(_f&&typeof _e._loaded=="boolean"&&!_e._loaded){
-_f=false;
-}
-return _f;
-},loadItem:function(_10){
-var _11=_10.item;
-var _12=this;
-var _13=_10.scope||dojo.global;
-var _14={};
+},isItemLoaded:function(_d){
+var _e=this.isItem(_d);
+if(_e&&typeof _d._loaded=="boolean"&&!_d._loaded){
+_e=false;
+}
+return _e;
+},loadItem:function(_f){
+var _10=_f.item;
+var _11=this;
+var _12=_f.scope||dojo.global;
+var _13={};
 if(this.options.length>0){
-_14.options=dojo.toJson(this.options);
+_13.options=dojo.toJson(this.options);
 }
 if(this.pathAsQueryParam){
-_14.path=_11.parentPath+this.pathSeparator+_11.name;
+_13.path=_10.parentPath+this.pathSeparator+_10.name;
 }
-var _15={url:this.pathAsQueryParam?this.url:this.url+"/"+_11.parentPath+"/"+_11.name,handleAs:"json-comment-optional",content:_14,preventCache:true};
-var _16=dojo.xhrGet(_15);
-_16.addErrback(function(_17){
-if(_10.onError){
-_10.onError.call(_13,_17);
+var _14={url:this.pathAsQueryParam?this.url:this.url+"/"+_10.parentPath+"/"+_10.name,handleAs:"json-comment-optional",content:_13,preventCache:this.urlPreventCache,failOk:this.failOk};
+var _15=dojo.xhrGet(_14);
+_15.addErrback(function(_16){
+if(_f.onError){
+_f.onError.call(_12,_16);
 }
 });
-_16.addCallback(function(_18){
-delete _11.parentPath;
-delete _11._loaded;
-dojo.mixin(_11,_18);
-_12._processItem(_11);
-if(_10.onItem){
-_10.onItem.call(_13,_11);
+_15.addCallback(function(_17){
+delete _10.parentPath;
+delete _10._loaded;
+dojo.mixin(_10,_17);
+_11._processItem(_10);
+if(_f.onItem){
+_f.onItem.call(_12,_10);
 }
 });
-},getLabel:function(_19){
-return this.getValue(_19,this.label);
-},getLabelAttributes:function(_1a){
+},getLabel:function(_18){
+return this.getValue(_18,this.label);
+},getLabelAttributes:function(_19){
 return [this.label];
-},containsValue:function(_1b,_1c,_1d){
-var _1e=this.getValues(_1b,_1c);
-for(var i=0;i<_1e.length;i++){
-if(_1e[i]==_1d){
+},containsValue:function(_1a,_1b,_1c){
+var _1d=this.getValues(_1a,_1b);
+for(var i=0;i<_1d.length;i++){
+if(_1d[i]==_1c){
 return true;
 }
 }
 return false;
-},getValues:function(_20,_21){
-this._assertIsItem(_20);
-this._assertIsAttribute(_21);
-var _22=_20[_21];
-if(typeof _22!=="undefined"&&!dojo.isArray(_22)){
-_22=[_22];
+},getValues:function(_1e,_1f){
+this._assertIsItem(_1e);
+this._assertIsAttribute(_1f);
+var _20=_1e[_1f];
+if(typeof _20!=="undefined"&&!dojo.isArray(_20)){
+_20=[_20];
 }else{
-if(typeof _22==="undefined"){
-_22=[];
+if(typeof _20==="undefined"){
+_20=[];
 }
 }
-return _22;
-},isItem:function(_23){
-if(_23&&_23[this._storeRef]===this){
+return _20;
+},isItem:function(_21){
+if(_21&&_21[this._storeRef]===this){
 return true;
 }
 return false;
-},close:function(_24){
-},fetch:function(_25){
-_25=_25||{};
-if(!_25.store){
-_25.store=this;
+},close:function(_22){
+},fetch:function(_23){
+_23=_23||{};
+if(!_23.store){
+_23.store=this;
 }
-var _26=this;
-var _27=_25.scope||dojo.global;
-var _28={};
-if(_25.query){
-_28.query=dojo.toJson(_25.query);
+var _24=this;
+var _25=_23.scope||dojo.global;
+var _26={};
+if(_23.query){
+_26.query=dojo.toJson(_23.query);
 }
-if(_25.sort){
-_28.sort=dojo.toJson(_25.sort);
+if(_23.sort){
+_26.sort=dojo.toJson(_23.sort);
 }
-if(_25.queryOptions){
-_28.queryOptions=dojo.toJson(_25.queryOptions);
+if(_23.queryOptions){
+_26.queryOptions=dojo.toJson(_23.queryOptions);
 }
-if(typeof _25.start=="number"){
-_28.start=""+_25.start;
+if(typeof _23.start=="number"){
+_26.start=""+_23.start;
 }
-if(typeof _25.count=="number"){
-_28.count=""+_25.count;
+if(typeof _23.count=="number"){
+_26.count=""+_23.count;
 }
 if(this.options.length>0){
-_28.options=dojo.toJson(this.options);
+_26.options=dojo.toJson(this.options);
 }
-var _29={url:this.url,preventCache:true,handleAs:"json-comment-optional",content:_28};
-var _2a=dojo.xhrGet(_29);
-_2a.addCallback(function(_2b){
-_26._processResult(_2b,_25);
+var _27={url:this.url,preventCache:this.urlPreventCache,failOk:this.failOk,handleAs:"json-comment-optional",content:_26};
+var _28=dojo.xhrGet(_27);
+_28.addCallback(function(_29){
+_24._processResult(_29,_23);
 });
-_2a.addErrback(function(_2c){
-if(_25.onError){
-_25.onError.call(_27,_2c,_25);
+_28.addErrback(function(_2a){
+if(_23.onError){
+_23.onError.call(_25,_2a,_23);
 }
 });
-},fetchItemByIdentity:function(_2d){
-var _2e=_2d.identity;
-var _2f=this;
-var _30=_2d.scope||dojo.global;
-var _31={};
+},fetchItemByIdentity:function(_2b){
+var _2c=_2b.identity;
+var _2d=this;
+var _2e=_2b.scope||dojo.global;
+var _2f={};
 if(this.options.length>0){
-_31.options=dojo.toJson(this.options);
+_2f.options=dojo.toJson(this.options);
 }
 if(this.pathAsQueryParam){
-_31.path=_2e;
+_2f.path=_2c;
 }
-var _32={url:this.pathAsQueryParam?this.url:this.url+"/"+_2e,handleAs:"json-comment-optional",content:_31,preventCache:true};
-var _33=dojo.xhrGet(_32);
-_33.addErrback(function(_34){
-if(_2d.onError){
-_2d.onError.call(_30,_34);
+var _30={url:this.pathAsQueryParam?this.url:this.url+"/"+_2c,handleAs:"json-comment-optional",content:_2f,preventCache:this.urlPreventCache,failOk:this.failOk};
+var _31=dojo.xhrGet(_30);
+_31.addErrback(function(_32){
+if(_2b.onError){
+_2b.onError.call(_2e,_32);
 }
 });
-_33.addCallback(function(_35){
-var _36=_2f._processItem(_35);
-if(_2d.onItem){
-_2d.onItem.call(_30,_36);
+_31.addCallback(function(_33){
+var _34=_2d._processItem(_33);
+if(_2b.onItem){
+_2b.onItem.call(_2e,_34);
 }
 });
-},_processResult:function(_37,_38){
-var _39=_38.scope||dojo.global;
+},_processResult:function(_35,_36){
+var _37=_36.scope||dojo.global;
 try{
-if(_37.pathSeparator){
-this.pathSeparator=_37.pathSeparator;
+if(_35.pathSeparator){
+this.pathSeparator=_35.pathSeparator;
 }
-if(_38.onBegin){
-_38.onBegin.call(_39,_37.total,_38);
+if(_36.onBegin){
+_36.onBegin.call(_37,_35.total,_36);
 }
-var _3a=this._processItemArray(_37.items);
-if(_38.onItem){
+var _38=this._processItemArray(_35.items);
+if(_36.onItem){
 var i;
-for(i=0;i<_3a.length;i++){
-_38.onItem.call(_39,_3a[i],_38);
+for(i=0;i<_38.length;i++){
+_36.onItem.call(_37,_38[i],_36);
 }
-_3a=null;
+_38=null;
 }
-if(_38.onComplete){
-_38.onComplete.call(_39,_3a,_38);
+if(_36.onComplete){
+_36.onComplete.call(_37,_38,_36);
 }
 }
 catch(e){
-if(_38.onError){
-_38.onError.call(_39,e,_38);
+if(_36.onError){
+_36.onError.call(_37,e,_36);
 }else{
-
 }
 }
-},_processItemArray:function(_3c){
+},_processItemArray:function(_39){
 var i;
-for(i=0;i<_3c.length;i++){
-this._processItem(_3c[i]);
+for(i=0;i<_39.length;i++){
+this._processItem(_39[i]);
 }
-return _3c;
-},_processItem:function(_3e){
-if(!_3e){
+return _39;
+},_processItem:function(_3a){
+if(!_3a){
 return null;
 }
-_3e[this._storeRef]=this;
-if(_3e.children&&_3e.directory){
-if(dojo.isArray(_3e.children)){
-var _3f=_3e.children;
+_3a[this._storeRef]=this;
+if(_3a.children&&_3a.directory){
+if(dojo.isArray(_3a.children)){
+var _3b=_3a.children;
 var i;
-for(i=0;i<_3f.length;i++){
-var _41=_3f[i];
-if(dojo.isObject(_41)){
-_3f[i]=this._processItem(_41);
+for(i=0;i<_3b.length;i++){
+var _3c=_3b[i];
+if(dojo.isObject(_3c)){
+_3b[i]=this._processItem(_3c);
 }else{
-_3f[i]={name:_41,_loaded:false,parentPath:_3e.path};
-_3f[i][this._storeRef]=this;
+_3b[i]={name:_3c,_loaded:false,parentPath:_3a.path};
+_3b[i][this._storeRef]=this;
 }
 }
 }else{
-delete _3e.children;
+delete _3a.children;
 }
 }
-return _3e;
+return _3a;
 }});
 }
diff --git a/dojox/data/FlickrRestStore.js b/dojox/data/FlickrRestStore.js
index c63aaa5..7b52d0f 100644
--- a/dojox/data/FlickrRestStore.js
+++ b/dojox/data/FlickrRestStore.js
@@ -40,6 +40,11 @@ _9=true;
 _8.user_id=_2.query.userid;
 _6.push("userid"+_2.query.userid);
 }
+if(_5.groupid){
+_9=true;
+_8.group_id=_5.groupid;
+_6.push("groupid"+_5.groupid);
+}
 if(_5.apikey){
 _9=true;
 _8.api_key=_2.query.apikey;
@@ -58,20 +63,20 @@ if(_5.page){
 _8.page=_2.query.page;
 _7.push("page"+_8.page);
 }else{
-if(typeof (_2.start)!="undefined"&&_2.start!=null){
+if(("start" in _2)&&_2.start!==null){
 if(!_2.count){
 _2.count=20;
 }
 var _a=_2.start%_2.count;
 var _b=_2.start,_c=_2.count;
-if(_a!=0){
+if(_a!==0){
 if(_b<_c/2){
 _c=_b+_c;
 _b=0;
 }else{
 var _d=20,_e=2;
 for(var i=_d;i>0;i--){
-if(_b%i==0&&(_b/i)>=_c){
+if(_b%i===0&&(_b/i)>=_c){
 _e=i;
 break;
 }
@@ -99,7 +104,6 @@ if(_5.lang){
 _8.lang=_2.query.lang;
 _6.push("lang"+_2.lang);
 }
-var url=this._flickrRestUrl;
 if(_5.setid){
 _8.method="flickr.photosets.getPhotos";
 _8.photoset_id=_2.query.setid;
@@ -112,7 +116,7 @@ _8.tags=_5.tags.join(",");
 _8.tags=_5.tags;
 }
 _6.push("tags"+_8.tags);
-if(_5["tag_mode"]&&(_5.tag_mode.toLowerCase()=="any"||_5.tag_mode.toLowerCase()=="all")){
+if(_5["tag_mode"]&&(_5.tag_mode.toLowerCase()==="any"||_5.tag_mode.toLowerCase()==="all")){
 _8.tag_mode=_5.tag_mode;
 }
 }
@@ -137,153 +141,156 @@ _8.sort="date-posted-asc";
 _6.push("sort:"+_8.sort);
 _6=_6.join(".");
 _7=_7.length>0?"."+_7.join("."):"";
-var _11=_6+_7;
+var _f=_6+_7;
 _2={query:_5,count:_2._curCount,start:_2._curStart,_realCount:_2._realCount,_realStart:_2._realStart,onBegin:_2.onBegin,onComplete:_2.onComplete,onItem:_2.onItem};
-var _12={request:_2,fetchHandler:_3,errorHandler:_4};
-if(this._handlers[_11]){
-this._handlers[_11].push(_12);
+var _10={request:_2,fetchHandler:_3,errorHandler:_4};
+if(this._handlers[_f]){
+this._handlers[_f].push(_10);
 return;
 }
-this._handlers[_11]=[_12];
-var _13=null;
-var _14={url:this._flickrRestUrl,preventCache:true,content:_8,callbackParamName:"jsoncallback"};
-var _15=dojo.hitch(this,function(_16,_17,_18){
-var _19=_18.request.onBegin;
-_18.request.onBegin=null;
-var _1a;
-var req=_18.request;
-if(typeof (req._realStart)!=undefined&&req._realStart!=null){
+this._handlers[_f]=[_10];
+var _11=null;
+var _12={url:this._flickrRestUrl,preventCache:this.urlPreventCache,content:_8,callbackParamName:"jsoncallback"};
+var _13=dojo.hitch(this,function(_14,_15,_16){
+var _17=_16.request.onBegin;
+_16.request.onBegin=null;
+var _18;
+var req=_16.request;
+if(("_realStart" in req)&&req._realStart!=null){
 req.start=req._realStart;
 req.count=req._realCount;
 req._realStart=req._realCount=null;
 }
-if(_19){
-var _1c=null;
 if(_17){
-_1c=(_17.photoset?_17.photoset:_17.photos);
+var _19=null;
+if(_15){
+_19=(_15.photoset?_15.photoset:_15.photos);
 }
-if(_1c&&typeof (_1c.perpage)!="undefined"&&typeof (_1c.pages)!="undefined"){
-if(_1c.perpage*_1c.pages<=_18.request.start+_18.request.count){
-_1a=_18.request.start+_1c.photo.length;
+if(_19&&("perpage" in _19)&&("pages" in _19)){
+if(_19.perpage*_19.pages<=_16.request.start+_16.request.count){
+_18=_16.request.start+_19.photo.length;
 }else{
-_1a=_1c.perpage*_1c.pages;
+_18=_19.perpage*_19.pages;
 }
-this._maxPhotosPerUser[_6]=_1a;
-_19(_1a,_18.request);
+this._maxPhotosPerUser[_6]=_18;
+_17(_18,_16.request);
 }else{
 if(this._maxPhotosPerUser[_6]){
-_19(this._maxPhotosPerUser[_6],_18.request);
+_17(this._maxPhotosPerUser[_6],_16.request);
 }
 }
 }
-_18.fetchHandler(_16,_18.request);
-if(_19){
-_18.request.onBegin=_19;
+_16.fetchHandler(_14,_16.request);
+if(_17){
+_16.request.onBegin=_17;
 }
 });
-var _1d=dojo.hitch(this,function(_1e){
-if(_1e.stat!="ok"){
+var _1a=dojo.hitch(this,function(_1b){
+if(_1b.stat!="ok"){
 _4(null,_2);
 }else{
-var _1f=this._handlers[_11];
-if(!_1f){
-
+var _1c=this._handlers[_f];
+if(!_1c){
 return;
 }
-this._handlers[_11]=null;
-this._prevRequests[_11]=_1e;
-var _20=this._processFlickrData(_1e,_2,_6);
+this._handlers[_f]=null;
+this._prevRequests[_f]=_1b;
+var _1d=this._processFlickrData(_1b,_2,_6);
 if(!this._prevRequestRanges[_6]){
 this._prevRequestRanges[_6]=[];
 }
-this._prevRequestRanges[_6].push({start:_2.start,end:_2.start+(_1e.photoset?_1e.photoset.photo.length:_1e.photos.photo.length)});
-dojo.forEach(_1f,function(i){
-_15(_20,_1e,i);
+this._prevRequestRanges[_6].push({start:_2.start,end:_2.start+(_1b.photoset?_1b.photoset.photo.length:_1b.photos.photo.length)});
+dojo.forEach(_1c,function(i){
+_13(_1d,_1b,i);
 });
 }
 });
-var _22=this._prevRequests[_11];
-if(_22){
-this._handlers[_11]=null;
-_15(this._cache[_6],_22,_12);
+var _1e=this._prevRequests[_f];
+if(_1e){
+this._handlers[_f]=null;
+_13(this._cache[_6],_1e,_10);
 return;
 }else{
 if(this._checkPrevRanges(_6,_2.start,_2.count)){
-this._handlers[_11]=null;
-_15(this._cache[_6],null,_12);
+this._handlers[_f]=null;
+_13(this._cache[_6],null,_10);
 return;
 }
 }
-var _23=dojo.io.script.get(_14);
-_23.addCallback(_1d);
-_23.addErrback(function(_24){
-dojo.disconnect(_13);
-_4(_24,_2);
+var _1f=dojo.io.script.get(_12);
+_1f.addCallback(_1a);
+_1f.addErrback(function(_20){
+dojo.disconnect(_11);
+_4(_20,_2);
 });
-},getAttributes:function(_25){
+},getAttributes:function(_21){
 return ["title","author","imageUrl","imageUrlSmall","imageUrlMedium","imageUrlThumb","link","dateTaken","datePublished"];
-},getValues:function(_26,_27){
-this._assertIsItem(_26);
-this._assertIsAttribute(_27);
-switch(_27){
+},getValues:function(_22,_23){
+this._assertIsItem(_22);
+this._assertIsAttribute(_23);
+switch(_23){
 case "title":
-return [this._unescapeHtml(_26.title)];
+return [this._unescapeHtml(_22.title)];
 case "author":
-return [_26.ownername];
+return [_22.ownername];
 case "imageUrlSmall":
-return [_26.media.s];
+return [_22.media.s];
 case "imageUrl":
-return [_26.media.l];
+return [_22.media.l];
+case "imageUrlOriginal":
+return [_22.media.o];
+case "imageUrlLarge":
+return [_22.media.l];
 case "imageUrlMedium":
-return [_26.media.m];
+return [_22.media.m];
 case "imageUrlThumb":
-return [_26.media.t];
+return [_22.media.t];
 case "link":
-return ["http://www.flickr.com/photos/"+_26.owner+"/"+_26.id];
+return ["http://www.flickr.com/photos/"+_22.owner+"/"+_22.id];
 case "dateTaken":
-return [_26.datetaken];
+return [_22.datetaken];
 case "datePublished":
-return [_26.datepublished];
+return [_22.datepublished];
 default:
 return undefined;
 }
-},_processFlickrData:function(_28,_29,_2a){
-if(_28.items){
+},_processFlickrData:function(_24,_25,_26){
+if(_24.items){
 return dojox.data.FlickrStore.prototype._processFlickrData.apply(this,arguments);
 }
-var _2b=["http://farm",null,".static.flickr.com/",null,"/",null,"_",null];
-var _2c=[];
-var _2d=(_28.photoset?_28.photoset:_28.photos);
-if(_28.stat=="ok"&&_2d&&_2d.photo){
-_2c=_2d.photo;
-for(var i=0;i<_2c.length;i++){
-var _2f=_2c[i];
-_2f[this._storeRef]=this;
-_2b[1]=_2f.farm;
-_2b[3]=_2f.server;
-_2b[5]=_2f.id;
-_2b[7]=_2f.secret;
-var _30=_2b.join("");
-_2f.media={s:_30+"_s.jpg",m:_30+"_m.jpg",l:_30+".jpg",t:_30+"_t.jpg"};
-if(!_2f.owner&&_28.photoset){
-_2f.owner=_28.photoset.owner;
-}
-}
-}
-var _31=_29.start?_29.start:0;
-var arr=this._cache[_2a];
+var _27=["http://farm",null,".static.flickr.com/",null,"/",null,"_",null];
+var _28=[];
+var _29=(_24.photoset?_24.photoset:_24.photos);
+if(_24.stat=="ok"&&_29&&_29.photo){
+_28=_29.photo;
+for(var i=0;i<_28.length;i++){
+var _2a=_28[i];
+_2a[this._storeRef]=this;
+_27[1]=_2a.farm;
+_27[3]=_2a.server;
+_27[5]=_2a.id;
+_27[7]=_2a.secret;
+var _2b=_27.join("");
+_2a.media={s:_2b+"_s.jpg",m:_2b+"_m.jpg",l:_2b+".jpg",t:_2b+"_t.jpg",o:_2b+"_o.jpg"};
+if(!_2a.owner&&_24.photoset){
+_2a.owner=_24.photoset.owner;
+}
+}
+}
+var _2c=_25.start?_25.start:0;
+var arr=this._cache[_26];
 if(!arr){
-this._cache[_2a]=arr=[];
+this._cache[_26]=arr=[];
 }
-dojo.forEach(_2c,function(i,idx){
-arr[idx+_31]=i;
+dojo.forEach(_28,function(i,idx){
+arr[idx+_2c]=i;
 });
 return arr;
-},_checkPrevRanges:function(_35,_36,_37){
-var end=_36+_37;
-var arr=this._prevRequestRanges[_35];
-return (!!arr)&&dojo.some(arr,function(_3a){
-return ((_36>=_3a.start)&&(end<=_3a.end));
+},_checkPrevRanges:function(_2d,_2e,_2f){
+var end=_2e+_2f;
+var arr=this._prevRequestRanges[_2d];
+return (!!arr)&&dojo.some(arr,function(_30){
+return ((_2e>=_30.start)&&(end<=_30.end));
 });
 }});
 }
diff --git a/dojox/data/FlickrStore.js b/dojox/data/FlickrStore.js
index 1b12537..a7a49f0 100644
--- a/dojox/data/FlickrStore.js
+++ b/dojox/data/FlickrStore.js
@@ -14,134 +14,138 @@ dojo.require("dojo.date.stamp");
 dojo.require("dojo.AdapterRegistry");
 (function(){
 var d=dojo;
-dojo.declare("dojox.data.FlickrStore",null,{constructor:function(_2){
-if(_2&&_2.label){
-this.label=_2.label;
+dojo.declare("dojox.data.FlickrStore",null,{constructor:function(_1){
+if(_1&&_1.label){
+this.label=_1.label;
 }
-},_storeRef:"_S",label:"title",_assertIsItem:function(_3){
-if(!this.isItem(_3)){
+if(_1&&"urlPreventCache" in _1){
+this.urlPreventCache=_1.urlPreventCache?true:false;
+}
+},_storeRef:"_S",label:"title",urlPreventCache:true,_assertIsItem:function(_2){
+if(!this.isItem(_2)){
 throw new Error("dojox.data.FlickrStore: a function was passed an item argument that was not an item");
 }
-},_assertIsAttribute:function(_4){
-if(typeof _4!=="string"){
+},_assertIsAttribute:function(_3){
+if(typeof _3!=="string"){
 throw new Error("dojox.data.FlickrStore: a function was passed an attribute argument that was not an attribute name string");
 }
 },getFeatures:function(){
 return {"dojo.data.api.Read":true};
-},getValue:function(_5,_6,_7){
-var _8=this.getValues(_5,_6);
-if(_8&&_8.length>0){
-return _8[0];
+},getValue:function(_4,_5,_6){
+var _7=this.getValues(_4,_5);
+if(_7&&_7.length>0){
+return _7[0];
 }
-return _7;
-},getAttributes:function(_9){
+return _6;
+},getAttributes:function(_8){
 return ["title","description","author","datePublished","dateTaken","imageUrl","imageUrlSmall","imageUrlMedium","tags","link"];
-},hasAttribute:function(_a,_b){
-if(this.getValue(_a,_b)){
+},hasAttribute:function(_9,_a){
+var v=this.getValue(_9,_a);
+if(v||v===""||v===false){
 return true;
 }
 return false;
-},isItemLoaded:function(_c){
-return this.isItem(_c);
-},loadItem:function(_d){
-},getLabel:function(_e){
-return this.getValue(_e,this.label);
-},getLabelAttributes:function(_f){
+},isItemLoaded:function(_b){
+return this.isItem(_b);
+},loadItem:function(_c){
+},getLabel:function(_d){
+return this.getValue(_d,this.label);
+},getLabelAttributes:function(_e){
 return [this.label];
-},containsValue:function(_10,_11,_12){
-var _13=this.getValues(_10,_11);
-for(var i=0;i<_13.length;i++){
-if(_13[i]===_12){
+},containsValue:function(_f,_10,_11){
+var _12=this.getValues(_f,_10);
+for(var i=0;i<_12.length;i++){
+if(_12[i]===_11){
 return true;
 }
 }
 return false;
-},getValues:function(_15,_16){
-this._assertIsItem(_15);
-this._assertIsAttribute(_16);
+},getValues:function(_13,_14){
+this._assertIsItem(_13);
+this._assertIsAttribute(_14);
 var u=d.hitch(this,"_unescapeHtml");
 var s=d.hitch(d.date.stamp,"fromISOString");
-switch(_16){
+switch(_14){
 case "title":
-return [u(_15.title)];
+return [u(_13.title)];
 case "author":
-return [u(_15.author)];
+return [u(_13.author)];
 case "datePublished":
-return [s(_15.published)];
+return [s(_13.published)];
 case "dateTaken":
-return [s(_15.date_taken)];
+return [s(_13.date_taken)];
 case "imageUrlSmall":
-return [_15.media.m.replace(/_m\./,"_s.")];
+return [_13.media.m.replace(/_m\./,"_s.")];
 case "imageUrl":
-return [_15.media.m.replace(/_m\./,".")];
+return [_13.media.m.replace(/_m\./,".")];
 case "imageUrlMedium":
-return [_15.media.m];
+return [_13.media.m];
 case "link":
-return [_15.link];
+return [_13.link];
 case "tags":
-return _15.tags.split(" ");
+return _13.tags.split(" ");
 case "description":
-return [u(_15.description)];
+return [u(_13.description)];
 default:
 return [];
 }
-},isItem:function(_19){
-if(_19&&_19[this._storeRef]===this){
+},isItem:function(_15){
+if(_15&&_15[this._storeRef]===this){
 return true;
 }
 return false;
-},close:function(_1a){
-},_fetchItems:function(_1b,_1c,_1d){
-var rq=_1b.query=_1b.query||{};
-var _1f={format:"json",tagmode:"any"};
+},close:function(_16){
+},_fetchItems:function(_17,_18,_19){
+var rq=_17.query=_17.query||{};
+var _1a={format:"json",tagmode:"any"};
 d.forEach(["tags","tagmode","lang","id","ids"],function(i){
 if(rq[i]){
-_1f[i]=rq[i];
+_1a[i]=rq[i];
 }
 });
-_1f.id=rq.id||rq.userid||rq.groupid;
+_1a.id=rq.id||rq.userid||rq.groupid;
 if(rq.userids){
-_1f.ids=rq.userids;
+_1a.ids=rq.userids;
 }
-var _21=null;
-var _22={url:dojox.data.FlickrStore.urlRegistry.match(_1b),preventCache:true,content:_1f};
-var _23=d.hitch(this,function(_24){
-if(!!_21){
-d.disconnect(_21);
+var _1b=null;
+var _1c={url:dojox.data.FlickrStore.urlRegistry.match(_17),preventCache:this.urlPreventCache,content:_1a};
+var _1d=d.hitch(this,function(_1e){
+if(!!_1b){
+d.disconnect(_1b);
 }
-_1c(this._processFlickrData(_24),_1b);
+_18(this._processFlickrData(_1e),_17);
 });
-_21=d.connect("jsonFlickrFeed",_23);
-var _25=d.io.script.get(_22);
-_25.addErrback(function(_26){
-d.disconnect(_21);
-_1d(_26,_1b);
+_1b=d.connect("jsonFlickrFeed",_1d);
+var _1f=d.io.script.get(_1c);
+_1f.addErrback(function(_20){
+d.disconnect(_1b);
+_19(_20,_17);
 });
-},_processFlickrData:function(_27){
-var _28=[];
-if(_27.items){
-_28=_27.items;
-for(var i=0;i<_27.items.length;i++){
-var _2a=_27.items[i];
-_2a[this._storeRef]=this;
+},_processFlickrData:function(_21){
+var _22=[];
+if(_21.items){
+_22=_21.items;
+for(var i=0;i<_21.items.length;i++){
+var _23=_21.items[i];
+_23[this._storeRef]=this;
 }
 }
-return _28;
+return _22;
 },_unescapeHtml:function(str){
 return str.replace(/&/gm,"&").replace(/</gm,"<").replace(/>/gm,">").replace(/"/gm,"\"").replace(/'/gm,"'");
 }});
 dojo.extend(dojox.data.FlickrStore,dojo.data.util.simpleFetch);
-var _2c="http://api.flickr.com/services/feeds/";
+var _24="http://api.flickr.com/services/feeds/";
 var reg=dojox.data.FlickrStore.urlRegistry=new d.AdapterRegistry(true);
-reg.register("group pool",function(_2e){
-return !!_2e.query["groupid"];
-},_2c+"groups_pool.gne");
-reg.register("default",function(_2f){
+reg.register("group pool",function(_25){
+return !!_25.query["groupid"];
+},_24+"groups_pool.gne");
+reg.register("default",function(_26){
 return true;
-},_2c+"photos_public.gne");
+},_24+"photos_public.gne");
 })();
 if(!jsonFlickrFeed){
-var jsonFlickrFeed=function(_30){
+var jsonFlickrFeed=function(_27){
 };
 }
 }
diff --git a/dojox/data/GoogleFeedStore.js b/dojox/data/GoogleFeedStore.js
index 38721d6..4cd587e 100644
--- a/dojox/data/GoogleFeedStore.js
+++ b/dojox/data/GoogleFeedStore.js
@@ -10,15 +10,30 @@ dojo._hasResource["dojox.data.GoogleFeedStore"]=true;
 dojo.provide("dojox.data.GoogleFeedStore");
 dojo.experimental("dojox.data.GoogleFeedStore");
 dojo.require("dojox.data.GoogleSearchStore");
-dojo.declare("dojox.data.GoogleFeedStore",dojox.data.GoogleSearchStore,{_type:"",_googleUrl:"http://ajax.googleapis.com/ajax/services/feed/load",_attributes:["title","link","author","published","content","summary","categories"],_queryAttr:"url",_processItem:function(_1,_2){
+dojo.declare("dojox.data.GoogleFeedStore",dojox.data.GoogleSearchStore,{_type:"",_googleUrl:"http://ajax.googleapis.com/ajax/services/feed/load",_attributes:["title","link","author","published","content","summary","categories"],_queryAttrs:{"url":"q"},getFeedValue:function(_1,_2){
+var _3=this.getFeedValues(_1,_2);
+if(dojo.isArray(_3)){
+return _3[0];
+}
+return _3;
+},getFeedValues:function(_4,_5){
+if(!this._feedMetaData){
+return _5;
+}
+return this._feedMetaData[_4]||_5;
+},_processItem:function(_6,_7){
 this.inherited(arguments);
-_1["summary"]=_1["contentSnippet"];
-_1["published"]=_1["publishedDate"];
-},_getItems:function(_3){
-return _3["feed"]&&_3.feed[["entries"]]?_3.feed[["entries"]]:null;
-},_createContent:function(_4,_5,_6){
+_6["summary"]=_6["contentSnippet"];
+_6["published"]=_6["publishedDate"];
+},_getItems:function(_8){
+if(_8["feed"]){
+this._feedMetaData={title:_8.feed.title,desc:_8.feed.description,url:_8.feed.link,author:_8.feed.author};
+return _8.feed.entries;
+}
+return null;
+},_createContent:function(_9,_a,_b){
 var cb=this.inherited(arguments);
-cb.num=(_6.count||10)+(_6.start||0);
+cb.num=(_b.count||10)+(_b.start||0);
 return cb;
 }});
 }
diff --git a/dojox/data/GoogleSearchStore.js b/dojox/data/GoogleSearchStore.js
index 67fb5a2..edc433e 100644
--- a/dojox/data/GoogleSearchStore.js
+++ b/dojox/data/GoogleSearchStore.js
@@ -28,9 +28,12 @@ this._key=_1.key;
 if(_1.lang){
 this._lang=_1.lang;
 }
+if("urlPreventCache" in _1){
+this.urlPreventCache=_1.urlPreventCache?true:false;
+}
 }
 this._id=dojox.data.GoogleSearchStore.prototype._id++;
-},_id:0,_requestCount:0,_googleUrl:"http://ajax.googleapis.com/ajax/services/search/",_storeRef:"_S",_attributes:["unescapedUrl","url","visibleUrl","cacheUrl","title","titleNoFormatting","content"],label:"titleNoFormatting",_type:"web",_queryAttr:"text",_assertIsItem:function(_2){
+},_id:0,_requestCount:0,_googleUrl:"http://ajax.googleapis.com/ajax/services/search/",_storeRef:"_S",_attributes:["unescapedUrl","url","visibleUrl","cacheUrl","title","titleNoFormatting","content","estimatedResultCount"],_aggregatedAttributes:{estimatedResultCount:"cursor.estimatedResultCount"},label:"titleNoFormatting",_type:"web",urlPreventCache:true,_queryAttrs:{text:"q"},_assertIsItem:function(_2){
 if(!this.isItem(_2)){
 throw new Error("dojox.data.GoogleSearchStore: a function was passed an item argument that was not an item");
 }
@@ -68,10 +71,10 @@ return true;
 }
 }
 return false;
-},getValues:function(_14,_15){
-this._assertIsItem(_14);
-this._assertIsAttribute(_15);
-var val=_14[_15];
+},getValues:function(_13,_14){
+this._assertIsItem(_13);
+this._assertIsAttribute(_14);
+var val=_13[_14];
 if(dojo.isArray(val)){
 return val;
 }else{
@@ -81,159 +84,173 @@ return [val];
 return [];
 }
 }
-},isItem:function(_17){
-if(_17&&_17[this._storeRef]===this){
+},isItem:function(_15){
+if(_15&&_15[this._storeRef]===this){
 return true;
 }
 return false;
-},close:function(_18){
-},_format:function(_19,_1a){
-return _19;
-},fetch:function(_1b){
-_1b=_1b||{};
-var _1c=_1b.scope||dojo.global;
-if(!_1b.query||!_1b.query[this._queryAttr]){
-if(_1b.onError){
-_1b.onError.call(_1c,new Error(this.declaredClass+": A query must be specified, with a '"+[this._queryAttr]+"' parameter."));
+},close:function(_16){
+},_format:function(_17,_18){
+return _17;
+},fetch:function(_19){
+_19=_19||{};
+var _1a=_19.scope||dojo.global;
+if(!_19.query){
+if(_19.onError){
+_19.onError.call(_1a,new Error(this.declaredClass+": A query must be specified."));
 return;
 }
 }
-var _1d=_1b.query[this._queryAttr];
-_1b={query:{},onComplete:_1b.onComplete,onError:_1b.onError,onItem:_1b.onItem,onBegin:_1b.onBegin,start:_1b.start,count:_1b.count};
-_1b.query[this._queryAttr]=_1d;
-var _1e=8;
-var _1f="GoogleSearchStoreCallback_"+this._id+"_"+(++this._requestCount);
-var _20=this._createContent(_1d,_1f,_1b);
-var _21;
-if(typeof (_1b.start)==="undefined"||_1b.start===null){
-_1b.start=0;
-}
-if(!_1b.count){
-_1b.count=_1e;
-}
-_21={start:_1b.start-_1b.start%_1e};
-var _22=this;
-var _23=null;
-var _24=this._googleUrl+this._type;
-var _25={url:_24,preventCache:true,content:_20};
-var _26=[];
-var _27=0;
-var _28=false;
-var _29=_1b.start-1;
-var _2a=0;
-function _2b(req){
-_2a++;
-_25.content.context=_25.content.start=req.start;
-var _2d=dojo.io.script.get(_25);
-_2d.addErrback(function(_2e){
-if(_1b.onError){
-_1b.onError.call(_1c,_2e,_1b);
+var _1b={};
+for(var _1c in this._queryAttrs){
+_1b[_1c]=_19.query[_1c];
+}
+_19={query:_1b,onComplete:_19.onComplete,onError:_19.onError,onItem:_19.onItem,onBegin:_19.onBegin,start:_19.start,count:_19.count};
+var _1d=8;
+var _1e="GoogleSearchStoreCallback_"+this._id+"_"+(++this._requestCount);
+var _1f=this._createContent(_1b,_1e,_19);
+var _20;
+if(typeof (_19.start)==="undefined"||_19.start===null){
+_19.start=0;
+}
+if(!_19.count){
+_19.count=_1d;
+}
+_20={start:_19.start-_19.start%_1d};
+var _21=this;
+var _22=this._googleUrl+this._type;
+var _23={url:_22,preventCache:this.urlPreventCache,content:_1f};
+var _24=[];
+var _25=0;
+var _26=false;
+var _27=_19.start-1;
+var _28=0;
+var _29=[];
+function _2a(req){
+_28++;
+_23.content.context=_23.content.start=req.start;
+var _2b=dojo.io.script.get(_23);
+_29.push(_2b.ioArgs.id);
+_2b.addErrback(function(_2c){
+if(_19.onError){
+_19.onError.call(_1a,_2c,_19);
 }
 });
 };
-var _2f=function(_30,_31){
-if(_28){
-return;
+var _2d=function(_2e,_2f){
+if(_29.length>0){
+dojo.query("#"+_29.splice(0,1)).forEach(dojo.destroy);
 }
-var _32=_22._getItems(_31);
-var _33=_31?_31["cursor"]:null;
-if(_32){
-for(var i=0;i<_32.length&&i+_30<_1b.count+_1b.start;i++){
-_22._processItem(_32[i],_31);
-_26[i+_30]=_32[i];
+if(_26){
+return;
 }
-_27++;
-if(_27==1){
-var _35=_33?_33.pages:null;
-var _36=_35?Number(_35[_35.length-1].start):0;
-if(_1b.onBegin){
-var est=_33?_33.estimatedResultCount:_32.length;
-var _38=est?Math.min(est,_36+_32.length):_36+_32.length;
-_1b.onBegin.call(_1c,_38,_1b);
-}
-var _39=(_1b.start-_1b.start%_1e)+_1e;
-var _3a=1;
-while(_35){
-if(!_35[_3a]||Number(_35[_3a].start)>=_1b.start+_1b.count){
+var _30=_21._getItems(_2f);
+var _31=_2f?_2f["cursor"]:null;
+if(_30){
+for(var i=0;i<_30.length&&i+_2e<_19.count+_19.start;i++){
+_21._processItem(_30[i],_2f);
+_24[i+_2e]=_30[i];
+}
+_25++;
+if(_25==1){
+var _32=_31?_31.pages:null;
+var _33=_32?Number(_32[_32.length-1].start):0;
+if(_19.onBegin){
+var est=_31?_31.estimatedResultCount:_30.length;
+var _34=est?Math.min(est,_33+_30.length):_33+_30.length;
+_19.onBegin.call(_1a,_34,_19);
+}
+var _35=(_19.start-_19.start%_1d)+_1d;
+var _36=1;
+while(_32){
+if(!_32[_36]||Number(_32[_36].start)>=_19.start+_19.count){
 break;
 }
-if(Number(_35[_3a].start)>=_39){
-_2b({start:_35[_3a].start});
+if(Number(_32[_36].start)>=_35){
+_2a({start:_32[_36].start});
 }
-_3a++;
+_36++;
 }
 }
-if(_1b.onItem&&_26[_29+1]){
+if(_19.onItem&&_24[_27+1]){
 do{
-_29++;
-_1b.onItem.call(_1c,_26[_29],_1b);
-}while(_26[_29+1]&&_29<_1b.start+_1b.count);
-}
-if(_27==_2a){
-_28=true;
-dojo.global[_1f]=null;
-if(_1b.onItem){
-_1b.onComplete.call(_1c,null,_1b);
+_27++;
+_19.onItem.call(_1a,_24[_27],_19);
+}while(_24[_27+1]&&_27<_19.start+_19.count);
+}
+if(_25==_28){
+_26=true;
+dojo.global[_1e]=null;
+if(_19.onItem){
+_19.onComplete.call(_1a,null,_19);
 }else{
-_26=_26.slice(_1b.start,_1b.start+_1b.count);
-_1b.onComplete.call(_1c,_26,_1b);
+_24=_24.slice(_19.start,_19.start+_19.count);
+_19.onComplete.call(_1a,_24,_19);
 }
 }
 }
 };
-var _3b=[];
-var _3c=_21.start-1;
-var _3d=function(a,b){
-if(a.start<b.start){
-return -1;
-}
-if(b.start<a.start){
-return 1;
-}
-return 0;
-};
-dojo.global[_1f]=function(_40,_41,_42,_43){
+var _37=[];
+var _38=_20.start-1;
+dojo.global[_1e]=function(_39,_3a,_3b,_3c){
 try{
-if(_42!=200){
-if(_1b.onError){
-_1b.onError.call(_1c,new Error("Response from Google was: "+_42),_1b);
+if(_3b!=200){
+if(_19.onError){
+_19.onError.call(_1a,new Error("Response from Google was: "+_3b),_19);
 }
-dojo.global[_1f]=function(){
+dojo.global[_1e]=function(){
 };
 return;
 }
-if(_40==_3c+1){
-_2f(Number(_40),_41);
-_3c+=_1e;
-if(_3b.length>0){
-_3b.sort(_3d);
-while(_3b.length>0&&_3b[0].start==_3c+1){
-_2f(Number(_3b[0].start),_3b[0].data);
-_3b.splice(0,1);
-_3c+=_1e;
+if(_39==_38+1){
+_2d(Number(_39),_3a);
+_38+=_1d;
+if(_37.length>0){
+_37.sort(_21._getSort());
+while(_37.length>0&&_37[0].start==_38+1){
+_2d(Number(_37[0].start),_37[0].data);
+_37.splice(0,1);
+_38+=_1d;
 }
 }
 }else{
-_3b.push({start:_40,data:_41});
+_37.push({start:_39,data:_3a});
 }
 }
 catch(e){
-_1b.onError.call(_1c,e,_1b);
+_19.onError.call(_1a,e,_19);
+}
+};
+_2a(_20);
+},_getSort:function(){
+return function(a,b){
+if(a.start<b.start){
+return -1;
 }
+if(b.start<a.start){
+return 1;
+}
+return 0;
 };
-_2b(_21);
-},_processItem:function(_44,_45){
-_44[this._storeRef]=this;
-},_getItems:function(_46){
-return _46["results"]||_46;
-},_createContent:function(_47,_48,_49){
-return {q:_47,v:"1.0",rsz:"large",callback:_48,key:this._key,hl:this._lang};
+},_processItem:function(_3d,_3e){
+_3d[this._storeRef]=this;
+for(var _3f in this._aggregatedAttributes){
+_3d[_3f]=dojo.getObject(this._aggregatedAttributes[_3f],false,_3e);
+}
+},_getItems:function(_40){
+return _40["results"]||_40;
+},_createContent:function(_41,_42,_43){
+var _44={v:"1.0",rsz:"large",callback:_42,key:this._key,hl:this._lang};
+for(var _45 in this._queryAttrs){
+_44[this._queryAttrs[_45]]=_41[_45];
+}
+return _44;
 }});
 dojo.declare("dojox.data.GoogleWebSearchStore",dojox.data.GoogleSearchStore,{});
-dojo.declare("dojox.data.GoogleBlogSearchStore",dojox.data.GoogleSearchStore,{_type:"blogs",_attributes:["blogUrl","postUrl","title","titleNoFormatting","content","author","publishedDate"]});
-dojo.declare("dojox.data.GoogleLocalSearchStore",dojox.data.GoogleSearchStore,{_type:"local",_attributes:["title","titleNoFormatting","url","lat","lng","streetAddress","city","region","country","phoneNumbers","ddUrl","ddUrlToHere","ddUrlFromHere","staticMapUrl"]});
-dojo.declare("dojox.data.GoogleVideoSearchStore",dojox.data.GoogleSearchStore,{_type:"video",_attributes:["title","titleNoFormatting","content","url","published","publisher","duration","tbWidth","tbHeight","tbUrl","playUrl"]});
-dojo.declare("dojox.data.GoogleNewsSearchStore",dojox.data.GoogleSearchStore,{_type:"news",_attributes:["title","titleNoFormatting","content","url","unescapedUrl","publisher","clusterUrl","location","publishedDate","relatedStories"]});
-dojo.declare("dojox.data.GoogleBookSearchStore",dojox.data.GoogleSearchStore,{_type:"books",_attributes:["title","titleNoFormatting","authors","url","unescapedUrl","bookId","pageCount","publishedYear"]});
-dojo.declare("dojox.data.GoogleImageSearchStore",dojox.data.GoogleSearchStore,{_type:"images",_attributes:["title","titleNoFormatting","visibleUrl","url","unescapedUrl","originalContextUrl","width","height","tbWidth","tbHeight","tbUrl","content","contentNoFormatting"]});
+dojo.declare("dojox.data.GoogleBlogSearchStore",dojox.data.GoogleSearchStore,{_type:"blogs",_attributes:["blogUrl","postUrl","title","titleNoFormatting","content","author","publishedDate"],_aggregatedAttributes:{}});
+dojo.declare("dojox.data.GoogleLocalSearchStore",dojox.data.GoogleSearchStore,{_type:"local",_attributes:["title","titleNoFormatting","url","lat","lng","streetAddress","city","region","country","phoneNumbers","ddUrl","ddUrlToHere","ddUrlFromHere","staticMapUrl","viewport"],_aggregatedAttributes:{viewport:"viewport"},_queryAttrs:{text:"q",centerLatLong:"sll",searchSpan:"sspn"}});
+dojo.declare("dojox.data.GoogleVideoSearchStore",dojox.data.GoogleSearchStore,{_type:"video",_attributes:["title","titleNoFormatting","content","url","published","publisher","duration","tbWidth","tbHeight","tbUrl","playUrl"],_aggregatedAttributes:{}});
+dojo.declare("dojox.data.GoogleNewsSearchStore",dojox.data.GoogleSearchStore,{_type:"news",_attributes:["title","titleNoFormatting","content","url","unescapedUrl","publisher","clusterUrl","location","publishedDate","relatedStories"],_aggregatedAttributes:{}});
+dojo.declare("dojox.data.GoogleBookSearchStore",dojox.data.GoogleSearchStore,{_type:"books",_attributes:["title","titleNoFormatting","authors","url","unescapedUrl","bookId","pageCount","publishedYear"],_aggregatedAttributes:{}});
+dojo.declare("dojox.data.GoogleImageSearchStore",dojox.data.GoogleSearchStore,{_type:"images",_attributes:["title","titleNoFormatting","visibleUrl","url","unescapedUrl","originalContextUrl","width","height","tbWidth","tbHeight","tbUrl","content","contentNoFormatting"],_aggregatedAttributes:{}});
 }
diff --git a/dojox/data/HtmlStore.js b/dojox/data/HtmlStore.js
index e2a1208..079c756 100644
--- a/dojox/data/HtmlStore.js
+++ b/dojox/data/HtmlStore.js
@@ -12,6 +12,12 @@ dojo.require("dojox.xml.parser");
 dojo.require("dojo.data.util.simpleFetch");
 dojo.require("dojo.data.util.filter");
 dojo.declare("dojox.data.HtmlStore",null,{constructor:function(_1){
+if(_1&&"urlPreventCache" in _1){
+this.urlPreventCache=_1.urlPreventCache?true:false;
+}
+if(_1&&"trimWhitespace" in _1){
+this.trimWhitespace=_1.trimWhitespace?true:false;
+}
 if(_1.url){
 if(!_1.dataId){
 throw new Error("dojo.data.HtmlStore: Cannot instantiate using url without an id!");
@@ -27,7 +33,7 @@ this._rootNode=dojo.byId(this.dataId);
 }
 this._indexItems();
 }
-},url:"",dataId:"",_indexItems:function(){
+},url:"",dataId:"",trimWhitespace:false,urlPreventCache:false,_indexItems:function(){
 this._getHeadings();
 if(this._rootNode.rows){
 if(this._rootNode.tBodies&&this._rootNode.tBodies.length>0){
@@ -52,259 +58,262 @@ c++;
 this._headings=[];
 if(this._rootNode.tHead){
 dojo.forEach(this._rootNode.tHead.rows[0].cells,dojo.hitch(this,function(th){
-this._headings.push(dojox.xml.parser.textContent(th));
+var _2=dojox.xml.parser.textContent(th);
+this._headings.push(this.trimWhitespace?dojo.trim(_2):_2);
 }));
 }else{
 this._headings=["name"];
 }
 },_getAllItems:function(){
-var _5=[];
+var _3=[];
 var i;
 if(this._rootNode.rows){
 for(i=0;i<this._rootNode.rows.length;i++){
-_5.push(this._rootNode.rows[i]);
+_3.push(this._rootNode.rows[i]);
 }
 }else{
 for(i=0;i<this._rootNode.childNodes.length;i++){
 if(this._rootNode.childNodes[i].nodeType===1){
-_5.push(this._rootNode.childNodes[i]);
+_3.push(this._rootNode.childNodes[i]);
 }
 }
 }
-return _5;
-},_assertIsItem:function(_7){
-if(!this.isItem(_7)){
+return _3;
+},_assertIsItem:function(_4){
+if(!this.isItem(_4)){
 throw new Error("dojo.data.HtmlStore: a function was passed an item argument that was not an item");
 }
-},_assertIsAttribute:function(_8){
-if(typeof _8!=="string"){
+},_assertIsAttribute:function(_5){
+if(typeof _5!=="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,_8);
-},getValue:function(_9,_a,_b){
-var _c=this.getValues(_9,_a);
-return (_c.length>0)?_c[0]:_b;
-},getValues:function(_d,_e){
-this._assertIsItem(_d);
-var _f=this._assertIsAttribute(_e);
-if(_f>-1){
-if(_d.cells){
-return [dojox.xml.parser.textContent(_d.cells[_f])];
+return dojo.indexOf(this._headings,_5);
+},getValue:function(_6,_7,_8){
+var _9=this.getValues(_6,_7);
+return (_9.length>0)?_9[0]:_8;
+},getValues:function(_a,_b){
+this._assertIsItem(_a);
+var _c=this._assertIsAttribute(_b);
+if(_c>-1){
+var _d;
+if(_a.cells){
+_d=dojox.xml.parser.textContent(_a.cells[_c]);
 }else{
-return [dojox.xml.parser.textContent(_d)];
+_d=dojox.xml.parser.textContent(_a);
 }
+return [this.trimWhitespace?dojo.trim(_d):_d];
 }
 return [];
-},getAttributes:function(_10){
-this._assertIsItem(_10);
-var _11=[];
+},getAttributes:function(_e){
+this._assertIsItem(_e);
+var _f=[];
 for(var i=0;i<this._headings.length;i++){
-if(this.hasAttribute(_10,this._headings[i])){
-_11.push(this._headings[i]);
-}
-}
-return _11;
-},hasAttribute:function(_13,_14){
-return this.getValues(_13,_14).length>0;
-},containsValue:function(_15,_16,_17){
-var _18=undefined;
-if(typeof _17==="string"){
-_18=dojo.data.util.filter.patternToRegExp(_17,false);
-}
-return this._containsValue(_15,_16,_17,_18);
-},_containsValue:function(_19,_1a,_1b,_1c){
-var _1d=this.getValues(_19,_1a);
-for(var i=0;i<_1d.length;++i){
-var _1f=_1d[i];
-if(typeof _1f==="string"&&_1c){
-return (_1f.match(_1c)!==null);
+if(this.hasAttribute(_e,this._headings[i])){
+_f.push(this._headings[i]);
+}
+}
+return _f;
+},hasAttribute:function(_10,_11){
+return this.getValues(_10,_11).length>0;
+},containsValue:function(_12,_13,_14){
+var _15=undefined;
+if(typeof _14==="string"){
+_15=dojo.data.util.filter.patternToRegExp(_14,false);
+}
+return this._containsValue(_12,_13,_14,_15);
+},_containsValue:function(_16,_17,_18,_19){
+var _1a=this.getValues(_16,_17);
+for(var i=0;i<_1a.length;++i){
+var _1b=_1a[i];
+if(typeof _1b==="string"&&_19){
+return (_1b.match(_19)!==null);
 }else{
-if(_1b===_1f){
+if(_18===_1b){
 return true;
 }
 }
 }
 return false;
-},isItem:function(_20){
-if(_20&&_20.store&&_20.store===this){
+},isItem:function(_1c){
+if(_1c&&_1c.store&&_1c.store===this){
 return true;
 }
 return false;
-},isItemLoaded:function(_21){
-return this.isItem(_21);
-},loadItem:function(_22){
-this._assertIsItem(_22.item);
-},_fetchItems:function(_23,_24,_25){
+},isItemLoaded:function(_1d){
+return this.isItem(_1d);
+},loadItem:function(_1e){
+this._assertIsItem(_1e.item);
+},_fetchItems:function(_1f,_20,_21){
 if(this._rootNode){
-this._finishFetchItems(_23,_24,_25);
+this._finishFetchItems(_1f,_20,_21);
 }else{
 if(!this.url){
 this._rootNode=dojo.byId(this.dataId);
 }else{
-var _26={url:this.url,handleAs:"text"};
-var _27=this;
-var _28=dojo.xhrGet(_26);
-_28.addCallback(function(_29){
-var _2a=function(_2b,id){
-if(_2b.id==id){
-return _2b;
+var _22={url:this.url,handleAs:"text",preventCache:this.urlPreventCache};
+var _23=this;
+var _24=dojo.xhrGet(_22);
+_24.addCallback(function(_25){
+var _26=function(_27,id){
+if(_27.id==id){
+return _27;
 }
-if(_2b.childNodes){
-for(var i=0;i<_2b.childNodes.length;i++){
-var _2e=_2a(_2b.childNodes[i],id);
-if(_2e){
-return _2e;
+if(_27.childNodes){
+for(var i=0;i<_27.childNodes.length;i++){
+var _28=_26(_27.childNodes[i],id);
+if(_28){
+return _28;
 }
 }
 }
 return null;
 };
 var d=document.createElement("div");
-d.innerHTML=_29;
-_27._rootNode=_2a(d,_27.dataId);
-_27._indexItems();
-_27._finishFetchItems(_23,_24,_25);
+d.innerHTML=_25;
+_23._rootNode=_26(d,_23.dataId);
+_23._indexItems();
+_23._finishFetchItems(_1f,_20,_21);
 });
-_28.addErrback(function(_30){
-_25(_30,_23);
+_24.addErrback(function(_29){
+_21(_29,_1f);
 });
 }
 }
-},_finishFetchItems:function(_31,_32,_33){
-var _34=null;
-var _35=this._getAllItems();
-if(_31.query){
-var _36=_31.queryOptions?_31.queryOptions.ignoreCase:false;
-_34=[];
-var _37={};
+},_finishFetchItems:function(_2a,_2b,_2c){
+var _2d=null;
+var _2e=this._getAllItems();
+if(_2a.query){
+var _2f=_2a.queryOptions?_2a.queryOptions.ignoreCase:false;
+_2d=[];
+var _30={};
 var key;
-var _39;
-for(key in _31.query){
-_39=_31.query[key]+"";
-if(typeof _39==="string"){
-_37[key]=dojo.data.util.filter.patternToRegExp(_39,_36);
+var _31;
+for(key in _2a.query){
+_31=_2a.query[key]+"";
+if(typeof _31==="string"){
+_30[key]=dojo.data.util.filter.patternToRegExp(_31,_2f);
 }
 }
-for(var i=0;i<_35.length;++i){
-var _3b=true;
-var _3c=_35[i];
-for(key in _31.query){
-_39=_31.query[key]+"";
-if(!this._containsValue(_3c,key,_39,_37[key])){
-_3b=false;
+for(var i=0;i<_2e.length;++i){
+var _32=true;
+var _33=_2e[i];
+for(key in _2a.query){
+_31=_2a.query[key]+"";
+if(!this._containsValue(_33,key,_31,_30[key])){
+_32=false;
 }
 }
-if(_3b){
-_34.push(_3c);
+if(_32){
+_2d.push(_33);
 }
 }
-_32(_34,_31);
+_2b(_2d,_2a);
 }else{
-if(_35.length>0){
-_34=_35.slice(0,_35.length);
+if(_2e.length>0){
+_2d=_2e.slice(0,_2e.length);
 }
-_32(_34,_31);
+_2b(_2d,_2a);
 }
 },getFeatures:function(){
 return {"dojo.data.api.Read":true,"dojo.data.api.Identity":true};
-},close:function(_3d){
-},getLabel:function(_3e){
-if(this.isItem(_3e)){
-if(_3e.cells){
-return "Item #"+this.getIdentity(_3e);
+},close:function(_34){
+},getLabel:function(_35){
+if(this.isItem(_35)){
+if(_35.cells){
+return "Item #"+this.getIdentity(_35);
 }else{
-return this.getValue(_3e,"name");
+return this.getValue(_35,"name");
 }
 }
 return undefined;
-},getLabelAttributes:function(_3f){
-if(_3f.cells){
+},getLabelAttributes:function(_36){
+if(_36.cells){
 return null;
 }else{
 return ["name"];
 }
-},getIdentity:function(_40){
-this._assertIsItem(_40);
-if(this.hasAttribute(_40,"name")){
-return this.getValue(_40,"name");
+},getIdentity:function(_37){
+this._assertIsItem(_37);
+if(this.hasAttribute(_37,"name")){
+return this.getValue(_37,"name");
 }else{
-return _40._ident;
+return _37._ident;
 }
-},getIdentityAttributes:function(_41){
+},getIdentityAttributes:function(_38){
 return null;
-},fetchItemByIdentity:function(_42){
-var _43=_42.identity;
-var _44=this;
-var _45=null;
-var _46=null;
+},fetchItemByIdentity:function(_39){
+var _3a=_39.identity;
+var _3b=this;
+var _3c=null;
+var _3d=null;
 if(!this._rootNode){
 if(!this.url){
 this._rootNode=dojo.byId(this.dataId);
 this._indexItems();
-if(_44._rootNode.rows){
-_45=this._rootNode.rows[_43+1];
+if(_3b._rootNode.rows){
+_3c=this._rootNode.rows[_3a+1];
 }else{
-for(var i=0;i<_44._rootNode.childNodes.length;i++){
-if(_44._rootNode.childNodes[i].nodeType===1&&_43===dojox.xml.parser.textContent(_44._rootNode.childNodes[i])){
-_45=_44._rootNode.childNodes[i];
+for(var i=0;i<_3b._rootNode.childNodes.length;i++){
+if(_3b._rootNode.childNodes[i].nodeType===1&&_3a===dojox.xml.parser.textContent(_3b._rootNode.childNodes[i])){
+_3c=_3b._rootNode.childNodes[i];
 }
 }
 }
-if(_42.onItem){
-_46=_42.scope?_42.scope:dojo.global;
-_42.onItem.call(_46,_45);
+if(_39.onItem){
+_3d=_39.scope?_39.scope:dojo.global;
+_39.onItem.call(_3d,_3c);
 }
 }else{
-var _48={url:this.url,handleAs:"text"};
-var _49=dojo.xhrGet(_48);
-_49.addCallback(function(_4a){
-var _4b=function(_4c,id){
-if(_4c.id==id){
-return _4c;
+var _3e={url:this.url,handleAs:"text"};
+var _3f=dojo.xhrGet(_3e);
+_3f.addCallback(function(_40){
+var _41=function(_42,id){
+if(_42.id==id){
+return _42;
 }
-if(_4c.childNodes){
-for(var i=0;i<_4c.childNodes.length;i++){
-var _4f=_4b(_4c.childNodes[i],id);
-if(_4f){
-return _4f;
+if(_42.childNodes){
+for(var i=0;i<_42.childNodes.length;i++){
+var _43=_41(_42.childNodes[i],id);
+if(_43){
+return _43;
 }
 }
 }
 return null;
 };
 var d=document.createElement("div");
-d.innerHTML=_4a;
-_44._rootNode=_4b(d,_44.dataId);
-_44._indexItems();
-if(_44._rootNode.rows&&_43<=_44._rootNode.rows.length){
-_45=_44._rootNode.rows[_43-1];
+d.innerHTML=_40;
+_3b._rootNode=_41(d,_3b.dataId);
+_3b._indexItems();
+if(_3b._rootNode.rows&&_3a<=_3b._rootNode.rows.length){
+_3c=_3b._rootNode.rows[_3a-1];
 }else{
-for(var i=0;i<_44._rootNode.childNodes.length;i++){
-if(_44._rootNode.childNodes[i].nodeType===1&&_43===dojox.xml.parser.textContent(_44._rootNode.childNodes[i])){
-_45=_44._rootNode.childNodes[i];
+for(var i=0;i<_3b._rootNode.childNodes.length;i++){
+if(_3b._rootNode.childNodes[i].nodeType===1&&_3a===dojox.xml.parser.textContent(_3b._rootNode.childNodes[i])){
+_3c=_3b._rootNode.childNodes[i];
 break;
 }
 }
 }
-if(_42.onItem){
-_46=_42.scope?_42.scope:dojo.global;
-_42.onItem.call(_46,_45);
+if(_39.onItem){
+_3d=_39.scope?_39.scope:dojo.global;
+_39.onItem.call(_3d,_3c);
 }
 });
-_49.addErrback(function(_52){
-if(_42.onError){
-_46=_42.scope?_42.scope:dojo.global;
-_42.onError.call(_46,_52);
+_3f.addErrback(function(_44){
+if(_39.onError){
+_3d=_39.scope?_39.scope:dojo.global;
+_39.onError.call(_3d,_44);
 }
 });
 }
 }else{
-if(this._rootNode.rows[_43+1]){
-_45=this._rootNode.rows[_43+1];
-if(_42.onItem){
-_46=_42.scope?_42.scope:dojo.global;
-_42.onItem.call(_46,_45);
+if(this._rootNode.rows[_3a+1]){
+_3c=this._rootNode.rows[_3a+1];
+if(_39.onItem){
+_3d=_39.scope?_39.scope:dojo.global;
+_39.onItem.call(_3d,_3c);
 }
 }
 }
diff --git a/dojox/data/HtmlTableStore.js b/dojox/data/HtmlTableStore.js
index a3a38c8..cab7928 100644
--- a/dojox/data/HtmlTableStore.js
+++ b/dojox/data/HtmlTableStore.js
@@ -37,73 +37,73 @@ dojo.forEach(this._rootNode.tHead.rows[0].cells,dojo.hitch(this,function(th){
 this._headings.push(dojox.xml.parser.textContent(th));
 }));
 },_getAllItems:function(){
-var _4=[];
+var _2=[];
 for(var i=1;i<this._rootNode.rows.length;i++){
-_4.push(this._rootNode.rows[i]);
+_2.push(this._rootNode.rows[i]);
 }
-return _4;
-},_assertIsItem:function(_6){
-if(!this.isItem(_6)){
+return _2;
+},_assertIsItem:function(_3){
+if(!this.isItem(_3)){
 throw new Error("dojo.data.HtmlTableStore: a function was passed an item argument that was not an item");
 }
-},_assertIsAttribute:function(_7){
-if(typeof _7!=="string"){
+},_assertIsAttribute:function(_4){
+if(typeof _4!=="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,_7);
-},getValue:function(_8,_9,_a){
-var _b=this.getValues(_8,_9);
-return (_b.length>0)?_b[0]:_a;
-},getValues:function(_c,_d){
-this._assertIsItem(_c);
-var _e=this._assertIsAttribute(_d);
-if(_e>-1){
-return [dojox.xml.parser.textContent(_c.cells[_e])];
+return dojo.indexOf(this._headings,_4);
+},getValue:function(_5,_6,_7){
+var _8=this.getValues(_5,_6);
+return (_8.length>0)?_8[0]:_7;
+},getValues:function(_9,_a){
+this._assertIsItem(_9);
+var _b=this._assertIsAttribute(_a);
+if(_b>-1){
+return [dojox.xml.parser.textContent(_9.cells[_b])];
 }
 return [];
-},getAttributes:function(_f){
-this._assertIsItem(_f);
-var _10=[];
+},getAttributes:function(_c){
+this._assertIsItem(_c);
+var _d=[];
 for(var i=0;i<this._headings.length;i++){
-if(this.hasAttribute(_f,this._headings[i])){
-_10.push(this._headings[i]);
-}
-}
-return _10;
-},hasAttribute:function(_12,_13){
-return this.getValues(_12,_13).length>0;
-},containsValue:function(_14,_15,_16){
-var _17=undefined;
-if(typeof _16==="string"){
-_17=dojo.data.util.filter.patternToRegExp(_16,false);
-}
-return this._containsValue(_14,_15,_16,_17);
-},_containsValue:function(_18,_19,_1a,_1b){
-var _1c=this.getValues(_18,_19);
-for(var i=0;i<_1c.length;++i){
-var _1e=_1c[i];
-if(typeof _1e==="string"&&_1b){
-return (_1e.match(_1b)!==null);
+if(this.hasAttribute(_c,this._headings[i])){
+_d.push(this._headings[i]);
+}
+}
+return _d;
+},hasAttribute:function(_e,_f){
+return this.getValues(_e,_f).length>0;
+},containsValue:function(_10,_11,_12){
+var _13=undefined;
+if(typeof _12==="string"){
+_13=dojo.data.util.filter.patternToRegExp(_12,false);
+}
+return this._containsValue(_10,_11,_12,_13);
+},_containsValue:function(_14,_15,_16,_17){
+var _18=this.getValues(_14,_15);
+for(var i=0;i<_18.length;++i){
+var _19=_18[i];
+if(typeof _19==="string"&&_17){
+return (_19.match(_17)!==null);
 }else{
-if(_1a===_1e){
+if(_16===_19){
 return true;
 }
 }
 }
 return false;
-},isItem:function(_1f){
-if(_1f&&_1f.store&&_1f.store===this){
+},isItem:function(_1a){
+if(_1a&&_1a.store&&_1a.store===this){
 return true;
 }
 return false;
-},isItemLoaded:function(_20){
-return this.isItem(_20);
-},loadItem:function(_21){
-this._assertIsItem(_21.item);
-},_fetchItems:function(_22,_23,_24){
+},isItemLoaded:function(_1b){
+return this.isItem(_1b);
+},loadItem:function(_1c){
+this._assertIsItem(_1c.item);
+},_fetchItems:function(_1d,_1e,_1f){
 if(this._rootNode){
-this._finishFetchItems(_22,_23,_24);
+this._finishFetchItems(_1d,_1e,_1f);
 }else{
 if(!this.url){
 this._rootNode=dojo.byId(this.tableId);
@@ -112,97 +112,97 @@ for(var i=0;i<this._rootNode.rows.length;i++){
 this._rootNode.rows[i].store=this;
 }
 }else{
-var _26={url:this.url,handleAs:"text"};
-var _27=this;
-var _28=dojo.xhrGet(_26);
-_28.addCallback(function(_29){
-var _2a=function(_2b,id){
-if(_2b.id==id){
-return _2b;
+var _20={url:this.url,handleAs:"text"};
+var _21=this;
+var _22=dojo.xhrGet(_20);
+_22.addCallback(function(_23){
+var _24=function(_25,id){
+if(_25.id==id){
+return _25;
 }
-if(_2b.childNodes){
-for(var i=0;i<_2b.childNodes.length;i++){
-var _2e=_2a(_2b.childNodes[i],id);
-if(_2e){
-return _2e;
+if(_25.childNodes){
+for(var i=0;i<_25.childNodes.length;i++){
+var _26=_24(_25.childNodes[i],id);
+if(_26){
+return _26;
 }
 }
 }
 return null;
 };
 var d=document.createElement("div");
-d.innerHTML=_29;
-_27._rootNode=_2a(d,_27.tableId);
-_27._getHeadings.call(_27);
-for(var i=0;i<_27._rootNode.rows.length;i++){
-_27._rootNode.rows[i].store=_27;
+d.innerHTML=_23;
+_21._rootNode=_24(d,_21.tableId);
+_21._getHeadings.call(_21);
+for(var i=0;i<_21._rootNode.rows.length;i++){
+_21._rootNode.rows[i].store=_21;
 }
-_27._finishFetchItems(_22,_23,_24);
+_21._finishFetchItems(_1d,_1e,_1f);
 });
-_28.addErrback(function(_31){
-_24(_31,_22);
+_22.addErrback(function(_27){
+_1f(_27,_1d);
 });
 }
 }
-},_finishFetchItems:function(_32,_33,_34){
-var _35=null;
-var _36=this._getAllItems();
-if(_32.query){
-var _37=_32.queryOptions?_32.queryOptions.ignoreCase:false;
-_35=[];
-var _38={};
-var _39;
+},_finishFetchItems:function(_28,_29,_2a){
+var _2b=null;
+var _2c=this._getAllItems();
+if(_28.query){
+var _2d=_28.queryOptions?_28.queryOptions.ignoreCase:false;
+_2b=[];
+var _2e={};
+var _2f;
 var key;
-for(key in _32.query){
-_39=_32.query[key]+"";
-if(typeof _39==="string"){
-_38[key]=dojo.data.util.filter.patternToRegExp(_39,_37);
+for(key in _28.query){
+_2f=_28.query[key]+"";
+if(typeof _2f==="string"){
+_2e[key]=dojo.data.util.filter.patternToRegExp(_2f,_2d);
 }
 }
-for(var i=0;i<_36.length;++i){
-var _3c=true;
-var _3d=_36[i];
-for(key in _32.query){
-_39=_32.query[key]+"";
-if(!this._containsValue(_3d,key,_39,_38[key])){
-_3c=false;
+for(var i=0;i<_2c.length;++i){
+var _30=true;
+var _31=_2c[i];
+for(key in _28.query){
+_2f=_28.query[key]+"";
+if(!this._containsValue(_31,key,_2f,_2e[key])){
+_30=false;
 }
 }
-if(_3c){
-_35.push(_3d);
+if(_30){
+_2b.push(_31);
 }
 }
-_33(_35,_32);
+_29(_2b,_28);
 }else{
-if(_36.length>0){
-_35=_36.slice(0,_36.length);
+if(_2c.length>0){
+_2b=_2c.slice(0,_2c.length);
 }
-_33(_35,_32);
+_29(_2b,_28);
 }
 },getFeatures:function(){
 return {"dojo.data.api.Read":true,"dojo.data.api.Identity":true};
-},close:function(_3e){
-},getLabel:function(_3f){
-if(this.isItem(_3f)){
-return "Table Row #"+this.getIdentity(_3f);
+},close:function(_32){
+},getLabel:function(_33){
+if(this.isItem(_33)){
+return "Table Row #"+this.getIdentity(_33);
 }
 return undefined;
-},getLabelAttributes:function(_40){
+},getLabelAttributes:function(_34){
 return null;
-},getIdentity:function(_41){
-this._assertIsItem(_41);
+},getIdentity:function(_35){
+this._assertIsItem(_35);
 if(!dojo.isOpera){
-return _41.sectionRowIndex;
+return _35.sectionRowIndex;
 }else{
-return (dojo.indexOf(this._rootNode.rows,_41)-1);
+return (dojo.indexOf(this._rootNode.rows,_35)-1);
 }
-},getIdentityAttributes:function(_42){
+},getIdentityAttributes:function(_36){
 return null;
-},fetchItemByIdentity:function(_43){
-var _44=_43.identity;
-var _45=this;
-var _46=null;
-var _47=null;
+},fetchItemByIdentity:function(_37){
+var _38=_37.identity;
+var _39=this;
+var _3a=null;
+var _3b=null;
 if(!this._rootNode){
 if(!this.url){
 this._rootNode=dojo.byId(this.tableId);
@@ -210,55 +210,55 @@ this._getHeadings();
 for(var i=0;i<this._rootNode.rows.length;i++){
 this._rootNode.rows[i].store=this;
 }
-_46=this._rootNode.rows[_44+1];
-if(_43.onItem){
-_47=_43.scope?_43.scope:dojo.global;
-_43.onItem.call(_47,_46);
+_3a=this._rootNode.rows[_38+1];
+if(_37.onItem){
+_3b=_37.scope?_37.scope:dojo.global;
+_37.onItem.call(_3b,_3a);
 }
 }else{
-var _49={url:this.url,handleAs:"text"};
-var _4a=dojo.xhrGet(_49);
-_4a.addCallback(function(_4b){
-var _4c=function(_4d,id){
-if(_4d.id==id){
-return _4d;
+var _3c={url:this.url,handleAs:"text"};
+var _3d=dojo.xhrGet(_3c);
+_3d.addCallback(function(_3e){
+var _3f=function(_40,id){
+if(_40.id==id){
+return _40;
 }
-if(_4d.childNodes){
-for(var i=0;i<_4d.childNodes.length;i++){
-var _50=_4c(_4d.childNodes[i],id);
-if(_50){
-return _50;
+if(_40.childNodes){
+for(var i=0;i<_40.childNodes.length;i++){
+var _41=_3f(_40.childNodes[i],id);
+if(_41){
+return _41;
 }
 }
 }
 return null;
 };
 var d=document.createElement("div");
-d.innerHTML=_4b;
-_45._rootNode=_4c(d,_45.tableId);
-_45._getHeadings.call(_45);
-for(var i=0;i<_45._rootNode.rows.length;i++){
-_45._rootNode.rows[i].store=_45;
+d.innerHTML=_3e;
+_39._rootNode=_3f(d,_39.tableId);
+_39._getHeadings.call(_39);
+for(var i=0;i<_39._rootNode.rows.length;i++){
+_39._rootNode.rows[i].store=_39;
 }
-_46=_45._rootNode.rows[_44+1];
-if(_43.onItem){
-_47=_43.scope?_43.scope:dojo.global;
-_43.onItem.call(_47,_46);
+_3a=_39._rootNode.rows[_38+1];
+if(_37.onItem){
+_3b=_37.scope?_37.scope:dojo.global;
+_37.onItem.call(_3b,_3a);
 }
 });
-_4a.addErrback(function(_53){
-if(_43.onError){
-_47=_43.scope?_43.scope:dojo.global;
-_43.onError.call(_47,_53);
+_3d.addErrback(function(_42){
+if(_37.onError){
+_3b=_37.scope?_37.scope:dojo.global;
+_37.onError.call(_3b,_42);
 }
 });
 }
 }else{
-if(this._rootNode.rows[_44+1]){
-_46=this._rootNode.rows[_44+1];
-if(_43.onItem){
-_47=_43.scope?_43.scope:dojo.global;
-_43.onItem.call(_47,_46);
+if(this._rootNode.rows[_38+1]){
+_3a=this._rootNode.rows[_38+1];
+if(_37.onItem){
+_3b=_37.scope?_37.scope:dojo.global;
+_37.onItem.call(_3b,_3a);
 }
 }
 }
diff --git a/dojox/data/ItemExplorer.js b/dojox/data/ItemExplorer.js
index 1c90e32..b4d54d4 100644
--- a/dojox/data/ItemExplorer.js
+++ b/dojox/data/ItemExplorer.js
@@ -75,112 +75,112 @@ _13.push({addNew:true,parent:_11,parentNode:_d});
 }
 _e(_13);
 };
-},getIdentity:function(_1a){
-if(!_1a.id){
-if(_1a.addNew){
-_1a.property="--addNew";
+},getIdentity:function(_17){
+if(!_17.id){
+if(_17.addNew){
+_17.property="--addNew";
 }
-_1a.id=_a++;
+_17.id=_a++;
 if(_7.store){
-if(_7.store.isItem(_1a.value)){
-var _1b=_7.store.getIdentity(_1a.value);
-(_7._modelNodeIdMap[_1b]=_7._modelNodeIdMap[_1b]||[]).push(_1a);
+if(_7.store.isItem(_17.value)){
+var _18=_7.store.getIdentity(_17.value);
+(_7._modelNodeIdMap[_18]=_7._modelNodeIdMap[_18]||[]).push(_17);
 }
-if(_1a.parent){
-_1b=_7.store.getIdentity(_1a.parent)+"."+_1a.property;
-(_7._modelNodePropMap[_1b]=_7._modelNodePropMap[_1b]||[]).push(_1a);
+if(_17.parent){
+_18=_7.store.getIdentity(_17.parent)+"."+_17.property;
+(_7._modelNodePropMap[_18]=_7._modelNodePropMap[_18]||[]).push(_17);
 }
 }
 }
-return _1a.id;
-},getLabel:function(_1c){
-return _1c===_9?"Object Properties":_1c.addNew?(_1c.parent instanceof Array?"Add new value":"Add new property"):_1c.property+": "+(_1c.value instanceof Array?"("+_1c.value.length+" elements)":_1c.value);
-},onChildrenChange:function(_1d){
-},onChange:function(_1e){
+return _17.id;
+},getLabel:function(_19){
+return _19===_9?"Object Properties":_19.addNew?(_19.parent instanceof Array?"Add new value":"Add new property"):_19.property+": "+(_19.value instanceof Array?"("+_19.value.length+" elements)":_19.value);
+},onChildrenChange:function(_1a){
+},onChange:function(_1b){
 }};
 },postCreate:function(){
 this.inherited(arguments);
-dojo.connect(this,"onClick",function(_1f,_20){
-this.lastFocused=_20;
-if(_1f.addNew){
+dojo.connect(this,"onClick",function(_1c,_1d){
+this.lastFocused=_1d;
+if(_1c.addNew){
 this._addProperty();
 }else{
 this._editProperty();
 }
 });
-var _21=new dijit.Menu({targetNodeIds:[this.rootNode.domNode],id:"contextMenu"});
-dojo.connect(_21,"_openMyself",this,function(e){
-var _23=dijit.getEnclosingWidget(e.target);
-if(_23){
-var _24=_23.item;
-if(this.store.isItem(_24.value,true)&&!_24.parent){
-_21.getChildren().forEach(function(_25){
-_25.attr("disabled",(_25.label!="Add"));
+var _1e=new dijit.Menu({targetNodeIds:[this.rootNode.domNode],id:"contextMenu"});
+dojo.connect(_1e,"_openMyself",this,function(e){
+var _1f=dijit.getEnclosingWidget(e.target);
+if(_1f){
+var _20=_1f.item;
+if(this.store.isItem(_20.value,true)&&!_20.parent){
+_1e.getChildren().forEach(function(_21){
+_21.attr("disabled",(_21.label!="Add"));
 });
-this.lastFocused=_23;
+this.lastFocused=_1f;
 }else{
-if(_24.value&&typeof _24.value=="object"&&!(_24.value instanceof Date)){
-_21.getChildren().forEach(function(_26){
-_26.attr("disabled",(_26.label!="Add")&&(_26.label!="Delete"));
+if(_20.value&&typeof _20.value=="object"&&!(_20.value instanceof Date)){
+_1e.getChildren().forEach(function(_22){
+_22.attr("disabled",(_22.label!="Add")&&(_22.label!="Delete"));
 });
-this.lastFocused=_23;
+this.lastFocused=_1f;
 }else{
-if(_24.property&&dojo.indexOf(this.store.getIdentityAttributes(),_24.property)>=0){
-this.focusNode(_23);
+if(_20.property&&dojo.indexOf(this.store.getIdentityAttributes(),_20.property)>=0){
+this.focusNode(_1f);
 alert("Cannot modify an Identifier node.");
 }else{
-if(_24.addNew){
-this.focusNode(_23);
+if(_20.addNew){
+this.focusNode(_1f);
 }else{
-_21.getChildren().forEach(function(_27){
-_27.attr("disabled",(_27.label!="Edit")&&(_27.label!="Delete"));
+_1e.getChildren().forEach(function(_23){
+_23.attr("disabled",(_23.label!="Edit")&&(_23.label!="Delete"));
 });
-this.lastFocused=_23;
+this.lastFocused=_1f;
 }
 }
 }
 }
 }
 });
-_21.addChild(new dijit.MenuItem({label:"Add",onClick:dojo.hitch(this,"_addProperty")}));
-_21.addChild(new dijit.MenuItem({label:"Edit",onClick:dojo.hitch(this,"_editProperty")}));
-_21.addChild(new dijit.MenuItem({label:"Delete",onClick:dojo.hitch(this,"_destroyProperty")}));
-_21.startup();
-},store:null,setStore:function(_28){
-this.store=_28;
-var _29=this;
+_1e.addChild(new dijit.MenuItem({label:"Add",onClick:dojo.hitch(this,"_addProperty")}));
+_1e.addChild(new dijit.MenuItem({label:"Edit",onClick:dojo.hitch(this,"_editProperty")}));
+_1e.addChild(new dijit.MenuItem({label:"Delete",onClick:dojo.hitch(this,"_destroyProperty")}));
+_1e.startup();
+},store:null,setStore:function(_24){
+this.store=_24;
+var _25=this;
 if(this._editDialog){
 this._editDialog.destroyRecursive();
 delete this._editDialog;
 }
-dojo.connect(_28,"onSet",function(_2a,_2b,_2c,_2d){
-var _2e,i,_30=_29.store.getIdentity(_2a);
-_2e=_29._modelNodeIdMap[_30];
-if(_2e&&(_2c===undefined||_2d===undefined||_2c instanceof Array||_2d instanceof Array||typeof _2c=="object"||typeof _2d=="object")){
-for(i=0;i<_2e.length;i++){
-(function(_31){
-_29.model.getChildren(_31,function(_32){
-_29.model.onChildrenChange(_31,_32);
+dojo.connect(_24,"onSet",function(_26,_27,_28,_29){
+var _2a,i,_2b=_25.store.getIdentity(_26);
+_2a=_25._modelNodeIdMap[_2b];
+if(_2a&&(_28===undefined||_29===undefined||_28 instanceof Array||_29 instanceof Array||typeof _28=="object"||typeof _29=="object")){
+for(i=0;i<_2a.length;i++){
+(function(_2c){
+_25.model.getChildren(_2c,function(_2d){
+_25.model.onChildrenChange(_2c,_2d);
 });
-})(_2e[i]);
+})(_2a[i]);
 }
 }
-_2e=_29._modelNodePropMap[_30+"."+_2b];
-if(_2e){
-for(i=0;i<_2e.length;i++){
-_2e[i].value=_2d;
-_29.model.onChange(_2e[i]);
+_2a=_25._modelNodePropMap[_2b+"."+_27];
+if(_2a){
+for(i=0;i<_2a.length;i++){
+_2a[i].value=_29;
+_25.model.onChange(_2a[i]);
 }
 }
 });
 this.rootNode.setChildItems([]);
-},setItem:function(_33){
-(this._modelNodeIdMap={})[this.store.getIdentity(_33)]=[this.rootModelNode];
+},setItem:function(_2e){
+(this._modelNodeIdMap={})[this.store.getIdentity(_2e)]=[this.rootModelNode];
 this._modelNodePropMap={};
-this.rootModelNode.value=_33;
-var _34=this;
-this.model.getChildren(this.rootModelNode,function(_35){
-_34.rootNode.setChildItems(_35);
+this.rootModelNode.value=_2e;
+var _2f=this;
+this.model.getChildren(this.rootModelNode,function(_30){
+_2f.rootNode.setChildItems(_30);
 });
 },refreshItem:function(){
 this.setItem(this.rootModelNode.value);
@@ -188,133 +188,133 @@ this.setItem(this.rootModelNode.value);
 this._editDialog=new dijit.Dialog({title:"Edit Property",execute:dojo.hitch(this,"_updateItem"),preload:true});
 this._editDialog.placeAt(dojo.body());
 this._editDialog.startup();
-var _36=dojo.doc.createElement("div");
-var _37=dojo.doc.createElement("label");
-dojo.attr(_37,"for","property");
-dojo.style(_37,"fontWeight","bold");
-dojo.attr(_37,"innerHTML","Property:");
-_36.appendChild(_37);
-var _38=new dijit.form.ValidationTextBox({name:"property",value:"",required:true,disabled:true}).placeAt(_36);
-_36.appendChild(dojo.doc.createElement("br"));
-_36.appendChild(dojo.doc.createElement("br"));
-var _39=new dijit.form.RadioButton({name:"itemType",value:"value",onClick:dojo.hitch(this,function(){
+var _31=dojo.doc.createElement("div");
+var _32=dojo.doc.createElement("label");
+dojo.attr(_32,"for","property");
+dojo.style(_32,"fontWeight","bold");
+dojo.attr(_32,"innerHTML","Property:");
+_31.appendChild(_32);
+var _33=new dijit.form.ValidationTextBox({name:"property",value:"",required:true,disabled:true}).placeAt(_31);
+_31.appendChild(dojo.doc.createElement("br"));
+_31.appendChild(dojo.doc.createElement("br"));
+var _34=new dijit.form.RadioButton({name:"itemType",value:"value",onClick:dojo.hitch(this,function(){
 this._enableFields("value");
-})}).placeAt(_36);
-var _3a=dojo.doc.createElement("label");
-dojo.attr(_3a,"for","value");
-dojo.attr(_3a,"innerHTML","Value (JSON):");
-_36.appendChild(_3a);
-var _3b=dojo.doc.createElement("div");
-dojo.addClass(_3b,"value");
-var _3c=new dijit.form.Textarea({name:"jsonVal"}).placeAt(_3b);
-_36.appendChild(_3b);
-var _3d=new dijit.form.RadioButton({name:"itemType",value:"reference",onClick:dojo.hitch(this,function(){
+})}).placeAt(_31);
+var _35=dojo.doc.createElement("label");
+dojo.attr(_35,"for","value");
+dojo.attr(_35,"innerHTML","Value (JSON):");
+_31.appendChild(_35);
+var _36=dojo.doc.createElement("div");
+dojo.addClass(_36,"value");
+var _37=new dijit.form.Textarea({name:"jsonVal"}).placeAt(_36);
+_31.appendChild(_36);
+var _38=new dijit.form.RadioButton({name:"itemType",value:"reference",onClick:dojo.hitch(this,function(){
 this._enableFields("reference");
-})}).placeAt(_36);
-var _3e=dojo.doc.createElement("label");
-dojo.attr(_3e,"for","_reference");
-dojo.attr(_3e,"innerHTML","Reference (ID):");
-_36.appendChild(_3e);
-_36.appendChild(dojo.doc.createElement("br"));
-var _3f=dojo.doc.createElement("div");
-dojo.addClass(_3f,"reference");
+})}).placeAt(_31);
+var _39=dojo.doc.createElement("label");
+dojo.attr(_39,"for","_reference");
+dojo.attr(_39,"innerHTML","Reference (ID):");
+_31.appendChild(_39);
+_31.appendChild(dojo.doc.createElement("br"));
+var _3a=dojo.doc.createElement("div");
+dojo.addClass(_3a,"reference");
 if(this.useSelect){
-var _40=new dijit.form.FilteringSelect({name:"_reference",store:this.store,searchAttr:this.refSelectSearchAttr||this.store.getIdentityAttributes()[0],required:false,value:null,pageSize:10}).placeAt(_3f);
+var _3b=new dijit.form.FilteringSelect({name:"_reference",store:this.store,searchAttr:this.refSelectSearchAttr||this.store.getIdentityAttributes()[0],required:false,value:null,pageSize:10}).placeAt(_3a);
 }else{
-var _41=new dijit.form.ValidationTextBox({name:"_reference",value:"",promptMessage:"Enter the ID of the item to reference",isValid:dojo.hitch(this,function(_42){
+var _3c=new dijit.form.ValidationTextBox({name:"_reference",value:"",promptMessage:"Enter the ID of the item to reference",isValid:dojo.hitch(this,function(_3d){
 return true;
-})}).placeAt(_3f);
-}
-_36.appendChild(_3f);
-_36.appendChild(dojo.doc.createElement("br"));
-_36.appendChild(dojo.doc.createElement("br"));
-var _43=document.createElement("div");
-_43.setAttribute("dir","rtl");
-var _44=new dijit.form.Button({type:"reset",label:"Cancel"}).placeAt(_43);
-_44.onClick=dojo.hitch(this._editDialog,"onCancel");
-var _45=new dijit.form.Button({type:"submit",label:"OK"}).placeAt(_43);
-_36.appendChild(_43);
-this._editDialog.attr("content",_36);
-},_enableFields:function(_46){
-switch(_46){
+})}).placeAt(_3a);
+}
+_31.appendChild(_3a);
+_31.appendChild(dojo.doc.createElement("br"));
+_31.appendChild(dojo.doc.createElement("br"));
+var _3e=document.createElement("div");
+_3e.setAttribute("dir","rtl");
+var _3f=new dijit.form.Button({type:"reset",label:"Cancel"}).placeAt(_3e);
+_3f.onClick=dojo.hitch(this._editDialog,"onCancel");
+var _40=new dijit.form.Button({type:"submit",label:"OK"}).placeAt(_3e);
+_31.appendChild(_3e);
+this._editDialog.attr("content",_31);
+},_enableFields:function(_41){
+switch(_41){
 case "reference":
-dojo.query(".value [widgetId]",this._editDialog.containerNode).forEach(function(_47){
-dijit.getEnclosingWidget(_47).attr("disabled",true);
+dojo.query(".value [widgetId]",this._editDialog.containerNode).forEach(function(_42){
+dijit.getEnclosingWidget(_42).attr("disabled",true);
 });
-dojo.query(".reference [widgetId]",this._editDialog.containerNode).forEach(function(_48){
-dijit.getEnclosingWidget(_48).attr("disabled",false);
+dojo.query(".reference [widgetId]",this._editDialog.containerNode).forEach(function(_43){
+dijit.getEnclosingWidget(_43).attr("disabled",false);
 });
 break;
 case "value":
-dojo.query(".value [widgetId]",this._editDialog.containerNode).forEach(function(_49){
-dijit.getEnclosingWidget(_49).attr("disabled",false);
+dojo.query(".value [widgetId]",this._editDialog.containerNode).forEach(function(_44){
+dijit.getEnclosingWidget(_44).attr("disabled",false);
 });
-dojo.query(".reference [widgetId]",this._editDialog.containerNode).forEach(function(_4a){
-dijit.getEnclosingWidget(_4a).attr("disabled",true);
+dojo.query(".reference [widgetId]",this._editDialog.containerNode).forEach(function(_45){
+dijit.getEnclosingWidget(_45).attr("disabled",true);
 });
 break;
 }
-},_updateItem:function(_4b){
-var _4c,_4d,val,_4f,_50=this._editDialog.attr("title")=="Edit Property";
-var _51=this._editDialog;
-var _52=this.store;
-function _53(){
+},_updateItem:function(_46){
+var _47,_48,val,_49,_4a=this._editDialog.attr("title")=="Edit Property";
+var _4b=this._editDialog;
+var _4c=this.store;
+function _4d(){
 try{
-var _54,_55=[];
-var _56=_4b.property;
-if(_50){
-while(!_52.isItem(_4d.parent,true)){
-_4c=_4c.getParent();
-_55.push(_4d.property);
-_4d=_4c.item;
-}
-if(_55.length==0){
-_52.setValue(_4d.parent,_4d.property,val);
+var _4e,_4f=[];
+var _50=_46.property;
+if(_4a){
+while(!_4c.isItem(_48.parent,true)){
+_47=_47.getParent();
+_4f.push(_48.property);
+_48=_47.item;
+}
+if(_4f.length==0){
+_4c.setValue(_48.parent,_48.property,val);
 }else{
-_4f=_1(_52,_4d.parent,_4d.property);
-if(_4f instanceof Array){
-_4f=_4f.concat();
+_49=_1(_4c,_48.parent,_48.property);
+if(_49 instanceof Array){
+_49=_49.concat();
 }
-_54=_4f;
-while(_55.length>1){
-_54=_54[_55.pop()];
+_4e=_49;
+while(_4f.length>1){
+_4e=_4e[_4f.pop()];
 }
-_54[_55]=val;
-_52.setValue(_4d.parent,_4d.property,_4f);
+_4e[_4f]=val;
+_4c.setValue(_48.parent,_48.property,_49);
 }
 }else{
-if(_52.isItem(_57,true)){
-if(!_52.isItemLoaded(_57)){
-_52.loadItem({item:_57,onItem:function(_58){
-if(_58 instanceof Array){
-_56=_58.length;
+if(_4c.isItem(_51,true)){
+if(!_4c.isItemLoaded(_51)){
+_4c.loadItem({item:_51,onItem:function(_52){
+if(_52 instanceof Array){
+_50=_52.length;
 }
-_52.setValue(_58,_56,val);
+_4c.setValue(_52,_50,val);
 }});
 }else{
-if(_57 instanceof Array){
-_56=_57.length;
+if(_51 instanceof Array){
+_50=_51.length;
 }
-_52.setValue(_57,_56,val);
+_4c.setValue(_51,_50,val);
 }
 }else{
-if(_4d.value instanceof Array){
-_55.push(_4d.value.length);
+if(_48.value instanceof Array){
+_4f.push(_48.value.length);
 }else{
-_55.push(_4b.property);
+_4f.push(_46.property);
 }
-while(!_52.isItem(_4d.parent,true)){
-_4c=_4c.getParent();
-_55.push(_4d.property);
-_4d=_4c.item;
+while(!_4c.isItem(_48.parent,true)){
+_47=_47.getParent();
+_4f.push(_48.property);
+_48=_47.item;
 }
-_4f=_1(_52,_4d.parent,_4d.property);
-_54=_4f;
-while(_55.length>1){
-_54=_54[_55.pop()];
+_49=_1(_4c,_48.parent,_48.property);
+_4e=_49;
+while(_4f.length>1){
+_4e=_4e[_4f.pop()];
 }
-_54[_55]=val;
-_52.setValue(_4d.parent,_4d.property,_4f);
+_4e[_4f]=val;
+_4c.setValue(_48.parent,_48.property,_49);
 }
 }
 }
@@ -322,97 +322,97 @@ catch(e){
 alert(e);
 }
 };
-if(_51.validate()){
-_4c=this.lastFocused;
-_4d=_4c.item;
-var _57=_4d.value;
-if(_4d.addNew){
-_57=_4c.item.parent;
-_4c=_4c.getParent();
-_4d=_4c.item;
+if(_4b.validate()){
+_47=this.lastFocused;
+_48=_47.item;
+var _51=_48.value;
+if(_48.addNew){
+_51=_47.item.parent;
+_47=_47.getParent();
+_48=_47.item;
 }
 val=null;
-switch(_4b.itemType){
+switch(_46.itemType){
 case "reference":
-this.store.fetchItemByIdentity({identity:_4b._reference,onItem:function(_59){
-val=_59;
-_53();
+this.store.fetchItemByIdentity({identity:_46._reference,onItem:function(_53){
+val=_53;
+_4d();
 },onError:function(){
 alert("The id could not be found");
 }});
 break;
 case "value":
-var _5a=_4b.jsonVal;
-val=dojo.fromJson(_5a);
+var _54=_46.jsonVal;
+val=dojo.fromJson(_54);
 if(typeof val=="function"){
 val.toString=function(){
-return _5a;
+return _54;
 };
 }
-_53();
+_4d();
 break;
 }
 }else{
-_51.show();
+_4b.show();
 }
 },_editProperty:function(){
-var _5b=dojo.mixin({},this.lastFocused.item);
+var _55=dojo.mixin({},this.lastFocused.item);
 if(!this._editDialog){
 this._createEditDialog();
 }else{
 this._editDialog.reset();
 }
-if(dojo.indexOf(this.store.getIdentityAttributes(),_5b.property)>=0){
+if(dojo.indexOf(this.store.getIdentityAttributes(),_55.property)>=0){
 alert("Cannot Edit an Identifier!");
 }else{
 this._editDialog.attr("title","Edit Property");
 dijit.getEnclosingWidget(dojo.query("input",this._editDialog.containerNode)[0]).attr("disabled",true);
-if(this.store.isItem(_5b.value,true)){
-if(_5b.parent){
-_5b.itemType="reference";
-this._enableFields(_5b.itemType);
-_5b._reference=this.store.getIdentity(_5b.value);
-this._editDialog.attr("value",_5b);
+if(this.store.isItem(_55.value,true)){
+if(_55.parent){
+_55.itemType="reference";
+this._enableFields(_55.itemType);
+_55._reference=this.store.getIdentity(_55.value);
+this._editDialog.attr("value",_55);
 this._editDialog.show();
 }
 }else{
-if(_5b.value&&typeof _5b.value=="object"&&!(_5b.value instanceof Date)){
+if(_55.value&&typeof _55.value=="object"&&!(_55.value instanceof Date)){
 }else{
-_5b.itemType="value";
-this._enableFields(_5b.itemType);
-_5b.jsonVal=typeof _5b.value=="function"?_5b.value.toString():_5b.value instanceof Date?"new Date(\""+_5b.value+"\")":dojo.toJson(_5b.value);
-this._editDialog.attr("value",_5b);
+_55.itemType="value";
+this._enableFields(_55.itemType);
+_55.jsonVal=typeof _55.value=="function"?_55.value.toString():_55.value instanceof Date?"new Date(\""+_55.value+"\")":dojo.toJson(_55.value);
+this._editDialog.attr("value",_55);
 this._editDialog.show();
 }
 }
 }
 },_destroyProperty:function(){
-var _5c=this.lastFocused;
-var _5d=_5c.item;
-var _5e=[];
-while(!this.store.isItem(_5d.parent,true)||_5d.parent instanceof Array){
-_5c=_5c.getParent();
-_5e.push(_5d.property);
-_5d=_5c.item;
-}
-if(dojo.indexOf(this.store.getIdentityAttributes(),_5d.property)>=0){
+var _56=this.lastFocused;
+var _57=_56.item;
+var _58=[];
+while(!this.store.isItem(_57.parent,true)||_57.parent instanceof Array){
+_56=_56.getParent();
+_58.push(_57.property);
+_57=_56.item;
+}
+if(dojo.indexOf(this.store.getIdentityAttributes(),_57.property)>=0){
 alert("Cannot Delete an Identifier!");
 }else{
 try{
-if(_5e.length>0){
-var _5f,_60=_1(this.store,_5d.parent,_5d.property);
-_5f=_60;
-while(_5e.length>1){
-_5f=_5f[_5e.pop()];
-}
-if(dojo.isArray(_5f)){
-_5f.splice(_5e,1);
+if(_58.length>0){
+var _59,_5a=_1(this.store,_57.parent,_57.property);
+_59=_5a;
+while(_58.length>1){
+_59=_59[_58.pop()];
+}
+if(dojo.isArray(_59)){
+_59.splice(_58,1);
 }else{
-delete _5f[_5e];
+delete _59[_58];
 }
-this.store.setValue(_5d.parent,_5d.property,_60);
+this.store.setValue(_57.parent,_57.property,_5a);
 }else{
-this.store.unsetAttribute(_5d.parent,_5d.property);
+this.store.unsetAttribute(_57.parent,_57.property);
 }
 }
 catch(e){
@@ -420,40 +420,40 @@ alert(e);
 }
 }
 },_addProperty:function(){
-var _61=this.lastFocused.item;
-var _62=_61.value;
-var _63=dojo.hitch(this,function(){
-var _64=null;
+var _5b=this.lastFocused.item;
+var _5c=_5b.value;
+var _5d=dojo.hitch(this,function(){
+var _5e=null;
 if(!this._editDialog){
 this._createEditDialog();
 }else{
 this._editDialog.reset();
 }
-if(_62 instanceof Array){
-_64=_62.length;
+if(_5c instanceof Array){
+_5e=_5c.length;
 dijit.getEnclosingWidget(dojo.query("input",this._editDialog.containerNode)[0]).attr("disabled",true);
 }else{
 dijit.getEnclosingWidget(dojo.query("input",this._editDialog.containerNode)[0]).attr("disabled",false);
 }
 this._editDialog.attr("title","Add Property");
 this._enableFields("value");
-this._editDialog.attr("value",{itemType:"value",property:_64});
+this._editDialog.attr("value",{itemType:"value",property:_5e});
 this._editDialog.show();
 });
-if(_61.addNew){
-_61=this.lastFocused.getParent().item;
-_62=this.lastFocused.item.parent;
+if(_5b.addNew){
+_5b=this.lastFocused.getParent().item;
+_5c=this.lastFocused.item.parent;
 }
-if(_61.property&&dojo.indexOf(this.store.getIdentityAttributes(),_61.property)>=0){
+if(_5b.property&&dojo.indexOf(this.store.getIdentityAttributes(),_5b.property)>=0){
 alert("Cannot add properties to an ID node!");
 }else{
-if(this.store.isItem(_62,true)&&!this.store.isItemLoaded(_62)){
-this.store.loadItem({item:_62,onItem:function(_65){
-_62=_65;
-_63();
+if(this.store.isItem(_5c,true)&&!this.store.isItemLoaded(_5c)){
+this.store.loadItem({item:_5c,onItem:function(_5f){
+_5c=_5f;
+_5d();
 }});
 }else{
-_63();
+_5d();
 }
 }
 }});
diff --git a/dojox/data/JsonRestStore.js b/dojox/data/JsonRestStore.js
index 55929f1..c215b10 100644
--- a/dojox/data/JsonRestStore.js
+++ b/dojox/data/JsonRestStore.js
@@ -14,7 +14,6 @@ dojo.declare("dojox.data.JsonRestStore",dojox.data.ServiceStore,{constructor:fun
 dojo.connect(dojox.rpc.Rest._index,"onUpdate",this,function(_2,_3,_4,_5){
 var _6=this.service.servicePath;
 if(!_2.__id){
-
 }else{
 if(_2.__id.substring(0,_6.length)==_6){
 this.onSet(_2,_3,_4,_5);
@@ -22,12 +21,16 @@ this.onSet(_2,_3,_4,_5);
 }
 });
 this.idAttribute=this.idAttribute||"id";
-if(typeof _1.target=="string"&&!this.service){
-this.service=dojox.rpc.Rest(this.target,true);
+if(typeof _1.target=="string"){
+_1.target=_1.target.match(/\/$/)||this.allowNoTrailingSlash?_1.target:(_1.target+"/");
+if(!this.service){
+this.service=dojox.rpc.JsonRest.services[_1.target]||dojox.rpc.Rest(_1.target,true);
+}
 }
 dojox.rpc.JsonRest.registerService(this.service,_1.target,this.schema);
 this.schema=this.service._schema=this.schema||this.service._schema||{};
 this.service._store=this;
+this.service.idAsRef=this.idAsRef;
 this.schema._idAttr=this.idAttribute;
 var _7=dojox.rpc.JsonRest.getConstructor(this.service);
 var _8=this;
@@ -37,11 +40,13 @@ _8.onNew(this);
 };
 this._constructor.prototype=_7.prototype;
 this._index=dojox.rpc.Rest._index;
-},referenceIntegrity:true,target:"",newItem:function(_a,_b){
+},loadReferencedSchema:true,idAsRef:false,referenceIntegrity:true,target:"",allowNoTrailingSlash:false,newItem:function(_a,_b){
 _a=new this._constructor(_a);
 if(_b){
 var _c=this.getValue(_b.parent,_b.attribute,[]);
-this.setValue(_b.parent,_b.attribute,_c.concat([_a]));
+_c=_c.concat([_a]);
+_a.__parent=_c;
+this.setValue(_b.parent,_b.attribute,_c);
 }
 return _a;
 },deleteItem:function(_d){
@@ -55,8 +60,9 @@ var _13;
 _e.push(_12);
 _12.__checked=1;
 for(var i in _12){
-var _15=_12[i];
-if(_15==_d){
+if(i.substring(0,2)!="__"){
+var _14=_12[i];
+if(_14==_d){
 if(_12!=_10){
 if(_12 instanceof Array){
 (_13=_13||[]).push(i);
@@ -65,12 +71,13 @@ if(_12 instanceof Array){
 }
 }
 }else{
-if((typeof _15=="object")&&_15){
-if(!_15.__checked){
-_11(_15);
+if((typeof _14=="object")&&_14){
+if(!_14.__checked){
+_11(_14);
+}
+if(typeof _14.__checked=="object"&&_12!=_10){
+(dojox.data._getStoreForItem(_12)||_f).setValue(_12,i,_14.__checked);
 }
-if(typeof _15.__checked=="object"&&_12!=_10){
-(dojox.data._getStoreForItem(_12)||_f).setValue(_12,i,_15.__checked);
 }
 }
 }
@@ -94,100 +101,130 @@ delete _e[i++].__checked;
 }
 dojox.rpc.JsonRest.deleteObject(_d);
 _f.onDelete(_d);
-},changing:function(_17,_18){
-dojox.rpc.JsonRest.changing(_17,_18);
-},setValue:function(_19,_1a,_1b){
-var old=_19[_1a];
-var _1d=_19.__id?dojox.data._getStoreForItem(_19):this;
-if(dojox.json.schema&&_1d.schema&&_1d.schema.properties){
-dojox.json.schema.mustBeValid(dojox.json.schema.checkPropertyChange(_1b,_1d.schema.properties[_1a]));
-}
-if(_1a==_1d.idAttribute){
+},changing:function(_15,_16){
+dojox.rpc.JsonRest.changing(_15,_16);
+},setValue:function(_17,_18,_19){
+var old=_17[_18];
+var _1a=_17.__id?dojox.data._getStoreForItem(_17):this;
+if(dojox.json.schema&&_1a.schema&&_1a.schema.properties){
+dojox.json.schema.mustBeValid(dojox.json.schema.checkPropertyChange(_19,_1a.schema.properties[_18]));
+}
+if(_18==_1a.idAttribute){
 throw new Error("Can not change the identity attribute for an item");
 }
-_1d.changing(_19);
-_19[_1a]=_1b;
-_1d.onSet(_19,_1a,old,_1b);
-},setValues:function(_1e,_1f,_20){
-if(!dojo.isArray(_20)){
-throw new Error("setValues expects to be passed an Array object as its value");
+_1a.changing(_17);
+_17[_18]=_19;
+if(_19&&!_19.__parent){
+_19.__parent=_17;
 }
-this.setValue(_1e,_1f,_20);
-},unsetAttribute:function(_21,_22){
-this.changing(_21);
-var old=_21[_22];
-delete _21[_22];
-this.onSet(_21,_22,old,undefined);
-},save:function(_24){
-if(!(_24&&_24.global)){
-(_24=_24||{}).service=this.service;
-}
-var _25=dojox.rpc.JsonRest.commit(_24);
-this.serverVersion=this._updates&&this._updates.length;
-return _25;
-},revert:function(_26){
-var _27=dojox.rpc.JsonRest.getDirtyObjects().concat([]);
-while(_27.length>0){
-var d=_27.pop();
-var _29=dojox.data._getStoreForItem(d.object||d.old);
-if(!d.object){
-_29.onNew(d.old);
-}else{
-if(!d.old){
-_29.onDelete(d.object);
-}else{
-for(var i in d.object){
-if(d.object[i]!=d.old[i]){
-_29.onSet(d.object,i,d.object[i],d.old[i]);
+_1a.onSet(_17,_18,old,_19);
+},setValues:function(_1b,_1c,_1d){
+if(!dojo.isArray(_1d)){
+throw new Error("setValues expects to be passed an Array object as its value");
 }
+this.setValue(_1b,_1c,_1d);
+},unsetAttribute:function(_1e,_1f){
+this.changing(_1e);
+var old=_1e[_1f];
+delete _1e[_1f];
+this.onSet(_1e,_1f,old,undefined);
+},save:function(_20){
+if(!(_20&&_20.global)){
+(_20=_20||{}).service=this.service;
 }
+if("syncMode" in _20?_20.syncMode:this.syncMode){
+dojox.rpc._sync=true;
 }
+var _21=dojox.rpc.JsonRest.commit(_20);
+this.serverVersion=this._updates&&this._updates.length;
+return _21;
+},revert:function(_22){
+dojox.rpc.JsonRest.revert(_22&&_22.global&&this.service);
+},isDirty:function(_23){
+return dojox.rpc.JsonRest.isDirty(_23);
+},isItem:function(_24,_25){
+return _24&&_24.__id&&(_25||this.service==dojox.rpc.JsonRest.getServiceAndId(_24.__id).service);
+},_doQuery:function(_26){
+var _27=typeof _26.queryStr=="string"?_26.queryStr:_26.query;
+var _28=dojox.rpc.JsonRest.query(this.service,_27,_26);
+var _29=this;
+if(this.loadReferencedSchema){
+_28.addCallback(function(_2a){
+var _2b=_28.ioArgs&&_28.ioArgs.xhr&&_28.ioArgs.xhr.getResponseHeader("Content-Type");
+var _2c=_2b&&_2b.match(/definedby\s*=\s*([^;]*)/);
+if(_2b&&!_2c){
+_2c=_28.ioArgs.xhr.getResponseHeader("Link");
+_2c=_2c&&_2c.match(/<([^>]*)>;\s*rel="?definedby"?/);
+}
+_2c=_2c&&_2c[1];
+if(_2c){
+var _2d=dojox.rpc.JsonRest.getServiceAndId((_29.target+_2c).replace(/^(.*\/)?(\w+:\/\/)|[^\/\.]+\/\.\.\/|^.*\/(\/)/,"$2$3"));
+var _2e=dojox.rpc.JsonRest.byId(_2d.service,_2d.id);
+_2e.addCallbacks(function(_2f){
+dojo.mixin(_29.schema,_2f);
+return _2a;
+},function(_30){
+console.error(_30);
+return _2a;
+});
+return _2e;
 }
+return undefined;
+});
 }
-dojox.rpc.JsonRest.revert(_26&&_26.global&&this.service);
-},isDirty:function(_2b){
-return dojox.rpc.JsonRest.isDirty(_2b);
-},isItem:function(_2c,_2d){
-return _2c&&_2c.__id&&(_2d||this.service==dojox.rpc.JsonRest.getServiceAndId(_2c.__id).service);
-},_doQuery:function(_2e){
-var _2f=typeof _2e.queryStr=="string"?_2e.queryStr:_2e.query;
-return dojox.rpc.JsonRest.query(this.service,_2f,_2e);
-},_processResults:function(_30,_31){
-var _32=_30.length;
-return {totalCount:_31.fullLength||(_31.request.count==_32?(_31.request.start||0)+_32*2:_32),items:_30};
+return _28;
+},_processResults:function(_31,_32){
+var _33=_31.length;
+return {totalCount:_32.fullLength||(_32.request.count==_33?(_32.request.start||0)+_33*2:_33),items:_31};
 },getConstructor:function(){
 return this._constructor;
-},getIdentity:function(_33){
-var id=_33.__clientId||_33.__id;
+},getIdentity:function(_34){
+var id=_34.__clientId||_34.__id;
 if(!id){
 return id;
 }
-var _35=this.service.servicePath;
+var _35=this.service.servicePath.replace(/[^\/]*$/,"");
 return id.substring(0,_35.length)!=_35?id:id.substring(_35.length);
 },fetchItemByIdentity:function(_36){
 var id=_36.identity;
-var _38=this;
+var _37=this;
 if(id.toString().match(/^(\w*:)?\//)){
-var _39=dojox.rpc.JsonRest.getServiceAndId(id);
-_38=_39.service._store;
-_36.identity=_39.id;
+var _38=dojox.rpc.JsonRest.getServiceAndId(id);
+_37=_38.service._store;
+_36.identity=_38.id;
 }
-_36._prefix=_38.service.servicePath;
-return _38.inherited(arguments);
+_36._prefix=_37.service.servicePath.replace(/[^\/]*$/,"");
+return _37.inherited(arguments);
 },onSet:function(){
 },onNew:function(){
 },onDelete:function(){
 },getFeatures:function(){
-var _3a=this.inherited(arguments);
-_3a["dojo.data.api.Write"]=true;
-_3a["dojo.data.api.Notification"]=true;
-return _3a;
+var _39=this.inherited(arguments);
+_39["dojo.data.api.Write"]=true;
+_39["dojo.data.api.Notification"]=true;
+return _39;
+},getParent:function(_3a){
+return _3a&&_3a.__parent;
 }});
-dojox.data._getStoreForItem=function(_3b){
-if(_3b.__id){
-var _3c=_3b.__id.toString().match(/.*\//)[0];
-var _3d=dojox.rpc.JsonRest.services[_3c];
-return _3d?_3d._store:new dojox.data.JsonRestStore({target:_3c});
+dojox.data.JsonRestStore.getStore=function(_3b,_3c){
+if(typeof _3b.target=="string"){
+_3b.target=_3b.target.match(/\/$/)||_3b.allowNoTrailingSlash?_3b.target:(_3b.target+"/");
+var _3d=(dojox.rpc.JsonRest.services[_3b.target]||{})._store;
+if(_3d){
+return _3d;
+}
+}
+return new (_3c||dojox.data.JsonRestStore)(_3b);
+};
+dojox.data._getStoreForItem=function(_3e){
+if(_3e.__id){
+var _3f=dojox.rpc.JsonRest.getServiceAndId(_3e.__id);
+if(_3f&&_3f.service._store){
+return _3f.service._store;
+}else{
+var _40=_3e.__id.toString().match(/.*\//)[0];
+return new dojox.data.JsonRestStore({target:_40});
+}
 }
 return null;
 };
diff --git a/dojox/data/KeyValueStore.js b/dojox/data/KeyValueStore.js
index dec80ab..b85904a 100644
--- a/dojox/data/KeyValueStore.js
+++ b/dojox/data/KeyValueStore.js
@@ -22,7 +22,10 @@ this._storeProp="_keyValueStore";
 this._features={"dojo.data.api.Read":true,"dojo.data.api.Identity":true};
 this._loadInProgress=false;
 this._queuedFetches=[];
-},url:"",data:"",_assertIsItem:function(_2){
+if(_1&&"urlPreventCache" in _1){
+this.urlPreventCache=_1.urlPreventCache?true:false;
+}
+},url:"",data:"",urlPreventCache:false,_assertIsItem:function(_2){
 if(!this.isItem(_2)){
 throw new Error("dojox.data.KeyValueStore: a function was passed an item argument that was not an item");
 }
@@ -61,107 +64,107 @@ return this._containsValue(_f,_10,_11,_12);
 },_containsValue:function(_13,_14,_15,_16){
 var _17=this.getValues(_13,_14);
 for(var i=0;i<_17.length;++i){
-var _19=_17[i];
-if(typeof _19==="string"&&_16){
-return (_19.match(_16)!==null);
+var _18=_17[i];
+if(typeof _18==="string"&&_16){
+return (_18.match(_16)!==null);
 }else{
-if(_15===_19){
+if(_15===_18){
 return true;
 }
 }
 }
 return false;
-},isItem:function(_1a){
-if(_1a&&_1a[this._storeProp]===this){
+},isItem:function(_19){
+if(_19&&_19[this._storeProp]===this){
 return true;
 }
 return false;
-},isItemLoaded:function(_1b){
-return this.isItem(_1b);
-},loadItem:function(_1c){
+},isItemLoaded:function(_1a){
+return this.isItem(_1a);
+},loadItem:function(_1b){
 },getFeatures:function(){
 return this._features;
-},close:function(_1d){
-},getLabel:function(_1e){
-return _1e[this._keyAttribute];
-},getLabelAttributes:function(_1f){
+},close:function(_1c){
+},getLabel:function(_1d){
+return _1d[this._keyAttribute];
+},getLabelAttributes:function(_1e){
 return [this._keyAttribute];
-},_fetchItems:function(_20,_21,_22){
-var _23=this;
-var _24=function(_25,_26){
-var _27=null;
-if(_25.query){
-_27=[];
-var _28=_25.queryOptions?_25.queryOptions.ignoreCase:false;
-var _29={};
-for(var key in _25.query){
-var _2b=_25.query[key];
-if(typeof _2b==="string"){
-_29[key]=dojo.data.util.filter.patternToRegExp(_2b,_28);
+},_fetchItems:function(_1f,_20,_21){
+var _22=this;
+var _23=function(_24,_25){
+var _26=null;
+if(_24.query){
+_26=[];
+var _27=_24.queryOptions?_24.queryOptions.ignoreCase:false;
+var _28={};
+for(var key in _24.query){
+var _29=_24.query[key];
+if(typeof _29==="string"){
+_28[key]=dojo.data.util.filter.patternToRegExp(_29,_27);
 }
 }
-for(var i=0;i<_26.length;++i){
-var _2d=true;
-var _2e=_26[i];
-for(var key in _25.query){
-var _2b=_25.query[key];
-if(!_23._containsValue(_2e,key,_2b,_29[key])){
-_2d=false;
+for(var i=0;i<_25.length;++i){
+var _2a=true;
+var _2b=_25[i];
+for(var key in _24.query){
+var _29=_24.query[key];
+if(!_22._containsValue(_2b,key,_29,_28[key])){
+_2a=false;
 }
 }
-if(_2d){
-_27.push(_2e);
+if(_2a){
+_26.push(_2b);
 }
 }
 }else{
-if(_25.identity){
-_27=[];
-var _2f;
-for(var key in _26){
-_2f=_26[key];
-if(_2f[_23._keyAttribute]==_25.identity){
-_27.push(_2f);
+if(_24.identity){
+_26=[];
+var _2c;
+for(var key in _25){
+_2c=_25[key];
+if(_2c[_22._keyAttribute]==_24.identity){
+_26.push(_2c);
 break;
 }
 }
 }else{
-if(_26.length>0){
-_27=_26.slice(0,_26.length);
+if(_25.length>0){
+_26=_25.slice(0,_25.length);
 }
 }
 }
-_21(_27,_25);
+_20(_26,_24);
 };
 if(this._loadFinished){
-_24(_20,this._arrayOfAllItems);
+_23(_1f,this._arrayOfAllItems);
 }else{
 if(this.url!==""){
 if(this._loadInProgress){
-this._queuedFetches.push({args:_20,filter:_24});
+this._queuedFetches.push({args:_1f,filter:_23});
 }else{
 this._loadInProgress=true;
-var _30={url:_23.url,handleAs:"json-comment-filtered"};
-var _31=dojo.xhrGet(_30);
-_31.addCallback(function(_32){
-_23._processData(_32);
-_24(_20,_23._arrayOfAllItems);
-_23._handleQueuedFetches();
+var _2d={url:_22.url,handleAs:"json-comment-filtered",preventCache:this.urlPreventCache};
+var _2e=dojo.xhrGet(_2d);
+_2e.addCallback(function(_2f){
+_22._processData(_2f);
+_23(_1f,_22._arrayOfAllItems);
+_22._handleQueuedFetches();
 });
-_31.addErrback(function(_33){
-_23._loadInProgress=false;
-throw _33;
+_2e.addErrback(function(_30){
+_22._loadInProgress=false;
+throw _30;
 });
 }
 }else{
 if(this._keyValueString){
 this._processData(eval(this._keyValueString));
 this._keyValueString=null;
-_24(_20,this._arrayOfAllItems);
+_23(_1f,this._arrayOfAllItems);
 }else{
 if(this._keyValueVar){
 this._processData(this._keyValueVar);
 this._keyValueVar=null;
-_24(_20,this._arrayOfAllItems);
+_23(_1f,this._arrayOfAllItems);
 }else{
 throw new Error("dojox.data.KeyValueStore: No source data was provided as either URL, String, or Javascript variable data input.");
 }
@@ -171,51 +174,51 @@ throw new Error("dojox.data.KeyValueStore: No source data was provided as either
 },_handleQueuedFetches:function(){
 if(this._queuedFetches.length>0){
 for(var i=0;i<this._queuedFetches.length;i++){
-var _35=this._queuedFetches[i];
-var _36=_35.filter;
-var _37=_35.args;
-if(_36){
-_36(_37,this._arrayOfAllItems);
+var _31=this._queuedFetches[i];
+var _32=_31.filter;
+var _33=_31.args;
+if(_32){
+_32(_33,this._arrayOfAllItems);
 }else{
-this.fetchItemByIdentity(_35.args);
+this.fetchItemByIdentity(_31.args);
 }
 }
 this._queuedFetches=[];
 }
-},_processData:function(_38){
+},_processData:function(_34){
 this._arrayOfAllItems=[];
-for(var i=0;i<_38.length;i++){
-this._arrayOfAllItems.push(this._createItem(_38[i]));
+for(var i=0;i<_34.length;i++){
+this._arrayOfAllItems.push(this._createItem(_34[i]));
 }
 this._loadFinished=true;
 this._loadInProgress=false;
-},_createItem:function(_3a){
-var _3b={};
-_3b[this._storeProp]=this;
-for(var i in _3a){
-_3b[this._keyAttribute]=i;
-_3b[this._valueAttribute]=_3a[i];
+},_createItem:function(_35){
+var _36={};
+_36[this._storeProp]=this;
+for(var i in _35){
+_36[this._keyAttribute]=i;
+_36[this._valueAttribute]=_35[i];
 break;
 }
-return _3b;
-},getIdentity:function(_3d){
-if(this.isItem(_3d)){
-return _3d[this._keyAttribute];
+return _36;
+},getIdentity:function(_37){
+if(this.isItem(_37)){
+return _37[this._keyAttribute];
 }
 return null;
-},getIdentityAttributes:function(_3e){
+},getIdentityAttributes:function(_38){
 return [this._keyAttribute];
-},fetchItemByIdentity:function(_3f){
-_3f.oldOnItem=_3f.onItem;
-_3f.onItem=null;
-_3f.onComplete=this._finishFetchItemByIdentity;
-this.fetch(_3f);
-},_finishFetchItemByIdentity:function(_40,_41){
-var _42=_41.scope||dojo.global;
-if(_40.length){
-_41.oldOnItem.call(_42,_40[0]);
+},fetchItemByIdentity:function(_39){
+_39.oldOnItem=_39.onItem;
+_39.onItem=null;
+_39.onComplete=this._finishFetchItemByIdentity;
+this.fetch(_39);
+},_finishFetchItemByIdentity:function(_3a,_3b){
+var _3c=_3b.scope||dojo.global;
+if(_3a.length){
+_3b.oldOnItem.call(_3c,_3a[0]);
 }else{
-_41.oldOnItem.call(_42,null);
+_3b.oldOnItem.call(_3c,null);
 }
 }});
 dojo.extend(dojox.data.KeyValueStore,dojo.data.util.simpleFetch);
diff --git a/dojox/data/OpenSearchStore.js b/dojox/data/OpenSearchStore.js
index 1bec283..6c0296d 100644
--- a/dojox/data/OpenSearchStore.js
+++ b/dojox/data/OpenSearchStore.js
@@ -17,13 +17,16 @@ if(_1){
 this.label=_1.label;
 this.url=_1.url;
 this.itemPath=_1.itemPath;
+if("urlPreventCache" in _1){
+this.urlPreventCache=_1.urlPreventCache?true:false;
 }
-var _2=dojo.xhrGet({url:this.url,handleAs:"xml",sync:true});
+}
+var _2=dojo.xhrGet({url:this.url,handleAs:"xml",sync:true,preventCache:this.urlPreventCache});
 _2.addCallback(this,"_processOsdd");
 _2.addErrback(function(){
 throw new Error("Unable to load OpenSearch Description document from ".args.url);
 });
-},url:"",itemPath:"",_storeRef:"_S",urlElement:null,iframeElement:null,ATOM_CONTENT_TYPE:3,ATOM_CONTENT_TYPE_STRING:"atom",RSS_CONTENT_TYPE:2,RSS_CONTENT_TYPE_STRING:"rss",XML_CONTENT_TYPE:1,XML_CONTENT_TYPE_STRING:"xml",_assertIsItem:function(_3){
+},url:"",itemPath:"",_storeRef:"_S",urlElement:null,iframeElement:null,urlPreventCache:true,ATOM_CONTENT_TYPE:3,ATOM_CONTENT_TYPE_STRING:"atom",RSS_CONTENT_TYPE:2,RSS_CONTENT_TYPE_STRING:"rss",XML_CONTENT_TYPE:1,XML_CONTENT_TYPE_STRING:"xml",_assertIsItem:function(_3){
 if(!this.isItem(_3)){
 throw new Error("dojox.data.OpenSearchStore: a function was passed an item argument that was not an item");
 }
@@ -61,145 +64,145 @@ return true;
 }
 }
 return false;
-},getValues:function(_15,_16){
-this._assertIsItem(_15);
-this._assertIsAttribute(_16);
-var _17=this.processItem(_15,_16);
-if(_17){
-return [_17];
+},getValues:function(_14,_15){
+this._assertIsItem(_14);
+this._assertIsAttribute(_15);
+var _16=this.processItem(_14,_15);
+if(_16){
+return [_16];
 }
 return undefined;
-},isItem:function(_18){
-if(_18&&_18[this._storeRef]===this){
+},isItem:function(_17){
+if(_17&&_17[this._storeRef]===this){
 return true;
 }
 return false;
-},close:function(_19){
-},process:function(_1a){
-return this["_processOSD"+this.contentType](_1a);
-},processItem:function(_1b,_1c){
-return this["_processItem"+this.contentType](_1b.node,_1c);
-},_createSearchUrl:function(_1d){
-var _1e=this.urlElement.attributes.getNamedItem("template").nodeValue;
-var _1f=this.urlElement.attributes;
-var _20=_1e.indexOf("{searchTerms}");
-_1e=_1e.substring(0,_20)+_1d.query.searchTerms+_1e.substring(_20+13);
-dojo.forEach([{"name":"count","test":_1d.count,"def":"10"},{"name":"startIndex","test":_1d.start,"def":this.urlElement.attributes.getNamedItem("indexOffset")?this.urlElement.attributes.getNamedItem("indexOffset").nodeValue:0},{"name":"startPage","test":_1d.startPage,"def":this.urlElement.attributes.getNamedItem("pageOffset")?this.urlElement.attributes.getNamedItem("pageOffset").nodeValue:0},{"name":"language","test":_1d.language,"def":"*"},{"name":"inputEncoding","test":_1d.inputEncoding [...]
-_1e=_1e.replace("{"+_21.name+"}",_21.test||_21.def);
-_1e=_1e.replace("{"+_21.name+"?}",_21.test||_21.def);
+},close:function(_18){
+},process:function(_19){
+return this["_processOSD"+this.contentType](_19);
+},processItem:function(_1a,_1b){
+return this["_processItem"+this.contentType](_1a.node,_1b);
+},_createSearchUrl:function(_1c){
+var _1d=this.urlElement.attributes.getNamedItem("template").nodeValue;
+var _1e=this.urlElement.attributes;
+var _1f=_1d.indexOf("{searchTerms}");
+_1d=_1d.substring(0,_1f)+_1c.query.searchTerms+_1d.substring(_1f+13);
+dojo.forEach([{"name":"count","test":_1c.count,"def":"10"},{"name":"startIndex","test":_1c.start,"def":this.urlElement.attributes.getNamedItem("indexOffset")?this.urlElement.attributes.getNamedItem("indexOffset").nodeValue:0},{"name":"startPage","test":_1c.startPage,"def":this.urlElement.attributes.getNamedItem("pageOffset")?this.urlElement.attributes.getNamedItem("pageOffset").nodeValue:0},{"name":"language","test":_1c.language,"def":"*"},{"name":"inputEncoding","test":_1c.inputEncoding [...]
+_1d=_1d.replace("{"+_20.name+"}",_20.test||_20.def);
+_1d=_1d.replace("{"+_20.name+"?}",_20.test||_20.def);
 });
-return _1e;
-},_fetchItems:function(_22,_23,_24){
-if(!_22.query){
-_22.query={};
-}
-var _25=this;
-var url=this._createSearchUrl(_22);
-var _27={url:url,preventCache:true};
-var xhr=dojo.xhrGet(_27);
-xhr.addErrback(function(_29){
-_24(_29,_22);
+return _1d;
+},_fetchItems:function(_21,_22,_23){
+if(!_21.query){
+_21.query={};
+}
+var _24=this;
+var url=this._createSearchUrl(_21);
+var _25={url:url,preventCache:this.urlPreventCache};
+var xhr=dojo.xhrGet(_25);
+xhr.addErrback(function(_26){
+_23(_26,_21);
 });
-xhr.addCallback(function(_2a){
-var _2b=[];
-if(_2a){
-_2b=_25.process(_2a);
-for(var i=0;i<_2b.length;i++){
-_2b[i]={node:_2b[i]};
-_2b[i][_25._storeRef]=_25;
+xhr.addCallback(function(_27){
+var _28=[];
+if(_27){
+_28=_24.process(_27);
+for(var i=0;i<_28.length;i++){
+_28[i]={node:_28[i]};
+_28[i][_24._storeRef]=_24;
 }
 }
-_23(_2b,_22);
+_22(_28,_21);
 });
-},_processOSDxml:function(_2d){
+},_processOSDxml:function(_29){
 var div=dojo.doc.createElement("div");
-div.innerHTML=_2d;
+div.innerHTML=_29;
 return dojo.query(this.itemPath,div);
-},_processItemxml:function(_2f,_30){
-if(_30==="content"){
-return _2f.innerHTML;
+},_processItemxml:function(_2a,_2b){
+if(_2b==="content"){
+return _2a.innerHTML;
 }
 return undefined;
-},_processOSDatom:function(_31){
-return this._processOSDfeed(_31,"entry");
-},_processItematom:function(_32,_33){
-return this._processItemfeed(_32,_33,"content");
-},_processOSDrss:function(_34){
-return this._processOSDfeed(_34,"item");
-},_processItemrss:function(_35,_36){
-return this._processItemfeed(_35,_36,"description");
-},_processOSDfeed:function(_37,_38){
-_37=dojox.xml.parser.parse(_37);
-var _39=[];
-var _3a=_37.getElementsByTagName(_38);
-for(var i=0;i<_3a.length;i++){
-_39.push(_3a.item(i));
-}
-return _39;
-},_processItemfeed:function(_3c,_3d,_3e){
-if(_3d==="content"){
-var _3f=_3c.getElementsByTagName(_3e).item(0);
-return this._getNodeXml(_3f,true);
+},_processOSDatom:function(_2c){
+return this._processOSDfeed(_2c,"entry");
+},_processItematom:function(_2d,_2e){
+return this._processItemfeed(_2d,_2e,"content");
+},_processOSDrss:function(_2f){
+return this._processOSDfeed(_2f,"item");
+},_processItemrss:function(_30,_31){
+return this._processItemfeed(_30,_31,"description");
+},_processOSDfeed:function(_32,_33){
+_32=dojox.xml.parser.parse(_32);
+var _34=[];
+var _35=_32.getElementsByTagName(_33);
+for(var i=0;i<_35.length;i++){
+_34.push(_35.item(i));
+}
+return _34;
+},_processItemfeed:function(_36,_37,_38){
+if(_37==="content"){
+var _39=_36.getElementsByTagName(_38).item(0);
+return this._getNodeXml(_39,true);
 }
 return undefined;
-},_getNodeXml:function(_40,_41){
+},_getNodeXml:function(_3a,_3b){
 var i;
-switch(_40.nodeType){
+switch(_3a.nodeType){
 case 1:
 var xml=[];
-if(!_41){
-xml.push("<"+_40.tagName);
-var _44;
-for(i=0;i<_40.attributes.length;i++){
-_44=_40.attributes.item(i);
-xml.push(" "+_44.nodeName+"=\""+_44.nodeValue+"\"");
+if(!_3b){
+xml.push("<"+_3a.tagName);
+var _3c;
+for(i=0;i<_3a.attributes.length;i++){
+_3c=_3a.attributes.item(i);
+xml.push(" "+_3c.nodeName+"=\""+_3c.nodeValue+"\"");
 }
 xml.push(">");
 }
-for(i=0;i<_40.childNodes.length;i++){
-xml.push(this._getNodeXml(_40.childNodes.item(i)));
+for(i=0;i<_3a.childNodes.length;i++){
+xml.push(this._getNodeXml(_3a.childNodes.item(i)));
 }
-if(!_41){
-xml.push("</"+_40.tagName+">\n");
+if(!_3b){
+xml.push("</"+_3a.tagName+">\n");
 }
 return xml.join("");
 case 3:
 case 4:
-return _40.nodeValue;
+return _3a.nodeValue;
 }
 return undefined;
 },_processOsdd:function(doc){
-var _46=doc.getElementsByTagName("Url");
-var _47=[];
-var _48;
+var _3d=doc.getElementsByTagName("Url");
+var _3e=[];
+var _3f;
 var i;
-for(i=0;i<_46.length;i++){
-_48=_46[i].attributes.getNamedItem("type").nodeValue;
-switch(_48){
+for(i=0;i<_3d.length;i++){
+_3f=_3d[i].attributes.getNamedItem("type").nodeValue;
+switch(_3f){
 case "application/rss+xml":
-_47[i]=this.RSS_CONTENT_TYPE;
+_3e[i]=this.RSS_CONTENT_TYPE;
 break;
 case "application/atom+xml":
-_47[i]=this.ATOM_CONTENT_TYPE;
+_3e[i]=this.ATOM_CONTENT_TYPE;
 break;
 default:
-_47[i]=this.XML_CONTENT_TYPE;
+_3e[i]=this.XML_CONTENT_TYPE;
 break;
 }
 }
-var _4a=0;
-var _4b=_47[0];
-for(i=1;i<_46.length;i++){
-if(_47[i]>_4b){
-_4a=i;
-_4b=_47[i];
+var _40=0;
+var _41=_3e[0];
+for(i=1;i<_3d.length;i++){
+if(_3e[i]>_41){
+_40=i;
+_41=_3e[i];
 }
 }
-var _4c=_46[_4a].nodeName.toLowerCase();
-if(_4c=="url"){
-var _4d=_46[_4a].attributes;
-this.urlElement=_46[_4a];
-switch(_47[_4a]){
+var _42=_3d[_40].nodeName.toLowerCase();
+if(_42=="url"){
+var _43=_3d[_40].attributes;
+this.urlElement=_3d[_40];
+switch(_3e[_40]){
 case this.ATOM_CONTENT_TYPE:
 this.contentType=this.ATOM_CONTENT_TYPE_STRING;
 break;
diff --git a/dojox/data/OpmlStore.js b/dojox/data/OpmlStore.js
index 2da8bd6..2972b58 100644
--- a/dojox/data/OpmlStore.js
+++ b/dojox/data/OpmlStore.js
@@ -26,7 +26,10 @@ this._queuedFetches=[];
 this._identityMap={};
 this._identCount=0;
 this._idProp="_I";
-},label:"text",url:"",_assertIsItem:function(_2){
+if(_1&&"urlPreventCache" in _1){
+this.urlPreventCache=_1.urlPreventCache?true:false;
+}
+},label:"text",url:"",urlPreventCache:false,_assertIsItem:function(_2){
 if(!this.isItem(_2)){
 throw new Error("dojo.data.OpmlStore: a function was passed an item argument that was not an item");
 }
@@ -40,191 +43,191 @@ if(_6.length===0){
 return;
 }
 var _7=[];
-var i,_9;
+var i,_8;
 for(i=0;i<_6.length;++i){
-_9=_6[i];
-if(_9.nodeType!=1){
-_7.push(_9);
+_8=_6[i];
+if(_8.nodeType!=1){
+_7.push(_8);
 }
 }
 for(i=0;i<_7.length;++i){
-_9=_7[i];
-_4.removeChild(_9);
+_8=_7[i];
+_4.removeChild(_8);
 }
 if(_5){
 for(i=0;i<_6.length;++i){
-_9=_6[i];
-this._removeChildNodesThatAreNotElementNodes(_9,_5);
+_8=_6[i];
+this._removeChildNodesThatAreNotElementNodes(_8,_5);
 }
 }
-},_processRawXmlTree:function(_a){
+},_processRawXmlTree:function(_9){
 this._loadFinished=true;
-this._xmlData=_a;
-var _b=_a.getElementsByTagName("head");
-var _c=_b[0];
-if(_c){
-this._removeChildNodesThatAreNotElementNodes(_c);
-this._metadataNodes=_c.childNodes;
-}
-var _d=_a.getElementsByTagName("body");
-var _e=_d[0];
-if(_e){
-this._removeChildNodesThatAreNotElementNodes(_e,true);
-var _f=_d[0].childNodes;
-for(var i=0;i<_f.length;++i){
-var _11=_f[i];
-if(_11.tagName=="outline"){
-this._identityMap[this._identCount]=_11;
+this._xmlData=_9;
+var _a=_9.getElementsByTagName("head");
+var _b=_a[0];
+if(_b){
+this._removeChildNodesThatAreNotElementNodes(_b);
+this._metadataNodes=_b.childNodes;
+}
+var _c=_9.getElementsByTagName("body");
+var _d=_c[0];
+if(_d){
+this._removeChildNodesThatAreNotElementNodes(_d,true);
+var _e=_c[0].childNodes;
+for(var i=0;i<_e.length;++i){
+var _f=_e[i];
+if(_f.tagName=="outline"){
+this._identityMap[this._identCount]=_f;
 this._identCount++;
-this._arrayOfTopLevelItems.push(_11);
-this._arrayOfAllItems.push(_11);
-this._checkChildNodes(_11);
+this._arrayOfTopLevelItems.push(_f);
+this._arrayOfAllItems.push(_f);
+this._checkChildNodes(_f);
 }
 }
 }
-},_checkChildNodes:function(_12){
-if(_12.firstChild){
-for(var i=0;i<_12.childNodes.length;i++){
-var _14=_12.childNodes[i];
-if(_14.tagName=="outline"){
-this._identityMap[this._identCount]=_14;
+},_checkChildNodes:function(_10){
+if(_10.firstChild){
+for(var i=0;i<_10.childNodes.length;i++){
+var _11=_10.childNodes[i];
+if(_11.tagName=="outline"){
+this._identityMap[this._identCount]=_11;
 this._identCount++;
-this._arrayOfAllItems.push(_14);
-this._checkChildNodes(_14);
+this._arrayOfAllItems.push(_11);
+this._checkChildNodes(_11);
 }
 }
 }
-},_getItemsArray:function(_15){
-if(_15&&_15.deep){
+},_getItemsArray:function(_12){
+if(_12&&_12.deep){
 return this._arrayOfAllItems;
 }
 return this._arrayOfTopLevelItems;
-},getValue:function(_16,_17,_18){
-this._assertIsItem(_16);
-this._assertIsAttribute(_17);
-if(_17=="children"){
-return (_16.firstChild||_18);
+},getValue:function(_13,_14,_15){
+this._assertIsItem(_13);
+this._assertIsAttribute(_14);
+if(_14=="children"){
+return (_13.firstChild||_15);
 }else{
-var _19=_16.getAttribute(_17);
-return (_19!==undefined)?_19:_18;
+var _16=_13.getAttribute(_14);
+return (_16!==undefined)?_16:_15;
 }
-},getValues:function(_1a,_1b){
-this._assertIsItem(_1a);
-this._assertIsAttribute(_1b);
-var _1c=[];
-if(_1b=="children"){
-for(var i=0;i<_1a.childNodes.length;++i){
-_1c.push(_1a.childNodes[i]);
+},getValues:function(_17,_18){
+this._assertIsItem(_17);
+this._assertIsAttribute(_18);
+var _19=[];
+if(_18=="children"){
+for(var i=0;i<_17.childNodes.length;++i){
+_19.push(_17.childNodes[i]);
 }
 }else{
-if(_1a.getAttribute(_1b)!==null){
-_1c.push(_1a.getAttribute(_1b));
-}
-}
-return _1c;
-},getAttributes:function(_1e){
-this._assertIsItem(_1e);
-var _1f=[];
-var _20=_1e;
-var _21=_20.attributes;
-for(var i=0;i<_21.length;++i){
-var _23=_21.item(i);
-_1f.push(_23.nodeName);
-}
-if(_20.childNodes.length>0){
-_1f.push("children");
-}
-return _1f;
-},hasAttribute:function(_24,_25){
-return (this.getValues(_24,_25).length>0);
-},containsValue:function(_26,_27,_28){
-var _29=undefined;
-if(typeof _28==="string"){
-_29=dojo.data.util.filter.patternToRegExp(_28,false);
-}
-return this._containsValue(_26,_27,_28,_29);
-},_containsValue:function(_2a,_2b,_2c,_2d){
-var _2e=this.getValues(_2a,_2b);
-for(var i=0;i<_2e.length;++i){
-var _30=_2e[i];
-if(typeof _30==="string"&&_2d){
-return (_30.match(_2d)!==null);
+if(_17.getAttribute(_18)!==null){
+_19.push(_17.getAttribute(_18));
+}
+}
+return _19;
+},getAttributes:function(_1a){
+this._assertIsItem(_1a);
+var _1b=[];
+var _1c=_1a;
+var _1d=_1c.attributes;
+for(var i=0;i<_1d.length;++i){
+var _1e=_1d.item(i);
+_1b.push(_1e.nodeName);
+}
+if(_1c.childNodes.length>0){
+_1b.push("children");
+}
+return _1b;
+},hasAttribute:function(_1f,_20){
+return (this.getValues(_1f,_20).length>0);
+},containsValue:function(_21,_22,_23){
+var _24=undefined;
+if(typeof _23==="string"){
+_24=dojo.data.util.filter.patternToRegExp(_23,false);
+}
+return this._containsValue(_21,_22,_23,_24);
+},_containsValue:function(_25,_26,_27,_28){
+var _29=this.getValues(_25,_26);
+for(var i=0;i<_29.length;++i){
+var _2a=_29[i];
+if(typeof _2a==="string"&&_28){
+return (_2a.match(_28)!==null);
 }else{
-if(_2c===_30){
+if(_27===_2a){
 return true;
 }
 }
 }
 return false;
-},isItem:function(_31){
-return (_31&&_31.nodeType==1&&_31.tagName=="outline"&&_31.ownerDocument===this._xmlData);
-},isItemLoaded:function(_32){
-return this.isItem(_32);
-},loadItem:function(_33){
-},getLabel:function(_34){
-if(this.isItem(_34)){
-return this.getValue(_34,this.label);
+},isItem:function(_2b){
+return (_2b&&_2b.nodeType==1&&_2b.tagName=="outline"&&_2b.ownerDocument===this._xmlData);
+},isItemLoaded:function(_2c){
+return this.isItem(_2c);
+},loadItem:function(_2d){
+},getLabel:function(_2e){
+if(this.isItem(_2e)){
+return this.getValue(_2e,this.label);
 }
 return undefined;
-},getLabelAttributes:function(_35){
+},getLabelAttributes:function(_2f){
 return [this.label];
-},_fetchItems:function(_36,_37,_38){
-var _39=this;
-var _3a=function(_3b,_3c){
-var _3d=null;
-if(_3b.query){
-_3d=[];
-var _3e=_3b.queryOptions?_3b.queryOptions.ignoreCase:false;
-var _3f={};
-for(var key in _3b.query){
-var _41=_3b.query[key];
-if(typeof _41==="string"){
-_3f[key]=dojo.data.util.filter.patternToRegExp(_41,_3e);
+},_fetchItems:function(_30,_31,_32){
+var _33=this;
+var _34=function(_35,_36){
+var _37=null;
+if(_35.query){
+_37=[];
+var _38=_35.queryOptions?_35.queryOptions.ignoreCase:false;
+var _39={};
+for(var key in _35.query){
+var _3a=_35.query[key];
+if(typeof _3a==="string"){
+_39[key]=dojo.data.util.filter.patternToRegExp(_3a,_38);
 }
 }
-for(var i=0;i<_3c.length;++i){
-var _43=true;
-var _44=_3c[i];
-for(var key in _3b.query){
-var _41=_3b.query[key];
-if(!_39._containsValue(_44,key,_41,_3f[key])){
-_43=false;
+for(var i=0;i<_36.length;++i){
+var _3b=true;
+var _3c=_36[i];
+for(var key in _35.query){
+var _3a=_35.query[key];
+if(!_33._containsValue(_3c,key,_3a,_39[key])){
+_3b=false;
 }
 }
-if(_43){
-_3d.push(_44);
+if(_3b){
+_37.push(_3c);
 }
 }
 }else{
-if(_3c.length>0){
-_3d=_3c.slice(0,_3c.length);
+if(_36.length>0){
+_37=_36.slice(0,_36.length);
 }
 }
-_37(_3d,_3b);
+_31(_37,_35);
 };
 if(this._loadFinished){
-_3a(_36,this._getItemsArray(_36.queryOptions));
+_34(_30,this._getItemsArray(_30.queryOptions));
 }else{
 if(this._loadInProgress){
-this._queuedFetches.push({args:_36,filter:_3a});
+this._queuedFetches.push({args:_30,filter:_34});
 }else{
 if(this.url!==""){
 this._loadInProgress=true;
-var _45={url:_39.url,handleAs:"xml"};
-var _46=dojo.xhrGet(_45);
-_46.addCallback(function(_47){
-_39._processRawXmlTree(_47);
-_3a(_36,_39._getItemsArray(_36.queryOptions));
-_39._handleQueuedFetches();
+var _3d={url:_33.url,handleAs:"xml",preventCache:_33.urlPreventCache};
+var _3e=dojo.xhrGet(_3d);
+_3e.addCallback(function(_3f){
+_33._processRawXmlTree(_3f);
+_34(_30,_33._getItemsArray(_30.queryOptions));
+_33._handleQueuedFetches();
 });
-_46.addErrback(function(_48){
-throw _48;
+_3e.addErrback(function(_40){
+throw _40;
 });
 }else{
 if(this._opmlData){
 this._processRawXmlTree(this._opmlData);
 this._opmlData=null;
-_3a(_36,this._getItemsArray(_36.queryOptions));
+_34(_30,this._getItemsArray(_30.queryOptions));
 }else{
 throw new Error("dojox.data.OpmlStore: No OPML source data was provided as either URL or XML data input.");
 }
@@ -232,51 +235,51 @@ throw new Error("dojox.data.OpmlStore: No OPML source data was provided as eithe
 }
 }
 },getFeatures:function(){
-var _49={"dojo.data.api.Read":true,"dojo.data.api.Identity":true};
-return _49;
-},getIdentity:function(_4a){
-if(this.isItem(_4a)){
+var _41={"dojo.data.api.Read":true,"dojo.data.api.Identity":true};
+return _41;
+},getIdentity:function(_42){
+if(this.isItem(_42)){
 for(var i in this._identityMap){
-if(this._identityMap[i]===_4a){
+if(this._identityMap[i]===_42){
 return i;
 }
 }
 }
 return null;
-},fetchItemByIdentity:function(_4c){
+},fetchItemByIdentity:function(_43){
 if(!this._loadFinished){
-var _4d=this;
+var _44=this;
 if(this.url!==""){
 if(this._loadInProgress){
-this._queuedFetches.push({args:_4c});
+this._queuedFetches.push({args:_43});
 }else{
 this._loadInProgress=true;
-var _4e={url:_4d.url,handleAs:"xml"};
-var _4f=dojo.xhrGet(_4e);
-_4f.addCallback(function(_50){
-var _51=_4c.scope?_4c.scope:dojo.global;
+var _45={url:_44.url,handleAs:"xml"};
+var _46=dojo.xhrGet(_45);
+_46.addCallback(function(_47){
+var _48=_43.scope?_43.scope:dojo.global;
 try{
-_4d._processRawXmlTree(_50);
-var _52=_4d._identityMap[_4c.identity];
-if(!_4d.isItem(_52)){
-_52=null;
+_44._processRawXmlTree(_47);
+var _49=_44._identityMap[_43.identity];
+if(!_44.isItem(_49)){
+_49=null;
 }
-if(_4c.onItem){
-_4c.onItem.call(_51,_52);
+if(_43.onItem){
+_43.onItem.call(_48,_49);
 }
-_4d._handleQueuedFetches();
+_44._handleQueuedFetches();
 }
 catch(error){
-if(_4c.onError){
-_4c.onError.call(_51,error);
+if(_43.onError){
+_43.onError.call(_48,error);
 }
 }
 });
-_4f.addErrback(function(_53){
+_46.addErrback(function(_4a){
 this._loadInProgress=false;
-if(_4c.onError){
-var _54=_4c.scope?_4c.scope:dojo.global;
-_4c.onError.call(_54,_53);
+if(_43.onError){
+var _4b=_43.scope?_43.scope:dojo.global;
+_43.onError.call(_4b,_4a);
 }
 });
 }
@@ -284,43 +287,43 @@ _4c.onError.call(_54,_53);
 if(this._opmlData){
 this._processRawXmlTree(this._opmlData);
 this._opmlData=null;
-var _55=this._identityMap[_4c.identity];
-if(!_4d.isItem(_55)){
-_55=null;
+var _4c=this._identityMap[_43.identity];
+if(!_44.isItem(_4c)){
+_4c=null;
 }
-if(_4c.onItem){
-var _56=_4c.scope?_4c.scope:dojo.global;
-_4c.onItem.call(_56,_55);
+if(_43.onItem){
+var _4d=_43.scope?_43.scope:dojo.global;
+_43.onItem.call(_4d,_4c);
 }
 }
 }
 }else{
-var _55=this._identityMap[_4c.identity];
-if(!this.isItem(_55)){
-_55=null;
+var _4c=this._identityMap[_43.identity];
+if(!this.isItem(_4c)){
+_4c=null;
 }
-if(_4c.onItem){
-var _56=_4c.scope?_4c.scope:dojo.global;
-_4c.onItem.call(_56,_55);
+if(_43.onItem){
+var _4d=_43.scope?_43.scope:dojo.global;
+_43.onItem.call(_4d,_4c);
 }
 }
-},getIdentityAttributes:function(_57){
+},getIdentityAttributes:function(_4e){
 return null;
 },_handleQueuedFetches:function(){
 if(this._queuedFetches.length>0){
 for(var i=0;i<this._queuedFetches.length;i++){
-var _59=this._queuedFetches[i];
-var _5a=_59.args;
-var _5b=_59.filter;
-if(_5b){
-_5b(_5a,this._getItemsArray(_5a.queryOptions));
+var _4f=this._queuedFetches[i];
+var _50=_4f.args;
+var _51=_4f.filter;
+if(_51){
+_51(_50,this._getItemsArray(_50.queryOptions));
 }else{
-this.fetchItemByIdentity(_5a);
+this.fetchItemByIdentity(_50);
 }
 }
 this._queuedFetches=[];
 }
-},close:function(_5c){
+},close:function(_52){
 }});
 dojo.extend(dojox.data.OpmlStore,dojo.data.util.simpleFetch);
 }
diff --git a/dojox/data/PersevereStore.js b/dojox/data/PersevereStore.js
index b96e4f1..87f8e9a 100644
--- a/dojox/data/PersevereStore.js
+++ b/dojox/data/PersevereStore.js
@@ -42,15 +42,15 @@ dojox.rpc.Rest._index[_d.prototype.__id]=_d.prototype=dojo.mixin(dojo.delegate(_
 function _e(_f,_10){
 if(_f&&_10){
 for(var j in _f){
-var _12=_f[j];
-if(_12.runAt=="server"&&!_10[j]){
-_10[j]=(function(_13){
+var _11=_f[j];
+if(_11.runAt!="client"&&!_10[j]){
+_10[j]=(function(_12){
 return function(){
-var _14=dojo.rawXhrPost({url:this.__id,postData:dojo.toJson({method:_13,id:_a++,params:dojo._toArray(arguments)}),handleAs:"json"});
-_14.addCallback(function(_15){
-return _15.error?new Error(_15.error):_15.result;
+var _13=dojo.rawXhrPost({url:this.__id,postData:dojo.toJson({method:_12,id:_a++,params:dojo._toArray(arguments)}),handleAs:"json"});
+_13.addCallback(function(_14){
+return _14.error?new Error(_14.error):_14.result;
 });
-return _14;
+return _13;
 };
 })(j);
 }
@@ -59,11 +59,11 @@ return _14;
 };
 for(var i in _b){
 if(typeof _b[i]=="object"){
-var _17=_b[i];
-_c(_17);
-_e(_17.methods,_17.prototype=_17.prototype||{});
-_e(_17.staticMethods,_17);
-_9[_b[i].id]=new dojox.data.PersevereStore({target:new dojo._Url(_1,_b[i].id)+"",schema:_17});
+var _15=_b[i];
+_c(_15);
+_e(_15.methods,_15.prototype=_15.prototype||{});
+_e(_15.staticMethods,_15);
+_9[_b[i].id]=new dojox.data.PersevereStore({target:new dojo._Url(_1,_b[i].id)+"/",schema:_15});
 }
 }
 return (_8=_9);
diff --git a/dojox/data/PicasaStore.js b/dojox/data/PicasaStore.js
index e6c42c9..473dbb3 100644
--- a/dojox/data/PicasaStore.js
+++ b/dojox/data/PicasaStore.js
@@ -15,7 +15,16 @@ dojo.declare("dojox.data.PicasaStore",null,{constructor:function(_1){
 if(_1&&_1.label){
 this.label=_1.label;
 }
-},_picasaUrl:"http://picasaweb.google.com/data/feed/api/all",_storeRef:"_S",label:"title",_assertIsItem:function(_2){
+if(_1&&"urlPreventCache" in _1){
+this.urlPreventCache=_1.urlPreventCache?true:false;
+}
+if(_1&&"maxResults" in _1){
+this.maxResults=parseInt(_1.maxResults);
+if(!this.maxResults){
+this.maxResults=20;
+}
+}
+},_picasaUrl:"http://picasaweb.google.com/data/feed/api/all",_storeRef:"_S",label:"title",urlPreventCache:false,maxResults:20,_assertIsItem:function(_2){
 if(!this.isItem(_2)){
 throw new Error("dojox.data.PicasaStore: a function was passed an item argument that was not an item");
 }
@@ -32,7 +41,7 @@ return _7[0];
 }
 return _6;
 },getAttributes:function(_8){
-return ["id","published","updated","category","title$type","title","summary$type","summary","rights$type","rights","link","author","gphoto$id","gphoto$name","location"];
+return ["id","published","updated","category","title$type","title","summary$type","summary","rights$type","rights","link","author","gphoto$id","gphoto$name","location","imageUrlSmall","imageUrlMedium","imageUrl","datePublished","dateTaken","description"];
 },hasAttribute:function(_9,_a){
 if(this.getValue(_9,_a)){
 return true;
@@ -53,38 +62,42 @@ return true;
 }
 }
 return false;
-},getValues:function(_14,_15){
-this._assertIsItem(_14);
-this._assertIsAttribute(_15);
-if(_15==="title"){
-return [this._unescapeHtml(_14.title)];
+},getValues:function(_13,_14){
+this._assertIsItem(_13);
+this._assertIsAttribute(_14);
+if(_14==="title"){
+return [this._unescapeHtml(_13.title)];
+}else{
+if(_14==="author"){
+return [this._unescapeHtml(_13.author[0].name)];
 }else{
-if(_15==="author"){
-return [this._unescapeHtml(_14.author[0].name)];
+if(_14==="datePublished"){
+return [dojo.date.stamp.fromISOString(_13.published)];
 }else{
-if(_15==="datePublished"){
-return [dojo.date.stamp.fromISOString(_14.published)];
+if(_14==="dateTaken"){
+return [dojo.date.stamp.fromISOString(_13.published)];
 }else{
-if(_15==="dateTaken"){
-return [dojo.date.stamp.fromISOString(_14.date_taken)];
+if(_14==="updated"){
+return [dojo.date.stamp.fromISOString(_13.updated)];
 }else{
-if(_15==="imageUrlSmall"){
-return [_14.media.thumbnail[1].url];
+if(_14==="imageUrlSmall"){
+return [_13.media.thumbnail[1].url];
 }else{
-if(_15==="imageUrl"){
-return [_14.content$src];
+if(_14==="imageUrl"){
+return [_13.content$src];
 }else{
-if(_15==="imageUrlMedium"){
-return [_14.media.thumbnail[2].url];
+if(_14==="imageUrlMedium"){
+return [_13.media.thumbnail[2].url];
 }else{
-if(_15==="link"){
-return [_14.link[1]];
+if(_14==="link"){
+return [_13.link[1]];
 }else{
-if(_15==="tags"){
-return _14.tags.split(" ");
+if(_14==="tags"){
+return _13.tags.split(" ");
 }else{
-if(_15==="description"){
-return [this._unescapeHtml(_14.summary)];
+if(_14==="description"){
+return [this._unescapeHtml(_13.summary)];
+}
 }
 }
 }
@@ -96,65 +109,63 @@ return [this._unescapeHtml(_14.summary)];
 }
 }
 return [];
-},isItem:function(_16){
-if(_16&&_16[this._storeRef]===this){
+},isItem:function(_15){
+if(_15&&_15[this._storeRef]===this){
 return true;
 }
 return false;
-},close:function(_17){
-},_fetchItems:function(_18,_19,_1a){
-if(!_18.query){
-_18.query={};
-}
-var _1b={alt:"jsonm",pp:"1",psc:"G"};
-_1b["start-index"]="1";
-if(_18.query.start){
-_1b["start-index"]=_18.query.start;
+},close:function(_16){
+},_fetchItems:function(_17,_18,_19){
+if(!_17.query){
+_17.query={};
 }
-if(_18.query.tags){
-_1b.q=_18.query.tags;
+var _1a={alt:"jsonm",pp:"1",psc:"G"};
+_1a["start-index"]="1";
+if(_17.query.start){
+_1a["start-index"]=_17.query.start;
 }
-if(_18.query.userid){
-_1b.uname=_18.query.userid;
+if(_17.query.tags){
+_1a.q=_17.query.tags;
 }
-if(_18.query.userids){
-_1b.ids=_18.query.userids;
+if(_17.query.userid){
+_1a.uname=_17.query.userid;
 }
-if(_18.query.lang){
-_1b.hl=_18.query.lang;
+if(_17.query.userids){
+_1a.ids=_17.query.userids;
 }
-if(_18.count){
-_1b["max-results"]=_18.count;
-}else{
-_1b["max-results"]="20";
+if(_17.query.lang){
+_1a.hl=_17.query.lang;
 }
-var _1c=this;
-var _1d=null;
-var _1e=function(_1f){
-if(_1d!==null){
-dojo.disconnect(_1d);
+_1a["max-results"]=this.maxResults;
+var _1b=this;
+var _1c=null;
+var _1d=function(_1e){
+if(_1c!==null){
+dojo.disconnect(_1c);
 }
-_19(_1c._processPicasaData(_1f),_18);
+_18(_1b._processPicasaData(_1e),_17);
 };
-var _20={url:this._picasaUrl,content:_1b,callbackParamName:"callback",handle:_1e};
-var _21=dojo.io.script.get(_20);
-_21.addErrback(function(_22){
-dojo.disconnect(_1d);
-_1a(_22,_18);
+var _1f={url:this._picasaUrl,preventCache:this.urlPreventCache,content:_1a,callbackParamName:"callback",handle:_1d};
+var _20=dojo.io.script.get(_1f);
+_20.addErrback(function(_21){
+dojo.disconnect(_1c);
+_19(_21,_17);
 });
-},_processPicasaData:function(_23){
-var _24=[];
-if(_23.feed){
-_24=_23.feed.entry;
-for(var i=0;i<_24.length;i++){
-var _26=_24[i];
-_26[this._storeRef]=this;
+},_processPicasaData:function(_22){
+var _23=[];
+if(_22.feed){
+_23=_22.feed.entry;
+for(var i=0;i<_23.length;i++){
+var _24=_23[i];
+_24[this._storeRef]=this;
 }
 }
-return _24;
+return _23;
 },_unescapeHtml:function(str){
+if(str){
 str=str.replace(/&/gm,"&").replace(/</gm,"<").replace(/>/gm,">").replace(/"/gm,"\"");
 str=str.replace(/'/gm,"'");
+}
 return str;
 }});
 dojo.extend(dojox.data.PicasaStore,dojo.data.util.simpleFetch);
diff --git a/dojox/data/QueryReadStore.js b/dojox/data/QueryReadStore.js
index 427d6ab..eec2c92 100644
--- a/dojox/data/QueryReadStore.js
+++ b/dojox/data/QueryReadStore.js
@@ -21,7 +21,6 @@ if(!this.hasAttribute(_2,_3)){
 if(_4){
 return _4;
 }
-
 }
 return _2.i[_3];
 },getValues:function(_5,_6){
@@ -38,117 +37,117 @@ for(var i in _8.i){
 _9.push(i);
 }
 return _9;
-},hasAttribute:function(_b,_c){
-return this.isItem(_b)&&typeof _b.i[_c]!="undefined";
-},containsValue:function(_d,_e,_f){
-var _10=this.getValues(_d,_e);
-var len=_10.length;
+},hasAttribute:function(_a,_b){
+return this.isItem(_a)&&typeof _a.i[_b]!="undefined";
+},containsValue:function(_c,_d,_e){
+var _f=this.getValues(_c,_d);
+var len=_f.length;
 for(var i=0;i<len;i++){
-if(_10[i]==_f){
+if(_f[i]==_e){
 return true;
 }
 }
 return false;
-},isItem:function(_13){
-if(_13){
-return typeof _13.r!="undefined"&&_13.r==this;
+},isItem:function(_10){
+if(_10){
+return typeof _10.r!="undefined"&&_10.r==this;
 }
 return false;
-},isItemLoaded:function(_14){
-return this.isItem(_14);
-},loadItem:function(_15){
-if(this.isItemLoaded(_15.item)){
+},isItemLoaded:function(_11){
+return this.isItem(_11);
+},loadItem:function(_12){
+if(this.isItemLoaded(_12.item)){
 return;
 }
-},fetch:function(_16){
-_16=_16||{};
-if(!_16.store){
-_16.store=this;
+},fetch:function(_13){
+_13=_13||{};
+if(!_13.store){
+_13.store=this;
 }
-var _17=this;
-var _18=function(_19,_1a){
-if(_1a.onError){
-var _1b=_1a.scope||dojo.global;
-_1a.onError.call(_1b,_19,_1a);
+var _14=this;
+var _15=function(_16,_17){
+if(_17.onError){
+var _18=_17.scope||dojo.global;
+_17.onError.call(_18,_16,_17);
 }
 };
-var _1c=function(_1d,_1e,_1f){
-var _20=_1e.abort||null;
-var _21=false;
-var _22=_1e.start?_1e.start:0;
-if(_17.doClientPaging==false){
-_22=0;
-}
-var _23=_1e.count?(_22+_1e.count):_1d.length;
-_1e.abort=function(){
-_21=true;
-if(_20){
-_20.call(_1e);
+var _19=function(_1a,_1b,_1c){
+var _1d=_1b.abort||null;
+var _1e=false;
+var _1f=_1b.start?_1b.start:0;
+if(_14.doClientPaging==false){
+_1f=0;
+}
+var _20=_1b.count?(_1f+_1b.count):_1a.length;
+_1b.abort=function(){
+_1e=true;
+if(_1d){
+_1d.call(_1b);
 }
 };
-var _24=_1e.scope||dojo.global;
-if(!_1e.store){
-_1e.store=_17;
+var _21=_1b.scope||dojo.global;
+if(!_1b.store){
+_1b.store=_14;
 }
-if(_1e.onBegin){
-_1e.onBegin.call(_24,_1f,_1e);
+if(_1b.onBegin){
+_1b.onBegin.call(_21,_1c,_1b);
 }
-if(_1e.sort&&_17.doClientSorting){
-_1d.sort(dojo.data.util.sorter.createSortFunction(_1e.sort,_17));
+if(_1b.sort&&_14.doClientSorting){
+_1a.sort(dojo.data.util.sorter.createSortFunction(_1b.sort,_14));
 }
-if(_1e.onItem){
-for(var i=_22;(i<_1d.length)&&(i<_23);++i){
-var _26=_1d[i];
-if(!_21){
-_1e.onItem.call(_24,_26,_1e);
+if(_1b.onItem){
+for(var i=_1f;(i<_1a.length)&&(i<_20);++i){
+var _22=_1a[i];
+if(!_1e){
+_1b.onItem.call(_21,_22,_1b);
 }
 }
 }
-if(_1e.onComplete&&!_21){
-var _27=null;
-if(!_1e.onItem){
-_27=_1d.slice(_22,_23);
+if(_1b.onComplete&&!_1e){
+var _23=null;
+if(!_1b.onItem){
+_23=_1a.slice(_1f,_20);
 }
-_1e.onComplete.call(_24,_27,_1e);
+_1b.onComplete.call(_21,_23,_1b);
 }
 };
-this._fetchItems(_16,_1c,_18);
-return _16;
+this._fetchItems(_13,_19,_15);
+return _13;
 },getFeatures:function(){
 return this._features;
-},close:function(_28){
-},getLabel:function(_29){
-if(this._labelAttr&&this.isItem(_29)){
-return this.getValue(_29,this._labelAttr);
+},close:function(_24){
+},getLabel:function(_25){
+if(this._labelAttr&&this.isItem(_25)){
+return this.getValue(_25,this._labelAttr);
 }
 return undefined;
-},getLabelAttributes:function(_2a){
+},getLabelAttributes:function(_26){
 if(this._labelAttr){
 return [this._labelAttr];
 }
 return null;
-},_xhrFetchHandler:function(_2b,_2c,_2d,_2e){
-_2b=this._filterResponse(_2b);
-if(_2b.label){
-this._labelAttr=_2b.label;
+},_xhrFetchHandler:function(_27,_28,_29,_2a){
+_27=this._filterResponse(_27);
+if(_27.label){
+this._labelAttr=_27.label;
 }
-var _2f=_2b.numRows||-1;
+var _2b=_27.numRows||-1;
 this._items=[];
-dojo.forEach(_2b.items,function(e){
+dojo.forEach(_27.items,function(e){
 this._items.push({i:e,r:this});
 },this);
-var _31=_2b.identifier;
+var _2c=_27.identifier;
 this._itemsByIdentity={};
-if(_31){
-this._identifier=_31;
+if(_2c){
+this._identifier=_2c;
 var i;
 for(i=0;i<this._items.length;++i){
-var _33=this._items[i].i;
-var _34=_33[_31];
-if(!this._itemsByIdentity[_34]){
-this._itemsByIdentity[_34]=_33;
+var _2d=this._items[i].i;
+var _2e=_2d[_2c];
+if(!this._itemsByIdentity[_2e]){
+this._itemsByIdentity[_2e]=_2d;
 }else{
-throw new Error(this._className+":  The json data as specified by: ["+this.url+"] is malformed.  Items within the list have identifier: ["+_31+"].  Value collided: ["+_34+"]");
+throw new Error(this._className+":  The json data as specified by: ["+this.url+"] is malformed.  Items within the list have identifier: ["+_2c+"].  Value collided: ["+_2e+"]");
 }
 }
 }else{
@@ -157,99 +156,99 @@ for(i=0;i<this._items.length;++i){
 this._items[i].n=i;
 }
 }
-_2f=this._numRows=(_2f===-1)?this._items.length:_2f;
-_2d(this._items,_2c,_2f);
-this._numRows=_2f;
-},_fetchItems:function(_35,_36,_37){
-var _38=_35.serverQuery||_35.query||{};
+_2b=this._numRows=(_2b===-1)?this._items.length:_2b;
+_29(this._items,_28,_2b);
+this._numRows=_2b;
+},_fetchItems:function(_2f,_30,_31){
+var _32=_2f.serverQuery||_2f.query||{};
 if(!this.doClientPaging){
-_38.start=_35.start||0;
-if(_35.count){
-_38.count=_35.count;
+_32.start=_2f.start||0;
+if(_2f.count){
+_32.count=_2f.count;
 }
 }
 if(!this.doClientSorting){
-if(_35.sort){
-var _39=_35.sort[0];
-if(_39&&_39.attribute){
-var _3a=_39.attribute;
-if(_39.descending){
-_3a="-"+_3a;
+if(_2f.sort){
+var _33=_2f.sort[0];
+if(_33&&_33.attribute){
+var _34=_33.attribute;
+if(_33.descending){
+_34="-"+_34;
 }
-_38.sort=_3a;
+_32.sort=_34;
 }
 }
 }
-if(this.doClientPaging&&this._lastServerQuery!==null&&dojo.toJson(_38)==dojo.toJson(this._lastServerQuery)){
+if(this.doClientPaging&&this._lastServerQuery!==null&&dojo.toJson(_32)==dojo.toJson(this._lastServerQuery)){
 this._numRows=(this._numRows===-1)?this._items.length:this._numRows;
-_36(this._items,_35,this._numRows);
+_30(this._items,_2f,this._numRows);
 }else{
-var _3b=this.requestMethod.toLowerCase()=="post"?dojo.xhrPost:dojo.xhrGet;
-var _3c=_3b({url:this.url,handleAs:"json-comment-optional",content:_38});
-_3c.addCallback(dojo.hitch(this,function(_3d){
-this._xhrFetchHandler(_3d,_35,_36,_37);
+var _35=this.requestMethod.toLowerCase()=="post"?dojo.xhrPost:dojo.xhrGet;
+var _36=_35({url:this.url,handleAs:"json-comment-optional",content:_32});
+_36.addCallback(dojo.hitch(this,function(_37){
+this._xhrFetchHandler(_37,_2f,_30,_31);
 }));
-_3c.addErrback(function(_3e){
-_37(_3e,_35);
+_36.addErrback(function(_38){
+_31(_38,_2f);
 });
 this.lastRequestHash=new Date().getTime()+"-"+String(Math.random()).substring(2);
-this._lastServerQuery=dojo.mixin({},_38);
+this._lastServerQuery=dojo.mixin({},_32);
 }
-},_filterResponse:function(_3f){
-return _3f;
-},_assertIsItem:function(_40){
-if(!this.isItem(_40)){
+},_filterResponse:function(_39){
+return _39;
+},_assertIsItem:function(_3a){
+if(!this.isItem(_3a)){
 throw new Error(this._className+": Invalid item argument.");
 }
-},_assertIsAttribute:function(_41){
-if(typeof _41!=="string"){
-throw new Error(this._className+": Invalid attribute argument ('"+_41+"').");
+},_assertIsAttribute:function(_3b){
+if(typeof _3b!=="string"){
+throw new Error(this._className+": Invalid attribute argument ('"+_3b+"').");
 }
-},fetchItemByIdentity:function(_42){
+},fetchItemByIdentity:function(_3c){
 if(this._itemsByIdentity){
-var _43=this._itemsByIdentity[_42.identity];
-if(!(_43===undefined)){
-if(_42.onItem){
-var _44=_42.scope?_42.scope:dojo.global;
-_42.onItem.call(_44,{i:_43,r:this});
+var _3d=this._itemsByIdentity[_3c.identity];
+if(!(_3d===undefined)){
+if(_3c.onItem){
+var _3e=_3c.scope?_3c.scope:dojo.global;
+_3c.onItem.call(_3e,{i:_3d,r:this});
 }
 return;
 }
 }
-var _45=function(_46,_47){
-var _48=_42.scope?_42.scope:dojo.global;
-if(_42.onError){
-_42.onError.call(_48,_46);
+var _3f=function(_40,_41){
+var _42=_3c.scope?_3c.scope:dojo.global;
+if(_3c.onError){
+_3c.onError.call(_42,_40);
 }
 };
-var _49=function(_4a,_4b){
-var _4c=_42.scope?_42.scope:dojo.global;
+var _43=function(_44,_45){
+var _46=_3c.scope?_3c.scope:dojo.global;
 try{
-var _4d=null;
-if(_4a&&_4a.length==1){
-_4d=_4a[0];
+var _47=null;
+if(_44&&_44.length==1){
+_47=_44[0];
 }
-if(_42.onItem){
-_42.onItem.call(_4c,_4d);
+if(_3c.onItem){
+_3c.onItem.call(_46,_47);
 }
 }
 catch(error){
-if(_42.onError){
-_42.onError.call(_4c,error);
+if(_3c.onError){
+_3c.onError.call(_46,error);
 }
 }
 };
-var _4e={serverQuery:{id:_42.identity}};
-this._fetchItems(_4e,_49,_45);
-},getIdentity:function(_4f){
-var _50=null;
+var _48={serverQuery:{id:_3c.identity}};
+this._fetchItems(_48,_43,_3f);
+},getIdentity:function(_49){
+var _4a=null;
 if(this._identifier===Number){
-_50=_4f.n;
+_4a=_49.n;
 }else{
-_50=_4f.i[this._identifier];
+_4a=_49.i[this._identifier];
 }
-return _50;
-},getIdentityAttributes:function(_51){
+return _4a;
+},getIdentityAttributes:function(_4b){
 return [this._identifier];
 }});
 }
diff --git a/dojox/data/RailsStore.js b/dojox/data/RailsStore.js
index b25e5a5..27fa4dc 100644
--- a/dojox/data/RailsStore.js
+++ b/dojox/data/RailsStore.js
@@ -13,109 +13,107 @@ dojo.declare("dojox.data.RailsStore",dojox.data.JsonRestStore,{constructor:funct
 },preamble:function(_1){
 if(typeof _1.target=="string"&&!_1.service){
 var _2=_1.target.replace(/\/$/g,"");
-var _3=function(id,_5){
-_5=_5||{};
-var _6=_2;
+var _3=function(id,_4){
+_4=_4||{};
+var _5=_2;
+var _6;
 var _7;
-var _8;
 if(dojo.isObject(id)){
-_8="";
-_7="?"+dojo.objectToQuery(id);
+_7="";
+_6="?"+dojo.objectToQuery(id);
 }else{
-if(_5.queryStr&&_5.queryStr.indexOf("?")!=-1){
-_8=_5.queryStr.replace(/\?.*/,"");
-_7=_5.queryStr.replace(/[^?]*\?/g,"?");
+if(_4.queryStr&&_4.queryStr.indexOf("?")!=-1){
+_7=_4.queryStr.replace(/\?.*/,"");
+_6=_4.queryStr.replace(/[^?]*\?/g,"?");
 }else{
-if(dojo.isString(_5.query)&&_5.query.indexOf("?")!=-1){
-_8=_5.query.replace(/\?.*/,"");
-_7=_5.query.replace(/[^?]*\?/g,"?");
+if(dojo.isString(_4.query)&&_4.query.indexOf("?")!=-1){
+_7=_4.query.replace(/\?.*/,"");
+_6=_4.query.replace(/[^?]*\?/g,"?");
 }else{
-_8=id?id.toString():"";
-_7="";
+_7=id?id.toString():"";
+_6="";
 }
 }
 }
-if(_8.indexOf("=")!=-1){
-_7=_8;
-_8="";
+if(_7.indexOf("=")!=-1){
+_6=_7;
+_7="";
 }
-if(_8){
-_6=_6+"/"+_8+".json"+_7;
+if(_7){
+_5=_5+"/"+_7+".json"+_6;
 }else{
-_6=_6+".json"+_7;
+_5=_5+".json"+_6;
 }
-var _9=dojox.rpc._sync;
+var _8=dojox.rpc._sync;
 dojox.rpc._sync=false;
-return {url:_6,handleAs:"json",contentType:"application/json",sync:_9,headers:{Accept:"application/json,application/javascript",Range:_5&&(_5.start>=0||_5.count>=0)?"items="+(_5.start||"0")+"-"+((_5.count&&(_5.count+(_5.start||0)-1))||""):undefined}};
+return {url:_5,handleAs:"json",contentType:"application/json",sync:_8,headers:{Accept:"application/json,application/javascript",Range:_4&&(_4.start>=0||_4.count>=0)?"items="+(_4.start||"0")+"-"+((_4.count&&(_4.count+(_4.start||0)-1))||""):undefined}};
 };
 _1.service=dojox.rpc.Rest(this.target,true,null,_3);
 }
-},fetch:function(_a){
-_a=_a||{};
-function _b(_c){
-function _d(){
-if(_a.queryStr==null){
-_a.queryStr="";
+},fetch:function(_9){
+_9=_9||{};
+function _a(_b){
+function _c(){
+if(_9.queryStr==null){
+_9.queryStr="";
 }
-if(dojo.isObject(_a.query)){
-_a.queryStr="?"+dojo.objectToQuery(_a.query);
+if(dojo.isObject(_9.query)){
+_9.queryStr="?"+dojo.objectToQuery(_9.query);
 }else{
-if(dojo.isString(_a.query)){
-_a.queryStr=_a.query;
+if(dojo.isString(_9.query)){
+_9.queryStr=_9.query;
 }
 }
 };
-function _e(){
-if(_a.queryStr.indexOf("?")==-1){
+function _d(){
+if(_9.queryStr.indexOf("?")==-1){
 return "?";
 }else{
 return "&";
 }
 };
-if(_a.queryStr==null){
-_d();
+if(_9.queryStr==null){
+_c();
 }
-_a.queryStr=_a.queryStr+_e()+dojo.objectToQuery(_c);
+_9.queryStr=_9.queryStr+_d()+dojo.objectToQuery(_b);
 };
-if(_a.start||_a.count){
-if((_a.start||0)%_a.count){
+if(_9.start||_9.count){
+if((_9.start||0)%_9.count){
 throw new Error("The start parameter must be a multiple of the count parameter");
 }
-_b({page:((_a.start||0)/_a.count)+1,per_page:_a.count});
+_a({page:((_9.start||0)/_9.count)+1,per_page:_9.count});
 }
-if(_a.sort){
-var _f={sortBy:[],sortDir:[]};
-dojo.forEach(_a.sort,function(_10){
-_f.sortBy.push(_10.attribute);
-_f.sortDir.push(!!_10.descending?"DESC":"ASC");
+if(_9.sort){
+var _e={sortBy:[],sortDir:[]};
+dojo.forEach(_9.sort,function(_f){
+_e.sortBy.push(_f.attribute);
+_e.sortDir.push(!!_f.descending?"DESC":"ASC");
 });
-_b(_f);
-delete _a.sort;
+_a(_e);
+delete _9.sort;
 }
 return this.inherited(arguments);
-},_processResults:function(_11,_12){
-var _13;
-if((typeof this.rootAttribute=="undefined")&&_11[0]){
-if(_11[0][this.idAttribute]){
+},_processResults:function(_10,_11){
+var _12;
+if((typeof this.rootAttribute=="undefined")&&_10[0]){
+if(_10[0][this.idAttribute]){
 this.rootAttribute=false;
-
 }else{
-for(var _14 in _11[0]){
-if(_11[0][_14][this.idAttribute]){
-this.rootAttribute=_14;
-
+for(var _13 in _10[0]){
+if(_10[0][_13][this.idAttribute]){
+this.rootAttribute=_13;
 }
 }
 }
 }
 if(this.rootAttribute){
-_13=dojo.map(_11,function(_15){
-return _15[this.rootAttribute];
+_12=dojo.map(_10,function(_14){
+return _14[this.rootAttribute];
 },this);
 }else{
-_13=_11;
+_12=_10;
 }
-var _16=_11.length;
-return {totalCount:_12.fullLength||(_12.request.count==_16?(_12.request.start||0)+_16*2:_16),items:_13};
+var _15=_10.length;
+return {totalCount:_11.fullLength||(_11.request.count==_15?(_11.request.start||0)+_15*2:_15),items:_12};
 }});
 }
diff --git a/dojox/data/S3Store.js b/dojox/data/S3Store.js
index 663224b..0c3ea8f 100644
--- a/dojox/data/S3Store.js
+++ b/dojox/data/S3Store.js
@@ -15,14 +15,14 @@ var _2=_1.getElementsByTagName("Key");
 var _3=[];
 var _4=this;
 for(var i=0;i<_2.length;i++){
-var _6=_2[i];
-var _7={_loadObject:(function(_8,_9){
-return function(_a){
+var _5=_2[i];
+var _6={_loadObject:(function(_7,_8){
+return function(_9){
 delete this._loadObject;
-_4.service(_8).addCallback(_a);
+_4.service(_7).addCallback(_9);
 };
-})(_6.firstChild.nodeValue,_7)};
-_3.push(_7);
+})(_5.firstChild.nodeValue,_6)};
+_3.push(_6);
 }
 return {totalCount:_3.length,items:_3};
 }});
diff --git a/dojox/data/ServiceStore.js b/dojox/data/ServiceStore.js
index 6e24196..c48edb6 100644
--- a/dojox/data/ServiceStore.js
+++ b/dojox/data/ServiceStore.js
@@ -8,7 +8,7 @@
 if(!dojo._hasResource["dojox.data.ServiceStore"]){
 dojo._hasResource["dojox.data.ServiceStore"]=true;
 dojo.provide("dojox.data.ServiceStore");
-dojo.declare("dojox.data.ServiceStore",dojox.data.ClientFilter,{constructor:function(_1){
+dojo.declare("dojox.data.ServiceStore",dojox.data.ClientFilter,{service:null,constructor:function(_1){
 this.byId=this.fetchItemByIdentity;
 this._index={};
 if(_1){
@@ -32,114 +32,123 @@ _a.push(i);
 }
 }
 return _a;
-},hasAttribute:function(_c,_d){
-return _d in _c;
-},containsValue:function(_e,_f,_10){
-return dojo.indexOf(this.getValues(_e,_f),_10)>-1;
-},isItem:function(_11){
-return (typeof _11=="object")&&_11&&!(_11 instanceof Date);
-},isItemLoaded:function(_12){
-return _12&&!_12._loadObject;
-},loadItem:function(_13){
-var _14;
-if(_13.item._loadObject){
-_13.item._loadObject(function(_15){
-_14=_15;
-delete _14._loadObject;
-var _16=_15 instanceof Error?_13.onError:_13.onItem;
-if(_16){
-_16.call(_13.scope,_15);
+},hasAttribute:function(_b,_c){
+return _c in _b;
+},containsValue:function(_d,_e,_f){
+return dojo.indexOf(this.getValues(_d,_e),_f)>-1;
+},isItem:function(_10){
+return (typeof _10=="object")&&_10&&!(_10 instanceof Date);
+},isItemLoaded:function(_11){
+return _11&&!_11._loadObject;
+},loadItem:function(_12){
+var _13;
+if(_12.item._loadObject){
+_12.item._loadObject(function(_14){
+_13=_14;
+delete _13._loadObject;
+var _15=_14 instanceof Error?_12.onError:_12.onItem;
+if(_15){
+_15.call(_12.scope,_14);
 }
 });
 }else{
-if(_13.onItem){
-_13.onItem.call(_13.scope,_13.item);
+if(_12.onItem){
+_12.onItem.call(_12.scope,_12.item);
 }
 }
-return _14;
-},_currentId:0,_processResults:function(_17,_18){
-if(_17&&typeof _17=="object"){
-var id=_17.__id;
+return _13;
+},_currentId:0,_processResults:function(_16,_17){
+if(_16&&typeof _16=="object"){
+var id=_16.__id;
 if(!id){
 if(this.idAttribute){
-id=_17[this.idAttribute];
+id=_16[this.idAttribute];
 }else{
 id=this._currentId++;
 }
 if(id!==undefined){
-var _1a=this._index[id];
-if(_1a){
-for(var j in _1a){
-delete _1a[j];
+var _18=this._index[id];
+if(_18){
+for(var j in _18){
+delete _18[j];
 }
-_17=dojo.mixin(_1a,_17);
+_16=dojo.mixin(_18,_16);
 }
-_17.__id=id;
-this._index[id]=_17;
+_16.__id=id;
+this._index[id]=_16;
 }
 }
-for(var i in _17){
-_17[i]=this._processResults(_17[i],_18).items;
+for(var i in _16){
+_16[i]=this._processResults(_16[i],_17).items;
 }
+var _19=_16.length;
 }
-var _1d=_17.length;
-return {totalCount:_18.request.count==_1d?(_18.request.start||0)+_1d*this.estimateCountFactor:_1d,items:_17};
-},close:function(_1e){
-return _1e&&_1e.abort&&_1e.abort();
-},fetch:function(_1f){
-_1f=_1f||{};
-if("syncMode" in _1f?_1f.syncMode:this.syncMode){
+return {totalCount:_17.request.count==_19?(_17.request.start||0)+_19*this.estimateCountFactor:_19,items:_16};
+},close:function(_1a){
+return _1a&&_1a.abort&&_1a.abort();
+},fetch:function(_1b){
+_1b=_1b||{};
+if("syncMode" in _1b?_1b.syncMode:this.syncMode){
 dojox.rpc._sync=true;
 }
-var _20=this;
-var _21=_1f.scope||_20;
-var _22=this.cachingFetch?this.cachingFetch(_1f):this._doQuery(_1f);
-_22.request=_1f;
-_22.addCallback(function(_23){
-if(_1f.clientFetch){
-_23=_20.clientSideFetch({query:_1f.clientFetch,sort:_1f.sort,start:_1f.start,count:_1f.count},_23);
+var _1c=this;
+var _1d=_1b.scope||_1c;
+var _1e=this.cachingFetch?this.cachingFetch(_1b):this._doQuery(_1b);
+_1e.request=_1b;
+_1e.addCallback(function(_1f){
+if(_1b.clientFetch){
+_1f=_1c.clientSideFetch({query:_1b.clientFetch,sort:_1b.sort,start:_1b.start,count:_1b.count},_1f);
 }
-var _24=_20._processResults(_23,_22);
-_23=_1f.results=_24.items;
-if(_1f.onBegin){
-_1f.onBegin.call(_21,_24.totalCount,_1f);
+var _20=_1c._processResults(_1f,_1e);
+_1f=_1b.results=_20.items;
+if(_1b.onBegin){
+_1b.onBegin.call(_1d,_20.totalCount,_1b);
 }
-if(_1f.onItem){
-for(var i=0;i<_23.length;i++){
-_1f.onItem.call(_21,_23[i],_1f);
+if(_1b.onItem){
+for(var i=0;i<_1f.length;i++){
+_1b.onItem.call(_1d,_1f[i],_1b);
 }
 }
-if(_1f.onComplete){
-_1f.onComplete.call(_21,_1f.onItem?null:_23,_1f);
+if(_1b.onComplete){
+_1b.onComplete.call(_1d,_1b.onItem?null:_1f,_1b);
 }
-return _23;
+return _1f;
+});
+_1e.addErrback(_1b.onError&&function(err){
+return _1b.onError.call(_1d,err,_1b);
 });
-_22.addErrback(_1f.onError&&dojo.hitch(_21,_1f.onError));
-_1f.abort=function(){
-_22.ioArgs.xhr.abort();
+_1b.abort=function(){
+_1e.cancel();
 };
-_1f.store=this;
-return _1f;
-},_doQuery:function(_26){
-var _27=typeof _26.queryStr=="string"?_26.queryStr:_26.query;
-return this.service(_27);
+_1b.store=this;
+return _1b;
+},_doQuery:function(_21){
+var _22=typeof _21.queryStr=="string"?_21.queryStr:_21.query;
+return this.service(_22);
 },getFeatures:function(){
 return {"dojo.data.api.Read":true,"dojo.data.api.Identity":true,"dojo.data.api.Schema":this.schema};
-},getLabel:function(_28){
-return this.getValue(_28,this.labelAttribute);
-},getLabelAttributes:function(_29){
+},getLabel:function(_23){
+return this.getValue(_23,this.labelAttribute);
+},getLabelAttributes:function(_24){
 return [this.labelAttribute];
-},getIdentity:function(_2a){
-return _2a.__id;
-},getIdentityAttributes:function(_2b){
+},getIdentity:function(_25){
+return _25.__id;
+},getIdentityAttributes:function(_26){
 return [this.idAttribute];
-},fetchItemByIdentity:function(_2c){
-var _2d=this._index[(_2c._prefix||"")+_2c.identity];
-if(_2d&&_2c.onItem){
-_2c.onItem.call(_2c.scope,_2d);
+},fetchItemByIdentity:function(_27){
+var _28=this._index[(_27._prefix||"")+_27.identity];
+if(_28){
+if(_28._loadObject){
+_27.item=_28;
+return this.loadItem(_27);
+}else{
+if(_27.onItem){
+_27.onItem.call(_27.scope,_28);
+}
+}
 }else{
-return this.fetch({query:_2c.identity,onComplete:_2c.onItem,onError:_2c.onError,scope:_2c.scope}).results;
+return this.fetch({query:_27.identity,onComplete:_27.onItem,onError:_27.onError,scope:_27.scope}).results;
 }
-return _2d;
+return _28;
 }});
 }
diff --git a/dojox/data/SnapLogicStore.js b/dojox/data/SnapLogicStore.js
index 0b26ed5..e85196a 100644
--- a/dojox/data/SnapLogicStore.js
+++ b/dojox/data/SnapLogicStore.js
@@ -33,151 +33,151 @@ if(i!==-1){
 return _4.values[i];
 }
 return _6;
-},getAttributes:function(_8){
+},getAttributes:function(_7){
+this._assertIsItem(_7);
+return _7.attributes;
+},hasAttribute:function(_8,_9){
 this._assertIsItem(_8);
-return _8.attributes;
-},hasAttribute:function(_9,_a){
-this._assertIsItem(_9);
-this._assertIsAttribute(_a);
-for(var i=0;i<_9.attributes.length;++i){
-if(_a==_9.attributes[i]){
+this._assertIsAttribute(_9);
+for(var i=0;i<_8.attributes.length;++i){
+if(_9==_8.attributes[i]){
 return true;
 }
 }
 return false;
-},isItemLoaded:function(_c){
-return this.isItem(_c);
-},loadItem:function(_d){
-},getLabel:function(_e){
+},isItemLoaded:function(_a){
+return this.isItem(_a);
+},loadItem:function(_b){
+},getLabel:function(_c){
 return undefined;
-},getLabelAttributes:function(_f){
+},getLabelAttributes:function(_d){
 return null;
-},containsValue:function(_10,_11,_12){
-return this.getValue(_10,_11)===_12;
-},getValues:function(_13,_14){
-this._assertIsItem(_13);
-this._assertIsAttribute(_14);
-var i=dojo.indexOf(_13.attributes,_14);
+},containsValue:function(_e,_f,_10){
+return this.getValue(_e,_f)===_10;
+},getValues:function(_11,_12){
+this._assertIsItem(_11);
+this._assertIsAttribute(_12);
+var i=dojo.indexOf(_11.attributes,_12);
 if(i!==-1){
-return [_13.values[i]];
+return [_11.values[i]];
 }
 return [];
-},isItem:function(_16){
-if(_16&&_16._store===this){
+},isItem:function(_13){
+if(_13&&_13._store===this){
 return true;
 }
 return false;
-},close:function(_17){
-},_fetchHandler:function(_18){
-var _19=_18.scope||dojo.global;
-if(_18.onBegin){
-_18.onBegin.call(_19,_18._countResponse[0],_18);
-}
-if(_18.onItem||_18.onComplete){
-var _1a=_18._dataResponse;
-if(!_1a.length){
-_18.onError.call(_19,new Error("dojox.data.SnapLogicStore: invalid response of length 0"),_18);
+},close:function(_14){
+},_fetchHandler:function(_15){
+var _16=_15.scope||dojo.global;
+if(_15.onBegin){
+_15.onBegin.call(_16,_15._countResponse[0],_15);
+}
+if(_15.onItem||_15.onComplete){
+var _17=_15._dataResponse;
+if(!_17.length){
+_15.onError.call(_16,new Error("dojox.data.SnapLogicStore: invalid response of length 0"),_15);
 return;
 }else{
-if(_18.query!="record count"){
-var _1b=_1a.shift();
-var _1c=[];
-for(var i=0;i<_1a.length;++i){
-if(_18._aborted){
+if(_15.query!="record count"){
+var _18=_17.shift();
+var _19=[];
+for(var i=0;i<_17.length;++i){
+if(_15._aborted){
 break;
 }
-_1c.push({attributes:_1b,values:_1a[i],_store:this});
+_19.push({attributes:_18,values:_17[i],_store:this});
 }
-if(_18.sort&&!_18._aborted){
-_1c.sort(dojo.data.util.sorter.createSortFunction(_18.sort,self));
+if(_15.sort&&!_15._aborted){
+_19.sort(dojo.data.util.sorter.createSortFunction(_15.sort,self));
 }
 }else{
-_1c=[({attributes:["count"],values:_1a,_store:this})];
+_19=[({attributes:["count"],values:_17,_store:this})];
 }
 }
-if(_18.onItem){
-for(var i=0;i<_1c.length;++i){
-if(_18._aborted){
+if(_15.onItem){
+for(var i=0;i<_19.length;++i){
+if(_15._aborted){
 break;
 }
-_18.onItem.call(_19,_1c[i],_18);
+_15.onItem.call(_16,_19[i],_15);
 }
-_1c=null;
+_19=null;
 }
-if(_18.onComplete&&!_18._aborted){
-_18.onComplete.call(_19,_1c,_18);
+if(_15.onComplete&&!_15._aborted){
+_15.onComplete.call(_16,_19,_15);
 }
 }
-},_partHandler:function(_1e,_1f,_20){
-if(_20 instanceof Error){
-if(_1f==this.Parts.DATA){
-_1e._dataHandle=null;
+},_partHandler:function(_1a,_1b,_1c){
+if(_1c instanceof Error){
+if(_1b==this.Parts.DATA){
+_1a._dataHandle=null;
 }else{
-_1e._countHandle=null;
+_1a._countHandle=null;
 }
-_1e._aborted=true;
-if(_1e.onError){
-_1e.onError.call(_1e.scope,_20,_1e);
+_1a._aborted=true;
+if(_1a.onError){
+_1a.onError.call(_1a.scope,_1c,_1a);
 }
 }else{
-if(_1e._aborted){
+if(_1a._aborted){
 return;
 }
-if(_1f==this.Parts.DATA){
-_1e._dataResponse=_20;
+if(_1b==this.Parts.DATA){
+_1a._dataResponse=_1c;
 }else{
-_1e._countResponse=_20;
+_1a._countResponse=_1c;
 }
-if((!_1e._dataHandle||_1e._dataResponse!==null)&&(!_1e._countHandle||_1e._countResponse!==null)){
-this._fetchHandler(_1e);
+if((!_1a._dataHandle||_1a._dataResponse!==null)&&(!_1a._countHandle||_1a._countResponse!==null)){
+this._fetchHandler(_1a);
 }
 }
-},fetch:function(_21){
-_21._countResponse=null;
-_21._dataResponse=null;
-_21._aborted=false;
-_21.abort=function(){
-if(!_21._aborted){
-_21._aborted=true;
-if(_21._dataHandle&&_21._dataHandle.cancel){
-_21._dataHandle.cancel();
+},fetch:function(_1d){
+_1d._countResponse=null;
+_1d._dataResponse=null;
+_1d._aborted=false;
+_1d.abort=function(){
+if(!_1d._aborted){
+_1d._aborted=true;
+if(_1d._dataHandle&&_1d._dataHandle.cancel){
+_1d._dataHandle.cancel();
 }
-if(_21._countHandle&&_21._countHandle.cancel){
-_21._countHandle.cancel();
+if(_1d._countHandle&&_1d._countHandle.cancel){
+_1d._countHandle.cancel();
 }
 }
 };
-if(_21.onItem||_21.onComplete){
-var _22=this._parameters||{};
-if(_21.start){
-if(_21.start<0){
+if(_1d.onItem||_1d.onComplete){
+var _1e=this._parameters||{};
+if(_1d.start){
+if(_1d.start<0){
 throw new Error("dojox.data.SnapLogicStore: request start value must be 0 or greater");
 }
-_22["sn.start"]=_21.start+1;
+_1e["sn.start"]=_1d.start+1;
 }
-if(_21.count){
-if(_21.count<0){
+if(_1d.count){
+if(_1d.count<0){
 throw new Error("dojox.data.SnapLogicStore: request count value 0 or greater");
 }
-_22["sn.limit"]=_21.count;
+_1e["sn.limit"]=_1d.count;
 }
-_22["sn.content_type"]="application/javascript";
-var _23=this;
-var _24=function(_25,_26){
-if(_25 instanceof Error){
-_23._fetchHandler(_25,_21);
+_1e["sn.content_type"]="application/javascript";
+var _1f=this;
+var _20=function(_21,_22){
+if(_21 instanceof Error){
+_1f._fetchHandler(_21,_1d);
 }
 };
-var _27={url:this.url,content:_22,timeout:60000,callbackParamName:"sn.stream_header",handle:dojo.hitch(this,"_partHandler",_21,this.Parts.DATA)};
-_21._dataHandle=dojo.io.script.get(_27);
+var _23={url:this.url,content:_1e,timeout:60000,callbackParamName:"sn.stream_header",handle:dojo.hitch(this,"_partHandler",_1d,this.Parts.DATA)};
+_1d._dataHandle=dojo.io.script.get(_23);
 }
-if(_21.onBegin){
-var _22={};
-_22["sn.count"]="records";
-_22["sn.content_type"]="application/javascript";
-var _27={url:this.url,content:_22,timeout:60000,callbackParamName:"sn.stream_header",handle:dojo.hitch(this,"_partHandler",_21,this.Parts.COUNT)};
-_21._countHandle=dojo.io.script.get(_27);
+if(_1d.onBegin){
+var _1e={};
+_1e["sn.count"]="records";
+_1e["sn.content_type"]="application/javascript";
+var _23={url:this.url,content:_1e,timeout:60000,callbackParamName:"sn.stream_header",handle:dojo.hitch(this,"_partHandler",_1d,this.Parts.COUNT)};
+_1d._countHandle=dojo.io.script.get(_23);
 }
-return _21;
+return _1d;
 }});
 }
diff --git a/dojox/data/StoreExplorer.js b/dojox/data/StoreExplorer.js
index 87d221d..3eebc33 100644
--- a/dojox/data/StoreExplorer.js
+++ b/dojox/data/StoreExplorer.js
@@ -42,12 +42,14 @@ for(var i=0;i<_d.length;i++){
 _2.store.deleteItem(_d[i]);
 }
 });
-this.setItemName=function(_10){
-_b.attr("label","<img style='width:12px; height:12px' src='"+dojo.moduleUrl("dijit.themes.tundra.images","dndCopy.png")+"' /> Create New "+_10);
-_c.attr("label","Delete "+_10);
+this.setItemName=function(_f){
+_b.attr("label","<img style='width:12px; height:12px' src='"+dojo.moduleUrl("dijit.themes.tundra.images","dndCopy.png")+"' /> Create New "+_f);
+_c.attr("label","Delete "+_f);
 };
 _4("Save",function(){
-_2.store.save();
+_2.store.save({onError:function(_10){
+alert(_10);
+}});
 _2.tree.refreshItem();
 });
 _4("Revert",function(){
@@ -93,52 +95,52 @@ return _1c._formatCell(_1f);
 };
 var _20=this.gridOnFetchComplete;
 _1d._onFetchComplete=function(_21,req){
-var _23=_1c.gridLayout=[];
-var _24,key,_26,i,j,k,_2a=_1b.getIdentityAttributes();
-for(i=0;i<_2a.length;i++){
-key=_2a[i];
-_23.push({field:key,name:key,_score:100,formatter:_1e,editable:false});
-}
-for(i=0;_26=_21[i++];){
-var _2b=_1b.getAttributes(_26);
-for(k=0;key=_2b[k++];){
-var _2c=false;
-for(j=0;_24=_23[j++];){
-if(_24.field==key){
-_24._score++;
-_2c=true;
+var _22=_1c.gridLayout=[];
+var _23,key,_24,i,j,k,_25=_1b.getIdentityAttributes();
+for(i=0;i<_25.length;i++){
+key=_25[i];
+_22.push({field:key,name:key,_score:100,formatter:_1e,editable:false});
+}
+for(i=0;_24=_21[i++];){
+var _26=_1b.getAttributes(_24);
+for(k=0;key=_26[k++];){
+var _27=false;
+for(j=0;_23=_22[j++];){
+if(_23.field==key){
+_23._score++;
+_27=true;
 break;
 }
 }
-if(!_2c){
-_23.push({field:key,name:key,_score:1,formatter:_1e,styles:"white-space:nowrap; ",editable:true});
+if(!_27){
+_22.push({field:key,name:key,_score:1,formatter:_1e,styles:"white-space:nowrap; ",editable:true});
 }
 }
 }
-_23=_23.sort(function(a,b){
+_22=_22.sort(function(a,b){
 return a._score>b._score?-1:1;
 });
-for(j=0;_24=_23[j];j++){
-if(_24._score<_21.length/40*j){
-_23.splice(j,_23.length-j);
+for(j=0;_23=_22[j];j++){
+if(_23._score<_21.length/40*j){
+_22.splice(j,_22.length-j);
 break;
 }
 }
-for(j=0;_24=_23[j++];){
-_24.width=Math.round(100/_23.length)+"%";
+for(j=0;_23=_22[j++];){
+_23.width=Math.round(100/_22.length)+"%";
 }
 _1d._onFetchComplete=_20;
-_1d.attr("structure",_23);
-var _2f=_20.apply(this,arguments);
+_1d.attr("structure",_22);
+var _28=_20.apply(this,arguments);
 };
 _1d.setStore(_1b);
 this.queryOptions={cache:true};
 this.tree.setStore(_1b);
 },createNew:function(){
-var _30=prompt("Enter any properties to put in the new item (in JSON literal form):","{ }");
-if(_30){
+var _29=prompt("Enter any properties (in JSON literal form) to put in the new item (passed to the newItem constructor):","{ }");
+if(_29){
 try{
-this.store.newItem(dojo.fromJson(_30));
+this.store.newItem(dojo.fromJson(_29));
 }
 catch(e){
 alert(e);
diff --git a/dojox/data/WikipediaStore.js b/dojox/data/WikipediaStore.js
index ae2f795..4d24e29 100644
--- a/dojox/data/WikipediaStore.js
+++ b/dojox/data/WikipediaStore.js
@@ -42,17 +42,17 @@ delete rq.text;
 }
 _3.query=rq;
 return this.inherited(arguments);
-},_processResults:function(_5,_6){
-if(_5.parse){
-_5.parse.title=dojo.queryToObject(_6.ioArgs.url.split("?")[1]).page;
-_5=[_5.parse];
+},_processResults:function(_4,_5){
+if(_4.parse){
+_4.parse.title=dojo.queryToObject(_5.ioArgs.url.split("?")[1]).page;
+_4=[_4.parse];
 }else{
-if(_5.query&&_5.query.search){
-_5=_5.query.search;
-var _7=this;
-for(var i in _5){
-_5[i]._loadObject=function(_9){
-_7.fetch({query:{action:"parse",title:this.title},onItem:_9});
+if(_4.query&&_4.query.search){
+_4=_4.query.search;
+var _6=this;
+for(var i in _4){
+_4[i]._loadObject=function(_7){
+_6.fetch({query:{action:"parse",title:this.title},onItem:_7});
 delete this._loadObject;
 };
 }
diff --git a/dojox/data/XmlStore.js b/dojox/data/XmlStore.js
index 7bdf7db..ff69b9a 100644
--- a/dojox/data/XmlStore.js
+++ b/dojox/data/XmlStore.js
@@ -20,45 +20,48 @@ this.keyAttribute=(_1.keyAttribute||_1.keyattribute||this.keyAttribute);
 this._attributeMap=(_1.attributeMap||_1.attributemap);
 this.label=_1.label||this.label;
 this.sendQuery=(_1.sendQuery||_1.sendquery||this.sendQuery);
+if("urlPreventCache" in _1){
+this.urlPreventCache=_1.urlPreventCache?true:false;
+}
 }
 this._newItems=[];
 this._deletedItems=[];
 this._modifiedItems=[];
-},url:"",rootItem:"",keyAttribute:"",label:"",sendQuery:false,attributeMap:null,getValue:function(_2,_3,_4){
+},url:"",rootItem:"",keyAttribute:"",label:"",sendQuery:false,attributeMap:null,urlPreventCache:true,getValue:function(_2,_3,_4){
 var _5=_2.element;
 var i;
-var _7;
+var _6;
 if(_3==="tagName"){
 return _5.nodeName;
 }else{
 if(_3==="childNodes"){
 for(i=0;i<_5.childNodes.length;i++){
-_7=_5.childNodes[i];
-if(_7.nodeType===1){
-return this._getItem(_7);
+_6=_5.childNodes[i];
+if(_6.nodeType===1){
+return this._getItem(_6);
 }
 }
 return _4;
 }else{
 if(_3==="text()"){
 for(i=0;i<_5.childNodes.length;i++){
-_7=_5.childNodes[i];
-if(_7.nodeType===3||_7.nodeType===4){
-return _7.nodeValue;
+_6=_5.childNodes[i];
+if(_6.nodeType===3||_6.nodeType===4){
+return _6.nodeValue;
 }
 }
 return _4;
 }else{
 _3=this._getAttribute(_5.nodeName,_3);
 if(_3.charAt(0)==="@"){
-var _8=_3.substring(1);
-var _9=_5.getAttribute(_8);
-return (_9!==undefined)?_9:_4;
+var _7=_3.substring(1);
+var _8=_5.getAttribute(_7);
+return (_8)?_8:_4;
 }else{
 for(i=0;i<_5.childNodes.length;i++){
-_7=_5.childNodes[i];
-if(_7.nodeType===1&&_7.nodeName===_3){
-return this._getItem(_7);
+_6=_5.childNodes[i];
+if(_6.nodeType===1&&_6.nodeName===_3){
+return this._getItem(_6);
 }
 }
 return _4;
@@ -66,695 +69,706 @@ return _4;
 }
 }
 }
-},getValues:function(_a,_b){
-var _c=_a.element;
-var _d=[];
+},getValues:function(_9,_a){
+var _b=_9.element;
+var _c=[];
 var i;
-var _f;
-if(_b==="tagName"){
-return [_c.nodeName];
+var _d;
+if(_a==="tagName"){
+return [_b.nodeName];
 }else{
-if(_b==="childNodes"){
-for(i=0;i<_c.childNodes.length;i++){
-_f=_c.childNodes[i];
-if(_f.nodeType===1){
-_d.push(this._getItem(_f));
+if(_a==="childNodes"){
+for(i=0;i<_b.childNodes.length;i++){
+_d=_b.childNodes[i];
+if(_d.nodeType===1){
+_c.push(this._getItem(_d));
 }
 }
-return _d;
+return _c;
 }else{
-if(_b==="text()"){
-var ec=_c.childNodes;
+if(_a==="text()"){
+var ec=_b.childNodes;
 for(i=0;i<ec.length;i++){
-_f=ec[i];
-if(_f.nodeType===3||_f.nodeType===4){
-_d.push(_f.nodeValue);
+_d=ec[i];
+if(_d.nodeType===3||_d.nodeType===4){
+_c.push(_d.nodeValue);
 }
 }
-return _d;
+return _c;
 }else{
-_b=this._getAttribute(_c.nodeName,_b);
-if(_b.charAt(0)==="@"){
-var _11=_b.substring(1);
-var _12=_c.getAttribute(_11);
-return (_12!==undefined)?[_12]:[];
+_a=this._getAttribute(_b.nodeName,_a);
+if(_a.charAt(0)==="@"){
+var _e=_a.substring(1);
+var _f=_b.getAttribute(_e);
+return (_f!==undefined)?[_f]:[];
 }else{
-for(i=0;i<_c.childNodes.length;i++){
-_f=_c.childNodes[i];
-if(_f.nodeType===1&&_f.nodeName===_b){
-_d.push(this._getItem(_f));
+for(i=0;i<_b.childNodes.length;i++){
+_d=_b.childNodes[i];
+if(_d.nodeType===1&&_d.nodeName===_a){
+_c.push(this._getItem(_d));
 }
 }
-return _d;
+return _c;
 }
 }
 }
 }
-},getAttributes:function(_13){
-var _14=_13.element;
-var _15=[];
+},getAttributes:function(_10){
+var _11=_10.element;
+var _12=[];
 var i;
-_15.push("tagName");
-if(_14.childNodes.length>0){
-var _17={};
-var _18=true;
-var _19=false;
-for(i=0;i<_14.childNodes.length;i++){
-var _1a=_14.childNodes[i];
-if(_1a.nodeType===1){
-var _1b=_1a.nodeName;
-if(!_17[_1b]){
-_15.push(_1b);
-_17[_1b]=_1b;
+_12.push("tagName");
+if(_11.childNodes.length>0){
+var _13={};
+var _14=true;
+var _15=false;
+for(i=0;i<_11.childNodes.length;i++){
+var _16=_11.childNodes[i];
+if(_16.nodeType===1){
+var _17=_16.nodeName;
+if(!_13[_17]){
+_12.push(_17);
+_13[_17]=_17;
 }
-_18=true;
+_14=true;
 }else{
-if(_1a.nodeType===3){
-_19=true;
+if(_16.nodeType===3){
+_15=true;
 }
 }
 }
-if(_18){
-_15.push("childNodes");
+if(_14){
+_12.push("childNodes");
 }
-if(_19){
-_15.push("text()");
+if(_15){
+_12.push("text()");
 }
 }
-for(i=0;i<_14.attributes.length;i++){
-_15.push("@"+_14.attributes[i].nodeName);
+for(i=0;i<_11.attributes.length;i++){
+_12.push("@"+_11.attributes[i].nodeName);
 }
 if(this._attributeMap){
 for(var key in this._attributeMap){
 i=key.indexOf(".");
 if(i>0){
-var _1d=key.substring(0,i);
-if(_1d===_14.nodeName){
-_15.push(key.substring(i+1));
+var _18=key.substring(0,i);
+if(_18===_11.nodeName){
+_12.push(key.substring(i+1));
 }
 }else{
-_15.push(key);
+_12.push(key);
 }
 }
 }
-return _15;
-},hasAttribute:function(_1e,_1f){
-return (this.getValue(_1e,_1f)!==undefined);
-},containsValue:function(_20,_21,_22){
-var _23=this.getValues(_20,_21);
-for(var i=0;i<_23.length;i++){
-if((typeof _22==="string")){
-if(_23[i].toString&&_23[i].toString()===_22){
+return _12;
+},hasAttribute:function(_19,_1a){
+return (this.getValue(_19,_1a)!==undefined);
+},containsValue:function(_1b,_1c,_1d){
+var _1e=this.getValues(_1b,_1c);
+for(var i=0;i<_1e.length;i++){
+if((typeof _1d==="string")){
+if(_1e[i].toString&&_1e[i].toString()===_1d){
 return true;
 }
 }else{
-if(_23[i]===_22){
+if(_1e[i]===_1d){
 return true;
 }
 }
 }
 return false;
-},isItem:function(_25){
-if(_25&&_25.element&&_25.store&&_25.store===this){
+},isItem:function(_1f){
+if(_1f&&_1f.element&&_1f.store&&_1f.store===this){
 return true;
 }
 return false;
-},isItemLoaded:function(_26){
-return this.isItem(_26);
-},loadItem:function(_27){
+},isItemLoaded:function(_20){
+return this.isItem(_20);
+},loadItem:function(_21){
 },getFeatures:function(){
-var _28={"dojo.data.api.Read":true,"dojo.data.api.Write":true};
+var _22={"dojo.data.api.Read":true,"dojo.data.api.Write":true};
 if(!this.sendQuery||this.keyAttribute!==""){
-_28["dojo.data.api.Identity"]=true;
+_22["dojo.data.api.Identity"]=true;
 }
-return _28;
-},getLabel:function(_29){
-if((this.label!=="")&&this.isItem(_29)){
-var _2a=this.getValue(_29,this.label);
-if(_2a){
-return _2a.toString();
+return _22;
+},getLabel:function(_23){
+if((this.label!=="")&&this.isItem(_23)){
+var _24=this.getValue(_23,this.label);
+if(_24){
+return _24.toString();
 }
 }
 return undefined;
-},getLabelAttributes:function(_2b){
+},getLabelAttributes:function(_25){
 if(this.label!==""){
 return [this.label];
 }
 return null;
-},_fetchItems:function(_2c,_2d,_2e){
-var url=this._getFetchUrl(_2c);
-
+},_fetchItems:function(_26,_27,_28){
+var url=this._getFetchUrl(_26);
 if(!url){
-_2e(new Error("No URL specified."));
+_28(new Error("No URL specified."));
 return;
 }
-var _30=(!this.sendQuery?_2c:{});
-var _31=this;
-var _32={url:url,handleAs:"xml",preventCache:true};
-var _33=dojo.xhrGet(_32);
-_33.addCallback(function(_34){
-var _35=_31._getItems(_34,_30);
-
-if(_35&&_35.length>0){
-_2d(_35,_2c);
+var _29=(!this.sendQuery?_26:{});
+var _2a=this;
+var _2b={url:url,handleAs:"xml",preventCache:_2a.urlPreventCache};
+var _2c=dojo.xhrGet(_2b);
+_2c.addCallback(function(_2d){
+var _2e=_2a._getItems(_2d,_29);
+if(_2e&&_2e.length>0){
+_27(_2e,_26);
 }else{
-_2d([],_2c);
+_27([],_26);
 }
 });
-_33.addErrback(function(_36){
-_2e(_36,_2c);
+_2c.addErrback(function(_2f){
+_28(_2f,_26);
 });
-},_getFetchUrl:function(_37){
+},_getFetchUrl:function(_30){
 if(!this.sendQuery){
 return this.url;
 }
-var _38=_37.query;
-if(!_38){
+var _31=_30.query;
+if(!_31){
 return this.url;
 }
-if(dojo.isString(_38)){
-return this.url+_38;
+if(dojo.isString(_31)){
+return this.url+_31;
 }
-var _39="";
-for(var _3a in _38){
-var _3b=_38[_3a];
-if(_3b){
-if(_39){
-_39+="&";
+var _32="";
+for(var _33 in _31){
+var _34=_31[_33];
+if(_34){
+if(_32){
+_32+="&";
 }
-_39+=(_3a+"="+_3b);
+_32+=(_33+"="+_34);
 }
 }
-if(!_39){
+if(!_32){
 return this.url;
 }
-var _3c=this.url;
-if(_3c.indexOf("?")<0){
-_3c+="?";
+var _35=this.url;
+if(_35.indexOf("?")<0){
+_35+="?";
 }else{
-_3c+="&";
+_35+="&";
 }
-return _3c+_39;
-},_getItems:function(_3d,_3e){
-var _3f=null;
-if(_3e){
-_3f=_3e.query;
+return _35+_32;
+},_getItems:function(_36,_37){
+var _38=null;
+if(_37){
+_38=_37.query;
 }
-var _40=[];
-var _41=null;
+var _39=[];
+var _3a=null;
 if(this.rootItem!==""){
-_41=dojo.query(this.rootItem,_3d);
+_3a=dojo.query(this.rootItem,_36);
 }else{
-_41=_3d.documentElement.childNodes;
+_3a=_36.documentElement.childNodes;
 }
-var _42=_3e.queryOptions?_3e.queryOptions.deep:false;
-if(_42){
-_41=this._flattenNodes(_41);
+var _3b=_37.queryOptions?_37.queryOptions.deep:false;
+if(_3b){
+_3a=this._flattenNodes(_3a);
 }
-for(var i=0;i<_41.length;i++){
-var _44=_41[i];
-if(_44.nodeType!=1){
+for(var i=0;i<_3a.length;i++){
+var _3c=_3a[i];
+if(_3c.nodeType!=1){
 continue;
 }
-var _45=this._getItem(_44);
+var _3d=this._getItem(_3c);
+if(_38){
+var _3e=_37.queryOptions?_37.queryOptions.ignoreCase:false;
+var _3f;
+var _40=false;
+var j;
+var _41=true;
+var _42={};
+for(var key in _38){
+_3f=_38[key];
+if(typeof _3f==="string"){
+_42[key]=dojo.data.util.filter.patternToRegExp(_3f,_3e);
+}
+}
+for(var _43 in _38){
+_41=false;
+var _44=this.getValues(_3d,_43);
+for(j=0;j<_44.length;j++){
+_3f=_44[j];
 if(_3f){
-var _46=true;
-var _47=_3e.queryOptions?_3e.queryOptions.ignoreCase:false;
-var _48;
-var _49={};
-for(var key in _3f){
-_48=_3f[key];
-if(typeof _48==="string"){
-_49[key]=dojo.data.util.filter.patternToRegExp(_48,_47);
-}
-}
-for(var _4b in _3f){
-_48=this.getValue(_45,_4b);
-if(_48){
-var _4c=_3f[_4b];
-if((typeof _48)==="string"&&(_49[_4b])){
-if((_48.match(_49[_4b]))!==null){
-continue;
+var _45=_38[_43];
+if((typeof _3f)==="string"&&(_42[_43])){
+if((_3f.match(_42[_43]))!==null){
+_40=true;
+}else{
+_40=false;
 }
 }else{
-if((typeof _48)==="object"){
-if(_48.toString&&(_49[_4b])){
-var _4d=_48.toString();
-if((_4d.match(_49[_4b]))!==null){
-continue;
+if((typeof _3f)==="object"){
+if(_3f.toString&&(_42[_43])){
+var _46=_3f.toString();
+if((_46.match(_42[_43]))!==null){
+_40=true;
+}else{
+_40=false;
 }
 }else{
-if(_4c==="*"||_4c===_48){
-continue;
+if(_45==="*"||_45===_3f){
+_40=true;
+}else{
+_40=false;
 }
 }
 }
 }
 }
-_46=false;
+if(_40){
 break;
 }
-if(!_46){
-continue;
 }
+if(!_40){
+break;
 }
-_40.push(_45);
 }
-dojo.forEach(_40,function(_4e){
-_4e.element.parentNode.removeChild(_4e.element);
-},this);
-return _40;
-},_flattenNodes:function(_4f){
-var _50=[];
-if(_4f){
-var i;
-for(i=0;i<_4f.length;i++){
-var _52=_4f[i];
-_50.push(_52);
-if(_52.childNodes&&_52.childNodes.length>0){
-_50=_50.concat(this._flattenNodes(_52.childNodes));
+if(_41||_40){
+_39.push(_3d);
 }
+}else{
+_39.push(_3d);
 }
 }
-return _50;
-},close:function(_53){
-},newItem:function(_54,_55){
-
-_54=(_54||{});
-var _56=_54.tagName;
-if(!_56){
-_56=this.rootItem;
-if(_56===""){
+dojo.forEach(_39,function(_47){
+if(_47.element.parentNode){
+_47.element.parentNode.removeChild(_47.element);
+}
+},this);
+return _39;
+},_flattenNodes:function(_48){
+var _49=[];
+if(_48){
+var i;
+for(i=0;i<_48.length;i++){
+var _4a=_48[i];
+_49.push(_4a);
+if(_4a.childNodes&&_4a.childNodes.length>0){
+_49=_49.concat(this._flattenNodes(_4a.childNodes));
+}
+}
+}
+return _49;
+},close:function(_4b){
+},newItem:function(_4c,_4d){
+_4c=(_4c||{});
+var _4e=_4c.tagName;
+if(!_4e){
+_4e=this.rootItem;
+if(_4e===""){
 return null;
 }
 }
-var _57=this._getDocument();
-var _58=_57.createElement(_56);
-for(var _59 in _54){
-var _5a;
-if(_59==="tagName"){
+var _4f=this._getDocument();
+var _50=_4f.createElement(_4e);
+for(var _51 in _4c){
+var _52;
+if(_51==="tagName"){
 continue;
 }else{
-if(_59==="text()"){
-_5a=_57.createTextNode(_54[_59]);
-_58.appendChild(_5a);
+if(_51==="text()"){
+_52=_4f.createTextNode(_4c[_51]);
+_50.appendChild(_52);
 }else{
-_59=this._getAttribute(_56,_59);
-if(_59.charAt(0)==="@"){
-var _5b=_59.substring(1);
-_58.setAttribute(_5b,_54[_59]);
+_51=this._getAttribute(_4e,_51);
+if(_51.charAt(0)==="@"){
+var _53=_51.substring(1);
+_50.setAttribute(_53,_4c[_51]);
 }else{
-var _5c=_57.createElement(_59);
-_5a=_57.createTextNode(_54[_59]);
-_5c.appendChild(_5a);
-_58.appendChild(_5c);
+var _54=_4f.createElement(_51);
+_52=_4f.createTextNode(_4c[_51]);
+_54.appendChild(_52);
+_50.appendChild(_54);
 }
 }
 }
 }
-var _5d=this._getItem(_58);
-this._newItems.push(_5d);
-var _5e=null;
-if(_55&&_55.parent&&_55.attribute){
-_5e={item:_55.parent,attribute:_55.attribute,oldValue:undefined};
-var _5f=this.getValues(_55.parent,_55.attribute);
-if(_5f&&_5f.length>0){
-var _60=_5f.slice(0,_5f.length);
-if(_5f.length===1){
-_5e.oldValue=_5f[0];
+var _55=this._getItem(_50);
+this._newItems.push(_55);
+var _56=null;
+if(_4d&&_4d.parent&&_4d.attribute){
+_56={item:_4d.parent,attribute:_4d.attribute,oldValue:undefined};
+var _57=this.getValues(_4d.parent,_4d.attribute);
+if(_57&&_57.length>0){
+var _58=_57.slice(0,_57.length);
+if(_57.length===1){
+_56.oldValue=_57[0];
 }else{
-_5e.oldValue=_5f.slice(0,_5f.length);
+_56.oldValue=_57.slice(0,_57.length);
 }
-_60.push(_5d);
-this.setValues(_55.parent,_55.attribute,_60);
-_5e.newValue=this.getValues(_55.parent,_55.attribute);
+_58.push(_55);
+this.setValues(_4d.parent,_4d.attribute,_58);
+_56.newValue=this.getValues(_4d.parent,_4d.attribute);
 }else{
-this.setValues(_55.parent,_55.attribute,_5d);
-_5e.newValue=_5d;
+this.setValues(_4d.parent,_4d.attribute,_55);
+_56.newValue=_55;
 }
 }
-return _5d;
-},deleteItem:function(_61){
-
-var _62=_61.element;
-if(_62.parentNode){
-this._backupItem(_61);
-_62.parentNode.removeChild(_62);
+return _55;
+},deleteItem:function(_59){
+var _5a=_59.element;
+if(_5a.parentNode){
+this._backupItem(_59);
+_5a.parentNode.removeChild(_5a);
 return true;
 }
-this._forgetItem(_61);
-this._deletedItems.push(_61);
+this._forgetItem(_59);
+this._deletedItems.push(_59);
 return true;
-},setValue:function(_63,_64,_65){
-if(_64==="tagName"){
+},setValue:function(_5b,_5c,_5d){
+if(_5c==="tagName"){
 return false;
 }
-this._backupItem(_63);
-var _66=_63.element;
-var _67;
-var _68;
-if(_64==="childNodes"){
-_67=_65.element;
-_66.appendChild(_67);
-}else{
-if(_64==="text()"){
-while(_66.firstChild){
-_66.removeChild(_66.firstChild);
-}
-_68=this._getDocument(_66).createTextNode(_65);
-_66.appendChild(_68);
-}else{
-_64=this._getAttribute(_66.nodeName,_64);
-if(_64.charAt(0)==="@"){
-var _69=_64.substring(1);
-_66.setAttribute(_69,_65);
-}else{
-for(var i=0;i<_66.childNodes.length;i++){
-var _6b=_66.childNodes[i];
-if(_6b.nodeType===1&&_6b.nodeName===_64){
-_67=_6b;
+this._backupItem(_5b);
+var _5e=_5b.element;
+var _5f;
+var _60;
+if(_5c==="childNodes"){
+_5f=_5d.element;
+_5e.appendChild(_5f);
+}else{
+if(_5c==="text()"){
+while(_5e.firstChild){
+_5e.removeChild(_5e.firstChild);
+}
+_60=this._getDocument(_5e).createTextNode(_5d);
+_5e.appendChild(_60);
+}else{
+_5c=this._getAttribute(_5e.nodeName,_5c);
+if(_5c.charAt(0)==="@"){
+var _61=_5c.substring(1);
+_5e.setAttribute(_61,_5d);
+}else{
+for(var i=0;i<_5e.childNodes.length;i++){
+var _62=_5e.childNodes[i];
+if(_62.nodeType===1&&_62.nodeName===_5c){
+_5f=_62;
 break;
 }
 }
-var _6c=this._getDocument(_66);
-if(_67){
-while(_67.firstChild){
-_67.removeChild(_67.firstChild);
+var _63=this._getDocument(_5e);
+if(_5f){
+while(_5f.firstChild){
+_5f.removeChild(_5f.firstChild);
 }
 }else{
-_67=_6c.createElement(_64);
-_66.appendChild(_67);
+_5f=_63.createElement(_5c);
+_5e.appendChild(_5f);
 }
-_68=_6c.createTextNode(_65);
-_67.appendChild(_68);
+_60=_63.createTextNode(_5d);
+_5f.appendChild(_60);
 }
 }
 }
 return true;
-},setValues:function(_6d,_6e,_6f){
-if(_6e==="tagName"){
+},setValues:function(_64,_65,_66){
+if(_65==="tagName"){
 return false;
 }
-this._backupItem(_6d);
-var _70=_6d.element;
+this._backupItem(_64);
+var _67=_64.element;
 var i;
-var _72;
-var _73;
-if(_6e==="childNodes"){
-while(_70.firstChild){
-_70.removeChild(_70.firstChild);
+var _68;
+var _69;
+if(_65==="childNodes"){
+while(_67.firstChild){
+_67.removeChild(_67.firstChild);
 }
-for(i=0;i<_6f.length;i++){
-_72=_6f[i].element;
-_70.appendChild(_72);
+for(i=0;i<_66.length;i++){
+_68=_66[i].element;
+_67.appendChild(_68);
 }
 }else{
-if(_6e==="text()"){
-while(_70.firstChild){
-_70.removeChild(_70.firstChild);
+if(_65==="text()"){
+while(_67.firstChild){
+_67.removeChild(_67.firstChild);
 }
-var _74="";
-for(i=0;i<_6f.length;i++){
-_74+=_6f[i];
+var _6a="";
+for(i=0;i<_66.length;i++){
+_6a+=_66[i];
 }
-_73=this._getDocument(_70).createTextNode(_74);
-_70.appendChild(_73);
+_69=this._getDocument(_67).createTextNode(_6a);
+_67.appendChild(_69);
 }else{
-_6e=this._getAttribute(_70.nodeName,_6e);
-if(_6e.charAt(0)==="@"){
-var _75=_6e.substring(1);
-_70.setAttribute(_75,_6f[0]);
+_65=this._getAttribute(_67.nodeName,_65);
+if(_65.charAt(0)==="@"){
+var _6b=_65.substring(1);
+_67.setAttribute(_6b,_66[0]);
 }else{
-for(i=_70.childNodes.length-1;i>=0;i--){
-var _76=_70.childNodes[i];
-if(_76.nodeType===1&&_76.nodeName===_6e){
-_70.removeChild(_76);
+for(i=_67.childNodes.length-1;i>=0;i--){
+var _6c=_67.childNodes[i];
+if(_6c.nodeType===1&&_6c.nodeName===_65){
+_67.removeChild(_6c);
 }
 }
-var _77=this._getDocument(_70);
-for(i=0;i<_6f.length;i++){
-_72=_77.createElement(_6e);
-_73=_77.createTextNode(_6f[i]);
-_72.appendChild(_73);
-_70.appendChild(_72);
+var _6d=this._getDocument(_67);
+for(i=0;i<_66.length;i++){
+_68=_6d.createElement(_65);
+_69=_6d.createTextNode(_66[i]);
+_68.appendChild(_69);
+_67.appendChild(_68);
 }
 }
 }
 }
 return true;
-},unsetAttribute:function(_78,_79){
-if(_79==="tagName"){
+},unsetAttribute:function(_6e,_6f){
+if(_6f==="tagName"){
 return false;
 }
-this._backupItem(_78);
-var _7a=_78.element;
-if(_79==="childNodes"||_79==="text()"){
-while(_7a.firstChild){
-_7a.removeChild(_7a.firstChild);
+this._backupItem(_6e);
+var _70=_6e.element;
+if(_6f==="childNodes"||_6f==="text()"){
+while(_70.firstChild){
+_70.removeChild(_70.firstChild);
 }
 }else{
-_79=this._getAttribute(_7a.nodeName,_79);
-if(_79.charAt(0)==="@"){
-var _7b=_79.substring(1);
-_7a.removeAttribute(_7b);
+_6f=this._getAttribute(_70.nodeName,_6f);
+if(_6f.charAt(0)==="@"){
+var _71=_6f.substring(1);
+_70.removeAttribute(_71);
 }else{
-for(var i=_7a.childNodes.length-1;i>=0;i--){
-var _7d=_7a.childNodes[i];
-if(_7d.nodeType===1&&_7d.nodeName===_79){
-_7a.removeChild(_7d);
+for(var i=_70.childNodes.length-1;i>=0;i--){
+var _72=_70.childNodes[i];
+if(_72.nodeType===1&&_72.nodeName===_6f){
+_70.removeChild(_72);
 }
 }
 }
 }
 return true;
-},save:function(_7e){
-if(!_7e){
-_7e={};
+},save:function(_73){
+if(!_73){
+_73={};
 }
 var i;
 for(i=0;i<this._modifiedItems.length;i++){
-this._saveItem(this._modifiedItems[i],_7e,"PUT");
+this._saveItem(this._modifiedItems[i],_73,"PUT");
 }
 for(i=0;i<this._newItems.length;i++){
-var _80=this._newItems[i];
-if(_80.element.parentNode){
+var _74=this._newItems[i];
+if(_74.element.parentNode){
 this._newItems.splice(i,1);
 i--;
 continue;
 }
-this._saveItem(this._newItems[i],_7e,"POST");
+this._saveItem(this._newItems[i],_73,"POST");
 }
 for(i=0;i<this._deletedItems.length;i++){
-this._saveItem(this._deletedItems[i],_7e,"DELETE");
+this._saveItem(this._deletedItems[i],_73,"DELETE");
 }
 },revert:function(){
-
-
-
 this._newItems=[];
 this._restoreItems(this._deletedItems);
 this._deletedItems=[];
 this._restoreItems(this._modifiedItems);
 this._modifiedItems=[];
 return true;
-},isDirty:function(_81){
-if(_81){
-var _82=this._getRootElement(_81.element);
-return (this._getItemIndex(this._newItems,_82)>=0||this._getItemIndex(this._deletedItems,_82)>=0||this._getItemIndex(this._modifiedItems,_82)>=0);
+},isDirty:function(_75){
+if(_75){
+var _76=this._getRootElement(_75.element);
+return (this._getItemIndex(this._newItems,_76)>=0||this._getItemIndex(this._deletedItems,_76)>=0||this._getItemIndex(this._modifiedItems,_76)>=0);
 }else{
 return (this._newItems.length>0||this._deletedItems.length>0||this._modifiedItems.length>0);
 }
-},_saveItem:function(_83,_84,_85){
+},_saveItem:function(_77,_78,_79){
 var url;
-var _87;
-if(_85==="PUT"){
-url=this._getPutUrl(_83);
+var _7a;
+if(_79==="PUT"){
+url=this._getPutUrl(_77);
 }else{
-if(_85==="DELETE"){
-url=this._getDeleteUrl(_83);
+if(_79==="DELETE"){
+url=this._getDeleteUrl(_77);
 }else{
-url=this._getPostUrl(_83);
+url=this._getPostUrl(_77);
 }
 }
 if(!url){
-if(_84.onError){
-_87=_84.scope||dojo.global;
-_84.onError.call(_87,new Error("No URL for saving content: "+this._getPostContent(_83)));
+if(_78.onError){
+_7a=_78.scope||dojo.global;
+_78.onError.call(_7a,new Error("No URL for saving content: "+this._getPostContent(_77)));
 }
 return;
 }
-var _88={url:url,method:(_85||"POST"),contentType:"text/xml",handleAs:"xml"};
-var _89;
-if(_85==="PUT"){
-_88.putData=this._getPutContent(_83);
-_89=dojo.rawXhrPut(_88);
+var _7b={url:url,method:(_79||"POST"),contentType:"text/xml",handleAs:"xml"};
+var _7c;
+if(_79==="PUT"){
+_7b.putData=this._getPutContent(_77);
+_7c=dojo.rawXhrPut(_7b);
 }else{
-if(_85==="DELETE"){
-_89=dojo.xhrDelete(_88);
+if(_79==="DELETE"){
+_7c=dojo.xhrDelete(_7b);
 }else{
-_88.postData=this._getPostContent(_83);
-_89=dojo.rawXhrPost(_88);
+_7b.postData=this._getPostContent(_77);
+_7c=dojo.rawXhrPost(_7b);
 }
 }
-_87=(_84.scope||dojo.global);
-var _8a=this;
-_89.addCallback(function(_8b){
-_8a._forgetItem(_83);
-if(_84.onComplete){
-_84.onComplete.call(_87);
+_7a=(_78.scope||dojo.global);
+var _7d=this;
+_7c.addCallback(function(_7e){
+_7d._forgetItem(_77);
+if(_78.onComplete){
+_78.onComplete.call(_7a);
 }
 });
-_89.addErrback(function(_8c){
-if(_84.onError){
-_84.onError.call(_87,_8c);
+_7c.addErrback(function(_7f){
+if(_78.onError){
+_78.onError.call(_7a,_7f);
 }
 });
-},_getPostUrl:function(_8d){
+},_getPostUrl:function(_80){
 return this.url;
-},_getPutUrl:function(_8e){
+},_getPutUrl:function(_81){
 return this.url;
-},_getDeleteUrl:function(_8f){
+},_getDeleteUrl:function(_82){
 var url=this.url;
-if(_8f&&this.keyAttribute!==""){
-var _91=this.getValue(_8f,this.keyAttribute);
-if(_91){
+if(_82&&this.keyAttribute!==""){
+var _83=this.getValue(_82,this.keyAttribute);
+if(_83){
 var key=this.keyAttribute.charAt(0)==="@"?this.keyAttribute.substring(1):this.keyAttribute;
 url+=url.indexOf("?")<0?"?":"&";
-url+=key+"="+_91;
+url+=key+"="+_83;
 }
 }
 return url;
-},_getPostContent:function(_93){
-var _94=_93.element;
-var _95="<?xml version=\"1.0\"?>";
-return _95+dojox.xml.parser.innerXML(_94);
-},_getPutContent:function(_96){
-var _97=_96.element;
-var _98="<?xml version=\"1.0\"?>";
-return _98+dojox.xml.parser.innerXML(_97);
-},_getAttribute:function(_99,_9a){
+},_getPostContent:function(_84){
+var _85=_84.element;
+var _86="<?xml version=\"1.0\"?>";
+return _86+dojox.xml.parser.innerXML(_85);
+},_getPutContent:function(_87){
+var _88=_87.element;
+var _89="<?xml version=\"1.0\"?>";
+return _89+dojox.xml.parser.innerXML(_88);
+},_getAttribute:function(_8a,_8b){
 if(this._attributeMap){
-var key=_99+"."+_9a;
-var _9c=this._attributeMap[key];
-if(_9c){
-_9a=_9c;
+var key=_8a+"."+_8b;
+var _8c=this._attributeMap[key];
+if(_8c){
+_8b=_8c;
 }else{
-_9c=this._attributeMap[_9a];
-if(_9c){
-_9a=_9c;
+_8c=this._attributeMap[_8b];
+if(_8c){
+_8b=_8c;
 }
 }
 }
-return _9a;
-},_getItem:function(_9d){
+return _8b;
+},_getItem:function(_8d){
 try{
 var q=null;
 if(this.keyAttribute===""){
-q=this._getXPath(_9d);
+q=this._getXPath(_8d);
 }
-return new dojox.data.XmlItem(_9d,this,q);
+return new dojox.data.XmlItem(_8d,this,q);
 }
 catch(e){
-
 }
 return null;
-},_getItemIndex:function(_9f,_a0){
-for(var i=0;i<_9f.length;i++){
-if(_9f[i].element===_a0){
+},_getItemIndex:function(_8e,_8f){
+for(var i=0;i<_8e.length;i++){
+if(_8e[i].element===_8f){
 return i;
 }
 }
 return -1;
-},_backupItem:function(_a2){
-var _a3=this._getRootElement(_a2.element);
-if(this._getItemIndex(this._newItems,_a3)>=0||this._getItemIndex(this._modifiedItems,_a3)>=0){
+},_backupItem:function(_90){
+var _91=this._getRootElement(_90.element);
+if(this._getItemIndex(this._newItems,_91)>=0||this._getItemIndex(this._modifiedItems,_91)>=0){
 return;
 }
-if(_a3!=_a2.element){
-_a2=this._getItem(_a3);
+if(_91!=_90.element){
+_90=this._getItem(_91);
 }
-_a2._backup=_a3.cloneNode(true);
-this._modifiedItems.push(_a2);
-},_restoreItems:function(_a4){
-dojo.forEach(_a4,function(_a5){
-if(_a5._backup){
-_a5.element=_a5._backup;
-_a5._backup=null;
+_90._backup=_91.cloneNode(true);
+this._modifiedItems.push(_90);
+},_restoreItems:function(_92){
+dojo.forEach(_92,function(_93){
+if(_93._backup){
+_93.element=_93._backup;
+_93._backup=null;
 }
 },this);
-},_forgetItem:function(_a6){
-var _a7=_a6.element;
-var _a8=this._getItemIndex(this._newItems,_a7);
-if(_a8>=0){
-this._newItems.splice(_a8,1);
+},_forgetItem:function(_94){
+var _95=_94.element;
+var _96=this._getItemIndex(this._newItems,_95);
+if(_96>=0){
+this._newItems.splice(_96,1);
 }
-_a8=this._getItemIndex(this._deletedItems,_a7);
-if(_a8>=0){
-this._deletedItems.splice(_a8,1);
+_96=this._getItemIndex(this._deletedItems,_95);
+if(_96>=0){
+this._deletedItems.splice(_96,1);
 }
-_a8=this._getItemIndex(this._modifiedItems,_a7);
-if(_a8>=0){
-this._modifiedItems.splice(_a8,1);
+_96=this._getItemIndex(this._modifiedItems,_95);
+if(_96>=0){
+this._modifiedItems.splice(_96,1);
 }
-},_getDocument:function(_a9){
-if(_a9){
-return _a9.ownerDocument;
+},_getDocument:function(_97){
+if(_97){
+return _97.ownerDocument;
 }else{
 if(!this._document){
 return dojox.xml.parser.parse();
 }
 }
 return null;
-},_getRootElement:function(_aa){
-while(_aa.parentNode){
-_aa=_aa.parentNode;
+},_getRootElement:function(_98){
+while(_98.parentNode){
+_98=_98.parentNode;
 }
-return _aa;
-},_getXPath:function(_ab){
-var _ac=null;
+return _98;
+},_getXPath:function(_99){
+var _9a=null;
 if(!this.sendQuery){
-var _ad=_ab;
-_ac="";
-while(_ad&&_ad!=_ab.ownerDocument){
+var _9b=_99;
+_9a="";
+while(_9b&&_9b!=_99.ownerDocument){
 var pos=0;
-var _af=_ad;
-var _b0=_ad.nodeName;
-while(_af){
-_af=_af.previousSibling;
-if(_af&&_af.nodeName===_b0){
+var _9c=_9b;
+var _9d=_9b.nodeName;
+while(_9c){
+_9c=_9c.previousSibling;
+if(_9c&&_9c.nodeName===_9d){
 pos++;
 }
 }
-var _b1="/"+_b0+"["+pos+"]";
-if(_ac){
-_ac=_b1+_ac;
+var _9e="/"+_9d+"["+pos+"]";
+if(_9a){
+_9a=_9e+_9a;
 }else{
-_ac=_b1;
+_9a=_9e;
 }
-_ad=_ad.parentNode;
+_9b=_9b.parentNode;
 }
 }
-return _ac;
-},getIdentity:function(_b2){
-if(!this.isItem(_b2)){
+return _9a;
+},getIdentity:function(_9f){
+if(!this.isItem(_9f)){
 throw new Error("dojox.data.XmlStore: Object supplied to getIdentity is not an item");
 }else{
 var id=null;
 if(this.sendQuery&&this.keyAttribute!==""){
-id=this.getValue(_b2,this.keyAttribute).toString();
+id=this.getValue(_9f,this.keyAttribute).toString();
 }else{
 if(!this.serverQuery){
 if(this.keyAttribute!==""){
-id=this.getValue(_b2,this.keyAttribute).toString();
+id=this.getValue(_9f,this.keyAttribute).toString();
 }else{
-id=_b2.q;
+id=_9f.q;
 }
 }
 }
 return id;
 }
-},getIdentityAttributes:function(_b4){
-if(!this.isItem(_b4)){
+},getIdentityAttributes:function(_a0){
+if(!this.isItem(_a0)){
 throw new Error("dojox.data.XmlStore: Object supplied to getIdentity is not an item");
 }else{
 if(this.keyAttribute!==""){
@@ -763,151 +777,154 @@ return [this.keyAttribute];
 return null;
 }
 }
-},fetchItemByIdentity:function(_b5){
-var _b6=null;
-var _b7=null;
-var _b8=this;
+},fetchItemByIdentity:function(_a1){
+var _a2=null;
+var _a3=null;
+var _a4=this;
 var url=null;
-var _ba=null;
-var _bb=null;
-if(!_b8.sendQuery){
-_b6=function(_bc){
-if(_bc){
-if(_b8.keyAttribute!==""){
-var _bd={};
-_bd.query={};
-_bd.query[_b8.keyAttribute]=_b5.identity;
-var _be=_b8._getItems(_bc,_bd);
-_b7=_b5.scope||dojo.global;
-if(_be.length===1){
-if(_b5.onItem){
-_b5.onItem.call(_b7,_be[0]);
+var _a5=null;
+var _a6=null;
+if(!_a4.sendQuery){
+_a2=function(_a7){
+if(_a7){
+if(_a4.keyAttribute!==""){
+var _a8={};
+_a8.query={};
+_a8.query[_a4.keyAttribute]=_a1.identity;
+_a8.queryOptions={deep:true};
+var _a9=_a4._getItems(_a7,_a8);
+_a3=_a1.scope||dojo.global;
+if(_a9.length===1){
+if(_a1.onItem){
+_a1.onItem.call(_a3,_a9[0]);
 }
 }else{
-if(_be.length===0){
-if(_b5.onItem){
-_b5.onItem.call(_b7,null);
+if(_a9.length===0){
+if(_a1.onItem){
+_a1.onItem.call(_a3,null);
 }
 }else{
-if(_b5.onError){
-_b5.onError.call(_b7,new Error("Items array size for identity lookup greater than 1, invalid keyAttribute."));
+if(_a1.onError){
+_a1.onError.call(_a3,new Error("Items array size for identity lookup greater than 1, invalid keyAttribute."));
 }
 }
 }
 }else{
-var _bf=_b5.identity.split("/");
+var _aa=_a1.identity.split("/");
 var i;
-var _c1=_bc;
-for(i=0;i<_bf.length;i++){
-if(_bf[i]&&_bf[i]!==""){
-var _c2=_bf[i];
-_c2=_c2.substring(0,_c2.length-1);
-var _c3=_c2.split("[");
-var tag=_c3[0];
-var _c5=parseInt(_c3[1],10);
+var _ab=_a7;
+for(i=0;i<_aa.length;i++){
+if(_aa[i]&&_aa[i]!==""){
+var _ac=_aa[i];
+_ac=_ac.substring(0,_ac.length-1);
+var _ad=_ac.split("[");
+var tag=_ad[0];
+var _ae=parseInt(_ad[1],10);
 var pos=0;
-if(_c1){
-var _c7=_c1.childNodes;
-if(_c7){
+if(_ab){
+var _af=_ab.childNodes;
+if(_af){
 var j;
-var _c9=null;
-for(j=0;j<_c7.length;j++){
-var _ca=_c7[j];
-if(_ca.nodeName===tag){
-if(pos<_c5){
+var _b0=null;
+for(j=0;j<_af.length;j++){
+var _b1=_af[j];
+if(_b1.nodeName===tag){
+if(pos<_ae){
 pos++;
 }else{
-_c9=_ca;
+_b0=_b1;
 break;
 }
 }
 }
-if(_c9){
-_c1=_c9;
+if(_b0){
+_ab=_b0;
 }else{
-_c1=null;
+_ab=null;
 }
 }else{
-_c1=null;
+_ab=null;
 }
 }else{
 break;
 }
 }
 }
-var _cb=null;
-if(_c1){
-_cb=_b8._getItem(_c1);
-_cb.element.parentNode.removeChild(_cb.element);
+var _b2=null;
+if(_ab){
+_b2=_a4._getItem(_ab);
+if(_b2.element.parentNode){
+_b2.element.parentNode.removeChild(_b2.element);
+}
 }
-if(_b5.onItem){
-_b7=_b5.scope||dojo.global;
-_b5.onItem.call(_b7,_cb);
+if(_a1.onItem){
+_a3=_a1.scope||dojo.global;
+_a1.onItem.call(_a3,_b2);
 }
 }
 }
 };
 url=this._getFetchUrl(null);
-_ba={url:url,handleAs:"xml",preventCache:true};
-_bb=dojo.xhrGet(_ba);
-_bb.addCallback(_b6);
-if(_b5.onError){
-_bb.addErrback(function(_cc){
-var s=_b5.scope||dojo.global;
-_b5.onError.call(s,_cc);
+_a5={url:url,handleAs:"xml",preventCache:_a4.urlPreventCache};
+_a6=dojo.xhrGet(_a5);
+_a6.addCallback(_a2);
+if(_a1.onError){
+_a6.addErrback(function(_b3){
+var s=_a1.scope||dojo.global;
+_a1.onError.call(s,_b3);
 });
 }
 }else{
-if(_b8.keyAttribute!==""){
-var _ce={query:{}};
-_ce.query[_b8.keyAttribute]=_b5.identity;
-url=this._getFetchUrl(_ce);
-_b6=function(_cf){
-var _d0=null;
-if(_cf){
-var _d1=_b8._getItems(_d1,{});
-if(_d1.length===1){
-_d0=_d1[0];
+if(_a4.keyAttribute!==""){
+var _b4={query:{}};
+_b4.query[_a4.keyAttribute]=_a1.identity;
+url=this._getFetchUrl(_b4);
+_a2=function(_b5){
+var _b6=null;
+if(_b5){
+var _b7=_a4._getItems(_b7,{});
+if(_b7.length===1){
+_b6=_b7[0];
 }else{
-if(_b5.onError){
-var _d2=_b5.scope||dojo.global;
-_b5.onError.call(_d2,new Error("More than one item was returned from the server for the denoted identity"));
+if(_a1.onError){
+var _b8=_a1.scope||dojo.global;
+_a1.onError.call(_b8,new Error("More than one item was returned from the server for the denoted identity"));
 }
 }
 }
-if(_b5.onItem){
-_d2=_b5.scope||dojo.global;
-_b5.onItem.call(_d2,_d0);
+if(_a1.onItem){
+_b8=_a1.scope||dojo.global;
+_a1.onItem.call(_b8,_b6);
 }
 };
-_ba={url:url,handleAs:"xml",preventCache:true};
-_bb=dojo.xhrGet(_ba);
-_bb.addCallback(_b6);
-if(_b5.onError){
-_bb.addErrback(function(_d3){
-var s=_b5.scope||dojo.global;
-_b5.onError.call(s,_d3);
+_a5={url:url,handleAs:"xml",preventCache:_a4.urlPreventCache};
+_a6=dojo.xhrGet(_a5);
+_a6.addCallback(_a2);
+if(_a1.onError){
+_a6.addErrback(function(_b9){
+var s=_a1.scope||dojo.global;
+_a1.onError.call(s,_b9);
 });
 }
 }else{
-if(_b5.onError){
-var s=_b5.scope||dojo.global;
-_b5.onError.call(s,new Error("XmlStore is not told that the server to provides identity support.  No keyAttribute specified."));
+if(_a1.onError){
+var s=_a1.scope||dojo.global;
+_a1.onError.call(s,new Error("XmlStore is not told that the server to provides identity support.  No keyAttribute specified."));
 }
 }
 }
 }});
-dojo.declare("dojox.data.XmlItem",null,{constructor:function(_d6,_d7,_d8){
-this.element=_d6;
-this.store=_d7;
-this.q=_d8;
+dojo.declare("dojox.data.XmlItem",null,{constructor:function(_ba,_bb,_bc){
+this.element=_ba;
+this.store=_bb;
+this.q=_bc;
 },toString:function(){
 var str="";
 if(this.element){
 for(var i=0;i<this.element.childNodes.length;i++){
-var _db=this.element.childNodes[i];
-if(_db.nodeType===3||_db.nodeType===4){
-str+=_db.nodeValue;
+var _bd=this.element.childNodes[i];
+if(_bd.nodeType===3||_bd.nodeType===4){
+str+=_bd.nodeValue;
 }
 }
 }
diff --git a/dojox/data/css.js b/dojox/data/css.js
index 40eb3d5..6e939fc 100644
--- a/dojox/data/css.js
+++ b/dojox/data/css.js
@@ -9,83 +9,83 @@ if(!dojo._hasResource["dojox.data.css"]){
 dojo._hasResource["dojox.data.css"]=true;
 dojo.provide("dojox.data.css");
 dojo.provide("dojox.data.css.rules");
-dojox.data.css.rules.forEach=function(fn,_2,_3){
-if(_3){
-var _4=function(_5){
-dojo.forEach(_5[_5.cssRules?"cssRules":"rules"],function(_6){
-if(!_6.type||_6.type!==3){
-var _7="";
-if(_5&&_5.href){
-_7=_5.href;
+dojox.data.css.rules.forEach=function(fn,_1,_2){
+if(_2){
+var _3=function(_4){
+dojo.forEach(_4[_4.cssRules?"cssRules":"rules"],function(_5){
+if(!_5.type||_5.type!==3){
+var _6="";
+if(_4&&_4.href){
+_6=_4.href;
 }
-fn.call(_2?_2:this,_6,_5,_7);
+fn.call(_1?_1:this,_5,_4,_6);
 }
 });
 };
-dojo.forEach(_3,_4);
+dojo.forEach(_2,_3);
 }
 };
-dojox.data.css.findStyleSheets=function(_8){
-var _9=[];
-var _a=function(_b){
-var s=dojox.data.css.findStyleSheet(_b);
+dojox.data.css.findStyleSheets=function(_7){
+var _8=[];
+var _9=function(_a){
+var s=dojox.data.css.findStyleSheet(_a);
 if(s){
-dojo.forEach(s,function(_d){
-if(dojo.indexOf(_9,_d)===-1){
-_9.push(_d);
+dojo.forEach(s,function(_b){
+if(dojo.indexOf(_8,_b)===-1){
+_8.push(_b);
 }
 });
 }
 };
-dojo.forEach(_8,_a);
-return _9;
+dojo.forEach(_7,_9);
+return _8;
 };
-dojox.data.css.findStyleSheet=function(_e){
-var _f=[];
-if(_e.charAt(0)==="."){
-_e=_e.substring(1);
+dojox.data.css.findStyleSheet=function(_c){
+var _d=[];
+if(_c.charAt(0)==="."){
+_c=_c.substring(1);
 }
-var _10=function(_11){
-if(_11.href&&_11.href.match(_e)){
-_f.push(_11);
+var _e=function(_f){
+if(_f.href&&_f.href.match(_c)){
+_d.push(_f);
 return true;
 }
-if(_11.imports){
-return dojo.some(_11.imports,function(_12){
-return _10(_12);
+if(_f.imports){
+return dojo.some(_f.imports,function(_10){
+return _e(_10);
 });
 }
-return dojo.some(_11[_11.cssRules?"cssRules":"rules"],function(_13){
-if(_13.type&&_13.type===3&&_10(_13.styleSheet)){
+return dojo.some(_f[_f.cssRules?"cssRules":"rules"],function(_11){
+if(_11.type&&_11.type===3&&_e(_11.styleSheet)){
 return true;
 }
 return false;
 });
 };
-dojo.some(document.styleSheets,_10);
-return _f;
+dojo.some(document.styleSheets,_e);
+return _d;
 };
-dojox.data.css.determineContext=function(_14){
+dojox.data.css.determineContext=function(_12){
 var ret=[];
-if(_14&&_14.length>0){
-_14=dojox.data.css.findStyleSheets(_14);
+if(_12&&_12.length>0){
+_12=dojox.data.css.findStyleSheets(_12);
 }else{
-_14=document.styleSheets;
+_12=document.styleSheets;
 }
-var _16=function(_17){
-ret.push(_17);
-if(_17.imports){
-dojo.forEach(_17.imports,function(_18){
-_16(_18);
+var _13=function(_14){
+ret.push(_14);
+if(_14.imports){
+dojo.forEach(_14.imports,function(_15){
+_13(_15);
 });
 }
-dojo.forEach(_17[_17.cssRules?"cssRules":"rules"],function(_19){
-if(_19.type&&_19.type===3){
-_16(_19.styleSheet);
+dojo.forEach(_14[_14.cssRules?"cssRules":"rules"],function(_16){
+if(_16.type&&_16.type===3){
+_13(_16.styleSheet);
 }
 });
 };
-dojo.forEach(_14,_16);
+dojo.forEach(_12,_13);
 return ret;
 };
 }
diff --git a/dojox/data/jsonPathStore.js b/dojox/data/jsonPathStore.js
deleted file mode 100644
index c041c1d..0000000
--- a/dojox/data/jsonPathStore.js
+++ /dev/null
@@ -1,670 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.data.jsonPathStore"]){
-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,noRevert:false,constructor:function(_1){
-this.byId=this.fetchItemByIdentity;
-if(_1){
-dojo.mixin(this,_1);
-}
-this._dirtyItems=[];
-this._autoId=0;
-this._referenceId=0;
-this._references={};
-this._fetchQueue=[];
-this.index={};
-var _2="("+this.metaLabel+"'])";
-this.metaRegex=new RegExp(_2);
-if(!this.data&&!this.url){
-this.setData({});
-}
-if(this.data&&!this.url){
-this.setData(this.data);
-delete this.data;
-}
-if(this.url){
-dojo.xhrGet({url:_1.url,handleAs:"json",load:dojo.hitch(this,"setData"),sync:this.mode});
-}
-},_loadData:function(_3){
-if(this._data){
-delete this._data;
-}
-if(dojo.isString(_3)){
-this._data=dojo.fromJson(_3);
-}else{
-this._data=_3;
-}
-if(this.indexOnLoad){
-this.buildIndex();
-}
-this._updateMeta(this._data,{path:"$"});
-this.onLoadData(this._data);
-},onLoadData:function(_4){
-while(this._fetchQueue.length>0){
-var _5=this._fetchQueue.shift();
-this.fetch(_5);
-}
-},setData:function(_6){
-this._loadData(_6);
-},buildIndex:function(_7,_8){
-if(!this.idAttribute){
-throw new Error("buildIndex requires idAttribute for the store");
-}
-_8=_8||this._data;
-var _9=_7;
-_7=_7||"$";
-_7+="[*]";
-var _a=this.fetch({query:_7,mode:dojox.data.SYNC_MODE});
-for(var i=0;i<_a.length;i++){
-var _c,_d;
-if(dojo.isObject(_a[i])){
-var _e=_a[i][this.metaLabel]["path"];
-if(_9){
-_c=_9.split("['");
-_d=_c[_c.length-1].replace(this._replaceRegex,"");
-if(!dojo.isArray(_a[i])){
-this._addReference(_a[i],{parent:_8,attribute:_d});
-this.buildIndex(_e,_a[i]);
-}else{
-this.buildIndex(_e,_8);
-}
-}else{
-_c=_e.split("['");
-_d=_c[_c.length-1].replace(this._replaceRegex,"");
-this._addReference(_a[i],{parent:this._data,attribute:_d});
-this.buildIndex(_e,_a[i]);
-}
-}
-}
-},_correctReference:function(_f){
-if(this.index[_f[this.idAttribute]]&&(this.index[_f[this.idAttribute]][this.metaLabel]===_f[this.metaLabel])){
-return this.index[_f[this.idAttribute]];
-}
-return _f;
-},getValue:function(_10,_11){
-_10=this._correctReference(_10);
-return _10[_11];
-},getValues:function(_12,_13){
-_12=this._correctReference(_12);
-return dojo.isArray(_12[_13])?_12[_13]:[_12[_13]];
-},getAttributes:function(_14){
-_14=this._correctReference(_14);
-var res=[];
-for(var i in _14){
-if(this.hideMetaAttributes&&(i==this.metaLabel)){
-continue;
-}
-res.push(i);
-}
-return res;
-},hasAttribute:function(_17,_18){
-_17=this._correctReference(_17);
-if(_18 in _17){
-return true;
-}
-return false;
-},containsValue:function(_19,_1a,_1b){
-_19=this._correctReference(_19);
-if(_19[_1a]&&_19[_1a]==_1b){
-return true;
-}
-if(dojo.isObject(_19[_1a])||dojo.isObject(_1b)){
-if(this._shallowCompare(_19[_1a],_1b)){
-return true;
-}
-}
-return false;
-},_shallowCompare:function(a,b){
-if((dojo.isObject(a)&&!dojo.isObject(b))||(dojo.isObject(b)&&!dojo.isObject(a))){
-return false;
-}
-if(a["getFullYear"]||b["getFullYear"]){
-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;
-}
-}
-}
-for(i in a){
-if(!b[i]){
-return false;
-}
-}
-return true;
-},isItem:function(_1f){
-if(!dojo.isObject(_1f)||!_1f[this.metaLabel]){
-return false;
-}
-if(this.requireId&&this._hasId&&!_1f[this._id]){
-return false;
-}
-return true;
-},isItemLoaded:function(_20){
-_20=this._correctReference(_20);
-return this.isItem(_20);
-},loadItem:function(_21){
-return true;
-},_updateMeta:function(_22,_23){
-if(_22&&_22[this.metaLabel]){
-dojo.mixin(_22[this.metaLabel],_23);
-return;
-}
-_22[this.metaLabel]=_23;
-},cleanMeta:function(_24,_25){
-_24=_24||this._data;
-if(_24[this.metaLabel]){
-if(_24[this.metaLabel].autoId){
-delete _24[this.idAttribute];
-}
-delete _24[this.metaLabel];
-}
-if(dojo.isArray(_24)){
-for(var i=0;i<_24.length;i++){
-if(dojo.isObject(_24[i])||dojo.isArray(_24[i])){
-this.cleanMeta(_24[i]);
-}
-}
-}else{
-if(dojo.isObject(_24)){
-for(i in _24){
-if(dojo.isObject(_24[i])){
-this.cleanMeta(_24[i]);
-}
-}
-}
-}
-},fetch:function(_27){
-if(!this._data){
-this._fetchQueue.push(_27);
-return _27;
-}
-if(dojo.isString(_27)){
-_28=_27;
-_27={query:_28,mode:dojox.data.SYNC_MODE};
-}
-var _28;
-if(!_27||!_27.query){
-if(!_27){
-var _27={};
-}
-if(!_27.query){
-_27.query="$..*";
-_28=_27.query;
-}
-}
-if(dojo.isObject(_27.query)){
-if(_27.query.query){
-_28=_27.query.query;
-}else{
-_28=_27.query="$..*";
-}
-if(_27.query.queryOptions){
-_27.queryOptions=_27.query.queryOptions;
-}
-}else{
-_28=_27.query;
-}
-if(!_27.mode){
-_27.mode=this.mode;
-}
-if(!_27.queryOptions){
-_27.queryOptions={};
-}
-_27.queryOptions.resultType="BOTH";
-var _29=dojox.jsonPath.query(this._data,_28,_27.queryOptions);
-var tmp=[];
-var _2b=0;
-for(var i=0;i<_29.length;i++){
-if(_27.start&&i<_27.start){
-continue;
-}
-if(_27.count&&(_2b>=_27.count)){
-continue;
-}
-var _2d=_29[i]["value"];
-var _2e=_29[i]["path"];
-if(!dojo.isObject(_2d)){
-continue;
-}
-if(this.metaRegex.exec(_2e)){
-continue;
-}
-this._updateMeta(_2d,{path:_29[i].path});
-if(this.autoIdentity&&!_2d[this.idAttribute]){
-var _2f=this.autoIdPrefix+this._autoId++;
-_2d[this.idAttribute]=_2f;
-_2d[this.metaLabel].autoId=true;
-}
-if(_2d[this.idAttribute]){
-this.index[_2d[this.idAttribute]]=_2d;
-}
-_2b++;
-tmp.push(_2d);
-}
-_29=tmp;
-var _30=_27.scope||dojo.global;
-if("sort" in _27){
-
-}
-if(_27.mode==dojox.data.SYNC_MODE){
-return _29;
-}
-if(_27.onBegin){
-_27["onBegin"].call(_30,_29.length,_27);
-}
-if(_27.onItem){
-for(var i=0;i<_29.length;i++){
-_27["onItem"].call(_30,_29[i],_27);
-}
-}
-if(_27.onComplete){
-_27["onComplete"].call(_30,_29,_27);
-}
-return _27;
-},dump:function(_31){
-var _31=_31||{};
-var d=_31.data||this._data;
-if(!_31.suppressExportMeta&&_31.clone){
-_33=dojo.clone(d);
-if(_33[this.metaLabel]){
-_33[this.metaLabel]["clone"]=true;
-}
-}else{
-var _33=d;
-}
-if(!_31.suppressExportMeta&&_33[this.metaLabel]){
-_33[this.metaLabel]["last_export"]=new Date().toString();
-}
-if(_31.cleanMeta){
-this.cleanMeta(_33);
-}
-switch(_31.type){
-case "raw":
-return _33;
-case "json":
-default:
-return dojo.toJson(_33,_31.pretty||false);
-}
-},getFeatures:function(){
-return {"dojo.data.api.Read":true,"dojo.data.api.Identity":true,"dojo.data.api.Write":true,"dojo.data.api.Notification":true};
-},getLabel:function(_34){
-_34=this._correctReference(_34);
-var _35="";
-if(dojo.isFunction(this.createLabel)){
-return this.createLabel(_34);
-}
-if(this.labelAttribute){
-if(dojo.isArray(this.labelAttribute)){
-for(var i=0;i<this.labelAttribute.length;i++){
-if(i>0){
-_35+=" ";
-}
-_35+=_34[this.labelAttribute[i]];
-}
-return _35;
-}else{
-return _34[this.labelAttribute];
-}
-}
-return _34.toString();
-},getLabelAttributes:function(_37){
-_37=this._correctReference(_37);
-return dojo.isArray(this.labelAttribute)?this.labelAttribute:[this.labelAttribute];
-},sort:function(a,b){
-
-},getIdentity:function(_3a){
-if(this.isItem(_3a)){
-return _3a[this.idAttribute];
-}
-throw new Error("Id not found for item");
-},getIdentityAttributes:function(_3b){
-return [this.idAttribute];
-},fetchItemByIdentity:function(_3c){
-var id;
-if(dojo.isString(_3c)){
-id=_3c;
-_3c={identity:id,mode:dojox.data.SYNC_MODE};
-}else{
-if(_3c){
-id=_3c["identity"];
-}
-if(!_3c.mode){
-_3c.mode=this.mode;
-}
-}
-if(this.index&&(this.index[id]||this.index["identity"])){
-if(_3c.mode==dojox.data.SYNC_MODE){
-return this.index[id];
-}
-if(_3c.onItem){
-_3c["onItem"].call(_3c.scope||dojo.global,this.index[id],_3c);
-}
-return _3c;
-}else{
-if(_3c.mode==dojox.data.SYNC_MODE){
-return false;
-}
-}
-if(_3c.onError){
-_3c["onItem"].call(_3c.scope||dojo.global,new Error("Item Not Found: "+id),_3c);
-}
-return _3c;
-},_makeItAnItem:function(_3e,_3f){
-var _40={};
-if(this.idAttribute&&!_3e[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 _41=this.autoIdPrefix+this._autoId++;
-_3e[this.idAttribute]=_41;
-_40.autoId=true;
-}
-}
-if(!_3f&&!_3f.attribute&&!this.idAttribute&&!_3e[this.idAttribute]){
-throw new Error("Adding a new item requires, at a minimum, either the pInfo information, including the pInfo.attribute, or an id on the item in the field identified by idAttribute");
-}
-if(!_3f.attribute){
-_3f.attribute=_3e[this.idAttribute];
-}
-if(_3e[this.idAttribute]){
-this.index[_3e[this.idAttribute]]=_3e;
-}
-this._updateMeta(_3e,_40);
-this._addReference(_3e,{parent:_3f.item,attribute:_3f.attribute});
-this._setDirty(_3e);
-if(_3e[_3f.attribute]&&dojo.isArray(_3e[_3f.attribute])){
-for(var i=0;i<_3e[_3f.attribute].length;i++){
-this._makeItAnItem(_3e[_3f.attribute][i],{item:_3e,attribute:_3f.attribute});
-}
-}
-return _3e;
-},newItem:function(_43,_44){
-var _45={item:this._data};
-if(_44){
-if(_44.parent){
-_44.item=_44.parent;
-}
-dojo.mixin(_45,_44);
-}
-this._makeItAnItem(_43,_45);
-_45.oldValue=this._trimItem(_45.item[_45.attribute]);
-this._setDirty(_45.item);
-if(dojo.isArray(_45.item[_45.attribute])){
-_45.item[_45.attribute].push(_43);
-}else{
-_45.item[_45.attribute]=_43;
-}
-_45.newValue=_45.item[_45.attribute];
-this.onNew(_43,_45);
-if(_43[_45.attribute]&&dojo.isArray(_43[_45.attribute])){
-for(var i=0;i<_43[_45.attribute].length;i++){
-this.onNew(_43[_45.attribute][i],{item:_43,attribute:_45.attribute});
-}
-}
-return _43;
-},_addReference:function(_47,_48){
-var rid="_ref_"+this._referenceId++;
-if(!_47[this.metaLabel]["referenceIds"]){
-_47[this.metaLabel]["referenceIds"]=[];
-}
-_47[this.metaLabel]["referenceIds"].push(rid);
-this._references[rid]=_48;
-},deleteItem:function(_4a){
-_4a=this._correctReference(_4a);
-
-if(this.isItem(_4a)){
-while(_4a[this.metaLabel]["referenceIds"].length>0){
-
-
-var rid=_4a[this.metaLabel]["referenceIds"].pop();
-var _4c=this._references[rid];
-
-var _4d=_4c.parent;
-var _4e=_4c.attribute;
-if(_4d&&_4d[_4e]&&!dojo.isArray(_4d[_4e])){
-this._setDirty(_4d);
-this.unsetAttribute(_4d,_4e);
-delete _4d[_4e];
-}
-if(dojo.isArray(_4d[_4e])){
-
-var _4f=this._trimItem(_4d[_4e]);
-var _50=false;
-for(var i=0;i<_4d[_4e].length&&!_50;i++){
-if(_4d[_4e][i][this.metaLabel]===_4a[this.metaLabel]){
-_50=true;
-}
-}
-if(_50){
-this._setDirty(_4d);
-var del=_4d[_4e].splice(i-1,1);
-delete del;
-}
-var _53=this._trimItem(_4d[_4e]);
-this.onSet(_4d,_4e,_4f,_53);
-}
-delete this._references[rid];
-}
-this.onDelete(_4a);
-delete this.index[_4a[this.idAttribute]];
-}
-},_setDirty:function(_54){
-if(this.noRevert){
-return;
-}
-for(var i=0;i<this._dirtyItems.length;i++){
-if(_54[this.idAttribute]==this._dirtyItems[i][this.idAttribute]){
-return;
-}
-}
-this._dirtyItems.push({item:_54,old:this._trimItem(_54)});
-this._updateMeta(_54,{isDirty:true});
-},setValue:function(_56,_57,_58){
-_56=this._correctReference(_56);
-this._setDirty(_56);
-var old=_56[_57]|undefined;
-_56[_57]=_58;
-this.onSet(_56,_57,old,_58);
-},setValues:function(_5a,_5b,_5c){
-_5a=this._correctReference(_5a);
-if(!dojo.isArray(_5c)){
-throw new Error("setValues expects to be passed an Array object as its value");
-}
-this._setDirty(_5a);
-var old=_5a[_5b]||null;
-_5a[_5b]=_5c;
-this.onSet(_5a,_5b,old,_5c);
-},unsetAttribute:function(_5e,_5f){
-_5e=this._correctReference(_5e);
-this._setDirty(_5e);
-var old=_5e[_5f];
-delete _5e[_5f];
-this.onSet(_5e,_5f,old,null);
-},save:function(_61){
-var _62=[];
-if(!_61){
-_61={};
-}
-while(this._dirtyItems.length>0){
-var _63=this._dirtyItems.pop()["item"];
-var t=this._trimItem(_63);
-var d;
-switch(_61.format){
-case "json":
-d=dojo.toJson(t);
-break;
-case "raw":
-default:
-d=t;
-}
-_62.push(d);
-this._markClean(_63);
-}
-this.onSave(_62);
-},_markClean:function(_66){
-if(_66&&_66[this.metaLabel]&&_66[this.metaLabel]["isDirty"]){
-delete _66[this.metaLabel]["isDirty"];
-}
-},revert:function(){
-while(this._dirtyItems.length>0){
-var d=this._dirtyItems.pop();
-this._mixin(d.item,d.old);
-}
-this.onRevert();
-},_mixin:function(_68,_69){
-var mix;
-if(dojo.isObject(_69)){
-if(dojo.isArray(_69)){
-while(_68.length>0){
-_68.pop();
-}
-for(var i=0;i<_69.length;i++){
-if(dojo.isObject(_69[i])){
-if(dojo.isArray(_69[i])){
-mix=[];
-}else{
-mix={};
-if(_69[i][this.metaLabel]&&_69[i][this.metaLabel]["type"]&&_69[i][this.metaLabel]["type"]=="reference"){
-_68[i]=this.index[_69[i][this.idAttribute]];
-continue;
-}
-}
-this._mixin(mix,_69[i]);
-_68.push(mix);
-}else{
-_68.push(_69[i]);
-}
-}
-}else{
-for(var i in _68){
-if(i in _69){
-continue;
-}
-delete _68[i];
-}
-for(var i in _69){
-if(dojo.isObject(_69[i])){
-if(dojo.isArray(_69[i])){
-mix=[];
-}else{
-if(_69[i][this.metaLabel]&&_69[i][this.metaLabel]["type"]&&_69[i][this.metaLabel]["type"]=="reference"){
-_68[i]=this.index[_69[i][this.idAttribute]];
-continue;
-}
-mix={};
-}
-this._mixin(mix,_69[i]);
-_68[i]=mix;
-}else{
-_68[i]=_69[i];
-}
-}
-}
-}
-},isDirty:function(_6c){
-_6c=this._correctReference(_6c);
-return _6c&&_6c[this.metaLabel]&&_6c[this.metaLabel]["isDirty"];
-},_createReference:function(_6d){
-var obj={};
-obj[this.metaLabel]={type:"reference"};
-obj[this.idAttribute]=_6d[this.idAttribute];
-return obj;
-},_trimItem:function(_6f){
-var _70;
-if(dojo.isArray(_6f)){
-_70=[];
-for(var i=0;i<_6f.length;i++){
-if(dojo.isArray(_6f[i])){
-_70.push(this._trimItem(_6f[i]));
-}else{
-if(dojo.isObject(_6f[i])){
-if(_6f[i]["getFullYear"]){
-_70.push(dojo.date.stamp.toISOString(_6f[i]));
-}else{
-if(_6f[i][this.idAttribute]){
-_70.push(this._createReference(_6f[i]));
-}else{
-_70.push(this._trimItem(_6f[i]));
-}
-}
-}else{
-_70.push(_6f[i]);
-}
-}
-}
-return _70;
-}
-if(dojo.isObject(_6f)){
-_70={};
-for(var _72 in _6f){
-if(!_6f[_72]){
-_70[_72]=undefined;
-continue;
-}
-if(dojo.isArray(_6f[_72])){
-_70[_72]=this._trimItem(_6f[_72]);
-}else{
-if(dojo.isObject(_6f[_72])){
-if(_6f[_72]["getFullYear"]){
-_70[_72]=dojo.date.stamp.toISOString(_6f[_72]);
-}else{
-if(_6f[_72][this.idAttribute]){
-_70[_72]=this._createReference(_6f[_72]);
-}else{
-_70[_72]=this._trimItem(_6f[_72]);
-}
-}
-}else{
-_70[_72]=_6f[_72];
-}
-}
-}
-return _70;
-}
-},onSet:function(_73,_74,_75,_76){
-},onNew:function(_77,_78){
-},onDelete:function(_79){
-},onSave:function(_7a){
-},onRevert:function(){
-}});
-dojox.data.jsonPathStore.byId=dojox.data.jsonPathStore.fetchItemByIdentity;
-}
diff --git a/dojox/data/restListener.js b/dojox/data/restListener.js
index 619ecb7..bef6a50 100644
--- a/dojox/data/restListener.js
+++ b/dojox/data/restListener.js
@@ -11,24 +11,24 @@ dojo.provide("dojox.data.restListener");
 dojox.data.restListener=function(_1){
 var _2=_1.channel;
 var jr=dojox.rpc.JsonRest;
-var _4=jr.getServiceAndId(_2).service;
-var _5=dojox.json.ref.resolveJson(_1.result,{defaultId:_1.event=="put"&&_2,index:dojox.rpc.Rest._index,idPrefix:_4.servicePath,idAttribute:jr.getIdAttribute(_4),schemas:jr.schemas,loader:jr._loader,assignAbsoluteIds:true});
-var _6=dojox.rpc.Rest._index&&dojox.rpc.Rest._index[_2];
-var _7="on"+_1.event.toLowerCase();
-var _8=_4&&_4._store;
-if(_6){
-if(_6[_7]){
-_6[_7](_5);
+var _3=jr.getServiceAndId(_2).service;
+var _4=dojox.json.ref.resolveJson(_1.result,{defaultId:_1.event=="put"&&_2,index:dojox.rpc.Rest._index,idPrefix:_3.servicePath.replace(/[^\/]*$/,""),idAttribute:jr.getIdAttribute(_3),schemas:jr.schemas,loader:jr._loader,assignAbsoluteIds:true});
+var _5=dojox.rpc.Rest._index&&dojox.rpc.Rest._index[_2];
+var _6="on"+_1.event.toLowerCase();
+var _7=_3&&_3._store;
+if(_5){
+if(_5[_6]){
+_5[_6](_4);
 return;
 }
 }
-if(_8){
-switch(_7){
+if(_7){
+switch(_6){
 case "onpost":
-_8.onNew(_5);
+_7.onNew(_4);
 break;
 case "ondelete":
-_8.onDelete(_6);
+_7.onDelete(_5);
 break;
 }
 }
diff --git a/dojox/data/util/JsonQuery.js b/dojox/data/util/JsonQuery.js
index 3616025..49f6bcf 100644
--- a/dojox/data/util/JsonQuery.js
+++ b/dojox/data/util/JsonQuery.js
@@ -12,10 +12,11 @@ dojo.declare("dojox.data.util.JsonQuery",null,{useFullIdInQueries:false,_toJsonQ
 var _3=true;
 var _4=this;
 function _5(_6,_7){
-if(_7.__id){
-var _8={};
-_8[_4.idAttribute]=_4.useFullIdInQueries?_7.__id:_7[_4.idAttribute];
-_7=_8;
+var _8=_7.__id;
+if(_8){
+var _9={};
+_9[_4.idAttribute]=_4.useFullIdInQueries?_7.__id:_7[_4.idAttribute];
+_7=_9;
 }
 for(var i in _7){
 var _a=_7[i];
@@ -24,7 +25,7 @@ if(_a&&typeof _a=="object"){
 _5(_b,_a);
 }else{
 if(_a!="*"){
-_c+=(_3?"":"&")+_b+((_1.queryOptions&&_1.queryOptions.ignoreCase)?"~":"=")+dojo.toJson(_a);
+_c+=(_3?"":"&")+_b+((!_8&&typeof _a=="string"&&_1.queryOptions&&_1.queryOptions.ignoreCase)?"~":"=")+(_4.simplifiedQuery?encodeURIComponent(_a):dojo.toJson(_a));
 _3=false;
 }
 }
@@ -46,12 +47,12 @@ if(!_1.query||_1.query=="*"){
 _1.query="";
 }
 }
-var _e=_1.sort;
-if(_e){
+var _d=_1.sort;
+if(_d){
 _1.queryStr=_1.queryStr||(typeof _1.query=="string"?_1.query:"");
 _3=true;
-for(i=0;i<_e.length;i++){
-_1.queryStr+=(_3?"[":",")+(_e[i].descending?"\\":"/")+"@["+dojo._escapeString(_e[i].attribute)+"]";
+for(i=0;i<_d.length;i++){
+_1.queryStr+=(_3?"[":",")+(_d[i].descending?"\\":"/")+"@["+dojo._escapeString(_d[i].attribute)+"]";
 _3=false;
 }
 if(!_3){
@@ -68,20 +69,20 @@ return t=="\""?"'":t;
 return _1.queryStr;
 }
 return _1.query;
-},jsonQueryPagination:true,fetch:function(_10){
-this._toJsonQuery(_10,this.jsonQueryPagination);
+},jsonQueryPagination:true,fetch:function(_e){
+this._toJsonQuery(_e,this.jsonQueryPagination);
 return this.inherited(arguments);
 },isUpdateable:function(){
 return true;
-},matchesQuery:function(_11,_12){
-_12._jsonQuery=_12._jsonQuery||dojox.json.query(this._toJsonQuery(_12));
-return _12._jsonQuery([_11]).length;
-},clientSideFetch:function(_13,_14){
-_13._jsonQuery=_13._jsonQuery||dojox.json.query(this._toJsonQuery(_13));
-return this.clientSidePaging(_13,_13._jsonQuery(_14));
-},querySuperSet:function(_15,_16){
-if(!_15.query){
-return _16.query;
+},matchesQuery:function(_f,_10){
+_10._jsonQuery=_10._jsonQuery||dojox.json.query(this._toJsonQuery(_10));
+return _10._jsonQuery([_f]).length;
+},clientSideFetch:function(_11,_12){
+_11._jsonQuery=_11._jsonQuery||dojox.json.query(this._toJsonQuery(_11));
+return this.clientSidePaging(_11,_11._jsonQuery(_12));
+},querySuperSet:function(_13,_14){
+if(!_13.query){
+return _14.query;
 }
 return this.inherited(arguments);
 }});
diff --git a/dojox/date/HebrewDate.js b/dojox/date/HebrewDate.js
deleted file mode 100644
index 0916d3a..0000000
--- a/dojox/date/HebrewDate.js
+++ /dev/null
@@ -1,641 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.date.HebrewDate"]){
-dojo._hasResource["dojox.date.HebrewDate"]=true;
-dojo.provide("dojox.date.HebrewDate");
-dojo.experimental("dojox.date.HebrewDate");
-dojo.declare("dojox.date.HebrewDate",null,{TISHRI:0,HESHVAN:1,KISLEV:2,TEVET:3,SHEVAT:4,ADAR_1:5,ADAR:6,NISAN:7,IYAR:8,SIVAN:9,TAMUZ:10,AV:11,ELUL:12,_HOUR_PARTS:1080,_DAY_PARTS:24*1080,_MONTH_DAYS:29,_MONTH_FRACT:12*1080+793,_MONTH_PARTS:29*24*1080+12*1080+793,BAHARAD:11*1080+204,JAN_1_1_JULIAN_DAY:1721426,_MONTH_LENGTH:[[30,30,30],[29,29,30],[29,30,30],[29,29,29],[30,30,30],[30,30,30],[29,29,29],[30,30,30],[29,29,29],[30,30,30],[29,29,29],[30,30,30],[29,29,29]],_MONTH_START:[[0,0,0],[3 [...]
-var _1=arguments.length;
-if(_1==0){
-var _2=new Date();
-var _3=this._computeHebrewFields(_2);
-this._date=_3[2];
-this._month=_3[1];
-this._year=_3[0];
-this._hours=_2.getHours();
-this._minutes=_2.getMinutes();
-this._seconds=_2.getSeconds();
-this._milliseconds=_2.getMilliseconds();
-this._day=_2.getDay();
-}else{
-if(_1==1){
-this._year=arguments[0].getFullYear();
-this._month=arguments[0].getMonth();
-this._date=arguments[0].getDate();
-this._hours=arguments[0].getHours();
-this._minutes=arguments[0].getMinutes();
-this._seconds=arguments[0].getSeconds();
-this._milliseconds=arguments[0].getMilliseconds();
-}else{
-if(_1>=3){
-this._year=parseInt(arguments[0]);
-this._month=parseInt(arguments[1]);
-this._date=parseInt(arguments[2]);
-if(!this.isLeapYear(this._year)&&this._month>=5){
-this._month++;
-}
-if(this._month>12||(!this.isLeapYear(this._year)&&this._month>11)){
-console.warn("the month is incorrect , set 0");
-this._month=0;
-}
-this._hours=(arguments[3]!=null)?parseInt(arguments[3]):0;
-this._minutes=(arguments[4]!=null)?parseInt(arguments[4]):0;
-this._seconds=(arguments[5]!=null)?parseInt(arguments[5]):0;
-this._milliseconds=(arguments[6]!=null)?parseInt(arguments[6]):0;
-}
-}
-}
-var _4=this._startOfYear(this._year);
-if(this._month!=0){
-if(this.isLeapYear(this._year)){
-_4+=this.LEAP_MONTH_START[this._month][this._yearType(this._year)];
-}else{
-_4+=this._MONTH_START[this._month][this._yearType(this._year)];
-}
-}
-_4+=(this._date-1);
-this._day=((_4+1)%7);
-},getDate:function(){
-return parseInt(this._date);
-},getMonth:function(){
-return parseInt(this._month);
-},getFullYear:function(){
-return parseInt(this._year);
-},getHours:function(){
-return this._hours;
-},getMinutes:function(){
-return this._minutes;
-},getSeconds:function(){
-return this._seconds;
-},getMilliseconds:function(){
-return this._milliseconds;
-},setDate:function(_5){
-_5=parseInt(_5);
-if(_5>0){
-for(var _6=this.getDaysInHebrewMonth(this._month,this._year);_5>_6;_5-=_6,_6=this.getDaysInHebrewMonth(this._month,this._year)){
-this._month++;
-if(!this.isLeapYear(this._year)&&(this._month==5)){
-this._month++;
-}
-if(this._month>=13){
-this._year++;
-this._month-=13;
-}
-}
-this._date=_5;
-}else{
-for(_6=this.getDaysInHebrewMonth((this._month-1)>=0?(this._month-1):12,((this._month-1)>=0)?this._year:this._year-1);_5<=0;_6=this.getDaysInHebrewMonth((this._month-1)>=0?(this._month-1):12,((this._month-1)>=0)?this._year:this._year-1)){
-this._month--;
-if(!this.isLeapYear(this._year)&&this._month==5){
-this._month--;
-}
-if(this._month<0){
-this._year--;
-this._month+=13;
-}
-_5+=_6;
-}
-this._date=_5;
-}
-var _7=this._startOfYear(this._year);
-if(this._month!=0){
-if(this.isLeapYear(this._year)){
-_7+=this.LEAP_MONTH_START[this._month][this._yearType(this._year)];
-}else{
-_7+=this._MONTH_START[this._month][this._yearType(this._year)];
-}
-}
-_7+=(this._date-1);
-this._day=((_7+1)%7);
-return this;
-},setYear:function(_8){
-this._year=parseInt(_8);
-if(!this.isLeapYear(this._year)&&this._month==6){
-this._month--;
-}
-var _9=this._startOfYear(this._year);
-if(this._month!=0){
-if(this.isLeapYear(this._year)){
-_9+=this.LEAP_MONTH_START[this._month][this._yearType(this._year)];
-}else{
-_9+=this._MONTH_START[this._month][this._yearType(this._year)];
-}
-}
-_9+=(this._date-1);
-this._day=((_9+1)%7);
-return this;
-},setMonth:function(_a){
-var _b=parseInt(_a);
-if(!this.isLeapYear(this._year)&&_b>5){
-_b++;
-}
-if(_b>=0){
-while(_b>12){
-this._year++;
-_b-=13;
-if(!this.isLeapYear(this._year)&&_b>5){
-_b++;
-}
-}
-}else{
-while(_b<0){
-this._year--;
-_b+=13;
-if(!this.isLeapYear(this._year)&&_b<=5){
-_b--;
-}
-}
-}
-this._month=_b;
-var _c=this.getDaysInHebrewMonth(this._month,this._year);
-if(_c<this._date){
-this._date=_c;
-}
-var _d=this._startOfYear(this._year);
-if(this._month!=0){
-if(this.isLeapYear(this._year)){
-_d+=this.LEAP_MONTH_START[this._month][this._yearType(this._year)];
-}else{
-_d+=this._MONTH_START[this._month][this._yearType(this._year)];
-}
-}
-_d+=(this._date-1);
-this._day=((_d+1)%7);
-return this;
-},setHours:function(){
-var _e=arguments.length;
-var _f=0;
-if(_e>=1){
-_f=parseInt(arguments[0]);
-}
-if(_e>=2){
-this._minutes=parseInt(arguments[1]);
-}
-if(_e>=3){
-this._seconds=parseInt(arguments[2]);
-}
-if(_e==4){
-this._milliseconds=parseInt(arguments[3]);
-}
-while(_f>=24){
-this._date++;
-var _10=this.getDaysInHebrewMonth(this._month,this._year);
-if(this._date>_10){
-this._month++;
-if(!this.isLeapYear(this._year)&&(this._month==5)){
-this._month++;
-}
-if(this._month>=13){
-this._year++;
-this._month-=13;
-}
-this._date-=_10;
-}
-_f-=24;
-}
-this._hours=_f;
-var day=this._startOfYear(this._year);
-if(this._month!=0){
-if(this.isLeapYear(this._year)){
-day+=this.LEAP_MONTH_START[this._month][this._yearType(this._year)];
-}else{
-day+=this._MONTH_START[this._month][this._yearType(this._year)];
-}
-}
-day+=(this._date-1);
-this._day=((day+1)%7);
-return this;
-},setMinutes:function(_12){
-while(_12>=60){
-this._hours++;
-if(this._hours>=24){
-this._date++;
-this._hours-=24;
-var _13=this.getDaysInHebrewMonth(this._month,this._year);
-if(this._date>_13){
-this._month++;
-if(!this.isLeapYear(this._year)&&(this._month==5)){
-this._month++;
-}
-if(this._month>=13){
-this._year++;
-this._month-=13;
-}
-this._date-=_13;
-}
-}
-_12-=60;
-}
-this._minutes=_12;
-var day=this._startOfYear(this._year);
-if(this._month!=0){
-if(this.isLeapYear(this._year)){
-day+=this.LEAP_MONTH_START[this._month][this._yearType(this._year)];
-}else{
-day+=this._MONTH_START[this._month][this._yearType(this._year)];
-}
-}
-day+=(this._date-1);
-this._day=((day+1)%7);
-return this;
-},setSeconds:function(_15){
-while(_15>=60){
-this._minutes++;
-if(this._minutes>=60){
-this._hours++;
-this._minutes-=60;
-if(this._hours>=24){
-this._date++;
-this._hours-=24;
-var _16=this.getDaysInHebrewMonth(this._month,this._year);
-if(this._date>_16){
-this._month++;
-if(!this.isLeapYear(this._year)&&(this._month==5)){
-this._month++;
-}
-if(this._month>=13){
-this._year++;
-this._month-=13;
-}
-this._date-=_16;
-}
-}
-}
-_15-=60;
-}
-this._seconds=_15;
-var day=this._startOfYear(this._year);
-if(this._month!=0){
-if(this.isLeapYear(this._year)){
-day+=this.LEAP_MONTH_START[this._month][this._yearType(this._year)];
-}else{
-day+=this._MONTH_START[this._month][this._yearType(this._year)];
-}
-}
-day+=(this._date-1);
-this._day=((day+1)%7);
-return this;
-},setMilliseconds:function(_18){
-while(_18>=1000){
-this.setSeconds++;
-if(this.setSeconds>=60){
-this._minutes++;
-this._seconds-=60;
-if(this._minutes>=60){
-this._hours++;
-this._minutes-=60;
-if(this._hours>=24){
-this._date++;
-this._hours-=24;
-var _19=this.getDaysInHebrewMonth(this._month,this._year);
-if(this._date>_19){
-this._month++;
-if(!this.isLeapYear(this._year)&&(this._month==5)){
-this._month++;
-}
-if(this._month>=13){
-this._year++;
-this._month-=13;
-}
-this._date-=_19;
-}
-}
-}
-}
-_18-=1000;
-}
-this._milliseconds=_18;
-var day=this._startOfYear(this._year);
-if(this._month!=0){
-if(this.isLeapYear(this._year)){
-day+=this.LEAP_MONTH_START[this._month][this._yearType(this._year)];
-}else{
-day+=this._MONTH_START[this._month][this._yearType(this._year)];
-}
-}
-day+=(this._date-1);
-this._day=((day+1)%7);
-return this;
-},toString:function(){
-return this._date+", "+((!this.isLeapYear(this._year)&&this._month>5)?this._month:(this._month+1))+", "+this._year+"  "+this._hours+":"+this._minutes+":"+this._seconds;
-},valueOf:function(){
-return this.toGregorian().valueOf();
-},getDaysInHebrewMonth:function(_1b,_1c){
-switch(_1b){
-case this.HESHVAN:
-case this.KISLEV:
-return this._MONTH_LENGTH[_1b][this._yearType(_1c)];
-default:
-return this._MONTH_LENGTH[_1b][0];
-}
-},_yearType:function(_1d){
-var _1e=this._handleGetYearLength(Number(_1d));
-if(_1e>380){
-_1e-=30;
-}
-switch(_1e){
-case 353:
-return 0;
-case 354:
-return 1;
-case 355:
-return 2;
-}
-throw new Error("Illegal year length "+_1e+" in year "+_1d);
-},_handleGetYearLength:function(_1f){
-return this._startOfYear(_1f+1)-this._startOfYear(_1f);
-},_startOfYear:function(_20){
-var _21=Math.floor((235*_20-234)/19);
-var _22=_21*this._MONTH_FRACT+this.BAHARAD;
-var day=_21*29+Math.floor(_22/this._DAY_PARTS);
-_22%=this._DAY_PARTS;
-var wd=day%7;
-if(wd==2||wd==4||wd==6){
-day+=1;
-wd=day%7;
-}
-if(wd==1&&_22>15*this._HOUR_PARTS+204&&!this.isLeapYear(_20)){
-day+=2;
-}else{
-if(wd==0&&_22>21*this._HOUR_PARTS+589&&this.isLeapYear(_20-1)){
-day+=1;
-}
-}
-return day;
-},isLeapYear:function(_25){
-var x=(_25*12+17)%19;
-return x>=((x<0)?-7:12);
-},fromGregorian:function(_27){
-var _28=this._computeHebrewFields(_27);
-this._year=_28[0];
-this._month=_28[1];
-this._date=_28[2];
-this._hours=_27.getHours();
-this._milliseconds=_27.getMilliseconds();
-this._minutes=_27.getMinutes();
-this._seconds=_27.getSeconds();
-return this;
-},_computeHebrewFields:function(_29){
-var _2a=this._getJulianDayFromGregorianDate(_29);
-var d=_2a-347997;
-var m=Math.floor((d*this._DAY_PARTS)/this._MONTH_PARTS);
-var _2d=Math.floor((19*m+234)/235)+1;
-var ys=this._startOfYear(_2d);
-var _2f=(d-ys);
-while(_2f<1){
-_2d--;
-ys=this._startOfYear(_2d);
-_2f=d-ys;
-}
-var _30=this._yearType(_2d);
-var _31=this.isLeapYear(_2d)?this.LEAP_MONTH_START:this._MONTH_START;
-var _32=0;
-while(_2f>_31[_32][_30]){
-_32++;
-}
-_32--;
-var _33=_2f-_31[_32][_30];
-return [_2d,_32,_33];
-},toGregorian:function(){
-var _34=this._year;
-var _35=this._month;
-var _36=this._date;
-var day=this._startOfYear(_34);
-if(_35!=0){
-if(this.isLeapYear(_34)){
-day+=this.LEAP_MONTH_START[_35][this._yearType(_34)];
-}else{
-day+=this._MONTH_START[_35][this._yearType(_34)];
-}
-}
-var _38=(_36+day+347997);
-var _39=_38-this.JAN_1_1_JULIAN_DAY;
-var rem=new Array(1);
-var _3b=this._floorDivide(_39,146097,rem);
-var _3c=this._floorDivide(rem[0],36524,rem);
-var n4=this._floorDivide(rem[0],1461,rem);
-var n1=this._floorDivide(rem[0],365,rem);
-var _3f=400*_3b+100*_3c+4*n4+n1;
-var _40=rem[0];
-if(_3c==4||n1==4){
-_40=365;
-}else{
-++_3f;
-}
-var _41=!(_3f%4)&&(_3f%100||!(_3f%400));
-var _42=0;
-var _43=_41?60:59;
-if(_40>=_43){
-_42=_41?1:2;
-}
-var _44=Math.floor((12*(_40+_42)+6)/367);
-var _45=_40-this.GREGORIAN_MONTH_COUNT[_44][_41?3:2]+1;
-return new Date(_3f,_44,_45,this._hours,this._minutes,this._seconds,this._milliseconds);
-},_floorDivide:function(_46,_47,_48){
-if(_46>=0){
-_48[0]=(_46%_47);
-return Math.floor(_46/_47);
-}
-var _49=Math.floor(_46/_47);
-_48[0]=_46-(_49*_47);
-return _49;
-},getDay:function(){
-var _4a=this._year;
-var _4b=this._month;
-var _4c=this._date;
-var day=this._startOfYear(_4a);
-if(_4b!=0){
-if(this.isLeapYear(_4a)){
-day+=this.LEAP_MONTH_START[_4b][this._yearType(_4a)];
-}else{
-day+=this._MONTH_START[_4b][this._yearType(_4a)];
-}
-}
-day+=_4c-1;
-return (day+1)%7;
-},_getJulianDayFromGregorianDate:function(_4e){
-var _4f=_4e.getFullYear();
-var _50=_4e.getMonth();
-var d=_4e.getDate();
-var _52=!(_4f%4)&&(_4f%100||!(_4f%400));
-var y=_4f-1;
-var _54=365*y+Math.floor(y/4)-Math.floor(y/100)+Math.floor(y/400)+this.JAN_1_1_JULIAN_DAY-1;
-if(_50!=0){
-_54+=this.GREGORIAN_MONTH_COUNT[_50][_52?3:2];
-}
-_54+=d;
-return _54;
-}});
-dojox.date.HebrewDate.fromGregorian=function(_55){
-var _56=new dojox.date.HebrewDate();
-return _56.fromGregorian(_55);
-};
-dojox.date.HebrewDate.add=function(_57,_58,_59){
-var _5a=new dojox.date.HebrewDate(_57);
-switch(_58){
-case "day":
-_5a.setDate(_57.getDate()+_59);
-break;
-case "weekday":
-var day=_57.getDay();
-if(((day+_59)<5)&&((day+_59)>0)){
-_5a.setDate(_57.getDate()+_59);
-}else{
-var _5c=0;
-var _5d=0;
-if(day==5){
-day=4;
-_5d=(_59>0)?-1:1;
-}else{
-if(day==6){
-day=4;
-_5d=(_59>0)?-2:2;
-}
-}
-var add=(_59>0)?(5-day-1):(0-day);
-var _5f=_59-add;
-var div=parseInt(_5f/5);
-if((_5f%5)!=0){
-_5c=(_59>0)?2:-2;
-}
-_5c=_5c+div*7+_5f%5+add;
-_5a.setDate(_57.getDate()+_5c+_5d);
-}
-break;
-case "year":
-_5a.setYear(_57.getFullYear()+_59);
-break;
-case "week":
-_59*=7;
-_5a.setDate(_57.getDate()+_59);
-break;
-case "month":
-var _61=_57.getMonth();
-if(!_57.isLeapYear(_57.getFullYear())&&_61>5){
-_61--;
-}
-_5a.setMonth(_61+_59);
-break;
-case "hour":
-_5a.setHours(_57.getHours()+_59);
-break;
-case "minute":
-_5a.setMinutes(_57.getMinutes()+_59);
-break;
-case "second":
-_5a.setSeconds(_57.getSeconds()+_59);
-break;
-case "millisecond":
-_5a.setMilliseconds(_57.getMilliseconds()+_59);
-break;
-}
-return _5a;
-};
-dojox.date.HebrewDate.difference=function(_62,_63,_64){
-_63=_63||new dojox.date.HebrewDate();
-_64=_64||"day";
-var _65=_62.getFullYear()-_63.getFullYear();
-var _66=1;
-switch(_64){
-case "weekday":
-var _67=Math.round(dojox.date.HebrewDate.difference(_62,_63,"day"));
-var _68=parseInt(dojox.date.HebrewDate.difference(_62,_63,"week"));
-var mod=_67%7;
-if(mod==0){
-_67=_68*5;
-}else{
-var adj=0;
-var _6b=_63.getDay();
-var _6c=_62.getDay();
-_68=parseInt(_67/7);
-mod=_67%7;
-var _6d=new dojox.date.HebrewDate(_63);
-_6d.setDate(_6d.getDate()+(_68*7));
-var _6e=_6d.getDay();
-if(_67>0){
-switch(true){
-case _6b==5:
-adj=-1;
-break;
-case _6b==6:
-adj=0;
-break;
-case _6c==5:
-adj=-1;
-break;
-case _6c==6:
-adj=-2;
-break;
-case (_6e+mod)>5:
-adj=-2;
-}
-}else{
-if(_67<0){
-switch(true){
-case _6b==5:
-adj=0;
-break;
-case _6b==6:
-adj=1;
-break;
-case _6c==5:
-adj=2;
-break;
-case _6c==6:
-adj=1;
-break;
-case (_6e+mod)<0:
-adj=2;
-}
-}
-}
-_67+=adj;
-_67-=(_68*2);
-}
-_66=_67;
-break;
-case "year":
-_66=_65;
-break;
-case "month":
-var _6f=(_62.toGregorian()>_63.toGregorian())?_62:_63;
-var _70=(_62.toGregorian()>_63.toGregorian())?_63:_62;
-var _71=_6f.getMonth();
-var _72=_70.getMonth();
-if(_65==0){
-_66=(!_62.isLeapYear(_62.getFullYear())&&_6f.getMonth()>5&&_70.getMonth()<=5)?(_6f.getMonth()-_70.getMonth()-1):(_6f.getMonth()-_70.getMonth());
-}else{
-_66=(!_70.isLeapYear(_70.getFullYear())&&_72<6)?(13-_72-1):(13-_72);
-_66+=(!_6f.isLeapYear(_6f.getFullYear())&&_71>5)?(_71-1):_71;
-var i=_70.getFullYear()+1;
-var e=_6f.getFullYear();
-for(i;i<e;i++){
-_66+=_70.isLeapYear(i)?13:12;
-}
-}
-if(_62.toGregorian()<_63.toGregorian()){
-_66=-_66;
-}
-break;
-case "week":
-_66=parseInt(dojox.date.HebrewDate.difference(_62,_63,"day")/7);
-break;
-case "day":
-_66/=24;
-case "hour":
-_66/=60;
-case "minute":
-_66/=60;
-case "second":
-_66/=1000;
-case "millisecond":
-_66*=_62.toGregorian().getTime()-_63.toGregorian().getTime();
-}
-return Math.round(_66);
-};
-}
diff --git a/dojox/date/HebrewLocale.js b/dojox/date/HebrewLocale.js
deleted file mode 100644
index 4743fef..0000000
--- a/dojox/date/HebrewLocale.js
+++ /dev/null
@@ -1,411 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.date.HebrewLocale"]){
-dojo._hasResource["dojox.date.HebrewLocale"]=true;
-dojo.provide("dojox.date.HebrewLocale");
-dojo.experimental("dojox.date.HebrewLocale");
-dojo.require("dojox.date.HebrewDate");
-dojo.require("dojox.date.HebrewNumerals");
-dojo.require("dojo.regexp");
-dojo.require("dojo.string");
-dojo.require("dojo.i18n");
-dojo.requireLocalization("dojo.cldr","hebrew",null,"ROOT,he");
-(function(){
-function _1(_2,_3,_4,_5,_6){
-return _6.replace(/([a-z])\1*/ig,function(_7){
-var s,_9;
-var c=_7.charAt(0);
-var l=_7.length;
-var _c=["abbr","wide","narrow"];
-switch(c){
-case "y":
-if(_4=="he"){
-s=dojox.date.HebrewNumerals.getYearHebrewLetters(_2.getFullYear());
-}else{
-s=String(_2.getFullYear());
-}
-break;
-case "M":
-var m=_2.getMonth();
-if(l<3){
-if(!_2.isLeapYear(_2.getFullYear())&&m>5){
-m--;
-}
-if(_4=="he"){
-s=dojox.date.HebrewNumerals.getMonthHebrewLetters(m);
-}else{
-s=m+1;
-_9=true;
-}
-}else{
-if(!_2.isLeapYear(_2.getFullYear())&&m==6){
-m--;
-}
-var _e=["months","format",_c[l-3]].join("-");
-s=_3[_e][m];
-}
-break;
-case "d":
-if(_4=="he"){
-s=dojox.date.HebrewNumerals.getDayHebrewLetters(_2.getDate());
-}else{
-s=_2.getDate();
-_9=true;
-}
-break;
-case "E":
-var d=_2.getDay();
-if(l<3){
-s=d+1;
-_9=true;
-}else{
-var _10=["days","format",_c[l-3]].join("-");
-s=_3[_10][d];
-}
-break;
-case "a":
-var _11=(_2.getHours()<12)?"am":"pm";
-s=_3[_11];
-break;
-case "h":
-case "H":
-case "K":
-case "k":
-var h=_2.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;
-}
-_9=true;
-break;
-case "m":
-s=_2.getMinutes();
-_9=true;
-break;
-case "s":
-s=_2.getSeconds();
-_9=true;
-break;
-case "S":
-s=Math.round(_2.getMilliseconds()*Math.pow(10,l-3));
-_9=true;
-break;
-default:
-throw new Error("dojox.date.HebrewLocale.formatPattern: invalid pattern char: "+_6);
-}
-if(_9){
-s=dojo.string.pad(s,l);
-}
-return s;
-});
-};
-dojox.date.HebrewLocale.format=function(_13,_14){
-_14=_14||{};
-var _15=dojo.i18n.normalizeLocale(_14.locale);
-var _16=_14.formatLength||"short";
-var _17=dojox.date.HebrewLocale._getHebrewBundle(_15);
-var str=[];
-var _19=dojo.hitch(this,_1,_13,_17,_15,_14.fullYear);
-if(_14.selector!="time"){
-var _1a=_14.datePattern||_17["dateFormat-"+_16];
-if(_1a){
-str.push(_1b(_1a,_19));
-}
-}
-if(_14.selector!="date"){
-var _1c=_14.timePattern||_17["timeFormat-"+_16];
-if(_1c){
-str.push(_1b(_1c,_19));
-}
-}
-var _1d=str.join(" ");
-return _1d;
-};
-dojox.date.HebrewLocale.regexp=function(_1e){
-return dojox.date.HebrewLocale._parseInfo(_1e).regexp;
-};
-dojox.date.HebrewLocale._parseInfo=function(_1f){
-_1f=_1f||{};
-var _20=dojo.i18n.normalizeLocale(_1f.locale);
-var _21=dojox.date.HebrewLocale._getHebrewBundle(_20);
-var _22=_1f.formatLength||"short";
-var _23=_1f.datePattern||_21["dateFormat-"+_22];
-var _24=_1f.timePattern||_21["timeFormat-"+_22];
-var _25;
-if(_1f.selector=="date"){
-_25=_23;
-}else{
-if(_1f.selector=="time"){
-_25=_24;
-}else{
-_25=(typeof (_24)=="undefined")?_23:_23+" "+_24;
-}
-}
-var _26=[];
-var re=_1b(_25,dojo.hitch(this,_28,_26,_21,_1f));
-return {regexp:re,tokens:_26,bundle:_21};
-};
-dojox.date.HebrewLocale.parse=function(_29,_2a){
-if(!_2a){
-_2a={};
-}
-var _2b=dojox.date.HebrewLocale._parseInfo(_2a);
-var _2c=_2b.tokens,_2d=_2b.bundle;
-var re=new RegExp("^"+_2b.regexp+"$");
-var _2f=re.exec(_29);
-var _30=dojo.i18n.normalizeLocale(_2a.locale);
-if(!_2f){
-
-return null;
-}
-var _31,_32;
-var _33=[5730,3,23,0,0,0,0];
-var _34="";
-var _35=0;
-var _36=["abbr","wide","narrow"];
-var _37=dojo.every(_2f,function(v,i){
-if(!i){
-return true;
-}
-var _3a=_2c[i-1];
-var l=_3a.length;
-switch(_3a.charAt(0)){
-case "y":
-if(_30=="he"){
-_33[0]=dojox.date.HebrewNumerals.parseYearHebrewLetters(v);
-}else{
-_33[0]=Number(v);
-}
-break;
-case "M":
-if(l>2){
-var _3c=_2d["months-format-"+_36[l-3]].concat();
-if(!_2a.strict){
-v=v.replace(".","").toLowerCase();
-_3c=dojo.map(_3c,function(s){
-return s.replace(".","").toLowerCase();
-});
-}
-v=dojo.indexOf(_3c,v);
-if(v==-1){
-return false;
-}
-_35=l;
-}else{
-if(_30=="he"){
-v=dojox.date.HebrewNumerals.parseMonthHebrewLetters(v);
-}else{
-v--;
-}
-}
-_33[1]=Number(v);
-break;
-case "D":
-_33[1]=0;
-case "d":
-if(_30=="he"){
-_33[2]=dojox.date.HebrewNumerals.parseDayHebrewLetters(v);
-}else{
-_33[2]=Number(v);
-}
-break;
-case "a":
-var am=_2a.am||_2d.am;
-var pm=_2a.pm||_2d.pm;
-if(!_2a.strict){
-var _40=/\./g;
-v=v.replace(_40,"").toLowerCase();
-am=am.replace(_40,"").toLowerCase();
-pm=pm.replace(_40,"").toLowerCase();
-}
-if(_2a.strict&&v!=am&&v!=pm){
-return false;
-}
-_34=(v==pm)?"p":(v==am)?"a":"";
-break;
-case "K":
-if(v==24){
-v=0;
-}
-case "h":
-case "H":
-case "k":
-_33[3]=Number(v);
-break;
-case "m":
-_33[4]=Number(v);
-break;
-case "s":
-_33[5]=Number(v);
-break;
-case "S":
-_33[6]=Number(v);
-}
-return true;
-});
-var _41=+_33[3];
-if(_34==="p"&&_41<12){
-_33[3]=_41+12;
-}else{
-if(_34==="a"&&_41==12){
-_33[3]=0;
-}
-}
-var _42=new dojox.date.HebrewDate(_33[0],_33[1],_33[2],_33[3],_33[4],_33[5],_33[6]);
-if((_35>2)&&(_33[1]>5)&&!_42.isLeapYear(_42.getFullYear())){
-_42=new dojox.date.HebrewDate(_33[0],_33[1]-1,_33[2],_33[3],_33[4],_33[5],_33[6]);
-}
-return _42;
-};
-function _1b(_43,_44,_45,_46){
-var _47=function(x){
-return x;
-};
-_44=_44||_47;
-_45=_45||_47;
-_46=_46||_47;
-var _49=_43.match(/(''|[^'])+/g);
-var _4a=_43.charAt(0)=="'";
-dojo.forEach(_49,function(_4b,i){
-if(!_4b){
-_49[i]="";
-}else{
-_49[i]=(_4a?_45:_44)(_4b);
-_4a=!_4a;
-}
-});
-return _46(_49.join(""));
-};
-function _28(_4d,_4e,_4f,_50){
-_50=dojo.regexp.escapeString(_50);
-var _51=dojo.i18n.normalizeLocale(_4f.locale);
-return _50.replace(/([a-z])\1*/ig,function(_52){
-var s;
-var c=_52.charAt(0);
-var l=_52.length;
-var p2="",p3="";
-if(_4f.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="\\S+";
-break;
-case "M":
-if(_51=="he"){
-s=(l>2)?"\\S+ ?\\S+":"\\S{1,4}";
-}else{
-s=(l>2)?"\\S+ ?\\S+":p2+"[1-9]|1[0-2]";
-}
-break;
-case "d":
-if(_51=="he"){
-s="\\S['\"']{1,2}\\S?";
-}else{
-s="[12]\\d|"+p2+"[1-9]|30";
-}
-break;
-case "E":
-if(_51=="he"){
-s=(l>3)?"\\S+ ?\\S+":"\\S";
-}else{
-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=p2+"\\d|[0-5]\\d";
-break;
-case "S":
-s="\\d{"+l+"}";
-break;
-case "a":
-var am=_4f.am||_4e.am||"AM";
-var pm=_4f.pm||_4e.pm||"PM";
-if(_4f.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(_4d){
-_4d.push(_52);
-}
-return "("+s+")";
-}).replace(/[\xa0 ]/g,"[\\s\\xa0]");
-};
-})();
-(function(){
-var _5a=[];
-dojox.date.HebrewLocale.addCustomFormats=function(_5b,_5c){
-_5a.push({pkg:_5b,name:_5c});
-};
-dojox.date.HebrewLocale._getHebrewBundle=function(_5d){
-var _5e={};
-dojo.forEach(_5a,function(_5f){
-var _60=dojo.i18n.getLocalization(_5f.pkg,_5f.name,_5d);
-_5e=dojo.mixin(_5e,_60);
-},this);
-return _5e;
-};
-})();
-dojox.date.HebrewLocale.addCustomFormats("dojo.cldr","hebrew");
-dojox.date.HebrewLocale.getNames=function(_61,_62,_63,_64){
-var _65;
-var _66=dojox.date.HebrewLocale._getHebrewBundle;
-var _67=[_61,_63,_62];
-if(_63=="standAlone"){
-var key=_67.join("-");
-_65=_66(_64)[key];
-if(_65===_66("ROOT")[key]){
-_65=undefined;
-}
-}
-_67[1]="format";
-return (_65||_66(_64)[_67.join("-")]).concat();
-};
-}
diff --git a/dojox/date/HebrewNumerals.js b/dojox/date/HebrewNumerals.js
deleted file mode 100644
index 2f687ed..0000000
--- a/dojox/date/HebrewNumerals.js
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.date.HebrewNumerals"]){
-dojo._hasResource["dojox.date.HebrewNumerals"]=true;
-dojo.provide("dojox.date.HebrewNumerals");
-dojo.experimental("dojox.date.HebrewNumerals");
-(function(){
-var _1=["א","ב","ג","ד","ה","ו","ז","ח","ט"];
-var _2=["י","כ","ל","מ","נ","ס","ע","פ","צ"];
-var _3=["ק","ר","ש","ת"];
-var _4=["יה","יו","טו","טז"];
-var _5=["א'","ב'","ג'","ד'","ה'","ו'","ז'","ח'","ט'","י'","י\"א","י\"ב","י\"ג"];
-var _6=["'"];
-dojox.date.HebrewNumerals.getYearHebrewLetters=function(_7){
-var _8="",_9="";
-_7=_7%1000;
-var i=0,n=4,j=9;
-while(_7){
-if(_7>=n*100){
-_8=_8.concat(_3[n-1]);
-_7-=n*100;
-continue;
-}else{
-if(n>1){
-n--;
-continue;
-}else{
-if(_7>=j*10){
-_8=_8.concat(_2[j-1]);
-_7-=j*10;
-}else{
-if(j>1){
-j--;
-continue;
-}else{
-if(_7>0){
-_8=_8.concat(_1[_7-1]);
-_7=0;
-}
-}
-}
-}
-}
-}
-var _d="";
-var _e=_8.indexOf(_4[0]);
-if(_e>-1){
-_8=_d.concat(_8.substr(_8[0],_e),_4[2],_8.substr(_8[_e+2],_8.length-_e-2));
-}else{
-if((_e=_8.indexOf(_4[1]))>-1){
-_8=_d.concat(_8.substr(_8[0],_e),_4[3],_8.substr(_8[_e+2],_8.length-_e-2));
-}
-}
-if(_8.length>1){
-var _f=_8.charAt(_8.length-1);
-_8=_9.concat(_8.substr(0,_8.length-1),"\"",_f);
-}else{
-_8=_8.concat(_6[0]);
-}
-return _8;
-};
-dojox.date.HebrewNumerals.parseYearHebrewLetters=function(_10){
-var _11=0,i=0,j=0;
-for(j=0;j<_10.length;j++){
-for(i=1;i<=5;i++){
-if(_10.charAt(j)==_3[i-1]){
-_11+=100*i;
-continue;
-}
-}
-for(i=1;i<=9;i++){
-if(_10.charAt(j)==_2[i-1]){
-_11+=10*i;
-continue;
-}
-}
-for(i=1;i<=9;i++){
-if(_10.charAt(j)==_1[i-1]){
-_11+=i;
-}
-}
-}
-return _11+5000;
-};
-dojox.date.HebrewNumerals.getDayHebrewLetters=function(day,_15){
-var str="";
-var j=3;
-while(day){
-if(day>=j*10){
-str=str.concat(_2[j-1]);
-day-=j*10;
-}else{
-if(j>1){
-j--;
-continue;
-}else{
-if(day>0){
-str=str.concat(_1[day-1]);
-day=0;
-}
-}
-}
-}
-var _18="";
-var ind=str.indexOf(_4[0]);
-if(ind>-1){
-str=_18.concat(str.substr(str[0],ind),_4[2],str.substr(str[ind+2],str.length-ind-2));
-}else{
-if((ind=str.indexOf(_4[1]))>-1){
-str=_18.concat(str.substr(str[0],ind),_4[3],str.substr(str[ind+2],str.length-ind-2));
-}
-}
-if(!_15){
-var _1a="";
-if(str.length>1){
-var _1b=str.charAt(str.length-1);
-str=_1a.concat(str.substr(0,str.length-1),"\"",_1b);
-}else{
-str=str.concat(_6[0]);
-}
-}
-return str;
-};
-dojox.date.HebrewNumerals.parseDayHebrewLetters=function(day){
-var _1d=0,i=0;
-for(var j=0;j<day.length;j++){
-for(i=1;i<=9;i++){
-if(day.charAt(j)==_2[i-1]){
-_1d+=10*i;
-continue;
-}
-}
-for(i=1;i<=9;i++){
-if(day.charAt(j)==_1[i-1]){
-_1d+=i;
-}
-}
-}
-return _1d;
-};
-dojox.date.HebrewNumerals.getMonthHebrewLetters=function(_20,_21,_22){
-return _5[_20];
-};
-dojox.date.HebrewNumerals.parseMonthHebrewLetters=function(_23){
-var _24=dojox.date.HebrewNumerals.parseDayHebrewLetters(_23)-1;
-if(_24==-1){
-console.warn("The month name is incorrect , set 0");
-_24=0;
-}
-return _24;
-};
-})();
-}
diff --git a/dojox/date/IslamicDate.js b/dojox/date/IslamicDate.js
deleted file mode 100644
index 11fc03b..0000000
--- a/dojox/date/IslamicDate.js
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.date.IslamicDate"]){
-dojo._hasResource["dojox.date.IslamicDate"]=true;
-dojo.provide("dojox.date.IslamicDate");
-dojo.experimental("dojox.date.IslamicDate");
-dojo.require("dojo.date.locale");
-dojo.require("dojo.date");
-dojo.requireLocalization("dojo.cldr","islamic",null,"ROOT,ar");
-dojo.declare("dojox.date.IslamicDate",null,{_date:0,_month:0,_year:0,_hours:0,_minutes:0,_seconds:0,_milliseconds:0,_day:0,_GREGORIAN_EPOCH:1721425.5,_ISLAMIC_EPOCH:1948439.5,constructor:function(){
-var _1=arguments.length;
-if(_1==0){
-var d=new Date();
-this._day=d.getDay();
-this.fromGregorian(d);
-}else{
-if(_1==1){
-this.parse(arguments[0]);
-}else{
-if(_1>=3){
-this._year=arguments[0];
-this._month=arguments[1];
-this._date=arguments[2];
-this._hours=arguments[3]||0;
-this._minutes=arguments[4]||0;
-this._seconds=arguments[5]||0;
-this._milliseconds=arguments[6]||0;
-}
-}
-}
-},getDate:function(){
-return parseInt(this._date);
-},getMonth:function(){
-return parseInt(this._month);
-},getFullYear:function(){
-return parseInt(this._year);
-},getDay:function(){
-var gd=this.toGregorian();
-return gd.getDay();
-},getHours:function(){
-return this._hours;
-},getMinutes:function(){
-return this._minutes;
-},getSeconds:function(){
-return this._seconds;
-},getMilliseconds:function(){
-return this._milliseconds;
-},setDate:function(_4){
-_4=parseInt(_4);
-if(_4>0&&_4<=this.getDaysInIslamicMonth(this._month,this._year)){
-this._date=_4;
-}else{
-var _5;
-if(_4>0){
-for(_5=this.getDaysInIslamicMonth(this._month,this._year);_4>_5;_4-=_5,_5=this.getDaysInIslamicMonth(this._month,this._year)){
-this._month++;
-if(this._month>=12){
-this._year++;
-this._month-=12;
-}
-}
-this._date=_4;
-}else{
-for(_5=this.getDaysInIslamicMonth((this._month-1)>=0?(this._month-1):11,((this._month-1)>=0)?this._year:this._year-1);_4<=0;_5=this.getDaysInIslamicMonth((this._month-1)>=0?(this._month-1):11,((this._month-1)>=0)?this._year:this._year-1)){
-this._month--;
-if(this._month<0){
-this._year--;
-this._month+=12;
-}
-_4+=_5;
-}
-this._date=_4;
-}
-}
-return this;
-},setYear:function(_6){
-this._year=parseInt(_6);
-},setMonth:function(_7){
-this._year+=Math.floor(_7/12);
-this._month=Math.floor(_7%12);
-},setHours:function(){
-var _8=arguments.length;
-var _9=0;
-if(_8>=1){
-_9=parseInt(arguments[0]);
-}
-if(_8>=2){
-this._minutes=parseInt(arguments[1]);
-}
-if(_8>=3){
-this._seconds=parseInt(arguments[2]);
-}
-if(_8==4){
-this._milliseconds=parseInt(arguments[3]);
-}
-while(_9>=24){
-this._date++;
-var _a=this.getDaysInIslamicMonth(this._month,this._year);
-if(this._date>_a){
-this._month++;
-if(this._month>=12){
-this._year++;
-this._month-=12;
-}
-this._date-=_a;
-}
-_9-=24;
-}
-this._hours=_9;
-},setMinutes:function(_b){
-while(_b>=60){
-this._hours++;
-if(this._hours>=24){
-this._date++;
-this._hours-=24;
-var _c=this.getDaysInIslamicMonth(this._month,this._year);
-if(this._date>_c){
-this._month++;
-if(this._month>=12){
-this._year++;
-this._month-=12;
-}
-this._date-=_c;
-}
-}
-_b-=60;
-}
-this._minutes=_b;
-},setSeconds:function(_d){
-while(_d>=60){
-this._minutes++;
-if(this._minutes>=60){
-this._hours++;
-this._minutes-=60;
-if(this._hours>=24){
-this._date++;
-this._hours-=24;
-var _e=this.getDaysInIslamicMonth(this._month,this._year);
-if(this._date>_e){
-this._month++;
-if(this._month>=12){
-this._year++;
-this._month-=12;
-}
-this._date-=_e;
-}
-}
-}
-_d-=60;
-}
-this._seconds=_d;
-},setMilliseconds:function(_f){
-while(_f>=1000){
-this.setSeconds++;
-if(this.setSeconds>=60){
-this._minutes++;
-this.setSeconds-=60;
-if(this._minutes>=60){
-this._hours++;
-this._minutes-=60;
-if(this._hours>=24){
-this._date++;
-this._hours-=24;
-var _10=this.getDaysInIslamicMonth(this._month,this._year);
-if(this._date>_10){
-this._month++;
-if(this._month>=12){
-this._year++;
-this._month-=12;
-}
-this._date-=_10;
-}
-}
-}
-}
-_f-=1000;
-}
-this._milliseconds=_f;
-},toString:function(){
-var x=new Date();
-x.setHours(this._hours);
-x.setMinutes(this._minutes);
-x.setSeconds(this._seconds);
-x.setMilliseconds(this._milliseconds);
-var _12=x.toTimeString();
-return (dojox.date.IslamicDate.weekDays[this.getDay()]+" "+dojox.date.IslamicDate.months[this._month]+" "+this._date+" "+this._year+" "+_12);
-},toGregorian:function(){
-var _13=this._year;
-var _14=this._month;
-var _15=this._date;
-var _16=_15+Math.ceil(29.5*_14)+(_13-1)*354+Math.floor((3+(11*_13))/30)+this._ISLAMIC_EPOCH-1;
-var wjd=Math.floor(_16-0.5)+0.5,_18=wjd-this._GREGORIAN_EPOCH,_19=Math.floor(_18/146097),dqc=this._mod(_18,146097),_1b=Math.floor(dqc/36524),_1c=this._mod(dqc,36524),_1d=Math.floor(_1c/1461),_1e=this._mod(_1c,1461),_1f=Math.floor(_1e/365),_20=(_19*400)+(_1b*100)+(_1d*4)+_1f;
-if(!(_1b==4||_1f==4)){
-_20++;
-}
-var _21=this._GREGORIAN_EPOCH+(365*(_20-1))+Math.floor((_20-1)/4)-(Math.floor((_20-1)/100))+Math.floor((_20-1)/400);
-var _22=wjd-_21;
-var tjd=(this._GREGORIAN_EPOCH-1)+(365*(_20-1))+Math.floor((_20-1)/4)-(Math.floor((_20-1)/100))+Math.floor((_20-1)/400)+Math.floor((739/12)+((dojo.date.isLeapYear(new Date(_20,3,1))?-1:-2))+1);
-var _24=((wjd<tjd)?0:(dojo.date.isLeapYear(new Date(_20,3,1))?1:2));
-var _25=Math.floor((((_22+_24)*12)+373)/367);
-var _26=(this._GREGORIAN_EPOCH-1)+(365*(_20-1))+Math.floor((_20-1)/4)-(Math.floor((_20-1)/100))+Math.floor((_20-1)/400)+Math.floor((((367*_25)-362)/12)+((_25<=2)?0:(dojo.date.isLeapYear(new Date(_20,_25,1))?-1:-2))+1);
-var day=(wjd-_26);
-var _28=new Date(_20,_25-1,day);
-_28.setHours(this._hours);
-_28.setMilliseconds(this._milliseconds);
-_28.setMinutes(this._minutes);
-_28.setSeconds(this._seconds);
-return _28;
-},fromGregorian:function(_29){
-var _2a=new Date(_29);
-var _2b=_2a.getFullYear(),_2c=_2a.getMonth(),_2d=_2a.getDate();
-var _2e=(this._GREGORIAN_EPOCH-1)+(365*(_2b-1))+Math.floor((_2b-1)/4)+(-Math.floor((_2b-1)/100))+Math.floor((_2b-1)/400)+Math.floor((((367*(_2c+1))-362)/12)+(((_2c+1)<=2)?0:(dojo.date.isLeapYear(_2a)?-1:-2))+_2d)+(Math.floor(_2a.getSeconds()+60*(_2a.getMinutes()+60*_2a.getHours())+0.5)/86400);
-_2e=Math.floor(_2e)+0.5;
-var _2f=_2e-1948440;
-var _30=Math.floor((30*_2f+10646)/10631);
-var _31=Math.ceil((_2f-29-this._yearStart(_30))/29.5);
-_31=Math.min(_31,11);
-var _32=Math.ceil(_2f-this._monthStart(_30,_31))+1;
-this._date=_32;
-this._month=_31;
-this._year=_30;
-this._hours=_2a.getHours();
-this._minutes=_2a.getMinutes();
-this._seconds=_2a.getSeconds();
-this._milliseconds=_2a.getMilliseconds();
-this._day=_2a.getDay();
-return this;
-},parse:function(_33){
-var _34=_33.toString();
-var _35=/\d{1,2}\D\d{1,2}\D\d{4}/;
-var sD,jd,mD=_34.match(_35);
-if(mD){
-mD=mD.toString();
-sD=mD.split(/\D/);
-this._month=sD[0]-1;
-this._date=sD[1];
-this._year=sD[2];
-}else{
-mD=_34.match(/\D{4,}\s\d{1,2}\s\d{4}/);
-if(mD){
-mD=mD.toString();
-var _39=mD.match(/\d{1,2}\s\d{4}/);
-_39=_39.toString();
-var _3a=mD.replace(/\s\d{1,2}\s\d{4}/,"");
-_3a=_3a.toString();
-this._month=dojo.indexOf(this._months,_3a);
-sD=_39.split(/\s/);
-this._date=sD[0];
-this._year=sD[1];
-}
-}
-var _3b=_34.match(/\d{2}:/);
-if(_3b!=null){
-_3b=_3b.toString();
-var _3c=_3b.split(":");
-this._hours=_3c[0];
-_3b=_34.match(/\d{2}:\d{2}/);
-if(_3b){
-_3b=_3b.toString();
-_3c=_3b.split(":");
-}
-this._minutes=_3c[1]!=null?_3c[1]:0;
-_3b=_34.match(/\d{2}:\d{2}:\d{2}/);
-if(_3b){
-_3b=_3b.toString();
-_3c=_3b.split(":");
-}
-this._seconds=_3c[2]!=null?_3c[2]:0;
-}else{
-this._hours=0;
-this._minutes=0;
-this._seconds=0;
-}
-this._milliseconds=0;
-},valueOf:function(){
-var _3d=this.toGregorian();
-return _3d.valueOf();
-},_yearStart:function(_3e){
-return (_3e-1)*354+Math.floor((3+11*_3e)/30);
-},_monthStart:function(_3f,_40){
-return Math.ceil(29.5*_40)+(_3f-1)*354+Math.floor((3+11*_3f)/30);
-},_civilLeapYear:function(_41){
-return (14+11*_41)%30<11;
-},getDaysInIslamicMonth:function(_42,_43){
-var _44=0;
-_44=29+((_42+1)%2);
-if(_42==11&&this._civilLeapYear(_43)){
-_44++;
-}
-return _44;
-},_mod:function(a,b){
-return a-(b*Math.floor(a/b));
-}});
-dojox.date.IslamicDate.getDaysInIslamicMonth=function(_47){
-return new dojox.date.IslamicDate().getDaysInIslamicMonth(_47.getMonth(),_47.getFullYear());
-};
-dojox.date.IslamicDate._getNames=function(_48,_49,use,_4b){
-var _4c;
-var _4d=dojo.i18n.getLocalization("dojo.cldr","islamic",_4b);
-var _4e=[_48,use,_49];
-if(use=="standAlone"){
-_4c=_4d[_4e.join("-")];
-}
-_4e[1]="format";
-return (_4c||_4d[_4e.join("-")]).concat();
-};
-dojox.date.IslamicDate.weekDays=dojox.date.IslamicDate._getNames("days","wide","format");
-dojox.date.IslamicDate.months=dojox.date.IslamicDate._getNames("months","wide","format");
-}
diff --git a/dojox/date/README b/dojox/date/README
index 8395369..605baab 100644
--- a/dojox/date/README
+++ b/dojox/date/README
@@ -10,7 +10,9 @@ experimental
 Credits
 	Paul Sowden (dojox.date.posix)
 	Neil Roberts (dojox.date.php)
-	Hossam Aldin Katory (dojox.date.IslamicCalendar, dojox.date.HebrewCalendar)
+	Hossam Aldin Katory (dojox.date.islamic, dojox.date.hebrew)
+	Helena Halperin, Moshe Wajnberg, Tomer Mahlin (dojox.date.hebrew)
+	Nathan Toone (dojox.date.relative, dojox.date.tzdate, dojox.date.timezone)
 -------------------------------------------------------------------------------
 Project description
 
diff --git a/dojox/date/buddhist.js b/dojox/date/buddhist.js
new file mode 100644
index 0000000..4846759
--- /dev/null
+++ b/dojox/date/buddhist.js
@@ -0,0 +1,182 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.date.buddhist"]){
+dojo._hasResource["dojox.date.buddhist"]=true;
+dojo.provide("dojox.date.buddhist");
+dojo.experimental("dojox.date.buddhist");
+dojo.require("dojox.date.buddhist.Date");
+dojo.require("dojo.date");
+dojox.date.buddhist.getDaysInMonth=function(_1){
+return dojo.date.getDaysInMonth(_1.toGregorian());
+};
+dojox.date.buddhist.isLeapYear=function(_2){
+return dojo.date.isLeapYear(_2.toGregorian());
+};
+dojox.date.buddhist.compare=function(_3,_4,_5){
+return dojo.date.compare(_3,_4,_5);
+};
+dojox.date.buddhist.add=function(_6,_7,_8){
+var _9=new dojox.date.buddhist.Date(_6);
+switch(_7){
+case "day":
+_9.setDate(_6.getDate(true)+_8);
+break;
+case "weekday":
+var _a,_b;
+var _c=_8%5;
+if(!_c){
+_a=(_8>0)?5:-5;
+_b=(_8>0)?((_8-5)/5):((_8+5)/5);
+}else{
+_a=_c;
+_b=parseInt(_8/5);
+}
+var _d=_6.getDay();
+var _e=0;
+if(_d==6&&_8>0){
+_e=1;
+}else{
+if(_d==0&&_8<0){
+_e=-1;
+}
+}
+var _f=_d+_a;
+if(_f==0||_f==6){
+_e=(_8>0)?2:-2;
+}
+_8=(7*_b)+_a+_e;
+_9.setDate(_6.getDate(true)+_8);
+break;
+case "year":
+_9.setFullYear(_6.getFullYear()+_8);
+break;
+case "week":
+_8*=7;
+_9.setDate(_6.getDate(true)+_8);
+break;
+case "month":
+_9.setMonth(_6.getMonth()+_8);
+break;
+case "hour":
+_9.setHours(_6.getHours()+_8);
+break;
+case "minute":
+_9.setMinutes(_6.getMinutes()+_8);
+break;
+case "second":
+_9.setSeconds(_6.getSeconds()+_8);
+break;
+case "millisecond":
+_9.setMilliseconds(_6.getMilliseconds()+_8);
+break;
+}
+return _9;
+};
+dojox.date.buddhist.difference=function(_10,_11,_12){
+_11=_11||new dojox.date.buddhist.Date();
+_12=_12||"day";
+var _13=_10.getFullYear()-_11.getFullYear();
+var _14=1;
+switch(_12){
+case "weekday":
+var _15=Math.round(dojox.date.buddhist.difference(_10,_11,"day"));
+var _16=parseInt(dojox.date.buddhist.difference(_10,_11,"week"));
+var mod=_15%7;
+if(mod==0){
+_15=_16*5;
+}else{
+var adj=0;
+var _17=_11.getDay();
+var _18=_10.getDay();
+_16=parseInt(_15/7);
+mod=_15%7;
+var _19=new dojox.date.buddhist.Date(_10);
+_19.setDate(_19.getDate(true)+(_16*7));
+var _1a=_19.getDay();
+if(_15>0){
+switch(true){
+case _17==5:
+adj=-1;
+break;
+case _17==6:
+adj=0;
+break;
+case _18==5:
+adj=-1;
+break;
+case _18==6:
+adj=-2;
+break;
+case (_1a+mod)>5:
+adj=-2;
+}
+}else{
+if(_15<0){
+switch(true){
+case _17==5:
+adj=0;
+break;
+case _17==6:
+adj=1;
+break;
+case _18==5:
+adj=2;
+break;
+case _18==6:
+adj=1;
+break;
+case (_1a+mod)<0:
+adj=2;
+}
+}
+}
+_15+=adj;
+_15-=(_16*2);
+}
+_14=_15;
+break;
+case "year":
+_14=_13;
+break;
+case "month":
+var _1b=(_10.toGregorian()>_11.toGregorian())?_10:_11;
+var _1c=(_10.toGregorian()>_11.toGregorian())?_11:_10;
+var _1d=_1b.getMonth();
+var _1e=_1c.getMonth();
+if(_13==0){
+_14=_1b.getMonth()-_1c.getMonth();
+}else{
+_14=12-_1e;
+_14+=_1d;
+var i=_1c.getFullYear()+1;
+var e=_1b.getFullYear();
+for(i;i<e;i++){
+_14+=12;
+}
+}
+if(_10.toGregorian()<_11.toGregorian()){
+_14=-_14;
+}
+break;
+case "week":
+_14=parseInt(dojox.date.buddhist.difference(_10,_11,"day")/7);
+break;
+case "day":
+_14/=24;
+case "hour":
+_14/=60;
+case "minute":
+_14/=60;
+case "second":
+_14/=1000;
+case "millisecond":
+_14*=_10.toGregorian().getTime()-_11.toGregorian().getTime();
+}
+return Math.round(_14);
+};
+}
diff --git a/dojox/date/buddhist/Date.js b/dojox/date/buddhist/Date.js
new file mode 100644
index 0000000..7bcf889
--- /dev/null
+++ b/dojox/date/buddhist/Date.js
@@ -0,0 +1,223 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.date.buddhist.Date"]){
+dojo._hasResource["dojox.date.buddhist.Date"]=true;
+dojo.provide("dojox.date.buddhist.Date");
+dojo.experimental("dojox.date.buddhist.Date");
+dojo.declare("dojox.date.buddhist.Date",null,{_date:0,_month:0,_year:0,_hours:0,_minutes:0,_seconds:0,_milliseconds:0,_day:0,constructor:function(){
+var _1=arguments.length;
+if(!_1){
+this.fromGregorian(new Date());
+}else{
+if(_1==1){
+var _2=arguments[0];
+if(typeof _2=="number"){
+_2=new Date(_2);
+}
+if(_2 instanceof Date){
+this.fromGregorian(_2);
+}else{
+if(_2==""){
+this._date=new Date("");
+}else{
+this._year=_2._year;
+this._month=_2._month;
+this._date=_2._date;
+this._hours=_2._hours;
+this._minutes=_2._minutes;
+this._seconds=_2._seconds;
+this._milliseconds=_2._milliseconds;
+}
+}
+}else{
+if(_1>=3){
+this._year+=arguments[0];
+this._month+=arguments[1];
+this._date+=arguments[2];
+if(this._month>11){
+console.warn("the month is incorrect , set 0");
+this._month=0;
+}
+this._hours+=arguments[3]||0;
+this._minutes+=arguments[4]||0;
+this._seconds+=arguments[5]||0;
+this._milliseconds+=arguments[6]||0;
+}
+}
+}
+},getDate:function(_3){
+return parseInt(this._date);
+},getMonth:function(){
+return parseInt(this._month);
+},getFullYear:function(){
+return parseInt(this._year);
+},getHours:function(){
+return this._hours;
+},getMinutes:function(){
+return this._minutes;
+},getSeconds:function(){
+return this._seconds;
+},getMilliseconds:function(){
+return this._milliseconds;
+},setDate:function(_4){
+_4=parseInt(_4);
+if(_4>0&&_4<=this._getDaysInMonth(this._month,this._year)){
+this._date=_4;
+}else{
+var _5;
+if(_4>0){
+for(_5=this._getDaysInMonth(this._month,this._year);_4>_5;_4-=_5,_5=this._getDaysInMonth(this._month,this._year)){
+this._month++;
+if(this._month>=12){
+this._year++;
+this._month-=12;
+}
+}
+this._date=_4;
+}else{
+for(_5=this._getDaysInMonth((this._month-1)>=0?(this._month-1):11,((this._month-1)>=0)?this._year:this._year-1);_4<=0;_5=this._getDaysInMonth((this._month-1)>=0?(this._month-1):11,((this._month-1)>=0)?this._year:this._year-1)){
+this._month--;
+if(this._month<0){
+this._year--;
+this._month+=12;
+}
+_4+=_5;
+}
+this._date=_4;
+}
+}
+return this;
+},setFullYear:function(_6,_7,_8){
+this._year=parseInt(_6);
+},setMonth:function(_9){
+this._year+=Math.floor(_9/12);
+this._month=Math.floor(_9%12);
+for(;this._month<0;this._month=this._month+12){
+}
+},setHours:function(){
+var _a=arguments.length;
+var _b=0;
+if(_a>=1){
+_b=parseInt(arguments[0]);
+}
+if(_a>=2){
+this._minutes=parseInt(arguments[1]);
+}
+if(_a>=3){
+this._seconds=parseInt(arguments[2]);
+}
+if(_a==4){
+this._milliseconds=parseInt(arguments[3]);
+}
+while(_b>=24){
+this._date++;
+var _c=this._getDaysInMonth(this._month,this._year);
+if(this._date>_c){
+this._month++;
+if(this._month>=12){
+this._year++;
+this._month-=12;
+}
+this._date-=_c;
+}
+_b-=24;
+}
+this._hours=_b;
+},setMinutes:function(_d){
+while(_d>=60){
+this._hours++;
+if(this._hours>=24){
+this._date++;
+this._hours-=24;
+var _e=this._getDaysInMonth(this._month,this._year);
+if(this._date>_e){
+this._month++;
+if(this._month>=12){
+this._year++;
+this._month-=12;
+}
+this._date-=_e;
+}
+}
+_d-=60;
+}
+this._minutes=_d;
+},setSeconds:function(_f){
+while(_f>=60){
+this._minutes++;
+if(this._minutes>=60){
+this._hours++;
+this._minutes-=60;
+if(this._hours>=24){
+this._date++;
+this._hours-=24;
+var _10=this._getDaysInMonth(this._month,this._year);
+if(this._date>_10){
+this._month++;
+if(this._month>=12){
+this._year++;
+this._month-=12;
+}
+this._date-=_10;
+}
+}
+}
+_f-=60;
+}
+this._seconds=_f;
+},setMilliseconds:function(_11){
+while(_11>=1000){
+this.setSeconds++;
+if(this.setSeconds>=60){
+this._minutes++;
+this.setSeconds-=60;
+if(this._minutes>=60){
+this._hours++;
+this._minutes-=60;
+if(this._hours>=24){
+this._date++;
+this._hours-=24;
+var _12=this._getDaysInMonth(this._month,this._year);
+if(this._date>_12){
+this._month++;
+if(this._month>=12){
+this._year++;
+this._month-=12;
+}
+this._date-=_12;
+}
+}
+}
+}
+_11-=1000;
+}
+this._milliseconds=_11;
+},toString:function(){
+return this._date+", "+this._month+", "+this._year+"  "+this._hours+":"+this._minutes+":"+this._seconds;
+},_getDaysInMonth:function(_13,_14){
+return dojo.date.getDaysInMonth(new Date(_14-543,_13));
+},fromGregorian:function(_15){
+var _16=new Date(_15);
+this._date=_16.getDate();
+this._month=_16.getMonth();
+this._year=_16.getFullYear()+543;
+this._hours=_16.getHours();
+this._minutes=_16.getMinutes();
+this._seconds=_16.getSeconds();
+this._milliseconds=_16.getMilliseconds();
+this._day=_16.getDay();
+return this;
+},toGregorian:function(){
+return new Date(this._year-543,this._month,this._date,this._hours,this._minutes,this._seconds,this._milliseconds);
+},getDay:function(){
+return this.toGregorian().getDay();
+}});
+dojox.date.buddhist.Date.prototype.valueOf=function(){
+return this.toGregorian().valueOf();
+};
+}
diff --git a/dojox/date/buddhist/locale.js b/dojox/date/buddhist/locale.js
new file mode 100644
index 0000000..f9bafeb
--- /dev/null
+++ b/dojox/date/buddhist/locale.js
@@ -0,0 +1,372 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.date.buddhist.locale"]){
+dojo._hasResource["dojox.date.buddhist.locale"]=true;
+dojo.provide("dojox.date.buddhist.locale");
+dojo.experimental("dojox.date.buddhist.locale");
+dojo.require("dojox.date.buddhist.Date");
+dojo.require("dojo.regexp");
+dojo.require("dojo.string");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dojo.cldr","buddhist",null,"th");
+(function(){
+function _1(_2,_3,_4,_5,_6){
+return _6.replace(/([a-z])\1*/ig,function(_7){
+var s,_8;
+var c=_7.charAt(0);
+var l=_7.length;
+var _9=["abbr","wide","narrow"];
+switch(c){
+case "G":
+s=_3["eraAbbr"][0];
+break;
+case "y":
+s=String(_2.getFullYear());
+break;
+case "M":
+var m=_2.getMonth();
+if(l<3){
+s=m+1;
+_8=true;
+}else{
+var _a=["months","format",_9[l-3]].join("-");
+s=_3[_a][m];
+}
+break;
+case "d":
+s=_2.getDate(true);
+_8=true;
+break;
+case "E":
+var d=_2.getDay();
+if(l<3){
+s=d+1;
+_8=true;
+}else{
+var _b=["days","format",_9[l-3]].join("-");
+s=_3[_b][d];
+}
+break;
+case "a":
+var _c=(_2.getHours()<12)?"am":"pm";
+s=_3[_c];
+break;
+case "h":
+case "H":
+case "K":
+case "k":
+var h=_2.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;
+}
+_8=true;
+break;
+case "m":
+s=_2.getMinutes();
+_8=true;
+break;
+case "s":
+s=_2.getSeconds();
+_8=true;
+break;
+case "S":
+s=Math.round(_2.getMilliseconds()*Math.pow(10,l-3));
+_8=true;
+break;
+default:
+throw new Error("dojox.date.buddhist.locale.formatPattern: invalid pattern char: "+_6);
+}
+if(_8){
+s=dojo.string.pad(s,l);
+}
+return s;
+});
+};
+dojox.date.buddhist.locale.format=function(_d,_e){
+_e=_e||{};
+var _f=dojo.i18n.normalizeLocale(_e.locale);
+var _10=_e.formatLength||"short";
+var _11=dojox.date.buddhist.locale._getBuddhistBundle(_f);
+var str=[];
+var _12=dojo.hitch(this,_1,_d,_11,_f,_e.fullYear);
+if(_e.selector=="year"){
+var _13=_d.getFullYear();
+return _13;
+}
+if(_e.selector!="time"){
+var _14=_e.datePattern||_11["dateFormat-"+_10];
+if(_14){
+str.push(_15(_14,_12));
+}
+}
+if(_e.selector!="date"){
+var _16=_e.timePattern||_11["timeFormat-"+_10];
+if(_16){
+str.push(_15(_16,_12));
+}
+}
+var _17=str.join(" ");
+return _17;
+};
+dojox.date.buddhist.locale.regexp=function(_18){
+return dojox.date.buddhist.locale._parseInfo(_18).regexp;
+};
+dojox.date.buddhist.locale._parseInfo=function(_19){
+_19=_19||{};
+var _1a=dojo.i18n.normalizeLocale(_19.locale);
+var _1b=dojox.date.buddhist.locale._getBuddhistBundle(_1a);
+var _1c=_19.formatLength||"short";
+var _1d=_19.datePattern||_1b["dateFormat-"+_1c];
+var _1e=_19.timePattern||_1b["timeFormat-"+_1c];
+var _1f;
+if(_19.selector=="date"){
+_1f=_1d;
+}else{
+if(_19.selector=="time"){
+_1f=_1e;
+}else{
+_1f=(typeof (_1e)=="undefined")?_1d:_1d+" "+_1e;
+}
+}
+var _20=[];
+var re=_15(_1f,dojo.hitch(this,_21,_20,_1b,_19));
+return {regexp:re,tokens:_20,bundle:_1b};
+};
+dojox.date.buddhist.locale.parse=function(_22,_23){
+_22=_22.replace(/[\u200E\u200F\u202A-\u202E]/g,"");
+if(!_23){
+_23={};
+}
+var _24=dojox.date.buddhist.locale._parseInfo(_23);
+var _25=_24.tokens,_26=_24.bundle;
+var re=new RegExp("^"+_24.regexp+"$");
+var _27=re.exec(_22);
+var _28=dojo.i18n.normalizeLocale(_23.locale);
+if(!_27){
+return null;
+}
+var _29,_2a;
+var _2b=[2513,0,1,0,0,0,0];
+var _2c="";
+var _2d=0;
+var _2e=["abbr","wide","narrow"];
+var _2f=dojo.every(_27,function(v,i){
+if(!i){
+return true;
+}
+var _30=_25[i-1];
+var l=_30.length;
+switch(_30.charAt(0)){
+case "y":
+_2b[0]=Number(v);
+break;
+case "M":
+if(l>2){
+var _31=_26["months-format-"+_2e[l-3]].concat();
+if(!_23.strict){
+v=v.replace(".","").toLowerCase();
+_31=dojo.map(_31,function(s){
+return s?s.replace(".","").toLowerCase():s;
+});
+}
+v=dojo.indexOf(_31,v);
+if(v==-1){
+return false;
+}
+_2d=l;
+}else{
+v--;
+}
+_2b[1]=Number(v);
+break;
+case "D":
+_2b[1]=0;
+case "d":
+_2b[2]=Number(v);
+break;
+case "a":
+var am=_23.am||_26.am;
+var pm=_23.pm||_26.pm;
+if(!_23.strict){
+var _32=/\./g;
+v=v.replace(_32,"").toLowerCase();
+am=am.replace(_32,"").toLowerCase();
+pm=pm.replace(_32,"").toLowerCase();
+}
+if(_23.strict&&v!=am&&v!=pm){
+return false;
+}
+_2c=(v==pm)?"p":(v==am)?"a":"";
+break;
+case "K":
+if(v==24){
+v=0;
+}
+case "h":
+case "H":
+case "k":
+_2b[3]=Number(v);
+break;
+case "m":
+_2b[4]=Number(v);
+break;
+case "s":
+_2b[5]=Number(v);
+break;
+case "S":
+_2b[6]=Number(v);
+}
+return true;
+});
+var _33=+_2b[3];
+if(_2c==="p"&&_33<12){
+_2b[3]=_33+12;
+}else{
+if(_2c==="a"&&_33==12){
+_2b[3]=0;
+}
+}
+var _34=new dojox.date.buddhist.Date(_2b[0],_2b[1],_2b[2],_2b[3],_2b[4],_2b[5],_2b[6]);
+return _34;
+};
+function _15(_35,_36,_37,_38){
+var _39=function(x){
+return x;
+};
+_36=_36||_39;
+_37=_37||_39;
+_38=_38||_39;
+var _3a=_35.match(/(''|[^'])+/g);
+var _3b=_35.charAt(0)=="'";
+dojo.forEach(_3a,function(_3c,i){
+if(!_3c){
+_3a[i]="";
+}else{
+_3a[i]=(_3b?_37:_36)(_3c);
+_3b=!_3b;
+}
+});
+return _38(_3a.join(""));
+};
+function _21(_3d,_3e,_3f,_40){
+_40=dojo.regexp.escapeString(_40);
+var _41=dojo.i18n.normalizeLocale(_3f.locale);
+return _40.replace(/([a-z])\1*/ig,function(_42){
+var s;
+var c=_42.charAt(0);
+var l=_42.length;
+var p2="",p3="";
+if(_3f.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+";
+break;
+case "M":
+s=(l>2)?"\\S+":p2+"[1-9]|1[0-2]";
+break;
+case "d":
+s="[12]\\d|"+p2+"[1-9]|3[01]";
+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=p2+"\\d|[0-5]\\d";
+break;
+case "S":
+s="\\d{"+l+"}";
+break;
+case "a":
+var am=_3f.am||_3e.am||"AM";
+var pm=_3f.pm||_3e.pm||"PM";
+if(_3f.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(_3d){
+_3d.push(_42);
+}
+return "("+s+")";
+}).replace(/[\xa0 ]/g,"[\\s\\xa0]");
+};
+})();
+(function(){
+var _43=[];
+dojox.date.buddhist.locale.addCustomFormats=function(_44,_45){
+_43.push({pkg:_44,name:_45});
+};
+dojox.date.buddhist.locale._getBuddhistBundle=function(_46){
+var _47={};
+dojo.forEach(_43,function(_48){
+var _49=dojo.i18n.getLocalization(_48.pkg,_48.name,_46);
+_47=dojo.mixin(_47,_49);
+},this);
+return _47;
+};
+})();
+dojox.date.buddhist.locale.addCustomFormats("dojo.cldr","buddhist");
+dojox.date.buddhist.locale.getNames=function(_4a,_4b,_4c,_4d,_4e){
+var _4f;
+var _50=dojox.date.buddhist.locale._getBuddhistBundle;
+var _51=[_4a,_4c,_4b];
+if(_4c=="standAlone"){
+var key=_51.join("-");
+_4f=_50(_4d)[key];
+if(_4f===_50("ROOT")[key]){
+_4f=undefined;
+}
+}
+_51[1]="format";
+return (_4f||_50(_4d)[_51.join("-")]).concat();
+};
+}
diff --git a/dojox/date/hebrew.js b/dojox/date/hebrew.js
new file mode 100644
index 0000000..270700e
--- /dev/null
+++ b/dojox/date/hebrew.js
@@ -0,0 +1,191 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.date.hebrew"]){
+dojo._hasResource["dojox.date.hebrew"]=true;
+dojo.provide("dojox.date.hebrew");
+dojo.require("dojox.date.hebrew.Date");
+dojo.require("dojo.date");
+dojox.date.hebrew.getDaysInMonth=function(_1){
+return _1.getDaysInHebrewMonth(_1.getMonth(),_1.getFullYear());
+};
+dojox.date.hebrew.compare=function(_2,_3,_4){
+if(_2 instanceof dojox.date.hebrew.Date){
+_2=_2.toGregorian();
+}
+if(_3 instanceof dojox.date.hebrew.Date){
+_3=_3.toGregorian();
+}
+return dojo.date.compare.apply(null,arguments);
+};
+dojox.date.hebrew.add=function(_5,_6,_7){
+var _8=new dojox.date.hebrew.Date(_5);
+switch(_6){
+case "day":
+_8.setDate(_5.getDate()+_7);
+break;
+case "weekday":
+var _9=_5.getDay();
+var _a=0;
+if(_7<0&&_9==6){
+_9=5;
+_a=-1;
+}
+if((_9+_7)<5&&(_9+_7)>=0){
+_8.setDate(_5.getDate()+_7+_a);
+}else{
+var _b=(_7>0)?5:-1;
+var _c=(_7>0)?2:-2;
+if(_7>0&&(_9==5||_9==6)){
+_a=4-_9;
+_9=4;
+}
+var _d=_9+_7-_b;
+var _e=parseInt(_d/5);
+var _f=_d%5;
+_8.setDate(_5.getDate()-_9+_c+_e*7+_a+_f+_b);
+}
+break;
+case "year":
+_8.setFullYear(_5.getFullYear()+_7);
+break;
+case "week":
+_7*=7;
+_8.setDate(_5.getDate()+_7);
+break;
+case "month":
+var _10=_5.getMonth();
+var _b=_10+_7;
+if(!_5.isLeapYear(_5.getFullYear())){
+if(_10<5&&_b>=5){
+_b++;
+}else{
+if(_10>5&&_b<=5){
+_b--;
+}
+}
+}
+_8.setMonth(_b);
+break;
+case "hour":
+_8.setHours(_5.getHours()+_7);
+break;
+case "minute":
+_8.setMinutes(_5.getMinutes()+_7);
+break;
+case "second":
+_8.setSeconds(_5.getSeconds()+_7);
+break;
+case "millisecond":
+_8.setMilliseconds(_5.getMilliseconds()+_7);
+break;
+}
+return _8;
+};
+dojox.date.hebrew.difference=function(_11,_12,_13){
+_12=_12||new dojox.date.hebrew.Date();
+_13=_13||"day";
+var _14=_11.getFullYear()-_12.getFullYear();
+var _15=1;
+switch(_13){
+case "weekday":
+var _16=Math.round(dojox.date.hebrew.difference(_11,_12,"day"));
+var _17=parseInt(dojox.date.hebrew.difference(_11,_12,"week"));
+var mod=_16%7;
+if(mod==0){
+_16=_17*5;
+}else{
+var adj=0;
+var _18=_12.getDay();
+var _19=_11.getDay();
+_17=parseInt(_16/7);
+mod=_16%7;
+var _1a=new dojox.date.hebrew.Date(_12);
+_1a.setDate(_1a.getDate()+(_17*7));
+var _1b=_1a.getDay();
+if(_16>0){
+switch(true){
+case _18==5:
+adj=-1;
+break;
+case _18==6:
+adj=0;
+break;
+case _19==5:
+adj=-1;
+break;
+case _19==6:
+adj=-2;
+break;
+case (_1b+mod)>5:
+adj=-2;
+}
+}else{
+if(_16<0){
+switch(true){
+case _18==5:
+adj=0;
+break;
+case _18==6:
+adj=1;
+break;
+case _19==5:
+adj=2;
+break;
+case _19==6:
+adj=1;
+break;
+case (_1b+mod)<0:
+adj=2;
+}
+}
+}
+_16+=adj;
+_16-=(_17*2);
+}
+_15=_16;
+break;
+case "year":
+_15=_14;
+break;
+case "month":
+var _1c=(_11.toGregorian()>_12.toGregorian())?_11:_12;
+var _1d=(_11.toGregorian()>_12.toGregorian())?_12:_11;
+var _1e=_1c.getMonth();
+var _1f=_1d.getMonth();
+if(_14==0){
+_15=(!_11.isLeapYear(_11.getFullYear())&&_1c.getMonth()>5&&_1d.getMonth()<=5)?(_1c.getMonth()-_1d.getMonth()-1):(_1c.getMonth()-_1d.getMonth());
+}else{
+_15=(!_1d.isLeapYear(_1d.getFullYear())&&_1f<6)?(13-_1f-1):(13-_1f);
+_15+=(!_1c.isLeapYear(_1c.getFullYear())&&_1e>5)?(_1e-1):_1e;
+var i=_1d.getFullYear()+1;
+var e=_1c.getFullYear();
+for(i;i<e;i++){
+_15+=_1d.isLeapYear(i)?13:12;
+}
+}
+if(_11.toGregorian()<_12.toGregorian()){
+_15=-_15;
+}
+break;
+case "week":
+_15=parseInt(dojox.date.hebrew.difference(_11,_12,"day")/7);
+break;
+case "day":
+_15/=24;
+case "hour":
+_15/=60;
+case "minute":
+_15/=60;
+case "second":
+_15/=1000;
+case "millisecond":
+_15*=_11.toGregorian().getTime()-_12.toGregorian().getTime();
+}
+return Math.round(_15);
+};
+}
diff --git a/dojox/date/hebrew/Date.js b/dojox/date/hebrew/Date.js
new file mode 100644
index 0000000..b8b02f6
--- /dev/null
+++ b/dojox/date/hebrew/Date.js
@@ -0,0 +1,306 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.date.hebrew.Date"]){
+dojo._hasResource["dojox.date.hebrew.Date"]=true;
+dojo.provide("dojox.date.hebrew.Date");
+dojo.require("dojox.date.hebrew.numerals");
+dojo.declare("dojox.date.hebrew.Date",null,{_MONTH_LENGTH:[[30,30,30],[29,29,30],[29,30,30],[29,29,29],[30,30,30],[30,30,30],[29,29,29],[30,30,30],[29,29,29],[30,30,30],[29,29,29],[30,30,30],[29,29,29]],_MONTH_START:[[0,0,0],[30,30,30],[59,59,60],[88,89,90],[117,118,119],[147,148,149],[147,148,149],[176,177,178],[206,207,208],[235,236,237],[265,266,267],[294,295,296],[324,325,326],[353,354,355]],_LEAP_MONTH_START:[[0,0,0],[30,30,30],[59,59,60],[88,89,90],[117,118,119],[147,148,149],[177, [...]
+var _1=arguments.length;
+if(!_1){
+this.fromGregorian(new Date());
+}else{
+if(_1==1){
+var _2=arguments[0];
+if(typeof _2=="number"){
+_2=new Date(_2);
+}
+if(_2 instanceof Date){
+this.fromGregorian(_2);
+}else{
+if(_2==""){
+this._date=new Date("");
+}else{
+this._year=_2._year;
+this._month=_2._month;
+this._date=_2._date;
+this._hours=_2._hours;
+this._minutes=_2._minutes;
+this._seconds=_2._seconds;
+this._milliseconds=_2._milliseconds;
+}
+}
+}else{
+if(_1>=3){
+this._year+=arguments[0];
+this._month+=arguments[1];
+this._date+=arguments[2];
+if(this._month>12){
+console.warn("the month is incorrect , set 0  "+this._month+"   "+this._year);
+this._month=0;
+}
+this._hours+=arguments[3]||0;
+this._minutes+=arguments[4]||0;
+this._seconds+=arguments[5]||0;
+this._milliseconds+=arguments[6]||0;
+}
+}
+}
+this._setDay();
+},getDate:function(){
+return this._date;
+},getDateLocalized:function(_3){
+return (_3||dojo.locale).match(/^he(?:-.+)?$/)?dojox.date.hebrew.numerals.getDayHebrewLetters(this._date):this.getDate();
+},getMonth:function(){
+return this._month;
+},getFullYear:function(){
+return this._year;
+},getHours:function(){
+return this._hours;
+},getMinutes:function(){
+return this._minutes;
+},getSeconds:function(){
+return this._seconds;
+},getMilliseconds:function(){
+return this._milliseconds;
+},setDate:function(_4){
+_4=+_4;
+var _5;
+if(_4>0){
+while(_4>(_5=this.getDaysInHebrewMonth(this._month,this._year))){
+_4-=_5;
+this._month++;
+if(this._month>=13){
+this._year++;
+this._month-=13;
+}
+}
+}else{
+while(_4<=0){
+_5=this.getDaysInHebrewMonth((this._month-1)>=0?(this._month-1):12,((this._month-1)>=0)?this._year:this._year-1);
+this._month--;
+if(this._month<0){
+this._year--;
+this._month+=13;
+}
+_4+=_5;
+}
+}
+this._date=_4;
+this._setDay();
+return this;
+},setFullYear:function(_6,_7,_8){
+this._year=_6=+_6;
+if(!this.isLeapYear(_6)&&this._month==5){
+this._month++;
+}
+if(_7!==undefined){
+this.setMonth(_7);
+}
+if(_8!==undefined){
+this.setDate(_8);
+}
+var _9=this.getDaysInHebrewMonth(this._month,this._year);
+if(_9<this._date){
+this._date=_9;
+}
+this._setDay();
+return this;
+},setMonth:function(_a){
+_a=+_a;
+if(!this.isLeapYear(this._year)&&_a==5){
+_a++;
+}
+if(_a>=0){
+while(_a>12){
+this._year++;
+_a-=13;
+if(!this.isLeapYear(this._year)&&_a>=5){
+_a++;
+}
+}
+}else{
+while(_a<0){
+this._year--;
+_a+=(!this.isLeapYear(this._year)&&_a<-7)?12:13;
+}
+}
+this._month=_a;
+var _b=this.getDaysInHebrewMonth(this._month,this._year);
+if(_b<this._date){
+this._date=_b;
+}
+this._setDay();
+return this;
+},setHours:function(){
+var _c=arguments.length;
+var _d=0;
+if(_c>=1){
+_d+=+arguments[0];
+}
+if(_c>=2){
+this._minutes+=+arguments[1];
+}
+if(_c>=3){
+this._seconds+=+arguments[2];
+}
+if(_c==4){
+this._milliseconds+=+arguments[3];
+}
+while(_d>=24){
+this._date++;
+var _e=this.getDaysInHebrewMonth(this._month,this._year);
+if(this._date>_e){
+this._month++;
+if(!this.isLeapYear(this._year)&&this._month==5){
+this._month++;
+}
+if(this._month>=13){
+this._year++;
+this._month-=13;
+}
+this._date-=_e;
+}
+_d-=24;
+}
+this._hours=_d;
+this._setDay();
+return this;
+},setMinutes:function(_f){
+_f=+_f;
+this._minutes=_f%60;
+this.setHours(parseInt(_f/60));
+this._setDay();
+return this;
+},setSeconds:function(_10){
+_10=+_10;
+this._seconds=_10%60;
+this.setMinutes(parseInt(_10/60));
+this._setDay();
+return this;
+},setMilliseconds:function(_11){
+_11=+_11;
+this._milliseconds=_11%1000;
+this.setSeconds(parseInt(_11/1000));
+this._setDay();
+return this;
+},_setDay:function(){
+var day=this._startOfYear(this._year);
+if(this._month!=0){
+day+=(this.isLeapYear(this._year)?this._LEAP_MONTH_START:this._MONTH_START)[this._month][this._yearType(this._year)];
+}
+day+=this._date-1;
+this._day=(day+1)%7;
+},toString:function(){
+return this._date+", "+this._month+", "+this._year+"  "+this._hours+":"+this._minutes+":"+this._seconds;
+},getDaysInHebrewMonth:function(_12,_13){
+var _14=(_12==1||_12==2)?this._yearType(_13):0;
+return (!this.isLeapYear(this._year)&&_12==5)?0:this._MONTH_LENGTH[_12][_14];
+},_yearType:function(_15){
+var _16=this._handleGetYearLength(Number(_15));
+if(_16>380){
+_16-=30;
+}
+var _17=_16-353;
+if(_17<0||_17>2){
+throw new Error("Illegal year length "+_16+" in year "+_15);
+}
+return _17;
+},_handleGetYearLength:function(_18){
+return this._startOfYear(_18+1)-this._startOfYear(_18);
+},_startOfYear:function(_19){
+var _1a=Math.floor((235*_19-234)/19),_1b=_1a*(12*1080+793)+11*1080+204,day=_1a*29+Math.floor(_1b/(24*1080));
+_1b%=24*1080;
+var wd=day%7;
+if(wd==2||wd==4||wd==6){
+day+=1;
+wd=day%7;
+}
+if(wd==1&&_1b>15*1080+204&&!this.isLeapYear(_19)){
+day+=2;
+}else{
+if(wd==0&&_1b>21*1080+589&&this.isLeapYear(_19-1)){
+day+=1;
+}
+}
+return day;
+},isLeapYear:function(_1c){
+var x=(_1c*12+17)%19;
+return x>=((x<0)?-7:12);
+},fromGregorian:function(_1d){
+var _1e=this._computeHebrewFields(_1d);
+this._year=_1e[0];
+this._month=_1e[1];
+this._date=_1e[2];
+this._hours=_1d.getHours();
+this._milliseconds=_1d.getMilliseconds();
+this._minutes=_1d.getMinutes();
+this._seconds=_1d.getSeconds();
+this._setDay();
+return this;
+},_computeHebrewFields:function(_1f){
+var _20=this._getJulianDayFromGregorianDate(_1f),d=_20-347997,m=Math.floor((d*24*1080)/(29*24*1080+12*1080+793)),_21=Math.floor((19*m+234)/235)+1,ys=this._startOfYear(_21),_22=(d-ys);
+while(_22<1){
+_21--;
+ys=this._startOfYear(_21);
+_22=d-ys;
+}
+var _23=this._yearType(_21),_24=this.isLeapYear(_21)?this._LEAP_MONTH_START:this._MONTH_START,_25=0;
+while(_22>_24[_25][_23]){
+_25++;
+}
+_25--;
+var _26=_22-_24[_25][_23];
+return [_21,_25,_26];
+},toGregorian:function(){
+var _27=this._year,_28=this._month,_29=this._date,day=this._startOfYear(_27);
+if(_28!=0){
+day+=(this.isLeapYear(_27)?this._LEAP_MONTH_START:this._MONTH_START)[_28][this._yearType(_27)];
+}
+var _2a=(_29+day+347997),_2b=_2a-1721426;
+var rem=[];
+var _2c=this._floorDivide(_2b,146097,rem),_2d=this._floorDivide(rem[0],36524,rem),n4=this._floorDivide(rem[0],1461,rem),n1=this._floorDivide(rem[0],365,rem),_2e=400*_2c+100*_2d+4*n4+n1,_2f=rem[0];
+if(_2d==4||n1==4){
+_2f=365;
+}else{
+++_2e;
+}
+var _30=!(_2e%4)&&(_2e%100||!(_2e%400)),_31=0,_32=_30?60:59;
+if(_2f>=_32){
+_31=_30?1:2;
+}
+var _33=Math.floor((12*(_2f+_31)+6)/367);
+var _34=_2f-this._GREGORIAN_MONTH_COUNT[_33][_30?3:2]+1;
+return new Date(_2e,_33,_34,this._hours,this._minutes,this._seconds,this._milliseconds);
+},_floorDivide:function(_35,_36,_37){
+if(_35>=0){
+_37[0]=(_35%_36);
+return Math.floor(_35/_36);
+}
+var _38=Math.floor(_35/_36);
+_37[0]=_35-(_38*_36);
+return _38;
+},getDay:function(){
+var _39=this._year,_3a=this._month,_3b=this._date,day=this._startOfYear(_39);
+if(_3a!=0){
+day+=(this.isLeapYear(_39)?this._LEAP_MONTH_START:this._MONTH_START)[_3a][this._yearType(_39)];
+}
+day+=_3b-1;
+return (day+1)%7;
+},_getJulianDayFromGregorianDate:function(_3c){
+var _3d=_3c.getFullYear(),_3e=_3c.getMonth(),d=_3c.getDate(),_3f=!(_3d%4)&&(_3d%100||!(_3d%400)),y=_3d-1;
+var _40=365*y+Math.floor(y/4)-Math.floor(y/100)+Math.floor(y/400)+1721426-1;
+if(_3e!=0){
+_40+=this._GREGORIAN_MONTH_COUNT[_3e][_3f?3:2];
+}
+_40+=d;
+return _40;
+}});
+dojox.date.hebrew.Date.prototype.valueOf=function(){
+return this.toGregorian().valueOf();
+};
+}
diff --git a/dojox/date/hebrew/locale.js b/dojox/date/hebrew/locale.js
new file mode 100644
index 0000000..f96b1fa
--- /dev/null
+++ b/dojox/date/hebrew/locale.js
@@ -0,0 +1,414 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.date.hebrew.locale"]){
+dojo._hasResource["dojox.date.hebrew.locale"]=true;
+dojo.provide("dojox.date.hebrew.locale");
+dojo.require("dojox.date.hebrew.Date");
+dojo.require("dojox.date.hebrew.numerals");
+dojo.require("dojo.regexp");
+dojo.require("dojo.string");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dojo.cldr","hebrew",null,"ROOT,ar,he");
+(function(){
+function _1(_2,_3,_4,_5,_6){
+return _6.replace(/([a-z])\1*/ig,function(_7){
+var s,_8;
+var c=_7.charAt(0);
+var l=_7.length;
+var _9=["abbr","wide","narrow"];
+switch(c){
+case "y":
+if(_4.match(/^he(?:-.+)?$/)){
+s=dojox.date.hebrew.numerals.getYearHebrewLetters(_2.getFullYear());
+}else{
+s=String(_2.getFullYear());
+}
+break;
+case "M":
+var m=_2.getMonth();
+if(l<3){
+if(!_2.isLeapYear(_2.getFullYear())&&m>5){
+m--;
+}
+if(_4.match(/^he(?:-.+)?$/)){
+s=dojox.date.hebrew.numerals.getMonthHebrewLetters(m);
+}else{
+s=m+1;
+_8=true;
+}
+}else{
+var _a=["months","format",_9[l-3]].join("-");
+s=_3[_a][m];
+}
+break;
+case "d":
+if(_4.match(/^he(?:-.+)?$/)){
+s=_2.getDateLocalized(_4);
+}else{
+s=_2.getDate();
+_8=true;
+}
+break;
+case "E":
+var d=_2.getDay();
+if(l<3){
+s=d+1;
+_8=true;
+}else{
+var _b=["days","format",_9[l-3]].join("-");
+s=_3[_b][d];
+}
+break;
+case "a":
+var _c=(_2.getHours()<12)?"am":"pm";
+s=_3[_c];
+break;
+case "h":
+case "H":
+case "K":
+case "k":
+var h=_2.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;
+}
+_8=true;
+break;
+case "m":
+s=_2.getMinutes();
+_8=true;
+break;
+case "s":
+s=_2.getSeconds();
+_8=true;
+break;
+case "S":
+s=Math.round(_2.getMilliseconds()*Math.pow(10,l-3));
+_8=true;
+break;
+case "z":
+s="";
+break;
+default:
+throw new Error("dojox.date.hebrew.locale.formatPattern: invalid pattern char: "+_6);
+}
+if(_8){
+s=dojo.string.pad(s,l);
+}
+return s;
+});
+};
+dojox.date.hebrew.locale.format=function(_d,_e){
+_e=_e||{};
+var _f=dojo.i18n.normalizeLocale(_e.locale);
+var _10=_e.formatLength||"short";
+var _11=dojox.date.hebrew.locale._getHebrewBundle(_f);
+var str=[];
+var _12=dojo.hitch(this,_1,_d,_11,_f,_e.fullYear);
+if(_e.selector=="year"){
+var _13=_d.getFullYear();
+return _f.match(/^he(?:-.+)?$/)?dojox.date.hebrew.numerals.getYearHebrewLetters(_13):_13;
+}
+if(_e.selector!="time"){
+var _14=_e.datePattern||_11["dateFormat-"+_10];
+if(_14){
+str.push(_15(_14,_12));
+}
+}
+if(_e.selector!="date"){
+var _16=_e.timePattern||_11["timeFormat-"+_10];
+if(_16){
+str.push(_15(_16,_12));
+}
+}
+var _17=str.join(" ");
+return _17;
+};
+dojox.date.hebrew.locale.regexp=function(_18){
+return dojox.date.hebrew.locale._parseInfo(_18).regexp;
+};
+dojox.date.hebrew.locale._parseInfo=function(_19){
+_19=_19||{};
+var _1a=dojo.i18n.normalizeLocale(_19.locale);
+var _1b=dojox.date.hebrew.locale._getHebrewBundle(_1a);
+var _1c=_19.formatLength||"short";
+var _1d=_19.datePattern||_1b["dateFormat-"+_1c];
+var _1e=_19.timePattern||_1b["timeFormat-"+_1c];
+var _1f;
+if(_19.selector=="date"){
+_1f=_1d;
+}else{
+if(_19.selector=="time"){
+_1f=_1e;
+}else{
+_1f=(_1e===undefined)?_1d:_1d+" "+_1e;
+}
+}
+var _20=[];
+var re=_15(_1f,dojo.hitch(this,_21,_20,_1b,_19));
+return {regexp:re,tokens:_20,bundle:_1b};
+};
+dojox.date.hebrew.locale.parse=function(_22,_23){
+_22=_22.replace(/[\u200E\u200F\u202A-\u202E]/g,"");
+if(!_23){
+_23={};
+}
+var _24=dojox.date.hebrew.locale._parseInfo(_23);
+var _25=_24.tokens,_26=_24.bundle;
+var re=new RegExp("^"+_24.regexp+"$");
+var _27=re.exec(_22);
+var _28=dojo.i18n.normalizeLocale(_23.locale);
+if(!_27){
+return null;
+}
+var _29,_2a;
+var _2b=[5730,3,23,0,0,0,0];
+var _2c="";
+var _2d=0;
+var _2e=["abbr","wide","narrow"];
+var _2f=dojo.every(_27,function(v,i){
+if(!i){
+return true;
+}
+var _30=_25[i-1];
+var l=_30.length;
+switch(_30.charAt(0)){
+case "y":
+if(_28.match(/^he(?:-.+)?$/)){
+_2b[0]=dojox.date.hebrew.numerals.parseYearHebrewLetters(v);
+}else{
+_2b[0]=Number(v);
+}
+break;
+case "M":
+if(l>2){
+var _31=_26["months-format-"+_2e[l-3]].concat();
+if(!_23.strict){
+v=v.replace(".","").toLowerCase();
+_31=dojo.map(_31,function(s){
+return s?s.replace(".","").toLowerCase():s;
+});
+}
+v=dojo.indexOf(_31,v);
+if(v==-1){
+return false;
+}
+_2d=l;
+}else{
+if(_28.match(/^he(?:-.+)?$/)){
+v=dojox.date.hebrew.numerals.parseMonthHebrewLetters(v);
+}else{
+v--;
+}
+}
+_2b[1]=Number(v);
+break;
+case "D":
+_2b[1]=0;
+case "d":
+if(_28.match(/^he(?:-.+)?$/)){
+_2b[2]=dojox.date.hebrew.numerals.parseDayHebrewLetters(v);
+}else{
+_2b[2]=Number(v);
+}
+break;
+case "a":
+var am=_23.am||_26.am;
+var pm=_23.pm||_26.pm;
+if(!_23.strict){
+var _32=/\./g;
+v=v.replace(_32,"").toLowerCase();
+am=am.replace(_32,"").toLowerCase();
+pm=pm.replace(_32,"").toLowerCase();
+}
+if(_23.strict&&v!=am&&v!=pm){
+return false;
+}
+_2c=(v==pm)?"p":(v==am)?"a":"";
+break;
+case "K":
+if(v==24){
+v=0;
+}
+case "h":
+case "H":
+case "k":
+_2b[3]=Number(v);
+break;
+case "m":
+_2b[4]=Number(v);
+break;
+case "s":
+_2b[5]=Number(v);
+break;
+case "S":
+_2b[6]=Number(v);
+}
+return true;
+});
+var _33=+_2b[3];
+if(_2c==="p"&&_33<12){
+_2b[3]=_33+12;
+}else{
+if(_2c==="a"&&_33==12){
+_2b[3]=0;
+}
+}
+var _34=new dojox.date.hebrew.Date(_2b[0],_2b[1],_2b[2],_2b[3],_2b[4],_2b[5],_2b[6]);
+if(_2d<3&&_2b[1]>=5&&!_34.isLeapYear(_34.getFullYear())){
+_34.setMonth(_2b[1]+1);
+}
+return _34;
+};
+function _15(_35,_36,_37,_38){
+var _39=function(x){
+return x;
+};
+_36=_36||_39;
+_37=_37||_39;
+_38=_38||_39;
+var _3a=_35.match(/(''|[^'])+/g);
+var _3b=_35.charAt(0)=="'";
+dojo.forEach(_3a,function(_3c,i){
+if(!_3c){
+_3a[i]="";
+}else{
+_3a[i]=(_3b?_37:_36)(_3c);
+_3b=!_3b;
+}
+});
+return _38(_3a.join(""));
+};
+function _21(_3d,_3e,_3f,_40){
+_40=dojo.regexp.escapeString(_40);
+var _41=dojo.i18n.normalizeLocale(_3f.locale);
+return _40.replace(/([a-z])\1*/ig,function(_42){
+var s;
+var c=_42.charAt(0);
+var l=_42.length;
+var p2="",p3="";
+if(_3f.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="\\S+";
+break;
+case "M":
+if(_41.match("^he(?:-.+)?$")){
+s=(l>2)?"\\S+ ?\\S+":"\\S{1,4}";
+}else{
+s=(l>2)?"\\S+ ?\\S+":p2+"[1-9]|1[0-2]";
+}
+break;
+case "d":
+if(_41.match("^he(?:-.+)?$")){
+s="\\S['\"'׳]{1,2}\\S?";
+}else{
+s="[12]\\d|"+p2+"[1-9]|30";
+}
+break;
+case "E":
+if(_41.match("^he(?:-.+)?$")){
+s=(l>3)?"\\S+ ?\\S+":"\\S";
+}else{
+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=p2+"\\d|[0-5]\\d";
+break;
+case "S":
+s="\\d{"+l+"}";
+break;
+case "a":
+var am=_3f.am||_3e.am||"AM";
+var pm=_3f.pm||_3e.pm||"PM";
+if(_3f.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(_3d){
+_3d.push(_42);
+}
+return "("+s+")";
+}).replace(/[\xa0 ]/g,"[\\s\\xa0]");
+};
+})();
+(function(){
+var _43=[];
+dojox.date.hebrew.locale.addCustomFormats=function(_44,_45){
+_43.push({pkg:_44,name:_45});
+};
+dojox.date.hebrew.locale._getHebrewBundle=function(_46){
+var _47={};
+dojo.forEach(_43,function(_48){
+var _49=dojo.i18n.getLocalization(_48.pkg,_48.name,_46);
+_47=dojo.mixin(_47,_49);
+},this);
+return _47;
+};
+})();
+dojox.date.hebrew.locale.addCustomFormats("dojo.cldr","hebrew");
+dojox.date.hebrew.locale.getNames=function(_4a,_4b,_4c,_4d,_4e){
+var _4f;
+var _50=dojox.date.hebrew.locale._getHebrewBundle;
+var _51=[_4a,_4c,_4b];
+if(_4c=="standAlone"){
+var key=_51.join("-");
+_4f=_50(_4d)[key];
+if(_4f===_50("ROOT")[key]){
+_4f=undefined;
+}
+}
+_51[1]="format";
+return (_4f||_50(_4d)[_51.join("-")]).concat();
+};
+}
diff --git a/dojox/date/hebrew/numerals.js b/dojox/date/hebrew/numerals.js
new file mode 100644
index 0000000..a4c0805
--- /dev/null
+++ b/dojox/date/hebrew/numerals.js
@@ -0,0 +1,103 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.date.hebrew.numerals"]){
+dojo._hasResource["dojox.date.hebrew.numerals"]=true;
+dojo.provide("dojox.date.hebrew.numerals");
+(function(){
+var _1="אבגדהוזחט";
+var _2="יכלמנסעפצ";
+var _3="קרשת";
+var _4=function(_5,_6){
+_5=_5.replace("יה","טו").replace("יו","טז");
+if(!_6){
+var _7=_5.length;
+if(_7>1){
+_5=_5.substr(0,_7-1)+"\""+_5.charAt(_7-1);
+}else{
+_5+="׳";
+}
+}
+return _5;
+};
+var _8=function(_9){
+var _a=0;
+dojo.forEach(_9,function(ch){
+var i;
+if((i=_1.indexOf(ch))!=-1){
+_a+=++i;
+}else{
+if((i=_2.indexOf(ch))!=-1){
+_a+=10*++i;
+}else{
+if((i=_3.indexOf(ch))!=-1){
+_a+=100*++i;
+}
+}
+}
+});
+return _a;
+};
+var _b=function(_c){
+var _d="",n=4,j=9;
+while(_c){
+if(_c>=n*100){
+_d+=_3.charAt(n-1);
+_c-=n*100;
+continue;
+}else{
+if(n>1){
+n--;
+continue;
+}else{
+if(_c>=j*10){
+_d+=_2.charAt(j-1);
+_c-=j*10;
+}else{
+if(j>1){
+j--;
+continue;
+}else{
+if(_c>0){
+_d+=_1.charAt(_c-1);
+_c=0;
+}
+}
+}
+}
+}
+}
+return _d;
+};
+dojox.date.hebrew.numerals.getYearHebrewLetters=function(_e){
+var y=_e%1000;
+if(!y){
+throw new Error("Hebrew year "+_e+" is not in range 5001-5999");
+}
+return _4(_b(y));
+};
+dojox.date.hebrew.numerals.parseYearHebrewLetters=function(_f){
+return _8(_f)+5000;
+};
+dojox.date.hebrew.numerals.getDayHebrewLetters=function(day,_10){
+return _4(_b(day),_10);
+};
+dojox.date.hebrew.numerals.parseDayHebrewLetters=function(day){
+return _8(day);
+};
+dojox.date.hebrew.numerals.getMonthHebrewLetters=function(_11){
+return _4(_b(_11+1));
+};
+dojox.date.hebrew.numerals.parseMonthHebrewLetters=function(_12){
+var _13=dojox.date.hebrew.numerals.parseDayHebrewLetters(_12)-1;
+if(_13==-1||_13>12){
+throw new Error("The month name is incorrect , month = "+_13);
+}
+return _13;
+};
+})();
+}
diff --git a/dojox/date/islamic.js b/dojox/date/islamic.js
new file mode 100644
index 0000000..6f211c5
--- /dev/null
+++ b/dojox/date/islamic.js
@@ -0,0 +1,185 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.date.islamic"]){
+dojo._hasResource["dojox.date.islamic"]=true;
+dojo.provide("dojox.date.islamic");
+dojo.experimental("dojox.date.islamic");
+dojo.require("dojox.date.islamic.Date");
+dojo.require("dojo.date");
+dojox.date.islamic.getDaysInMonth=function(_1){
+return _1.getDaysInIslamicMonth(_1.getMonth(),_1.getFullYear());
+};
+dojox.date.islamic.compare=function(_2,_3,_4){
+if(_2 instanceof dojox.date.islamic.Date){
+_2=_2.toGregorian();
+}
+if(_3 instanceof dojox.date.islamic.Date){
+_3=_3.toGregorian();
+}
+return dojo.date.compare.apply(null,arguments);
+};
+dojox.date.islamic.add=function(_5,_6,_7){
+var _8=new dojox.date.islamic.Date(_5);
+switch(_6){
+case "day":
+_8.setDate(_5.getDate()+_7);
+break;
+case "weekday":
+var _9=_5.getDay();
+if(((_9+_7)<5)&&((_9+_7)>0)){
+_8.setDate(_5.getDate()+_7);
+}else{
+var _a=0,_b=0;
+if(_9==5){
+_9=4;
+_b=(_7>0)?-1:1;
+}else{
+if(_9==6){
+_9=4;
+_b=(_7>0)?-2:2;
+}
+}
+var _c=(_7>0)?(5-_9-1):-_9;
+var _d=_7-_c;
+var _e=parseInt(_d/5);
+if(_d%5!=0){
+_a=(_7>0)?2:-2;
+}
+_a=_a+_e*7+_d%5+_c;
+_8.setDate(_5.getDate()+_a+_b);
+}
+break;
+case "year":
+_8.setFullYear(_5.getFullYear()+_7);
+break;
+case "week":
+_7*=7;
+_8.setDate(_5.getDate()+_7);
+break;
+case "month":
+var _f=_5.getMonth();
+_8.setMonth(_f+_7);
+break;
+case "hour":
+_8.setHours(_5.getHours()+_7);
+break;
+case "minute":
+_8.setMinutes(_5.getMinutes()+_7);
+break;
+case "second":
+_8.setSeconds(_5.getSeconds()+_7);
+break;
+case "millisecond":
+_8.setMilliseconds(_5.getMilliseconds()+_7);
+break;
+}
+return _8;
+};
+dojox.date.islamic.difference=function(_10,_11,_12){
+_11=_11||new dojox.date.islamic.Date();
+_12=_12||"day";
+var _13=_10.getFullYear()-_11.getFullYear();
+var _14=1;
+switch(_12){
+case "weekday":
+var _15=Math.round(dojox.date.islamic.difference(_10,_11,"day"));
+var _16=parseInt(dojox.date.islamic.difference(_10,_11,"week"));
+var mod=_15%7;
+if(mod==0){
+_15=_16*5;
+}else{
+var adj=0;
+var _17=_11.getDay();
+var _18=_10.getDay();
+_16=parseInt(_15/7);
+mod=_15%7;
+var _19=new dojox.date.islamic.Date(_11);
+_19.setDate(_19.getDate()+(_16*7));
+var _1a=_19.getDay();
+if(_15>0){
+switch(true){
+case _17==5:
+adj=-1;
+break;
+case _17==6:
+adj=0;
+break;
+case _18==5:
+adj=-1;
+break;
+case _18==6:
+adj=-2;
+break;
+case (_1a+mod)>5:
+adj=-2;
+}
+}else{
+if(_15<0){
+switch(true){
+case _17==5:
+adj=0;
+break;
+case _17==6:
+adj=1;
+break;
+case _18==5:
+adj=2;
+break;
+case _18==6:
+adj=1;
+break;
+case (_1a+mod)<0:
+adj=2;
+}
+}
+}
+_15+=adj;
+_15-=(_16*2);
+}
+_14=_15;
+break;
+case "year":
+_14=_13;
+break;
+case "month":
+var _1b=(_10.toGregorian()>_11.toGregorian())?_10:_11;
+var _1c=(_10.toGregorian()>_11.toGregorian())?_11:_10;
+var _1d=_1b.getMonth();
+var _1e=_1c.getMonth();
+if(_13==0){
+_14=_1b.getMonth()-_1c.getMonth();
+}else{
+_14=12-_1e;
+_14+=_1d;
+var i=_1c.getFullYear()+1;
+var e=_1b.getFullYear();
+for(i;i<e;i++){
+_14+=12;
+}
+}
+if(_10.toGregorian()<_11.toGregorian()){
+_14=-_14;
+}
+break;
+case "week":
+_14=parseInt(dojox.date.islamic.difference(_10,_11,"day")/7);
+break;
+case "day":
+_14/=24;
+case "hour":
+_14/=60;
+case "minute":
+_14/=60;
+case "second":
+_14/=1000;
+case "millisecond":
+_14*=_10.toGregorian().getTime()-_11.toGregorian().getTime();
+}
+return Math.round(_14);
+};
+}
diff --git a/dojox/date/islamic/Date.js b/dojox/date/islamic/Date.js
new file mode 100644
index 0000000..e058e59
--- /dev/null
+++ b/dojox/date/islamic/Date.js
@@ -0,0 +1,267 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.date.islamic.Date"]){
+dojo._hasResource["dojox.date.islamic.Date"]=true;
+dojo.provide("dojox.date.islamic.Date");
+dojo.experimental("dojox.date.islamic.Date");
+dojo.require("dojo.date");
+dojo.requireLocalization("dojo.cldr","islamic",null,"ROOT,ar,he");
+dojo.declare("dojox.date.islamic.Date",null,{_date:0,_month:0,_year:0,_hours:0,_minutes:0,_seconds:0,_milliseconds:0,_day:0,_GREGORIAN_EPOCH:1721425.5,_ISLAMIC_EPOCH:1948439.5,constructor:function(){
+var _1=arguments.length;
+if(!_1){
+this.fromGregorian(new Date());
+}else{
+if(_1==1){
+var _2=arguments[0];
+if(typeof _2=="number"){
+_2=new Date(_2);
+}
+if(_2 instanceof Date){
+this.fromGregorian(_2);
+}else{
+if(_2==""){
+this._date=new Date("");
+}else{
+this._year=_2._year;
+this._month=_2._month;
+this._date=_2._date;
+this._hours=_2._hours;
+this._minutes=_2._minutes;
+this._seconds=_2._seconds;
+this._milliseconds=_2._milliseconds;
+}
+}
+}else{
+if(_1>=3){
+this._year+=arguments[0];
+this._month+=arguments[1];
+this._date+=arguments[2];
+this._hours+=arguments[3]||0;
+this._minutes+=arguments[4]||0;
+this._seconds+=arguments[5]||0;
+this._milliseconds+=arguments[6]||0;
+}
+}
+}
+},getDate:function(){
+return this._date;
+},getMonth:function(){
+return this._month;
+},getFullYear:function(){
+return this._year;
+},getDay:function(){
+return this.toGregorian().getDay();
+},getHours:function(){
+return this._hours;
+},getMinutes:function(){
+return this._minutes;
+},getSeconds:function(){
+return this._seconds;
+},getMilliseconds:function(){
+return this._milliseconds;
+},setDate:function(_3){
+_3=parseInt(_3);
+if(_3>0&&_3<=this.getDaysInIslamicMonth(this._month,this._year)){
+this._date=_3;
+}else{
+var _4;
+if(_3>0){
+for(_4=this.getDaysInIslamicMonth(this._month,this._year);_3>_4;_3-=_4,_4=this.getDaysInIslamicMonth(this._month,this._year)){
+this._month++;
+if(this._month>=12){
+this._year++;
+this._month-=12;
+}
+}
+this._date=_3;
+}else{
+for(_4=this.getDaysInIslamicMonth((this._month-1)>=0?(this._month-1):11,((this._month-1)>=0)?this._year:this._year-1);_3<=0;_4=this.getDaysInIslamicMonth((this._month-1)>=0?(this._month-1):11,((this._month-1)>=0)?this._year:this._year-1)){
+this._month--;
+if(this._month<0){
+this._year--;
+this._month+=12;
+}
+_3+=_4;
+}
+this._date=_3;
+}
+}
+return this;
+},setFullYear:function(_5){
+this._year=+_5;
+},setMonth:function(_6){
+this._year+=Math.floor(_6/12);
+this._month=Math.floor(_6%12);
+},setHours:function(){
+var _7=arguments.length;
+var _8=0;
+if(_7>=1){
+_8=parseInt(arguments[0]);
+}
+if(_7>=2){
+this._minutes=parseInt(arguments[1]);
+}
+if(_7>=3){
+this._seconds=parseInt(arguments[2]);
+}
+if(_7==4){
+this._milliseconds=parseInt(arguments[3]);
+}
+while(_8>=24){
+this._date++;
+var _9=this.getDaysInIslamicMonth(this._month,this._year);
+if(this._date>_9){
+this._month++;
+if(this._month>=12){
+this._year++;
+this._month-=12;
+}
+this._date-=_9;
+}
+_8-=24;
+}
+this._hours=_8;
+},setMinutes:function(_a){
+while(_a>=60){
+this._hours++;
+if(this._hours>=24){
+this._date++;
+this._hours-=24;
+var _b=this.getDaysInIslamicMonth(this._month,this._year);
+if(this._date>_b){
+this._month++;
+if(this._month>=12){
+this._year++;
+this._month-=12;
+}
+this._date-=_b;
+}
+}
+_a-=60;
+}
+this._minutes=_a;
+},setSeconds:function(_c){
+while(_c>=60){
+this._minutes++;
+if(this._minutes>=60){
+this._hours++;
+this._minutes-=60;
+if(this._hours>=24){
+this._date++;
+this._hours-=24;
+var _d=this.getDaysInIslamicMonth(this._month,this._year);
+if(this._date>_d){
+this._month++;
+if(this._month>=12){
+this._year++;
+this._month-=12;
+}
+this._date-=_d;
+}
+}
+}
+_c-=60;
+}
+this._seconds=_c;
+},setMilliseconds:function(_e){
+while(_e>=1000){
+this.setSeconds++;
+if(this.setSeconds>=60){
+this._minutes++;
+this.setSeconds-=60;
+if(this._minutes>=60){
+this._hours++;
+this._minutes-=60;
+if(this._hours>=24){
+this._date++;
+this._hours-=24;
+var _f=this.getDaysInIslamicMonth(this._month,this._year);
+if(this._date>_f){
+this._month++;
+if(this._month>=12){
+this._year++;
+this._month-=12;
+}
+this._date-=_f;
+}
+}
+}
+}
+_e-=1000;
+}
+this._milliseconds=_e;
+},toString:function(){
+var x=new Date();
+x.setHours(this._hours);
+x.setMinutes(this._minutes);
+x.setSeconds(this._seconds);
+x.setMilliseconds(this._milliseconds);
+return (this._month+" "+this._date+" "+this._year+" "+x.toTimeString());
+},toGregorian:function(){
+var _10=this._year;
+var _11=this._month;
+var _12=this._date;
+var _13=_12+Math.ceil(29.5*_11)+(_10-1)*354+Math.floor((3+(11*_10))/30)+this._ISLAMIC_EPOCH-1;
+var wjd=Math.floor(_13-0.5)+0.5,_14=wjd-this._GREGORIAN_EPOCH,_15=Math.floor(_14/146097),dqc=this._mod(_14,146097),_16=Math.floor(dqc/36524),_17=this._mod(dqc,36524),_18=Math.floor(_17/1461),_19=this._mod(_17,1461),_1a=Math.floor(_19/365),_1b=(_15*400)+(_16*100)+(_18*4)+_1a;
+if(!(_16==4||_1a==4)){
+_1b++;
+}
+var _1c=this._GREGORIAN_EPOCH+(365*(_1b-1))+Math.floor((_1b-1)/4)-(Math.floor((_1b-1)/100))+Math.floor((_1b-1)/400);
+var _1d=wjd-_1c;
+var tjd=(this._GREGORIAN_EPOCH-1)+(365*(_1b-1))+Math.floor((_1b-1)/4)-(Math.floor((_1b-1)/100))+Math.floor((_1b-1)/400)+Math.floor((739/12)+((dojo.date.isLeapYear(new Date(_1b,3,1))?-1:-2))+1);
+var _1e=((wjd<tjd)?0:(dojo.date.isLeapYear(new Date(_1b,3,1))?1:2));
+var _1f=Math.floor((((_1d+_1e)*12)+373)/367);
+var _20=(this._GREGORIAN_EPOCH-1)+(365*(_1b-1))+Math.floor((_1b-1)/4)-(Math.floor((_1b-1)/100))+Math.floor((_1b-1)/400)+Math.floor((((367*_1f)-362)/12)+((_1f<=2)?0:(dojo.date.isLeapYear(new Date(_1b,_1f,1))?-1:-2))+1);
+var day=(wjd-_20);
+var _21=new Date(_1b,_1f-1,day);
+_21.setHours(this._hours);
+_21.setMilliseconds(this._milliseconds);
+_21.setMinutes(this._minutes);
+_21.setSeconds(this._seconds);
+return _21;
+},fromGregorian:function(_22){
+var _23=new Date(_22);
+var _24=_23.getFullYear(),_25=_23.getMonth(),_26=_23.getDate();
+var _27=(this._GREGORIAN_EPOCH-1)+(365*(_24-1))+Math.floor((_24-1)/4)+(-Math.floor((_24-1)/100))+Math.floor((_24-1)/400)+Math.floor((((367*(_25+1))-362)/12)+(((_25+1)<=2)?0:(dojo.date.isLeapYear(_23)?-1:-2))+_26)+(Math.floor(_23.getSeconds()+60*(_23.getMinutes()+60*_23.getHours())+0.5)/86400);
+_27=Math.floor(_27)+0.5;
+var _28=_27-1948440;
+var _29=Math.floor((30*_28+10646)/10631);
+var _2a=Math.ceil((_28-29-this._yearStart(_29))/29.5);
+_2a=Math.min(_2a,11);
+var _2b=Math.ceil(_28-this._monthStart(_29,_2a))+1;
+this._date=_2b;
+this._month=_2a;
+this._year=_29;
+this._hours=_23.getHours();
+this._minutes=_23.getMinutes();
+this._seconds=_23.getSeconds();
+this._milliseconds=_23.getMilliseconds();
+this._day=_23.getDay();
+return this;
+},valueOf:function(){
+return this.toGregorian().valueOf();
+},_yearStart:function(_2c){
+return (_2c-1)*354+Math.floor((3+11*_2c)/30);
+},_monthStart:function(_2d,_2e){
+return Math.ceil(29.5*_2e)+(_2d-1)*354+Math.floor((3+11*_2d)/30);
+},_civilLeapYear:function(_2f){
+return (14+11*_2f)%30<11;
+},getDaysInIslamicMonth:function(_30,_31){
+var _32=0;
+_32=29+((_30+1)%2);
+if(_30==11&&this._civilLeapYear(_31)){
+_32++;
+}
+return _32;
+},_mod:function(a,b){
+return a-(b*Math.floor(a/b));
+}});
+dojox.date.islamic.Date.getDaysInIslamicMonth=function(_33){
+return new dojox.date.islamic.Date().getDaysInIslamicMonth(_33.getMonth(),_33.getFullYear());
+};
+}
diff --git a/dojox/date/islamic/locale.js b/dojox/date/islamic/locale.js
new file mode 100644
index 0000000..7b17742
--- /dev/null
+++ b/dojox/date/islamic/locale.js
@@ -0,0 +1,374 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.date.islamic.locale"]){
+dojo._hasResource["dojox.date.islamic.locale"]=true;
+dojo.provide("dojox.date.islamic.locale");
+dojo.experimental("dojox.date.islamic.locale");
+dojo.require("dojox.date.islamic.Date");
+dojo.require("dojo.regexp");
+dojo.require("dojo.string");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dojo.cldr","islamic",null,"ROOT,ar,he");
+(function(){
+function _1(_2,_3,_4,_5,_6){
+return _6.replace(/([a-z])\1*/ig,function(_7){
+var s,_8;
+var c=_7.charAt(0);
+var l=_7.length;
+var _9=["abbr","wide","narrow"];
+switch(c){
+case "G":
+s=_3["eraAbbr"][0];
+break;
+case "y":
+s=String(_2.getFullYear());
+break;
+case "M":
+var m=_2.getMonth();
+if(l<3){
+s=m+1;
+_8=true;
+}else{
+var _a=["months","format",_9[l-3]].join("-");
+s=_3[_a][m];
+}
+break;
+case "d":
+s=_2.getDate(true);
+_8=true;
+break;
+case "E":
+var d=_2.getDay();
+if(l<3){
+s=d+1;
+_8=true;
+}else{
+var _b=["days","format",_9[l-3]].join("-");
+s=_3[_b][d];
+}
+break;
+case "a":
+var _c=(_2.getHours()<12)?"am":"pm";
+s=_3[_c];
+break;
+case "h":
+case "H":
+case "K":
+case "k":
+var h=_2.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;
+}
+_8=true;
+break;
+case "m":
+s=_2.getMinutes();
+_8=true;
+break;
+case "s":
+s=_2.getSeconds();
+_8=true;
+break;
+case "S":
+s=Math.round(_2.getMilliseconds()*Math.pow(10,l-3));
+_8=true;
+break;
+default:
+throw new Error("dojox.date.islamic.locale.formatPattern: invalid pattern char: "+_6);
+}
+if(_8){
+s=dojo.string.pad(s,l);
+}
+return s;
+});
+};
+dojox.date.islamic.locale.format=function(_d,_e){
+_e=_e||{};
+var _f=dojo.i18n.normalizeLocale(_e.locale);
+var _10=_e.formatLength||"short";
+var _11=dojox.date.islamic.locale._getIslamicBundle(_f);
+var str=[];
+var _12=dojo.hitch(this,_1,_d,_11,_f,_e.fullYear);
+if(_e.selector=="year"){
+var _13=_d.getFullYear();
+return _13;
+}
+if(_e.selector!="time"){
+var _14=_e.datePattern||_11["dateFormat-"+_10];
+if(_14){
+str.push(_15(_14,_12));
+}
+}
+if(_e.selector!="date"){
+var _16=_e.timePattern||_11["timeFormat-"+_10];
+if(_16){
+str.push(_15(_16,_12));
+}
+}
+var _17=str.join(" ");
+return _17;
+};
+dojox.date.islamic.locale.regexp=function(_18){
+return dojox.date.islamic.locale._parseInfo(_18).regexp;
+};
+dojox.date.islamic.locale._parseInfo=function(_19){
+_19=_19||{};
+var _1a=dojo.i18n.normalizeLocale(_19.locale);
+var _1b=dojox.date.islamic.locale._getIslamicBundle(_1a);
+var _1c=_19.formatLength||"short";
+var _1d=_19.datePattern||_1b["dateFormat-"+_1c];
+var _1e=_19.timePattern||_1b["timeFormat-"+_1c];
+var _1f;
+if(_19.selector=="date"){
+_1f=_1d;
+}else{
+if(_19.selector=="time"){
+_1f=_1e;
+}else{
+_1f=(typeof (_1e)=="undefined")?_1d:_1d+" "+_1e;
+}
+}
+var _20=[];
+var re=_15(_1f,dojo.hitch(this,_21,_20,_1b,_19));
+return {regexp:re,tokens:_20,bundle:_1b};
+};
+dojox.date.islamic.locale.parse=function(_22,_23){
+_22=_22.replace(/[\u200E\u200F\u202A-\u202E]/g,"");
+if(!_23){
+_23={};
+}
+var _24=dojox.date.islamic.locale._parseInfo(_23);
+var _25=_24.tokens,_26=_24.bundle;
+var re=new RegExp("^"+_24.regexp+"$");
+var _27=re.exec(_22);
+var _28=dojo.i18n.normalizeLocale(_23.locale);
+if(!_27){
+return null;
+}
+var _29,_2a;
+var _2b=[1389,0,1,0,0,0,0];
+var _2c="";
+var _2d=0;
+var _2e=["abbr","wide","narrow"];
+var _2f=dojo.every(_27,function(v,i){
+if(!i){
+return true;
+}
+var _30=_25[i-1];
+var l=_30.length;
+switch(_30.charAt(0)){
+case "y":
+_2b[0]=Number(v);
+break;
+case "M":
+if(l>2){
+var _31=_26["months-format-"+_2e[l-3]].concat();
+if(!_23.strict){
+v=v.replace(".","").toLowerCase();
+_31=dojo.map(_31,function(s){
+return s?s.replace(".","").toLowerCase():s;
+});
+}
+v=dojo.indexOf(_31,v);
+if(v==-1){
+return false;
+}
+_2d=l;
+}else{
+v--;
+}
+_2b[1]=Number(v);
+break;
+case "D":
+_2b[1]=0;
+case "d":
+_2b[2]=Number(v);
+break;
+case "a":
+var am=_23.am||_26.am;
+var pm=_23.pm||_26.pm;
+if(!_23.strict){
+var _32=/\./g;
+v=v.replace(_32,"").toLowerCase();
+am=am.replace(_32,"").toLowerCase();
+pm=pm.replace(_32,"").toLowerCase();
+}
+if(_23.strict&&v!=am&&v!=pm){
+return false;
+}
+_2c=(v==pm)?"p":(v==am)?"a":"";
+break;
+case "K":
+if(v==24){
+v=0;
+}
+case "h":
+case "H":
+case "k":
+_2b[3]=Number(v);
+break;
+case "m":
+_2b[4]=Number(v);
+break;
+case "s":
+_2b[5]=Number(v);
+break;
+case "S":
+_2b[6]=Number(v);
+}
+return true;
+});
+var _33=+_2b[3];
+if(_2c==="p"&&_33<12){
+_2b[3]=_33+12;
+}else{
+if(_2c==="a"&&_33==12){
+_2b[3]=0;
+}
+}
+var _34=new dojox.date.islamic.Date(_2b[0],_2b[1],_2b[2],_2b[3],_2b[4],_2b[5],_2b[6]);
+return _34;
+};
+function _15(_35,_36,_37,_38){
+var _39=function(x){
+return x;
+};
+_36=_36||_39;
+_37=_37||_39;
+_38=_38||_39;
+var _3a=_35.match(/(''|[^'])+/g);
+var _3b=_35.charAt(0)=="'";
+dojo.forEach(_3a,function(_3c,i){
+if(!_3c){
+_3a[i]="";
+}else{
+_3a[i]=(_3b?_37:_36)(_3c);
+_3b=!_3b;
+}
+});
+return _38(_3a.join(""));
+};
+function _21(_3d,_3e,_3f,_40){
+_40=dojo.regexp.escapeString(_40);
+var _41=dojo.i18n.normalizeLocale(_3f.locale);
+return _40.replace(/([a-z])\1*/ig,function(_42){
+var s;
+var c=_42.charAt(0);
+var l=_42.length;
+var p2="",p3="";
+if(_3f.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+";
+break;
+case "M":
+s=(l>2)?"\\S+":p2+"[1-9]|1[0-2]";
+break;
+case "d":
+s="[12]\\d|"+p2+"[1-9]|3[01]";
+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=p2+"\\d|[0-5]\\d";
+break;
+case "S":
+s="\\d{"+l+"}";
+break;
+case "a":
+var am=_3f.am||_3e.am||"AM";
+var pm=_3f.pm||_3e.pm||"PM";
+if(_3f.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(_3d){
+_3d.push(_42);
+}
+return "("+s+")";
+}).replace(/[\xa0 ]/g,"[\\s\\xa0]");
+};
+})();
+(function(){
+var _43=[];
+dojox.date.islamic.locale.addCustomFormats=function(_44,_45){
+_43.push({pkg:_44,name:_45});
+};
+dojox.date.islamic.locale._getIslamicBundle=function(_46){
+var _47={};
+dojo.forEach(_43,function(_48){
+var _49=dojo.i18n.getLocalization(_48.pkg,_48.name,_46);
+_47=dojo.mixin(_47,_49);
+},this);
+return _47;
+};
+})();
+dojox.date.islamic.locale.addCustomFormats("dojo.cldr","islamic");
+dojox.date.islamic.locale.getNames=function(_4a,_4b,_4c,_4d,_4e){
+var _4f;
+var _50=dojox.date.islamic.locale._getIslamicBundle;
+var _51=[_4a,_4c,_4b];
+if(_4c=="standAlone"){
+var key=_51.join("-");
+_4f=_50(_4d)[key];
+if(_4f===_50("ROOT")[key]){
+_4f=undefined;
+}
+}
+_51[1]="format";
+return (_4f||_50(_4d)[_51.join("-")]).concat();
+};
+dojox.date.islamic.locale.weekDays=dojox.date.islamic.locale.getNames("days","wide","format");
+dojox.date.islamic.locale.months=dojox.date.islamic.locale.getNames("months","wide","format");
+}
diff --git a/dojox/date/php.js b/dojox/date/php.js
index 867c445..6b305cb 100644
--- a/dojox/date/php.js
+++ b/dojox/date/php.js
@@ -14,32 +14,32 @@ dojox.date.php.format=function(_1,_2){
 var df=new dojox.date.php.DateFormat(_2);
 return df.format(_1);
 };
-dojox.date.php.DateFormat=function(_4){
+dojox.date.php.DateFormat=function(_3){
 if(!this.regex){
-var _5=[];
-for(var _6 in this.constructor.prototype){
-if(dojo.isString(_6)&&_6.length==1&&dojo.isFunction(this[_6])){
-_5.push(_6);
+var _4=[];
+for(var _5 in this.constructor.prototype){
+if(dojo.isString(_5)&&_5.length==1&&dojo.isFunction(this[_5])){
+_4.push(_5);
 }
 }
-this.constructor.prototype.regex=new RegExp("(?:(\\\\.)|(["+_5.join("")+"]))","g");
-}
-var _7=[];
-this.tokens=dojox.string.tokenize(_4,this.regex,function(_8,_9,i){
-if(_9){
-_7.push([i,_9]);
-return _9;
+this.constructor.prototype.regex=new RegExp("(?:(\\\\.)|(["+_4.join("")+"]))","g");
 }
+var _6=[];
+this.tokens=dojox.string.tokenize(_3,this.regex,function(_7,_8,i){
 if(_8){
-return _8.charAt(1);
+_6.push([i,_8]);
+return _8;
+}
+if(_7){
+return _7.charAt(1);
 }
 });
-this.replacements=_7;
+this.replacements=_6;
 };
-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(_b){
-this.date=_b;
-for(var i=0,_d;_d=this.replacements[i];i++){
-this.tokens[_d[0]]=this[_d[1]]();
+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(_9){
+this.date=_9;
+for(var i=0,_a;_a=this.replacements[i];i++){
+this.tokens[_a[0]]=this[_a[1]]();
 }
 return this.tokens.join("");
 },d:function(){
@@ -76,19 +76,19 @@ return "th";
 },w:function(){
 return this.date.getDay()+"";
 },z:function(){
-var _10=this.date.getTime()-new Date(this.date.getFullYear(),0,1).getTime();
-return Math.floor(_10/86400000)+"";
+var _b=this.date.getTime()-new Date(this.date.getFullYear(),0,1).getTime();
+return Math.floor(_b/86400000)+"";
 },W:function(){
-var _11;
-var _12=new Date(this.date.getFullYear(),0,1).getDay()+1;
+var _c;
+var _d=new Date(this.date.getFullYear(),0,1).getDay()+1;
 var w=this.date.getDay()+1;
 var z=parseInt(this.z());
-if(z<=(8-_12)&&_12>4){
-var _15=new Date(this.date.getFullYear()-1,this.date.getMonth(),this.date.getDate());
-if(_12==5||(_12==6&&dojo.date.isLeapYear(_15))){
-_11=53;
+if(z<=(8-_d)&&_d>4){
+var _e=new Date(this.date.getFullYear()-1,this.date.getMonth(),this.date.getDate());
+if(_d==5||(_d==6&&dojo.date.isLeapYear(_e))){
+_c=53;
 }else{
-_11=52;
+_c=52;
 }
 }else{
 var i;
@@ -98,16 +98,16 @@ i=366;
 i=365;
 }
 if((i-z)<(4-w)){
-_11=1;
+_c=1;
 }else{
-var j=z+(7-w)+(_12-1);
-_11=Math.ceil(j/7);
-if(_12>4){
---_11;
+var j=z+(7-w)+(_d-1);
+_c=Math.ceil(j/7);
+if(_d>4){
+--_c;
 }
 }
 }
-return _11;
+return _c;
 },F:function(){
 return this.months[this.date.getMonth()];
 },m:function(){
@@ -131,13 +131,13 @@ return this.date.getHours()>=12?"pm":"am";
 },b:function(){
 return this.a().toUpperCase();
 },B:function(){
-var off=this.date.getTimezoneOffset()+60;
-var _1a=(this.date.getHours()*3600)+(this.date.getMinutes()*60)+this.getSeconds()+(off*60);
-var _1b=Math.abs(Math.floor(_1a/86.4)%1000)+"";
-while(_1b.length<2){
-_1b="0"+_1b;
+var _f=this.date.getTimezoneOffset()+60;
+var _10=(this.date.getHours()*3600)+(this.date.getMinutes()*60)+this.getSeconds()+(_f*60);
+var _11=Math.abs(Math.floor(_10/86.4)%1000)+"";
+while(_11.length<2){
+_11="0"+_11;
 }
-return _1b;
+return _11;
 },g:function(){
 return (this.date.getHours()>12)?this.date.getHours()-12+"":this.date.getHours()+"";
 },G:function(){
@@ -149,25 +149,25 @@ return (g.length==1)?"0"+g:g;
 var G=this.G();
 return (G.length==1)?"0"+G:G;
 },i:function(){
-var _1e=this.date.getMinutes()+"";
-return (_1e.length==1)?"0"+_1e:_1e;
+var _12=this.date.getMinutes()+"";
+return (_12.length==1)?"0"+_12:_12;
 },s:function(){
-var _1f=this.date.getSeconds()+"";
-return (_1f.length==1)?"0"+_1f:_1f;
+var _13=this.date.getSeconds()+"";
+return (_13.length==1)?"0"+_13:_13;
 },e:function(){
 return dojo.date.getTimezoneName(this.date);
 },I:function(){
 },O:function(){
 var off=Math.abs(this.date.getTimezoneOffset());
-var _21=Math.floor(off/60)+"";
-var _22=(off%60)+"";
-if(_21.length==1){
-_21="0"+_21;
+var _14=Math.floor(off/60)+"";
+var _15=(off%60)+"";
+if(_14.length==1){
+_14="0"+_14;
 }
-if(_22.length==1){
-_21="0"+_22;
+if(_15.length==1){
+_14="0"+_15;
 }
-return ((this.date.getTimezoneOffset()<0)?"+":"-")+_21+_22;
+return ((this.date.getTimezoneOffset()<0)?"+":"-")+_14+_15;
 },P:function(){
 var O=this.O();
 return O.substring(0,2)+":"+O.substring(2,4);
diff --git a/dojox/date/posix.js b/dojox/date/posix.js
index bcbbdab..246234c 100644
--- a/dojox/date/posix.js
+++ b/dojox/date/posix.js
@@ -13,12 +13,12 @@ dojo.require("dojo.date.locale");
 dojo.require("dojo.string");
 dojox.date.posix.strftime=function(_1,_2,_3){
 var _4=null;
-var _=function(s,n){
+var _5=function(s,n){
 return dojo.string.pad(s,n||2,_4||"0");
 };
-var _8=dojo.date.locale._getGregorianBundle(_3);
-var $=function(_a){
-switch(_a){
+var _6=dojo.date.locale._getGregorianBundle(_3);
+var $=function(_7){
+switch(_7){
 case "a":
 return dojo.date.locale.getNames("days","abbr","format",_3)[_1.getDay()];
 case "A":
@@ -31,21 +31,21 @@ return dojo.date.locale.getNames("months","wide","format",_3)[_1.getMonth()];
 case "c":
 return dojo.date.locale.format(_1,{formatLength:"full",locale:_3});
 case "C":
-return _(Math.floor(_1.getFullYear()/100));
+return _5(Math.floor(_1.getFullYear()/100));
 case "d":
-return _(_1.getDate());
+return _5(_1.getDate());
 case "D":
 return $("m")+"/"+$("d")+"/"+$("y");
 case "e":
 if(_4==null){
 _4=" ";
 }
-return _(_1.getDate());
+return _5(_1.getDate());
 case "f":
 if(_4==null){
 _4=" ";
 }
-return _(_1.getMonth()+1);
+return _5(_1.getMonth()+1);
 case "g":
 break;
 case "G":
@@ -54,35 +54,35 @@ break;
 case "F":
 return $("Y")+"-"+$("m")+"-"+$("d");
 case "H":
-return _(_1.getHours());
+return _5(_1.getHours());
 case "I":
-return _(_1.getHours()%12||12);
+return _5(_1.getHours()%12||12);
 case "j":
-return _(dojo.date.locale._getDayOfYear(_1),3);
+return _5(dojo.date.locale._getDayOfYear(_1),3);
 case "k":
 if(_4==null){
 _4=" ";
 }
-return _(_1.getHours());
+return _5(_1.getHours());
 case "l":
 if(_4==null){
 _4=" ";
 }
-return _(_1.getHours()%12||12);
+return _5(_1.getHours()%12||12);
 case "m":
-return _(_1.getMonth()+1);
+return _5(_1.getMonth()+1);
 case "M":
-return _(_1.getMinutes());
+return _5(_1.getMinutes());
 case "n":
 return "\n";
 case "p":
-return _8[_1.getHours()<12?"am":"pm"];
+return _6[_1.getHours()<12?"am":"pm"];
 case "r":
 return $("I")+":"+$("M")+":"+$("S")+" "+$("p");
 case "R":
 return $("H")+":"+$("M");
 case "S":
-return _(_1.getSeconds());
+return _5(_1.getSeconds());
 case "t":
 return "\t";
 case "T":
@@ -90,11 +90,11 @@ return $("H")+":"+$("M")+":"+$("S");
 case "u":
 return String(_1.getDay()||7);
 case "U":
-return _(dojo.date.locale._getWeekOfYear(_1));
+return _5(dojo.date.locale._getWeekOfYear(_1));
 case "V":
-return _(dojox.date.posix.getIsoWeekOfYear(_1));
+return _5(dojox.date.posix.getIsoWeekOfYear(_1));
 case "W":
-return _(dojo.date.locale._getWeekOfYear(_1,1));
+return _5(dojo.date.locale._getWeekOfYear(_1,1));
 case "w":
 return String(_1.getDay());
 case "x":
@@ -102,25 +102,25 @@ return dojo.date.locale.format(_1,{selector:"date",formatLength:"full",locale:_3
 case "X":
 return dojo.date.locale.format(_1,{selector:"time",formatLength:"full",locale:_3});
 case "y":
-return _(_1.getFullYear()%100);
+return _5(_1.getFullYear()%100);
 case "Y":
 return String(_1.getFullYear());
 case "z":
-var _b=_1.getTimezoneOffset();
-return (_b>0?"-":"+")+_(Math.floor(Math.abs(_b)/60))+":"+_(Math.abs(_b)%60);
+var _8=_1.getTimezoneOffset();
+return (_8>0?"-":"+")+_5(Math.floor(Math.abs(_8)/60))+":"+_5(Math.abs(_8)%60);
 case "Z":
 return dojo.date.getTimezoneName(_1);
 case "%":
 return "%";
 }
 };
-var _c="";
+var _9="";
 var i=0;
-var _e=0;
-var _f=null;
-while((_e=_2.indexOf("%",i))!=-1){
-_c+=_2.substring(i,_e++);
-switch(_2.charAt(_e++)){
+var _a=0;
+var _b=null;
+while((_a=_2.indexOf("%",i))!=-1){
+_9+=_2.substring(i,_a++);
+switch(_2.charAt(_a++)){
 case "_":
 _4=" ";
 break;
@@ -131,88 +131,88 @@ case "0":
 _4="0";
 break;
 case "^":
-_f="upper";
+_b="upper";
 break;
 case "*":
-_f="lower";
+_b="lower";
 break;
 case "#":
-_f="swap";
+_b="swap";
 break;
 default:
 _4=null;
-_e--;
+_a--;
 break;
 }
-var _10=$(_2.charAt(_e++));
-switch(_f){
+var _c=$(_2.charAt(_a++));
+switch(_b){
 case "upper":
-_10=_10.toUpperCase();
+_c=_c.toUpperCase();
 break;
 case "lower":
-_10=_10.toLowerCase();
+_c=_c.toLowerCase();
 break;
 case "swap":
-var _11=_10.toLowerCase();
-var _12="";
+var _d=_c.toLowerCase();
+var _e="";
 var ch="";
-for(var j=0;j<_10.length;j++){
-ch=_10.charAt(j);
-_12+=(ch==_11.charAt(j))?ch.toUpperCase():ch.toLowerCase();
+for(var j=0;j<_c.length;j++){
+ch=_c.charAt(j);
+_e+=(ch==_d.charAt(j))?ch.toUpperCase():ch.toLowerCase();
 }
-_10=_12;
+_c=_e;
 break;
 default:
 break;
 }
-_f=null;
-_c+=_10;
-i=_e;
+_b=null;
+_9+=_c;
+i=_a;
 }
-_c+=_2.substring(i);
-return _c;
+_9+=_2.substring(i);
+return _9;
 };
-dojox.date.posix.getStartOfWeek=function(_15,_16){
-if(isNaN(_16)){
-_16=dojo.cldr.supplemental.getFirstDayOfWeek?dojo.cldr.supplemental.getFirstDayOfWeek():0;
+dojox.date.posix.getStartOfWeek=function(_f,_10){
+if(isNaN(_10)){
+_10=dojo.cldr.supplemental.getFirstDayOfWeek?dojo.cldr.supplemental.getFirstDayOfWeek():0;
 }
-var _17=_16;
-if(_15.getDay()>=_16){
-_17-=_15.getDay();
+var _11=_10;
+if(_f.getDay()>=_10){
+_11-=_f.getDay();
 }else{
-_17-=(7-_15.getDay());
+_11-=(7-_f.getDay());
 }
-var _18=new Date(_15);
-_18.setHours(0,0,0,0);
-return dojo.date.add(_18,"day",_17);
+var _12=new Date(_f);
+_12.setHours(0,0,0,0);
+return dojo.date.add(_12,"day",_11);
 };
-dojox.date.posix.setIsoWeekOfYear=function(_19,_1a){
-if(!_1a){
-return _19;
+dojox.date.posix.setIsoWeekOfYear=function(_13,_14){
+if(!_14){
+return _13;
 }
-var _1b=dojox.date.posix.getIsoWeekOfYear(_19);
-var _1c=_1a-_1b;
-if(_1a<0){
-var _1d=dojox.date.posix.getIsoWeeksInYear(_19);
-_1c=(_1d+_1a+1)-_1b;
+var _15=dojox.date.posix.getIsoWeekOfYear(_13);
+var _16=_14-_15;
+if(_14<0){
+var _17=dojox.date.posix.getIsoWeeksInYear(_13);
+_16=(_17+_14+1)-_15;
 }
-return dojo.date.add(_19,"week",_1c);
+return dojo.date.add(_13,"week",_16);
 };
-dojox.date.posix.getIsoWeekOfYear=function(_1e){
-var _1f=dojox.date.posix.getStartOfWeek(_1e,1);
-var _20=new Date(_1e.getFullYear(),0,4);
-_20=dojox.date.posix.getStartOfWeek(_20,1);
-var _21=_1f.getTime()-_20.getTime();
-if(_21<0){
-return dojox.date.posix.getIsoWeeksInYear(_1f);
+dojox.date.posix.getIsoWeekOfYear=function(_18){
+var _19=dojox.date.posix.getStartOfWeek(_18,1);
+var _1a=new Date(_18.getFullYear(),0,4);
+_1a=dojox.date.posix.getStartOfWeek(_1a,1);
+var _1b=_19.getTime()-_1a.getTime();
+if(_1b<0){
+return dojox.date.posix.getIsoWeeksInYear(_19);
 }
-return Math.ceil(_21/604800000)+1;
+return Math.ceil(_1b/604800000)+1;
 };
-dojox.date.posix.getIsoWeeksInYear=function(_22){
+dojox.date.posix.getIsoWeeksInYear=function(_1c){
 function p(y){
 return y+Math.floor(y/4)-Math.floor(y/100)+Math.floor(y/400);
 };
-var y=_22.getFullYear();
+var y=_1c.getFullYear();
 return (p(y)%7==4||p(y-1)%7==3)?53:52;
 };
 }
diff --git a/dojox/date/relative.js b/dojox/date/relative.js
new file mode 100644
index 0000000..dc9e254
--- /dev/null
+++ b/dojox/date/relative.js
@@ -0,0 +1,49 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.date.relative"]){
+dojo._hasResource["dojox.date.relative"]=true;
+dojo.provide("dojox.date.relative");
+dojo.require("dojo.date");
+dojo.require("dojo.date.locale");
+(function(d){
+var _1=1000*60*60*24;
+var _2=6*_1;
+var _3=d.delegate;
+var _4=d.date.locale;
+var _5=_4._getGregorianBundle;
+var _6=_4.format;
+function _7(_8){
+_8=dojo.clone(_8);
+_8.setHours(0);
+_8.setMinutes(0);
+_8.setSeconds(0);
+_8.setMilliseconds(0);
+return _8;
+};
+dojox.date.relative.format=function(_9,_a){
+_a=_a||{};
+var _b=_7(_a.relativeDate||new Date());
+var _c=_b.getTime()-_7(_9).getTime();
+var _d={locale:_a.locale};
+if(_c===0){
+return _6(_9,_3(_d,{selector:"time"}));
+}else{
+if(_c<=_2&&_c>0&&_a.weekCheck!==false){
+return _6(_9,_3(_d,{selector:"date",datePattern:"EEE"}))+" "+_6(_9,_3(_d,{selector:"time",formatLength:"short"}));
+}else{
+if(_9.getFullYear()==_b.getFullYear()){
+var _e=_5(dojo.i18n.normalizeLocale(_a.locale));
+return _6(_9,_3(_d,{selector:"date",datePattern:_e["dateFormatItem-MMMd"]}));
+}else{
+return _6(_9,_3(_d,{selector:"date",formatLength:"medium",locale:_a.locale}));
+}
+}
+}
+};
+})(dojo);
+}
diff --git a/dojox/date/timezone.js b/dojox/date/timezone.js
new file mode 100644
index 0000000..7483065
--- /dev/null
+++ b/dojox/date/timezone.js
@@ -0,0 +1,445 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.date.timezone"]){
+dojo._hasResource["dojox.date.timezone"]=true;
+dojo.experimental("dojox.date.timezone");
+dojo.provide("dojox.date.timezone");
+dojo.require("dojo.date.locale");
+(function(_1){
+var _2=_1.config;
+var _3=["africa","antarctica","asia","australasia","backward","etcetera","europe","northamerica","pacificnew","southamerica"];
+var _4=1835;
+var _5=2038;
+var _6={};
+var _7={};
+var _8={};
+var _9={};
+var _a=_2.timezoneFileBasePath||_1.moduleUrl("dojox.date","zoneinfo");
+var _b=_2.timezoneLoadingScheme||"preloadAll";
+var _c=_2.defaultZoneFile||((_b=="preloadAll")?_3:"northamerica");
+_1._contentHandlers["olson-zoneinfo"]=function(_d){
+var _e=_1._contentHandlers["text"](_d);
+var s="";
+var _f=_e.split("\n");
+var arr=[];
+var _10="";
+var _11=null;
+var _12=null;
+var ret={zones:{},rules:{}};
+for(var i=0;i<_f.length;i++){
+var l=_f[i];
+if(l.match(/^\s/)){
+l="Zone "+_11+l;
+}
+l=l.split("#")[0];
+if(l.length>3){
+arr=l.split(/\s+/);
+_10=arr.shift();
+switch(_10){
+case "Zone":
+_11=arr.shift();
+if(arr[0]){
+if(!ret.zones[_11]){
+ret.zones[_11]=[];
+}
+ret.zones[_11].push(arr);
+}
+break;
+case "Rule":
+_12=arr.shift();
+if(!ret.rules[_12]){
+ret.rules[_12]=[];
+}
+ret.rules[_12].push(arr);
+break;
+case "Link":
+if(ret.zones[arr[1]]){
+throw new Error("Error with Link "+arr[1]);
+}
+ret.zones[arr[1]]=arr[0];
+break;
+case "Leap":
+break;
+default:
+break;
+}
+}
+}
+return ret;
+};
+function _13(_14){
+_14=_14||{};
+_7=_1.mixin(_7,_14.zones||{});
+_9=_1.mixin(_9,_14.rules||{});
+};
+function _15(e){
+console.error("Error loading zone file:",e);
+throw e;
+};
+function _16(_17){
+_6[_17]=true;
+_1.xhrGet({url:_a+"/"+_17,sync:true,handleAs:"olson-zoneinfo",load:_13,error:_15});
+};
+var _18={"jan":0,"feb":1,"mar":2,"apr":3,"may":4,"jun":5,"jul":6,"aug":7,"sep":8,"oct":9,"nov":10,"dec":11};
+var _19={"sun":0,"mon":1,"tue":2,"wed":3,"thu":4,"fri":5,"sat":6};
+var _1a={"EST":"northamerica","MST":"northamerica","HST":"northamerica","EST5EDT":"northamerica","CST6CDT":"northamerica","MST7MDT":"northamerica","PST8PDT":"northamerica","America":"northamerica","Pacific":"australasia","Atlantic":"europe","Africa":"africa","Indian":"africa","Antarctica":"antarctica","Asia":"asia","Australia":"australasia","Europe":"europe","WET":"europe","CET":"europe","MET":"europe","EET":"europe"};
+var _1b={"Pacific/Honolulu":"northamerica","Atlantic/Bermuda":"northamerica","Atlantic/Cape_Verde":"africa","Atlantic/St_Helena":"africa","Indian/Kerguelen":"antarctica","Indian/Chagos":"asia","Indian/Maldives":"asia","Indian/Christmas":"australasia","Indian/Cocos":"australasia","America/Danmarkshavn":"europe","America/Scoresbysund":"europe","America/Godthab":"europe","America/Thule":"europe","Asia/Yekaterinburg":"europe","Asia/Omsk":"europe","Asia/Novosibirsk":"europe","Asia/Krasnoyarsk [...]
+var _1c={"US":"S","Chatham":"S","NZ":"S","NT_YK":"S","Edm":"S","Salv":"S","Canada":"S","StJohns":"S","TC":"S","Guat":"S","Mexico":"S","Haiti":"S","Barb":"S","Belize":"S","CR":"S","Moncton":"S","Swift":"S","Hond":"S","Thule":"S","NZAQ":"S","Zion":"S","ROK":"S","PRC":"S","Taiwan":"S","Ghana":"GMT","SL":"WAT","Chicago":"S","Detroit":"S","Vanc":"S","Denver":"S","Halifax":"S","Cuba":"S","Indianapolis":"S","Starke":"S","Marengo":"S","Pike":"S","Perry":"S","Vincennes":"S","Pulaski":"S","Louisvi [...]
+function _1d(t){
+throw new Error("Timezone \""+t+"\" is either incorrect, or not loaded in the timezone registry.");
+};
+function _1e(tz){
+var ret=_1b[tz];
+if(!ret){
+var reg=tz.split("/")[0];
+ret=_1a[reg];
+if(!ret){
+var _1f=_7[tz];
+if(typeof _1f=="string"){
+return _1e(_1f);
+}else{
+if(!_6.backward){
+_16("backward");
+return _1e(tz);
+}else{
+_1d(tz);
+}
+}
+}
+}
+return ret;
+};
+function _20(str){
+var pat=/(\d+)(?::0*(\d*))?(?::0*(\d*))?([su])?$/;
+var hms=str.match(pat);
+if(!hms){
+return null;
+}
+hms[1]=parseInt(hms[1],10);
+hms[2]=hms[2]?parseInt(hms[2],10):0;
+hms[3]=hms[3]?parseInt(hms[3],10):0;
+return hms;
+};
+function _21(y,m,d,h,mn,s,off){
+return Date.UTC(y,m,d,h,mn,s)+((off||0)*60*1000);
+};
+function _22(m){
+return _18[m.substr(0,3).toLowerCase()];
+};
+function _23(str){
+var off=_20(str);
+if(off===null){
+return 0;
+}
+var adj=str.indexOf("-")===0?-1:1;
+off=adj*(((off[1]*60+off[2])*60+off[3])*1000);
+return -off/60/1000;
+};
+function _24(_25,_26,off){
+var _27=_22(_25[3]),day=_25[4],_28=_20(_25[5]);
+if(_28[4]=="u"){
+off=0;
+}
+var d,_29,_2a;
+if(isNaN(day)){
+if(day.substr(0,4)=="last"){
+day=_19[day.substr(4,3).toLowerCase()];
+d=new Date(_21(_26,_27+1,1,_28[1]-24,_28[2],_28[3],off));
+_29=_1.date.add(d,"minute",-off).getUTCDay();
+_2a=(day>_29)?(day-_29-7):(day-_29);
+if(_2a!==0){
+d=_1.date.add(d,"hour",_2a*24);
+}
+return d;
+}else{
+day=_19[day.substr(0,3).toLowerCase()];
+if(day!="undefined"){
+if(_25[4].substr(3,2)==">="){
+d=new Date(_21(_26,_27,parseInt(_25[4].substr(5),10),_28[1],_28[2],_28[3],off));
+_29=_1.date.add(d,"minute",-off).getUTCDay();
+_2a=(day<_29)?(day-_29+7):(day-_29);
+if(_2a!==0){
+d=_1.date.add(d,"hour",_2a*24);
+}
+return d;
+}else{
+if(day.substr(3,2)=="<="){
+d=new Date(_21(_26,_27,parseInt(_25[4].substr(5),10),_28[1],_28[2],_28[3],off));
+_29=_1.date.add(d,"minute",-off).getUTCDay();
+_2a=(day>_29)?(day-_29-7):(day-_29);
+if(_2a!==0){
+d=_1.date.add(d,"hour",_2a*24);
+}
+return d;
+}
+}
+}
+}
+}else{
+d=new Date(_21(_26,_27,parseInt(day,10),_28[1],_28[2],_28[3],off));
+return d;
+}
+return null;
+};
+function _2b(_2c,_2d){
+var _2e=[];
+_1.forEach(_9[_2c[1]]||[],function(r){
+for(var i=0;i<2;i++){
+switch(r[i]){
+case "min":
+r[i]=_4;
+break;
+case "max":
+r[i]=_5;
+break;
+case "only":
+break;
+default:
+r[i]=parseInt(r[i],10);
+if(isNaN(r[i])){
+throw new Error("Invalid year found on rule");
+}
+break;
+}
+}
+if(typeof r[6]=="string"){
+r[6]=_23(r[6]);
+}
+if((r[0]<=_2d&&r[1]>=_2d)||(r[0]==_2d&&r[1]=="only")){
+_2e.push({r:r,d:_24(r,_2d,_2c[0])});
+}
+});
+return _2e;
+};
+function _2f(tz,_30){
+var zr=_8[tz]=[];
+for(var i=0;i<_30.length;i++){
+var z=_30[i];
+var r=zr[i]=[];
+var _31=null;
+var _32=null;
+var _33=[];
+if(typeof z[0]=="string"){
+z[0]=_23(z[0]);
+}
+if(i===0){
+r[0]=Date.UTC(_4,0,1,0,0,0,0);
+}else{
+r[0]=zr[i-1][1];
+_31=_30[i-1];
+_32=zr[i-1];
+_33=_32[2];
+}
+var _34=new Date(r[0]).getUTCFullYear();
+var _35=z[3]?parseInt(z[3],10):_5;
+var rlz=[];
+var j;
+for(j=_34;j<=_35;j++){
+rlz=rlz.concat(_2b(z,j));
+}
+rlz.sort(function(a,b){
+return _1.date.compare(a.d,b.d);
+});
+var rl;
+for(j=0,rl;(rl=rlz[j]);j++){
+var _36=j>0?rlz[j-1]:null;
+if(rl.r[5].indexOf("u")<0&&rl.r[5].indexOf("s")<0){
+if(j===0&&i>0){
+if(_33.length){
+rl.d=_1.date.add(rl.d,"minute",_33[_33.length-1].r[6]);
+}else{
+if(_1.date.compare(new Date(_32[1]),rl.d,"date")===0){
+rl.d=new Date(_32[1]);
+}else{
+rl.d=_1.date.add(rl.d,"minute",_23(_31[1]));
+}
+}
+}else{
+if(j>0){
+rl.d=_1.date.add(rl.d,"minute",_36.r[6]);
+}
+}
+}
+}
+r[2]=rlz;
+if(!z[3]){
+r[1]=Date.UTC(_5,11,31,23,59,59,999);
+}else{
+var _37=parseInt(z[3],10),_38=_22(z[4]||"Jan"),day=parseInt(z[5]||"1",10),_39=_20(z[6]||"0");
+var _3a=r[1]=_21(_37,_38,day,_39[1],_39[2],_39[3],((_39[4]=="u")?0:z[0]));
+if(isNaN(_3a)){
+_3a=r[1]=_24([0,0,0,z[4],z[5],z[6]||"0"],_37,((_39[4]=="u")?0:z[0])).getTime();
+}
+var _3b=_1.filter(rlz,function(rl,idx){
+var o=idx>0?rlz[idx-1].r[6]*60*1000:0;
+return (rl.d.getTime()<_3a+o);
+});
+if(_39[4]!="u"&&_39[4]!="s"){
+if(_3b.length){
+r[1]+=_3b[_3b.length-1].r[6]*60*1000;
+}else{
+r[1]+=_23(z[1])*60*1000;
+}
+}
+}
+}
+};
+function _3c(dt,tz){
+var t=tz;
+var _3d=_7[t];
+while(typeof _3d=="string"){
+t=_3d;
+_3d=_7[t];
+}
+if(!_3d){
+if(!_6.backward){
+var _3e=_16("backward",true);
+return _3c(dt,tz);
+}
+_1d(t);
+}
+if(!_8[tz]){
+_2f(tz,_3d);
+}
+var _3f=_8[tz];
+var tm=dt.getTime();
+for(var i=0,r;(r=_3f[i]);i++){
+if(tm>=r[0]&&tm<r[1]){
+return {zone:_3d[i],range:_3f[i],idx:i};
+}
+}
+throw new Error("No Zone found for \""+tz+"\" on "+dt);
+};
+function _40(dt,_41){
+var _42=-1;
+var _43=_41.range[2]||[];
+var tsp=dt.getTime();
+var zr=_41.range;
+for(var i=0,r;(r=_43[i]);i++){
+if(tsp>=r.d.getTime()){
+_42=i;
+}
+}
+if(_42>=0){
+return _43[_42].r;
+}
+return null;
+};
+function _44(tz,_45,_46){
+var res;
+var _47=_45.zone;
+var _48=_47[2];
+if(_48.indexOf("%s")>-1){
+var _49;
+if(_46){
+_49=_46[7];
+if(_49=="-"){
+_49="";
+}
+}else{
+if(_47[1] in _1c){
+_49=_1c[_47[1]];
+}else{
+if(_45.idx>0){
+var pz=_7[tz][_45.idx-1];
+var pb=pz[2];
+if(pb.indexOf("%s")<0){
+if(_48.replace("%s","S")==pb){
+_49="S";
+}else{
+_49="";
+}
+}else{
+_49="";
+}
+}else{
+_49="";
+}
+}
+}
+res=_48.replace("%s",_49);
+}else{
+if(_48.indexOf("/")>-1){
+var bs=_48.split("/");
+if(_46){
+res=bs[_46[6]===0?0:1];
+}else{
+res=bs[0];
+}
+}else{
+res=_48;
+}
+}
+return res;
+};
+_1.setObject("dojox.date.timezone",{getTzInfo:function(dt,tz){
+if(_b=="lazyLoad"){
+var _4a=_1e(tz);
+if(!_4a){
+throw new Error("Not a valid timezone ID.");
+}else{
+if(!_6[_4a]){
+_16(_4a);
+}
+}
+}
+var _4b=_3c(dt,tz);
+var off=_4b.zone[0];
+var _4c=_40(dt,_4b);
+if(_4c){
+off+=_4c[6];
+}else{
+if(_9[_4b.zone[1]]&&_4b.idx>0){
+off+=_23(_7[tz][_4b.idx-1][1]);
+}else{
+off+=_23(_4b.zone[1]);
+}
+}
+var _4d=_44(tz,_4b,_4c);
+return {tzOffset:off,tzAbbr:_4d};
+},getAllZones:function(){
+var arr=[];
+for(var z in _7){
+arr.push(z);
+}
+arr.sort();
+return arr;
+}});
+if(typeof _c=="string"&&_c){
+_c=[_c];
+}
+if(_1.isArray(_c)){
+_1.forEach(_c,function(f){
+_16(f);
+});
+}
+var _4e=_1.date.locale.format;
+var _4f=_1.date.locale._getZone;
+_1.date.locale.format=function(_50,_51){
+_51=_51||{};
+if(_51.timezone&&!_51._tzInfo){
+_51._tzInfo=dojox.date.timezone.getTzInfo(_50,_51.timezone);
+}
+if(_51._tzInfo){
+var _52=_50.getTimezoneOffset()-_51._tzInfo.tzOffset;
+_50=new Date(_50.getTime()+(_52*60*1000));
+}
+return _4e.call(this,_50,_51);
+};
+_1.date.locale._getZone=function(_53,_54,_55){
+if(_55._tzInfo){
+if(_54){
+return _55._tzInfo.tzAbbr;
+}else{
+return _55._tzInfo.tzOffset;
+}
+}
+return _4f.call(this,_53,_54,_55);
+};
+})(dojo);
+}
diff --git a/dojox/date/zoneinfo/LICENSE b/dojox/date/zoneinfo/LICENSE
new file mode 100644
index 0000000..211d20a
--- /dev/null
+++ b/dojox/date/zoneinfo/LICENSE
@@ -0,0 +1,10 @@
+"Olson Database", available for download from ftp://elsie.nci.nih.gov/pub/
+
+These comments were included in each file.
+
+# This file is in the public domain, so clarified as of
+# 2009-05-17 by Arthur David Olson.
+
+# This data is by no means authoritative; if you think you know better,
+# go ahead and edit the file (and please send any changes to
+# tz at elsie.nci.nih.gov for general use in the future).
diff --git a/dojox/date/zoneinfo/africa b/dojox/date/zoneinfo/africa
new file mode 100644
index 0000000..18e5a28
--- /dev/null
+++ b/dojox/date/zoneinfo/africa
@@ -0,0 +1,310 @@
+Rule	Algeria	1916	only	-	Jun	14	23:00s	1:00	S
+Rule	Algeria	1916	1919	-	Oct	Sun>=1	23:00s	0	-
+Rule	Algeria	1917	only	-	Mar	24	23:00s	1:00	S
+Rule	Algeria	1918	only	-	Mar	 9	23:00s	1:00	S
+Rule	Algeria	1919	only	-	Mar	 1	23:00s	1:00	S
+Rule	Algeria	1920	only	-	Feb	14	23:00s	1:00	S
+Rule	Algeria	1920	only	-	Oct	23	23:00s	0	-
+Rule	Algeria	1921	only	-	Mar	14	23:00s	1:00	S
+Rule	Algeria	1921	only	-	Jun	21	23:00s	0	-
+Rule	Algeria	1939	only	-	Sep	11	23:00s	1:00	S
+Rule	Algeria	1939	only	-	Nov	19	 1:00	0	-
+Rule	Algeria	1944	1945	-	Apr	Mon>=1	 2:00	1:00	S
+Rule	Algeria	1944	only	-	Oct	 8	 2:00	0	-
+Rule	Algeria	1945	only	-	Sep	16	 1:00	0	-
+Rule	Algeria	1971	only	-	Apr	25	23:00s	1:00	S
+Rule	Algeria	1971	only	-	Sep	26	23:00s	0	-
+Rule	Algeria	1977	only	-	May	 6	 0:00	1:00	S
+Rule	Algeria	1977	only	-	Oct	21	 0:00	0	-
+Rule	Algeria	1978	only	-	Mar	24	 1:00	1:00	S
+Rule	Algeria	1978	only	-	Sep	22	 3:00	0	-
+Rule	Algeria	1980	only	-	Apr	25	 0:00	1:00	S
+Rule	Algeria	1980	only	-	Oct	31	 2:00	0	-
+Zone	Africa/Algiers	0:12:12 -	LMT	1891 Mar 15 0:01
+			0:09:21	-	PMT	1911 Mar 11    # Paris Mean Time
+			0:00	Algeria	WE%sT	1940 Feb 25 2:00
+			1:00	Algeria	CE%sT	1946 Oct  7
+			0:00	-	WET	1956 Jan 29
+			1:00	-	CET	1963 Apr 14
+			0:00	Algeria	WE%sT	1977 Oct 21
+			1:00	Algeria	CE%sT	1979 Oct 26
+			0:00	Algeria	WE%sT	1981 May
+			1:00	-	CET
+Zone	Africa/Luanda	0:52:56	-	LMT	1892
+			0:52:04	-	AOT	1911 May 26 # Angola Time
+			1:00	-	WAT
+Zone Africa/Porto-Novo	0:10:28	-	LMT	1912
+			0:00	-	GMT	1934 Feb 26
+			1:00	-	WAT
+Zone	Africa/Gaborone	1:43:40 -	LMT	1885
+			2:00	-	CAT	1943 Sep 19 2:00
+			2:00	1:00	CAST	1944 Mar 19 2:00
+			2:00	-	CAT
+Zone Africa/Ouagadougou	-0:06:04 -	LMT	1912
+			 0:00	-	GMT
+Zone Africa/Bujumbura	1:57:28	-	LMT	1890
+			2:00	-	CAT
+Zone	Africa/Douala	0:38:48	-	LMT	1912
+			1:00	-	WAT
+Zone Atlantic/Cape_Verde -1:34:04 -	LMT	1907			# Praia
+			-2:00	-	CVT	1942 Sep
+			-2:00	1:00	CVST	1945 Oct 15
+			-2:00	-	CVT	1975 Nov 25 2:00
+			-1:00	-	CVT
+Zone	Africa/Bangui	1:14:20	-	LMT	1912
+			1:00	-	WAT
+Zone	Africa/Ndjamena	1:00:12 -	LMT	1912
+			1:00	-	WAT	1979 Oct 14
+			1:00	1:00	WAST	1980 Mar  8
+			1:00	-	WAT
+Zone	Indian/Comoro	2:53:04 -	LMT	1911 Jul   # Moroni, Gran Comoro
+			3:00	-	EAT
+Zone Africa/Kinshasa	1:01:12 -	LMT	1897 Nov 9
+			1:00	-	WAT
+Zone Africa/Lubumbashi	1:49:52 -	LMT	1897 Nov 9
+			2:00	-	CAT
+Zone Africa/Brazzaville	1:01:08 -	LMT	1912
+			1:00	-	WAT
+Zone	Africa/Abidjan	-0:16:08 -	LMT	1912
+			 0:00	-	GMT
+Zone	Africa/Djibouti	2:52:36 -	LMT	1911 Jul
+			3:00	-	EAT
+Rule	Egypt	1940	only	-	Jul	15	0:00	1:00	S
+Rule	Egypt	1940	only	-	Oct	 1	0:00	0	-
+Rule	Egypt	1941	only	-	Apr	15	0:00	1:00	S
+Rule	Egypt	1941	only	-	Sep	16	0:00	0	-
+Rule	Egypt	1942	1944	-	Apr	 1	0:00	1:00	S
+Rule	Egypt	1942	only	-	Oct	27	0:00	0	-
+Rule	Egypt	1943	1945	-	Nov	 1	0:00	0	-
+Rule	Egypt	1945	only	-	Apr	16	0:00	1:00	S
+Rule	Egypt	1957	only	-	May	10	0:00	1:00	S
+Rule	Egypt	1957	1958	-	Oct	 1	0:00	0	-
+Rule	Egypt	1958	only	-	May	 1	0:00	1:00	S
+Rule	Egypt	1959	1981	-	May	 1	1:00	1:00	S
+Rule	Egypt	1959	1965	-	Sep	30	3:00	0	-
+Rule	Egypt	1966	1994	-	Oct	 1	3:00	0	-
+Rule	Egypt	1982	only	-	Jul	25	1:00	1:00	S
+Rule	Egypt	1983	only	-	Jul	12	1:00	1:00	S
+Rule	Egypt	1984	1988	-	May	 1	1:00	1:00	S
+Rule	Egypt	1989	only	-	May	 6	1:00	1:00	S
+Rule	Egypt	1990	1994	-	May	 1	1:00	1:00	S
+Rule	Egypt	1995	max	-	Apr	lastFri	 0:00s	1:00	S
+Rule	Egypt	1995	2005	-	Sep	lastThu	23:00s	0	-
+Rule	Egypt	2006	only	-	Sep	21	23:00s	0	-
+Rule	Egypt	2007	only	-	Sep	Thu>=1	23:00s	0	-
+Rule	Egypt	2008	only	-	Aug	lastThu	23:00s	0	-
+Rule	Egypt	2009	max	-	Sep	lastThu	23:00s	0	-
+Zone	Africa/Cairo	2:05:00 -	LMT	1900 Oct
+			2:00	Egypt	EE%sT
+Zone	Africa/Malabo	0:35:08 -	LMT	1912
+			0:00	-	GMT	1963 Dec 15
+			1:00	-	WAT
+Zone	Africa/Asmara	2:35:32 -	LMT	1870
+			2:35:32	-	AMT	1890	      # Asmara Mean Time
+			2:35:20	-	ADMT	1936 May 5    # Adis Dera MT
+			3:00	-	EAT
+Zone Africa/Addis_Ababa	2:34:48 -	LMT	1870
+			2:35:20	-	ADMT	1936 May 5    # Adis Dera MT
+			3:00	-	EAT
+Zone Africa/Libreville	0:37:48 -	LMT	1912
+			1:00	-	WAT
+Zone	Africa/Banjul	-1:06:36 -	LMT	1912
+			-1:06:36 -	BMT	1935	# Banjul Mean Time
+			-1:00	-	WAT	1964
+			 0:00	-	GMT
+Rule	Ghana	1936	1942	-	Sep	 1	0:00	0:20	GHST
+Rule	Ghana	1936	1942	-	Dec	31	0:00	0	GMT
+Zone	Africa/Accra	-0:00:52 -	LMT	1918
+			 0:00	Ghana	%s
+Zone	Africa/Conakry	-0:54:52 -	LMT	1912
+			 0:00	-	GMT	1934 Feb 26
+			-1:00	-	WAT	1960
+			 0:00	-	GMT
+Zone	Africa/Bissau	-1:02:20 -	LMT	1911 May 26
+			-1:00	-	WAT	1975
+			 0:00	-	GMT
+Zone	Africa/Nairobi	2:27:16	-	LMT	1928 Jul
+			3:00	-	EAT	1930
+			2:30	-	BEAT	1940
+			2:44:45	-	BEAUT	1960
+			3:00	-	EAT
+Zone	Africa/Maseru	1:50:00 -	LMT	1903 Mar
+			2:00	-	SAST	1943 Sep 19 2:00
+			2:00	1:00	SAST	1944 Mar 19 2:00
+			2:00	-	SAST
+Zone	Africa/Monrovia	-0:43:08 -	LMT	1882
+			-0:43:08 -	MMT	1919 Mar # Monrovia Mean Time
+			-0:44:30 -	LRT	1972 May # Liberia Time
+			 0:00	-	GMT
+Rule	Libya	1951	only	-	Oct	14	2:00	1:00	S
+Rule	Libya	1952	only	-	Jan	 1	0:00	0	-
+Rule	Libya	1953	only	-	Oct	 9	2:00	1:00	S
+Rule	Libya	1954	only	-	Jan	 1	0:00	0	-
+Rule	Libya	1955	only	-	Sep	30	0:00	1:00	S
+Rule	Libya	1956	only	-	Jan	 1	0:00	0	-
+Rule	Libya	1982	1984	-	Apr	 1	0:00	1:00	S
+Rule	Libya	1982	1985	-	Oct	 1	0:00	0	-
+Rule	Libya	1985	only	-	Apr	 6	0:00	1:00	S
+Rule	Libya	1986	only	-	Apr	 4	0:00	1:00	S
+Rule	Libya	1986	only	-	Oct	 3	0:00	0	-
+Rule	Libya	1987	1989	-	Apr	 1	0:00	1:00	S
+Rule	Libya	1987	1989	-	Oct	 1	0:00	0	-
+Zone	Africa/Tripoli	0:52:44 -	LMT	1920
+			1:00	Libya	CE%sT	1959
+			2:00	-	EET	1982
+			1:00	Libya	CE%sT	1990 May  4
+			2:00	-	EET	1996 Sep 30
+			1:00	-	CET	1997 Apr  4
+			1:00	1:00	CEST	1997 Oct  4
+			2:00	-	EET
+Zone Indian/Antananarivo 3:10:04 -	LMT	1911 Jul
+			3:00	-	EAT	1954 Feb 27 23:00s
+			3:00	1:00	EAST	1954 May 29 23:00s
+			3:00	-	EAT
+Zone	Africa/Blantyre	2:20:00 -	LMT	1903 Mar
+			2:00	-	CAT
+Zone	Africa/Bamako	-0:32:00 -	LMT	1912
+			 0:00	-	GMT	1934 Feb 26
+			-1:00	-	WAT	1960 Jun 20
+			 0:00	-	GMT
+Zone Africa/Nouakchott	-1:03:48 -	LMT	1912
+			 0:00	-	GMT	1934 Feb 26
+			-1:00	-	WAT	1960 Nov 28
+			 0:00	-	GMT
+Rule Mauritius	1982	only	-	Oct	10	0:00	1:00	S
+Rule Mauritius	1983	only	-	Mar	21	0:00	0	-
+Rule Mauritius	2008	only	-	Oct	lastSun	2:00	1:00	S
+Rule Mauritius	2009	only	-	Mar	lastSun	2:00	0	-
+Zone Indian/Mauritius	3:50:00 -	LMT	1907		# Port Louis
+			4:00 Mauritius	MU%sT	# Mauritius Time
+Zone	Indian/Mayotte	3:00:56 -	LMT	1911 Jul	# Mamoutzou
+			3:00	-	EAT
+Rule	Morocco	1939	only	-	Sep	12	 0:00	1:00	S
+Rule	Morocco	1939	only	-	Nov	19	 0:00	0	-
+Rule	Morocco	1940	only	-	Feb	25	 0:00	1:00	S
+Rule	Morocco	1945	only	-	Nov	18	 0:00	0	-
+Rule	Morocco	1950	only	-	Jun	11	 0:00	1:00	S
+Rule	Morocco	1950	only	-	Oct	29	 0:00	0	-
+Rule	Morocco	1967	only	-	Jun	 3	12:00	1:00	S
+Rule	Morocco	1967	only	-	Oct	 1	 0:00	0	-
+Rule	Morocco	1974	only	-	Jun	24	 0:00	1:00	S
+Rule	Morocco	1974	only	-	Sep	 1	 0:00	0	-
+Rule	Morocco	1976	1977	-	May	 1	 0:00	1:00	S
+Rule	Morocco	1976	only	-	Aug	 1	 0:00	0	-
+Rule	Morocco	1977	only	-	Sep	28	 0:00	0	-
+Rule	Morocco	1978	only	-	Jun	 1	 0:00	1:00	S
+Rule	Morocco	1978	only	-	Aug	 4	 0:00	0	-
+Rule	Morocco	2008	only	-	Jun	 1	 0:00	1:00	S
+Rule	Morocco	2008	only	-	Sep	 1	 0:00	0	-
+Rule	Morocco	2009	only	-	Jun	 1	 0:00	1:00	S
+Rule	Morocco	2009	only	-	Aug	 21	 0:00	0	-
+Zone Africa/Casablanca	-0:30:20 -	LMT	1913 Oct 26
+			 0:00	Morocco	WE%sT	1984 Mar 16
+			 1:00	-	CET	1986
+			 0:00	Morocco	WE%sT
+Zone Africa/El_Aaiun	-0:52:48 -	LMT	1934 Jan
+			-1:00	-	WAT	1976 Apr 14
+			 0:00	-	WET
+Zone	Africa/Maputo	2:10:20 -	LMT	1903 Mar
+			2:00	-	CAT
+Rule	Namibia	1994	max	-	Sep	Sun>=1	2:00	1:00	S
+Rule	Namibia	1995	max	-	Apr	Sun>=1	2:00	0	-
+Zone	Africa/Windhoek	1:08:24 -	LMT	1892 Feb 8
+			1:30	-	SWAT	1903 Mar	# SW Africa Time
+			2:00	-	SAST	1942 Sep 20 2:00
+			2:00	1:00	SAST	1943 Mar 21 2:00
+			2:00	-	SAST	1990 Mar 21 # independence
+			2:00	-	CAT	1994 Apr  3
+			1:00	Namibia	WA%sT
+Zone	Africa/Niamey	 0:08:28 -	LMT	1912
+			-1:00	-	WAT	1934 Feb 26
+			 0:00	-	GMT	1960
+			 1:00	-	WAT
+Zone	Africa/Lagos	0:13:36 -	LMT	1919 Sep
+			1:00	-	WAT
+Zone	Indian/Reunion	3:41:52 -	LMT	1911 Jun	# Saint-Denis
+			4:00	-	RET	# Reunion Time
+Zone	Africa/Kigali	2:00:16 -	LMT	1935 Jun
+			2:00	-	CAT
+Zone Atlantic/St_Helena	-0:22:48 -	LMT	1890		# Jamestown
+			-0:22:48 -	JMT	1951	# Jamestown Mean Time
+			 0:00	-	GMT
+Zone	Africa/Sao_Tome	 0:26:56 -	LMT	1884
+			-0:36:32 -	LMT	1912	# Lisbon Mean Time
+			 0:00	-	GMT
+Zone	Africa/Dakar	-1:09:44 -	LMT	1912
+			-1:00	-	WAT	1941 Jun
+			 0:00	-	GMT
+Zone	Indian/Mahe	3:41:48 -	LMT	1906 Jun	# Victoria
+			4:00	-	SCT	# Seychelles Time
+Rule	SL	1935	1942	-	Jun	 1	0:00	0:40	SLST
+Rule	SL	1935	1942	-	Oct	 1	0:00	0	WAT
+Rule	SL	1957	1962	-	Jun	 1	0:00	1:00	SLST
+Rule	SL	1957	1962	-	Sep	 1	0:00	0	GMT
+Zone	Africa/Freetown	-0:53:00 -	LMT	1882
+			-0:53:00 -	FMT	1913 Jun # Freetown Mean Time
+			-1:00	SL	%s	1957
+			 0:00	SL	%s
+Zone Africa/Mogadishu	3:01:28 -	LMT	1893 Nov
+			3:00	-	EAT	1931
+			2:30	-	BEAT	1957
+			3:00	-	EAT
+Rule	SA	1942	1943	-	Sep	Sun>=15	2:00	1:00	-
+Rule	SA	1943	1944	-	Mar	Sun>=15	2:00	0	-
+Zone Africa/Johannesburg 1:52:00 -	LMT	1892 Feb 8
+			1:30	-	SAST	1903 Mar
+			2:00	SA	SAST
+Rule	Sudan	1970	only	-	May	 1	0:00	1:00	S
+Rule	Sudan	1970	1985	-	Oct	15	0:00	0	-
+Rule	Sudan	1971	only	-	Apr	30	0:00	1:00	S
+Rule	Sudan	1972	1985	-	Apr	lastSun	0:00	1:00	S
+Zone	Africa/Khartoum	2:10:08 -	LMT	1931
+			2:00	Sudan	CA%sT	2000 Jan 15 12:00
+			3:00	-	EAT
+Zone	Africa/Mbabane	2:04:24 -	LMT	1903 Mar
+			2:00	-	SAST
+Zone Africa/Dar_es_Salaam 2:37:08 -	LMT	1931
+			3:00	-	EAT	1948
+			2:44:45	-	BEAUT	1961
+			3:00	-	EAT
+Zone	Africa/Lome	0:04:52 -	LMT	1893
+			0:00	-	GMT
+Rule	Tunisia	1939	only	-	Apr	15	23:00s	1:00	S
+Rule	Tunisia	1939	only	-	Nov	18	23:00s	0	-
+Rule	Tunisia	1940	only	-	Feb	25	23:00s	1:00	S
+Rule	Tunisia	1941	only	-	Oct	 6	 0:00	0	-
+Rule	Tunisia	1942	only	-	Mar	 9	 0:00	1:00	S
+Rule	Tunisia	1942	only	-	Nov	 2	 3:00	0	-
+Rule	Tunisia	1943	only	-	Mar	29	 2:00	1:00	S
+Rule	Tunisia	1943	only	-	Apr	17	 2:00	0	-
+Rule	Tunisia	1943	only	-	Apr	25	 2:00	1:00	S
+Rule	Tunisia	1943	only	-	Oct	 4	 2:00	0	-
+Rule	Tunisia	1944	1945	-	Apr	Mon>=1	 2:00	1:00	S
+Rule	Tunisia	1944	only	-	Oct	 8	 0:00	0	-
+Rule	Tunisia	1945	only	-	Sep	16	 0:00	0	-
+Rule	Tunisia	1977	only	-	Apr	30	 0:00s	1:00	S
+Rule	Tunisia	1977	only	-	Sep	24	 0:00s	0	-
+Rule	Tunisia	1978	only	-	May	 1	 0:00s	1:00	S
+Rule	Tunisia	1978	only	-	Oct	 1	 0:00s	0	-
+Rule	Tunisia	1988	only	-	Jun	 1	 0:00s	1:00	S
+Rule	Tunisia	1988	1990	-	Sep	lastSun	 0:00s	0	-
+Rule	Tunisia	1989	only	-	Mar	26	 0:00s	1:00	S
+Rule	Tunisia	1990	only	-	May	 1	 0:00s	1:00	S
+Rule	Tunisia	2005	only	-	May	 1	 0:00s	1:00	S
+Rule	Tunisia	2005	only	-	Sep	30	 1:00s	0	-
+Rule	Tunisia	2006	2008	-	Mar	lastSun	 2:00s	1:00	S
+Rule	Tunisia	2006	2008	-	Oct	lastSun	 2:00s	0	-
+Rule	Tunisia	2010	max	-	Mar	lastSun	 2:00s	1:00	S
+Rule	Tunisia	2010	max	-	Oct	lastSun	 2:00s	0	-
+Zone	Africa/Tunis	0:40:44 -	LMT	1881 May 12
+			0:09:21	-	PMT	1911 Mar 11    # Paris Mean Time
+			1:00	Tunisia	CE%sT
+Zone	Africa/Kampala	2:09:40 -	LMT	1928 Jul
+			3:00	-	EAT	1930
+			2:30	-	BEAT	1948
+			2:44:45	-	BEAUT	1957
+			3:00	-	EAT
+Zone	Africa/Lusaka	1:53:08 -	LMT	1903 Mar
+			2:00	-	CAT
+Zone	Africa/Harare	2:04:12 -	LMT	1903 Mar
+			2:00	-	CAT
diff --git a/dojox/date/zoneinfo/antarctica b/dojox/date/zoneinfo/antarctica
new file mode 100644
index 0000000..c8f7bff
--- /dev/null
+++ b/dojox/date/zoneinfo/antarctica
@@ -0,0 +1,68 @@
+Rule	RussAQ	1981	1984	-	Apr	 1	 0:00	1:00	S
+Rule	RussAQ	1981	1983	-	Oct	 1	 0:00	0	-
+Rule	RussAQ	1984	1991	-	Sep	lastSun	 2:00s	0	-
+Rule	RussAQ	1985	1991	-	Mar	lastSun	 2:00s	1:00	S
+Rule	RussAQ	1992	only	-	Mar	lastSat	 23:00	1:00	S
+Rule	RussAQ	1992	only	-	Sep	lastSat	 23:00	0	-
+Rule	RussAQ	1993	max	-	Mar	lastSun	 2:00s	1:00	S
+Rule	RussAQ	1993	1995	-	Sep	lastSun	 2:00s	0	-
+Rule	RussAQ	1996	max	-	Oct	lastSun	 2:00s	0	-
+Rule	ArgAQ	1964	1966	-	Mar	 1	0:00	0	-
+Rule	ArgAQ	1964	1966	-	Oct	15	0:00	1:00	S
+Rule	ArgAQ	1967	only	-	Apr	 2	0:00	0	-
+Rule	ArgAQ	1967	1968	-	Oct	Sun>=1	0:00	1:00	S
+Rule	ArgAQ	1968	1969	-	Apr	Sun>=1	0:00	0	-
+Rule	ArgAQ	1974	only	-	Jan	23	0:00	1:00	S
+Rule	ArgAQ	1974	only	-	May	 1	0:00	0	-
+Rule	ChileAQ	1972	1986	-	Mar	Sun>=9	3:00u	0	-
+Rule	ChileAQ	1974	1987	-	Oct	Sun>=9	4:00u	1:00	S
+Rule	ChileAQ	1987	only	-	Apr	12	3:00u	0	-
+Rule	ChileAQ	1988	1989	-	Mar	Sun>=9	3:00u	0	-
+Rule	ChileAQ	1988	only	-	Oct	Sun>=1	4:00u	1:00	S
+Rule	ChileAQ	1989	only	-	Oct	Sun>=9	4:00u	1:00	S
+Rule	ChileAQ	1990	only	-	Mar	18	3:00u	0	-
+Rule	ChileAQ	1990	only	-	Sep	16	4:00u	1:00	S
+Rule	ChileAQ	1991	1996	-	Mar	Sun>=9	3:00u	0	-
+Rule	ChileAQ	1991	1997	-	Oct	Sun>=9	4:00u	1:00	S
+Rule	ChileAQ	1997	only	-	Mar	30	3:00u	0	-
+Rule	ChileAQ	1998	only	-	Mar	Sun>=9	3:00u	0	-
+Rule	ChileAQ	1998	only	-	Sep	27	4:00u	1:00	S
+Rule	ChileAQ	1999	only	-	Apr	 4	3:00u	0	-
+Rule	ChileAQ	1999	max	-	Oct	Sun>=9	4:00u	1:00	S
+Rule	ChileAQ	2000	max	-	Mar	Sun>=9	3:00u	0	-
+Zone Antarctica/Casey	0	-	zzz	1969
+			8:00	-	WST	# Western (Aus) Standard Time
+Zone Antarctica/Davis	0	-	zzz	1957 Jan 13
+			7:00	-	DAVT	1964 Nov # Davis Time
+			0	-	zzz	1969 Feb
+			7:00	-	DAVT
+Zone Antarctica/Mawson	0	-	zzz	1954 Feb 13
+			6:00	-	MAWT	# Mawson Time
+Zone Indian/Kerguelen	0	-	zzz	1950	# Port-aux-Francais
+			5:00	-	TFT	# ISO code TF Time
+Zone Antarctica/DumontDUrville 0 -	zzz	1947
+			10:00	-	PMT	1952 Jan 14 # Port-Martin Time
+			0	-	zzz	1956 Nov
+			10:00	-	DDUT	# Dumont-d'Urville Time
+Zone Antarctica/Syowa	0	-	zzz	1957 Jan 29
+			3:00	-	SYOT	# Syowa Time
+Rule	NZAQ	1974	only	-	Nov	 3	2:00s	1:00	D
+Rule	NZAQ	1975	1988	-	Oct	lastSun	2:00s	1:00	D
+Rule	NZAQ	1989	only	-	Oct	 8	2:00s	1:00	D
+Rule	NZAQ	1990	2006	-	Oct	Sun>=1	2:00s	1:00	D
+Rule	NZAQ	1975	only	-	Feb	23	2:00s	0	S
+Rule	NZAQ	1976	1989	-	Mar	Sun>=1	2:00s	0	S
+Rule	NZAQ	1990	2007	-	Mar	Sun>=15	2:00s	0	S
+Rule	NZAQ	2007	max	-	Sep	lastSun	2:00s	1:00	D
+Rule	NZAQ	2008	max	-	Apr	Sun>=1	2:00s	0	S
+Zone Antarctica/Vostok	0	-	zzz	1957 Dec 16
+			6:00	-	VOST	# Vostok time
+Zone Antarctica/Rothera	0	-	zzz	1976 Dec  1
+			-3:00	-	ROTT	# Rothera time
+Zone Antarctica/Palmer	0	-	zzz	1965
+			-4:00	ArgAQ	AR%sT	1969 Oct 5
+			-3:00	ArgAQ	AR%sT	1982 May
+			-4:00	ChileAQ	CL%sT
+Zone Antarctica/McMurdo	0	-	zzz	1956
+			12:00	NZAQ	NZ%sT
+Link	Antarctica/McMurdo	Antarctica/South_Pole
diff --git a/dojox/date/zoneinfo/asia b/dojox/date/zoneinfo/asia
new file mode 100644
index 0000000..4045327
--- /dev/null
+++ b/dojox/date/zoneinfo/asia
@@ -0,0 +1,720 @@
+Rule	EUAsia	1981	max	-	Mar	lastSun	 1:00u	1:00	S
+Rule	EUAsia	1979	1995	-	Sep	lastSun	 1:00u	0	-
+Rule	EUAsia	1996	max	-	Oct	lastSun	 1:00u	0	-
+Rule E-EurAsia	1981	max	-	Mar	lastSun	 0:00	1:00	S
+Rule E-EurAsia	1979	1995	-	Sep	lastSun	 0:00	0	-
+Rule E-EurAsia	1996	max	-	Oct	lastSun	 0:00	0	-
+Rule RussiaAsia	1981	1984	-	Apr	1	 0:00	1:00	S
+Rule RussiaAsia	1981	1983	-	Oct	1	 0:00	0	-
+Rule RussiaAsia	1984	1991	-	Sep	lastSun	 2:00s	0	-
+Rule RussiaAsia	1985	1991	-	Mar	lastSun	 2:00s	1:00	S
+Rule RussiaAsia	1992	only	-	Mar	lastSat	23:00	1:00	S
+Rule RussiaAsia	1992	only	-	Sep	lastSat	23:00	0	-
+Rule RussiaAsia	1993	max	-	Mar	lastSun	 2:00s	1:00	S
+Rule RussiaAsia	1993	1995	-	Sep	lastSun	 2:00s	0	-
+Rule RussiaAsia	1996	max	-	Oct	lastSun	 2:00s	0	-
+Zone	Asia/Kabul	4:36:48 -	LMT	1890
+			4:00	-	AFT	1945
+			4:30	-	AFT
+Zone	Asia/Yerevan	2:58:00 -	LMT	1924 May  2
+			3:00	-	YERT	1957 Mar    # Yerevan Time
+			4:00 RussiaAsia YER%sT	1991 Mar 31 2:00s
+			3:00	1:00	YERST	1991 Sep 23 # independence
+			3:00 RussiaAsia	AM%sT	1995 Sep 24 2:00s
+			4:00	-	AMT	1997
+			4:00 RussiaAsia	AM%sT
+Rule	Azer	1997	max	-	Mar	lastSun	 4:00	1:00	S
+Rule	Azer	1997	max	-	Oct	lastSun	 5:00	0	-
+Zone	Asia/Baku	3:19:24 -	LMT	1924 May  2
+			3:00	-	BAKT	1957 Mar    # Baku Time
+			4:00 RussiaAsia BAK%sT	1991 Mar 31 2:00s
+			3:00	1:00	BAKST	1991 Aug 30 # independence
+			3:00 RussiaAsia	AZ%sT	1992 Sep lastSat 23:00
+			4:00	-	AZT	1996 # Azerbaijan time
+			4:00	EUAsia	AZ%sT	1997
+			4:00	Azer	AZ%sT
+Zone	Asia/Bahrain	3:22:20 -	LMT	1920		# Al Manamah
+			4:00	-	GST	1972 Jun
+			3:00	-	AST
+Zone	Asia/Dhaka	6:01:40 -	LMT	1890
+			5:53:20	-	HMT	1941 Oct    # Howrah Mean Time?
+			6:30	-	BURT	1942 May 15 # Burma Time
+			5:30	-	IST	1942 Sep
+			6:30	-	BURT	1951 Sep 30
+			6:00	-	DACT	1971 Mar 26 # Dacca Time
+			6:00	-	BDT	2009 Jun 19 23:00 # Bangladesh Time
+			6:00	1:00	BDST	2010
+			6:00	-	BDT
+Zone	Asia/Thimphu	5:58:36 -	LMT	1947 Aug 15 # or Thimbu
+			5:30	-	IST	1987 Oct
+			6:00	-	BTT	# Bhutan Time
+Zone	Indian/Chagos	4:49:40	-	LMT	1907
+			5:00	-	IOT	1996 # BIOT Time
+			6:00	-	IOT
+Zone	Asia/Brunei	7:39:40 -	LMT	1926 Mar   # Bandar Seri Begawan
+			7:30	-	BNT	1933
+			8:00	-	BNT
+Zone	Asia/Rangoon	6:24:40 -	LMT	1880		# or Yangon
+			6:24:36	-	RMT	1920	   # Rangoon Mean Time?
+			6:30	-	BURT	1942 May   # Burma Time
+			9:00	-	JST	1945 May 3
+			6:30	-	MMT		   # Myanmar Time
+Zone	Asia/Phnom_Penh	6:59:40 -	LMT	1906 Jun  9
+			7:06:20	-	SMT	1911 Mar 11 0:01 # Saigon MT?
+			7:00	-	ICT	1912 May
+			8:00	-	ICT	1931 May
+			7:00	-	ICT
+Rule	Shang	1940	only	-	Jun	 3	0:00	1:00	D
+Rule	Shang	1940	1941	-	Oct	 1	0:00	0	S
+Rule	Shang	1941	only	-	Mar	16	0:00	1:00	D
+Rule	PRC	1986	only	-	May	 4	0:00	1:00	D
+Rule	PRC	1986	1991	-	Sep	Sun>=11	0:00	0	S
+Rule	PRC	1987	1991	-	Apr	Sun>=10	0:00	1:00	D
+Zone	Asia/Harbin	8:26:44	-	LMT	1928 # or Haerbin
+			8:30	-	CHAT	1932 Mar # Changbai Time
+			8:00	-	CST	1940
+			9:00	-	CHAT	1966 May
+			8:30	-	CHAT	1980 May
+			8:00	PRC	C%sT
+Zone	Asia/Shanghai	8:05:52	-	LMT	1928
+			8:00	Shang	C%sT	1949
+			8:00	PRC	C%sT
+Zone	Asia/Chongqing	7:06:20	-	LMT	1928 # or Chungking
+			7:00	-	LONT	1980 May # Long-shu Time
+			8:00	PRC	C%sT
+Zone	Asia/Urumqi	5:50:20	-	LMT	1928 # or Urumchi
+			6:00	-	URUT	1980 May # Urumqi Time
+			8:00	PRC	C%sT
+Zone	Asia/Kashgar	5:03:56	-	LMT	1928 # or Kashi or Kaxgar
+			5:30	-	KAST	1940	 # Kashgar Time
+			5:00	-	KAST	1980 May
+			8:00	PRC	C%sT
+Rule	HK	1946	only	-	Apr	20	3:30	1:00	S
+Rule	HK	1946	only	-	Dec	1	3:30	0	-
+Rule	HK	1947	only	-	Apr	13	3:30	1:00	S
+Rule	HK	1947	only	-	Dec	30	3:30	0	-
+Rule	HK	1948	only	-	May	2	3:30	1:00	S
+Rule	HK	1948	1952	-	Oct	lastSun	3:30	0	-
+Rule	HK	1949	1953	-	Apr	Sun>=1	3:30	1:00	S
+Rule	HK	1953	only	-	Nov	1	3:30	0	-
+Rule	HK	1954	1964	-	Mar	Sun>=18	3:30	1:00	S
+Rule	HK	1954	only	-	Oct	31	3:30	0	-
+Rule	HK	1955	1964	-	Nov	Sun>=1	3:30	0	-
+Rule	HK	1965	1977	-	Apr	Sun>=16	3:30	1:00	S
+Rule	HK	1965	1977	-	Oct	Sun>=16	3:30	0	-
+Rule	HK	1979	1980	-	May	Sun>=8	3:30	1:00	S
+Rule	HK	1979	1980	-	Oct	Sun>=16	3:30	0	-
+Zone	Asia/Hong_Kong	7:36:36 -	LMT	1904 Oct 30
+			8:00	HK	HK%sT
+Rule	Taiwan	1945	1951	-	May	1	0:00	1:00	D
+Rule	Taiwan	1945	1951	-	Oct	1	0:00	0	S
+Rule	Taiwan	1952	only	-	Mar	1	0:00	1:00	D
+Rule	Taiwan	1952	1954	-	Nov	1	0:00	0	S
+Rule	Taiwan	1953	1959	-	Apr	1	0:00	1:00	D
+Rule	Taiwan	1955	1961	-	Oct	1	0:00	0	S
+Rule	Taiwan	1960	1961	-	Jun	1	0:00	1:00	D
+Rule	Taiwan	1974	1975	-	Apr	1	0:00	1:00	D
+Rule	Taiwan	1974	1975	-	Oct	1	0:00	0	S
+Rule	Taiwan	1980	only	-	Jun	30	0:00	1:00	D
+Rule	Taiwan	1980	only	-	Sep	30	0:00	0	S
+Zone	Asia/Taipei	8:06:00 -	LMT	1896 # or Taibei or T'ai-pei
+			8:00	Taiwan	C%sT
+Rule	Macau	1961	1962	-	Mar	Sun>=16	3:30	1:00	S
+Rule	Macau	1961	1964	-	Nov	Sun>=1	3:30	0	-
+Rule	Macau	1963	only	-	Mar	Sun>=16	0:00	1:00	S
+Rule	Macau	1964	only	-	Mar	Sun>=16	3:30	1:00	S
+Rule	Macau	1965	only	-	Mar	Sun>=16	0:00	1:00	S
+Rule	Macau	1965	only	-	Oct	31	0:00	0	-
+Rule	Macau	1966	1971	-	Apr	Sun>=16	3:30	1:00	S
+Rule	Macau	1966	1971	-	Oct	Sun>=16	3:30	0	-
+Rule	Macau	1972	1974	-	Apr	Sun>=15	0:00	1:00	S
+Rule	Macau	1972	1973	-	Oct	Sun>=15	0:00	0	-
+Rule	Macau	1974	1977	-	Oct	Sun>=15	3:30	0	-
+Rule	Macau	1975	1977	-	Apr	Sun>=15	3:30	1:00	S
+Rule	Macau	1978	1980	-	Apr	Sun>=15	0:00	1:00	S
+Rule	Macau	1978	1980	-	Oct	Sun>=15	0:00	0	-
+Zone	Asia/Macau	7:34:20 -	LMT	1912
+			8:00	Macau	MO%sT	1999 Dec 20 # return to China
+			8:00	PRC	C%sT
+Rule	Cyprus	1975	only	-	Apr	13	0:00	1:00	S
+Rule	Cyprus	1975	only	-	Oct	12	0:00	0	-
+Rule	Cyprus	1976	only	-	May	15	0:00	1:00	S
+Rule	Cyprus	1976	only	-	Oct	11	0:00	0	-
+Rule	Cyprus	1977	1980	-	Apr	Sun>=1	0:00	1:00	S
+Rule	Cyprus	1977	only	-	Sep	25	0:00	0	-
+Rule	Cyprus	1978	only	-	Oct	2	0:00	0	-
+Rule	Cyprus	1979	1997	-	Sep	lastSun	0:00	0	-
+Rule	Cyprus	1981	1998	-	Mar	lastSun	0:00	1:00	S
+Zone	Asia/Nicosia	2:13:28 -	LMT	1921 Nov 14
+			2:00	Cyprus	EE%sT	1998 Sep
+			2:00	EUAsia	EE%sT
+Link	Asia/Nicosia	Europe/Nicosia
+Zone	Asia/Tbilisi	2:59:16 -	LMT	1880
+			2:59:16	-	TBMT	1924 May  2 # Tbilisi Mean Time
+			3:00	-	TBIT	1957 Mar    # Tbilisi Time
+			4:00 RussiaAsia TBI%sT	1991 Mar 31 2:00s
+			3:00	1:00	TBIST	1991 Apr  9 # independence
+			3:00 RussiaAsia GE%sT	1992 # Georgia Time
+			3:00 E-EurAsia	GE%sT	1994 Sep lastSun
+			4:00 E-EurAsia	GE%sT	1996 Oct lastSun
+			4:00	1:00	GEST	1997 Mar lastSun
+			4:00 E-EurAsia	GE%sT	2004 Jun 27
+			3:00 RussiaAsia	GE%sT	2005 Mar lastSun 2:00
+			4:00	-	GET
+Zone	Asia/Dili	8:22:20 -	LMT	1912
+			8:00	-	TLT	1942 Feb 21 23:00 # E Timor Time
+			9:00	-	JST	1945 Sep 23
+			9:00	-	TLT	1976 May  3
+			8:00	-	CIT	2000 Sep 17 00:00
+			9:00	-	TLT
+Zone	Asia/Kolkata	5:53:28 -	LMT	1880	# Kolkata
+			5:53:20	-	HMT	1941 Oct    # Howrah Mean Time?
+			6:30	-	BURT	1942 May 15 # Burma Time
+			5:30	-	IST	1942 Sep
+			5:30	1:00	IST	1945 Oct 15
+			5:30	-	IST
+Zone Asia/Jakarta	7:07:12 -	LMT	1867 Aug 10
+			7:07:12	-	JMT	1923 Dec 31 23:47:12 # Jakarta
+			7:20	-	JAVT	1932 Nov	 # Java Time
+			7:30	-	WIT	1942 Mar 23
+			9:00	-	JST	1945 Sep 23
+			7:30	-	WIT	1948 May
+			8:00	-	WIT	1950 May
+			7:30	-	WIT	1964
+			7:00	-	WIT
+Zone Asia/Pontianak	7:17:20	-	LMT	1908 May
+			7:17:20	-	PMT	1932 Nov    # Pontianak MT
+			7:30	-	WIT	1942 Jan 29
+			9:00	-	JST	1945 Sep 23
+			7:30	-	WIT	1948 May
+			8:00	-	WIT	1950 May
+			7:30	-	WIT	1964
+			8:00	-	CIT	1988 Jan  1
+			7:00	-	WIT
+Zone Asia/Makassar	7:57:36 -	LMT	1920
+			7:57:36	-	MMT	1932 Nov    # Macassar MT
+			8:00	-	CIT	1942 Feb  9
+			9:00	-	JST	1945 Sep 23
+			8:00	-	CIT
+Zone Asia/Jayapura	9:22:48 -	LMT	1932 Nov
+			9:00	-	EIT	1944 Sep  1
+			9:30	-	CST	1964
+			9:00	-	EIT
+Rule	Iran	1978	1980	-	Mar	21	0:00	1:00	D
+Rule	Iran	1978	only	-	Oct	21	0:00	0	S
+Rule	Iran	1979	only	-	Sep	19	0:00	0	S
+Rule	Iran	1980	only	-	Sep	23	0:00	0	S
+Rule	Iran	1991	only	-	May	 3	0:00	1:00	D
+Rule	Iran	1992	1995	-	Mar	22	0:00	1:00	D
+Rule	Iran	1991	1995	-	Sep	22	0:00	0	S
+Rule	Iran	1996	only	-	Mar	21	0:00	1:00	D
+Rule	Iran	1996	only	-	Sep	21	0:00	0	S
+Rule	Iran	1997	1999	-	Mar	22	0:00	1:00	D
+Rule	Iran	1997	1999	-	Sep	22	0:00	0	S
+Rule	Iran	2000	only	-	Mar	21	0:00	1:00	D
+Rule	Iran	2000	only	-	Sep	21	0:00	0	S
+Rule	Iran	2001	2003	-	Mar	22	0:00	1:00	D
+Rule	Iran	2001	2003	-	Sep	22	0:00	0	S
+Rule	Iran	2004	only	-	Mar	21	0:00	1:00	D
+Rule	Iran	2004	only	-	Sep	21	0:00	0	S
+Rule	Iran	2005	only	-	Mar	22	0:00	1:00	D
+Rule	Iran	2005	only	-	Sep	22	0:00	0	S
+Rule	Iran	2008	only	-	Mar	21	0:00	1:00	D
+Rule	Iran	2008	only	-	Sep	21	0:00	0	S
+Rule	Iran	2009	2011	-	Mar	22	0:00	1:00	D
+Rule	Iran	2009	2011	-	Sep	22	0:00	0	S
+Rule	Iran	2012	only	-	Mar	21	0:00	1:00	D
+Rule	Iran	2012	only	-	Sep	21	0:00	0	S
+Rule	Iran	2013	2015	-	Mar	22	0:00	1:00	D
+Rule	Iran	2013	2015	-	Sep	22	0:00	0	S
+Rule	Iran	2016	only	-	Mar	21	0:00	1:00	D
+Rule	Iran	2016	only	-	Sep	21	0:00	0	S
+Rule	Iran	2017	2019	-	Mar	22	0:00	1:00	D
+Rule	Iran	2017	2019	-	Sep	22	0:00	0	S
+Rule	Iran	2020	only	-	Mar	21	0:00	1:00	D
+Rule	Iran	2020	only	-	Sep	21	0:00	0	S
+Rule	Iran	2021	2023	-	Mar	22	0:00	1:00	D
+Rule	Iran	2021	2023	-	Sep	22	0:00	0	S
+Rule	Iran	2024	only	-	Mar	21	0:00	1:00	D
+Rule	Iran	2024	only	-	Sep	21	0:00	0	S
+Rule	Iran	2025	2027	-	Mar	22	0:00	1:00	D
+Rule	Iran	2025	2027	-	Sep	22	0:00	0	S
+Rule	Iran	2028	2029	-	Mar	21	0:00	1:00	D
+Rule	Iran	2028	2029	-	Sep	21	0:00	0	S
+Rule	Iran	2030	2031	-	Mar	22	0:00	1:00	D
+Rule	Iran	2030	2031	-	Sep	22	0:00	0	S
+Rule	Iran	2032	2033	-	Mar	21	0:00	1:00	D
+Rule	Iran	2032	2033	-	Sep	21	0:00	0	S
+Rule	Iran	2034	2035	-	Mar	22	0:00	1:00	D
+Rule	Iran	2034	2035	-	Sep	22	0:00	0	S
+Rule	Iran	2036	2037	-	Mar	21	0:00	1:00	D
+Rule	Iran	2036	2037	-	Sep	21	0:00	0	S
+Zone	Asia/Tehran	3:25:44	-	LMT	1916
+			3:25:44	-	TMT	1946	# Tehran Mean Time
+			3:30	-	IRST	1977 Nov
+			4:00	Iran	IR%sT	1979
+			3:30	Iran	IR%sT
+Rule	Iraq	1982	only	-	May	1	0:00	1:00	D
+Rule	Iraq	1982	1984	-	Oct	1	0:00	0	S
+Rule	Iraq	1983	only	-	Mar	31	0:00	1:00	D
+Rule	Iraq	1984	1985	-	Apr	1	0:00	1:00	D
+Rule	Iraq	1985	1990	-	Sep	lastSun	1:00s	0	S
+Rule	Iraq	1986	1990	-	Mar	lastSun	1:00s	1:00	D
+Rule	Iraq	1991	2007	-	Apr	 1	3:00s	1:00	D
+Rule	Iraq	1991	2007	-	Oct	 1	3:00s	0	S
+Zone	Asia/Baghdad	2:57:40	-	LMT	1890
+			2:57:36	-	BMT	1918	    # Baghdad Mean Time?
+			3:00	-	AST	1982 May
+			3:00	Iraq	A%sT
+Rule	Zion	1940	only	-	Jun	 1	0:00	1:00	D
+Rule	Zion	1942	1944	-	Nov	 1	0:00	0	S
+Rule	Zion	1943	only	-	Apr	 1	2:00	1:00	D
+Rule	Zion	1944	only	-	Apr	 1	0:00	1:00	D
+Rule	Zion	1945	only	-	Apr	16	0:00	1:00	D
+Rule	Zion	1945	only	-	Nov	 1	2:00	0	S
+Rule	Zion	1946	only	-	Apr	16	2:00	1:00	D
+Rule	Zion	1946	only	-	Nov	 1	0:00	0	S
+Rule	Zion	1948	only	-	May	23	0:00	2:00	DD
+Rule	Zion	1948	only	-	Sep	 1	0:00	1:00	D
+Rule	Zion	1948	1949	-	Nov	 1	2:00	0	S
+Rule	Zion	1949	only	-	May	 1	0:00	1:00	D
+Rule	Zion	1950	only	-	Apr	16	0:00	1:00	D
+Rule	Zion	1950	only	-	Sep	15	3:00	0	S
+Rule	Zion	1951	only	-	Apr	 1	0:00	1:00	D
+Rule	Zion	1951	only	-	Nov	11	3:00	0	S
+Rule	Zion	1952	only	-	Apr	20	2:00	1:00	D
+Rule	Zion	1952	only	-	Oct	19	3:00	0	S
+Rule	Zion	1953	only	-	Apr	12	2:00	1:00	D
+Rule	Zion	1953	only	-	Sep	13	3:00	0	S
+Rule	Zion	1954	only	-	Jun	13	0:00	1:00	D
+Rule	Zion	1954	only	-	Sep	12	0:00	0	S
+Rule	Zion	1955	only	-	Jun	11	2:00	1:00	D
+Rule	Zion	1955	only	-	Sep	11	0:00	0	S
+Rule	Zion	1956	only	-	Jun	 3	0:00	1:00	D
+Rule	Zion	1956	only	-	Sep	30	3:00	0	S
+Rule	Zion	1957	only	-	Apr	29	2:00	1:00	D
+Rule	Zion	1957	only	-	Sep	22	0:00	0	S
+Rule	Zion	1974	only	-	Jul	 7	0:00	1:00	D
+Rule	Zion	1974	only	-	Oct	13	0:00	0	S
+Rule	Zion	1975	only	-	Apr	20	0:00	1:00	D
+Rule	Zion	1975	only	-	Aug	31	0:00	0	S
+Rule	Zion	1985	only	-	Apr	14	0:00	1:00	D
+Rule	Zion	1985	only	-	Sep	15	0:00	0	S
+Rule	Zion	1986	only	-	May	18	0:00	1:00	D
+Rule	Zion	1986	only	-	Sep	 7	0:00	0	S
+Rule	Zion	1987	only	-	Apr	15	0:00	1:00	D
+Rule	Zion	1987	only	-	Sep	13	0:00	0	S
+Rule	Zion	1988	only	-	Apr	 9	0:00	1:00	D
+Rule	Zion	1988	only	-	Sep	 3	0:00	0	S
+Rule	Zion	1989	only	-	Apr	30	0:00	1:00	D
+Rule	Zion	1989	only	-	Sep	 3	0:00	0	S
+Rule	Zion	1990	only	-	Mar	25	0:00	1:00	D
+Rule	Zion	1990	only	-	Aug	26	0:00	0	S
+Rule	Zion	1991	only	-	Mar	24	0:00	1:00	D
+Rule	Zion	1991	only	-	Sep	 1	0:00	0	S
+Rule	Zion	1992	only	-	Mar	29	0:00	1:00	D
+Rule	Zion	1992	only	-	Sep	 6	0:00	0	S
+Rule	Zion	1993	only	-	Apr	 2	0:00	1:00	D
+Rule	Zion	1993	only	-	Sep	 5	0:00	0	S
+Rule	Zion	1994	only	-	Apr	 1	0:00	1:00	D
+Rule	Zion	1994	only	-	Aug	28	0:00	0	S
+Rule	Zion	1995	only	-	Mar	31	0:00	1:00	D
+Rule	Zion	1995	only	-	Sep	 3	0:00	0	S
+Rule	Zion	1996	only	-	Mar	15	0:00	1:00	D
+Rule	Zion	1996	only	-	Sep	16	0:00	0	S
+Rule	Zion	1997	only	-	Mar	21	0:00	1:00	D
+Rule	Zion	1997	only	-	Sep	14	0:00	0	S
+Rule	Zion	1998	only	-	Mar	20	0:00	1:00	D
+Rule	Zion	1998	only	-	Sep	 6	0:00	0	S
+Rule	Zion	1999	only	-	Apr	 2	2:00	1:00	D
+Rule	Zion	1999	only	-	Sep	 3	2:00	0	S
+Rule	Zion	2000	only	-	Apr	14	2:00	1:00	D
+Rule	Zion	2000	only	-	Oct	 6	1:00	0	S
+Rule	Zion	2001	only	-	Apr	 9	1:00	1:00	D
+Rule	Zion	2001	only	-	Sep	24	1:00	0	S
+Rule	Zion	2002	only	-	Mar	29	1:00	1:00	D
+Rule	Zion	2002	only	-	Oct	 7	1:00	0	S
+Rule	Zion	2003	only	-	Mar	28	1:00	1:00	D
+Rule	Zion	2003	only	-	Oct	 3	1:00	0	S
+Rule	Zion	2004	only	-	Apr	 7	1:00	1:00	D
+Rule	Zion	2004	only	-	Sep	22	1:00	0	S
+Rule	Zion	2005	only	-	Apr	 1	2:00	1:00	D
+Rule	Zion	2005	only	-	Oct	 9	2:00	0	S
+Rule	Zion	2006	2010	-	Mar	Fri>=26	2:00	1:00	D
+Rule	Zion	2006	only	-	Oct	 1	2:00	0	S
+Rule	Zion	2007	only	-	Sep	16	2:00	0	S
+Rule	Zion	2008	only	-	Oct	 5	2:00	0	S
+Rule	Zion	2009	only	-	Sep	27	2:00	0	S
+Rule	Zion	2010	only	-	Sep	12	2:00	0	S
+Rule	Zion	2011	only	-	Apr	 1	2:00	1:00	D
+Rule	Zion	2011	only	-	Oct	 2	2:00	0	S
+Rule	Zion	2012	2015	-	Mar	Fri>=26	2:00	1:00	D
+Rule	Zion	2012	only	-	Sep	23	2:00	0	S
+Rule	Zion	2013	only	-	Sep	 8	2:00	0	S
+Rule	Zion	2014	only	-	Sep	28	2:00	0	S
+Rule	Zion	2015	only	-	Sep	20	2:00	0	S
+Rule	Zion	2016	only	-	Apr	 1	2:00	1:00	D
+Rule	Zion	2016	only	-	Oct	 9	2:00	0	S
+Rule	Zion	2017	2021	-	Mar	Fri>=26	2:00	1:00	D
+Rule	Zion	2017	only	-	Sep	24	2:00	0	S
+Rule	Zion	2018	only	-	Sep	16	2:00	0	S
+Rule	Zion	2019	only	-	Oct	 6	2:00	0	S
+Rule	Zion	2020	only	-	Sep	27	2:00	0	S
+Rule	Zion	2021	only	-	Sep	12	2:00	0	S
+Rule	Zion	2022	only	-	Apr	 1	2:00	1:00	D
+Rule	Zion	2022	only	-	Oct	 2	2:00	0	S
+Rule	Zion	2023	2032	-	Mar	Fri>=26	2:00	1:00	D
+Rule	Zion	2023	only	-	Sep	24	2:00	0	S
+Rule	Zion	2024	only	-	Oct	 6	2:00	0	S
+Rule	Zion	2025	only	-	Sep	28	2:00	0	S
+Rule	Zion	2026	only	-	Sep	20	2:00	0	S
+Rule	Zion	2027	only	-	Oct	10	2:00	0	S
+Rule	Zion	2028	only	-	Sep	24	2:00	0	S
+Rule	Zion	2029	only	-	Sep	16	2:00	0	S
+Rule	Zion	2030	only	-	Oct	 6	2:00	0	S
+Rule	Zion	2031	only	-	Sep	21	2:00	0	S
+Rule	Zion	2032	only	-	Sep	12	2:00	0	S
+Rule	Zion	2033	only	-	Apr	 1	2:00	1:00	D
+Rule	Zion	2033	only	-	Oct	 2	2:00	0	S
+Rule	Zion	2034	2037	-	Mar	Fri>=26	2:00	1:00	D
+Rule	Zion	2034	only	-	Sep	17	2:00	0	S
+Rule	Zion	2035	only	-	Oct	 7	2:00	0	S
+Rule	Zion	2036	only	-	Sep	28	2:00	0	S
+Rule	Zion	2037	only	-	Sep	13	2:00	0	S
+Zone	Asia/Jerusalem	2:20:56 -	LMT	1880
+			2:20:40	-	JMT	1918	# Jerusalem Mean Time?
+			2:00	Zion	I%sT
+Rule	Japan	1948	only	-	May	Sun>=1	2:00	1:00	D
+Rule	Japan	1948	1951	-	Sep	Sat>=8	2:00	0	S
+Rule	Japan	1949	only	-	Apr	Sun>=1	2:00	1:00	D
+Rule	Japan	1950	1951	-	May	Sun>=1	2:00	1:00	D
+Zone	Asia/Tokyo	9:18:59	-	LMT	1887 Dec 31 15:00u
+			9:00	-	JST	1896
+			9:00	-	CJT	1938
+			9:00	Japan	J%sT
+Rule	Jordan	1973	only	-	Jun	6	0:00	1:00	S
+Rule	Jordan	1973	1975	-	Oct	1	0:00	0	-
+Rule	Jordan	1974	1977	-	May	1	0:00	1:00	S
+Rule	Jordan	1976	only	-	Nov	1	0:00	0	-
+Rule	Jordan	1977	only	-	Oct	1	0:00	0	-
+Rule	Jordan	1978	only	-	Apr	30	0:00	1:00	S
+Rule	Jordan	1978	only	-	Sep	30	0:00	0	-
+Rule	Jordan	1985	only	-	Apr	1	0:00	1:00	S
+Rule	Jordan	1985	only	-	Oct	1	0:00	0	-
+Rule	Jordan	1986	1988	-	Apr	Fri>=1	0:00	1:00	S
+Rule	Jordan	1986	1990	-	Oct	Fri>=1	0:00	0	-
+Rule	Jordan	1989	only	-	May	8	0:00	1:00	S
+Rule	Jordan	1990	only	-	Apr	27	0:00	1:00	S
+Rule	Jordan	1991	only	-	Apr	17	0:00	1:00	S
+Rule	Jordan	1991	only	-	Sep	27	0:00	0	-
+Rule	Jordan	1992	only	-	Apr	10	0:00	1:00	S
+Rule	Jordan	1992	1993	-	Oct	Fri>=1	0:00	0	-
+Rule	Jordan	1993	1998	-	Apr	Fri>=1	0:00	1:00	S
+Rule	Jordan	1994	only	-	Sep	Fri>=15	0:00	0	-
+Rule	Jordan	1995	1998	-	Sep	Fri>=15	0:00s	0	-
+Rule	Jordan	1999	only	-	Jul	 1	0:00s	1:00	S
+Rule	Jordan	1999	2002	-	Sep	lastFri	0:00s	0	-
+Rule	Jordan	2000	2001	-	Mar	lastThu	0:00s	1:00	S
+Rule	Jordan	2002	max	-	Mar	lastThu	24:00	1:00	S
+Rule	Jordan	2003	only	-	Oct	24	0:00s	0	-
+Rule	Jordan	2004	only	-	Oct	15	0:00s	0	-
+Rule	Jordan	2005	only	-	Sep	lastFri	0:00s	0	-
+Rule	Jordan	2006	max	-	Oct	lastFri	0:00s	0	-
+Zone	Asia/Amman	2:23:44 -	LMT	1931
+			2:00	Jordan	EE%sT
+Zone	Asia/Almaty	5:07:48 -	LMT	1924 May  2 # or Alma-Ata
+			5:00	-	ALMT	1930 Jun 21 # Alma-Ata Time
+			6:00 RussiaAsia ALM%sT	1991
+			6:00	-	ALMT	1992
+			6:00 RussiaAsia	ALM%sT	2005 Mar 15
+			6:00	-	ALMT
+Zone	Asia/Qyzylorda	4:21:52 -	LMT	1924 May  2
+			4:00	-	KIZT	1930 Jun 21 # Kizilorda Time
+			5:00	-	KIZT	1981 Apr  1
+			5:00	1:00	KIZST	1981 Oct  1
+			6:00	-	KIZT	1982 Apr  1
+			5:00 RussiaAsia	KIZ%sT	1991
+			5:00	-	KIZT	1991 Dec 16 # independence
+			5:00	-	QYZT	1992 Jan 19 2:00
+			6:00 RussiaAsia	QYZ%sT	2005 Mar 15
+			6:00	-	QYZT
+Zone	Asia/Aqtobe	3:48:40	-	LMT	1924 May  2
+			4:00	-	AKTT	1930 Jun 21 # Aktyubinsk Time
+			5:00	-	AKTT	1981 Apr  1
+			5:00	1:00	AKTST	1981 Oct  1
+			6:00	-	AKTT	1982 Apr  1
+			5:00 RussiaAsia	AKT%sT	1991
+			5:00	-	AKTT	1991 Dec 16 # independence
+			5:00 RussiaAsia	AQT%sT	2005 Mar 15 # Aqtobe Time
+			5:00	-	AQTT
+Zone	Asia/Aqtau	3:21:04	-	LMT	1924 May  2
+			4:00	-	FORT	1930 Jun 21 # Fort Shevchenko T
+			5:00	-	FORT	1963
+			5:00	-	SHET	1981 Oct  1 # Shevchenko Time
+			6:00	-	SHET	1982 Apr  1
+			5:00 RussiaAsia	SHE%sT	1991
+			5:00	-	SHET	1991 Dec 16 # independence
+			5:00 RussiaAsia	AQT%sT	1995 Mar lastSun 2:00 # Aqtau Time
+			4:00 RussiaAsia	AQT%sT	2005 Mar 15
+			5:00	-	AQTT
+Zone	Asia/Oral	3:25:24	-	LMT	1924 May  2 # or Ural'sk
+			4:00	-	URAT	1930 Jun 21 # Ural'sk time
+			5:00	-	URAT	1981 Apr  1
+			5:00	1:00	URAST	1981 Oct  1
+			6:00	-	URAT	1982 Apr  1
+			5:00 RussiaAsia	URA%sT	1989 Mar 26 2:00
+			4:00 RussiaAsia	URA%sT	1991
+			4:00	-	URAT	1991 Dec 16 # independence
+			4:00 RussiaAsia	ORA%sT	2005 Mar 15 # Oral Time
+			5:00	-	ORAT
+Rule	Kyrgyz	1992	1996	-	Apr	Sun>=7	0:00s	1:00	S
+Rule	Kyrgyz	1992	1996	-	Sep	lastSun	0:00	0	-
+Rule	Kyrgyz	1997	2005	-	Mar	lastSun	2:30	1:00	S
+Rule	Kyrgyz	1997	2004	-	Oct	lastSun	2:30	0	-
+Zone	Asia/Bishkek	4:58:24 -	LMT	1924 May  2
+			5:00	-	FRUT	1930 Jun 21 # Frunze Time
+			6:00 RussiaAsia FRU%sT	1991 Mar 31 2:00s
+			5:00	1:00	FRUST	1991 Aug 31 2:00 # independence
+			5:00	Kyrgyz	KG%sT	2005 Aug 12    # Kyrgyzstan Time
+			6:00	-	KGT
+Rule	ROK	1960	only	-	May	15	0:00	1:00	D
+Rule	ROK	1960	only	-	Sep	13	0:00	0	S
+Rule	ROK	1987	1988	-	May	Sun>=8	0:00	1:00	D
+Rule	ROK	1987	1988	-	Oct	Sun>=8	0:00	0	S
+Zone	Asia/Seoul	8:27:52	-	LMT	1890
+			8:30	-	KST	1904 Dec
+			9:00	-	KST	1928
+			8:30	-	KST	1932
+			9:00	-	KST	1954 Mar 21
+			8:00	ROK	K%sT	1961 Aug 10
+			8:30	-	KST	1968 Oct
+			9:00	ROK	K%sT
+Zone	Asia/Pyongyang	8:23:00 -	LMT	1890
+			8:30	-	KST	1904 Dec
+			9:00	-	KST	1928
+			8:30	-	KST	1932
+			9:00	-	KST	1954 Mar 21
+			8:00	-	KST	1961 Aug 10
+			9:00	-	KST
+Zone	Asia/Kuwait	3:11:56 -	LMT	1950
+			3:00	-	AST
+Zone	Asia/Vientiane	6:50:24 -	LMT	1906 Jun  9 # or Viangchan
+			7:06:20	-	SMT	1911 Mar 11 0:01 # Saigon MT?
+			7:00	-	ICT	1912 May
+			8:00	-	ICT	1931 May
+			7:00	-	ICT
+Rule	Lebanon	1920	only	-	Mar	28	0:00	1:00	S
+Rule	Lebanon	1920	only	-	Oct	25	0:00	0	-
+Rule	Lebanon	1921	only	-	Apr	3	0:00	1:00	S
+Rule	Lebanon	1921	only	-	Oct	3	0:00	0	-
+Rule	Lebanon	1922	only	-	Mar	26	0:00	1:00	S
+Rule	Lebanon	1922	only	-	Oct	8	0:00	0	-
+Rule	Lebanon	1923	only	-	Apr	22	0:00	1:00	S
+Rule	Lebanon	1923	only	-	Sep	16	0:00	0	-
+Rule	Lebanon	1957	1961	-	May	1	0:00	1:00	S
+Rule	Lebanon	1957	1961	-	Oct	1	0:00	0	-
+Rule	Lebanon	1972	only	-	Jun	22	0:00	1:00	S
+Rule	Lebanon	1972	1977	-	Oct	1	0:00	0	-
+Rule	Lebanon	1973	1977	-	May	1	0:00	1:00	S
+Rule	Lebanon	1978	only	-	Apr	30	0:00	1:00	S
+Rule	Lebanon	1978	only	-	Sep	30	0:00	0	-
+Rule	Lebanon	1984	1987	-	May	1	0:00	1:00	S
+Rule	Lebanon	1984	1991	-	Oct	16	0:00	0	-
+Rule	Lebanon	1988	only	-	Jun	1	0:00	1:00	S
+Rule	Lebanon	1989	only	-	May	10	0:00	1:00	S
+Rule	Lebanon	1990	1992	-	May	1	0:00	1:00	S
+Rule	Lebanon	1992	only	-	Oct	4	0:00	0	-
+Rule	Lebanon	1993	max	-	Mar	lastSun	0:00	1:00	S
+Rule	Lebanon	1993	1998	-	Sep	lastSun	0:00	0	-
+Rule	Lebanon	1999	max	-	Oct	lastSun	0:00	0	-
+Zone	Asia/Beirut	2:22:00 -	LMT	1880
+			2:00	Lebanon	EE%sT
+Rule	NBorneo	1935	1941	-	Sep	14	0:00	0:20	TS # one-Third Summer
+Rule	NBorneo	1935	1941	-	Dec	14	0:00	0	-
+Zone Asia/Kuala_Lumpur	6:46:46 -	LMT	1901 Jan  1
+			6:55:25	-	SMT	1905 Jun  1 # Singapore M.T.
+			7:00	-	MALT	1933 Jan  1 # Malaya Time
+			7:00	0:20	MALST	1936 Jan  1
+			7:20	-	MALT	1941 Sep  1
+			7:30	-	MALT	1942 Feb 16
+			9:00	-	JST	1945 Sep 12
+			7:30	-	MALT	1982 Jan  1
+			8:00	-	MYT	# Malaysia Time
+Zone Asia/Kuching	7:21:20	-	LMT	1926 Mar
+			7:30	-	BORT	1933	# Borneo Time
+			8:00	NBorneo	BOR%sT	1942 Feb 16
+			9:00	-	JST	1945 Sep 12
+			8:00	-	BORT	1982 Jan  1
+			8:00	-	MYT
+Zone	Indian/Maldives	4:54:00 -	LMT	1880	# Male
+			4:54:00	-	MMT	1960	# Male Mean Time
+			5:00	-	MVT		# Maldives Time
+Rule	Mongol	1983	1984	-	Apr	1	0:00	1:00	S
+Rule	Mongol	1983	only	-	Oct	1	0:00	0	-
+Rule	Mongol	1985	1998	-	Mar	lastSun	0:00	1:00	S
+Rule	Mongol	1984	1998	-	Sep	lastSun	0:00	0	-
+Rule	Mongol	2001	only	-	Apr	lastSat	2:00	1:00	S
+Rule	Mongol	2001	2006	-	Sep	lastSat	2:00	0	-
+Rule	Mongol	2002	2006	-	Mar	lastSat	2:00	1:00	S
+Zone	Asia/Hovd	6:06:36 -	LMT	1905 Aug
+			6:00	-	HOVT	1978	# Hovd Time
+			7:00	Mongol	HOV%sT
+Zone	Asia/Ulaanbaatar 7:07:32 -	LMT	1905 Aug
+			7:00	-	ULAT	1978	# Ulaanbaatar Time
+			8:00	Mongol	ULA%sT
+Zone	Asia/Choibalsan	7:38:00 -	LMT	1905 Aug
+			7:00	-	ULAT	1978
+			8:00	-	ULAT	1983 Apr
+			9:00	Mongol	CHO%sT	2008 Mar 31 # Choibalsan Time
+			8:00	Mongol	CHO%sT
+Zone	Asia/Kathmandu	5:41:16 -	LMT	1920
+			5:30	-	IST	1986
+			5:45	-	NPT	# Nepal Time
+Zone	Asia/Muscat	3:54:20 -	LMT	1920
+			4:00	-	GST
+Rule Pakistan	2002	only	-	Apr	Sun>=2	0:01	1:00	S
+Rule Pakistan	2002	only	-	Oct	Sun>=2	0:01	0	-
+Rule Pakistan	2008	only	-	Jun	1	0:00	1:00	S
+Rule Pakistan	2008	only	-	Nov	1	0:00	0	-
+Rule Pakistan	2009	only	-	Apr	15	0:00	1:00	S
+Rule Pakistan	2009	only	-	Nov	1	0:00	0	-
+Zone	Asia/Karachi	4:28:12 -	LMT	1907
+			5:30	-	IST	1942 Sep
+			5:30	1:00	IST	1945 Oct 15
+			5:30	-	IST	1951 Sep 30
+			5:00	-	KART	1971 Mar 26 # Karachi Time
+			5:00 Pakistan	PK%sT	# Pakistan Time
+Rule EgyptAsia	1957	only	-	May	10	0:00	1:00	S
+Rule EgyptAsia	1957	1958	-	Oct	 1	0:00	0	-
+Rule EgyptAsia	1958	only	-	May	 1	0:00	1:00	S
+Rule EgyptAsia	1959	1967	-	May	 1	1:00	1:00	S
+Rule EgyptAsia	1959	1965	-	Sep	30	3:00	0	-
+Rule EgyptAsia	1966	only	-	Oct	 1	3:00	0	-
+Rule Palestine	1999	2005	-	Apr	Fri>=15	0:00	1:00	S
+Rule Palestine	1999	2003	-	Oct	Fri>=15	0:00	0	-
+Rule Palestine	2004	only	-	Oct	 1	1:00	0	-
+Rule Palestine	2005	only	-	Oct	 4	2:00	0	-
+Rule Palestine	2006	2008	-	Apr	 1	0:00	1:00	S
+Rule Palestine	2006	only	-	Sep	22	0:00	0	-
+Rule Palestine	2007	only	-	Sep	Thu>=8	2:00	0	-
+Rule Palestine	2008	only	-	Aug	lastFri	2:00	0	-
+Rule Palestine	2009	max	-	Mar	lastFri	0:00	1:00	S
+Rule Palestine	2009	max	-	Sep	lastMon	2:00	0	-
+Zone	Asia/Gaza	2:17:52	-	LMT	1900 Oct
+			2:00	Zion	EET	1948 May 15
+			2:00 EgyptAsia	EE%sT	1967 Jun  5
+			2:00	Zion	I%sT	1996
+			2:00	Jordan	EE%sT	1999
+			2:00 Palestine	EE%sT
+Rule	Phil	1936	only	-	Nov	1	0:00	1:00	S
+Rule	Phil	1937	only	-	Feb	1	0:00	0	-
+Rule	Phil	1954	only	-	Apr	12	0:00	1:00	S
+Rule	Phil	1954	only	-	Jul	1	0:00	0	-
+Rule	Phil	1978	only	-	Mar	22	0:00	1:00	S
+Rule	Phil	1978	only	-	Sep	21	0:00	0	-
+Zone	Asia/Manila	-15:56:00 -	LMT	1844 Dec 31
+			8:04:00 -	LMT	1899 May 11
+			8:00	Phil	PH%sT	1942 May
+			9:00	-	JST	1944 Nov
+			8:00	Phil	PH%sT
+Zone	Asia/Qatar	3:26:08 -	LMT	1920	# Al Dawhah / Doha
+			4:00	-	GST	1972 Jun
+			3:00	-	AST
+Zone	Asia/Riyadh	3:06:52 -	LMT	1950
+			3:00	-	AST
+Zone	Asia/Singapore	6:55:25 -	LMT	1901 Jan  1
+			6:55:25	-	SMT	1905 Jun  1 # Singapore M.T.
+			7:00	-	MALT	1933 Jan  1 # Malaya Time
+			7:00	0:20	MALST	1936 Jan  1
+			7:20	-	MALT	1941 Sep  1
+			7:30	-	MALT	1942 Feb 16
+			9:00	-	JST	1945 Sep 12
+			7:30	-	MALT	1965 Aug  9 # independence
+			7:30	-	SGT	1982 Jan  1 # Singapore Time
+			8:00	-	SGT
+Zone	Asia/Colombo	5:19:24 -	LMT	1880
+			5:19:32	-	MMT	1906	# Moratuwa Mean Time
+			5:30	-	IST	1942 Jan  5
+			5:30	0:30	IHST	1942 Sep
+			5:30	1:00	IST	1945 Oct 16 2:00
+			5:30	-	IST	1996 May 25 0:00
+			6:30	-	LKT	1996 Oct 26 0:30
+			6:00	-	LKT	2006 Apr 15 0:30
+			5:30	-	IST
+Rule	Syria	1920	1923	-	Apr	Sun>=15	2:00	1:00	S
+Rule	Syria	1920	1923	-	Oct	Sun>=1	2:00	0	-
+Rule	Syria	1962	only	-	Apr	29	2:00	1:00	S
+Rule	Syria	1962	only	-	Oct	1	2:00	0	-
+Rule	Syria	1963	1965	-	May	1	2:00	1:00	S
+Rule	Syria	1963	only	-	Sep	30	2:00	0	-
+Rule	Syria	1964	only	-	Oct	1	2:00	0	-
+Rule	Syria	1965	only	-	Sep	30	2:00	0	-
+Rule	Syria	1966	only	-	Apr	24	2:00	1:00	S
+Rule	Syria	1966	1976	-	Oct	1	2:00	0	-
+Rule	Syria	1967	1978	-	May	1	2:00	1:00	S
+Rule	Syria	1977	1978	-	Sep	1	2:00	0	-
+Rule	Syria	1983	1984	-	Apr	9	2:00	1:00	S
+Rule	Syria	1983	1984	-	Oct	1	2:00	0	-
+Rule	Syria	1986	only	-	Feb	16	2:00	1:00	S
+Rule	Syria	1986	only	-	Oct	9	2:00	0	-
+Rule	Syria	1987	only	-	Mar	1	2:00	1:00	S
+Rule	Syria	1987	1988	-	Oct	31	2:00	0	-
+Rule	Syria	1988	only	-	Mar	15	2:00	1:00	S
+Rule	Syria	1989	only	-	Mar	31	2:00	1:00	S
+Rule	Syria	1989	only	-	Oct	1	2:00	0	-
+Rule	Syria	1990	only	-	Apr	1	2:00	1:00	S
+Rule	Syria	1990	only	-	Sep	30	2:00	0	-
+Rule	Syria	1991	only	-	Apr	 1	0:00	1:00	S
+Rule	Syria	1991	1992	-	Oct	 1	0:00	0	-
+Rule	Syria	1992	only	-	Apr	 8	0:00	1:00	S
+Rule	Syria	1993	only	-	Mar	26	0:00	1:00	S
+Rule	Syria	1993	only	-	Sep	25	0:00	0	-
+Rule	Syria	1994	1996	-	Apr	 1	0:00	1:00	S
+Rule	Syria	1994	2005	-	Oct	 1	0:00	0	-
+Rule	Syria	1997	1998	-	Mar	lastMon	0:00	1:00	S
+Rule	Syria	1999	2006	-	Apr	 1	0:00	1:00	S
+Rule	Syria	2006	only	-	Sep	22	0:00	0	-
+Rule	Syria	2007	only	-	Mar	lastFri	0:00	1:00	S
+Rule	Syria	2007	only	-	Nov	 Fri>=1	0:00	0	-
+Rule	Syria	2008	only	-	Apr	Fri>=1	0:00	1:00	S
+Rule	Syria	2008	max	-	Nov	1	0:00	0	-
+Rule	Syria	2009	max	-	Mar	lastFri	0:00	1:00	S
+Zone	Asia/Damascus	2:25:12 -	LMT	1920	# Dimashq
+			2:00	Syria	EE%sT
+Zone	Asia/Dushanbe	4:35:12 -	LMT	1924 May  2
+			5:00	-	DUST	1930 Jun 21 # Dushanbe Time
+			6:00 RussiaAsia DUS%sT	1991 Mar 31 2:00s
+			5:00	1:00	DUSST	1991 Sep  9 2:00s
+			5:00	-	TJT		    # Tajikistan Time
+Zone	Asia/Bangkok	6:42:04	-	LMT	1880
+			6:42:04	-	BMT	1920 Apr # Bangkok Mean Time
+			7:00	-	ICT
+Zone	Asia/Ashgabat	3:53:32 -	LMT	1924 May  2 # or Ashkhabad
+			4:00	-	ASHT	1930 Jun 21 # Ashkhabad Time
+			5:00 RussiaAsia	ASH%sT	1991 Mar 31 2:00
+			4:00 RussiaAsia	ASH%sT	1991 Oct 27 # independence
+			4:00 RussiaAsia	TM%sT	1992 Jan 19 2:00
+			5:00	-	TMT
+Zone	Asia/Dubai	3:41:12 -	LMT	1920
+			4:00	-	GST
+Zone	Asia/Samarkand	4:27:12 -	LMT	1924 May  2
+			4:00	-	SAMT	1930 Jun 21 # Samarkand Time
+			5:00	-	SAMT	1981 Apr  1
+			5:00	1:00	SAMST	1981 Oct  1
+			6:00	-	TAST	1982 Apr  1 # Tashkent Time
+			5:00 RussiaAsia	SAM%sT	1991 Sep  1 # independence
+			5:00 RussiaAsia	UZ%sT	1992
+			5:00	-	UZT
+Zone	Asia/Tashkent	4:37:12 -	LMT	1924 May  2
+			5:00	-	TAST	1930 Jun 21 # Tashkent Time
+			6:00 RussiaAsia	TAS%sT	1991 Mar 31 2:00
+			5:00 RussiaAsia	TAS%sT	1991 Sep  1 # independence
+			5:00 RussiaAsia	UZ%sT	1992
+			5:00	-	UZT
+Zone	Asia/Ho_Chi_Minh	7:06:40 -	LMT	1906 Jun  9
+			7:06:20	-	SMT	1911 Mar 11 0:01 # Saigon MT?
+			7:00	-	ICT	1912 May
+			8:00	-	ICT	1931 May
+			7:00	-	ICT
+Zone	Asia/Aden	3:00:48	-	LMT	1950
+			3:00	-	AST
diff --git a/dojox/date/zoneinfo/australasia b/dojox/date/zoneinfo/australasia
new file mode 100644
index 0000000..1cc398e
--- /dev/null
+++ b/dojox/date/zoneinfo/australasia
@@ -0,0 +1,299 @@
+Rule	Aus	1917	only	-	Jan	 1	0:01	1:00	-
+Rule	Aus	1917	only	-	Mar	25	2:00	0	-
+Rule	Aus	1942	only	-	Jan	 1	2:00	1:00	-
+Rule	Aus	1942	only	-	Mar	29	2:00	0	-
+Rule	Aus	1942	only	-	Sep	27	2:00	1:00	-
+Rule	Aus	1943	1944	-	Mar	lastSun	2:00	0	-
+Rule	Aus	1943	only	-	Oct	 3	2:00	1:00	-
+Zone Australia/Darwin	 8:43:20 -	LMT	1895 Feb
+			 9:00	-	CST	1899 May
+			 9:30	Aus	CST
+Rule	AW	1974	only	-	Oct	lastSun	2:00s	1:00	-
+Rule	AW	1975	only	-	Mar	Sun>=1	2:00s	0	-
+Rule	AW	1983	only	-	Oct	lastSun	2:00s	1:00	-
+Rule	AW	1984	only	-	Mar	Sun>=1	2:00s	0	-
+Rule	AW	1991	only	-	Nov	17	2:00s	1:00	-
+Rule	AW	1992	only	-	Mar	Sun>=1	2:00s	0	-
+Rule	AW	2006	only	-	Dec	 3	2:00s	1:00	-
+Rule	AW	2007	2009	-	Mar	lastSun	2:00s	0	-
+Rule	AW	2007	2008	-	Oct	lastSun	2:00s	1:00	-
+Zone Australia/Perth	 7:43:24 -	LMT	1895 Dec
+			 8:00	Aus	WST	1943 Jul
+			 8:00	AW	WST
+Zone Australia/Eucla	 8:35:28 -	LMT	1895 Dec
+			 8:45	Aus	CWST	1943 Jul
+			 8:45	AW	CWST
+Rule	AQ	1971	only	-	Oct	lastSun	2:00s	1:00	-
+Rule	AQ	1972	only	-	Feb	lastSun	2:00s	0	-
+Rule	AQ	1989	1991	-	Oct	lastSun	2:00s	1:00	-
+Rule	AQ	1990	1992	-	Mar	Sun>=1	2:00s	0	-
+Rule	Holiday	1992	1993	-	Oct	lastSun	2:00s	1:00	-
+Rule	Holiday	1993	1994	-	Mar	Sun>=1	2:00s	0	-
+Zone Australia/Brisbane	10:12:08 -	LMT	1895
+			10:00	Aus	EST	1971
+			10:00	AQ	EST
+Zone Australia/Lindeman  9:55:56 -	LMT	1895
+			10:00	Aus	EST	1971
+			10:00	AQ	EST	1992 Jul
+			10:00	Holiday	EST
+Rule	AS	1971	1985	-	Oct	lastSun	2:00s	1:00	-
+Rule	AS	1986	only	-	Oct	19	2:00s	1:00	-
+Rule	AS	1987	2007	-	Oct	lastSun	2:00s	1:00	-
+Rule	AS	1972	only	-	Feb	27	2:00s	0	-
+Rule	AS	1973	1985	-	Mar	Sun>=1	2:00s	0	-
+Rule	AS	1986	1989	-	Mar	Sun>=15	2:00s	0	-
+Rule	AS	1990	only	-	Mar	Sun>=18	2:00s	0	-
+Rule	AS	1991	only	-	Mar	Sun>=1	2:00s	0	-
+Rule	AS	1992	only	-	Mar	Sun>=18	2:00s	0	-
+Rule	AS	1993	only	-	Mar	Sun>=1	2:00s	0	-
+Rule	AS	1994	only	-	Mar	Sun>=18	2:00s	0	-
+Rule	AS	1995	2005	-	Mar	lastSun	2:00s	0	-
+Rule	AS	2006	only	-	Apr	Sun>=1	2:00s	0	-
+Rule	AS	2007	only	-	Mar	lastSun	2:00s	0	-
+Rule	AS	2008	max	-	Apr	Sun>=1	2:00s	0	-
+Rule	AS	2008	max	-	Oct	Sun>=1	2:00s	1:00	-
+Zone Australia/Adelaide	9:14:20 -	LMT	1895 Feb
+			9:00	-	CST	1899 May
+			9:30	Aus	CST	1971
+			9:30	AS	CST
+Rule	AT	1967	only	-	Oct	Sun>=1	2:00s	1:00	-
+Rule	AT	1968	only	-	Mar	lastSun	2:00s	0	-
+Rule	AT	1968	1985	-	Oct	lastSun	2:00s	1:00	-
+Rule	AT	1969	1971	-	Mar	Sun>=8	2:00s	0	-
+Rule	AT	1972	only	-	Feb	lastSun	2:00s	0	-
+Rule	AT	1973	1981	-	Mar	Sun>=1	2:00s	0	-
+Rule	AT	1982	1983	-	Mar	lastSun	2:00s	0	-
+Rule	AT	1984	1986	-	Mar	Sun>=1	2:00s	0	-
+Rule	AT	1986	only	-	Oct	Sun>=15	2:00s	1:00	-
+Rule	AT	1987	1990	-	Mar	Sun>=15	2:00s	0	-
+Rule	AT	1987	only	-	Oct	Sun>=22	2:00s	1:00	-
+Rule	AT	1988	1990	-	Oct	lastSun	2:00s	1:00	-
+Rule	AT	1991	1999	-	Oct	Sun>=1	2:00s	1:00	-
+Rule	AT	1991	2005	-	Mar	lastSun	2:00s	0	-
+Rule	AT	2000	only	-	Aug	lastSun	2:00s	1:00	-
+Rule	AT	2001	max	-	Oct	Sun>=1	2:00s	1:00	-
+Rule	AT	2006	only	-	Apr	Sun>=1	2:00s	0	-
+Rule	AT	2007	only	-	Mar	lastSun	2:00s	0	-
+Rule	AT	2008	max	-	Apr	Sun>=1	2:00s	0	-
+Zone Australia/Hobart	9:49:16	-	LMT	1895 Sep
+			10:00	-	EST	1916 Oct 1 2:00
+			10:00	1:00	EST	1917 Feb
+			10:00	Aus	EST	1967
+			10:00	AT	EST
+Zone Australia/Currie	9:35:28	-	LMT	1895 Sep
+			10:00	-	EST	1916 Oct 1 2:00
+			10:00	1:00	EST	1917 Feb
+			10:00	Aus	EST	1971 Jul
+			10:00	AT	EST
+Rule	AV	1971	1985	-	Oct	lastSun	2:00s	1:00	-
+Rule	AV	1972	only	-	Feb	lastSun	2:00s	0	-
+Rule	AV	1973	1985	-	Mar	Sun>=1	2:00s	0	-
+Rule	AV	1986	1990	-	Mar	Sun>=15	2:00s	0	-
+Rule	AV	1986	1987	-	Oct	Sun>=15	2:00s	1:00	-
+Rule	AV	1988	1999	-	Oct	lastSun	2:00s	1:00	-
+Rule	AV	1991	1994	-	Mar	Sun>=1	2:00s	0	-
+Rule	AV	1995	2005	-	Mar	lastSun	2:00s	0	-
+Rule	AV	2000	only	-	Aug	lastSun	2:00s	1:00	-
+Rule	AV	2001	2007	-	Oct	lastSun	2:00s	1:00	-
+Rule	AV	2006	only	-	Apr	Sun>=1	2:00s	0	-
+Rule	AV	2007	only	-	Mar	lastSun	2:00s	0	-
+Rule	AV	2008	max	-	Apr	Sun>=1	2:00s	0	-
+Rule	AV	2008	max	-	Oct	Sun>=1	2:00s	1:00	-
+Zone Australia/Melbourne 9:39:52 -	LMT	1895 Feb
+			10:00	Aus	EST	1971
+			10:00	AV	EST
+Rule	AN	1971	1985	-	Oct	lastSun	2:00s	1:00	-
+Rule	AN	1972	only	-	Feb	27	2:00s	0	-
+Rule	AN	1973	1981	-	Mar	Sun>=1	2:00s	0	-
+Rule	AN	1982	only	-	Apr	Sun>=1	2:00s	0	-
+Rule	AN	1983	1985	-	Mar	Sun>=1	2:00s	0	-
+Rule	AN	1986	1989	-	Mar	Sun>=15	2:00s	0	-
+Rule	AN	1986	only	-	Oct	19	2:00s	1:00	-
+Rule	AN	1987	1999	-	Oct	lastSun	2:00s	1:00	-
+Rule	AN	1990	1995	-	Mar	Sun>=1	2:00s	0	-
+Rule	AN	1996	2005	-	Mar	lastSun	2:00s	0	-
+Rule	AN	2000	only	-	Aug	lastSun	2:00s	1:00	-
+Rule	AN	2001	2007	-	Oct	lastSun	2:00s	1:00	-
+Rule	AN	2006	only	-	Apr	Sun>=1	2:00s	0	-
+Rule	AN	2007	only	-	Mar	lastSun	2:00s	0	-
+Rule	AN	2008	max	-	Apr	Sun>=1	2:00s	0	-
+Rule	AN	2008	max	-	Oct	Sun>=1	2:00s	1:00	-
+Zone Australia/Sydney	10:04:52 -	LMT	1895 Feb
+			10:00	Aus	EST	1971
+			10:00	AN	EST
+Zone Australia/Broken_Hill 9:25:48 -	LMT	1895 Feb
+			10:00	-	EST	1896 Aug 23
+			9:00	-	CST	1899 May
+			9:30	Aus	CST	1971
+			9:30	AN	CST	2000
+			9:30	AS	CST
+Rule	LH	1981	1984	-	Oct	lastSun	2:00	1:00	-
+Rule	LH	1982	1985	-	Mar	Sun>=1	2:00	0	-
+Rule	LH	1985	only	-	Oct	lastSun	2:00	0:30	-
+Rule	LH	1986	1989	-	Mar	Sun>=15	2:00	0	-
+Rule	LH	1986	only	-	Oct	19	2:00	0:30	-
+Rule	LH	1987	1999	-	Oct	lastSun	2:00	0:30	-
+Rule	LH	1990	1995	-	Mar	Sun>=1	2:00	0	-
+Rule	LH	1996	2005	-	Mar	lastSun	2:00	0	-
+Rule	LH	2000	only	-	Aug	lastSun	2:00	0:30	-
+Rule	LH	2001	2007	-	Oct	lastSun	2:00	0:30	-
+Rule	LH	2006	only	-	Apr	Sun>=1	2:00	0	-
+Rule	LH	2007	only	-	Mar	lastSun	2:00	0	-
+Rule	LH	2008	max	-	Apr	Sun>=1	2:00	0	-
+Rule	LH	2008	max	-	Oct	Sun>=1	2:00	0:30	-
+Zone Australia/Lord_Howe 10:36:20 -	LMT	1895 Feb
+			10:00	-	EST	1981 Mar
+			10:30	LH	LHST
+Zone Indian/Christmas	7:02:52 -	LMT	1895 Feb
+			7:00	-	CXT	# Christmas Island Time
+Rule	Cook	1978	only	-	Nov	12	0:00	0:30	HS
+Rule	Cook	1979	1991	-	Mar	Sun>=1	0:00	0	-
+Rule	Cook	1979	1990	-	Oct	lastSun	0:00	0:30	HS
+Zone Pacific/Rarotonga	-10:39:04 -	LMT	1901		# Avarua
+			-10:30	-	CKT	1978 Nov 12	# Cook Is Time
+			-10:00	Cook	CK%sT
+Zone	Indian/Cocos	6:27:40	-	LMT	1900
+			6:30	-	CCT	# Cocos Islands Time
+Rule	Fiji	1998	1999	-	Nov	Sun>=1	2:00	1:00	S
+Rule	Fiji	1999	2000	-	Feb	lastSun	3:00	0	-
+Zone	Pacific/Fiji	11:53:40 -	LMT	1915 Oct 26	# Suva
+			12:00	Fiji	FJ%sT	# Fiji Time
+Zone	Pacific/Gambier	 -8:59:48 -	LMT	1912 Oct	# Rikitea
+			 -9:00	-	GAMT	# Gambier Time
+Zone	Pacific/Marquesas -9:18:00 -	LMT	1912 Oct
+			 -9:30	-	MART	# Marquesas Time
+Zone	Pacific/Tahiti	 -9:58:16 -	LMT	1912 Oct	# Papeete
+			-10:00	-	TAHT	# Tahiti Time
+Zone	Pacific/Guam	-14:21:00 -	LMT	1844 Dec 31
+			 9:39:00 -	LMT	1901		# Agana
+			10:00	-	GST	2000 Dec 23	# Guam
+			10:00	-	ChST	# Chamorro Standard Time
+Zone Pacific/Tarawa	 11:32:04 -	LMT	1901		# Bairiki
+			 12:00	-	GILT		 # Gilbert Is Time
+Zone Pacific/Enderbury	-11:24:20 -	LMT	1901
+			-12:00	-	PHOT	1979 Oct # Phoenix Is Time
+			-11:00	-	PHOT	1995
+			 13:00	-	PHOT
+Zone Pacific/Kiritimati	-10:29:20 -	LMT	1901
+			-10:40	-	LINT	1979 Oct # Line Is Time
+			-10:00	-	LINT	1995
+			 14:00	-	LINT
+Zone Pacific/Saipan	-14:17:00 -	LMT	1844 Dec 31
+			 9:43:00 -	LMT	1901
+			 9:00	-	MPT	1969 Oct # N Mariana Is Time
+			10:00	-	MPT	2000 Dec 23
+			10:00	-	ChST	# Chamorro Standard Time
+Zone Pacific/Majuro	11:24:48 -	LMT	1901
+			11:00	-	MHT	1969 Oct # Marshall Islands Time
+			12:00	-	MHT
+Zone Pacific/Kwajalein	11:09:20 -	LMT	1901
+			11:00	-	MHT	1969 Oct
+			-12:00	-	KWAT	1993 Aug 20	# Kwajalein Time
+			12:00	-	MHT
+Zone Pacific/Truk	10:07:08 -	LMT	1901
+			10:00	-	TRUT			# Truk Time
+Zone Pacific/Ponape	10:32:52 -	LMT	1901		# Kolonia
+			11:00	-	PONT			# Ponape Time
+Zone Pacific/Kosrae	10:51:56 -	LMT	1901
+			11:00	-	KOST	1969 Oct	# Kosrae Time
+			12:00	-	KOST	1999
+			11:00	-	KOST
+Zone	Pacific/Nauru	11:07:40 -	LMT	1921 Jan 15	# Uaobe
+			11:30	-	NRT	1942 Mar 15	# Nauru Time
+			9:00	-	JST	1944 Aug 15
+			11:30	-	NRT	1979 May
+			12:00	-	NRT
+Rule	NC	1977	1978	-	Dec	Sun>=1	0:00	1:00	S
+Rule	NC	1978	1979	-	Feb	27	0:00	0	-
+Rule	NC	1996	only	-	Dec	 1	2:00s	1:00	S
+Rule	NC	1997	only	-	Mar	 2	2:00s	0	-
+Zone	Pacific/Noumea	11:05:48 -	LMT	1912 Jan 13
+			11:00	NC	NC%sT
+Rule	NZ	1927	only	-	Nov	 6	2:00	1:00	S
+Rule	NZ	1928	only	-	Mar	 4	2:00	0	M
+Rule	NZ	1928	1933	-	Oct	Sun>=8	2:00	0:30	S
+Rule	NZ	1929	1933	-	Mar	Sun>=15	2:00	0	M
+Rule	NZ	1934	1940	-	Apr	lastSun	2:00	0	M
+Rule	NZ	1934	1940	-	Sep	lastSun	2:00	0:30	S
+Rule	NZ	1946	only	-	Jan	 1	0:00	0	S
+Rule	NZ	1974	only	-	Nov	Sun>=1	2:00s	1:00	D
+Rule	Chatham	1974	only	-	Nov	Sun>=1	2:45s	1:00	D
+Rule	NZ	1975	only	-	Feb	lastSun	2:00s	0	S
+Rule	Chatham	1975	only	-	Feb	lastSun	2:45s	0	S
+Rule	NZ	1975	1988	-	Oct	lastSun	2:00s	1:00	D
+Rule	Chatham	1975	1988	-	Oct	lastSun	2:45s	1:00	D
+Rule	NZ	1976	1989	-	Mar	Sun>=1	2:00s	0	S
+Rule	Chatham	1976	1989	-	Mar	Sun>=1	2:45s	0	S
+Rule	NZ	1989	only	-	Oct	Sun>=8	2:00s	1:00	D
+Rule	Chatham	1989	only	-	Oct	Sun>=8	2:45s	1:00	D
+Rule	NZ	1990	2006	-	Oct	Sun>=1	2:00s	1:00	D
+Rule	Chatham	1990	2006	-	Oct	Sun>=1	2:45s	1:00	D
+Rule	NZ	1990	2007	-	Mar	Sun>=15	2:00s	0	S
+Rule	Chatham	1990	2007	-	Mar	Sun>=15	2:45s	0	S
+Rule	NZ	2007	max	-	Sep	lastSun	2:00s	1:00	D
+Rule	Chatham	2007	max	-	Sep	lastSun	2:45s	1:00	D
+Rule	NZ	2008	max	-	Apr	Sun>=1	2:00s	0	S
+Rule	Chatham	2008	max	-	Apr	Sun>=1	2:45s	0	S
+Zone Pacific/Auckland	11:39:04 -	LMT	1868 Nov  2
+			11:30	NZ	NZ%sT	1946 Jan  1
+			12:00	NZ	NZ%sT
+Zone Pacific/Chatham	12:13:48 -	LMT	1957 Jan  1
+			12:45	Chatham	CHA%sT
+Zone	Pacific/Niue	-11:19:40 -	LMT	1901		# Alofi
+			-11:20	-	NUT	1951	# Niue Time
+			-11:30	-	NUT	1978 Oct 1
+			-11:00	-	NUT
+Zone	Pacific/Norfolk	11:11:52 -	LMT	1901		# Kingston
+			11:12	-	NMT	1951	# Norfolk Mean Time
+			11:30	-	NFT		# Norfolk Time
+Zone Pacific/Palau	8:57:56 -	LMT	1901		# Koror
+			9:00	-	PWT	# Palau Time
+Zone Pacific/Port_Moresby 9:48:40 -	LMT	1880
+			9:48:32	-	PMMT	1895	# Port Moresby Mean Time
+			10:00	-	PGT		# Papua New Guinea Time
+Zone Pacific/Pitcairn	-8:40:20 -	LMT	1901		# Adamstown
+			-8:30	-	PNT	1998 Apr 27 00:00
+			-8:00	-	PST	# Pitcairn Standard Time
+Zone Pacific/Pago_Pago	 12:37:12 -	LMT	1879 Jul  5
+			-11:22:48 -	LMT	1911
+			-11:30	-	SAMT	1950		# Samoa Time
+			-11:00	-	NST	1967 Apr	# N=Nome
+			-11:00	-	BST	1983 Nov 30	# B=Bering
+			-11:00	-	SST			# S=Samoa
+Zone Pacific/Apia	 12:33:04 -	LMT	1879 Jul  5
+			-11:26:56 -	LMT	1911
+			-11:30	-	SAMT	1950		# Samoa Time
+			-11:00	-	WST			# Samoa Time
+Zone Pacific/Guadalcanal 10:39:48 -	LMT	1912 Oct	# Honiara
+			11:00	-	SBT	# Solomon Is Time
+Zone	Pacific/Fakaofo	-11:24:56 -	LMT	1901
+			-10:00	-	TKT	# Tokelau Time
+Rule	Tonga	1999	only	-	Oct	 7	2:00s	1:00	S
+Rule	Tonga	2000	only	-	Mar	19	2:00s	0	-
+Rule	Tonga	2000	2001	-	Nov	Sun>=1	2:00	1:00	S
+Rule	Tonga	2001	2002	-	Jan	lastSun	2:00	0	-
+Zone Pacific/Tongatapu	12:19:20 -	LMT	1901
+			12:20	-	TOT	1941 # Tonga Time
+			13:00	-	TOT	1999
+			13:00	Tonga	TO%sT
+Zone Pacific/Funafuti	11:56:52 -	LMT	1901
+			12:00	-	TVT	# Tuvalu Time
+Zone Pacific/Johnston	-10:00	-	HST
+Zone Pacific/Midway	-11:49:28 -	LMT	1901
+			-11:00	-	NST	1956 Jun  3
+			-11:00	1:00	NDT	1956 Sep  2
+			-11:00	-	NST	1967 Apr	# N=Nome
+			-11:00	-	BST	1983 Nov 30	# B=Bering
+			-11:00	-	SST			# S=Samoa
+Zone	Pacific/Wake	11:06:28 -	LMT	1901
+			12:00	-	WAKT	# Wake Time
+Rule	Vanuatu	1983	only	-	Sep	25	0:00	1:00	S
+Rule	Vanuatu	1984	1991	-	Mar	Sun>=23	0:00	0	-
+Rule	Vanuatu	1984	only	-	Oct	23	0:00	1:00	S
+Rule	Vanuatu	1985	1991	-	Sep	Sun>=23	0:00	1:00	S
+Rule	Vanuatu	1992	1993	-	Jan	Sun>=23	0:00	0	-
+Rule	Vanuatu	1992	only	-	Oct	Sun>=23	0:00	1:00	S
+Zone	Pacific/Efate	11:13:16 -	LMT	1912 Jan 13		# Vila
+			11:00	Vanuatu	VU%sT	# Vanuatu Time
+Zone	Pacific/Wallis	12:15:20 -	LMT	1901
+			12:00	-	WFT	# Wallis & Futuna Time
diff --git a/dojox/date/zoneinfo/backward b/dojox/date/zoneinfo/backward
new file mode 100644
index 0000000..f341a7b
--- /dev/null
+++ b/dojox/date/zoneinfo/backward
@@ -0,0 +1,108 @@
+Link	Africa/Asmara		Africa/Asmera
+Link	Africa/Bamako		Africa/Timbuktu
+Link	America/Argentina/Catamarca	America/Argentina/ComodRivadavia
+Link	America/Adak		America/Atka
+Link	America/Argentina/Buenos_Aires	America/Buenos_Aires
+Link	America/Argentina/Catamarca	America/Catamarca
+Link	America/Atikokan	America/Coral_Harbour
+Link	America/Argentina/Cordoba	America/Cordoba
+Link	America/Tijuana		America/Ensenada
+Link	America/Indiana/Indianapolis	America/Fort_Wayne
+Link	America/Indiana/Indianapolis	America/Indianapolis
+Link	America/Argentina/Jujuy	America/Jujuy
+Link	America/Indiana/Knox	America/Knox_IN
+Link	America/Kentucky/Louisville	America/Louisville
+Link	America/Argentina/Mendoza	America/Mendoza
+Link	America/Rio_Branco	America/Porto_Acre
+Link	America/Argentina/Cordoba	America/Rosario
+Link	America/St_Thomas	America/Virgin
+Link	Asia/Ashgabat		Asia/Ashkhabad
+Link	Asia/Chongqing		Asia/Chungking
+Link	Asia/Dhaka		Asia/Dacca
+Link	Asia/Kathmandu		Asia/Katmandu
+Link	Asia/Kolkata		Asia/Calcutta
+Link	Asia/Macau		Asia/Macao
+Link	Asia/Jerusalem		Asia/Tel_Aviv
+Link	Asia/Ho_Chi_Minh	Asia/Saigon
+Link	Asia/Thimphu		Asia/Thimbu
+Link	Asia/Makassar		Asia/Ujung_Pandang
+Link	Asia/Ulaanbaatar	Asia/Ulan_Bator
+Link	Atlantic/Faroe		Atlantic/Faeroe
+Link	Europe/Oslo		Atlantic/Jan_Mayen
+Link	Australia/Sydney	Australia/ACT
+Link	Australia/Sydney	Australia/Canberra
+Link	Australia/Lord_Howe	Australia/LHI
+Link	Australia/Sydney	Australia/NSW
+Link	Australia/Darwin	Australia/North
+Link	Australia/Brisbane	Australia/Queensland
+Link	Australia/Adelaide	Australia/South
+Link	Australia/Hobart	Australia/Tasmania
+Link	Australia/Melbourne	Australia/Victoria
+Link	Australia/Perth		Australia/West
+Link	Australia/Broken_Hill	Australia/Yancowinna
+Link	America/Rio_Branco	Brazil/Acre
+Link	America/Noronha		Brazil/DeNoronha
+Link	America/Sao_Paulo	Brazil/East
+Link	America/Manaus		Brazil/West
+Link	America/Halifax		Canada/Atlantic
+Link	America/Winnipeg	Canada/Central
+Link	America/Regina		Canada/East-Saskatchewan
+Link	America/Toronto		Canada/Eastern
+Link	America/Edmonton	Canada/Mountain
+Link	America/St_Johns	Canada/Newfoundland
+Link	America/Vancouver	Canada/Pacific
+Link	America/Regina		Canada/Saskatchewan
+Link	America/Whitehorse	Canada/Yukon
+Link	America/Santiago	Chile/Continental
+Link	Pacific/Easter		Chile/EasterIsland
+Link	America/Havana		Cuba
+Link	Africa/Cairo		Egypt
+Link	Europe/Dublin		Eire
+Link	Europe/London		Europe/Belfast
+Link	Europe/Chisinau		Europe/Tiraspol
+Link	Europe/London		GB
+Link	Europe/London		GB-Eire
+Link	Etc/GMT			GMT+0
+Link	Etc/GMT			GMT-0
+Link	Etc/GMT			GMT0
+Link	Etc/GMT			Greenwich
+Link	Asia/Hong_Kong		Hongkong
+Link	Atlantic/Reykjavik	Iceland
+Link	Asia/Tehran		Iran
+Link	Asia/Jerusalem		Israel
+Link	America/Jamaica		Jamaica
+Link	Asia/Tokyo		Japan
+Link	Pacific/Kwajalein	Kwajalein
+Link	Africa/Tripoli		Libya
+Link	America/Tijuana		Mexico/BajaNorte
+Link	America/Mazatlan	Mexico/BajaSur
+Link	America/Mexico_City	Mexico/General
+Link	Pacific/Auckland	NZ
+Link	Pacific/Chatham		NZ-CHAT
+Link	America/Denver		Navajo
+Link	Asia/Shanghai		PRC
+Link	Pacific/Pago_Pago	Pacific/Samoa
+Link	Pacific/Truk		Pacific/Yap
+Link	Europe/Warsaw		Poland
+Link	Europe/Lisbon		Portugal
+Link	Asia/Taipei		ROC
+Link	Asia/Seoul		ROK
+Link	Asia/Singapore		Singapore
+Link	Europe/Istanbul		Turkey
+Link	Etc/UCT			UCT
+Link	America/Anchorage	US/Alaska
+Link	America/Adak		US/Aleutian
+Link	America/Phoenix		US/Arizona
+Link	America/Chicago		US/Central
+Link	America/Indiana/Indianapolis	US/East-Indiana
+Link	America/New_York	US/Eastern
+Link	Pacific/Honolulu	US/Hawaii
+Link	America/Indiana/Knox	US/Indiana-Starke
+Link	America/Detroit		US/Michigan
+Link	America/Denver		US/Mountain
+Link	America/Los_Angeles	US/Pacific
+Link	Pacific/Pago_Pago	US/Samoa
+Link	Etc/UTC			UTC
+Link	Etc/UTC			Universal
+Link	Europe/Moscow		W-SU
+Link	Etc/UTC			Zulu
diff --git a/dojox/date/zoneinfo/etcetera b/dojox/date/zoneinfo/etcetera
new file mode 100644
index 0000000..b459c36
--- /dev/null
+++ b/dojox/date/zoneinfo/etcetera
@@ -0,0 +1,36 @@
+Zone	Etc/GMT		0	-	GMT
+Zone	Etc/UTC		0	-	UTC
+Zone	Etc/UCT		0	-	UCT
+Link	Etc/GMT				GMT
+Link	Etc/UTC				Etc/Universal
+Link	Etc/UTC				Etc/Zulu
+Link	Etc/GMT				Etc/Greenwich
+Link	Etc/GMT				Etc/GMT-0
+Link	Etc/GMT				Etc/GMT+0
+Link	Etc/GMT				Etc/GMT0
+Zone	Etc/GMT-14	14	-	GMT-14	# 14 hours ahead of GMT
+Zone	Etc/GMT-13	13	-	GMT-13
+Zone	Etc/GMT-12	12	-	GMT-12
+Zone	Etc/GMT-11	11	-	GMT-11
+Zone	Etc/GMT-10	10	-	GMT-10
+Zone	Etc/GMT-9	9	-	GMT-9
+Zone	Etc/GMT-8	8	-	GMT-8
+Zone	Etc/GMT-7	7	-	GMT-7
+Zone	Etc/GMT-6	6	-	GMT-6
+Zone	Etc/GMT-5	5	-	GMT-5
+Zone	Etc/GMT-4	4	-	GMT-4
+Zone	Etc/GMT-3	3	-	GMT-3
+Zone	Etc/GMT-2	2	-	GMT-2
+Zone	Etc/GMT-1	1	-	GMT-1
+Zone	Etc/GMT+1	-1	-	GMT+1
+Zone	Etc/GMT+2	-2	-	GMT+2
+Zone	Etc/GMT+3	-3	-	GMT+3
+Zone	Etc/GMT+4	-4	-	GMT+4
+Zone	Etc/GMT+5	-5	-	GMT+5
+Zone	Etc/GMT+6	-6	-	GMT+6
+Zone	Etc/GMT+7	-7	-	GMT+7
+Zone	Etc/GMT+8	-8	-	GMT+8
+Zone	Etc/GMT+9	-9	-	GMT+9
+Zone	Etc/GMT+10	-10	-	GMT+10
+Zone	Etc/GMT+11	-11	-	GMT+11
+Zone	Etc/GMT+12	-12	-	GMT+12
diff --git a/dojox/date/zoneinfo/europe b/dojox/date/zoneinfo/europe
new file mode 100644
index 0000000..2e6c61b
--- /dev/null
+++ b/dojox/date/zoneinfo/europe
@@ -0,0 +1,1045 @@
+Rule	GB-Eire	1916	only	-	May	21	2:00s	1:00	BST
+Rule	GB-Eire	1916	only	-	Oct	 1	2:00s	0	GMT
+Rule	GB-Eire	1917	only	-	Apr	 8	2:00s	1:00	BST
+Rule	GB-Eire	1917	only	-	Sep	17	2:00s	0	GMT
+Rule	GB-Eire	1918	only	-	Mar	24	2:00s	1:00	BST
+Rule	GB-Eire	1918	only	-	Sep	30	2:00s	0	GMT
+Rule	GB-Eire	1919	only	-	Mar	30	2:00s	1:00	BST
+Rule	GB-Eire	1919	only	-	Sep	29	2:00s	0	GMT
+Rule	GB-Eire	1920	only	-	Mar	28	2:00s	1:00	BST
+Rule	GB-Eire	1920	only	-	Oct	25	2:00s	0	GMT
+Rule	GB-Eire	1921	only	-	Apr	 3	2:00s	1:00	BST
+Rule	GB-Eire	1921	only	-	Oct	 3	2:00s	0	GMT
+Rule	GB-Eire	1922	only	-	Mar	26	2:00s	1:00	BST
+Rule	GB-Eire	1922	only	-	Oct	 8	2:00s	0	GMT
+Rule	GB-Eire	1923	only	-	Apr	Sun>=16	2:00s	1:00	BST
+Rule	GB-Eire	1923	1924	-	Sep	Sun>=16	2:00s	0	GMT
+Rule	GB-Eire	1924	only	-	Apr	Sun>=9	2:00s	1:00	BST
+Rule	GB-Eire	1925	1926	-	Apr	Sun>=16	2:00s	1:00	BST
+Rule	GB-Eire	1925	1938	-	Oct	Sun>=2	2:00s	0	GMT
+Rule	GB-Eire	1927	only	-	Apr	Sun>=9	2:00s	1:00	BST
+Rule	GB-Eire	1928	1929	-	Apr	Sun>=16	2:00s	1:00	BST
+Rule	GB-Eire	1930	only	-	Apr	Sun>=9	2:00s	1:00	BST
+Rule	GB-Eire	1931	1932	-	Apr	Sun>=16	2:00s	1:00	BST
+Rule	GB-Eire	1933	only	-	Apr	Sun>=9	2:00s	1:00	BST
+Rule	GB-Eire	1934	only	-	Apr	Sun>=16	2:00s	1:00	BST
+Rule	GB-Eire	1935	only	-	Apr	Sun>=9	2:00s	1:00	BST
+Rule	GB-Eire	1936	1937	-	Apr	Sun>=16	2:00s	1:00	BST
+Rule	GB-Eire	1938	only	-	Apr	Sun>=9	2:00s	1:00	BST
+Rule	GB-Eire	1939	only	-	Apr	Sun>=16	2:00s	1:00	BST
+Rule	GB-Eire	1939	only	-	Nov	Sun>=16	2:00s	0	GMT
+Rule	GB-Eire	1940	only	-	Feb	Sun>=23	2:00s	1:00	BST
+Rule	GB-Eire	1941	only	-	May	Sun>=2	1:00s	2:00	BDST
+Rule	GB-Eire	1941	1943	-	Aug	Sun>=9	1:00s	1:00	BST
+Rule	GB-Eire	1942	1944	-	Apr	Sun>=2	1:00s	2:00	BDST
+Rule	GB-Eire	1944	only	-	Sep	Sun>=16	1:00s	1:00	BST
+Rule	GB-Eire	1945	only	-	Apr	Mon>=2	1:00s	2:00	BDST
+Rule	GB-Eire	1945	only	-	Jul	Sun>=9	1:00s	1:00	BST
+Rule	GB-Eire	1945	1946	-	Oct	Sun>=2	2:00s	0	GMT
+Rule	GB-Eire	1946	only	-	Apr	Sun>=9	2:00s	1:00	BST
+Rule	GB-Eire	1947	only	-	Mar	16	2:00s	1:00	BST
+Rule	GB-Eire	1947	only	-	Apr	13	1:00s	2:00	BDST
+Rule	GB-Eire	1947	only	-	Aug	10	1:00s	1:00	BST
+Rule	GB-Eire	1947	only	-	Nov	 2	2:00s	0	GMT
+Rule	GB-Eire	1948	only	-	Mar	14	2:00s	1:00	BST
+Rule	GB-Eire	1948	only	-	Oct	31	2:00s	0	GMT
+Rule	GB-Eire	1949	only	-	Apr	 3	2:00s	1:00	BST
+Rule	GB-Eire	1949	only	-	Oct	30	2:00s	0	GMT
+Rule	GB-Eire	1950	1952	-	Apr	Sun>=14	2:00s	1:00	BST
+Rule	GB-Eire	1950	1952	-	Oct	Sun>=21	2:00s	0	GMT
+Rule	GB-Eire	1953	only	-	Apr	Sun>=16	2:00s	1:00	BST
+Rule	GB-Eire	1953	1960	-	Oct	Sun>=2	2:00s	0	GMT
+Rule	GB-Eire	1954	only	-	Apr	Sun>=9	2:00s	1:00	BST
+Rule	GB-Eire	1955	1956	-	Apr	Sun>=16	2:00s	1:00	BST
+Rule	GB-Eire	1957	only	-	Apr	Sun>=9	2:00s	1:00	BST
+Rule	GB-Eire	1958	1959	-	Apr	Sun>=16	2:00s	1:00	BST
+Rule	GB-Eire	1960	only	-	Apr	Sun>=9	2:00s	1:00	BST
+Rule	GB-Eire	1961	1963	-	Mar	lastSun	2:00s	1:00	BST
+Rule	GB-Eire	1961	1968	-	Oct	Sun>=23	2:00s	0	GMT
+Rule	GB-Eire	1964	1967	-	Mar	Sun>=19	2:00s	1:00	BST
+Rule	GB-Eire	1968	only	-	Feb	18	2:00s	1:00	BST
+Rule	GB-Eire	1972	1980	-	Mar	Sun>=16	2:00s	1:00	BST
+Rule	GB-Eire	1972	1980	-	Oct	Sun>=23	2:00s	0	GMT
+Rule	GB-Eire	1981	1995	-	Mar	lastSun	1:00u	1:00	BST
+Rule	GB-Eire 1981	1989	-	Oct	Sun>=23	1:00u	0	GMT
+Rule	GB-Eire 1990	1995	-	Oct	Sun>=22	1:00u	0	GMT
+Zone	Europe/London	-0:01:15 -	LMT	1847 Dec  1 0:00s
+			 0:00	GB-Eire	%s	1968 Oct 27
+			 1:00	-	BST	1971 Oct 31 2:00u
+			 0:00	GB-Eire	%s	1996
+			 0:00	EU	GMT/BST
+Link	Europe/London	Europe/Jersey
+Link	Europe/London	Europe/Guernsey
+Link	Europe/London	Europe/Isle_of_Man
+Zone	Europe/Dublin	-0:25:00 -	LMT	1880 Aug  2
+			-0:25:21 -	DMT	1916 May 21 2:00
+			-0:25:21 1:00	IST	1916 Oct  1 2:00s
+			 0:00	GB-Eire	%s	1921 Dec  6 # independence
+			 0:00	GB-Eire	GMT/IST	1940 Feb 25 2:00
+			 0:00	1:00	IST	1946 Oct  6 2:00
+			 0:00	-	GMT	1947 Mar 16 2:00
+			 0:00	1:00	IST	1947 Nov  2 2:00
+			 0:00	-	GMT	1948 Apr 18 2:00
+			 0:00	GB-Eire	GMT/IST	1968 Oct 27
+			 1:00	-	IST	1971 Oct 31 2:00u
+			 0:00	GB-Eire	GMT/IST	1996
+			 0:00	EU	GMT/IST
+Rule	EU	1977	1980	-	Apr	Sun>=1	 1:00u	1:00	S
+Rule	EU	1977	only	-	Sep	lastSun	 1:00u	0	-
+Rule	EU	1978	only	-	Oct	 1	 1:00u	0	-
+Rule	EU	1979	1995	-	Sep	lastSun	 1:00u	0	-
+Rule	EU	1981	max	-	Mar	lastSun	 1:00u	1:00	S
+Rule	EU	1996	max	-	Oct	lastSun	 1:00u	0	-
+Rule	W-Eur	1977	1980	-	Apr	Sun>=1	 1:00s	1:00	S
+Rule	W-Eur	1977	only	-	Sep	lastSun	 1:00s	0	-
+Rule	W-Eur	1978	only	-	Oct	 1	 1:00s	0	-
+Rule	W-Eur	1979	1995	-	Sep	lastSun	 1:00s	0	-
+Rule	W-Eur	1981	max	-	Mar	lastSun	 1:00s	1:00	S
+Rule	W-Eur	1996	max	-	Oct	lastSun	 1:00s	0	-
+Rule	C-Eur	1916	only	-	Apr	30	23:00	1:00	S
+Rule	C-Eur	1916	only	-	Oct	 1	 1:00	0	-
+Rule	C-Eur	1917	1918	-	Apr	Mon>=15	 2:00s	1:00	S
+Rule	C-Eur	1917	1918	-	Sep	Mon>=15	 2:00s	0	-
+Rule	C-Eur	1940	only	-	Apr	 1	 2:00s	1:00	S
+Rule	C-Eur	1942	only	-	Nov	 2	 2:00s	0	-
+Rule	C-Eur	1943	only	-	Mar	29	 2:00s	1:00	S
+Rule	C-Eur	1943	only	-	Oct	 4	 2:00s	0	-
+Rule	C-Eur	1944	1945	-	Apr	Mon>=1	 2:00s	1:00	S
+Rule	C-Eur	1944	only	-	Oct	 2	 2:00s	0	-
+Rule	C-Eur	1945	only	-	Sep	16	 2:00s	0	-
+Rule	C-Eur	1977	1980	-	Apr	Sun>=1	 2:00s	1:00	S
+Rule	C-Eur	1977	only	-	Sep	lastSun	 2:00s	0	-
+Rule	C-Eur	1978	only	-	Oct	 1	 2:00s	0	-
+Rule	C-Eur	1979	1995	-	Sep	lastSun	 2:00s	0	-
+Rule	C-Eur	1981	max	-	Mar	lastSun	 2:00s	1:00	S
+Rule	C-Eur	1996	max	-	Oct	lastSun	 2:00s	0	-
+Rule	E-Eur	1977	1980	-	Apr	Sun>=1	 0:00	1:00	S
+Rule	E-Eur	1977	only	-	Sep	lastSun	 0:00	0	-
+Rule	E-Eur	1978	only	-	Oct	 1	 0:00	0	-
+Rule	E-Eur	1979	1995	-	Sep	lastSun	 0:00	0	-
+Rule	E-Eur	1981	max	-	Mar	lastSun	 0:00	1:00	S
+Rule	E-Eur	1996	max	-	Oct	lastSun	 0:00	0	-
+Rule	Russia	1917	only	-	Jul	 1	23:00	1:00	MST	# Moscow Summer Time
+Rule	Russia	1917	only	-	Dec	28	 0:00	0	MMT	# Moscow Mean Time
+Rule	Russia	1918	only	-	May	31	22:00	2:00	MDST	# Moscow Double Summer Time
+Rule	Russia	1918	only	-	Sep	16	 1:00	1:00	MST
+Rule	Russia	1919	only	-	May	31	23:00	2:00	MDST
+Rule	Russia	1919	only	-	Jul	 1	 2:00	1:00	S
+Rule	Russia	1919	only	-	Aug	16	 0:00	0	-
+Rule	Russia	1921	only	-	Feb	14	23:00	1:00	S
+Rule	Russia	1921	only	-	Mar	20	23:00	2:00	M # Midsummer
+Rule	Russia	1921	only	-	Sep	 1	 0:00	1:00	S
+Rule	Russia	1921	only	-	Oct	 1	 0:00	0	-
+Rule	Russia	1981	1984	-	Apr	 1	 0:00	1:00	S
+Rule	Russia	1981	1983	-	Oct	 1	 0:00	0	-
+Rule	Russia	1984	1991	-	Sep	lastSun	 2:00s	0	-
+Rule	Russia	1985	1991	-	Mar	lastSun	 2:00s	1:00	S
+Rule	Russia	1992	only	-	Mar	lastSat	 23:00	1:00	S
+Rule	Russia	1992	only	-	Sep	lastSat	 23:00	0	-
+Rule	Russia	1993	max	-	Mar	lastSun	 2:00s	1:00	S
+Rule	Russia	1993	1995	-	Sep	lastSun	 2:00s	0	-
+Rule	Russia	1996	max	-	Oct	lastSun	 2:00s	0	-
+Zone	WET		0:00	EU	WE%sT
+Zone	CET		1:00	C-Eur	CE%sT
+Zone	MET		1:00	C-Eur	ME%sT
+Zone	EET		2:00	EU	EE%sT
+Rule	Albania	1940	only	-	Jun	16	0:00	1:00	S
+Rule	Albania	1942	only	-	Nov	 2	3:00	0	-
+Rule	Albania	1943	only	-	Mar	29	2:00	1:00	S
+Rule	Albania	1943	only	-	Apr	10	3:00	0	-
+Rule	Albania	1974	only	-	May	 4	0:00	1:00	S
+Rule	Albania	1974	only	-	Oct	 2	0:00	0	-
+Rule	Albania	1975	only	-	May	 1	0:00	1:00	S
+Rule	Albania	1975	only	-	Oct	 2	0:00	0	-
+Rule	Albania	1976	only	-	May	 2	0:00	1:00	S
+Rule	Albania	1976	only	-	Oct	 3	0:00	0	-
+Rule	Albania	1977	only	-	May	 8	0:00	1:00	S
+Rule	Albania	1977	only	-	Oct	 2	0:00	0	-
+Rule	Albania	1978	only	-	May	 6	0:00	1:00	S
+Rule	Albania	1978	only	-	Oct	 1	0:00	0	-
+Rule	Albania	1979	only	-	May	 5	0:00	1:00	S
+Rule	Albania	1979	only	-	Sep	30	0:00	0	-
+Rule	Albania	1980	only	-	May	 3	0:00	1:00	S
+Rule	Albania	1980	only	-	Oct	 4	0:00	0	-
+Rule	Albania	1981	only	-	Apr	26	0:00	1:00	S
+Rule	Albania	1981	only	-	Sep	27	0:00	0	-
+Rule	Albania	1982	only	-	May	 2	0:00	1:00	S
+Rule	Albania	1982	only	-	Oct	 3	0:00	0	-
+Rule	Albania	1983	only	-	Apr	18	0:00	1:00	S
+Rule	Albania	1983	only	-	Oct	 1	0:00	0	-
+Rule	Albania	1984	only	-	Apr	 1	0:00	1:00	S
+Zone	Europe/Tirane	1:19:20 -	LMT	1914
+			1:00	-	CET	1940 Jun 16
+			1:00	Albania	CE%sT	1984 Jul
+			1:00	EU	CE%sT
+Zone	Europe/Andorra	0:06:04 -	LMT	1901
+			0:00	-	WET	1946 Sep 30
+			1:00	-	CET	1985 Mar 31 2:00
+			1:00	EU	CE%sT
+Rule	Austria	1920	only	-	Apr	 5	2:00s	1:00	S
+Rule	Austria	1920	only	-	Sep	13	2:00s	0	-
+Rule	Austria	1946	only	-	Apr	14	2:00s	1:00	S
+Rule	Austria	1946	1948	-	Oct	Sun>=1	2:00s	0	-
+Rule	Austria	1947	only	-	Apr	 6	2:00s	1:00	S
+Rule	Austria	1948	only	-	Apr	18	2:00s	1:00	S
+Rule	Austria	1980	only	-	Apr	 6	0:00	1:00	S
+Rule	Austria	1980	only	-	Sep	28	0:00	0	-
+Zone	Europe/Vienna	1:05:20 -	LMT	1893 Apr
+			1:00	C-Eur	CE%sT	1920
+			1:00	Austria	CE%sT	1940 Apr  1 2:00s
+			1:00	C-Eur	CE%sT	1945 Apr  2 2:00s
+			1:00	1:00	CEST	1945 Apr 12 2:00s
+			1:00	-	CET	1946
+			1:00	Austria	CE%sT	1981
+			1:00	EU	CE%sT
+Zone	Europe/Minsk	1:50:16 -	LMT	1880
+			1:50	-	MMT	1924 May 2 # Minsk Mean Time
+			2:00	-	EET	1930 Jun 21
+			3:00	-	MSK	1941 Jun 28
+			1:00	C-Eur	CE%sT	1944 Jul  3
+			3:00	Russia	MSK/MSD	1990
+			3:00	-	MSK	1991 Mar 31 2:00s
+			2:00	1:00	EEST	1991 Sep 29 2:00s
+			2:00	-	EET	1992 Mar 29 0:00s
+			2:00	1:00	EEST	1992 Sep 27 0:00s
+			2:00	Russia	EE%sT
+Rule	Belgium	1918	only	-	Mar	 9	 0:00s	1:00	S
+Rule	Belgium	1918	1919	-	Oct	Sat>=1	23:00s	0	-
+Rule	Belgium	1919	only	-	Mar	 1	23:00s	1:00	S
+Rule	Belgium	1920	only	-	Feb	14	23:00s	1:00	S
+Rule	Belgium	1920	only	-	Oct	23	23:00s	0	-
+Rule	Belgium	1921	only	-	Mar	14	23:00s	1:00	S
+Rule	Belgium	1921	only	-	Oct	25	23:00s	0	-
+Rule	Belgium	1922	only	-	Mar	25	23:00s	1:00	S
+Rule	Belgium	1922	1927	-	Oct	Sat>=1	23:00s	0	-
+Rule	Belgium	1923	only	-	Apr	21	23:00s	1:00	S
+Rule	Belgium	1924	only	-	Mar	29	23:00s	1:00	S
+Rule	Belgium	1925	only	-	Apr	 4	23:00s	1:00	S
+Rule	Belgium	1926	only	-	Apr	17	23:00s	1:00	S
+Rule	Belgium	1927	only	-	Apr	 9	23:00s	1:00	S
+Rule	Belgium	1928	only	-	Apr	14	23:00s	1:00	S
+Rule	Belgium	1928	1938	-	Oct	Sun>=2	 2:00s	0	-
+Rule	Belgium	1929	only	-	Apr	21	 2:00s	1:00	S
+Rule	Belgium	1930	only	-	Apr	13	 2:00s	1:00	S
+Rule	Belgium	1931	only	-	Apr	19	 2:00s	1:00	S
+Rule	Belgium	1932	only	-	Apr	 3	 2:00s	1:00	S
+Rule	Belgium	1933	only	-	Mar	26	 2:00s	1:00	S
+Rule	Belgium	1934	only	-	Apr	 8	 2:00s	1:00	S
+Rule	Belgium	1935	only	-	Mar	31	 2:00s	1:00	S
+Rule	Belgium	1936	only	-	Apr	19	 2:00s	1:00	S
+Rule	Belgium	1937	only	-	Apr	 4	 2:00s	1:00	S
+Rule	Belgium	1938	only	-	Mar	27	 2:00s	1:00	S
+Rule	Belgium	1939	only	-	Apr	16	 2:00s	1:00	S
+Rule	Belgium	1939	only	-	Nov	19	 2:00s	0	-
+Rule	Belgium	1940	only	-	Feb	25	 2:00s	1:00	S
+Rule	Belgium	1944	only	-	Sep	17	 2:00s	0	-
+Rule	Belgium	1945	only	-	Apr	 2	 2:00s	1:00	S
+Rule	Belgium	1945	only	-	Sep	16	 2:00s	0	-
+Rule	Belgium	1946	only	-	May	19	 2:00s	1:00	S
+Rule	Belgium	1946	only	-	Oct	 7	 2:00s	0	-
+Zone	Europe/Brussels	0:17:30 -	LMT	1880
+			0:17:30	-	BMT	1892 May  1 12:00 # Brussels MT
+			0:00	-	WET	1914 Nov  8
+			1:00	-	CET	1916 May  1  0:00
+			1:00	C-Eur	CE%sT	1918 Nov 11 11:00u
+			0:00	Belgium	WE%sT	1940 May 20  2:00s
+			1:00	C-Eur	CE%sT	1944 Sep  3
+			1:00	Belgium	CE%sT	1977
+			1:00	EU	CE%sT
+Rule	Bulg	1979	only	-	Mar	31	23:00	1:00	S
+Rule	Bulg	1979	only	-	Oct	 1	 1:00	0	-
+Rule	Bulg	1980	1982	-	Apr	Sat>=1	23:00	1:00	S
+Rule	Bulg	1980	only	-	Sep	29	 1:00	0	-
+Rule	Bulg	1981	only	-	Sep	27	 2:00	0	-
+Zone	Europe/Sofia	1:33:16 -	LMT	1880
+			1:56:56	-	IMT	1894 Nov 30 # Istanbul MT?
+			2:00	-	EET	1942 Nov  2  3:00
+			1:00	C-Eur	CE%sT	1945
+			1:00	-	CET	1945 Apr 2 3:00
+			2:00	-	EET	1979 Mar 31 23:00
+			2:00	Bulg	EE%sT	1982 Sep 26  2:00
+			2:00	C-Eur	EE%sT	1991
+			2:00	E-Eur	EE%sT	1997
+			2:00	EU	EE%sT
+Rule	Czech	1945	only	-	Apr	 8	2:00s	1:00	S
+Rule	Czech	1945	only	-	Nov	18	2:00s	0	-
+Rule	Czech	1946	only	-	May	 6	2:00s	1:00	S
+Rule	Czech	1946	1949	-	Oct	Sun>=1	2:00s	0	-
+Rule	Czech	1947	only	-	Apr	20	2:00s	1:00	S
+Rule	Czech	1948	only	-	Apr	18	2:00s	1:00	S
+Rule	Czech	1949	only	-	Apr	 9	2:00s	1:00	S
+Zone	Europe/Prague	0:57:44 -	LMT	1850
+			0:57:44	-	PMT	1891 Oct     # Prague Mean Time
+			1:00	C-Eur	CE%sT	1944 Sep 17 2:00s
+			1:00	Czech	CE%sT	1979
+			1:00	EU	CE%sT
+Rule	Denmark	1916	only	-	May	14	23:00	1:00	S
+Rule	Denmark	1916	only	-	Sep	30	23:00	0	-
+Rule	Denmark	1940	only	-	May	15	 0:00	1:00	S
+Rule	Denmark	1945	only	-	Apr	 2	 2:00s	1:00	S
+Rule	Denmark	1945	only	-	Aug	15	 2:00s	0	-
+Rule	Denmark	1946	only	-	May	 1	 2:00s	1:00	S
+Rule	Denmark	1946	only	-	Sep	 1	 2:00s	0	-
+Rule	Denmark	1947	only	-	May	 4	 2:00s	1:00	S
+Rule	Denmark	1947	only	-	Aug	10	 2:00s	0	-
+Rule	Denmark	1948	only	-	May	 9	 2:00s	1:00	S
+Rule	Denmark	1948	only	-	Aug	 8	 2:00s	0	-
+Zone Europe/Copenhagen	 0:50:20 -	LMT	1890
+			 0:50:20 -	CMT	1894 Jan  1 # Copenhagen MT
+			 1:00	Denmark	CE%sT	1942 Nov  2 2:00s
+			 1:00	C-Eur	CE%sT	1945 Apr  2 2:00
+			 1:00	Denmark	CE%sT	1980
+			 1:00	EU	CE%sT
+Zone Atlantic/Faroe	-0:27:04 -	LMT	1908 Jan 11	# Torshavn
+			 0:00	-	WET	1981
+			 0:00	EU	WE%sT
+Rule	Thule	1991	1992	-	Mar	lastSun	2:00	1:00	D
+Rule	Thule	1991	1992	-	Sep	lastSun	2:00	0	S
+Rule	Thule	1993	2006	-	Apr	Sun>=1	2:00	1:00	D
+Rule	Thule	1993	2006	-	Oct	lastSun	2:00	0	S
+Rule	Thule	2007	max	-	Mar	Sun>=8	2:00	1:00	D
+Rule	Thule	2007	max	-	Nov	Sun>=1	2:00	0	S
+Zone America/Danmarkshavn -1:14:40 -	LMT	1916 Jul 28
+			-3:00	-	WGT	1980 Apr  6 2:00
+			-3:00	EU	WG%sT	1996
+			0:00	-	GMT
+Zone America/Scoresbysund -1:27:52 -	LMT	1916 Jul 28 # Ittoqqortoormiit
+			-2:00	-	CGT	1980 Apr  6 2:00
+			-2:00	C-Eur	CG%sT	1981 Mar 29
+			-1:00	EU	EG%sT
+Zone America/Godthab	-3:26:56 -	LMT	1916 Jul 28 # Nuuk
+			-3:00	-	WGT	1980 Apr  6 2:00
+			-3:00	EU	WG%sT
+Zone America/Thule	-4:35:08 -	LMT	1916 Jul 28 # Pituffik air base
+			-4:00	Thule	A%sT
+Zone	Europe/Tallinn	1:39:00	-	LMT	1880
+			1:39:00	-	TMT	1918 Feb # Tallinn Mean Time
+			1:00	C-Eur	CE%sT	1919 Jul
+			1:39:00	-	TMT	1921 May
+			2:00	-	EET	1940 Aug  6
+			3:00	-	MSK	1941 Sep 15
+			1:00	C-Eur	CE%sT	1944 Sep 22
+			3:00	Russia	MSK/MSD	1989 Mar 26 2:00s
+			2:00	1:00	EEST	1989 Sep 24 2:00s
+			2:00	C-Eur	EE%sT	1998 Sep 22
+			2:00	EU	EE%sT	1999 Nov  1
+			2:00	-	EET	2002 Feb 21
+			2:00	EU	EE%sT
+Rule	Finland	1942	only	-	Apr	3	0:00	1:00	S
+Rule	Finland	1942	only	-	Oct	3	0:00	0	-
+Zone	Europe/Helsinki	1:39:52 -	LMT	1878 May 31
+			1:39:52	-	HMT	1921 May    # Helsinki Mean Time
+			2:00	Finland	EE%sT	1981 Mar 29 2:00
+			2:00	EU	EE%sT
+Link	Europe/Helsinki	Europe/Mariehamn
+Rule	France	1916	only	-	Jun	14	23:00s	1:00	S
+Rule	France	1916	1919	-	Oct	Sun>=1	23:00s	0	-
+Rule	France	1917	only	-	Mar	24	23:00s	1:00	S
+Rule	France	1918	only	-	Mar	 9	23:00s	1:00	S
+Rule	France	1919	only	-	Mar	 1	23:00s	1:00	S
+Rule	France	1920	only	-	Feb	14	23:00s	1:00	S
+Rule	France	1920	only	-	Oct	23	23:00s	0	-
+Rule	France	1921	only	-	Mar	14	23:00s	1:00	S
+Rule	France	1921	only	-	Oct	25	23:00s	0	-
+Rule	France	1922	only	-	Mar	25	23:00s	1:00	S
+Rule	France	1922	1938	-	Oct	Sat>=1	23:00s	0	-
+Rule	France	1923	only	-	May	26	23:00s	1:00	S
+Rule	France	1924	only	-	Mar	29	23:00s	1:00	S
+Rule	France	1925	only	-	Apr	 4	23:00s	1:00	S
+Rule	France	1926	only	-	Apr	17	23:00s	1:00	S
+Rule	France	1927	only	-	Apr	 9	23:00s	1:00	S
+Rule	France	1928	only	-	Apr	14	23:00s	1:00	S
+Rule	France	1929	only	-	Apr	20	23:00s	1:00	S
+Rule	France	1930	only	-	Apr	12	23:00s	1:00	S
+Rule	France	1931	only	-	Apr	18	23:00s	1:00	S
+Rule	France	1932	only	-	Apr	 2	23:00s	1:00	S
+Rule	France	1933	only	-	Mar	25	23:00s	1:00	S
+Rule	France	1934	only	-	Apr	 7	23:00s	1:00	S
+Rule	France	1935	only	-	Mar	30	23:00s	1:00	S
+Rule	France	1936	only	-	Apr	18	23:00s	1:00	S
+Rule	France	1937	only	-	Apr	 3	23:00s	1:00	S
+Rule	France	1938	only	-	Mar	26	23:00s	1:00	S
+Rule	France	1939	only	-	Apr	15	23:00s	1:00	S
+Rule	France	1939	only	-	Nov	18	23:00s	0	-
+Rule	France	1940	only	-	Feb	25	 2:00	1:00	S
+Rule	France	1941	only	-	May	 5	 0:00	2:00	M # Midsummer
+Rule	France	1941	only	-	Oct	 6	 0:00	1:00	S
+Rule	France	1942	only	-	Mar	 9	 0:00	2:00	M
+Rule	France	1942	only	-	Nov	 2	 3:00	1:00	S
+Rule	France	1943	only	-	Mar	29	 2:00	2:00	M
+Rule	France	1943	only	-	Oct	 4	 3:00	1:00	S
+Rule	France	1944	only	-	Apr	 3	 2:00	2:00	M
+Rule	France	1944	only	-	Oct	 8	 1:00	1:00	S
+Rule	France	1945	only	-	Apr	 2	 2:00	2:00	M
+Rule	France	1945	only	-	Sep	16	 3:00	0	-
+Rule	France	1976	only	-	Mar	28	 1:00	1:00	S
+Rule	France	1976	only	-	Sep	26	 1:00	0	-
+Zone	Europe/Paris	0:09:21 -	LMT	1891 Mar 15  0:01
+			0:09:21	-	PMT	1911 Mar 11  0:01  # Paris MT
+			0:00	France	WE%sT	1940 Jun 14 23:00
+			1:00	C-Eur	CE%sT	1944 Aug 25
+			0:00	France	WE%sT	1945 Sep 16  3:00
+			1:00	France	CE%sT	1977
+			1:00	EU	CE%sT
+Rule	Germany	1946	only	-	Apr	14	2:00s	1:00	S
+Rule	Germany	1946	only	-	Oct	 7	2:00s	0	-
+Rule	Germany	1947	1949	-	Oct	Sun>=1	2:00s	0	-
+Rule	Germany	1947	only	-	Apr	 6	3:00s	1:00	S
+Rule	Germany	1947	only	-	May	11	2:00s	2:00	M
+Rule	Germany	1947	only	-	Jun	29	3:00	1:00	S
+Rule	Germany	1948	only	-	Apr	18	2:00s	1:00	S
+Rule	Germany	1949	only	-	Apr	10	2:00s	1:00	S
+Rule SovietZone	1945	only	-	May	24	2:00	2:00	M # Midsummer
+Rule SovietZone	1945	only	-	Sep	24	3:00	1:00	S
+Rule SovietZone	1945	only	-	Nov	18	2:00s	0	-
+Zone	Europe/Berlin	0:53:28 -	LMT	1893 Apr
+			1:00	C-Eur	CE%sT	1945 May 24 2:00
+			1:00 SovietZone	CE%sT	1946
+			1:00	Germany	CE%sT	1980
+			1:00	EU	CE%sT
+Zone Europe/Gibraltar	-0:21:24 -	LMT	1880 Aug  2 0:00s
+			0:00	GB-Eire	%s	1957 Apr 14 2:00
+			1:00	-	CET	1982
+			1:00	EU	CE%sT
+Rule	Greece	1932	only	-	Jul	 7	0:00	1:00	S
+Rule	Greece	1932	only	-	Sep	 1	0:00	0	-
+Rule	Greece	1941	only	-	Apr	 7	0:00	1:00	S
+Rule	Greece	1942	only	-	Nov	 2	3:00	0	-
+Rule	Greece	1943	only	-	Mar	30	0:00	1:00	S
+Rule	Greece	1943	only	-	Oct	 4	0:00	0	-
+Rule	Greece	1952	only	-	Jul	 1	0:00	1:00	S
+Rule	Greece	1952	only	-	Nov	 2	0:00	0	-
+Rule	Greece	1975	only	-	Apr	12	0:00s	1:00	S
+Rule	Greece	1975	only	-	Nov	26	0:00s	0	-
+Rule	Greece	1976	only	-	Apr	11	2:00s	1:00	S
+Rule	Greece	1976	only	-	Oct	10	2:00s	0	-
+Rule	Greece	1977	1978	-	Apr	Sun>=1	2:00s	1:00	S
+Rule	Greece	1977	only	-	Sep	26	2:00s	0	-
+Rule	Greece	1978	only	-	Sep	24	4:00	0	-
+Rule	Greece	1979	only	-	Apr	 1	9:00	1:00	S
+Rule	Greece	1979	only	-	Sep	29	2:00	0	-
+Rule	Greece	1980	only	-	Apr	 1	0:00	1:00	S
+Rule	Greece	1980	only	-	Sep	28	0:00	0	-
+Zone	Europe/Athens	1:34:52 -	LMT	1895 Sep 14
+			1:34:52	-	AMT	1916 Jul 28 0:01     # Athens MT
+			2:00	Greece	EE%sT	1941 Apr 30
+			1:00	Greece	CE%sT	1944 Apr  4
+			2:00	Greece	EE%sT	1981
+			# Shanks & Pottenger say it switched to C-Eur in 1981;
+			# go with EU instead, since Greece joined it on Jan 1.
+			2:00	EU	EE%sT
+Rule	Hungary	1918	only	-	Apr	 1	 3:00	1:00	S
+Rule	Hungary	1918	only	-	Sep	29	 3:00	0	-
+Rule	Hungary	1919	only	-	Apr	15	 3:00	1:00	S
+Rule	Hungary	1919	only	-	Sep	15	 3:00	0	-
+Rule	Hungary	1920	only	-	Apr	 5	 3:00	1:00	S
+Rule	Hungary	1920	only	-	Sep	30	 3:00	0	-
+Rule	Hungary	1945	only	-	May	 1	23:00	1:00	S
+Rule	Hungary	1945	only	-	Nov	 3	 0:00	0	-
+Rule	Hungary	1946	only	-	Mar	31	 2:00s	1:00	S
+Rule	Hungary	1946	1949	-	Oct	Sun>=1	 2:00s	0	-
+Rule	Hungary	1947	1949	-	Apr	Sun>=4	 2:00s	1:00	S
+Rule	Hungary	1950	only	-	Apr	17	 2:00s	1:00	S
+Rule	Hungary	1950	only	-	Oct	23	 2:00s	0	-
+Rule	Hungary	1954	1955	-	May	23	 0:00	1:00	S
+Rule	Hungary	1954	1955	-	Oct	 3	 0:00	0	-
+Rule	Hungary	1956	only	-	Jun	Sun>=1	 0:00	1:00	S
+Rule	Hungary	1956	only	-	Sep	lastSun	 0:00	0	-
+Rule	Hungary	1957	only	-	Jun	Sun>=1	 1:00	1:00	S
+Rule	Hungary	1957	only	-	Sep	lastSun	 3:00	0	-
+Rule	Hungary	1980	only	-	Apr	 6	 1:00	1:00	S
+Zone	Europe/Budapest	1:16:20 -	LMT	1890 Oct
+			1:00	C-Eur	CE%sT	1918
+			1:00	Hungary	CE%sT	1941 Apr  6  2:00
+			1:00	C-Eur	CE%sT	1945
+			1:00	Hungary	CE%sT	1980 Sep 28  2:00s
+			1:00	EU	CE%sT
+Rule	Iceland	1917	1918	-	Feb	19	23:00	1:00	S
+Rule	Iceland	1917	only	-	Oct	21	 1:00	0	-
+Rule	Iceland	1918	only	-	Nov	16	 1:00	0	-
+Rule	Iceland	1939	only	-	Apr	29	23:00	1:00	S
+Rule	Iceland	1939	only	-	Nov	29	 2:00	0	-
+Rule	Iceland	1940	only	-	Feb	25	 2:00	1:00	S
+Rule	Iceland	1940	only	-	Nov	 3	 2:00	0	-
+Rule	Iceland	1941	only	-	Mar	 2	 1:00s	1:00	S
+Rule	Iceland	1941	only	-	Nov	 2	 1:00s	0	-
+Rule	Iceland	1942	only	-	Mar	 8	 1:00s	1:00	S
+Rule	Iceland	1942	only	-	Oct	25	 1:00s	0	-
+Rule	Iceland	1943	1946	-	Mar	Sun>=1	 1:00s	1:00	S
+Rule	Iceland	1943	1948	-	Oct	Sun>=22	 1:00s	0	-
+Rule	Iceland	1947	1967	-	Apr	Sun>=1	 1:00s	1:00	S
+Rule	Iceland	1949	only	-	Oct	30	 1:00s	0	-
+Rule	Iceland	1950	1966	-	Oct	Sun>=22	 1:00s	0	-
+Rule	Iceland	1967	only	-	Oct	29	 1:00s	0	-
+Zone Atlantic/Reykjavik	-1:27:24 -	LMT	1837
+			-1:27:48 -	RMT	1908 # Reykjavik Mean Time?
+			-1:00	Iceland	IS%sT	1968 Apr 7 1:00s
+			 0:00	-	GMT
+Rule	Italy	1916	only	-	Jun	 3	0:00s	1:00	S
+Rule	Italy	1916	only	-	Oct	 1	0:00s	0	-
+Rule	Italy	1917	only	-	Apr	 1	0:00s	1:00	S
+Rule	Italy	1917	only	-	Sep	30	0:00s	0	-
+Rule	Italy	1918	only	-	Mar	10	0:00s	1:00	S
+Rule	Italy	1918	1919	-	Oct	Sun>=1	0:00s	0	-
+Rule	Italy	1919	only	-	Mar	 2	0:00s	1:00	S
+Rule	Italy	1920	only	-	Mar	21	0:00s	1:00	S
+Rule	Italy	1920	only	-	Sep	19	0:00s	0	-
+Rule	Italy	1940	only	-	Jun	15	0:00s	1:00	S
+Rule	Italy	1944	only	-	Sep	17	0:00s	0	-
+Rule	Italy	1945	only	-	Apr	 2	2:00	1:00	S
+Rule	Italy	1945	only	-	Sep	15	0:00s	0	-
+Rule	Italy	1946	only	-	Mar	17	2:00s	1:00	S
+Rule	Italy	1946	only	-	Oct	 6	2:00s	0	-
+Rule	Italy	1947	only	-	Mar	16	0:00s	1:00	S
+Rule	Italy	1947	only	-	Oct	 5	0:00s	0	-
+Rule	Italy	1948	only	-	Feb	29	2:00s	1:00	S
+Rule	Italy	1948	only	-	Oct	 3	2:00s	0	-
+Rule	Italy	1966	1968	-	May	Sun>=22	0:00	1:00	S
+Rule	Italy	1966	1969	-	Sep	Sun>=22	0:00	0	-
+Rule	Italy	1969	only	-	Jun	 1	0:00	1:00	S
+Rule	Italy	1970	only	-	May	31	0:00	1:00	S
+Rule	Italy	1970	only	-	Sep	lastSun	0:00	0	-
+Rule	Italy	1971	1972	-	May	Sun>=22	0:00	1:00	S
+Rule	Italy	1971	only	-	Sep	lastSun	1:00	0	-
+Rule	Italy	1972	only	-	Oct	 1	0:00	0	-
+Rule	Italy	1973	only	-	Jun	 3	0:00	1:00	S
+Rule	Italy	1973	1974	-	Sep	lastSun	0:00	0	-
+Rule	Italy	1974	only	-	May	26	0:00	1:00	S
+Rule	Italy	1975	only	-	Jun	 1	0:00s	1:00	S
+Rule	Italy	1975	1977	-	Sep	lastSun	0:00s	0	-
+Rule	Italy	1976	only	-	May	30	0:00s	1:00	S
+Rule	Italy	1977	1979	-	May	Sun>=22	0:00s	1:00	S
+Rule	Italy	1978	only	-	Oct	 1	0:00s	0	-
+Rule	Italy	1979	only	-	Sep	30	0:00s	0	-
+Zone	Europe/Rome	0:49:56 -	LMT	1866 Sep 22
+			0:49:56	-	RMT	1893 Nov  1 0:00s # Rome Mean
+			1:00	Italy	CE%sT	1942 Nov  2 2:00s
+			1:00	C-Eur	CE%sT	1944 Jul
+			1:00	Italy	CE%sT	1980
+			1:00	EU	CE%sT
+Link	Europe/Rome	Europe/Vatican
+Link	Europe/Rome	Europe/San_Marino
+Rule	Latvia	1989	1996	-	Mar	lastSun	 2:00s	1:00	S
+Rule	Latvia	1989	1996	-	Sep	lastSun	 2:00s	0	-
+Zone	Europe/Riga	1:36:24	-	LMT	1880
+			1:36:24	-	RMT	1918 Apr 15 2:00 #Riga Mean Time
+			1:36:24	1:00	LST	1918 Sep 16 3:00 #Latvian Summer
+			1:36:24	-	RMT	1919 Apr  1 2:00
+			1:36:24	1:00	LST	1919 May 22 3:00
+			1:36:24	-	RMT	1926 May 11
+			2:00	-	EET	1940 Aug  5
+			3:00	-	MSK	1941 Jul
+			1:00	C-Eur	CE%sT	1944 Oct 13
+			3:00	Russia	MSK/MSD	1989 Mar lastSun 2:00s
+			2:00	1:00	EEST	1989 Sep lastSun 2:00s
+			2:00	Latvia	EE%sT	1997 Jan 21
+			2:00	EU	EE%sT	2000 Feb 29
+			2:00	-	EET	2001 Jan  2
+			2:00	EU	EE%sT
+Zone	Europe/Vaduz	0:38:04 -	LMT	1894 Jun
+			1:00	-	CET	1981
+			1:00	EU	CE%sT
+Zone	Europe/Vilnius	1:41:16	-	LMT	1880
+			1:24:00	-	WMT	1917	    # Warsaw Mean Time
+			1:35:36	-	KMT	1919 Oct 10 # Kaunas Mean Time
+			1:00	-	CET	1920 Jul 12
+			2:00	-	EET	1920 Oct  9
+			1:00	-	CET	1940 Aug  3
+			3:00	-	MSK	1941 Jun 24
+			1:00	C-Eur	CE%sT	1944 Aug
+			3:00	Russia	MSK/MSD	1991 Mar 31 2:00s
+			2:00	1:00	EEST	1991 Sep 29 2:00s
+			2:00	C-Eur	EE%sT	1998
+			2:00	-	EET	1998 Mar 29 1:00u
+			1:00	EU	CE%sT	1999 Oct 31 1:00u
+			2:00	-	EET	2003 Jan  1
+			2:00	EU	EE%sT
+Rule	Lux	1916	only	-	May	14	23:00	1:00	S
+Rule	Lux	1916	only	-	Oct	 1	 1:00	0	-
+Rule	Lux	1917	only	-	Apr	28	23:00	1:00	S
+Rule	Lux	1917	only	-	Sep	17	 1:00	0	-
+Rule	Lux	1918	only	-	Apr	Mon>=15	 2:00s	1:00	S
+Rule	Lux	1918	only	-	Sep	Mon>=15	 2:00s	0	-
+Rule	Lux	1919	only	-	Mar	 1	23:00	1:00	S
+Rule	Lux	1919	only	-	Oct	 5	 3:00	0	-
+Rule	Lux	1920	only	-	Feb	14	23:00	1:00	S
+Rule	Lux	1920	only	-	Oct	24	 2:00	0	-
+Rule	Lux	1921	only	-	Mar	14	23:00	1:00	S
+Rule	Lux	1921	only	-	Oct	26	 2:00	0	-
+Rule	Lux	1922	only	-	Mar	25	23:00	1:00	S
+Rule	Lux	1922	only	-	Oct	Sun>=2	 1:00	0	-
+Rule	Lux	1923	only	-	Apr	21	23:00	1:00	S
+Rule	Lux	1923	only	-	Oct	Sun>=2	 2:00	0	-
+Rule	Lux	1924	only	-	Mar	29	23:00	1:00	S
+Rule	Lux	1924	1928	-	Oct	Sun>=2	 1:00	0	-
+Rule	Lux	1925	only	-	Apr	 5	23:00	1:00	S
+Rule	Lux	1926	only	-	Apr	17	23:00	1:00	S
+Rule	Lux	1927	only	-	Apr	 9	23:00	1:00	S
+Rule	Lux	1928	only	-	Apr	14	23:00	1:00	S
+Rule	Lux	1929	only	-	Apr	20	23:00	1:00	S
+Zone Europe/Luxembourg	0:24:36 -	LMT	1904 Jun
+			1:00	Lux	CE%sT	1918 Nov 25
+			0:00	Lux	WE%sT	1929 Oct  6 2:00s
+			0:00	Belgium	WE%sT	1940 May 14 3:00
+			1:00	C-Eur	WE%sT	1944 Sep 18 3:00
+			1:00	Belgium	CE%sT	1977
+			1:00	EU	CE%sT
+Rule	Malta	1973	only	-	Mar	31	0:00s	1:00	S
+Rule	Malta	1973	only	-	Sep	29	0:00s	0	-
+Rule	Malta	1974	only	-	Apr	21	0:00s	1:00	S
+Rule	Malta	1974	only	-	Sep	16	0:00s	0	-
+Rule	Malta	1975	1979	-	Apr	Sun>=15	2:00	1:00	S
+Rule	Malta	1975	1980	-	Sep	Sun>=15	2:00	0	-
+Rule	Malta	1980	only	-	Mar	31	2:00	1:00	S
+Zone	Europe/Malta	0:58:04 -	LMT	1893 Nov  2 0:00s # Valletta
+			1:00	Italy	CE%sT	1942 Nov  2 2:00s
+			1:00	C-Eur	CE%sT	1945 Apr  2 2:00s
+			1:00	Italy	CE%sT	1973 Mar 31
+			1:00	Malta	CE%sT	1981
+			1:00	EU	CE%sT
+Zone	Europe/Chisinau	1:55:20 -	LMT	1880
+			1:55	-	CMT	1918 Feb 15 # Chisinau MT
+			1:44:24	-	BMT	1931 Jul 24 # Bucharest MT
+			2:00	Romania	EE%sT	1940 Aug 15
+			2:00	1:00	EEST	1941 Jul 17
+			1:00	C-Eur	CE%sT	1944 Aug 24
+			3:00	Russia	MSK/MSD	1990
+			3:00	-	MSK	1990 May 6
+			2:00	-	EET	1991
+			2:00	Russia	EE%sT	1992
+			2:00	E-Eur	EE%sT	1997
+			2:00	EU	EE%sT
+Zone	Europe/Monaco	0:29:32 -	LMT	1891 Mar 15
+			0:09:21	-	PMT	1911 Mar 11    # Paris Mean Time
+			0:00	France	WE%sT	1945 Sep 16 3:00
+			1:00	France	CE%sT	1977
+			1:00	EU	CE%sT
+Rule	Neth	1916	only	-	May	 1	0:00	1:00	NST	# Netherlands Summer Time
+Rule	Neth	1916	only	-	Oct	 1	0:00	0	AMT	# Amsterdam Mean Time
+Rule	Neth	1917	only	-	Apr	16	2:00s	1:00	NST
+Rule	Neth	1917	only	-	Sep	17	2:00s	0	AMT
+Rule	Neth	1918	1921	-	Apr	Mon>=1	2:00s	1:00	NST
+Rule	Neth	1918	1921	-	Sep	lastMon	2:00s	0	AMT
+Rule	Neth	1922	only	-	Mar	lastSun	2:00s	1:00	NST
+Rule	Neth	1922	1936	-	Oct	Sun>=2	2:00s	0	AMT
+Rule	Neth	1923	only	-	Jun	Fri>=1	2:00s	1:00	NST
+Rule	Neth	1924	only	-	Mar	lastSun	2:00s	1:00	NST
+Rule	Neth	1925	only	-	Jun	Fri>=1	2:00s	1:00	NST
+Rule	Neth	1926	1931	-	May	15	2:00s	1:00	NST
+Rule	Neth	1932	only	-	May	22	2:00s	1:00	NST
+Rule	Neth	1933	1936	-	May	15	2:00s	1:00	NST
+Rule	Neth	1937	only	-	May	22	2:00s	1:00	NST
+Rule	Neth	1937	only	-	Jul	 1	0:00	1:00	S
+Rule	Neth	1937	1939	-	Oct	Sun>=2	2:00s	0	-
+Rule	Neth	1938	1939	-	May	15	2:00s	1:00	S
+Rule	Neth	1945	only	-	Apr	 2	2:00s	1:00	S
+Rule	Neth	1945	only	-	Sep	16	2:00s	0	-
+Zone Europe/Amsterdam	0:19:32 -	LMT	1835
+			0:19:32	Neth	%s	1937 Jul  1
+			0:20	Neth	NE%sT	1940 May 16 0:00 # Dutch Time
+			1:00	C-Eur	CE%sT	1945 Apr  2 2:00
+			1:00	Neth	CE%sT	1977
+			1:00	EU	CE%sT
+Rule	Norway	1916	only	-	May	22	1:00	1:00	S
+Rule	Norway	1916	only	-	Sep	30	0:00	0	-
+Rule	Norway	1945	only	-	Apr	 2	2:00s	1:00	S
+Rule	Norway	1945	only	-	Oct	 1	2:00s	0	-
+Rule	Norway	1959	1964	-	Mar	Sun>=15	2:00s	1:00	S
+Rule	Norway	1959	1965	-	Sep	Sun>=15	2:00s	0	-
+Rule	Norway	1965	only	-	Apr	25	2:00s	1:00	S
+Zone	Europe/Oslo	0:43:00 -	LMT	1895 Jan  1
+			1:00	Norway	CE%sT	1940 Aug 10 23:00
+			1:00	C-Eur	CE%sT	1945 Apr  2  2:00
+			1:00	Norway	CE%sT	1980
+			1:00	EU	CE%sT
+Link	Europe/Oslo	Arctic/Longyearbyen
+Rule	Poland	1918	1919	-	Sep	16	2:00s	0	-
+Rule	Poland	1919	only	-	Apr	15	2:00s	1:00	S
+Rule	Poland	1944	only	-	Apr	 3	2:00s	1:00	S
+Rule	Poland	1944	only	-	Oct	 4	2:00	0	-
+Rule	Poland	1945	only	-	Apr	29	0:00	1:00	S
+Rule	Poland	1945	only	-	Nov	 1	0:00	0	-
+Rule	Poland	1946	only	-	Apr	14	0:00s	1:00	S
+Rule	Poland	1946	only	-	Oct	 7	2:00s	0	-
+Rule	Poland	1947	only	-	May	 4	2:00s	1:00	S
+Rule	Poland	1947	1949	-	Oct	Sun>=1	2:00s	0	-
+Rule	Poland	1948	only	-	Apr	18	2:00s	1:00	S
+Rule	Poland	1949	only	-	Apr	10	2:00s	1:00	S
+Rule	Poland	1957	only	-	Jun	 2	1:00s	1:00	S
+Rule	Poland	1957	1958	-	Sep	lastSun	1:00s	0	-
+Rule	Poland	1958	only	-	Mar	30	1:00s	1:00	S
+Rule	Poland	1959	only	-	May	31	1:00s	1:00	S
+Rule	Poland	1959	1961	-	Oct	Sun>=1	1:00s	0	-
+Rule	Poland	1960	only	-	Apr	 3	1:00s	1:00	S
+Rule	Poland	1961	1964	-	May	lastSun	1:00s	1:00	S
+Rule	Poland	1962	1964	-	Sep	lastSun	1:00s	0	-
+Zone	Europe/Warsaw	1:24:00 -	LMT	1880
+			1:24:00	-	WMT	1915 Aug  5   # Warsaw Mean Time
+			1:00	C-Eur	CE%sT	1918 Sep 16 3:00
+			2:00	Poland	EE%sT	1922 Jun
+			1:00	Poland	CE%sT	1940 Jun 23 2:00
+			1:00	C-Eur	CE%sT	1944 Oct
+			1:00	Poland	CE%sT	1977
+			1:00	W-Eur	CE%sT	1988
+			1:00	EU	CE%sT
+Rule	Port	1916	only	-	Jun	17	23:00	1:00	S
+Rule	Port	1916	only	-	Nov	 1	 1:00	0	-
+Rule	Port	1917	only	-	Feb	28	23:00s	1:00	S
+Rule	Port	1917	1921	-	Oct	14	23:00s	0	-
+Rule	Port	1918	only	-	Mar	 1	23:00s	1:00	S
+Rule	Port	1919	only	-	Feb	28	23:00s	1:00	S
+Rule	Port	1920	only	-	Feb	29	23:00s	1:00	S
+Rule	Port	1921	only	-	Feb	28	23:00s	1:00	S
+Rule	Port	1924	only	-	Apr	16	23:00s	1:00	S
+Rule	Port	1924	only	-	Oct	14	23:00s	0	-
+Rule	Port	1926	only	-	Apr	17	23:00s	1:00	S
+Rule	Port	1926	1929	-	Oct	Sat>=1	23:00s	0	-
+Rule	Port	1927	only	-	Apr	 9	23:00s	1:00	S
+Rule	Port	1928	only	-	Apr	14	23:00s	1:00	S
+Rule	Port	1929	only	-	Apr	20	23:00s	1:00	S
+Rule	Port	1931	only	-	Apr	18	23:00s	1:00	S
+Rule	Port	1931	1932	-	Oct	Sat>=1	23:00s	0	-
+Rule	Port	1932	only	-	Apr	 2	23:00s	1:00	S
+Rule	Port	1934	only	-	Apr	 7	23:00s	1:00	S
+Rule	Port	1934	1938	-	Oct	Sat>=1	23:00s	0	-
+Rule	Port	1935	only	-	Mar	30	23:00s	1:00	S
+Rule	Port	1936	only	-	Apr	18	23:00s	1:00	S
+Rule	Port	1937	only	-	Apr	 3	23:00s	1:00	S
+Rule	Port	1938	only	-	Mar	26	23:00s	1:00	S
+Rule	Port	1939	only	-	Apr	15	23:00s	1:00	S
+Rule	Port	1939	only	-	Nov	18	23:00s	0	-
+Rule	Port	1940	only	-	Feb	24	23:00s	1:00	S
+Rule	Port	1940	1941	-	Oct	 5	23:00s	0	-
+Rule	Port	1941	only	-	Apr	 5	23:00s	1:00	S
+Rule	Port	1942	1945	-	Mar	Sat>=8	23:00s	1:00	S
+Rule	Port	1942	only	-	Apr	25	22:00s	2:00	M # Midsummer
+Rule	Port	1942	only	-	Aug	15	22:00s	1:00	S
+Rule	Port	1942	1945	-	Oct	Sat>=24	23:00s	0	-
+Rule	Port	1943	only	-	Apr	17	22:00s	2:00	M
+Rule	Port	1943	1945	-	Aug	Sat>=25	22:00s	1:00	S
+Rule	Port	1944	1945	-	Apr	Sat>=21	22:00s	2:00	M
+Rule	Port	1946	only	-	Apr	Sat>=1	23:00s	1:00	S
+Rule	Port	1946	only	-	Oct	Sat>=1	23:00s	0	-
+Rule	Port	1947	1949	-	Apr	Sun>=1	 2:00s	1:00	S
+Rule	Port	1947	1949	-	Oct	Sun>=1	 2:00s	0	-
+Rule	Port	1951	1965	-	Apr	Sun>=1	 2:00s	1:00	S
+Rule	Port	1951	1965	-	Oct	Sun>=1	 2:00s	0	-
+Rule	Port	1977	only	-	Mar	27	 0:00s	1:00	S
+Rule	Port	1977	only	-	Sep	25	 0:00s	0	-
+Rule	Port	1978	1979	-	Apr	Sun>=1	 0:00s	1:00	S
+Rule	Port	1978	only	-	Oct	 1	 0:00s	0	-
+Rule	Port	1979	1982	-	Sep	lastSun	 1:00s	0	-
+Rule	Port	1980	only	-	Mar	lastSun	 0:00s	1:00	S
+Rule	Port	1981	1982	-	Mar	lastSun	 1:00s	1:00	S
+Rule	Port	1983	only	-	Mar	lastSun	 2:00s	1:00	S
+Zone	Europe/Lisbon	-0:36:32 -	LMT	1884
+			-0:36:32 -	LMT	1912 Jan  1  # Lisbon Mean Time
+			 0:00	Port	WE%sT	1966 Apr  3 2:00
+			 1:00	-	CET	1976 Sep 26 1:00
+			 0:00	Port	WE%sT	1983 Sep 25 1:00s
+			 0:00	W-Eur	WE%sT	1992 Sep 27 1:00s
+			 1:00	EU	CE%sT	1996 Mar 31 1:00u
+			 0:00	EU	WE%sT
+Zone Atlantic/Azores	-1:42:40 -	LMT	1884		# Ponta Delgada
+			-1:54:32 -	HMT	1911 May 24  # Horta Mean Time
+			-2:00	Port	AZO%sT	1966 Apr  3 2:00 # Azores Time
+			-1:00	Port	AZO%sT	1983 Sep 25 1:00s
+			-1:00	W-Eur	AZO%sT	1992 Sep 27 1:00s
+			 0:00	EU	WE%sT	1993 Mar 28 1:00u
+			-1:00	EU	AZO%sT
+Zone Atlantic/Madeira	-1:07:36 -	LMT	1884		# Funchal
+			-1:07:36 -	FMT	1911 May 24  # Funchal Mean Time
+			-1:00	Port	MAD%sT	1966 Apr  3 2:00 # Madeira Time
+			 0:00	Port	WE%sT	1983 Sep 25 1:00s
+			 0:00	EU	WE%sT
+Rule	Romania	1932	only	-	May	21	 0:00s	1:00	S
+Rule	Romania	1932	1939	-	Oct	Sun>=1	 0:00s	0	-
+Rule	Romania	1933	1939	-	Apr	Sun>=2	 0:00s	1:00	S
+Rule	Romania	1979	only	-	May	27	 0:00	1:00	S
+Rule	Romania	1979	only	-	Sep	lastSun	 0:00	0	-
+Rule	Romania	1980	only	-	Apr	 5	23:00	1:00	S
+Rule	Romania	1980	only	-	Sep	lastSun	 1:00	0	-
+Rule	Romania	1991	1993	-	Mar	lastSun	 0:00s	1:00	S
+Rule	Romania	1991	1993	-	Sep	lastSun	 0:00s	0	-
+Zone Europe/Bucharest	1:44:24 -	LMT	1891 Oct
+			1:44:24	-	BMT	1931 Jul 24	# Bucharest MT
+			2:00	Romania	EE%sT	1981 Mar 29 2:00s
+			2:00	C-Eur	EE%sT	1991
+			2:00	Romania	EE%sT	1994
+			2:00	E-Eur	EE%sT	1997
+			2:00	EU	EE%sT
+Zone Europe/Kaliningrad	 1:22:00 -	LMT	1893 Apr
+			 1:00	C-Eur	CE%sT	1945
+			 2:00	Poland	CE%sT	1946
+			 3:00	Russia	MSK/MSD	1991 Mar 31 2:00s
+			 2:00	Russia	EE%sT
+Zone Europe/Moscow	 2:30:20 -	LMT	1880
+			 2:30	-	MMT	1916 Jul  3 # Moscow Mean Time
+			 2:30:48 Russia	%s	1919 Jul  1 2:00
+			 3:00	Russia	MSK/MSD	1922 Oct
+			 2:00	-	EET	1930 Jun 21
+			 3:00	Russia	MSK/MSD	1991 Mar 31 2:00s
+			 2:00	Russia	EE%sT	1992 Jan 19 2:00s
+			 3:00	Russia	MSK/MSD
+Zone Europe/Volgograd	 2:57:40 -	LMT	1920 Jan  3
+			 3:00	-	TSAT	1925 Apr  6 # Tsaritsyn Time
+			 3:00	-	STAT	1930 Jun 21 # Stalingrad Time
+			 4:00	-	STAT	1961 Nov 11
+			 4:00	Russia	VOL%sT	1989 Mar 26 2:00s # Volgograd T
+			 3:00	Russia	VOL%sT	1991 Mar 31 2:00s
+			 4:00	-	VOLT	1992 Mar 29 2:00s
+			 3:00	Russia	VOL%sT
+Zone Europe/Samara	 3:20:36 -	LMT	1919 Jul  1 2:00
+			 3:00	-	SAMT	1930 Jun 21
+			 4:00	-	SAMT	1935 Jan 27
+			 4:00	Russia	KUY%sT	1989 Mar 26 2:00s # Kuybyshev
+			 3:00	Russia	KUY%sT	1991 Mar 31 2:00s
+			 2:00	Russia	KUY%sT	1991 Sep 29 2:00s
+			 3:00	-	KUYT	1991 Oct 20 3:00
+			 4:00	Russia	SAM%sT	# Samara Time
+Zone Asia/Yekaterinburg	 4:02:24 -	LMT	1919 Jul 15 4:00
+			 4:00	-	SVET	1930 Jun 21 # Sverdlovsk Time
+			 5:00	Russia	SVE%sT	1991 Mar 31 2:00s
+			 4:00	Russia	SVE%sT	1992 Jan 19 2:00s
+			 5:00	Russia	YEK%sT	# Yekaterinburg Time
+Zone Asia/Omsk		 4:53:36 -	LMT	1919 Nov 14
+			 5:00	-	OMST	1930 Jun 21 # Omsk TIme
+			 6:00	Russia	OMS%sT	1991 Mar 31 2:00s
+			 5:00	Russia	OMS%sT	1992 Jan 19 2:00s
+			 6:00	Russia	OMS%sT
+Zone Asia/Novosibirsk	 5:31:40 -	LMT	1919 Dec 14 6:00
+			 6:00	-	NOVT	1930 Jun 21 # Novosibirsk Time
+			 7:00	Russia	NOV%sT	1991 Mar 31 2:00s
+			 6:00	Russia	NOV%sT	1992 Jan 19 2:00s
+			 7:00	Russia	NOV%sT	1993 May 23 # say Shanks & P.
+			 6:00	Russia	NOV%sT
+Zone Asia/Krasnoyarsk	 6:11:20 -	LMT	1920 Jan  6
+			 6:00	-	KRAT	1930 Jun 21 # Krasnoyarsk Time
+			 7:00	Russia	KRA%sT	1991 Mar 31 2:00s
+			 6:00	Russia	KRA%sT	1992 Jan 19 2:00s
+			 7:00	Russia	KRA%sT
+Zone Asia/Irkutsk	 6:57:20 -	LMT	1880
+			 6:57:20 -	IMT	1920 Jan 25 # Irkutsk Mean Time
+			 7:00	-	IRKT	1930 Jun 21 # Irkutsk Time
+			 8:00	Russia	IRK%sT	1991 Mar 31 2:00s
+			 7:00	Russia	IRK%sT	1992 Jan 19 2:00s
+			 8:00	Russia	IRK%sT
+Zone Asia/Yakutsk	 8:38:40 -	LMT	1919 Dec 15
+			 8:00	-	YAKT	1930 Jun 21 # Yakutsk Time
+			 9:00	Russia	YAK%sT	1991 Mar 31 2:00s
+			 8:00	Russia	YAK%sT	1992 Jan 19 2:00s
+			 9:00	Russia	YAK%sT
+Zone Asia/Vladivostok	 8:47:44 -	LMT	1922 Nov 15
+			 9:00	-	VLAT	1930 Jun 21 # Vladivostok Time
+			10:00	Russia	VLA%sT	1991 Mar 31 2:00s
+			 9:00	Russia	VLA%sST	1992 Jan 19 2:00s
+			10:00	Russia	VLA%sT
+Zone Asia/Sakhalin	 9:30:48 -	LMT	1905 Aug 23
+			 9:00	-	CJT	1938
+			 9:00	-	JST	1945 Aug 25
+			11:00	Russia	SAK%sT	1991 Mar 31 2:00s # Sakhalin T.
+			10:00	Russia	SAK%sT	1992 Jan 19 2:00s
+			11:00	Russia	SAK%sT	1997 Mar lastSun 2:00s
+			10:00	Russia	SAK%sT
+Zone Asia/Magadan	10:03:12 -	LMT	1924 May  2
+			10:00	-	MAGT	1930 Jun 21 # Magadan Time
+			11:00	Russia	MAG%sT	1991 Mar 31 2:00s
+			10:00	Russia	MAG%sT	1992 Jan 19 2:00s
+			11:00	Russia	MAG%sT
+Zone Asia/Kamchatka	10:34:36 -	LMT	1922 Nov 10
+			11:00	-	PETT	1930 Jun 21 # P-K Time
+			12:00	Russia	PET%sT	1991 Mar 31 2:00s
+			11:00	Russia	PET%sT	1992 Jan 19 2:00s
+			12:00	Russia	PET%sT
+Zone Asia/Anadyr	11:49:56 -	LMT	1924 May  2
+			12:00	-	ANAT	1930 Jun 21 # Anadyr Time
+			13:00	Russia	ANA%sT	1982 Apr  1 0:00s
+			12:00	Russia	ANA%sT	1991 Mar 31 2:00s
+			11:00	Russia	ANA%sT	1992 Jan 19 2:00s
+			12:00	Russia	ANA%sT
+Zone	Europe/Belgrade	1:22:00	-	LMT	1884
+			1:00	-	CET	1941 Apr 18 23:00
+			1:00	C-Eur	CE%sT	1945
+			1:00	-	CET	1945 May 8 2:00s
+			1:00	1:00	CEST	1945 Sep 16  2:00s
+			1:00	-	CET	1982 Nov 27
+			1:00	EU	CE%sT
+Link Europe/Belgrade Europe/Ljubljana	# Slovenia
+Link Europe/Belgrade Europe/Podgorica	# Montenegro
+Link Europe/Belgrade Europe/Sarajevo	# Bosnia and Herzegovina
+Link Europe/Belgrade Europe/Skopje	# Macedonia
+Link Europe/Belgrade Europe/Zagreb	# Croatia
+Link Europe/Prague Europe/Bratislava
+Rule	Spain	1917	only	-	May	 5	23:00s	1:00	S
+Rule	Spain	1917	1919	-	Oct	 6	23:00s	0	-
+Rule	Spain	1918	only	-	Apr	15	23:00s	1:00	S
+Rule	Spain	1919	only	-	Apr	 5	23:00s	1:00	S
+Rule	Spain	1924	only	-	Apr	16	23:00s	1:00	S
+Rule	Spain	1924	only	-	Oct	 4	23:00s	0	-
+Rule	Spain	1926	only	-	Apr	17	23:00s	1:00	S
+Rule	Spain	1926	1929	-	Oct	Sat>=1	23:00s	0	-
+Rule	Spain	1927	only	-	Apr	 9	23:00s	1:00	S
+Rule	Spain	1928	only	-	Apr	14	23:00s	1:00	S
+Rule	Spain	1929	only	-	Apr	20	23:00s	1:00	S
+Rule	Spain	1937	only	-	May	22	23:00s	1:00	S
+Rule	Spain	1937	1939	-	Oct	Sat>=1	23:00s	0	-
+Rule	Spain	1938	only	-	Mar	22	23:00s	1:00	S
+Rule	Spain	1939	only	-	Apr	15	23:00s	1:00	S
+Rule	Spain	1940	only	-	Mar	16	23:00s	1:00	S
+Rule	Spain	1942	only	-	May	 2	22:00s	2:00	M # Midsummer
+Rule	Spain	1942	only	-	Sep	 1	22:00s	1:00	S
+Rule	Spain	1943	1946	-	Apr	Sat>=13	22:00s	2:00	M
+Rule	Spain	1943	only	-	Oct	 3	22:00s	1:00	S
+Rule	Spain	1944	only	-	Oct	10	22:00s	1:00	S
+Rule	Spain	1945	only	-	Sep	30	 1:00	1:00	S
+Rule	Spain	1946	only	-	Sep	30	 0:00	0	-
+Rule	Spain	1949	only	-	Apr	30	23:00	1:00	S
+Rule	Spain	1949	only	-	Sep	30	 1:00	0	-
+Rule	Spain	1974	1975	-	Apr	Sat>=13	23:00	1:00	S
+Rule	Spain	1974	1975	-	Oct	Sun>=1	 1:00	0	-
+Rule	Spain	1976	only	-	Mar	27	23:00	1:00	S
+Rule	Spain	1976	1977	-	Sep	lastSun	 1:00	0	-
+Rule	Spain	1977	1978	-	Apr	 2	23:00	1:00	S
+Rule	Spain	1978	only	-	Oct	 1	 1:00	0	-
+Rule SpainAfrica 1967	only	-	Jun	 3	12:00	1:00	S
+Rule SpainAfrica 1967	only	-	Oct	 1	 0:00	0	-
+Rule SpainAfrica 1974	only	-	Jun	24	 0:00	1:00	S
+Rule SpainAfrica 1974	only	-	Sep	 1	 0:00	0	-
+Rule SpainAfrica 1976	1977	-	May	 1	 0:00	1:00	S
+Rule SpainAfrica 1976	only	-	Aug	 1	 0:00	0	-
+Rule SpainAfrica 1977	only	-	Sep	28	 0:00	0	-
+Rule SpainAfrica 1978	only	-	Jun	 1	 0:00	1:00	S
+Rule SpainAfrica 1978	only	-	Aug	 4	 0:00	0	-
+Zone	Europe/Madrid	-0:14:44 -	LMT	1901 Jan  1  0:00s
+			 0:00	Spain	WE%sT	1946 Sep 30
+			 1:00	Spain	CE%sT	1979
+			 1:00	EU	CE%sT
+Zone	Africa/Ceuta	-0:21:16 -	LMT	1901
+			 0:00	-	WET	1918 May  6 23:00
+			 0:00	1:00	WEST	1918 Oct  7 23:00
+			 0:00	-	WET	1924
+			 0:00	Spain	WE%sT	1929
+			 0:00 SpainAfrica WE%sT 1984 Mar 16
+			 1:00	-	CET	1986
+			 1:00	EU	CE%sT
+Zone	Atlantic/Canary	-1:01:36 -	LMT	1922 Mar # Las Palmas de Gran C.
+			-1:00	-	CANT	1946 Sep 30 1:00 # Canaries Time
+			 0:00	-	WET	1980 Apr  6 0:00s
+			 0:00	1:00	WEST	1980 Sep 28 0:00s
+			 0:00	EU	WE%sT
+Zone Europe/Stockholm	1:12:12 -	LMT	1879 Jan  1
+			1:00:14	-	SET	1900 Jan  1	# Swedish Time
+			1:00	-	CET	1916 May 14 23:00
+			1:00	1:00	CEST	1916 Oct  1 01:00
+			1:00	-	CET	1980
+			1:00	EU	CE%sT
+Rule	Swiss	1941	1942	-	May	Mon>=1	1:00	1:00	S
+Rule	Swiss	1941	1942	-	Oct	Mon>=1	2:00	0	-
+Zone	Europe/Zurich	0:34:08 -	LMT	1848 Sep 12
+			0:29:44	-	BMT	1894 Jun # Bern Mean Time
+			1:00	Swiss	CE%sT	1981
+			1:00	EU	CE%sT
+Rule	Turkey	1916	only	-	May	 1	0:00	1:00	S
+Rule	Turkey	1916	only	-	Oct	 1	0:00	0	-
+Rule	Turkey	1920	only	-	Mar	28	0:00	1:00	S
+Rule	Turkey	1920	only	-	Oct	25	0:00	0	-
+Rule	Turkey	1921	only	-	Apr	 3	0:00	1:00	S
+Rule	Turkey	1921	only	-	Oct	 3	0:00	0	-
+Rule	Turkey	1922	only	-	Mar	26	0:00	1:00	S
+Rule	Turkey	1922	only	-	Oct	 8	0:00	0	-
+Rule	Turkey	1924	only	-	May	13	0:00	1:00	S
+Rule	Turkey	1924	1925	-	Oct	 1	0:00	0	-
+Rule	Turkey	1925	only	-	May	 1	0:00	1:00	S
+Rule	Turkey	1940	only	-	Jun	30	0:00	1:00	S
+Rule	Turkey	1940	only	-	Oct	 5	0:00	0	-
+Rule	Turkey	1940	only	-	Dec	 1	0:00	1:00	S
+Rule	Turkey	1941	only	-	Sep	21	0:00	0	-
+Rule	Turkey	1942	only	-	Apr	 1	0:00	1:00	S
+Rule	Turkey	1942	only	-	Nov	 1	0:00	0	-
+Rule	Turkey	1945	only	-	Apr	 2	0:00	1:00	S
+Rule	Turkey	1945	only	-	Oct	 8	0:00	0	-
+Rule	Turkey	1946	only	-	Jun	 1	0:00	1:00	S
+Rule	Turkey	1946	only	-	Oct	 1	0:00	0	-
+Rule	Turkey	1947	1948	-	Apr	Sun>=16	0:00	1:00	S
+Rule	Turkey	1947	1950	-	Oct	Sun>=2	0:00	0	-
+Rule	Turkey	1949	only	-	Apr	10	0:00	1:00	S
+Rule	Turkey	1950	only	-	Apr	19	0:00	1:00	S
+Rule	Turkey	1951	only	-	Apr	22	0:00	1:00	S
+Rule	Turkey	1951	only	-	Oct	 8	0:00	0	-
+Rule	Turkey	1962	only	-	Jul	15	0:00	1:00	S
+Rule	Turkey	1962	only	-	Oct	 8	0:00	0	-
+Rule	Turkey	1964	only	-	May	15	0:00	1:00	S
+Rule	Turkey	1964	only	-	Oct	 1	0:00	0	-
+Rule	Turkey	1970	1972	-	May	Sun>=2	0:00	1:00	S
+Rule	Turkey	1970	1972	-	Oct	Sun>=2	0:00	0	-
+Rule	Turkey	1973	only	-	Jun	 3	1:00	1:00	S
+Rule	Turkey	1973	only	-	Nov	 4	3:00	0	-
+Rule	Turkey	1974	only	-	Mar	31	2:00	1:00	S
+Rule	Turkey	1974	only	-	Nov	 3	5:00	0	-
+Rule	Turkey	1975	only	-	Mar	30	0:00	1:00	S
+Rule	Turkey	1975	1976	-	Oct	lastSun	0:00	0	-
+Rule	Turkey	1976	only	-	Jun	 1	0:00	1:00	S
+Rule	Turkey	1977	1978	-	Apr	Sun>=1	0:00	1:00	S
+Rule	Turkey	1977	only	-	Oct	16	0:00	0	-
+Rule	Turkey	1979	1980	-	Apr	Sun>=1	3:00	1:00	S
+Rule	Turkey	1979	1982	-	Oct	Mon>=11	0:00	0	-
+Rule	Turkey	1981	1982	-	Mar	lastSun	3:00	1:00	S
+Rule	Turkey	1983	only	-	Jul	31	0:00	1:00	S
+Rule	Turkey	1983	only	-	Oct	 2	0:00	0	-
+Rule	Turkey	1985	only	-	Apr	20	0:00	1:00	S
+Rule	Turkey	1985	only	-	Sep	28	0:00	0	-
+Rule	Turkey	1986	1990	-	Mar	lastSun	2:00s	1:00	S
+Rule	Turkey	1986	1990	-	Sep	lastSun	2:00s	0	-
+Rule	Turkey	1991	2006	-	Mar	lastSun	1:00s	1:00	S
+Rule	Turkey	1991	1995	-	Sep	lastSun	1:00s	0	-
+Rule	Turkey	1996	2006	-	Oct	lastSun	1:00s	0	-
+Zone	Europe/Istanbul	1:55:52 -	LMT	1880
+			1:56:56	-	IMT	1910 Oct # Istanbul Mean Time?
+			2:00	Turkey	EE%sT	1978 Oct 15
+			3:00	Turkey	TR%sT	1985 Apr 20 # Turkey Time
+			2:00	Turkey	EE%sT	2007
+			2:00	EU	EE%sT
+Link	Europe/Istanbul	Asia/Istanbul	# Istanbul is in both continents.
+Zone Europe/Kiev	2:02:04 -	LMT	1880
+			2:02:04	-	KMT	1924 May  2 # Kiev Mean Time
+			2:00	-	EET	1930 Jun 21
+			3:00	-	MSK	1941 Sep 20
+			1:00	C-Eur	CE%sT	1943 Nov  6
+			3:00	Russia	MSK/MSD	1990
+			3:00	-	MSK	1990 Jul  1 2:00
+			2:00	-	EET	1992
+			2:00	E-Eur	EE%sT	1995
+			2:00	EU	EE%sT
+Zone Europe/Uzhgorod	1:29:12 -	LMT	1890 Oct
+			1:00	-	CET	1940
+			1:00	C-Eur	CE%sT	1944 Oct
+			1:00	1:00	CEST	1944 Oct 26
+			1:00	-	CET	1945 Jun 29
+			3:00	Russia	MSK/MSD	1990
+			3:00	-	MSK	1990 Jul  1 2:00
+			1:00	-	CET	1991 Mar 31 3:00
+			2:00	-	EET	1992
+			2:00	E-Eur	EE%sT	1995
+			2:00	EU	EE%sT
+Zone Europe/Zaporozhye	2:20:40 -	LMT	1880
+			2:20	-	CUT	1924 May  2 # Central Ukraine T
+			2:00	-	EET	1930 Jun 21
+			3:00	-	MSK	1941 Aug 25
+			1:00	C-Eur	CE%sT	1943 Oct 25
+			3:00	Russia	MSK/MSD	1991 Mar 31 2:00
+			2:00	E-Eur	EE%sT	1995
+			2:00	EU	EE%sT
+Zone Europe/Simferopol	2:16:24 -	LMT	1880
+			2:16	-	SMT	1924 May  2 # Simferopol Mean T
+			2:00	-	EET	1930 Jun 21
+			3:00	-	MSK	1941 Nov
+			1:00	C-Eur	CE%sT	1944 Apr 13
+			3:00	Russia	MSK/MSD	1990
+			3:00	-	MSK	1990 Jul  1 2:00
+			2:00	-	EET	1992
+			2:00	E-Eur	EE%sT	1994 May
+			3:00	E-Eur	MSK/MSD	1996 Mar 31 3:00s
+			3:00	1:00	MSD	1996 Oct 27 3:00s
+			3:00	Russia	MSK/MSD	1997
+			3:00	-	MSK	1997 Mar lastSun 1:00u
+			2:00	EU	EE%sT
diff --git a/dojox/date/zoneinfo/northamerica b/dojox/date/zoneinfo/northamerica
new file mode 100644
index 0000000..fe60abb
--- /dev/null
+++ b/dojox/date/zoneinfo/northamerica
@@ -0,0 +1,895 @@
+Rule	US	1918	1919	-	Mar	lastSun	2:00	1:00	D
+Rule	US	1918	1919	-	Oct	lastSun	2:00	0	S
+Rule	US	1942	only	-	Feb	9	2:00	1:00	W # War
+Rule	US	1945	only	-	Aug	14	23:00u	1:00	P # Peace
+Rule	US	1945	only	-	Sep	30	2:00	0	S
+Rule	US	1967	2006	-	Oct	lastSun	2:00	0	S
+Rule	US	1967	1973	-	Apr	lastSun	2:00	1:00	D
+Rule	US	1974	only	-	Jan	6	2:00	1:00	D
+Rule	US	1975	only	-	Feb	23	2:00	1:00	D
+Rule	US	1976	1986	-	Apr	lastSun	2:00	1:00	D
+Rule	US	1987	2006	-	Apr	Sun>=1	2:00	1:00	D
+Rule	US	2007	max	-	Mar	Sun>=8	2:00	1:00	D
+Rule	US	2007	max	-	Nov	Sun>=1	2:00	0	S
+Zone	EST		 -5:00	-	EST
+Zone	MST		 -7:00	-	MST
+Zone	HST		-10:00	-	HST
+Zone	EST5EDT		 -5:00	US	E%sT
+Zone	CST6CDT		 -6:00	US	C%sT
+Zone	MST7MDT		 -7:00	US	M%sT
+Zone	PST8PDT		 -8:00	US	P%sT
+Rule	NYC	1920	only	-	Mar	lastSun	2:00	1:00	D
+Rule	NYC	1920	only	-	Oct	lastSun	2:00	0	S
+Rule	NYC	1921	1966	-	Apr	lastSun	2:00	1:00	D
+Rule	NYC	1921	1954	-	Sep	lastSun	2:00	0	S
+Rule	NYC	1955	1966	-	Oct	lastSun	2:00	0	S
+Zone America/New_York	-4:56:02 -	LMT	1883 Nov 18 12:03:58
+			-5:00	US	E%sT	1920
+			-5:00	NYC	E%sT	1942
+			-5:00	US	E%sT	1946
+			-5:00	NYC	E%sT	1967
+			-5:00	US	E%sT
+Rule	Chicago	1920	only	-	Jun	13	2:00	1:00	D
+Rule	Chicago	1920	1921	-	Oct	lastSun	2:00	0	S
+Rule	Chicago	1921	only	-	Mar	lastSun	2:00	1:00	D
+Rule	Chicago	1922	1966	-	Apr	lastSun	2:00	1:00	D
+Rule	Chicago	1922	1954	-	Sep	lastSun	2:00	0	S
+Rule	Chicago	1955	1966	-	Oct	lastSun	2:00	0	S
+Zone America/Chicago	-5:50:36 -	LMT	1883 Nov 18 12:09:24
+			-6:00	US	C%sT	1920
+			-6:00	Chicago	C%sT	1936 Mar  1 2:00
+			-5:00	-	EST	1936 Nov 15 2:00
+			-6:00	Chicago	C%sT	1942
+			-6:00	US	C%sT	1946
+			-6:00	Chicago	C%sT	1967
+			-6:00	US	C%sT
+Zone America/North_Dakota/Center -6:45:12 - LMT	1883 Nov 18 12:14:48
+			-7:00	US	M%sT	1992 Oct 25 02:00
+			-6:00	US	C%sT
+Zone America/North_Dakota/New_Salem -6:45:39 - LMT 1883 Nov 18 12:14:21
+			-7:00	US	M%sT	2003 Oct 26 02:00
+			-6:00	US	C%sT
+Rule	Denver	1920	1921	-	Mar	lastSun	2:00	1:00	D
+Rule	Denver	1920	only	-	Oct	lastSun	2:00	0	S
+Rule	Denver	1921	only	-	May	22	2:00	0	S
+Rule	Denver	1965	1966	-	Apr	lastSun	2:00	1:00	D
+Rule	Denver	1965	1966	-	Oct	lastSun	2:00	0	S
+Zone America/Denver	-6:59:56 -	LMT	1883 Nov 18 12:00:04
+			-7:00	US	M%sT	1920
+			-7:00	Denver	M%sT	1942
+			-7:00	US	M%sT	1946
+			-7:00	Denver	M%sT	1967
+			-7:00	US	M%sT
+Rule	CA	1948	only	-	Mar	14	2:00	1:00	D
+Rule	CA	1949	only	-	Jan	 1	2:00	0	S
+Rule	CA	1950	1966	-	Apr	lastSun	2:00	1:00	D
+Rule	CA	1950	1961	-	Sep	lastSun	2:00	0	S
+Rule	CA	1962	1966	-	Oct	lastSun	2:00	0	S
+Zone America/Los_Angeles -7:52:58 -	LMT	1883 Nov 18 12:07:02
+			-8:00	US	P%sT	1946
+			-8:00	CA	P%sT	1967
+			-8:00	US	P%sT
+Zone America/Juneau	 15:02:19 -	LMT	1867 Oct 18
+			 -8:57:41 -	LMT	1900 Aug 20 12:00
+			 -8:00	-	PST	1942
+			 -8:00	US	P%sT	1946
+			 -8:00	-	PST	1969
+			 -8:00	US	P%sT	1983 Oct 30 2:00
+			 -9:00	US	Y%sT	1983 Nov 30
+			 -9:00	US	AK%sT
+Zone America/Yakutat	 14:41:05 -	LMT	1867 Oct 18
+			 -9:18:55 -	LMT	1900 Aug 20 12:00
+			 -9:00	-	YST	1942
+			 -9:00	US	Y%sT	1946
+			 -9:00	-	YST	1969
+			 -9:00	US	Y%sT	1983 Nov 30
+			 -9:00	US	AK%sT
+Zone America/Anchorage	 14:00:24 -	LMT	1867 Oct 18
+			 -9:59:36 -	LMT	1900 Aug 20 12:00
+			-10:00	-	CAT	1942
+			-10:00	US	CAT/CAWT 1945 Aug 14 23:00u
+			-10:00	US	CAT/CAPT 1946 # Peace
+			-10:00	-	CAT	1967 Apr
+			-10:00	-	AHST	1969
+			-10:00	US	AH%sT	1983 Oct 30 2:00
+			 -9:00	US	Y%sT	1983 Nov 30
+			 -9:00	US	AK%sT
+Zone America/Nome	 12:58:21 -	LMT	1867 Oct 18
+			-11:01:38 -	LMT	1900 Aug 20 12:00
+			-11:00	-	NST	1942
+			-11:00	US	N%sT	1946
+			-11:00	-	NST	1967 Apr
+			-11:00	-	BST	1969
+			-11:00	US	B%sT	1983 Oct 30 2:00
+			 -9:00	US	Y%sT	1983 Nov 30
+			 -9:00	US	AK%sT
+Zone America/Adak	 12:13:21 -	LMT	1867 Oct 18
+			-11:46:38 -	LMT	1900 Aug 20 12:00
+			-11:00	-	NST	1942
+			-11:00	US	N%sT	1946
+			-11:00	-	NST	1967 Apr
+			-11:00	-	BST	1969
+			-11:00	US	B%sT	1983 Oct 30 2:00
+			-10:00	US	AH%sT	1983 Nov 30
+			-10:00	US	HA%sT
+Zone Pacific/Honolulu	-10:31:26 -	LMT	1900 Jan  1 12:00
+			-10:30	-	HST	1933 Apr 30 2:00
+			-10:30	1:00	HDT	1933 May 21 2:00
+			-10:30	US	H%sT	1947 Jun  8 2:00
+			-10:00	-	HST
+Zone America/Phoenix	-7:28:18 -	LMT	1883 Nov 18 11:31:42
+			-7:00	US	M%sT	1944 Jan  1 00:01
+			-7:00	-	MST	1944 Apr  1 00:01
+			-7:00	US	M%sT	1944 Oct  1 00:01
+			-7:00	-	MST	1967
+			-7:00	US	M%sT	1968 Mar 21
+			-7:00	-	MST
+Link America/Denver America/Shiprock
+Zone America/Boise	-7:44:49 -	LMT	1883 Nov 18 12:15:11
+			-8:00	US	P%sT	1923 May 13 2:00
+			-7:00	US	M%sT	1974
+			-7:00	-	MST	1974 Feb  3 2:00
+			-7:00	US	M%sT
+Rule Indianapolis 1941	only	-	Jun	22	2:00	1:00	D
+Rule Indianapolis 1941	1954	-	Sep	lastSun	2:00	0	S
+Rule Indianapolis 1946	1954	-	Apr	lastSun	2:00	1:00	D
+Zone America/Indiana/Indianapolis -5:44:38 - LMT 1883 Nov 18 12:15:22
+			-6:00	US	C%sT	1920
+			-6:00 Indianapolis C%sT	1942
+			-6:00	US	C%sT	1946
+			-6:00 Indianapolis C%sT	1955 Apr 24 2:00
+			-5:00	-	EST	1957 Sep 29 2:00
+			-6:00	-	CST	1958 Apr 27 2:00
+			-5:00	-	EST	1969
+			-5:00	US	E%sT	1971
+			-5:00	-	EST	2006
+			-5:00	US	E%sT
+Rule	Marengo	1951	only	-	Apr	lastSun	2:00	1:00	D
+Rule	Marengo	1951	only	-	Sep	lastSun	2:00	0	S
+Rule	Marengo	1954	1960	-	Apr	lastSun	2:00	1:00	D
+Rule	Marengo	1954	1960	-	Sep	lastSun	2:00	0	S
+Zone America/Indiana/Marengo -5:45:23 -	LMT	1883 Nov 18 12:14:37
+			-6:00	US	C%sT	1951
+			-6:00	Marengo	C%sT	1961 Apr 30 2:00
+			-5:00	-	EST	1969
+			-5:00	US	E%sT	1974 Jan  6 2:00
+			-6:00	1:00	CDT	1974 Oct 27 2:00
+			-5:00	US	E%sT	1976
+			-5:00	-	EST	2006
+			-5:00	US	E%sT
+Rule Vincennes	1946	only	-	Apr	lastSun	2:00	1:00	D
+Rule Vincennes	1946	only	-	Sep	lastSun	2:00	0	S
+Rule Vincennes	1953	1954	-	Apr	lastSun	2:00	1:00	D
+Rule Vincennes	1953	1959	-	Sep	lastSun	2:00	0	S
+Rule Vincennes	1955	only	-	May	 1	0:00	1:00	D
+Rule Vincennes	1956	1963	-	Apr	lastSun	2:00	1:00	D
+Rule Vincennes	1960	only	-	Oct	lastSun	2:00	0	S
+Rule Vincennes	1961	only	-	Sep	lastSun	2:00	0	S
+Rule Vincennes	1962	1963	-	Oct	lastSun	2:00	0	S
+Zone America/Indiana/Vincennes -5:50:07 - LMT	1883 Nov 18 12:09:53
+			-6:00	US	C%sT	1946
+			-6:00 Vincennes	C%sT	1964 Apr 26 2:00
+			-5:00	-	EST	1969
+			-5:00	US	E%sT	1971
+			-5:00	-	EST	2006 Apr  2 2:00
+			-6:00	US	C%sT	2007 Nov  4 2:00
+			-5:00	US	E%sT
+Rule Perry	1946	only	-	Apr	lastSun	2:00	1:00	D
+Rule Perry	1946	only	-	Sep	lastSun	2:00	0	S
+Rule Perry	1953	1954	-	Apr	lastSun	2:00	1:00	D
+Rule Perry	1953	1959	-	Sep	lastSun	2:00	0	S
+Rule Perry	1955	only	-	May	 1	0:00	1:00	D
+Rule Perry	1956	1963	-	Apr	lastSun	2:00	1:00	D
+Rule Perry	1960	only	-	Oct	lastSun	2:00	0	S
+Rule Perry	1961	only	-	Sep	lastSun	2:00	0	S
+Rule Perry	1962	1963	-	Oct	lastSun	2:00	0	S
+Zone America/Indiana/Tell_City -5:47:03 - LMT	1883 Nov 18 12:12:57
+			-6:00	US	C%sT	1946
+			-6:00 Perry	C%sT	1964 Apr 26 2:00
+			-5:00	-	EST	1969
+			-5:00	US	E%sT	1971
+			-5:00	-	EST	2006 Apr  2 2:00
+			-6:00	US	C%sT
+Rule	Pike	1955	only	-	May	 1	0:00	1:00	D
+Rule	Pike	1955	1960	-	Sep	lastSun	2:00	0	S
+Rule	Pike	1956	1964	-	Apr	lastSun	2:00	1:00	D
+Rule	Pike	1961	1964	-	Oct	lastSun	2:00	0	S
+Zone America/Indiana/Petersburg -5:49:07 - LMT	1883 Nov 18 12:10:53
+			-6:00	US	C%sT	1955
+			-6:00	Pike	C%sT	1965 Apr 25 2:00
+			-5:00	-	EST	1966 Oct 30 2:00
+			-6:00	US	C%sT	1977 Oct 30 2:00
+			-5:00	-	EST	2006 Apr  2 2:00
+			-6:00	US	C%sT	2007 Nov  4 2:00
+			-5:00	US	E%sT
+Rule	Starke	1947	1961	-	Apr	lastSun	2:00	1:00	D
+Rule	Starke	1947	1954	-	Sep	lastSun	2:00	0	S
+Rule	Starke	1955	1956	-	Oct	lastSun	2:00	0	S
+Rule	Starke	1957	1958	-	Sep	lastSun	2:00	0	S
+Rule	Starke	1959	1961	-	Oct	lastSun	2:00	0	S
+Zone America/Indiana/Knox -5:46:30 -	LMT	1883 Nov 18 12:13:30
+			-6:00	US	C%sT	1947
+			-6:00	Starke	C%sT	1962 Apr 29 2:00
+			-5:00	-	EST	1963 Oct 27 2:00
+			-6:00	US	C%sT	1991 Oct 27 2:00
+			-5:00	-	EST	2006 Apr  2 2:00
+			-6:00	US	C%sT
+Rule	Pulaski	1946	1960	-	Apr	lastSun	2:00	1:00	D
+Rule	Pulaski	1946	1954	-	Sep	lastSun	2:00	0	S
+Rule	Pulaski	1955	1956	-	Oct	lastSun	2:00	0	S
+Rule	Pulaski	1957	1960	-	Sep	lastSun	2:00	0	S
+Zone America/Indiana/Winamac -5:46:25 - LMT	1883 Nov 18 12:13:35
+			-6:00	US	C%sT	1946
+			-6:00	Pulaski	C%sT	1961 Apr 30 2:00
+			-5:00	-	EST	1969
+			-5:00	US	E%sT	1971
+			-5:00	-	EST	2006 Apr  2 2:00
+			-6:00	US	C%sT	2007 Mar 11 2:00
+			-5:00	US	E%sT
+Zone America/Indiana/Vevay -5:40:16 -	LMT	1883 Nov 18 12:19:44
+			-6:00	US	C%sT	1954 Apr 25 2:00
+			-5:00	-	EST	1969
+			-5:00	US	E%sT	1973
+			-5:00	-	EST	2006
+			-5:00	US	E%sT
+Rule Louisville	1921	only	-	May	1	2:00	1:00	D
+Rule Louisville	1921	only	-	Sep	1	2:00	0	S
+Rule Louisville	1941	1961	-	Apr	lastSun	2:00	1:00	D
+Rule Louisville	1941	only	-	Sep	lastSun	2:00	0	S
+Rule Louisville	1946	only	-	Jun	2	2:00	0	S
+Rule Louisville	1950	1955	-	Sep	lastSun	2:00	0	S
+Rule Louisville	1956	1960	-	Oct	lastSun	2:00	0	S
+Zone America/Kentucky/Louisville -5:43:02 -	LMT	1883 Nov 18 12:16:58
+			-6:00	US	C%sT	1921
+			-6:00 Louisville C%sT	1942
+			-6:00	US	C%sT	1946
+			-6:00 Louisville C%sT	1961 Jul 23 2:00
+			-5:00	-	EST	1968
+			-5:00	US	E%sT	1974 Jan  6 2:00
+			-6:00	1:00	CDT	1974 Oct 27 2:00
+			-5:00	US	E%sT
+Zone America/Kentucky/Monticello -5:39:24 - LMT	1883 Nov 18 12:20:36
+			-6:00	US	C%sT	1946
+			-6:00	-	CST	1968
+			-6:00	US	C%sT	2000 Oct 29  2:00
+			-5:00	US	E%sT
+Rule	Detroit	1948	only	-	Apr	lastSun	2:00	1:00	D
+Rule	Detroit	1948	only	-	Sep	lastSun	2:00	0	S
+Rule	Detroit	1967	only	-	Jun	14	2:00	1:00	D
+Rule	Detroit	1967	only	-	Oct	lastSun	2:00	0	S
+Zone America/Detroit	-5:32:11 -	LMT	1905
+			-6:00	-	CST	1915 May 15 2:00
+			-5:00	-	EST	1942
+			-5:00	US	E%sT	1946
+			-5:00	Detroit	E%sT	1973
+			-5:00	US	E%sT	1975
+			-5:00	-	EST	1975 Apr 27 2:00
+			-5:00	US	E%sT
+Rule Menominee	1946	only	-	Apr	lastSun	2:00	1:00	D
+Rule Menominee	1946	only	-	Sep	lastSun	2:00	0	S
+Rule Menominee	1966	only	-	Apr	lastSun	2:00	1:00	D
+Rule Menominee	1966	only	-	Oct	lastSun	2:00	0	S
+Zone America/Menominee	-5:50:27 -	LMT	1885 Sep 18 12:00
+			-6:00	US	C%sT	1946
+			-6:00 Menominee	C%sT	1969 Apr 27 2:00
+			-5:00	-	EST	1973 Apr 29 2:00
+			-6:00	US	C%sT
+Rule	Canada	1918	only	-	Apr	14	2:00	1:00	D
+Rule	Canada	1918	only	-	Oct	31	2:00	0	S
+Rule	Canada	1942	only	-	Feb	 9	2:00	1:00	W # War
+Rule	Canada	1945	only	-	Aug	14	23:00u	1:00	P # Peace
+Rule	Canada	1945	only	-	Sep	30	2:00	0	S
+Rule	Canada	1974	1986	-	Apr	lastSun	2:00	1:00	D
+Rule	Canada	1974	2006	-	Oct	lastSun	2:00	0	S
+Rule	Canada	1987	2006	-	Apr	Sun>=1	2:00	1:00	D
+Rule	Canada	2007	max	-	Mar	Sun>=8	2:00	1:00	D
+Rule	Canada	2007	max	-	Nov	Sun>=1	2:00	0	S
+Rule	StJohns	1917	only	-	Apr	 8	2:00	1:00	D
+Rule	StJohns	1917	only	-	Sep	17	2:00	0	S
+Rule	StJohns	1919	only	-	May	 5	23:00	1:00	D
+Rule	StJohns	1919	only	-	Aug	12	23:00	0	S
+Rule	StJohns	1920	1935	-	May	Sun>=1	23:00	1:00	D
+Rule	StJohns	1920	1935	-	Oct	lastSun	23:00	0	S
+Rule	StJohns	1936	1941	-	May	Mon>=9	0:00	1:00	D
+Rule	StJohns	1936	1941	-	Oct	Mon>=2	0:00	0	S
+Rule	StJohns	1946	1950	-	May	Sun>=8	2:00	1:00	D
+Rule	StJohns	1946	1950	-	Oct	Sun>=2	2:00	0	S
+Rule	StJohns	1951	1986	-	Apr	lastSun	2:00	1:00	D
+Rule	StJohns	1951	1959	-	Sep	lastSun	2:00	0	S
+Rule	StJohns	1960	1986	-	Oct	lastSun	2:00	0	S
+Rule	StJohns	1987	only	-	Apr	Sun>=1	0:01	1:00	D
+Rule	StJohns	1987	2006	-	Oct	lastSun	0:01	0	S
+Rule	StJohns	1988	only	-	Apr	Sun>=1	0:01	2:00	DD
+Rule	StJohns	1989	2006	-	Apr	Sun>=1	0:01	1:00	D
+Rule	StJohns	2007	max	-	Mar	Sun>=8	0:01	1:00	D
+Rule	StJohns	2007	max	-	Nov	Sun>=1	0:01	0	S
+Zone America/St_Johns	-3:30:52 -	LMT	1884
+			-3:30:52 StJohns N%sT	1918
+			-3:30:52 Canada	N%sT	1919
+			-3:30:52 StJohns N%sT	1935 Mar 30
+			-3:30	StJohns	N%sT	1942 May 11
+			-3:30	Canada	N%sT	1946
+			-3:30	StJohns	N%sT
+Zone America/Goose_Bay	-4:01:40 -	LMT	1884 # Happy Valley-Goose Bay
+			-3:30:52 -	NST	1918
+			-3:30:52 Canada N%sT	1919
+			-3:30:52 -	NST	1935 Mar 30
+			-3:30	-	NST	1936
+			-3:30	StJohns	N%sT	1942 May 11
+			-3:30	Canada	N%sT	1946
+			-3:30	StJohns	N%sT	1966 Mar 15 2:00
+			-4:00	StJohns	A%sT
+Rule	Halifax	1916	only	-	Apr	 1	0:00	1:00	D
+Rule	Halifax	1916	only	-	Oct	 1	0:00	0	S
+Rule	Halifax	1920	only	-	May	 9	0:00	1:00	D
+Rule	Halifax	1920	only	-	Aug	29	0:00	0	S
+Rule	Halifax	1921	only	-	May	 6	0:00	1:00	D
+Rule	Halifax	1921	1922	-	Sep	 5	0:00	0	S
+Rule	Halifax	1922	only	-	Apr	30	0:00	1:00	D
+Rule	Halifax	1923	1925	-	May	Sun>=1	0:00	1:00	D
+Rule	Halifax	1923	only	-	Sep	 4	0:00	0	S
+Rule	Halifax	1924	only	-	Sep	15	0:00	0	S
+Rule	Halifax	1925	only	-	Sep	28	0:00	0	S
+Rule	Halifax	1926	only	-	May	16	0:00	1:00	D
+Rule	Halifax	1926	only	-	Sep	13	0:00	0	S
+Rule	Halifax	1927	only	-	May	 1	0:00	1:00	D
+Rule	Halifax	1927	only	-	Sep	26	0:00	0	S
+Rule	Halifax	1928	1931	-	May	Sun>=8	0:00	1:00	D
+Rule	Halifax	1928	only	-	Sep	 9	0:00	0	S
+Rule	Halifax	1929	only	-	Sep	 3	0:00	0	S
+Rule	Halifax	1930	only	-	Sep	15	0:00	0	S
+Rule	Halifax	1931	1932	-	Sep	Mon>=24	0:00	0	S
+Rule	Halifax	1932	only	-	May	 1	0:00	1:00	D
+Rule	Halifax	1933	only	-	Apr	30	0:00	1:00	D
+Rule	Halifax	1933	only	-	Oct	 2	0:00	0	S
+Rule	Halifax	1934	only	-	May	20	0:00	1:00	D
+Rule	Halifax	1934	only	-	Sep	16	0:00	0	S
+Rule	Halifax	1935	only	-	Jun	 2	0:00	1:00	D
+Rule	Halifax	1935	only	-	Sep	30	0:00	0	S
+Rule	Halifax	1936	only	-	Jun	 1	0:00	1:00	D
+Rule	Halifax	1936	only	-	Sep	14	0:00	0	S
+Rule	Halifax	1937	1938	-	May	Sun>=1	0:00	1:00	D
+Rule	Halifax	1937	1941	-	Sep	Mon>=24	0:00	0	S
+Rule	Halifax	1939	only	-	May	28	0:00	1:00	D
+Rule	Halifax	1940	1941	-	May	Sun>=1	0:00	1:00	D
+Rule	Halifax	1946	1949	-	Apr	lastSun	2:00	1:00	D
+Rule	Halifax	1946	1949	-	Sep	lastSun	2:00	0	S
+Rule	Halifax	1951	1954	-	Apr	lastSun	2:00	1:00	D
+Rule	Halifax	1951	1954	-	Sep	lastSun	2:00	0	S
+Rule	Halifax	1956	1959	-	Apr	lastSun	2:00	1:00	D
+Rule	Halifax	1956	1959	-	Sep	lastSun	2:00	0	S
+Rule	Halifax	1962	1973	-	Apr	lastSun	2:00	1:00	D
+Rule	Halifax	1962	1973	-	Oct	lastSun	2:00	0	S
+Zone America/Halifax	-4:14:24 -	LMT	1902 Jun 15
+			-4:00	Halifax	A%sT	1918
+			-4:00	Canada	A%sT	1919
+			-4:00	Halifax	A%sT	1942 Feb  9 2:00s
+			-4:00	Canada	A%sT	1946
+			-4:00	Halifax	A%sT	1974
+			-4:00	Canada	A%sT
+Zone America/Glace_Bay	-3:59:48 -	LMT	1902 Jun 15
+			-4:00	Canada	A%sT	1953
+			-4:00	Halifax	A%sT	1954
+			-4:00	-	AST	1972
+			-4:00	Halifax	A%sT	1974
+			-4:00	Canada	A%sT
+Rule	Moncton	1933	1935	-	Jun	Sun>=8	1:00	1:00	D
+Rule	Moncton	1933	1935	-	Sep	Sun>=8	1:00	0	S
+Rule	Moncton	1936	1938	-	Jun	Sun>=1	1:00	1:00	D
+Rule	Moncton	1936	1938	-	Sep	Sun>=1	1:00	0	S
+Rule	Moncton	1939	only	-	May	27	1:00	1:00	D
+Rule	Moncton	1939	1941	-	Sep	Sat>=21	1:00	0	S
+Rule	Moncton	1940	only	-	May	19	1:00	1:00	D
+Rule	Moncton	1941	only	-	May	 4	1:00	1:00	D
+Rule	Moncton	1946	1972	-	Apr	lastSun	2:00	1:00	D
+Rule	Moncton	1946	1956	-	Sep	lastSun	2:00	0	S
+Rule	Moncton	1957	1972	-	Oct	lastSun	2:00	0	S
+Rule	Moncton	1993	2006	-	Apr	Sun>=1	0:01	1:00	D
+Rule	Moncton	1993	2006	-	Oct	lastSun	0:01	0	S
+Zone America/Moncton	-4:19:08 -	LMT	1883 Dec  9
+			-5:00	-	EST	1902 Jun 15
+			-4:00	Canada	A%sT	1933
+			-4:00	Moncton	A%sT	1942
+			-4:00	Canada	A%sT	1946
+			-4:00	Moncton	A%sT	1973
+			-4:00	Canada	A%sT	1993
+			-4:00	Moncton	A%sT	2007
+			-4:00	Canada	A%sT
+Rule	Mont	1917	only	-	Mar	25	2:00	1:00	D
+Rule	Mont	1917	only	-	Apr	24	0:00	0	S
+Rule	Mont	1919	only	-	Mar	31	2:30	1:00	D
+Rule	Mont	1919	only	-	Oct	25	2:30	0	S
+Rule	Mont	1920	only	-	May	 2	2:30	1:00	D
+Rule	Mont	1920	1922	-	Oct	Sun>=1	2:30	0	S
+Rule	Mont	1921	only	-	May	 1	2:00	1:00	D
+Rule	Mont	1922	only	-	Apr	30	2:00	1:00	D
+Rule	Mont	1924	only	-	May	17	2:00	1:00	D
+Rule	Mont	1924	1926	-	Sep	lastSun	2:30	0	S
+Rule	Mont	1925	1926	-	May	Sun>=1	2:00	1:00	D
+Rule	Mont	1927	only	-	May	1	0:00	1:00	D
+Rule	Mont	1927	1932	-	Sep	lastSun	0:00	0	S
+Rule	Mont	1928	1931	-	Apr	lastSun	0:00	1:00	D
+Rule	Mont	1932	only	-	May	1	0:00	1:00	D
+Rule	Mont	1933	1940	-	Apr	lastSun	0:00	1:00	D
+Rule	Mont	1933	only	-	Oct	1	0:00	0	S
+Rule	Mont	1934	1939	-	Sep	lastSun	0:00	0	S
+Rule	Mont	1946	1973	-	Apr	lastSun	2:00	1:00	D
+Rule	Mont	1945	1948	-	Sep	lastSun	2:00	0	S
+Rule	Mont	1949	1950	-	Oct	lastSun	2:00	0	S
+Rule	Mont	1951	1956	-	Sep	lastSun	2:00	0	S
+Rule	Mont	1957	1973	-	Oct	lastSun	2:00	0	S
+Zone America/Blanc-Sablon -3:48:28 -	LMT	1884
+			-4:00	Canada	A%sT	1970
+			-4:00	-	AST
+Zone America/Montreal	-4:54:16 -	LMT	1884
+			-5:00	Mont	E%sT	1918
+			-5:00	Canada	E%sT	1919
+			-5:00	Mont	E%sT	1942 Feb  9 2:00s
+			-5:00	Canada	E%sT	1946
+			-5:00	Mont	E%sT	1974
+			-5:00	Canada	E%sT
+Rule	Toronto	1919	only	-	Mar	30	23:30	1:00	D
+Rule	Toronto	1919	only	-	Oct	26	0:00	0	S
+Rule	Toronto	1920	only	-	May	 2	2:00	1:00	D
+Rule	Toronto	1920	only	-	Sep	26	0:00	0	S
+Rule	Toronto	1921	only	-	May	15	2:00	1:00	D
+Rule	Toronto	1921	only	-	Sep	15	2:00	0	S
+Rule	Toronto	1922	1923	-	May	Sun>=8	2:00	1:00	D
+Rule	Toronto	1922	1926	-	Sep	Sun>=15	2:00	0	S
+Rule	Toronto	1924	1927	-	May	Sun>=1	2:00	1:00	D
+Rule	Toronto	1927	1932	-	Sep	lastSun	2:00	0	S
+Rule	Toronto	1928	1931	-	Apr	lastSun	2:00	1:00	D
+Rule	Toronto	1932	only	-	May	1	2:00	1:00	D
+Rule	Toronto	1933	1940	-	Apr	lastSun	2:00	1:00	D
+Rule	Toronto	1933	only	-	Oct	1	2:00	0	S
+Rule	Toronto	1934	1939	-	Sep	lastSun	2:00	0	S
+Rule	Toronto	1945	1946	-	Sep	lastSun	2:00	0	S
+Rule	Toronto	1946	only	-	Apr	lastSun	2:00	1:00	D
+Rule	Toronto	1947	1949	-	Apr	lastSun	0:00	1:00	D
+Rule	Toronto	1947	1948	-	Sep	lastSun	0:00	0	S
+Rule	Toronto	1949	only	-	Nov	lastSun	0:00	0	S
+Rule	Toronto	1950	1973	-	Apr	lastSun	2:00	1:00	D
+Rule	Toronto	1950	only	-	Nov	lastSun	2:00	0	S
+Rule	Toronto	1951	1956	-	Sep	lastSun	2:00	0	S
+Rule	Toronto	1957	1973	-	Oct	lastSun	2:00	0	S
+Zone America/Toronto	-5:17:32 -	LMT	1895
+			-5:00	Canada	E%sT	1919
+			-5:00	Toronto	E%sT	1942 Feb  9 2:00s
+			-5:00	Canada	E%sT	1946
+			-5:00	Toronto	E%sT	1974
+			-5:00	Canada	E%sT
+Zone America/Thunder_Bay -5:57:00 -	LMT	1895
+			-6:00	-	CST	1910
+			-5:00	-	EST	1942
+			-5:00	Canada	E%sT	1970
+			-5:00	Mont	E%sT	1973
+			-5:00	-	EST	1974
+			-5:00	Canada	E%sT
+Zone America/Nipigon	-5:53:04 -	LMT	1895
+			-5:00	Canada	E%sT	1940 Sep 29
+			-5:00	1:00	EDT	1942 Feb  9 2:00s
+			-5:00	Canada	E%sT
+Zone America/Rainy_River -6:18:16 -	LMT	1895
+			-6:00	Canada	C%sT	1940 Sep 29
+			-6:00	1:00	CDT	1942 Feb  9 2:00s
+			-6:00	Canada	C%sT
+Zone America/Atikokan	-6:06:28 -	LMT	1895
+			-6:00	Canada	C%sT	1940 Sep 29
+			-6:00	1:00	CDT	1942 Feb  9 2:00s
+			-6:00	Canada	C%sT	1945 Sep 30 2:00
+			-5:00	-	EST
+Rule	Winn	1916	only	-	Apr	23	0:00	1:00	D
+Rule	Winn	1916	only	-	Sep	17	0:00	0	S
+Rule	Winn	1918	only	-	Apr	14	2:00	1:00	D
+Rule	Winn	1918	only	-	Oct	31	2:00	0	S
+Rule	Winn	1937	only	-	May	16	2:00	1:00	D
+Rule	Winn	1937	only	-	Sep	26	2:00	0	S
+Rule	Winn	1942	only	-	Feb	 9	2:00	1:00	W # War
+Rule	Winn	1945	only	-	Aug	14	23:00u	1:00	P # Peace
+Rule	Winn	1945	only	-	Sep	lastSun	2:00	0	S
+Rule	Winn	1946	only	-	May	12	2:00	1:00	D
+Rule	Winn	1946	only	-	Oct	13	2:00	0	S
+Rule	Winn	1947	1949	-	Apr	lastSun	2:00	1:00	D
+Rule	Winn	1947	1949	-	Sep	lastSun	2:00	0	S
+Rule	Winn	1950	only	-	May	 1	2:00	1:00	D
+Rule	Winn	1950	only	-	Sep	30	2:00	0	S
+Rule	Winn	1951	1960	-	Apr	lastSun	2:00	1:00	D
+Rule	Winn	1951	1958	-	Sep	lastSun	2:00	0	S
+Rule	Winn	1959	only	-	Oct	lastSun	2:00	0	S
+Rule	Winn	1960	only	-	Sep	lastSun	2:00	0	S
+Rule	Winn	1963	only	-	Apr	lastSun	2:00	1:00	D
+Rule	Winn	1963	only	-	Sep	22	2:00	0	S
+Rule	Winn	1966	1986	-	Apr	lastSun	2:00s	1:00	D
+Rule	Winn	1966	2005	-	Oct	lastSun	2:00s	0	S
+Rule	Winn	1987	2005	-	Apr	Sun>=1	2:00s	1:00	D
+Zone America/Winnipeg	-6:28:36 -	LMT	1887 Jul 16
+			-6:00	Winn	C%sT	2006
+			-6:00	Canada	C%sT
+Rule	Regina	1918	only	-	Apr	14	2:00	1:00	D
+Rule	Regina	1918	only	-	Oct	31	2:00	0	S
+Rule	Regina	1930	1934	-	May	Sun>=1	0:00	1:00	D
+Rule	Regina	1930	1934	-	Oct	Sun>=1	0:00	0	S
+Rule	Regina	1937	1941	-	Apr	Sun>=8	0:00	1:00	D
+Rule	Regina	1937	only	-	Oct	Sun>=8	0:00	0	S
+Rule	Regina	1938	only	-	Oct	Sun>=1	0:00	0	S
+Rule	Regina	1939	1941	-	Oct	Sun>=8	0:00	0	S
+Rule	Regina	1942	only	-	Feb	 9	2:00	1:00	W # War
+Rule	Regina	1945	only	-	Aug	14	23:00u	1:00	P # Peace
+Rule	Regina	1945	only	-	Sep	lastSun	2:00	0	S
+Rule	Regina	1946	only	-	Apr	Sun>=8	2:00	1:00	D
+Rule	Regina	1946	only	-	Oct	Sun>=8	2:00	0	S
+Rule	Regina	1947	1957	-	Apr	lastSun	2:00	1:00	D
+Rule	Regina	1947	1957	-	Sep	lastSun	2:00	0	S
+Rule	Regina	1959	only	-	Apr	lastSun	2:00	1:00	D
+Rule	Regina	1959	only	-	Oct	lastSun	2:00	0	S
+Rule	Swift	1957	only	-	Apr	lastSun	2:00	1:00	D
+Rule	Swift	1957	only	-	Oct	lastSun	2:00	0	S
+Rule	Swift	1959	1961	-	Apr	lastSun	2:00	1:00	D
+Rule	Swift	1959	only	-	Oct	lastSun	2:00	0	S
+Rule	Swift	1960	1961	-	Sep	lastSun	2:00	0	S
+Zone America/Regina	-6:58:36 -	LMT	1905 Sep
+			-7:00	Regina	M%sT	1960 Apr lastSun 2:00
+			-6:00	-	CST
+Zone America/Swift_Current -7:11:20 -	LMT	1905 Sep
+			-7:00	Canada	M%sT	1946 Apr lastSun 2:00
+			-7:00	Regina	M%sT	1950
+			-7:00	Swift	M%sT	1972 Apr lastSun 2:00
+			-6:00	-	CST
+Rule	Edm	1918	1919	-	Apr	Sun>=8	2:00	1:00	D
+Rule	Edm	1918	only	-	Oct	31	2:00	0	S
+Rule	Edm	1919	only	-	May	27	2:00	0	S
+Rule	Edm	1920	1923	-	Apr	lastSun	2:00	1:00	D
+Rule	Edm	1920	only	-	Oct	lastSun	2:00	0	S
+Rule	Edm	1921	1923	-	Sep	lastSun	2:00	0	S
+Rule	Edm	1942	only	-	Feb	 9	2:00	1:00	W # War
+Rule	Edm	1945	only	-	Aug	14	23:00u	1:00	P # Peace
+Rule	Edm	1945	only	-	Sep	lastSun	2:00	0	S
+Rule	Edm	1947	only	-	Apr	lastSun	2:00	1:00	D
+Rule	Edm	1947	only	-	Sep	lastSun	2:00	0	S
+Rule	Edm	1967	only	-	Apr	lastSun	2:00	1:00	D
+Rule	Edm	1967	only	-	Oct	lastSun	2:00	0	S
+Rule	Edm	1969	only	-	Apr	lastSun	2:00	1:00	D
+Rule	Edm	1969	only	-	Oct	lastSun	2:00	0	S
+Rule	Edm	1972	1986	-	Apr	lastSun	2:00	1:00	D
+Rule	Edm	1972	2006	-	Oct	lastSun	2:00	0	S
+Zone America/Edmonton	-7:33:52 -	LMT	1906 Sep
+			-7:00	Edm	M%sT	1987
+			-7:00	Canada	M%sT
+Rule	Vanc	1918	only	-	Apr	14	2:00	1:00	D
+Rule	Vanc	1918	only	-	Oct	31	2:00	0	S
+Rule	Vanc	1942	only	-	Feb	 9	2:00	1:00	W # War
+Rule	Vanc	1945	only	-	Aug	14	23:00u	1:00	P # Peace
+Rule	Vanc	1945	only	-	Sep	30	2:00	0	S
+Rule	Vanc	1946	1986	-	Apr	lastSun	2:00	1:00	D
+Rule	Vanc	1946	only	-	Oct	13	2:00	0	S
+Rule	Vanc	1947	1961	-	Sep	lastSun	2:00	0	S
+Rule	Vanc	1962	2006	-	Oct	lastSun	2:00	0	S
+Zone America/Vancouver	-8:12:28 -	LMT	1884
+			-8:00	Vanc	P%sT	1987
+			-8:00	Canada	P%sT
+Zone America/Dawson_Creek -8:00:56 -	LMT	1884
+			-8:00	Canada	P%sT	1947
+			-8:00	Vanc	P%sT	1972 Aug 30 2:00
+			-7:00	-	MST
+Rule	NT_YK	1918	only	-	Apr	14	2:00	1:00	D
+Rule	NT_YK	1918	only	-	Oct	27	2:00	0	S
+Rule	NT_YK	1919	only	-	May	25	2:00	1:00	D
+Rule	NT_YK	1919	only	-	Nov	 1	0:00	0	S
+Rule	NT_YK	1942	only	-	Feb	 9	2:00	1:00	W # War
+Rule	NT_YK	1945	only	-	Aug	14	23:00u	1:00	P # Peace
+Rule	NT_YK	1945	only	-	Sep	30	2:00	0	S
+Rule	NT_YK	1965	only	-	Apr	lastSun	0:00	2:00	DD
+Rule	NT_YK	1965	only	-	Oct	lastSun	2:00	0	S
+Rule	NT_YK	1980	1986	-	Apr	lastSun	2:00	1:00	D
+Rule	NT_YK	1980	2006	-	Oct	lastSun	2:00	0	S
+Rule	NT_YK	1987	2006	-	Apr	Sun>=1	2:00	1:00	D
+Zone America/Pangnirtung 0	-	zzz	1921 # trading post est.
+			-4:00	NT_YK	A%sT	1995 Apr Sun>=1 2:00
+			-5:00	Canada	E%sT	1999 Oct 31 2:00
+			-6:00	Canada	C%sT	2000 Oct 29 2:00
+			-5:00	Canada	E%sT
+Zone America/Iqaluit	0	-	zzz	1942 Aug # Frobisher Bay est.
+			-5:00	NT_YK	E%sT	1999 Oct 31 2:00
+			-6:00	Canada	C%sT	2000 Oct 29 2:00
+			-5:00	Canada	E%sT
+Rule	Resolute 2006	max	-	Nov	Sun>=1	2:00	0	ES
+Rule	Resolute 2007	max	-	Mar	Sun>=8	2:00	0	CD
+Zone America/Resolute	0	-	zzz	1947 Aug 31 # Resolute founded
+			-6:00	NT_YK	C%sT	2000 Oct 29 2:00
+			-5:00	-	EST	2001 Apr  1 3:00
+			-6:00	Canada	C%sT	2006 Oct 29 2:00
+			-5:00	Resolute	%sT
+Zone America/Rankin_Inlet 0	-	zzz	1957 # Rankin Inlet founded
+			-6:00	NT_YK	C%sT	2000 Oct 29 2:00
+			-5:00	-	EST	2001 Apr  1 3:00
+			-6:00	Canada	C%sT
+Zone America/Cambridge_Bay 0	-	zzz	1920 # trading post est.?
+			-7:00	NT_YK	M%sT	1999 Oct 31 2:00
+			-6:00	Canada	C%sT	2000 Oct 29 2:00
+			-5:00	-	EST	2000 Nov  5 0:00
+			-6:00	-	CST	2001 Apr  1 3:00
+			-7:00	Canada	M%sT
+Zone America/Yellowknife 0	-	zzz	1935 # Yellowknife founded?
+			-7:00	NT_YK	M%sT	1980
+			-7:00	Canada	M%sT
+Zone America/Inuvik	0	-	zzz	1953 # Inuvik founded
+			-8:00	NT_YK	P%sT	1979 Apr lastSun 2:00
+			-7:00	NT_YK	M%sT	1980
+			-7:00	Canada	M%sT
+Zone America/Whitehorse	-9:00:12 -	LMT	1900 Aug 20
+			-9:00	NT_YK	Y%sT	1966 Jul 1 2:00
+			-8:00	NT_YK	P%sT	1980
+			-8:00	Canada	P%sT
+Zone America/Dawson	-9:17:40 -	LMT	1900 Aug 20
+			-9:00	NT_YK	Y%sT	1973 Oct 28 0:00
+			-8:00	NT_YK	P%sT	1980
+			-8:00	Canada	P%sT
+Rule	Mexico	1939	only	-	Feb	5	0:00	1:00	D
+Rule	Mexico	1939	only	-	Jun	25	0:00	0	S
+Rule	Mexico	1940	only	-	Dec	9	0:00	1:00	D
+Rule	Mexico	1941	only	-	Apr	1	0:00	0	S
+Rule	Mexico	1943	only	-	Dec	16	0:00	1:00	W # War
+Rule	Mexico	1944	only	-	May	1	0:00	0	S
+Rule	Mexico	1950	only	-	Feb	12	0:00	1:00	D
+Rule	Mexico	1950	only	-	Jul	30	0:00	0	S
+Rule	Mexico	1996	2000	-	Apr	Sun>=1	2:00	1:00	D
+Rule	Mexico	1996	2000	-	Oct	lastSun	2:00	0	S
+Rule	Mexico	2001	only	-	May	Sun>=1	2:00	1:00	D
+Rule	Mexico	2001	only	-	Sep	lastSun	2:00	0	S
+Rule	Mexico	2002	max	-	Apr	Sun>=1	2:00	1:00	D
+Rule	Mexico	2002	max	-	Oct	lastSun	2:00	0	S
+Zone America/Cancun	-5:47:04 -	LMT	1922 Jan  1  0:12:56
+			-6:00	-	CST	1981 Dec 23
+			-5:00	Mexico	E%sT	1998 Aug  2  2:00
+			-6:00	Mexico	C%sT
+Zone America/Merida	-5:58:28 -	LMT	1922 Jan  1  0:01:32
+			-6:00	-	CST	1981 Dec 23
+			-5:00	-	EST	1982 Dec  2
+			-6:00	Mexico	C%sT
+Zone America/Monterrey	-6:41:16 -	LMT	1921 Dec 31 23:18:44
+			-6:00	-	CST	1988
+			-6:00	US	C%sT	1989
+			-6:00	Mexico	C%sT
+Zone America/Mexico_City -6:36:36 -	LMT	1922 Jan  1  0:23:24
+			-7:00	-	MST	1927 Jun 10 23:00
+			-6:00	-	CST	1930 Nov 15
+			-7:00	-	MST	1931 May  1 23:00
+			-6:00	-	CST	1931 Oct
+			-7:00	-	MST	1932 Apr  1
+			-6:00	Mexico	C%sT	2001 Sep 30 02:00
+			-6:00	-	CST	2002 Feb 20
+			-6:00	Mexico	C%sT
+Zone America/Chihuahua	-7:04:20 -	LMT	1921 Dec 31 23:55:40
+			-7:00	-	MST	1927 Jun 10 23:00
+			-6:00	-	CST	1930 Nov 15
+			-7:00	-	MST	1931 May  1 23:00
+			-6:00	-	CST	1931 Oct
+			-7:00	-	MST	1932 Apr  1
+			-6:00	-	CST	1996
+			-6:00	Mexico	C%sT	1998
+			-6:00	-	CST	1998 Apr Sun>=1 3:00
+			-7:00	Mexico	M%sT
+Zone America/Hermosillo	-7:23:52 -	LMT	1921 Dec 31 23:36:08
+			-7:00	-	MST	1927 Jun 10 23:00
+			-6:00	-	CST	1930 Nov 15
+			-7:00	-	MST	1931 May  1 23:00
+			-6:00	-	CST	1931 Oct
+			-7:00	-	MST	1932 Apr  1
+			-6:00	-	CST	1942 Apr 24
+			-7:00	-	MST	1949 Jan 14
+			-8:00	-	PST	1970
+			-7:00	Mexico	M%sT	1999
+			-7:00	-	MST
+Zone America/Mazatlan	-7:05:40 -	LMT	1921 Dec 31 23:54:20
+			-7:00	-	MST	1927 Jun 10 23:00
+			-6:00	-	CST	1930 Nov 15
+			-7:00	-	MST	1931 May  1 23:00
+			-6:00	-	CST	1931 Oct
+			-7:00	-	MST	1932 Apr  1
+			-6:00	-	CST	1942 Apr 24
+			-7:00	-	MST	1949 Jan 14
+			-8:00	-	PST	1970
+			-7:00	Mexico	M%sT
+Zone America/Tijuana	-7:48:04 -	LMT	1922 Jan  1  0:11:56
+			-7:00	-	MST	1924
+			-8:00	-	PST	1927 Jun 10 23:00
+			-7:00	-	MST	1930 Nov 15
+			-8:00	-	PST	1931 Apr  1
+			-8:00	1:00	PDT	1931 Sep 30
+			-8:00	-	PST	1942 Apr 24
+			-8:00	1:00	PWT	1945 Aug 14 23:00u
+			-8:00	1:00	PPT	1945 Nov 12 # Peace
+			-8:00	-	PST	1948 Apr  5
+			-8:00	1:00	PDT	1949 Jan 14
+			-8:00	-	PST	1954
+			-8:00	CA	P%sT	1961
+			-8:00	-	PST	1976
+			-8:00	US	P%sT	1996
+			-8:00	Mexico	P%sT	2001
+			-8:00	US	P%sT	2002 Feb 20
+			-8:00	Mexico	P%sT
+Zone America/Anguilla	-4:12:16 -	LMT	1912 Mar 2
+			-4:00	-	AST
+Zone	America/Antigua	-4:07:12 -	LMT	1912 Mar 2
+			-5:00	-	EST	1951
+			-4:00	-	AST
+Rule	Bahamas	1964	1975	-	Oct	lastSun	2:00	0	S
+Rule	Bahamas	1964	1975	-	Apr	lastSun	2:00	1:00	D
+Zone	America/Nassau	-5:09:24 -	LMT	1912 Mar 2
+			-5:00	Bahamas	E%sT	1976
+			-5:00	US	E%sT
+Rule	Barb	1977	only	-	Jun	12	2:00	1:00	D
+Rule	Barb	1977	1978	-	Oct	Sun>=1	2:00	0	S
+Rule	Barb	1978	1980	-	Apr	Sun>=15	2:00	1:00	D
+Rule	Barb	1979	only	-	Sep	30	2:00	0	S
+Rule	Barb	1980	only	-	Sep	25	2:00	0	S
+Zone America/Barbados	-3:58:28 -	LMT	1924		# Bridgetown
+			-3:58:28 -	BMT	1932	  # Bridgetown Mean Time
+			-4:00	Barb	A%sT
+Rule	Belize	1918	1942	-	Oct	Sun>=2	0:00	0:30	HD
+Rule	Belize	1919	1943	-	Feb	Sun>=9	0:00	0	S
+Rule	Belize	1973	only	-	Dec	 5	0:00	1:00	D
+Rule	Belize	1974	only	-	Feb	 9	0:00	0	S
+Rule	Belize	1982	only	-	Dec	18	0:00	1:00	D
+Rule	Belize	1983	only	-	Feb	12	0:00	0	S
+Zone	America/Belize	-5:52:48 -	LMT	1912 Apr
+			-6:00	Belize	C%sT
+Zone Atlantic/Bermuda	-4:19:04 -	LMT	1930 Jan  1 2:00    # Hamilton
+			-4:00	-	AST	1974 Apr 28 2:00
+			-4:00	Bahamas	A%sT	1976
+			-4:00	US	A%sT
+Zone	America/Cayman	-5:25:32 -	LMT	1890		# Georgetown
+			-5:07:12 -	KMT	1912 Feb    # Kingston Mean Time
+			-5:00	-	EST
+Rule	CR	1979	1980	-	Feb	lastSun	0:00	1:00	D
+Rule	CR	1979	1980	-	Jun	Sun>=1	0:00	0	S
+Rule	CR	1991	1992	-	Jan	Sat>=15	0:00	1:00	D
+Rule	CR	1991	only	-	Jul	 1	0:00	0	S
+Rule	CR	1992	only	-	Mar	15	0:00	0	S
+Zone America/Costa_Rica	-5:36:20 -	LMT	1890		# San Jose
+			-5:36:20 -	SJMT	1921 Jan 15 # San Jose Mean Time
+			-6:00	CR	C%sT
+Rule	Cuba	1928	only	-	Jun	10	0:00	1:00	D
+Rule	Cuba	1928	only	-	Oct	10	0:00	0	S
+Rule	Cuba	1940	1942	-	Jun	Sun>=1	0:00	1:00	D
+Rule	Cuba	1940	1942	-	Sep	Sun>=1	0:00	0	S
+Rule	Cuba	1945	1946	-	Jun	Sun>=1	0:00	1:00	D
+Rule	Cuba	1945	1946	-	Sep	Sun>=1	0:00	0	S
+Rule	Cuba	1965	only	-	Jun	1	0:00	1:00	D
+Rule	Cuba	1965	only	-	Sep	30	0:00	0	S
+Rule	Cuba	1966	only	-	May	29	0:00	1:00	D
+Rule	Cuba	1966	only	-	Oct	2	0:00	0	S
+Rule	Cuba	1967	only	-	Apr	8	0:00	1:00	D
+Rule	Cuba	1967	1968	-	Sep	Sun>=8	0:00	0	S
+Rule	Cuba	1968	only	-	Apr	14	0:00	1:00	D
+Rule	Cuba	1969	1977	-	Apr	lastSun	0:00	1:00	D
+Rule	Cuba	1969	1971	-	Oct	lastSun	0:00	0	S
+Rule	Cuba	1972	1974	-	Oct	8	0:00	0	S
+Rule	Cuba	1975	1977	-	Oct	lastSun	0:00	0	S
+Rule	Cuba	1978	only	-	May	7	0:00	1:00	D
+Rule	Cuba	1978	1990	-	Oct	Sun>=8	0:00	0	S
+Rule	Cuba	1979	1980	-	Mar	Sun>=15	0:00	1:00	D
+Rule	Cuba	1981	1985	-	May	Sun>=5	0:00	1:00	D
+Rule	Cuba	1986	1989	-	Mar	Sun>=14	0:00	1:00	D
+Rule	Cuba	1990	1997	-	Apr	Sun>=1	0:00	1:00	D
+Rule	Cuba	1991	1995	-	Oct	Sun>=8	0:00s	0	S
+Rule	Cuba	1996	only	-	Oct	 6	0:00s	0	S
+Rule	Cuba	1997	only	-	Oct	12	0:00s	0	S
+Rule	Cuba	1998	1999	-	Mar	lastSun	0:00s	1:00	D
+Rule	Cuba	1998	2003	-	Oct	lastSun	0:00s	0	S
+Rule	Cuba	2000	2004	-	Apr	Sun>=1	0:00s	1:00	D
+Rule	Cuba	2006	max	-	Oct	lastSun	0:00s	0	S
+Rule	Cuba	2007	only	-	Mar	Sun>=8	0:00s	1:00	D
+Rule	Cuba	2008	only	-	Mar	Sun>=15	0:00s	1:00	D
+Rule	Cuba	2009	max	-	Mar	Sun>=8	0:00s	1:00	D
+Zone	America/Havana	-5:29:28 -	LMT	1890
+			-5:29:36 -	HMT	1925 Jul 19 12:00 # Havana MT
+			-5:00	Cuba	C%sT
+Zone America/Dominica	-4:05:36 -	LMT	1911 Jul 1 0:01		# Roseau
+			-4:00	-	AST
+Rule	DR	1966	only	-	Oct	30	0:00	1:00	D
+Rule	DR	1967	only	-	Feb	28	0:00	0	S
+Rule	DR	1969	1973	-	Oct	lastSun	0:00	0:30	HD
+Rule	DR	1970	only	-	Feb	21	0:00	0	S
+Rule	DR	1971	only	-	Jan	20	0:00	0	S
+Rule	DR	1972	1974	-	Jan	21	0:00	0	S
+Zone America/Santo_Domingo -4:39:36 -	LMT	1890
+			-4:40	-	SDMT	1933 Apr  1 12:00 # S. Dom. MT
+			-5:00	DR	E%sT	1974 Oct 27
+			-4:00	-	AST	2000 Oct 29 02:00
+			-5:00	US	E%sT	2000 Dec  3 01:00
+			-4:00	-	AST
+Rule	Salv	1987	1988	-	May	Sun>=1	0:00	1:00	D
+Rule	Salv	1987	1988	-	Sep	lastSun	0:00	0	S
+Zone America/El_Salvador -5:56:48 -	LMT	1921		# San Salvador
+			-6:00	Salv	C%sT
+Zone	America/Grenada	-4:07:00 -	LMT	1911 Jul	# St George's
+			-4:00	-	AST
+Zone America/Guadeloupe	-4:06:08 -	LMT	1911 Jun 8	# Pointe a Pitre
+			-4:00	-	AST
+Link America/Guadeloupe	America/St_Barthelemy
+Link America/Guadeloupe	America/Marigot
+Rule	Guat	1973	only	-	Nov	25	0:00	1:00	D
+Rule	Guat	1974	only	-	Feb	24	0:00	0	S
+Rule	Guat	1983	only	-	May	21	0:00	1:00	D
+Rule	Guat	1983	only	-	Sep	22	0:00	0	S
+Rule	Guat	1991	only	-	Mar	23	0:00	1:00	D
+Rule	Guat	1991	only	-	Sep	 7	0:00	0	S
+Rule	Guat	2006	only	-	Apr	30	0:00	1:00	D
+Rule	Guat	2006	only	-	Oct	 1	0:00	0	S
+Zone America/Guatemala	-6:02:04 -	LMT	1918 Oct 5
+			-6:00	Guat	C%sT
+Rule	Haiti	1983	only	-	May	8	0:00	1:00	D
+Rule	Haiti	1984	1987	-	Apr	lastSun	0:00	1:00	D
+Rule	Haiti	1983	1987	-	Oct	lastSun	0:00	0	S
+Rule	Haiti	1988	1997	-	Apr	Sun>=1	1:00s	1:00	D
+Rule	Haiti	1988	1997	-	Oct	lastSun	1:00s	0	S
+Rule	Haiti	2005	2006	-	Apr	Sun>=1	0:00	1:00	D
+Rule	Haiti	2005	2006	-	Oct	lastSun	0:00	0	S
+Zone America/Port-au-Prince -4:49:20 -	LMT	1890
+			-4:49	-	PPMT	1917 Jan 24 12:00 # P-a-P MT
+			-5:00	Haiti	E%sT
+Rule	Hond	1987	1988	-	May	Sun>=1	0:00	1:00	D
+Rule	Hond	1987	1988	-	Sep	lastSun	0:00	0	S
+Rule	Hond	2006	only	-	May	Sun>=1	0:00	1:00	D
+Rule	Hond	2006	only	-	Aug	Mon>=1	0:00	0	S
+Zone America/Tegucigalpa -5:48:52 -	LMT	1921 Apr
+			-6:00	Hond	C%sT
+Zone	America/Jamaica	-5:07:12 -	LMT	1890		# Kingston
+			-5:07:12 -	KMT	1912 Feb    # Kingston Mean Time
+			-5:00	-	EST	1974 Apr 28 2:00
+			-5:00	US	E%sT	1984
+			-5:00	-	EST
+Zone America/Martinique	-4:04:20 -      LMT	1890		# Fort-de-France
+			-4:04:20 -	FFMT	1911 May     # Fort-de-France MT
+			-4:00	-	AST	1980 Apr  6
+			-4:00	1:00	ADT	1980 Sep 28
+			-4:00	-	AST
+Zone America/Montserrat	-4:08:52 -	LMT	1911 Jul 1 0:01   # Cork Hill
+			-4:00	-	AST
+Rule	Nic	1979	1980	-	Mar	Sun>=16	0:00	1:00	D
+Rule	Nic	1979	1980	-	Jun	Mon>=23	0:00	0	S
+Rule	Nic	2005	only	-	Apr	10	0:00	1:00	D
+Rule	Nic	2005	only	-	Oct	Sun>=1	0:00	0	S
+Rule	Nic	2006	only	-	Apr	30	2:00	1:00	D
+Rule	Nic	2006	only	-	Oct	Sun>=1	1:00	0	S
+Zone	America/Managua	-5:45:08 -	LMT	1890
+			-5:45:12 -	MMT	1934 Jun 23 # Managua Mean Time?
+			-6:00	-	CST	1973 May
+			-5:00	-	EST	1975 Feb 16
+			-6:00	Nic	C%sT	1992 Jan  1 4:00
+			-5:00	-	EST	1992 Sep 24
+			-6:00	-	CST	1993
+			-5:00	-	EST	1997
+			-6:00	Nic	C%sT
+Zone	America/Panama	-5:18:08 -	LMT	1890
+			-5:19:36 -	CMT	1908 Apr 22   # Colon Mean Time
+			-5:00	-	EST
+Zone America/Puerto_Rico -4:24:25 -	LMT	1899 Mar 28 12:00    # San Juan
+			-4:00	-	AST	1942 May  3
+			-4:00	US	A%sT	1946
+			-4:00	-	AST
+Zone America/St_Kitts	-4:10:52 -	LMT	1912 Mar 2	# Basseterre
+			-4:00	-	AST
+Zone America/St_Lucia	-4:04:00 -	LMT	1890		# Castries
+			-4:04:00 -	CMT	1912	    # Castries Mean Time
+			-4:00	-	AST
+Zone America/Miquelon	-3:44:40 -	LMT	1911 May 15	# St Pierre
+			-4:00	-	AST	1980 May
+			-3:00	-	PMST	1987 # Pierre & Miquelon Time
+			-3:00	Canada	PM%sT
+Zone America/St_Vincent	-4:04:56 -	LMT	1890		# Kingstown
+			-4:04:56 -	KMT	1912	   # Kingstown Mean Time
+			-4:00	-	AST
+Rule	TC	1979	1986	-	Apr	lastSun	2:00	1:00	D
+Rule	TC	1979	2006	-	Oct	lastSun	2:00	0	S
+Rule	TC	1987	2006	-	Apr	Sun>=1	2:00	1:00	D
+Rule	TC	2007	max	-	Mar	Sun>=8	2:00	1:00	D
+Rule	TC	2007	max	-	Nov	Sun>=1	2:00	0	S
+Zone America/Grand_Turk	-4:44:32 -	LMT	1890
+			-5:07:12 -	KMT	1912 Feb    # Kingston Mean Time
+			-5:00	TC	E%sT
+Zone America/Tortola	-4:18:28 -	LMT	1911 Jul    # Road Town
+			-4:00	-	AST
+Zone America/St_Thomas	-4:19:44 -	LMT	1911 Jul    # Charlotte Amalie
+			-4:00	-	AST
diff --git a/dojox/date/zoneinfo/pacificnew b/dojox/date/zoneinfo/pacificnew
new file mode 100644
index 0000000..5a2988f
--- /dev/null
+++ b/dojox/date/zoneinfo/pacificnew
@@ -0,0 +1 @@
+Link	America/Los_Angeles	US/Pacific-New	##
diff --git a/dojox/date/zoneinfo/southamerica b/dojox/date/zoneinfo/southamerica
new file mode 100644
index 0000000..c0db4af
--- /dev/null
+++ b/dojox/date/zoneinfo/southamerica
@@ -0,0 +1,501 @@
+Rule	Arg	1930	only	-	Dec	 1	0:00	1:00	S
+Rule	Arg	1931	only	-	Apr	 1	0:00	0	-
+Rule	Arg	1931	only	-	Oct	15	0:00	1:00	S
+Rule	Arg	1932	1940	-	Mar	 1	0:00	0	-
+Rule	Arg	1932	1939	-	Nov	 1	0:00	1:00	S
+Rule	Arg	1940	only	-	Jul	 1	0:00	1:00	S
+Rule	Arg	1941	only	-	Jun	15	0:00	0	-
+Rule	Arg	1941	only	-	Oct	15	0:00	1:00	S
+Rule	Arg	1943	only	-	Aug	 1	0:00	0	-
+Rule	Arg	1943	only	-	Oct	15	0:00	1:00	S
+Rule	Arg	1946	only	-	Mar	 1	0:00	0	-
+Rule	Arg	1946	only	-	Oct	 1	0:00	1:00	S
+Rule	Arg	1963	only	-	Oct	 1	0:00	0	-
+Rule	Arg	1963	only	-	Dec	15	0:00	1:00	S
+Rule	Arg	1964	1966	-	Mar	 1	0:00	0	-
+Rule	Arg	1964	1966	-	Oct	15	0:00	1:00	S
+Rule	Arg	1967	only	-	Apr	 2	0:00	0	-
+Rule	Arg	1967	1968	-	Oct	Sun>=1	0:00	1:00	S
+Rule	Arg	1968	1969	-	Apr	Sun>=1	0:00	0	-
+Rule	Arg	1974	only	-	Jan	23	0:00	1:00	S
+Rule	Arg	1974	only	-	May	 1	0:00	0	-
+Rule	Arg	1988	only	-	Dec	 1	0:00	1:00	S
+Rule	Arg	1989	1993	-	Mar	Sun>=1	0:00	0	-
+Rule	Arg	1989	1992	-	Oct	Sun>=15	0:00	1:00	S
+Rule	Arg	1999	only	-	Oct	Sun>=1	0:00	1:00	S
+Rule	Arg	2000	only	-	Mar	3	0:00	0	-
+Rule	Arg	2007	only	-	Dec	30	0:00	1:00	S
+Rule	Arg	2008	max	-	Mar	Sun>=15	0:00	0	-
+Rule	Arg	2008	max	-	Oct	Sun>=15	0:00	1:00	S
+ 
+Zone America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 Oct 31
+			-4:16:48 -	CMT	1920 May # Cordoba Mean Time
+			-4:00	-	ART	1930 Dec
+			-4:00	Arg	AR%sT	1969 Oct  5
+			-3:00	Arg	AR%sT	1999 Oct  3
+			-4:00	Arg	AR%sT	2000 Mar  3
+			-3:00	Arg	AR%sT
+Zone America/Argentina/Cordoba -4:16:48 - LMT	1894 Oct 31
+			-4:16:48 -	CMT	1920 May
+			-4:00	-	ART	1930 Dec
+			-4:00	Arg	AR%sT	1969 Oct  5
+			-3:00	Arg	AR%sT	1991 Mar  3
+			-4:00	-	WART	1991 Oct 20
+			-3:00	Arg	AR%sT	1999 Oct  3
+			-4:00	Arg	AR%sT	2000 Mar  3
+			-3:00	Arg	AR%sT
+Zone America/Argentina/Salta -4:21:40 - LMT	1894 Oct 31
+			-4:16:48 -	CMT	1920 May
+			-4:00	-	ART	1930 Dec
+			-4:00	Arg	AR%sT	1969 Oct  5
+			-3:00	Arg	AR%sT	1991 Mar  3
+			-4:00	-	WART	1991 Oct 20
+			-3:00	Arg	AR%sT	1999 Oct  3
+			-4:00	Arg	AR%sT	2000 Mar  3
+			-3:00	Arg	AR%sT	2008 Oct 18
+			-3:00	-	ART
+Zone America/Argentina/Tucuman -4:20:52 - LMT	1894 Oct 31
+			-4:16:48 -	CMT	1920 May
+			-4:00	-	ART	1930 Dec
+			-4:00	Arg	AR%sT	1969 Oct  5
+			-3:00	Arg	AR%sT	1991 Mar  3
+			-4:00	-	WART	1991 Oct 20
+			-3:00	Arg	AR%sT	1999 Oct  3
+			-4:00	Arg	AR%sT	2000 Mar  3
+			-3:00	-	ART	2004 Jun  1
+			-4:00	-	WART	2004 Jun 13
+			-3:00	Arg	AR%sT
+Zone America/Argentina/La_Rioja -4:27:24 - LMT	1894 Oct 31
+			-4:16:48 -	CMT	1920 May
+			-4:00	-	ART	1930 Dec
+			-4:00	Arg	AR%sT	1969 Oct  5
+			-3:00	Arg	AR%sT	1991 Mar  1
+			-4:00	-	WART	1991 May  7
+			-3:00	Arg	AR%sT	1999 Oct  3
+			-4:00	Arg	AR%sT	2000 Mar  3
+			-3:00	-	ART	2004 Jun  1
+			-4:00	-	WART	2004 Jun 20
+			-3:00	Arg	AR%sT	2008 Oct 18
+			-3:00	-	ART
+Zone America/Argentina/San_Juan -4:34:04 - LMT	1894 Oct 31
+			-4:16:48 -	CMT	1920 May
+			-4:00	-	ART	1930 Dec
+			-4:00	Arg	AR%sT	1969 Oct  5
+			-3:00	Arg	AR%sT	1991 Mar  1
+			-4:00	-	WART	1991 May  7
+			-3:00	Arg	AR%sT	1999 Oct  3
+			-4:00	Arg	AR%sT	2000 Mar  3
+			-3:00	-	ART	2004 May 31
+			-4:00	-	WART	2004 Jul 25
+			-3:00	Arg	AR%sT	2008 Oct 18
+			-3:00	-	ART
+Zone America/Argentina/Jujuy -4:21:12 -	LMT	1894 Oct 31
+			-4:16:48 -	CMT	1920 May
+			-4:00	-	ART	1930 Dec
+			-4:00	Arg	AR%sT	1969 Oct  5
+			-3:00	Arg	AR%sT	1990 Mar  4
+			-4:00	-	WART	1990 Oct 28
+			-4:00	1:00	WARST	1991 Mar 17
+			-4:00	-	WART	1991 Oct  6
+			-3:00	1:00	ARST	1992
+			-3:00	Arg	AR%sT	1999 Oct  3
+			-4:00	Arg	AR%sT	2000 Mar  3
+			-3:00	Arg	AR%sT	2008 Oct 18
+			-3:00	-	ART
+Zone America/Argentina/Catamarca -4:23:08 - LMT	1894 Oct 31
+			-4:16:48 -	CMT	1920 May
+			-4:00	-	ART	1930 Dec
+			-4:00	Arg	AR%sT	1969 Oct  5
+			-3:00	Arg	AR%sT	1991 Mar  3
+			-4:00	-	WART	1991 Oct 20
+			-3:00	Arg	AR%sT	1999 Oct  3
+			-4:00	Arg	AR%sT	2000 Mar  3
+			-3:00	-	ART	2004 Jun  1
+			-4:00	-	WART	2004 Jun 20
+			-3:00	Arg	AR%sT	2008 Oct 18
+			-3:00	-	ART
+Zone America/Argentina/Mendoza -4:35:16 - LMT	1894 Oct 31
+			-4:16:48 -	CMT	1920 May
+			-4:00	-	ART	1930 Dec
+			-4:00	Arg	AR%sT	1969 Oct  5
+			-3:00	Arg	AR%sT	1990 Mar  4
+			-4:00	-	WART	1990 Oct 15
+			-4:00	1:00	WARST	1991 Mar  1
+			-4:00	-	WART	1991 Oct 15
+			-4:00	1:00	WARST	1992 Mar  1
+			-4:00	-	WART	1992 Oct 18
+			-3:00	Arg	AR%sT	1999 Oct  3
+			-4:00	Arg	AR%sT	2000 Mar  3
+			-3:00	-	ART	2004 May 23
+			-4:00	-	WART	2004 Sep 26
+			-3:00	Arg	AR%sT	2008 Oct 18
+			-3:00	-	ART
+Zone America/Argentina/San_Luis -4:25:24 - LMT	1894 Oct 31
+			-4:16:48 -	CMT	1920 May
+			-4:00	-	ART	1930 Dec
+			-4:00	Arg	AR%sT	1969 Oct  5
+			-3:00	Arg	AR%sT	1990
+			-3:00	1:00	ARST	1990 Mar 14
+			-4:00	-	WART	1990 Oct 15
+			-4:00	1:00	WARST	1991 Mar  1
+			-4:00	-	WART	1991 Jun  1
+			-3:00	-	ART	1999 Oct  3
+			-4:00	1:00	WARST	2000 Mar  3
+			-3:00	-	ART	2004 May 31
+			-4:00	-	WART	2004 Jul 25
+			-3:00	Arg	AR%sT	2008 Jan 21
+			-3:00	-	ART	2009 Mar 15
+			-4:00	Arg	WAR%sT
+Zone America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 Oct 31
+			-4:16:48 -	CMT	1920 May # Cordoba Mean Time
+			-4:00	-	ART	1930 Dec
+			-4:00	Arg	AR%sT	1969 Oct  5
+			-3:00	Arg	AR%sT	1999 Oct  3
+			-4:00	Arg	AR%sT	2000 Mar  3
+			-3:00	-	ART	2004 Jun  1
+			-4:00	-	WART	2004 Jun 20
+			-3:00	Arg	AR%sT	2008 Oct 18
+			-3:00	-	ART
+Zone America/Argentina/Ushuaia -4:33:12 - LMT 1894 Oct 31
+			-4:16:48 -	CMT	1920 May # Cordoba Mean Time
+			-4:00	-	ART	1930 Dec
+			-4:00	Arg	AR%sT	1969 Oct  5
+			-3:00	Arg	AR%sT	1999 Oct  3
+			-4:00	Arg	AR%sT	2000 Mar  3
+			-3:00	-	ART	2004 May 30
+			-4:00	-	WART	2004 Jun 20
+			-3:00	Arg	AR%sT	2008 Oct 18
+			-3:00	-	ART
+Zone	America/Aruba	-4:40:24 -	LMT	1912 Feb 12	# Oranjestad
+			-4:30	-	ANT	1965 # Netherlands Antilles Time
+			-4:00	-	AST
+Zone	America/La_Paz	-4:32:36 -	LMT	1890
+			-4:32:36 -	CMT	1931 Oct 15 # Calamarca MT
+			-4:32:36 1:00	BOST	1932 Mar 21 # Bolivia ST
+			-4:00	-	BOT	# Bolivia Time
+Rule	Brazil	1931	only	-	Oct	 3	11:00	1:00	S
+Rule	Brazil	1932	1933	-	Apr	 1	 0:00	0	-
+Rule	Brazil	1932	only	-	Oct	 3	 0:00	1:00	S
+Rule	Brazil	1949	1952	-	Dec	 1	 0:00	1:00	S
+Rule	Brazil	1950	only	-	Apr	16	 1:00	0	-
+Rule	Brazil	1951	1952	-	Apr	 1	 0:00	0	-
+Rule	Brazil	1953	only	-	Mar	 1	 0:00	0	-
+Rule	Brazil	1963	only	-	Dec	 9	 0:00	1:00	S
+Rule	Brazil	1964	only	-	Mar	 1	 0:00	0	-
+Rule	Brazil	1965	only	-	Jan	31	 0:00	1:00	S
+Rule	Brazil	1965	only	-	Mar	31	 0:00	0	-
+Rule	Brazil	1965	only	-	Dec	 1	 0:00	1:00	S
+Rule	Brazil	1966	1968	-	Mar	 1	 0:00	0	-
+Rule	Brazil	1966	1967	-	Nov	 1	 0:00	1:00	S
+Rule	Brazil	1985	only	-	Nov	 2	 0:00	1:00	S
+Rule	Brazil	1986	only	-	Mar	15	 0:00	0	-
+Rule	Brazil	1986	only	-	Oct	25	 0:00	1:00	S
+Rule	Brazil	1987	only	-	Feb	14	 0:00	0	-
+Rule	Brazil	1987	only	-	Oct	25	 0:00	1:00	S
+Rule	Brazil	1988	only	-	Feb	 7	 0:00	0	-
+Rule	Brazil	1988	only	-	Oct	16	 0:00	1:00	S
+Rule	Brazil	1989	only	-	Jan	29	 0:00	0	-
+Rule	Brazil	1989	only	-	Oct	15	 0:00	1:00	S
+Rule	Brazil	1990	only	-	Feb	11	 0:00	0	-
+Rule	Brazil	1990	only	-	Oct	21	 0:00	1:00	S
+Rule	Brazil	1991	only	-	Feb	17	 0:00	0	-
+Rule	Brazil	1991	only	-	Oct	20	 0:00	1:00	S
+Rule	Brazil	1992	only	-	Feb	 9	 0:00	0	-
+Rule	Brazil	1992	only	-	Oct	25	 0:00	1:00	S
+Rule	Brazil	1993	only	-	Jan	31	 0:00	0	-
+Rule	Brazil	1993	1995	-	Oct	Sun>=11	 0:00	1:00	S
+Rule	Brazil	1994	1995	-	Feb	Sun>=15	 0:00	0	-
+Rule	Brazil	1996	only	-	Feb	11	 0:00	0	-
+Rule	Brazil	1996	only	-	Oct	 6	 0:00	1:00	S
+Rule	Brazil	1997	only	-	Feb	16	 0:00	0	-
+Rule	Brazil	1997	only	-	Oct	 6	 0:00	1:00	S
+Rule	Brazil	1998	only	-	Mar	 1	 0:00	0	-
+Rule	Brazil	1998	only	-	Oct	11	 0:00	1:00	S
+Rule	Brazil	1999	only	-	Feb	21	 0:00	0	-
+Rule	Brazil	1999	only	-	Oct	 3	 0:00	1:00	S
+Rule	Brazil	2000	only	-	Feb	27	 0:00	0	-
+Rule	Brazil	2000	2001	-	Oct	Sun>=8	 0:00	1:00	S
+Rule	Brazil	2001	2006	-	Feb	Sun>=15	 0:00	0	-
+Rule	Brazil	2002	only	-	Nov	 3	 0:00	1:00	S
+Rule	Brazil	2003	only	-	Oct	19	 0:00	1:00	S
+Rule	Brazil	2004	only	-	Nov	 2	 0:00	1:00	S
+Rule	Brazil	2005	only	-	Oct	16	 0:00	1:00	S
+Rule	Brazil	2006	only	-	Nov	 5	 0:00	1:00	S
+Rule	Brazil	2007	only	-	Feb	25	 0:00	0	-
+Rule	Brazil	2007	only	-	Oct	Sun>=8	 0:00	1:00	S
+Rule	Brazil	2008	max	-	Oct	Sun>=15	0:00	1:00	S
+Rule	Brazil	2008	2011	-	Feb	Sun>=15	0:00	0	-
+Rule	Brazil	2012	only	-	Feb	Sun>=22	0:00	0	-
+Rule	Brazil	2013	2014	-	Feb	Sun>=15	0:00	0	-
+Rule	Brazil	2015	only	-	Feb	Sun>=22	0:00	0	-
+Rule	Brazil	2016	2022	-	Feb	Sun>=15	0:00	0	-
+Rule	Brazil	2023	only	-	Feb	Sun>=22	0:00	0	-
+Rule	Brazil	2024	2025	-	Feb	Sun>=15	0:00	0	-
+Rule	Brazil	2026	only	-	Feb	Sun>=22	0:00	0	-
+Rule	Brazil	2027	2033	-	Feb	Sun>=15	0:00	0	-
+Rule	Brazil	2034	only	-	Feb	Sun>=22	0:00	0	-
+Rule	Brazil	2035	2036	-	Feb	Sun>=15	0:00	0	-
+Rule	Brazil	2037	only	-	Feb	Sun>=22	0:00	0	-
+Rule	Brazil	2038	max	-	Feb	Sun>=15	0:00	0	-
+Zone America/Noronha	-2:09:40 -	LMT	1914
+			-2:00	Brazil	FN%sT	1990 Sep 17
+			-2:00	-	FNT	1999 Sep 30
+			-2:00	Brazil	FN%sT	2000 Oct 15
+			-2:00	-	FNT	2001 Sep 13
+			-2:00	Brazil	FN%sT	2002 Oct  1
+			-2:00	-	FNT
+Zone America/Belem	-3:13:56 -	LMT	1914
+			-3:00	Brazil	BR%sT	1988 Sep 12
+			-3:00	-	BRT
+Zone America/Santarem	-3:38:48 -	LMT	1914
+			-4:00	Brazil	AM%sT	1988 Sep 12
+			-4:00	-	AMT	2008 Jun 24 00:00
+			-3:00	-	BRT
+Zone America/Fortaleza	-2:34:00 -	LMT	1914
+			-3:00	Brazil	BR%sT	1990 Sep 17
+			-3:00	-	BRT	1999 Sep 30
+			-3:00	Brazil	BR%sT	2000 Oct 22
+			-3:00	-	BRT	2001 Sep 13
+			-3:00	Brazil	BR%sT	2002 Oct  1
+			-3:00	-	BRT
+Zone America/Recife	-2:19:36 -	LMT	1914
+			-3:00	Brazil	BR%sT	1990 Sep 17
+			-3:00	-	BRT	1999 Sep 30
+			-3:00	Brazil	BR%sT	2000 Oct 15
+			-3:00	-	BRT	2001 Sep 13
+			-3:00	Brazil	BR%sT	2002 Oct  1
+			-3:00	-	BRT
+Zone America/Araguaina	-3:12:48 -	LMT	1914
+			-3:00	Brazil	BR%sT	1990 Sep 17
+			-3:00	-	BRT	1995 Sep 14
+			-3:00	Brazil	BR%sT	2003 Sep 24
+			-3:00	-	BRT
+Zone America/Maceio	-2:22:52 -	LMT	1914
+			-3:00	Brazil	BR%sT	1990 Sep 17
+			-3:00	-	BRT	1995 Oct 13
+			-3:00	Brazil	BR%sT	1996 Sep  4
+			-3:00	-	BRT	1999 Sep 30
+			-3:00	Brazil	BR%sT	2000 Oct 22
+			-3:00	-	BRT	2001 Sep 13
+			-3:00	Brazil	BR%sT	2002 Oct  1
+			-3:00	-	BRT
+Zone America/Bahia	-2:34:04 -	LMT	1914
+			-3:00	Brazil	BR%sT	2003 Sep 24
+			-3:00	-	BRT
+Zone America/Sao_Paulo	-3:06:28 -	LMT	1914
+			-3:00	Brazil	BR%sT	1963 Oct 23 00:00
+			-3:00	1:00	BRST	1964
+			-3:00	Brazil	BR%sT
+Zone America/Campo_Grande -3:38:28 -	LMT	1914
+			-4:00	Brazil	AM%sT
+Zone America/Cuiaba	-3:44:20 -	LMT	1914
+			-4:00	Brazil	AM%sT	2003 Sep 24
+			-4:00	-	AMT	2004 Oct  1
+			-4:00	Brazil	AM%sT
+Zone America/Porto_Velho -4:15:36 -	LMT	1914
+			-4:00	Brazil	AM%sT	1988 Sep 12
+			-4:00	-	AMT
+Zone America/Boa_Vista	-4:02:40 -	LMT	1914
+			-4:00	Brazil	AM%sT	1988 Sep 12
+			-4:00	-	AMT	1999 Sep 30
+			-4:00	Brazil	AM%sT	2000 Oct 15
+			-4:00	-	AMT
+Zone America/Manaus	-4:00:04 -	LMT	1914
+			-4:00	Brazil	AM%sT	1988 Sep 12
+			-4:00	-	AMT	1993 Sep 28
+			-4:00	Brazil	AM%sT	1994 Sep 22
+			-4:00	-	AMT
+Zone America/Eirunepe	-4:39:28 -	LMT	1914
+			-5:00	Brazil	AC%sT	1988 Sep 12
+			-5:00	-	ACT	1993 Sep 28
+			-5:00	Brazil	AC%sT	1994 Sep 22
+			-5:00	-	ACT	2008 Jun 24 00:00
+			-4:00	-	AMT
+Zone America/Rio_Branco	-4:31:12 -	LMT	1914
+			-5:00	Brazil	AC%sT	1988 Sep 12
+			-5:00	-	ACT	2008 Jun 24 00:00
+			-4:00	-	AMT
+Rule	Chile	1927	1932	-	Sep	 1	0:00	1:00	S
+Rule	Chile	1928	1932	-	Apr	 1	0:00	0	-
+Rule	Chile	1942	only	-	Jun	 1	4:00u	0	-
+Rule	Chile	1942	only	-	Aug	 1	5:00u	1:00	S
+Rule	Chile	1946	only	-	Jul	15	4:00u	1:00	S
+Rule	Chile	1946	only	-	Sep	 1	3:00u	0:00	-
+Rule	Chile	1947	only	-	Apr	 1	4:00u	0	-
+Rule	Chile	1968	only	-	Nov	 3	4:00u	1:00	S
+Rule	Chile	1969	only	-	Mar	30	3:00u	0	-
+Rule	Chile	1969	only	-	Nov	23	4:00u	1:00	S
+Rule	Chile	1970	only	-	Mar	29	3:00u	0	-
+Rule	Chile	1971	only	-	Mar	14	3:00u	0	-
+Rule	Chile	1970	1972	-	Oct	Sun>=9	4:00u	1:00	S
+Rule	Chile	1972	1986	-	Mar	Sun>=9	3:00u	0	-
+Rule	Chile	1973	only	-	Sep	30	4:00u	1:00	S
+Rule	Chile	1974	1987	-	Oct	Sun>=9	4:00u	1:00	S
+Rule	Chile	1987	only	-	Apr	12	3:00u	0	-
+Rule	Chile	1988	1989	-	Mar	Sun>=9	3:00u	0	-
+Rule	Chile	1988	only	-	Oct	Sun>=1	4:00u	1:00	S
+Rule	Chile	1989	only	-	Oct	Sun>=9	4:00u	1:00	S
+Rule	Chile	1990	only	-	Mar	18	3:00u	0	-
+Rule	Chile	1990	only	-	Sep	16	4:00u	1:00	S
+Rule	Chile	1991	1996	-	Mar	Sun>=9	3:00u	0	-
+Rule	Chile	1991	1997	-	Oct	Sun>=9	4:00u	1:00	S
+Rule	Chile	1997	only	-	Mar	30	3:00u	0	-
+Rule	Chile	1998	only	-	Mar	Sun>=9	3:00u	0	-
+Rule	Chile	1998	only	-	Sep	27	4:00u	1:00	S
+Rule	Chile	1999	only	-	Apr	 4	3:00u	0	-
+Rule	Chile	1999	max	-	Oct	Sun>=9	4:00u	1:00	S
+Rule	Chile	2000	2007	-	Mar	Sun>=9	3:00u	0	-
+Rule	Chile	2008	only	-	Mar	30	3:00u	0	-
+Rule	Chile	2009	max	-	Mar	Sun>=9	3:00u	0	-
+Zone America/Santiago	-4:42:46 -	LMT	1890
+			-4:42:46 -	SMT	1910 	    # Santiago Mean Time
+			-5:00	-	CLT	1916 Jul  1 # Chile Time
+			-4:42:46 -	SMT	1918 Sep  1 # Santiago Mean Time
+			-4:00	-	CLT	1919 Jul  1 # Chile Time
+			-4:42:46 -	SMT	1927 Sep  1 # Santiago Mean Time
+			-5:00	Chile	CL%sT	1947 May 22 # Chile Time
+			-4:00	Chile	CL%sT
+Zone Pacific/Easter	-7:17:44 -	LMT	1890
+			-7:17:28 -	EMT	1932 Sep    # Easter Mean Time
+			-7:00	Chile	EAS%sT	1982 Mar 13 21:00 # Easter I Time
+			-6:00	Chile	EAS%sT
+Rule	CO	1992	only	-	May	 3	0:00	1:00	S
+Rule	CO	1993	only	-	Apr	 4	0:00	0	-
+Zone	America/Bogota	-4:56:20 -	LMT	1884 Mar 13
+			-4:56:20 -	BMT	1914 Nov 23 # Bogota Mean Time
+			-5:00	CO	CO%sT	# Colombia Time
+Zone	America/Curacao	-4:35:44 -	LMT	1912 Feb 12	# Willemstad
+			-4:30	-	ANT	1965 # Netherlands Antilles Time
+			-4:00	-	AST
+Zone America/Guayaquil	-5:19:20 -	LMT	1890
+			-5:14:00 -	QMT	1931 # Quito Mean Time
+			-5:00	-	ECT	     # Ecuador Time
+Zone Pacific/Galapagos	-5:58:24 -	LMT	1931 # Puerto Baquerizo Moreno
+			-5:00	-	ECT	1986
+			-6:00	-	GALT	     # Galapagos Time
+Rule	Falk	1937	1938	-	Sep	lastSun	0:00	1:00	S
+Rule	Falk	1938	1942	-	Mar	Sun>=19	0:00	0	-
+Rule	Falk	1939	only	-	Oct	1	0:00	1:00	S
+Rule	Falk	1940	1942	-	Sep	lastSun	0:00	1:00	S
+Rule	Falk	1943	only	-	Jan	1	0:00	0	-
+Rule	Falk	1983	only	-	Sep	lastSun	0:00	1:00	S
+Rule	Falk	1984	1985	-	Apr	lastSun	0:00	0	-
+Rule	Falk	1984	only	-	Sep	16	0:00	1:00	S
+Rule	Falk	1985	2000	-	Sep	Sun>=9	0:00	1:00	S
+Rule	Falk	1986	2000	-	Apr	Sun>=16	0:00	0	-
+Rule	Falk	2001	max	-	Apr	Sun>=15	2:00	0	-
+Rule	Falk	2001	max	-	Sep	Sun>=1	2:00	1:00	S
+Zone Atlantic/Stanley	-3:51:24 -	LMT	1890
+			-3:51:24 -	SMT	1912 Mar 12  # Stanley Mean Time
+			-4:00	Falk	FK%sT	1983 May     # Falkland Is Time
+			-3:00	Falk	FK%sT	1985 Sep 15
+			-4:00	Falk	FK%sT
+Zone America/Cayenne	-3:29:20 -	LMT	1911 Jul
+			-4:00	-	GFT	1967 Oct # French Guiana Time
+			-3:00	-	GFT
+Zone	America/Guyana	-3:52:40 -	LMT	1915 Mar	# Georgetown
+			-3:45	-	GBGT	1966 May 26 # Br Guiana Time
+			-3:45	-	GYT	1975 Jul 31 # Guyana Time
+			-3:00	-	GYT	1991
+			-4:00	-	GYT
+Rule	Para	1975	1988	-	Oct	 1	0:00	1:00	S
+Rule	Para	1975	1978	-	Mar	 1	0:00	0	-
+Rule	Para	1979	1991	-	Apr	 1	0:00	0	-
+Rule	Para	1989	only	-	Oct	22	0:00	1:00	S
+Rule	Para	1990	only	-	Oct	 1	0:00	1:00	S
+Rule	Para	1991	only	-	Oct	 6	0:00	1:00	S
+Rule	Para	1992	only	-	Mar	 1	0:00	0	-
+Rule	Para	1992	only	-	Oct	 5	0:00	1:00	S
+Rule	Para	1993	only	-	Mar	31	0:00	0	-
+Rule	Para	1993	1995	-	Oct	 1	0:00	1:00	S
+Rule	Para	1994	1995	-	Feb	lastSun	0:00	0	-
+Rule	Para	1996	only	-	Mar	 1	0:00	0	-
+Rule	Para	1996	2001	-	Oct	Sun>=1	0:00	1:00	S
+Rule	Para	1997	only	-	Feb	lastSun	0:00	0	-
+Rule	Para	1998	2001	-	Mar	Sun>=1	0:00	0	-
+Rule	Para	2002	2004	-	Apr	Sun>=1	0:00	0	-
+Rule	Para	2002	2003	-	Sep	Sun>=1	0:00	1:00	S
+Rule	Para	2004	max	-	Oct	Sun>=15	0:00	1:00	S
+Rule	Para	2005	max	-	Mar	Sun>=8	0:00	0	-
+Zone America/Asuncion	-3:50:40 -	LMT	1890
+			-3:50:40 -	AMT	1931 Oct 10 # Asuncion Mean Time
+			-4:00	-	PYT	1972 Oct # Paraguay Time
+			-3:00	-	PYT	1974 Apr
+			-4:00	Para	PY%sT
+Rule	Peru	1938	only	-	Jan	 1	0:00	1:00	S
+Rule	Peru	1938	only	-	Apr	 1	0:00	0	-
+Rule	Peru	1938	1939	-	Sep	lastSun	0:00	1:00	S
+Rule	Peru	1939	1940	-	Mar	Sun>=24	0:00	0	-
+Rule	Peru	1986	1987	-	Jan	 1	0:00	1:00	S
+Rule	Peru	1986	1987	-	Apr	 1	0:00	0	-
+Rule	Peru	1990	only	-	Jan	 1	0:00	1:00	S
+Rule	Peru	1990	only	-	Apr	 1	0:00	0	-
+Rule	Peru	1994	only	-	Jan	 1	0:00	1:00	S
+Rule	Peru	1994	only	-	Apr	 1	0:00	0	-
+Zone	America/Lima	-5:08:12 -	LMT	1890
+			-5:08:36 -	LMT	1908 Jul 28 # Lima Mean Time?
+			-5:00	Peru	PE%sT	# Peru Time
+Zone Atlantic/South_Georgia -2:26:08 -	LMT	1890		# Grytviken
+			-2:00	-	GST	# South Georgia Time
+Zone America/Paramaribo	-3:40:40 -	LMT	1911
+			-3:40:52 -	PMT	1935     # Paramaribo Mean Time
+			-3:40:36 -	PMT	1945 Oct # The capital moved?
+			-3:30	-	NEGT	1975 Nov 20 # Dutch Guiana Time
+			-3:30	-	SRT	1984 Oct # Suriname Time
+			-3:00	-	SRT
+Zone America/Port_of_Spain -4:06:04 -	LMT	1912 Mar 2
+			-4:00	-	AST
+Rule	Uruguay	1923	only	-	Oct	 2	 0:00	0:30	HS
+Rule	Uruguay	1924	1926	-	Apr	 1	 0:00	0	-
+Rule	Uruguay	1924	1925	-	Oct	 1	 0:00	0:30	HS
+Rule	Uruguay	1933	1935	-	Oct	lastSun	 0:00	0:30	HS
+Rule	Uruguay	1934	1936	-	Mar	Sat>=25	23:30s	0	-
+Rule	Uruguay	1936	only	-	Nov	 1	 0:00	0:30	HS
+Rule	Uruguay	1937	1941	-	Mar	lastSun	 0:00	0	-
+Rule	Uruguay	1937	1940	-	Oct	lastSun	 0:00	0:30	HS
+Rule	Uruguay	1941	only	-	Aug	 1	 0:00	0:30	HS
+Rule	Uruguay	1942	only	-	Jan	 1	 0:00	0	-
+Rule	Uruguay	1942	only	-	Dec	14	 0:00	1:00	S
+Rule	Uruguay	1943	only	-	Mar	14	 0:00	0	-
+Rule	Uruguay	1959	only	-	May	24	 0:00	1:00	S
+Rule	Uruguay	1959	only	-	Nov	15	 0:00	0	-
+Rule	Uruguay	1960	only	-	Jan	17	 0:00	1:00	S
+Rule	Uruguay	1960	only	-	Mar	 6	 0:00	0	-
+Rule	Uruguay	1965	1967	-	Apr	Sun>=1	 0:00	1:00	S
+Rule	Uruguay	1965	only	-	Sep	26	 0:00	0	-
+Rule	Uruguay	1966	1967	-	Oct	31	 0:00	0	-
+Rule	Uruguay	1968	1970	-	May	27	 0:00	0:30	HS
+Rule	Uruguay	1968	1970	-	Dec	 2	 0:00	0	-
+Rule	Uruguay	1972	only	-	Apr	24	 0:00	1:00	S
+Rule	Uruguay	1972	only	-	Aug	15	 0:00	0	-
+Rule	Uruguay	1974	only	-	Mar	10	 0:00	0:30	HS
+Rule	Uruguay	1974	only	-	Dec	22	 0:00	1:00	S
+Rule	Uruguay	1976	only	-	Oct	 1	 0:00	0	-
+Rule	Uruguay	1977	only	-	Dec	 4	 0:00	1:00	S
+Rule	Uruguay	1978	only	-	Apr	 1	 0:00	0	-
+Rule	Uruguay	1979	only	-	Oct	 1	 0:00	1:00	S
+Rule	Uruguay	1980	only	-	May	 1	 0:00	0	-
+Rule	Uruguay	1987	only	-	Dec	14	 0:00	1:00	S
+Rule	Uruguay	1988	only	-	Mar	14	 0:00	0	-
+Rule	Uruguay	1988	only	-	Dec	11	 0:00	1:00	S
+Rule	Uruguay	1989	only	-	Mar	12	 0:00	0	-
+Rule	Uruguay	1989	only	-	Oct	29	 0:00	1:00	S
+Rule	Uruguay	1990	1992	-	Mar	Sun>=1	 0:00	0	-
+Rule	Uruguay	1990	1991	-	Oct	Sun>=21	 0:00	1:00	S
+Rule	Uruguay	1992	only	-	Oct	18	 0:00	1:00	S
+Rule	Uruguay	1993	only	-	Feb	28	 0:00	0	-
+Rule	Uruguay	2004	only	-	Sep	19	 0:00	1:00	S
+Rule	Uruguay	2005	only	-	Mar	27	 2:00	0	-
+Rule	Uruguay	2005	only	-	Oct	 9	 2:00	1:00	S
+Rule	Uruguay	2006	only	-	Mar	12	 2:00	0	-
+Rule	Uruguay	2006	max	-	Oct	Sun>=1	 2:00	1:00	S
+Rule	Uruguay	2007	max	-	Mar	Sun>=8	 2:00	0	-
+Zone America/Montevideo	-3:44:44 -	LMT	1898 Jun 28
+			-3:44:44 -	MMT	1920 May  1	# Montevideo MT
+			-3:30	Uruguay	UY%sT	1942 Dec 14	# Uruguay Time
+			-3:00	Uruguay	UY%sT
+Zone	America/Caracas	-4:27:44 -	LMT	1890
+			-4:27:40 -	CMT	1912 Feb 12 # Caracas Mean Time?
+			-4:30	-	VET	1965	     # Venezuela Time
+			-4:00	-	VET	2007 Dec  9 03:00
+			-4:30	-	VET
diff --git a/dojox/drawing.js b/dojox/drawing.js
new file mode 100644
index 0000000..ff263cf
--- /dev/null
+++ b/dojox/drawing.js
@@ -0,0 +1,12 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing"]){
+dojo._hasResource["dojox.drawing"]=true;
+dojo.provide("dojox.drawing");
+dojo.require("dojox.drawing._base");
+}
diff --git a/dojox/drawing/Drawing.js b/dojox/drawing/Drawing.js
new file mode 100644
index 0000000..1ac172e
--- /dev/null
+++ b/dojox/drawing/Drawing.js
@@ -0,0 +1,231 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.Drawing"]){
+dojo._hasResource["dojox.drawing.Drawing"]=true;
+dojo.provide("dojox.drawing.Drawing");
+(function(){
+var _1=false;
+dojo.declare("dojox.drawing.Drawing",[],{ready:false,mode:"",width:0,height:0,constructor:function(_2,_3){
+var _4=dojo.attr(_3,"defaults");
+if(_4){
+dojox.drawing.defaults=dojo.getObject(_4);
+}
+this.defaults=dojox.drawing.defaults;
+this.id=_3.id;
+dojox.drawing.register(this,"drawing");
+this.mode=(_2.mode||dojo.attr(_3,"mode")||"").toLowerCase();
+var _5=dojo.contentBox(_3);
+this.width=_5.w;
+this.height=_5.h;
+this.util=dojox.drawing.util.common;
+this.util.register(this);
+this.keys=dojox.drawing.manager.keys;
+this.mouse=new dojox.drawing.manager.Mouse({util:this.util,keys:this.keys,id:this.mode=="ui"?"MUI":"mse"});
+this.mouse.setEventMode(this.mode);
+this.tools={};
+this.stencilTypes={};
+this.stencilTypeMap={};
+this.srcRefNode=_3;
+this.domNode=_3;
+var _6=dojo.attr(_3,"plugins");
+if(_6){
+this.plugins=eval(_6);
+}else{
+this.plugins=[];
+}
+this.widgetId=this.id;
+dojo.attr(this.domNode,"widgetId",this.widgetId);
+if(dijit&&dijit.registry){
+dijit.registry.add(this);
+}else{
+dijit.registry={objs:{},add:function(_7){
+this.objs[_7.id]=_7;
+}};
+dijit.byId=function(id){
+return dijit.registry.objs[id];
+};
+dijit.registry.add(this);
+}
+var _8=dojox.drawing.getRegistered("stencil");
+for(var nm in _8){
+this.registerTool(_8[nm].name);
+}
+var _9=dojox.drawing.getRegistered("tool");
+for(var nm in _9){
+this.registerTool(_9[nm].name);
+}
+var _a=dojox.drawing.getRegistered("plugin");
+for(var nm in _a){
+this.registerTool(_a[nm].name);
+}
+this._createCanvas();
+},_createCanvas:function(){
+this.canvas=new dojox.drawing.manager.Canvas({srcRefNode:this.domNode,util:this.util,mouse:this.mouse,callback:dojo.hitch(this,"onSurfaceReady")});
+this.initPlugins();
+},resize:function(_b){
+dojo.style(this.domNode,{width:_b.w+"px",height:_b.h+"px"});
+if(!this.canvas){
+this._createCanvas();
+}else{
+this.canvas.resize(_b.w,_b.h);
+}
+},startup:function(){
+},getShapeProps:function(_c,_d){
+return dojo.mixin({container:this.mode=="ui"||_d=="ui"?this.canvas.overlay.createGroup():this.canvas.surface.createGroup(),util:this.util,keys:this.keys,mouse:this.mouse,drawing:this,drawingType:this.mode=="ui"||_d=="ui"?"ui":"stencil",style:this.defaults.copy()},_c||{});
+},addPlugin:function(_e){
+this.plugins.push(_e);
+if(this.canvas.surfaceReady){
+this.initPlugins();
+}
+},initPlugins:function(){
+if(!this.canvas||!this.canvas.surfaceReady){
+var c=dojo.connect(this,"onSurfaceReady",this,function(){
+dojo.disconnect(c);
+this.initPlugins();
+});
+return;
+}
+dojo.forEach(this.plugins,function(p,i){
+var _f=dojo.mixin({util:this.util,keys:this.keys,mouse:this.mouse,drawing:this,stencils:this.stencils,anchors:this.anchors,canvas:this.canvas},p.options||{});
+this.registerTool(p.name,dojo.getObject(p.name));
+try{
+this.plugins[i]=new this.tools[p.name](_f);
+}
+catch(e){
+console.error("Failed to initilaize plugin:\t"+p.name+". Did you require it?");
+}
+},this);
+this.plugins=[];
+_1=true;
+this.mouse.setCanvas();
+},onSurfaceReady:function(){
+this.ready=true;
+this.mouse.init(this.canvas.domNode);
+this.undo=new dojox.drawing.manager.Undo({keys:this.keys});
+this.anchors=new dojox.drawing.manager.Anchors({drawing:this,mouse:this.mouse,undo:this.undo,util:this.util});
+if(this.mode=="ui"){
+this.uiStencils=new dojox.drawing.manager.StencilUI({canvas:this.canvas,surface:this.canvas.surface,mouse:this.mouse,keys:this.keys});
+}else{
+this.stencils=new dojox.drawing.manager.Stencil({canvas:this.canvas,surface:this.canvas.surface,mouse:this.mouse,undo:this.undo,keys:this.keys,anchors:this.anchors});
+this.uiStencils=new dojox.drawing.manager.StencilUI({canvas:this.canvas,surface:this.canvas.surface,mouse:this.mouse,keys:this.keys});
+}
+if(dojox.gfx.renderer=="silverlight"){
+try{
+new dojox.drawing.plugins.drawing.Silverlight({util:this.util,mouse:this.mouse,stencils:this.stencils,anchors:this.anchors,canvas:this.canvas});
+}
+catch(e){
+throw new Error("Attempted to install the Silverlight plugin, but it was not found.");
+}
+}
+dojo.forEach(this.plugins,function(p){
+p.onSurfaceReady&&p.onSurfaceReady();
+});
+},addUI:function(_10,_11){
+if(!this.ready){
+var c=dojo.connect(this,"onSurfaceReady",this,function(){
+dojo.disconnect(c);
+this.addUI(_10,_11);
+});
+return false;
+}
+if(_11&&!_11.data&&!_11.points){
+_11={data:_11};
+}
+if(!this.stencilTypes[_10]){
+if(_10!="tooltip"){
+console.warn("Not registered:",_10);
+}
+return null;
+}
+var s=this.uiStencils.register(new this.stencilTypes[_10](this.getShapeProps(_11,"ui")));
+return s;
+},addStencil:function(_12,_13){
+if(!this.ready){
+var c=dojo.connect(this,"onSurfaceReady",this,function(){
+dojo.disconnect(c);
+this.addStencil(_12,_13);
+});
+return false;
+}
+if(_13&&!_13.data&&!_13.points){
+_13={data:_13};
+}
+var s=this.stencils.register(new this.stencilTypes[_12](this.getShapeProps(_13)));
+this.currentStencil&&this.currentStencil.moveToFront();
+return s;
+},removeStencil:function(_14){
+this.stencils.unregister(_14);
+_14.destroy();
+},removeAll:function(){
+this.stencils.removeAll();
+},selectAll:function(){
+this.stencils.selectAll();
+},toSelected:function(_15){
+this.stencils.toSelected.apply(this.stencils,arguments);
+},exporter:function(){
+return this.stencils.exporter();
+},importer:function(_16){
+dojo.forEach(_16,function(m){
+this.addStencil(m.type,m);
+},this);
+},changeDefaults:function(_17){
+for(var nm in _17){
+for(var n in _17[nm]){
+this.defaults[nm][n]=_17[nm][n];
+}
+}
+this.unSetTool();
+this.setTool(this.currentType);
+},onRenderStencil:function(_18){
+this.stencils.register(_18);
+this.unSetTool();
+this.setTool(this.currentType);
+},onDeleteStencil:function(_19){
+this.stencils.unregister(_19);
+},registerTool:function(_1a){
+if(this.tools[_1a]){
+return;
+}
+var _1b=dojo.getObject(_1a);
+this.tools[_1a]=_1b;
+var _1c=this.util.abbr(_1a);
+this.stencilTypes[_1c]=_1b;
+this.stencilTypeMap[_1c]=_1a;
+},getConstructor:function(_1d){
+return this.stencilTypes[_1d];
+},setTool:function(_1e){
+if(this.mode=="ui"){
+return;
+}
+if(!this.canvas||!this.canvas.surface){
+var c=dojo.connect(this,"onSurfaceReady",this,function(){
+dojo.disconnect(c);
+this.setTool(_1e);
+});
+return;
+}
+if(this.currentStencil){
+this.unSetTool();
+}
+this.currentType=this.tools[_1e]?_1e:this.stencilTypeMap[_1e];
+try{
+this.currentStencil=new this.tools[this.currentType]({container:this.canvas.surface.createGroup(),util:this.util,mouse:this.mouse,keys:this.keys});
+this.currentStencil.connect(this.currentStencil,"onRender",this,"onRenderStencil");
+this.currentStencil.connect(this.currentStencil,"destroy",this,"onDeleteStencil");
+}
+catch(e){
+console.error("dojox.drawing.setTool Error:",e);
+console.error(this.currentType+" is not a constructor: ",this.tools[this.currentType]);
+}
+},unSetTool:function(){
+if(!this.currentStencil.created){
+this.currentStencil.destroy();
+}
+}});
+})();
+}
diff --git a/dojox/drawing/README b/dojox/drawing/README
new file mode 100644
index 0000000..98bda14
--- /dev/null
+++ b/dojox/drawing/README
@@ -0,0 +1,36 @@
+-------------------------------------------------------------------------------
+Drawing
+-------------------------------------------------------------------------------
+Version 0.1
+Release date: August 22, 2009
+-------------------------------------------------------------------------------
+Project state: alpha
+	The code is very well tested with relatively few bugs. But it is also in a
+	state where APIs and methods can still change.
+-------------------------------------------------------------------------------
+Project author
+	Mike Wilcox anm8tr AT yahoo.com
+-------------------------------------------------------------------------------
+Project description
+
+Drawing is a project that sits on top of DojoX GFX and uses SVG and VML vector
+graphics to draw and display.
+-------------------------------------------------------------------------------
+Dependencies:
+
+dojo.gfx
+-------------------------------------------------------------------------------
+Documentation
+
+http://docs.dojocampus.org/dojox/drawing
+-------------------------------------------------------------------------------
+Installation instructions
+
+Grab the following from the Dojo SVN Repository:
+http://svn.dojotoolkit.org/dojo/dojox/trunk/drawing.js
+http://svn.dojotoolkit.org/dojo/dojox/trunk/drawing/*
+
+Install into the following directory structure:
+/dojox/drawing/
+
+...which should be at the same level as your Dojo checkout.
diff --git a/dojox/drawing/_base.js b/dojox/drawing/_base.js
new file mode 100644
index 0000000..eadb557
--- /dev/null
+++ b/dojox/drawing/_base.js
@@ -0,0 +1,36 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing._base"]){
+dojo._hasResource["dojox.drawing._base"]=true;
+dojo.provide("dojox.drawing._base");
+dojo.experimental("dojox.drawing");
+dojo.require("dojox.drawing.manager._registry");
+dojo.require("dojox.gfx");
+dojo.require("dojox.drawing.Drawing");
+dojo.require("dojox.drawing.util.oo");
+dojo.require("dojox.drawing.util.common");
+dojo.require("dojox.drawing.defaults");
+dojo.require("dojox.drawing.manager.Canvas");
+dojo.require("dojox.drawing.manager.Undo");
+dojo.require("dojox.drawing.manager.keys");
+dojo.require("dojox.drawing.manager.Mouse");
+dojo.require("dojox.drawing.manager.Stencil");
+dojo.require("dojox.drawing.manager.StencilUI");
+dojo.require("dojox.drawing.manager.Anchors");
+dojo.require("dojox.drawing.stencil._Base");
+dojo.require("dojox.drawing.stencil.Line");
+dojo.require("dojox.drawing.stencil.Rect");
+dojo.require("dojox.drawing.stencil.Ellipse");
+dojo.require("dojox.drawing.stencil.Path");
+dojo.require("dojox.drawing.stencil.Text");
+dojo.require("dojox.drawing.stencil.Image");
+dojo.require("dojox.drawing.annotations.Label");
+dojo.require("dojox.drawing.annotations.Angle");
+dojo.require("dojox.drawing.annotations.Arrow");
+dojo.require("dojox.drawing.annotations.BoxShadow");
+}
diff --git a/dojox/drawing/annotations/Angle.js b/dojox/drawing/annotations/Angle.js
new file mode 100644
index 0000000..d0ddb56
--- /dev/null
+++ b/dojox/drawing/annotations/Angle.js
@@ -0,0 +1,52 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.annotations.Angle"]){
+dojo._hasResource["dojox.drawing.annotations.Angle"]=true;
+dojo.provide("dojox.drawing.annotations.Angle");
+dojox.drawing.annotations.Angle=dojox.drawing.util.oo.declare(function(_1){
+this.stencil=_1.stencil;
+this.util=_1.stencil.util;
+this.mouse=_1.stencil.mouse;
+this.stencil.connectMult([["onDrag",this,"showAngle"],["onUp",this,"hideAngle"],["onTransformBegin",this,"showAngle"],["onTransform",this,"showAngle"],["onTransformEnd",this,"hideAngle"]]);
+},{type:"dojox.drawing.tools.custom",angle:0,showAngle:function(){
+if(!this.stencil.selected&&this.stencil.created){
+return;
+}
+if(this.stencil.getRadius()<this.stencil.minimumSize){
+this.hideAngle();
+return;
+}
+var _2=this.getAngleNode();
+var d=this.stencil.pointsToData();
+var pt=dojox.drawing.util.positioning.angle({x:d.x1,y:d.y1},{x:d.x2,y:d.y2});
+var sc=this.mouse.scrollOffset();
+var mx=this.stencil.getTransform();
+var dx=mx.dx/this.mouse.zoom;
+var dy=mx.dy/this.mouse.zoom;
+pt.x/=this.mouse.zoom;
+pt.y/=this.mouse.zoom;
+var x=this.stencil._offX+pt.x-sc.left+dx;
+var y=this.stencil._offY+pt.y-sc.top+dy;
+dojo.style(_2,{left:x+"px",top:y+"px",align:pt.align});
+_2.innerHTML=Math.ceil(this.stencil.getAngle());
+},getAngleNode:function(){
+if(!this._angleNode){
+this._angleNode=dojo.create("span",null,dojo.body());
+dojo.addClass(this._angleNode,"textAnnotation");
+dojo.style(this._angleNode,"opacity",1);
+}
+return this._angleNode;
+},hideAngle:function(){
+if(this._angleNode&&dojo.style(this._angleNode,"opacity")>0.9){
+dojo.fadeOut({node:this._angleNode,duration:500,onEnd:function(_3){
+dojo.destroy(_3);
+}}).play();
+this._angleNode=null;
+}
+}});
+}
diff --git a/dojox/drawing/annotations/Arrow.js b/dojox/drawing/annotations/Arrow.js
new file mode 100644
index 0000000..45f9a3a
--- /dev/null
+++ b/dojox/drawing/annotations/Arrow.js
@@ -0,0 +1,36 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.annotations.Arrow"]){
+dojo._hasResource["dojox.drawing.annotations.Arrow"]=true;
+dojo.provide("dojox.drawing.annotations.Arrow");
+dojo.require("dojox.drawing.stencil.Path");
+dojox.drawing.annotations.Arrow=dojox.drawing.util.oo.declare(dojox.drawing.stencil.Path,function(_1){
+this.stencil.connectMult([[this.stencil,"select",this,"select"],[this.stencil,"deselect",this,"deselect"],[this.stencil,"render",this,"render"],[this.stencil,"onDelete",this,"destroy"]]);
+this.connect("onBeforeRender",this,function(){
+var o=this.stencil.points[this.idx1];
+var c=this.stencil.points[this.idx2];
+if(this.stencil.getRadius()>=this.minimumSize){
+this.points=this.arrowHead(c.x,c.y,o.x,o.y,this.style);
+}else{
+this.points=[];
+}
+});
+},{idx1:0,idx2:1,subShape:true,minimumSize:30,arrowHead:function(x1,y1,x2,y2,_2){
+var _3={start:{x:x1,y:y1},x:x2,y:y2};
+var _4=this.util.angle(_3);
+var _5=this.util.length(_3);
+var al=_2.arrows.length;
+var aw=_2.arrows.width/2;
+if(_5<al){
+al=_5/2;
+}
+var p1=this.util.pointOnCircle(x2,y2,-al,_4-aw);
+var p2=this.util.pointOnCircle(x2,y2,-al,_4+aw);
+return [{x:x2,y:y2},p1,p2];
+}});
+}
diff --git a/dojox/drawing/annotations/BoxShadow.js b/dojox/drawing/annotations/BoxShadow.js
new file mode 100644
index 0000000..e9efc21
--- /dev/null
+++ b/dojox/drawing/annotations/BoxShadow.js
@@ -0,0 +1,122 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.annotations.BoxShadow"]){
+dojo._hasResource["dojox.drawing.annotations.BoxShadow"]=true;
+dojo.provide("dojox.drawing.annotations.BoxShadow");
+dojox.drawing.annotations.BoxShadow=dojox.drawing.util.oo.declare(function(_1){
+this.stencil=_1.stencil;
+this.util=_1.stencil.util;
+this.mouse=_1.stencil.mouse;
+this.style=_1.stencil.style;
+var _2={size:6,mult:4,alpha:0.05,place:"BR",color:"#646464"};
+delete _1.stencil;
+this.options=dojo.mixin(_2,_1);
+this.options.color=new dojo.Color(this.options.color);
+this.options.color.a=this.options.alpha;
+switch(this.stencil.shortType){
+case "image":
+case "rect":
+this.method="createForRect";
+break;
+case "ellipse":
+this.method="createForEllipse";
+break;
+case "line":
+this.method="createForLine";
+break;
+case "path":
+this.method="createForPath";
+break;
+default:
+console.warn("A shadow cannot be made for Stencil type ",this.stencil.type);
+}
+if(this.method){
+this.render();
+this.stencil.connectMult([[this.stencil,"onTransform",this,"onTransform"],[this.stencil,"render",this,"onRender"],[this.stencil,"onDelete",this,"destroy"]]);
+}
+},{showing:true,render:function(){
+if(this.container){
+this.container.removeShape();
+}
+this.container=this.stencil.container.createGroup();
+this.container.moveToBack();
+var o=this.options,_3=o.size,_4=o.mult,d=this.method=="createForPath"?this.stencil.points:this.stencil.data,r=d.r||1,p=o.place,c=o.color;
+this[this.method](o,_3,_4,d,r,p,c);
+},hide:function(){
+if(this.showing){
+this.showing=false;
+this.container.removeShape();
+}
+},show:function(){
+if(!this.showing){
+this.showing=true;
+this.stencil.container.add(this.container);
+}
+},createForPath:function(o,_5,_6,_7,r,p,c){
+var sh=_5*_6/4,_8=/B/.test(p)?sh:/T/.test(p)?sh*-1:0,_9=/R/.test(p)?sh:/L/.test(p)?sh*-1:0;
+var _a=true;
+for(var i=1;i<=_5;i++){
+var _b=i*_6;
+if(dojox.gfx.renderer=="svg"){
+var _c=[];
+dojo.forEach(_7,function(o,i){
+if(i==0){
+_c.push("M "+(o.x+_9)+" "+(o.y+_8));
+}else{
+var _d=o.t||"L ";
+_c.push(_d+(o.x+_9)+" "+(o.y+_8));
+}
+},this);
+if(_a){
+_c.push("Z");
+}
+this.container.createPath(_c.join(", ")).setStroke({width:_b,color:c,cap:"round"});
+}else{
+var _e=this.container.createPath({}).setStroke({width:_b,color:c,cap:"round"});
+dojo.forEach(this.points,function(o,i){
+if(i==0||o.t=="M"){
+_e.moveTo(o.x+_9,o.y+_8);
+}else{
+if(o.t=="Z"){
+_a&&_e.closePath();
+}else{
+_e.lineTo(o.x+_9,o.y+_8);
+}
+}
+},this);
+_a&&_e.closePath();
+}
+}
+},createForLine:function(o,_f,_10,d,r,p,c){
+var sh=_f*_10/4,shy=/B/.test(p)?sh:/T/.test(p)?sh*-1:0,shx=/R/.test(p)?sh:/L/.test(p)?sh*-1:0;
+for(var i=1;i<=_f;i++){
+var _11=i*_10;
+this.container.createLine({x1:d.x1+shx,y1:d.y1+shy,x2:d.x2+shx,y2:d.y2+shy}).setStroke({width:_11,color:c,cap:"round"});
+}
+},createForEllipse:function(o,_12,_13,d,r,p,c){
+var sh=_12*_13/8,shy=/B/.test(p)?sh:/T/.test(p)?sh*-1:0,shx=/R/.test(p)?sh*0.8:/L/.test(p)?sh*-0.8:0;
+for(var i=1;i<=_12;i++){
+var _14=i*_13;
+this.container.createEllipse({cx:d.cx+shx,cy:d.cy+shy,rx:d.rx-sh,ry:d.ry-sh,r:r}).setStroke({width:_14,color:c});
+}
+},createForRect:function(o,_15,_16,d,r,p,c){
+var sh=_15*_16/2,shy=/B/.test(p)?sh:/T/.test(p)?0:sh/2,shx=/R/.test(p)?sh:/L/.test(p)?0:sh/2;
+for(var i=1;i<=_15;i++){
+var _17=i*_16;
+this.container.createRect({x:d.x+shx,y:d.y+shy,width:d.width-sh,height:d.height-sh,r:r}).setStroke({width:_17,color:c});
+}
+},onTransform:function(){
+this.render();
+},onRender:function(){
+this.container.moveToBack();
+},destroy:function(){
+if(this.container){
+this.container.removeShape();
+}
+}});
+}
diff --git a/dojox/drawing/annotations/Label.js b/dojox/drawing/annotations/Label.js
new file mode 100644
index 0000000..f2a9fea
--- /dev/null
+++ b/dojox/drawing/annotations/Label.js
@@ -0,0 +1,65 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.annotations.Label"]){
+dojo._hasResource["dojox.drawing.annotations.Label"]=true;
+dojo.provide("dojox.drawing.annotations.Label");
+dojo.require("dojox.drawing.stencil.Text");
+dojox.drawing.annotations.Label=dojox.drawing.util.oo.declare(dojox.drawing.stencil.Text,function(_1){
+this.master=_1.stencil;
+this.labelPosition=_1.labelPosition||"BR";
+if(dojo.isFunction(this.labelPosition)){
+this.setLabel=this.setLabelCustom;
+}
+this.setLabel(_1.text||"");
+this.connect(this.master,"onTransform",this,"setLabel");
+this.connect(this.master,"destroy",this,"destroy");
+if(this.style.labelSameColor){
+this.connect(this.master,"attr",this,"beforeAttr");
+}
+},{_align:"start",setLabelCustom:function(_2){
+var d=dojo.hitch(this.master,this.labelPosition)();
+this.setData({x:d.x,y:d.y,width:d.w||this.style.text.minWidth,height:d.h||this._lineHeight});
+if(_2&&!_2.split){
+_2=null;
+}
+this.render(_2);
+},setLabel:function(_3){
+var x,y,_4=this.master.getBounds();
+if(/B/.test(this.labelPosition)){
+y=_4.y2-this._lineHeight;
+}else{
+y=_4.y1;
+}
+if(/R/.test(this.labelPosition)){
+x=_4.x2;
+}else{
+y=_4.y1;
+this._align="end";
+}
+if(!this.labelWidth||(_3&&_3.split&&_3!=this._text)){
+this.setData({x:x,y:y,height:this._lineHeight,width:this.style.text.minWidth});
+this.labelWidth=this.style.text.minWidth;
+this.render(_3);
+}else{
+this.setData({x:x,y:y,height:this.data.height,width:this.data.width});
+this.render();
+}
+},beforeAttr:function(_5,_6){
+if(_6!==undefined){
+var k=_5;
+_5={};
+_5[k]=_6;
+}
+delete _5.x;
+delete _5.y;
+delete _5.width;
+delete _5.height;
+this.attr(_5);
+!this.created&&this.render();
+}});
+}
diff --git a/dojox/drawing/defaults.js b/dojox/drawing/defaults.js
new file mode 100644
index 0000000..63ed972
--- /dev/null
+++ b/dojox/drawing/defaults.js
@@ -0,0 +1,42 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.defaults"]){
+dojo._hasResource["dojox.drawing.defaults"]=true;
+dojo.provide("dojox.drawing.defaults");
+dojox.drawing.defaults={current:null,currentHit:null,angleSnap:1,renderHitLines:true,renderHitLayer:true,labelSameColor:false,useSelectedStyle:true,norm:{width:1,color:"#000000",style:"Solid",cap:"round",fill:"#CCCCCC"},selected:{width:6,color:"#00FF00"},highlighted:{width:6,color:"#FF00FF",style:"Solid",cap:"round",fill:"#E11EBB"},disabled:{width:1,color:"#666666",style:"solid",cap:"round",fill:"#cccccc"},hitNorm:{width:6,color:{r:0,g:255,b:255,a:0},style:"Solid",cap:"round",fill:{r:255 [...]
+var _1=function(_2){
+if(typeof (_2)!="object"||_2===null||_2===undefined){
+return _2;
+}
+var o;
+if(_2.push){
+o=[];
+for(var i=0;i<_2.length;i++){
+o.push(_1(_2[i]));
+}
+return o;
+}
+o={};
+for(var nm in _2){
+if(nm!="copy"){
+if(typeof (_2[nm])=="object"){
+o[nm]=_1(_2[nm]);
+}else{
+o[nm]=_2[nm];
+}
+}
+}
+return o;
+};
+var o=_1(this);
+o.current=o.norm;
+o.currentHit=o.hitNorm;
+o.currentText=o.text;
+return o;
+}};
+}
diff --git a/dojox/drawing/library/icons.js b/dojox/drawing/library/icons.js
new file mode 100644
index 0000000..3015808
--- /dev/null
+++ b/dojox/drawing/library/icons.js
@@ -0,0 +1,12 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.library.icons"]){
+dojo._hasResource["dojox.drawing.library.icons"]=true;
+dojo.provide("dojox.drawing.library.icons");
+dojox.drawing.library.icons={line:{type:"line",borderWidth:1,x1:20,y1:20,x2:80,y2:80},ellipse:{type:"ellipse",borderWidth:1,cx:50,cy:50,rx:35,ry:20},rect:{type:"rect",borderWidth:1,x:10,y:30,width:80,height:40},triangle:{type:"path",borderWidth:1,closePath:true,points:[{x:50,y:10},{x:10,y:90},{x:90,y:90}]},path:{type:"path",borderWidth:0,closePath:true,points:[{x:20,y:80},{x:26,y:20},{x:80,y:32},{x:32,y:50},{x:56,y:62}]},arrow:{type:"path",borderWidth:1,closePath:false,points:[{x:20,y:20 [...]
+}
diff --git a/dojox/drawing/manager/Anchors.js b/dojox/drawing/manager/Anchors.js
new file mode 100644
index 0000000..6563c53
--- /dev/null
+++ b/dojox/drawing/manager/Anchors.js
@@ -0,0 +1,236 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.manager.Anchors"]){
+dojo._hasResource["dojox.drawing.manager.Anchors"]=true;
+dojo.provide("dojox.drawing.manager.Anchors");
+dojox.drawing.manager.Anchors=dojox.drawing.util.oo.declare(function(_1){
+this.mouse=_1.mouse;
+this.undo=_1.undo;
+this.util=_1.util;
+this.drawing=_1.drawing;
+this.items={};
+},{onAddAnchor:function(_2){
+},onReset:function(_3){
+var st=this.util.byId("drawing").stencils;
+st.onDeselect(_3);
+st.onSelect(_3);
+},onRenderStencil:function(){
+for(var nm in this.items){
+dojo.forEach(this.items[nm].anchors,function(a){
+a.shape.moveToFront();
+});
+}
+},onTransformPoint:function(_4){
+var _5=this.items[_4.stencil.id].anchors;
+var _6=this.items[_4.stencil.id].item;
+var _7=[];
+dojo.forEach(_5,function(a,i){
+if(_4.id==a.id||_4.stencil.anchorType!="group"){
+}else{
+if(_4.org.y==a.org.y){
+a.setPoint({dx:0,dy:_4.shape.getTransform().dy-a.shape.getTransform().dy});
+}else{
+if(_4.org.x==a.org.x){
+a.setPoint({dx:_4.shape.getTransform().dx-a.shape.getTransform().dx,dy:0});
+}
+}
+a.shape.moveToFront();
+}
+var mx=a.shape.getTransform();
+_7.push({x:mx.dx+a.org.x,y:mx.dy+a.org.y});
+if(a.point.t){
+_7[_7.length-1].t=a.point.t;
+}
+},this);
+_6.setPoints(_7);
+_6.onTransform(_4);
+this.onRenderStencil();
+},onAnchorUp:function(_8){
+},onAnchorDown:function(_9){
+},onAnchorDrag:function(_a){
+},onChangeStyle:function(_b){
+for(var nm in this.items){
+dojo.forEach(this.items[nm].anchors,function(a){
+a.shape.moveToFront();
+});
+}
+},add:function(_c){
+this.items[_c.id]={item:_c,anchors:[]};
+if(_c.anchorType=="none"){
+return;
+}
+var _d=_c.points;
+dojo.forEach(_d,function(p,i){
+if(p.noAnchor){
+return;
+}
+if(i==0||i==_c.points.length-1){
+if(i==0){
+}else{
+}
+}
+var a=new dojox.drawing.manager.Anchor({stencil:_c,point:p,pointIdx:i,mouse:this.mouse,util:this.util});
+this.items[_c.id]._cons=[dojo.connect(a,"onRenderStencil",this,"onRenderStencil"),dojo.connect(a,"reset",this,"onReset"),dojo.connect(a,"onAnchorUp",this,"onAnchorUp"),dojo.connect(a,"onAnchorDown",this,"onAnchorDown"),dojo.connect(a,"onAnchorDrag",this,"onAnchorDrag"),dojo.connect(a,"onTransformPoint",this,"onTransformPoint"),dojo.connect(_c,"onChangeStyle",this,"onChangeStyle")];
+this.items[_c.id].anchors.push(a);
+this.onAddAnchor(a);
+},this);
+if(_c.shortType=="path"){
+var f=_d[0],l=_d[_d.length-1],a=this.items[_c.id].anchors;
+if(f.x==l.x&&f.y==l.y){
+console.warn("LINK ANVHROS",a[0],a[a.length-1]);
+a[0].linkedAnchor=a[a.length-1];
+a[a.length-1].linkedAnchor=a[0];
+}
+}
+if(_c.anchorType=="group"){
+dojo.forEach(this.items[_c.id].anchors,function(_e){
+dojo.forEach(this.items[_c.id].anchors,function(a){
+if(_e.id!=a.id){
+if(_e.org.y==a.org.y){
+_e.x_anchor=a;
+}else{
+if(_e.org.x==a.org.x){
+_e.y_anchor=a;
+}
+}
+}
+},this);
+},this);
+}
+},remove:function(_f){
+if(!this.items[_f.id]){
+return;
+}
+dojo.forEach(this.items[_f.id].anchors,function(a){
+a.destroy();
+});
+dojo.forEach(this.items[_f.id]._cons,dojo.disconnect,dojo);
+this.items[_f.id].anchors=null;
+delete this.items[_f.id];
+}});
+dojox.drawing.manager.Anchor=dojox.drawing.util.oo.declare(function(_10){
+this.defaults=dojox.drawing.defaults.copy();
+this.mouse=_10.mouse;
+this.point=_10.point;
+this.pointIdx=_10.pointIdx;
+this.util=_10.util;
+this.id=_10.id||this.util.uid("anchor");
+this.org=dojo.mixin({},this.point);
+this.stencil=_10.stencil;
+if(this.stencil.anchorPositionCheck){
+this.anchorPositionCheck=dojo.hitch(this.stencil,this.stencil.anchorPositionCheck);
+}
+this._zCon=dojo.connect(this.mouse,"setZoom",this,"render");
+this.render();
+this.connectMouse();
+},{y_anchor:null,x_anchor:null,render:function(){
+this.shape&&this.shape.removeShape();
+var d=this.defaults.anchors,z=this.mouse.zoom,b=d.width*z,s=d.size*z,p=s/2,_11={width:b,style:d.style,color:d.color,cap:d.cap};
+var _12={x:this.point.x-p,y:this.point.y-p,width:s,height:s};
+this.shape=this.stencil.container.createRect(_12).setStroke(_11).setFill(d.fill);
+this.shape.setTransform({dx:0,dy:0});
+this.util.attr(this,"drawingType","anchor");
+this.util.attr(this,"id",this.id);
+},onRenderStencil:function(_13){
+},onTransformPoint:function(_14){
+},onAnchorDown:function(obj){
+this.selected=obj.id==this.id;
+},onAnchorUp:function(obj){
+this.selected=false;
+this.stencil.onTransformEnd(this);
+},onAnchorDrag:function(obj){
+if(this.selected){
+var mx=this.shape.getTransform();
+var pmx=this.shape.getParent().getParent().getTransform();
+var _15=this.defaults.anchors.marginZero;
+var _16=pmx.dx+this.org.x,_17=pmx.dy+this.org.y,x=obj.x-_16;
+y=obj.y-_17;
+s=this.defaults.anchors.minSize;
+var _18,_19,_1a,_1b;
+var chk=this.anchorPositionCheck(x,y,this);
+if(chk.x<0){
+console.warn("X<0 Shift");
+while(this.anchorPositionCheck(x,y,this).x<0){
+this.shape.getParent().getParent().applyTransform({dx:2,dy:0});
+}
+}
+if(chk.y<0){
+console.warn("Y<0 Shift");
+while(this.anchorPositionCheck(x,y,this).y<0){
+this.shape.getParent().getParent().applyTransform({dx:0,dy:2});
+}
+}
+if(this.y_anchor){
+if(this.org.y>this.y_anchor.org.y){
+_1a=this.y_anchor.point.y+s-this.org.y;
+_1b=Infinity;
+if(y<_1a){
+y=_1a;
+}
+}else{
+_1a=-_17+_15;
+_1b=this.y_anchor.point.y-s-this.org.y;
+if(y<_1a){
+y=_1a;
+}else{
+if(y>_1b){
+y=_1b;
+}
+}
+}
+}else{
+_1a=-_17+_15;
+if(y<_1a){
+y=_1a;
+}
+}
+if(this.x_anchor){
+if(this.org.x>this.x_anchor.org.x){
+_18=this.x_anchor.point.x+s-this.org.x;
+_19=Infinity;
+if(x<_18){
+x=_18;
+}
+}else{
+_18=-_16+_15;
+_19=this.x_anchor.point.x-s-this.org.x;
+if(x<_18){
+x=_18;
+}else{
+if(x>_19){
+x=_19;
+}
+}
+}
+}else{
+_18=-_16+_15;
+if(x<_18){
+x=_18;
+}
+}
+this.shape.setTransform({dx:x,dy:y});
+if(this.linkedAnchor){
+this.linkedAnchor.shape.setTransform({dx:x,dy:y});
+}
+this.onTransformPoint(this);
+}
+},anchorPositionCheck:function(x,y,_1c){
+return {x:1,y:1};
+},setPoint:function(mx){
+this.shape.applyTransform(mx);
+},connectMouse:function(){
+this._mouseHandle=this.mouse.register(this);
+},disconnectMouse:function(){
+this.mouse.unregister(this._mouseHandle);
+},reset:function(_1d){
+},destroy:function(){
+dojo.disconnect(this._zCon);
+this.disconnectMouse();
+this.shape.removeShape();
+}});
+}
diff --git a/dojox/drawing/manager/Canvas.js b/dojox/drawing/manager/Canvas.js
new file mode 100644
index 0000000..f97469c
--- /dev/null
+++ b/dojox/drawing/manager/Canvas.js
@@ -0,0 +1,87 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.manager.Canvas"]){
+dojo._hasResource["dojox.drawing.manager.Canvas"]=true;
+dojo.provide("dojox.drawing.manager.Canvas");
+(function(){
+dojox.drawing.manager.Canvas=dojox.drawing.util.oo.declare(function(_1){
+dojo.mixin(this,_1);
+var _2=dojo.contentBox(this.srcRefNode);
+this.height=this.parentHeight=_2.h;
+this.width=this.parentWidth=_2.w;
+this.domNode=dojo.create("div",{id:"canvasNode"},this.srcRefNode);
+dojo.style(this.domNode,{width:this.width,height:"auto"});
+dojo.setSelectable(this.domNode,false);
+this.id=this.id||this.util.uid("surface");
+this.gfxSurface=dojox.gfx.createSurface(this.domNode,this.width,this.height);
+this.gfxSurface.whenLoaded(this,function(){
+setTimeout(dojo.hitch(this,function(){
+this.surfaceReady=true;
+if(dojo.isIE){
+}else{
+if(dojox.gfx.renderer=="silverlight"){
+this.id=this.domNode.firstChild.id;
+}else{
+}
+}
+this.underlay=this.gfxSurface.createGroup();
+this.surface=this.gfxSurface.createGroup();
+this.overlay=this.gfxSurface.createGroup();
+this.surface.setTransform({dx:0,dy:0,xx:1,yy:1});
+this.gfxSurface.getDimensions=dojo.hitch(this.gfxSurface,"getDimensions");
+if(_1.callback){
+_1.callback(this.domNode);
+}
+}),500);
+});
+this._mouseHandle=this.mouse.register(this);
+},{zoom:1,useScrollbars:true,baseClass:"drawingCanvas",resize:function(_3,_4){
+this.parentWidth=_3;
+this.parentHeight=_4;
+this.setDimensions(_3,_4);
+},setDimensions:function(_5,_6,_7,_8){
+var sw=this.getScrollWidth();
+this.width=Math.max(_5,this.parentWidth);
+this.height=Math.max(_6,this.parentHeight);
+if(this.height>this.parentHeight){
+this.width-=sw;
+}
+if(this.width>this.parentWidth){
+this.height-=sw;
+}
+this.gfxSurface.setDimensions(this.width,this.height);
+this.domNode.parentNode.scrollTop=_8||0;
+this.domNode.parentNode.scrollLeft=_7||0;
+if(this.useScrollbars){
+dojo.style(this.domNode.parentNode,{overflowY:this.height>this.parentHeight?"scroll":"hidden",overflowX:this.width>this.parentWidth?"scroll":"hidden"});
+}else{
+dojo.style(this.domNode.parentNode,{overflowY:"hidden",overflowX:"hidden"});
+}
+},setZoom:function(_9){
+this.zoom=_9;
+this.surface.setTransform({xx:_9,yy:_9});
+this.setDimensions(this.width*_9,this.height*_9);
+},onScroll:function(){
+},getScrollOffset:function(){
+return {top:this.domNode.parentNode.scrollTop,left:this.domNode.parentNode.scrollLeft};
+},getScrollWidth:function(){
+var p=dojo.create("div");
+p.innerHTML="<div style=\"width:50px;height:50px;overflow:hidden;position:absolute;top:0px;left:-1000px;\"><div style=\"height:100px;\"></div>";
+var _a=p.firstChild;
+dojo.body().appendChild(_a);
+var _b=dojo.contentBox(_a).h;
+dojo.style(_a,"overflow","scroll");
+var _c=_b-dojo.contentBox(_a).h;
+dojo.destroy(_a);
+this.getScrollWidth=function(){
+return _c;
+};
+return _c;
+}});
+})();
+}
diff --git a/dojox/drawing/manager/Mouse.js b/dojox/drawing/manager/Mouse.js
new file mode 100644
index 0000000..cc56123
--- /dev/null
+++ b/dojox/drawing/manager/Mouse.js
@@ -0,0 +1,195 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.manager.Mouse"]){
+dojo._hasResource["dojox.drawing.manager.Mouse"]=true;
+dojo.provide("dojox.drawing.manager.Mouse");
+dojox.drawing.manager.Mouse=dojox.drawing.util.oo.declare(function(_1){
+this.util=_1.util;
+this.keys=_1.keys;
+this.id=_1.id||this.util.uid("mouse");
+this.currentNodeId="";
+this.registered={};
+},{doublClickSpeed:400,_lastx:0,_lasty:0,__reg:0,_downOnCanvas:false,init:function(_2){
+this.container=_2;
+this.setCanvas();
+var c;
+var _3=false;
+dojo.connect(this.container,"rightclick",this,function(_4){
+console.warn("RIGHTCLICK");
+});
+dojo.connect(document.body,"mousedown",this,function(_5){
+});
+dojo.connect(this.container,"mousedown",this,function(_6){
+this.down(_6);
+_3=true;
+c=dojo.connect(document,"mousemove",this,"drag");
+});
+dojo.connect(document,"mouseup",this,function(_7){
+dojo.disconnect(c);
+_3=false;
+this.up(_7);
+});
+dojo.connect(document,"mousemove",this,function(_8){
+if(!_3){
+this.move(_8);
+}
+});
+dojo.connect(this.keys,"onEsc",this,function(_9){
+this._dragged=false;
+});
+},setCanvas:function(){
+var _a=dojo.coords(this.container.parentNode);
+this.origin=dojo.clone(_a);
+},scrollOffset:function(){
+return {top:this.container.parentNode.scrollTop,left:this.container.parentNode.scrollLeft};
+},register:function(_b){
+var _c=_b.id||"reg_"+(this.__reg++);
+if(!this.registered[_c]){
+this.registered[_c]=_b;
+}
+return _c;
+},unregister:function(_d){
+if(!this.registered[_d]){
+return;
+}
+delete this.registered[_d];
+},_broadcastEvent:function(_e,_f){
+for(var nm in this.registered){
+if(this.registered[nm][_e]){
+this.registered[nm][_e](_f);
+}
+}
+},onDown:function(obj){
+this._broadcastEvent(this.eventName("down"),obj);
+},onDrag:function(obj){
+var nm=this.eventName("drag");
+if(this._selected&&nm=="onDrag"){
+nm="onStencilDrag";
+}
+this._broadcastEvent(nm,obj);
+},onMove:function(obj){
+this._broadcastEvent("onMove",obj);
+},onOver:function(obj){
+this._broadcastEvent("onOver",obj);
+},onOut:function(obj){
+this._broadcastEvent("onOut",obj);
+},onUp:function(obj){
+var nm=this.eventName("up");
+if(nm=="onStencilUp"){
+this._selected=true;
+}else{
+if(this._selected&&nm=="onUp"){
+nm="onStencilUp";
+this._selected=false;
+}
+}
+this._broadcastEvent(nm,obj);
+if(dojox.gfx.renderer=="silverlight"){
+return;
+}
+this._clickTime=new Date().getTime();
+if(this._lastClickTime){
+if(this._clickTime-this._lastClickTime<this.doublClickSpeed){
+var dnm=this.eventName("doubleClick");
+console.warn("DOUBLE CLICK",dnm,obj);
+this._broadcastEvent(dnm,obj);
+}else{
+}
+}
+this._lastClickTime=this._clickTime;
+},zoom:1,setZoom:function(_10){
+this.zoom=1/_10;
+},setEventMode:function(_11){
+this.mode=_11?"on"+_11.charAt(0).toUpperCase()+_11.substring(1):"";
+},eventName:function(_12){
+_12=_12.charAt(0).toUpperCase()+_12.substring(1);
+if(this.mode){
+if(this.mode=="onPathEdit"){
+return "on"+_12;
+}
+if(this.mode=="onUI"){
+}
+return this.mode+_12;
+}else{
+var dt=!this.drawingType||this.drawingType=="surface"||this.drawingType=="canvas"?"":this.drawingType;
+var t=!dt?"":dt.charAt(0).toUpperCase()+dt.substring(1);
+return "on"+t+_12;
+}
+},up:function(evt){
+this.onUp(this.create(evt));
+},down:function(evt){
+evt.preventDefault();
+dojo.stopEvent(evt);
+this._downOnCanvas=true;
+var sc=this.scrollOffset();
+var dim=this._getXY(evt);
+this._lastpagex=dim.x;
+this._lastpagey=dim.y;
+var o=this.origin;
+var x=dim.x-o.x;
+var y=dim.y-o.y;
+x*=this.zoom;
+y*=this.zoom;
+x+=sc.left*this.zoom;
+y+=sc.top*this.zoom;
+var _13=x>=0&&y>=0&&x<=o.w&&y<=o.h;
+o.startx=x;
+o.starty=y;
+this._lastx=x;
+this._lasty=y;
+this.drawingType=this.util.attr(evt,"drawingType")||"";
+var id=this._getId(evt);
+this.onDown({mid:this.id,x:x,y:y,pageX:dim.x,pageY:dim.y,withinCanvas:_13,id:id});
+},over:function(obj){
+this.onOver(obj);
+},out:function(obj){
+this.onOut(obj);
+},move:function(evt){
+var obj=this.create(evt);
+if(this.id=="MUI"){
+}
+if(obj.id!=this.currentNodeId){
+var _14={};
+for(var nm in obj){
+_14[nm]=obj[nm];
+}
+_14.id=this.currentNodeId;
+this.currentNodeId&&this.out(_14);
+obj.id&&this.over(obj);
+this.currentNodeId=obj.id;
+}
+this.onMove(obj);
+},drag:function(evt){
+this.onDrag(this.create(evt,true));
+},create:function(evt,_15){
+var sc=this.scrollOffset();
+var dim=this._getXY(evt);
+var _16=dim.x;
+var _17=dim.y;
+var x=dim.x-this.origin.x;
+var y=dim.y-this.origin.y;
+var o=this.origin;
+x+=sc.left;
+y+=sc.top;
+x*=this.zoom;
+y*=this.zoom;
+var _18=x>=0&&y>=0&&x<=o.w&&y<=o.h;
+var id=_18?this._getId(evt,_15):"";
+var ret={mid:this.id,x:x,y:y,pageX:dim.x,pageY:dim.y,page:{x:dim.x,y:dim.y},orgX:o.x,orgY:o.y,last:{x:this._lastx,y:this._lasty},start:{x:this.origin.startx,y:this.origin.starty},move:{x:_16-this._lastpagex,y:_17-this._lastpagey},scroll:sc,id:id,withinCanvas:_18};
+this._lastx=x;
+this._lasty=y;
+this._lastpagex=_16;
+this._lastpagey=_17;
+dojo.stopEvent(evt);
+return ret;
+},_getId:function(evt,_19){
+return this.util.attr(evt,"id",null,_19);
+},_getXY:function(evt){
+return {x:evt.pageX,y:evt.pageY};
+}});
+}
diff --git a/dojox/drawing/manager/Stencil.js b/dojox/drawing/manager/Stencil.js
new file mode 100644
index 0000000..3495677
--- /dev/null
+++ b/dojox/drawing/manager/Stencil.js
@@ -0,0 +1,312 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.manager.Stencil"]){
+dojo._hasResource["dojox.drawing.manager.Stencil"]=true;
+dojo.provide("dojox.drawing.manager.Stencil");
+(function(){
+var _1,_2;
+dojox.drawing.manager.Stencil=dojox.drawing.util.oo.declare(function(_3){
+_1=_3.surface;
+this.canvas=_3.canvas;
+this.defaults=dojox.drawing.defaults.copy();
+this.undo=_3.undo;
+this.mouse=_3.mouse;
+this.keys=_3.keys;
+this.anchors=_3.anchors;
+this.stencils={};
+this.selectedStencils={};
+this._mouseHandle=this.mouse.register(this);
+dojo.connect(this.keys,"onArrow",this,"onArrow");
+dojo.connect(this.keys,"onEsc",this,"deselect");
+dojo.connect(this.keys,"onDelete",this,"onDelete");
+},{_dragBegun:false,_wasDragged:false,_secondClick:false,_isBusy:false,register:function(_4){
+if(_4.isText&&!_4.editMode&&_4.deleteEmptyCreate&&!_4.getText()){
+console.warn("EMPTY CREATE DELETE",_4);
+_4.destroy();
+return false;
+}
+this.stencils[_4.id]=_4;
+if(_4.execText){
+if(_4._text&&!_4.editMode){
+this.selectItem(_4);
+}
+_4.connect("execText",this,function(){
+if(_4.isText&&_4.deleteEmptyModify&&!_4.getText()){
+console.warn("EMPTY MOD DELETE",_4);
+this.deleteItem(_4);
+}else{
+if(_4.selectOnExec){
+this.selectItem(_4);
+}
+}
+});
+}
+_4.connect("deselect",this,function(){
+if(!this._isBusy&&this.isSelected(_4)){
+this.deselectItem(_4);
+}
+});
+_4.connect("select",this,function(){
+if(!this._isBusy&&!this.isSelected(_4)){
+this.selectItem(_4);
+}
+});
+return _4;
+},unregister:function(_5){
+if(_5){
+_5.selected&&this.onDeselect(_5);
+delete this.stencils[_5.id];
+}
+},onArrow:function(_6){
+if(this.hasSelected()){
+this.saveThrottledState();
+this.group.applyTransform({dx:_6.x,dy:_6.y});
+}
+},_throttleVrl:null,_throttle:false,throttleTime:400,_lastmxx:-1,_lastmxy:-1,saveMoveState:function(){
+var mx=this.group.getTransform();
+if(mx.dx==this._lastmxx&&mx.dy==this._lastmxy){
+return;
+}
+this._lastmxx=mx.dx;
+this._lastmxy=mx.dy;
+this.undo.add({before:dojo.hitch(this.group,"setTransform",mx)});
+},saveThrottledState:function(){
+clearTimeout(this._throttleVrl);
+clearInterval(this._throttleVrl);
+this._throttleVrl=setTimeout(dojo.hitch(this,function(){
+this._throttle=false;
+this.saveMoveState();
+}),this.throttleTime);
+if(this._throttle){
+return;
+}
+this._throttle=true;
+this.saveMoveState();
+},unDelete:function(_7){
+for(var s in _7){
+_7[s].render();
+this.onSelect(_7[s]);
+}
+},onDelete:function(_8){
+if(_8!==true){
+this.undo.add({before:dojo.hitch(this,"unDelete",this.selectedStencils),after:dojo.hitch(this,"onDelete",true)});
+}
+this.withSelected(function(m){
+this.anchors.remove(m);
+var id=m.id;
+m.destroy();
+delete this.stencils[id];
+});
+this.selectedStencils={};
+},deleteItem:function(_9){
+if(this.hasSelected()){
+var _a=[];
+for(var m in this.selectedStencils){
+if(this.selectedStencils.id==_9.id){
+if(this.hasSelected()==1){
+this.onDelete();
+return;
+}
+}else{
+_a.push(this.selectedStencils.id);
+}
+}
+this.deselect();
+this.selectItem(_9);
+this.onDelete();
+dojo.forEach(_a,function(id){
+this.selectItem(id);
+},this);
+}else{
+this.selectItem(_9);
+this.onDelete();
+}
+},removeAll:function(){
+this.selectAll();
+this._isBusy=true;
+this.onDelete();
+this.stencils={};
+this._isBusy=false;
+},setSelectionGroup:function(){
+this.withSelected(function(m){
+this.onDeselect(m,true);
+});
+if(this.group){
+_1.remove(this.group);
+this.group.removeShape();
+}
+this.group=_1.createGroup();
+this.group.setTransform({dx:0,dy:0});
+this.withSelected(function(m){
+this.group.add(m.container);
+m.select();
+});
+},setConstraint:function(){
+var t=Infinity;
+l=Infinity;
+this.withSelected(function(m){
+var o=m.getBounds();
+t=Math.min(o.y1,t);
+l=Math.min(o.x1,l);
+});
+this.constrain={l:-l,t:-t};
+},onDeselect:function(_b,_c){
+if(!_c){
+delete this.selectedStencils[_b.id];
+}
+this.anchors.remove(_b);
+_1.add(_b.container);
+_b.selected&&_b.deselect();
+_b.applyTransform(this.group.getTransform());
+},deselectItem:function(_d){
+this.onDeselect(_d);
+},deselect:function(){
+this.withSelected(function(m){
+this.onDeselect(m);
+});
+this._dragBegun=false;
+this._wasDragged=false;
+},onSelect:function(_e){
+if(!_e){
+console.error("null stencil is not selected:",this.stencils);
+}
+if(this.selectedStencils[_e.id]){
+return;
+}
+this.selectedStencils[_e.id]=_e;
+this.group.add(_e.container);
+_e.select();
+if(this.hasSelected()==1){
+this.anchors.add(_e,this.group);
+}
+},selectAll:function(){
+this._isBusy=true;
+for(var m in this.stencils){
+this.selectItem(m);
+}
+this._isBusy=false;
+},selectItem:function(_f){
+var id=typeof (_f)=="string"?_f:_f.id;
+var _10=this.stencils[id];
+this.setSelectionGroup();
+this.onSelect(_10);
+this.group.moveToFront();
+this.setConstraint();
+},onStencilDoubleClick:function(obj){
+if(this.selectedStencils[obj.id]){
+if(this.selectedStencils[obj.id].edit){
+var m=this.selectedStencils[obj.id];
+m.editMode=true;
+this.deselect();
+m.edit();
+}
+}
+},onAnchorUp:function(){
+this.setConstraint();
+},onStencilDown:function(obj,evt){
+if(!this.stencils[obj.id]){
+return;
+}
+this._isBusy=true;
+if(this.selectedStencils[obj.id]&&this.keys.meta){
+if(dojo.isMac&&this.keys.cmmd){
+}
+this.onDeselect(this.selectedStencils[obj.id]);
+if(this.hasSelected()==1){
+this.withSelected(function(m){
+this.anchors.add(m,this.group);
+});
+}
+this.group.moveToFront();
+this.setConstraint();
+return;
+}else{
+if(this.selectedStencils[obj.id]){
+var mx=this.group.getTransform();
+this._offx=obj.x-mx.dx;
+this._offy=obj.y-mx.dy;
+return;
+}else{
+if(!this.keys.meta){
+this.deselect();
+}else{
+}
+}
+}
+this.selectItem(obj.id);
+var mx=this.group.getTransform();
+this._offx=obj.x-mx.dx;
+this._offy=obj.y-mx.dx;
+this.orgx=obj.x;
+this.orgy=obj.y;
+this._isBusy=false;
+this.undo.add({before:function(){
+},after:function(){
+}});
+},onStencilUp:function(obj){
+},onStencilDrag:function(obj){
+if(!this._dragBegun){
+this.onBeginDrag(obj);
+this._dragBegun=true;
+}else{
+this.saveThrottledState();
+var x=obj.x-obj.last.x,y=obj.y-obj.last.y,mx=this.group.getTransform(),c=this.constrain,mz=this.defaults.anchors.marginZero;
+x=obj.x-this._offx;
+y=obj.y-this._offy;
+if(x<c.l+mz){
+x=c.l+mz;
+}
+if(y<c.t+mz){
+y=c.t+mz;
+}
+this.group.setTransform({dx:x,dy:y});
+}
+},onDragEnd:function(obj){
+this._dragBegun=false;
+},onBeginDrag:function(obj){
+this._wasDragged=true;
+},onDown:function(obj){
+this.deselect();
+},exporter:function(){
+var _11=[];
+for(var m in this.stencils){
+this.stencils[m].enabled&&_11.push(this.stencils[m].exporter());
+}
+return _11;
+},toSelected:function(_12){
+var _13=Array.prototype.slice.call(arguments).splice(1);
+for(var m in this.selectedStencils){
+var _14=this.selectedStencils[m];
+_14[_12].apply(_14,_13);
+}
+},withSelected:function(_15){
+var f=dojo.hitch(this,_15);
+for(var m in this.selectedStencils){
+f(this.selectedStencils[m]);
+}
+},withUnselected:function(_16){
+var f=dojo.hitch(this,_16);
+for(var m in this.stencils){
+!this.stencils[m].selected&&f(this.stencils[m]);
+}
+},withStencils:function(_17){
+var f=dojo.hitch(this,_17);
+for(var m in this.stencils){
+f(this.stencils[m]);
+}
+},hasSelected:function(){
+var ln=0;
+for(var m in this.selectedStencils){
+ln++;
+}
+return ln;
+},isSelected:function(_18){
+return !!this.selectedStencils[_18.id];
+}});
+})();
+}
diff --git a/dojox/drawing/manager/StencilUI.js b/dojox/drawing/manager/StencilUI.js
new file mode 100644
index 0000000..c7a7baf
--- /dev/null
+++ b/dojox/drawing/manager/StencilUI.js
@@ -0,0 +1,48 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.manager.StencilUI"]){
+dojo._hasResource["dojox.drawing.manager.StencilUI"]=true;
+dojo.provide("dojox.drawing.manager.StencilUI");
+(function(){
+var _1,_2;
+dojox.drawing.manager.StencilUI=dojox.drawing.util.oo.declare(function(_3){
+_1=_3.surface;
+this.canvas=_3.canvas;
+this.defaults=dojox.drawing.defaults.copy();
+this.mouse=_3.mouse;
+this.keys=_3.keys;
+this._mouseHandle=this.mouse.register(this);
+this.stencils={};
+},{register:function(_4){
+this.stencils[_4.id]=_4;
+return _4;
+},onUiDown:function(_5){
+if(!this._isStencil(_5)){
+return;
+}
+this.stencils[_5.id].onDown(_5);
+},onUiUp:function(_6){
+if(!this._isStencil(_6)){
+return;
+}
+this.stencils[_6.id].onUp(_6);
+},onOver:function(_7){
+if(!this._isStencil(_7)){
+return;
+}
+this.stencils[_7.id].onOver(_7);
+},onOut:function(_8){
+if(!this._isStencil(_8)){
+return;
+}
+this.stencils[_8.id].onOut(_8);
+},_isStencil:function(_9){
+return !!_9.id&&!!this.stencils[_9.id]&&this.stencils[_9.id].type=="drawing.library.UI.Button";
+}});
+})();
+}
diff --git a/dojox/drawing/manager/Undo.js b/dojox/drawing/manager/Undo.js
new file mode 100644
index 0000000..b2b6caa
--- /dev/null
+++ b/dojox/drawing/manager/Undo.js
@@ -0,0 +1,51 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.manager.Undo"]){
+dojo._hasResource["dojox.drawing.manager.Undo"]=true;
+dojo.provide("dojox.drawing.manager.Undo");
+dojox.drawing.manager.Undo=dojox.drawing.util.oo.declare(function(_1){
+this.keys=_1.keys;
+this.undostack=[];
+this.redostack=[];
+dojo.connect(this.keys,"onKeyDown",this,"onKeyDown");
+},{onKeyDown:function(_2){
+if(!_2.cmmd){
+return;
+}
+if(_2.keyCode==90&&!_2.shift){
+this.undo();
+}else{
+if((_2.keyCode==90&&_2.shift)||_2.keyCode==89){
+this.redo();
+}
+}
+},add:function(_3){
+_3.args=dojo.mixin({},_3.args);
+this.undostack.push(_3);
+},apply:function(_4,_5,_6){
+dojo.hitch(_4,_5)(_6);
+},undo:function(){
+var o=this.undostack.pop();
+if(!o){
+return;
+}
+o.before();
+this.redostack.push(o);
+},redo:function(){
+var o=this.redostack.pop();
+if(!o){
+return;
+}
+if(o.after){
+o.after();
+}else{
+o.before();
+}
+this.undostack.push(o);
+}});
+}
diff --git a/dojox/drawing/manager/_registry.js b/dojox/drawing/manager/_registry.js
new file mode 100644
index 0000000..3de4d94
--- /dev/null
+++ b/dojox/drawing/manager/_registry.js
@@ -0,0 +1,34 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.manager._registry"]){
+dojo._hasResource["dojox.drawing.manager._registry"]=true;
+dojo.provide("dojox.drawing.manager._registry");
+(function(){
+var _1={tool:{},stencil:{},drawing:{},plugin:{}};
+dojox.drawing.register=function(_2,_3){
+if(_3=="drawing"){
+_1.drawing[_2.id]=_2;
+}else{
+if(_3=="tool"){
+_1.tool[_2.name]=_2;
+}else{
+if(_3=="stencil"){
+_1.stencil[_2.name]=_2;
+}else{
+if(_3=="plugin"){
+_1.plugin[_2.name]=_2;
+}
+}
+}
+}
+};
+dojox.drawing.getRegistered=function(_4,id){
+return id?_1[_4][id]:_1[_4];
+};
+})();
+}
diff --git a/dojox/drawing/manager/keys.js b/dojox/drawing/manager/keys.js
new file mode 100644
index 0000000..4a8bd1d
--- /dev/null
+++ b/dojox/drawing/manager/keys.js
@@ -0,0 +1,154 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.manager.keys"]){
+dojo._hasResource["dojox.drawing.manager.keys"]=true;
+dojo.provide("dojox.drawing.manager.keys");
+(function(){
+var _1=false;
+var _2=true;
+var _3="abcdefghijklmnopqrstuvwxyz";
+dojox.drawing.manager.keys={arrowIncrement:1,arrowShiftIncrement:10,shift:false,ctrl:false,alt:false,cmmd:false,meta:false,onDelete:function(_4){
+},onEsc:function(_5){
+},onEnter:function(_6){
+},onArrow:function(_7){
+},onKeyDown:function(_8){
+},onKeyUp:function(_9){
+},listeners:[],register:function(_a){
+var _b=dojox.drawing.util.uid("listener");
+this.listeners.push({handle:_b,scope:_a.scope||window,callback:_a.callback,keyCode:_a.keyCode});
+},_getLetter:function(_c){
+if(!_c.meta&&_c.keyCode>=65&&_c.keyCode<=90){
+return _3.charAt(_c.keyCode-65);
+}
+return null;
+},_mixin:function(_d){
+_d.meta=this.meta;
+_d.shift=this.shift;
+_d.alt=this.alt;
+_d.cmmd=this.cmmd;
+_d.letter=this._getLetter(_d);
+return _d;
+},editMode:function(_e){
+_1=_e;
+},enable:function(_f){
+_2=_f;
+},scanForFields:function(){
+if(this._fieldCons){
+dojo.forEach(this._fieldCons,dojo.disconnect,dojo);
+}
+this._fieldCons=[];
+dojo.query("input").forEach(function(n){
+var a=dojo.connect(n,"focus",this,function(evt){
+this.enable(false);
+});
+var b=dojo.connect(n,"blur",this,function(evt){
+this.enable(true);
+});
+this._fieldCons.push(a);
+this._fieldCons.push(b);
+},this);
+},init:function(){
+setTimeout(dojo.hitch(this,"scanForFields"),500);
+dojo.connect(document,"blur",this,function(evt){
+this.meta=this.shift=this.ctrl=this.cmmd=this.alt=false;
+});
+dojo.connect(document,"keydown",this,function(evt){
+if(!_2){
+return;
+}
+if(evt.keyCode==16){
+this.shift=true;
+}
+if(evt.keyCode==17){
+this.ctrl=true;
+}
+if(evt.keyCode==18){
+this.alt=true;
+}
+if(evt.keyCode==224){
+this.cmmd=true;
+}
+this.meta=this.shift||this.ctrl||this.cmmd||this.alt;
+if(!_1){
+this.onKeyDown(this._mixin(evt));
+if(evt.keyCode==8||evt.keyCode==46){
+dojo.stopEvent(evt);
+}
+}
+});
+dojo.connect(document,"keyup",this,function(evt){
+if(!_2){
+return;
+}
+var _10=false;
+if(evt.keyCode==16){
+this.shift=false;
+}
+if(evt.keyCode==17){
+this.ctrl=false;
+}
+if(evt.keyCode==18){
+this.alt=false;
+}
+if(evt.keyCode==224){
+this.cmmd=false;
+}
+this.meta=this.shift||this.ctrl||this.cmmd||this.alt;
+!_1&&this.onKeyUp(this._mixin(evt));
+if(evt.keyCode==13){
+console.warn("KEY ENTER");
+this.onEnter(evt);
+_10=true;
+}
+if(evt.keyCode==27){
+this.onEsc(evt);
+_10=true;
+}
+if(evt.keyCode==8||evt.keyCode==46){
+this.onDelete(evt);
+_10=true;
+}
+if(_10&&!_1){
+dojo.stopEvent(evt);
+}
+});
+dojo.connect(document,"keypress",this,function(evt){
+if(!_2){
+return;
+}
+var inc=this.shift?this.arrowIncrement*this.arrowShiftIncrement:this.arrowIncrement;
+var x=0,y=0;
+if(evt.keyCode==32&&!_1){
+dojo.stopEvent(evt);
+}
+if(evt.keyCode==37){
+x=-inc;
+}
+if(evt.keyCode==38){
+y=-inc;
+}
+if(evt.keyCode==39){
+x=inc;
+}
+if(evt.keyCode==40){
+y=inc;
+}
+if(x||y){
+evt.x=x;
+evt.y=y;
+evt.shift=this.shift;
+this.onArrow(evt);
+if(!_1){
+dojo.stopEvent(evt);
+}
+}
+});
+}};
+dojo.addOnLoad(dojox.drawing.manager.keys,"init");
+})();
+}
diff --git a/dojox/drawing/plugins/_Plugin.js b/dojox/drawing/plugins/_Plugin.js
new file mode 100644
index 0000000..919cdbe
--- /dev/null
+++ b/dojox/drawing/plugins/_Plugin.js
@@ -0,0 +1,28 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.plugins._Plugin"]){
+dojo._hasResource["dojox.drawing.plugins._Plugin"]=true;
+dojo.provide("dojox.drawing.plugins._Plugin");
+dojox.drawing.plugins._Plugin=dojox.drawing.util.oo.declare(function(_1){
+this._cons=[];
+dojo.mixin(this,_1);
+if(this.button&&this.onClick){
+this.connect(this.button,"onClick",this,"onClick");
+}
+},{util:null,keys:null,mouse:null,drawing:null,stencils:null,anchors:null,canvas:null,node:null,button:null,type:"dojox.drawing.plugins._Plugin",connect:function(){
+this._cons.push(dojo.connect.apply(dojo,arguments));
+},disconnect:function(_2){
+if(!_2){
+return;
+}
+if(!dojo.isArray(_2)){
+_2=[_2];
+}
+dojo.forEach(_2,dojo.disconnect,dojo);
+}});
+}
diff --git a/dojox/drawing/plugins/drawing/Grid.js b/dojox/drawing/plugins/drawing/Grid.js
new file mode 100644
index 0000000..b727d14
--- /dev/null
+++ b/dojox/drawing/plugins/drawing/Grid.js
@@ -0,0 +1,52 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.plugins.drawing.Grid"]){
+dojo._hasResource["dojox.drawing.plugins.drawing.Grid"]=true;
+dojo.provide("dojox.drawing.plugins.drawing.Grid");
+dojo.require("dojox.drawing.plugins._Plugin");
+dojox.drawing.plugins.drawing.Grid=dojox.drawing.util.oo.declare(dojox.drawing.plugins._Plugin,function(_1){
+if(_1.gap){
+this.major=_1.gap;
+}
+this.setGrid();
+dojo.connect(this.canvas,"setZoom",this,"setZoom");
+},{type:"dojox.drawing.plugins.drawing.Grid",gap:100,major:100,minor:0,zoom:1,setZoom:function(_2){
+this.zoom=_2;
+this.setGrid();
+},setGrid:function(_3){
+var _4=Math.floor(this.major*this.zoom);
+var _5=this.minor?Math.floor(this.minor*this.zoom):_4;
+this.grid&&this.grid.removeShape();
+var x1,x2,y1,y2,i,_6;
+var s=this.canvas.underlay.createGroup();
+var w=2000;
+var h=1000;
+var b=1;
+var mj="#00ffff";
+var mn="#d7ffff";
+var _7=function(x1,y1,x2,y2,c){
+s.createLine({x1:x1,y1:y1,x2:x2,y2:y2}).setStroke({style:"Solid",width:b,cap:"round",color:c});
+};
+for(i=1,len=h/_5;i<len;i++){
+x1=0,x2=w;
+y1=_5*i,y2=y1;
+_6=y1%_4?mn:mj;
+_7(x1,y1,x2,y2,_6);
+}
+for(i=1,len=w/_5;i<len;i++){
+y1=0,y2=h;
+x1=_5*i,x2=x1;
+_6=x1%_4?mn:mj;
+_7(x1,y1,x2,y2,_6);
+}
+s.moveToBack();
+this.grid=s;
+this.util.attr(s,"id","grid");
+return s;
+}});
+}
diff --git a/dojox/drawing/plugins/drawing/Silverlight.js b/dojox/drawing/plugins/drawing/Silverlight.js
new file mode 100644
index 0000000..c450036
--- /dev/null
+++ b/dojox/drawing/plugins/drawing/Silverlight.js
@@ -0,0 +1,138 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.plugins.drawing.Silverlight"]){
+dojo._hasResource["dojox.drawing.plugins.drawing.Silverlight"]=true;
+dojo.provide("dojox.drawing.plugins.drawing.Silverlight");
+dojox.drawing.plugins.drawing.Silverlight=dojox.drawing.util.oo.declare(function(_1){
+if(dojox.gfx.renderer!="silverlight"){
+return;
+}
+this.mouse=_1.mouse;
+this.stencils=_1.stencils;
+this.anchors=_1.anchors;
+this.canvas=_1.canvas;
+this.util=_1.util;
+dojo.connect(this.stencils,"register",this,function(_2){
+var c1,c2,c3,c4,c5,_3=this;
+var _4=function(){
+c1=_2.container.connect("onmousedown",function(_5){
+_5.superTarget=_2;
+_3.mouse.down(_5);
+});
+};
+_4();
+c2=dojo.connect(_2,"setTransform",this,function(){
+});
+c3=dojo.connect(_2,"onBeforeRender",function(){
+});
+c4=dojo.connect(_2,"onRender",this,function(){
+});
+c5=dojo.connect(_2,"destroy",this,function(){
+dojo.forEach([c1,c2,c3,c4,c5],dojo.disconnect,dojo);
+});
+});
+dojo.connect(this.anchors,"onAddAnchor",this,function(_6){
+var c1=_6.shape.connect("onmousedown",this.mouse,function(_7){
+_7.superTarget=_6;
+this.down(_7);
+});
+var c2=dojo.connect(_6,"disconnectMouse",this,function(){
+dojo.disconnect(c1);
+dojo.disconnect(c2);
+});
+});
+this.mouse._down=function(_8){
+var _9=this._getXY(_8);
+var x=_9.x-this.origin.x;
+var y=_9.y-this.origin.y;
+x*=this.zoom;
+y*=this.zoom;
+this.origin.startx=x;
+this.origin.starty=y;
+this._lastx=x;
+this._lasty=y;
+this.drawingType=this.util.attr(_8,"drawingType")||"";
+var id=this._getId(_8);
+var _a={x:x,y:y,id:id};
+this.onDown(_a);
+this._clickTime=new Date().getTime();
+if(this._lastClickTime){
+if(this._clickTime-this._lastClickTime<this.doublClickSpeed){
+var _b=this.eventName("doubleClick");
+console.warn("DOUBLE CLICK",_b,_a);
+this._broadcastEvent(_b,_a);
+}else{
+}
+}
+this._lastClickTime=this._clickTime;
+};
+this.mouse.down=function(_c){
+clearTimeout(this.__downInv);
+if(this.util.attr(_c,"drawingType")=="surface"){
+this.__downInv=setTimeout(dojo.hitch(this,function(){
+this._down(_c);
+}),500);
+return;
+}
+this._down(_c);
+};
+this.mouse._getXY=function(_d){
+if(_d.pageX){
+return {x:_d.pageX,y:_d.pageY,cancelBubble:true};
+}
+for(var nm in _d){
+}
+if(_d.x!==undefined){
+return {x:_d.x+this.origin.x,y:_d.y+this.origin.y};
+}else{
+return {x:_d.pageX,y:_d.pageY};
+}
+};
+this.mouse._getId=function(_e){
+return this.util.attr(_e,"id");
+};
+this.util.attr=function(_f,_10,_11,_12){
+if(!_f){
+return false;
+}
+try{
+var t;
+if(_f.superTarget){
+t=_f.superTarget;
+}else{
+if(_f.superClass){
+t=_f.superClass;
+}else{
+if(_f.target){
+t=_f.target;
+}else{
+t=_f;
+}
+}
+}
+if(_11!==undefined){
+_f[_10]=_11;
+return _11;
+}
+if(t.tagName){
+if(_10=="drawingType"&&t.tagName.toLowerCase()=="object"){
+return "surface";
+}
+var r=dojo.attr(t,_10);
+}
+var r=t[_10];
+return r;
+}
+catch(e){
+if(!_12){
+}
+return false;
+}
+};
+},{});
+}
diff --git a/dojox/drawing/plugins/tools/Iconize.js b/dojox/drawing/plugins/tools/Iconize.js
new file mode 100644
index 0000000..fe556de
--- /dev/null
+++ b/dojox/drawing/plugins/tools/Iconize.js
@@ -0,0 +1,78 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.plugins.tools.Iconize"]){
+dojo._hasResource["dojox.drawing.plugins.tools.Iconize"]=true;
+dojo.provide("dojox.drawing.plugins.tools.Iconize");
+dojo.require("dojox.drawing.plugins._Plugin");
+dojox.drawing.plugins.tools.Iconize=dojox.drawing.util.oo.declare(dojox.drawing.plugins._Plugin,function(_1){
+},{onClick:function(){
+var _2;
+for(var nm in this.stencils.stencils){
+if(this.stencils.stencils[nm].shortType=="path"){
+_2=this.stencils.stencils[nm];
+break;
+}
+}
+if(_2){
+this.makeIcon(_2.points);
+}
+},makeIcon:function(p){
+var _3=function(n){
+return Number(n.toFixed(1));
+};
+var x=10000;
+var y=10000;
+p.forEach(function(pt){
+if(pt.x!==undefined&&!isNaN(pt.x)){
+x=Math.min(x,pt.x);
+y=Math.min(y,pt.y);
+}
+});
+var _4=0;
+var _5=0;
+p.forEach(function(pt){
+if(pt.x!==undefined&&!isNaN(pt.x)){
+pt.x=_3(pt.x-x);
+pt.y=_3(pt.y-y);
+_4=Math.max(_4,pt.x);
+_5=Math.max(_5,pt.y);
+}
+});
+var s=60;
+var m=20;
+p.forEach(function(pt){
+pt.x=_3(pt.x/_4)*s+m;
+pt.y=_3(pt.y/_5)*s+m;
+});
+var _6="[\n";
+dojo.forEach(p,function(pt,i){
+_6+="{\t";
+if(pt.t){
+_6+="t:'"+pt.t+"'";
+}
+if(pt.x!==undefined&&!isNaN(pt.x)){
+if(pt.t){
+_6+=", ";
+}
+_6+="x:"+pt.x+",\t\ty:"+pt.y;
+}
+_6+="\t}";
+if(i!=p.length-1){
+_6+=",";
+}
+_6+="\n";
+});
+_6+="]";
+var n=dojo.byId("data");
+if(n){
+n.value=_6;
+}
+}});
+dojox.drawing.plugins.tools.Iconize.setup={name:"dojox.drawing.plugins.tools.Iconize",tooltip:"Iconize Tool",iconClass:"iconPan"};
+dojox.drawing.register(dojox.drawing.plugins.tools.Iconize.setup,"plugin");
+}
diff --git a/dojox/drawing/plugins/tools/Pan.js b/dojox/drawing/plugins/tools/Pan.js
new file mode 100644
index 0000000..9267dac
--- /dev/null
+++ b/dojox/drawing/plugins/tools/Pan.js
@@ -0,0 +1,126 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.plugins.tools.Pan"]){
+dojo._hasResource["dojox.drawing.plugins.tools.Pan"]=true;
+dojo.provide("dojox.drawing.plugins.tools.Pan");
+dojo.require("dojox.drawing.plugins._Plugin");
+dojox.drawing.plugins.tools.Pan=dojox.drawing.util.oo.declare(dojox.drawing.plugins._Plugin,function(_1){
+this.domNode=_1.node;
+var _2;
+this.toolbar=_1.scope;
+this.connect(this.toolbar,"onToolClick",this,function(){
+this.onSetPan(false);
+});
+this.connect(this.button,"onClick",this,"onSetPan");
+this.connect(this.keys,"onKeyUp",this,"onKeyUp");
+this.connect(this.keys,"onKeyDown",this,"onKeyDown");
+this.connect(this.anchors,"onAnchorUp",this,"checkBounds");
+this.connect(this.stencils,"register",this,"checkBounds");
+this.connect(this.canvas,"resize",this,"checkBounds");
+this.connect(this.canvas,"setZoom",this,"checkBounds");
+this.connect(this.canvas,"onScroll",this,function(){
+if(this._blockScroll){
+this._blockScroll=false;
+return;
+}
+_2&&clearTimeout(_2);
+_2=setTimeout(dojo.hitch(this,"checkBounds"),200);
+});
+this._mouseHandle=this.mouse.register(this);
+},{selected:false,type:"dojox.drawing.plugins.tools.Pan",onPanUp:function(_3){
+if(_3.id==this.button.id){
+this.onSetPan(false);
+}
+},onKeyUp:function(_4){
+if(_4.keyCode==32){
+this.onSetPan(false);
+}
+},onKeyDown:function(_5){
+if(_5.keyCode==32){
+this.onSetPan(true);
+}
+},onSetPan:function(_6){
+if(_6===true||_6===false){
+this.selected=!_6;
+}
+if(this.selected){
+this.selected=false;
+this.button.deselect();
+}else{
+this.selected=true;
+this.button.select();
+}
+this.mouse.setEventMode(this.selected?"pan":"");
+},onPanDrag:function(_7){
+var x=_7.x-_7.last.x;
+var y=_7.y-_7.last.y;
+this.canvas.domNode.parentNode.scrollTop-=_7.move.y;
+this.canvas.domNode.parentNode.scrollLeft-=_7.move.x;
+this.canvas.onScroll();
+},onStencilUp:function(_8){
+this.checkBounds();
+},onStencilDrag:function(_9){
+},checkBounds:function(){
+var _a=function(){
+};
+var _b=function(){
+};
+var t=Infinity,r=-Infinity,b=-10000,l=10000,sx=0,sy=0,dy=0,dx=0,mx=this.stencils.group?this.stencils.group.getTransform():{dx:0,dy:0},sc=this.mouse.scrollOffset(),_c=sc.left?10:0,_d=sc.top?10:0,ch=this.canvas.height,cw=this.canvas.width,z=this.canvas.zoom,_e=this.canvas.parentHeight,_f=this.canvas.parentWidth;
+this.stencils.withSelected(function(m){
+var o=m.getBounds();
+_b("SEL BOUNDS:",o);
+t=Math.min(o.y1+mx.dy,t);
+r=Math.max(o.x2+mx.dx,r);
+b=Math.max(o.y2+mx.dy,b);
+l=Math.min(o.x1+mx.dx,l);
+});
+this.stencils.withUnselected(function(m){
+var o=m.getBounds();
+_b("UN BOUNDS:",o);
+t=Math.min(o.y1,t);
+r=Math.max(o.x2,r);
+b=Math.max(o.y2,b);
+l=Math.min(o.x1,l);
+_a("----------- B:",b,o.y2);
+});
+b*=z;
+var _10=0,_11=0;
+_a("Bottom test","b:",b,"z:",z,"ch:",ch,"pch:",_e,"top:",sc.top,"sy:",sy,"mx.dy:",mx.dy);
+if(b>_e||sc.top){
+_a("*bottom scroll*");
+ch=Math.max(b,_e+sc.top);
+sy=sc.top;
+_10+=this.canvas.getScrollWidth();
+}else{
+if(!sy&&ch>_e){
+_a("*bottom remove*");
+ch=_e;
+}
+}
+r*=z;
+if(r>_f||sc.left){
+cw=Math.max(r,_f+sc.left);
+sx=sc.left;
+_11+=this.canvas.getScrollWidth();
+}else{
+if(!sx&&cw>_f){
+cw=_f;
+}
+}
+cw+=_10*2;
+ch+=_11*2;
+this._blockScroll=true;
+this.stencils.group&&this.stencils.group.applyTransform({dx:dx,dy:dy});
+this.stencils.withUnselected(function(m){
+m.transformPoints({dx:dx,dy:dy});
+});
+this.canvas.setDimensions(cw,ch,sx,sy);
+}});
+dojox.drawing.plugins.tools.Pan.setup={name:"dojox.drawing.plugins.tools.Pan",tooltip:"Pan Tool",iconClass:"iconPan"};
+dojox.drawing.register(dojox.drawing.plugins.tools.Pan.setup,"plugin");
+}
diff --git a/dojox/drawing/plugins/tools/Zoom.js b/dojox/drawing/plugins/tools/Zoom.js
new file mode 100644
index 0000000..804bf8e
--- /dev/null
+++ b/dojox/drawing/plugins/tools/Zoom.js
@@ -0,0 +1,49 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.plugins.tools.Zoom"]){
+dojo._hasResource["dojox.drawing.plugins.tools.Zoom"]=true;
+dojo.provide("dojox.drawing.plugins.tools.Zoom");
+dojo.require("dojox.drawing.plugins._Plugin");
+(function(){
+var _1=0.1,_2=10,_3=0.1,_4=1,dt=dojox.drawing.plugins.tools;
+dt.ZoomIn=dojox.drawing.util.oo.declare(function(_5){
+},{});
+dt.ZoomIn=dojox.drawing.util.oo.declare(dojox.drawing.plugins._Plugin,function(_6){
+},{type:"dojox.drawing.plugins.tools.ZoomIn",onZoomIn:function(){
+_4+=_1;
+_4=Math.min(_4,_2);
+this.canvas.setZoom(_4);
+this.mouse.setZoom(_4);
+},onClick:function(){
+this.onZoomIn();
+}});
+dt.Zoom100=dojox.drawing.util.oo.declare(dojox.drawing.plugins._Plugin,function(_7){
+},{type:"dojox.drawing.plugins.tools.Zoom100",onZoom100:function(){
+_4=1;
+this.canvas.setZoom(_4);
+this.mouse.setZoom(_4);
+},onClick:function(){
+this.onZoom100();
+}});
+dt.ZoomOut=dojox.drawing.util.oo.declare(dojox.drawing.plugins._Plugin,function(_8){
+},{type:"dojox.drawing.plugins.tools.ZoomOut",onZoomOut:function(){
+_4-=_1;
+_4=Math.max(_4,_3);
+this.canvas.setZoom(_4);
+this.mouse.setZoom(_4);
+},onClick:function(){
+this.onZoomOut();
+}});
+dt.ZoomIn.setup={name:"dojox.drawing.plugins.tools.ZoomIn",tooltip:"Zoom In"};
+dojox.drawing.register(dt.ZoomIn.setup,"plugin");
+dt.Zoom100.setup={name:"dojox.drawing.plugins.tools.Zoom100",tooltip:"Zoom to 100%"};
+dojox.drawing.register(dt.Zoom100.setup,"plugin");
+dt.ZoomOut.setup={name:"dojox.drawing.plugins.tools.ZoomOut",tooltip:"Zoom In"};
+dojox.drawing.register(dt.ZoomOut.setup,"plugin");
+})();
+}
diff --git a/dojox/drawing/resources/CrazyTruck.jpg b/dojox/drawing/resources/CrazyTruck.jpg
new file mode 100644
index 0000000..bc270ec
Binary files /dev/null and b/dojox/drawing/resources/CrazyTruck.jpg differ
diff --git a/dojox/drawing/resources/drawing.css b/dojox/drawing/resources/drawing.css
new file mode 100644
index 0000000..29055a3
--- /dev/null
+++ b/dojox/drawing/resources/drawing.css
@@ -0,0 +1,36 @@
+html, body{
+	width:100%;
+	height:100%;
+	font-family:sans-serif;
+}
+.textAnnotation{
+	position:absolute;
+	border:1px solid #ccc;
+	background-color:#ffff00;
+	color:#0000ff;
+	padding:3px;
+	font-family:sans-serif;
+	font-size:12px;
+	margin-top:-10px;
+	z-index:501;
+}
+#conEdit{
+	border:0;
+	
+	padding:3px;
+	margin:0;
+}
+.drawingTooltip{
+	font-family:sans-serif;
+	font-family:sans-serif;
+	font-weight:normal;
+	padding:5px;
+}
+.drawingTipTitle{
+	font-size:12px;
+	font-weight:bold;
+}
+.drawingTipDesc{
+	font-size:11px;
+	padding-left:10px;
+}
diff --git a/dojox/drawing/resources/images/tool_icons.png b/dojox/drawing/resources/images/tool_icons.png
new file mode 100644
index 0000000..74eaee9
Binary files /dev/null and b/dojox/drawing/resources/images/tool_icons.png differ
diff --git a/dojox/drawing/resources/images/tool_sprites.png b/dojox/drawing/resources/images/tool_sprites.png
new file mode 100644
index 0000000..d80bd4d
Binary files /dev/null and b/dojox/drawing/resources/images/tool_sprites.png differ
diff --git a/dojox/drawing/resources/toolbar.css b/dojox/drawing/resources/toolbar.css
new file mode 100644
index 0000000..e964938
--- /dev/null
+++ b/dojox/drawing/resources/toolbar.css
@@ -0,0 +1,179 @@
+
+.horizontal.drawingToolbar{
+	position:relative;
+	width:auto;
+	height:32px;
+	padding:5px;
+	left:5px;
+}
+.vertical.drawingToolbar{
+	width:32px;
+	padding:5px;
+	position:absolute;
+	left:5px;
+	margin-top:5px;
+	background:#fff;
+}
+.drawingToolbar .drawingButton{
+	position:relative;
+	padding:0;
+	width:32px;
+	height:32px;
+	background-image:url("images/tool_sprites.png");
+	background-position:0px 0px;
+	border:0;
+	cursor:pointer;
+}
+.horizontal.drawingToolbar .drawingButton{
+	float:left;
+	margin-right:5px;
+}
+.dj_ie6 .drawingToolbar .drawingButton {
+	filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=scale src='images/tool_sprites.png');	
+}
+.vertical.drawingToolbar .drawingButton{
+	margin-bottom:5px;
+	margin-right:0px;
+}
+.drawingToolbar .drawingButton.hover{
+	background-position:-32px 0px;
+}
+.drawingToolbar .drawingButton.active{
+	background-position:-64px 0px;
+}
+.drawingToolbar .drawingButton.selected{
+	background-position:-96px 0px;
+}
+.drawingToolbar .drawingButton.selected:hover{}
+.drawingToolbar.vertical{}
+.drawingToolbar .drawingButton .icon{
+	background-image:url("images/tool_icons.png");
+	width:32px;
+	height:64px;
+	position:absolute;
+	left:0px;
+	top:0px;
+	margin:0;
+	padding:0;
+	clip: rect(0px 32px 32px 0px);
+}
+.drawingToolbar .drawingButton.selected .icon{
+	
+	top:-32px;
+	clip: rect(32px 32px 64px 0px);
+}
+.drawingToolbar .drawingButton .icon.iconLine{
+	background-position:-64px 0px;
+}
+.drawingToolbar .drawingButton .icon.iconRect{
+	background-position: 0px 0px;
+}
+.drawingToolbar .drawingButton .icon.iconEllipse{
+	background-position:-32px 0px;
+}
+.drawingToolbar .drawingButton .icon.iconText{
+	background-position:-224px 0px;
+}
+.drawingToolbar .drawingButton .icon.iconArrow{
+	background-position:-96px 0px;
+}
+.drawingToolbar .drawingButton .icon.iconVector{
+	background-position:-128px 0px;
+}
+.drawingToolbar .drawingButton .icon.iconAxes{
+	background-position:-160px 0px;
+}
+.drawingToolbar .drawingButton .icon.iconPan{
+	background-position:-192px 0px;
+}
+.drawingToolbar .drawingButton .icon.iconEq{
+	background-position:-351px 0px;
+}
+.dj_ie6 .drawingToolbar .drawingButton .icon {
+	
+	filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=scale src='images/tool_icons.png');
+}
+.drawingToolbar.vertical .toolCombo .drawingButton.toolComboTop{
+	background-position:-128px 0px;
+	margin:0;
+	margin-top:10px;
+	border-bottom:1px solid #d6d6d6;
+}
+.drawingToolbar.vertical .toolCombo .drawingButton.toolComboTop.hover{
+	background-position:-160px 0px;
+}
+.drawingToolbar.vertical .toolCombo .drawingButton.toolComboTop.active{
+	background-position:-192px 0px;
+}
+.drawingToolbar.vertical .toolCombo .drawingButton.toolComboMid{
+	background-position:-384px 0px;
+	border-style:solid;
+	border-width:1px;
+	border-color:#fff #cccccc #d6d6d6 #cccccc;
+	height:24px;
+	width:30px;
+	margin:0;
+}
+.drawingToolbar.vertical .toolCombo .drawingButton.toolComboMid.hover,
+.drawingToolbar.horizontal .toolCombo .drawingButton.toolComboMid.hover{
+	background-position:-416px 0px;
+}
+.drawingToolbar.vertical .toolCombo .drawingButton.toolComboMid.active,
+.drawingToolbar.horizontal .toolCombo .drawingButton.toolComboMid.active{
+	background-position:-448px 0px;
+}
+.drawingToolbar.vertical .toolCombo .drawingButton.toolComboBot{
+	background-position:-256px 0px;
+	border-top:1px solid #fff;
+	margin:0;
+}
+.drawingToolbar.vertical .toolCombo .drawingButton.toolComboBot.hover{
+	background-position:-288px 0px;
+}
+.drawingToolbar.vertical .toolCombo .drawingButton.toolComboBot.active{
+	background-position:-320px 0px;
+}
+.drawingToolbar.horizontal .toolCombo .drawingButton.toolComboTop{
+	background-position:-512px 0px;
+	margin:0;
+	margin-left:10px;
+	border:0px;
+	border-right:1px solid #d6d6d6;
+}
+.drawingToolbar.horizontal .toolCombo .drawingButton.toolComboTop.hover{
+	background-position:-544px 0px;
+}
+.drawingToolbar.horizontal .toolCombo .drawingButton.toolComboTop.active{
+	background-position:-576px 0px;
+}
+.drawingToolbar.horizontal .toolCombo .drawingButton.toolComboMid{
+	background-position:-384px 0px;
+	border-style:solid;
+	border-width:1px;
+	border-color:#cccccc #d6d6d6 #cccccc #fff;
+	height:30px;
+	width:31px;
+	margin:0;
+}
+.drawingToolbar.horizontal .toolCombo .drawingButton.toolComboBot{
+	background-position:-640px 0px;
+	border-left:1px solid #fff;
+	margin:0;
+	margin-top:-1px;
+	margin-right:-1px;
+}
+.drawingToolbar.horizontal .toolCombo .drawingButton.toolComboBot.hover{
+	background-position:-673px 0px;
+}
+.drawingToolbar.horizontal .toolCombo .drawingButton.toolComboBot.active{
+	background-position:-704px 0px;
+}
+.drawingToolbar .drawingButton .icon.iconZoomIn{
+	background-position:-256px 0px;
+}
+.drawingToolbar .drawingButton .icon.iconZoom100{
+	background-position:-320px -4px;
+}
+.drawingToolbar .drawingButton .icon.iconZoomOut{
+	background-position:-288px 0px;
+}
diff --git a/dojox/drawing/stencil/Ellipse.js b/dojox/drawing/stencil/Ellipse.js
new file mode 100644
index 0000000..90873f2
--- /dev/null
+++ b/dojox/drawing/stencil/Ellipse.js
@@ -0,0 +1,33 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.stencil.Ellipse"]){
+dojo._hasResource["dojox.drawing.stencil.Ellipse"]=true;
+dojo.provide("dojox.drawing.stencil.Ellipse");
+dojox.drawing.stencil.Ellipse=dojox.drawing.util.oo.declare(dojox.drawing.stencil._Base,function(_1){
+},{type:"dojox.drawing.stencil.Ellipse",anchorType:"group",baseRender:true,dataToPoints:function(o){
+o=o||this.data;
+var x=o.cx-o.rx,y=o.cy-o.ry,w=o.rx*2,h=o.ry*2;
+this.points=[{x:x,y:y},{x:x+w,y:y},{x:x+w,y:y+h},{x:x,y:y+h}];
+return this.points;
+},pointsToData:function(p){
+p=p||this.points;
+var s=p[0];
+var e=p[2];
+this.data={cx:s.x+(e.x-s.x)/2,cy:s.y+(e.y-s.y)/2,rx:(e.x-s.x)*0.5,ry:(e.y-s.y)*0.5};
+return this.data;
+},_create:function(_2,d,_3){
+this.remove(this[_2]);
+this[_2]=this.container.createEllipse(d).setStroke(_3).setFill(_3.fill);
+this.util.attr(this[_2],"drawingType","stencil");
+},render:function(){
+this.onBeforeRender(this);
+this.renderHit&&this._create("hit",this.data,this.style.currentHit);
+this._create("shape",this.data,this.style.current);
+}});
+dojox.drawing.register({name:"dojox.drawing.stencil.Ellipse"},"stencil");
+}
diff --git a/dojox/drawing/stencil/Image.js b/dojox/drawing/stencil/Image.js
new file mode 100644
index 0000000..d9cf690
--- /dev/null
+++ b/dojox/drawing/stencil/Image.js
@@ -0,0 +1,62 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.stencil.Image"]){
+dojo._hasResource["dojox.drawing.stencil.Image"]=true;
+dojo.provide("dojox.drawing.stencil.Image");
+dojox.drawing.stencil.Image=dojox.drawing.util.oo.declare(dojox.drawing.stencil._Base,function(_1){
+},{type:"dojox.drawing.stencil.Image",anchorType:"group",baseRender:true,dataToPoints:function(o){
+o=o||this.data;
+this.points=[{x:o.x,y:o.y},{x:o.x+o.width,y:o.y},{x:o.x+o.width,y:o.y+o.height},{x:o.x,y:o.y+o.height}];
+return this.points;
+},pointsToData:function(p){
+p=p||this.points;
+var s=p[0];
+var e=p[2];
+this.data={x:s.x,y:s.y,width:e.x-s.x,height:e.y-s.y,src:this.src||this.data.src};
+return this.data;
+},_createHilite:function(){
+this.remove(this.hit);
+this.hit=this.container.createRect(this.data).setStroke(this.style.current).setFill(this.style.current.fill);
+this._setNodeAtts(this.hit);
+},_create:function(_2,d,_3){
+this.remove(this[_2]);
+var s=this.container.getParent();
+this[_2]=s.createImage(d);
+this.container.add(this[_2]);
+this._setNodeAtts(this[_2]);
+},render:function(_4){
+if(this.data.width=="auto"||isNaN(this.data.width)){
+this.getImageSize(true);
+console.warn("Image size not provided. Acquiring...");
+return;
+}
+this.onBeforeRender(this);
+this.renderHit&&this._createHilite();
+this._create("shape",this.data,this.style.current);
+},getImageSize:function(_5){
+if(this._gettingSize){
+return;
+}
+this._gettingSize=true;
+var _6=dojo.create("img",{src:this.data.src},dojo.body());
+var _7=dojo.connect(_6,"error",this,function(){
+dojo.disconnect(c);
+dojo.disconnect(_7);
+console.error("Error loading image:",this.data.src);
+console.warn("Error image:",this.data);
+});
+var c=dojo.connect(_6,"load",this,function(){
+var _8=dojo.marginBox(_6);
+this.setData({x:this.data.x,y:this.data.y,src:this.data.src,width:_8.w,height:_8.h});
+dojo.disconnect(c);
+dojo.destroy(_6);
+_5&&this.render(true);
+});
+}});
+dojox.drawing.register({name:"dojox.drawing.stencil.Image"},"stencil");
+}
diff --git a/dojox/drawing/stencil/Line.js b/dojox/drawing/stencil/Line.js
new file mode 100644
index 0000000..1068175
--- /dev/null
+++ b/dojox/drawing/stencil/Line.js
@@ -0,0 +1,36 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.stencil.Line"]){
+dojo._hasResource["dojox.drawing.stencil.Line"]=true;
+dojo.provide("dojox.drawing.stencil.Line");
+dojox.drawing.stencil.Line=dojox.drawing.util.oo.declare(dojox.drawing.stencil._Base,function(_1){
+},{type:"dojox.drawing.stencil.Line",anchorType:"single",baseRender:true,dataToPoints:function(o){
+o=o||this.data;
+if(o.radius||o.angle){
+var _2=o.angle;
+o.angle=(180-o.angle)<0?180-o.angle+360:180-o.angle;
+var pt=this.util.pointOnCircle(o.x,o.y,o.radius,o.angle);
+this.data=o={x1:o.x,y1:o.y,x2:pt.x,y2:pt.y};
+}
+this.points=[{x:o.x1,y:o.y1},{x:o.x2,y:o.y2}];
+return this.points;
+},pointsToData:function(p){
+p=p||this.points;
+this.data={x1:p[0].x,y1:p[0].y,x2:p[1].x,y2:p[1].y};
+return this.data;
+},_create:function(_3,d,_4){
+this.remove(this[_3]);
+this[_3]=this.container.createLine(d).setStroke(_4);
+this._setNodeAtts(this[_3]);
+},render:function(){
+this.onBeforeRender(this);
+this.renderHit&&this._create("hit",this.data,this.style.currentHit);
+this._create("shape",this.data,this.style.current);
+}});
+dojox.drawing.register({name:"dojox.drawing.stencil.Line"},"stencil");
+}
diff --git a/dojox/drawing/stencil/Path.js b/dojox/drawing/stencil/Path.js
new file mode 100644
index 0000000..6a266eb
--- /dev/null
+++ b/dojox/drawing/stencil/Path.js
@@ -0,0 +1,86 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.stencil.Path"]){
+dojo._hasResource["dojox.drawing.stencil.Path"]=true;
+dojo.provide("dojox.drawing.stencil.Path");
+dojox.drawing.stencil.Path=dojox.drawing.util.oo.declare(dojox.drawing.stencil._Base,function(_1){
+dojo.disconnect(this._postRenderCon);
+},{type:"dojox.drawing.stencil.Path",closePath:true,baseRender:true,closeRadius:10,closeColor:{r:255,g:255,b:0,a:0.5},_create:function(_2,_3){
+this.remove(this[_2]);
+if(!this.points.length){
+return;
+}
+if(dojox.gfx.renderer=="svg"){
+var _4=[];
+dojo.forEach(this.points,function(o,i){
+if(i==0){
+_4.push("M "+o.x+" "+o.y);
+}else{
+var _5=(o.t||"")+" ";
+if(o.x===undefined){
+_4.push(_5);
+}else{
+_4.push(_5+o.x+" "+o.y);
+}
+}
+},this);
+if(this.closePath){
+_4.push("Z");
+}
+this.stringPath=_4.join(" ");
+this[_2]=this.container.createPath(_4.join(" ")).setStroke(_3);
+this.closePath&&this[_2].setFill(_3.fill);
+}else{
+this[_2]=this.container.createPath({}).setStroke(_3);
+this.closePath&&this[_2].setFill(_3.fill);
+dojo.forEach(this.points,function(o,i){
+if(i==0||o.t=="M"){
+this[_2].moveTo(o.x,o.y);
+}else{
+if(o.t=="Z"){
+this.closePath&&this[_2].closePath();
+}else{
+this[_2].lineTo(o.x,o.y);
+}
+}
+},this);
+this.closePath&&this[_2].closePath();
+}
+this._setNodeAtts(this[_2]);
+},render:function(){
+this.onBeforeRender(this);
+this.renderHit&&this._create("hit",this.style.currentHit);
+this._create("shape",this.style.current);
+},getBounds:function(_6){
+var _7=10000,_8=10000,_9=0,_a=0;
+dojo.forEach(this.points,function(p){
+if(p.x!==undefined&&!isNaN(p.x)){
+_7=Math.min(_7,p.x);
+_8=Math.min(_8,p.y);
+_9=Math.max(_9,p.x);
+_a=Math.max(_a,p.y);
+}
+});
+return {x1:_7,y1:_8,x2:_9,y2:_a,x:_7,y:_8,w:_9-_7,h:_a-_8};
+},checkClosePoint:function(_b,_c,_d){
+var _e=this.util.distance(_b.x,_b.y,_c.x,_c.y);
+if(this.points.length>1){
+if(_e<this.closeRadius&&!this.closeGuide&&!_d){
+var c={cx:_b.x,cy:_b.y,rx:this.closeRadius,ry:this.closeRadius};
+this.closeGuide=this.container.createEllipse(c).setFill(this.closeColor);
+}else{
+if(_d||_e>this.closeRadius&&this.closeGuide){
+this.remove(this.closeGuide);
+this.closeGuide=null;
+}
+}
+}
+return _e<this.closeRadius;
+}});
+dojox.drawing.register({name:"dojox.drawing.stencil.Path"},"stencil");
+}
diff --git a/dojox/drawing/stencil/Rect.js b/dojox/drawing/stencil/Rect.js
new file mode 100644
index 0000000..0bbc711
--- /dev/null
+++ b/dojox/drawing/stencil/Rect.js
@@ -0,0 +1,34 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.stencil.Rect"]){
+dojo._hasResource["dojox.drawing.stencil.Rect"]=true;
+dojo.provide("dojox.drawing.stencil.Rect");
+dojox.drawing.stencil.Rect=dojox.drawing.util.oo.declare(dojox.drawing.stencil._Base,function(_1){
+if(this.points.length){
+}
+},{type:"dojox.drawing.stencil.Rect",anchorType:"group",baseRender:true,dataToPoints:function(d){
+d=d||this.data;
+this.points=[{x:d.x,y:d.y},{x:d.x+d.width,y:d.y},{x:d.x+d.width,y:d.y+d.height},{x:d.x,y:d.y+d.height}];
+return this.points;
+},pointsToData:function(p){
+p=p||this.points;
+var s=p[0];
+var e=p[2];
+this.data={x:s.x,y:s.y,width:e.x-s.x,height:e.y-s.y,r:this.data.r||0};
+return this.data;
+},_create:function(_2,d,_3){
+this.remove(this[_2]);
+this[_2]=this.container.createRect(d).setStroke(_3).setFill(_3.fill);
+this._setNodeAtts(this[_2]);
+},render:function(){
+this.onBeforeRender(this);
+this.renderHit&&this._create("hit",this.data,this.style.currentHit);
+this._create("shape",this.data,this.style.current);
+}});
+dojox.drawing.register({name:"dojox.drawing.stencil.Rect"},"stencil");
+}
diff --git a/dojox/drawing/stencil/Text.js b/dojox/drawing/stencil/Text.js
new file mode 100644
index 0000000..b220b27
--- /dev/null
+++ b/dojox/drawing/stencil/Text.js
@@ -0,0 +1,91 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.stencil.Text"]){
+dojo._hasResource["dojox.drawing.stencil.Text"]=true;
+dojo.provide("dojox.drawing.stencil.Text");
+dojox.drawing.stencil.Text=dojox.drawing.util.oo.declare(dojox.drawing.stencil._Base,function(_1){
+},{type:"dojox.drawing.stencil.Text",anchorType:"none",baseRender:true,align:"start",valign:"top",_lineHeight:1,setText:function(_2){
+this._text=_2;
+this._textArray=[];
+this.created&&this.render(_2);
+},getText:function(){
+return this._text;
+},dataToPoints:function(o){
+o=o||this.data;
+var w=o.width=="auto"?1:o.width;
+var h=o.height||this._lineHeight;
+this.points=[{x:o.x,y:o.y},{x:o.x+w,y:o.y},{x:o.x+w,y:o.y+h},{x:o.x,y:o.y+h}];
+return this.points;
+},pointsToData:function(p){
+p=p||this.points;
+var s=p[0];
+var e=p[2];
+this.data={x:s.x,y:s.y,width:e.x-s.x,height:e.y-s.y};
+return this.data;
+},render:function(_3){
+this.remove(this.shape,this.hit);
+!this.annotation&&this.renderHit&&this._renderOutline();
+if(_3){
+this._text=_3;
+this._textArray=this._text.split("\n");
+}
+var d=this.pointsToData();
+var w=d.width;
+var h=this._lineHeight;
+var x=d.x+this.style.text.pad*2;
+var y=d.y+this._lineHeight-(this.textSize*0.4);
+if(this.valign=="middle"){
+y-=h/2;
+}
+this.shape=this.container.createGroup();
+dojo.forEach(this._textArray,function(_4,i){
+var tb=this.shape.createText({x:x,y:y+(h*i),text:unescape(_4),align:this.align}).setFont(this.style.currentText).setFill(this.style.currentText.color);
+this._setNodeAtts(tb);
+},this);
+this._setNodeAtts(this.shape);
+},_renderOutline:function(){
+if(this.annotation){
+return;
+}
+var d=this.pointsToData();
+if(this.align=="middle"){
+d.x-=d.width/2-this.style.text.pad*2;
+}else{
+if(this.align=="start"){
+d.x+=this.style.text.pad;
+}else{
+if(this.align=="end"){
+d.x-=d.width-this.style.text.pad*3;
+}
+}
+}
+if(this.valign=="middle"){
+d.y-=(this._lineHeight)/2-this.style.text.pad;
+}
+this.hit=this.container.createRect(d).setStroke(this.style.currentHit).setFill(this.style.currentHit.fill);
+this._setNodeAtts(this.hit);
+this.hit.moveToBack();
+},makeFit:function(_5,w){
+var _6=dojo.create("span",{innerHTML:_5,id:"foo"},document.body);
+var sz=1;
+dojo.style(_6,"fontSize",sz+"px");
+var _7=30;
+while(dojo.marginBox(_6).w<w){
+sz++;
+dojo.style(_6,"fontSize",sz+"px");
+if(_7--<=0){
+break;
+}
+}
+sz--;
+var _8=dojo.marginBox(_6);
+dojo.destroy(_6);
+return {size:sz,box:_8};
+}});
+dojox.drawing.register({name:"dojox.drawing.stencil.Text"},"stencil");
+}
diff --git a/dojox/drawing/stencil/_Base.js b/dojox/drawing/stencil/_Base.js
new file mode 100644
index 0000000..1c6d723
--- /dev/null
+++ b/dojox/drawing/stencil/_Base.js
@@ -0,0 +1,569 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.stencil._Base"]){
+dojo._hasResource["dojox.drawing.stencil._Base"]=true;
+dojo.provide("dojox.drawing.stencil._Base");
+dojo.require("dojo.fx.easing");
+dojox.drawing.stencil._Base=dojox.drawing.util.oo.declare(function(_1){
+dojo.mixin(this,_1);
+this.style=_1.style||dojox.drawing.defaults.copy();
+if(_1.stencil){
+this.stencil=_1.stencil;
+this.util=_1.stencil.util;
+this.mouse=_1.stencil.mouse;
+this.container=_1.stencil.container;
+this.style=_1.stencil.style;
+}
+var _2=/Line|Vector|Axes|Arrow/;
+var _3=/Text/;
+this.shortType=this.util.abbr(this.type);
+this.isText=_3.test(this.type);
+this.isLine=_2.test(this.type);
+this.renderHit=this.style.renderHitLayer;
+if(!this.renderHit&&this.style.renderHitLines&&this.isLine){
+this.renderHit=true;
+}
+if(!this.renderHit&&this.style.useSelectedStyle){
+this.useSelectedStyle=true;
+this.selCopy=dojo.clone(this.style.selected);
+for(var nm in this.style.norm){
+if(this.style.selected[nm]===undefined){
+this.style.selected[nm]=this.style.norm[nm];
+}
+}
+this.textSelected=dojo.clone(this.style.text);
+this.textSelected.color=this.style.selected.fill;
+}
+this.angleSnap=this.style.angleSnap||1;
+this.marginZero=_1.marginZero||this.style.anchors.marginZero;
+this.id=_1.id||this.util.uid(this.type);
+this._cons=[];
+if(!this.annotation&&!this.subShape){
+this.util.attr(this.container,"id",this.id);
+}
+this.connect(this,"onBeforeRender","preventNegativePos");
+this._offX=this.mouse.origin.x;
+this._offY=this.mouse.origin.y;
+if(this.isText){
+this.align=_1.align||this.align;
+this.valign=_1.valign||this.valign;
+if(_1.data&&_1.data.makeFit){
+var _4=this.makeFit(_1.data.text,_1.data.width);
+this.textSize=this.style.text.size=_4.size;
+this._lineHeight=_4.box.h;
+}else{
+this.textSize=parseInt(this.style.text.size,10);
+this._lineHeight=this.textSize*1.4;
+}
+this.deleteEmptyCreate=_1.deleteEmptyCreate!==undefined?_1.deleteEmptyCreate:this.style.text.deleteEmptyCreate;
+this.deleteEmptyModify=_1.deleteEmptyModify!==undefined?_1.deleteEmptyModify:this.style.text.deleteEmptyModify;
+}
+this.attr(_1.data);
+if(this.noBaseRender){
+return;
+}
+if(_1.points){
+if(_1.data&&_1.data.closePath===false){
+this.closePath=false;
+}
+this.setPoints(_1.points);
+this.connect(this,"render",this,"onRender",true);
+this.baseRender&&this.enabled&&this.render();
+_1.label&&this.setLabel(_1.label);
+_1.shadow&&this.addShadow(_1.shadow);
+}else{
+if(_1.data){
+_1.data.width=_1.data.width?_1.data.width:this.style.text.minWidth;
+_1.data.height=_1.data.height?_1.data.height:this._lineHeight;
+this.setData(_1.data);
+this.connect(this,"render",this,"onRender",true);
+this.baseRender&&this.enabled&&this.render(_1.data.text);
+_1.label&&this.setLabel(_1.label);
+_1.shadow&&this.addShadow(_1.shadow);
+}else{
+if(this.draws){
+this.points=[];
+this.data={};
+this.connectMouse();
+this._postRenderCon=dojo.connect(this,"render",this,"_onPostRender");
+}
+}
+}
+if(this.showAngle){
+this.angleLabel=new dojox.drawing.annotations.Angle({stencil:this});
+}
+if(!this.enabled){
+this.disable();
+this.moveToBack();
+this.render(_1.data.text);
+}
+},{type:"dojox.drawing.stencil",minimumSize:10,enabled:true,drawingType:"stencil",setData:function(_5){
+this.data=_5;
+this.points=this.dataToPoints();
+},setPoints:function(_6){
+this.points=_6;
+if(this.pointsToData){
+this.data=this.pointsToData();
+}
+},onDelete:function(_7){
+},onBeforeRender:function(_8){
+},onModify:function(_9){
+},onChangeData:function(_a){
+},onChangeText:function(_b){
+},onRender:function(_c){
+this._postRenderCon=dojo.connect(this,"render",this,"_onPostRender");
+this.created=true;
+this.disconnectMouse();
+if(this.shape){
+this.shape.superClass=this;
+}else{
+this.container.superClass=this;
+}
+this._setNodeAtts(this);
+},onChangeStyle:function(_d){
+this._isBeingModified=true;
+if(!this.enabled){
+this.style.current=this.style.disabled;
+this.style.currentText=this.style.textDisabled;
+this.style.currentHit=this.style.hitNorm;
+}else{
+this.style.current=this.style.norm;
+this.style.currentHit=this.style.hitNorm;
+this.style.currentText=this.style.text;
+}
+if(this.selected){
+if(this.useSelectedStyle){
+this.style.current=this.style.selected;
+this.style.currentText=this.textSelected;
+}
+this.style.currentHit=this.style.hitSelected;
+}else{
+if(this.highlighted){
+this.style.currentHit=this.style.hitHighlighted;
+}
+}
+this.render();
+},animate:function(_e,_f){
+console.warn("ANIMATE..........................");
+var d=_e.d||_e.duration||1000;
+var ms=_e.ms||20;
+var _10=_e.ease||dojo.fx.easing.linear;
+var _11=_e.steps;
+var ts=new Date().getTime();
+var w=100;
+var cnt=0;
+var _12=true;
+var sp,ep;
+if(dojo.isArray(_e.start)){
+sp=_e.start;
+ep=_e.end;
+}else{
+if(dojo.isObject(_e.start)){
+sp=_e.start;
+ep=_e.end;
+_12=false;
+}else{
+console.warn("No data provided to animate");
+}
+}
+var v=setInterval(dojo.hitch(this,function(){
+var t=new Date().getTime()-ts;
+var p=_10(1-t/d);
+if(t>d||cnt++>100){
+clearInterval(v);
+return;
+}
+if(_12){
+var _13=[];
+dojo.forEach(sp,function(pt,i){
+var o={x:(ep[i].x-sp[i].x)*p+sp[i].x,y:(ep[i].y-sp[i].y)*p+sp[i].y};
+_13.push(o);
+});
+this.setPoints(_13);
+this.render();
+}else{
+var o={};
+for(var nm in sp){
+o[nm]=(ep[nm]-sp[nm])*p+sp[nm];
+}
+this.attr(o);
+}
+}),ms);
+},attr:function(key,_14){
+var n=this.style.norm,t=this.style.text,ts=this.textSelected||{},o,nm,_15,_16=dojo.toJson(n),_17=dojo.toJson(t);
+var _18={x:true,y:true,r:true,height:true,width:true,r:true,radius:true,angle:true};
+var _19=false;
+if(typeof (key)!="object"){
+o={};
+o[key]=_14;
+}else{
+o=dojo.clone(key);
+}
+if(o.width){
+_15=o.width;
+delete o.width;
+}
+for(nm in o){
+if(nm in n){
+n[nm]=o[nm];
+}
+if(nm in t){
+t[nm]=o[nm];
+}
+if(nm in ts){
+ts[nm]=o[nm];
+}
+if(nm in _18){
+_18[nm]=o[nm];
+_19=true;
+if(nm=="radius"&&o.angle===undefined){
+o.angle=_18.angle=this.getAngle();
+}else{
+if(nm=="angle"&&o.radius===undefined){
+o.radius=_18.radius=this.getRadius();
+}
+}
+}
+if(nm=="text"){
+this.setText(o.text);
+}
+if(nm=="label"){
+this.setLabel(o.label);
+}
+}
+if(o.borderWidth!==undefined){
+n.width=o.borderWidth;
+}
+if(this.useSelectedStyle){
+for(nm in this.style.norm){
+if(this.selCopy[nm]===undefined){
+this.style.selected[nm]=this.style.norm[nm];
+}
+}
+this.textSelected.color=this.style.selected.color;
+}
+if(!this.created){
+return;
+}
+if(o.x!==undefined||o.y!==undefined){
+var box=this.getBounds(true);
+var mx={dx:0,dy:0};
+for(nm in o){
+if(nm=="x"||nm=="y"||nm=="r"){
+mx["d"+nm]=o[nm]-box[nm];
+}
+}
+this.transformPoints(mx);
+}
+var p=this.points;
+if(o.angle!==undefined){
+this.dataToPoints({x:this.data.x1,y:this.data.y1,angle:o.angle,radius:o.radius});
+}else{
+if(_15!==undefined){
+p[1].x=p[2].x=p[0].x+_15;
+this.pointsToData(p);
+}
+}
+if(o.height!==undefined&&o.angle===undefined){
+p[2].y=p[3].y=p[0].y+o.height;
+this.pointsToData(p);
+}
+if(o.r!==undefined){
+this.data.r=Math.max(0,o.r);
+}
+if(_19||_17!=dojo.toJson(t)||_16!=dojo.toJson(n)){
+this.onChangeStyle(this);
+}
+o.width=_15;
+},exporter:function(){
+var _1a=this.type.substring(this.type.lastIndexOf(".")+1).charAt(0).toLowerCase()+this.type.substring(this.type.lastIndexOf(".")+2);
+var o=dojo.clone(this.style.norm);
+o.borderWidth=o.width;
+delete o.width;
+if(_1a=="path"){
+o.points=this.points;
+}else{
+o=dojo.mixin(o,this.data);
+}
+o.type=_1a;
+if(this.isText){
+o.text=this.getText();
+o=dojo.mixin(o,this.style.text);
+delete o.minWidth;
+delete o.deleteEmptyCreate;
+delete o.deleteEmptyModify;
+}
+var lbl=this.getLabel();
+if(lbl){
+o.label=lbl;
+}
+return o;
+},disable:function(){
+this.enabled=false;
+this.renderHit=false;
+this.onChangeStyle(this);
+},enable:function(){
+this.enabled=true;
+this.renderHit=true;
+this.onChangeStyle(this);
+},select:function(){
+this.selected=true;
+this.onChangeStyle(this);
+},deselect:function(_1b){
+if(_1b){
+setTimeout(dojo.hitch(this,function(){
+this.selected=false;
+this.onChangeStyle(this);
+}),200);
+}else{
+this.selected=false;
+this.onChangeStyle(this);
+}
+},_toggleSelected:function(){
+if(!this.selected){
+return;
+}
+this.deselect();
+setTimeout(dojo.hitch(this,"select"),0);
+},highlight:function(){
+this.highlighted=true;
+this.onChangeStyle(this);
+},unhighlight:function(){
+this.highlighted=false;
+this.onChangeStyle(this);
+},moveToFront:function(){
+this.container&&this.container.moveToFront();
+},moveToBack:function(){
+this.container&&this.container.moveToBack();
+},onTransformBegin:function(_1c){
+this._isBeingModified=true;
+},onTransformEnd:function(_1d){
+this._isBeingModified=false;
+this.onModify(this);
+},onTransform:function(_1e){
+if(!this._isBeingModified){
+this.onTransformBegin();
+}
+this.setPoints(this.points);
+this.render();
+},transformPoints:function(mx){
+if(!mx.dx&&!mx.dy){
+return;
+}
+var _1f=dojo.clone(this.points),_20=false;
+dojo.forEach(this.points,function(o){
+o.x+=mx.dx;
+o.y+=mx.dy;
+if(o.x<this.marginZero||o.y<this.marginZero){
+_20=true;
+}
+});
+if(_20){
+this.points=_1f;
+console.error("Attempt to set object '"+this.id+"' to less than zero.");
+return;
+}
+this.onTransform();
+this.onTransformEnd();
+},applyTransform:function(mx){
+this.transformPoints(mx);
+},setTransform:function(mx){
+this.attr({x:mx.dx,y:mx.dy});
+},getTransform:function(){
+return this.selected?this.container.getParent().getTransform():{dx:0,dy:0};
+},addShadow:function(_21){
+_21=_21===true?{}:_21;
+_21.stencil=this;
+this.shadow=new dojox.drawing.annotations.BoxShadow(_21);
+},removeShadow:function(){
+this.shadow.destroy();
+},setLabel:function(_22){
+if(!this._label){
+this._label=new dojox.drawing.annotations.Label({text:_22,util:this.util,mouse:this.mouse,stencil:this,annotation:true,container:this.container,labelPosition:this.labelPosition});
+}else{
+if(_22){
+this._label.setLabel(_22);
+}
+}
+},getLabel:function(){
+if(this._label){
+return this._label.getText();
+}
+return null;
+},getAngle:function(){
+var d=this.pointsToData();
+var obj={start:{x:d.x1,y:d.y1},x:d.x2,y:d.y2};
+var _23=this.util.angle(obj,this.angleSnap);
+_23=180-_23;
+_23=_23==360?0:_23;
+return _23;
+},getRadius:function(){
+var box=this.getBounds(true);
+var _24={start:{x:box.x1,y:box.y1},x:box.x2,y:box.y2};
+return this.util.length(_24);
+},getBounds:function(_25){
+var p=this.points,x1,y1,x2,y2;
+if(p.length==2){
+if(_25){
+x1=p[0].x;
+y1=p[0].y;
+x2=p[1].x;
+y2=p[1].y;
+}else{
+x1=p[0].x<p[1].x?p[0].x:p[1].x;
+y1=p[0].y<p[1].y?p[0].y:p[1].y;
+x2=p[0].x<p[1].x?p[1].x:p[0].x;
+y2=p[0].y<p[1].y?p[1].y:p[0].y;
+}
+return {x1:x1,y1:y1,x2:x2,y2:y2,x:x1,y:y1,w:x2-x1,h:y2-y1};
+}else{
+return {x1:p[0].x,y1:p[0].y,x2:p[2].x,y2:p[2].y,x:p[0].x,y:p[0].y,w:p[2].x-p[0].x,h:p[2].y-p[0].y};
+}
+},preventNegativePos:function(){
+if(this._isBeingModified){
+return;
+}
+if(!this.points||!this.points.length){
+return;
+}
+if(this.type=="dojox.drawing.tools.custom.Axes"){
+var _26=this.marginZero,_27=this.marginZero;
+dojo.forEach(this.points,function(p){
+_26=Math.min(p.y,_26);
+});
+dojo.forEach(this.points,function(p){
+_27=Math.min(p.x,_27);
+});
+if(_26<this.marginZero){
+dojo.forEach(this.points,function(p,i){
+p.y=p.y+(this.marginZero-_26);
+},this);
+}
+if(_27<this.marginZero){
+dojo.forEach(this.points,function(p){
+p.x+=(this.marginZero-_27);
+},this);
+}
+}else{
+dojo.forEach(this.points,function(p){
+p.x=p.x<0?this.marginZero:p.x;
+p.y=p.y<0?this.marginZero:p.y;
+});
+}
+this.setPoints(this.points);
+},_onPostRender:function(_28){
+if(this._isBeingModified){
+this.onModify(this);
+this._isBeingModified=false;
+}else{
+if(!this.created){
+}
+}
+if(!this.editMode&&!this.selected&&this._prevData&&dojo.toJson(this._prevData)!=dojo.toJson(this.data)){
+this.onChangeData(this);
+this._prevData=dojo.clone(this.data);
+}else{
+if(!this._prevData&&(!this.isText||this.getText())){
+this._prevData=dojo.clone(this.data);
+}
+}
+},_setNodeAtts:function(_29){
+var att=this.enabled&&!this.annotation?this.drawingType:"";
+this.util.attr(_29,"drawingType",att);
+},destroy:function(){
+if(this.destroyed){
+return;
+}
+if(this.data||this.points&&this.points.length){
+this.onDelete(this);
+}
+this.disconnectMouse();
+this.disconnect(this._cons);
+dojo.disconnect(this._postRenderCon);
+this.remove(this.shape,this.hit);
+this.destroyed=true;
+},remove:function(){
+var a=arguments;
+if(!a.length){
+if(!this.shape){
+return;
+}
+a=[this.shape];
+}
+for(var i=0;i<a.length;i++){
+if(a[i]){
+a[i].removeShape();
+}
+}
+},connectMult:function(){
+if(arguments.length>1){
+this._cons.push(this.connect.apply(this,arguments));
+}else{
+if(dojo.isArray(arguments[0][0])){
+dojo.forEach(arguments[0],function(ar){
+this._cons.push(this.connect.apply(this,ar));
+},this);
+}else{
+this._cons.push(this.connect.apply(this,arguments[0]));
+}
+}
+},connect:function(o,e,s,m,_2a){
+var c;
+if(typeof (o)!="object"){
+if(s){
+m=s;
+s=e;
+e=o;
+o=this;
+}else{
+m=e;
+e=o;
+o=s=this;
+}
+}else{
+if(!m){
+m=s;
+s=this;
+}else{
+if(_2a){
+c=dojo.connect(o,e,function(evt){
+dojo.hitch(s,m)(evt);
+dojo.disconnect(c);
+});
+this._cons.push(c);
+return c;
+}else{
+}
+}
+}
+c=dojo.connect(o,e,s,m);
+this._cons.push(c);
+return c;
+},disconnect:function(_2b){
+if(!_2b){
+return;
+}
+if(!dojo.isArray(_2b)){
+_2b=[_2b];
+}
+dojo.forEach(_2b,dojo.disconnect,dojo);
+},connectMouse:function(){
+this._mouseHandle=this.mouse.register(this);
+},disconnectMouse:function(){
+this.mouse.unregister(this._mouseHandle);
+},render:function(){
+},dataToPoints:function(_2c){
+},pointsToData:function(_2d){
+},onDown:function(obj){
+dojo.disconnect(this._postRenderCon);
+this._postRenderCon=null;
+},onMove:function(obj){
+},onDrag:function(obj){
+},onUp:function(obj){
+}});
+}
diff --git a/dojox/drawing/tools/Arrow.js b/dojox/drawing/tools/Arrow.js
new file mode 100644
index 0000000..718bb7b
--- /dev/null
+++ b/dojox/drawing/tools/Arrow.js
@@ -0,0 +1,38 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.tools.Arrow"]){
+dojo._hasResource["dojox.drawing.tools.Arrow"]=true;
+dojo.provide("dojox.drawing.tools.Arrow");
+dojox.drawing.tools.Arrow=dojox.drawing.util.oo.declare(dojox.drawing.tools.Line,function(_1){
+if(this.arrowStart){
+this.begArrow=new dojox.drawing.annotations.Arrow({stencil:this,idx1:0,idx2:1});
+}
+if(this.arrowEnd){
+this.endArrow=new dojox.drawing.annotations.Arrow({stencil:this,idx1:1,idx2:0});
+}
+if(this.points.length){
+this.render();
+}
+},{draws:true,type:"dojox.drawing.tools.Arrow",baseRender:false,arrowStart:false,arrowEnd:true,onUp:function(_2){
+if(this.created||!this.shape){
+return;
+}
+var p=this.points;
+var _3=this.util.distance(p[0].x,p[0].y,p[1].x,p[1].y);
+if(_3<this.minimumSize){
+this.remove(this.shape,this.hit);
+return;
+}
+var pt=this.util.snapAngle(_2,this.angleSnap/180);
+this.setPoints([{x:p[0].x,y:p[0].y},{x:pt.x,y:pt.y}]);
+this.renderedOnce=true;
+this.onRender(this);
+}});
+dojox.drawing.tools.Arrow.setup={name:"dojox.drawing.tools.Arrow",tooltip:"Arrow Tool",iconClass:"iconArrow"};
+dojox.drawing.register(dojox.drawing.tools.Arrow.setup,"tool");
+}
diff --git a/dojox/drawing/tools/Ellipse.js b/dojox/drawing/tools/Ellipse.js
new file mode 100644
index 0000000..90f2bdf
--- /dev/null
+++ b/dojox/drawing/tools/Ellipse.js
@@ -0,0 +1,46 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.tools.Ellipse"]){
+dojo._hasResource["dojox.drawing.tools.Ellipse"]=true;
+dojo.provide("dojox.drawing.tools.Ellipse");
+dojox.drawing.tools.Ellipse=dojox.drawing.util.oo.declare(dojox.drawing.stencil.Ellipse,function(){
+},{draws:true,onDrag:function(_1){
+var s=_1.start,e=_1;
+var x=s.x<e.x?s.x:e.x,y=s.y<e.y?s.y:e.y,w=s.x<e.x?e.x-s.x:s.x-e.x,h=s.y<e.y?e.y-s.y:s.y-e.y;
+if(this.keys.shift){
+w=h=Math.max(w,h);
+}
+if(!this.keys.alt){
+x+=w/2;
+y+=h/2;
+w/=2;
+h/=2;
+}else{
+if(y-h<0){
+h=y;
+}
+if(x-w<0){
+w=x;
+}
+}
+this.points=[{x:x-w,y:y-h},{x:x+w,y:y-h},{x:x+w,y:y+h},{x:x-w,y:y+h}];
+this.render();
+},onUp:function(_2){
+if(this.created||!this.shape){
+return;
+}
+var o=this.pointsToData();
+if(o.rx*2<this.minimumSize&&o.ry*2<this.minimumSize){
+this.remove(this.shape,this.hit);
+return;
+}
+this.onRender(this);
+}});
+dojox.drawing.tools.Ellipse.setup={name:"dojox.drawing.tools.Ellipse",tooltip:"Ellipse Tool",iconClass:"iconEllipse"};
+dojox.drawing.register(dojox.drawing.tools.Ellipse.setup,"tool");
+}
diff --git a/dojox/drawing/tools/Line.js b/dojox/drawing/tools/Line.js
new file mode 100644
index 0000000..c5516ad
--- /dev/null
+++ b/dojox/drawing/tools/Line.js
@@ -0,0 +1,61 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.tools.Line"]){
+dojo._hasResource["dojox.drawing.tools.Line"]=true;
+dojo.provide("dojox.drawing.tools.Line");
+dojox.drawing.tools.Line=dojox.drawing.util.oo.declare(dojox.drawing.stencil.Line,function(){
+},{draws:true,showAngle:true,onTransformEnd:function(_1){
+this._toggleSelected();
+if(this.getRadius()<this.minimumSize){
+var p=this.points;
+this.setPoints([{x:p[0].x,y:p[0].y},{x:p[0].x,y:p[0].y}]);
+}else{
+var d=this.data;
+var _2={start:{x:d.x1,y:d.y1},x:d.x2,y:d.y2};
+var pt=this.util.snapAngle(_2,this.angleSnap/180);
+this.setPoints([{x:d.x1,y:d.y1},{x:pt.x,y:pt.y}]);
+this._isBeingModified=false;
+this.onModify(this);
+}
+},onDrag:function(_3){
+if(this.created){
+return;
+}
+var x1=_3.start.x,y1=_3.start.y,x2=_3.x,y2=_3.y;
+if(this.keys.shift){
+var pt=this.util.snapAngle(_3,45/180);
+x2=pt.x;
+y2=pt.y;
+}
+if(this.keys.alt){
+var dx=x2>x1?((x2-x1)/2):((x1-x2)/-2);
+var dy=y2>y1?((y2-y1)/2):((y1-y2)/-2);
+x1-=dx;
+x2-=dx;
+y1-=dy;
+y2-=dy;
+}
+this.setPoints([{x:x1,y:y1},{x:x2,y:y2}]);
+this.render();
+},onUp:function(_4){
+if(this.created||!this.shape){
+return;
+}
+if(this.getRadius()<this.minimumSize){
+this.remove(this.shape,this.hit);
+return;
+}
+var pt=this.util.snapAngle(_4,this.angleSnap/180);
+var p=this.points;
+this.setPoints([{x:p[0].x,y:p[0].y},{x:pt.x,y:pt.y}]);
+this.renderedOnce=true;
+this.onRender(this);
+}});
+dojox.drawing.tools.Line.setup={name:"dojox.drawing.tools.Line",tooltip:"Line Tool",iconClass:"iconLine"};
+dojox.drawing.register(dojox.drawing.tools.Line.setup,"tool");
+}
diff --git a/dojox/drawing/tools/Path.js b/dojox/drawing/tools/Path.js
new file mode 100644
index 0000000..857531a
--- /dev/null
+++ b/dojox/drawing/tools/Path.js
@@ -0,0 +1,152 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.tools.Path"]){
+dojo._hasResource["dojox.drawing.tools.Path"]=true;
+dojo.provide("dojox.drawing.tools.Path");
+dojox.drawing.tools.Path=dojox.drawing.util.oo.declare(dojox.drawing.stencil.Path,function(){
+this.pathMode="";
+this.currentPathMode="";
+this._started=false;
+this.oddEvenClicks=0;
+},{draws:true,onDown:function(_1){
+if(!this._started){
+this.onStartPath(_1);
+}
+},makeSubPath:function(_2){
+if(_2){
+if(this.currentPathMode=="Q"){
+this.points.push({x:this.points[0].x,y:this.points[0].y});
+}
+this.points.push({t:"Z"});
+this.render();
+}
+this.currentPathMode="";
+this.pathMode="M";
+},onStartPath:function(_3){
+this._started=true;
+this.revertRenderHit=this.renderHit;
+this.renderHit=false;
+this.closePath=false;
+this.mouse.setEventMode("PathEdit");
+this.closePoint={x:_3.x,y:_3.y};
+this._kc1=this.connect(this.keys,"onEsc",this,function(){
+this.onCompletePath(false);
+});
+this._kc2=this.connect(this.keys,"onKeyUp",this,function(_4){
+switch(_4.letter){
+case "c":
+this.onCompletePath(true);
+break;
+case "l":
+this.pathMode="L";
+break;
+case "m":
+this.makeSubPath(false);
+break;
+case "q":
+this.pathMode="Q";
+break;
+case "s":
+this.pathMode="S";
+break;
+case "z":
+this.makeSubPath(true);
+break;
+}
+});
+},onCompletePath:function(_5){
+this.remove(this.closeGuide,this.guide);
+var _6=this.getBounds();
+if(_6.w<this.minimumSize&&_6.h<this.minimumSize){
+this.remove(this.hit,this.shape,this.closeGuide);
+this._started=false;
+this.mouse.setEventMode("");
+this.setPoints([]);
+return;
+}
+if(_5){
+if(this.currentPathMode=="Q"){
+this.points.push({x:this.points[0].x,y:this.points[0].y});
+}
+this.closePath=true;
+}
+this.renderHit=this.revertRenderHit;
+this.renderedOnce=true;
+this.onRender(this);
+this.disconnect([this._kc1,this._kc2]);
+this.mouse.setEventMode("");
+this.render();
+},onUp:function(_7){
+if(!this._started||!_7.withinCanvas){
+return;
+}
+if(this.points.length>2&&this.closeRadius>this.util.distance(_7.x,_7.y,this.closePoint.x,this.closePoint.y)){
+this.onCompletePath(true);
+}else{
+var p={x:_7.x,y:_7.y};
+this.oddEvenClicks++;
+if(this.currentPathMode!=this.pathMode){
+if(this.pathMode=="Q"){
+p.t="Q";
+this.oddEvenClicks=0;
+}else{
+if(this.pathMode=="L"){
+p.t="L";
+}else{
+if(this.pathMode=="M"){
+p.t="M";
+this.closePoint={x:_7.x,y:_7.y};
+}
+}
+}
+this.currentPathMode=this.pathMode;
+}
+this.points.push(p);
+if(this.points.length>1){
+this.remove(this.guide);
+this.render();
+}
+}
+},createGuide:function(_8){
+if(!this.points.length){
+return;
+}
+var _9=[].concat(this.points);
+var pt={x:_8.x,y:_8.y};
+if(this.currentPathMode=="Q"&&this.oddEvenClicks%2){
+pt.t="L";
+}
+this.points.push(pt);
+this.render();
+this.points=_9;
+var _a=this.util.distance(_8.x,_8.y,this.closePoint.x,this.closePoint.y);
+if(this.points.length>1){
+if(_a<this.closeRadius&&!this.closeGuide){
+var c={cx:this.closePoint.x,cy:this.closePoint.y,rx:this.closeRadius,ry:this.closeRadius};
+this.closeGuide=this.container.createEllipse(c).setFill(this.closeColor);
+}else{
+if(_a>this.closeRadius&&this.closeGuide){
+this.remove(this.closeGuide);
+this.closeGuide=null;
+}
+}
+}
+},onMove:function(_b){
+if(!this._started){
+return;
+}
+this.createGuide(_b);
+},onDrag:function(_c){
+if(!this._started){
+return;
+}
+this.createGuide(_c);
+}});
+dojox.drawing.tools.Path.setup={name:"dojox.drawing.tools.Path",tooltip:"Path Tool",iconClass:"iconLine"};
+dojox.drawing.register(dojox.drawing.tools.Path.setup,"tool");
+}
diff --git a/dojox/drawing/tools/Pencil.js b/dojox/drawing/tools/Pencil.js
new file mode 100644
index 0000000..59d95a8
--- /dev/null
+++ b/dojox/drawing/tools/Pencil.js
@@ -0,0 +1,56 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.tools.Pencil"]){
+dojo._hasResource["dojox.drawing.tools.Pencil"]=true;
+dojo.provide("dojox.drawing.tools.Pencil");
+dojox.drawing.tools.Pencil=dojox.drawing.util.oo.declare(dojox.drawing.stencil.Path,function(){
+this._started=false;
+},{draws:true,minDist:15,onDown:function(_1){
+this._started=true;
+var p={x:_1.x,y:_1.y};
+this.points=[p];
+this.lastPoint=p;
+this.revertRenderHit=this.renderHit;
+this.renderHit=false;
+this.closePath=false;
+},onDrag:function(_2){
+if(!this._started||this.minDist>this.util.distance(_2.x,_2.y,this.lastPoint.x,this.lastPoint.y)){
+return;
+}
+var p={x:_2.x,y:_2.y};
+this.points.push(p);
+this.render();
+this.checkClosePoint(this.points[0],_2);
+this.lastPoint=p;
+},onUp:function(_3){
+if(!this._started){
+return;
+}
+if(!this.points||this.points.length<2){
+this._started=false;
+this.points=[];
+return;
+}
+var _4=this.getBounds();
+if(_4.w<this.minimumSize&&_4.h<this.minimumSize){
+this.remove(this.hit,this.shape,this.closeGuide);
+this._started=false;
+this.setPoints([]);
+return;
+}
+if(this.checkClosePoint(this.points[0],_3,true)){
+this.closePath=true;
+}
+this.renderHit=this.revertRenderHit;
+this.renderedOnce=true;
+this.render();
+this.onRender(this);
+}});
+dojox.drawing.tools.Pencil.setup={name:"dojox.drawing.tools.Pencil",tooltip:"Pencil Tool",iconClass:"iconLine"};
+dojox.drawing.register(dojox.drawing.tools.Pencil.setup,"tool");
+}
diff --git a/dojox/drawing/tools/Rect.js b/dojox/drawing/tools/Rect.js
new file mode 100644
index 0000000..77920a1
--- /dev/null
+++ b/dojox/drawing/tools/Rect.js
@@ -0,0 +1,41 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.tools.Rect"]){
+dojo._hasResource["dojox.drawing.tools.Rect"]=true;
+dojo.provide("dojox.drawing.tools.Rect");
+dojox.drawing.tools.Rect=dojox.drawing.util.oo.declare(dojox.drawing.stencil.Rect,function(){
+},{draws:true,onDrag:function(_1){
+var s=_1.start,e=_1;
+var x=s.x<e.x?s.x:e.x,y=s.y<e.y?s.y:e.y,w=s.x<e.x?e.x-s.x:s.x-e.x,h=s.y<e.y?e.y-s.y:s.y-e.y;
+if(this.keys.shift){
+w=h=Math.max(w,h);
+}
+if(this.keys.alt){
+x-=w;
+y-=h;
+w*=2;
+h*=2;
+x=Math.max(x,0);
+y=Math.max(y,0);
+}
+this.setPoints([{x:x,y:y},{x:x+w,y:y},{x:x+w,y:y+h},{x:x,y:y+h}]);
+this.render();
+},onUp:function(_2){
+if(this.created||!this.shape){
+return;
+}
+var o=this.data;
+if(o.width<this.minimumSize&&o.height<this.minimumSize){
+this.remove(this.shape,this.hit);
+return;
+}
+this.onRender(this);
+}});
+dojox.drawing.tools.Rect.setup={name:"dojox.drawing.tools.Rect",tooltip:"<span class=\"drawingTipTitle\">Rectangle Tool</span><br/>"+"<span class=\"drawingTipDesc\">SHIFT - constrain to square</span>",iconClass:"iconRect"};
+dojox.drawing.register(dojox.drawing.tools.Rect.setup,"tool");
+}
diff --git a/dojox/drawing/tools/TextBlock.js b/dojox/drawing/tools/TextBlock.js
new file mode 100644
index 0000000..1492756
--- /dev/null
+++ b/dojox/drawing/tools/TextBlock.js
@@ -0,0 +1,385 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.tools.TextBlock"]){
+dojo._hasResource["dojox.drawing.tools.TextBlock"]=true;
+dojo.provide("dojox.drawing.tools.TextBlock");
+dojo.require("dojox.drawing.stencil.Text");
+(function(){
+var _1;
+dojo.addOnLoad(function(){
+_1=dojo.byId("conEdit");
+if(!_1){
+console.error("A contenteditable div is missing from the main document. See 'dojox.drawing.tools.TextBlock'");
+}else{
+_1.parentNode.removeChild(_1);
+}
+});
+dojox.drawing.tools.TextBlock=dojox.drawing.util.oo.declare(dojox.drawing.stencil.Text,function(_2){
+if(_2.data){
+var d=_2.data;
+var w=!d.width?this.style.text.minWidth:d.width=="auto"?"auto":Math.max(d.width,this.style.text.minWidth);
+var h=this._lineHeight;
+if(d.text&&w=="auto"){
+var o=this.measureText(this.cleanText(d.text,false),w);
+w=o.w;
+h=o.h;
+}else{
+this._text="";
+}
+this.points=[{x:d.x,y:d.y},{x:d.x+w,y:d.y},{x:d.x+w,y:d.y+h},{x:d.x,y:d.y+h}];
+if(d.showEmpty||d.text){
+this.editMode=true;
+dojo.disconnect(this._postRenderCon);
+this._postRenderCon=null;
+this.connect(this,"render",this,"onRender",true);
+if(d.showEmpty){
+this._text=d.text||"";
+this.edit();
+}else{
+if(d.text&&d.editMode){
+this._text="";
+this.edit();
+}else{
+if(d.text){
+this.render(d.text);
+}
+}
+}
+setTimeout(dojo.hitch(this,function(){
+this.editMode=false;
+}),100);
+}
+}else{
+this.connectMouse();
+this._postRenderCon=dojo.connect(this,"render",this,"_onPostRender");
+}
+},{draws:true,baseRender:false,type:"dojox.drawing.tools.TextBlock",selectOnExec:true,showEmpty:false,onDrag:function(_3){
+if(!this.parentNode){
+this.showParent(_3);
+}
+var s=this._startdrag,e=_3.page;
+this._box.left=(s.x<e.x?s.x:e.x);
+this._box.top=s.y;
+this._box.width=(s.x<e.x?e.x-s.x:s.x-e.x)+this.style.text.pad;
+dojo.style(this.parentNode,this._box.toPx());
+},onUp:function(_4){
+if(!this._downOnCanvas){
+return;
+}
+this._downOnCanvas=false;
+var c=dojo.connect(this,"render",this,function(){
+dojo.disconnect(c);
+this.onRender(this);
+});
+this.editMode=true;
+this.showParent(_4);
+this.created=true;
+this.createTextField();
+this.connectTextField();
+},showParent:function(_5){
+if(this.parentNode){
+return;
+}
+var x=_5.pageX||10;
+var y=_5.pageY||10;
+this.parentNode=dojo.doc.createElement("div");
+this.parentNode.id=this.id;
+var d=this.style.textMode.create;
+this._box={left:x,top:y,width:_5.width||1,height:_5.height&&_5.height>8?_5.height:this._lineHeight,border:d.width+"px "+d.style+" "+d.color,position:"absolute",zIndex:500,toPx:function(){
+var o={};
+for(var nm in this){
+o[nm]=typeof (this[nm])=="number"&&nm!="zIndex"?this[nm]+"px":this[nm];
+}
+return o;
+}};
+dojo.style(this.parentNode,this._box);
+document.body.appendChild(this.parentNode);
+},createTextField:function(_6){
+var d=this.style.textMode.edit;
+this._box.border=d.width+"px "+d.style+" "+d.color;
+this._box.height="auto";
+this._box.width=Math.max(this._box.width,this.style.text.minWidth*this.mouse.zoom);
+dojo.style(this.parentNode,this._box.toPx());
+this.parentNode.appendChild(_1);
+dojo.style(_1,{height:_6?"auto":this._lineHeight+"px",fontSize:(this.textSize/this.mouse.zoom)+"px",fontFamily:this.style.text.family});
+_1.innerHTML=_6||"";
+return _1;
+},connectTextField:function(){
+if(this._textConnected){
+return;
+}
+this._textConnected=true;
+this.mouse.setEventMode("TEXT");
+this.keys.editMode(true);
+var _7,_8,_9,_a,_b=this,_c=false,_d=function(){
+dojo.forEach([_7,_8,_9,_a],function(c){
+dojo.disconnect(c);
+});
+_b._textConnected=false;
+_b.keys.editMode(false);
+_b.mouse.setEventMode();
+_b.execText();
+};
+_7=dojo.connect(_1,"keyup",this,function(_e){
+if(dojo.trim(_1.innerHTML)&&!_c){
+dojo.style(_1,"height","auto");
+_c=true;
+}else{
+if(dojo.trim(_1.innerHTML).length<2&&_c){
+dojo.style(_1,"height",this._lineHeight+"px");
+_c=false;
+}
+}
+if(_e.keyCode==13||_e.keyCode==27){
+dojo.stopEvent(_e);
+_d();
+}
+});
+_8=dojo.connect(_1,"keydown",this,function(_f){
+if(_f.keyCode==13||_f.keyCode==27){
+dojo.stopEvent(_f);
+}
+});
+_9=dojo.connect(document,"mouseup",this,function(evt){
+if(!this._onAnchor&&evt.target.id!="conEdit"){
+dojo.stopEvent(evt);
+_d();
+}else{
+_1.blur();
+setTimeout(function(){
+_1.focus();
+},200);
+}
+});
+this.createAnchors();
+_a=dojo.connect(this.mouse,"setZoom",this,function(evt){
+_d();
+});
+_1.focus();
+this.onDown=function(){
+};
+this.onDrag=function(){
+};
+var _b=this;
+setTimeout(dojo.hitch(this,function(){
+_1.focus();
+this.onUp=function(){
+if(!_b._onAnchor&&this.parentNode){
+_b.disconnectMouse();
+_d();
+_b.onUp=function(){
+};
+}
+};
+}),500);
+},execText:function(){
+var d=dojo.marginBox(this.parentNode);
+var w=Math.max(d.w,this.style.text.minWidth);
+var txt=this.cleanText(_1.innerHTML,true);
+_1.innerHTML="";
+_1.blur();
+this.destroyAnchors();
+var o=this.measureText(txt,w);
+var sc=this.mouse.scrollOffset();
+var org=this.mouse.origin;
+var x=this._box.left+sc.left-org.x;
+var y=this._box.top+sc.top-org.y;
+x*=this.mouse.zoom;
+y*=this.mouse.zoom;
+w*=this.mouse.zoom;
+o.h*=this.mouse.zoom;
+this.points=[{x:x,y:y},{x:x+w,y:y},{x:x+w,y:y+o.h},{x:x,y:y+o.h}];
+this.editMode=false;
+if(!o.text){
+this._text="";
+this._textArray=[];
+}
+this.render(o.text);
+this.onChangeText(txt);
+},edit:function(){
+this.editMode=true;
+if(this.parentNode||!this.points){
+return;
+}
+var d=this.pointsToData();
+var sc=this.mouse.scrollOffset();
+var org=this.mouse.origin;
+var obj={pageX:(d.x)/this.mouse.zoom-sc.left+org.x,pageY:(d.y)/this.mouse.zoom-sc.top+org.y,width:d.width/this.mouse.zoom,height:d.height/this.mouse.zoom};
+this.remove(this.shape,this.hit);
+this.showParent(obj);
+this.createTextField(this._text.replace("/n"," "));
+this.connectTextField();
+if(this._text){
+this.setSelection(_1,"end");
+}
+},cleanText:function(txt,_10){
+var _11=function(str){
+var _12={"<":"<",">":">","&":"&"};
+for(var nm in _12){
+str=str.replace(new RegExp(nm,"gi"),_12[nm]);
+}
+return str;
+};
+if(_10){
+dojo.forEach(["<br>","<br/>","<br />","\\n","\\r"],function(br){
+txt=txt.replace(new RegExp(br,"gi")," ");
+});
+}
+txt=txt.replace(/ /g," ");
+txt=_11(txt);
+txt=dojo.trim(txt);
+txt=txt.replace(/\s{2,}/g," ");
+return txt;
+},measureText:function(str,_13){
+var r="(<br\\s*/*>)|(\\n)|(\\r)";
+this.showParent({width:_13||"auto",height:"auto"});
+this.createTextField(str);
+var txt="";
+var el=_1;
+el.innerHTML="X";
+var h=dojo.marginBox(el).h;
+el.innerHTML=str;
+if(!_13||new RegExp(r,"gi").test(str)){
+txt=str.replace(new RegExp(r,"gi"),"\n");
+el.innerHTML=str.replace(new RegExp(r,"gi"),"<br/>");
+}else{
+if(dojo.marginBox(el).h==h){
+txt=str;
+}else{
+var ar=str.split(" ");
+var _14=[[]];
+var _15=0;
+el.innerHTML="";
+while(ar.length){
+var _16=ar.shift();
+el.innerHTML+=_16+" ";
+if(dojo.marginBox(el).h>h){
+_15++;
+_14[_15]=[];
+el.innerHTML=_16+" ";
+}
+_14[_15].push(_16);
+}
+dojo.forEach(_14,function(ar,i){
+_14[i]=ar.join(" ");
+});
+txt=_14.join("\n");
+el.innerHTML=txt.replace("\n","<br/>");
+}
+}
+var dim=dojo.marginBox(el);
+_1.parentNode.removeChild(_1);
+dojo.destroy(this.parentNode);
+this.parentNode=null;
+return {h:dim.h,w:dim.w,text:txt};
+},_downOnCanvas:false,onDown:function(obj){
+this._startdrag={x:obj.pageX,y:obj.pageY};
+dojo.disconnect(this._postRenderCon);
+this._postRenderCon=null;
+this._downOnCanvas=true;
+},createAnchors:function(){
+this._anchors={};
+var _17=this;
+var d=this.style.anchors,b=d.width,w=d.size-b*2,h=d.size-b*2,p=(d.size)/2*-1+"px";
+var s={position:"absolute",width:w+"px",height:h+"px",backgroundColor:d.fill,border:b+"px "+d.style+" "+d.color};
+if(dojo.isIE){
+s.paddingLeft=w+"px";
+s.fontSize=w+"px";
+}
+var ss=[{top:p,left:p},{top:p,right:p},{bottom:p,right:p},{bottom:p,left:p}];
+for(var i=0;i<4;i++){
+var _18=(i==0)||(i==3);
+var id=this.util.uid(_18?"left_anchor":"right_anchor");
+var a=dojo.create("div",{id:id},this.parentNode);
+dojo.style(a,dojo.mixin(dojo.clone(s),ss[i]));
+var md,mm,mu;
+var md=dojo.connect(a,"mousedown",this,function(evt){
+_18=evt.target.id.indexOf("left")>-1;
+_17._onAnchor=true;
+var _19=evt.pageX;
+var _1a=this._box.width;
+dojo.stopEvent(evt);
+mm=dojo.connect(document,"mousemove",this,function(evt){
+var x=evt.pageX;
+if(_18){
+this._box.left=x;
+this._box.width=_1a+_19-x;
+}else{
+this._box.width=x+_1a-_19;
+}
+dojo.style(this.parentNode,this._box.toPx());
+});
+mu=dojo.connect(document,"mouseup",this,function(evt){
+_19=this._box.left;
+_1a=this._box.width;
+dojo.disconnect(mm);
+dojo.disconnect(mu);
+_17._onAnchor=false;
+_1.focus();
+dojo.stopEvent(evt);
+});
+});
+this._anchors[id]={a:a,cons:[md]};
+}
+},destroyAnchors:function(){
+for(var n in this._anchors){
+dojo.forEach(this._anchors[n].con,dojo.disconnect,dojo);
+dojo.destroy(this._anchors[n].a);
+}
+},setSelection:function(_1b,_1c){
+console.warn("setSelection:");
+if(dojo.doc.selection){
+var r=dojo.body().createTextRange();
+r.moveToElementText(_1b);
+r.collapse(false);
+r.select();
+}else{
+var _1d=function(_1e,_1f){
+_1f=_1f||[];
+for(var i=0;i<_1e.childNodes.length;i++){
+var n=_1e.childNodes[i];
+if(n.nodeType==3){
+_1f.push(n);
+}else{
+if(n.tagName&&n.tagName.toLowerCase()=="img"){
+_1f.push(n);
+}
+}
+if(n.childNodes&&n.childNodes.length){
+_1d(n,_1f);
+}
+}
+return _1f;
+};
+_1b.focus();
+var _20=dojo.global.getSelection();
+_20.removeAllRanges();
+var r=dojo.doc.createRange();
+r.selectNodeContents(_1b);
+var _21=_1d(_1b);
+if(_1c=="end"){
+r.setStart(_21[_21.length-1],_21[_21.length-1].textContent.length);
+r.setEnd(_21[_21.length-1],_21[_21.length-1].textContent.length);
+}else{
+if(_1c=="beg"||_1c=="start"){
+r.setStart(_21[0],0);
+r.setEnd(_21[0],0);
+}else{
+if(_1c=="all"){
+r.setStart(_21[0],0);
+r.setEnd(_21[_21.length-1],_21[_21.length-1].textContent.length);
+}
+}
+}
+_20.addRange(r);
+}
+}});
+dojox.drawing.tools.TextBlock.setup={name:"dojox.drawing.tools.TextBlock",tooltip:"Text Tool",iconClass:"iconText"};
+dojox.drawing.register(dojox.drawing.tools.TextBlock.setup,"tool");
+})();
+}
diff --git a/dojox/drawing/tools/custom/Axes.js b/dojox/drawing/tools/custom/Axes.js
new file mode 100644
index 0000000..9b58912
--- /dev/null
+++ b/dojox/drawing/tools/custom/Axes.js
@@ -0,0 +1,204 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.tools.custom.Axes"]){
+dojo._hasResource["dojox.drawing.tools.custom.Axes"]=true;
+dojo.provide("dojox.drawing.tools.custom.Axes");
+dojo.require("dojox.drawing.stencil.Path");
+dojox.drawing.tools.custom.Axes=dojox.drawing.util.oo.declare(dojox.drawing.stencil.Path,function(_1){
+this.closePath=false;
+this.xArrow=new dojox.drawing.annotations.Arrow({stencil:this,idx1:0,idx2:1});
+this.yArrow=new dojox.drawing.annotations.Arrow({stencil:this,idx1:2,idx2:1});
+if(this.points&&this.points.length){
+this.setPoints=this._postSetPoints;
+this.render();
+this.onRender();
+}
+},{draws:true,type:"dojox.drawing.tools.custom.Axes",minimumSize:30,showAngle:true,closePath:false,baseRender:false,createLabels:function(){
+var _2={align:"middle",valign:"middle",util:this.util,annotation:true,container:this.container,mouse:this.mouse,stencil:this};
+this.labelX=new dojox.drawing.annotations.Label(dojo.mixin(_2,{labelPosition:this.setLabelX}));
+this.labelY=new dojox.drawing.annotations.Label(dojo.mixin(_2,{labelPosition:this.setLabelY}));
+},setLabelX:function(){
+var ax=this.points[0];
+var c=this.points[1];
+var ay=this.points[2];
+var _3=40;
+var _4=20;
+var pt,px,py,_5;
+pt=this.util.lineSub(c.x,c.y,ax.x,ax.y,_3);
+px=pt.x+(pt.y-ax.y);
+py=pt.y+(ax.x-pt.x);
+_5=this.util.lineSub(pt.x,pt.y,px,py,(_3-_4));
+return {x:_5.x,y:_5.y,width:20};
+},setLabelY:function(){
+var ax=this.points[0];
+var c=this.points[1];
+var ay=this.points[2];
+var _6=40;
+var _7=20;
+var pt,px,py,_8;
+pt=this.util.lineSub(c.x,c.y,ay.x,ay.y,_6);
+px=pt.x+(ay.y-pt.y);
+py=pt.y+(pt.x-ay.x);
+_8=this.util.lineSub(pt.x,pt.y,px,py,(_6-_7));
+_8=this.util.lineSub(pt.x,pt.y,px,py,(_6-_7));
+return {x:_8.x,y:_8.y,width:20};
+},setLabel:function(_9){
+if(this._labelsCreated){
+return;
+}
+!this.labelX&&this.createLabels();
+var x="x";
+var y="y";
+if(_9){
+_9.replace(/^\s+/,"");
+_9.replace(/\s+$/,"");
+var _a=_9.match(/(.*?)(and|&)(.*)/i);
+if(_a.length>2){
+x=_a[1].replace(/\s+$/,"");
+y=_a[3].replace(/^\s+/,"");
+}
+}
+this.labelX.setLabel(x);
+this.labelY.setLabel(y);
+this._labelsCreated=true;
+},getLabel:function(){
+if(!this.labelX){
+return {};
+}
+return {x:this.labelX._text,y:this.labelY._text};
+},anchorPositionCheck:function(x,y,_b){
+var pm=this.container.getParent().getTransform();
+var am=_b.shape.getTransform();
+var p=this.points;
+var o={x:am.dx+_b.org.x+pm.dx,y:am.dy+_b.org.y+pm.dy};
+var c={x:p[1].x+pm.dx,y:p[1].y+pm.dy};
+var ox=c.x-(c.y-o.y);
+var oy=c.y-(o.x-c.x);
+return {x:ox,y:oy};
+},onTransformBegin:function(_c){
+this._isBeingModified=true;
+},onTransformEnd:function(_d){
+if(!_d){
+return;
+}
+this._isBeingModified=false;
+this._toggleSelected();
+var o=this.points[0];
+var c=this.points[1];
+var pt=this.util.constrainAngle({start:{x:c.x,y:c.y},x:o.x,y:o.y},91,180);
+if(pt.x==o.x&&pt.y==o.y){
+var _e={start:{x:c.x,y:c.y},x:o.x,y:o.y};
+pt=this.util.snapAngle(_e,this.angleSnap/180);
+_e.x=pt.x;
+_e.y=pt.y;
+var ox=_e.start.x-(_e.start.y-_e.y);
+var oy=_e.start.y-(_e.x-_e.start.x);
+if(ox<0||oy<0){
+console.warn("AXES ERROR LESS THAN ZERO - ABORT");
+return;
+}
+this.points=[{x:_e.x,y:_e.y},{x:_e.start.x,y:_e.start.y,noAnchor:true}];
+this.points.push({x:ox,y:oy,noAnchor:true});
+this.setPoints(this.points);
+this.onModify(this);
+return;
+}
+this.points[0].x=pt.x;
+this.points[0].y=pt.y;
+o=this.points[0];
+var ox=c.x-(c.y-o.y);
+var oy=c.y-(o.x-c.x);
+this.points[2]={x:ox,y:oy,noAnchor:true};
+this.setPoints(this.points);
+this.labelX.setLabel();
+this.labelY.setLabel();
+this.onModify(this);
+},getBounds:function(_f){
+var px=this.points[0],pc=this.points[1],py=this.points[2];
+if(_f){
+return {x:pc.x,y:pc.y,x1:pc.x,y1:pc.y,x2:px.x,y2:px.y,x3:py.x,y3:py.y};
+}
+var x1=py.x,y1=py.y<px.y?py.y:px.y,x2=px.x,y2=pc.y;
+return {x1:x1,y1:y1,x2:x2,y2:y2,x:x1,y:y1,w:x2-x1,h:y2-y1};
+},_postSetPoints:function(pts){
+this.points[0]=pts[0];
+if(this.pointsToData){
+this.data=this.pointsToData();
+}
+},onTransform:function(_10){
+var o=this.points[0];
+var c=this.points[1];
+var ox=c.x-(c.y-o.y);
+var oy=c.y-(o.x-c.x);
+this.points[2]={x:ox,y:oy,noAnchor:true};
+this.setPoints(this.points);
+if(!this._isBeingModified){
+this.onTransformBegin();
+}
+this.render();
+},pointsToData:function(){
+var p=this.points;
+return {x1:p[1].x,y1:p[1].y,x2:p[0].x,y2:p[0].y,x3:p[2].x,y3:p[2].y};
+},dataToPoints:function(o){
+o=o||this.data;
+if(o.radius||o.angle){
+o.angle=(180-o.angle)<0?180-o.angle+360:180-o.angle;
+var pt=this.util.pointOnCircle(o.x,o.y,o.radius,o.angle);
+var ox=o.x-(o.y-pt.y);
+var oy=o.y-(pt.x-o.x);
+this.data=o={x2:o.x,y2:o.y,x1:pt.x,y1:pt.y,x3:ox,y3:oy};
+}
+this.points=[{x:o.x1,y:o.y1},{x:o.x2,y:o.y2,noAnchor:true},{x:o.x3,y:o.y3,noAnchor:true}];
+return this.points;
+},onDrag:function(obj){
+var pt=this.util.constrainAngle(obj,91,180);
+obj.x=pt.x;
+obj.y=pt.y;
+var ox=obj.start.x-(obj.start.y-obj.y);
+var oy=obj.start.y-(obj.x-obj.start.x);
+if(ox<0||oy<0){
+return;
+}
+this.points=[{x:obj.x,y:obj.y},{x:obj.start.x,y:obj.start.y,noAnchor:true}];
+this.points.push({x:ox,y:oy,noAnchor:true});
+this.render();
+},onUp:function(obj){
+var p=this.points;
+if(!p.length){
+return;
+}
+var len=this.util.distance(p[1].x,p[1].y,p[0].x,p[0].y);
+if(!p||!p.length){
+return;
+}else{
+if(len<this.minimumSize){
+this.remove(this.shape,this.hit);
+this.xArrow.remove(this.xArrow.shape,this.xArrow.hit);
+this.yArrow.remove(this.yArrow.shape,this.yArrow.hit);
+return;
+}
+}
+var o=p[0];
+var c=p[1];
+obj={start:{x:c.x,y:c.y},x:o.x,y:o.y};
+var pt=this.util.snapAngle(obj,this.angleSnap/180);
+obj.x=pt.x;
+obj.y=pt.y;
+var ox=obj.start.x-(obj.start.y-obj.y);
+var oy=obj.start.y-(obj.x-obj.start.x);
+if(ox<0||oy<0){
+return;
+}
+this.points=[{x:obj.x,y:obj.y},{x:obj.start.x,y:obj.start.y,noAnchor:true}];
+this.points.push({x:ox,y:oy,noAnchor:true});
+this.onRender(this);
+this.setPoints=this._postSetPoints;
+}});
+dojox.drawing.tools.custom.Axes.setup={name:"dojox.drawing.tools.custom.Axes",tooltip:"Axes Tool",iconClass:"iconAxes"};
+dojox.drawing.register(dojox.drawing.tools.custom.Axes.setup,"tool");
+}
diff --git a/dojox/drawing/tools/custom/Equation.js b/dojox/drawing/tools/custom/Equation.js
new file mode 100644
index 0000000..6e0dac5
--- /dev/null
+++ b/dojox/drawing/tools/custom/Equation.js
@@ -0,0 +1,16 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.tools.custom.Equation"]){
+dojo._hasResource["dojox.drawing.tools.custom.Equation"]=true;
+dojo.provide("dojox.drawing.tools.custom.Equation");
+dojo.require("dojox.drawing.tools.TextBlock");
+dojox.drawing.tools.custom.Equation=dojox.drawing.util.oo.declare(dojox.drawing.tools.TextBlock,function(_1){
+},{customType:"equation"});
+dojox.drawing.tools.custom.Equation.setup={name:"dojox.drawing.tools.custom.Equation",tooltip:"Equation Tool",iconClass:"iconEq"};
+dojox.drawing.register(dojox.drawing.tools.custom.Equation.setup,"tool");
+}
diff --git a/dojox/drawing/tools/custom/Vector.js b/dojox/drawing/tools/custom/Vector.js
new file mode 100644
index 0000000..6b47205
--- /dev/null
+++ b/dojox/drawing/tools/custom/Vector.js
@@ -0,0 +1,52 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.tools.custom.Vector"]){
+dojo._hasResource["dojox.drawing.tools.custom.Vector"]=true;
+dojo.provide("dojox.drawing.tools.custom.Vector");
+dojo.require("dojox.drawing.tools.Arrow");
+dojo.require("dojox.drawing.util.positioning");
+dojox.drawing.tools.custom.Vector=dojox.drawing.util.oo.declare(dojox.drawing.tools.Arrow,function(_1){
+this.minimumSize=this.style.arrows.length;
+},{draws:true,type:"dojox.drawing.tools.custom.Vector",minimumSize:30,showAngle:true,labelPosition:function(){
+var d=this.data;
+var pt=dojox.drawing.util.positioning.label({x:d.x1,y:d.y1},{x:d.x2,y:d.y2});
+return {x:pt.x,y:pt.y};
+},_createZeroVector:function(_2,d,_3){
+var s=_2=="hit"?this.minimumSize:this.minimumSize/2;
+var f=_2=="hit"?_3.fill:null;
+d={cx:this.data.x1,cy:this.data.y1,rx:s,ry:s};
+this.remove(this[_2]);
+this[_2]=this.container.createEllipse(d).setStroke(_3).setFill(f);
+this.util.attr(this[_2],"drawingType","stencil");
+},render:function(){
+this.onBeforeRender(this);
+if(this.getRadius()>=this.minimumSize){
+this._create("hit",this.data,this.style.currentHit);
+this._create("shape",this.data,this.style.current);
+}else{
+this._createZeroVector("hit",this.data,this.style.currentHit);
+this._createZeroVector("shape",this.data,this.style.current);
+}
+},onUp:function(_4){
+if(this.created||!this.shape){
+return;
+}
+if(this.getRadius()<this.minimumSize){
+var p=this.points;
+this.setPoints([{x:p[0].x,y:p[0].y},{x:p[0].x,y:p[0].y}]);
+}else{
+var pt=this.util.snapAngle(_4,this.angleSnap/180);
+var p=this.points;
+this.setPoints([{x:p[0].x,y:p[0].y},{x:pt.x,y:pt.y}]);
+}
+this.renderedOnce=true;
+this.onRender(this);
+}});
+dojox.drawing.tools.custom.Vector.setup={name:"dojox.drawing.tools.custom.Vector",tooltip:"Vector Tool",iconClass:"iconVector"};
+dojox.drawing.register(dojox.drawing.tools.custom.Vector.setup,"tool");
+}
diff --git a/dojox/drawing/ui/Button.js b/dojox/drawing/ui/Button.js
new file mode 100644
index 0000000..487741d
--- /dev/null
+++ b/dojox/drawing/ui/Button.js
@@ -0,0 +1,140 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.ui.Button"]){
+dojo._hasResource["dojox.drawing.ui.Button"]=true;
+dojo.provide("dojox.drawing.ui.Button");
+dojox.drawing.ui.Button=dojox.drawing.util.oo.declare(function(_1){
+_1.subShape=true;
+dojo.mixin(this,_1);
+this.width=_1.data.width;
+this.height=_1.data.height;
+this.id=this.id||this.util.uid(this.type);
+this.util.attr(this.container,"id",this.id);
+if(this.callback){
+this.hitched=dojo.hitch(this.scope||window,this.callback,this);
+}
+this.shape=new dojox.drawing.stencil.Rect(_1);
+var _2=function(s,p,v){
+dojo.forEach(["norm","over","down","selected"],function(nm){
+s[nm].fill[p]=v;
+});
+};
+_2(this.style.button,"y2",this.data.height+this.data.y);
+_2(this.style.button,"y1",this.data.y);
+if(_1.icon&&!_1.icon.text){
+var _3=this.drawing.getConstructor(_1.icon.type);
+var o=this.makeOptions(_1.icon);
+o.data=dojo.mixin(o.data,this.style.button.icon.norm);
+if(o.data&&o.data.borderWidth===0){
+o.data.fill=this.style.button.icon.norm.fill=o.data.color;
+}else{
+if(_1.icon.type=="line"||(_1.icon.type=="path"&&!_1.icon.closePath)){
+this.style.button.icon.selected.color=this.style.button.icon.selected.fill;
+}else{
+}
+}
+this.icon=new _3(o);
+}else{
+if(_1.text||_1.icon.text){
+var o=this.makeOptions(_1.text||_1.icon.text);
+o.data.color=this.style.button.icon.norm.color;
+this.style.button.icon.selected.color=this.style.button.icon.selected.fill;
+this.icon=new dojox.drawing.stencil.Text(o);
+this.icon.attr({height:this.icon._lineHeight,y:((this.data.height-this.icon._lineHeight)/2)+this.data.y});
+}
+}
+var c=this.drawing.getConstructor(this.toolType);
+if(c){
+this.drawing.addUI("tooltip",{data:{text:c.setup.tooltip},button:this});
+}
+this.onOut();
+},{callback:null,scope:null,hitched:null,toolType:"",onClick:function(_4){
+},makeOptions:function(d,s){
+s=s||1;
+d=dojo.clone(d);
+var o={util:this.util,mouse:this.mouse,container:this.container,subShape:true};
+if(typeof (d)=="string"){
+o.data={x:this.data.x-5,y:this.data.y+2,width:this.data.width,height:this.data.height,text:d,makeFit:true};
+}else{
+if(d.points){
+dojo.forEach(d.points,function(pt){
+pt.x=pt.x*this.data.width*0.01*s+this.data.x;
+pt.y=pt.y*this.data.height*0.01*s+this.data.y;
+},this);
+o.data={};
+for(var n in d){
+if(n!="points"){
+o.data[n]=d[n];
+}
+}
+o.points=d.points;
+}else{
+for(var n in d){
+if(/x|width/.test(n)){
+d[n]=d[n]*this.data.width*0.01*s;
+}else{
+if(/y|height/.test(n)){
+d[n]=d[n]*this.data.height*0.01*s;
+}
+}
+if(/x/.test(n)&&!/r/.test(n)){
+d[n]+=this.data.x;
+}else{
+if(/y/.test(n)&&!/r/.test(n)){
+d[n]+=this.data.y;
+}
+}
+}
+delete d.type;
+o.data=d;
+}
+}
+o.drawingType="ui";
+return o;
+if(d.borderWidth!==undefined){
+o.data.borderWidth=d.borderWidth;
+}
+return o;
+},enabled:true,selected:false,type:"drawing.library.UI.Button",select:function(){
+this.selected=true;
+this.icon.attr(this.style.button.icon.selected);
+this._change(this.style.button.selected);
+this.shape.shadow&&this.shape.shadow.hide();
+},deselect:function(){
+this.selected=false;
+this.icon.attr(this.style.button.icon.norm);
+this.shape.shadow&&this.shape.shadow.show();
+this._change(this.style.button.norm);
+},_change:function(_5){
+this.shape.attr(_5);
+this.shape.shadow&&this.shape.shadow.container.moveToBack();
+this.icon.shape.moveToFront();
+},onOver:function(){
+if(this.selected){
+return;
+}
+this._change(this.style.button.over);
+},onOut:function(){
+if(this.selected){
+return;
+}
+this._change(this.style.button.norm);
+},onDown:function(){
+if(this.selected){
+return;
+}
+this._change(this.style.button.selected);
+},onUp:function(){
+this._change(this.style.button.over);
+if(this.hitched){
+this.hitched();
+}
+this.onClick(this);
+}});
+dojox.drawing.register({name:"dojox.drawing.ui.Button"},"stencil");
+}
diff --git a/dojox/drawing/ui/Toolbar.js b/dojox/drawing/ui/Toolbar.js
new file mode 100644
index 0000000..5b65af8
--- /dev/null
+++ b/dojox/drawing/ui/Toolbar.js
@@ -0,0 +1,123 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.ui.Toolbar"]){
+dojo._hasResource["dojox.drawing.ui.Toolbar"]=true;
+dojo.provide("dojox.drawing.ui.Toolbar");
+dojo.require("dojox.drawing.library.icons");
+dojo.declare("dojox.drawing.ui.Toolbar",[],{constructor:function(_1,_2){
+this.util=dojox.drawing.util.common;
+if(_1.drawing){
+this.toolDrawing=_1.drawing;
+this.drawing=this.toolDrawing;
+this.width=this.toolDrawing.width;
+this.height=this.toolDrawing.height;
+this.strSelected=_1.selected;
+this.strTools=_1.tools;
+this.strPlugs=_1.plugs;
+this._mixprops(["padding","margin","size","radius"],_1);
+this.addBack();
+}else{
+var _3=dojo.marginBox(_2);
+this.width=_3.w;
+this.height=_3.h;
+this.strSelected=dojo.attr(_2,"selected");
+this.strTools=dojo.attr(_2,"tools");
+this.strPlugs=dojo.attr(_2,"plugs");
+this._mixprops(["padding","margin","size","radius"],_2);
+this.toolDrawing=new dojox.drawing.Drawing({mode:"ui"},_2);
+}
+this.horizontal=this.width>this.height;
+if(this.toolDrawing.ready){
+this.makeButtons();
+}else{
+var c=dojo.connect(this.toolDrawing,"onSurfaceReady",this,function(){
+dojo.disconnect(c);
+this.drawing=dojox.drawing.getRegistered("drawing",dojo.attr(_2,"drawingId"));
+this.makeButtons();
+});
+}
+},padding:10,margin:5,size:30,radius:3,toolPlugGap:20,strSlelected:"",strTools:"",strPlugs:"",makeButtons:function(){
+this.buttons=[];
+this.plugins=[];
+var x=this.padding,y=this.padding,w=this.size,h=this.size,r=this.radius,g=this.margin,_4=dojox.drawing.library.icons,s={place:"BR",size:2,mult:4};
+if(this.strTools){
+var _5=[];
+if(this.strTools=="all"){
+for(var nm in dojox.drawing.getRegistered("tool")){
+_5.push(this.util.abbr(nm));
+}
+}else{
+_5=this.strTools.split(",");
+dojo.map(_5,function(t){
+return dojo.trim(t);
+});
+}
+dojo.forEach(_5,function(t){
+t=dojo.trim(t);
+var _6=this.toolDrawing.addUI("button",{data:{x:x,y:y,width:w,height:h,r:r},toolType:t,icon:_4[t],shadow:s,scope:this,callback:"onToolClick"});
+this.buttons.push(_6);
+if(this.strSelected==t){
+_6.select();
+this.drawing.setTool(_6.toolType);
+}
+if(this.horizontal){
+y+=h+g;
+}else{
+y+=h+g;
+}
+},this);
+}
+if(this.horizontal){
+y+=this.toolPlugGap;
+}else{
+y+=this.toolPlugGap;
+}
+if(this.strPlugs){
+var _7=[];
+if(this.strPlugs=="all"){
+for(var nm in dojox.drawing.getRegistered("plugin")){
+_7.push(this.util.abbr(nm));
+}
+}else{
+_7=this.strPlugs.split(",");
+dojo.map(_7,function(p){
+return dojo.trim(p);
+});
+}
+dojo.forEach(_7,function(p){
+t=dojo.trim(p);
+var _8=this.toolDrawing.addUI("button",{data:{x:x,y:y,width:w,height:h,r:r},toolType:t,icon:_4[t],shadow:s,scope:this,callback:"onPlugClick"});
+this.plugins.push(_8);
+if(this.horizontal){
+y+=h+g;
+}else{
+y+=h+g;
+}
+this.drawing.addPlugin({name:this.drawing.stencilTypeMap[p],options:{button:_8}});
+},this);
+}
+},addTool:function(){
+},addPlugin:function(){
+},addBack:function(){
+this.toolDrawing.addUI("rect",{data:{x:0,y:0,width:this.width,height:this.size+(this.padding*2),fill:"#ffffff",borderWidth:0}});
+},onToolClick:function(_9){
+dojo.forEach(this.buttons,function(b){
+if(b.id==_9.id){
+b.select();
+this.drawing.setTool(_9.toolType);
+}else{
+b.deselect();
+}
+},this);
+},onPlugClick:function(_a){
+},_mixprops:function(_b,_c){
+dojo.forEach(_b,function(p){
+this[p]=_c.tagName?dojo.attr(_c,p)===null?this[p]:dojo.attr(_c,p):_c[p]===undefined?this[p]:_c[p];
+},this);
+}});
+}
diff --git a/dojox/drawing/ui/Tooltip.js b/dojox/drawing/ui/Tooltip.js
new file mode 100644
index 0000000..d5b1242
--- /dev/null
+++ b/dojox/drawing/ui/Tooltip.js
@@ -0,0 +1,64 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.ui.Tooltip"]){
+dojo._hasResource["dojox.drawing.ui.Tooltip"]=true;
+dojo.provide("dojox.drawing.ui.Tooltip");
+dojo.require("dojox.drawing.plugins._Plugin");
+(function(){
+var _1=null;
+var _2=dojox.drawing.util.oo.declare(dojox.drawing.plugins._Plugin,function(_3){
+this.createDom();
+},{show:function(_4,_5){
+this.domNode.innerHTML=_5;
+var dx=30,dy=30;
+var px=_4.data.x+_4.data.width;
+var py=_4.data.y+_4.data.height;
+var x=px+this.mouse.origin.x+dx;
+var y=py+this.mouse.origin.y+dx;
+dojo.style(this.domNode,{display:"inline",left:x+"px",top:y+"px"});
+var _6=dojo.marginBox(this.domNode);
+this.createShape(x-this.mouse.origin.x,y-this.mouse.origin.y,_6.w,_6.h);
+},createShape:function(x,y,w,h){
+this.balloon&&this.balloon.destroy();
+var r=5,x2=x+w,y2=y+h,_7=[];
+var _8=function(){
+for(var i=0;i<arguments.length;i++){
+_7.push(arguments[i]);
+}
+};
+_8({x:x,y:y+5},{t:"Q",x:x,y:y},{x:x+r,y:y});
+_8({t:"L",x:x2-r,y:y});
+_8({t:"Q",x:x2,y:y},{x:x2,y:y+r});
+_8({t:"L",x:x2,y:y2-r});
+_8({t:"Q",x:x2,y:y2},{x:x2-r,y:y2});
+_8({t:"L",x:x+r,y:y2});
+_8({t:"Q",x:x,y:y2},{x:x,y:y2-r});
+_8({t:"L",x:x,y:y+r});
+this.balloon=this.drawing.addUI("path",{points:_7});
+},createDom:function(){
+this.domNode=dojo.create("span",{"class":"drawingTooltip"},document.body);
+dojo.style(this.domNode,{display:"none",position:"absolute"});
+}});
+dojox.drawing.ui.Tooltip=dojox.drawing.util.oo.declare(dojox.drawing.plugins._Plugin,function(_9){
+if(!_1){
+_1=new _2(_9);
+}
+if(_9.stencil){
+}else{
+if(this.button){
+this.connect(this.button,"onOver",this,"onOver");
+this.connect(this.button,"onOut",this,"onOut");
+}
+}
+},{width:300,height:200,onOver:function(){
+_1.show(this.button,this.data.text);
+},onOut:function(){
+}});
+dojox.drawing.register({name:"dojox.drawing.ui.Tooltip"},"stencil");
+})();
+}
diff --git a/dojox/drawing/ui/dom/Pan.js b/dojox/drawing/ui/dom/Pan.js
new file mode 100644
index 0000000..b9d26bc
--- /dev/null
+++ b/dojox/drawing/ui/dom/Pan.js
@@ -0,0 +1,118 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.ui.dom.Pan"]){
+dojo._hasResource["dojox.drawing.ui.dom.Pan"]=true;
+dojo.provide("dojox.drawing.ui.dom.Pan");
+dojo.require("dojox.drawing.plugins._Plugin");
+dojo.deprecated("dojox.drawing.ui.dom.Pan","It may not even make it to the 1.4 release.",1.4);
+dojox.drawing.ui.dom.Pan=dojox.drawing.util.oo.declare(dojox.drawing.plugins._Plugin,function(_1){
+this.domNode=_1.node;
+var _2;
+dojo.connect(this.domNode,"click",this,"onSetPan");
+dojo.connect(this.keys,"onKeyUp",this,"onKeyUp");
+dojo.connect(this.keys,"onKeyDown",this,"onKeyDown");
+dojo.connect(this.anchors,"onAnchorUp",this,"checkBounds");
+dojo.connect(this.stencils,"register",this,"checkBounds");
+dojo.connect(this.canvas,"resize",this,"checkBounds");
+dojo.connect(this.canvas,"setZoom",this,"checkBounds");
+dojo.connect(this.canvas,"onScroll",this,function(){
+if(this._blockScroll){
+this._blockScroll=false;
+return;
+}
+_2&&clearTimeout(_2);
+_2=setTimeout(dojo.hitch(this,"checkBounds"),200);
+});
+this._mouseHandle=this.mouse.register(this);
+},{selected:false,type:"dojox.drawing.ui.dom.Pan",onKeyUp:function(_3){
+if(_3.keyCode==32){
+this.onSetPan(false);
+}
+},onKeyDown:function(_4){
+if(_4.keyCode==32){
+this.onSetPan(true);
+}
+},onSetPan:function(_5){
+if(_5===true||_5===false){
+this.selected=!_5;
+}
+if(this.selected){
+this.selected=false;
+dojo.removeClass(this.domNode,"selected");
+}else{
+this.selected=true;
+dojo.addClass(this.domNode,"selected");
+}
+this.mouse.setEventMode(this.selected?"pan":"");
+},onPanDrag:function(_6){
+var x=_6.x-_6.last.x;
+var y=_6.y-_6.last.y;
+this.canvas.domNode.parentNode.scrollTop-=_6.move.y;
+this.canvas.domNode.parentNode.scrollLeft-=_6.move.x;
+this.canvas.onScroll();
+},onStencilUp:function(_7){
+this.checkBounds();
+},onStencilDrag:function(_8){
+},checkBounds:function(){
+var _9=function(){
+};
+var _a=function(){
+};
+var t=Infinity,r=-Infinity,b=-Infinity,l=Infinity,sx=0,sy=0,dy=0,dx=0,mx=this.stencils.group?this.stencils.group.getTransform():{dx:0,dy:0},sc=this.mouse.scrollOffset(),_b=sc.left?10:0,_c=sc.top?10:0,ch=this.canvas.height,cw=this.canvas.width,z=this.canvas.zoom,_d=this.canvas.parentHeight,_e=this.canvas.parentWidth;
+this.stencils.withSelected(function(m){
+var o=m.getBounds();
+_a("SEL BOUNDS:",o);
+t=Math.min(o.y1+mx.dy,t);
+r=Math.max(o.x2+mx.dx,r);
+b=Math.max(o.y2+mx.dy,b);
+l=Math.min(o.x1+mx.dx,l);
+});
+this.stencils.withUnselected(function(m){
+var o=m.getBounds();
+_a("UN BOUNDS:",o);
+t=Math.min(o.y1,t);
+r=Math.max(o.x2,r);
+b=Math.max(o.y2,b);
+l=Math.min(o.x1,l);
+});
+b*=z;
+var _f=0,_10=0;
+_9("Bottom test","b:",b,"z:",z,"ch:",ch,"pch:",_d,"top:",sc.top,"sy:",sy);
+if(b>_d||sc.top){
+_9("*bottom scroll*");
+ch=Math.max(b,_d+sc.top);
+sy=sc.top;
+_f+=this.canvas.getScrollWidth();
+}else{
+if(!sy&&ch>_d){
+_9("*bottom remove*");
+ch=_d;
+}
+}
+r*=z;
+if(r>_e||sc.left){
+cw=Math.max(r,_e+sc.left);
+sx=sc.left;
+_10+=this.canvas.getScrollWidth();
+}else{
+if(!sx&&cw>_e){
+cw=_e;
+}
+}
+cw+=_f*2;
+ch+=_10*2;
+this._blockScroll=true;
+this.stencils.group&&this.stencils.group.applyTransform({dx:dx,dy:dy});
+this.stencils.withUnselected(function(m){
+m.transformPoints({dx:dx,dy:dy});
+});
+this.canvas.setDimensions(cw,ch,sx,sy);
+}});
+dojox.drawing.ui.dom.Pan.setup={name:"dojox.drawing.ui.dom.Pan",tooltip:"Pan Tool",iconClass:"iconPan"};
+dojox.drawing.register(dojox.drawing.ui.dom.Pan.setup,"plugin");
+}
diff --git a/dojox/drawing/ui/dom/Toolbar.js b/dojox/drawing/ui/dom/Toolbar.js
new file mode 100644
index 0000000..211f0fe
--- /dev/null
+++ b/dojox/drawing/ui/dom/Toolbar.js
@@ -0,0 +1,114 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.ui.dom.Toolbar"]){
+dojo._hasResource["dojox.drawing.ui.dom.Toolbar"]=true;
+dojo.provide("dojox.drawing.ui.dom.Toolbar");
+dojo.deprecated("dojox.drawing.ui.dom.Toolbar","It may not even make it to the 1.4 release.",1.4);
+(function(){
+dojo.declare("dojox.drawing.ui.dom.Toolbar",[],{baseClass:"drawingToolbar",buttonClass:"drawingButton",iconClass:"icon",constructor:function(_1,_2){
+dojo.addOnLoad(this,function(){
+this.domNode=dojo.byId(_2);
+dojo.addClass(this.domNode,this.baseClass);
+this.parse();
+});
+},createIcon:function(_3,_4){
+var _5=_4&&_4.setup?_4.setup:{};
+if(_5.iconClass){
+var _6=_5.iconClass?_5.iconClass:"iconNone";
+var _7=_5.tooltip?_5.tooltip:"Tool";
+var _8=dojo.create("div",{title:_7},_3);
+dojo.addClass(_8,this.iconClass);
+dojo.addClass(_8,_6);
+dojo.connect(_3,"mouseup",function(_9){
+dojo.stopEvent(_9);
+dojo.removeClass(_3,"active");
+});
+dojo.connect(_3,"mouseover",function(_a){
+dojo.stopEvent(_a);
+dojo.addClass(_3,"hover");
+});
+dojo.connect(_3,"mousedown",this,function(_b){
+dojo.stopEvent(_b);
+dojo.addClass(_3,"active");
+});
+dojo.connect(_3,"mouseout",this,function(_c){
+dojo.stopEvent(_c);
+dojo.removeClass(_3,"hover");
+});
+}
+},createTool:function(_d){
+_d.innerHTML="";
+var _e=dojo.attr(_d,"tool");
+this.toolNodes[_e]=_d;
+dojo.attr(_d,"tabIndex",1);
+var _f=dojo.getObject(_e);
+this.createIcon(_d,_f);
+this.drawing.registerTool(_e,_f);
+dojo.connect(_d,"mouseup",this,function(evt){
+dojo.stopEvent(evt);
+dojo.removeClass(_d,"active");
+this.onClick(_e);
+});
+dojo.connect(_d,"mouseover",function(evt){
+dojo.stopEvent(evt);
+dojo.addClass(_d,"hover");
+});
+dojo.connect(_d,"mousedown",this,function(evt){
+dojo.stopEvent(evt);
+dojo.addClass(_d,"active");
+});
+dojo.connect(_d,"mouseout",this,function(evt){
+dojo.stopEvent(evt);
+dojo.removeClass(_d,"hover");
+});
+},parse:function(){
+var _10=dojo.attr(this.domNode,"drawingId");
+this.drawing=dojox.drawing.util.common.byId(_10);
+!this.drawing&&console.error("Drawing not found based on 'drawingId' in Toolbar. ");
+this.toolNodes={};
+var _11;
+dojo.query(">",this.domNode).forEach(function(_12,i){
+_12.className=this.buttonClass;
+var _13=dojo.attr(_12,"tool");
+var _14=dojo.attr(_12,"action");
+var _15=dojo.attr(_12,"plugin");
+if(_13){
+if(i==0||dojo.attr(_12,"selected")=="true"){
+_11=_13;
+}
+this.createTool(_12);
+}else{
+if(_15){
+var p={name:_15,options:{}},opt=dojo.attr(_12,"options");
+if(opt){
+p.options=eval("("+opt+")");
+}
+p.options.node=_12;
+_12.innerHTML="";
+this.drawing.addPlugin(p);
+this.createIcon(_12,dojo.getObject(dojo.attr(_12,"plugin")));
+}
+}
+},this);
+this.drawing.initPlugins();
+dojo.connect(this.drawing,"setTool",this,"onSetTool");
+this.drawing.setTool(_11);
+},onClick:function(_16){
+this.drawing.setTool(_16);
+},onSetTool:function(_17){
+for(var n in this.toolNodes){
+if(n==_17){
+dojo.addClass(this.toolNodes[_17],"selected");
+this.toolNodes[_17].blur();
+}else{
+dojo.removeClass(this.toolNodes[n],"selected");
+}
+}
+}});
+})();
+}
diff --git a/dojox/drawing/ui/dom/Zoom.js b/dojox/drawing/ui/dom/Zoom.js
new file mode 100644
index 0000000..ac84345
--- /dev/null
+++ b/dojox/drawing/ui/dom/Zoom.js
@@ -0,0 +1,57 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.ui.dom.Zoom"]){
+dojo._hasResource["dojox.drawing.ui.dom.Zoom"]=true;
+dojo.provide("dojox.drawing.ui.dom.Zoom");
+dojo.require("dojox.drawing.plugins._Plugin");
+dojox.drawing.ui.dom.Zoom=dojox.drawing.util.oo.declare(dojox.drawing.plugins._Plugin,function(_1){
+var _2=_1.node.className;
+var _3=_1.node.innerHTML;
+this.domNode=dojo.create("div",{id:"btnZoom","class":"toolCombo"},_1.node,"replace");
+this.makeButton("ZoomIn",this.topClass);
+this.makeButton("Zoom100",this.midClass);
+this.makeButton("ZoomOut",this.botClass);
+},{type:"dojox.drawing.ui.dom.Zoom",zoomInc:0.1,maxZoom:10,minZoom:0.1,zoomFactor:1,baseClass:"drawingButton",topClass:"toolComboTop",midClass:"toolComboMid",botClass:"toolComboBot",makeButton:function(_4,_5){
+var _6=dojo.create("div",{id:"btn"+_4,"class":this.baseClass+" "+_5,innerHTML:"<div title=\"Zoom In\" class=\"icon icon"+_4+"\"></div>"},this.domNode);
+dojo.connect(document,"mouseup",function(_7){
+dojo.stopEvent(_7);
+dojo.removeClass(_6,"active");
+});
+dojo.connect(_6,"mouseup",this,function(_8){
+dojo.stopEvent(_8);
+dojo.removeClass(_6,"active");
+this["on"+_4]();
+});
+dojo.connect(_6,"mouseover",function(_9){
+dojo.stopEvent(_9);
+dojo.addClass(_6,"hover");
+});
+dojo.connect(_6,"mousedown",this,function(_a){
+dojo.stopEvent(_a);
+dojo.addClass(_6,"active");
+});
+dojo.connect(_6,"mouseout",this,function(_b){
+dojo.stopEvent(_b);
+dojo.removeClass(_6,"hover");
+});
+},onZoomIn:function(_c){
+this.zoomFactor+=this.zoomInc;
+this.zoomFactor=Math.min(this.zoomFactor,this.maxZoom);
+this.canvas.setZoom(this.zoomFactor);
+this.mouse.setZoom(this.zoomFactor);
+},onZoom100:function(_d){
+this.zoomFactor=1;
+this.canvas.setZoom(this.zoomFactor);
+this.mouse.setZoom(this.zoomFactor);
+},onZoomOut:function(_e){
+this.zoomFactor-=this.zoomInc;
+this.zoomFactor=Math.max(this.zoomFactor,this.minZoom);
+this.canvas.setZoom(this.zoomFactor);
+this.mouse.setZoom(this.zoomFactor);
+}});
+}
diff --git a/dojox/drawing/util/common.js b/dojox/drawing/util/common.js
new file mode 100644
index 0000000..7ad18f7
--- /dev/null
+++ b/dojox/drawing/util/common.js
@@ -0,0 +1,108 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.util.common"]){
+dojo._hasResource["dojox.drawing.util.common"]=true;
+dojo.provide("dojox.drawing.util.common");
+dojo.require("dojox.math.round");
+(function(){
+var _1={};
+dojox.drawing.util.common={radToDeg:function(n){
+return (n*180)/Math.PI;
+},degToRad:function(n){
+return (n*Math.PI)/180;
+},angle:function(_2,_3){
+if(_3){
+_3=_3/180;
+var _4=this.radians(_2),_5=this.length(_2),_6=Math.PI*_3,_7=dojox.math.round(_4/_6),_8=_7*_6;
+return dojox.math.round(this.radToDeg(_8));
+}else{
+return this.radToDeg(this.radians(_2));
+}
+},radians:function(o){
+return Math.atan2(o.start.y-o.y,o.start.x-o.x);
+},length:function(o){
+return Math.sqrt(Math.pow(o.start.x-o.x,2)+Math.pow(o.start.y-o.y,2));
+},lineSub:function(x1,y1,x2,y2,_9){
+var _a=this.distance(this.argsToObj.apply(this,arguments));
+_a=_a<_9?_9:_a;
+var pc=(_a-_9)/_a;
+var x=x1-(x1-x2)*pc;
+var y=y1-(y1-y2)*pc;
+return {x:x,y:y};
+},argsToObj:function(){
+var a=arguments;
+if(a.length<4){
+return a[0];
+}
+return {start:{x:a[0],y:a[1]},x:a[2],y:a[3]};
+},distance:function(){
+var o=this.argsToObj.apply(this,arguments);
+return Math.abs(Math.sqrt(Math.pow(o.start.x-o.x,2)+Math.pow(o.start.y-o.y,2)));
+},slope:function(p1,p2){
+if(!(p1.x-p2.x)){
+return 0;
+}
+return ((p1.y-p2.y)/(p1.x-p2.x));
+},pointOnCircle:function(cx,cy,_b,_c){
+radians=_c*Math.PI/180;
+var x=_b*Math.cos(radians)*-1;
+var y=_b*Math.sin(radians)*-1;
+return {x:cx+x,y:cy+y};
+},constrainAngle:function(_d,_e,_f){
+var _10=this.angle(_d);
+if(_10>=_e&&_10<=_f){
+return _d;
+}
+var _11=this.length(_d);
+var _12=_e-((360-(_f-_e))/2);
+var _13=_10>_f?_f:_e-_10<100?_e:_f;
+return this.pointOnCircle(_d.start.x,_d.start.y,_11,_13);
+},snapAngle:function(obj,ca){
+var _14=this.radians(obj),_15=this.angle(obj),_16=this.length(obj),seg=Math.PI*ca,rnd=Math.round(_14/seg),_17=rnd*seg,_18=this.radToDeg(_17),pt=this.pointOnCircle(obj.start.x,obj.start.y,_16,_18);
+return pt;
+},uid:function(str){
+str=str||"shape";
+_1[str]=_1[str]===undefined?0:_1[str]+1;
+return str+_1[str];
+},abbr:function(_19){
+return _19.substring(_19.lastIndexOf(".")+1).charAt(0).toLowerCase()+_19.substring(_19.lastIndexOf(".")+2);
+},mixin:function(o1,o2){
+},objects:{},register:function(obj){
+this.objects[obj.id]=obj;
+},byId:function(id){
+return this.objects[id];
+},attr:function(_1a,_1b,_1c,_1d){
+if(!_1a){
+return false;
+}
+try{
+if(_1a.shape&&_1a.util){
+_1a=_1a.shape;
+}
+if(!_1c&&_1b=="id"&&_1a.target){
+var n=_1a.target;
+while(!dojo.attr(n,"id")){
+n=n.parentNode;
+}
+return dojo.attr(n,"id");
+}
+if(_1a.rawNode||_1a.target){
+var _1e=Array.prototype.slice.call(arguments);
+_1e[0]=_1a.rawNode||_1a.target;
+return dojo.attr.apply(dojo,_1e);
+}
+return dojo.attr(_1a,"id");
+}
+catch(e){
+if(!_1d){
+}
+return false;
+}
+}};
+})();
+}
diff --git a/dojox/drawing/util/oo.js b/dojox/drawing/util/oo.js
new file mode 100644
index 0000000..b8e040a
--- /dev/null
+++ b/dojox/drawing/util/oo.js
@@ -0,0 +1,54 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.util.oo"]){
+dojo._hasResource["dojox.drawing.util.oo"]=true;
+dojo.provide("dojox.drawing.util.oo");
+dojox.drawing.util.oo={declare:function(){
+var f,o,_1=0,a=arguments;
+if(a.length<2){
+console.error("gfx.oo.declare; not enough arguments");
+}
+if(a.length==2){
+f=a[0];
+o=a[1];
+}else{
+a=Array.prototype.slice.call(arguments);
+o=a.pop();
+f=a.pop();
+_1=1;
+}
+for(var n in o){
+f.prototype[n]=o[n];
+}
+if(_1){
+a.unshift(f);
+f=this.extend.apply(this,a);
+}
+return f;
+},extend:function(){
+var a=arguments,_2=a[0];
+if(a.length<2){
+console.error("gfx.oo.extend; not enough arguments");
+}
+var f=function(){
+for(var i=1;i<a.length;i++){
+a[i].prototype.constructor.apply(this,arguments);
+}
+_2.prototype.constructor.apply(this,arguments);
+};
+for(var i=1;i<a.length;i++){
+for(var n in a[i].prototype){
+f.prototype[n]=a[i].prototype[n];
+}
+}
+for(var n in _2.prototype){
+f.prototype[n]=_2.prototype[n];
+}
+return f;
+}};
+}
diff --git a/dojox/drawing/util/positioning.js b/dojox/drawing/util/positioning.js
new file mode 100644
index 0000000..5644e0e
--- /dev/null
+++ b/dojox/drawing/util/positioning.js
@@ -0,0 +1,45 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.drawing.util.positioning"]){
+dojo._hasResource["dojox.drawing.util.positioning"]=true;
+dojo.provide("dojox.drawing.util.positioning");
+(function(){
+var _1=4;
+var _2=20;
+dojox.drawing.util.positioning.label=function(_3,_4){
+var x=0.5*(_3.x+_4.x);
+var y=0.5*(_3.y+_4.y);
+var _5=dojox.drawing.util.common.slope(_3,_4);
+var _6=_1/Math.sqrt(1+_5*_5);
+if(_4.y>_3.y){
+_6=-_6;
+}
+x+=-_6*_5;
+y+=_6;
+var _7=_4.x<_3.x?"end":"start";
+if(_4.y>_3.y){
+y-=_2;
+}
+return {x:x,y:y,foo:"bar",align:_7};
+};
+dojox.drawing.util.positioning.angle=function(_8,_9){
+var x=0.7*_8.x+0.3*_9.x;
+var y=0.7*_8.y+0.3*_9.y;
+var _a=dojox.drawing.util.common.slope(_8,_9);
+var _b=_1/Math.sqrt(1+_a*_a);
+if(_9.x<_8.x){
+_b=-_b;
+}
+x+=-_b*_a;
+y+=_b;
+var _c=_9.y>_8.y?"end":"start";
+y+=_9.x>_8.x?0.5*_2:-0.5*_2;
+return {x:x,y:y,align:_c};
+};
+})();
+}
diff --git a/dojox/dtl.js b/dojox/dtl.js
index 310df48..7c24824 100644
--- a/dojox/dtl.js
+++ b/dojox/dtl.js
@@ -13,4 +13,4 @@
 	for documentation and information on getting the source.
 */
 
-if(!dojo._hasResource["dojox.string.Builder"]){dojo._hasResource["dojox.string.Builder"]=true;dojo.provide("dojox.string.Builder");dojox.string.Builder=function(_1){var b="";this.length=0;this.append=function(s){if(arguments.length>1){var _4="",l=arguments.length;switch(l){case 9:_4=""+arguments[8]+_4;case 8:_4=""+arguments[7]+_4;case 7:_4=""+arguments[6]+_4;case 6:_4=""+arguments[5]+_4;case 5:_4=""+arguments[4]+_4;case 4:_4=""+arguments[3]+_4;case 3:_4=""+arguments[2]+_4;case 2:b+=""+ar [...]
+if(!dojo._hasResource["dojox.string.Builder"]){dojo._hasResource["dojox.string.Builder"]=true;dojo.provide("dojox.string.Builder");dojox.string.Builder=function(_1){var b="";this.length=0;this.append=function(s){if(arguments.length>1){var _2="",l=arguments.length;switch(l){case 9:_2=""+arguments[8]+_2;case 8:_2=""+arguments[7]+_2;case 7:_2=""+arguments[6]+_2;case 6:_2=""+arguments[5]+_2;case 5:_2=""+arguments[4]+_2;case 4:_2=""+arguments[3]+_2;case 3:_2=""+arguments[2]+_2;case 2:b+=""+ar [...]
diff --git a/dojox/dtl.js.uncompressed.js b/dojox/dtl.js.uncompressed.js
index beb30a7..21460f2 100644
--- a/dojox/dtl.js.uncompressed.js
+++ b/dojox/dtl.js.uncompressed.js
@@ -717,7 +717,7 @@ dojo.experimental("dojox.dtl");
 			// 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 terminators = {};
+			var terminators = {}, token;
 			stop_at = stop_at || [];
 			for(var i = 0; i < stop_at.length; i++){
 				terminators[stop_at[i]] = true;
@@ -835,7 +835,7 @@ dojo.experimental("dojox.dtl");
 							}
 							dd.register._registry.attributes.push([attr.toLowerCase(), base + "." + path + "." + attr]);
 						}
-						key = key.toLowerCase();
+						key = key.toLowerCase()
 					}
 					dd.register._registry[type].push([
 						key,
@@ -1552,19 +1552,17 @@ dojo.date.compare = function(/*Date*/date1, /*Date?*/date2, /*String?*/portion){
 	//		"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);
-		}
+	date1 = new Date(+date1);
+	date2 = new Date(+(date2 || new Date()));
+
+	if(portion == "date"){
+		// Ignore times and compare dates.
+		date1.setHours(0, 0, 0, 0);
+		date2.setHours(0, 0, 0, 0);
+	}else if(portion == "time"){
+		// Ignore dates and compare times.
+		date1.setFullYear(0, 0, 0);
+		date2.setFullYear(0, 0, 0);
 	}
 	
 	if(date1 > date2){ return 1; } // int
@@ -1584,7 +1582,7 @@ dojo.date.add = function(/*Date*/date, /*String*/interval, /*int*/amount){
 	//	amount:
 	//		How much to add to the date.
 
-	var sum = new Date(Number(date)); // convert to Number before copying to accomodate IE (#3112)
+	var sum = new Date(+date); // convert to Number before copying to accomodate IE (#3112)
 	var fixOvershoot = false;
 	var property = "Date";
 
@@ -1646,10 +1644,11 @@ dojo.date.add = function(/*Date*/date, /*String*/interval, /*int*/amount){
 			fixOvershoot = true;
 			property = "Month";
 			break;
-		case "hour":
-		case "minute":
-		case "second":
-		case "millisecond":
+//		case "hour":
+//		case "minute":
+//		case "second":
+//		case "millisecond":
+		default:
 			property = "UTC"+interval.charAt(0).toUpperCase() + interval.substring(1) + "s";
 	}
 
@@ -2550,7 +2549,7 @@ dojo.provide("dojox.dtl.tag.misc");
 				only[key] = context[key];
 				debug += "[" + key + ": " + typeof context[key] + "]\n";
 			}
-			
+			console.debug(only);
 			return this.text.set(debug).render(context, buffer, this);
 		},
 		unrender: function(context, buffer){
diff --git a/dojox/dtl/Context.js b/dojox/dtl/Context.js
index 7086f55..28af49c 100644
--- a/dojox/dtl/Context.js
+++ b/dojox/dtl/Context.js
@@ -25,36 +25,36 @@ return dojo.delegate(this,_4);
 },filter:function(_5){
 var _6=new dojox.dtl.Context();
 var _7=[];
-var i,_9;
+var i,_8;
 if(_5 instanceof dojox.dtl.Context){
 _7=_5.getKeys();
 }else{
 if(typeof _5=="object"){
-for(var _a in _5){
-_7.push(_a);
+for(var _9 in _5){
+_7.push(_9);
 }
 }else{
-for(i=0;_9=arguments[i];i++){
-if(typeof _9=="string"){
-_7.push(_9);
+for(i=0;_8=arguments[i];i++){
+if(typeof _8=="string"){
+_7.push(_8);
 }
 }
 }
 }
-for(i=0,_a;_a=_7[i];i++){
-_6[_a]=this[_a];
+for(i=0,_9;_9=_7[i];i++){
+_6[_9]=this[_9];
 }
 return _6;
-},setThis:function(_b){
-this._this=_b;
+},setThis:function(_a){
+this._this=_a;
 },getThis:function(){
 return this._this;
-},hasKey:function(_c){
-if(typeof this[_c]!="undefined"){
+},hasKey:function(_b){
+if(typeof this[_b]!="undefined"){
 return true;
 }
-for(var i=0,_e;_e=this._dicts[i];i++){
-if(typeof _e[_c]!="undefined"){
+for(var i=0,_c;_c=this._dicts[i];i++){
+if(typeof _c[_b]!="undefined"){
 return true;
 }
 }
diff --git a/dojox/dtl/_DomTemplated.js b/dojox/dtl/_DomTemplated.js
index 58c6b95..62875d3 100644
--- a/dojox/dtl/_DomTemplated.js
+++ b/dojox/dtl/_DomTemplated.js
@@ -12,7 +12,9 @@ dojo.require("dijit._Templated");
 dojo.require("dojox.dtl.dom");
 dojo.require("dojox.dtl.render.dom");
 dojo.require("dojox.dtl.contrib.dijit");
-dojox.dtl._DomTemplated={prototype:{_dijitTemplateCompat:false,buildRendering:function(){
+dojox.dtl._DomTemplated=function(){
+};
+dojox.dtl._DomTemplated.prototype={_dijitTemplateCompat:false,buildRendering:function(){
 this.domNode=this.srcNodeRef;
 if(!this._render){
 var _1=dojox.dtl.contrib.dijit;
@@ -57,5 +59,5 @@ if(_b[_a]){
 return _b[_a];
 }
 return (_b[_a]=new dojox.dtl.DomTemplate(dijit._Templated.getCachedTemplate(_8,_9,true)));
-}}};
+}};
 }
diff --git a/dojox/dtl/_Templated.js b/dojox/dtl/_Templated.js
index 6e9d8bf..9f4e810 100644
--- a/dojox/dtl/_Templated.js
+++ b/dojox/dtl/_Templated.js
@@ -24,22 +24,22 @@ _1=t;
 }
 }
 if(!_1){
-var _3=dojo._toDom(this._template.render(new dojox.dtl._Context(this)));
-if(_3.nodeType!==1&&_3.nodeType!==3){
-for(var i=0,l=_3.childNodes.length;i<l;++i){
-_1=_3.childNodes[i];
+var _2=dojo._toDom(this._template.render(new dojox.dtl._Context(this)));
+if(_2.nodeType!==1&&_2.nodeType!==3){
+for(var i=0,l=_2.childNodes.length;i<l;++i){
+_1=_2.childNodes[i];
 if(_1.nodeType==1){
 break;
 }
 }
 }else{
-_1=_3;
+_1=_2;
 }
 }
 this._attachTemplateNodes(_1);
 if(this.widgetsInTemplate){
-var _6=dojo.parser.parse(_1);
-this._attachTemplateNodes(_6,function(n,p){
+var _3=dojo.parser.parse(_1);
+this._attachTemplateNodes(_3,function(n,p){
 return n[p];
 });
 }
@@ -50,20 +50,20 @@ dojo.destroy(this.domNode);
 }
 this.domNode=_1;
 this._fillContent(this.srcNodeRef);
-},_templateCache:{},getCachedTemplate:function(_9,_a,_b){
-var _c=this._templateCache;
-var _d=_a||_9;
-if(_c[_d]){
-return _c[_d];
+},_templateCache:{},getCachedTemplate:function(_4,_5,_6){
+var _7=this._templateCache;
+var _8=_5||_4;
+if(_7[_8]){
+return _7[_8];
 }
-_a=dojo.string.trim(_a||dijit._Templated._sanitizeTemplateString(dojo._getText(_9)));
-if(this._dijitTemplateCompat&&(_b||_a.match(/\$\{([^\}]+)\}/g))){
-_a=this._stringRepl(_a);
+_5=dojo.string.trim(_5||dojo.cache(_4,{sanitize:true}));
+if(this._dijitTemplateCompat&&(_6||_5.match(/\$\{([^\}]+)\}/g))){
+_5=this._stringRepl(_5);
 }
-if(_b||!_a.match(/\{[{%]([^\}]+)[%}]\}/g)){
-return _c[_d]=dojo._toDom(_a);
+if(_6||!_5.match(/\{[{%]([^\}]+)[%}]\}/g)){
+return _7[_8]=dojo._toDom(_5);
 }else{
-return _c[_d]=new dojox.dtl.Template(_a);
+return _7[_8]=new dojox.dtl.Template(_5);
 }
 },render:function(){
 this.buildRendering();
diff --git a/dojox/dtl/_base.js b/dojox/dtl/_base.js
index c13be6c..b890ab3 100644
--- a/dojox/dtl/_base.js
+++ b/dojox/dtl/_base.js
@@ -17,233 +17,233 @@ dd.TOKEN_BLOCK=-1;
 dd.TOKEN_VAR=-2;
 dd.TOKEN_COMMENT=-3;
 dd.TOKEN_TEXT=3;
-dd._Context=dojo.extend(function(_2){
-dojo._mixin(this,_2||{});
+dd._Context=dojo.extend(function(_1){
+dojo._mixin(this,_1||{});
 this._dicts=[];
 },{push:function(){
-var _3=this;
-var _4=dojo.delegate(this);
-_4.pop=function(){
-return _3;
+var _2=this;
+var _3=dojo.delegate(this);
+_3.pop=function(){
+return _2;
 };
-return _4;
+return _3;
 },pop:function(){
 throw new Error("pop() called on empty Context");
-},get:function(_5,_6){
-if(typeof this[_5]!="undefined"){
-return this._normalize(this[_5]);
-}
-for(var i=0,_8;_8=this._dicts[i];i++){
-if(typeof _8[_5]!="undefined"){
-return this._normalize(_8[_5]);
-}
-}
-return _6;
-},_normalize:function(_9){
-if(_9 instanceof Date){
-_9.year=_9.getFullYear();
-_9.month=_9.getMonth()+1;
-_9.day=_9.getDate();
-_9.date=_9.year+"-"+("0"+_9.month).slice(-2)+"-"+("0"+_9.day).slice(-2);
-_9.hour=_9.getHours();
-_9.minute=_9.getMinutes();
-_9.second=_9.getSeconds();
-_9.microsecond=_9.getMilliseconds();
+},get:function(_4,_5){
+if(typeof this[_4]!="undefined"){
+return this._normalize(this[_4]);
+}
+for(var i=0,_6;_6=this._dicts[i];i++){
+if(typeof _6[_4]!="undefined"){
+return this._normalize(_6[_4]);
+}
+}
+return _5;
+},_normalize:function(_7){
+if(_7 instanceof Date){
+_7.year=_7.getFullYear();
+_7.month=_7.getMonth()+1;
+_7.day=_7.getDate();
+_7.date=_7.year+"-"+("0"+_7.month).slice(-2)+"-"+("0"+_7.day).slice(-2);
+_7.hour=_7.getHours();
+_7.minute=_7.getMinutes();
+_7.second=_7.getSeconds();
+_7.microsecond=_7.getMilliseconds();
+}
+return _7;
+},update:function(_8){
+var _9=this.push();
+if(_8){
+dojo._mixin(this,_8);
 }
 return _9;
-},update:function(_a){
-var _b=this.push();
-if(_a){
-dojo._mixin(this,_a);
-}
-return _b;
 }});
-var _c=/("(?:[^"\\]*(?:\\.[^"\\]*)*)"|'(?:[^'\\]*(?:\\.[^'\\]*)*)'|[^\s]+)/g;
-var _d=/\s+/g;
-var _e=function(_f,_10){
-_f=_f||_d;
-if(!(_f instanceof RegExp)){
-_f=new RegExp(_f,"g");
-}
-if(!_f.global){
-throw new Error("You must use a globally flagged RegExp with split "+_f);
-}
-_f.exec("");
-var _11,_12=[],_13=0,i=0;
-while(_11=_f.exec(this)){
-_12.push(this.slice(_13,_f.lastIndex-_11[0].length));
-_13=_f.lastIndex;
-if(_10&&(++i>_10-1)){
+var _a=/("(?:[^"\\]*(?:\\.[^"\\]*)*)"|'(?:[^'\\]*(?:\\.[^'\\]*)*)'|[^\s]+)/g;
+var _b=/\s+/g;
+var _c=function(_d,_e){
+_d=_d||_b;
+if(!(_d instanceof RegExp)){
+_d=new RegExp(_d,"g");
+}
+if(!_d.global){
+throw new Error("You must use a globally flagged RegExp with split "+_d);
+}
+_d.exec("");
+var _f,_10=[],_11=0,i=0;
+while(_f=_d.exec(this)){
+_10.push(this.slice(_11,_d.lastIndex-_f[0].length));
+_11=_d.lastIndex;
+if(_e&&(++i>_e-1)){
 break;
 }
 }
-_12.push(this.slice(_13));
-return _12;
+_10.push(this.slice(_11));
+return _10;
 };
-dd.Token=function(_15,_16){
-this.token_type=_15;
-this.contents=new String(dojo.trim(_16));
-this.contents.split=_e;
+dd.Token=function(_12,_13){
+this.token_type=_12;
+this.contents=new String(dojo.trim(_13));
+this.contents.split=_c;
 this.split=function(){
 return String.prototype.split.apply(this.contents,arguments);
 };
 };
-dd.Token.prototype.split_contents=function(_17){
-var bit,_19=[],i=0;
-_17=_17||999;
-while(i++<_17&&(bit=_c.exec(this.contents))){
+dd.Token.prototype.split_contents=function(_14){
+var bit,_15=[],i=0;
+_14=_14||999;
+while(i++<_14&&(bit=_a.exec(this.contents))){
 bit=bit[0];
 if(bit.charAt(0)=="\""&&bit.slice(-1)=="\""){
-_19.push("\""+bit.slice(1,-1).replace("\\\"","\"").replace("\\\\","\\")+"\"");
+_15.push("\""+bit.slice(1,-1).replace("\\\"","\"").replace("\\\\","\\")+"\"");
 }else{
 if(bit.charAt(0)=="'"&&bit.slice(-1)=="'"){
-_19.push("'"+bit.slice(1,-1).replace("\\'","'").replace("\\\\","\\")+"'");
+_15.push("'"+bit.slice(1,-1).replace("\\'","'").replace("\\\\","\\")+"'");
 }else{
-_19.push(bit);
+_15.push(bit);
 }
 }
 }
-return _19;
+return _15;
 };
-var ddt=dd.text={_get:function(_1c,_1d,_1e){
-var _1f=dd.register.get(_1c,_1d.toLowerCase(),_1e);
-if(!_1f){
-if(!_1e){
-throw new Error("No tag found for "+_1d);
+var ddt=dd.text={_get:function(_16,_17,_18){
+var _19=dd.register.get(_16,_17.toLowerCase(),_18);
+if(!_19){
+if(!_18){
+throw new Error("No tag found for "+_17);
 }
 return null;
 }
-var fn=_1f[1];
-var _21=_1f[2];
-var _22;
+var fn=_19[1];
+var _1a=_19[2];
+var _1b;
 if(fn.indexOf(":")!=-1){
-_22=fn.split(":");
-fn=_22.pop();
-}
-dojo["require"](_21);
-var _23=dojo.getObject(_21);
-return _23[fn||_1d]||_23[_1d+"_"]||_23[fn+"_"];
-},getTag:function(_24,_25){
-return ddt._get("tag",_24,_25);
-},getFilter:function(_26,_27){
-return ddt._get("filter",_26,_27);
-},getTemplate:function(_28){
-return new dd.Template(ddt.getTemplateString(_28));
-},getTemplateString:function(_29){
-return dojo._getText(_29.toString())||"";
-},_resolveLazy:function(_2a,_2b,_2c){
-if(_2b){
-if(_2c){
-return dojo.fromJson(dojo._getText(_2a))||{};
+_1b=fn.split(":");
+fn=_1b.pop();
+}
+dojo["require"](_1a);
+var _1c=dojo.getObject(_1a);
+return _1c[fn||_17]||_1c[_17+"_"]||_1c[fn+"_"];
+},getTag:function(_1d,_1e){
+return ddt._get("tag",_1d,_1e);
+},getFilter:function(_1f,_20){
+return ddt._get("filter",_1f,_20);
+},getTemplate:function(_21){
+return new dd.Template(ddt.getTemplateString(_21));
+},getTemplateString:function(_22){
+return dojo._getText(_22.toString())||"";
+},_resolveLazy:function(_23,_24,_25){
+if(_24){
+if(_25){
+return dojo.fromJson(dojo._getText(_23))||{};
 }else{
-return dd.text.getTemplateString(_2a);
+return dd.text.getTemplateString(_23);
 }
 }else{
-return dojo.xhrGet({handleAs:(_2c)?"json":"text",url:_2a});
+return dojo.xhrGet({handleAs:(_25)?"json":"text",url:_23});
 }
-},_resolveTemplateArg:function(arg,_2e){
+},_resolveTemplateArg:function(arg,_26){
 if(ddt._isTemplate(arg)){
-if(!_2e){
+if(!_26){
 var d=new dojo.Deferred();
 d.callback(arg);
 return d;
 }
 return arg;
 }
-return ddt._resolveLazy(arg,_2e);
+return ddt._resolveLazy(arg,_26);
 },_isTemplate:function(arg){
 return (typeof arg=="undefined")||(typeof arg=="string"&&(arg.match(/^\s*[<{]/)||arg.indexOf(" ")!=-1));
-},_resolveContextArg:function(arg,_32){
+},_resolveContextArg:function(arg,_27){
 if(arg.constructor==Object){
-if(!_32){
+if(!_27){
 var d=new dojo.Deferred;
 d.callback(arg);
 return d;
 }
 return arg;
 }
-return ddt._resolveLazy(arg,_32,true);
+return ddt._resolveLazy(arg,_27,true);
 },_re:/(?:\{\{\s*(.+?)\s*\}\}|\{%\s*(load\s*)?(.+?)\s*%\})/g,tokenize:function(str){
 return dojox.string.tokenize(str,ddt._re,ddt._parseDelims);
-},_parseDelims:function(_35,_36,tag){
-if(_35){
-return [dd.TOKEN_VAR,_35];
+},_parseDelims:function(_28,_29,tag){
+if(_28){
+return [dd.TOKEN_VAR,_28];
 }else{
-if(_36){
-var _38=dojo.trim(tag).split(/\s+/g);
-for(var i=0,_3a;_3a=_38[i];i++){
-dojo["require"](_3a);
+if(_29){
+var _2a=dojo.trim(tag).split(/\s+/g);
+for(var i=0,_2b;_2b=_2a[i];i++){
+dojo["require"](_2b);
 }
 }else{
 return [dd.TOKEN_BLOCK,tag];
 }
 }
 }};
-dd.Template=dojo.extend(function(_3b,_3c){
-var str=_3c?_3b:ddt._resolveTemplateArg(_3b,true)||"";
-var _3e=ddt.tokenize(str);
-var _3f=new dd._Parser(_3e);
-this.nodelist=_3f.parse();
-},{update:function(_40,_41){
-return ddt._resolveContextArg(_41).addCallback(this,function(_42){
-var _43=this.render(new dd._Context(_42));
-if(_40.forEach){
-_40.forEach(function(_44){
-_44.innerHTML=_43;
+dd.Template=dojo.extend(function(_2c,_2d){
+var str=_2d?_2c:ddt._resolveTemplateArg(_2c,true)||"";
+var _2e=ddt.tokenize(str);
+var _2f=new dd._Parser(_2e);
+this.nodelist=_2f.parse();
+},{update:function(_30,_31){
+return ddt._resolveContextArg(_31).addCallback(this,function(_32){
+var _33=this.render(new dd._Context(_32));
+if(_30.forEach){
+_30.forEach(function(_34){
+_34.innerHTML=_33;
 });
 }else{
-dojo.byId(_40).innerHTML=_43;
+dojo.byId(_30).innerHTML=_33;
 }
 return this;
 });
-},render:function(_45,_46){
-_46=_46||this.getBuffer();
-_45=_45||new dd._Context({});
-return this.nodelist.render(_45,_46)+"";
+},render:function(_35,_36){
+_36=_36||this.getBuffer();
+_35=_35||new dd._Context({});
+return this.nodelist.render(_35,_36)+"";
 },getBuffer:function(){
 dojo.require("dojox.string.Builder");
 return new dojox.string.Builder();
 }});
-var _47=/\{\{\s*(.+?)\s*\}\}/g;
+var _37=/\{\{\s*(.+?)\s*\}\}/g;
 dd.quickFilter=function(str){
 if(!str){
 return new dd._NodeList();
 }
 if(str.indexOf("{%")==-1){
-return new dd._QuickNodeList(dojox.string.tokenize(str,_47,function(_49){
-return new dd._Filter(_49);
+return new dd._QuickNodeList(dojox.string.tokenize(str,_37,function(_38){
+return new dd._Filter(_38);
 }));
 }
 };
-dd._QuickNodeList=dojo.extend(function(_4a){
-this.contents=_4a;
-},{render:function(_4b,_4c){
+dd._QuickNodeList=dojo.extend(function(_39){
+this.contents=_39;
+},{render:function(_3a,_3b){
 for(var i=0,l=this.contents.length;i<l;i++){
 if(this.contents[i].resolve){
-_4c=_4c.concat(this.contents[i].resolve(_4b));
+_3b=_3b.concat(this.contents[i].resolve(_3a));
 }else{
-_4c=_4c.concat(this.contents[i]);
+_3b=_3b.concat(this.contents[i]);
 }
 }
-return _4c;
-},dummyRender:function(_4f){
-return this.render(_4f,dd.Template.prototype.getBuffer()).toString();
-},clone:function(_50){
+return _3b;
+},dummyRender:function(_3c){
+return this.render(_3c,dd.Template.prototype.getBuffer()).toString();
+},clone:function(_3d){
 return this;
 }});
-dd._Filter=dojo.extend(function(_51){
-if(!_51){
+dd._Filter=dojo.extend(function(_3e){
+if(!_3e){
 throw new Error("Filter must be called with variable name");
 }
-this.contents=_51;
-var _52=this._cache[_51];
-if(_52){
-this.key=_52[0];
-this.filters=_52[1];
+this.contents=_3e;
+var _3f=this._cache[_3e];
+if(_3f){
+this.key=_3f[0];
+this.filters=_3f[1];
 }else{
 this.filters=[];
-dojox.string.tokenize(_51,this._re,this._tokenize,this);
-this._cache[_51]=[this.key,this.filters];
+dojox.string.tokenize(_3e,this._re,this._tokenize,this);
+this._cache[_3e]=[this.key,this.filters];
 }
 },{_cache:{},_re:/(?:^_\("([^\\"]*(?:\\.[^\\"])*)"\)|^"([^\\"]*(?:\\.[^\\"]*)*)"|^([a-zA-Z0-9_.]+)|\|(\w+)(?::(?:_\("([^\\"]*(?:\\.[^\\"])*)"\)|"([^\\"]*(?:\\.[^\\"]*)*)"|([a-zA-Z0-9_.]+)|'([^\\']*(?:\\.[^\\']*)*)'))?|^'([^\\']*(?:\\.[^\\']*)*)')/g,_values:{0:"\"",1:"\"",2:"",8:"\""},_args:{4:"\"",5:"\"",6:"",7:"'"},_tokenize:function(){
 var pos,arg;
@@ -260,15 +260,15 @@ break;
 }else{
 for(pos in this._args){
 if(has[pos]){
-var _57=arguments[pos];
+var _40=arguments[pos];
 if(this._args[pos]=="'"){
-_57=_57.replace(/\\'/g,"'");
+_40=_40.replace(/\\'/g,"'");
 }else{
 if(this._args[pos]=="\""){
-_57=_57.replace(/\\"/g,"\"");
+_40=_40.replace(/\\"/g,"\"");
 }
 }
-arg=[!this._args[pos],_57];
+arg=[!this._args[pos],_40];
 break;
 }
 }
@@ -280,87 +280,87 @@ this.filters.push([fn,arg]);
 }
 },getExpression:function(){
 return this.contents;
-},resolve:function(_59){
+},resolve:function(_41){
 if(typeof this.key=="undefined"){
 return "";
 }
-var str=this.resolvePath(this.key,_59);
-for(var i=0,_5c;_5c=this.filters[i];i++){
-if(_5c[1]){
-if(_5c[1][0]){
-str=_5c[0](str,this.resolvePath(_5c[1][1],_59));
+var str=this.resolvePath(this.key,_41);
+for(var i=0,_42;_42=this.filters[i];i++){
+if(_42[1]){
+if(_42[1][0]){
+str=_42[0](str,this.resolvePath(_42[1][1],_41));
 }else{
-str=_5c[0](str,_5c[1][1]);
+str=_42[0](str,_42[1][1]);
 }
 }else{
-str=_5c[0](str);
+str=_42[0](str);
 }
 }
 return str;
-},resolvePath:function(_5d,_5e){
-var _5f,_60;
-var _61=_5d.charAt(0);
-var _62=_5d.slice(-1);
-if(!isNaN(parseInt(_61))){
-_5f=(_5d.indexOf(".")==-1)?parseInt(_5d):parseFloat(_5d);
+},resolvePath:function(_43,_44){
+var _45,_46;
+var _47=_43.charAt(0);
+var _48=_43.slice(-1);
+if(!isNaN(parseInt(_47))){
+_45=(_43.indexOf(".")==-1)?parseInt(_43):parseFloat(_43);
 }else{
-if(_61=="\""&&_61==_62){
-_5f=_5d.slice(1,-1);
+if(_47=="\""&&_47==_48){
+_45=_43.slice(1,-1);
 }else{
-if(_5d=="true"){
+if(_43=="true"){
 return true;
 }
-if(_5d=="false"){
+if(_43=="false"){
 return false;
 }
-if(_5d=="null"||_5d=="None"){
+if(_43=="null"||_43=="None"){
 return null;
 }
-_60=_5d.split(".");
-_5f=_5e.get(_60[0]);
-if(dojo.isFunction(_5f)){
-var _63=_5e.getThis&&_5e.getThis();
-if(_5f.alters_data){
-_5f="";
+_46=_43.split(".");
+_45=_44.get(_46[0]);
+if(dojo.isFunction(_45)){
+var _49=_44.getThis&&_44.getThis();
+if(_45.alters_data){
+_45="";
 }else{
-if(_63){
-_5f=_5f.call(_63);
+if(_49){
+_45=_45.call(_49);
 }else{
-_5f="";
+_45="";
 }
 }
 }
-for(var i=1;i<_60.length;i++){
-var _65=_60[i];
-if(_5f){
-var _66=_5f;
-if(dojo.isObject(_5f)&&_65=="items"&&typeof _5f[_65]=="undefined"){
-var _67=[];
-for(var key in _5f){
-_67.push([key,_5f[key]]);
+for(var i=1;i<_46.length;i++){
+var _4a=_46[i];
+if(_45){
+var _4b=_45;
+if(dojo.isObject(_45)&&_4a=="items"&&typeof _45[_4a]=="undefined"){
+var _4c=[];
+for(var key in _45){
+_4c.push([key,_45[key]]);
 }
-_5f=_67;
+_45=_4c;
 continue;
 }
-if(_5f.get&&dojo.isFunction(_5f.get)&&_5f.get.safe){
-_5f=_5f.get(_65);
+if(_45.get&&dojo.isFunction(_45.get)&&_45.get.safe){
+_45=_45.get(_4a);
 }else{
-if(typeof _5f[_65]=="undefined"){
-_5f=_5f[_65];
+if(typeof _45[_4a]=="undefined"){
+_45=_45[_4a];
 break;
 }else{
-_5f=_5f[_65];
+_45=_45[_4a];
 }
 }
-if(dojo.isFunction(_5f)){
-if(_5f.alters_data){
-_5f="";
+if(dojo.isFunction(_45)){
+if(_45.alters_data){
+_45="";
 }else{
-_5f=_5f.call(_66);
+_45=_45.call(_4b);
 }
 }else{
-if(_5f instanceof Date){
-_5f=dd._Context.prototype._normalize(_5f);
+if(_45 instanceof Date){
+_45=dd._Context.prototype._normalize(_45);
 }
 }
 }else{
@@ -369,39 +369,39 @@ return "";
 }
 }
 }
-return _5f;
+return _45;
 }});
 dd._TextNode=dd._Node=dojo.extend(function(obj){
 this.contents=obj;
-},{set:function(_6a){
-this.contents=_6a;
+},{set:function(_4d){
+this.contents=_4d;
 return this;
-},render:function(_6b,_6c){
-return _6c.concat(this.contents);
+},render:function(_4e,_4f){
+return _4f.concat(this.contents);
 },isEmpty:function(){
 return !dojo.trim(this.contents);
 },clone:function(){
 return this;
 }});
-dd._NodeList=dojo.extend(function(_6d){
-this.contents=_6d||[];
+dd._NodeList=dojo.extend(function(_50){
+this.contents=_50||[];
 this.last="";
-},{push:function(_6e){
-this.contents.push(_6e);
+},{push:function(_51){
+this.contents.push(_51);
 return this;
-},concat:function(_6f){
-this.contents=this.contents.concat(_6f);
+},concat:function(_52){
+this.contents=this.contents.concat(_52);
 return this;
-},render:function(_70,_71){
+},render:function(_53,_54){
 for(var i=0;i<this.contents.length;i++){
-_71=this.contents[i].render(_70,_71);
-if(!_71){
+_54=this.contents[i].render(_53,_54);
+if(!_54){
 throw new Error("Template must return buffer");
 }
 }
-return _71;
-},dummyRender:function(_73){
-return this.render(_73,dd.Template.prototype.getBuffer()).toString();
+return _54;
+},dummyRender:function(_55){
+return this.render(_55,dd.Template.prototype.getBuffer()).toString();
 },unrender:function(){
 return arguments[1];
 },clone:function(){
@@ -419,12 +419,12 @@ return this;
 }});
 dd._VarNode=dojo.extend(function(str){
 this.contents=new dd._Filter(str);
-},{render:function(_75,_76){
-var str=this.contents.resolve(_75);
+},{render:function(_56,_57){
+var str=this.contents.resolve(_56);
 if(!str.safe){
 str=dd._base.escape(""+str);
 }
-return _76.concat(str);
+return _57.concat(str);
 }});
 dd._noOpNode=new function(){
 this.render=this.unrender=function(){
@@ -434,98 +434,98 @@ this.clone=function(){
 return this;
 };
 };
-dd._Parser=dojo.extend(function(_78){
-this.contents=_78;
-},{i:0,parse:function(_79){
-var _7a={};
-_79=_79||[];
-for(var i=0;i<_79.length;i++){
-_7a[_79[i]]=true;
-}
-var _7c=new dd._NodeList();
+dd._Parser=dojo.extend(function(_58){
+this.contents=_58;
+},{i:0,parse:function(_59){
+var _5a={},_5b;
+_59=_59||[];
+for(var i=0;i<_59.length;i++){
+_5a[_59[i]]=true;
+}
+var _5c=new dd._NodeList();
 while(this.i<this.contents.length){
-token=this.contents[this.i++];
-if(typeof token=="string"){
-_7c.push(new dd._TextNode(token));
+_5b=this.contents[this.i++];
+if(typeof _5b=="string"){
+_5c.push(new dd._TextNode(_5b));
 }else{
-var _7d=token[0];
-var _7e=token[1];
-if(_7d==dd.TOKEN_VAR){
-_7c.push(new dd._VarNode(_7e));
+var _5d=_5b[0];
+var _5e=_5b[1];
+if(_5d==dd.TOKEN_VAR){
+_5c.push(new dd._VarNode(_5e));
 }else{
-if(_7d==dd.TOKEN_BLOCK){
-if(_7a[_7e]){
+if(_5d==dd.TOKEN_BLOCK){
+if(_5a[_5e]){
 --this.i;
-return _7c;
+return _5c;
 }
-var cmd=_7e.split(/\s+/g);
+var cmd=_5e.split(/\s+/g);
 if(cmd.length){
 cmd=cmd[0];
 var fn=ddt.getTag(cmd);
 if(fn){
-_7c.push(fn(this,new dd.Token(_7d,_7e)));
+_5c.push(fn(this,new dd.Token(_5d,_5e)));
 }
 }
 }
 }
 }
 }
-if(_79.length){
-throw new Error("Could not find closing tag(s): "+_79.toString());
+if(_59.length){
+throw new Error("Could not find closing tag(s): "+_59.toString());
 }
 this.contents.length=0;
-return _7c;
+return _5c;
 },next_token:function(){
-var _81=this.contents[this.i++];
-return new dd.Token(_81[0],_81[1]);
+var _5f=this.contents[this.i++];
+return new dd.Token(_5f[0],_5f[1]);
 },delete_first_token:function(){
 this.i++;
-},skip_past:function(_82){
+},skip_past:function(_60){
 while(this.i<this.contents.length){
-var _83=this.contents[this.i++];
-if(_83[0]==dd.TOKEN_BLOCK&&_83[1]==_82){
+var _61=this.contents[this.i++];
+if(_61[0]==dd.TOKEN_BLOCK&&_61[1]==_60){
 return;
 }
 }
-throw new Error("Unclosed tag found when looking for "+_82);
-},create_variable_node:function(_84){
-return new dd._VarNode(_84);
-},create_text_node:function(_85){
-return new dd._TextNode(_85||"");
-},getTemplate:function(_86){
-return new dd.Template(_86);
+throw new Error("Unclosed tag found when looking for "+_60);
+},create_variable_node:function(_62){
+return new dd._VarNode(_62);
+},create_text_node:function(_63){
+return new dd._TextNode(_63||"");
+},getTemplate:function(_64){
+return new dd.Template(_64);
 }});
-dd.register={_registry:{attributes:[],tags:[],filters:[]},get:function(_87,_88){
-var _89=dd.register._registry[_87+"s"];
-for(var i=0,_8b;_8b=_89[i];i++){
-if(typeof _8b[0]=="string"){
-if(_8b[0]==_88){
-return _8b;
+dd.register={_registry:{attributes:[],tags:[],filters:[]},get:function(_65,_66){
+var _67=dd.register._registry[_65+"s"];
+for(var i=0,_68;_68=_67[i];i++){
+if(typeof _68[0]=="string"){
+if(_68[0]==_66){
+return _68;
 }
 }else{
-if(_88.match(_8b[0])){
-return _8b;
+if(_66.match(_68[0])){
+return _68;
 }
 }
 }
 },getAttributeTags:function(){
-var _8c=[];
-var _8d=dd.register._registry.attributes;
-for(var i=0,_8f;_8f=_8d[i];i++){
-if(_8f.length==3){
-_8c.push(_8f);
+var _69=[];
+var _6a=dd.register._registry.attributes;
+for(var i=0,_6b;_6b=_6a[i];i++){
+if(_6b.length==3){
+_69.push(_6b);
 }else{
-var fn=dojo.getObject(_8f[1]);
+var fn=dojo.getObject(_6b[1]);
 if(fn&&dojo.isFunction(fn)){
-_8f.push(fn);
-_8c.push(_8f);
+_6b.push(fn);
+_69.push(_6b);
 }
 }
 }
-return _8c;
-},_any:function(_91,_92,_93){
-for(var _94 in _93){
-for(var i=0,fn;fn=_93[_94][i];i++){
+return _69;
+},_any:function(_6c,_6d,_6e){
+for(var _6f in _6e){
+for(var i=0,fn;fn=_6e[_6f][i];i++){
 var key=fn;
 if(dojo.isArray(fn)){
 key=fn[0];
@@ -533,38 +533,38 @@ fn=fn[1];
 }
 if(typeof key=="string"){
 if(key.substr(0,5)=="attr:"){
-var _98=fn;
-if(_98.substr(0,5)=="attr:"){
-_98=_98.slice(5);
+var _70=fn;
+if(_70.substr(0,5)=="attr:"){
+_70=_70.slice(5);
 }
-dd.register._registry.attributes.push([_98.toLowerCase(),_92+"."+_94+"."+_98]);
+dd.register._registry.attributes.push([_70.toLowerCase(),_6d+"."+_6f+"."+_70]);
 }
 key=key.toLowerCase();
 }
-dd.register._registry[_91].push([key,fn,_92+"."+_94]);
+dd.register._registry[_6c].push([key,fn,_6d+"."+_6f]);
 }
 }
-},tags:function(_99,_9a){
-dd.register._any("tags",_99,_9a);
-},filters:function(_9b,_9c){
-dd.register._any("filters",_9b,_9c);
+},tags:function(_71,_72){
+dd.register._any("tags",_71,_72);
+},filters:function(_73,_74){
+dd.register._any("filters",_73,_74);
 }};
-var _9d=/&/g;
-var _9e=/</g;
-var _9f=/>/g;
-var _a0=/'/g;
-var _a1=/"/g;
-dd._base.escape=function(_a2){
-return dd.mark_safe(_a2.replace(_9d,"&").replace(_9e,"<").replace(_9f,">").replace(_a1,""").replace(_a0,"'"));
+var _75=/&/g;
+var _76=/</g;
+var _77=/>/g;
+var _78=/'/g;
+var _79=/"/g;
+dd._base.escape=function(_7a){
+return dd.mark_safe(_7a.replace(_75,"&").replace(_76,"<").replace(_77,">").replace(_79,""").replace(_78,"'"));
 };
-dd._base.safe=function(_a3){
-if(typeof _a3=="string"){
-_a3=new String(_a3);
+dd._base.safe=function(_7b){
+if(typeof _7b=="string"){
+_7b=new String(_7b);
 }
-if(typeof _a3=="object"){
-_a3.safe=true;
+if(typeof _7b=="object"){
+_7b.safe=true;
 }
-return _a3;
+return _7b;
 };
 dd.mark_safe=dd._base.safe;
 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"]});
diff --git a/dojox/dtl/contrib/data.js b/dojox/dtl/contrib/data.js
index 7389265..2b9ba94 100644
--- a/dojox/dtl/contrib/data.js
+++ b/dojox/dtl/contrib/data.js
@@ -11,111 +11,111 @@ dojo.provide("dojox.dtl.contrib.data");
 dojo.require("dojox.dtl._base");
 (function(){
 var dd=dojox.dtl;
-var _2=dd.contrib.data;
-var _3=true;
-_2._BoundItem=dojo.extend(function(_4,_5){
-this.item=_4;
-this.store=_5;
-},{get:function(_6){
-var _7=this.store;
-var _8=this.item;
-if(_6=="getLabel"){
-return _7.getLabel(_8);
+var _1=dd.contrib.data;
+var _2=true;
+_1._BoundItem=dojo.extend(function(_3,_4){
+this.item=_3;
+this.store=_4;
+},{get:function(_5){
+var _6=this.store;
+var _7=this.item;
+if(_5=="getLabel"){
+return _6.getLabel(_7);
 }else{
-if(_6=="getAttributes"){
-return _7.getAttributes(_8);
+if(_5=="getAttributes"){
+return _6.getAttributes(_7);
 }else{
-if(_6=="getIdentity"){
-if(_7.getIdentity){
-return _7.getIdentity(_8);
+if(_5=="getIdentity"){
+if(_6.getIdentity){
+return _6.getIdentity(_7);
 }
 return "Store has no identity API";
 }else{
-if(!_7.hasAttribute(_8,_6)){
-if(_6.slice(-1)=="s"){
-if(_3){
-_3=false;
+if(!_6.hasAttribute(_7,_5)){
+if(_5.slice(-1)=="s"){
+if(_2){
+_2=false;
 dojo.deprecated("You no longer need an extra s to call getValues, it can be figured out automatically");
 }
-_6=_6.slice(0,-1);
+_5=_5.slice(0,-1);
 }
-if(!_7.hasAttribute(_8,_6)){
+if(!_6.hasAttribute(_7,_5)){
 return;
 }
 }
-var _9=_7.getValues(_8,_6);
-if(!_9){
+var _8=_6.getValues(_7,_5);
+if(!_8){
 return;
 }
-if(!dojo.isArray(_9)){
-return new _2._BoundItem(_9,_7);
+if(!dojo.isArray(_8)){
+return new _1._BoundItem(_8,_6);
 }
-_9=dojo.map(_9,function(_a){
-if(dojo.isObject(_a)&&_7.isItem(_a)){
-return new _2._BoundItem(_a,_7);
+_8=dojo.map(_8,function(_9){
+if(dojo.isObject(_9)&&_6.isItem(_9)){
+return new _1._BoundItem(_9,_6);
 }
-return _a;
-});
-_9.get=_2._get;
 return _9;
+});
+_8.get=_1._get;
+return _8;
 }
 }
 }
 }});
-_2._BoundItem.prototype.get.safe=true;
-_2.BindDataNode=dojo.extend(function(_b,_c,_d,_e){
-this.items=_b&&new dd._Filter(_b);
-this.query=_c&&new dd._Filter(_c);
-this.store=new dd._Filter(_d);
-this.alias=_e;
-},{render:function(_f,_10){
-var _11=this.items&&this.items.resolve(_f);
-var _12=this.query&&this.query.resolve(_f);
-var _13=this.store.resolve(_f);
-if(!_13||!_13.getFeatures){
+_1._BoundItem.prototype.get.safe=true;
+_1.BindDataNode=dojo.extend(function(_a,_b,_c,_d){
+this.items=_a&&new dd._Filter(_a);
+this.query=_b&&new dd._Filter(_b);
+this.store=new dd._Filter(_c);
+this.alias=_d;
+},{render:function(_e,_f){
+var _10=this.items&&this.items.resolve(_e);
+var _11=this.query&&this.query.resolve(_e);
+var _12=this.store.resolve(_e);
+if(!_12||!_12.getFeatures){
 throw new Error("data_bind didn't receive a store");
 }
-if(_12){
-var _14=false;
-_13.fetch({query:_12,sync:true,scope:this,onComplete:function(it){
-_14=true;
-_11=it;
+if(_11){
+var _13=false;
+_12.fetch({query:_11,sync:true,scope:this,onComplete:function(it){
+_13=true;
+_10=it;
 }});
-if(!_14){
+if(!_13){
 throw new Error("The bind_data tag only works with a query if the store executed synchronously");
 }
 }
-var _16=[];
-if(_11){
-for(var i=0,_18;_18=_11[i];i++){
-_16.push(new _2._BoundItem(_18,_13));
+var _14=[];
+if(_10){
+for(var i=0,_15;_15=_10[i];i++){
+_14.push(new _1._BoundItem(_15,_12));
 }
 }
-_f[this.alias]=_16;
-return _10;
-},unrender:function(_19,_1a){
-return _1a;
+_e[this.alias]=_14;
+return _f;
+},unrender:function(_16,_17){
+return _17;
 },clone:function(){
 return this;
 }});
-dojo.mixin(_2,{_get:function(key){
+dojo.mixin(_1,{_get:function(key){
 if(this.length){
-return (this[0] instanceof _2._BoundItem)?this[0].get(key):this[0][key];
+return (this[0] instanceof _1._BoundItem)?this[0].get(key):this[0][key];
 }
-},bind_data:function(_1c,_1d){
-var _1e=_1d.contents.split();
-if(_1e[2]!="to"||_1e[4]!="as"||!_1e[5]){
+},bind_data:function(_18,_19){
+var _1a=_19.contents.split();
+if(_1a[2]!="to"||_1a[4]!="as"||!_1a[5]){
 throw new Error("data_bind expects the format: 'data_bind items to store as varName'");
 }
-return new _2.BindDataNode(_1e[1],null,_1e[3],_1e[5]);
-},bind_query:function(_1f,_20){
-var _21=_20.contents.split();
-if(_21[2]!="to"||_21[4]!="as"||!_21[5]){
+return new _1.BindDataNode(_1a[1],null,_1a[3],_1a[5]);
+},bind_query:function(_1b,_1c){
+var _1d=_1c.contents.split();
+if(_1d[2]!="to"||_1d[4]!="as"||!_1d[5]){
 throw new Error("data_bind expects the format: 'bind_query query to store as varName'");
 }
-return new _2.BindDataNode(null,_21[1],_21[3],_21[5]);
+return new _1.BindDataNode(null,_1d[1],_1d[3],_1d[5]);
 }});
-_2._get.safe=true;
+_1._get.safe=true;
 dd.register.tags("dojox.dtl.contrib",{"data":["bind_data","bind_query"]});
 })();
 }
diff --git a/dojox/dtl/contrib/dijit.js b/dojox/dtl/contrib/dijit.js
index e4c340b..0050188 100644
--- a/dojox/dtl/contrib/dijit.js
+++ b/dojox/dtl/contrib/dijit.js
@@ -12,172 +12,172 @@ dojo.require("dojox.dtl.dom");
 dojo.require("dojo.parser");
 (function(){
 var dd=dojox.dtl;
-var _2=dd.contrib.dijit;
-_2.AttachNode=dojo.extend(function(_3,_4){
-this._keys=_3;
-this._object=_4;
-},{render:function(_5,_6){
+var _1=dd.contrib.dijit;
+_1.AttachNode=dojo.extend(function(_2,_3){
+this._keys=_2;
+this._object=_3;
+},{render:function(_4,_5){
 if(!this._rendered){
 this._rendered=true;
-for(var i=0,_8;_8=this._keys[i];i++){
-_5.getThis()[_8]=this._object||_6.getParent();
+for(var i=0,_6;_6=this._keys[i];i++){
+_4.getThis()[_6]=this._object||_5.getParent();
 }
 }
-return _6;
-},unrender:function(_9,_a){
+return _5;
+},unrender:function(_7,_8){
 if(this._rendered){
 this._rendered=false;
-for(var i=0,_c;_c=this._keys[i];i++){
-if(_9.getThis()[_c]===(this._object||_a.getParent())){
-delete _9.getThis()[_c];
+for(var i=0,_9;_9=this._keys[i];i++){
+if(_7.getThis()[_9]===(this._object||_8.getParent())){
+delete _7.getThis()[_9];
 }
 }
 }
-return _a;
-},clone:function(_d){
+return _8;
+},clone:function(_a){
 return new this.constructor(this._keys,this._object);
 }});
-_2.EventNode=dojo.extend(function(_e,_f){
-this._command=_e;
-var _10,_11=_e.split(/\s*,\s*/);
-var _12=dojo.trim;
-var _13=[];
+_1.EventNode=dojo.extend(function(_b,_c){
+this._command=_b;
+var _d,_e=_b.split(/\s*,\s*/);
+var _f=dojo.trim;
+var _10=[];
 var fns=[];
-while(_10=_11.pop()){
-if(_10){
+while(_d=_e.pop()){
+if(_d){
 var fn=null;
-if(_10.indexOf(":")!=-1){
-var _16=_10.split(":");
-_10=_12(_16[0]);
-fn=_12(_16.slice(1).join(":"));
+if(_d.indexOf(":")!=-1){
+var _11=_d.split(":");
+_d=_f(_11[0]);
+fn=_f(_11.slice(1).join(":"));
 }else{
-_10=_12(_10);
+_d=_f(_d);
 }
 if(!fn){
-fn=_10;
+fn=_d;
 }
-_13.push(_10);
+_10.push(_d);
 fns.push(fn);
 }
 }
-this._types=_13;
+this._types=_10;
 this._fns=fns;
-this._object=_f;
+this._object=_c;
 this._rendered=[];
-},{_clear:false,render:function(_17,_18){
-for(var i=0,_1a;_1a=this._types[i];i++){
+},{_clear:false,render:function(_12,_13){
+for(var i=0,_14;_14=this._types[i];i++){
 if(!this._clear&&!this._object){
-_18.getParent()[_1a]=null;
+_13.getParent()[_14]=null;
 }
 var fn=this._fns[i];
-var _1c;
+var _15;
 if(fn.indexOf(" ")!=-1){
 if(this._rendered[i]){
 dojo.disconnect(this._rendered[i]);
 this._rendered[i]=false;
 }
-_1c=dojo.map(fn.split(" ").slice(1),function(_1d){
-return new dd._Filter(_1d).resolve(_17);
+_15=dojo.map(fn.split(" ").slice(1),function(_16){
+return new dd._Filter(_16).resolve(_12);
 });
 fn=fn.split(" ",2)[0];
 }
 if(!this._rendered[i]){
 if(!this._object){
-this._rendered[i]=_18.addEvent(_17,_1a,fn,_1c);
+this._rendered[i]=_13.addEvent(_12,_14,fn,_15);
 }else{
-this._rendered[i]=dojo.connect(this._object,_1a,_17.getThis(),fn);
+this._rendered[i]=dojo.connect(this._object,_14,_12.getThis(),fn);
 }
 }
 }
 this._clear=true;
-return _18;
-},unrender:function(_1e,_1f){
+return _13;
+},unrender:function(_17,_18){
 while(this._rendered.length){
 dojo.disconnect(this._rendered.pop());
 }
-return _1f;
+return _18;
 },clone:function(){
 return new this.constructor(this._command,this._object);
 }});
-function _20(n1){
+function _19(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;
 };
-_2.DojoTypeNode=dojo.extend(function(_23,_24){
-this._node=_23;
-this._parsed=_24;
-var _25=_23.getAttribute("dojoAttachEvent");
-if(_25){
-this._events=new _2.EventNode(dojo.trim(_25));
-}
-var _26=_23.getAttribute("dojoAttachPoint");
-if(_26){
-this._attach=new _2.AttachNode(dojo.trim(_26).split(/\s*,\s*/));
-}
-if(!_24){
-this._dijit=dojo.parser.instantiate([_20(_23)])[0];
+_1.DojoTypeNode=dojo.extend(function(_1a,_1b){
+this._node=_1a;
+this._parsed=_1b;
+var _1c=_1a.getAttribute("dojoAttachEvent");
+if(_1c){
+this._events=new _1.EventNode(dojo.trim(_1c));
+}
+var _1d=_1a.getAttribute("dojoAttachPoint");
+if(_1d){
+this._attach=new _1.AttachNode(dojo.trim(_1d).split(/\s*,\s*/));
+}
+if(!_1b){
+this._dijit=dojo.parser.instantiate([_19(_1a)])[0];
 }else{
-_23=_20(_23);
-var old=_2.widgetsInTemplate;
-_2.widgetsInTemplate=false;
-this._template=new dd.DomTemplate(_23);
-_2.widgetsInTemplate=old;
+_1a=_19(_1a);
+var old=_1.widgetsInTemplate;
+_1.widgetsInTemplate=false;
+this._template=new dd.DomTemplate(_1a);
+_1.widgetsInTemplate=old;
 }
-},{render:function(_28,_29){
+},{render:function(_1e,_1f){
 if(this._parsed){
-var _2a=new dd.DomBuffer();
-this._template.render(_28,_2a);
-var _2b=_20(_2a.getRootNode());
+var _20=new dd.DomBuffer();
+this._template.render(_1e,_20);
+var _21=_19(_20.getRootNode());
 var div=document.createElement("div");
-div.appendChild(_2b);
-var _2d=div.innerHTML;
-div.removeChild(_2b);
-if(_2d!=this._rendered){
-this._rendered=_2d;
+div.appendChild(_21);
+var _22=div.innerHTML;
+div.removeChild(_21);
+if(_22!=this._rendered){
+this._rendered=_22;
 if(this._dijit){
 this._dijit.destroyRecursive();
 }
-this._dijit=dojo.parser.instantiate([_2b])[0];
+this._dijit=dojo.parser.instantiate([_21])[0];
 }
 }
-var _2e=this._dijit.domNode;
+var _23=this._dijit.domNode;
 if(this._events){
 this._events._object=this._dijit;
-this._events.render(_28,_29);
+this._events.render(_1e,_1f);
 }
 if(this._attach){
 this._attach._object=this._dijit;
-this._attach.render(_28,_29);
+this._attach.render(_1e,_1f);
 }
-return _29.concat(_2e);
-},unrender:function(_2f,_30){
-return _30.remove(this._dijit.domNode);
+return _1f.concat(_23);
+},unrender:function(_24,_25){
+return _25.remove(this._dijit.domNode);
 },clone:function(){
 return new this.constructor(this._node,this._parsed);
 }});
-dojo.mixin(_2,{widgetsInTemplate:true,dojoAttachPoint:function(_31,_32){
-return new _2.AttachNode(_32.contents.slice(16).split(/\s*,\s*/));
-},dojoAttachEvent:function(_33,_34){
-return new _2.EventNode(_34.contents.slice(16));
-},dojoType:function(_35,_36){
-var _37=false;
-if(_36.contents.slice(-7)==" parsed"){
-_37=true;
-}
-var _38=_36.contents.slice(9);
-var _39=_37?_38.slice(0,-7):_38.toString();
-if(_2.widgetsInTemplate){
-var _3a=_35.swallowNode();
-_3a.setAttribute("dojoType",_39);
-return new _2.DojoTypeNode(_3a,_37);
-}
-return new dd.AttributeNode("dojoType",_39);
-},on:function(_3b,_3c){
-var _3d=_3c.contents.split();
-return new _2.EventNode(_3d[0]+":"+_3d.slice(1).join(" "));
+dojo.mixin(_1,{widgetsInTemplate:true,dojoAttachPoint:function(_26,_27){
+return new _1.AttachNode(_27.contents.slice(16).split(/\s*,\s*/));
+},dojoAttachEvent:function(_28,_29){
+return new _1.EventNode(_29.contents.slice(16));
+},dojoType:function(_2a,_2b){
+var _2c=false;
+if(_2b.contents.slice(-7)==" parsed"){
+_2c=true;
+}
+var _2d=_2b.contents.slice(9);
+var _2e=_2c?_2d.slice(0,-7):_2d.toString();
+if(_1.widgetsInTemplate){
+var _2f=_2a.swallowNode();
+_2f.setAttribute("dojoType",_2e);
+return new _1.DojoTypeNode(_2f,_2c);
+}
+return new dd.AttributeNode("dojoType",_2e);
+},on:function(_30,_31){
+var _32=_31.contents.split();
+return new _1.EventNode(_32[0]+":"+_32.slice(1).join(" "));
 }});
 dd.register.tags("dojox.dtl.contrib",{"dijit":["attr:dojoType","attr:dojoAttachPoint",["attr:attach","dojoAttachPoint"],"attr:dojoAttachEvent",[/(attr:)?on(click|key(up))/i,"on"]]});
 })();
diff --git a/dojox/dtl/contrib/dom.js b/dojox/dtl/contrib/dom.js
index dd74cb7..b3af170 100644
--- a/dojox/dtl/contrib/dom.js
+++ b/dojox/dtl/contrib/dom.js
@@ -11,49 +11,49 @@ dojo.provide("dojox.dtl.contrib.dom");
 dojo.require("dojox.dtl.dom");
 (function(){
 var dd=dojox.dtl;
-var _2=dd.contrib.dom;
-var _3={render:function(){
+var _1=dd.contrib.dom;
+var _2={render:function(){
 return this.contents;
 }};
-_2.StyleNode=dojo.extend(function(_4){
+_1.StyleNode=dojo.extend(function(_3){
 this.contents={};
 this._current={};
-this._styles=_4;
-for(var _5 in _4){
-if(_4[_5].indexOf("{{")!=-1){
-var _6=new dd.Template(_4[_5]);
+this._styles=_3;
+for(var _4 in _3){
+if(_3[_4].indexOf("{{")!=-1){
+var _5=new dd.Template(_3[_4]);
 }else{
-var _6=dojo.delegate(_3);
-_6.contents=_4[_5];
+var _5=dojo.delegate(_2);
+_5.contents=_3[_4];
 }
-this.contents[_5]=_6;
+this.contents[_4]=_5;
 }
-},{render:function(_7,_8){
-for(var _9 in this.contents){
-var _a=this.contents[_9].render(_7);
-if(this._current[_9]!=_a){
-dojo.style(_8.getParent(),_9,this._current[_9]=_a);
+},{render:function(_6,_7){
+for(var _8 in this.contents){
+var _9=this.contents[_8].render(_6);
+if(this._current[_8]!=_9){
+dojo.style(_7.getParent(),_8,this._current[_8]=_9);
 }
 }
-return _8;
-},unrender:function(_b,_c){
+return _7;
+},unrender:function(_a,_b){
 this._current={};
-return _c;
-},clone:function(_d){
+return _b;
+},clone:function(_c){
 return new this.constructor(this._styles);
 }});
-_2.BufferNode=dojo.extend(function(_e,_f){
-this.nodelist=_e;
-this.options=_f;
-},{_swap:function(_10,_11){
+_1.BufferNode=dojo.extend(function(_d,_e){
+this.nodelist=_d;
+this.options=_e;
+},{_swap:function(_f,_10){
 if(!this.swapped&&this.parent.parentNode){
-if(_10=="node"){
-if((_11.nodeType==3&&!this.options.text)||(_11.nodeType==1&&!this.options.node)){
+if(_f=="node"){
+if((_10.nodeType==3&&!this.options.text)||(_10.nodeType==1&&!this.options.node)){
 return;
 }
 }else{
-if(_10=="class"){
-if(_10!="class"){
+if(_f=="class"){
+if(_f!="class"){
 return;
 }
 }
@@ -65,19 +65,19 @@ this.onChangeData&&dojo.disconnect(this.onChangeData);
 this.swapped=this.parent.cloneNode(true);
 this.parent.parentNode.replaceChild(this.swapped,this.parent);
 }
-},render:function(_12,_13){
-this.parent=_13.getParent();
+},render:function(_11,_12){
+this.parent=_12.getParent();
 if(this.options.node){
-this.onAddNode=dojo.connect(_13,"onAddNode",dojo.hitch(this,"_swap","node"));
-this.onRemoveNode=dojo.connect(_13,"onRemoveNode",dojo.hitch(this,"_swap","node"));
+this.onAddNode=dojo.connect(_12,"onAddNode",dojo.hitch(this,"_swap","node"));
+this.onRemoveNode=dojo.connect(_12,"onRemoveNode",dojo.hitch(this,"_swap","node"));
 }
 if(this.options.text){
-this.onChangeData=dojo.connect(_13,"onChangeData",dojo.hitch(this,"_swap","node"));
+this.onChangeData=dojo.connect(_12,"onChangeData",dojo.hitch(this,"_swap","node"));
 }
 if(this.options["class"]){
-this.onChangeAttribute=dojo.connect(_13,"onChangeAttribute",dojo.hitch(this,"_swap","class"));
+this.onChangeAttribute=dojo.connect(_12,"onChangeAttribute",dojo.hitch(this,"_swap","class"));
 }
-_13=this.nodelist.render(_12,_13);
+_12=this.nodelist.render(_11,_12);
 if(this.swapped){
 this.swapped.parentNode.replaceChild(this.parent,this.swapped);
 dojo.destroy(this.swapped);
@@ -89,42 +89,42 @@ this.onChangeData&&dojo.disconnect(this.onChangeData);
 }
 delete this.parent;
 delete this.swapped;
-return _13;
-},unrender:function(_14,_15){
-return this.nodelist.unrender(_14,_15);
-},clone:function(_16){
-return new this.constructor(this.nodelist.clone(_16),this.options);
+return _12;
+},unrender:function(_13,_14){
+return this.nodelist.unrender(_13,_14);
+},clone:function(_15){
+return new this.constructor(this.nodelist.clone(_15),this.options);
 }});
-dojo.mixin(_2,{buffer:function(_17,_18){
-var _19=_18.contents.split().slice(1);
-var _1a={};
-var _1b=false;
-for(var i=_19.length;i--;){
-_1b=true;
-_1a[_19[i]]=true;
-}
-if(!_1b){
-_1a.node=true;
-}
-var _1d=_17.parse(["endbuffer"]);
-_17.next_token();
-return new _2.BufferNode(_1d,_1a);
-},html:function(_1e,_1f){
+dojo.mixin(_1,{buffer:function(_16,_17){
+var _18=_17.contents.split().slice(1);
+var _19={};
+var _1a=false;
+for(var i=_18.length;i--;){
+_1a=true;
+_19[_18[i]]=true;
+}
+if(!_1a){
+_19.node=true;
+}
+var _1b=_16.parse(["endbuffer"]);
+_16.next_token();
+return new _1.BufferNode(_1b,_19);
+},html:function(_1c,_1d){
 dojo.deprecated("{% html someVariable %}","Use {{ someVariable|safe }} instead");
-return _1e.create_variable_node(_1f.contents.slice(5)+"|safe");
-},style_:function(_20,_21){
-var _22={};
-_21=_21.contents.replace(/^style\s+/,"");
-var _23=_21.split(/\s*;\s*/g);
-for(var i=0,_25;_25=_23[i];i++){
-var _26=_25.split(/\s*:\s*/g);
-var key=_26[0];
-var _28=dojo.trim(_26[1]);
-if(_28){
-_22[key]=_28;
-}
-}
-return new _2.StyleNode(_22);
+return _1c.create_variable_node(_1d.contents.slice(5)+"|safe");
+},style_:function(_1e,_1f){
+var _20={};
+_1f=_1f.contents.replace(/^style\s+/,"");
+var _21=_1f.split(/\s*;\s*/g);
+for(var i=0,_22;_22=_21[i];i++){
+var _23=_22.split(/\s*:\s*/g);
+var key=_23[0];
+var _24=dojo.trim(_23[1]);
+if(_24){
+_20[key]=_24;
+}
+}
+return new _1.StyleNode(_20);
 }});
 dd.register.tags("dojox.dtl.contrib",{"dom":["html","attr:style","buffer"]});
 })();
diff --git a/dojox/dtl/dom.js b/dojox/dtl/dom.js
index 7c62cbe..4246b49 100644
--- a/dojox/dtl/dom.js
+++ b/dojox/dtl/dom.js
@@ -17,213 +17,213 @@ dd.TOKEN_CHANGE=-11;
 dd.TOKEN_ATTR=-12;
 dd.TOKEN_CUSTOM=-13;
 dd.TOKEN_NODE=1;
-var _2=dd.text;
-var _3=dd.dom={_attributes:{},_uppers:{},_re4:/^function anonymous\(\)\s*{\s*(.*)\s*}$/,_reTrim:/(?:^[\n\s]*(\{%)?\s*|\s*(%\})?[\n\s]*$)/g,_reSplit:/\s*%\}[\n\s]*\{%\s*/g,getTemplate:function(_4){
+var _1=dd.text;
+var _2=dd.dom={_attributes:{},_uppers:{},_re4:/^function anonymous\(\)\s*{\s*(.*)\s*}$/,_reTrim:/(?:^[\n\s]*(\{%)?\s*|\s*(%\})?[\n\s]*$)/g,_reSplit:/\s*%\}[\n\s]*\{%\s*/g,getTemplate:function(_3){
 if(typeof this._commentable=="undefined"){
 this._commentable=false;
-var _5=document.createElement("div");
-_5.innerHTML="<!--Test comment handling, and long comments, using comments whenever possible.-->";
-if(_5.childNodes.length&&_5.childNodes[0].nodeType==8&&_5.childNodes[0].data=="comment"){
+var _4=document.createElement("div");
+_4.innerHTML="<!--Test comment handling, and long comments, using comments whenever possible.-->";
+if(_4.childNodes.length&&_4.childNodes[0].nodeType==8&&_4.childNodes[0].data=="comment"){
 this._commentable=true;
 }
 }
 if(!this._commentable){
-_4=_4.replace(/<!--({({|%).*?(%|})})-->/g,"$1");
+_3=_3.replace(/<!--({({|%).*?(%|})})-->/g,"$1");
 }
 if(dojo.isIE){
-_4=_4.replace(/\b(checked|disabled|readonly|style)="/g,"t$1=\"");
-}
-_4=_4.replace(/\bstyle="/g,"tstyle=\"");
-var _6;
-var _7=dojo.isWebKit;
-var _8=[[true,"select","option"],[_7,"tr","td|th"],[_7,"thead","tr","th"],[_7,"tbody","tr","td"],[_7,"table","tbody|thead|tr","tr","td"]];
-var _9=[];
-for(var i=0,_b;_b=_8[i];i++){
-if(!_b[0]){
+_3=_3.replace(/\b(checked|disabled|readonly|style)="/g,"t$1=\"");
+}
+_3=_3.replace(/\bstyle="/g,"tstyle=\"");
+var _5;
+var _6=dojo.isWebKit;
+var _7=[[true,"select","option"],[_6,"tr","td|th"],[_6,"thead","tr","th"],[_6,"tbody","tr","td"],[_6,"table","tbody|thead|tr","tr","td"]];
+var _8=[];
+for(var i=0,_9;_9=_7[i];i++){
+if(!_9[0]){
 continue;
 }
-if(_4.indexOf("<"+_b[1])!=-1){
-var _c=new RegExp("<"+_b[1]+"(?:.|\n)*?>((?:.|\n)+?)</"+_b[1]+">","ig");
+if(_3.indexOf("<"+_9[1])!=-1){
+var _a=new RegExp("<"+_9[1]+"(?:.|\n)*?>((?:.|\n)+?)</"+_9[1]+">","ig");
 tagLoop:
-while(_6=_c.exec(_4)){
-var _d=_b[2].split("|");
-var _e=[];
-for(var j=0,_10;_10=_d[j];j++){
-_e.push("<"+_10+"(?:.|\n)*?>(?:.|\n)*?</"+_10+">");
+while(_5=_a.exec(_3)){
+var _b=_9[2].split("|");
+var _c=[];
+for(var j=0,_d;_d=_b[j];j++){
+_c.push("<"+_d+"(?:.|\n)*?>(?:.|\n)*?</"+_d+">");
 }
-var _11=[];
-var _12=dojox.string.tokenize(_6[1],new RegExp("("+_e.join("|")+")","ig"),function(_13){
-var tag=/<(\w+)/.exec(_13)[1];
-if(!_11[tag]){
-_11[tag]=true;
-_11.push(tag);
+var _e=[];
+var _f=dojox.string.tokenize(_5[1],new RegExp("("+_c.join("|")+")","ig"),function(_10){
+var tag=/<(\w+)/.exec(_10)[1];
+if(!_e[tag]){
+_e[tag]=true;
+_e.push(tag);
 }
-return {data:_13};
+return {data:_10};
 });
-if(_11.length){
-var tag=(_11.length==1)?_11[0]:_b[2].split("|")[0];
-var _16=[];
-for(var j=0,jl=_12.length;j<jl;j++){
-var _18=_12[j];
-if(dojo.isObject(_18)){
-_16.push(_18.data);
-}else{
-var _19=_18.replace(this._reTrim,"");
-if(!_19){
+if(_e.length){
+var tag=(_e.length==1)?_e[0]:_9[2].split("|")[0];
+var _11=[];
+for(var j=0,jl=_f.length;j<jl;j++){
+var _12=_f[j];
+if(dojo.isObject(_12)){
+_11.push(_12.data);
+}else{
+var _13=_12.replace(this._reTrim,"");
+if(!_13){
 continue;
 }
-_18=_19.split(this._reSplit);
-for(var k=0,kl=_18.length;k<kl;k++){
-var _1c="";
-for(var p=2,pl=_b.length;p<pl;p++){
+_12=_13.split(this._reSplit);
+for(var k=0,kl=_12.length;k<kl;k++){
+var _14="";
+for(var p=2,pl=_9.length;p<pl;p++){
 if(p==2){
-_1c+="<"+tag+" dtlinstruction=\"{% "+_18[k].replace("\"","\\\"")+" %}\">";
+_14+="<"+tag+" dtlinstruction=\"{% "+_12[k].replace("\"","\\\"")+" %}\">";
 }else{
-if(tag==_b[p]){
+if(tag==_9[p]){
 continue;
 }else{
-_1c+="<"+_b[p]+">";
+_14+="<"+_9[p]+">";
 }
 }
 }
-_1c+="DTL";
-for(var p=_b.length-1;p>1;p--){
+_14+="DTL";
+for(var p=_9.length-1;p>1;p--){
 if(p==2){
-_1c+="</"+tag+">";
+_14+="</"+tag+">";
 }else{
-if(tag==_b[p]){
+if(tag==_9[p]){
 continue;
 }else{
-_1c+="</"+_b[p]+">";
+_14+="</"+_9[p]+">";
 }
 }
 }
-_16.push("ÿ"+_9.length);
-_9.push(_1c);
+_11.push("ÿ"+_8.length);
+_8.push(_14);
 }
 }
 }
-_4=_4.replace(_6[1],_16.join(""));
+_3=_3.replace(_5[1],_11.join(""));
 }
 }
 }
 }
-for(var i=_9.length;i--;){
-_4=_4.replace("ÿ"+i,_9[i]);
+for(var i=_8.length;i--;){
+_3=_3.replace("ÿ"+i,_8[i]);
 }
 var re=/\b([a-zA-Z_:][a-zA-Z0-9_\-\.:]*)=['"]/g;
-while(_6=re.exec(_4)){
-var _20=_6[1].toLowerCase();
-if(_20=="dtlinstruction"){
+while(_5=re.exec(_3)){
+var _15=_5[1].toLowerCase();
+if(_15=="dtlinstruction"){
 continue;
 }
-if(_20!=_6[1]){
-this._uppers[_20]=_6[1];
+if(_15!=_5[1]){
+this._uppers[_15]=_5[1];
 }
-this._attributes[_20]=true;
+this._attributes[_15]=true;
 }
-var _5=document.createElement("div");
-_5.innerHTML=_4;
-var _21={nodes:[]};
-while(_5.childNodes.length){
-_21.nodes.push(_5.removeChild(_5.childNodes[0]));
+var _4=document.createElement("div");
+_4.innerHTML=_3;
+var _16={nodes:[]};
+while(_4.childNodes.length){
+_16.nodes.push(_4.removeChild(_4.childNodes[0]));
 }
-return _21;
-},tokenize:function(_22){
-var _23=[];
-for(var i=0,_25;_25=_22[i++];){
-if(_25.nodeType!=1){
-this.__tokenize(_25,_23);
+return _16;
+},tokenize:function(_17){
+var _18=[];
+for(var i=0,_19;_19=_17[i++];){
+if(_19.nodeType!=1){
+this.__tokenize(_19,_18);
 }else{
-this._tokenize(_25,_23);
+this._tokenize(_19,_18);
 }
 }
-return _23;
-},_swallowed:[],_tokenize:function(_26,_27){
-var _28=false;
-var _29=this._swallowed;
-var i,j,tag,_2d;
-if(!_27.first){
-_28=_27.first=true;
-var _2e=dd.register.getAttributeTags();
-for(i=0;tag=_2e[i];i++){
+return _18;
+},_swallowed:[],_tokenize:function(_1a,_1b){
+var _1c=false;
+var _1d=this._swallowed;
+var i,j,tag,_1e;
+if(!_1b.first){
+_1c=_1b.first=true;
+var _1f=dd.register.getAttributeTags();
+for(i=0;tag=_1f[i];i++){
 try{
 (tag[2])({swallowNode:function(){
 throw 1;
 }},new dd.Token(dd.TOKEN_ATTR,""));
 }
 catch(e){
-_29.push(tag);
+_1d.push(tag);
 }
 }
 }
-for(i=0;tag=_29[i];i++){
-var _2f=_26.getAttribute(tag[0]);
-if(_2f){
-var _29=false;
-var _30=(tag[2])({swallowNode:function(){
-_29=true;
-return _26;
-}},new dd.Token(dd.TOKEN_ATTR,tag[0]+" "+_2f));
-if(_29){
-if(_26.parentNode&&_26.parentNode.removeChild){
-_26.parentNode.removeChild(_26);
+for(i=0;tag=_1d[i];i++){
+var _20=_1a.getAttribute(tag[0]);
+if(_20){
+var _1d=false;
+var _21=(tag[2])({swallowNode:function(){
+_1d=true;
+return _1a;
+}},new dd.Token(dd.TOKEN_ATTR,tag[0]+" "+_20));
+if(_1d){
+if(_1a.parentNode&&_1a.parentNode.removeChild){
+_1a.parentNode.removeChild(_1a);
 }
-_27.push([dd.TOKEN_CUSTOM,_30]);
+_1b.push([dd.TOKEN_CUSTOM,_21]);
 return;
 }
 }
 }
-var _31=[];
-if(dojo.isIE&&_26.tagName=="SCRIPT"){
-_31.push({nodeType:3,data:_26.text});
-_26.text="";
+var _22=[];
+if(dojo.isIE&&_1a.tagName=="SCRIPT"){
+_22.push({nodeType:3,data:_1a.text});
+_1a.text="";
 }else{
-for(i=0;_2d=_26.childNodes[i];i++){
-_31.push(_2d);
+for(i=0;_1e=_1a.childNodes[i];i++){
+_22.push(_1e);
 }
 }
-_27.push([dd.TOKEN_NODE,_26]);
-var _32=false;
-if(_31.length){
-_27.push([dd.TOKEN_CHANGE,_26]);
-_32=true;
+_1b.push([dd.TOKEN_NODE,_1a]);
+var _23=false;
+if(_22.length){
+_1b.push([dd.TOKEN_CHANGE,_1a]);
+_23=true;
 }
 for(var key in this._attributes){
-var _34=false;
-var _35="";
+var _24=false;
+var _25="";
 if(key=="class"){
-_35=_26.className||_35;
+_25=_1a.className||_25;
 }else{
 if(key=="for"){
-_35=_26.htmlFor||_35;
+_25=_1a.htmlFor||_25;
 }else{
-if(key=="value"&&_26.value==_26.innerHTML){
+if(key=="value"&&_1a.value==_1a.innerHTML){
 continue;
 }else{
-if(_26.getAttribute){
-_35=_26.getAttribute(key,2)||_35;
+if(_1a.getAttribute){
+_25=_1a.getAttribute(key,2)||_25;
 if(key=="href"||key=="src"){
 if(dojo.isIE){
-var _36=location.href.lastIndexOf(location.hash);
-var _37=location.href.substring(0,_36).split("/");
-_37.pop();
-_37=_37.join("/")+"/";
-if(_35.indexOf(_37)==0){
-_35=_35.replace(_37,"");
+var _26=location.href.lastIndexOf(location.hash);
+var _27=location.href.substring(0,_26).split("/");
+_27.pop();
+_27=_27.join("/")+"/";
+if(_25.indexOf(_27)==0){
+_25=_25.replace(_27,"");
 }
-_35=decodeURIComponent(_35);
+_25=decodeURIComponent(_25);
 }
 }else{
 if(key=="tstyle"){
-_34=key;
+_24=key;
 key="style";
 }else{
-if(dd.BOOLS[key.slice(1)]&&dojo.trim(_35)){
+if(dd.BOOLS[key.slice(1)]&&dojo.trim(_25)){
 key=key.slice(1);
 }else{
-if(this._uppers[key]&&dojo.trim(_35)){
-_34=this._uppers[key];
+if(this._uppers[key]&&dojo.trim(_25)){
+_24=this._uppers[key];
 }
 }
 }
@@ -232,166 +232,166 @@ _34=this._uppers[key];
 }
 }
 }
-if(_34){
-_26.setAttribute(_34,"");
-_26.removeAttribute(_34);
+if(_24){
+_1a.setAttribute(_24,"");
+_1a.removeAttribute(_24);
 }
-if(typeof _35=="function"){
-_35=_35.toString().replace(this._re4,"$1");
+if(typeof _25=="function"){
+_25=_25.toString().replace(this._re4,"$1");
 }
-if(!_32){
-_27.push([dd.TOKEN_CHANGE,_26]);
-_32=true;
+if(!_23){
+_1b.push([dd.TOKEN_CHANGE,_1a]);
+_23=true;
 }
-_27.push([dd.TOKEN_ATTR,_26,key,_35]);
+_1b.push([dd.TOKEN_ATTR,_1a,key,_25]);
 }
-for(i=0,_2d;_2d=_31[i];i++){
-if(_2d.nodeType==1){
-var _38=_2d.getAttribute("dtlinstruction");
-if(_38){
-_2d.parentNode.removeChild(_2d);
-_2d={nodeType:8,data:_38};
+for(i=0,_1e;_1e=_22[i];i++){
+if(_1e.nodeType==1){
+var _28=_1e.getAttribute("dtlinstruction");
+if(_28){
+_1e.parentNode.removeChild(_1e);
+_1e={nodeType:8,data:_28};
 }
 }
-this.__tokenize(_2d,_27);
+this.__tokenize(_1e,_1b);
 }
-if(!_28&&_26.parentNode&&_26.parentNode.tagName){
-if(_32){
-_27.push([dd.TOKEN_CHANGE,_26,true]);
+if(!_1c&&_1a.parentNode&&_1a.parentNode.tagName){
+if(_23){
+_1b.push([dd.TOKEN_CHANGE,_1a,true]);
 }
-_27.push([dd.TOKEN_CHANGE,_26.parentNode]);
-_26.parentNode.removeChild(_26);
+_1b.push([dd.TOKEN_CHANGE,_1a.parentNode]);
+_1a.parentNode.removeChild(_1a);
 }else{
-_27.push([dd.TOKEN_CHANGE,_26,true,true]);
+_1b.push([dd.TOKEN_CHANGE,_1a,true,true]);
 }
-},__tokenize:function(_39,_3a){
-var _3b=_39.data;
-switch(_39.nodeType){
+},__tokenize:function(_29,_2a){
+var _2b=_29.data;
+switch(_29.nodeType){
 case 1:
-this._tokenize(_39,_3a);
+this._tokenize(_29,_2a);
 return;
 case 3:
-if(_3b.match(/[^\s\n]/)&&(_3b.indexOf("{{")!=-1||_3b.indexOf("{%")!=-1)){
-var _3c=_2.tokenize(_3b);
-for(var j=0,_3e;_3e=_3c[j];j++){
-if(typeof _3e=="string"){
-_3a.push([dd.TOKEN_TEXT,_3e]);
+if(_2b.match(/[^\s\n]/)&&(_2b.indexOf("{{")!=-1||_2b.indexOf("{%")!=-1)){
+var _2c=_1.tokenize(_2b);
+for(var j=0,_2d;_2d=_2c[j];j++){
+if(typeof _2d=="string"){
+_2a.push([dd.TOKEN_TEXT,_2d]);
 }else{
-_3a.push(_3e);
+_2a.push(_2d);
 }
 }
 }else{
-_3a.push([_39.nodeType,_39]);
+_2a.push([_29.nodeType,_29]);
 }
-if(_39.parentNode){
-_39.parentNode.removeChild(_39);
+if(_29.parentNode){
+_29.parentNode.removeChild(_29);
 }
 return;
 case 8:
-if(_3b.indexOf("{%")==0){
-var _3e=dojo.trim(_3b.slice(2,-2));
-if(_3e.substr(0,5)=="load "){
-var _3f=dojo.trim(_3e).split(/\s+/g);
-for(var i=1,_41;_41=_3f[i];i++){
-dojo["require"](_41);
+if(_2b.indexOf("{%")==0){
+var _2d=dojo.trim(_2b.slice(2,-2));
+if(_2d.substr(0,5)=="load "){
+var _2e=dojo.trim(_2d).split(/\s+/g);
+for(var i=1,_2f;_2f=_2e[i];i++){
+dojo["require"](_2f);
 }
 }
-_3a.push([dd.TOKEN_BLOCK,_3e]);
+_2a.push([dd.TOKEN_BLOCK,_2d]);
 }
-if(_3b.indexOf("{{")==0){
-_3a.push([dd.TOKEN_VAR,dojo.trim(_3b.slice(2,-2))]);
+if(_2b.indexOf("{{")==0){
+_2a.push([dd.TOKEN_VAR,dojo.trim(_2b.slice(2,-2))]);
 }
-if(_39.parentNode){
-_39.parentNode.removeChild(_39);
+if(_29.parentNode){
+_29.parentNode.removeChild(_29);
 }
 return;
 }
 }};
 dd.DomTemplate=dojo.extend(function(obj){
 if(!obj.nodes){
-var _43=dojo.byId(obj);
-if(_43&&_43.nodeType==1){
-dojo.forEach(["class","src","href","name","value"],function(_44){
-_3._attributes[_44]=true;
+var _30=dojo.byId(obj);
+if(_30&&_30.nodeType==1){
+dojo.forEach(["class","src","href","name","value"],function(_31){
+_2._attributes[_31]=true;
 });
-obj={nodes:[_43]};
+obj={nodes:[_30]};
 }else{
 if(typeof obj=="object"){
-obj=_2.getTemplateString(obj);
+obj=_1.getTemplateString(obj);
 }
-obj=_3.getTemplate(obj);
+obj=_2.getTemplate(obj);
 }
 }
-var _45=_3.tokenize(obj.nodes);
+var _32=_2.tokenize(obj.nodes);
 if(dd.tests){
-this.tokens=_45.slice(0);
+this.tokens=_32.slice(0);
 }
-var _46=new dd._DomParser(_45);
-this.nodelist=_46.parse();
+var _33=new dd._DomParser(_32);
+this.nodelist=_33.parse();
 },{_count:0,_re:/\bdojo:([a-zA-Z0-9_]+)\b/g,setClass:function(str){
 this.getRootNode().className=str;
 },getRootNode:function(){
 return this.buffer.rootNode;
 },getBuffer:function(){
 return new dd.DomBuffer();
-},render:function(_48,_49){
-_49=this.buffer=_49||this.getBuffer();
+},render:function(_34,_35){
+_35=this.buffer=_35||this.getBuffer();
 this.rootNode=null;
-var _4a=this.nodelist.render(_48||new dd.Context({}),_49);
-for(var i=0,_4c;_4c=_49._cache[i];i++){
-if(_4c._cache){
-_4c._cache.length=0;
+var _36=this.nodelist.render(_34||new dd.Context({}),_35);
+for(var i=0,_37;_37=_35._cache[i];i++){
+if(_37._cache){
+_37._cache.length=0;
 }
 }
-return _4a;
-},unrender:function(_4d,_4e){
-return this.nodelist.unrender(_4d,_4e);
+return _36;
+},unrender:function(_38,_39){
+return this.nodelist.unrender(_38,_39);
 }});
-dd.DomBuffer=dojo.extend(function(_4f){
-this._parent=_4f;
+dd.DomBuffer=dojo.extend(function(_3a){
+this._parent=_3a;
 this._cache=[];
-},{concat:function(_50){
-var _51=this._parent;
-if(_51&&_50.parentNode&&_50.parentNode===_51&&!_51._dirty){
+},{concat:function(_3b){
+var _3c=this._parent;
+if(_3c&&_3b.parentNode&&_3b.parentNode===_3c&&!_3c._dirty){
 return this;
 }
-if(_50.nodeType==1&&!this.rootNode){
-this.rootNode=_50||true;
+if(_3b.nodeType==1&&!this.rootNode){
+this.rootNode=_3b||true;
 return this;
 }
-if(!_51){
-if(_50.nodeType==3&&dojo.trim(_50.data)){
+if(!_3c){
+if(_3b.nodeType==3&&dojo.trim(_3b.data)){
 throw new Error("Text should not exist outside of the root node in template");
 }
 return this;
 }
 if(this._closed){
-if(_50.nodeType==3&&!dojo.trim(_50.data)){
+if(_3b.nodeType==3&&!dojo.trim(_3b.data)){
 return this;
 }else{
 throw new Error("Content should not exist outside of the root node in template");
 }
 }
-if(_51._dirty){
-if(_50._drawn&&_50.parentNode==_51){
-var _52=_51._cache;
-if(_52){
-for(var i=0,_54;_54=_52[i];i++){
-this.onAddNode&&this.onAddNode(_54);
-_51.insertBefore(_54,_50);
-this.onAddNodeComplete&&this.onAddNodeComplete(_54);
+if(_3c._dirty){
+if(_3b._drawn&&_3b.parentNode==_3c){
+var _3d=_3c._cache;
+if(_3d){
+for(var i=0,_3e;_3e=_3d[i];i++){
+this.onAddNode&&this.onAddNode(_3e);
+_3c.insertBefore(_3e,_3b);
+this.onAddNodeComplete&&this.onAddNodeComplete(_3e);
 }
-_52.length=0;
+_3d.length=0;
 }
 }
-_51._dirty=false;
+_3c._dirty=false;
 }
-if(!_51._cache){
-_51._cache=[];
-this._cache.push(_51);
+if(!_3c._cache){
+_3c._cache=[];
+this._cache.push(_3c);
 }
-_51._dirty=true;
-_51._cache.push(_50);
+_3c._dirty=true;
+_3c._cache.push(_3b);
 return this;
 },remove:function(obj){
 if(typeof obj=="string"){
@@ -411,175 +411,175 @@ obj.parentNode.removeChild(obj);
 }
 }
 return this;
-},setAttribute:function(key,_57){
+},setAttribute:function(key,_3f){
 var old=dojo.attr(this._parent,key);
-if(this.onChangeAttribute&&old!=_57){
-this.onChangeAttribute(this._parent,key,old,_57);
+if(this.onChangeAttribute&&old!=_3f){
+this.onChangeAttribute(this._parent,key,old,_3f);
 }
 if(key=="style"){
-this._parent.style.cssText=_57;
+this._parent.style.cssText=_3f;
 }else{
-dojo.attr(this._parent,key,_57);
+dojo.attr(this._parent,key,_3f);
 }
 return this;
-},addEvent:function(_59,_5a,fn,_5c){
-if(!_59.getThis()){
+},addEvent:function(_40,_41,fn,_42){
+if(!_40.getThis()){
 throw new Error("You must use Context.setObject(instance)");
 }
-this.onAddEvent&&this.onAddEvent(this.getParent(),_5a,fn);
-var _5d=fn;
-if(dojo.isArray(_5c)){
-_5d=function(e){
-this[fn].apply(this,[e].concat(_5c));
+this.onAddEvent&&this.onAddEvent(this.getParent(),_41,fn);
+var _43=fn;
+if(dojo.isArray(_42)){
+_43=function(e){
+this[fn].apply(this,[e].concat(_42));
 };
 }
-return dojo.connect(this.getParent(),_5a,_59.getThis(),_5d);
-},setParent:function(_5f,up,_61){
+return dojo.connect(this.getParent(),_41,_40.getThis(),_43);
+},setParent:function(_44,up,_45){
 if(!this._parent){
-this._parent=this._first=_5f;
+this._parent=this._first=_44;
 }
-if(up&&_61&&_5f===this._first){
+if(up&&_45&&_44===this._first){
 this._closed=true;
 }
 if(up){
-var _62=this._parent;
-var _63="";
-var ie=dojo.isIE&&_62.tagName=="SCRIPT";
+var _46=this._parent;
+var _47="";
+var ie=dojo.isIE&&_46.tagName=="SCRIPT";
 if(ie){
-_62.text="";
-}
-if(_62._dirty){
-var _65=_62._cache;
-var _66=(_62.tagName=="SELECT"&&!_62.options.length);
-for(var i=0,_68;_68=_65[i];i++){
-if(_68!==_62){
-this.onAddNode&&this.onAddNode(_68);
+_46.text="";
+}
+if(_46._dirty){
+var _48=_46._cache;
+var _49=(_46.tagName=="SELECT"&&!_46.options.length);
+for(var i=0,_4a;_4a=_48[i];i++){
+if(_4a!==_46){
+this.onAddNode&&this.onAddNode(_4a);
 if(ie){
-_63+=_68.data;
+_47+=_4a.data;
 }else{
-_62.appendChild(_68);
-if(_66&&_68.defaultSelected&&i){
-_66=i;
+_46.appendChild(_4a);
+if(_49&&_4a.defaultSelected&&i){
+_49=i;
 }
 }
-this.onAddNodeComplete&&this.onAddNodeComplete(_68);
+this.onAddNodeComplete&&this.onAddNodeComplete(_4a);
 }
 }
-if(_66){
-_62.options.selectedIndex=(typeof _66=="number")?_66:0;
+if(_49){
+_46.options.selectedIndex=(typeof _49=="number")?_49:0;
 }
-_65.length=0;
-_62._dirty=false;
+_48.length=0;
+_46._dirty=false;
 }
 if(ie){
-_62.text=_63;
+_46.text=_47;
 }
 }
-this._parent=_5f;
-this.onSetParent&&this.onSetParent(_5f,up,_61);
+this._parent=_44;
+this.onSetParent&&this.onSetParent(_44,up,_45);
 return this;
 },getParent:function(){
 return this._parent;
 },getRootNode:function(){
 return this.rootNode;
 }});
-dd._DomNode=dojo.extend(function(_69){
-this.contents=_69;
-},{render:function(_6a,_6b){
+dd._DomNode=dojo.extend(function(_4b){
+this.contents=_4b;
+},{render:function(_4c,_4d){
 this._rendered=true;
-return _6b.concat(this.contents);
-},unrender:function(_6c,_6d){
+return _4d.concat(this.contents);
+},unrender:function(_4e,_4f){
 if(!this._rendered){
-return _6d;
+return _4f;
 }
 this._rendered=false;
-return _6d.remove(this.contents);
-},clone:function(_6e){
+return _4f.remove(this.contents);
+},clone:function(_50){
 return new this.constructor(this.contents);
 }});
-dd._DomNodeList=dojo.extend(function(_6f){
-this.contents=_6f||[];
-},{push:function(_70){
-this.contents.push(_70);
-},unshift:function(_71){
-this.contents.unshift(_71);
-},render:function(_72,_73,_74){
-_73=_73||dd.DomTemplate.prototype.getBuffer();
-if(_74){
-var _75=_73.getParent();
+dd._DomNodeList=dojo.extend(function(_51){
+this.contents=_51||[];
+},{push:function(_52){
+this.contents.push(_52);
+},unshift:function(_53){
+this.contents.unshift(_53);
+},render:function(_54,_55,_56){
+_55=_55||dd.DomTemplate.prototype.getBuffer();
+if(_56){
+var _57=_55.getParent();
 }
 for(var i=0;i<this.contents.length;i++){
-_73=this.contents[i].render(_72,_73);
-if(!_73){
+_55=this.contents[i].render(_54,_55);
+if(!_55){
 throw new Error("Template node render functions must return their buffer");
 }
 }
-if(_75){
-_73.setParent(_75);
+if(_57){
+_55.setParent(_57);
 }
-return _73;
-},dummyRender:function(_77,_78,_79){
+return _55;
+},dummyRender:function(_58,_59,_5a){
 var div=document.createElement("div");
-var _7b=_78.getParent();
-var old=_7b._clone;
-_7b._clone=div;
-var _7d=this.clone(_78,div);
+var _5b=_59.getParent();
+var old=_5b._clone;
+_5b._clone=div;
+var _5c=this.clone(_59,div);
 if(old){
-_7b._clone=old;
+_5b._clone=old;
 }else{
-_7b._clone=null;
+_5b._clone=null;
 }
-_78=dd.DomTemplate.prototype.getBuffer();
-_7d.unshift(new dd.ChangeNode(div));
-_7d.unshift(new dd._DomNode(div));
-_7d.push(new dd.ChangeNode(div,true));
-_7d.render(_77,_78);
-if(_79){
-return _78.getRootNode();
+_59=dd.DomTemplate.prototype.getBuffer();
+_5c.unshift(new dd.ChangeNode(div));
+_5c.unshift(new dd._DomNode(div));
+_5c.push(new dd.ChangeNode(div,true));
+_5c.render(_58,_59);
+if(_5a){
+return _59.getRootNode();
 }
-var _7e=div.innerHTML;
-return (dojo.isIE)?_7e.replace(/\s*_(dirty|clone)="[^"]*"/g,""):_7e;
-},unrender:function(_7f,_80,_81){
-if(_81){
-var _82=_80.getParent();
+var _5d=div.innerHTML;
+return (dojo.isIE)?_5d.replace(/\s*_(dirty|clone)="[^"]*"/g,""):_5d;
+},unrender:function(_5e,_5f,_60){
+if(_60){
+var _61=_5f.getParent();
 }
 for(var i=0;i<this.contents.length;i++){
-_80=this.contents[i].unrender(_7f,_80);
-if(!_80){
+_5f=this.contents[i].unrender(_5e,_5f);
+if(!_5f){
 throw new Error("Template node render functions must return their buffer");
 }
 }
-if(_82){
-_80.setParent(_82);
+if(_61){
+_5f.setParent(_61);
 }
-return _80;
-},clone:function(_84){
-var _85=_84.getParent();
-var _86=this.contents;
-var _87=new dd._DomNodeList();
-var _88=[];
-for(var i=0;i<_86.length;i++){
-var _8a=_86[i].clone(_84);
-if(_8a instanceof dd.ChangeNode||_8a instanceof dd._DomNode){
-var _8b=_8a.contents._clone;
-if(_8b){
-_8a.contents=_8b;
+return _5f;
+},clone:function(_62){
+var _63=_62.getParent();
+var _64=this.contents;
+var _65=new dd._DomNodeList();
+var _66=[];
+for(var i=0;i<_64.length;i++){
+var _67=_64[i].clone(_62);
+if(_67 instanceof dd.ChangeNode||_67 instanceof dd._DomNode){
+var _68=_67.contents._clone;
+if(_68){
+_67.contents=_68;
 }else{
-if(_85!=_8a.contents&&_8a instanceof dd._DomNode){
-var _8c=_8a.contents;
-_8a.contents=_8a.contents.cloneNode(false);
-_84.onClone&&_84.onClone(_8c,_8a.contents);
-_88.push(_8c);
-_8c._clone=_8a.contents;
+if(_63!=_67.contents&&_67 instanceof dd._DomNode){
+var _69=_67.contents;
+_67.contents=_67.contents.cloneNode(false);
+_62.onClone&&_62.onClone(_69,_67.contents);
+_66.push(_69);
+_69._clone=_67.contents;
 }
 }
 }
-_87.push(_8a);
+_65.push(_67);
 }
-for(var i=0,_8a;_8a=_88[i];i++){
-_8a._clone=null;
+for(var i=0,_67;_67=_66[i];i++){
+_67._clone=null;
 }
-return _87;
+return _65;
 },rtrim:function(){
 while(1){
 var i=this.contents.length-1;
@@ -593,62 +593,62 @@ return this;
 }});
 dd._DomVarNode=dojo.extend(function(str){
 this.contents=new dd._Filter(str);
-},{render:function(_8f,_90){
-var str=this.contents.resolve(_8f);
-var _92="text";
+},{render:function(_6a,_6b){
+var str=this.contents.resolve(_6a);
+var _6c="text";
 if(str){
 if(str.render&&str.getRootNode){
-_92="injection";
+_6c="injection";
 }else{
 if(str.safe){
 if(str.nodeType){
-_92="node";
+_6c="node";
 }else{
 if(str.toString){
 str=str.toString();
-_92="html";
+_6c="html";
 }
 }
 }
 }
 }
-if(this._type&&_92!=this._type){
-this.unrender(_8f,_90);
+if(this._type&&_6c!=this._type){
+this.unrender(_6a,_6b);
 }
-this._type=_92;
-switch(_92){
+this._type=_6c;
+switch(_6c){
 case "text":
 this._rendered=true;
 this._txt=this._txt||document.createTextNode(str);
 if(this._txt.data!=str){
 var old=this._txt.data;
 this._txt.data=str;
-_90.onChangeData&&_90.onChangeData(this._txt,old,this._txt.data);
+_6b.onChangeData&&_6b.onChangeData(this._txt,old,this._txt.data);
 }
-return _90.concat(this._txt);
+return _6b.concat(this._txt);
 case "injection":
-var _94=str.getRootNode();
-if(this._rendered&&_94!=this._root){
-_90=this.unrender(_8f,_90);
-}
-this._root=_94;
-var _95=this._injected=new dd._DomNodeList();
-_95.push(new dd.ChangeNode(_90.getParent()));
-_95.push(new dd._DomNode(_94));
-_95.push(str);
-_95.push(new dd.ChangeNode(_90.getParent()));
+var _6d=str.getRootNode();
+if(this._rendered&&_6d!=this._root){
+_6b=this.unrender(_6a,_6b);
+}
+this._root=_6d;
+var _6e=this._injected=new dd._DomNodeList();
+_6e.push(new dd.ChangeNode(_6b.getParent()));
+_6e.push(new dd._DomNode(_6d));
+_6e.push(str);
+_6e.push(new dd.ChangeNode(_6b.getParent()));
 this._rendered=true;
-return _95.render(_8f,_90);
+return _6e.render(_6a,_6b);
 case "node":
 this._rendered=true;
-if(this._node&&this._node!=str&&this._node.parentNode&&this._node.parentNode===_90.getParent()){
+if(this._node&&this._node!=str&&this._node.parentNode&&this._node.parentNode===_6b.getParent()){
 this._node.parentNode.removeChild(this._node);
 }
 this._node=str;
-return _90.concat(str);
+return _6b.concat(str);
 case "html":
 if(this._rendered&&this._src!=str){
-_90=this.unrender(_8f,_90);
+_6b=this.unrender(_6a,_6b);
 }
 this._src=str;
 if(!this._rendered){
@@ -656,146 +656,146 @@ this._rendered=true;
 this._html=this._html||[];
 var div=(this._div=this._div||document.createElement("div"));
 div.innerHTML=str;
-var _97=div.childNodes;
-while(_97.length){
-var _98=div.removeChild(_97[0]);
-this._html.push(_98);
-_90=_90.concat(_98);
+var _6f=div.childNodes;
+while(_6f.length){
+var _70=div.removeChild(_6f[0]);
+this._html.push(_70);
+_6b=_6b.concat(_70);
 }
 }
-return _90;
+return _6b;
 default:
-return _90;
+return _6b;
 }
-},unrender:function(_99,_9a){
+},unrender:function(_71,_72){
 if(!this._rendered){
-return _9a;
+return _72;
 }
 this._rendered=false;
 switch(this._type){
 case "text":
-return _9a.remove(this._txt);
+return _72.remove(this._txt);
 case "injection":
-return this._injection.unrender(_99,_9a);
+return this._injection.unrender(_71,_72);
 case "node":
-if(this._node.parentNode===_9a.getParent()){
-return _9a.remove(this._node);
+if(this._node.parentNode===_72.getParent()){
+return _72.remove(this._node);
 }
-return _9a;
+return _72;
 case "html":
 for(var i=0,l=this._html.length;i<l;i++){
-_9a=_9a.remove(this._html[i]);
+_72=_72.remove(this._html[i]);
 }
-return _9a;
+return _72;
 default:
-return _9a;
+return _72;
 }
 },clone:function(){
 return new this.constructor(this.contents.getExpression());
 }});
-dd.ChangeNode=dojo.extend(function(_9d,up,_9f){
-this.contents=_9d;
+dd.ChangeNode=dojo.extend(function(_73,up,_74){
+this.contents=_73;
 this.up=up;
-this.root=_9f;
-},{render:function(_a0,_a1){
-return _a1.setParent(this.contents,this.up,this.root);
-},unrender:function(_a2,_a3){
-if(!_a3.getParent()){
-return _a3;
-}
-return _a3.setParent(this.contents);
+this.root=_74;
+},{render:function(_75,_76){
+return _76.setParent(this.contents,this.up,this.root);
+},unrender:function(_77,_78){
+if(!_78.getParent()){
+return _78;
+}
+return _78.setParent(this.contents);
 },clone:function(){
 return new this.constructor(this.contents,this.up,this.root);
 }});
-dd.AttributeNode=dojo.extend(function(key,_a5){
+dd.AttributeNode=dojo.extend(function(key,_79){
 this.key=key;
-this.value=_a5;
-this.contents=_a5;
-if(this._pool[_a5]){
-this.nodelist=this._pool[_a5];
+this.value=_79;
+this.contents=_79;
+if(this._pool[_79]){
+this.nodelist=this._pool[_79];
 }else{
-if(!(this.nodelist=dd.quickFilter(_a5))){
-this.nodelist=(new dd.Template(_a5,true)).nodelist;
+if(!(this.nodelist=dd.quickFilter(_79))){
+this.nodelist=(new dd.Template(_79,true)).nodelist;
 }
-this._pool[_a5]=this.nodelist;
+this._pool[_79]=this.nodelist;
 }
 this.contents="";
-},{_pool:{},render:function(_a6,_a7){
+},{_pool:{},render:function(_7a,_7b){
 var key=this.key;
-var _a9=this.nodelist.dummyRender(_a6);
+var _7c=this.nodelist.dummyRender(_7a);
 if(dd.BOOLS[key]){
-_a9=!(_a9=="false"||_a9=="undefined"||!_a9);
+_7c=!(_7c=="false"||_7c=="undefined"||!_7c);
 }
-if(_a9!==this.contents){
-this.contents=_a9;
-return _a7.setAttribute(key,_a9);
+if(_7c!==this.contents){
+this.contents=_7c;
+return _7b.setAttribute(key,_7c);
 }
-return _a7;
-},unrender:function(_aa,_ab){
+return _7b;
+},unrender:function(_7d,_7e){
 this.contents="";
-return _ab.remove(this.key);
-},clone:function(_ac){
+return _7e.remove(this.key);
+},clone:function(_7f){
 return new this.constructor(this.key,this.value);
 }});
 dd._DomTextNode=dojo.extend(function(str){
 this.contents=document.createTextNode(str);
 this.upcoming=str;
-},{set:function(_ae){
-this.upcoming=_ae;
+},{set:function(_80){
+this.upcoming=_80;
 return this;
-},render:function(_af,_b0){
+},render:function(_81,_82){
 if(this.contents.data!=this.upcoming){
 var old=this.contents.data;
 this.contents.data=this.upcoming;
-_b0.onChangeData&&_b0.onChangeData(this.contents,old,this.upcoming);
+_82.onChangeData&&_82.onChangeData(this.contents,old,this.upcoming);
 }
-return _b0.concat(this.contents);
-},unrender:function(_b2,_b3){
-return _b3.remove(this.contents);
+return _82.concat(this.contents);
+},unrender:function(_83,_84){
+return _84.remove(this.contents);
 },isEmpty:function(){
 return !dojo.trim(this.contents.data);
 },clone:function(){
 return new this.constructor(this.contents.data);
 }});
-dd._DomParser=dojo.extend(function(_b4){
-this.contents=_b4;
-},{i:0,parse:function(_b5){
-var _b6={};
-var _b7=this.contents;
-if(!_b5){
-_b5=[];
-}
-for(var i=0;i<_b5.length;i++){
-_b6[_b5[i]]=true;
-}
-var _b9=new dd._DomNodeList();
-while(this.i<_b7.length){
-var _ba=_b7[this.i++];
-var _bb=_ba[0];
-var _bc=_ba[1];
-if(_bb==dd.TOKEN_CUSTOM){
-_b9.push(_bc);
-}else{
-if(_bb==dd.TOKEN_CHANGE){
-var _bd=new dd.ChangeNode(_bc,_ba[2],_ba[3]);
-_bc[_bd.attr]=_bd;
-_b9.push(_bd);
-}else{
-if(_bb==dd.TOKEN_ATTR){
-var fn=_2.getTag("attr:"+_ba[2],true);
-if(fn&&_ba[3]){
-if(_ba[3].indexOf("{%")!=-1||_ba[3].indexOf("{{")!=-1){
-_bc.setAttribute(_ba[2],"");
-}
-_b9.push(fn(null,new dd.Token(_bb,_ba[2]+" "+_ba[3])));
-}else{
-if(dojo.isString(_ba[3])){
-if(_ba[2]=="style"||_ba[3].indexOf("{%")!=-1||_ba[3].indexOf("{{")!=-1){
-_b9.push(new dd.AttributeNode(_ba[2],_ba[3]));
-}else{
-if(dojo.trim(_ba[3])){
+dd._DomParser=dojo.extend(function(_85){
+this.contents=_85;
+},{i:0,parse:function(_86){
+var _87={};
+var _88=this.contents;
+if(!_86){
+_86=[];
+}
+for(var i=0;i<_86.length;i++){
+_87[_86[i]]=true;
+}
+var _89=new dd._DomNodeList();
+while(this.i<_88.length){
+var _8a=_88[this.i++];
+var _8b=_8a[0];
+var _8c=_8a[1];
+if(_8b==dd.TOKEN_CUSTOM){
+_89.push(_8c);
+}else{
+if(_8b==dd.TOKEN_CHANGE){
+var _8d=new dd.ChangeNode(_8c,_8a[2],_8a[3]);
+_8c[_8d.attr]=_8d;
+_89.push(_8d);
+}else{
+if(_8b==dd.TOKEN_ATTR){
+var fn=_1.getTag("attr:"+_8a[2],true);
+if(fn&&_8a[3]){
+if(_8a[3].indexOf("{%")!=-1||_8a[3].indexOf("{{")!=-1){
+_8c.setAttribute(_8a[2],"");
+}
+_89.push(fn(null,new dd.Token(_8b,_8a[2]+" "+_8a[3])));
+}else{
+if(dojo.isString(_8a[3])){
+if(_8a[2]=="style"||_8a[3].indexOf("{%")!=-1||_8a[3].indexOf("{{")!=-1){
+_89.push(new dd.AttributeNode(_8a[2],_8a[3]));
+}else{
+if(dojo.trim(_8a[3])){
 try{
-dojo.attr(_bc,_ba[2],_ba[3]);
+dojo.attr(_8c,_8a[2],_8a[3]);
 }
 catch(e){
 }
@@ -804,34 +804,34 @@ catch(e){
 }
 }
 }else{
-if(_bb==dd.TOKEN_NODE){
-var fn=_2.getTag("node:"+_bc.tagName.toLowerCase(),true);
+if(_8b==dd.TOKEN_NODE){
+var fn=_1.getTag("node:"+_8c.tagName.toLowerCase(),true);
 if(fn){
-_b9.push(fn(null,new dd.Token(_bb,_bc),_bc.tagName.toLowerCase()));
+_89.push(fn(null,new dd.Token(_8b,_8c),_8c.tagName.toLowerCase()));
 }
-_b9.push(new dd._DomNode(_bc));
+_89.push(new dd._DomNode(_8c));
 }else{
-if(_bb==dd.TOKEN_VAR){
-_b9.push(new dd._DomVarNode(_bc));
+if(_8b==dd.TOKEN_VAR){
+_89.push(new dd._DomVarNode(_8c));
 }else{
-if(_bb==dd.TOKEN_TEXT){
-_b9.push(new dd._DomTextNode(_bc.data||_bc));
+if(_8b==dd.TOKEN_TEXT){
+_89.push(new dd._DomTextNode(_8c.data||_8c));
 }else{
-if(_bb==dd.TOKEN_BLOCK){
-if(_b6[_bc]){
+if(_8b==dd.TOKEN_BLOCK){
+if(_87[_8c]){
 --this.i;
-return _b9;
+return _89;
 }
-var cmd=_bc.split(/\s+/g);
+var cmd=_8c.split(/\s+/g);
 if(cmd.length){
 cmd=cmd[0];
-var fn=_2.getTag(cmd);
+var fn=_1.getTag(cmd);
 if(typeof fn!="function"){
 throw new Error("Function not found for "+cmd);
 }
-var tpl=fn(this,new dd.Token(_bb,_bc));
+var tpl=fn(this,new dd.Token(_8b,_8c));
 if(tpl){
-_b9.push(tpl);
+_89.push(tpl);
 }
 }
 }
@@ -842,23 +842,23 @@ _b9.push(tpl);
 }
 }
 }
-if(_b5.length){
-throw new Error("Could not find closing tag(s): "+_b5.toString());
+if(_86.length){
+throw new Error("Could not find closing tag(s): "+_86.toString());
 }
-return _b9;
+return _89;
 },next_token:function(){
-var _c1=this.contents[this.i++];
-return new dd.Token(_c1[0],_c1[1]);
+var _8e=this.contents[this.i++];
+return new dd.Token(_8e[0],_8e[1]);
 },delete_first_token:function(){
 this.i++;
-},skip_past:function(_c2){
-return dd._Parser.prototype.skip_past.call(this,_c2);
-},create_variable_node:function(_c3){
-return new dd._DomVarNode(_c3);
-},create_text_node:function(_c4){
-return new dd._DomTextNode(_c4||"");
+},skip_past:function(_8f){
+return dd._Parser.prototype.skip_past.call(this,_8f);
+},create_variable_node:function(_90){
+return new dd._DomVarNode(_90);
+},create_text_node:function(_91){
+return new dd._DomTextNode(_91||"");
 },getTemplate:function(loc){
-return new dd.DomTemplate(_3.getTemplate(loc));
+return new dd.DomTemplate(_2.getTemplate(loc));
 }});
 })();
 }
diff --git a/dojox/dtl/ext-dojo/NodeList.js b/dojox/dtl/ext-dojo/NodeList.js
index 25edd02..85a87fd 100644
--- a/dojox/dtl/ext-dojo/NodeList.js
+++ b/dojox/dtl/ext-dojo/NodeList.js
@@ -11,17 +11,17 @@ dojo.provide("dojox.dtl.ext-dojo.NodeList");
 dojo.require("dojox.dtl._base");
 dojo.extend(dojo.NodeList,{dtl:function(_1,_2){
 var d=dojox.dtl;
-var _4=this;
-var _5=function(_6,_7){
-var _8=_6.render(new d._Context(_7));
-_4.forEach(function(_9){
-_9.innerHTML=_8;
+var _3=this;
+var _4=function(_5,_6){
+var _7=_5.render(new d._Context(_6));
+_3.forEach(function(_8){
+_8.innerHTML=_7;
 });
 };
-d.text._resolveTemplateArg(_1).addCallback(function(_a){
-_1=new d.Template(_a);
-d.text._resolveContextArg(_2).addCallback(function(_b){
-_5(_1,_b);
+d.text._resolveTemplateArg(_1).addCallback(function(_9){
+_1=new d.Template(_9);
+d.text._resolveContextArg(_2).addCallback(function(_a){
+_4(_1,_a);
 });
 });
 return this;
diff --git a/dojox/dtl/filter/htmlstrings.js b/dojox/dtl/filter/htmlstrings.js
index 1eaf8c3..0972ce1 100644
--- a/dojox/dtl/filter/htmlstrings.js
+++ b/dojox/dtl/filter/htmlstrings.js
@@ -13,25 +13,25 @@ dojo.mixin(dojox.dtl.filter.htmlstrings,{_linebreaksrn:/(\r\n|\n\r)/g,_linebreak
 var _2=[];
 var dh=dojox.dtl.filter.htmlstrings;
 _1=_1.replace(dh._linebreaksrn,"\n");
-var _4=_1.split(dh._linebreaksn);
-for(var i=0;i<_4.length;i++){
-var _6=_4[i].replace(dh._linebreakss,"").replace(dh._linebreaksbr,"<br />");
-_2.push("<p>"+_6+"</p>");
+var _3=_1.split(dh._linebreaksn);
+for(var i=0;i<_3.length;i++){
+var _4=_3[i].replace(dh._linebreakss,"").replace(dh._linebreaksbr,"<br />");
+_2.push("<p>"+_4+"</p>");
 }
 return _2.join("\n\n");
-},linebreaksbr:function(_7){
+},linebreaksbr:function(_5){
 var dh=dojox.dtl.filter.htmlstrings;
-return _7.replace(dh._linebreaksrn,"\n").replace(dh._linebreaksbr,"<br />");
-},removetags:function(_9,_a){
+return _5.replace(dh._linebreaksrn,"\n").replace(dh._linebreaksbr,"<br />");
+},removetags:function(_6,_7){
 var dh=dojox.dtl.filter.htmlstrings;
-var _c=[];
-var _d;
-while(_d=dh._removetagsfind.exec(_a)){
-_c.push(_d[0]);
+var _8=[];
+var _9;
+while(_9=dh._removetagsfind.exec(_7)){
+_8.push(_9[0]);
 }
-_c="("+_c.join("|")+")";
-return _9.replace(new RegExp("</?s*"+_c+"s*[^>]*>","gi"),"");
-},striptags:function(_e){
-return _e.replace(dojox.dtl.filter.htmlstrings._striptags,"");
+_8="("+_8.join("|")+")";
+return _6.replace(new RegExp("</?s*"+_8+"s*[^>]*>","gi"),"");
+},striptags:function(_a){
+return _a.replace(dojox.dtl.filter.htmlstrings._striptags,"");
 }});
 }
diff --git a/dojox/dtl/filter/lists.js b/dojox/dtl/filter/lists.js
index f7b5b2e..25c8e93 100644
--- a/dojox/dtl/filter/lists.js
+++ b/dojox/dtl/filter/lists.js
@@ -14,82 +14,82 @@ if(a[0]==b[0]){
 return 0;
 }
 return (a[0]<b[0])?-1:1;
-},dictsort:function(_3,_4){
-if(!_4){
-return _3;
-}
-var i,_6,_7=[];
-if(!dojo.isArray(_3)){
-var _8=_3,_3=[];
-for(var _9 in _8){
-_3.push(_8[_9]);
-}
-}
-for(i=0;i<_3.length;i++){
-_7.push([new dojox.dtl._Filter("var."+_4).resolve(new dojox.dtl._Context({"var":_3[i]})),_3[i]]);
-}
-_7.sort(dojox.dtl.filter.lists._dictsort);
-var _a=[];
-for(i=0;_6=_7[i];i++){
-_a.push(_6[1]);
-}
-return _a;
-},dictsortreversed:function(_b,_c){
-if(!_c){
-return _b;
-}
-var _d=dojox.dtl.filter.lists.dictsort(_b,_c);
-return _d.reverse();
-},first:function(_e){
-return (_e.length)?_e[0]:"";
-},join:function(_f,arg){
-return _f.join(arg||",");
-},length:function(_11){
-return (isNaN(_11.length))?(_11+"").length:_11.length;
-},length_is:function(_12,arg){
-return _12.length==parseInt(arg);
-},random:function(_14){
-return _14[Math.floor(Math.random()*_14.length)];
-},slice:function(_15,arg){
+},dictsort:function(_1,_2){
+if(!_2){
+return _1;
+}
+var i,_3,_4=[];
+if(!dojo.isArray(_1)){
+var _5=_1,_1=[];
+for(var _6 in _5){
+_1.push(_5[_6]);
+}
+}
+for(i=0;i<_1.length;i++){
+_4.push([new dojox.dtl._Filter("var."+_2).resolve(new dojox.dtl._Context({"var":_1[i]})),_1[i]]);
+}
+_4.sort(dojox.dtl.filter.lists._dictsort);
+var _7=[];
+for(i=0;_3=_4[i];i++){
+_7.push(_3[1]);
+}
+return _7;
+},dictsortreversed:function(_8,_9){
+if(!_9){
+return _8;
+}
+var _a=dojox.dtl.filter.lists.dictsort(_8,_9);
+return _a.reverse();
+},first:function(_b){
+return (_b.length)?_b[0]:"";
+},join:function(_c,_d){
+return _c.join(_d||",");
+},length:function(_e){
+return (isNaN(_e.length))?(_e+"").length:_e.length;
+},length_is:function(_f,arg){
+return _f.length==parseInt(arg);
+},random:function(_10){
+return _10[Math.floor(Math.random()*_10.length)];
+},slice:function(_11,arg){
 arg=arg||"";
-var _17=arg.split(":");
-var _18=[];
-for(var i=0;i<_17.length;i++){
-if(!_17[i].length){
-_18.push(null);
+var _12=arg.split(":");
+var _13=[];
+for(var i=0;i<_12.length;i++){
+if(!_12[i].length){
+_13.push(null);
 }else{
-_18.push(parseInt(_17[i]));
+_13.push(parseInt(_12[i]));
 }
 }
-if(_18[0]===null){
-_18[0]=0;
+if(_13[0]===null){
+_13[0]=0;
 }
-if(_18[0]<0){
-_18[0]=_15.length+_18[0];
+if(_13[0]<0){
+_13[0]=_11.length+_13[0];
 }
-if(_18.length<2||_18[1]===null){
-_18[1]=_15.length;
+if(_13.length<2||_13[1]===null){
+_13[1]=_11.length;
 }
-if(_18[1]<0){
-_18[1]=_15.length+_18[1];
+if(_13[1]<0){
+_13[1]=_11.length+_13[1];
 }
-return _15.slice(_18[0],_18[1]);
-},_unordered_list:function(_1a,_1b){
+return _11.slice(_13[0],_13[1]);
+},_unordered_list:function(_14,_15){
 var ddl=dojox.dtl.filter.lists;
-var i,_1e="";
-for(i=0;i<_1b;i++){
-_1e+="\t";
+var i,_16="";
+for(i=0;i<_15;i++){
+_16+="\t";
 }
-if(_1a[1]&&_1a[1].length){
-var _1f=[];
-for(i=0;i<_1a[1].length;i++){
-_1f.push(ddl._unordered_list(_1a[1][i],_1b+1));
+if(_14[1]&&_14[1].length){
+var _17=[];
+for(i=0;i<_14[1].length;i++){
+_17.push(ddl._unordered_list(_14[1][i],_15+1));
 }
-return _1e+"<li>"+_1a[0]+"\n"+_1e+"<ul>\n"+_1f.join("\n")+"\n"+_1e+"</ul>\n"+_1e+"</li>";
+return _16+"<li>"+_14[0]+"\n"+_16+"<ul>\n"+_17.join("\n")+"\n"+_16+"</ul>\n"+_16+"</li>";
 }else{
-return _1e+"<li>"+_1a[0]+"</li>";
+return _16+"<li>"+_14[0]+"</li>";
 }
-},unordered_list:function(_20){
-return dojox.dtl.filter.lists._unordered_list(_20,1);
+},unordered_list:function(_18){
+return dojox.dtl.filter.lists._unordered_list(_18,1);
 }});
 }
diff --git a/dojox/dtl/filter/misc.js b/dojox/dtl/filter/misc.js
index 12dd936..1bfd28e 100644
--- a/dojox/dtl/filter/misc.js
+++ b/dojox/dtl/filter/misc.js
@@ -40,13 +40,13 @@ return _5;
 },_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(_7){
 var dm=dojox.dtl.filter.misc;
 _7=_7+"";
-var _9="";
+var _8="";
 for(var i=0;i<_7.length;i++){
-var _b=_7.charAt(i).toLowerCase();
-(dm._phone2numeric[_b])?_9+=dm._phone2numeric[_b]:_9+=_7.charAt(i);
+var _9=_7.charAt(i).toLowerCase();
+(dm._phone2numeric[_9])?_8+=dm._phone2numeric[_9]:_8+=_7.charAt(i);
 }
-return _9;
-},pprint:function(_c){
-return dojo.toJson(_c);
+return _8;
+},pprint:function(_a){
+return dojo.toJson(_a);
 }});
 }
diff --git a/dojox/dtl/filter/strings.js b/dojox/dtl/filter/strings.js
index efadb93..1f428cc 100644
--- a/dojox/dtl/filter/strings.js
+++ b/dojox/dtl/filter/strings.js
@@ -42,229 +42,229 @@ for(var i=0;i<_8;i+=2){
 _6=" "+_6+" ";
 }
 return _6;
-},cut:function(_a,_b){
-_b=_b+""||"";
-_a=_a+"";
-return _a.replace(new RegExp(_b,"g"),"");
-},_fix_ampersands:/&(?!(\w+|#\d+);)/g,fix_ampersands:function(_c){
-return _c.replace(dojox.dtl.filter.strings._fix_ampersands,"&");
-},floatformat:function(_d,_e){
-_e=parseInt(_e||-1,10);
-_d=parseFloat(_d);
-var m=_d-_d.toFixed(0);
-if(!m&&_e<0){
-return _d.toFixed();
-}
-_d=_d.toFixed(Math.abs(_e));
-return (_e<0)?parseFloat(_d)+"":_d;
-},iriencode:function(_10){
-return dojox.dtl.filter.strings._urlquote(_10,"/#%[]=:;$&()+,!");
-},linenumbers:function(_11){
+},cut:function(_9,_a){
+_a=_a+""||"";
+_9=_9+"";
+return _9.replace(new RegExp(_a,"g"),"");
+},_fix_ampersands:/&(?!(\w+|#\d+);)/g,fix_ampersands:function(_b){
+return _b.replace(dojox.dtl.filter.strings._fix_ampersands,"&");
+},floatformat:function(_c,_d){
+_d=parseInt(_d||-1,10);
+_c=parseFloat(_c);
+var m=_c-_c.toFixed(0);
+if(!m&&_d<0){
+return _c.toFixed();
+}
+_c=_c.toFixed(Math.abs(_d));
+return (_d<0)?parseFloat(_c)+"":_c;
+},iriencode:function(_e){
+return dojox.dtl.filter.strings._urlquote(_e,"/#%[]=:;$&()+,!");
+},linenumbers:function(_f){
 var df=dojox.dtl.filter;
-var _13=_11.split("\n");
-var _14=[];
-var _15=(_13.length+"").length;
-for(var i=0,_17;i<_13.length;i++){
-_17=_13[i];
-_14.push(df.strings.ljust(i+1,_15)+". "+dojox.dtl._base.escape(_17));
-}
-return _14.join("\n");
-},ljust:function(_18,arg){
-_18=_18+"";
+var _10=_f.split("\n");
+var _11=[];
+var _12=(_10.length+"").length;
+for(var i=0,_13;i<_10.length;i++){
+_13=_10[i];
+_11.push(df.strings.ljust(i+1,_12)+". "+dojox.dtl._base.escape(_13));
+}
+return _11.join("\n");
+},ljust:function(_14,arg){
+_14=_14+"";
 arg=parseInt(arg,10);
-while(_18.length<arg){
-_18=_18+" ";
+while(_14.length<arg){
+_14=_14+" ";
 }
-return _18;
-},lower:function(_1a){
-return (_1a+"").toLowerCase();
-},make_list:function(_1b){
-var _1c=[];
-if(typeof _1b=="number"){
-_1b=_1b+"";
+return _14;
+},lower:function(_15){
+return (_15+"").toLowerCase();
+},make_list:function(_16){
+var _17=[];
+if(typeof _16=="number"){
+_16=_16+"";
 }
-if(_1b.charAt){
-for(var i=0;i<_1b.length;i++){
-_1c.push(_1b.charAt(i));
+if(_16.charAt){
+for(var i=0;i<_16.length;i++){
+_17.push(_16.charAt(i));
 }
-return _1c;
+return _17;
 }
-if(typeof _1b=="object"){
-for(var key in _1b){
-_1c.push(_1b[key]);
+if(typeof _16=="object"){
+for(var key in _16){
+_17.push(_16[key]);
 }
-return _1c;
+return _17;
 }
 return [];
-},rjust:function(_1f,arg){
-_1f=_1f+"";
+},rjust:function(_18,arg){
+_18=_18+"";
 arg=parseInt(arg,10);
-while(_1f.length<arg){
-_1f=" "+_1f;
-}
-return _1f;
-},slugify:function(_21){
-_21=_21.replace(/[^\w\s-]/g,"").toLowerCase();
-return _21.replace(/[\-\s]+/g,"-");
-},_strings:{},stringformat:function(_22,arg){
+while(_18.length<arg){
+_18=" "+_18;
+}
+return _18;
+},slugify:function(_19){
+_19=_19.replace(/[^\w\s-]/g,"").toLowerCase();
+return _19.replace(/[\-\s]+/g,"-");
+},_strings:{},stringformat:function(_1a,arg){
 arg=""+arg;
-var _24=dojox.dtl.filter.strings._strings;
-if(!_24[arg]){
-_24[arg]=new dojox.string.sprintf.Formatter("%"+arg);
-}
-return _24[arg].format(_22);
-},title:function(_25){
-var _26,_27="";
-for(var i=0,_29;i<_25.length;i++){
-_29=_25.charAt(i);
-if(_26==" "||_26=="\n"||_26=="\t"||!_26){
-_27+=_29.toUpperCase();
+var _1b=dojox.dtl.filter.strings._strings;
+if(!_1b[arg]){
+_1b[arg]=new dojox.string.sprintf.Formatter("%"+arg);
+}
+return _1b[arg].format(_1a);
+},title:function(_1c){
+var _1d,_1e="";
+for(var i=0,_1f;i<_1c.length;i++){
+_1f=_1c.charAt(i);
+if(_1d==" "||_1d=="\n"||_1d=="\t"||!_1d){
+_1e+=_1f.toUpperCase();
 }else{
-_27+=_29.toLowerCase();
+_1e+=_1f.toLowerCase();
 }
-_26=_29;
+_1d=_1f;
 }
-return _27;
-},_truncatewords:/[ \n\r\t]/,truncatewords:function(_2a,arg){
+return _1e;
+},_truncatewords:/[ \n\r\t]/,truncatewords:function(_20,arg){
 arg=parseInt(arg,10);
 if(!arg){
-return _2a;
+return _20;
 }
-for(var i=0,j=_2a.length,_2e=0,_2f,_30;i<_2a.length;i++){
-_2f=_2a.charAt(i);
-if(dojox.dtl.filter.strings._truncatewords.test(_30)){
-if(!dojox.dtl.filter.strings._truncatewords.test(_2f)){
-++_2e;
-if(_2e==arg){
-return _2a.substring(0,j+1);
+for(var i=0,j=_20.length,_21=0,_22,_23;i<_20.length;i++){
+_22=_20.charAt(i);
+if(dojox.dtl.filter.strings._truncatewords.test(_23)){
+if(!dojox.dtl.filter.strings._truncatewords.test(_22)){
+++_21;
+if(_21==arg){
+return _20.substring(0,j+1);
 }
 }
 }else{
-if(!dojox.dtl.filter.strings._truncatewords.test(_2f)){
+if(!dojox.dtl.filter.strings._truncatewords.test(_22)){
 j=i;
 }
 }
-_30=_2f;
+_23=_22;
 }
-return _2a;
-},_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(_31,arg){
+return _20;
+},_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(_24,arg){
 arg=parseInt(arg,10);
 if(arg<=0){
 return "";
 }
-var _33=dojox.dtl.filter.strings;
-var _34=0;
-var _35=[];
-var _36=dojox.string.tokenize(_31,_33._truncate_words,function(all,_38){
-if(_38){
-++_34;
-if(_34<arg){
-return _38;
+var _25=dojox.dtl.filter.strings;
+var _26=0;
+var _27=[];
+var _28=dojox.string.tokenize(_24,_25._truncate_words,function(all,_29){
+if(_29){
+++_26;
+if(_26<arg){
+return _29;
 }else{
-if(_34==arg){
-return _38+" ...";
+if(_26==arg){
+return _29+" ...";
 }
 }
 }
-var tag=all.match(_33._truncate_tag);
-if(!tag||_34>=arg){
+var tag=all.match(_25._truncate_tag);
+if(!tag||_26>=arg){
 return;
 }
-var _3a=tag[1];
-var _3b=tag[2].toLowerCase();
-var _3c=tag[3];
-if(_3a||_33._truncate_singlets[_3b]){
+var _2a=tag[1];
+var _2b=tag[2].toLowerCase();
+var _2c=tag[3];
+if(_2a||_25._truncate_singlets[_2b]){
 }else{
-if(_3a){
-var i=dojo.indexOf(_35,_3b);
+if(_2a){
+var i=dojo.indexOf(_27,_2b);
 if(i!=-1){
-_35=_35.slice(i+1);
+_27=_27.slice(i+1);
 }
 }else{
-_35.unshift(_3b);
+_27.unshift(_2b);
 }
 }
 return all;
 }).join("");
-_36=_36.replace(/\s+$/g,"");
-for(var i=0,tag;tag=_35[i];i++){
-_36+="</"+tag+">";
-}
-return _36;
-},upper:function(_40){
-return _40.toUpperCase();
-},urlencode:function(_41){
-return dojox.dtl.filter.strings._urlquote(_41);
-},_urlize:/^((?:[(>]|<)*)(.*?)((?:[.,)>\n]|>)*)$/,_urlize2:/^\S+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+$/,urlize:function(_42){
-return dojox.dtl.filter.strings.urlizetrunc(_42);
-},urlizetrunc:function(_43,arg){
+_28=_28.replace(/\s+$/g,"");
+for(var i=0,tag;tag=_27[i];i++){
+_28+="</"+tag+">";
+}
+return _28;
+},upper:function(_2d){
+return _2d.toUpperCase();
+},urlencode:function(_2e){
+return dojox.dtl.filter.strings._urlquote(_2e);
+},_urlize:/^((?:[(>]|<)*)(.*?)((?:[.,)>\n]|>)*)$/,_urlize2:/^\S+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+$/,urlize:function(_2f){
+return dojox.dtl.filter.strings.urlizetrunc(_2f);
+},urlizetrunc:function(_30,arg){
 arg=parseInt(arg);
-return dojox.string.tokenize(_43,/(\S+)/g,function(_45){
-var _46=dojox.dtl.filter.strings._urlize.exec(_45);
-if(!_46){
-return _45;
-}
-var _47=_46[1];
-var _48=_46[2];
-var _49=_46[3];
-var _4a=_48.indexOf("www.")==0;
-var _4b=_48.indexOf("@")!=-1;
-var _4c=_48.indexOf(":")!=-1;
-var _4d=_48.indexOf("http://")==0;
-var _4e=_48.indexOf("https://")==0;
-var _4f=/[a-zA-Z0-9]/.test(_48.charAt(0));
-var _50=_48.substring(_48.length-4);
-var _51=_48;
+return dojox.string.tokenize(_30,/(\S+)/g,function(_31){
+var _32=dojox.dtl.filter.strings._urlize.exec(_31);
+if(!_32){
+return _31;
+}
+var _33=_32[1];
+var _34=_32[2];
+var _35=_32[3];
+var _36=_34.indexOf("www.")==0;
+var _37=_34.indexOf("@")!=-1;
+var _38=_34.indexOf(":")!=-1;
+var _39=_34.indexOf("http://")==0;
+var _3a=_34.indexOf("https://")==0;
+var _3b=/[a-zA-Z0-9]/.test(_34.charAt(0));
+var _3c=_34.substring(_34.length-4);
+var _3d=_34;
 if(arg>3){
-_51=_51.substring(0,arg-3)+"...";
+_3d=_3d.substring(0,arg-3)+"...";
 }
-if(_4a||(!_4b&&!_4d&&_48.length&&_4f&&(_50==".org"||_50==".net"||_50==".com"))){
-return "<a href=\"http://"+_48+"\" rel=\"nofollow\">"+_51+"</a>";
+if(_36||(!_37&&!_39&&_34.length&&_3b&&(_3c==".org"||_3c==".net"||_3c==".com"))){
+return "<a href=\"http://"+_34+"\" rel=\"nofollow\">"+_3d+"</a>";
 }else{
-if(_4d||_4e){
-return "<a href=\""+_48+"\" rel=\"nofollow\">"+_51+"</a>";
+if(_39||_3a){
+return "<a href=\""+_34+"\" rel=\"nofollow\">"+_3d+"</a>";
 }else{
-if(_4b&&!_4a&&!_4c&&dojox.dtl.filter.strings._urlize2.test(_48)){
-return "<a href=\"mailto:"+_48+"\">"+_48+"</a>";
+if(_37&&!_36&&!_38&&dojox.dtl.filter.strings._urlize2.test(_34)){
+return "<a href=\"mailto:"+_34+"\">"+_34+"</a>";
 }
 }
 }
-return _45;
+return _31;
 }).join("");
-},wordcount:function(_52){
-_52=dojo.trim(_52);
-if(!_52){
+},wordcount:function(_3e){
+_3e=dojo.trim(_3e);
+if(!_3e){
 return 0;
 }
-return _52.split(/\s+/g).length;
-},wordwrap:function(_53,arg){
+return _3e.split(/\s+/g).length;
+},wordwrap:function(_3f,arg){
 arg=parseInt(arg);
-var _55=[];
-var _56=_53.split(/\s+/g);
-if(_56.length){
-var _57=_56.shift();
-_55.push(_57);
-var pos=_57.length-_57.lastIndexOf("\n")-1;
-for(var i=0;i<_56.length;i++){
-_57=_56[i];
-if(_57.indexOf("\n")!=-1){
-var _5a=_57.split(/\n/g);
+var _40=[];
+var _41=_3f.split(/\s+/g);
+if(_41.length){
+var _42=_41.shift();
+_40.push(_42);
+var pos=_42.length-_42.lastIndexOf("\n")-1;
+for(var i=0;i<_41.length;i++){
+_42=_41[i];
+if(_42.indexOf("\n")!=-1){
+var _43=_42.split(/\n/g);
 }else{
-var _5a=[_57];
+var _43=[_42];
 }
-pos+=_5a[0].length+1;
+pos+=_43[0].length+1;
 if(arg&&pos>arg){
-_55.push("\n");
-pos=_5a[_5a.length-1].length;
+_40.push("\n");
+pos=_43[_43.length-1].length;
 }else{
-_55.push(" ");
-if(_5a.length>1){
-pos=_5a[_5a.length-1].length;
+_40.push(" ");
+if(_43.length>1){
+pos=_43[_43.length-1].length;
 }
 }
-_55.push(_57);
+_40.push(_42);
 }
 }
-return _55.join("");
+return _40.join("");
 }});
 }
diff --git a/dojox/dtl/tag/loader.js b/dojox/dtl/tag/loader.js
index 3368f9e..2216234 100644
--- a/dojox/dtl/tag/loader.js
+++ b/dojox/dtl/tag/loader.js
@@ -11,250 +11,250 @@ dojo.provide("dojox.dtl.tag.loader");
 dojo.require("dojox.dtl._base");
 (function(){
 var dd=dojox.dtl;
-var _2=dd.tag.loader;
-_2.BlockNode=dojo.extend(function(_3,_4){
-this.name=_3;
-this.nodelist=_4;
+var _1=dd.tag.loader;
+_1.BlockNode=dojo.extend(function(_2,_3){
+this.name=_2;
+this.nodelist=_3;
 },{"super":function(){
 if(this.parent){
-var _5=this.parent.nodelist.dummyRender(this.context,null,true);
-if(typeof _5=="string"){
-_5=new String(_5);
+var _4=this.parent.nodelist.dummyRender(this.context,null,true);
+if(typeof _4=="string"){
+_4=new String(_4);
 }
-_5.safe=true;
-return _5;
+_4.safe=true;
+return _4;
 }
 return "";
-},render:function(_6,_7){
-var _8=this.name;
-var _9=this.nodelist;
-var _a;
-if(_7.blocks){
-var _b=_7.blocks[_8];
-if(_b){
-_a=_b.parent;
-_9=_b.nodelist;
-_b.used=true;
-}
-}
-this.rendered=_9;
-_6=_6.push();
-this.context=_6;
+},render:function(_5,_6){
+var _7=this.name;
+var _8=this.nodelist;
+var _9;
+if(_6.blocks){
+var _a=_6.blocks[_7];
+if(_a){
+_9=_a.parent;
+_8=_a.nodelist;
+_a.used=true;
+}
+}
+this.rendered=_8;
+_5=_5.push();
+this.context=_5;
 this.parent=null;
-if(_9!=this.nodelist){
+if(_8!=this.nodelist){
 this.parent=this;
 }
-_6.block=this;
-if(_7.getParent){
-var _c=_7.getParent();
-var _d=dojo.connect(_7,"onSetParent",function(_e,up,_10){
-if(up&&_10){
-_7.setParent(_c);
+_5.block=this;
+if(_6.getParent){
+var _b=_6.getParent();
+var _c=dojo.connect(_6,"onSetParent",function(_d,up,_e){
+if(up&&_e){
+_6.setParent(_b);
 }
 });
 }
-_7=_9.render(_6,_7,this);
-_d&&dojo.disconnect(_d);
-_6=_6.pop();
-return _7;
-},unrender:function(_11,_12){
-return this.rendered.unrender(_11,_12);
-},clone:function(_13){
-return new this.constructor(this.name,this.nodelist.clone(_13));
+_6=_8.render(_5,_6,this);
+_c&&dojo.disconnect(_c);
+_5=_5.pop();
+return _6;
+},unrender:function(_f,_10){
+return this.rendered.unrender(_f,_10);
+},clone:function(_11){
+return new this.constructor(this.name,this.nodelist.clone(_11));
 },toString:function(){
 return "dojox.dtl.tag.loader.BlockNode";
 }});
-_2.ExtendsNode=dojo.extend(function(_14,_15,_16,_17,key){
-this.getTemplate=_14;
-this.nodelist=_15;
-this.shared=_16;
-this.parent=_17;
+_1.ExtendsNode=dojo.extend(function(_12,_13,_14,_15,key){
+this.getTemplate=_12;
+this.nodelist=_13;
+this.shared=_14;
+this.parent=_15;
 this.key=key;
-},{parents:{},getParent:function(_19){
-var _1a=this.parent;
-if(!_1a){
-var _1b;
-_1a=this.parent=_19.get(this.key,false);
-if(!_1a){
+},{parents:{},getParent:function(_16){
+var _17=this.parent;
+if(!_17){
+var _18;
+_17=this.parent=_16.get(this.key,false);
+if(!_17){
 throw new Error("extends tag used a variable that did not resolve");
 }
-if(typeof _1a=="object"){
-var url=_1a.url||_1a.templatePath;
-if(_1a.shared){
+if(typeof _17=="object"){
+var url=_17.url||_17.templatePath;
+if(_17.shared){
 this.shared=true;
 }
 if(url){
-_1a=this.parent=url.toString();
+_17=this.parent=url.toString();
 }else{
-if(_1a.templateString){
-_1b=_1a.templateString;
-_1a=this.parent=" ";
+if(_17.templateString){
+_18=_17.templateString;
+_17=this.parent=" ";
 }else{
-_1a=this.parent=this.parent.toString();
+_17=this.parent=this.parent.toString();
 }
 }
 }
-if(_1a&&_1a.indexOf("shared:")===0){
+if(_17&&_17.indexOf("shared:")===0){
 this.shared=true;
-_1a=this.parent=_1a.substring(7,_1a.length);
+_17=this.parent=_17.substring(7,_17.length);
 }
 }
-if(!_1a){
+if(!_17){
 throw new Error("Invalid template name in 'extends' tag.");
 }
-if(_1a.render){
-return _1a;
+if(_17.render){
+return _17;
 }
-if(this.parents[_1a]){
-return this.parents[_1a];
+if(this.parents[_17]){
+return this.parents[_17];
 }
-this.parent=this.getTemplate(_1b||dojox.dtl.text.getTemplateString(_1a));
+this.parent=this.getTemplate(_18||dojox.dtl.text.getTemplateString(_17));
 if(this.shared){
-this.parents[_1a]=this.parent;
+this.parents[_17]=this.parent;
 }
 return this.parent;
-},render:function(_1d,_1e){
-var _1f=this.getParent(_1d);
-_1f.blocks=_1f.blocks||{};
-_1e.blocks=_1e.blocks||{};
-for(var i=0,_21;_21=this.nodelist.contents[i];i++){
-if(_21 instanceof dojox.dtl.tag.loader.BlockNode){
-var old=_1f.blocks[_21.name];
-if(old&&old.nodelist!=_21.nodelist){
-_1e=old.nodelist.unrender(_1d,_1e);
-}
-_1f.blocks[_21.name]=_1e.blocks[_21.name]={shared:this.shared,nodelist:_21.nodelist,used:false};
-}
-}
-this.rendered=_1f;
-return _1f.nodelist.render(_1d,_1e,this);
-},unrender:function(_23,_24){
-return this.rendered.unrender(_23,_24,this);
+},render:function(_19,_1a){
+var _1b=this.getParent(_19);
+_1b.blocks=_1b.blocks||{};
+_1a.blocks=_1a.blocks||{};
+for(var i=0,_1c;_1c=this.nodelist.contents[i];i++){
+if(_1c instanceof dojox.dtl.tag.loader.BlockNode){
+var old=_1b.blocks[_1c.name];
+if(old&&old.nodelist!=_1c.nodelist){
+_1a=old.nodelist.unrender(_19,_1a);
+}
+_1b.blocks[_1c.name]=_1a.blocks[_1c.name]={shared:this.shared,nodelist:_1c.nodelist,used:false};
+}
+}
+this.rendered=_1b;
+return _1b.nodelist.render(_19,_1a,this);
+},unrender:function(_1d,_1e){
+return this.rendered.unrender(_1d,_1e,this);
 },toString:function(){
 return "dojox.dtl.block.ExtendsNode";
 }});
-_2.IncludeNode=dojo.extend(function(_25,_26,_27,_28,_29){
-this._path=_25;
-this.constant=_26;
-this.path=(_26)?_25:new dd._Filter(_25);
-this.getTemplate=_27;
-this.text=_28;
-this.parsed=(arguments.length==5)?_29:true;
-},{_cache:[{},{}],render:function(_2a,_2b){
-var _2c=((this.constant)?this.path:this.path.resolve(_2a)).toString();
-var _2d=Number(this.parsed);
-var _2e=false;
-if(_2c!=this.last){
-_2e=true;
+_1.IncludeNode=dojo.extend(function(_1f,_20,_21,_22,_23){
+this._path=_1f;
+this.constant=_20;
+this.path=(_20)?_1f:new dd._Filter(_1f);
+this.getTemplate=_21;
+this.text=_22;
+this.parsed=(arguments.length==5)?_23:true;
+},{_cache:[{},{}],render:function(_24,_25){
+var _26=((this.constant)?this.path:this.path.resolve(_24)).toString();
+var _27=Number(this.parsed);
+var _28=false;
+if(_26!=this.last){
+_28=true;
 if(this.last){
-_2b=this.unrender(_2a,_2b);
+_25=this.unrender(_24,_25);
 }
-this.last=_2c;
+this.last=_26;
 }
-var _2f=this._cache[_2d];
-if(_2d){
-if(!_2f[_2c]){
-_2f[_2c]=dd.text._resolveTemplateArg(_2c,true);
+var _29=this._cache[_27];
+if(_27){
+if(!_29[_26]){
+_29[_26]=dd.text._resolveTemplateArg(_26,true);
 }
-if(_2e){
-var _30=this.getTemplate(_2f[_2c]);
-this.rendered=_30.nodelist;
+if(_28){
+var _2a=this.getTemplate(_29[_26]);
+this.rendered=_2a.nodelist;
 }
-return this.rendered.render(_2a,_2b,this);
+return this.rendered.render(_24,_25,this);
 }else{
 if(this.text instanceof dd._TextNode){
-if(_2e){
+if(_28){
 this.rendered=this.text;
-this.rendered.set(dd.text._resolveTemplateArg(_2c,true));
+this.rendered.set(dd.text._resolveTemplateArg(_26,true));
 }
-return this.rendered.render(_2a,_2b);
+return this.rendered.render(_24,_25);
 }else{
-if(!_2f[_2c]){
-var _31=[];
+if(!_29[_26]){
+var _2b=[];
 var div=document.createElement("div");
-div.innerHTML=dd.text._resolveTemplateArg(_2c,true);
-var _33=div.childNodes;
-while(_33.length){
-var _34=div.removeChild(_33[0]);
-_31.push(_34);
+div.innerHTML=dd.text._resolveTemplateArg(_26,true);
+var _2c=div.childNodes;
+while(_2c.length){
+var _2d=div.removeChild(_2c[0]);
+_2b.push(_2d);
 }
-_2f[_2c]=_31;
+_29[_26]=_2b;
 }
-if(_2e){
+if(_28){
 this.nodelist=[];
-var _35=true;
-for(var i=0,_37;_37=_2f[_2c][i];i++){
-this.nodelist.push(_37.cloneNode(true));
+var _2e=true;
+for(var i=0,_2f;_2f=_29[_26][i];i++){
+this.nodelist.push(_2f.cloneNode(true));
 }
 }
-for(var i=0,_38;_38=this.nodelist[i];i++){
-_2b=_2b.concat(_38);
+for(var i=0,_30;_30=this.nodelist[i];i++){
+_25=_25.concat(_30);
 }
 }
 }
-return _2b;
-},unrender:function(_39,_3a){
+return _25;
+},unrender:function(_31,_32){
 if(this.rendered){
-_3a=this.rendered.unrender(_39,_3a);
+_32=this.rendered.unrender(_31,_32);
 }
 if(this.nodelist){
-for(var i=0,_3c;_3c=this.nodelist[i];i++){
-_3a=_3a.remove(_3c);
+for(var i=0,_33;_33=this.nodelist[i];i++){
+_32=_32.remove(_33);
 }
 }
-return _3a;
-},clone:function(_3d){
-return new this.constructor(this._path,this.constant,this.getTemplate,this.text.clone(_3d),this.parsed);
+return _32;
+},clone:function(_34){
+return new this.constructor(this._path,this.constant,this.getTemplate,this.text.clone(_34),this.parsed);
 }});
-dojo.mixin(_2,{block:function(_3e,_3f){
-var _40=_3f.contents.split();
-var _41=_40[1];
-_3e._blocks=_3e._blocks||{};
-_3e._blocks[_41]=_3e._blocks[_41]||[];
-_3e._blocks[_41].push(_41);
-var _42=_3e.parse(["endblock","endblock "+_41]).rtrim();
-_3e.next_token();
-return new dojox.dtl.tag.loader.BlockNode(_41,_42);
-},extends_:function(_43,_44){
-var _45=_44.contents.split();
-var _46=false;
-var _47=null;
+dojo.mixin(_1,{block:function(_35,_36){
+var _37=_36.contents.split();
+var _38=_37[1];
+_35._blocks=_35._blocks||{};
+_35._blocks[_38]=_35._blocks[_38]||[];
+_35._blocks[_38].push(_38);
+var _39=_35.parse(["endblock","endblock "+_38]).rtrim();
+_35.next_token();
+return new dojox.dtl.tag.loader.BlockNode(_38,_39);
+},extends_:function(_3a,_3b){
+var _3c=_3b.contents.split();
+var _3d=false;
+var _3e=null;
 var key=null;
-if(_45[1].charAt(0)=="\""||_45[1].charAt(0)=="'"){
-_47=_45[1].substring(1,_45[1].length-1);
+if(_3c[1].charAt(0)=="\""||_3c[1].charAt(0)=="'"){
+_3e=_3c[1].substring(1,_3c[1].length-1);
 }else{
-key=_45[1];
-}
-if(_47&&_47.indexOf("shared:")==0){
-_46=true;
-_47=_47.substring(7,_47.length);
-}
-var _49=_43.parse();
-return new dojox.dtl.tag.loader.ExtendsNode(_43.getTemplate,_49,_46,_47,key);
-},include:function(_4a,_4b){
-var _4c=_4b.contents.split();
-if(_4c.length!=2){
-throw new Error(_4c[0]+" tag takes one argument: the name of the template to be included");
-}
-var _4d=_4c[1];
-var _4e=false;
-if((_4d.charAt(0)=="\""||_4d.slice(-1)=="'")&&_4d.charAt(0)==_4d.slice(-1)){
-_4d=_4d.slice(1,-1);
-_4e=true;
-}
-return new _2.IncludeNode(_4d,_4e,_4a.getTemplate,_4a.create_text_node());
-},ssi:function(_4f,_50){
-var _51=_50.contents.split();
-var _52=false;
-if(_51.length==3){
-_52=(_51.pop()=="parsed");
-if(!_52){
+key=_3c[1];
+}
+if(_3e&&_3e.indexOf("shared:")==0){
+_3d=true;
+_3e=_3e.substring(7,_3e.length);
+}
+var _3f=_3a.parse();
+return new dojox.dtl.tag.loader.ExtendsNode(_3a.getTemplate,_3f,_3d,_3e,key);
+},include:function(_40,_41){
+var _42=_41.contents.split();
+if(_42.length!=2){
+throw new Error(_42[0]+" tag takes one argument: the name of the template to be included");
+}
+var _43=_42[1];
+var _44=false;
+if((_43.charAt(0)=="\""||_43.slice(-1)=="'")&&_43.charAt(0)==_43.slice(-1)){
+_43=_43.slice(1,-1);
+_44=true;
+}
+return new _1.IncludeNode(_43,_44,_40.getTemplate,_40.create_text_node());
+},ssi:function(_45,_46){
+var _47=_46.contents.split();
+var _48=false;
+if(_47.length==3){
+_48=(_47.pop()=="parsed");
+if(!_48){
 throw new Error("Second (optional) argument to ssi tag must be 'parsed'");
 }
 }
-var _53=_2.include(_4f,new dd.Token(_50.token_type,_51.join(" ")));
-_53.parsed=_52;
-return _53;
+var _49=_1.include(_45,new dd.Token(_46.token_type,_47.join(" ")));
+_49.parsed=_48;
+return _49;
 }});
 })();
 }
diff --git a/dojox/dtl/tag/logic.js b/dojox/dtl/tag/logic.js
index 1a1fbaa..4492cfb 100644
--- a/dojox/dtl/tag/logic.js
+++ b/dojox/dtl/tag/logic.js
@@ -11,237 +11,237 @@ dojo.provide("dojox.dtl.tag.logic");
 dojo.require("dojox.dtl._base");
 (function(){
 var dd=dojox.dtl;
-var _2=dd.text;
-var _3=dd.tag.logic;
-_3.IfNode=dojo.extend(function(_4,_5,_6,_7){
-this.bools=_4;
-this.trues=_5;
-this.falses=_6;
-this.type=_7;
-},{render:function(_8,_9){
-var i,_b,_c,_d,_e;
+var _1=dd.text;
+var _2=dd.tag.logic;
+_2.IfNode=dojo.extend(function(_3,_4,_5,_6){
+this.bools=_3;
+this.trues=_4;
+this.falses=_5;
+this.type=_6;
+},{render:function(_7,_8){
+var i,_9,_a,_b,_c;
 if(this.type=="or"){
-for(i=0;_b=this.bools[i];i++){
-_c=_b[0];
-_d=_b[1];
-_e=_d.resolve(_8);
-if((_e&&!_c)||(_c&&!_e)){
+for(i=0;_9=this.bools[i];i++){
+_a=_9[0];
+_b=_9[1];
+_c=_b.resolve(_7);
+if((_c&&!_a)||(_a&&!_c)){
 if(this.falses){
-_9=this.falses.unrender(_8,_9);
+_8=this.falses.unrender(_7,_8);
 }
-return (this.trues)?this.trues.render(_8,_9,this):_9;
+return (this.trues)?this.trues.render(_7,_8,this):_8;
 }
 }
 if(this.trues){
-_9=this.trues.unrender(_8,_9);
+_8=this.trues.unrender(_7,_8);
 }
-return (this.falses)?this.falses.render(_8,_9,this):_9;
+return (this.falses)?this.falses.render(_7,_8,this):_8;
 }else{
-for(i=0;_b=this.bools[i];i++){
-_c=_b[0];
-_d=_b[1];
-_e=_d.resolve(_8);
-if(_e==_c){
+for(i=0;_9=this.bools[i];i++){
+_a=_9[0];
+_b=_9[1];
+_c=_b.resolve(_7);
+if(_c==_a){
 if(this.trues){
-_9=this.trues.unrender(_8,_9);
+_8=this.trues.unrender(_7,_8);
 }
-return (this.falses)?this.falses.render(_8,_9,this):_9;
+return (this.falses)?this.falses.render(_7,_8,this):_8;
 }
 }
 if(this.falses){
-_9=this.falses.unrender(_8,_9);
-}
-return (this.trues)?this.trues.render(_8,_9,this):_9;
-}
-return _9;
-},unrender:function(_f,_10){
-_10=(this.trues)?this.trues.unrender(_f,_10):_10;
-_10=(this.falses)?this.falses.unrender(_f,_10):_10;
-return _10;
-},clone:function(_11){
-var _12=(this.trues)?this.trues.clone(_11):null;
-var _13=(this.falses)?this.falses.clone(_11):null;
-return new this.constructor(this.bools,_12,_13,this.type);
+_8=this.falses.unrender(_7,_8);
+}
+return (this.trues)?this.trues.render(_7,_8,this):_8;
+}
+return _8;
+},unrender:function(_d,_e){
+_e=(this.trues)?this.trues.unrender(_d,_e):_e;
+_e=(this.falses)?this.falses.unrender(_d,_e):_e;
+return _e;
+},clone:function(_f){
+var _10=(this.trues)?this.trues.clone(_f):null;
+var _11=(this.falses)?this.falses.clone(_f):null;
+return new this.constructor(this.bools,_10,_11,this.type);
 }});
-_3.IfEqualNode=dojo.extend(function(_14,_15,_16,_17,_18){
-this.var1=new dd._Filter(_14);
-this.var2=new dd._Filter(_15);
-this.trues=_16;
-this.falses=_17;
-this.negate=_18;
-},{render:function(_19,_1a){
-var _1b=this.var1.resolve(_19);
-var _1c=this.var2.resolve(_19);
-_1b=(typeof _1b!="undefined")?_1b:"";
-_1c=(typeof _1b!="undefined")?_1c:"";
-if((this.negate&&_1b!=_1c)||(!this.negate&&_1b==_1c)){
+_2.IfEqualNode=dojo.extend(function(_12,_13,_14,_15,_16){
+this.var1=new dd._Filter(_12);
+this.var2=new dd._Filter(_13);
+this.trues=_14;
+this.falses=_15;
+this.negate=_16;
+},{render:function(_17,_18){
+var _19=this.var1.resolve(_17);
+var _1a=this.var2.resolve(_17);
+_19=(typeof _19!="undefined")?_19:"";
+_1a=(typeof _19!="undefined")?_1a:"";
+if((this.negate&&_19!=_1a)||(!this.negate&&_19==_1a)){
 if(this.falses){
-_1a=this.falses.unrender(_19,_1a,this);
+_18=this.falses.unrender(_17,_18,this);
 }
-return (this.trues)?this.trues.render(_19,_1a,this):_1a;
+return (this.trues)?this.trues.render(_17,_18,this):_18;
 }
 if(this.trues){
-_1a=this.trues.unrender(_19,_1a,this);
-}
-return (this.falses)?this.falses.render(_19,_1a,this):_1a;
-},unrender:function(_1d,_1e){
-return _3.IfNode.prototype.unrender.call(this,_1d,_1e);
-},clone:function(_1f){
-var _20=this.trues?this.trues.clone(_1f):null;
-var _21=this.falses?this.falses.clone(_1f):null;
-return new this.constructor(this.var1.getExpression(),this.var2.getExpression(),_20,_21,this.negate);
+_18=this.trues.unrender(_17,_18,this);
+}
+return (this.falses)?this.falses.render(_17,_18,this):_18;
+},unrender:function(_1b,_1c){
+return _2.IfNode.prototype.unrender.call(this,_1b,_1c);
+},clone:function(_1d){
+var _1e=this.trues?this.trues.clone(_1d):null;
+var _1f=this.falses?this.falses.clone(_1d):null;
+return new this.constructor(this.var1.getExpression(),this.var2.getExpression(),_1e,_1f,this.negate);
 }});
-_3.ForNode=dojo.extend(function(_22,_23,_24,_25){
-this.assign=_22;
-this.loop=new dd._Filter(_23);
-this.reversed=_24;
-this.nodelist=_25;
+_2.ForNode=dojo.extend(function(_20,_21,_22,_23){
+this.assign=_20;
+this.loop=new dd._Filter(_21);
+this.reversed=_22;
+this.nodelist=_23;
 this.pool=[];
-},{render:function(_26,_27){
+},{render:function(_24,_25){
 var i,j,k;
-var _2b=false;
-var _2c=this.assign;
-for(k=0;k<_2c.length;k++){
-if(typeof _26[_2c[k]]!="undefined"){
-_2b=true;
-_26=_26.push();
+var _26=false;
+var _27=this.assign;
+for(k=0;k<_27.length;k++){
+if(typeof _24[_27[k]]!="undefined"){
+_26=true;
+_24=_24.push();
 break;
 }
 }
-if(!_2b&&_26.forloop){
-_2b=true;
-_26=_26.push();
+if(!_26&&_24.forloop){
+_26=true;
+_24=_24.push();
 }
-var _2d=this.loop.resolve(_26)||[];
-for(i=_2d.length;i<this.pool.length;i++){
-this.pool[i].unrender(_26,_27,this);
+var _28=this.loop.resolve(_24)||[];
+for(i=_28.length;i<this.pool.length;i++){
+this.pool[i].unrender(_24,_25,this);
 }
 if(this.reversed){
-_2d=_2d.slice(0).reverse();
+_28=_28.slice(0).reverse();
 }
-var _2e=dojo.isObject(_2d)&&!dojo.isArrayLike(_2d);
-var _2f=[];
-if(_2e){
-for(var key in _2d){
-_2f.push(_2d[key]);
+var _29=dojo.isObject(_28)&&!dojo.isArrayLike(_28);
+var _2a=[];
+if(_29){
+for(var key in _28){
+_2a.push(_28[key]);
 }
 }else{
-_2f=_2d;
+_2a=_28;
 }
-var _31=_26.forloop={parentloop:_26.get("forloop",{})};
+var _2b=_24.forloop={parentloop:_24.get("forloop",{})};
 var j=0;
-for(i=0;i<_2f.length;i++){
-var _32=_2f[i];
-_31.counter0=j;
-_31.counter=j+1;
-_31.revcounter0=_2f.length-j-1;
-_31.revcounter=_2f.length-j;
-_31.first=!j;
-_31.last=(j==_2f.length-1);
-if(_2c.length>1&&dojo.isArrayLike(_32)){
-if(!_2b){
-_2b=true;
-_26=_26.push();
-}
-var _33={};
-for(k=0;k<_32.length&&k<_2c.length;k++){
-_33[_2c[k]]=_32[k];
-}
-dojo.mixin(_26,_33);
+for(i=0;i<_2a.length;i++){
+var _2c=_2a[i];
+_2b.counter0=j;
+_2b.counter=j+1;
+_2b.revcounter0=_2a.length-j-1;
+_2b.revcounter=_2a.length-j;
+_2b.first=!j;
+_2b.last=(j==_2a.length-1);
+if(_27.length>1&&dojo.isArrayLike(_2c)){
+if(!_26){
+_26=true;
+_24=_24.push();
+}
+var _2d={};
+for(k=0;k<_2c.length&&k<_27.length;k++){
+_2d[_27[k]]=_2c[k];
+}
+dojo.mixin(_24,_2d);
 }else{
-_26[_2c[0]]=_32;
+_24[_27[0]]=_2c;
 }
 if(j+1>this.pool.length){
-this.pool.push(this.nodelist.clone(_27));
+this.pool.push(this.nodelist.clone(_25));
 }
-_27=this.pool[j++].render(_26,_27,this);
+_25=this.pool[j++].render(_24,_25,this);
 }
-delete _26.forloop;
-if(_2b){
-_26=_26.pop();
+delete _24.forloop;
+if(_26){
+_24=_24.pop();
 }else{
-for(k=0;k<_2c.length;k++){
-delete _26[_2c[k]];
+for(k=0;k<_27.length;k++){
+delete _24[_27[k]];
 }
 }
-return _27;
-},unrender:function(_34,_35){
-for(var i=0,_37;_37=this.pool[i];i++){
-_35=_37.unrender(_34,_35);
+return _25;
+},unrender:function(_2e,_2f){
+for(var i=0,_30;_30=this.pool[i];i++){
+_2f=_30.unrender(_2e,_2f);
 }
-return _35;
-},clone:function(_38){
-return new this.constructor(this.assign,this.loop.getExpression(),this.reversed,this.nodelist.clone(_38));
+return _2f;
+},clone:function(_31){
+return new this.constructor(this.assign,this.loop.getExpression(),this.reversed,this.nodelist.clone(_31));
 }});
-dojo.mixin(_3,{if_:function(_39,_3a){
-var i,_3c,_3d,_3e=[],_3f=_3a.contents.split();
-_3f.shift();
-_3a=_3f.join(" ");
-_3f=_3a.split(" and ");
-if(_3f.length==1){
-_3d="or";
-_3f=_3a.split(" or ");
+dojo.mixin(_2,{if_:function(_32,_33){
+var i,_34,_35,_36=[],_37=_33.contents.split();
+_37.shift();
+_33=_37.join(" ");
+_37=_33.split(" and ");
+if(_37.length==1){
+_35="or";
+_37=_33.split(" or ");
 }else{
-_3d="and";
-for(i=0;i<_3f.length;i++){
-if(_3f[i].indexOf(" or ")!=-1){
+_35="and";
+for(i=0;i<_37.length;i++){
+if(_37[i].indexOf(" or ")!=-1){
 throw new Error("'if' tags can't mix 'and' and 'or'");
 }
 }
 }
-for(i=0;_3c=_3f[i];i++){
+for(i=0;_34=_37[i];i++){
 var not=false;
-if(_3c.indexOf("not ")==0){
-_3c=_3c.slice(4);
+if(_34.indexOf("not ")==0){
+_34=_34.slice(4);
 not=true;
 }
-_3e.push([not,new dd._Filter(_3c)]);
-}
-var _41=_39.parse(["else","endif"]);
-var _42=false;
-var _3a=_39.next_token();
-if(_3a.contents=="else"){
-_42=_39.parse(["endif"]);
-_39.next_token();
-}
-return new _3.IfNode(_3e,_41,_42,_3d);
-},_ifequal:function(_43,_44,_45){
-var _46=_44.split_contents();
-if(_46.length!=3){
-throw new Error(_46[0]+" takes two arguments");
-}
-var end="end"+_46[0];
-var _48=_43.parse(["else",end]);
-var _49=false;
-var _44=_43.next_token();
-if(_44.contents=="else"){
-_49=_43.parse([end]);
-_43.next_token();
-}
-return new _3.IfEqualNode(_46[1],_46[2],_48,_49,_45);
-},ifequal:function(_4a,_4b){
-return _3._ifequal(_4a,_4b);
-},ifnotequal:function(_4c,_4d){
-return _3._ifequal(_4c,_4d,true);
-},for_:function(_4e,_4f){
-var _50=_4f.contents.split();
-if(_50.length<4){
-throw new Error("'for' statements should have at least four words: "+_4f.contents);
-}
-var _51=_50[_50.length-1]=="reversed";
-var _52=(_51)?-3:-2;
-if(_50[_50.length+_52]!="in"){
-throw new Error("'for' tag received an invalid argument: "+_4f.contents);
-}
-var _53=_50.slice(1,_52).join(" ").split(/ *, */);
-for(var i=0;i<_53.length;i++){
-if(!_53[i]||_53[i].indexOf(" ")!=-1){
-throw new Error("'for' tag received an invalid argument: "+_4f.contents);
-}
-}
-var _55=_4e.parse(["endfor"]);
-_4e.next_token();
-return new _3.ForNode(_53,_50[_50.length+_52+1],_51,_55);
+_36.push([not,new dd._Filter(_34)]);
+}
+var _38=_32.parse(["else","endif"]);
+var _39=false;
+var _33=_32.next_token();
+if(_33.contents=="else"){
+_39=_32.parse(["endif"]);
+_32.next_token();
+}
+return new _2.IfNode(_36,_38,_39,_35);
+},_ifequal:function(_3a,_3b,_3c){
+var _3d=_3b.split_contents();
+if(_3d.length!=3){
+throw new Error(_3d[0]+" takes two arguments");
+}
+var end="end"+_3d[0];
+var _3e=_3a.parse(["else",end]);
+var _3f=false;
+var _3b=_3a.next_token();
+if(_3b.contents=="else"){
+_3f=_3a.parse([end]);
+_3a.next_token();
+}
+return new _2.IfEqualNode(_3d[1],_3d[2],_3e,_3f,_3c);
+},ifequal:function(_40,_41){
+return _2._ifequal(_40,_41);
+},ifnotequal:function(_42,_43){
+return _2._ifequal(_42,_43,true);
+},for_:function(_44,_45){
+var _46=_45.contents.split();
+if(_46.length<4){
+throw new Error("'for' statements should have at least four words: "+_45.contents);
+}
+var _47=_46[_46.length-1]=="reversed";
+var _48=(_47)?-3:-2;
+if(_46[_46.length+_48]!="in"){
+throw new Error("'for' tag received an invalid argument: "+_45.contents);
+}
+var _49=_46.slice(1,_48).join(" ").split(/ *, */);
+for(var i=0;i<_49.length;i++){
+if(!_49[i]||_49[i].indexOf(" ")!=-1){
+throw new Error("'for' tag received an invalid argument: "+_45.contents);
+}
+}
+var _4a=_44.parse(["endfor"]);
+_44.next_token();
+return new _2.ForNode(_49,_46[_46.length+_48+1],_47,_4a);
 }});
 })();
 }
diff --git a/dojox/dtl/tag/loop.js b/dojox/dtl/tag/loop.js
index c0a52bc..15b81e1 100644
--- a/dojox/dtl/tag/loop.js
+++ b/dojox/dtl/tag/loop.js
@@ -12,153 +12,153 @@ dojo.require("dojox.dtl._base");
 dojo.require("dojox.string.tokenize");
 (function(){
 var dd=dojox.dtl;
-var _2=dd.tag.loop;
-_2.CycleNode=dojo.extend(function(_3,_4,_5,_6){
-this.cyclevars=_3;
-this.name=_4;
-this.contents=_5;
-this.shared=_6||{counter:-1,map:{}};
-},{render:function(_7,_8){
-if(_7.forloop&&!_7.forloop.counter0){
+var _1=dd.tag.loop;
+_1.CycleNode=dojo.extend(function(_2,_3,_4,_5){
+this.cyclevars=_2;
+this.name=_3;
+this.contents=_4;
+this.shared=_5||{counter:-1,map:{}};
+},{render:function(_6,_7){
+if(_6.forloop&&!_6.forloop.counter0){
 this.shared.counter=-1;
 }
 ++this.shared.counter;
-var _9=this.cyclevars[this.shared.counter%this.cyclevars.length];
-var _a=this.shared.map;
-if(!_a[_9]){
-_a[_9]=new dd._Filter(_9);
+var _8=this.cyclevars[this.shared.counter%this.cyclevars.length];
+var _9=this.shared.map;
+if(!_9[_8]){
+_9[_8]=new dd._Filter(_8);
 }
-_9=_a[_9].resolve(_7,_8);
+_8=_9[_8].resolve(_6,_7);
 if(this.name){
-_7[this.name]=_9;
-}
-this.contents.set(_9);
-return this.contents.render(_7,_8);
-},unrender:function(_b,_c){
-return this.contents.unrender(_b,_c);
-},clone:function(_d){
-return new this.constructor(this.cyclevars,this.name,this.contents.clone(_d),this.shared);
+_6[this.name]=_8;
+}
+this.contents.set(_8);
+return this.contents.render(_6,_7);
+},unrender:function(_a,_b){
+return this.contents.unrender(_a,_b);
+},clone:function(_c){
+return new this.constructor(this.cyclevars,this.name,this.contents.clone(_c),this.shared);
 }});
-_2.IfChangedNode=dojo.extend(function(_e,_f,_10){
-this.nodes=_e;
-this._vars=_f;
-this.shared=_10||{last:null,counter:0};
-this.vars=dojo.map(_f,function(_11){
-return new dojox.dtl._Filter(_11);
+_1.IfChangedNode=dojo.extend(function(_d,_e,_f){
+this.nodes=_d;
+this._vars=_e;
+this.shared=_f||{last:null,counter:0};
+this.vars=dojo.map(_e,function(_10){
+return new dojox.dtl._Filter(_10);
 });
-},{render:function(_12,_13){
-if(_12.forloop){
-if(_12.forloop.counter<=this.shared.counter){
+},{render:function(_11,_12){
+if(_11.forloop){
+if(_11.forloop.counter<=this.shared.counter){
 this.shared.last=null;
 }
-this.shared.counter=_12.forloop.counter;
+this.shared.counter=_11.forloop.counter;
 }
-var _14;
+var _13;
 if(this.vars.length){
-_14=dojo.toJson(dojo.map(this.vars,function(_15){
-return _15.resolve(_12);
+_13=dojo.toJson(dojo.map(this.vars,function(_14){
+return _14.resolve(_11);
 }));
 }else{
-_14=this.nodes.dummyRender(_12,_13);
-}
-if(_14!=this.shared.last){
-var _16=(this.shared.last===null);
-this.shared.last=_14;
-_12=_12.push();
-_12.ifchanged={firstloop:_16};
-_13=this.nodes.render(_12,_13);
-_12=_12.pop();
+_13=this.nodes.dummyRender(_11,_12);
+}
+if(_13!=this.shared.last){
+var _15=(this.shared.last===null);
+this.shared.last=_13;
+_11=_11.push();
+_11.ifchanged={firstloop:_15};
+_12=this.nodes.render(_11,_12);
+_11=_11.pop();
 }else{
-_13=this.nodes.unrender(_12,_13);
+_12=this.nodes.unrender(_11,_12);
 }
-return _13;
-},unrender:function(_17,_18){
-return this.nodes.unrender(_17,_18);
-},clone:function(_19){
-return new this.constructor(this.nodes.clone(_19),this._vars,this.shared);
+return _12;
+},unrender:function(_16,_17){
+return this.nodes.unrender(_16,_17);
+},clone:function(_18){
+return new this.constructor(this.nodes.clone(_18),this._vars,this.shared);
 }});
-_2.RegroupNode=dojo.extend(function(_1a,key,_1c){
-this._expression=_1a;
-this.expression=new dd._Filter(_1a);
+_1.RegroupNode=dojo.extend(function(_19,key,_1a){
+this._expression=_19;
+this.expression=new dd._Filter(_19);
 this.key=key;
-this.alias=_1c;
-},{_push:function(_1d,_1e,_1f){
-if(_1f.length){
-_1d.push({grouper:_1e,list:_1f});
-}
-},render:function(_20,_21){
-_20[this.alias]=[];
-var _22=this.expression.resolve(_20);
-if(_22){
-var _23=null;
-var _24=[];
-for(var i=0;i<_22.length;i++){
-var id=_22[i][this.key];
-if(_23!==id){
-this._push(_20[this.alias],_23,_24);
-_23=id;
-_24=[_22[i]];
+this.alias=_1a;
+},{_push:function(_1b,_1c,_1d){
+if(_1d.length){
+_1b.push({grouper:_1c,list:_1d});
+}
+},render:function(_1e,_1f){
+_1e[this.alias]=[];
+var _20=this.expression.resolve(_1e);
+if(_20){
+var _21=null;
+var _22=[];
+for(var i=0;i<_20.length;i++){
+var id=_20[i][this.key];
+if(_21!==id){
+this._push(_1e[this.alias],_21,_22);
+_21=id;
+_22=[_20[i]];
 }else{
-_24.push(_22[i]);
+_22.push(_20[i]);
 }
 }
-this._push(_20[this.alias],_23,_24);
+this._push(_1e[this.alias],_21,_22);
 }
-return _21;
-},unrender:function(_27,_28){
-return _28;
-},clone:function(_29,_2a){
+return _1f;
+},unrender:function(_23,_24){
+return _24;
+},clone:function(_25,_26){
 return this;
 }});
-dojo.mixin(_2,{cycle:function(_2b,_2c){
-var _2d=_2c.split_contents();
-if(_2d.length<2){
+dojo.mixin(_1,{cycle:function(_27,_28){
+var _29=_28.split_contents();
+if(_29.length<2){
 throw new Error("'cycle' tag requires at least two arguments");
 }
-if(_2d[1].indexOf(",")!=-1){
-var _2e=_2d[1].split(",");
-_2d=[_2d[0]];
-for(var i=0;i<_2e.length;i++){
-_2d.push("\""+_2e[i]+"\"");
+if(_29[1].indexOf(",")!=-1){
+var _2a=_29[1].split(",");
+_29=[_29[0]];
+for(var i=0;i<_2a.length;i++){
+_29.push("\""+_2a[i]+"\"");
 }
 }
-if(_2d.length==2){
-var _30=_2d[_2d.length-1];
-if(!_2b._namedCycleNodes){
-throw new Error("No named cycles in template: '"+_30+"' is not defined");
+if(_29.length==2){
+var _2b=_29[_29.length-1];
+if(!_27._namedCycleNodes){
+throw new Error("No named cycles in template: '"+_2b+"' is not defined");
 }
-if(!_2b._namedCycleNodes[_30]){
-throw new Error("Named cycle '"+_30+"' does not exist");
+if(!_27._namedCycleNodes[_2b]){
+throw new Error("Named cycle '"+_2b+"' does not exist");
 }
-return _2b._namedCycleNodes[_30];
+return _27._namedCycleNodes[_2b];
 }
-if(_2d.length>4&&_2d[_2d.length-2]=="as"){
-var _30=_2d[_2d.length-1];
-var _31=new _2.CycleNode(_2d.slice(1,_2d.length-2),_30,_2b.create_text_node());
-if(!_2b._namedCycleNodes){
-_2b._namedCycleNodes={};
+if(_29.length>4&&_29[_29.length-2]=="as"){
+var _2b=_29[_29.length-1];
+var _2c=new _1.CycleNode(_29.slice(1,_29.length-2),_2b,_27.create_text_node());
+if(!_27._namedCycleNodes){
+_27._namedCycleNodes={};
 }
-_2b._namedCycleNodes[_30]=_31;
+_27._namedCycleNodes[_2b]=_2c;
 }else{
-_31=new _2.CycleNode(_2d.slice(1),null,_2b.create_text_node());
-}
-return _31;
-},ifchanged:function(_32,_33){
-var _34=_33.contents.split();
-var _35=_32.parse(["endifchanged"]);
-_32.delete_first_token();
-return new _2.IfChangedNode(_35,_34.slice(1));
-},regroup:function(_36,_37){
-var _38=dojox.string.tokenize(_37.contents,/(\s+)/g,function(_39){
-return _39;
+_2c=new _1.CycleNode(_29.slice(1),null,_27.create_text_node());
+}
+return _2c;
+},ifchanged:function(_2d,_2e){
+var _2f=_2e.contents.split();
+var _30=_2d.parse(["endifchanged"]);
+_2d.delete_first_token();
+return new _1.IfChangedNode(_30,_2f.slice(1));
+},regroup:function(_31,_32){
+var _33=dojox.string.tokenize(_32.contents,/(\s+)/g,function(_34){
+return _34;
 });
-if(_38.length<11||_38[_38.length-3]!="as"||_38[_38.length-7]!="by"){
+if(_33.length<11||_33[_33.length-3]!="as"||_33[_33.length-7]!="by"){
 throw new Error("Expected the format: regroup list by key as newList");
 }
-var _3a=_38.slice(2,-8).join("");
-var key=_38[_38.length-5];
-var _3c=_38[_38.length-1];
-return new _2.RegroupNode(_3a,key,_3c);
+var _35=_33.slice(2,-8).join("");
+var key=_33[_33.length-5];
+var _36=_33[_33.length-1];
+return new _1.RegroupNode(_35,key,_36);
 }});
 })();
 }
diff --git a/dojox/dtl/tag/misc.js b/dojox/dtl/tag/misc.js
index ab90b1d..d094947 100644
--- a/dojox/dtl/tag/misc.js
+++ b/dojox/dtl/tag/misc.js
@@ -11,213 +11,212 @@ dojo.provide("dojox.dtl.tag.misc");
 dojo.require("dojox.dtl._base");
 (function(){
 var dd=dojox.dtl;
-var _2=dd.tag.misc;
-_2.DebugNode=dojo.extend(function(_3){
-this.text=_3;
-},{render:function(_4,_5){
-var _6=_4.getKeys();
-var _7=[];
-var _8={};
-for(var i=0,_a;_a=_6[i];i++){
-_8[_a]=_4[_a];
-_7+="["+_a+": "+typeof _4[_a]+"]\n";
-}
-
-return this.text.set(_7).render(_4,_5,this);
-},unrender:function(_b,_c){
-return _c;
-},clone:function(_d){
-return new this.constructor(this.text.clone(_d));
+var _1=dd.tag.misc;
+_1.DebugNode=dojo.extend(function(_2){
+this.text=_2;
+},{render:function(_3,_4){
+var _5=_3.getKeys();
+var _6=[];
+var _7={};
+for(var i=0,_8;_8=_5[i];i++){
+_7[_8]=_3[_8];
+_6+="["+_8+": "+typeof _3[_8]+"]\n";
+}
+return this.text.set(_6).render(_3,_4,this);
+},unrender:function(_9,_a){
+return _a;
+},clone:function(_b){
+return new this.constructor(this.text.clone(_b));
 },toString:function(){
 return "ddtm.DebugNode";
 }});
-_2.FilterNode=dojo.extend(function(_e,_f){
-this._varnode=_e;
-this._nodelist=_f;
-},{render:function(_10,_11){
-var _12=this._nodelist.render(_10,new dojox.string.Builder());
-_10=_10.update({"var":_12.toString()});
-var _13=this._varnode.render(_10,_11);
-_10=_10.pop();
-return _11;
-},unrender:function(_14,_15){
-return _15;
-},clone:function(_16){
-return new this.constructor(this._expression,this._nodelist.clone(_16));
+_1.FilterNode=dojo.extend(function(_c,_d){
+this._varnode=_c;
+this._nodelist=_d;
+},{render:function(_e,_f){
+var _10=this._nodelist.render(_e,new dojox.string.Builder());
+_e=_e.update({"var":_10.toString()});
+var _11=this._varnode.render(_e,_f);
+_e=_e.pop();
+return _f;
+},unrender:function(_12,_13){
+return _13;
+},clone:function(_14){
+return new this.constructor(this._expression,this._nodelist.clone(_14));
 }});
-_2.FirstOfNode=dojo.extend(function(_17,_18){
-this._vars=_17;
-this.vars=dojo.map(_17,function(_19){
-return new dojox.dtl._Filter(_19);
+_1.FirstOfNode=dojo.extend(function(_15,_16){
+this._vars=_15;
+this.vars=dojo.map(_15,function(_17){
+return new dojox.dtl._Filter(_17);
 });
-this.contents=_18;
-},{render:function(_1a,_1b){
-for(var i=0,_1d;_1d=this.vars[i];i++){
-var _1e=_1d.resolve(_1a);
-if(typeof _1e!="undefined"){
-if(_1e===null){
-_1e="null";
-}
-this.contents.set(_1e);
-return this.contents.render(_1a,_1b);
-}
-}
-return this.contents.unrender(_1a,_1b);
-},unrender:function(_1f,_20){
-return this.contents.unrender(_1f,_20);
-},clone:function(_21){
-return new this.constructor(this._vars,this.contents.clone(_21));
+this.contents=_16;
+},{render:function(_18,_19){
+for(var i=0,_1a;_1a=this.vars[i];i++){
+var _1b=_1a.resolve(_18);
+if(typeof _1b!="undefined"){
+if(_1b===null){
+_1b="null";
+}
+this.contents.set(_1b);
+return this.contents.render(_18,_19);
+}
+}
+return this.contents.unrender(_18,_19);
+},unrender:function(_1c,_1d){
+return this.contents.unrender(_1c,_1d);
+},clone:function(_1e){
+return new this.constructor(this._vars,this.contents.clone(_1e));
 }});
-_2.SpacelessNode=dojo.extend(function(_22,_23){
-this.nodelist=_22;
-this.contents=_23;
-},{render:function(_24,_25){
-if(_25.getParent){
-var _26=[dojo.connect(_25,"onAddNodeComplete",this,"_watch"),dojo.connect(_25,"onSetParent",this,"_watchParent")];
-_25=this.nodelist.render(_24,_25);
-dojo.disconnect(_26[0]);
-dojo.disconnect(_26[1]);
+_1.SpacelessNode=dojo.extend(function(_1f,_20){
+this.nodelist=_1f;
+this.contents=_20;
+},{render:function(_21,_22){
+if(_22.getParent){
+var _23=[dojo.connect(_22,"onAddNodeComplete",this,"_watch"),dojo.connect(_22,"onSetParent",this,"_watchParent")];
+_22=this.nodelist.render(_21,_22);
+dojo.disconnect(_23[0]);
+dojo.disconnect(_23[1]);
 }else{
-var _27=this.nodelist.dummyRender(_24);
-this.contents.set(_27.replace(/>\s+</g,"><"));
-_25=this.contents.render(_24,_25);
-}
-return _25;
-},unrender:function(_28,_29){
-return this.nodelist.unrender(_28,_29);
-},clone:function(_2a){
-return new this.constructor(this.nodelist.clone(_2a),this.contents.clone(_2a));
-},_isEmpty:function(_2b){
-return (_2b.nodeType==3&&!_2b.data.match(/[^\s\n]/));
-},_watch:function(_2c){
-if(this._isEmpty(_2c)){
-var _2d=false;
-if(_2c.parentNode.firstChild==_2c){
-_2c.parentNode.removeChild(_2c);
+var _24=this.nodelist.dummyRender(_21);
+this.contents.set(_24.replace(/>\s+</g,"><"));
+_22=this.contents.render(_21,_22);
+}
+return _22;
+},unrender:function(_25,_26){
+return this.nodelist.unrender(_25,_26);
+},clone:function(_27){
+return new this.constructor(this.nodelist.clone(_27),this.contents.clone(_27));
+},_isEmpty:function(_28){
+return (_28.nodeType==3&&!_28.data.match(/[^\s\n]/));
+},_watch:function(_29){
+if(this._isEmpty(_29)){
+var _2a=false;
+if(_29.parentNode.firstChild==_29){
+_29.parentNode.removeChild(_29);
 }
 }else{
-var _2e=_2c.parentNode.childNodes;
-if(_2c.nodeType==1&&_2e.length>2){
-for(var i=2,_30;_30=_2e[i];i++){
-if(_2e[i-2].nodeType==1&&this._isEmpty(_2e[i-1])){
-_2c.parentNode.removeChild(_2e[i-1]);
+var _2b=_29.parentNode.childNodes;
+if(_29.nodeType==1&&_2b.length>2){
+for(var i=2,_2c;_2c=_2b[i];i++){
+if(_2b[i-2].nodeType==1&&this._isEmpty(_2b[i-1])){
+_29.parentNode.removeChild(_2b[i-1]);
 return;
 }
 }
 }
 }
-},_watchParent:function(_31){
-var _32=_31.childNodes;
-if(_32.length){
-while(_31.childNodes.length){
-var _33=_31.childNodes[_31.childNodes.length-1];
-if(!this._isEmpty(_33)){
+},_watchParent:function(_2d){
+var _2e=_2d.childNodes;
+if(_2e.length){
+while(_2d.childNodes.length){
+var _2f=_2d.childNodes[_2d.childNodes.length-1];
+if(!this._isEmpty(_2f)){
 return;
 }
-_31.removeChild(_33);
+_2d.removeChild(_2f);
 }
 }
 }});
-_2.TemplateTagNode=dojo.extend(function(tag,_35){
+_1.TemplateTagNode=dojo.extend(function(tag,_30){
 this.tag=tag;
-this.contents=_35;
-},{mapping:{openblock:"{%",closeblock:"%}",openvariable:"{{",closevariable:"}}",openbrace:"{",closebrace:"}",opencomment:"{#",closecomment:"#}"},render:function(_36,_37){
+this.contents=_30;
+},{mapping:{openblock:"{%",closeblock:"%}",openvariable:"{{",closevariable:"}}",openbrace:"{",closebrace:"}",opencomment:"{#",closecomment:"#}"},render:function(_31,_32){
 this.contents.set(this.mapping[this.tag]);
-return this.contents.render(_36,_37);
-},unrender:function(_38,_39){
-return this.contents.unrender(_38,_39);
-},clone:function(_3a){
-return new this.constructor(this.tag,this.contents.clone(_3a));
+return this.contents.render(_31,_32);
+},unrender:function(_33,_34){
+return this.contents.unrender(_33,_34);
+},clone:function(_35){
+return new this.constructor(this.tag,this.contents.clone(_35));
 }});
-_2.WidthRatioNode=dojo.extend(function(_3b,max,_3d,_3e){
-this.current=new dd._Filter(_3b);
+_1.WidthRatioNode=dojo.extend(function(_36,max,_37,_38){
+this.current=new dd._Filter(_36);
 this.max=new dd._Filter(max);
-this.width=_3d;
-this.contents=_3e;
-},{render:function(_3f,_40){
-var _41=+this.current.resolve(_3f);
-var max=+this.max.resolve(_3f);
-if(typeof _41!="number"||typeof max!="number"||!max){
+this.width=_37;
+this.contents=_38;
+},{render:function(_39,_3a){
+var _3b=+this.current.resolve(_39);
+var max=+this.max.resolve(_39);
+if(typeof _3b!="number"||typeof max!="number"||!max){
 this.contents.set("");
 }else{
-this.contents.set(""+Math.round((_41/max)*this.width));
+this.contents.set(""+Math.round((_3b/max)*this.width));
 }
-return this.contents.render(_3f,_40);
-},unrender:function(_43,_44){
-return this.contents.unrender(_43,_44);
-},clone:function(_45){
-return new this.constructor(this.current.getExpression(),this.max.getExpression(),this.width,this.contents.clone(_45));
+return this.contents.render(_39,_3a);
+},unrender:function(_3c,_3d){
+return this.contents.unrender(_3c,_3d);
+},clone:function(_3e){
+return new this.constructor(this.current.getExpression(),this.max.getExpression(),this.width,this.contents.clone(_3e));
 }});
-_2.WithNode=dojo.extend(function(_46,_47,_48){
-this.target=new dd._Filter(_46);
-this.alias=_47;
-this.nodelist=_48;
-},{render:function(_49,_4a){
-var _4b=this.target.resolve(_49);
-_49=_49.push();
-_49[this.alias]=_4b;
-_4a=this.nodelist.render(_49,_4a);
-_49=_49.pop();
-return _4a;
-},unrender:function(_4c,_4d){
-return _4d;
-},clone:function(_4e){
-return new this.constructor(this.target.getExpression(),this.alias,this.nodelist.clone(_4e));
+_1.WithNode=dojo.extend(function(_3f,_40,_41){
+this.target=new dd._Filter(_3f);
+this.alias=_40;
+this.nodelist=_41;
+},{render:function(_42,_43){
+var _44=this.target.resolve(_42);
+_42=_42.push();
+_42[this.alias]=_44;
+_43=this.nodelist.render(_42,_43);
+_42=_42.pop();
+return _43;
+},unrender:function(_45,_46){
+return _46;
+},clone:function(_47){
+return new this.constructor(this.target.getExpression(),this.alias,this.nodelist.clone(_47));
 }});
-dojo.mixin(_2,{comment:function(_4f,_50){
-_4f.skip_past("endcomment");
+dojo.mixin(_1,{comment:function(_48,_49){
+_48.skip_past("endcomment");
 return dd._noOpNode;
-},debug:function(_51,_52){
-return new _2.DebugNode(_51.create_text_node());
-},filter:function(_53,_54){
-var _55=_54.contents.split(null,1)[1];
-var _56=_53.create_variable_node("var|"+_55);
-var _57=_53.parse(["endfilter"]);
-_53.next_token();
-return new _2.FilterNode(_56,_57);
-},firstof:function(_58,_59){
-var _5a=_59.split_contents().slice(1);
-if(!_5a.length){
+},debug:function(_4a,_4b){
+return new _1.DebugNode(_4a.create_text_node());
+},filter:function(_4c,_4d){
+var _4e=_4d.contents.split(null,1)[1];
+var _4f=_4c.create_variable_node("var|"+_4e);
+var _50=_4c.parse(["endfilter"]);
+_4c.next_token();
+return new _1.FilterNode(_4f,_50);
+},firstof:function(_51,_52){
+var _53=_52.split_contents().slice(1);
+if(!_53.length){
 throw new Error("'firstof' statement requires at least one argument");
 }
-return new _2.FirstOfNode(_5a,_58.create_text_node());
-},spaceless:function(_5b,_5c){
-var _5d=_5b.parse(["endspaceless"]);
-_5b.delete_first_token();
-return new _2.SpacelessNode(_5d,_5b.create_text_node());
-},templatetag:function(_5e,_5f){
-var _60=_5f.contents.split();
-if(_60.length!=2){
+return new _1.FirstOfNode(_53,_51.create_text_node());
+},spaceless:function(_54,_55){
+var _56=_54.parse(["endspaceless"]);
+_54.delete_first_token();
+return new _1.SpacelessNode(_56,_54.create_text_node());
+},templatetag:function(_57,_58){
+var _59=_58.contents.split();
+if(_59.length!=2){
 throw new Error("'templatetag' statement takes one argument");
 }
-var tag=_60[1];
-var _62=_2.TemplateTagNode.prototype.mapping;
-if(!_62[tag]){
-var _63=[];
-for(var key in _62){
-_63.push(key);
+var tag=_59[1];
+var _5a=_1.TemplateTagNode.prototype.mapping;
+if(!_5a[tag]){
+var _5b=[];
+for(var key in _5a){
+_5b.push(key);
 }
-throw new Error("Invalid templatetag argument: '"+tag+"'. Must be one of: "+_63.join(", "));
+throw new Error("Invalid templatetag argument: '"+tag+"'. Must be one of: "+_5b.join(", "));
 }
-return new _2.TemplateTagNode(tag,_5e.create_text_node());
-},widthratio:function(_65,_66){
-var _67=_66.contents.split();
-if(_67.length!=4){
+return new _1.TemplateTagNode(tag,_57.create_text_node());
+},widthratio:function(_5c,_5d){
+var _5e=_5d.contents.split();
+if(_5e.length!=4){
 throw new Error("widthratio takes three arguments");
 }
-var _68=+_67[3];
-if(typeof _68!="number"){
+var _5f=+_5e[3];
+if(typeof _5f!="number"){
 throw new Error("widthratio final argument must be an integer");
 }
-return new _2.WidthRatioNode(_67[1],_67[2],_68,_65.create_text_node());
-},with_:function(_69,_6a){
-var _6b=_6a.split_contents();
-if(_6b.length!=4||_6b[2]!="as"){
+return new _1.WidthRatioNode(_5e[1],_5e[2],_5f,_5c.create_text_node());
+},with_:function(_60,_61){
+var _62=_61.split_contents();
+if(_62.length!=4||_62[2]!="as"){
 throw new Error("do_width expected format as 'with value as name'");
 }
-var _6c=_69.parse(["endwith"]);
-_69.next_token();
-return new _2.WithNode(_6b[1],_6b[3],_6c);
+var _63=_60.parse(["endwith"]);
+_60.next_token();
+return new _1.WithNode(_62[1],_62[3],_63);
 }});
 })();
 }
diff --git a/dojox/dtl/utils/date.js b/dojox/dtl/utils/date.js
index 1df6d20..aecdcb7 100644
--- a/dojox/dtl/utils/date.js
+++ b/dojox/dtl/utils/date.js
@@ -28,21 +28,21 @@ return this.f()+" "+this.a();
 dojo.mixin(dojox.dtl.utils.date,{format:function(_2,_3){
 var df=new dojox.dtl.utils.date.DateFormat(_3);
 return df.format(_2);
-},timesince:function(d,_6){
+},timesince:function(d,_4){
 if(!(d instanceof Date)){
 d=new Date(d.year,d.month,d.day);
 }
-if(!_6){
-_6=new Date();
+if(!_4){
+_4=new Date();
 }
-var _7=Math.abs(_6.getTime()-d.getTime());
-for(var i=0,_9;_9=dojox.dtl.utils.date._chunks[i];i++){
-var _a=Math.floor(_7/_9[0]);
-if(_a){
+var _5=Math.abs(_4.getTime()-d.getTime());
+for(var i=0,_6;_6=dojox.dtl.utils.date._chunks[i];i++){
+var _7=Math.floor(_5/_6[0]);
+if(_7){
 break;
 }
 }
-return _a+" "+_9[1](_a);
+return _7+" "+_6[1](_7);
 },_chunks:[[60*60*24*365*1000,function(n){
 return (n==1)?"year":"years";
 }],[60*60*24*30*1000,function(n){
diff --git a/dojox/editor/README b/dojox/editor/README
index 550a085..fa5616e 100644
--- a/dojox/editor/README
+++ b/dojox/editor/README
@@ -1,44 +1,203 @@
 -------------------------------------------------------------------------------
 dojox.editor
 -------------------------------------------------------------------------------
-Version 0.5
-Release date: 7/10/2008
+Version 0.9
+Release date: 9/14/2009
 -------------------------------------------------------------------------------
 Project state:
-experimental
+experimental, beta, stable
 -------------------------------------------------------------------------------
 Credits
-	Mike Wilcox 	- Author
-    Dustin Machi 	- Technical Assistance
+	Mike Wilcox 	 - Author
+	Jared Jurkiewicz - Author (PrettyPrint, PageBreak, ShowBlockNodes, 
+		Preview, Save, ToolbarLineBreak, InsertEntity, 
+		NormalizeIndentOutdent, Breadcrumb, FindReplace)
+	Dustin Machi 	 - Technical Assistance
 -------------------------------------------------------------------------------
 Project description
 
-Space for extensions and additional plugins for dijit.Editor 
+Space for extensions and additional plugins for dijit.Editor.  The project 
+currently contains the following plugins:
+
+dojox.editor.plugins.TablePlugins:
+	Status: Experimental.
+	The Table Plugins provide a mechanism for editing tables withing the
+	dijit.Editor.  This plugin is experimental and does not work correctly
+	in all dojo supported browsers.
+
+dojox.editor.plugins.UploadImage:
+	Status: Experimental.
+	The UploadImage plugin makes use of the dojox upload widgets to provide
+	a mechanism to upload images to your server for use in the editor.
+
+dojox.editor.plugins.PrettyPrint:
+	Status: Supported (stable).
+	The PrettyPrint plugin provides a mechanism by which the output from
+	editor.getValue()/editor.attr("value") is nicely formatted.  Optional
+	format parameters are how many spaces to indent by (default is tab),
+	the maximum text line length (not including indent), and what 
+	characters in text strings should be encoded to their &<enc>; 
+	representation.
+
+dojox.editor.plugins.PageBreak:
+	Status: Supported (stable).
+	A simple plugin that allows you to insert 'page breaks' into the doc
+	being edited.  These page break styles will then cause the document 
+	to break to another page when printed.
+
+dojox.editor.plugins.ShowBlockNodes:
+	Status: Supported (stable).
+	A simple plugin that allows you to toggle on and off a CSS 'view' of
+	how the page is laid out in terms of the block nodes used for its
+	formatting.
+
+dojox.editor.plugins.Save:
+	Status: Supported (beta).
+	A simple plugin that allows you to POST the content of the editor back
+	to a URL.
+
+dojox.editor.plugins.Preview:
+	Status: Supported (beta).
+	A simple plugin that allows you to display the content of the editor
+	in a new window and apply a set of styles to it so you can see how
+	content will look with various styles applied.  It is likely this
+	plugin will still evolve a bit.
+
+dojox.editor.plugins.ToolbarLineBreak:
+	Status: Supported (stable).
+	An extremely simple plugin that allows you to 'linebreak' the dijit toolbar so that really long 
+	toolbars for editor (lots of plugins enabled), can be broken up into multiple rows.
+
+dojox.editor.plugins.InsertEntity:
+	Status: Experimental (unsupported).
+	A plugin that enables the ability to insert HTML/XML entity characters
+	into a page.  These are often called 'symbols'.  The set it provides are the
+	basic latin (8859) set and a portion of greek symbols common to mathematics.
+	It has been marked experimental as it is likely this plugin will evolve a bit.
+
+dojox.editor.plugins.NormalizeIndentOutdent:
+	Status: Experimental (unsupported).
+	A plugin that normalizes the behavior of indent/outdent to use margin styles instead
+	of <blockquote> tags.  Also fixes indent/outdent of lists to work properly.  This is new
+	and has been tested, but not extensively.  Therefore it is currently classed as experimental.
+
+dojox.editor.plugins.Breadcrumb:
+	Status: Experimental (unsupported).
+	A plugin that adds a breadcrumb toolbar to the bottom of the editor.  Useful for seeing
+	where you aren and what operations you can perform.  This is new and has been tested, but not 
+	extensively.  Therefore it is currently classed as experimental.
+
+dojox.editor.plugins.FindReplace:
+	Status: Experimental (unsupported).
+	A plugin that adds a togglable Find/Replace toolbar to the editor.  Useful for searching
+	and replacing text strings in the editor content.  Only works on FF, IE, and WebKit.  No Opera
+	support.  This is new and has been tested, but not extensively.  Therefore it is currently 
+	classed as experimental.
+
 -------------------------------------------------------------------------------
 Dependencies:
 
 dijit
 dojox.form
+dojox.html.format
 
 -------------------------------------------------------------------------------
 Documentation
 
 The plugins directory contains extensions which work with dijit.Editor.
 
+See also:
+	http://docs.dojocampus.org/dojox/editor/plugins/TablePlugins
+	http://docs.dojocampus.org/dojox/editor/plugins/PrettyPrint
+	http://docs.dojocampus.org/dojox/editor/plugins/PageBreak
+	http://docs.dojocampus.org/dojox/editor/plugins/ShowBlockNodes
+	http://docs.dojocampus.org/dojox/editor/plugins/Preview
+	http://docs.dojocampus.org/dojox/editor/plugins/Save
+	http://docs.dojocampus.org/dojox/editor/plugins/ToolbarLineBreak
+	http://docs.dojocampus.org/dojox/editor/plugins/InsertEntity
+	http://docs.dojocampus.org/dojox/editor/plugins/NormalizeIndentOutdent
+	http://docs.dojocampus.org/dojox/editor/plugins/Breadcrumb
+        http://docs.dojocampus.org/dojox/editor/plugins/FindReplace
+
 -------------------------------------------------------------------------------
 Plugin Installation instructions
 
 Get dojo and dijit from svn. Include the Editor and plugins in your page:
 
 dojo.require("dijit.Editor");
-dojo.require("dojox.editor.plugins.TablePlugins");
-dojo.require("dojox.editor.plugins.UploadImage");
 
-And the style sheet:
+For the TablePlugins:
+	dojo.require("dojox.editor.plugins.TablePlugins");
+	and CSS:
+	<link href="[path]dojox/editor/plugins/resources/editorPlugins.css" type="text/css" rel="stylesheet" />
+
+For the UploadImage plugin:
+	dojo.require("dojox.editor.plugins.UploadImage");
+	and CSS:
+	<link href="[path]dojox/editor/plugins/resources/editorPlugins.css" type="text/css" rel="stylesheet" />
+	<link href="[path]dojox/form/resources/FileInput.css" type="text/css" rel="stylesheet" />
+
+For the PrettyPrint plugin:
+	dojo.require("dojox.editor.plugins.PrettyPrint");
+	and CSS:
+	No CSS required.
+
+For the PageBreak plugin:
+	dojo.require("dojox.editor.plugins.PageBreak");
+	and CSS:
+	<link href="[path]dojox/editor/plugins/resources/css/PageBreak.css" type="text/css" rel="stylesheet" />
+
+For the ShowBlockNodes plugin:
+	dojo.require("dojox.editor.plugins.ShowBockNodes");
+	and CSS:
+	<link href="[path]dojox/editor/plugins/resources/css/ShowBlockNodes.css" type="text/css" rel="stylesheet" />
+
+For the Preview plugin:
+	dojo.require("dojox.editor.plugins.Preview");
+	and CSS:
+	<link href="[path]dojox/editor/plugins/resources/css/Preview.css" type="text/css" rel="stylesheet" />
+
+For the Save plugin:
+	dojo.require("dojox.editor.plugins.Save");
+	and CSS:
+	<link href="[path]dojox/editor/plugins/resources/css/Save.css" type="text/css" rel="stylesheet" />
+
+For the ToolbarLineBreak plugin:
+	dojo.require("dojox.editor.plugins.ToolbarLineBreak");
+	and CSS:
+	No CSS required.
+
+For the InsertEntity plugin:
+	dojo.require("dojox.editor.plugins.InsertEntity");
+	and CSS:
+	<link href="[path]dojox/editor/plugins/resources/css/InsertEntity.css" type="text/css" rel="stylesheet" />
+
+
+For the NormalizeIndentOutdent plugin:
+	dojo.require("dojox.editor.plugins.NormalizeIndentOutdent");
+	and CSS:
+	No CSS required.
+
+For the Breadcrumb plugin:
+	dojo.require("dojox.editor.plugins.Breadcrumb");
+	and CSS:
+	<link href="[path]dojox/editor/plugins/resources/css/Breadcrumb.css" type="text/css" rel="stylesheet" />
 
-<link href="[path]dojox/editor/plugins/resources/editorPlugins.css" type="text/css" rel="stylesheet" />
-<link href="[path]dojox/form/resources/FileInput.css" type="text/css" rel="stylesheet" />
+For the FindReplace plugin:
+	dojo.require("dojox.editor.plugins.FindReplace");
+	and CSS:
+	<link href="[path]dojox/editor/plugins/resources/css/FindReplace.css" type="text/css" rel="stylesheet" />
 
 See tests for examples:
-dojox/editor/plugins/tests/editorTablePlugs.html
-dojox/editor/plugins/tests/editorUploadPlug.html
+	dojox/editor/tests/editorTablePlugs.html
+	dojox/editor/tests/editorUploadPlug.html
+	dojox/editor/tests/editorPrettyPrint.html
+	dojox/editor/tests/editorPageBreak.html
+	dojox/editor/tests/editorShowBlockNodes.html
+	dojox/editor/tests/editorPreview.html
+	dojox/editor/tests/editorSave.html
+	dojox/editor/tests/editorToolbarLineBreak.html
+	dojox/editor/tests/editorInsertEntity.html
+	dojox/editor/tests/editorNormalizeIndentOutdent.html
+	dojox/editor/tests/editorBreadcrumb.html
+	dojox/editor/tests/editorFindReplace.html
diff --git a/dojox/editor/plugins/Breadcrumb.js b/dojox/editor/plugins/Breadcrumb.js
new file mode 100644
index 0000000..328c4dc
--- /dev/null
+++ b/dojox/editor/plugins/Breadcrumb.js
@@ -0,0 +1,235 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.editor.plugins.Breadcrumb"]){
+dojo._hasResource["dojox.editor.plugins.Breadcrumb"]=true;
+dojo.provide("dojox.editor.plugins.Breadcrumb");
+dojo.require("dijit._editor._Plugin");
+dojo.require("dijit._editor.range");
+dojo.require("dojo.i18n");
+dojo.require("dojo.string");
+dojo.require("dijit.Toolbar");
+dojo.require("dijit.form.Button");
+dojo.require("dijit._editor.selection");
+dojo.require("dijit.Menu");
+dojo.require("dijit.MenuItem");
+dojo.require("dijit.MenuSeparator");
+dojo.experimental("dojox.editor.plugins.Breadcrumb");
+dojo.requireLocalization("dojox.editor.plugins","Breadcrumb",null,"ROOT,ko");
+dojo.declare("dojox.editor.plugins._BreadcrumbMenuTitle",[dijit._Widget,dijit._Templated,dijit._Contained],{templateString:"<tr><td dojoAttachPoint=\"title\" colspan=\"4\" class=\"dijitToolbar\" style=\"font-weight: bold; padding: 3px;\"></td></tr>",menuTitle:"",postCreate:function(){
+dojo.setSelectable(this.domNode,false);
+var _1=this.id+"_text";
+dijit.setWaiState(this.domNode,"labelledby",_1);
+},_setMenuTitleAttr:function(_2){
+this.title.innerHTML=_2;
+},_getMenuTitleAttr:function(_3){
+return this.title.innerHTML;
+}});
+dojo.declare("dojox.editor.plugins.Breadcrumb",dijit._editor._Plugin,{_menu:null,breadcrumbBar:null,setEditor:function(_4){
+this.editor=_4;
+this._buttons=[];
+this.breadcrumbBar=new dijit.Toolbar();
+dojo.style(this.breadcrumbBar.domNode,"height","1.5em");
+var _5=dojo.i18n.getLocalization("dojox.editor.plugins","Breadcrumb");
+this._titleTemplate=_5.nodeActions;
+dojo.place(this.breadcrumbBar.domNode,this.editor.iframe,"after");
+this.editor.onLoadDeferred.addCallback(dojo.hitch(this,function(){
+this._menu=new dijit.Menu({});
+dojo.addClass(this.breadcrumbBar.domNode,"dojoxEditorBreadcrumbArrow");
+var _6=this;
+var _7=new dijit.form.ComboButton({showLabel:true,label:"body",_selNode:_4.editNode,dropDown:this._menu,onClick:dojo.hitch(this,function(){
+this._menuTarget=_4.editNode;
+this._selectContents();
+})});
+this._menuTitle=new dojox.editor.plugins._BreadcrumbMenuTitle({menuTitle:_5.nodeActions});
+this._selCMenu=new dijit.MenuItem({label:_5.selectContents,onClick:dojo.hitch(this,this._selectContents)});
+this._delCMenu=new dijit.MenuItem({label:_5.deleteContents,onClick:dojo.hitch(this,this._deleteContents)});
+this._selEMenu=new dijit.MenuItem({label:_5.selectElement,onClick:dojo.hitch(this,this._selectElement)});
+this._delEMenu=new dijit.MenuItem({label:_5.deleteElement,onClick:dojo.hitch(this,this._deleteElement)});
+this._moveSMenu=new dijit.MenuItem({label:_5.moveStart,onClick:dojo.hitch(this,this._moveCToStart)});
+this._moveEMenu=new dijit.MenuItem({label:_5.moveEnd,onClick:dojo.hitch(this,this._moveCToEnd)});
+this._menu.addChild(this._menuTitle);
+this._menu.addChild(this._selCMenu);
+this._menu.addChild(this._delCMenu);
+this._menu.addChild(new dijit.MenuSeparator({}));
+this._menu.addChild(this._selEMenu);
+this._menu.addChild(this._delEMenu);
+this._menu.addChild(new dijit.MenuSeparator({}));
+this._menu.addChild(this._moveSMenu);
+this._menu.addChild(this._moveEMenu);
+_7._ddConnect=dojo.connect(_7,"openDropDown",dojo.hitch(this,function(){
+this._menuTarget=_7._selNode;
+this._menuTitle.attr("menuTitle",dojo.string.substitute(this._titleTemplate,{"nodeName":"<body>"}));
+this._selEMenu.attr("disabled",true);
+this._delEMenu.attr("disabled",true);
+this._selCMenu.attr("disabled",false);
+this._delCMenu.attr("disabled",false);
+this._moveSMenu.attr("disabled",false);
+this._moveEMenu.attr("disabled",false);
+}));
+this.breadcrumbBar.addChild(_7);
+this.connect(this.editor,"onNormalizedDisplayChanged","updateState");
+}));
+this.breadcrumbBar.startup();
+},_selectContents:function(){
+this.editor.focus();
+if(this._menuTarget){
+var _8=this._menuTarget.tagName.toLowerCase();
+switch(_8){
+case "br":
+case "hr":
+case "img":
+case "input":
+case "base":
+case "meta":
+case "area":
+case "basefont":
+break;
+default:
+try{
+dojo.withGlobal(this.editor.window,"collapse",dijit._editor.selection,[null]);
+dojo.withGlobal(this.editor.window,"selectElementChildren",dijit._editor.selection,[this._menuTarget]);
+this.editor.onDisplayChanged();
+}
+catch(e){
+}
+}
+}
+},_deleteContents:function(){
+if(this._menuTarget){
+this.editor.beginEditing();
+this._selectContents();
+dojo.withGlobal(this.editor.window,"remove",dijit._editor.selection,[this._menuTarget]);
+this.editor.endEditing();
+this._updateBreadcrumb();
+this.editor.onDisplayChanged();
+}
+},_selectElement:function(){
+this.editor.focus();
+if(this._menuTarget){
+dojo.withGlobal(this.editor.window,"collapse",dijit._editor.selection,[null]);
+dojo.withGlobal(this.editor.window,"selectElement",dijit._editor.selection,[this._menuTarget]);
+this.editor.onDisplayChanged();
+}
+},_deleteElement:function(){
+if(this._menuTarget){
+this.editor.beginEditing();
+this._selectElement();
+dojo.withGlobal(this.editor.window,"remove",dijit._editor.selection,[this._menuTarget]);
+this.editor.endEditing();
+this._updateBreadcrumb();
+this.editor.onDisplayChanged();
+}
+},_moveCToStart:function(){
+this.editor.focus();
+if(this._menuTarget){
+this._selectContents();
+dojo.withGlobal(this.editor.window,"collapse",dijit._editor.selection,[true]);
+}
+},_moveCToEnd:function(){
+this.editor.focus();
+if(this._menuTarget){
+this._selectContents();
+dojo.withGlobal(this.editor.window,"collapse",dijit._editor.selection,[false]);
+}
+},_updateBreadcrumb:function(){
+var ed=this.editor;
+if(ed.window){
+var _9=dijit.range.getSelection(ed.window);
+if(_9&&_9.rangeCount>0){
+var _a=_9.getRangeAt(0);
+var _b=dojo.withGlobal(ed.window,"getSelectedElement",dijit._editor.selection)||_a.startContainer;
+var _c=[];
+if(_b&&_b.ownerDocument===ed.document){
+while(_b&&_b!==ed.editNode){
+if(_b.nodeType===1){
+_c.push({type:_b.tagName.toLowerCase(),node:_b});
+}
+_b=_b.parentNode;
+}
+_c=_c.reverse();
+while(this._buttons.length){
+var db=this._buttons.pop();
+dojo.disconnect(db._ddConnect);
+this.breadcrumbBar.removeChild(db);
+}
+this._buttons=[];
+var i;
+var _d=this;
+for(i=0;i<_c.length;i++){
+var bc=_c[i];
+var b=new dijit.form.ComboButton({showLabel:true,label:bc.type,_selNode:bc.node,dropDown:this._menu,onClick:function(){
+_d._menuTarget=this._selNode;
+_d._selectContents();
+}});
+b._ddConnect=dojo.connect(b,"openDropDown",dojo.hitch(b,function(){
+_d._menuTarget=this._selNode;
+var _e=_d._menuTarget.tagName.toLowerCase();
+var _f=dojo.string.substitute(_d._titleTemplate,{"nodeName":"<"+_e+">"});
+_d._menuTitle.attr("menuTitle",_f);
+switch(_e){
+case "br":
+case "hr":
+case "img":
+case "input":
+case "base":
+case "meta":
+case "area":
+case "basefont":
+_d._selCMenu.attr("disabled",true);
+_d._delCMenu.attr("disabled",true);
+_d._moveSMenu.attr("disabled",true);
+_d._moveEMenu.attr("disabled",true);
+_d._selEMenu.attr("disabled",false);
+_d._delEMenu.attr("disabled",false);
+break;
+default:
+_d._selCMenu.attr("disabled",false);
+_d._delCMenu.attr("disabled",false);
+_d._selEMenu.attr("disabled",false);
+_d._delEMenu.attr("disabled",false);
+_d._moveSMenu.attr("disabled",false);
+_d._moveEMenu.attr("disabled",false);
+}
+}));
+this._buttons.push(b);
+this.breadcrumbBar.addChild(b);
+}
+if(dojo.isIE){
+this.breadcrumbBar.domNode.className=this.breadcrumbBar.domNode.className;
+}
+}
+}
+}
+},updateState:function(){
+if(dojo.style(this.editor.iframe,"display")==="none"){
+dojo.style(this.breadcrumbBar.domNode,"display","none");
+}else{
+if(dojo.style(this.breadcrumbBar.domNode,"display")==="none"){
+dojo.style(this.breadcrumbBar.domNode,"display","block");
+}
+this._updateBreadcrumb();
+}
+},destroy:function(){
+if(this.breadcrumbBar){
+this.breadcrumbBar.destroy();
+this.breadcrumbBar=null;
+}
+this._buttons=null;
+delete this.editor.breadcrumbBar;
+this.inherited(arguments);
+}});
+dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
+if(o.plugin){
+return;
+}
+var _10=o.args.name.toLowerCase();
+if(_10==="breadcrumb"){
+o.plugin=new dojox.editor.plugins.Breadcrumb({});
+}
+});
+}
diff --git a/dojox/editor/plugins/EntityPalette.js b/dojox/editor/plugins/EntityPalette.js
new file mode 100644
index 0000000..8943ef0
--- /dev/null
+++ b/dojox/editor/plugins/EntityPalette.js
@@ -0,0 +1,158 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.editor.plugins.EntityPalette"]){
+dojo._hasResource["dojox.editor.plugins.EntityPalette"]=true;
+dojo.provide("dojox.editor.plugins.EntityPalette");
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dojox.editor.plugins","latinEntities",null,"ROOT");
+dojo.experimental("dojox.editor.plugins.EntityPalette");
+dojo.declare("dojox.editor.plugins.EntityPalette",[dijit._Widget,dijit._Templated],{templateString:"<div class=\"dojoxEntityPalette\">\n"+"\t<table>\n"+"\t\t<tbody>\n"+"\t\t\t<tr>\n"+"\t\t\t\t<td>\n"+"\t\t\t\t\t<table class=\"dojoxEntityPaletteTable\"  waiRole=\"grid\" tabIndex=\"${tabIndex}\">\n"+"\t\t\t\t\t\t<tbody dojoAttachPoint=\"tableNode\"></tbody>\n"+"\t\t\t\t\t</table>\n"+"\t\t\t\t</td>\n"+"\t\t\t</tr>\n"+"\t\t\t<tr>\n"+"\t\t\t\t<td>\n"+"\t\t\t\t\t<table dojoAttachPoint=\"previe [...]
+if(!this._created){
+this._created=true;
+this.domNode.style.position="relative";
+this._cellNodes=[];
+this.entities={};
+this.entities[this.palette]=dojo.i18n.getLocalization("dojox.editor.plugins","latinEntities");
+var _1=this.entities[this.palette];
+var _2=0;
+var _3;
+for(_3 in _1){
+_2++;
+}
+var _4=Math.floor(Math.sqrt(_2));
+var _5=_4;
+var _6=0;
+var _7=null;
+var _8;
+dojo.style(this.codeHeader,"display",this.showCode?"":"none");
+dojo.style(this.codeNode,"display",this.showCode?"":"none");
+dojo.style(this.entityHeader,"display",this.showEntityName?"":"none");
+dojo.style(this.entityNode,"display",this.showEntityName?"":"none");
+for(_3 in _1){
+var _9=_6%_5===0;
+if(_9){
+_7=dojo.create("tr",{tabIndex:"-1"});
+}
+var _a="&"+_3+";";
+_8=dojo.create("td",{innerHTML:_a,tabIndex:"-1","class":"dojoxEntityPaletteCell"},_7);
+dojo.forEach(["Dijitclick","MouseEnter","Focus","Blur"],function(_b){
+this.connect(_8,"on"+_b.toLowerCase(),"_onCell"+_b);
+},this);
+if(_9){
+dojo.place(_7,this.tableNode);
+}
+dijit.setWaiRole(_8,"gridcell");
+_8.index=this._cellNodes.length;
+this._cellNodes.push({node:_8,html:_a});
+_6++;
+}
+var _c=_4-(_2%_4);
+while(_c>0){
+_8=dojo.create("td",{innerHTML:"",tabIndex:"-1","class":"dojoxEntityPaletteNullCell"},_7);
+_c--;
+}
+this._xDim=_4;
+this._yDim=_5;
+this.connect(this.tableNode,"onfocus","_onTableNodeFocus");
+var _d={UP_ARROW:-this._xDim,DOWN_ARROW:this._xDim,RIGHT_ARROW:1,LEFT_ARROW:-1};
+for(var _e in _d){
+this._connects.push(dijit.typematic.addKeyListener(this.domNode,{charOrCode:dojo.keys[_e],ctrlKey:false,altKey:false,shiftKey:false},this,function(){
+var _f=_d[_e];
+return function(_10){
+this._navigateByKey(_f,_10);
+};
+}(),this.timeoutChangeRate,this.defaultTimeout));
+}
+if(!this.showPreview){
+dojo.style(this.previewNode,"display","none");
+}
+}
+},focus:function(){
+this._focusFirst();
+},onChange:function(_11){
+},_focusFirst:function(){
+this._currentFocus=0;
+var _12=this._cellNodes[this._currentFocus].node;
+setTimeout(function(){
+dijit.focus(_12);
+},25);
+},_onTableNodeFocus:function(evt){
+if(evt.target===this.tableNode){
+this._focusFirst();
+}
+},_onFocus:function(){
+dojo.attr(this.tableNode,"tabIndex","-1");
+},_onBlur:function(){
+this._removeCellHighlight(this._currentFocus);
+dojo.attr(this.tableNode,"tabIndex",this.tabIndex);
+},_onCellDijitclick:function(evt){
+var _13=evt.currentTarget;
+if(this._currentFocus!=_13.index){
+this._currentFocus=_13.index;
+setTimeout(function(){
+dijit.focus(_13);
+},0);
+}
+this._selectEntity(_13);
+dojo.stopEvent(evt);
+},_onCellMouseEnter:function(evt){
+var _14=evt.currentTarget;
+this._setCurrent(_14);
+setTimeout(function(){
+dijit.focus(_14);
+},0);
+},_onCellFocus:function(evt){
+this._setCurrent(evt.currentTarget);
+},_setCurrent:function(_15){
+this._removeCellHighlight(this._currentFocus);
+this._currentFocus=_15.index;
+dojo.addClass(_15,"dojoxEntityPaletteCellHighlight");
+if(this.showPreview){
+this._displayDetails(_15);
+}
+},_displayDetails:function(_16){
+var _17=dojo.filter(this._cellNodes,function(_18){
+return _18.node==_16;
+});
+if(_17.length>0){
+var _19=_17[0].html;
+var _1a=_19.substr(1,_19.length-2);
+this.previewNode.innerHTML=_16.innerHTML;
+this.codeNode.innerHTML="&#"+parseInt(_16.innerHTML.charCodeAt(0),10)+";";
+this.entityNode.innerHTML="&"+_1a+";";
+this.descNode.innerHTML=this.entities[this.palette][_1a].replace("\n","<br>");
+}else{
+this.previewNode.innerHTML="";
+this.codeNode.innerHTML="";
+this.entityNode.innerHTML="";
+this.descNode.innerHTML="";
+}
+},_onCellBlur:function(evt){
+this._removeCellHighlight(this._currentFocus);
+},_removeCellHighlight:function(_1b){
+dojo.removeClass(this._cellNodes[_1b].node,"dojoxEntityPaletteCellHighlight");
+},_selectEntity:function(_1c){
+var _1d=dojo.filter(this._cellNodes,function(_1e){
+return _1e.node==_1c;
+});
+if(_1d.length>0){
+this.onChange(this.value=_1d[0].html);
+}
+},_navigateByKey:function(_1f,_20){
+if(_20==-1){
+return;
+}
+var _21=this._currentFocus+_1f;
+if(_21<this._cellNodes.length&&_21>-1){
+var _22=this._cellNodes[_21].node;
+_22.focus();
+}
+}});
+}
diff --git a/dojox/editor/plugins/FindReplace.js b/dojox/editor/plugins/FindReplace.js
new file mode 100644
index 0000000..98b1214
--- /dev/null
+++ b/dojox/editor/plugins/FindReplace.js
@@ -0,0 +1,289 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.editor.plugins.FindReplace"]){
+dojo._hasResource["dojox.editor.plugins.FindReplace"]=true;
+dojo.provide("dojox.editor.plugins.FindReplace");
+dojo.require("dijit._editor._Plugin");
+dojo.require("dijit.Toolbar");
+dojo.require("dijit.form.TextBox");
+dojo.require("dijit.form.CheckBox");
+dojo.require("dijit.form.Button");
+dojo.require("dijit.TooltipDialog");
+dojo.require("dijit.Menu");
+dojo.require("dijit.CheckedMenuItem");
+dojo.require("dojox.editor.plugins.ToolbarLineBreak");
+dojo.require("dojo.i18n");
+dojo.require("dojo.string");
+dojo.requireLocalization("dojox.editor.plugins","FindReplace",null,"ROOT,ko");
+dojo.experimental("dojox.editor.plugins.FindReplace");
+dojo.declare("dojox.editor.plugins._FindReplaceTextBox",[dijit._Widget,dijit._Templated],{textId:"",label:"",widget:null,widgetsInTemplate:true,templateString:"<span style='white-space: nowrap' class='dijit dijitReset dijitInline findReplaceTextBox'>"+"<label class='dijitLeft dijitInline' for='${textId}'>${label}</label>"+"<input dojoType='dijit.form.TextBox' required=false intermediateChanges='true'"+"tabIndex='-1' id='${textId}' dojoAttachPoint='textBox' value='' style='width: 20em;'/> [...]
+this.inherited(arguments);
+this.id=dijit.getUniqueId(this.declaredClass.replace(/\./g,"_"));
+this.textId=this.id+"_text";
+this.inherited(arguments);
+},postCreate:function(){
+this.textBox.attr("value","");
+this.disabled=this.textBox.attr("disabled");
+this.connect(this.textBox,"onChange","onChange");
+},_setValueAttr:function(_1){
+this.value=_1;
+this.textBox.attr("value",_1);
+},focus:function(){
+this.textBox.focus();
+},_setDisabledAttr:function(_2){
+this.disabled=_2;
+this.textBox.attr("disabled",_2);
+},onChange:function(_3){
+this.value=_3;
+}});
+dojo.declare("dojox.editor.plugins._FindReplaceCheckBox",[dijit._Widget,dijit._Templated],{checkId:"",label:"",widget:null,widgetsInTemplate:true,templateString:"<span style='white-space: nowrap' class='dijit dijitReset dijitInline findReplaceCheckBox'>"+"<input dojoType='dijit.form.CheckBox' required=false "+"tabIndex='-1' id='${checkId}' dojoAttachPoint='checkBox' value=''/>"+"<label class='dijitLeft dijitInline' for='${checkId}'>${label}</label>"+"</span>",postMixInProperties:function(){
+this.inherited(arguments);
+this.id=dijit.getUniqueId(this.declaredClass.replace(/\./g,"_"));
+this.checkId=this.id+"_check";
+this.inherited(arguments);
+},postCreate:function(){
+this.checkBox.attr("checked",false);
+this.disabled=this.checkBox.attr("disabled");
+this.checkBox.isFocusable=function(){
+return false;
+};
+},_setValueAttr:function(_4){
+this.checkBox.attr("value",_4);
+},_getValueAttr:function(){
+return this.checkBox.attr("value");
+},focus:function(){
+this.checkBox.focus();
+},_setDisabledAttr:function(_5){
+this.disabled=_5;
+this.checkBox.attr("disabled",_5);
+}});
+dojo.declare("dojox.editor.plugins.FindReplace",[dijit._editor._Plugin],{buttonClass:dijit.form.ToggleButton,iconClassPrefix:"dijitAdditionalEditorIcon",_initButton:function(){
+var _6=dojo.i18n.getLocalization("dojox.editor.plugins","FindReplace");
+this.button=new dijit.form.ToggleButton({label:_6["findReplace"],showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"FindReplace",tabIndex:"-1",onChange:dojo.hitch(this,"_toggleFindReplace")});
+if(dojo.isOpera){
+this.button.attr("disabled",true);
+}
+this.connect(this.button,"attr",dojo.hitch(this,function(_7,_8){
+if(_7==="disabled"){
+this._toggleFindReplace((!_8&&this._displayed),true);
+}
+}));
+},setEditor:function(_9){
+this.editor=_9;
+this._initButton();
+},toggle:function(){
+this.button.attr("checked",!this.button.attr("checked"));
+},_toggleFindReplace:function(_a,_b){
+if(_a&&!dojo.isOpera){
+dojo.style(this._frToolbar.domNode,"display","block");
+if(!_b){
+this._displayed=true;
+}
+}else{
+dojo.style(this._frToolbar.domNode,"display","none");
+if(!_b){
+this._displayed=false;
+}
+}
+this.editor.resize();
+},setToolbar:function(_c){
+this.inherited(arguments);
+if(!dojo.isOpera){
+var _d=dojo.i18n.getLocalization("dojox.editor.plugins","FindReplace");
+this._frToolbar=new dijit.Toolbar();
+dojo.style(this._frToolbar.domNode,"display","none");
+dojo.place(this._frToolbar.domNode,_c.domNode,"after");
+this._frToolbar.startup();
+this._caseSensitive=new dojox.editor.plugins._FindReplaceCheckBox({label:_d["matchCase"]});
+this._backwards=new dojox.editor.plugins._FindReplaceCheckBox({label:_d["backwards"]});
+this._replaceAll=new dojox.editor.plugins._FindReplaceCheckBox({label:_d["replaceAll"]});
+this._findField=new dojox.editor.plugins._FindReplaceTextBox({label:_d.findLabel});
+this._frToolbar.addChild(this._findField);
+this._findButton=new dijit.form.Button({label:_d["findButton"],showLabel:true,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"FindRun"});
+this._frToolbar.addChild(this._findButton);
+this._frToolbar.addChild(this._caseSensitive);
+this._frToolbar.addChild(this._backwards);
+this._frToolbar.addChild(new dojox.editor.plugins._ToolbarLineBreak());
+this._replaceField=new dojox.editor.plugins._FindReplaceTextBox({label:_d.replaceLabel});
+this._frToolbar.addChild(this._replaceField);
+this._replaceButton=new dijit.form.Button({label:_d["replaceButton"],showLabel:true,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"ReplaceRun"});
+this._frToolbar.addChild(this._replaceButton);
+this._frToolbar.addChild(this._replaceAll);
+this._findButton.attr("disabled",true);
+this._replaceButton.attr("disabled",true);
+this.connect(this._findField,"onChange","_checkButtons");
+this.connect(this._replaceField,"onChange","_checkButtons");
+this.connect(this._findButton,"onClick","_find");
+this.connect(this._replaceButton,"onClick","_replace");
+this._replDialog=new dijit.TooltipDialog();
+this._replDialog.startup();
+this._replDialog.attr("content","");
+this._dialogTemplate=_d.replaceDialogText;
+}
+},_checkButtons:function(){
+var _e=this._findField.attr("value");
+var _f=this._replaceField.attr("value");
+if(_e){
+this._findButton.attr("disabled",false);
+}else{
+this._findButton.attr("disabled",true);
+}
+if(_e&&_f&&_e!==_f){
+this._replaceButton.attr("disabled",false);
+}else{
+this._replaceButton.attr("disabled",true);
+}
+},_find:function(){
+var txt=this._findField.attr("value");
+if(txt){
+var _10=this._caseSensitive.attr("value");
+var _11=this._backwards.attr("value");
+return this._findText(txt,_10,_11);
+}
+return false;
+},_replace:function(){
+var ed=this.editor;
+ed.focus();
+var txt=this._findField.attr("value");
+var _12=this._replaceField.attr("value");
+var _13=0;
+if(txt){
+if(this._replaceDialogTimeout){
+clearTimeout(this._replaceDialogTimeout);
+this._replaceDialogTimeout=null;
+dijit.popup.close(this._replDialog);
+}
+var _14=this._replaceAll.attr("value");
+var _15=this._caseSensitive.attr("value");
+var _16=this._backwards.attr("value");
+var _17=dojo.withGlobal(ed.window,"getSelectedText",dijit._editor.selection,[null]);
+if(dojo.isMoz){
+txt=dojo.trim(txt);
+_17=dojo.trim(_17);
+}
+var _18=this._filterRegexp(txt,!_15);
+if(_17&&_18.test(_17)){
+ed.execCommand("inserthtml",_12);
+_13++;
+}
+if(_14){
+var _19=this._findText(txt,_15,_16);
+var _1a=function(){
+ed.execCommand("inserthtml",_12);
+_13++;
+_19=this._findText(txt,_15,_16);
+if(_19){
+setTimeout(dojo.hitch(this,_1a),10);
+}else{
+this._replDialog.attr("content",dojo.string.substitute(this._dialogTemplate,{"0":""+_13}));
+dijit.popup.open({popup:this._replDialog,around:this._replaceButton.domNode});
+this._replaceDialogTimeout=setTimeout(dojo.hitch(this,function(){
+clearTimeout(this._replaceDialogTimeout);
+this._replaceDialogTimeout=null;
+dijit.popup.close(this._replDialog);
+}),5000);
+}
+};
+if(_19){
+var _1b=dojo.hitch(this,_1a);
+_1b();
+}
+}
+}
+},_findText:function(txt,_1c,_1d){
+var ed=this.editor;
+var win=ed.window;
+var _1e=false;
+if(txt){
+if(win.find){
+_1e=win.find(txt,_1c,_1d,false,false,false,false);
+}else{
+var doc=ed.document;
+if(doc.selection){
+this.editor.focus();
+var _1f=doc.body.createTextRange();
+var _20=doc.selection?doc.selection.createRange():null;
+if(_20){
+if(_1d){
+_1f.setEndPoint("EndToStart",_20);
+}else{
+_1f.setEndPoint("StartToEnd",_20);
+}
+}
+var _21=_1c?4:0;
+if(_1d){
+_21=_21|1;
+}
+_1e=_1f.findText(txt,null,_21);
+if(_1e){
+_1f.select();
+}
+}
+}
+}
+return _1e;
+},_filterRegexp:function(_22,_23){
+var rxp="";
+var c=null;
+for(var i=0;i<_22.length;i++){
+c=_22.charAt(i);
+switch(c){
+case "\\":
+rxp+=c;
+i++;
+rxp+=_22.charAt(i);
+break;
+case "$":
+case "^":
+case "/":
+case "+":
+case ".":
+case "|":
+case "(":
+case ")":
+case "{":
+case "}":
+case "[":
+case "]":
+rxp+="\\";
+default:
+rxp+=c;
+}
+}
+rxp="^"+rxp+"$";
+if(_23){
+return new RegExp(rxp,"mi");
+}else{
+return new RegExp(rxp,"m");
+}
+},destroy:function(){
+this.inherited(arguments);
+if(this._replaceDialogTimeout){
+clearTimeout(this._replaceDialogTimeout);
+this._replaceDialogTimeout=null;
+dijit.popup.close(this._replDialog);
+}
+if(this._frToolbar){
+this._frToolbar.destroyRecursive();
+this._frToolbar=null;
+}
+if(this._replDialog){
+this._replDialog.destroyRecursive();
+this._replDialog=null;
+}
+}});
+dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
+if(o.plugin){
+return;
+}
+var _24=o.args.name.toLowerCase();
+if(_24==="findreplace"){
+o.plugin=new dojox.editor.plugins.FindReplace({});
+}
+});
+}
diff --git a/dojox/editor/plugins/InsertEntity.js b/dojox/editor/plugins/InsertEntity.js
new file mode 100644
index 0000000..fe82670
--- /dev/null
+++ b/dojox/editor/plugins/InsertEntity.js
@@ -0,0 +1,50 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.editor.plugins.InsertEntity"]){
+dojo._hasResource["dojox.editor.plugins.InsertEntity"]=true;
+dojo.provide("dojox.editor.plugins.InsertEntity");
+dojo.require("dijit._editor._Plugin");
+dojo.require("dijit.form.Button");
+dojo.require("dijit.TooltipDialog");
+dojo.require("dojox.editor.plugins.EntityPalette");
+dojo.require("dojox.html.entities");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dojox.editor.plugins","InsertEntity",null,"ROOT,ko");
+dojo.declare("dojox.editor.plugins.InsertEntity",dijit._editor._Plugin,{iconClassPrefix:"dijitAdditionalEditorIcon",_initButton:function(){
+this.dropDown=new dojox.editor.plugins.EntityPalette({showCode:this.showCode,showEntityName:this.showEntityName});
+this.connect(this.dropDown,"onChange",function(_1){
+this.button.closeDropDown();
+this.editor.focus();
+this.editor.execCommand("inserthtml",_1);
+});
+var _2=dojo.i18n.getLocalization("dojox.editor.plugins","InsertEntity");
+this.button=new dijit.form.DropDownButton({label:_2["insertEntity"],showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"InsertEntity",tabIndex:"-1",dropDown:this.dropDown});
+},setEditor:function(_3){
+this.editor=_3;
+this._initButton();
+this.editor.addKeyHandler("s",true,true,dojo.hitch(this,function(){
+this.button.openDropDown();
+this.dropDown.focus();
+}));
+_3.contentPreFilters.push(this._preFilterEntities);
+_3.contentPostFilters.push(this._postFilterEntities);
+},_preFilterEntities:function(s){
+return dojox.html.entities.decode(s,dojox.html.entities.latin);
+},_postFilterEntities:function(s){
+return dojox.html.entities.encode(s,dojox.html.entities.latin);
+}});
+dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
+if(o.plugin){
+return;
+}
+var _4=o.args.name?o.args.name.toLowerCase():"";
+if(_4==="insertentity"){
+o.plugin=new dojox.editor.plugins.InsertEntity({showCode:("showCode" in o.args)?o.args.showCode:false,showEntityName:("showEntityName" in o.args)?o.args.showEntityName:false});
+}
+});
+}
diff --git a/dojox/editor/plugins/NormalizeIndentOutdent.js b/dojox/editor/plugins/NormalizeIndentOutdent.js
new file mode 100644
index 0000000..b944789
--- /dev/null
+++ b/dojox/editor/plugins/NormalizeIndentOutdent.js
@@ -0,0 +1,640 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.editor.plugins.NormalizeIndentOutdent"]){
+dojo._hasResource["dojox.editor.plugins.NormalizeIndentOutdent"]=true;
+dojo.provide("dojox.editor.plugins.NormalizeIndentOutdent");
+dojo.require("dijit._editor._Plugin");
+dojo.experimental("dojox.editor.plugins.NormalizeIndentOutdent");
+dojo.declare("dojox.editor.plugins.NormalizeIndentOutdent",dijit._editor._Plugin,{indentBy:40,indentUnits:"px",setEditor:function(_1){
+this.editor=_1;
+_1._indentImpl=dojo.hitch(this,this._indentImpl);
+_1._outdentImpl=dojo.hitch(this,this._outdentImpl);
+if(!_1._indentoutdent_queryCommandEnabled){
+_1._indentoutdent_queryCommandEnabled=_1.queryCommandEnabled;
+}
+_1.queryCommandEnabled=dojo.hitch(this,this._queryCommandEnabled);
+_1.customUndo=true;
+},_queryCommandEnabled:function(_2){
+var c=_2.toLowerCase();
+var ed,_3,_4,_5,_6,_7;
+var _8="marginLeft";
+if(!this._isLtr()){
+_8="marginRight";
+}
+if(c==="indent"){
+ed=this.editor;
+_3=dijit.range.getSelection(ed.window);
+if(_3&&_3.rangeCount>0){
+_4=_3.getRangeAt(0);
+_5=_4.startContainer;
+while(_5&&_5!==ed.document&&_5!==ed.editNode){
+_6=this._getTagName(_5);
+if(_6==="li"){
+_7=_5.previousSibling;
+while(_7&&_7.nodeType!==1){
+_7=_7.previousSibling;
+}
+if(_7&&this._getTagName(_7)==="li"){
+return true;
+}else{
+return false;
+}
+}else{
+if(this._isIndentableElement(_6)){
+return true;
+}
+}
+_5=_5.parentNode;
+}
+if(this._isRootInline(_4.startContainer)){
+return true;
+}
+}
+}else{
+if(c==="outdent"){
+ed=this.editor;
+_3=dijit.range.getSelection(ed.window);
+if(_3&&_3.rangeCount>0){
+_4=_3.getRangeAt(0);
+_5=_4.startContainer;
+while(_5&&_5!==ed.document&&_5!==ed.editNode){
+_6=this._getTagName(_5);
+if(_6==="li"){
+return this.editor._indentoutdent_queryCommandEnabled(_2);
+}else{
+if(this._isIndentableElement(_6)){
+var _9=_5.style?_5.style[_8]:"";
+if(_9){
+_9=this._convertIndent(_9);
+if(_9/this.indentBy>=1){
+return true;
+}
+}
+return false;
+}
+}
+_5=_5.parentNode;
+}
+if(this._isRootInline(_4.startContainer)){
+return false;
+}
+}
+}else{
+return this.editor._indentoutdent_queryCommandEnabled(_2);
+}
+}
+return false;
+},_indentImpl:function(_a){
+var ed=this.editor;
+var _b=dijit.range.getSelection(ed.window);
+if(_b&&_b.rangeCount>0){
+var _c=_b.getRangeAt(0);
+var _d=_c.startContainer;
+var _e,_f,end,div;
+if(_c.startContainer===_c.endContainer){
+if(this._isRootInline(_c.startContainer)){
+_f=_c.startContainer;
+while(_f&&_f.parentNode!==ed.editNode){
+_f=_f.parentNode;
+}
+while(_f&&_f.previousSibling&&(this._isTextElement(_f)||(_f.nodeType===1&&this._isInlineFormat(this._getTagName(_f))))){
+_f=_f.previousSibling;
+}
+if(_f&&_f.nodeType===1&&!this._isInlineFormat(this._getTagName(_f))){
+_f=_f.nextSibling;
+}
+if(_f){
+div=ed.document.createElement("div");
+dojo.place(div,_f,"after");
+div.appendChild(_f);
+end=div.nextSibling;
+while(end&&(this._isTextElement(end)||(end.nodeType===1&&this._isInlineFormat(this._getTagName(end))))){
+div.appendChild(end);
+end=div.nextSibling;
+}
+this._indentElement(div);
+dojo.withGlobal(ed.window,"selectElementChildren",dijit._editor.selection,[div]);
+dojo.withGlobal(ed.window,"collapse",dijit._editor.selection,[true]);
+}
+}else{
+while(_d&&_d!==ed.document&&_d!==ed.editNode){
+_e=this._getTagName(_d);
+if(_e==="li"){
+this._indentList(_d);
+return;
+}else{
+if(this._isIndentableElement(_e)){
+this._indentElement(_d);
+return;
+}
+}
+_d=_d.parentNode;
+}
+}
+}else{
+var _10;
+_f=_c.startContainer;
+end=_c.endContainer;
+while(_f&&this._isTextElement(_f)&&_f.parentNode!==ed.editNode){
+_f=_f.parentNode;
+}
+while(end&&this._isTextElement(end)&&end.parentNode!==ed.editNode){
+end=end.parentNode;
+}
+if(end===ed.editNode||end===ed.document.body){
+_10=_f;
+while(_10.nextSibling&&this._inSelection(_10,_c)){
+_10=_10.nextSibling;
+}
+end=_10;
+if(end===ed.editNode||end===ed.document.body){
+_e=this._getTagName(_f);
+if(_e==="li"){
+this._indentList(_f);
+}else{
+if(this._isIndentableElement(_e)){
+this._indentElement(_f);
+}else{
+if(this._isTextElement(_f)||this._isInlineFormat(_e)){
+div=ed.document.createElement("div");
+dojo.place(div,_f,"after");
+var _11=_f;
+while(_11&&(this._isTextElement(_11)||(_11.nodeType===1&&this._isInlineFormat(this._getTagName(_11))))){
+div.appendChild(_11);
+_11=div.nextSibling;
+}
+this._indentElement(div);
+}
+}
+}
+return;
+}
+}
+end=end.nextSibling;
+_10=_f;
+while(_10&&_10!==end){
+if(_10.nodeType===1){
+_e=this._getTagName(_10);
+if(dojo.isIE){
+if(_e==="p"&&this._isEmpty(_10)){
+_10=_10.nextSibling;
+continue;
+}
+}
+if(_e==="li"){
+if(div){
+if(this._isEmpty(div)){
+div.parentNode.removeChild(div);
+}else{
+this._indentElement(div);
+}
+div=null;
+}
+this._indentList(_10);
+}else{
+if(!this._isInlineFormat(_e)&&this._isIndentableElement(_e)){
+if(div){
+if(this._isEmpty(div)){
+div.parentNode.removeChild(div);
+}else{
+this._indentElement(div);
+}
+div=null;
+}
+_10=this._indentElement(_10);
+}else{
+if(this._isInlineFormat(_e)){
+if(!div){
+div=ed.document.createElement("div");
+dojo.place(div,_10,"after");
+div.appendChild(_10);
+_10=div;
+}else{
+div.appendChild(_10);
+_10=div;
+}
+}
+}
+}
+}else{
+if(this._isTextElement(_10)){
+if(!div){
+div=ed.document.createElement("div");
+dojo.place(div,_10,"after");
+div.appendChild(_10);
+_10=div;
+}else{
+div.appendChild(_10);
+_10=div;
+}
+}
+}
+_10=_10.nextSibling;
+}
+if(div){
+if(this._isEmpty(div)){
+div.parentNode.removeChild(div);
+}else{
+this._indentElement(div);
+}
+div=null;
+}
+}
+}
+},_indentElement:function(_12){
+var _13="marginLeft";
+if(!this._isLtr()){
+_13="marginRight";
+}
+var tag=this._getTagName(_12);
+if(tag==="ul"||tag==="ol"){
+var div=this.editor.document.createElement("div");
+dojo.place(div,_12,"after");
+div.appendChild(_12);
+_12=div;
+}
+var _14=_12.style?_12.style[_13]:"";
+if(_14){
+_14=this._convertIndent(_14);
+_14=(parseInt(_14,10)+this.indentBy)+this.indentUnits;
+}else{
+_14=this.indentBy+this.indentUnits;
+}
+dojo.style(_12,_13,_14);
+return _12;
+},_outdentElement:function(_15){
+var _16="marginLeft";
+if(!this._isLtr()){
+_16="marginRight";
+}
+var _17=_15.style?_15.style[_16]:"";
+if(_17){
+_17=this._convertIndent(_17);
+if(_17-this.indentBy>0){
+_17=(parseInt(_17,10)-this.indentBy)+this.indentUnits;
+}else{
+_17="";
+}
+dojo.style(_15,_16,_17);
+}
+},_outdentImpl:function(_18){
+var ed=this.editor;
+var sel=dijit.range.getSelection(ed.window);
+if(sel&&sel.rangeCount>0){
+var _19=sel.getRangeAt(0);
+var _1a=_19.startContainer;
+var tag;
+if(_19.startContainer===_19.endContainer){
+while(_1a&&_1a!==ed.document&&_1a!==ed.editNode){
+tag=this._getTagName(_1a);
+if(tag==="li"){
+return this._outdentList(_1a);
+}else{
+if(this._isIndentableElement(tag)){
+return this._outdentElement(_1a);
+}
+}
+_1a=_1a.parentNode;
+}
+ed.document.execCommand("outdent",false,_18);
+}else{
+var _1b=_19.startContainer;
+var end=_19.endContainer;
+while(_1b&&_1b.nodeType===3){
+_1b=_1b.parentNode;
+}
+while(end&&end.nodeType===3){
+end=end.parentNode;
+}
+end=end.nextSibling;
+var _1c=_1b;
+while(_1c&&_1c!==end){
+if(_1c.nodeType===1){
+tag=this._getTagName(_1c);
+if(tag==="li"){
+this._outdentList(_1c);
+}else{
+if(this._isIndentableElement(tag)){
+this._outdentElement(_1c);
+}
+}
+}
+_1c=_1c.nextSibling;
+}
+}
+}
+return null;
+},_indentList:function(_1d){
+var ed=this.editor;
+var _1e,li;
+var _1f=_1d.parentNode;
+var _20=_1d.previousSibling;
+while(_20&&_20.nodeType!==1){
+_20=_20.previousSibling;
+}
+var _21=null;
+var tg=this._getTagName(_1f);
+if(tg==="ol"){
+_21="ol";
+}else{
+if(tg==="ul"){
+_21="ul";
+}
+}
+if(_21){
+if(_20&&_20.tagName.toLowerCase()=="li"){
+var _22;
+if(_20.childNodes){
+var i;
+for(i=0;i<_20.childNodes.length;i++){
+var n=_20.childNodes[i];
+if(n.nodeType===3){
+if(dojo.trim(n.nodeValue)){
+if(_22){
+break;
+}
+}
+}else{
+if(n.nodeType===1&&!_22){
+if(_21===n.tagName.toLowerCase()){
+_22=n;
+}
+}else{
+break;
+}
+}
+}
+}
+if(_22){
+_22.appendChild(_1d);
+}else{
+_1e=ed.document.createElement(_21);
+dojo.style(_1e,{paddingTop:"0px",paddingBottom:"0px"});
+li=ed.document.createElement("li");
+dojo.style(li,{listStyleImage:"none",listStyleType:"none"});
+_20.appendChild(_1e);
+_1e.appendChild(_1d);
+}
+dojo.withGlobal(ed.window,"selectElementChildren",dijit._editor.selection,[_1d]);
+dojo.withGlobal(ed.window,"collapse",dijit._editor.selection,[true]);
+}
+}
+},_outdentList:function(_23){
+var ed=this.editor;
+var _24=_23.parentNode;
+var _25=null;
+var tg=_24.tagName?_24.tagName.toLowerCase():"";
+var li;
+if(tg==="ol"){
+_25="ol";
+}else{
+if(tg==="ul"){
+_25="ul";
+}
+}
+var _26=_24.parentNode;
+var _27=this._getTagName(_26);
+if(_27==="li"||_27==="ol"||_27==="ul"){
+if(_27==="ol"||_27==="ul"){
+var _28=_24.previousSibling;
+while(_28&&(_28.nodeType!==1||(_28.nodeType===1&&this._getTagName(_28)!=="li"))){
+_28=_28.previousSibling;
+}
+if(_28){
+_28.appendChild(_24);
+_26=_28;
+}else{
+li=_23;
+var _29=_23;
+while(li.previousSibling){
+li=li.previousSibling;
+if(li.nodeType===1&&this._getTagName(li)==="li"){
+_29=li;
+}
+}
+if(_29!==_23){
+dojo.place(_29,_24,"before");
+_29.appendChild(_24);
+_26=_29;
+}else{
+li=ed.document.createElement("li");
+dojo.place(li,_24,"before");
+li.appendChild(_24);
+_26=li;
+}
+dojo.style(_24,{paddingTop:"0px",paddingBottom:"0px"});
+}
+}
+var _2a=_23.previousSibling;
+while(_2a&&_2a.nodeType!==1){
+_2a=_2a.previousSibling;
+}
+var _2b=_23.nextSibling;
+while(_2b&&_2b.nodeType!==1){
+_2b=_2b.nextSibling;
+}
+if(!_2a){
+dojo.place(_23,_26,"after");
+_23.appendChild(_24);
+}else{
+if(!_2b){
+dojo.place(_23,_26,"after");
+}else{
+var _2c=ed.document.createElement(_25);
+dojo.style(_2c,{paddingTop:"0px",paddingBottom:"0px"});
+_23.appendChild(_2c);
+while(_23.nextSibling){
+_2c.appendChild(_23.nextSibling);
+}
+dojo.place(_23,_26,"after");
+}
+}
+if(_24&&this._isEmpty(_24)){
+_24.parentNode.removeChild(_24);
+}
+if(_26&&this._isEmpty(_26)){
+_26.parentNode.removeChild(_26);
+}
+dojo.withGlobal(ed.window,"selectElementChildren",dijit._editor.selection,[_23]);
+dojo.withGlobal(ed.window,"collapse",dijit._editor.selection,[true]);
+}else{
+ed.document.execCommand("outdent",false,null);
+}
+},_isEmpty:function(_2d){
+if(_2d.childNodes){
+var _2e=true;
+var i;
+for(i=0;i<_2d.childNodes.length;i++){
+var n=_2d.childNodes[i];
+if(n.nodeType===1){
+if(this._getTagName(n)==="p"){
+if(!dojo.trim(n.innerHTML)){
+continue;
+}
+}
+_2e=false;
+break;
+}else{
+if(this._isTextElement(n)){
+var nv=dojo.trim(n.nodeValue);
+if(nv&&nv!==" "&&nv!==" "){
+_2e=false;
+break;
+}
+}else{
+_2e=false;
+break;
+}
+}
+}
+return _2e;
+}else{
+return true;
+}
+},_isIndentableElement:function(tag){
+switch(tag){
+case "p":
+case "div":
+case "h1":
+case "h2":
+case "h3":
+case "center":
+case "table":
+case "ul":
+case "ol":
+return true;
+default:
+return false;
+}
+},_convertIndent:function(_2f){
+var _30=12;
+_2f=_2f+"";
+_2f=_2f.toLowerCase();
+var _31=(_2f.indexOf("px")>0)?"px":(_2f.indexOf("em")>0)?"em":"px";
+_2f=_2f.replace(/(px;?|em;?)/gi,"");
+if(_31==="px"){
+if(this.indentUnits==="em"){
+_2f=Math.ceil(_2f/_30);
+}
+}else{
+if(this.indentUnits==="px"){
+_2f=_2f*_30;
+}
+}
+return _2f;
+},_isLtr:function(){
+var _32=this.editor.document.body;
+return dojo.withGlobal(this.editor.window,function(){
+var cs=dojo.getComputedStyle(_32);
+return cs?cs.direction=="ltr":true;
+});
+},_isInlineFormat:function(tag){
+switch(tag){
+case "a":
+case "b":
+case "strong":
+case "s":
+case "strike":
+case "i":
+case "u":
+case "em":
+case "sup":
+case "sub":
+case "span":
+case "font":
+case "big":
+case "cite":
+case "q":
+case "img":
+case "small":
+return true;
+default:
+return false;
+}
+},_getTagName:function(_33){
+var tag="";
+if(_33&&_33.nodeType===1){
+tag=_33.tagName?_33.tagName.toLowerCase():"";
+}
+return tag;
+},_isRootInline:function(_34){
+var ed=this.editor;
+if(this._isTextElement(_34)&&_34.parentNode===ed.editNode){
+return true;
+}else{
+if(_34.nodeType===1&&this._isInlineFormat(_34)&&_34.parentNode===ed.editNode){
+return true;
+}else{
+if(this._isTextElement(_34)&&this._isInlineFormat(this._getTagName(_34.parentNode))){
+_34=_34.parentNode;
+while(_34&&_34!==ed.editNode&&this._isInlineFormat(this._getTagName(_34))){
+_34=_34.parentNode;
+}
+if(_34===ed.editNode){
+return true;
+}
+}
+}
+}
+return false;
+},_isTextElement:function(_35){
+if(_35&&_35.nodeType===3||_35.nodeType===4){
+return true;
+}
+return false;
+},_inSelection:function(_36,_37){
+if(_36&&_37){
+var _38;
+var doc=this.editor.document;
+if(_37.compareBoundaryPoints&&doc.createRange){
+try{
+_38=doc.createRange();
+_38.setStart(_36,0);
+if(_37.compareBoundaryPoints(_37.START_TO_END,_38)===1){
+return true;
+}
+}
+catch(e){
+}
+}else{
+if(doc.selection){
+_37=doc.selection.createRange();
+try{
+_38=_36.ownerDocument.body.createControlRange();
+if(_38){
+_38.addElement(_36);
+}
+}
+catch(e1){
+try{
+_38=_36.ownerDocument.body.createTextRange();
+_38.moveToElementText(_36);
+}
+catch(e2){
+}
+}
+if(_37&&_38){
+if(_37.compareEndPoints("EndToStart",_38)===1){
+return true;
+}
+}
+}
+}
+}
+return false;
+}});
+dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
+if(o.plugin){
+return;
+}
+var _39=o.args.name.toLowerCase();
+if(_39==="normalizeindentoutdent"){
+o.plugin=new dojox.editor.plugins.NormalizeIndentOutdent({indentBy:("indentBy" in o.args)?(o.args.indentBy>0?o.args.indentBy:40):40,indentUnits:("indentUnits" in o.args)?(o.args.indentUnits.toLowerCase()=="em"?"em":"px"):"px"});
+}
+});
+}
diff --git a/dojox/editor/plugins/PageBreak.js b/dojox/editor/plugins/PageBreak.js
new file mode 100644
index 0000000..19dbed8
--- /dev/null
+++ b/dojox/editor/plugins/PageBreak.js
@@ -0,0 +1,78 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.editor.plugins.PageBreak"]){
+dojo._hasResource["dojox.editor.plugins.PageBreak"]=true;
+dojo.provide("dojox.editor.plugins.PageBreak");
+dojo.require("dijit._editor._Plugin");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dojox.editor.plugins","PageBreak",null,"ROOT,ko");
+dojo.declare("dojox.editor.plugins.PageBreak",dijit._editor._Plugin,{useDefaultCommand:false,iconClassPrefix:"dijitAdditionalEditorIcon",_unbreakableNodes:["li","ul","ol"],_pbContent:"<hr style='page-break-after: always;' class='dijitEditorPageBreak'>",_initButton:function(){
+var ed=this.editor;
+var _1=dojo.i18n.getLocalization("dojox.editor.plugins","PageBreak");
+this.button=new dijit.form.Button({label:_1["pageBreak"],showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"PageBreak",tabIndex:"-1",onClick:dojo.hitch(this,"_insertPageBreak")});
+ed.onLoadDeferred.addCallback(dojo.hitch(this,function(){
+ed.addKeyHandler(dojo.keys.ENTER,true,true,dojo.hitch(this,this._insertPageBreak));
+if(dojo.isWebKit||dojo.isOpera){
+this.connect(this.editor,"onKeyDown",dojo.hitch(this,function(e){
+if((e.keyCode===dojo.keys.ENTER)&&e.ctrlKey&&e.shiftKey){
+this._insertPageBreak();
+}
+}));
+}
+}));
+},setEditor:function(_2){
+this.editor=_2;
+this._initButton();
+},_style:function(){
+if(!this._styled){
+this._styled=true;
+var _3=this.editor.document;
+var _4=".dijitEditorPageBreak {\n"+"\tborder-top-style: solid;\n"+"\tborder-top-width: 3px;\n"+"\tborder-top-color: #585858;\n"+"\tborder-bottom-style: solid;\n"+"\tborder-bottom-width: 1px;\n"+"\tborder-bottom-color: #585858;\n"+"\tborder-left-style: solid;\n"+"\tborder-left-width: 1px;\n"+"\tborder-left-color: #585858;\n"+"\tborder-right-style: solid;\n"+"\tborder-right-width: 1px;\n"+"\tborder-right-color: #585858;\n"+"\tcolor: #A4A4A4;\n"+"\tbackground-color: #A4A4A4;\n"+"\theight: 1 [...]
+if(!dojo.isIE){
+var _5=_3.createElement("style");
+_5.appendChild(_3.createTextNode(_4));
+_3.getElementsByTagName("head")[0].appendChild(_5);
+}else{
+var ss=_3.createStyleSheet("");
+ss.cssText=_4;
+}
+}
+},_insertPageBreak:function(){
+try{
+if(!this._styled){
+this._style();
+}
+if(this._allowBreak()){
+this.editor.execCommand("inserthtml",this._pbContent);
+}
+}
+catch(e){
+console.warn(e);
+}
+},_allowBreak:function(){
+var ed=this.editor;
+var _6=ed.document;
+var _7=ed._sCall("getSelectedElement",null)||ed._sCall("getParentElement",null);
+while(_7&&_7!==_6.body&&_7!==_6.html){
+if(ed._sCall("isTag",[_7,this._unbreakableNodes])){
+return false;
+}
+_7=_7.parentNode;
+}
+return true;
+}});
+dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
+if(o.plugin){
+return;
+}
+var _8=o.args.name.toLowerCase();
+if(_8==="pagebreak"){
+o.plugin=new dojox.editor.plugins.PageBreak({});
+}
+});
+}
diff --git a/dojox/editor/plugins/PrettyPrint.js b/dojox/editor/plugins/PrettyPrint.js
new file mode 100644
index 0000000..c67218b
--- /dev/null
+++ b/dojox/editor/plugins/PrettyPrint.js
@@ -0,0 +1,51 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.editor.plugins.PrettyPrint"]){
+dojo._hasResource["dojox.editor.plugins.PrettyPrint"]=true;
+dojo.provide("dojox.editor.plugins.PrettyPrint");
+dojo.require("dijit._editor._Plugin");
+dojo.require("dojox.html.format");
+dojo.declare("dojox.editor.plugins.PrettyPrint",dijit._editor._Plugin,{indentBy:-1,lineLength:-1,useDefaultCommand:false,entityMap:null,_initButton:function(){
+delete this.command;
+},setToolbar:function(_1){
+},setEditor:function(_2){
+this.inherited(arguments);
+var _3=this;
+this.editor.onLoadDeferred.addCallback(function(){
+_3.editor._prettyprint_getValue=_3.editor.getValue;
+_3.editor.getValue=function(){
+var _4=_3.editor._prettyprint_getValue(arguments);
+return dojox.html.format.prettyPrint(_4,_3.indentBy,_3.lineLength,_3.entityMap,_3.xhtml);
+};
+_3.editor._prettyprint_endEditing=_3.editor._endEditing;
+_3.editor._prettyprint_onBlur=_3.editor._onBlur;
+_3.editor._endEditing=function(_5){
+var v=_3.editor._prettyprint_getValue(true);
+_3.editor._undoedSteps=[];
+_3.editor._steps.push({text:v,bookmark:_3.editor._getBookmark()});
+};
+_3.editor._onBlur=function(e){
+this.inherited("_onBlur",arguments);
+var _6=_3.editor._prettyprint_getValue(true);
+if(_6!=_3.editor.savedContent){
+_3.editor.onChange(_6);
+_3.editor.savedContent=_6;
+}
+};
+});
+}});
+dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
+if(o.plugin){
+return;
+}
+var _7=o.args.name.toLowerCase();
+if(_7==="prettyprint"){
+o.plugin=new dojox.editor.plugins.PrettyPrint({indentBy:("indentBy" in o.args)?o.args.indentBy:-1,lineLength:("lineLength" in o.args)?o.args.lineLength:-1,entityMap:("entityMap" in o.args)?o.args.entityMap:dojox.html.entities.html.concat([["¢","cent"],["£","pound"],["€","euro"],["¥","yen"],["©","copy"],["§","sect"],["…","hellip"],["®","reg"]]),xhtml:("xhtml" in o.args)?o.args.xhtml:false});
+}
+});
+}
diff --git a/dojox/editor/plugins/Preview.js b/dojox/editor/plugins/Preview.js
new file mode 100644
index 0000000..33145f5
--- /dev/null
+++ b/dojox/editor/plugins/Preview.js
@@ -0,0 +1,53 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.editor.plugins.Preview"]){
+dojo._hasResource["dojox.editor.plugins.Preview"]=true;
+dojo.provide("dojox.editor.plugins.Preview");
+dojo.require("dijit._editor._Plugin");
+dojo.require("dijit.form.Button");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dojox.editor.plugins","Preview",null,"ROOT,ko");
+dojo.declare("dojox.editor.plugins.Preview",dijit._editor._Plugin,{useDefaultCommand:false,styles:"",stylesheets:null,iconClassPrefix:"dijitAdditionalEditorIcon",_initButton:function(){
+this._nlsResources=dojo.i18n.getLocalization("dojox.editor.plugins","Preview");
+this.button=new dijit.form.Button({label:this._nlsResources["preview"],showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"Preview",tabIndex:"-1",onClick:dojo.hitch(this,"_preview")});
+},setEditor:function(_1){
+this.editor=_1;
+this._initButton();
+},_preview:function(){
+try{
+var _2=this.editor.attr("value");
+var _3="\t\t<meta http-equiv='Content-Type' content='text/html; charset='UTF-8'>\n";
+var i;
+if(this.stylesheets){
+for(i=0;i<this.stylesheets.length;i++){
+_3+="\t\t<link rel='stylesheet' type='text/css' href='"+this.stylesheets[i]+"'>\n";
+}
+}
+if(this.styles){
+_3+=("\t\t<style>"+this.styles+"</style>\n");
+}
+_2="<html>\n\t<head>\n"+_3+"\t</head>\n\t<body>\n"+_2+"\n\t</body>\n</html>";
+var _4=window.open("javascript: ''",this._nlsResources["preview"],"status=1,menubar=0,location=0,toolbar=0");
+_4.document.open();
+_4.document.write(_2);
+_4.document.close();
+}
+catch(e){
+console.warn(e);
+}
+}});
+dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
+if(o.plugin){
+return;
+}
+var _5=o.args.name.toLowerCase();
+if(_5==="preview"){
+o.plugin=new dojox.editor.plugins.Preview({styles:("styles" in o.args)?o.args.styles:"",stylesheets:("stylesheets" in o.args)?o.args.stylesheets:null});
+}
+});
+}
diff --git a/dojox/editor/plugins/Save.js b/dojox/editor/plugins/Save.js
new file mode 100644
index 0000000..6f7c253
--- /dev/null
+++ b/dojox/editor/plugins/Save.js
@@ -0,0 +1,52 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.editor.plugins.Save"]){
+dojo._hasResource["dojox.editor.plugins.Save"]=true;
+dojo.provide("dojox.editor.plugins.Save");
+dojo.require("dijit._editor._Plugin");
+dojo.require("dijit.form.Button");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dojox.editor.plugins","Save",null,"ROOT,ko");
+dojo.declare("dojox.editor.plugins.Save",dijit._editor._Plugin,{iconClassPrefix:"dijitAdditionalEditorIcon",url:"",logResults:true,_initButton:function(){
+var _1=dojo.i18n.getLocalization("dojox.editor.plugins","Save");
+this.button=new dijit.form.Button({label:_1["save"],showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"Save",tabIndex:"-1",onClick:dojo.hitch(this,"_save")});
+},setEditor:function(_2){
+this.editor=_2;
+this._initButton();
+},_save:function(){
+var _3=this.editor.attr("value");
+this.save(_3);
+},save:function(_4){
+var _5={"Content-Type":"text/html"};
+if(this.url){
+var _6={url:this.url,postData:_4,headers:_5,handleAs:"text"};
+this.button.attr("disabled",true);
+var _7=dojo.xhrPost(_6);
+_7.addCallback(dojo.hitch(this,this.onSuccess));
+_7.addErrback(dojo.hitch(this,this.onError));
+}else{
+}
+},onSuccess:function(_8,_9){
+this.button.attr("disabled",false);
+if(this.logResults){
+}
+},onError:function(_a,_b){
+this.button.attr("disabled",false);
+if(this.logResults){
+}
+}});
+dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
+if(o.plugin){
+return;
+}
+var _c=o.args.name.toLowerCase();
+if(_c==="save"){
+o.plugin=new dojox.editor.plugins.Save({url:("url" in o.args)?o.args.url:"",logResults:("logResults" in o.args)?o.args.logResults:true});
+}
+});
+}
diff --git a/dojox/editor/plugins/ShowBlockNodes.js b/dojox/editor/plugins/ShowBlockNodes.js
new file mode 100644
index 0000000..802d818
--- /dev/null
+++ b/dojox/editor/plugins/ShowBlockNodes.js
@@ -0,0 +1,94 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.editor.plugins.ShowBlockNodes"]){
+dojo._hasResource["dojox.editor.plugins.ShowBlockNodes"]=true;
+dojo.provide("dojox.editor.plugins.ShowBlockNodes");
+dojo.require("dijit._editor._Plugin");
+dojo.require("dijit.form.Button");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dojox.editor.plugins","ShowBlockNodes",null,"ROOT,ko");
+dojo.declare("dojox.editor.plugins.ShowBlockNodes",dijit._editor._Plugin,{useDefaultCommand:false,iconClassPrefix:"dijitAdditionalEditorIcon",_styled:false,_initButton:function(){
+var _1=dojo.i18n.getLocalization("dojox.editor.plugins","ShowBlockNodes");
+this.button=new dijit.form.ToggleButton({label:_1["showBlockNodes"],showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"ShowBlockNodes",tabIndex:"-1",onChange:dojo.hitch(this,"_showBlocks")});
+this.editor.addKeyHandler(dojo.keys.F9,true,true,dojo.hitch(this,this.toggle));
+},setEditor:function(_2){
+this.editor=_2;
+this._initButton();
+},toggle:function(){
+this.button.attr("checked",!this.button.attr("checked"));
+},_showBlocks:function(_3){
+var _4=this.editor.document;
+if(!this._styled){
+try{
+this._styled=true;
+var _5="";
+var _6=["div","p","ul","ol","table","h1","h2","h3","h4","h5","h6","pre","dir","center","blockquote","form","fieldset","address","object","pre","hr","ins","noscript","li","map","button","dd","dt"];
+var _7="@media screen {\n"+"\t.editorShowBlocks {TAG} {\n"+"\t\tbackground-image: url({MODURL}/images/blockelems/{TAG}.gif);\n"+"\t\tbackground-repeat: no-repeat;\n"+"\t\tbackground-position: top left;\n"+"\t\tborder-width: 1px;\n"+"\t\tborder-style: dashed;\n"+"\t\tborder-color: #D0D0D0;\n"+"\t\tpadding-top: 15px;\n"+"\t\tpadding-left: 15px;\n"+"\t}\n"+"}\n";
+dojo.forEach(_6,function(_8){
+_5+=_7.replace(/\{TAG\}/gi,_8);
+});
+var _9=dojo.moduleUrl(dojox._scopeName,"editor/plugins/resources").toString();
+if(!(_9.match(/^https?:\/\//i))&&!(_9.match(/^file:\/\//i))){
+var _a;
+if(_9.charAt(0)==="/"){
+var _b=dojo.doc.location.protocol;
+var _c=dojo.doc.location.host;
+_a=_b+"//"+_c;
+}else{
+_a=this._calcBaseUrl(dojo.global.location.href);
+}
+if(_a[_a.length-1]!=="/"&&_9.charAt(0)!=="/"){
+_a+="/";
+}
+_9=_a+_9;
+}
+_5=_5.replace(/\{MODURL\}/gi,_9);
+if(!dojo.isIE){
+var _d=_4.createElement("style");
+_d.appendChild(_4.createTextNode(_5));
+_4.getElementsByTagName("head")[0].appendChild(_d);
+}else{
+var ss=_4.createStyleSheet("");
+ss.cssText=_5;
+}
+}
+catch(e){
+console.warn(e);
+}
+}
+if(_3){
+dojo.addClass(this.editor.editNode,"editorShowBlocks");
+}else{
+dojo.removeClass(this.editor.editNode,"editorShowBlocks");
+}
+},_calcBaseUrl:function(_e){
+var _f=null;
+if(_e!==null){
+var _10=_e.indexOf("?");
+if(_10!=-1){
+_e=_e.substring(0,_10);
+}
+_10=_e.lastIndexOf("/");
+if(_10>0&&_10<_e.length){
+_f=_e.substring(0,_10);
+}else{
+_f=_e;
+}
+}
+return _f;
+}});
+dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
+if(o.plugin){
+return;
+}
+var _11=o.args.name.toLowerCase();
+if(_11==="showblocknodes"){
+o.plugin=new dojox.editor.plugins.ShowBlockNodes();
+}
+});
+}
diff --git a/dojox/editor/plugins/Smiley.js b/dojox/editor/plugins/Smiley.js
new file mode 100644
index 0000000..6cf3f48
--- /dev/null
+++ b/dojox/editor/plugins/Smiley.js
@@ -0,0 +1,41 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.editor.plugins.Smiley"]){
+dojo._hasResource["dojox.editor.plugins.Smiley"]=true;
+dojo.provide("dojox.editor.plugins.Smiley");
+dojo.experimental("dojox.editor.plugins.Smiley");
+dojo.require("dojo.i18n");
+dojo.require("dijit._editor._Plugin");
+dojo.require("dijit.form.ToggleButton");
+dojo.require("dijit.form.DropDownButton");
+dojo.require("dojox.editor.plugins._SmileyPalette");
+dojo.requireLocalization("dojox.editor.plugins","Smiley",null,"ROOT");
+dojo.declare("dojox.editor.plugins.Smiley",dijit._editor._Plugin,{iconClassPrefix:"dijitAdditionalEditorIcon",_initButton:function(){
+this.dropDown=new dojox.editor.plugins._SmileyPalette();
+this.connect(this.dropDown,"onChange",function(_1){
+this.button.closeDropDown();
+this.editor.focus();
+this.editor.execCommand("inserthtml",_1);
+});
+var _2=dojo.i18n.getLocalization("dojox.editor.plugins","Smiley");
+this.button=new dijit.form.DropDownButton({label:_2.smiley,showLabel:false,iconClass:this.iconClassPrefix+" "+this.iconClassPrefix+"Smiley",tabIndex:"-1",dropDown:this.dropDown});
+},setEditor:function(_3){
+this.editor=_3;
+this._initButton();
+},_preFilterEntities:function(s){
+},_postFilterEntities:function(s){
+}});
+dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
+if(o.plugin){
+return;
+}
+if(o.args.name==="smiley"){
+o.plugin=new dojox.editor.plugins.Smiley();
+}
+});
+}
diff --git a/dojox/editor/plugins/TablePlugins.js b/dojox/editor/plugins/TablePlugins.js
index a7d8054..38cbd6b 100644
--- a/dojox/editor/plugins/TablePlugins.js
+++ b/dojox/editor/plugins/TablePlugins.js
@@ -24,50 +24,50 @@ return dojo.withGlobal(this.window,"hasAncestorElement",dijit._editor.selection,
 dojo.withGlobal(this.window,"selectElement",dijit._editor.selection,[_3]);
 },byId:function(id){
 return dojo.withGlobal(this.window,"byId",dojo,[id]);
-},query:function(_5,_6,_7){
-var ar=dojo.withGlobal(this.window,"query",dojo,[_5,_6]);
-return (_7)?ar[0]:ar;
+},query:function(_4,_5,_6){
+var ar=dojo.withGlobal(this.window,"query",dojo,[_4,_5]);
+return (_6)?ar[0]:ar;
 }});
-},initialize:function(_9){
+},initialize:function(_7){
 if(this.initialized){
 return;
 }
 this.initialized=true;
-this.editor=_9;
+this.editor=_7;
+_7.onLoadDeferred.addCallback(dojo.hitch(this,function(){
 this.editorDomNode=this.editor.editNode||this.editor.iframe.document.body.firstChild;
 dojo.connect(this.editorDomNode,"mouseup",this.editor,"onClick");
 dojo.connect(this.editor,"onDisplayChanged",this,"checkAvailable");
 this.doMixins();
 this.connectDraggable();
-},getTableInfo:function(_a){
-if(_a){
+}));
+},getTableInfo:function(_8){
+if(_8){
 this._tempStoreTableData(false);
 }
 if(this.tableData){
-
 return this.tableData;
 }
-var tr,_c,td,_e,_f,_10,_11,_12;
+var tr,_9,td,_a,_b,_c,_d,_e;
 td=this.editor.getAncestorElement("td");
 if(td){
 tr=td.parentNode;
 }
-_f=this.editor.getAncestorElement("table");
-_e=dojo.query("td",_f);
-_e.forEach(function(d,i){
+_b=this.editor.getAncestorElement("table");
+_a=dojo.query("td",_b);
+_a.forEach(function(d,i){
 if(td==d){
-_11=i;
+_d=i;
 }
 });
-_c=dojo.query("tr",_f);
-_c.forEach(function(r,i){
+_9=dojo.query("tr",_b);
+_9.forEach(function(r,i){
 if(tr==r){
-_12=i;
+_e=i;
 }
 });
-_10=_e.length/_c.length;
-var o={tbl:_f,td:td,tr:tr,trs:_c,tds:_e,rows:_c.length,cols:_10,tdIndex:_11,trIndex:_12,colIndex:_11%_10};
-
+_c=_a.length/_9.length;
+var o={tbl:_b,td:td,tr:tr,trs:_9,tds:_a,rows:_9.length,cols:_c,tdIndex:_d,trIndex:_e,colIndex:_d%_c};
 this.tableData=o;
 this._tempStoreTableData(500);
 return this.tableData;
@@ -84,13 +84,13 @@ e.srcElement.id="tbl_"+(new Date().getTime());
 }
 },onDragEnd:function(){
 var e=window.event;
-var _1a=e.srcElement;
-var id=_1a.id;
+var _f=e.srcElement;
+var id=_f.id;
 var win=this.editor.window;
-if(_1a.tagName.toLowerCase()=="table"){
+if(_f.tagName.toLowerCase()=="table"){
 setTimeout(function(){
-var _1d=dojo.withGlobal(win,"byId",dojo,[id]);
-dojo.removeAttr(_1d,"align");
+var _10=dojo.withGlobal(win,"byId",dojo,[id]);
+dojo.removeAttr(_10,"align");
 },100);
 }
 },checkAvailable:function(){
@@ -114,7 +114,6 @@ dojo.publish("available",[this.currentlyAvailable]);
 return this.currentlyAvailable;
 },_prepareTable:function(tbl){
 var tds=this.editor.query("td",tbl);
-
 if(!tds[0].id){
 tds.forEach(function(td,i){
 if(!td.id){
@@ -125,35 +124,35 @@ td.id="tdid"+i+this.getTimeStamp();
 return tds;
 },getTimeStamp:function(){
 return Math.floor(new Date().getTime()*1e-8);
-},_tempStoreTableData:function(_22){
-if(_22===true){
+},_tempStoreTableData:function(_11){
+if(_11===true){
 }else{
-if(_22===false){
+if(_11===false){
 this.tableData=null;
 }else{
-if(_22===undefined){
+if(_11===undefined){
 console.warn("_tempStoreTableData must be passed an argument");
 }else{
 setTimeout(dojo.hitch(this,function(){
 this.tableData=null;
-}),_22);
+}),_11);
 }
 }
 }
-},_tempAvailability:function(_23){
-if(_23===true){
+},_tempAvailability:function(_12){
+if(_12===true){
 this.availableCurrentlySet=true;
 }else{
-if(_23===false){
+if(_12===false){
 this.availableCurrentlySet=false;
 }else{
-if(_23===undefined){
+if(_12===undefined){
 console.warn("_tempAvailability must be passed an argument");
 }else{
 this.availableCurrentlySet=true;
 setTimeout(dojo.hitch(this,function(){
 this.availableCurrentlySet=false;
-}),_23);
+}),_12);
 }
 }
 }
@@ -162,10 +161,10 @@ if(this.tablesConnected){
 return;
 }
 this.tablesConnected=true;
-var _24=(this.editor.iframe)?this.editor.document:this.editor.editNode;
-this.cnKeyDn=dojo.connect(_24,"onkeydown",this,"onKeyDown");
-this.cnKeyUp=dojo.connect(_24,"onkeyup",this,"onKeyUp");
-dojo.connect(_24,"onkeypress",this,"onKeyUp");
+var _13=(this.editor.iframe)?this.editor.document:this.editor.editNode;
+this.cnKeyDn=dojo.connect(_13,"onkeydown",this,"onKeyDown");
+this.cnKeyUp=dojo.connect(_13,"onkeyup",this,"onKeyUp");
+dojo.connect(_13,"onkeypress",this,"onKeyUp");
 },disconnectTableKeys:function(){
 dojo.disconnect(this.cnKeyDn);
 dojo.disconnect(this.cnKeyUp);
@@ -176,7 +175,6 @@ if(key==16){
 this.shiftKeyDown=true;
 }
 if(key==9){
-
 var o=this.getTableInfo();
 o.tdIndex=(this.shiftKeyDown)?o.tdIndex-1:tabTo=o.tdIndex+1;
 if(o.tdIndex>=0&&o.tdIndex<o.tds.length){
@@ -216,30 +214,32 @@ switch(this.commandName){
 case "colorTableCell":
 this.buttonClass=dijit.form.DropDownButton;
 this.dropDown=new dijit.ColorPalette();
-this.connect(this.dropDown,"onChange",function(_2a){
-this.modTable(null,_2a);
+this.connect(this.dropDown,"onChange",function(_14){
+this.modTable(null,_14);
 });
 break;
 case "modifyTable":
-this.buttonClass=dijit.form.DropDownButton;
+this.buttonClass=dijit.form.Button;
 this.modTable=this.launchModifyDialog;
 break;
 case "insertTable":
 this.alwaysAvailable=true;
-this.buttonClass=dijit.form.DropDownButton;
+this.buttonClass=dijit.form.Button;
 this.modTable=this.launchInsertDialog;
 break;
 case "tableContextMenu":
-this.connect(this,"setEditor",function(){
+this.connect(this,"setEditor",function(_15){
+_15.onLoadDeferred.addCallback(dojo.hitch(this,function(){
 this._createContextMenu();
+}));
 this.button.domNode.style.display="none";
 });
 break;
 }
 dojo.subscribe("available",this,"onDisplayChanged");
-},onDisplayChanged:function(_2b){
+},onDisplayChanged:function(_16){
 if(!this.alwaysAvailable){
-this.available=_2b;
+this.available=_16;
 this.button.attr("disabled",!this.available);
 }
 },setEditor:function(){
@@ -248,20 +248,20 @@ this.onEditorLoaded();
 },onEditorLoaded:function(){
 tablePluginHandler.initialize(this.editor);
 },_createContextMenu:function(){
-var _2c=dojo.isFF?this.editor.editNode:this.editorDomNode;
-var _2d=new dijit.Menu({targetNodeIds:[_2c],id:"progMenu",contextMenuForWindow:dojo.isIE});
-var _M=dijit.MenuItem;
-var _2f=dojo.i18n.getLocalization("dojox.editor.plugins","TableDialog",this.lang);
-_2d.addChild(new _M({label:_2f.selectTableLabel,onClick:dojo.hitch(this,"selectTable")}));
-_2d.addChild(new dijit.MenuSeparator());
-_2d.addChild(new _M({label:_2f.insertTableRowBeforeLabel,onClick:dojo.hitch(this,"modTable","insertTableRowBefore")}));
-_2d.addChild(new _M({label:_2f.insertTableRowAfterLabel,onClick:dojo.hitch(this,"modTable","insertTableRowAfter")}));
-_2d.addChild(new _M({label:_2f.insertTableColumnBeforeLabel,onClick:dojo.hitch(this,"modTable","insertTableColumnBefore")}));
-_2d.addChild(new _M({label:_2f.insertTableColumnAfterLabel,onClick:dojo.hitch(this,"modTable","insertTableColumnAfter")}));
-_2d.addChild(new dijit.MenuSeparator());
-_2d.addChild(new _M({label:_2f.deleteTableRowLabel,onClick:dojo.hitch(this,"modTable","deleteTableRow")}));
-_2d.addChild(new _M({label:_2f.deleteTableColumnLabel,onClick:dojo.hitch(this,"modTable","deleteTableColumn")}));
-_2d._openMyself=function(e){
+var _17=dojo.isMoz?this.editor.editNode:this.editorDomNode;
+var _18=new dijit.Menu({targetNodeIds:[_17],id:"progMenu",contextMenuForWindow:dojo.isIE});
+var _19=dijit.MenuItem;
+var _1a=dojo.i18n.getLocalization("dojox.editor.plugins","TableDialog",this.lang);
+_18.addChild(new _19({label:_1a.selectTableLabel,onClick:dojo.hitch(this,"selectTable")}));
+_18.addChild(new dijit.MenuSeparator());
+_18.addChild(new _19({label:_1a.insertTableRowBeforeLabel,onClick:dojo.hitch(this,"modTable","insertTableRowBefore")}));
+_18.addChild(new _19({label:_1a.insertTableRowAfterLabel,onClick:dojo.hitch(this,"modTable","insertTableRowAfter")}));
+_18.addChild(new _19({label:_1a.insertTableColumnBeforeLabel,onClick:dojo.hitch(this,"modTable","insertTableColumnBefore")}));
+_18.addChild(new _19({label:_1a.insertTableColumnAfterLabel,onClick:dojo.hitch(this,"modTable","insertTableColumnAfter")}));
+_18.addChild(new dijit.MenuSeparator());
+_18.addChild(new _19({label:_1a.deleteTableRowLabel,onClick:dojo.hitch(this,"modTable","deleteTableRow")}));
+_18.addChild(new _19({label:_1a.deleteTableColumnLabel,onClick:dojo.hitch(this,"modTable","deleteTableColumn")}));
+_18._openMyself=function(e){
 if(!tablePluginHandler.checkAvailable()){
 return;
 }
@@ -277,13 +277,13 @@ y=e.y;
 x=e.screenX;
 y=e.screenY+25;
 }
-var _33=this;
-var _34=dijit.getFocus(this);
-function _35(){
-dijit.focus(_34);
-dijit.popup.close(_33);
+var _1b=this;
+var _1c=dijit.getFocus(this);
+function _1d(){
+dijit.focus(_1c);
+dijit.popup.close(_1b);
 };
-var res=dijit.popup.open({popup:this,x:x,y:y,onExecute:_35,onCancel:_35,orient:this.isLeftToRight()?"L":"R"});
+var res=dijit.popup.open({popup:this,x:x,y:y,onExecute:_1d,onCancel:_1d,orient:this.isLeftToRight()?"L":"R"});
 var v=dijit.getViewport();
 if(res.y+res.h>v.h){
 if(e.screenY-res.h>=0){
@@ -292,16 +292,15 @@ y=e.screenY-res.h;
 y=0;
 }
 dijit.popup.close(this);
-res=dijit.popup.open({popup:this,x:x,y:y,onExecute:_35,onCancel:_35,orient:this.isLeftToRight()?"L":"R"});
+res=dijit.popup.open({popup:this,x:x,y:y,onExecute:_1d,onCancel:_1d,orient:this.isLeftToRight()?"L":"R"});
 }
-
 this.focus();
 this._onBlur=function(){
 this.inherited("_onBlur",arguments);
 dijit.popup.close(this);
 };
 };
-this.menu=_2d;
+this.menu=_18;
 },selectTable:function(){
 var o=this.getTableInfo();
 dojo.withGlobal(this.editor.window,"selectElement",dijit._editor.selection,[o.tbl]);
@@ -314,13 +313,11 @@ var res=this.editor.execCommand("inserthtml",obj.htmlText);
 });
 },launchModifyDialog:function(){
 var o=this.getTableInfo();
-
 var w=new dojox.editor.plugins.EditorModifyTableDialog({table:o.tbl});
 w.show();
-this.connect(w,"onSetTable",function(_3f){
+this.connect(w,"onSetTable",function(_1e){
 var o=this.getTableInfo();
-
-dojo.attr(o.td,"bgcolor",_3f);
+dojo.attr(o.td,"bgcolor",_1e);
 });
 },_initButton:function(){
 this.command=this.commandName;
@@ -334,12 +331,12 @@ if(this.commandName=="tableContextMenu"){
 this.button.domNode.display="none";
 }
 this.onDisplayChanged(false);
-},modTable:function(cmd,_42){
+},modTable:function(cmd,_1f){
 this.begEdit();
 var o=this.getTableInfo();
 var sw=(dojo.isString(cmd))?cmd:this.commandName;
 var r,c,i;
-var _48=false;
+var _20=false;
 switch(sw){
 case "insertTableRowBefore":
 r=o.tbl.insertRow(o.trIndex);
@@ -360,29 +357,28 @@ o.trs.forEach(function(r){
 c=r.insertCell(o.colIndex);
 c.innerHTML=" ";
 });
-_48=true;
+_20=true;
 break;
 case "insertTableColumnAfter":
 o.trs.forEach(function(r){
 c=r.insertCell(o.colIndex+1);
 c.innerHTML=" ";
 });
-_48=true;
+_20=true;
 break;
 case "deleteTableRow":
 o.tbl.deleteRow(o.trIndex);
-
 break;
 case "deleteTableColumn":
 o.trs.forEach(function(tr){
 tr.deleteCell(o.colIndex);
 });
-_48=true;
+_20=true;
 break;
 case "colorTableCell":
 var tds=this.getSelectedCells(o.tbl);
 dojo.forEach(tds,function(td){
-dojo.style(td,"backgroundColor",_42);
+dojo.style(td,"backgroundColor",_1f);
 });
 break;
 case "modifyTable":
@@ -390,18 +386,16 @@ break;
 case "insertTable":
 break;
 }
-if(_48){
+if(_20){
 this.makeColumnsEven();
 }
 this.endEdit();
 },begEdit:function(){
 if(tablePluginHandler.undoEnabled){
-
 if(this.editor.customUndo){
 this.editor.beginEditing();
 }else{
 this.valBeforeUndo=this.editor.getValue();
-
 }
 }
 },endEdit:function(){
@@ -409,9 +403,9 @@ if(tablePluginHandler.undoEnabled){
 if(this.editor.customUndo){
 this.editor.endEditing();
 }else{
-var _4e=this.editor.getValue();
+var _21=this.editor.getValue();
 this.editor.setValue(this.valBeforeUndo);
-this.editor.replaceValue(_4e);
+this.editor.replaceValue(_21);
 }
 this.editor.onDisplayChanged();
 }
@@ -423,8 +417,8 @@ o.tds.forEach(function(d){
 dojo.attr(d,"width",w+"%");
 });
 }),10);
-},getTableInfo:function(_52){
-return tablePluginHandler.getTableInfo(_52);
+},getTableInfo:function(_22){
+return tablePluginHandler.getTableInfo(_22);
 },_makeTitle:function(str){
 var s=str.split(""),ns=[];
 dojo.forEach(str,function(c,i){
@@ -438,55 +432,54 @@ ns.push(c);
 });
 return ns.join("");
 },getSelectedCells:function(){
-var _58=[];
+var _23=[];
 var tbl=this.getTableInfo().tbl;
 var tds=tablePluginHandler._prepareTable(tbl);
 var e=this.editor;
 var r;
 if(!dojo.isIE){
 r=dijit.range.getSelection(e.window);
-var _5d=false;
-var _5e=false;
+var _24=false;
+var _25=false;
 if(r.anchorNode&&r.anchorNode.tagName&&r.anchorNode.tagName.toLowerCase()=="tr"){
 var trs=dojo.query("tr",tbl);
-var _60=[];
+var _26=[];
 trs.forEach(function(tr,i){
-if(!_5d&&(tr==r.anchorNode||tr==r.focusNode)){
-_60.push(tr);
-_5d=true;
+if(!_24&&(tr==r.anchorNode||tr==r.focusNode)){
+_26.push(tr);
+_24=true;
 if(r.anchorNode==r.focusNode){
-_5e=true;
+_25=true;
 }
 }else{
-if(_5d&&!_5e){
-_60.push(tr);
+if(_24&&!_25){
+_26.push(tr);
 if(tr==r.anchorNode||tr==r.focusNode){
-_5e=true;
+_25=true;
 }
 }
 }
 });
-dojo.forEach(_60,function(tr){
-_58=_58.concat(dojo.query("td",tr));
+dojo.forEach(_26,function(tr){
+_23=_23.concat(dojo.query("td",tr));
 },this);
 }else{
 tds.forEach(function(td,i){
-if(!_5d&&(td.id==r.anchorNode.parentNode.id||td.id==r.focusNode.parentNode.id)){
-_58.push(td);
-_5d=true;
+if(!_24&&(td.id==r.anchorNode.parentNode.id||td.id==r.focusNode.parentNode.id)){
+_23.push(td);
+_24=true;
 if(r.anchorNode.parentNode.id==r.focusNode.parentNode.id){
-_5e=true;
+_25=true;
 }
 }else{
-if(_5d&&!_5e){
-_58.push(td);
+if(_24&&!_25){
+_23.push(td);
 if(td.id==r.focusNode.parentNode.id||td.id==r.anchorNode.parentNode.id){
-_5e=true;
+_25=true;
 }
 }
 }
 });
-
 }
 }
 if(dojo.isIE){
@@ -494,43 +487,42 @@ r=document.selection.createRange();
 var str=r.htmlText.match(/id=\w*/g);
 dojo.forEach(str,function(a){
 var id=a.substring(3,a.length);
-_58.push(e.byId(id));
+_23.push(e.byId(id));
 },this);
 }
-return _58;
+return _23;
 }});
 dojo.provide("dojox.editor.plugins.EditorTableDialog");
 dojo.require("dijit.Dialog");
 dojo.require("dijit.form.TextBox");
 dojo.require("dijit.form.FilteringSelect");
 dojo.require("dijit.form.Button");
-dojo.declare("dojox.editor.plugins.EditorTableDialog",[dijit.Dialog],{baseClass:"EditorTableDialog",widgetsInTemplate:true,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\">${insertTableTitle}</span>\n\t<span dojoAttachPoint=\"closeButtonNode\" class=\"dijitDialogCloseIcon\ [...]
-var _69=dojo.i18n.getLocalization("dojox.editor.plugins","TableDialog",this.lang);
-dojo.mixin(this,_69);
+dojo.declare("dojox.editor.plugins.EditorTableDialog",[dijit.Dialog],{baseClass:"EditorTableDialog",widgetsInTemplate:true,templateString:dojo.cache("dojox.editor.plugins","resources/insertTable.html","<div class=\"dijitDialog\" tabindex=\"-1\" waiRole=\"dialog\" waiState=\"labelledby-${id}_title\">\n\t<div dojoAttachPoint=\"titleBar\" class=\"dijitDialogTitleBar\">\n\t<span dojoAttachPoint=\"titleNode\" class=\"dijitDialogTitle\" id=\"${id}_title\">${insertTableTitle}</span>\n\t<span do [...]
+var _27=dojo.i18n.getLocalization("dojox.editor.plugins","TableDialog",this.lang);
+dojo.mixin(this,_27);
 this.inherited(arguments);
 },postCreate:function(){
 dojo.addClass(this.domNode,this.baseClass);
 this.inherited(arguments);
 },onInsert:function(){
-
-var _6a=this.selectRow.attr("value")||1,_6b=this.selectCol.attr("value")||1,_6c=this.selectWidth.attr("value"),_6d=this.selectWidthType.attr("value"),_6e=this.selectBorder.attr("value"),pad=this.selectPad.attr("value"),_70=this.selectSpace.attr("value"),_id="tbl_"+(new Date().getTime()),t="<table id=\""+_id+"\"width=\""+_6c+((_6d=="percent")?"%":"")+"\" border=\""+_6e+"\" cellspacing=\""+_70+"\" cellpadding=\""+pad+"\">\n";
-for(var r=0;r<_6a;r++){
+var _28=this.selectRow.attr("value")||1,_29=this.selectCol.attr("value")||1,_2a=this.selectWidth.attr("value"),_2b=this.selectWidthType.attr("value"),_2c=this.selectBorder.attr("value"),pad=this.selectPad.attr("value"),_2d=this.selectSpace.attr("value"),_2e="tbl_"+(new Date().getTime()),t="<table id=\""+_2e+"\"width=\""+_2a+((_2b=="percent")?"%":"")+"\" border=\""+_2c+"\" cellspacing=\""+_2d+"\" cellpadding=\""+pad+"\">\n";
+for(var r=0;r<_28;r++){
 t+="\t<tr>\n";
-for(var c=0;c<_6b;c++){
-t+="\t\t<td width=\""+(Math.floor(100/_6b))+"%\"> </td>\n";
+for(var c=0;c<_29;c++){
+t+="\t\t<td width=\""+(Math.floor(100/_29))+"%\"> </td>\n";
 }
 t+="\t</tr>\n";
 }
 t+="</table>";
-this.onBuildTable({htmlText:t,id:_id});
+this.onBuildTable({htmlText:t,id:_2e});
 this.hide();
-},onBuildTable:function(_75){
+},onBuildTable:function(_2f){
 }});
 dojo.provide("dojox.editor.plugins.EditorModifyTableDialog");
 dojo.require("dijit.ColorPalette");
-dojo.declare("dojox.editor.plugins.EditorModifyTableDialog",[dijit.Dialog],{baseClass:"EditorTableDialog",widgetsInTemplate:true,table:null,tableAtts:{},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\">${modifyTableTitle}</span>\n\t<span dojoAttachPoint=\"closeButtonNode\" [...]
-var _76=dojo.i18n.getLocalization("dojox.editor.plugins","TableDialog",this.lang);
-dojo.mixin(this,_76);
+dojo.declare("dojox.editor.plugins.EditorModifyTableDialog",[dijit.Dialog],{baseClass:"EditorTableDialog",widgetsInTemplate:true,table:null,tableAtts:{},templateString:dojo.cache("dojox.editor.plugins","resources/modifyTable.html","<div class=\"dijitDialog\" tabindex=\"-1\" waiRole=\"dialog\" waiState=\"labelledby-${id}_title\">\n\t<div dojoAttachPoint=\"titleBar\" class=\"dijitDialogTitleBar\">\n\t<span dojoAttachPoint=\"titleNode\" class=\"dijitDialogTitle\" id=\"${id}_title\">${modify [...]
+var _30=dojo.i18n.getLocalization("dojox.editor.plugins","TableDialog",this.lang);
+dojo.mixin(this,_30);
 this.inherited(arguments);
 },postCreate:function(){
 dojo.addClass(this.domNode,this.baseClass);
@@ -539,18 +531,18 @@ this.connect(this.borderCol,"click",function(){
 var div=document.createElement("div");
 var w=new dijit.ColorPalette({},div);
 dijit.popup.open({popup:w,around:this.borderCol});
-this.connect(w,"onChange",function(_79){
+this.connect(w,"onChange",function(_31){
 dijit.popup.close(w);
-this.setBrdColor(_79);
+this.setBrdColor(_31);
 });
 });
 this.connect(this.backgroundCol,"click",function(){
 var div=document.createElement("div");
 var w=new dijit.ColorPalette({},div);
 dijit.popup.open({popup:w,around:this.backgroundCol});
-this.connect(w,"onChange",function(_7c){
+this.connect(w,"onChange",function(_32){
 dijit.popup.close(w);
-this.setBkColor(_7c);
+this.setBkColor(_32);
 });
 });
 this.setBrdColor(dojo.attr(this.table,"bordercolor"));
@@ -567,12 +559,12 @@ this.selectBorder.attr("value",dojo.attr(this.table,"border"));
 this.selectPad.attr("value",dojo.attr(this.table,"cellpadding"));
 this.selectSpace.attr("value",dojo.attr(this.table,"cellspacing"));
 this.selectAlign.attr("value",dojo.attr(this.table,"align"));
-},setBrdColor:function(_7f){
-this.brdColor=_7f;
-dojo.style(this.borderCol,"backgroundColor",_7f);
-},setBkColor:function(_80){
-this.bkColor=_80;
-dojo.style(this.backgroundCol,"backgroundColor",_80);
+},setBrdColor:function(_33){
+this.brdColor=_33;
+dojo.style(this.borderCol,"backgroundColor",_33);
+},setBkColor:function(_34){
+this.bkColor=_34;
+dojo.style(this.backgroundCol,"backgroundColor",_34);
 },onSet:function(){
 dojo.attr(this.table,"bordercolor",this.brdColor);
 dojo.attr(this.table,"bgcolor",this.bkColor);
@@ -582,7 +574,7 @@ dojo.attr(this.table,"cellpadding",this.selectPad.attr("value"));
 dojo.attr(this.table,"cellspacing",this.selectSpace.attr("value"));
 dojo.attr(this.table,"align",this.selectAlign.attr("value"));
 this.hide();
-},onSetTable:function(_81){
+},onSetTable:function(_35){
 }});
 dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
 if(o.plugin){
diff --git a/dojox/editor/plugins/ToolbarLineBreak.js b/dojox/editor/plugins/ToolbarLineBreak.js
new file mode 100644
index 0000000..c23c950
--- /dev/null
+++ b/dojox/editor/plugins/ToolbarLineBreak.js
@@ -0,0 +1,28 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.editor.plugins.ToolbarLineBreak"]){
+dojo._hasResource["dojox.editor.plugins.ToolbarLineBreak"]=true;
+dojo.provide("dojox.editor.plugins.ToolbarLineBreak");
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+dojo.require("dijit._editor._Plugin");
+dojo.declare("dojox.editor.plugins._ToolbarLineBreak",[dijit._Widget,dijit._Templated],{templateString:"<span class='dijit dijitReset'><br></span>",postCreate:function(){
+dojo.setSelectable(this.domNode,false);
+},isFocusable:function(){
+return false;
+}});
+dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
+if(o.plugin){
+return;
+}
+var _1=o.args.name.toLowerCase();
+if(_1==="||"||_1==="toolbarlinebreak"){
+o.plugin=new dijit._editor._Plugin({button:new dojox.editor.plugins._ToolbarLineBreak()});
+}
+});
+}
diff --git a/dojox/editor/plugins/UploadImage.js b/dojox/editor/plugins/UploadImage.js
index 4de9649..47ea06c 100644
--- a/dojox/editor/plugins/UploadImage.js
+++ b/dojox/editor/plugins/UploadImage.js
@@ -11,36 +11,40 @@ dojo.provide("dojox.editor.plugins.UploadImage");
 dojo.require("dijit._editor._Plugin");
 dojo.require("dojox.form.FileUploader");
 dojo.experimental("dojox.editor.plugins.UploadImage");
-dojo.declare("dojox.editor.plugins.UploadImage",dijit._editor._Plugin,{tempImageUrl:"",iconClassPrefix:"editorIcon",useDefaultCommand:false,uploadUrl:"",fileInput:null,label:"Mike",_initButton:function(){
+dojo.declare("dojox.editor.plugins.UploadImage",dijit._editor._Plugin,{tempImageUrl:"",iconClassPrefix:"editorIcon",useDefaultCommand:false,uploadUrl:"",button:null,label:"Upload",setToolbar:function(_1){
+this.button.destroy();
+this.createFileInput();
+_1.addChild(this.button);
+},_initButton:function(){
 this.command="uploadImage";
 this.editor.commands[this.command]="Upload Image";
 this.inherited("_initButton",arguments);
 delete this.command;
-setTimeout(dojo.hitch(this,"createFileInput"),200);
 },createFileInput:function(){
-var _1=[["Jpeg File","*.jpg;*.jpeg"],["GIF File","*.gif"],["PNG File","*.png"],["All Images","*.jpg;*.jpeg;*.gif;*.png"]];
-console.warn("downloadPath:",this.downloadPath);
-this.fileInput=new dojox.form.FileUploader({isDebug:true,button:this.button,uploadUrl:this.uploadUrl,uploadOnChange:true,selectMultipleFiles:false,fileMask:_1});
-dojo.connect(this.fileInput,"onChange",this,"insertTempImage");
-dojo.connect(this.fileInput,"onComplete",this,"onComplete");
-},onComplete:function(_2,_3,_4){
-_2=_2[0];
-var _5=dojo.withGlobal(this.editor.window,"byId",dojo,[this.currentImageId]);
-var _6;
+var _2=dojo.create("span",{innerHTML:"."},document.body);
+dojo.style(_2,{width:"40px",height:"20px",paddingLeft:"8px",paddingRight:"8px"});
+this.button=new dojox.form.FileUploader({isDebug:true,uploadUrl:this.uploadUrl,uploadOnChange:true,selectMultipleFiles:false,baseClass:"dojoxEditorUploadNorm",hoverClass:"dojoxEditorUploadHover",activeClass:"dojoxEditorUploadActive",disabledClass:"dojoxEditorUploadDisabled"},_2);
+this.connect(this.button,"onChange","insertTempImage");
+this.connect(this.button,"onComplete","onComplete");
+},onComplete:function(_3,_4,_5){
+_3=_3[0];
+var _6=dojo.withGlobal(this.editor.window,"byId",dojo,[this.currentImageId]);
+var _7;
 if(this.downloadPath){
-_6=this.downloadPath+_2.name;
+_7=this.downloadPath+_3.name;
 }else{
-_6=_2.file;
+_7=_3.file;
 }
-_5.src=_6;
-if(_2.width){
-_5.width=_2.width;
-_5.height=_2.height;
+_6.src=_7;
+dojo.attr(_6,"_djrealurl",_7);
+if(_3.width){
+_6.width=_3.width;
+_6.height=_3.height;
 }
 },insertTempImage:function(){
 this.currentImageId="img_"+(new Date().getTime());
-var _7="<img id=\""+this.currentImageId+"\" src=\""+this.tempImageUrl+"\" width=\"32\" height=\"32\"/>";
-this.editor.execCommand("inserthtml",_7);
+var _8="<img id=\""+this.currentImageId+"\" src=\""+this.tempImageUrl+"\" width=\"32\" height=\"32\"/>";
+this.editor.execCommand("inserthtml",_8);
 }});
 dojo.subscribe(dijit._scopeName+".Editor.getPlugin",null,function(o){
 if(o.plugin){
diff --git a/dojox/editor/plugins/_SmileyPalette.js b/dojox/editor/plugins/_SmileyPalette.js
new file mode 100644
index 0000000..2fc0d52
--- /dev/null
+++ b/dojox/editor/plugins/_SmileyPalette.js
@@ -0,0 +1,129 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.editor.plugins._SmileyPalette"]){
+dojo._hasResource["dojox.editor.plugins._SmileyPalette"]=true;
+dojo.provide("dojox.editor.plugins._SmileyPalette");
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+dojo.require("dojo.i18n");
+dojo.requireLocalization("dojox.editor.plugins","Smiley",null,"ROOT");
+dojo.experimental("dojox.editor.plugins._SmileyPalette");
+dojo.declare("dojox.editor.plugins._SmileyPalette",[dijit._Widget,dijit._Templated],{templateString:"<div class=\"dojoxEntityPalette\">\n"+"<table>\n"+"<tbody>\n"+"<tr>\n"+"<td>\n"+"<table class=\"dojoxEntityPaletteTable\"  waiRole=\"grid\" tabIndex=\"${tabIndex}\">\n"+"<tbody dojoAttachPoint=\"tableNode\"></tbody>\n"+"</table>\n"+"</td>\n"+"</tr>\n"+"</tbody>\n"+"</table>\n"+"</div>",defaultTimeout:500,timeoutChangeRate:0.9,smileys:{emoticonSmile:":-)",emoticonLaughing:"lol",emoticonWin [...]
+if(!this._created){
+this._created=true;
+this.domNode.style.position="relative";
+this._cellNodes=[];
+var _1=0;
+var _2;
+for(_2 in this.smileys){
+_1++;
+}
+var _3=Math.floor(Math.sqrt(_1));
+var _4=_3;
+var _5=0;
+var _6=null;
+var _7;
+for(_2 in this.smileys){
+var _8=_5%_4===0;
+if(_8){
+_6=dojo.create("tr",{tabIndex:"-1"});
+}
+var _9=this.smileys[_2],_a=dojo.i18n.getLocalization("dojox.editor.plugins","Smiley")[_2];
+_7=dojo.create("td",{tabIndex:"-1","class":"dojoxEntityPaletteCell"},_6);
+var _b=dojo.create("img",{src:dojo.moduleUrl("dojox.editor.plugins","resources/emoticons/"+_2+".gif"),"class":"dojoxSmileyPaletteImg dojoxSmiley"+_2.charAt(0).toUpperCase()+_2.substring(1),title:_a,alt:_a},_7);
+dojo.forEach(["Dijitclick","MouseEnter","Focus","Blur"],function(_c){
+this.connect(_7,"on"+_c.toLowerCase(),"_onCell"+_c);
+},this);
+if(_8){
+dojo.place(_6,this.tableNode);
+}
+dijit.setWaiRole(_7,"gridcell");
+_7.index=this._cellNodes.length;
+this._cellNodes.push({node:_7,html:"<span class='"+_2+"'>"+this.smileys[_2]+"</span>"});
+_5++;
+}
+var _d=_3-(_1%_3);
+while(_d>0){
+_7=dojo.create("td",{innerHTML:"",tabIndex:"-1","class":"dojoxEntityPaletteNullCell"},_6);
+_d--;
+}
+this._xDim=_3;
+this._yDim=_4;
+this.connect(this.tableNode,"onfocus","_onTableNodeFocus");
+var _e={UP_ARROW:-this._xDim,DOWN_ARROW:this._xDim,RIGHT_ARROW:1,LEFT_ARROW:-1};
+for(var _f in _e){
+this._connects.push(dijit.typematic.addKeyListener(this.domNode,{charOrCode:dojo.keys[_f],ctrlKey:false,altKey:false,shiftKey:false},this,function(){
+var _10=_e[_f];
+return function(_11){
+this._navigateByKey(_10,_11);
+};
+}(),this.timeoutChangeRate,this.defaultTimeout));
+}
+}
+},focus:function(){
+this._focusFirst();
+},onChange:function(_12){
+},_focusFirst:function(){
+this._currentFocus=0;
+var _13=this._cellNodes[this._currentFocus].node;
+setTimeout(function(){
+dijit.focus(_13);
+},25);
+},_onTableNodeFocus:function(evt){
+if(evt.target===this.tableNode){
+this._focusFirst();
+}
+},_onFocus:function(){
+dojo.attr(this.tableNode,"tabIndex","-1");
+},_onBlur:function(){
+this._removeCellHighlight(this._currentFocus);
+dojo.attr(this.tableNode,"tabIndex",this.tabIndex);
+},_onCellDijitclick:function(evt){
+var _14=evt.currentTarget;
+if(this._currentFocus!=_14.index){
+this._currentFocus=_14.index;
+setTimeout(function(){
+dijit.focus(_14);
+},0);
+}
+this._selectEntity(_14);
+dojo.stopEvent(evt);
+},_onCellMouseEnter:function(evt){
+var _15=evt.currentTarget;
+this._setCurrent(_15);
+setTimeout(function(){
+dijit.focus(_15);
+},0);
+},_onCellFocus:function(evt){
+this._setCurrent(evt.currentTarget);
+},_setCurrent:function(_16){
+this._removeCellHighlight(this._currentFocus);
+this._currentFocus=_16.index;
+dojo.addClass(_16,"dojoxEntityPaletteCellHighlight");
+},_onCellBlur:function(evt){
+this._removeCellHighlight(this._currentFocus);
+},_removeCellHighlight:function(_17){
+dojo.removeClass(this._cellNodes[_17].node,"dojoxEntityPaletteCellHighlight");
+},_selectEntity:function(_18){
+var _19=dojo.filter(this._cellNodes,function(_1a){
+return _1a.node==_18;
+});
+if(_19.length>0){
+this.onChange(this.value=_19[0].html);
+}
+},_navigateByKey:function(_1b,_1c){
+if(_1c==-1){
+return;
+}
+var _1d=this._currentFocus+_1b;
+if(_1d<this._cellNodes.length&&_1d>-1){
+var _1e=this._cellNodes[_1d].node;
+_1e.focus();
+}
+}});
+}
diff --git a/dojox/editor/plugins/nls/Breadcrumb.js b/dojox/editor/plugins/nls/Breadcrumb.js
new file mode 100644
index 0000000..c498573
--- /dev/null
+++ b/dojox/editor/plugins/nls/Breadcrumb.js
@@ -0,0 +1 @@
+({"selectContents":"Select contents","deleteElement":"Delete element","moveEnd":"Move cursor to end","deleteContents":"Delete contents","nodeActions":"${nodeName} Actions","selectElement":"Select element","moveStart":"Move cursor to start"})
\ No newline at end of file
diff --git a/dojox/editor/plugins/nls/FindReplace.js b/dojox/editor/plugins/nls/FindReplace.js
new file mode 100644
index 0000000..cb40bc4
--- /dev/null
+++ b/dojox/editor/plugins/nls/FindReplace.js
@@ -0,0 +1 @@
+({"backwards":"Backwards","findReplace":"Toggle Find/Replace","replaceAll":"All Occurances","replaceDialogText":"Replaced ${0} occurances.","replaceButton":"Replace","findButton":"Find","findLabel":"Find what:","matchCase":"Match Case","replaceLabel":"Replace with:"})
\ No newline at end of file
diff --git a/dojox/editor/plugins/nls/InsertEntity.js b/dojox/editor/plugins/nls/InsertEntity.js
new file mode 100644
index 0000000..7914b89
--- /dev/null
+++ b/dojox/editor/plugins/nls/InsertEntity.js
@@ -0,0 +1 @@
+({"insertEntity":"Insert Symbol"})
\ No newline at end of file
diff --git a/dojox/editor/plugins/nls/PageBreak.js b/dojox/editor/plugins/nls/PageBreak.js
new file mode 100644
index 0000000..4eaca96
--- /dev/null
+++ b/dojox/editor/plugins/nls/PageBreak.js
@@ -0,0 +1 @@
+({"pageBreak":"Page Break"})
\ No newline at end of file
diff --git a/dojox/editor/plugins/nls/Preview.js b/dojox/editor/plugins/nls/Preview.js
new file mode 100644
index 0000000..f54aeb4
--- /dev/null
+++ b/dojox/editor/plugins/nls/Preview.js
@@ -0,0 +1 @@
+({"preview":"Preview"})
\ No newline at end of file
diff --git a/dojox/editor/plugins/nls/Save.js b/dojox/editor/plugins/nls/Save.js
new file mode 100644
index 0000000..8f8072a
--- /dev/null
+++ b/dojox/editor/plugins/nls/Save.js
@@ -0,0 +1 @@
+({"save":"Save"})
\ No newline at end of file
diff --git a/dojox/editor/plugins/nls/ShowBlockNodes.js b/dojox/editor/plugins/nls/ShowBlockNodes.js
new file mode 100644
index 0000000..d9c3dbd
--- /dev/null
+++ b/dojox/editor/plugins/nls/ShowBlockNodes.js
@@ -0,0 +1 @@
+({"showBlockNodes":"Show HTML Block Elements"})
\ No newline at end of file
diff --git a/dojox/editor/plugins/nls/Smiley.js b/dojox/editor/plugins/nls/Smiley.js
new file mode 100644
index 0000000..6a6b5a2
--- /dev/null
+++ b/dojox/editor/plugins/nls/Smiley.js
@@ -0,0 +1 @@
+({"emoticonLaughing":"laughing","emoticonCool":"cool","emoticonTongue":"tongue","emoticonCrying":"crying","emoticonOops":"oops","emoticonFrown":"frown","emoticonAngry":"angry","emoticonShy":"shy","emoticonNo":"no","emoticonAngel":"angel","smiley":"Insert Emoticon","emoticonIdea":"idea","emoticonEyebrow":"eyebrow","emoticonSmile":"smile","emoticonWink":"wink","emoticonYes":"yes","emoticonGrin":"grin","emoticonGoofy":"goofy","emoticonHalf":"half"})
\ No newline at end of file
diff --git a/dojox/editor/plugins/nls/ko/Breadcrumb.js b/dojox/editor/plugins/nls/ko/Breadcrumb.js
new file mode 100644
index 0000000..135aaf6
--- /dev/null
+++ b/dojox/editor/plugins/nls/ko/Breadcrumb.js
@@ -0,0 +1 @@
+({"selectContents":"내용 선택","deleteElement":"요소 삭제","moveEnd":"커서를 끝 위치로 이동","deleteContents":"내용 삭제","nodeActions":"${nodeName} 동작","selectElement":"요소 선택","moveStart":"커서를 시작 위치로 이동"})
\ No newline at end of file
diff --git a/dojox/editor/plugins/nls/ko/FindReplace.js b/dojox/editor/plugins/nls/ko/FindReplace.js
new file mode 100644
index 0000000..2394dc5
--- /dev/null
+++ b/dojox/editor/plugins/nls/ko/FindReplace.js
@@ -0,0 +1 @@
+({"backwards":"뒷방향으로","findReplace":"찾기/바꾸기 토글","replaceAll":"모두 바꾸기","replaceDialogText":"${0} 개의 내용이 변경되었습니다.","replaceButton":"바꾸기","findButton":"찾기","findLabel":"찾을 내용:","matchCase":"대소문자 구분","replaceLabel":"바꿀 내용:"})
\ No newline at end of file
diff --git a/dojox/editor/plugins/nls/ko/InsertEntity.js b/dojox/editor/plugins/nls/ko/InsertEntity.js
new file mode 100644
index 0000000..ecd4c99
--- /dev/null
+++ b/dojox/editor/plugins/nls/ko/InsertEntity.js
@@ -0,0 +1 @@
+({"insertEntity":"기호 넣기"})
\ No newline at end of file
diff --git a/dojox/editor/plugins/nls/ko/PageBreak.js b/dojox/editor/plugins/nls/ko/PageBreak.js
new file mode 100644
index 0000000..c1b76c1
--- /dev/null
+++ b/dojox/editor/plugins/nls/ko/PageBreak.js
@@ -0,0 +1 @@
+({"pageBreak":"쪽 나누기"})
\ No newline at end of file
diff --git a/dojox/editor/plugins/nls/ko/Preview.js b/dojox/editor/plugins/nls/ko/Preview.js
new file mode 100644
index 0000000..418b88d
--- /dev/null
+++ b/dojox/editor/plugins/nls/ko/Preview.js
@@ -0,0 +1 @@
+({"preview":"미리보기"})
\ No newline at end of file
diff --git a/dojox/editor/plugins/nls/ko/Save.js b/dojox/editor/plugins/nls/ko/Save.js
new file mode 100644
index 0000000..0e3436e
--- /dev/null
+++ b/dojox/editor/plugins/nls/ko/Save.js
@@ -0,0 +1 @@
+({"save":"저장"})
\ No newline at end of file
diff --git a/dojox/editor/plugins/nls/ko/ShowBlockNodes.js b/dojox/editor/plugins/nls/ko/ShowBlockNodes.js
new file mode 100644
index 0000000..79da1ea
--- /dev/null
+++ b/dojox/editor/plugins/nls/ko/ShowBlockNodes.js
@@ -0,0 +1 @@
+({"showBlockNodes":"HTML 블록 요소 보이기"})
\ No newline at end of file
diff --git a/dojox/editor/plugins/nls/latinEntities.js b/dojox/editor/plugins/nls/latinEntities.js
new file mode 100644
index 0000000..f49065e
--- /dev/null
+++ b/dojox/editor/plugins/nls/latinEntities.js
@@ -0,0 +1 @@
+({"le":"less-than or equal to","prod":"n-ary product\nproduct sign","zwj":"zero width joiner","mdash":"em dash","frasl":"fraction slash","upsih":"Greek upsilon with hook symbol","prop":"proportional to","middot":"middle dot\nGeorgian comma\nGreek middle dot","hellip":"horizontal ellipsis\nthree dot leader","eta":"Greek small letter eta","iacute":"Latin small letter i with acute","yen":"yen sign\nyuan sign","rlm":"right-to-left mark","macr":"macron\nspacing macron\noverline\nAPL overbar", [...]
\ No newline at end of file
diff --git a/dojox/editor/plugins/nls/sk/TableDialog.js b/dojox/editor/plugins/nls/sk/TableDialog.js
index b8882f9..94a37ab 100644
--- a/dojox/editor/plugins/nls/sk/TableDialog.js
+++ b/dojox/editor/plugins/nls/sk/TableDialog.js
@@ -1 +1 @@
-({"buttonSet":"Nastaviť","insertTableTitle":"Vložiť tabuľku","insertTableRowAfterLabel":"Pridať riadok za","center":"v strede","deleteTableColumnLabel":"Vymazať stĺpec","right":"vpravo","insertTableColumnBeforeLabel":"Pridať stĺpec pred","tableWidth":"Šírka tabuľky:","buttonInsert":"Vložiť","default":"predvolená hodnota","align":"Zarovnať:","insertTableRowBeforeLabel":"Pridať riadok pred","cellSpacing":"Riadkovanie bunky:","pixels":"pixely","selectTableLabel":"Vybrať tabuľku","rows":"Ria [...]
\ No newline at end of file
+({"buttonSet":"Nastaviť","insertTableTitle":"Vložiť tabuľku","insertTableRowAfterLabel":"Pridať riadok za","center":"na stred","deleteTableColumnLabel":"Vymazať stĺpec","right":"vpravo","insertTableColumnBeforeLabel":"Pridať stĺpec pred","tableWidth":"Šírka tabuľky:","buttonInsert":"Vložiť","default":"štandardne","align":"Zarovnať:","insertTableRowBeforeLabel":"Pridať riadok pred","cellSpacing":"Rozstupy buniek:","pixels":"pixely","selectTableLabel":"Vybrať tabuľku","rows":"Riadky:","mod [...]
\ No newline at end of file
diff --git a/dojox/editor/plugins/nls/sl/TableDialog.js b/dojox/editor/plugins/nls/sl/TableDialog.js
index 974afd7..22446e9 100644
--- a/dojox/editor/plugins/nls/sl/TableDialog.js
+++ b/dojox/editor/plugins/nls/sl/TableDialog.js
@@ -1 +1 @@
-({"buttonSet":"Nastavi","insertTableTitle":"Vstavi tabelo","insertTableRowAfterLabel":"Dodaj vrstico za","center":"sredina","deleteTableColumnLabel":"Izbriši stolpec","right":"desno","insertTableColumnBeforeLabel":"Dodaj stolpec pred","tableWidth":"Širina tabele:","buttonInsert":"Vstavi","default":"privzeto","align":"Poravnaj:","insertTableRowBeforeLabel":"Dodaj vrstico pred","cellSpacing":"Razmik med celicami:","pixels":"piksli","selectTableLabel":"Izberi tabelo","rows":"Vrstice:","modi [...]
\ No newline at end of file
+({"buttonSet":"Nastavi","insertTableTitle":"Vstavi tabelo","insertTableRowAfterLabel":"Dodaj vrstico za","center":"na sredini","deleteTableColumnLabel":"Izbriši stolpec","right":"desno","insertTableColumnBeforeLabel":"Dodaj stolpec pred","tableWidth":"Širina tabele:","buttonInsert":"Vstavi","default":"privzeto","align":"Poravnaj:","insertTableRowBeforeLabel":"Dodaj vrstico pred","cellSpacing":"Razmik med celicami:","pixels":"pikslov","selectTableLabel":"Izberi tabelo","rows":"Vrstice:"," [...]
\ No newline at end of file
diff --git a/dojox/editor/plugins/resources/css/Breadcrumb.css b/dojox/editor/plugins/resources/css/Breadcrumb.css
new file mode 100644
index 0000000..32b5c17
--- /dev/null
+++ b/dojox/editor/plugins/resources/css/Breadcrumb.css
@@ -0,0 +1,10 @@
+.dojoxEditorBreadcrumbArrow .dijitDownArrowButton {
+	width: 10px;
+}
+.dojoxEditorBreadcrumbArrow .dijitArrowButtonInner {
+	background-image: url(../icons/breadcrumbDown.gif);
+	background-repeat: no-repeat;
+	background-position: center center;
+	width: 8px;
+	height: 8px;
+}
diff --git a/dojox/editor/plugins/resources/css/FindReplace.css b/dojox/editor/plugins/resources/css/FindReplace.css
new file mode 100644
index 0000000..265925b
--- /dev/null
+++ b/dojox/editor/plugins/resources/css/FindReplace.css
@@ -0,0 +1,59 @@
+.dijitAdditionalEditorIconFindReplace {
+        background-image: url(../icons/findReplace.gif);
+        background-repeat: no-repeat;
+        background-position: center center;
+        width: 18px;
+        height: 18px;
+}
+.dijitDisabled .dijitAdditionalEditorIconFindReplace {
+        background-image: url(../icons/findReplaceDisabled.gif);
+        background-repeat: no-repeat;
+        background-position: center center;
+        width: 18px;
+        height: 18px;
+}
+.dijitAdditionalEditorIconFindRun {
+        background-image: url(../icons/findIcon.gif);
+        background-repeat: no-repeat;
+        background-position: center center;
+        width: 18px;
+        height: 18px;
+        padding-left: 5px;
+        padding-right: 5px;
+}
+.dijitAdditionalEditorIconReplaceRun {
+        background-image: url(../icons/replaceIcon.gif);
+        background-repeat: no-repeat;
+        background-position: center center;
+        width: 18px;
+        height: 18px;
+        padding-left: 5px;
+        padding-right: 5px;
+}
+.dijitDisabled .dijitAdditionalEditorIconFindRun {
+        background-image: url(../icons/findIconDisabled.gif);
+        background-repeat: no-repeat;
+        background-position: center center;
+        width: 18px;
+        height: 18px;
+        padding-left: 5px;
+        padding-right: 5px;
+}
+.dijitDisabled .dijitAdditionalEditorIconReplaceRun {
+        background-image: url(../icons/replaceIconDisabled.gif);
+        background-repeat: no-repeat;
+        background-position: center center;
+        width: 18px;
+        height: 18px;
+        padding-left: 5px;
+        padding-right: 5px;
+}
+.findReplaceCheckBox {
+        padding-left: 10px;
+        padding-right: 10px;
+        text-align: center;
+}
+.findReplaceTextBox {
+        padding-top: 3px;
+        padding-bottom: 3px;
+}
diff --git a/dojox/editor/plugins/resources/css/InsertEntity.css b/dojox/editor/plugins/resources/css/InsertEntity.css
new file mode 100644
index 0000000..735a8bb
--- /dev/null
+++ b/dojox/editor/plugins/resources/css/InsertEntity.css
@@ -0,0 +1,80 @@
+.dijitAdditionalEditorIconInsertEntity {
+	background-image: url(../icons/insertEntity.gif);
+	background-repeat: no-repeat;
+	background-position: center center;
+	width: 18px;
+	height: 18px;
+}
+.dijitDisabled .dijitAdditionalEditorIconInsertEntity {
+	background-image: url(../icons/insertEntityDisabled.gif);
+	background-repeat: no-repeat;
+	background-position: center center;
+	width: 18px;
+	height: 18px;
+}
+.dojoxEntityPalette {
+	border:1px solid #999;
+	background:#fff;
+	-moz-border-radius:3pt;
+}
+.dojoxEntityPaletteTable {
+	position: relative;
+	overflow:hidden;
+	outline-color: black;
+	outline-style: none;
+	outline-width: 0;
+	border: 0px solid black;
+	border-collapse: separate;
+	border-spacing: 2px;
+	margin: 2px;
+	table-layout: auto;
+}
+.dojoxEntityPaletteCell {
+	border: 1px dotted gray;
+	width: 20px;
+	height: 20px;
+	overflow: hidden;
+	z-index: 10;
+	text-align: center;
+}
+.dojoxEntityPaletteNullCell {
+	border: none;
+	width: 20px;
+	height: 20px;
+	overflow: hidden;
+}
+.dojoxEntityPaletteCellHighlight {
+	width: 16px; 
+	height: 14px; 
+	overflow: hidden;
+	cursor: default;
+	border:2px solid #000;
+	outline:1px solid #dedede;
+}
+.dojoxEntityPalettePreviewTable {
+	table-layout: auto;
+	font-size: 1em;
+	width: 100%;
+}
+.dojoxEntityPalettePreviewHeader {
+	font-size: .8em;
+	padding: 3px 3px 3px 3px;
+}
+.dojoxEntityPalettePreviewDetailEntity {
+	font-size: 3em;
+	font-weight: bold;
+	width: 1em;
+	text-align: center;
+}
+.dojoxEntityPalettePreviewDetail {
+	font-size: 1em;
+	vertical-align: middle;
+	font-weight: bold;
+	padding: 3px 3px 3px 3px;
+}
+.dijit_a11y .dojoxEntityPaletteCell {
+	background-color:transparent !important;
+}
+.dijit_a11y .dojoxEntityPaletteImg {
+	background-color:transparent !important;
+}
diff --git a/dojox/editor/plugins/resources/css/PageBreak.css b/dojox/editor/plugins/resources/css/PageBreak.css
new file mode 100644
index 0000000..1a2bcd6
--- /dev/null
+++ b/dojox/editor/plugins/resources/css/PageBreak.css
@@ -0,0 +1,14 @@
+.dijitAdditionalEditorIconPageBreak {
+	background-image: url(../icons/pageBreak.gif);
+	background-repeat: no-repeat;
+	background-position: center center;
+	width: 18px;
+	height: 18px;
+}
+.dijitDisabled .dijitAdditionalEditorIconPageBreak {
+	background-image: url(../icons/pageBreakDisabled.gif);
+	background-repeat: no-repeat;
+	background-position: center center;
+	width: 18px;
+	height: 18px;
+}
diff --git a/dojox/editor/plugins/resources/css/Preview.css b/dojox/editor/plugins/resources/css/Preview.css
new file mode 100644
index 0000000..a5541eb
--- /dev/null
+++ b/dojox/editor/plugins/resources/css/Preview.css
@@ -0,0 +1,14 @@
+.dijitAdditionalEditorIconPreview {
+	background-image: url(../icons/preview.gif);
+	background-repeat: no-repeat;
+	background-position: center center;
+	width: 18px;
+	height: 18px;
+}
+.dijitDisabled .dijitAdditionalEditorIconPreview {
+	background-image: url(../icons/previewDisabled.gif);
+	background-repeat: no-repeat;
+	background-position: center center;
+	width: 18px;
+	height: 18px;
+}
diff --git a/dojox/editor/plugins/resources/css/Save.css b/dojox/editor/plugins/resources/css/Save.css
new file mode 100644
index 0000000..8970c56
--- /dev/null
+++ b/dojox/editor/plugins/resources/css/Save.css
@@ -0,0 +1,14 @@
+.dijitAdditionalEditorIconSave {
+	background-image: url(../icons/save.gif);
+	background-repeat: no-repeat;
+	background-position: center center;
+	width: 18px;
+	height: 18px;
+}
+.dijitDisabled .dijitAdditionalEditorIconSave {
+	background-image: url(../icons/saveDisabled.gif);
+	background-repeat: no-repeat;
+	background-position: center center;
+	width: 18px;
+	height: 18px;
+}
diff --git a/dojox/editor/plugins/resources/css/ShowBlockNodes.css b/dojox/editor/plugins/resources/css/ShowBlockNodes.css
new file mode 100644
index 0000000..8283480
--- /dev/null
+++ b/dojox/editor/plugins/resources/css/ShowBlockNodes.css
@@ -0,0 +1,14 @@
+.dijitAdditionalEditorIconShowBlockNodes {
+	background-image: url(../icons/showBlockNodes.gif);
+	background-repeat: no-repeat;
+	background-position: center center;
+	width: 18px;
+	height: 18px;
+}
+.dijitDisabled .dijitAdditionalEditorIconShowBlockNodes {
+	background-image: url(../icons/showBlockNodesDisabled.gif);
+	background-repeat: no-repeat;
+	background-position: center center;
+	width: 18px;
+	height: 18px;
+}
diff --git a/dojox/editor/plugins/resources/css/Smiley.css b/dojox/editor/plugins/resources/css/Smiley.css
new file mode 100644
index 0000000..454f300
--- /dev/null
+++ b/dojox/editor/plugins/resources/css/Smiley.css
@@ -0,0 +1,69 @@
+.dijitAdditionalEditorIconSmiley {
+	background-image: url(../icons/smiley.gif);
+	background-repeat: no-repeat;
+	background-position: center center;
+	width: 18px;
+	height: 18px;
+}
+.dijitDisabled .dijitAdditionalEditorIconSmiley {
+	background-image: url(../icons/insertEntityDisabled.gif); 
+	background-repeat: no-repeat;
+	background-position: center center;
+	width: 18px;
+	height: 18px;
+}
+.dojoxEntityPalette {
+	border:1px solid #999;
+	background:#fff;
+	-moz-border-radius:3pt;
+}
+.dojoxEntityPaletteTable {
+	position: relative;
+	overflow:hidden;
+	outline-color: black;
+	outline-style: none;
+	outline-width: 0;
+	border: 0px solid black;
+	border-collapse: separate;
+	border-spacing: 2px;
+	margin: 2px;
+	table-layout: auto;
+}
+.dojoxEntityPaletteCell {
+	border: 1px dotted gray;
+	width: 20px;
+	height: 20px;
+	overflow: hidden;
+	z-index: 10;
+	text-align: center;
+}
+.dojoxEntityPaletteNullCell {
+	border: none;
+	width: 20px;
+	height: 20px;
+	overflow: hidden;
+}
+.dojoxEntityPaletteCellHighlight {
+	width: 16px; 
+	height: 14px; 
+	overflow: hidden;
+	cursor: default;
+	border:2px solid #000;
+	outline:1px solid #dedede;
+}
+.dijit_a11y .dojoxEntityPaletteCell {
+	background-color:transparent !important;
+}
+.dijit_a11y .dojoxSmileyPaletteImg {
+	background-color:transparent !important;
+}
+.dojoxSmileyPaletteImg {
+	width: 16px; 
+	height: 14px; 
+	top: 1px;
+	left: 1px;
+	overflow: hidden;
+	cursor: default;
+	border:1px solid #999;
+	
+}
diff --git a/dojox/editor/plugins/resources/editorPlugins.css b/dojox/editor/plugins/resources/editorPlugins.css
index 0e6b71d..b3db6ce 100644
--- a/dojox/editor/plugins/resources/editorPlugins.css
+++ b/dojox/editor/plugins/resources/editorPlugins.css
@@ -119,24 +119,49 @@
 	width: 5em;
 }
 .dojoxDropDownSelect {
-background:#FFFFFF url(images/dropBk.png) repeat-x scroll left top;
-border: 1px solid;
-border-top-color:#cccccc;
-border-right-color:#cccccc;
-border-left-color:#999999;
-border-bottom-color:#ffffff;
+	background:#FFFFFF url(images/dropBk.png) repeat-x scroll left top;
+	border: 1px solid;
+	border-top-color:#cccccc;
+	border-right-color:#cccccc;
+	border-left-color:#999999;
+	border-bottom-color:#ffffff;
 }
 .dojoxDropDownSelect.dojoxDropDownSelectHover{
-background-image:url(images/dropBkOver.png);
+	background-image:url(images/dropBkOver.png);
 }
 .dojoxDropDownSelect button{
-line-height:16px;
-height:16px;
-width:100px;
-text-align:left;
-color:#8397b9;
+	line-height:16px;
+	height:16px;
+	width:100px;
+	text-align:left;
+	color:#8397b9;
 }
 .dijitButtonNode .dijitArrowButtonInner{
-background:url(../../../../dijit/themes/tundra/images/spriteArrows.png) no-repeat left top;
-width:7px;
+	
+	background:url(../../../../dijit/themes/tundra/images/spriteArrows.png) no-repeat left top;
+	width:7px;
+}
+.dojoxEditorUploadNorm{
+	font-family:Arial;
+	font-size:12px;
+	
+	
+	vertical-align: middle;
+	
+	margin:0;
+	line-height:normal;
+	text-align:center;
+	white-space: nowrap;
+	
+	cursor: pointer;
+	background: #ccc url("images/uploadImageIcon.gif") no-repeat 2px 2px;
+}
+.dojoxEditorUploadHover{
+	background: #ccc url("images/uploadImageIcon.gif") no-repeat 2px 0px;
+}
+.dojoxEditorUploadActive{
+	background: #ccc url("images/uploadImageIcon.gif") no-repeat 2px 4px;
+}
+.dojoxEditorUploadDisabled{
+	background: #ccc url("images/uploadImageIcon.gif") no-repeat 2px 2px;
 }
diff --git a/dojox/editor/plugins/resources/emoticons/emoticonAngel.gif b/dojox/editor/plugins/resources/emoticons/emoticonAngel.gif
new file mode 100644
index 0000000..8841b9b
Binary files /dev/null and b/dojox/editor/plugins/resources/emoticons/emoticonAngel.gif differ
diff --git a/dojox/editor/plugins/resources/emoticons/emoticonAngry.gif b/dojox/editor/plugins/resources/emoticons/emoticonAngry.gif
new file mode 100644
index 0000000..8290ee0
Binary files /dev/null and b/dojox/editor/plugins/resources/emoticons/emoticonAngry.gif differ
diff --git a/dojox/editor/plugins/resources/emoticons/emoticonCool.gif b/dojox/editor/plugins/resources/emoticons/emoticonCool.gif
new file mode 100644
index 0000000..3583c92
Binary files /dev/null and b/dojox/editor/plugins/resources/emoticons/emoticonCool.gif differ
diff --git a/dojox/editor/plugins/resources/emoticons/emoticonCrying.gif b/dojox/editor/plugins/resources/emoticons/emoticonCrying.gif
new file mode 100644
index 0000000..9e9c6ac
Binary files /dev/null and b/dojox/editor/plugins/resources/emoticons/emoticonCrying.gif differ
diff --git a/dojox/editor/plugins/resources/emoticons/emoticonEyebrow.gif b/dojox/editor/plugins/resources/emoticons/emoticonEyebrow.gif
new file mode 100644
index 0000000..bb150ef
Binary files /dev/null and b/dojox/editor/plugins/resources/emoticons/emoticonEyebrow.gif differ
diff --git a/dojox/editor/plugins/resources/emoticons/emoticonFrown.gif b/dojox/editor/plugins/resources/emoticons/emoticonFrown.gif
new file mode 100644
index 0000000..a47c099
Binary files /dev/null and b/dojox/editor/plugins/resources/emoticons/emoticonFrown.gif differ
diff --git a/dojox/editor/plugins/resources/emoticons/emoticonGoofy.gif b/dojox/editor/plugins/resources/emoticons/emoticonGoofy.gif
new file mode 100644
index 0000000..8b4d860
Binary files /dev/null and b/dojox/editor/plugins/resources/emoticons/emoticonGoofy.gif differ
diff --git a/dojox/editor/plugins/resources/emoticons/emoticonGrin.gif b/dojox/editor/plugins/resources/emoticons/emoticonGrin.gif
new file mode 100644
index 0000000..692a201
Binary files /dev/null and b/dojox/editor/plugins/resources/emoticons/emoticonGrin.gif differ
diff --git a/dojox/editor/plugins/resources/emoticons/emoticonHalf.gif b/dojox/editor/plugins/resources/emoticons/emoticonHalf.gif
new file mode 100644
index 0000000..2d7e10a
Binary files /dev/null and b/dojox/editor/plugins/resources/emoticons/emoticonHalf.gif differ
diff --git a/dojox/editor/plugins/resources/emoticons/emoticonHappy.gif b/dojox/editor/plugins/resources/emoticons/emoticonHappy.gif
new file mode 100644
index 0000000..dc8f87f
Binary files /dev/null and b/dojox/editor/plugins/resources/emoticons/emoticonHappy.gif differ
diff --git a/dojox/editor/plugins/resources/emoticons/emoticonIdea.gif b/dojox/editor/plugins/resources/emoticons/emoticonIdea.gif
new file mode 100644
index 0000000..11af180
Binary files /dev/null and b/dojox/editor/plugins/resources/emoticons/emoticonIdea.gif differ
diff --git a/dojox/editor/plugins/resources/emoticons/emoticonLaughing.gif b/dojox/editor/plugins/resources/emoticons/emoticonLaughing.gif
new file mode 100644
index 0000000..23192d4
Binary files /dev/null and b/dojox/editor/plugins/resources/emoticons/emoticonLaughing.gif differ
diff --git a/dojox/editor/plugins/resources/emoticons/emoticonNo.gif b/dojox/editor/plugins/resources/emoticons/emoticonNo.gif
new file mode 100644
index 0000000..03170df
Binary files /dev/null and b/dojox/editor/plugins/resources/emoticons/emoticonNo.gif differ
diff --git a/dojox/editor/plugins/resources/emoticons/emoticonOops.gif b/dojox/editor/plugins/resources/emoticons/emoticonOops.gif
new file mode 100644
index 0000000..38bd4a0
Binary files /dev/null and b/dojox/editor/plugins/resources/emoticons/emoticonOops.gif differ
diff --git a/dojox/editor/plugins/resources/emoticons/emoticonShy.gif b/dojox/editor/plugins/resources/emoticons/emoticonShy.gif
new file mode 100644
index 0000000..de0ccf6
Binary files /dev/null and b/dojox/editor/plugins/resources/emoticons/emoticonShy.gif differ
diff --git a/dojox/editor/plugins/resources/emoticons/emoticonSmile.gif b/dojox/editor/plugins/resources/emoticons/emoticonSmile.gif
new file mode 100644
index 0000000..d5b73a6
Binary files /dev/null and b/dojox/editor/plugins/resources/emoticons/emoticonSmile.gif differ
diff --git a/dojox/editor/plugins/resources/emoticons/emoticonTongue.gif b/dojox/editor/plugins/resources/emoticons/emoticonTongue.gif
new file mode 100644
index 0000000..e578c6a
Binary files /dev/null and b/dojox/editor/plugins/resources/emoticons/emoticonTongue.gif differ
diff --git a/dojox/editor/plugins/resources/emoticons/emoticonWink.gif b/dojox/editor/plugins/resources/emoticons/emoticonWink.gif
new file mode 100644
index 0000000..8e262ae
Binary files /dev/null and b/dojox/editor/plugins/resources/emoticons/emoticonWink.gif differ
diff --git a/dojox/editor/plugins/resources/emoticons/emoticonYes.gif b/dojox/editor/plugins/resources/emoticons/emoticonYes.gif
new file mode 100644
index 0000000..9473c7f
Binary files /dev/null and b/dojox/editor/plugins/resources/emoticons/emoticonYes.gif differ
diff --git a/dojox/editor/plugins/resources/icons/breadcrumbDown.gif b/dojox/editor/plugins/resources/icons/breadcrumbDown.gif
new file mode 100644
index 0000000..782efe7
Binary files /dev/null and b/dojox/editor/plugins/resources/icons/breadcrumbDown.gif differ
diff --git a/dojox/editor/plugins/resources/icons/findIcon.gif b/dojox/editor/plugins/resources/icons/findIcon.gif
new file mode 100644
index 0000000..93354f4
Binary files /dev/null and b/dojox/editor/plugins/resources/icons/findIcon.gif differ
diff --git a/dojox/editor/plugins/resources/icons/findIconDisabled.gif b/dojox/editor/plugins/resources/icons/findIconDisabled.gif
new file mode 100644
index 0000000..e7a897b
Binary files /dev/null and b/dojox/editor/plugins/resources/icons/findIconDisabled.gif differ
diff --git a/dojox/editor/plugins/resources/icons/findReplace.gif b/dojox/editor/plugins/resources/icons/findReplace.gif
new file mode 100644
index 0000000..d540a01
Binary files /dev/null and b/dojox/editor/plugins/resources/icons/findReplace.gif differ
diff --git a/dojox/editor/plugins/resources/icons/findReplaceDisabled.gif b/dojox/editor/plugins/resources/icons/findReplaceDisabled.gif
new file mode 100644
index 0000000..9f2f010
Binary files /dev/null and b/dojox/editor/plugins/resources/icons/findReplaceDisabled.gif differ
diff --git a/dojox/editor/plugins/resources/icons/insertEntity.gif b/dojox/editor/plugins/resources/icons/insertEntity.gif
new file mode 100644
index 0000000..5eb8584
Binary files /dev/null and b/dojox/editor/plugins/resources/icons/insertEntity.gif differ
diff --git a/dojox/editor/plugins/resources/icons/insertEntityDisabled.gif b/dojox/editor/plugins/resources/icons/insertEntityDisabled.gif
new file mode 100644
index 0000000..f019818
Binary files /dev/null and b/dojox/editor/plugins/resources/icons/insertEntityDisabled.gif differ
diff --git a/dojox/editor/plugins/resources/icons/pageBreak.gif b/dojox/editor/plugins/resources/icons/pageBreak.gif
new file mode 100644
index 0000000..1cc4317
Binary files /dev/null and b/dojox/editor/plugins/resources/icons/pageBreak.gif differ
diff --git a/dojox/editor/plugins/resources/icons/pageBreakDisabled.gif b/dojox/editor/plugins/resources/icons/pageBreakDisabled.gif
new file mode 100644
index 0000000..511fa06
Binary files /dev/null and b/dojox/editor/plugins/resources/icons/pageBreakDisabled.gif differ
diff --git a/dojox/editor/plugins/resources/icons/preview.gif b/dojox/editor/plugins/resources/icons/preview.gif
new file mode 100644
index 0000000..ef30288
Binary files /dev/null and b/dojox/editor/plugins/resources/icons/preview.gif differ
diff --git a/dojox/editor/plugins/resources/icons/previewDisabled.gif b/dojox/editor/plugins/resources/icons/previewDisabled.gif
new file mode 100644
index 0000000..b7f223b
Binary files /dev/null and b/dojox/editor/plugins/resources/icons/previewDisabled.gif differ
diff --git a/dojox/editor/plugins/resources/icons/replaceIcon.gif b/dojox/editor/plugins/resources/icons/replaceIcon.gif
new file mode 100644
index 0000000..0d1f1e3
Binary files /dev/null and b/dojox/editor/plugins/resources/icons/replaceIcon.gif differ
diff --git a/dojox/editor/plugins/resources/icons/replaceIconDisabled.gif b/dojox/editor/plugins/resources/icons/replaceIconDisabled.gif
new file mode 100644
index 0000000..261f5b0
Binary files /dev/null and b/dojox/editor/plugins/resources/icons/replaceIconDisabled.gif differ
diff --git a/dojox/editor/plugins/resources/icons/save.gif b/dojox/editor/plugins/resources/icons/save.gif
new file mode 100644
index 0000000..499dd0c
Binary files /dev/null and b/dojox/editor/plugins/resources/icons/save.gif differ
diff --git a/dojox/editor/plugins/resources/icons/saveDisabled.gif b/dojox/editor/plugins/resources/icons/saveDisabled.gif
new file mode 100644
index 0000000..ad505a9
Binary files /dev/null and b/dojox/editor/plugins/resources/icons/saveDisabled.gif differ
diff --git a/dojox/editor/plugins/resources/icons/showBlockNodes.gif b/dojox/editor/plugins/resources/icons/showBlockNodes.gif
new file mode 100644
index 0000000..4c58ae2
Binary files /dev/null and b/dojox/editor/plugins/resources/icons/showBlockNodes.gif differ
diff --git a/dojox/editor/plugins/resources/icons/showBlockNodesDisabled.gif b/dojox/editor/plugins/resources/icons/showBlockNodesDisabled.gif
new file mode 100644
index 0000000..f8bc7c6
Binary files /dev/null and b/dojox/editor/plugins/resources/icons/showBlockNodesDisabled.gif differ
diff --git a/dojox/editor/plugins/resources/icons/smiley.gif b/dojox/editor/plugins/resources/icons/smiley.gif
new file mode 100644
index 0000000..d5b73a6
Binary files /dev/null and b/dojox/editor/plugins/resources/icons/smiley.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/address.gif b/dojox/editor/plugins/resources/images/blockelems/address.gif
new file mode 100644
index 0000000..5f94757
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/address.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/blockquote.gif b/dojox/editor/plugins/resources/images/blockelems/blockquote.gif
new file mode 100644
index 0000000..8eff804
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/blockquote.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/button.gif b/dojox/editor/plugins/resources/images/blockelems/button.gif
new file mode 100644
index 0000000..a95518d
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/button.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/center.gif b/dojox/editor/plugins/resources/images/blockelems/center.gif
new file mode 100644
index 0000000..de55735
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/center.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/dd.gif b/dojox/editor/plugins/resources/images/blockelems/dd.gif
new file mode 100644
index 0000000..5a87895
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/dd.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/del.gif b/dojox/editor/plugins/resources/images/blockelems/del.gif
new file mode 100644
index 0000000..f2b647d
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/del.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/div.gif b/dojox/editor/plugins/resources/images/blockelems/div.gif
new file mode 100644
index 0000000..3ad71ca
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/div.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/dt.gif b/dojox/editor/plugins/resources/images/blockelems/dt.gif
new file mode 100644
index 0000000..61145c1
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/dt.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/fieldset.gif b/dojox/editor/plugins/resources/images/blockelems/fieldset.gif
new file mode 100644
index 0000000..350d1f5
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/fieldset.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/form.gif b/dojox/editor/plugins/resources/images/blockelems/form.gif
new file mode 100644
index 0000000..b7a26ce
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/form.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/h1.gif b/dojox/editor/plugins/resources/images/blockelems/h1.gif
new file mode 100644
index 0000000..3accd14
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/h1.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/h2.gif b/dojox/editor/plugins/resources/images/blockelems/h2.gif
new file mode 100644
index 0000000..fed7623
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/h2.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/h3.gif b/dojox/editor/plugins/resources/images/blockelems/h3.gif
new file mode 100644
index 0000000..d2e8437
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/h3.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/h4.gif b/dojox/editor/plugins/resources/images/blockelems/h4.gif
new file mode 100644
index 0000000..cf806b9
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/h4.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/h5.gif b/dojox/editor/plugins/resources/images/blockelems/h5.gif
new file mode 100644
index 0000000..00c7c66
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/h5.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/h6.gif b/dojox/editor/plugins/resources/images/blockelems/h6.gif
new file mode 100644
index 0000000..91c7e12
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/h6.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/hr.gif b/dojox/editor/plugins/resources/images/blockelems/hr.gif
new file mode 100644
index 0000000..1475618
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/hr.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/iframe.gif b/dojox/editor/plugins/resources/images/blockelems/iframe.gif
new file mode 100644
index 0000000..a1e9502
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/iframe.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/ins.gif b/dojox/editor/plugins/resources/images/blockelems/ins.gif
new file mode 100644
index 0000000..a55290e
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/ins.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/li.gif b/dojox/editor/plugins/resources/images/blockelems/li.gif
new file mode 100644
index 0000000..9d4a964
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/li.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/map.gif b/dojox/editor/plugins/resources/images/blockelems/map.gif
new file mode 100644
index 0000000..d704664
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/map.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/noscript.gif b/dojox/editor/plugins/resources/images/blockelems/noscript.gif
new file mode 100644
index 0000000..2096c70
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/noscript.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/object.gif b/dojox/editor/plugins/resources/images/blockelems/object.gif
new file mode 100644
index 0000000..2376db0
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/object.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/ol.gif b/dojox/editor/plugins/resources/images/blockelems/ol.gif
new file mode 100644
index 0000000..923b227
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/ol.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/p.gif b/dojox/editor/plugins/resources/images/blockelems/p.gif
new file mode 100644
index 0000000..7e1cf81
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/p.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/pre.gif b/dojox/editor/plugins/resources/images/blockelems/pre.gif
new file mode 100644
index 0000000..caeaa51
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/pre.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/script.gif b/dojox/editor/plugins/resources/images/blockelems/script.gif
new file mode 100644
index 0000000..1a4e71d
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/script.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/table.gif b/dojox/editor/plugins/resources/images/blockelems/table.gif
new file mode 100644
index 0000000..33fc14d
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/table.gif differ
diff --git a/dojox/editor/plugins/resources/images/blockelems/ul.gif b/dojox/editor/plugins/resources/images/blockelems/ul.gif
new file mode 100644
index 0000000..88a3917
Binary files /dev/null and b/dojox/editor/plugins/resources/images/blockelems/ul.gif differ
diff --git a/dojox/embed/Flash.js b/dojox/embed/Flash.js
index 7b31b58..9b4bede 100644
--- a/dojox/embed/Flash.js
+++ b/dojox/embed/Flash.js
@@ -31,15 +31,16 @@ if(!_9){
 return null;
 }
 var p;
-var _b=_9.path;
+var _a=_9.path;
 if(_9.vars){
 var a=[];
 for(p in _9.vars){
 a.push(p+"="+_9.vars[p]);
 }
-_b+=((_b.indexOf("?")==-1)?"?":"&")+a.join("&");
+_9.params.FlashVars=a.join("&");
+delete _9.vars;
 }
-var s="<object id=\""+_9.id+"\" "+"classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" "+"width=\""+_9.width+"\" "+"height=\""+_9.height+"\""+((_9.style)?" style=\""+_9.style+"\"":"")+">"+"<param name=\"movie\" value=\""+_b+"\" />";
+var s="<object id=\""+_9.id+"\" "+"classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" "+"width=\""+_9.width+"\" "+"height=\""+_9.height+"\""+((_9.style)?" style=\""+_9.style+"\"":"")+">"+"<param name=\"movie\" value=\""+_a+"\" />";
 if(_9.params){
 for(p in _9.params){
 s+="<param name=\""+p+"\" value=\""+_9.params[p]+"\" />";
@@ -49,28 +50,28 @@ s+="</object>";
 return {id:_9.id,markup:s};
 };
 _2=(function(){
-var _e=10,_f=null;
-while(!_f&&_e>7){
+var _b=10,_c=null;
+while(!_c&&_b>7){
 try{
-_f=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_e--);
+_c=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_b--);
 }
 catch(e){
 }
 }
-if(_f){
-var v=_f.GetVariable("$version").split(" ")[1].split(",");
+if(_c){
+var v=_c.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};
 })();
 dojo.addOnUnload(function(){
-var _12=function(){
+var _d=function(){
 };
-var _13=dojo.query("object").reverse().style("display","none").forEach(function(i){
+var _e=dojo.query("object").reverse().style("display","none").forEach(function(i){
 for(var p in i){
 if((p!="FlashVars")&&dojo.isFunction(i[p])){
 try{
-i[p]=_12;
+i[p]=_d;
 }
 catch(e){
 }
@@ -79,54 +80,57 @@ catch(e){
 });
 });
 }else{
-_1=function(_16){
-_16=_7(_16);
-if(!_16){
+_1=function(_f){
+_f=_7(_f);
+if(!_f){
 return null;
 }
 var p;
-var _18=_16.path;
-if(_16.vars){
+var _10=_f.path;
+if(_f.vars){
 var a=[];
-for(p in _16.vars){
-a.push(p+"="+_16.vars[p]);
+for(p in _f.vars){
+a.push(p+"="+_f.vars[p]);
 }
-_18+=((_18.indexOf("?")==-1)?"?":"&")+a.join("&");
+_f.params.flashVars=a.join("&");
+delete _f.vars;
 }
-var s="<embed type=\"application/x-shockwave-flash\" "+"src=\""+_18+"\" "+"id=\""+_16.id+"\" "+"width=\""+_16.width+"\" "+"height=\""+_16.height+"\""+((_16.style)?" style=\""+_16.style+"\" ":"")+"swLiveConnect=\""+_16.swLiveConnect+"\" "+"allowScriptAccess=\""+_16.allowScriptAccess+"\" "+"allowNetworking=\""+_16.allowNetworking+"\" "+"pluginspage=\""+window.location.protocol+"//www.adobe.com/go/getflashplayer\" ";
-if(_16.params){
-for(p in _16.params){
-s+=" "+p+"=\""+_16.params[p]+"\"";
+var s="<embed type=\"application/x-shockwave-flash\" "+"src=\""+_10+"\" "+"id=\""+_f.id+"\" "+"width=\""+_f.width+"\" "+"height=\""+_f.height+"\""+((_f.style)?" style=\""+_f.style+"\" ":"")+"swLiveConnect=\""+_f.swLiveConnect+"\" "+"allowScriptAccess=\""+_f.allowScriptAccess+"\" "+"allowNetworking=\""+_f.allowNetworking+"\" "+"pluginspage=\""+window.location.protocol+"//www.adobe.com/go/getflashplayer\" ";
+if(_f.params){
+for(p in _f.params){
+s+=" "+p+"=\""+_f.params[p]+"\"";
 }
 }
 s+=" />";
-return {id:_16.id,markup:s};
+return {id:_f.id,markup:s};
 };
 _2=(function(){
-var _1b=navigator.plugins["Shockwave Flash"];
-if(_1b&&_1b.description){
-var v=_1b.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split(".");
+var _11=navigator.plugins["Shockwave Flash"];
+if(_11&&_11.description){
+var v=_11.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};
 })();
 }
-dojox.embed.Flash=function(_1d,_1e){
+dojox.embed.Flash=function(_12,_13){
 if(location.href.toLowerCase().indexOf("file://")>-1){
 throw new Error("dojox.embed.Flash can't be run directly from a file. To instatiate the required SWF correctly it must be run from a server, like localHost.");
 }
 this.available=dojox.embed.Flash.available;
-this.minimumVersion=_1d.minimumVersion||_3;
+this.minimumVersion=_12.minimumVersion||_3;
 this.id=null;
 this.movie=null;
 this.domNode=null;
-if(_1e){
-_1e=dojo.byId(_1e);
+if(_13){
+_13=dojo.byId(_13);
 }
 setTimeout(dojo.hitch(this,function(){
-if(this.available&&this.available>=this.minimumVersion){
-if(_1d&&_1e){
-this.init(_1d,_1e);
+if(_12.expressInstall||this.available&&this.available>=this.minimumVersion){
+if(_12&&_13){
+this.init(_12,_13);
+}else{
+this.onError("embed.Flash was not provided with the proper arguments.");
 }
 }else{
 if(!this.available){
@@ -137,8 +141,10 @@ this.onError("Flash version detected: "+this.available+" is out of date. Minimum
 }
 }),100);
 };
-dojo.extend(dojox.embed.Flash,{onReady:function(_1f){
-},onLoad:function(_20){
+dojo.extend(dojox.embed.Flash,{onReady:function(_14){
+console.warn("embed.Flash.movie.onReady:",_14);
+},onLoad:function(_15){
+console.warn("embed.Flash.movie.onLoad:",_15);
 },onError:function(msg){
 },_onload:function(){
 clearInterval(this._poller);
@@ -146,22 +152,22 @@ delete this._poller;
 delete this._pollCount;
 delete this._pollMax;
 this.onLoad(this.movie);
-},init:function(_22,_23){
+},init:function(_16,_17){
 this.destroy();
-_23=dojo.byId(_23||this.domNode);
-if(!_23){
+_17=dojo.byId(_17||this.domNode);
+if(!_17){
 throw new Error("dojox.embed.Flash: no domNode reference has been passed.");
 }
-var p=0,_25=false;
+var p=0,_18=false;
 this._poller=null;
 this._pollCount=0;
-this._pollMax=5;
+this._pollMax=15;
 this.pollTime=100;
 if(dojox.embed.Flash.initialized){
-this.id=dojox.embed.Flash.place(_22,_23);
-this.domNode=_23;
+this.id=dojox.embed.Flash.place(_16,_17);
+this.domNode=_17;
 setTimeout(dojo.hitch(this,function(){
-this.movie=this.byId(this.id,_22.doc);
+this.movie=this.byId(this.id,_16.doc);
 this.onReady(this.movie);
 this._poller=setInterval(dojo.hitch(this,function(){
 try{
@@ -192,9 +198,9 @@ this.id=this.movie=this.domNode=null;
 if(!this.movie){
 return;
 }
-var _26=dojo.delegate({id:true,movie:true,domNode:true,onReady:true,onLoad:true});
+var _19=dojo.delegate({id:true,movie:true,domNode:true,onReady:true,onLoad:true});
 for(var p in this){
-if(!_26[p]){
+if(!_19[p]){
 delete this[p];
 }
 }
@@ -203,32 +209,32 @@ dojo.connect(this,"onLoad",this,"_destroy");
 }else{
 this._destroy();
 }
-},byId:function(_28,doc){
+},byId:function(_1a,doc){
 doc=doc||document;
-if(doc.embeds[_28]){
-return doc.embeds[_28];
+if(doc.embeds[_1a]){
+return doc.embeds[_1a];
 }
-if(doc[_28]){
-return doc[_28];
+if(doc[_1a]){
+return doc[_1a];
 }
-if(window[_28]){
-return window[_28];
+if(window[_1a]){
+return window[_1a];
 }
-if(document[_28]){
-return document[_28];
+if(document[_1a]){
+return document[_1a];
 }
 return null;
 }});
 dojo.mixin(dojox.embed.Flash,{minSupported:8,available:_2.major,supported:(_2.major>=_2.required),minimumRequired:_2.required,version:_2,initialized:false,onInitialize:function(){
 dojox.embed.Flash.initialized=true;
-},__ie_markup__:function(_2a){
-return _1(_2a);
-},proxy:function(obj,_2c){
-dojo.forEach((dojo.isArray(_2c)?_2c:[_2c]),function(_2d){
-this[_2d]=dojo.hitch(this,function(){
+},__ie_markup__:function(_1b){
+return _1(_1b);
+},proxy:function(obj,_1c){
+dojo.forEach((dojo.isArray(_1c)?_1c:[_1c]),function(_1d){
+this[_1d]=dojo.hitch(this,function(){
 return (function(){
-return eval(this.movie.CallFunction("<invoke name=\""+_2d+"\" returntype=\"javascript\">"+"<arguments>"+dojo.map(arguments,function(_2e){
-return __flash__toXML(_2e);
+return eval(this.movie.CallFunction("<invoke name=\""+_1d+"\" returntype=\"javascript\">"+"<arguments>"+dojo.map(arguments,function(_1e){
+return __flash__toXML(_1e);
 }).join("")+"</arguments>"+"</invoke>"));
 }).apply(this,arguments||[]);
 });
@@ -244,16 +250,16 @@ document.getElementsByTagName("head")[0].appendChild(e);
 document.write("<scr"+"ipt type=\"text/javascript\" src=\""+dojo.moduleUrl("dojox","embed/IE/flash.js")+"\">"+"</scr"+"ipt>");
 }
 }else{
-dojox.embed.Flash.place=function(_2f,_30){
-var o=_1(_2f);
-_30=dojo.byId(_30);
-if(!_30){
-_30=dojo.doc.createElement("div");
-_30.id=o.id+"-container";
-dojo.body().appendChild(_30);
+dojox.embed.Flash.place=function(_1f,_20){
+var o=_1(_1f);
+_20=dojo.byId(_20);
+if(!_20){
+_20=dojo.doc.createElement("div");
+_20.id=o.id+"-container";
+dojo.body().appendChild(_20);
 }
 if(o){
-_30.innerHTML=o.markup;
+_20.innerHTML=o.markup;
 return o.id;
 }
 return null;
diff --git a/dojox/embed/Object.js b/dojox/embed/Object.js
index 48b0df0..be01ece 100644
--- a/dojox/embed/Object.js
+++ b/dojox/embed/Object.js
@@ -24,16 +24,16 @@ em=dojox.embed.Quicktime;
 if(!this.params){
 this.params={};
 if(this.domNode.hasAttributes()){
-var _3={dojoType:"",width:"",height:"","class":"",style:"",id:"",src:""};
-var _4=this.domNode.attributes;
-for(var i=0,l=_4.length;i<l;i++){
-if(!_3[_4[i].name]){
-this.params[_4[i].name]=_4[i].value;
+var _2={dojoType:"",width:"",height:"","class":"",style:"",id:"",src:""};
+var _3=this.domNode.attributes;
+for(var i=0,l=_3.length;i<l;i++){
+if(!_2[_3[i].name]){
+this.params[_3[i].name]=_3[i].value;
 }
 }
 }
 }
-var _7={path:this.src,width:this.width,height:this.height,params:this.params};
-this.movie=new (em)(_7,this.domNode);
+var _4={path:this.src,width:this.width,height:this.height,params:this.params};
+this.movie=new (em)(_4,this.domNode);
 }});
 }
diff --git a/dojox/embed/Quicktime.js b/dojox/embed/Quicktime.js
index fc189aa..2382e14 100644
--- a/dojox/embed/Quicktime.js
+++ b/dojox/embed/Quicktime.js
@@ -9,23 +9,23 @@ if(!dojo._hasResource["dojox.embed.Quicktime"]){
 dojo._hasResource["dojox.embed.Quicktime"]=true;
 dojo.provide("dojox.embed.Quicktime");
 (function(d){
-var _2,_3={major:0,minor:0,rev:0},_4,_5={width:320,height:240,redirect:null},_6="dojox-embed-quicktime-",_7=0,_8="This content requires the <a href=\"http://www.apple.com/quicktime/download/\" title=\"Download and install QuickTime.\">QuickTime plugin</a>.";
-function _9(_a){
-_a=d.mixin(d.clone(_5),_a||{});
-if(!("path" in _a)&&!_a.testing){
+var _1,_2={major:0,minor:0,rev:0},_3,_4={width:320,height:240,redirect:null},_5="dojox-embed-quicktime-",_6=0,_7="This content requires the <a href=\"http://www.apple.com/quicktime/download/\" title=\"Download and install QuickTime.\">QuickTime plugin</a>.";
+function _8(_9){
+_9=d.mixin(d.clone(_4),_9||{});
+if(!("path" in _9)&&!_9.testing){
 console.error("dojox.embed.Quicktime(ctor):: no path reference to a QuickTime movie was provided.");
 return null;
 }
-if(_a.testing){
-_a.path="";
+if(_9.testing){
+_9.path="";
 }
-if(!("id" in _a)){
-_a.id=_6+_7++;
+if(!("id" in _9)){
+_9.id=_5+_6++;
 }
-return _a;
+return _9;
 };
 if(d.isIE){
-_4=(function(){
+_3=(function(){
 try{
 var o=new ActiveXObject("QuickTimeCheckObject.QuickTimeCheck.1");
 if(o!==undefined){
@@ -33,7 +33,7 @@ var v=o.QuickTimeVersion.toString(16);
 function p(i){
 return (v.substring(i,i+1)-0)||0;
 };
-_3={major:p(0),minor:p(1),rev:p(2)};
+_2={major:p(0),minor:p(1),rev:p(2)};
 return o.IsQuickTimeAvailable(0);
 }
 }
@@ -41,23 +41,23 @@ catch(e){
 }
 return false;
 })();
-_2=function(_f){
-if(!_4){
-return {id:null,markup:_8};
+_1=function(_a){
+if(!_3){
+return {id:null,markup:_7};
 }
-_f=_9(_f);
-if(!_f){
+_a=_8(_a);
+if(!_a){
 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=\""+_f.id+"\" "+"width=\""+_f.width+"\" "+"height=\""+_f.height+"\">"+"<param name=\"src\" value=\""+_f.path+"\"/>";
-for(var p in _f.params||{}){
-s+="<param name=\""+p+"\" value=\""+_f.params[p]+"\"/>";
+var s="<object classid=\"clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B\" "+"codebase=\"http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0\" "+"id=\""+_a.id+"\" "+"width=\""+_a.width+"\" "+"height=\""+_a.height+"\">"+"<param name=\"src\" value=\""+_a.path+"\"/>";
+for(var p in _a.params||{}){
+s+="<param name=\""+p+"\" value=\""+_a.params[p]+"\"/>";
 }
 s+="</object>";
-return {id:_f.id,markup:s};
+return {id:_a.id,markup:s};
 };
 }else{
-_4=(function(){
+_3=(function(){
 for(var i=0,p=navigator.plugins,l=p.length;i<l;i++){
 if(p[i].name.indexOf("QuickTime")>-1){
 return true;
@@ -65,34 +65,34 @@ return true;
 }
 return false;
 })();
-_2=function(_15){
-if(!_4){
-return {id:null,markup:_8};
+_1=function(_b){
+if(!_3){
+return {id:null,markup:_7};
 }
-_15=_9(_15);
-if(!_15){
+_b=_8(_b);
+if(!_b){
 return null;
 }
-var s="<embed type=\"video/quicktime\" src=\""+_15.path+"\" "+"id=\""+_15.id+"\" "+"name=\""+_15.id+"\" "+"pluginspage=\"www.apple.com/quicktime/download\" "+"enablejavascript=\"true\" "+"width=\""+_15.width+"\" "+"height=\""+_15.height+"\"";
-for(var p in _15.params||{}){
-s+=" "+p+"=\""+_15.params[p]+"\"";
+var s="<embed type=\"video/quicktime\" src=\""+_b.path+"\" "+"id=\""+_b.id+"\" "+"name=\""+_b.id+"\" "+"pluginspage=\"www.apple.com/quicktime/download\" "+"enablejavascript=\"true\" "+"width=\""+_b.width+"\" "+"height=\""+_b.height+"\"";
+for(var p in _b.params||{}){
+s+=" "+p+"=\""+_b.params[p]+"\"";
 }
 s+="></embed>";
-return {id:_15.id,markup:s};
+return {id:_b.id,markup:s};
 };
 }
-dojox.embed.Quicktime=function(_18,_19){
-return dojox.embed.Quicktime.place(_18,_19);
+dojox.embed.Quicktime=function(_c,_d){
+return dojox.embed.Quicktime.place(_c,_d);
 };
-d.mixin(dojox.embed.Quicktime,{minSupported:6,available:_4,supported:_4,version:_3,initialized:false,onInitialize:function(){
+d.mixin(dojox.embed.Quicktime,{minSupported:6,available:_3,supported:_3,version:_2,initialized:false,onInitialize:function(){
 dojox.embed.Quicktime.initialized=true;
-},place:function(_1a,_1b){
-var o=_2(_1a);
-if(!(_1b=d.byId(_1b))){
-_1b=d.create("div",{id:o.id+"-container"},d.body());
+},place:function(_e,_f){
+var o=_1(_e);
+if(!(_f=d.byId(_f))){
+_f=d.create("div",{id:o.id+"-container"},d.body());
 }
 if(o){
-_1b.innerHTML=o.markup;
+_f.innerHTML=o.markup;
 if(o.id){
 return d.isIE?d.byId(o.id):document[o.id];
 }
@@ -100,8 +100,8 @@ return d.isIE?d.byId(o.id):document[o.id];
 return null;
 }});
 if(!d.isIE){
-var id="-qt-version-test",o=_2({testing:true,width:4,height:4}),c=10,top="-1000px",_21="1px";
-function _22(){
+var id="-qt-version-test",o=_1({testing:true,width:4,height:4}),c=10,top="-1000px",_10="1px";
+function _11(){
 setTimeout(function(){
 var qt=document[o.id],n=d.byId(id);
 if(qt){
@@ -115,7 +115,7 @@ c=0;
 }
 catch(e){
 if(c--){
-_22();
+_11();
 }
 }
 }
@@ -125,13 +125,13 @@ d.destroy(n);
 },20);
 };
 if(d._initFired){
-d.create("div",{innerHTML:o.markup,id:id,style:{top:top,left:0,width:_21,height:_21,overflow:"hidden",position:"absolute"}},d.body());
+d.create("div",{innerHTML:o.markup,id:id,style:{top:top,left:0,width:_10,height:_10,overflow:"hidden",position:"absolute"}},d.body());
 }else{
-document.write("<div style=\"top:"+top+";left:0;width:"+_21+";height:"+_21+";overflow:hidden;position:absolute\" id=\""+id+"\">"+o.markup+"</div>");
+document.write("<div style=\"top:"+top+";left:0;width:"+_10+";height:"+_10+";overflow:hidden;position:absolute\" id=\""+id+"\">"+o.markup+"</div>");
 }
-_22();
+_11();
 }else{
-if(d.isIE&&_4){
+if(d.isIE&&_3){
 dojox.embed.Quicktime.onInitialize();
 }
 }
diff --git a/dojox/embed/flashVars.js b/dojox/embed/flashVars.js
index 0e183fe..f67d0ba 100644
--- a/dojox/embed/flashVars.js
+++ b/dojox/embed/flashVars.js
@@ -9,27 +9,27 @@ if(!dojo._hasResource["dojox.embed.flashVars"]){
 dojo._hasResource["dojox.embed.flashVars"]=true;
 dojo.provide("dojox.embed.flashVars");
 dojo.mixin(dojox.embed.flashVars,{serialize:function(n,o){
-var _3=function(_4){
-if(typeof _4=="string"){
-_4=_4.replace(/;/g,"_sc_");
-_4=_4.replace(/\./g,"_pr_");
-_4=_4.replace(/\:/g,"_cl_");
+var _1=function(_2){
+if(typeof _2=="string"){
+_2=_2.replace(/;/g,"_sc_");
+_2=_2.replace(/\./g,"_pr_");
+_2=_2.replace(/\:/g,"_cl_");
 }
-return _4;
+return _2;
 };
 var df=dojox.embed.flashVars.serialize;
-var _6="";
+var _3="";
 if(dojo.isArray(o)){
 for(var i=0;i<o.length;i++){
-_6+=df(n+"."+i,_3(o[i]))+";";
+_3+=df(n+"."+i,_1(o[i]))+";";
 }
-return _6.replace(/;{2,}/g,";");
+return _3.replace(/;{2,}/g,";");
 }else{
 if(dojo.isObject(o)){
 for(var nm in o){
-_6+=df(n+"."+nm,_3(o[nm]))+";";
+_3+=df(n+"."+nm,_1(o[nm]))+";";
 }
-return _6.replace(/;{2,}/g,";");
+return _3.replace(/;{2,}/g,";");
 }
 }
 return n+":"+o;
diff --git a/dojox/encoding/README b/dojox/encoding/README
index 8826008..b1b80d5 100644
--- a/dojox/encoding/README
+++ b/dojox/encoding/README
@@ -26,7 +26,7 @@ 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/*
+http://svn.dojotoolkit.org/src/dojox/trunk/encoding/*
 
 Install into the following directory structure:
 /dojox/encoding/
diff --git a/dojox/encoding/ascii85.js b/dojox/encoding/ascii85.js
index 3e9acb0..f5eaa54 100644
--- a/dojox/encoding/ascii85.js
+++ b/dojox/encoding/ascii85.js
@@ -9,45 +9,45 @@ if(!dojo._hasResource["dojox.encoding.ascii85"]){
 dojo._hasResource["dojox.encoding.ascii85"]=true;
 dojo.provide("dojox.encoding.ascii85");
 (function(){
-var c=function(_2,_3,_4){
+var c=function(_1,_2,_3){
 var i,j,n,b=[0,0,0,0,0];
-for(i=0;i<_3;i+=4){
-n=((_2[i]*256+_2[i+1])*256+_2[i+2])*256+_2[i+3];
+for(i=0;i<_2;i+=4){
+n=((_1[i]*256+_1[i+1])*256+_1[i+2])*256+_1[i+3];
 if(!n){
-_4.push("z");
+_3.push("z");
 }else{
 for(j=0;j<5;b[j++]=n%85+33,n=Math.floor(n/85)){
 }
 }
-_4.push(String.fromCharCode(b[4],b[3],b[2],b[1],b[0]));
+_3.push(String.fromCharCode(b[4],b[3],b[2],b[1],b[0]));
 }
 };
-dojox.encoding.ascii85.encode=function(_9){
-var _a=[],_b=_9.length%4,_c=_9.length-_b;
-c(_9,_c,_a);
-if(_b){
-var t=_9.slice(_c);
+dojox.encoding.ascii85.encode=function(_4){
+var _5=[],_6=_4.length%4,_7=_4.length-_6;
+c(_4,_7,_5);
+if(_6){
+var t=_4.slice(_7);
 while(t.length<4){
 t.push(0);
 }
-c(t,4,_a);
-var x=_a.pop();
+c(t,4,_5);
+var x=_5.pop();
 if(x=="z"){
 x="!!!!!";
 }
-_a.push(x.substr(0,_b+1));
+_5.push(x.substr(0,_6+1));
 }
-return _a.join("");
+return _5.join("");
 };
-dojox.encoding.ascii85.decode=function(_f){
-var n=_f.length,r=[],b=[0,0,0,0,0],i,j,t,x,y,d;
+dojox.encoding.ascii85.decode=function(_8){
+var n=_8.length,r=[],b=[0,0,0,0,0],i,j,t,x,y,d;
 for(i=0;i<n;++i){
-if(_f.charAt(i)=="z"){
+if(_8.charAt(i)=="z"){
 r.push(0,0,0,0);
 continue;
 }
 for(j=0;j<5;++j){
-b[j]=_f.charCodeAt(i+j)-33;
+b[j]=_8.charCodeAt(i+j)-33;
 }
 d=n-i;
 if(d<5){
diff --git a/dojox/encoding/base64.js b/dojox/encoding/base64.js
index 3edb863..307eafa 100644
--- a/dojox/encoding/base64.js
+++ b/dojox/encoding/base64.js
@@ -10,61 +10,61 @@ dojo._hasResource["dojox.encoding.base64"]=true;
 dojo.provide("dojox.encoding.base64");
 (function(){
 var p="=";
-var _2="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-var _3=dojox.encoding;
-_3.base64.encode=function(ba){
+var _1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+var _2=dojox.encoding;
+_2.base64.encode=function(ba){
 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(_2.charAt((t>>>18)&63));
-s.push(_2.charAt((t>>>12)&63));
-s.push(_2.charAt((t>>>6)&63));
-s.push(_2.charAt(t&63));
+s.push(_1.charAt((t>>>18)&63));
+s.push(_1.charAt((t>>>12)&63));
+s.push(_1.charAt((t>>>6)&63));
+s.push(_1.charAt(t&63));
 }
 switch(rm){
 case 2:
 var t=ba[i++]<<16|ba[i++]<<8;
-s.push(_2.charAt((t>>>18)&63));
-s.push(_2.charAt((t>>>12)&63));
-s.push(_2.charAt((t>>>6)&63));
+s.push(_1.charAt((t>>>18)&63));
+s.push(_1.charAt((t>>>12)&63));
+s.push(_1.charAt((t>>>6)&63));
 s.push(p);
 break;
 case 1:
 var t=ba[i++]<<16;
-s.push(_2.charAt((t>>>18)&63));
-s.push(_2.charAt((t>>>12)&63));
+s.push(_1.charAt((t>>>18)&63));
+s.push(_1.charAt((t>>>12)&63));
 s.push(p);
 s.push(p);
 break;
 }
 return s.join("");
 };
-_3.base64.decode=function(_b){
-var s=_b.split(""),_d=[];
+_2.base64.decode=function(_3){
+var s=_3.split(""),_4=[];
 var l=s.length;
 while(s[--l]==p){
 }
 for(var i=0;i<l;){
-var t=_2.indexOf(s[i++])<<18;
+var t=_1.indexOf(s[i++])<<18;
 if(i<=l){
-t|=_2.indexOf(s[i++])<<12;
+t|=_1.indexOf(s[i++])<<12;
 }
 if(i<=l){
-t|=_2.indexOf(s[i++])<<6;
+t|=_1.indexOf(s[i++])<<6;
 }
 if(i<=l){
-t|=_2.indexOf(s[i++]);
+t|=_1.indexOf(s[i++]);
 }
-_d.push((t>>>16)&255);
-_d.push((t>>>8)&255);
-_d.push(t&255);
+_4.push((t>>>16)&255);
+_4.push((t>>>8)&255);
+_4.push(t&255);
 }
-while(_d[_d.length-1]==0){
-_d.pop();
+while(_4[_4.length-1]==0){
+_4.pop();
 }
-return _d;
+return _4;
 };
 })();
 }
diff --git a/dojox/encoding/bits.js b/dojox/encoding/bits.js
index d385a16..6f68c9d 100644
--- a/dojox/encoding/bits.js
+++ b/dojox/encoding/bits.js
@@ -38,15 +38,15 @@ b.push(this.accumulator&(255<<this.available));
 this.reset();
 return b;
 }});
-dojox.encoding.bits.InputStream=function(_6,_7){
-this.buffer=_6;
-this.width=_7;
+dojox.encoding.bits.InputStream=function(_3,_4){
+this.buffer=_3;
+this.width=_4;
 this.bbyte=this.bit=0;
 };
-dojo.extend(dojox.encoding.bits.InputStream,{getBits:function(_8){
+dojo.extend(dojox.encoding.bits.InputStream,{getBits:function(_5){
 var r=0;
-while(_8){
-var w=Math.min(_8,8-this.bit);
+while(_5){
+var w=Math.min(_5,8-this.bit);
 var v=this.buffer[this.bbyte]>>>(8-this.bit-w);
 r<<=w;
 r|=v&~(~0<<w);
@@ -55,7 +55,7 @@ if(this.bit==8){
 ++this.bbyte;
 this.bit=0;
 }
-_8-=w;
+_5-=w;
 }
 return r;
 },getWidth:function(){
diff --git a/dojox/encoding/compression/lzw.js b/dojox/encoding/compression/lzw.js
index 8a5f9ce..b61238a 100644
--- a/dojox/encoding/compression/lzw.js
+++ b/dojox/encoding/compression/lzw.js
@@ -27,24 +27,24 @@ this.dict[String.fromCharCode(i)]=i;
 }
 this.width=_1(this.code=this.size);
 this.p="";
-},encode:function(_7,_8){
-var c=String.fromCharCode(_7),p=this.p+c,r=0;
+},encode:function(_2,_3){
+var c=String.fromCharCode(_2),p=this.p+c,r=0;
 if(p in this.dict){
 this.p=p;
 return r;
 }
-_8.putBits(this.dict[this.p],this.width);
+_3.putBits(this.dict[this.p],this.width);
 if((this.code&(this.code+1))==0){
-_8.putBits(this.code++,r=this.width++);
+_3.putBits(this.code++,r=this.width++);
 }
 this.dict[p]=this.code++;
 this.p=c;
 return r+this.width;
-},flush:function(_c){
+},flush:function(_4){
 if(this.p.length==0){
 return 0;
 }
-_c.putBits(this.dict[this.p],this.width);
+_4.putBits(this.dict[this.p],this.width);
 this.p="";
 return this.width;
 }});
@@ -59,8 +59,8 @@ this.codes[i]=String.fromCharCode(i);
 }
 this.width=_1(this.size);
 this.p=-1;
-},decode:function(_f){
-var c=_f.getBits(this.width),v;
+},decode:function(_5){
+var c=_5.getBits(this.width),v;
 if(c<this.codes.length){
 v=this.codes[c];
 if(this.p>=0){
diff --git a/dojox/encoding/compression/splay.js b/dojox/encoding/compression/splay.js
index 2c00ff6..8f509f8 100644
--- a/dojox/encoding/compression/splay.js
+++ b/dojox/encoding/compression/splay.js
@@ -41,22 +41,22 @@ a=d;
 a=c;
 }
 }while(a);
-},encode:function(_8,_9){
-var s=[],a=_8+this.left.length;
+},encode:function(_1,_2){
+var s=[],a=_1+this.left.length;
 do{
 s.push(this.right[this.up[a]]==a);
 a=this.up[a];
 }while(a);
-this.splay(_8);
+this.splay(_1);
 var l=s.length;
 while(s.length){
-_9.putBits(s.pop()?1:0,1);
+_2.putBits(s.pop()?1:0,1);
 }
 return l;
-},decode:function(_d){
+},decode:function(_3){
 var a=0;
 do{
-a=this[_d.getBits(1)?"right":"left"][a];
+a=this[_3.getBits(1)?"right":"left"][a];
 }while(a<this.left.length);
 a-=this.left.length;
 this.splay(a);
diff --git a/dojox/encoding/crypto/Blowfish.js b/dojox/encoding/crypto/Blowfish.js
index bdb55a1..696e775 100644
--- a/dojox/encoding/crypto/Blowfish.js
+++ b/dojox/encoding/crypto/Blowfish.js
@@ -18,86 +18,86 @@ var _4=Math.pow(2,8);
 var _5=Math.pow(2,16);
 var _6=Math.pow(2,24);
 var iv=null;
-var _8={p:[608135816,2242054355,320440878,57701188,2752067618,698298832,137296536,3964562569,1160258022,953160567,3193202383,887688300,3232508343,3380367581,1065670069,3041331479,2450970073,2306472731],s0:[3509652390,2564797868,805139163,3491422135,3101798381,1780907670,3128725573,4046225305,614570311,3012652279,134345442,2240740374,1667834072,1901547113,2757295779,4103290238,227898511,1921955416,1904987480,2182433518,2069144605,3260701109,2620446009,720527379,3318853667,677414384,339328 [...]
-function _9(x,y){
+var _7={p:[608135816,2242054355,320440878,57701188,2752067618,698298832,137296536,3964562569,1160258022,953160567,3193202383,887688300,3232508343,3380367581,1065670069,3041331479,2450970073,2306472731],s0:[3509652390,2564797868,805139163,3491422135,3101798381,1780907670,3128725573,4046225305,614570311,3012652279,134345442,2240740374,1667834072,1901547113,2757295779,4103290238,227898511,1921955416,1904987480,2182433518,2069144605,3260701109,2620446009,720527379,3318853667,677414384,339328 [...]
+function _8(x,y){
 return (((x>>16)+(y>>16)+(((x&65535)+(y&65535))>>16))<<16)|(((x&65535)+(y&65535))&65535);
 };
-function _c(x,y){
+function _9(x,y){
 return (((x>>16)^(y>>16))<<16)|(((x&65535)^(y&65535))&65535);
 };
-function $(v,box){
-var d=box.s3[v&255];
+function $(v,_a){
+var d=_a.s3[v&255];
 v>>=8;
-var c=box.s2[v&255];
+var c=_a.s2[v&255];
 v>>=8;
-var b=box.s1[v&255];
+var b=_a.s1[v&255];
 v>>=8;
-var a=box.s0[v&255];
+var a=_a.s0[v&255];
 var r=(((a>>16)+(b>>16)+(((a&65535)+(b&65535))>>16))<<16)|(((a&65535)+(b&65535))&65535);
 r=(((r>>16)^(c>>16))<<16)|(((r&65535)^(c&65535))&65535);
 return (((r>>16)+(d>>16)+(((r&65535)+(d&65535))>>16))<<16)|(((r&65535)+(d&65535))&65535);
 };
-function eb(o,box){
+function eb(o,_b){
 var l=o.left;
 var r=o.right;
-l=_c(l,box.p[0]);
-r=_c(r,_c($(l,box),box.p[1]));
-l=_c(l,_c($(r,box),box.p[2]));
-r=_c(r,_c($(l,box),box.p[3]));
-l=_c(l,_c($(r,box),box.p[4]));
-r=_c(r,_c($(l,box),box.p[5]));
-l=_c(l,_c($(r,box),box.p[6]));
-r=_c(r,_c($(l,box),box.p[7]));
-l=_c(l,_c($(r,box),box.p[8]));
-r=_c(r,_c($(l,box),box.p[9]));
-l=_c(l,_c($(r,box),box.p[10]));
-r=_c(r,_c($(l,box),box.p[11]));
-l=_c(l,_c($(r,box),box.p[12]));
-r=_c(r,_c($(l,box),box.p[13]));
-l=_c(l,_c($(r,box),box.p[14]));
-r=_c(r,_c($(l,box),box.p[15]));
-l=_c(l,_c($(r,box),box.p[16]));
+l=_9(l,_b.p[0]);
+r=_9(r,_9($(l,_b),_b.p[1]));
+l=_9(l,_9($(r,_b),_b.p[2]));
+r=_9(r,_9($(l,_b),_b.p[3]));
+l=_9(l,_9($(r,_b),_b.p[4]));
+r=_9(r,_9($(l,_b),_b.p[5]));
+l=_9(l,_9($(r,_b),_b.p[6]));
+r=_9(r,_9($(l,_b),_b.p[7]));
+l=_9(l,_9($(r,_b),_b.p[8]));
+r=_9(r,_9($(l,_b),_b.p[9]));
+l=_9(l,_9($(r,_b),_b.p[10]));
+r=_9(r,_9($(l,_b),_b.p[11]));
+l=_9(l,_9($(r,_b),_b.p[12]));
+r=_9(r,_9($(l,_b),_b.p[13]));
+l=_9(l,_9($(r,_b),_b.p[14]));
+r=_9(r,_9($(l,_b),_b.p[15]));
+l=_9(l,_9($(r,_b),_b.p[16]));
 o.right=l;
-o.left=_c(r,box.p[17]);
+o.left=_9(r,_b.p[17]);
 };
-function db(o,box){
+function db(o,_c){
 var l=o.left;
 var r=o.right;
-l=_c(l,box.p[17]);
-r=_c(r,_c($(l,box),box.p[16]));
-l=_c(l,_c($(r,box),box.p[15]));
-r=_c(r,_c($(l,box),box.p[14]));
-l=_c(l,_c($(r,box),box.p[13]));
-r=_c(r,_c($(l,box),box.p[12]));
-l=_c(l,_c($(r,box),box.p[11]));
-r=_c(r,_c($(l,box),box.p[10]));
-l=_c(l,_c($(r,box),box.p[9]));
-r=_c(r,_c($(l,box),box.p[8]));
-l=_c(l,_c($(r,box),box.p[7]));
-r=_c(r,_c($(l,box),box.p[6]));
-l=_c(l,_c($(r,box),box.p[5]));
-r=_c(r,_c($(l,box),box.p[4]));
-l=_c(l,_c($(r,box),box.p[3]));
-r=_c(r,_c($(l,box),box.p[2]));
-l=_c(l,_c($(r,box),box.p[1]));
+l=_9(l,_c.p[17]);
+r=_9(r,_9($(l,_c),_c.p[16]));
+l=_9(l,_9($(r,_c),_c.p[15]));
+r=_9(r,_9($(l,_c),_c.p[14]));
+l=_9(l,_9($(r,_c),_c.p[13]));
+r=_9(r,_9($(l,_c),_c.p[12]));
+l=_9(l,_9($(r,_c),_c.p[11]));
+r=_9(r,_9($(l,_c),_c.p[10]));
+l=_9(l,_9($(r,_c),_c.p[9]));
+r=_9(r,_9($(l,_c),_c.p[8]));
+l=_9(l,_9($(r,_c),_c.p[7]));
+r=_9(r,_9($(l,_c),_c.p[6]));
+l=_9(l,_9($(r,_c),_c.p[5]));
+r=_9(r,_9($(l,_c),_c.p[4]));
+l=_9(l,_9($(r,_c),_c.p[3]));
+r=_9(r,_9($(l,_c),_c.p[2]));
+l=_9(l,_9($(r,_c),_c.p[1]));
 o.right=l;
-o.left=_c(r,box.p[0]);
+o.left=_9(r,_c.p[0]);
 };
-function _21(key){
-var k=key;
+function _d(_e){
+var k=_e;
 if(dojo.isString(k)){
-k=dojo.map(k.split(""),function(_24){
-return _24.charCodeAt(0)&255;
+k=dojo.map(k.split(""),function(_f){
+return _f.charCodeAt(0)&255;
 });
 }
-var pos=0,_26=0,res={left:0,right:0},i,j,l;
-var box={p:dojo.map(_8.p.slice(0),function(_2c){
+var pos=0,_10=0,res={left:0,right:0},i,j,l;
+var box={p:dojo.map(_7.p.slice(0),function(_11){
 var l=k.length,j;
 for(j=0;j<4;j++){
-_26=(_26*_4)|k[pos++%l];
+_10=(_10*_4)|k[pos++%l];
 }
-return (((_2c>>16)^(_26>>16))<<16)|(((_2c&65535)^(_26&65535))&65535);
-}),s0:_8.s0.slice(0),s1:_8.s1.slice(0),s2:_8.s2.slice(0),s3:_8.s3.slice(0)};
+return (((_11>>16)^(_10>>16))<<16)|(((_11&65535)^(_10&65535))&65535);
+}),s0:_7.s0.slice(0),s1:_7.s1.slice(0),s2:_7.s2.slice(0),s3:_7.s3.slice(0)};
 for(i=0,l=box.p.length;i<l;){
 eb(res,box);
 box.p[i++]=res.left,box.p[i++]=res.right;
@@ -110,12 +110,12 @@ box["s"+i][j++]=res.left,box["s"+i][j++]=res.right;
 }
 return box;
 };
-this.getIV=function(_2e){
-var out=_2e||dojox.encoding.crypto.outputTypes.Base64;
+this.getIV=function(_12){
+var out=_12||dojox.encoding.crypto.outputTypes.Base64;
 switch(out){
 case dojox.encoding.crypto.outputTypes.Hex:
-return dojo.map(iv,function(_30){
-return (_30<=15?"0":"")+_30.toString(16);
+return dojo.map(iv,function(_13){
+return (_13<=15?"0":"")+_13.toString(16);
 }).join("");
 case dojox.encoding.crypto.outputTypes.String:
 return iv.join("");
@@ -125,132 +125,132 @@ default:
 return dojox.encoding.base64.encode(iv);
 }
 };
-this.setIV=function(_31,_32){
-var ip=_32||dojox.encoding.crypto.outputTypes.Base64;
+this.setIV=function(_14,_15){
+var ip=_15||dojox.encoding.crypto.outputTypes.Base64;
 var ba=null;
 switch(ip){
 case dojox.encoding.crypto.outputTypes.String:
-ba=dojo.map(_31.split(""),function(_35){
-return _35.charCodeAt(0);
+ba=dojo.map(_14.split(""),function(_16){
+return _16.charCodeAt(0);
 });
 break;
 case dojox.encoding.crypto.outputTypes.Hex:
 ba=[];
-for(var i=0,l=_31.length-1;i<l;i+=2){
-ba.push(parseInt(_31.substr(i,2),16));
+for(var i=0,l=_14.length-1;i<l;i+=2){
+ba.push(parseInt(_14.substr(i,2),16));
 }
 break;
 case dojox.encoding.crypto.outputTypes.Raw:
-ba=_31;
+ba=_14;
 break;
 default:
-ba=dojox.encoding.base64.decode(_31);
+ba=dojox.encoding.base64.decode(_14);
 break;
 }
 iv={};
 iv.left=ba[0]*_6|ba[1]*_5|ba[2]*_4|ba[3];
 iv.right=ba[4]*_6|ba[5]*_5|ba[6]*_4|ba[7];
 };
-this.encrypt=function(_38,key,ao){
+this.encrypt=function(_17,key,ao){
 var out=dojox.encoding.crypto.outputTypes.Base64;
-var _3c=dojox.encoding.crypto.cipherModes.ECB;
+var _18=dojox.encoding.crypto.cipherModes.ECB;
 if(ao){
 if(ao.outputType){
 out=ao.outputType;
 }
 if(ao.cipherMode){
-_3c=ao.cipherMode;
+_18=ao.cipherMode;
 }
 }
-var bx=_21(key),_3e=8-(_38.length&7);
-for(var i=0;i<_3e;i++){
-_38+=String.fromCharCode(_3e);
+var bx=_d(key),_19=8-(_17.length&7);
+for(var i=0;i<_19;i++){
+_17+=String.fromCharCode(_19);
 }
-var _40=[],_41=_38.length>>3,pos=0,o={},_44=(_3c==dojox.encoding.crypto.cipherModes.CBC);
-var _45={left:iv.left||null,right:iv.right||null};
-for(var i=0;i<_41;i++){
-o.left=_38.charCodeAt(pos)*_6|_38.charCodeAt(pos+1)*_5|_38.charCodeAt(pos+2)*_4|_38.charCodeAt(pos+3);
-o.right=_38.charCodeAt(pos+4)*_6|_38.charCodeAt(pos+5)*_5|_38.charCodeAt(pos+6)*_4|_38.charCodeAt(pos+7);
-if(_44){
-o.left=(((o.left>>16)^(_45.left>>16))<<16)|(((o.left&65535)^(_45.left&65535))&65535);
-o.right=(((o.right>>16)^(_45.right>>16))<<16)|(((o.right&65535)^(_45.right&65535))&65535);
+var _1a=[],_1b=_17.length>>3,pos=0,o={},_1c=(_18==dojox.encoding.crypto.cipherModes.CBC);
+var _1d={left:iv.left||null,right:iv.right||null};
+for(var i=0;i<_1b;i++){
+o.left=_17.charCodeAt(pos)*_6|_17.charCodeAt(pos+1)*_5|_17.charCodeAt(pos+2)*_4|_17.charCodeAt(pos+3);
+o.right=_17.charCodeAt(pos+4)*_6|_17.charCodeAt(pos+5)*_5|_17.charCodeAt(pos+6)*_4|_17.charCodeAt(pos+7);
+if(_1c){
+o.left=(((o.left>>16)^(_1d.left>>16))<<16)|(((o.left&65535)^(_1d.left&65535))&65535);
+o.right=(((o.right>>16)^(_1d.right>>16))<<16)|(((o.right&65535)^(_1d.right&65535))&65535);
 }
 eb(o,bx);
-if(_44){
-_45.left=o.left;
-_45.right=o.right;
+if(_1c){
+_1d.left=o.left;
+_1d.right=o.right;
 }
-_40.push((o.left>>24)&255);
-_40.push((o.left>>16)&255);
-_40.push((o.left>>8)&255);
-_40.push(o.left&255);
-_40.push((o.right>>24)&255);
-_40.push((o.right>>16)&255);
-_40.push((o.right>>8)&255);
-_40.push(o.right&255);
+_1a.push((o.left>>24)&255);
+_1a.push((o.left>>16)&255);
+_1a.push((o.left>>8)&255);
+_1a.push(o.left&255);
+_1a.push((o.right>>24)&255);
+_1a.push((o.right>>16)&255);
+_1a.push((o.right>>8)&255);
+_1a.push(o.right&255);
 pos+=8;
 }
 switch(out){
 case dojox.encoding.crypto.outputTypes.Hex:
-return dojo.map(_40,function(_46){
-return (_46<=15?"0":"")+_46.toString(16);
+return dojo.map(_1a,function(_1e){
+return (_1e<=15?"0":"")+_1e.toString(16);
 }).join("");
 case dojox.encoding.crypto.outputTypes.String:
-return _40.join("");
+return _1a.join("");
 case dojox.encoding.crypto.outputTypes.Raw:
-return _40;
+return _1a;
 default:
-return dojox.encoding.base64.encode(_40);
+return dojox.encoding.base64.encode(_1a);
 }
 };
-this.decrypt=function(_47,key,ao){
+this.decrypt=function(_1f,key,ao){
 var ip=dojox.encoding.crypto.outputTypes.Base64;
-var _4b=dojox.encoding.crypto.cipherModes.ECB;
+var _20=dojox.encoding.crypto.cipherModes.ECB;
 if(ao){
 if(ao.outputType){
 ip=ao.outputType;
 }
 if(ao.cipherMode){
-_4b=ao.cipherMode;
+_20=ao.cipherMode;
 }
 }
-var bx=_21(key);
+var bx=_d(key);
 var pt=[];
 var c=null;
 switch(ip){
 case dojox.encoding.crypto.outputTypes.Hex:
 c=[];
-for(var i=0,l=_47.length-1;i<l;i+=2){
-c.push(parseInt(_47.substr(i,2),16));
+for(var i=0,l=_1f.length-1;i<l;i+=2){
+c.push(parseInt(_1f.substr(i,2),16));
 }
 break;
 case dojox.encoding.crypto.outputTypes.String:
-c=dojo.map(_47.split(""),function(_51){
-return _51.charCodeAt(0);
+c=dojo.map(_1f.split(""),function(_21){
+return _21.charCodeAt(0);
 });
 break;
 case dojox.encoding.crypto.outputTypes.Raw:
-c=_47;
+c=_1f;
 break;
 default:
-c=dojox.encoding.base64.decode(_47);
+c=dojox.encoding.base64.decode(_1f);
 break;
 }
-var _52=c.length>>3,pos=0,o={},_55=(_4b==dojox.encoding.crypto.cipherModes.CBC);
-var _56={left:iv.left||null,right:iv.right||null};
-for(var i=0;i<_52;i++){
+var _22=c.length>>3,pos=0,o={},_23=(_20==dojox.encoding.crypto.cipherModes.CBC);
+var _24={left:iv.left||null,right:iv.right||null};
+for(var i=0;i<_22;i++){
 o.left=c[pos]*_6|c[pos+1]*_5|c[pos+2]*_4|c[pos+3];
 o.right=c[pos+4]*_6|c[pos+5]*_5|c[pos+6]*_4|c[pos+7];
-if(_55){
-var _57=o.left;
-var _58=o.right;
+if(_23){
+var _25=o.left;
+var _26=o.right;
 }
 db(o,bx);
-if(_55){
-o.left=(((o.left>>16)^(_56.left>>16))<<16)|(((o.left&65535)^(_56.left&65535))&65535);
-o.right=(((o.right>>16)^(_56.right>>16))<<16)|(((o.right&65535)^(_56.right&65535))&65535);
-_56.left=_57;
-_56.right=_58;
+if(_23){
+o.left=(((o.left>>16)^(_24.left>>16))<<16)|(((o.left&65535)^(_24.left&65535))&65535);
+o.right=(((o.right>>16)^(_24.right>>16))<<16)|(((o.right&65535)^(_24.right&65535))&65535);
+_24.left=_25;
+_24.right=_26;
 }
 pt.push((o.left>>24)&255);
 pt.push((o.left>>16)&255);
@@ -266,8 +266,8 @@ if(pt[pt.length-1]==pt[pt.length-2]||pt[pt.length-1]==1){
 var n=pt[pt.length-1];
 pt.splice(pt.length-n,n);
 }
-return dojo.map(pt,function(_5a){
-return String.fromCharCode(_5a);
+return dojo.map(pt,function(_27){
+return String.fromCharCode(_27);
 }).join("");
 };
 this.setIV("0000000000000000",dojox.encoding.crypto.outputTypes.Hex);
diff --git a/dojox/encoding/crypto/RSAKey-ext.js b/dojox/encoding/crypto/RSAKey-ext.js
new file mode 100644
index 0000000..cf24cd9
--- /dev/null
+++ b/dojox/encoding/crypto/RSAKey-ext.js
@@ -0,0 +1,107 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.encoding.crypto.RSAKey-ext"]){
+dojo._hasResource["dojox.encoding.crypto.RSAKey-ext"]=true;
+dojo.provide("dojox.encoding.crypto.RSAKey-ext");
+dojo.experimental("dojox.encoding.crypto.RSAKey-ext");
+dojo.require("dojox.encoding.crypto.RSAKey");
+dojo.require("dojox.math.BigInteger-ext");
+(function(){
+var _1=dojox.math.BigInteger;
+function _2(d,n){
+var b=d.toByteArray();
+for(var i=0,_3=b.length;i<_3&&!b[i];++i){
+}
+if(b.length-i!==n-1||b[i]!==2){
+return null;
+}
+for(++i;b[i];){
+if(++i>=_3){
+return null;
+}
+}
+var _4="";
+while(++i<_3){
+_4+=String.fromCharCode(b[i]);
+}
+return _4;
+};
+dojo.extend(dojox.encoding.crypto.RSAKey,{setPrivate:function(N,E,D){
+if(N&&E&&N.length&&E.length){
+this.n=new _1(N,16);
+this.e=parseInt(E,16);
+this.d=new _1(D,16);
+}else{
+throw new Error("Invalid RSA private key");
+}
+},setPrivateEx:function(N,E,D,P,Q,DP,DQ,C){
+if(N&&E&&N.length&&E.length){
+this.n=new _1(N,16);
+this.e=parseInt(E,16);
+this.d=new _1(D,16);
+this.p=new _1(P,16);
+this.q=new _1(Q,16);
+this.dmp1=new _1(DP,16);
+this.dmq1=new _1(DQ,16);
+this.coeff=new _1(C,16);
+}else{
+throw new Error("Invalid RSA private key");
+}
+},generate:function(B,E){
+var _5=this.rngf(),qs=B>>1;
+this.e=parseInt(E,16);
+var ee=new _1(E,16);
+for(;;){
+for(;;){
+this.p=new _1(B-qs,1,_5);
+if(!this.p.subtract(_1.ONE).gcd(ee).compareTo(_1.ONE)&&this.p.isProbablePrime(10)){
+break;
+}
+}
+for(;;){
+this.q=new _1(qs,1,_5);
+if(!this.q.subtract(_1.ONE).gcd(ee).compareTo(_1.ONE)&&this.q.isProbablePrime(10)){
+break;
+}
+}
+if(this.p.compareTo(this.q)<=0){
+var t=this.p;
+this.p=this.q;
+this.q=t;
+}
+var p1=this.p.subtract(_1.ONE);
+var q1=this.q.subtract(_1.ONE);
+var _6=p1.multiply(q1);
+if(!_6.gcd(ee).compareTo(_1.ONE)){
+this.n=this.p.multiply(this.q);
+this.d=ee.modInverse(_6);
+this.dmp1=this.d.mod(p1);
+this.dmq1=this.d.mod(q1);
+this.coeff=this.q.modInverse(this.p);
+break;
+}
+}
+_5.destroy();
+},decrypt:function(_7){
+var c=new _1(_7,16),m;
+if(!this.p||!this.q){
+m=c.modPow(this.d,this.n);
+}else{
+var cp=c.mod(this.p).modPow(this.dmp1,this.p),cq=c.mod(this.q).modPow(this.dmq1,this.q);
+while(cp.compareTo(cq)<0){
+cp=cp.add(this.p);
+}
+m=cp.subtract(cq).multiply(this.coeff).mod(this.p).multiply(this.q).add(cq);
+}
+if(!m){
+return null;
+}
+return _2(m,(this.n.bitLength()+7)>>3);
+}});
+})();
+}
diff --git a/dojox/encoding/crypto/RSAKey.js b/dojox/encoding/crypto/RSAKey.js
new file mode 100644
index 0000000..8c37351
--- /dev/null
+++ b/dojox/encoding/crypto/RSAKey.js
@@ -0,0 +1,66 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.encoding.crypto.RSAKey"]){
+dojo._hasResource["dojox.encoding.crypto.RSAKey"]=true;
+dojo.provide("dojox.encoding.crypto.RSAKey");
+dojo.experimental("dojox.encoding.crypto.RSAKey");
+dojo.require("dojox.math.BigInteger");
+dojo.require("dojox.math.random.Simple");
+(function(){
+var dm=dojox.math,_1=dm.BigInteger,_2=dm.random.Simple,_3=function(){
+return new _2();
+};
+function _4(s,n,_5){
+if(n<s.length+11){
+throw new Error("Message too long for RSA");
+}
+var ba=new Array(n);
+var i=s.length;
+while(i&&n){
+ba[--n]=s.charCodeAt(--i);
+}
+ba[--n]=0;
+var _6=_5();
+var x=[0];
+while(n>2){
+x[0]=0;
+while(x[0]==0){
+_6.nextBytes(x);
+}
+ba[--n]=x[0];
+}
+ba[--n]=2;
+ba[--n]=0;
+_6.destroy();
+return new _1(ba);
+};
+dojo.declare("dojox.encoding.crypto.RSAKey",null,{constructor:function(_7){
+this.rngf=_7||_3;
+this.e=0;
+this.n=this.d=this.p=this.q=this.dmp1=this.dmq1=this.coeff=null;
+},setPublic:function(N,E){
+if(N&&E&&N.length&&E.length){
+this.n=new _1(N,16);
+this.e=parseInt(E,16);
+}else{
+throw new Error("Invalid RSA public key");
+}
+},encrypt:function(_8){
+var m=_4(_8,(this.n.bitLength()+7)>>3,this.rngf);
+if(!m){
+return null;
+}
+var c=m.modPowInt(this.e,this.n);
+if(!c){
+return null;
+}
+var h=c.toString(16);
+return h.length%2?"0"+h:h;
+}});
+})();
+}
diff --git a/dojox/encoding/crypto/SimpleAES.js b/dojox/encoding/crypto/SimpleAES.js
index 42bd1af..5b8c16b 100644
--- a/dojox/encoding/crypto/SimpleAES.js
+++ b/dojox/encoding/crypto/SimpleAES.js
@@ -16,27 +16,27 @@ var _2=[[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],
 function _3(_4,w){
 var Nb=4;
 var Nr=w.length/Nb-1;
-var _8=[[],[],[],[]];
+var _5=[[],[],[],[]];
 for(var i=0;i<4*Nb;i++){
-_8[i%4][Math.floor(i/4)]=_4[i];
-}
-_8=_a(_8,w,0,Nb);
-for(var _b=1;_b<Nr;_b++){
-_8=_c(_8,Nb);
-_8=_d(_8,Nb);
-_8=_e(_8,Nb);
-_8=_a(_8,w,_b,Nb);
-}
-_8=_c(_8,Nb);
-_8=_d(_8,Nb);
-_8=_a(_8,w,Nr,Nb);
-var _f=new Array(4*Nb);
+_5[i%4][Math.floor(i/4)]=_4[i];
+}
+_5=_6(_5,w,0,Nb);
+for(var _7=1;_7<Nr;_7++){
+_5=_8(_5,Nb);
+_5=_9(_5,Nb);
+_5=_a(_5,Nb);
+_5=_6(_5,w,_7,Nb);
+}
+_5=_8(_5,Nb);
+_5=_9(_5,Nb);
+_5=_6(_5,w,Nr,Nb);
+var _b=new Array(4*Nb);
 for(var i=0;i<4*Nb;i++){
-_f[i]=_8[i%4][Math.floor(i/4)];
+_b[i]=_5[i%4][Math.floor(i/4)];
 }
-return _f;
+return _b;
 };
-function _c(s,Nb){
+function _8(s,Nb){
 for(var r=0;r<4;r++){
 for(var c=0;c<Nb;c++){
 s[r][c]=_1[s[r][c]];
@@ -44,7 +44,7 @@ s[r][c]=_1[s[r][c]];
 }
 return s;
 };
-function _d(s,Nb){
+function _9(s,Nb){
 var t=new Array(4);
 for(var r=1;r<4;r++){
 for(var c=0;c<4;c++){
@@ -56,7 +56,7 @@ s[r][c]=t[c];
 }
 return s;
 };
-function _e(s,Nb){
+function _a(s,Nb){
 for(var c=0;c<4;c++){
 var a=new Array(4);
 var b=new Array(4);
@@ -71,165 +71,165 @@ s[3][c]=a[0]^b[0]^a[1]^a[2]^b[3];
 }
 return s;
 };
-function _a(_1f,w,rnd,Nb){
+function _6(_c,w,_d,Nb){
 for(var r=0;r<4;r++){
 for(var c=0;c<Nb;c++){
-_1f[r][c]^=w[rnd*4+c][r];
+_c[r][c]^=w[_d*4+c][r];
 }
 }
-return _1f;
+return _c;
 };
-function _25(key){
+function _e(_f){
 var Nb=4;
-var Nk=key.length/4;
+var Nk=_f.length/4;
 var Nr=Nk+6;
 var w=new Array(Nb*(Nr+1));
-var _2b=new Array(4);
+var _10=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]];
+var r=[_f[4*i],_f[4*i+1],_f[4*i+2],_f[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++){
-_2b[t]=w[i-1][t];
+_10[t]=w[i-1][t];
 }
 if(i%Nk==0){
-_2b=_2f(_30(_2b));
+_10=_11(_12(_10));
 for(var t=0;t<4;t++){
-_2b[t]^=_2[i/Nk][t];
+_10[t]^=_2[i/Nk][t];
 }
 }else{
 if(Nk>6&&i%Nk==4){
-_2b=_2f(_2b);
+_10=_11(_10);
 }
 }
 for(var t=0;t<4;t++){
-w[i][t]=w[i-Nk][t]^_2b[t];
+w[i][t]=w[i-Nk][t]^_10[t];
 }
 }
 return w;
 };
-function _2f(w){
+function _11(w){
 for(var i=0;i<4;i++){
 w[i]=_1[w[i]];
 }
 return w;
 };
-function _30(w){
+function _12(w){
 w[4]=w[0];
 for(var i=0;i<4;i++){
 w[i]=w[i+1];
 }
 return w;
 };
-function _35(_36,_37,_38){
-if(!(_38==128||_38==192||_38==256)){
+function _13(_14,_15,_16){
+if(!(_16==128||_16==192||_16==256)){
 return "";
 }
-var _39=_38/8;
-var _3a=new Array(_39);
-for(var i=0;i<_39;i++){
-_3a[i]=_37.charCodeAt(i)&255;
+var _17=_16/8;
+var _18=new Array(_17);
+for(var i=0;i<_17;i++){
+_18[i]=_15.charCodeAt(i)&255;
 }
-var key=_3(_3a,_25(_3a));
-key=key.concat(key.slice(0,_39-16));
-var _3d=16;
-var _3e=new Array(_3d);
-var _3f=(new Date()).getTime();
+var key=_3(_18,_e(_18));
+key=key.concat(key.slice(0,_17-16));
+var _19=16;
+var _1a=new Array(_19);
+var _1b=(new Date()).getTime();
 for(var i=0;i<4;i++){
-_3e[i]=(_3f>>>i*8)&255;
+_1a[i]=(_1b>>>i*8)&255;
 }
 for(var i=0;i<4;i++){
-_3e[i+4]=(_3f/4294967296>>>i*8)&255;
+_1a[i+4]=(_1b/4294967296>>>i*8)&255;
 }
-var _40=_25(key);
-var _41=Math.ceil(_36.length/_3d);
-var _42=new Array(_41);
-for(var b=0;b<_41;b++){
+var _1c=_e(key);
+var _1d=Math.ceil(_14.length/_19);
+var _1e=new Array(_1d);
+for(var b=0;b<_1d;b++){
 for(var c=0;c<4;c++){
-_3e[15-c]=(b>>>c*8)&255;
+_1a[15-c]=(b>>>c*8)&255;
 }
 for(var c=0;c<4;c++){
-_3e[15-c-4]=(b/4294967296>>>c*8);
+_1a[15-c-4]=(b/4294967296>>>c*8);
 }
-var _45=_3(_3e,_40);
-var _46=b<_41-1?_3d:(_36.length-1)%_3d+1;
+var _1f=_3(_1a,_1c);
+var _20=b<_1d-1?_19:(_14.length-1)%_19+1;
 var ct="";
-for(var i=0;i<_46;i++){
-var _48=_36.charCodeAt(b*_3d+i);
-var _49=_48^_45[i];
-ct+=((_49<16)?"0":"")+_49.toString(16);
+for(var i=0;i<_20;i++){
+var _21=_14.charCodeAt(b*_19+i);
+var _22=_21^_1f[i];
+ct+=((_22<16)?"0":"")+_22.toString(16);
 }
-_42[b]=ct;
+_1e[b]=ct;
 }
-var _4a="";
+var _23="";
 for(var i=0;i<8;i++){
-_4a+=((_3e[i]<16)?"0":"")+_3e[i].toString(16);
+_23+=((_1a[i]<16)?"0":"")+_1a[i].toString(16);
 }
-return _4a+" "+_42.join(" ");
+return _23+" "+_1e.join(" ");
 };
-function _4b(s){
+function _24(s){
 var ret=[];
 s.replace(/(..)/g,function(str){
 ret.push(parseInt(str,16));
 });
 return ret;
 };
-function _4f(_50,_51,_52){
-if(!(_52==128||_52==192||_52==256)){
+function _25(_26,_27,_28){
+if(!(_28==128||_28==192||_28==256)){
 return "";
 }
-var _53=_52/8;
-var _54=new Array(_53);
-for(var i=0;i<_53;i++){
-_54[i]=_51.charCodeAt(i)&255;
-}
-var _56=_25(_54);
-var key=_3(_54,_56);
-key=key.concat(key.slice(0,_53-16));
-var _58=_25(key);
-_50=_50.split(" ");
-var _59=16;
-var _5a=new Array(_59);
-var _5b=_50[0];
-_5a=_4b(_5b);
-var _5c=new Array(_50.length-1);
-for(var b=1;b<_50.length;b++){
+var _29=_28/8;
+var _2a=new Array(_29);
+for(var i=0;i<_29;i++){
+_2a[i]=_27.charCodeAt(i)&255;
+}
+var _2b=_e(_2a);
+var key=_3(_2a,_2b);
+key=key.concat(key.slice(0,_29-16));
+var _2c=_e(key);
+_26=_26.split(" ");
+var _2d=16;
+var _2e=new Array(_2d);
+var _2f=_26[0];
+_2e=_24(_2f);
+var _30=new Array(_26.length-1);
+for(var b=1;b<_26.length;b++){
 for(var c=0;c<4;c++){
-_5a[15-c]=((b-1)>>>c*8)&255;
+_2e[15-c]=((b-1)>>>c*8)&255;
 }
 for(var c=0;c<4;c++){
-_5a[15-c-4]=((b/4294967296-1)>>>c*8)&255;
+_2e[15-c-4]=((b/4294967296-1)>>>c*8)&255;
 }
-var _5f=_3(_5a,_58);
+var _31=_3(_2e,_2c);
 var pt="";
-var tmp=_4b(_50[b]);
+var tmp=_24(_26[b]);
 for(var i=0;i<tmp.length;i++){
-var _62=_50[b].charCodeAt(i);
-var _63=tmp[i]^_5f[i];
-pt+=String.fromCharCode(_63);
+var _32=_26[b].charCodeAt(i);
+var _33=tmp[i]^_31[i];
+pt+=String.fromCharCode(_33);
 }
-_5c[b-1]=pt;
+_30[b-1]=pt;
 }
-return _5c.join("");
+return _30.join("");
 };
-function _64(str){
+function _34(str){
 return str.replace(/[\0\t\n\v\f\r\xa0!-]/g,function(c){
 return "!"+c.charCodeAt(0)+"!";
 });
 };
-function _67(str){
+function _35(str){
 return str.replace(/!\d\d?\d?!/g,function(c){
 return String.fromCharCode(c.slice(1,-1));
 });
 };
 dojox.encoding.crypto.SimpleAES=new (function(){
-this.encrypt=function(_6a,key){
-return _35(_6a,key,256);
+this.encrypt=function(_36,key){
+return _13(_36,key,256);
 };
-this.decrypt=function(_6c,key){
-return _4f(_6c,key,256);
+this.decrypt=function(_37,key){
+return _25(_37,key,256);
 };
 })();
 })();
diff --git a/dojox/encoding/digests/MD5.js b/dojox/encoding/digests/MD5.js
index 274621a..b28f979 100644
--- a/dojox/encoding/digests/MD5.js
+++ b/dojox/encoding/digests/MD5.js
@@ -30,18 +30,18 @@ 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);
 };
-function _2d(x,len){
-x[len>>5]|=128<<((len)%32);
-x[(((len+64)>>>9)<<4)+14]=len;
+function _3(x,_4){
+x[_4>>5]|=128<<((_4)%32);
+x[(((_4+64)>>>9)<<4)+14]=_4;
 var a=1732584193;
 var b=-271733879;
 var c=-1732584194;
 var d=271733878;
 for(var i=0;i<x.length;i+=16){
-var _35=a;
-var _36=b;
-var _37=c;
-var _38=d;
+var _5=a;
+var _6=b;
+var _7=c;
+var _8=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);
@@ -106,30 +106,30 @@ 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=_1.addWords(a,_35);
-b=_1.addWords(b,_36);
-c=_1.addWords(c,_37);
-d=_1.addWords(d,_38);
+a=_1.addWords(a,_5);
+b=_1.addWords(b,_6);
+c=_1.addWords(c,_7);
+d=_1.addWords(d,_8);
 }
 return [a,b,c,d];
 };
-function _39(_3a,key){
-var wa=_1.stringToWord(key);
+function _9(_a,_b){
+var wa=_1.stringToWord(_b);
 if(wa.length>16){
-wa=_2d(wa,key.length*_2);
+wa=_3(wa,_b.length*_2);
 }
 var l=[],r=[];
 for(var i=0;i<16;i++){
 l[i]=wa[i]^909522486;
 r[i]=wa[i]^1549556828;
 }
-var h=_2d(l.concat(_1.stringToWord(_3a)),512+_3a.length*_2);
-return _2d(r.concat(h),640);
+var h=_3(l.concat(_1.stringToWord(_a)),512+_a.length*_2);
+return _3(r.concat(h),640);
 };
-_1.MD5=function(_41,_42){
-var out=_42||_1.outputTypes.Base64;
-var wa=_2d(_1.stringToWord(_41),_41.length*_2);
-switch(out){
+_1.MD5=function(_c,_d){
+var _e=_d||_1.outputTypes.Base64;
+var wa=_3(_1.stringToWord(_c),_c.length*_2);
+switch(_e){
 case _1.outputTypes.Raw:
 return wa;
 case _1.outputTypes.Hex:
@@ -140,9 +140,9 @@ default:
 return _1.wordToBase64(wa);
 }
 };
-_1.MD5._hmac=function(_45,key,_47){
-var out=_47||_1.outputTypes.Base64;
-var wa=_39(_45,key);
+_1.MD5._hmac=function(_f,key,_10){
+var out=_10||_1.outputTypes.Base64;
+var wa=_9(_f,key);
 switch(out){
 case _1.outputTypes.Raw:
 return wa;
diff --git a/dojox/encoding/digests/SHA1.js b/dojox/encoding/digests/SHA1.js
index d7ba01f..aec8483 100644
--- a/dojox/encoding/digests/SHA1.js
+++ b/dojox/encoding/digests/SHA1.js
@@ -30,12 +30,12 @@ return b^c^d;
 function KT(t){
 return (t<20)?1518500249:(t<40)?1859775393:(t<60)?-1894007588:-899497514;
 };
-function _e(x,len){
-x[len>>5]|=128<<(24-len%32);
-x[((len+64>>9)<<4)+15]=len;
+function _4(x,_5){
+x[_5>>5]|=128<<(24-_5%32);
+x[((_5+64>>9)<<4)+15]=_5;
 var w=new Array(80),a=1732584193,b=-271733879,c=-1732584194,d=271733878,e=-1009589776;
 for(var i=0;i<x.length;i+=16){
-var _18=a,_19=b,_1a=c,_1b=d,_1c=e;
+var _6=a,_7=b,_8=c,_9=d,_a=e;
 for(var j=0;j<80;j++){
 if(j<16){
 w[j]=x[i+j];
@@ -49,49 +49,49 @@ c=R(b,30);
 b=a;
 a=t;
 }
-a=_1.addWords(a,_18);
-b=_1.addWords(b,_19);
-c=_1.addWords(c,_1a);
-d=_1.addWords(d,_1b);
-e=_1.addWords(e,_1c);
+a=_1.addWords(a,_6);
+b=_1.addWords(b,_7);
+c=_1.addWords(c,_8);
+d=_1.addWords(d,_9);
+e=_1.addWords(e,_a);
 }
 return [a,b,c,d,e];
 };
-function _1f(_20,key){
-var wa=_23(key);
+function _b(_c,_d){
+var wa=_e(_d);
 if(wa.length>16){
-wa=_e(wa,key.length*_2);
+wa=_4(wa,_d.length*_2);
 }
-var _24=new Array(16),_25=new Array(16);
+var _f=new Array(16),_10=new Array(16);
 for(var i=0;i<16;i++){
-_24[i]=wa[i]^909522486;
-_25[i]=wa[i]^1549556828;
+_f[i]=wa[i]^909522486;
+_10[i]=wa[i]^1549556828;
 }
-var _27=_e(_24.concat(_23(_20)),512+_20.length*_2);
-return _e(_25.concat(_27),512+160);
+var _11=_4(_f.concat(_e(_c)),512+_c.length*_2);
+return _4(_10.concat(_11),512+160);
 };
-function _23(s){
+function _e(s){
 var wa=[];
 for(var i=0,l=s.length*_2;i<l;i+=_2){
 wa[i>>5]|=(s.charCodeAt(i/_2)&_3)<<(32-_2-i%32);
 }
 return wa;
 };
-function _2c(wa){
+function _12(wa){
 var h="0123456789abcdef",s=[];
 for(var i=0,l=wa.length*4;i<l;i++){
 s.push(h.charAt((wa[i>>2]>>((3-i%4)*8+4))&15),h.charAt((wa[i>>2]>>((3-i%4)*8))&15));
 }
 return s.join("");
 };
-function _32(wa){
+function _13(wa){
 var s=[];
 for(var i=0,l=wa.length*32;i<l;i+=_2){
 s.push(String.fromCharCode((wa[i>>5]>>>(32-_2-i%32))&_3));
 }
 return s.join("");
 };
-function _37(wa){
+function _14(wa){
 var p="=",tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=[];
 for(var i=0,l=wa.length*4;i<l;i+=3){
 var t=(((wa[i>>2]>>8*(3-i%4))&255)<<16)|(((wa[i+1>>2]>>8*(3-(i+1)%4))&255)<<8)|((wa[i+2>>2]>>8*(3-(i+2)%4))&255);
@@ -105,32 +105,32 @@ s.push(tab.charAt((t>>6*(3-j))&63));
 }
 return s.join("");
 };
-_1.SHA1=function(_40,_41){
-var out=_41||_1.outputTypes.Base64;
-var wa=_e(_23(_40),_40.length*_2);
+_1.SHA1=function(_15,_16){
+var out=_16||_1.outputTypes.Base64;
+var wa=_4(_e(_15),_15.length*_2);
 switch(out){
 case _1.outputTypes.Raw:
 return wa;
 case _1.outputTypes.Hex:
-return _2c(wa);
+return _12(wa);
 case _1.outputTypes.String:
-return _32(wa);
+return _13(wa);
 default:
-return _37(wa);
+return _14(wa);
 }
 };
-_1.SHA1._hmac=function(_44,key,_46){
-var out=_46||_1.outputTypes.Base64;
-var wa=_1f(_44,key);
+_1.SHA1._hmac=function(_17,key,_18){
+var out=_18||_1.outputTypes.Base64;
+var wa=_b(_17,key);
 switch(out){
 case _1.outputTypes.Raw:
 return wa;
 case _1.outputTypes.Hex:
-return _2c(wa);
+return _12(wa);
 case _1.outputTypes.String:
-return _32(wa);
+return _13(wa);
 default:
-return _37(wa);
+return _14(wa);
 }
 };
 })();
diff --git a/dojox/encoding/digests/_base.js b/dojox/encoding/digests/_base.js
index 3552903..7a379ef 100644
--- a/dojox/encoding/digests/_base.js
+++ b/dojox/encoding/digests/_base.js
@@ -16,19 +16,19 @@ var l=(a&65535)+(b&65535);
 var m=(a>>16)+(b>>16)+(l>>16);
 return (m<<16)|(l&65535);
 };
-var _6=8;
-var _7=(1<<_6)-1;
+var _1=8;
+var _2=(1<<_1)-1;
 d.stringToWord=function(s){
 var wa=[];
-for(var i=0,l=s.length*_6;i<l;i+=_6){
-wa[i>>5]|=(s.charCodeAt(i/_6)&_7)<<(i%32);
+for(var i=0,l=s.length*_1;i<l;i+=_1){
+wa[i>>5]|=(s.charCodeAt(i/_1)&_2)<<(i%32);
 }
 return wa;
 };
 d.wordToString=function(wa){
 var s=[];
-for(var i=0,l=wa.length*32;i<l;i+=_6){
-s.push(String.fromCharCode((wa[i>>5]>>>(i%32))&_7));
+for(var i=0,l=wa.length*32;i<l;i+=_1){
+s.push(String.fromCharCode((wa[i>>5]>>>(i%32))&_2));
 }
 return s.join("");
 };
@@ -40,14 +40,14 @@ s.push(h.charAt((wa[i>>2]>>((i%4)*8+4))&15)+h.charAt((wa[i>>2]>>((i%4)*8))&15));
 return s.join("");
 };
 d.wordToBase64=function(wa){
-var p="=",tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=[];
+var p="=",_3="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=[];
 for(var i=0,l=wa.length*4;i<l;i+=3){
 var t=(((wa[i>>2]>>8*(i%4))&255)<<16)|(((wa[i+1>>2]>>8*((i+1)%4))&255)<<8)|((wa[i+2>>2]>>8*((i+2)%4))&255);
 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))&63));
+s.push(_3.charAt((t>>6*(3-j))&63));
 }
 }
 }
diff --git a/dojox/encoding/easy64.js b/dojox/encoding/easy64.js
index fd7dae6..4d6b271 100644
--- a/dojox/encoding/easy64.js
+++ b/dojox/encoding/easy64.js
@@ -9,30 +9,30 @@ if(!dojo._hasResource["dojox.encoding.easy64"]){
 dojo._hasResource["dojox.encoding.easy64"]=true;
 dojo.provide("dojox.encoding.easy64");
 (function(){
-var c=function(_2,_3,_4){
-for(var i=0;i<_3;i+=3){
-_4.push(String.fromCharCode((_2[i]>>>2)+33),String.fromCharCode(((_2[i]&3)<<4)+(_2[i+1]>>>4)+33),String.fromCharCode(((_2[i+1]&15)<<2)+(_2[i+2]>>>6)+33),String.fromCharCode((_2[i+2]&63)+33));
+var c=function(_1,_2,_3){
+for(var i=0;i<_2;i+=3){
+_3.push(String.fromCharCode((_1[i]>>>2)+33),String.fromCharCode(((_1[i]&3)<<4)+(_1[i+1]>>>4)+33),String.fromCharCode(((_1[i+1]&15)<<2)+(_1[i+2]>>>6)+33),String.fromCharCode((_1[i+2]&63)+33));
 }
 };
-dojox.encoding.easy64.encode=function(_6){
-var _7=[],_8=_6.length%3,_9=_6.length-_8;
-c(_6,_9,_7);
-if(_8){
-var t=_6.slice(_9);
+dojox.encoding.easy64.encode=function(_4){
+var _5=[],_6=_4.length%3,_7=_4.length-_6;
+c(_4,_7,_5);
+if(_6){
+var t=_4.slice(_7);
 while(t.length<3){
 t.push(0);
 }
-c(t,3,_7);
-for(var i=3;i>_8;_7.pop(),--i){
+c(t,3,_5);
+for(var i=3;i>_6;_5.pop(),--i){
 }
 }
-return _7.join("");
+return _5.join("");
 };
-dojox.encoding.easy64.decode=function(_c){
-var n=_c.length,r=[],b=[0,0,0,0],i,j,d;
+dojox.encoding.easy64.decode=function(_8){
+var n=_8.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]=_c.charCodeAt(i+j)-33;
+b[j]=_8.charCodeAt(i+j)-33;
 }
 d=n-i;
 for(j=d;j<4;b[++j]=0){
diff --git a/dojox/flash/DojoExternalInterface.as b/dojox/flash/DojoExternalInterface.as
index e2f71a6..37fa6da 100644
--- a/dojox/flash/DojoExternalInterface.as
+++ b/dojox/flash/DojoExternalInterface.as
@@ -1,177 +1,177 @@
-/**
-	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;
-		
-		// make sure we can play nice in XD settings
-		System.security.allowDomain(unescape(_root.xdomain));
-	}
-	
-	/** 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;
-		}
-		
-		//      JAC: Using unicode character 0001 to store instead of Unicode null 
-		//      which causes trouble 
-		data = replaceStr(data, "&custom_null;", "\u0001");
-		
-		// 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;", "\\");
-		
-		return data;
-	}
-	
-	private static function encodeData(data):String{	
-		if(!data || typeof data != "string"){
-			return data;
-		}
-		
-		// double encode all entity values, or they will be mis-decoded 
-		// by Flash when returned 
-		data = replaceStr(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;');
-		data = replaceStr(data, "\u0001", "&custom_null;");
-		
-		// 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 unescape(path);
-	}
-}
+/**
+	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;
+		
+		// make sure we can play nice in XD settings
+		System.security.allowDomain(unescape(_root.xdomain));
+	}
+	
+	/** 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;
+		}
+		
+		//      JAC: Using unicode character 0001 to store instead of Unicode null 
+		//      which causes trouble 
+		data = replaceStr(data, "&custom_null;", "\u0001");
+		
+		// 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;", "\\");
+		
+		return data;
+	}
+	
+	private static function encodeData(data):String{	
+		if(!data || typeof data != "string"){
+			return data;
+		}
+		
+		// double encode all entity values, or they will be mis-decoded 
+		// by Flash when returned 
+		data = replaceStr(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;');
+		data = replaceStr(data, "\u0001", "&custom_null;");
+		
+		// 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 unescape(path);
+	}
+}
diff --git a/dojox/flash/ExpressInstall.as b/dojox/flash/ExpressInstall.as
index 1801171..a4e9bdb 100644
--- a/dojox/flash/ExpressInstall.as
+++ b/dojox/flash/ExpressInstall.as
@@ -1,71 +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+"')");
-	}
-}
+/**
+ * Based on the expressinstall.as class created by Geoff Stearns as part
+ * of the FlashObject library.
+ *
+ * Use this file to invoke the Macromedia Flash Player Express Install functionality
+ * This file is intended for use with the FlashObject embed script. You can download FlashObject 
+ * and this file at the following URL: http://blog.deconcept.com/flashobject/
+ *
+ * Usage: 
+ *          var ExpressInstall = new ExpressInstall();
+ *          
+ *          // test to see if install is needed:
+ *          if (ExpressInstall.needsUpdate) { // returns true if update is needed
+ *              ExpressInstall.init(); // starts the update
+ *          }
+ *
+ *	NOTE: Your Flash movie must be at least 214px by 137px in order to use ExpressInstall.
+ *
+ */
+
+class ExpressInstall{
+	public var needsUpdate:Boolean;
+	private var updater:MovieClip;
+	private var hold:MovieClip;
+	
+	public function ExpressInstall(){
+		// does the user need to update?
+		this.needsUpdate = (_root.MMplayerType == undefined) ? false : true;	
+	}
+
+	public function init():Void{
+		this.loadUpdater();
+	}
+
+	public function loadUpdater():Void{
+		System.security.allowDomain("fpdownload.macromedia.com");
+
+		// hope that nothing is at a depth of 10000000, you can change this depth if needed, but you want
+		// it to be on top of your content if you have any stuff on the first frame
+		this.updater = _root.createEmptyMovieClip("expressInstallHolder", 10000000);
+
+		// register the callback so we know if they cancel or there is an error
+		var _self = this;
+		this.updater.installStatus = _self.onInstallStatus;
+		this.hold = this.updater.createEmptyMovieClip("hold", 1);
+
+		// can't use movieClipLoader because it has to work in 6.0.65
+		this.updater.onEnterFrame = function():Void {
+			if(typeof this.hold.startUpdate == 'function'){
+				_self.initUpdater();
+				this.onEnterFrame = null;
+			}
+		}
+
+		var cacheBuster:Number = Math.random();
+
+		this.hold.loadMovie("http://fpdownload.macromedia.com/pub/flashplayer/"
+												+"update/current/swf/autoUpdater.swf?"+ cacheBuster);
+	}
+
+	private function initUpdater():Void{
+		this.hold.redirectURL = _root.MMredirectURL;
+		this.hold.MMplayerType = _root.MMplayerType;
+		this.hold.MMdoctitle = _root.MMdoctitle;
+		this.hold.startUpdate();
+	}
+
+	public function onInstallStatus(msg):Void{
+		getURL("javascript:dojox.flash.install._onInstallStatus('"+msg+"')");
+	}
+}
diff --git a/dojox/flash/_base.js b/dojox/flash/_base.js
index c38bcff..8557a2d 100644
--- a/dojox/flash/_base.js
+++ b/dojox/flash/_base.js
@@ -37,10 +37,10 @@ dojox.flash._installingListeners[i].call(null);
 }
 }
 },_initialize:function(){
-var _7=new dojox.flash.Install();
-dojox.flash.installer=_7;
-if(_7.needed()){
-_7.install();
+var _5=new dojox.flash.Install();
+dojox.flash.installer=_5;
+if(_5.needed()){
+_5.install();
 }else{
 dojox.flash.obj=new dojox.flash.Embed(this._visible);
 dojox.flash.obj.write();
@@ -50,79 +50,79 @@ dojox.flash.comm=new dojox.flash.Communicator();
 dojox.flash.Info=function(){
 this._detectVersion();
 };
-dojox.flash.Info.prototype={version:-1,versionMajor:-1,versionMinor:-1,versionRevision:-1,capable:false,installing:false,isVersionOrAbove:function(_8,_9,_a){
-_a=parseFloat("."+_a);
-if(this.versionMajor>=_8&&this.versionMinor>=_9&&this.versionRevision>=_a){
+dojox.flash.Info.prototype={version:-1,versionMajor:-1,versionMinor:-1,versionRevision:-1,capable:false,installing:false,isVersionOrAbove:function(_6,_7,_8){
+_8=parseFloat("."+_8);
+if(this.versionMajor>=_6&&this.versionMinor>=_7&&this.versionRevision>=_8){
 return true;
 }else{
 return false;
 }
 },_detectVersion:function(){
-var _b;
-for(var _c=25;_c>0;_c--){
+var _9;
+for(var _a=25;_a>0;_a--){
 if(dojo.isIE){
-var _d;
+var _b;
 try{
-if(_c>6){
-_d=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_c);
+if(_a>6){
+_b=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_a);
 }else{
-_d=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
+_b=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
 }
-if(typeof _d=="object"){
-if(_c==6){
-_d.AllowScriptAccess="always";
+if(typeof _b=="object"){
+if(_a==6){
+_b.AllowScriptAccess="always";
 }
-_b=_d.GetVariable("$version");
+_9=_b.GetVariable("$version");
 }
 }
 catch(e){
 continue;
 }
 }else{
-_b=this._JSFlashInfo(_c);
+_9=this._JSFlashInfo(_a);
 }
-if(_b==-1){
+if(_9==-1){
 this.capable=false;
 return;
 }else{
-if(_b!=0){
-var _e;
+if(_9!=0){
+var _c;
 if(dojo.isIE){
-var _f=_b.split(" ");
-var _10=_f[1];
-_e=_10.split(",");
+var _d=_9.split(" ");
+var _e=_d[1];
+_c=_e.split(",");
 }else{
-_e=_b.split(".");
+_c=_9.split(".");
 }
-this.versionMajor=_e[0];
-this.versionMinor=_e[1];
-this.versionRevision=_e[2];
-var _11=this.versionMajor+"."+this.versionRevision;
-this.version=parseFloat(_11);
+this.versionMajor=_c[0];
+this.versionMinor=_c[1];
+this.versionRevision=_c[2];
+var _f=this.versionMajor+"."+this.versionRevision;
+this.version=parseFloat(_f);
 this.capable=true;
 break;
 }
 }
 }
-},_JSFlashInfo:function(_12){
+},_JSFlashInfo:function(_10){
 if(navigator.plugins!=null&&navigator.plugins.length>0){
 if(navigator.plugins["Shockwave Flash 2.0"]||navigator.plugins["Shockwave Flash"]){
-var _13=navigator.plugins["Shockwave Flash 2.0"]?" 2.0":"";
-var _14=navigator.plugins["Shockwave Flash"+_13].description;
-var _15=_14.split(" ");
-var _16=_15[2].split(".");
-var _17=_16[0];
-var _18=_16[1];
-var _19=(_15[3]||_15[4]).split("r");
-var _1a=_19[1]>0?_19[1]:0;
-var _1b=_17+"."+_18+"."+_1a;
-return _1b;
+var _11=navigator.plugins["Shockwave Flash 2.0"]?" 2.0":"";
+var _12=navigator.plugins["Shockwave Flash"+_11].description;
+var _13=_12.split(" ");
+var _14=_13[2].split(".");
+var _15=_14[0];
+var _16=_14[1];
+var _17=(_13[3]||_13[4]).split("r");
+var _18=_17[1]>0?_17[1]:0;
+var _19=_15+"."+_16+"."+_18;
+return _19;
 }
 }
 return -1;
 }};
-dojox.flash.Embed=function(_1c){
-this._visible=_1c;
+dojox.flash.Embed=function(_1a){
+this._visible=_1a;
 };
 dojox.flash.Embed.prototype={width:215,height:138,id:"flashObject",_visible:true,protocol:function(){
 switch(window.location.protocol){
@@ -133,34 +133,34 @@ default:
 return "http";
 break;
 }
-},write:function(_1d){
-var _1e;
-var _1f=dojox.flash.url;
-var _20=_1f;
-var _21=_1f;
-var _22=dojo.baseUrl;
-var _23=document.location.protocol+"//"+document.location.host;
-if(_1d){
-var _24=escape(window.location);
+},write:function(_1b){
+var _1c;
+var _1d=dojox.flash.url;
+var _1e=_1d;
+var _1f=_1d;
+var _20=dojo.baseUrl;
+var _21=document.location.protocol+"//"+document.location.host;
+if(_1b){
+var _22=escape(window.location);
 document.title=document.title.slice(0,47)+" - Flash Player Installation";
-var _25=escape(document.title);
-_20+="?MMredirectURL="+_24+"&MMplayerType=ActiveX"+"&MMdoctitle="+_25+"&baseUrl="+escape(_22)+"&xdomain="+escape(_23);
-_21+="?MMredirectURL="+_24+"&MMplayerType=PlugIn"+"&baseUrl="+escape(_22)+"&xdomain="+escape(_23);
+var _23=escape(document.title);
+_1e+="?MMredirectURL="+_22+"&MMplayerType=ActiveX"+"&MMdoctitle="+_23+"&baseUrl="+escape(_20)+"&xdomain="+escape(_21);
+_1f+="?MMredirectURL="+_22+"&MMplayerType=PlugIn"+"&baseUrl="+escape(_20)+"&xdomain="+escape(_21);
 }else{
-_20+="?cachebust="+new Date().getTime();
-_20+="&baseUrl="+escape(_22);
-_20+="&xdomain="+escape(_23);
+_1e+="?cachebust="+new Date().getTime();
+_1e+="&baseUrl="+escape(_20);
+_1e+="&xdomain="+escape(_21);
 }
-if(_21.indexOf("?")==-1){
-_21+="?baseUrl="+escape(_22);
+if(_1f.indexOf("?")==-1){
+_1f+="?baseUrl="+escape(_20);
 }else{
-_21+="&baseUrl="+escape(_22);
+_1f+="&baseUrl="+escape(_20);
 }
-_21+="&xdomain="+escape(_23);
-_1e="<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=\"always\"></param>\n "+"<param name=\"movie\" value=\""+_20+"\"></param>\n "+"<param name=\"quality\" value=\"high\"></para [...]
+_1f+="&xdomain="+escape(_21);
+_1c="<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=\"always\"></param>\n "+"<param name=\"movie\" value=\""+_1e+"\"></param>\n "+"<param name=\"quality\" value=\"high\"></para [...]
 dojo.connect(dojo,"loaded",dojo.hitch(this,function(){
-var _26=this.id+"Container";
-if(dojo.byId(_26)){
+var _24=this.id+"Container";
+if(dojo.byId(_24)){
 return;
 }
 var div=document.createElement("div");
@@ -172,13 +172,13 @@ div.style.position="absolute";
 div.style.zIndex="10000";
 div.style.top="-1000px";
 }
-div.innerHTML=_1e;
-var _28=document.getElementsByTagName("body");
-if(!_28||!_28.length){
+div.innerHTML=_1c;
+var _25=document.getElementsByTagName("body");
+if(!_25||!_25.length){
 throw new Error("No body tag for this page");
 }
-_28=_28[0];
-_28.appendChild(div);
+_25=_25[0];
+_25.appendChild(div);
 }));
 },get:function(){
 if(dojo.isIE||dojo.isWebKit){
@@ -186,72 +186,72 @@ return dojo.byId(this.id);
 }else{
 return document[this.id+"Embed"];
 }
-},setVisible:function(_29){
-var _2a=dojo.byId(this.id+"Container");
-if(_29){
-_2a.style.position="absolute";
-_2a.style.visibility="visible";
+},setVisible:function(_26){
+var _27=dojo.byId(this.id+"Container");
+if(_26){
+_27.style.position="absolute";
+_27.style.visibility="visible";
 }else{
-_2a.style.position="absolute";
-_2a.style.y="-1000px";
-_2a.style.visibility="hidden";
+_27.style.position="absolute";
+_27.style.y="-1000px";
+_27.style.visibility="hidden";
 }
 },center:function(){
-var _2b=this.width;
-var _2c=this.height;
-var _2d=dijit.getViewport();
-var x=_2d.l+(_2d.w-_2b)/2;
-var y=_2d.t+(_2d.h-_2c)/2;
-var _30=dojo.byId(this.id+"Container");
-_30.style.top=y+"px";
-_30.style.left=x+"px";
+var _28=this.width;
+var _29=this.height;
+var _2a=dijit.getViewport();
+var x=_2a.l+(_2a.w-_28)/2;
+var y=_2a.t+(_2a.h-_29)/2;
+var _2b=dojo.byId(this.id+"Container");
+_2b.style.top=y+"px";
+_2b.style.left=x+"px";
 }};
 dojox.flash.Communicator=function(){
 };
-dojox.flash.Communicator.prototype={_addExternalInterfaceCallback:function(_31){
-var _32=dojo.hitch(this,function(){
-var _33=new Array(arguments.length);
+dojox.flash.Communicator.prototype={_addExternalInterfaceCallback:function(_2c){
+var _2d=dojo.hitch(this,function(){
+var _2e=new Array(arguments.length);
 for(var i=0;i<arguments.length;i++){
-_33[i]=this._encodeData(arguments[i]);
+_2e[i]=this._encodeData(arguments[i]);
 }
-var _35=this._execFlash(_31,_33);
-_35=this._decodeData(_35);
-return _35;
+var _2f=this._execFlash(_2c,_2e);
+_2f=this._decodeData(_2f);
+return _2f;
 });
-this[_31]=_32;
-},_encodeData:function(_36){
-if(!_36||typeof _36!="string"){
-return _36;
-}
-_36=_36.replace("\\","&custom_backslash;");
-_36=_36.replace(/\0/g,"&custom_null;");
-return _36;
-},_decodeData:function(_37){
-if(_37&&_37.length&&typeof _37!="string"){
-_37=_37[0];
-}
-if(!_37||typeof _37!="string"){
-return _37;
-}
-_37=_37.replace(/\&custom_null\;/g,"\x00");
-_37=_37.replace(/\&custom_lt\;/g,"<").replace(/\&custom_gt\;/g,">").replace(/\&custom_backslash\;/g,"\\");
-return _37;
-},_execFlash:function(_38,_39){
-var _3a=dojox.flash.obj.get();
-_39=(_39)?_39:[];
-for(var i=0;i<_39;i++){
-if(typeof _39[i]=="string"){
-_39[i]=this._encodeData(_39[i]);
-}
-}
-var _3c=function(){
-return eval(_3a.CallFunction("<invoke name=\""+_38+"\" returntype=\"javascript\">"+__flash__argumentsToXML(_39,0)+"</invoke>"));
+this[_2c]=_2d;
+},_encodeData:function(_30){
+if(!_30||typeof _30!="string"){
+return _30;
+}
+_30=_30.replace("\\","&custom_backslash;");
+_30=_30.replace(/\0/g,"&custom_null;");
+return _30;
+},_decodeData:function(_31){
+if(_31&&_31.length&&typeof _31!="string"){
+_31=_31[0];
+}
+if(!_31||typeof _31!="string"){
+return _31;
+}
+_31=_31.replace(/\&custom_null\;/g,"\x00");
+_31=_31.replace(/\&custom_lt\;/g,"<").replace(/\&custom_gt\;/g,">").replace(/\&custom_backslash\;/g,"\\");
+return _31;
+},_execFlash:function(_32,_33){
+var _34=dojox.flash.obj.get();
+_33=(_33)?_33:[];
+for(var i=0;i<_33;i++){
+if(typeof _33[i]=="string"){
+_33[i]=this._encodeData(_33[i]);
+}
+}
+var _35=function(){
+return eval(_34.CallFunction("<invoke name=\""+_32+"\" returntype=\"javascript\">"+__flash__argumentsToXML(_33,0)+"</invoke>"));
 };
-var _3d=_3c.call(_39);
-if(typeof _3d=="string"){
-_3d=this._decodeData(_3d);
+var _36=_35.call(_33);
+if(typeof _36=="string"){
+_36=this._decodeData(_36);
 }
-return _3d;
+return _36;
 }};
 dojox.flash.Install=function(){
 };
@@ -264,18 +264,18 @@ return true;
 }
 return false;
 },install:function(){
-var _3e;
+var _37;
 dojox.flash.info.installing=true;
 dojox.flash.installing();
 if(dojox.flash.info.capable==false){
-_3e=new dojox.flash.Embed(false);
-_3e.write();
+_37=new dojox.flash.Embed(false);
+_37.write();
 }else{
 if(dojox.flash.info.isVersionOrAbove(6,0,65)){
-_3e=new dojox.flash.Embed(false);
-_3e.write(true);
-_3e.setVisible(true);
-_3e.center();
+_37=new dojox.flash.Embed(false);
+_37.write(true);
+_37.setVisible(true);
+_37.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";
diff --git a/dojox/form/BusyButton.js b/dojox/form/BusyButton.js
index da54e85..018b547 100644
--- a/dojox/form/BusyButton.js
+++ b/dojox/form/BusyButton.js
@@ -16,6 +16,7 @@ if(!this.busyLabel){
 this.busyLabel=dojo.i18n.getLocalization("dijit","loading",this.lang).loadingState;
 }
 },postCreate:function(){
+this.inherited(arguments);
 this._label=this.containerNode.innerHTML;
 this._initTimeout=this.timeout;
 if(this.isBusy){
@@ -52,7 +53,6 @@ while(this.containerNode.firstChild){
 this.containerNode.removeChild(this.containerNode.firstChild);
 }
 this.containerNode.innerHTML=this.label;
-this._layoutHack();
 if(this.showLabel==false&&!(dojo.attr(this.domNode,"title"))){
 this.titleNode.title=dojo.trim(this.containerNode.innerText||this.containerNode.textContent||"");
 }
diff --git a/dojox/form/CheckedMultiSelect.js b/dojox/form/CheckedMultiSelect.js
index 4a9d410..cb0fdd3 100644
--- a/dojox/form/CheckedMultiSelect.js
+++ b/dojox/form/CheckedMultiSelect.js
@@ -9,9 +9,9 @@ if(!dojo._hasResource["dojox.form.CheckedMultiSelect"]){
 dojo._hasResource["dojox.form.CheckedMultiSelect"]=true;
 dojo.provide("dojox.form.CheckedMultiSelect");
 dojo.require("dijit.form.CheckBox");
-dojo.require("dojox.form._FormSelectWidget");
-dojo.declare("dojox.form._CheckedMultiSelectItem",[dijit._Widget,dijit._Templated],{widgetsInTemplate:true,templateString:"<div class=\"dijitReset ${baseClass}\"\n\t><input class=\"${baseClass}Box\" dojoType=\"dijit.form.CheckBox\" dojoAttachPoint=\"checkBox\" \n\t\tdojoAttachEvent=\"_onClick:_changeBox\" type=\"${_type.type}\" baseClass=\"${_type.baseClass}\"\n\t><div class=\"dijitInline ${baseClass}Label\" dojoAttachPoint=\"labelNode\" dojoAttachEvent=\"onmousedown:_onMouse,onmouseover [...]
-if(this.parent._multiValue){
+dojo.require("dijit.form._FormSelectWidget");
+dojo.declare("dojox.form._CheckedMultiSelectItem",[dijit._Widget,dijit._Templated],{widgetsInTemplate:true,templateString:dojo.cache("dojox.form","resources/_CheckedMultiSelectItem.html","<div class=\"dijitReset ${baseClass}\"\n\t><input class=\"${baseClass}Box\" dojoType=\"dijit.form.CheckBox\" dojoAttachPoint=\"checkBox\" \n\t\tdojoAttachEvent=\"_onClick:_changeBox\" type=\"${_type.type}\" baseClass=\"${_type.baseClass}\"\n\t><div class=\"dijitInline ${baseClass}Label\" dojoAttachPoint [...]
+if(this.parent.multiple){
 this._type={type:"checkbox",baseClass:"dijitCheckBox"};
 }else{
 this._type={type:"radio",baseClass:"dijitRadio"};
@@ -25,7 +25,7 @@ this.labelNode.innerHTML=this.option.label;
 if(this.attr("disabled")||this.attr("readOnly")){
 return;
 }
-if(this.parent._multiValue){
+if(this.parent.multiple){
 this.option.selected=this.checkBox.attr("value")&&true;
 }else{
 this.parent.attr("value",this.option.value);
@@ -46,19 +46,19 @@ this.checkBox._onClick(e);
 }
 },_updateBox:function(){
 this.checkBox.attr("value",this.option.selected);
-},_setDisabledAttr:function(_3){
-this.disabled=_3||this.option.disabled;
+},_setDisabledAttr:function(_1){
+this.disabled=_1||this.option.disabled;
 this.checkBox.attr("disabled",this.disabled);
 dojo.toggleClass(this.domNode,"dojoxMultiSelectDisabled",this.disabled);
-},_setReadOnlyAttr:function(_4){
-this.checkBox.attr("readOnly",_4);
+},_setReadOnlyAttr:function(_2){
+this.checkBox.attr("readOnly",_2);
 this.checkBox._setStateClass();
-this.readOnly=_4;
+this.readOnly=_2;
 }});
-dojo.declare("dojox.form.CheckedMultiSelect",dojox.form._FormSelectWidget,{templateString:"",templateString:"<div class=\"dijit dijitReset dijitInline\" dojoAttachEvent=\"onmousedown:_mouseDown,onclick:focus\"\n\t><select class=\"${baseClass}Select\" multiple=\"true\" dojoAttachPoint=\"containerNode,focusNode\"></select\n\t><div dojoAttachPoint=\"wrapperDiv\"></div\n></div>\n",baseClass:"dojoxMultiSelect",_mouseDown:function(e){
+dojo.declare("dojox.form.CheckedMultiSelect",dijit.form._FormSelectWidget,{templateString:dojo.cache("dojox.form","resources/CheckedMultiSelect.html","<div class=\"dijit dijitReset dijitInline\" dojoAttachEvent=\"onmousedown:_mouseDown,onclick:focus\"\n\t><select class=\"${baseClass}Select\" multiple=\"true\" dojoAttachPoint=\"containerNode,focusNode\"></select\n\t><div dojoAttachPoint=\"wrapperDiv\"></div\n></div>\n"),baseClass:"dojoxMultiSelect",_mouseDown:function(e){
 dojo.stopEvent(e);
-},_addOptionItem:function(_6){
-this.wrapperDiv.appendChild(new dojox.form._CheckedMultiSelectItem({option:_6,parent:this}).domNode);
+},_addOptionItem:function(_3){
+this.wrapperDiv.appendChild(new dojox.form._CheckedMultiSelectItem({option:_3,parent:this}).domNode);
 },_updateSelection:function(){
 this.inherited(arguments);
 dojo.forEach(this._getChildren(),function(c){
@@ -68,32 +68,33 @@ c._updateBox();
 return dojo.map(this.wrapperDiv.childNodes,function(n){
 return dijit.byNode(n);
 });
-},invertSelection:function(_9){
+},invertSelection:function(_4){
 dojo.forEach(this.options,function(i){
 i.selected=!i.selected;
 });
 this._updateSelection();
-},_setDisabledAttr:function(_b){
+},_setDisabledAttr:function(_5){
 this.inherited(arguments);
-dojo.forEach(this._getChildren(),function(_c){
-if(_c&&_c.attr){
-_c.attr("disabled",_b);
+dojo.forEach(this._getChildren(),function(_6){
+if(_6&&_6.attr){
+_6.attr("disabled",_5);
 }
 });
-},_setReadOnlyAttr:function(_d){
+},_setReadOnlyAttr:function(_7){
 if("readOnly" in this.attributeMap){
-this._attrToDom("readOnly",_d);
+this._attrToDom("readOnly",_7);
 }
-this.readOnly=_d;
-dojo.forEach(this._getChildren(),function(_e){
-if(_e&&_e.attr){
-_e.attr("readOnly",_d);
+this.readOnly=_7;
+dojo.forEach(this._getChildren(),function(_8){
+if(_8&&_8.attr){
+_8.attr("readOnly",_7);
 }
 });
 this._setStateClass();
 },uninitialize:function(){
-dojo.forEach(this._getChildren(),function(_f){
-_f.destroyRecursive();
+dojo.forEach(this._getChildren(),function(_9){
+_9.destroyRecursive();
 });
+this.inherited(arguments);
 }});
 }
diff --git a/dojox/form/DateTextBox.js b/dojox/form/DateTextBox.js
index d99b16d..67a8289 100644
--- a/dojox/form/DateTextBox.js
+++ b/dojox/form/DateTextBox.js
@@ -8,6 +8,7 @@
 if(!dojo._hasResource["dojox.form.DateTextBox"]){
 dojo._hasResource["dojox.form.DateTextBox"]=true;
 dojo.provide("dojox.form.DateTextBox");
+dojo.experimental("dojox.form.DateTextBox");
 dojo.require("dojox.widget.Calendar");
 dojo.require("dojox.widget.CalendarViews");
 dojo.require("dijit.form._DateTimeTextBox");
@@ -15,44 +16,67 @@ dojo.declare("dojox.form.DateTextBox",dijit.form._DateTimeTextBox,{popupClass:"d
 this.inherited(arguments);
 dojo.style(this._picker.domNode.parentNode,"position","absolute");
 }});
-dojo.declare("dojox.form.DayTextBox",dojox.form.DateTextBox,{popupClass:"dojox.widget.DailyCalendar",format:function(_1){
-return _1.getDate();
-},validator:function(_2){
-var _3=Number(_2);
-var _4=/(^-?\d\d*$)/.test(String(_2));
-return _2==""||_2==null||(_4&&_3>=1&&_3<=31);
+dojo.declare("dojox.form.DayTextBox",dojox.form.DateTextBox,{popupClass:"dojox.widget.DailyCalendar",parse:function(_1){
+return _1;
+},format:function(_2){
+return _2.getDate?_2.getDate():_2;
+},validator:function(_3){
+var _4=Number(_3);
+var _5=/(^-?\d\d*$)/.test(String(_3));
+return _3==""||_3==null||(_5&&_4>=1&&_4<=31);
 },_open:function(){
 this.inherited(arguments);
-this._picker.onValueSelected=dojo.hitch(this,function(_5){
+this._picker.onValueSelected=dojo.hitch(this,function(_6){
 this.focus();
 setTimeout(dojo.hitch(this,"_close"),1);
-dijit.form.TextBox.prototype._setValueAttr.call(this,_5,true,String(_5.getDate()));
+dijit.form.TextBox.prototype._setValueAttr.call(this,String(_6.getDate()),true,String(_6.getDate()));
 });
 }});
-dojo.declare("dojox.form.MonthTextBox",dojox.form.DateTextBox,{popupClass:"dojox.widget.MonthlyCalendar",format:function(_6){
-return _6+1;
-},validator:function(_7){
-var _8=Number(_7);
-var _9=/(^-?\d\d*$)/.test(String(_7));
-return _7==""||_7==null||(_9&&_8>=1&&_8<=12);
+dojo.declare("dojox.form.MonthTextBox",dojox.form.DateTextBox,{popupClass:"dojox.widget.MonthlyCalendar",selector:"date",postMixInProperties:function(){
+this.inherited(arguments);
+this.constraints.datePattern="MM";
+},format:function(_7){
+return Number(_7)+1;
+},parse:function(_8,_9){
+return Number(_8)-1;
+},serialize:function(_a,_b){
+return String(_a);
+},validator:function(_c){
+var _d=Number(_c);
+var _e=/(^-?\d\d*$)/.test(String(_c));
+return _c==""||_c==null||(_e&&_d>=1&&_d<=12);
 },_open:function(){
 this.inherited(arguments);
-this._picker.onValueSelected=dojo.hitch(this,function(_a){
+this._picker.onValueSelected=dojo.hitch(this,function(_f){
 this.focus();
 setTimeout(dojo.hitch(this,"_close"),1);
-dijit.form.TextBox.prototype._setValueAttr.call(this,_a+1,true,_a+1);
+dijit.form.TextBox.prototype._setValueAttr.call(this,_f,true,_f);
 });
 }});
-dojo.declare("dojox.form.YearTextBox",dojox.form.DateTextBox,{popupClass:"dojox.widget.YearlyCalendar",format:function(_b){
-return _b;
-},validator:function(_c){
-return _c==""||_c==null||/(^-?\d\d*$)/.test(String(_c));
+dojo.declare("dojox.form.YearTextBox",dojox.form.DateTextBox,{popupClass:"dojox.widget.YearlyCalendar",format:function(_10){
+if(typeof _10=="string"){
+return _10;
+}else{
+if(_10.getFullYear){
+return _10.getFullYear();
+}
+}
+return _10;
+},validator:function(_11){
+return _11==""||_11==null||/(^-?\d\d*$)/.test(String(_11));
 },_open:function(){
 this.inherited(arguments);
-this._picker.onValueSelected=dojo.hitch(this,function(_d){
+this._picker.onValueSelected=dojo.hitch(this,function(_12){
 this.focus();
 setTimeout(dojo.hitch(this,"_close"),1);
-dijit.form.TextBox.prototype._setValueAttr.call(this,_d,true,_d);
+dijit.form.TextBox.prototype._setValueAttr.call(this,_12,true,_12);
 });
+},parse:function(_13,_14){
+return _13||(this._isEmpty(_13)?null:undefined);
+},filter:function(val){
+if(val&&val.getFullYear){
+return val.getFullYear().toString();
+}
+return this.inherited(arguments);
 }});
 }
diff --git a/dojox/form/DropDownSelect.js b/dojox/form/DropDownSelect.js
index 3ec5270..0418228 100644
--- a/dojox/form/DropDownSelect.js
+++ b/dojox/form/DropDownSelect.js
@@ -7,127 +7,8 @@
 
 if(!dojo._hasResource["dojox.form.DropDownSelect"]){
 dojo._hasResource["dojox.form.DropDownSelect"]=true;
+dojo.deprecated("dojox.form.DropDownSelect","Use dijit.form.Select instead","2.0");
 dojo.provide("dojox.form.DropDownSelect");
-dojo.require("dojox.form._FormSelectWidget");
-dojo.require("dojox.form._HasDropDown");
-dojo.require("dijit.Menu");
-dojo.requireLocalization("dijit.form","validate",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
-dojo.declare("dojox.form.DropDownSelect",[dojox.form._FormSelectWidget,dojox.form._HasDropDown],{attributeMap:dojo.mixin(dojo.clone(dojox.form._FormSelectWidget.prototype.attributeMap),{value:"valueNode",name:"valueNode"}),baseClass:"dojoxDropDownSelect",templateString:"<table class='dijit dijitReset dijitInline dijitLeft'\n\tdojoAttachPoint=\"dropDownNode,tableNode\" cellspacing='0' cellpadding='0' waiRole=\"presentation\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse [...]
-this.inherited(arguments);
-if(this.options.length&&!this.value){
-var si=this.srcNodeRef.selectedIndex;
-this.value=this.options[si!=-1?si:0].value;
-}
-this.dropDown=new dijit.Menu();
-dojo.addClass(this.dropDown.domNode,this.baseClass+"Menu");
-},_getMenuItemForOption:function(_2){
-if(!_2.value){
-return new dijit.MenuSeparator();
-}else{
-var _3=dojo.hitch(this,"_setValueAttr",_2);
-return new dijit.MenuItem({option:_2,label:_2.label,onClick:_3,disabled:_2.disabled||false});
-}
-},_addOptionItem:function(_4){
-this.dropDown.addChild(this._getMenuItemForOption(_4));
-},_getChildren:function(){
-return this.dropDown.getChildren();
-},_loadChildren:function(){
-this.inherited(arguments);
-var _5=this.options.length;
-this._isLoaded=false;
-this._childrenLoaded=true;
-if(!this._iReadOnly){
-this.attr("readOnly",(_5===1));
-delete this._iReadOnly;
-}
-if(!this._iDisabled){
-this.attr("disabled",(_5===0));
-delete this._iDisabled;
-}
-this._setValueAttr(this.value);
-},_setValueAttr:function(_6){
-this.inherited(arguments);
-dojo.attr(this.valueNode,"value",this.attr("value"));
-},_setDisplay:function(_7){
-this.containerNode.innerHTML="<span class=\" "+this.baseClass+"Label\">"+(_7||this.emptyLabel||" ")+"</span>";
-this._layoutHack();
-},validate:function(_8){
-var _9=this.isValid(_8);
-this.state=_9?"":"Error";
-this._setStateClass();
-dijit.setWaiState(this.focusNode,"invalid",_9?"false":"true");
-var _a=_9?"":this._missingMsg;
-if(this._message!==_a){
-this._message=_a;
-dijit.hideTooltip(this.domNode);
-if(_a){
-dijit.showTooltip(_a,this.domNode,this.tooltipPosition);
-}
-}
-return _9;
-},isValid:function(_b){
-return (!this.required||!(/^\s*$/.test(this.value)));
-},reset:function(){
-this.inherited(arguments);
-dijit.hideTooltip(this.domNode);
-this.state="";
-this._setStateClass();
-delete this._message;
-},postMixInProperties:function(){
-this.inherited(arguments);
-this._missingMsg=dojo.i18n.getLocalization("dijit.form","validate",this.lang).missingMessage;
-},postCreate:function(){
-this.inherited(arguments);
-if(dojo.attr(this.srcNodeRef,"disabled")){
-this.attr("disabled",true);
-}
-if(this.tableNode.style.width){
-dojo.addClass(this.domNode,this.baseClass+"FixedWidth");
-}
-},startup:function(){
-if(this._started){
-return;
-}
-if(!this.dropDown){
-var _c=dojo.query("[widgetId]",this.dropDownContainer)[0];
-this.dropDown=dijit.byNode(_c);
-delete this.dropDownContainer;
-}
-this.inherited(arguments);
-},_onMenuMouseup:function(e){
-var _e=this.dropDown,t=e.target;
-if(_e.onItemClick){
-var _10;
-while(t&&!(_10=dijit.byNode(t))){
-t=t.parentNode;
-}
-if(_10&&_10.onClick&&_10.getParent){
-_10.getParent().onItemClick(_10,e);
-}
-}
-},isLoaded:function(){
-return this._isLoaded;
-},loadDropDown:function(_11){
-this._loadChildren();
-this._isLoaded=true;
-_11();
-},_setReadOnlyAttr:function(_12){
-this._iReadOnly=_12;
-if(!_12&&this._childrenLoaded&&this.options.length===1){
-return;
-}
-this.readOnly=_12;
-},_setDisabledAttr:function(_13){
-this._iDisabled=_13;
-if(!_13&&this._childrenLoaded&&this.options.length===0){
-return;
-}
-this.inherited(arguments);
-},uninitialize:function(_14){
-if(this.dropDown){
-this.dropDown.destroyRecursive(_14);
-delete this.dropDown;
-}
-this.inherited(arguments);
-}});
+dojo.require("dijit.form.Select");
+dojo.setObject("dojox.form.DropDownSelect",dijit.form.Select);
 }
diff --git a/dojox/form/DropDownStack.js b/dojox/form/DropDownStack.js
index 302c0e9..04b2d96 100644
--- a/dojox/form/DropDownStack.js
+++ b/dojox/form/DropDownStack.js
@@ -8,7 +8,7 @@
 if(!dojo._hasResource["dojox.form.DropDownStack"]){
 dojo._hasResource["dojox.form.DropDownStack"]=true;
 dojo.provide("dojox.form.DropDownStack");
-dojo.require("dojox.form.DropDownSelect");
+dojo.require("dijit.form.Select");
 dojo.require("dojox.form._SelectStackMixin");
-dojo.declare("dojox.form.DropDownStack",[dojox.form.DropDownSelect,dojox.form._SelectStackMixin],{});
+dojo.declare("dojox.form.DropDownStack",[dijit.form.Select,dojox.form._SelectStackMixin],{});
 }
diff --git a/dojox/form/FileInput.js b/dojox/form/FileInput.js
index 55c4350..dd5eff4 100644
--- a/dojox/form/FileInput.js
+++ b/dojox/form/FileInput.js
@@ -11,7 +11,7 @@ dojo.provide("dojox.form.FileInput");
 dojo.experimental("dojox.form.FileInput");
 dojo.require("dijit.form._FormWidget");
 dojo.require("dijit._Templated");
-dojo.declare("dojox.form.FileInput",dijit.form._FormWidget,{label:"Browse ...",cancelText:"Cancel",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=\"titleNo [...]
+dojo.declare("dojox.form.FileInput",dijit.form._FormWidget,{label:"Browse ...",cancelText:"Cancel",name:"uploadFile",templateString:dojo.cache("dojox.form","resources/FileInput.html","<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=\"dijitIn [...]
 this._listener=this.connect(this.fileInput,"onchange","_matchValue");
 this._keyListener=this.connect(this.fileInput,"onkeyup","_matchValue");
 },_matchValue:function(){
diff --git a/dojox/form/FileInputAuto.js b/dojox/form/FileInputAuto.js
index bcff9e4..2c47ded 100644
--- a/dojox/form/FileInputAuto.js
+++ b/dojox/form/FileInputAuto.js
@@ -10,7 +10,7 @@ dojo._hasResource["dojox.form.FileInputAuto"]=true;
 dojo.provide("dojox.form.FileInputAuto");
 dojo.require("dojox.form.FileInput");
 dojo.require("dojo.io.iframe");
-dojo.declare("dojox.form.FileInputAuto",dojox.form.FileInput,{url:"",blurDelay:2000,duration:500,uploadMessage:"Uploading ...",triggerEvent:"onblur",_sent:false,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\"  [...]
+dojo.declare("dojox.form.FileInputAuto",dojox.form.FileInput,{url:"",blurDelay:2000,duration:500,uploadMessage:"Uploading ...",triggerEvent:"onblur",_sent:false,templateString:dojo.cache("dojox.form","resources/FileInputAuto.html","<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\"  [...]
 this._blurListener=this.connect(this.fileInput,this.triggerEvent,"_onBlur");
 this._focusListener=this.connect(this.fileInput,"onfocus","_onFocus");
 this.inherited(arguments);
@@ -37,18 +37,18 @@ dojo.style(this.fakeNodeHolder,"display","none");
 dojo.style(this.overlay,{opacity:0,display:"block"});
 this.setMessage(this.uploadMessage);
 dojo.fadeIn({node:this.overlay,duration:this.duration}).play();
-var _3;
+var _2;
 if(dojo.isIE){
-_3=document.createElement("<form enctype=\"multipart/form-data\" method=\"post\">");
-_3.encoding="multipart/form-data";
+_2=document.createElement("<form enctype=\"multipart/form-data\" method=\"post\">");
+_2.encoding="multipart/form-data";
 }else{
-_3=document.createElement("form");
-_3.setAttribute("enctype","multipart/form-data");
+_2=document.createElement("form");
+_2.setAttribute("enctype","multipart/form-data");
 }
-_3.appendChild(this.fileInput);
-dojo.body().appendChild(_3);
-dojo.io.iframe.send({url:this.url,form:_3,handleAs:"json",handle:dojo.hitch(this,"_handleSend")});
-},_handleSend:function(_4,_5){
+_2.appendChild(this.fileInput);
+dojo.body().appendChild(_2);
+dojo.io.iframe.send({url:this.url,form:_2,handleAs:"json",handle:dojo.hitch(this,"_handleSend")});
+},_handleSend:function(_3,_4){
 this.overlay.removeChild(this.overlay.firstChild);
 this._sent=true;
 this._sending=false;
@@ -59,9 +59,9 @@ this.fakeNodeHolder.style.display="none";
 dojo.fadeIn({node:this.overlay,duration:this.duration}).play(250);
 this.disconnect(this._blurListener);
 this.disconnect(this._focusListener);
-dojo.body().removeChild(_5.args.form);
+dojo.body().removeChild(_4.args.form);
 this.fileInput=null;
-this.onComplete(_4,_5,this);
+this.onComplete(_3,_4,this);
 },reset:function(e){
 if(this._blurTimer){
 clearTimeout(this._blurTimer);
@@ -75,7 +75,7 @@ this._sent=false;
 this._sending=false;
 this._blurListener=this.connect(this.fileInput,this.triggerEvent,"_onBlur");
 this._focusListener=this.connect(this.fileInput,"onfocus","_onFocus");
-},onComplete:function(_7,_8,_9){
+},onComplete:function(_5,_6,_7){
 }});
 dojo.declare("dojox.form.FileInputBlind",dojox.form.FileInputAuto,{startup:function(){
 this.inherited(arguments);
diff --git a/dojox/form/FileInputBlind.js b/dojox/form/FileInputBlind.js
new file mode 100644
index 0000000..3730ba8
--- /dev/null
+++ b/dojox/form/FileInputBlind.js
@@ -0,0 +1,12 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.form.FileInputBlind"]){
+dojo._hasResource["dojox.form.FileInputBlind"]=true;
+dojo.provide("dojox.form.FileInputBlind");
+dojo.require("dojox.form.FileInputAuto");
+}
diff --git a/dojox/form/FilePickerTextBox.js b/dojox/form/FilePickerTextBox.js
index b85b047..767628c 100644
--- a/dojox/form/FilePickerTextBox.js
+++ b/dojox/form/FilePickerTextBox.js
@@ -10,8 +10,8 @@ dojo._hasResource["dojox.form.FilePickerTextBox"]=true;
 dojo.provide("dojox.form.FilePickerTextBox");
 dojo.require("dojox.widget.FilePicker");
 dojo.require("dijit.form.ValidationTextBox");
-dojo.require("dojox.form._HasDropDown");
-dojo.declare("dojox.form.FilePickerTextBox",[dijit.form.ValidationTextBox,dojox.form._HasDropDown],{baseClass:"dojoxFilePickerTextBox",templateString:"<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" waiRole=\"combobox\" tabIndex=\"-1\"\n\t><div style=\"overflow:hidden;\"\n\t\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton'\n\t [...]
+dojo.require("dijit._HasDropDown");
+dojo.declare("dojox.form.FilePickerTextBox",[dijit.form.ValidationTextBox,dijit._HasDropDown],{baseClass:"dojoxFilePickerTextBox",templateString:dojo.cache("dojox.form","resources/FilePickerTextBox.html","<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse\" waiRole=\"combobox\" tabIndex=\"-1\"\n\t><div style=\"overflow:hidden;\"\n\t\t><div class='dijitReset dijitRight diji [...]
 this.inherited(arguments);
 this.dropDown=new dojox.widget.FilePicker(this.constraints);
 },postCreate:function(){
@@ -33,18 +33,18 @@ var fx=dojo.hitch(this,"_setBlurValue");
 this.dropDown._setPathValueAttr(_1,!_3,this._settingBlurValue?fx:null);
 }
 }
-},_onWidgetChange:function(_6){
-if(!_6&&this.focusNode.value){
+},_onWidgetChange:function(_5){
+if(!_5&&this.focusNode.value){
 this._hasValidPath=false;
 this.focusNode.value="";
 }else{
-this.valueItem=_6;
-var _7=this.dropDown._getPathValueAttr(_6);
-if(_7){
+this.valueItem=_5;
+var _6=this.dropDown._getPathValueAttr(_5);
+if(_6){
 this._hasValidPath=true;
 }
 if(!this._skip){
-this._setValueAttr(_7,undefined,true);
+this._setValueAttr(_6,undefined,true);
 }
 delete this._skip;
 }
@@ -83,11 +83,11 @@ if(this._menuFocus){
 this.dropDown._updateClass(this._menuFocus,"Item",{"Hover":false});
 }
 delete this._menuFocus;
-var _a=dijit.getFocus(this);
-if(_a&&_a.node){
-_a=dijit.byNode(_a.node);
-if(_a){
-this._menuFocus=_a.domNode;
+var _7=dijit.getFocus(this);
+if(_7&&_7.node){
+_7=dijit.byNode(_7.node);
+if(_7){
+this._menuFocus=_7.domNode;
 }
 }
 if(this._menuFocus){
@@ -106,91 +106,91 @@ this.attr("value",this.focusNode.value);
 delete this._settingBlurValue;
 this.inherited(arguments);
 }
-},parse:function(_b,_c){
+},parse:function(_8,_9){
 if(this._hasValidPath||this._hasSelection){
-return _b;
+return _8;
 }
-var dd=this.dropDown,_e=dd.topDir,_f=dd.pathSeparator;
-var _10=dd.attr("pathValue");
-var _11=function(v){
-if(_e.length&&v.indexOf(_e)===0){
-v=v.substring(_e.length);
+var dd=this.dropDown,_a=dd.topDir,_b=dd.pathSeparator;
+var _c=dd.attr("pathValue");
+var _d=function(v){
+if(_a.length&&v.indexOf(_a)===0){
+v=v.substring(_a.length);
 }
-if(_f&&v[v.length-1]==_f){
+if(_b&&v[v.length-1]==_b){
 v=v.substring(0,v.length-1);
 }
 return v;
 };
-_10=_11(_10);
-var val=_11(_b);
-if(val==_10){
-return _b;
+_c=_d(_c);
+var _e=_d(_8);
+if(_e==_c){
+return _8;
 }
 return undefined;
 },_startSearchFromInput:function(){
 var dd=this.dropDown,fn=this.focusNode;
-var val=fn.value,_17=val,_18=dd.topDir;
+var _f=fn.value,_10=_f,_11=dd.topDir;
 if(this._hasSelection){
-dijit.selectInputText(fn,_17.length);
+dijit.selectInputText(fn,_10.length);
 }
 this._hasSelection=false;
-if(_18.length&&val.indexOf(_18)===0){
-val=val.substring(_18.length);
-}
-var _19=val.split(dd.pathSeparator);
-var _1a=dojo.hitch(this,function(idx){
-var dir=_19[idx];
-var _1d=dd.getChildren()[idx];
-var _1e;
+if(_11.length&&_f.indexOf(_11)===0){
+_f=_f.substring(_11.length);
+}
+var _12=_f.split(dd.pathSeparator);
+var _13=dojo.hitch(this,function(idx){
+var dir=_12[idx];
+var _14=dd.getChildren()[idx];
+var _15;
 this._searchInProgress=true;
-var _1f=dojo.hitch(this,function(){
+var _16=dojo.hitch(this,function(){
 delete this._searchInProgress;
 });
-if((dir||_1d)&&!this._opened){
+if((dir||_14)&&!this._opened){
 this.toggleDropDown();
 }
-if(dir&&_1d){
+if(dir&&_14){
 var fx=dojo.hitch(this,function(){
-if(_1e){
-this.disconnect(_1e);
+if(_15){
+this.disconnect(_15);
 }
-delete _1e;
-var _21=_1d._menu.getChildren();
-var _22=dojo.filter(_21,function(i){
+delete _15;
+var _17=_14._menu.getChildren();
+var _18=dojo.filter(_17,function(i){
 return i.label==dir;
 })[0];
-var _24=dojo.filter(_21,function(i){
+var _19=dojo.filter(_17,function(i){
 return (i.label.indexOf(dir)===0);
 })[0];
-if(_22&&((_19.length>idx+1&&_22.children)||(!_22.children))){
+if(_18&&((_12.length>idx+1&&_18.children)||(!_18.children))){
 idx++;
-_1d._menu.onItemClick(_22,{type:"internal",stopPropagation:function(){
+_14._menu.onItemClick(_18,{type:"internal",stopPropagation:function(){
 },preventDefault:function(){
 }});
-if(_19[idx]){
-_1a(idx);
+if(_12[idx]){
+_13(idx);
 }else{
-_1f();
+_16();
 }
 }else{
-_1d._setSelected(null);
-if(_24&&_19.length===idx+1){
+_14._setSelected(null);
+if(_19&&_12.length===idx+1){
 dd._setInProgress=true;
-dd._removeAfter(_1d);
+dd._removeAfter(_14);
 delete dd._setInProgress;
-var _26=_24.label;
-if(_24.children){
-_26+=dd.pathSeparator;
+var _1a=_19.label;
+if(_19.children){
+_1a+=dd.pathSeparator;
 }
-_26=_26.substring(dir.length);
+_1a=_1a.substring(dir.length);
 window.setTimeout(function(){
-dijit.scrollIntoView(_24.domNode);
+dijit.scrollIntoView(_19.domNode);
 },1);
-fn.value=_17+_26;
-dijit.selectInputText(fn,_17.length);
+fn.value=_10+_1a;
+dijit.selectInputText(fn,_10.length);
 this._hasSelection=true;
 try{
-_24.focusNode.focus();
+_19.focusNode.focus();
 }
 catch(e){
 }
@@ -200,25 +200,25 @@ this.dropDown._updateClass(this._menuFocus,"Item",{"Hover":false,"Focus":false})
 }
 delete this._menuFocus;
 }
-_1f();
+_16();
 }
 });
-if(!_1d.isLoaded){
-_1e=this.connect(_1d,"onLoad",fx);
+if(!_14.isLoaded){
+_15=this.connect(_14,"onLoad",fx);
 }else{
 fx();
 }
 }else{
-if(_1d){
-_1d._setSelected(null);
+if(_14){
+_14._setSelected(null);
 dd._setInProgress=true;
-dd._removeAfter(_1d);
+dd._removeAfter(_14);
 delete dd._setInProgress;
 }
-_1f();
+_16();
 }
 });
-_1a(0);
+_13(0);
 },_onKey:function(e){
 if(this.disabled||this.readOnly){
 return;
@@ -241,21 +241,21 @@ dojo.stopEvent(e);
 return;
 }
 this.inherited(arguments);
-var _2a=false;
+var _1b=false;
 if((c==dk.BACKSPACE||c==dk.DELETE)&&this._hasSelection){
 this._hasSelection=false;
 }else{
 if(c==dk.BACKSPACE||c==dk.DELETE||c==" "){
-_2a=true;
+_1b=true;
 }else{
-_2a=e.keyChar!=="";
+_1b=e.keyChar!=="";
 }
 }
 if(this._searchTimer){
 window.clearTimeout(this._searchTimer);
 }
 delete this._searchTimer;
-if(_2a){
+if(_1b){
 this._hasValidPath=false;
 this._hasSelection=false;
 this._searchTimer=window.setTimeout(dojo.hitch(this,"_startSearchFromInput"),this.searchDelay+1);
diff --git a/dojox/form/FileUploader.js b/dojox/form/FileUploader.js
index b04a72f..84780fc 100644
--- a/dojox/form/FileUploader.js
+++ b/dojox/form/FileUploader.js
@@ -14,183 +14,222 @@ dojo.require("dojox.html.styles");
 dojo.require("dijit._Widget");
 dojo.require("dijit._Templated");
 dojo.require("dojox.embed.flashVars");
+dojo.require("dijit._Contained");
 dojo.experimental("dojox.form.FileUploader");
 (function(){
 var _1=dojo.config.uploaderPath||dojo.moduleUrl("dojox.form","resources/uploader.swf");
-var _2=function(o1,o2){
-var o={},nm;
-for(nm in o1){
-if(dojo.isObject(o1[nm])){
-o[nm]=_2({},o1[nm]);
-}else{
-o[nm]=o1[nm];
-}
-}
-for(nm in o2){
-if(dojo.isObject(o2[nm])){
-if(dojo.isObject(o[nm])){
-_2(o[nm],o2[nm]);
-}else{
-_2({},o2[nm]);
-}
-}else{
-o[nm]=o2[nm];
-}
-}
-return o;
-};
-var _7=function(_8){
-if(!_8||_8=="none"){
+var _2=function(_3){
+if(!_3||_3=="none"){
 return false;
 }
-return _8.replace(/:/g,"||").replace(/\./g,"^^").replace("url(","").replace(")","").replace(/'/g,"").replace(/"/g,"");
+return _3.replace(/:/g,"||").replace(/\./g,"^^").replace("url(","").replace(")","").replace(/'/g,"").replace(/"/g,"");
 };
-var _9=function(_a){
-var tn=_a.tagName.toLowerCase();
+var _4=function(_5){
+var tn=_5.tagName.toLowerCase();
 return tn=="button"||tn=="input";
 };
-var _c=function(_d){
+var _6=function(_7){
 var o={};
-o.ff=dojo.style(_d,"fontFamily");
+o.ff=dojo.style(_7,"fontFamily");
+if(o.ff){
+o.ff=o.ff.replace(", ",",");
 o.ff=o.ff.replace(/\"|\'/g,"");
-o.fw=dojo.style(_d,"fontWeight");
-o.fi=dojo.style(_d,"fontStyle");
-o.fs=parseInt(dojo.style(_d,"fontSize"),10);
-o.fc=new dojo.Color(dojo.style(_d,"color")).toHex();
+o.ff=o.ff=="sans-serif"?"Arial":o.ff;
+o.fw=dojo.style(_7,"fontWeight");
+o.fi=dojo.style(_7,"fontStyle");
+o.fs=parseInt(dojo.style(_7,"fontSize"),10);
+if(dojo.style(_7,"fontSize").indexOf("%")>-1){
+var n=_7;
+while(n.tagName){
+if(dojo.style(n,"fontSize").indexOf("%")==-1){
+o.fs=parseInt(dojo.style(n,"fontSize"),10);
+break;
+}
+if(n.tagName.toLowerCase()=="body"){
+o.fs=16*0.01*parseInt(dojo.style(n,"fontSize"),10);
+}
+n=n.parentNode;
+}
+}
+o.fc=new dojo.Color(dojo.style(_7,"color")).toHex();
 o.fc=parseInt(o.fc.substring(1,Infinity),16);
-o.lh=dojo.style(_d,"lineHeight");
-o.ta=dojo.style(_d,"textAlign");
+}
+o.lh=dojo.style(_7,"lineHeight");
+o.ta=dojo.style(_7,"textAlign");
 o.ta=o.ta=="start"||!o.ta?"left":o.ta;
-o.va=_9(_d)?"middle":o.lh==o.h?"middle":dojo.style(_d,"verticalAlign");
+o.va=_4(_7)?"middle":o.lh==o.h?"middle":dojo.style(_7,"verticalAlign");
 return o;
 };
-var _f=function(_10){
-var cn=dojo.trim(_10.innerHTML);
+var _8=function(_9){
+var cn=dojo.trim(_9.innerHTML);
 if(cn.indexOf("<")>-1){
 cn=escape(cn);
 }
 return cn;
 };
-var _12=function(_13){
+var _a=function(_b){
 var o={};
-var dim=dojo.contentBox(_13);
-var pad=dojo._getPadExtents(_13);
-o.p=[pad.t,pad.w-pad.l,pad.h-pad.t,pad.l];
-o.w=dim.w+pad.w;
-o.h=dim.h+pad.h;
-o.d=dojo.style(_13,"display");
-var clr=new dojo.Color(dojo.style(_13,"backgroundColor"));
-o.bc=clr.a==0?"#ffffff":clr.toHex();
+var _c=dojo.contentBox(_b);
+var _d=dojo._getPadExtents(_b);
+o.p=[_d.t,_d.w-_d.l,_d.h-_d.t,_d.l];
+o.w=_c.w+_d.w;
+o.h=_c.h+_d.h;
+o.d=dojo.style(_b,"display");
+var _e=new dojo.Color(dojo.style(_b,"backgroundColor"));
+o.bc=_e.a==0?"#ffffff":_e.toHex();
 o.bc=parseInt(o.bc.substring(1,Infinity),16);
-var url=_7(dojo.style(_13,"backgroundImage"));
-if(url){
-o.bi={url:url,rp:dojo.style(_13,"backgroundRepeat"),pos:escape(dojo.style(_13,"backgroundPosition"))};
+var _f=_2(dojo.style(_b,"backgroundImage"));
+if(_f){
+o.bi={url:_f,rp:dojo.style(_b,"backgroundRepeat"),pos:escape(dojo.style(_b,"backgroundPosition"))};
 if(!o.bi.pos){
-var rx=dojo.style(_13,"backgroundPositionX");
-var ry=dojo.style(_13,"backgroundPositionY");
+var rx=dojo.style(_b,"backgroundPositionX");
+var ry=dojo.style(_b,"backgroundPositionY");
 rx=(rx=="left")?"0%":(rx=="right")?"100%":rx;
 ry=(ry=="top")?"0%":(ry=="bottom")?"100%":ry;
 o.bi.pos=escape(rx+" "+ry);
 }
 }
-return _2(o,_c(_13));
+return dojo.mixin(o,_6(_b));
 };
-var _1b=function(_1c,_1d,_1e){
-var _1f,_20;
-if(_1e){
-_1f=dojo.place("<"+_1c.tagName+"><span>"+_1c.innerHTML+" "+_1d+"</span></"+_1c.tagName+">",_1c.parentNode);
-var _21=_1f.firstChild;
-dojo.addClass(_21,_1c.className);
-dojo.addClass(_1f,_1d);
-_20=_12(_21);
+var _10=function(_11,_12,_13){
+var _14,_15;
+if(_13){
+_14=dojo.place("<"+_11.tagName+"><span>"+_11.innerHTML+"</span></"+_11.tagName+">",_11.parentNode);
+var _16=_14.firstChild;
+dojo.addClass(_16,_11.className);
+dojo.addClass(_14,_12);
+_15=_a(_16);
 }else{
-_1f=dojo.place("<"+_1c.tagName+">"+_1c.innerHTML+"</"+_1c.tagName+">",_1c.parentNode);
-dojo.addClass(_1f,_1c.className);
-dojo.addClass(_1f,_1d);
-_1f.id=_1c.id;
-_20=_12(_1f);
-}
-dojo.destroy(_1f);
-return _20;
+_14=dojo.place("<"+_11.tagName+">"+_11.innerHTML+"</"+_11.tagName+">",_11.parentNode);
+dojo.addClass(_14,_11.className);
+dojo.addClass(_14,_12);
+_14.id=_11.id;
+_15=_a(_14);
+}
+dojo.destroy(_14);
+return _15;
 };
-var _22=function(ltr){
+var _17=function(ltr){
 return ltr.charCodeAt(0)<91;
 };
-dojo.declare("dojox.form.FileUploader",[dijit._Widget,dijit._Templated],{uploadUrl:"",uploadOnChange:false,selectMultipleFiles:true,htmlFieldName:"uploadedfile",flashFieldName:"flashUploadFiles",fileMask:[],minFlashVersion:9,tabIndex:-1,showProgress:false,progressMessage:"Loading",progressBackgroundUrl:dojo.moduleUrl("dijit","themes/tundra/images/buttonActive.png"),progressBackgroundColor:"#ededed",progressWidgetId:"",templateString:"<div><div dojoAttachPoint=\"progNode\"><div dojoAttach [...]
+dojo.declare("dojox.form.FileUploader",[dijit._Widget,dijit._Templated,dijit._Contained],{templateString:"<div><div dojoAttachPoint=\"progNode\"><div dojoAttachPoint=\"progTextNode\"></div></div><div dojoAttachPoint=\"insideNode\" class=\"uploaderInsideNode\"></div></div>",uploadUrl:"",isDebug:false,devMode:false,baseClass:"dojoxUploaderNorm",hoverClass:"dojoxUploaderHover",activeClass:"dojoxUploaderActive",disabledClass:"dojoxUploaderDisabled",force:"",uploaderType:"",flashObject:null,f [...]
 if(this.isDebug){
 console.log.apply(console,arguments);
 }
+},constructor:function(){
+this._subs=[];
 },postMixInProperties:function(){
 this.fileList=[];
-this._subs=[];
 this._cons=[];
+this.fileMask=[];
 this.fileInputs=[];
 this.fileCount=0;
 this.flashReady=false;
 this._disabled=false;
+this.force=this.force.toLowerCase();
 this.uploaderType=((dojox.embed.Flash.available>=this.minFlashVersion||this.force=="flash")&&this.force!="html")?"flash":"html";
+this.deferredUploading=this.deferredUploading===true?1:this.deferredUploading;
 if(!this.swfPath){
 this.swfPath=_1;
 }
+this._refNode=this.srcNodeRef;
 this.getButtonStyle();
+},startup:function(){
 },postCreate:function(){
+this.inherited(arguments);
 this.setButtonStyle();
+var _18;
 if(this.uploaderType=="flash"){
-this.uploaderType="flash";
-this.createFlashUploader();
+_18="createFlashUploader";
 }else{
 this.uploaderType="html";
-this.createHtmlUploader();
+_18="createHtmlUploader";
+}
+if(this._hiddenNode){
+var w=dijit.byNode(this._hiddenNode);
+this.connect(w,"onShow",_18);
+}else{
+this[_18]();
 }
 if(this.fileListId){
-dojo.connect(dojo.byId(this.fileListId),"click",this,function(evt){
+this.connect(dojo.byId(this.fileListId),"click",function(evt){
 var p=evt.target.parentNode.parentNode.parentNode;
 if(p.id&&p.id.indexOf("file_")>-1){
 this.removeFile(p.id.split("file_")[1]);
 }
 });
 }
+dojo.addOnUnload(this,this.destroy);
 },getButtonStyle:function(){
-if(!this.srcNodeRef&&this.button&&this.button.domNode){
-this.isDijitButton=true;
+var _19=this.srcNodeRef;
+var p=_19.parentNode;
+while(p.tagName.toLowerCase()!="body"){
+var d=dojo.style(p,"display");
+if(d=="none"){
+this._hiddenNode=p;
+break;
+}
+p=p.parentNode;
+}
+if(this._hiddenNode){
+dojo.style(this._hiddenNode,"display","block");
+}
+if(this.button){
+console.warn("DEPRECATED: FileUploader.button - will be removed in 1.5. FileUploader should be created as widget.");
+}
+if(!_19&&this.button&&this.button.domNode){
+var _1a=true;
 var cls=this.button.domNode.className+" dijitButtonNode";
-var txt=_f(dojo.query(".dijitButtonText",this.button.domNode)[0]);
-var _28="<button id=\""+this.button.id+"\" class=\""+cls+"\">"+txt+"</button>";
-this.srcNodeRef=dojo.place(_28,this.button.domNode,"after");
+var txt=_8(dojo.query(".dijitButtonText",this.button.domNode)[0]);
+var _1b="<button id=\""+this.button.id+"\" class=\""+cls+"\">"+txt+"</button>";
+_19=dojo.place(_1b,this.button.domNode,"after");
+this.srcNodeRef=_19;
 this.button.destroy();
+this.baseClass="dijitButton";
 this.hoverClass="dijitButtonHover";
 this.pressClass="dijitButtonActive";
 this.disabledClass="dijitButtonDisabled";
+}else{
+if(!this.srcNodeRef&&this.button){
+_19=this.button;
 }
-this.norm=_12(this.srcNodeRef);
+}
+if(dojo.attr(_19,"class")){
+this.baseClass+=" "+dojo.attr(_19,"class");
+}
+dojo.attr(_19,"class",this.baseClass);
+this.norm=_a(_19);
 this.width=this.norm.w;
 this.height=this.norm.h;
 if(this.uploaderType=="flash"){
-if(this.hoverClass){
-this.over=_1b(this.srcNodeRef,this.hoverClass,this.isDijitButton);
+this.over=_10(_19,this.baseClass+" "+this.hoverClass,_1a);
+this.down=_10(_19,this.baseClass+" "+this.activeClass,_1a);
+this.dsbl=_10(_19,this.baseClass+" "+this.disabledClass,_1a);
+this.fhtml={cn:_8(_19),nr:this.norm,ov:this.over,dn:this.down,ds:this.dsbl};
 }else{
-this.over=_2({},this.norm);
+this.fhtml={cn:_8(_19),nr:this.norm};
+if(this.norm.va=="middle"){
+this.norm.lh=this.norm.h;
 }
-if(this.activeClass){
-this.down=_1b(this.srcNodeRef,this.activeClass,this.isDijitButton);
-}else{
-this.down=_2({},this.norm);
 }
-if(this.disabledClass){
-this.dsbl=_1b(this.srcNodeRef,this.disabledClass,this.isDijitButton);
-}else{
-this.dsbl=_2({},this.norm);
-}
-this.fhtml={cn:_f(this.srcNodeRef),nr:this.norm,ov:this.over,dn:this.down,ds:this.dsbl};
-}else{
-this.fhtml={cn:_f(this.srcNodeRef),nr:this.norm};
+if(this.devMode){
+this.log("classes - base:",this.baseClass," hover:",this.hoverClass,"active:",this.activeClass);
+this.log("fhtml:",this.fhtml);
+this.log("norm:",this.norm);
+this.log("over:",this.over);
+this.log("down:",this.down);
 }
 },setButtonStyle:function(){
 dojo.style(this.domNode,{width:this.fhtml.nr.w+"px",height:(this.fhtml.nr.h)+"px",padding:"0px",lineHeight:"normal",position:"relative"});
+if(this.uploaderType=="html"&&this.norm.va=="middle"){
+dojo.style(this.domNode,"lineHeight",this.norm.lh+"px");
+}
 if(this.showProgress){
 this.progTextNode.innerHTML=this.progressMessage;
 dojo.style(this.progTextNode,{width:this.fhtml.nr.w+"px",height:(this.fhtml.nr.h+0)+"px",padding:"0px",margin:"0px",left:"0px",lineHeight:(this.fhtml.nr.h+0)+"px",position:"absolute"});
 dojo.style(this.progNode,{width:this.fhtml.nr.w+"px",height:(this.fhtml.nr.h+0)+"px",padding:"0px",margin:"0px",left:"0px",position:"absolute",display:"none",backgroundImage:"url("+this.progressBackgroundUrl+")",backgroundPosition:"bottom",backgroundRepeat:"repeat-x",backgroundColor:this.progressBackgroundColor});
+}else{
+dojo.destroy(this.progNode);
 }
 dojo.style(this.insideNode,{position:"absolute",top:"0px",left:"0px",display:""});
 dojo.addClass(this.domNode,this.srcNodeRef.className);
@@ -201,7 +240,6 @@ try{
 this.insideNode.innerHTML=this.fhtml.cn;
 }
 catch(e){
-console.warn("IE inline node",this.domNode.outerHTML);
 if(this.uploaderType=="flash"){
 this.insideNode=this.insideNode.parentNode.removeChild(this.insideNode);
 dojo.body().appendChild(this.insideNode);
@@ -216,21 +254,21 @@ this.insideNode.appendChild(document.createTextNode(this.fhtml.cn));
 }
 }
 this.flashDiv=this.insideNode;
-},onChange:function(_2a){
-},onProgress:function(_2b){
-},onComplete:function(_2c){
+if(this._hiddenNode){
+dojo.style(this._hiddenNode,"display","none");
+}
+},onChange:function(_1c){
+},onProgress:function(_1d){
+},onComplete:function(_1e){
 },onCancel:function(){
-this.log("Upload Canceled");
-},onError:function(_2d){
-var _2e=_2d.type?_2d.type.toUpperCase():"ERROR";
-var msg=_2d.msg?_2d.msg:_2d;
-console.error("FLASH/ERROR/"+_2e,msg);
-},onReady:function(){
-},submit:function(_30){
-var _31=_30?dojo.formToObject(_30):null;
-this.upload(_31);
+},onError:function(_1f){
+},onReady:function(_20){
+},onLoad:function(_21){
+},submit:function(_22){
+var _23=_22?dojo.formToObject(_22):null;
+this.upload(_23);
 return false;
-},upload:function(_32){
+},upload:function(_24){
 if(!this.fileList.length){
 return false;
 }
@@ -240,22 +278,20 @@ return false;
 }
 if(!this.showProgress){
 this.attr("disabled",true);
-}else{
 }
 if(this.progressWidgetId){
-var _33=dijit.byId(this.progressWidgetId).domNode;
-console.warn("PROGRESS BAR",_33,dojo.style(_33,"display"));
-if(dojo.style(_33,"display")=="none"){
+var _25=dijit.byId(this.progressWidgetId).domNode;
+if(dojo.style(_25,"display")=="none"){
 this.restoreProgDisplay="none";
-dojo.style(_33,"display","block");
+dojo.style(_25,"display","block");
 }
-if(dojo.style(_33,"visibility")=="hidden"){
+if(dojo.style(_25,"visibility")=="hidden"){
 this.restoreProgDisplay="hidden";
-dojo.style(_33,"visibility","visible");
+dojo.style(_25,"visibility","visible");
 }
 }
-if(_32){
-this.postData=_32;
+if(_24&&!_24.target){
+this.postData=_24;
 }
 this.log("upload type:",this.uploaderType," - postData:",this.postData);
 for(var i=0;i<this.fileList.length;i++){
@@ -270,26 +306,27 @@ this.uploadFlash();
 this.uploadHTML();
 }
 return false;
-},removeFile:function(_36,_37){
+},removeFile:function(_26,_27){
 var i;
 for(i=0;i<this.fileList.length;i++){
-if(this.fileList[i].name==_36){
-if(!_37){
+if(this.fileList[i].name==_26){
+if(!_27){
 this.fileList.splice(i,1);
 }
 break;
 }
 }
 if(this.uploaderType=="flash"){
-this.flashMovie.removeFile(_36);
+this.flashMovie.removeFile(_26);
 }else{
-if(!_37){
+if(!_27){
 dojo.destroy(this.fileInputs[i]);
 this.fileInputs.splice(i,1);
+this._renumberInputs();
 }
 }
 if(this.fileListId){
-dojo.destroy("file_"+_36);
+dojo.destroy("file_"+_26);
 }
 },destroyAll:function(){
 console.warn("DEPRECATED for 1.5 - use destroy() instead");
@@ -299,18 +336,18 @@ if(this.uploaderType=="flash"&&!this.flashMovie){
 this._cons.push(dojo.connect(this,"onLoad",this,"destroy"));
 return;
 }
-dojo.forEach(this._subs,function(s){
-dojo.unsubscribe(s);
-});
-dojo.forEach(this._cons,function(c){
-dojo.disconnect(c);
-});
+dojo.forEach(this._subs,dojo.unsubscribe,dojo);
+dojo.forEach(this._cons,dojo.disconnect,dojo);
 if(this.scrollConnect){
 dojo.disconnect(this.scrollConnect);
 }
 if(this.uploaderType=="flash"){
 this.flashObject.destroy();
 dojo.destroy(this.flashDiv);
+}else{
+dojo.destroy("dojoIoIframe");
+dojo.destroy(this._fileInput);
+dojo.destroy(this._formNode);
 }
 this.inherited(arguments);
 },hide:function(){
@@ -319,50 +356,52 @@ dojo.style(this.domNode,"display","none");
 },show:function(){
 console.warn("DEPRECATED for 1.5 - use dojo.style(domNode, 'display', '') instead");
 dojo.style(this.domNode,"display","");
-},disable:function(_3b){
+},disable:function(_28){
 console.warn("DEPRECATED: FileUploader.disable() - will be removed in 1.5. Use attr('disable', true) instead.");
-this.attr("disable",_3b);
-},_displayProgress:function(_3c){
-if(_3c===true){
+this.attr("disable",_28);
+},_displayProgress:function(_29){
+if(_29===true){
 if(this.uploaderType=="flash"){
-dojo.style(this.insideNode,"left","-1000px");
+dojo.style(this.insideNode,"left","-2500px");
 }else{
 dojo.style(this.insideNode,"display","none");
 }
 dojo.style(this.progNode,"display","");
 }else{
-if(_3c===false){
-dojo.style(this.insideNode,"display","");
-dojo.style(this.insideNode,"left","0px");
+if(_29===false){
+dojo.style(this.insideNode,{display:"",left:"0px"});
 dojo.style(this.progNode,"display","none");
 }else{
-var w=_3c*this.fhtml.nr.w;
-dojo.style(this.progNode,{width:w+"px"});
+var w=_29*this.fhtml.nr.w;
+dojo.style(this.progNode,"width",w+"px");
 }
 }
 },_animateProgress:function(){
 this._displayProgress(true);
-var _3e=false;
+var _2a=false;
 var c=dojo.connect(this,"_complete",function(){
 dojo.disconnect(c);
-_3e=true;
+_2a=true;
 });
 var w=0;
-var _41=setInterval(dojo.hitch(this,function(){
+var _2b=setInterval(dojo.hitch(this,function(){
 w+=5;
 if(w>this.fhtml.nr.w){
 w=0;
-_3e=true;
+_2a=true;
 }
 this._displayProgress(w/this.fhtml.nr.w);
-if(_3e){
-clearInterval(_41);
+if(_2a){
+clearInterval(_2b);
 setTimeout(dojo.hitch(this,function(){
 this._displayProgress(false);
 }),500);
 }
 }),50);
 },_error:function(evt){
+if(typeof (evt)=="string"){
+evt=new Error(evt);
+}
 this.onError(evt);
 },_addToFileList:function(){
 if(this.fileListId){
@@ -372,23 +411,24 @@ str+="<table id=\"file_"+d.name+"\" class=\"fileToUpload\"><tr><td class=\"fileT
 },this);
 dojo.byId(this.fileListId).innerHTML=str;
 }
-},_change:function(_45){
+},_change:function(_2c){
 if(dojo.isIE){
-dojo.forEach(_45,function(f){
+dojo.forEach(_2c,function(f){
 f.name=f.name.split("\\")[f.name.split("\\").length-1];
 });
 }
 if(this.selectMultipleFiles){
-this.fileList=this.fileList.concat(_45);
+this.fileList=this.fileList.concat(_2c);
 }else{
 if(this.fileList[0]){
-this.removeFile(this.fileList[0].name);
+this.removeFile(this.fileList[0].name,true);
 }
-this.fileList=_45;
+this.fileList=_2c;
 }
 this._addToFileList();
-this.onChange(_45);
+this.onChange(_2c);
 if(this.uploadOnChange){
+this._buildFileInput();
 this.upload();
 }else{
 if(this.uploaderType=="html"&&this.selectMultipleFiles){
@@ -396,12 +436,11 @@ this._buildFileInput();
 this._connectInput();
 }
 }
-},_complete:function(_47){
-_47=dojo.isArray(_47)?_47:[_47];
-dojo.forEach(_47,function(f){
+},_complete:function(_2d){
+_2d=dojo.isArray(_2d)?_2d:[_2d];
+dojo.forEach(_2d,function(f){
 if(f.ERROR){
-console.error(f.ERROR);
-this._error(new Error(f.ERROR));
+this._error(f.ERROR);
 }
 },this);
 dojo.forEach(this.fileList,function(f){
@@ -413,92 +452,84 @@ this._progress(f);
 dojo.forEach(this.fileList,function(f){
 this.removeFile(f.name,true);
 },this);
-this.onComplete(_47);
+this.onComplete(_2d);
 this.fileList=[];
 this._resetHTML();
 this.attr("disabled",false);
 if(this.restoreProgDisplay){
 setTimeout(dojo.hitch(this,function(){
 dojo.style(dijit.byId(this.progressWidgetId).domNode,this.restoreProgDisplay=="none"?"display":"visibility",this.restoreProgDisplay);
-}),700);
+}),500);
 }
-},_progress:function(_4b){
-var _4c=0;
-var _4d=0;
+},_progress:function(_2e){
+var _2f=0;
+var _30=0;
 for(var i=0;i<this.fileList.length;i++){
 var f=this.fileList[i];
-if(f.name==_4b.name){
-f.bytesLoaded=_4b.bytesLoaded;
-f.bytesTotal=_4b.bytesTotal;
+if(f.name==_2e.name){
+f.bytesLoaded=_2e.bytesLoaded;
+f.bytesTotal=_2e.bytesTotal;
 f.percent=Math.ceil(f.bytesLoaded/f.bytesTotal*100);
-
+this.log(f.name,"percent:",f.percent);
 }
-_4d+=Math.ceil(0.001*f.bytesLoaded);
-_4c+=Math.ceil(0.001*f.bytesTotal);
+_30+=Math.ceil(0.001*f.bytesLoaded);
+_2f+=Math.ceil(0.001*f.bytesTotal);
 }
-var _50=Math.ceil(_4d/_4c*100);
+var _31=Math.ceil(_30/_2f*100);
 if(this.progressWidgetId){
-dijit.byId(this.progressWidgetId).update({progress:_50+"%"});
+dijit.byId(this.progressWidgetId).update({progress:_31+"%"});
 }
 if(this.showProgress){
-this._displayProgress(_50*0.01);
+this._displayProgress(_31*0.01);
 }
 this.onProgress(this.fileList);
 },_getDisabledAttr:function(){
 return this._disabled;
-},_setDisabledAttr:function(_51){
-if(this._disabled==_51){
+},_setDisabledAttr:function(_32){
+if(this._disabled==_32){
 return;
 }
 if(this.uploaderType=="flash"){
 if(!this.flashReady){
-var _fc=dojo.connect(this,"onReady",this,function(){
-dojo.disconnect(_fc);
-this._setDisabledAttr(_51);
+var _33=dojo.connect(this,"onLoad",this,function(){
+dojo.disconnect(_33);
+this._setDisabledAttr(_32);
 });
 return;
 }
-this._disabled=_51;
-this.flashMovie.doDisable(_51);
-if(_51){
-dojo.addClass(this.domNode,this.disabledClass);
-}else{
-dojo.removeClass(this.domNode,this.disabledClass);
-}
-}else{
-this._disabled=_51;
-if(_51){
-dojo.addClass(this.domNode,this.disabledClass);
-dojo.style(this._fileInput,"display","none");
+this._disabled=_32;
+this.flashMovie.doDisable(_32);
 }else{
-dojo.removeClass(this.domNode,this.disabledClass);
-dojo.style(this._fileInput,"display","");
-}
+this._disabled=_32;
+dojo.style(this._fileInput,"display",this._disabled?"none":"");
 }
+dojo.toggleClass(this.domNode,this.disabledClass,_32);
 },_onFlashBlur:function(){
 this.flashMovie.blur();
 if(!this.nextFocusObject&&this.tabIndex){
-var _53=dojo.query("[tabIndex]");
-for(var i=0;i<_53.length;i++){
-if(_53[i].tabIndex>=Number(this.tabIndex)+1){
-this.nextFocusObject=_53[i];
+var _34=dojo.query("[tabIndex]");
+for(var i=0;i<_34.length;i++){
+if(_34[i].tabIndex>=Number(this.tabIndex)+1){
+this.nextFocusObject=_34[i];
 break;
 }
 }
 }
 this.nextFocusObject.focus();
 },_disconnect:function(){
-dojo.forEach(this._cons,function(c){
-dojo.disconnect(c);
-});
+dojo.forEach(this._cons,dojo.disconnect,dojo);
 },uploadHTML:function(){
+if(this.selectMultipleFiles){
 dojo.destroy(this._fileInput);
+}
 this._setHtmlPostData();
 if(this.showProgress){
 this._animateProgress();
 }
-dojo.io.iframe.send({url:this.uploadUrl,form:this._formNode,handleAs:"json",handle:dojo.hitch(this,function(_56,_57,_58){
-this._complete(_56);
+var dfd=dojo.io.iframe.send({url:this.uploadUrl,form:this._formNode,handleAs:"json",error:dojo.hitch(this,function(err){
+this._error("HTML Upload Error:"+err.message);
+}),load:dojo.hitch(this,function(_35,_36,_37){
+this._complete(_35);
 })});
 },createHtmlUploader:function(){
 this._buildForm();
@@ -506,6 +537,7 @@ this._setFormStyle();
 this._buildFileInput();
 this._connectInput();
 this._styleContent();
+dojo.style(this.insideNode,"visibility","visible");
 this.onReady();
 },_connectInput:function(){
 this._disconnect();
@@ -531,21 +563,20 @@ this.onClick(evt);
 this._checkHtmlCancel("up");
 }));
 this._cons.push(dojo.connect(this._fileInput,"change",this,function(){
-this.log("html change");
 this._checkHtmlCancel("change");
 this._change([{name:this._fileInput.value,type:"",size:0}]);
 }));
 if(this.tabIndex>=0){
 dojo.attr(this.domNode,"tabIndex",this.tabIndex);
 }
-},_checkHtmlCancel:function(_5d){
-if(_5d=="change"){
+},_checkHtmlCancel:function(_38){
+if(_38=="change"){
 this.dialogIsOpen=false;
 }
-if(_5d=="up"){
+if(_38=="up"){
 this.dialogIsOpen=true;
 }
-if(_5d=="off"){
+if(_38=="off"){
 if(this.dialogIsOpen){
 this.onCancel();
 }
@@ -553,9 +584,15 @@ this.dialogIsOpen=false;
 }
 },_styleContent:function(){
 var o=this.fhtml.nr;
-dojo.style(this.insideNode,{width:o.w+"px",height:o.va=="middle"?o.h+"px":"auto",lineHeight:o.va=="middle"?o.h+"px":"auto",textAlign:o.ta,paddingTop:o.p[0]+"px",paddingRight:o.p[1]+"px",paddingBottom:o.p[2]+"px",paddingLeft:o.p[3]+"px"});
+dojo.style(this.insideNode,{width:o.w+"px",height:o.va=="middle"?o.h+"px":"auto",textAlign:o.ta,paddingTop:o.p[0]+"px",paddingRight:o.p[1]+"px",paddingBottom:o.p[2]+"px",paddingLeft:o.p[3]+"px"});
+try{
+dojo.style(this.insideNode,"lineHeight","inherit");
+}
+catch(e){
+}
 },_resetHTML:function(){
 if(this.uploaderType=="html"&&this._formNode){
+this.fileInputs=[];
 dojo.query("*",this._formNode).forEach(function(n){
 dojo.destroy(n);
 });
@@ -585,30 +622,37 @@ dojo.style(this._fileInput,"display","none");
 this._fileInput=document.createElement("input");
 this.fileInputs.push(this._fileInput);
 var nm=this.htmlFieldName;
-var _id=this.id;
+var _39=this.id;
 if(this.selectMultipleFiles){
 nm+=this.fileCount;
-_id+=this.fileCount;
+_39+=this.fileCount;
 this.fileCount++;
 }
 dojo.attr(this._fileInput,{id:this.id,name:nm,type:"file"});
 dojo.addClass(this._fileInput,"dijitFileInputReal");
 this._formNode.appendChild(this._fileInput);
-var _62=dojo.marginBox(this._fileInput);
-dojo.style(this._fileInput,{position:"relative",left:(this.fhtml.nr.w-_62.w)+"px",opacity:0});
+var _3a=dojo.marginBox(this._fileInput);
+dojo.style(this._fileInput,{position:"relative",left:(this.fhtml.nr.w-_3a.w)+"px",opacity:0});
+},_renumberInputs:function(){
+if(!this.selectMultipleFiles){
+return;
+}
+var nm;
+this.fileCount=0;
+dojo.forEach(this.fileInputs,function(inp){
+nm=this.htmlFieldName+this.fileCount;
+this.fileCount++;
+dojo.attr(inp,"name",nm);
+},this);
 },_setFormStyle:function(){
-var _63=Math.max(2,Math.max(Math.ceil(this.fhtml.nr.w/60),Math.ceil(this.fhtml.nr.h/15)));
-dojox.html.insertCssRule("#"+this._formNode.id+" input","font-size:"+_63+"em");
+var _3b=Math.max(2,Math.max(Math.ceil(this.fhtml.nr.w/60),Math.ceil(this.fhtml.nr.h/15)));
+dojox.html.insertCssRule("#"+this._formNode.id+" input","font-size:"+_3b+"em");
 dojo.style(this.domNode,{overflow:"hidden",position:"relative"});
 dojo.style(this.insideNode,"position","absolute");
 },_setHtmlPostData:function(){
 if(this.postData){
 for(var nm in this.postData){
-var f=document.createElement("input");
-dojo.attr(f,"type","hidden");
-dojo.attr(f,"name",nm);
-dojo.attr(f,"value",this.postData[nm]);
-this._formNode.appendChild(f);
+dojo.create("input",{type:"hidden",name:nm,value:this.postData[nm]},this._formNode);
 }
 }
 },uploadFlash:function(){
@@ -623,7 +667,7 @@ this._displayProgress(false);
 this.flashMovie.doUpload(this.postData);
 }
 catch(err){
-throw new Error("Sorry, the SWF failed to initialize."+err);
+this._error("FileUploader - Sorry, the SWF failed to initialize."+err);
 }
 },createFlashUploader:function(){
 this.uploadUrl=this.uploadUrl.toString();
@@ -634,23 +678,28 @@ loc.pop();
 loc=loc.join("/")+"/";
 this.uploadUrl=loc+this.uploadUrl;
 this.log("SWF Fixed - Relative loc:",loc," abs loc:",this.uploadUrl);
+}else{
+this.log("SWF URL unmodified:",this.uploadUrl);
 }
 }else{
+console.warn("Warning: no uploadUrl provided.");
 }
 var w=this.fhtml.nr.w;
 var h=this.fhtml.nr.h;
-var _6a={expressInstall:true,path:this.swfPath.uri||this.swfPath,width:w,height:h,allowScriptAccess:"always",allowNetworking:"all",vars:{uploadDataFieldName:this.flashFieldName,uploadUrl:this.uploadUrl,uploadOnSelect:this.uploadOnChange,deferredUploading:this.deferredUploading,selectMultipleFiles:this.selectMultipleFiles,id:this.id,isDebug:this.isDebug,devMode:this.devMode,flashButton:dojox.embed.flashVars.serialize("fh",this.fhtml),fileMask:dojox.embed.flashVars.serialize("fm",this.file [...]
-this.flashObject=new dojox.embed.Flash(_6a,this.insideNode);
-
-this.flashObject.onError=function(msg){
-console.warn("Flash Error:",msg);
-};
+var _3c={expressInstall:true,path:this.swfPath.uri||this.swfPath,width:w,height:h,allowScriptAccess:"always",allowNetworking:"all",vars:{uploadDataFieldName:this.flashFieldName,uploadUrl:this.uploadUrl,uploadOnSelect:this.uploadOnChange,deferredUploading:this.deferredUploading||0,selectMultipleFiles:this.selectMultipleFiles,id:this.id,isDebug:this.isDebug,devMode:this.devMode,flashButton:dojox.embed.flashVars.serialize("fh",this.fhtml),fileMask:dojox.embed.flashVars.serialize("fm",this.f [...]
+this.flashObject=new dojox.embed.Flash(_3c,this.insideNode);
+this.flashObject.onError=dojo.hitch(function(msg){
+this._error("Flash Error: "+msg);
+});
 this.flashObject.onReady=dojo.hitch(this,function(){
+dojo.style(this.insideNode,"visibility","visible");
+this.log("FileUploader flash object ready");
+this.onReady(this);
 });
 this.flashObject.onLoad=dojo.hitch(this,function(mov){
 this.flashMovie=mov;
 this.flashReady=true;
-this.onReady();
+this.onLoad(this);
 });
 this._connectFlash();
 },_connectFlash:function(){
@@ -667,15 +716,12 @@ this._doSub("/out","onMouseOut");
 this.connect(this.domNode,"focus",function(){
 this.flashMovie.focus();
 this.flashMovie.doFocus();
-dojo.connect(document,"keydown",function(evt){
-
-});
 });
 if(this.tabIndex>=0){
 dojo.attr(this.domNode,"tabIndex",this.tabIndex);
 }
-},_doSub:function(_6e,_6f){
-this._subs.push(dojo.subscribe(this.id+_6e,this,_6f));
+},_doSub:function(_3d,_3e){
+this._subs.push(dojo.subscribe(this.id+_3d,this,_3e));
 }});
 })();
 }
diff --git a/dojox/form/ListInput.js b/dojox/form/ListInput.js
new file mode 100644
index 0000000..02a4a25
--- /dev/null
+++ b/dojox/form/ListInput.js
@@ -0,0 +1,440 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.form.ListInput"]){
+dojo._hasResource["dojox.form.ListInput"]=true;
+dojo.experimental("dojox.form.ListInput");
+dojo.provide("dojox.form.ListInput");
+dojo.require("dijit.form._FormWidget");
+dojo.require("dijit.form.ValidationTextBox");
+dojo.require("dijit.InlineEditBox");
+dojo.requireLocalization("dijit","common",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
+dojo.declare("dojox.form.ListInput",[dijit.form._FormValueWidget],{constructor:function(){
+this._items=[];
+if(!dojo.isArray(this.delimiter)){
+this.delimiter=[this.delimiter];
+}
+var r="("+this.delimiter.join("|")+")?";
+this.regExp="^"+this.regExp+r+"$";
+},inputClass:"dojox.form._ListInputInputBox",inputHandler:"onChange",inputProperties:{minWidth:50},submitOnlyValidValue:true,useOnBlur:true,readOnlyInput:false,maxItems:null,showCloseButtonWhenValid:true,showCloseButtonWhenInvalid:true,regExp:".*",delimiter:",",constraints:{},baseClass:"dojoxListInput",type:"select",value:"",templateString:"<div dojoAttachPoint=\"focusNode\" class=\"dijit dijitReset dijitLeft dojoxListInput\"><select dojoAttachpoint=\"_selectNode\" multiple=\"multiple\"  [...]
+this.inherited(arguments);
+this._createInputBox();
+},_setReadOnlyInputAttr:function(_1){
+console.warn("_setReadOnlyInputAttr",this.id,_1);
+if(!this._started){
+return this._createInputBox();
+}
+this.readOnlyInput=_1;
+this._createInputBox();
+},_setReadOnlyItemAttr:function(_2){
+if(!this._started){
+return;
+}
+for(var i in this._items){
+this._items[i].attr("readOnlyItem",_2);
+}
+},_createInputBox:function(){
+console.warn("_createInputBox",this.id,this.readOnlyInput);
+dojo[(this.readOnlyInput?"add":"remove")+"Class"](this._inputNode,"dijitHidden");
+if(this.readOnlyInput){
+return;
+}
+if(this._input){
+return;
+}
+if(this.inputHandler===null){
+return !console.warn("you must add some handler to connect to input field");
+}
+if(dojo.isString(this.inputHandler)){
+this.inputHandler=this.inputHandler.split(",");
+}
+if(dojo.isString(this.inputProperties)){
+this.inputProperties=dojo.fromJson(this.inputProperties);
+}
+var _3=dojo.getObject(this.inputClass,false);
+this.inputProperties.regExp=this.regExpGen(this.constraints);
+this._input=new _3(this.inputProperties);
+this._input.startup();
+this._inputNode.appendChild(this._input.domNode);
+dojo.forEach(this.inputHandler,function(_4){
+this.connect(this._input,dojo.string.trim(_4),"_onHandler");
+},this);
+this.connect(this._input,"onKeyDown","_inputOnKeyDown");
+this.connect(this._input,"onBlur","_inputOnBlur");
+},compare:function(_5,_6){
+_5=_5.join(",");
+_6=_6.join(",");
+if(_5>_6){
+return 1;
+}else{
+if(_5<_6){
+return -1;
+}else{
+return 0;
+}
+}
+},add:function(_7){
+if(this._count>=this.maxItems&&this.maxItems!==null){
+return;
+}
+this._lastValueReported=this._getValues();
+if(!dojo.isArray(_7)){
+_7=[_7];
+}
+for(var i in _7){
+var _8=_7[i];
+if(_8===""||typeof _8!="string"){
+continue;
+}
+this._count++;
+var re=new RegExp(this.regExpGen(this.constraints));
+this._lastAddedItem=new dojox.form._ListInputInputItem({"index":this._items.length,readOnlyItem:this.readOnlyItem,value:_8,regExp:this.regExpGen(this.constraints)});
+this._lastAddedItem.startup();
+this._testItem(this._lastAddedItem,_8);
+this._lastAddedItem.onClose=dojo.hitch(this,"_onItemClose",this._lastAddedItem);
+this._lastAddedItem.onChange=dojo.hitch(this,"_onItemChange",this._lastAddedItem);
+this._lastAddedItem.onEdit=dojo.hitch(this,"_onItemEdit",this._lastAddedItem);
+this._lastAddedItem.onKeyDown=dojo.hitch(this,"_onItemKeyDown",this._lastAddedItem);
+if(this.useAnim){
+dojo.style(this._lastAddedItem.domNode,{opacity:0,display:""});
+}
+this._placeItem(this._lastAddedItem.domNode);
+if(this.useAnim){
+var _9=dojo.fadeIn({node:this._lastAddedItem.domNode,duration:this.duration,easing:this.easingIn}).play();
+}
+this._items[this._lastAddedItem.index]=this._lastAddedItem;
+if(this._onChangeActive&&this.intermediateChanges){
+this.onChange(_8);
+}
+if(this._count>=this.maxItems&&this.maxItems!==null){
+break;
+}
+}
+this._updateValues();
+if(this._lastValueReported.length==0){
+this._lastValueReported=this.value;
+}
+if(!this.readOnlyInput){
+this._input.attr("value","");
+}
+if(this._onChangeActive){
+this.onChange(this.value);
+}
+this._setReadOnlyWhenMaxItemsReached();
+},_setReadOnlyWhenMaxItemsReached:function(){
+this.attr("readOnlyInput",(this._count>=this.maxItems&&this.maxItems!==null));
+},_setSelectNode:function(){
+this._selectNode.options.length=0;
+var _a=this.submitOnlyValidValue?this.attr("MatchedValue"):this.value;
+if(!dojo.isArray(_a)){
+return;
+}
+dojo.forEach(_a,function(_b){
+this._selectNode.options[this._selectNode.options.length]=new Option(_b,_b,true,true);
+},this);
+},_placeItem:function(_c){
+dojo.place(_c,this._inputNode,"before");
+},_getCursorPos:function(_d){
+if(typeof _d.selectionStart!="undefined"){
+return _d.selectionStart;
+}
+try{
+_d.focus();
+}
+catch(e){
+}
+var _e=_d.createTextRange();
+_e.moveToBookmark(dojo.doc.selection.createRange().getBookmark());
+_e.moveEnd("character",_d.value.length);
+try{
+return _d.value.length-_e.text.length;
+}
+finally{
+_e=null;
+}
+},_onItemClose:function(_f){
+if(this.disabled){
+return;
+}
+if(this.useAnim){
+var _10=dojo.fadeOut({node:_f.domNode,duration:this.duration,easing:this.easingOut,onEnd:dojo.hitch(this,"_destroyItem",_f)}).play();
+}else{
+this._destroyItem(_f);
+}
+},_onItemKeyDown:function(_11,e){
+if(this.readOnlyItem||!this.useArrowForEdit){
+return;
+}
+if(e.keyCode==dojo.keys.LEFT_ARROW&&this._getCursorPos(e.target)==0){
+this._editBefore(_11);
+}else{
+if(e.keyCode==dojo.keys.RIGHT_ARROW&&this._getCursorPos(e.target)==e.target.value.length){
+this._editAfter(_11);
+}
+}
+},_editBefore:function(_12){
+this._currentItem=this._getPreviousItem(_12);
+if(this._currentItem!==null){
+this._currentItem.edit();
+}
+},_editAfter:function(_13){
+this._currentItem=this._getNextItem(_13);
+if(this._currentItem!==null){
+this._currentItem.edit();
+}
+if(!this.readOnlyInput){
+if(this._currentItem===null){
+this._focusInput();
+}
+}
+},_onItemChange:function(_14,_15){
+if(!_15){
+_15=_14.attr("value");
+}
+this._testItem(_14,_15);
+this._updateValues();
+},_onItemEdit:function(_16){
+dojo.removeClass(_16.domNode,"dijitError");
+dojo.removeClass(_16.domNode,this.baseClass+"Match");
+dojo.removeClass(_16.domNode,this.baseClass+"Mismatch");
+},_testItem:function(_17,_18){
+var re=new RegExp(this.regExpGen(this.constraints));
+var _19=_18.match(re);
+dojo.removeClass(_17.domNode,this.baseClass+(!_19?"Match":"Mismatch"));
+dojo.addClass(_17.domNode,this.baseClass+(_19?"Match":"Mismatch"));
+dojo[(!_19?"add":"remove")+"Class"](_17.domNode,"dijitError");
+if((this.showCloseButtonWhenValid&&_19)||(this.showCloseButtonWhenInvalid&&!_19)){
+dojo.addClass(_17.domNode,this.baseClass+"Closable");
+}else{
+dojo.removeClass(_17.domNode,this.baseClass+"Closable");
+}
+},_getValueAttr:function(){
+return this.value;
+},_setValueAttr:function(_1a){
+this._destroyAllItems();
+this.add(this._parseValue(_1a));
+},_parseValue:function(_1b){
+if(typeof _1b=="string"){
+if(dojo.isString(this.delimiter)){
+this.delimiter=[this.delimiter];
+}
+var re=new RegExp("^.*("+this.delimiter.join("|")+").*");
+if(_1b.match(re)){
+re=new RegExp(this.delimiter.join("|"));
+return _1b.split(re);
+}
+}
+return _1b;
+},regExpGen:function(_1c){
+return this.regExp;
+},_setDisabledAttr:function(_1d){
+if(!this.readOnlyItem){
+for(var i in this._items){
+this._items[i].attr("disabled",_1d);
+}
+}
+if(!this.readOnlyInput){
+this._input.attr("disabled",_1d);
+}
+this.inherited(arguments);
+},_onHandler:function(_1e){
+var _1f=this._parseValue(_1e);
+if(dojo.isArray(_1f)){
+this.add(_1f);
+}
+},_onClick:function(e){
+this._focusInput();
+},_focusInput:function(){
+if(!this.readOnlyInput&&this._input.focus){
+this._input.focus();
+}
+},_inputOnKeyDown:function(e){
+this._currentItem=null;
+if(e.keyCode==dojo.keys.BACKSPACE&&this._input.attr("value")==""&&this.attr("lastItem")){
+this._destroyItem(this.attr("lastItem"));
+}else{
+if(e.keyCode==dojo.keys.ENTER&&this._input.attr("value")!=""){
+this.add(this._input.attr("value"));
+}else{
+if(e.keyCode==dojo.keys.LEFT_ARROW&&this._getCursorPos(this._input.focusNode)==0&&!this.readOnlyItem&&this.useArrowForEdit){
+this._editBefore();
+}
+}
+}
+},_inputOnBlur:function(){
+if(this.useOnBlur&&this._input.attr("value")!=""){
+this.add(this._input.attr("value"));
+}
+},_getMatchedValueAttr:function(){
+return this._getValues(dojo.hitch(this,this._matchValidator));
+},_getMismatchedValueAttr:function(){
+return this._getValues(dojo.hitch(this,this._mismatchValidator));
+},_getValues:function(_20){
+var _21=[];
+_20=_20||this._nullValidator;
+for(var i in this._items){
+var _22=this._items[i];
+if(_22===null){
+continue;
+}
+var _23=_22.attr("value");
+if(_20(_23)){
+_21.push(_23);
+}
+}
+return _21;
+},_nullValidator:function(_24){
+return true;
+},_matchValidator:function(_25){
+var re=new RegExp(this.regExpGen(this.constraints));
+return _25.match(re);
+},_mismatchValidator:function(_26){
+var re=new RegExp(this.regExpGen(this.constraints));
+return !(_26.match(re));
+},_getLastItemAttr:function(){
+return this._getSomeItem();
+},_getSomeItem:function(_27,_28){
+_27=_27||false;
+_28=_28||"last";
+var _29=null;
+var _2a=-1;
+for(var i in this._items){
+if(this._items[i]===null){
+continue;
+}
+if(_28=="before"&&this._items[i]===_27){
+break;
+}
+_29=this._items[i];
+if(_28=="first"||_2a==0){
+_2a=1;
+break;
+}
+if(_28=="after"&&this._items[i]===_27){
+_2a=0;
+}
+}
+if(_28=="after"&&_2a==0){
+_29=null;
+}
+return _29;
+},_getPreviousItem:function(_2b){
+return this._getSomeItem(_2b,"before");
+},_getNextItem:function(_2c){
+return this._getSomeItem(_2c,"after");
+},_destroyItem:function(_2d,_2e){
+this._items[_2d.index]=null;
+_2d.destroy();
+this._count--;
+if(_2e!==false){
+this._updateValues();
+this._setReadOnlyWhenMaxItemsReached();
+}
+},_updateValues:function(){
+this.value=this._getValues();
+this._setSelectNode();
+},_destroyAllItems:function(){
+for(var i in this._items){
+if(this._items[i]==null){
+continue;
+}
+this._destroyItem(this._items[i],false);
+}
+this._items=[];
+this._count=0;
+this.value=null;
+this._setSelectNode();
+this._setReadOnlyWhenMaxItemsReached();
+},destroy:function(){
+this._destroyAllItems();
+this._lastAddedItem=null;
+if(!this._input){
+this._input.destroy();
+}
+this.inherited(arguments);
+}});
+dojo.declare("dojox.form._ListInputInputItem",[dijit._Widget,dijit._Templated],{templateString:"<li class=\"dijit dijitReset dijitLeft dojoxListInputItem\" dojoAttachEvent=\"onclick: onClick\" ><span dojoAttachPoint=\"labelNode\"></span></li>",closeButtonNode:null,readOnlyItem:true,baseClass:"dojoxListInputItem",value:"",regExp:".*",_editBox:null,_handleKeyDown:null,attributeMap:{value:{node:"labelNode",type:"innerHTML"}},postMixInProperties:function(){
+var _2f=dojo.i18n.getLocalization("dijit","common");
+dojo.mixin(this,_2f);
+this.inherited(arguments);
+},postCreate:function(){
+this.inherited(arguments);
+this.closeButtonNode=dojo.create("span",{"class":"dijitButtonNode dijitDialogCloseIcon",title:this.itemClose,onclick:dojo.hitch(this,"onClose"),onmouseenter:dojo.hitch(this,"_onCloseEnter"),onmouseleave:dojo.hitch(this,"_onCloseLeave")},this.domNode);
+dojo.create("span",{"class":"closeText",title:this.itemClose,innerHTML:"x"},this.closeButtonNode);
+},startup:function(){
+this.inherited(arguments);
+this._createInlineEditBox();
+},_setReadOnlyItemAttr:function(_30){
+this.readOnlyItem=_30;
+if(!_30){
+this._createInlineEditBox();
+}else{
+if(this._editBox){
+this._editBox.attr("disabled",true);
+}
+}
+},_createInlineEditBox:function(){
+if(this.readOnlyItem){
+return;
+}
+if(!this._started){
+return;
+}
+if(this._editBox){
+this._editBox.attr("disabled",false);
+return;
+}
+this._editBox=new dijit.InlineEditBox({value:this.value,editor:"dijit.form.ValidationTextBox",editorParams:{regExp:this.regExp}},this.labelNode);
+this.connect(this._editBox,"edit","_onEdit");
+this.connect(this._editBox,"onChange","_onCloseEdit");
+this.connect(this._editBox,"onCancel","_onCloseEdit");
+},edit:function(){
+if(!this.readOnlyItem){
+this._editBox.edit();
+}
+},_onCloseEdit:function(_31){
+dojo.removeClass(this.closeButtonNode,this.baseClass+"Edited");
+dojo.disconnect(this._handleKeyDown);
+this.onChange(_31);
+},_onEdit:function(){
+dojo.addClass(this.closeButtonNode,this.baseClass+"Edited");
+this._handleKeyDown=dojo.connect(this._editBox.editWidget,"_onKeyPress",this,"onKeyDown");
+this.onEdit();
+},_setDisabledAttr:function(_32){
+if(!this.readOnlyItem){
+this._editBox.attr("disabled",_32);
+}
+},_getValueAttr:function(){
+return (!this.readOnlyItem&&this._started?this._editBox.attr("value"):this.value);
+},destroy:function(){
+if(this._editBox){
+this._editBox.destroy();
+}
+this.inherited(arguments);
+},_onCloseEnter:function(){
+dojo.addClass(this.closeButtonNode,"dijitDialogCloseIcon-hover");
+},_onCloseLeave:function(){
+dojo.removeClass(this.closeButtonNode,"dijitDialogCloseIcon-hover");
+},onClose:function(){
+},onEdit:function(){
+},onClick:function(){
+},onChange:function(_33){
+},onKeyDown:function(_34){
+}});
+dojo.declare("dojox.form._ListInputInputBox",[dijit.form.ValidationTextBox],{minWidth:50,intermediateChanges:true,regExp:".*",_sizer:null,onChange:function(_35){
+this.inherited(arguments);
+if(this._sizer===null){
+this._sizer=dojo.create("div",{style:{position:"absolute",left:"-10000px",top:"-10000px"}},dojo.body());
+}
+this._sizer.innerHTML=_35;
+var w=dojo.contentBox(this._sizer).w+this.minWidth;
+dojo.contentBox(this.domNode,{w:w});
+},destroy:function(){
+dojo.destroy(this._sizer);
+this.inherited(arguments);
+}});
+}
diff --git a/dojox/form/Manager.js b/dojox/form/Manager.js
index 20298db..16f767f 100644
--- a/dojox/form/Manager.js
+++ b/dojox/form/Manager.js
@@ -17,19 +17,14 @@ dojo.require("dojox.form.manager._ValueMixin");
 dojo.require("dojox.form.manager._EnableMixin");
 dojo.require("dojox.form.manager._DisplayMixin");
 dojo.require("dojox.form.manager._ClassMixin");
-dojo.declare("dojox.form.Manager",[dijit._Widget,dijit._Templated,dojox.form.manager._Mixin,dojox.form.manager._NodeMixin,dojox.form.manager._FormMixin,dojox.form.manager._ValueMixin,dojox.form.manager._EnableMixin,dojox.form.manager._DisplayMixin,dojox.form.manager._ClassMixin],{widgetsInTemplate:true,buildRendering:function(){
+dojo.declare("dojox.form.Manager",[dijit._Widget,dojox.form.manager._Mixin,dojox.form.manager._NodeMixin,dojox.form.manager._FormMixin,dojox.form.manager._ValueMixin,dojox.form.manager._EnableMixin,dojox.form.manager._DisplayMixin,dojox.form.manager._ClassMixin],{buildRendering:function(){
 var _1=this.domNode=this.srcNodeRef;
 if(!this.containerNode){
 this.containerNode=_1;
 }
-this._attachTemplateNodes(_1);
-},startup:function(){
-if(this._started){
-return;
-}
-this._attachTemplateNodes(this.getDescendants(),function(n,p){
-return n[p];
-});
-this.inherited(arguments);
+this._attachPoints=[];
+dijit._Templated.prototype._attachTemplateNodes.call(this,_1);
+},destroyRendering:function(){
+dijit._Templated.prototype.destroyRendering.call(this);
 }});
 }
diff --git a/dojox/form/PasswordValidator.js b/dojox/form/PasswordValidator.js
index 4762633..2a205a2 100644
--- a/dojox/form/PasswordValidator.js
+++ b/dojox/form/PasswordValidator.js
@@ -19,6 +19,11 @@ this.inherited(arguments);
 if(!this.name){
 dojo.removeAttr(this.focusNode,"name");
 }
+this.connect(this.focusNode,"onkeypress","_onChildKeyPress");
+},_onChildKeyPress:function(e){
+if(e&&e.keyCode==dojo.keys.ENTER){
+this._setBlurValue();
+}
 }});
 dojo.declare("dojox.form._OldPWBox",dojox.form._ChildTextBox,{_isPWValid:false,_setValueAttr:function(_1,_2){
 if(_1===""){
@@ -42,24 +47,24 @@ return this.inherited(arguments);
 }
 return "";
 },_setBlurValue:function(){
-var _5=dijit.form.ValidationTextBox.prototype._getValueAttr.call(this);
-this._setValueAttr(_5,(this.isValid?this.isValid():true));
+var _4=dijit.form.ValidationTextBox.prototype._getValueAttr.call(this);
+this._setValueAttr(_4,(this.isValid?this.isValid():true));
 }});
 dojo.declare("dojox.form._NewPWBox",dojox.form._ChildTextBox,{required:true,onChange:function(){
 this.containerWidget._inputWidgets[2].validate(false);
 this.inherited(arguments);
 }});
-dojo.declare("dojox.form._VerifyPWBox",dojox.form._ChildTextBox,{isValid:function(_6){
+dojo.declare("dojox.form._VerifyPWBox",dojox.form._ChildTextBox,{isValid:function(_5){
 return this.inherited("isValid",arguments)&&(this.attr("value")==this.containerWidget._inputWidgets[1].attr("value"));
 }});
-dojo.declare("dojox.form.PasswordValidator",dijit.form._FormValueWidget,{required:true,_inputWidgets:null,oldName:"",templateString:"<div dojoAttachPoint=\"containerNode\">\n\t<input type=\"hidden\" name=\"${name}\" value=\"\" dojoAttachPoint=\"focusNode\" />\n</div>\n",_hasBeenBlurred:false,isValid:function(_7){
+dojo.declare("dojox.form.PasswordValidator",dijit.form._FormValueWidget,{required:true,_inputWidgets:null,oldName:"",templateString:dojo.cache("dojox.form","resources/PasswordValidator.html","<div dojoAttachPoint=\"containerNode\">\n\t<input type=\"hidden\" name=\"${name}\" value=\"\" dojoAttachPoint=\"focusNode\" />\n</div>\n"),_hasBeenBlurred:false,isValid:function(_6){
 return dojo.every(this._inputWidgets,function(i){
 if(i&&i._setStateClass){
 i._setStateClass();
 }
 return (!i||i.isValid());
 });
-},validate:function(_9){
+},validate:function(_7){
 return dojo.every(dojo.map(this._inputWidgets,function(i){
 if(i&&i.validate){
 i._hasBeenBlurred=(i._hasBeenBlurred||this._hasBeenBlurred);
@@ -75,62 +80,63 @@ i.reset();
 }
 },this);
 },_createSubWidgets:function(){
-var _c=this._inputWidgets,_d=dojo.i18n.getLocalization("dojox.form","PasswordValidator",this.lang);
-dojo.forEach(_c,function(i,_f){
+var _8=this._inputWidgets,_9=dojo.i18n.getLocalization("dojox.form","PasswordValidator",this.lang);
+dojo.forEach(_8,function(i,_a){
 if(i){
 var p={containerWidget:this},c;
-if(_f===0){
+if(_a===0){
 p.name=this.oldName;
-p.invalidMessage=_d.badPasswordMessage;
+p.invalidMessage=_9.badPasswordMessage;
 c=dojox.form._OldPWBox;
 }else{
-if(_f===1){
+if(_a===1){
 p.required=this.required;
 c=dojox.form._NewPWBox;
 }else{
-if(_f===2){
-p.invalidMessage=_d.nomatchMessage;
+if(_a===2){
+p.invalidMessage=_9.nomatchMessage;
 c=dojox.form._VerifyPWBox;
 }
 }
 }
-_c[_f]=new c(p,i);
+_8[_a]=new c(p,i);
 }
 },this);
-},pwCheck:function(_12){
+},pwCheck:function(_b){
 return false;
 },postCreate:function(){
 this.inherited(arguments);
-var _13=this._inputWidgets=[];
+var _c=this._inputWidgets=[];
 dojo.forEach(["old","new","verify"],function(i){
-_13.push(dojo.query("input[pwType="+i+"]",this.containerNode)[0]);
+_c.push(dojo.query("input[pwType="+i+"]",this.containerNode)[0]);
 },this);
-if(!_13[1]||!_13[2]){
+if(!_c[1]||!_c[2]){
 throw new Error("Need at least pwType=\"new\" and pwType=\"verify\"");
 }
-if(this.oldName&&!_13[0]){
+if(this.oldName&&!_c[0]){
 throw new Error("Need to specify pwType=\"old\" if using oldName");
 }
+this.containerNode=this.domNode;
 this._createSubWidgets();
 this.connect(this._inputWidgets[1],"_setValueAttr","_childValueAttr");
 this.connect(this._inputWidgets[2],"_setValueAttr","_childValueAttr");
 },_childValueAttr:function(v){
 this.attr("value",this.isValid()?v:"");
-},_setDisabledAttr:function(_16){
+},_setDisabledAttr:function(_d){
 this.inherited(arguments);
 dojo.forEach(this._inputWidgets,function(i){
 if(i&&i.attr){
-i.attr("disabled",_16);
+i.attr("disabled",_d);
 }
 });
-},_setRequiredAttribute:function(_18){
-this.required=_18;
-dojo.attr(this.focusNode,"required",_18);
-dijit.setWaiState(this.focusNode,"required",_18);
+},_setRequiredAttribute:function(_e){
+this.required=_e;
+dojo.attr(this.focusNode,"required",_e);
+dijit.setWaiState(this.focusNode,"required",_e);
 this._refreshState();
 dojo.forEach(this._inputWidgets,function(i){
 if(i&&i.attr){
-i.attr("required",_18);
+i.attr("required",_e);
 }
 });
 },_setValueAttr:function(v){
diff --git a/dojox/form/README b/dojox/form/README
index ef7a7b8..c1b3ff7 100644
--- a/dojox/form/README
+++ b/dojox/form/README
@@ -8,7 +8,7 @@ Project state:
 experimental
 -------------------------------------------------------------------------------
 Credits
-	Nathan Toone (nathan)
+	Nathan Toone (toonetown)
 	Peter Higgins	(dante)
     Wolfram Kriesing (http://wolfram.kriesing.de/blog/): Rating
     Mike Wilcox
@@ -53,10 +53,13 @@ Additional Notes (Brief widget list):
 						
 	* FilePickerTextBox - a validating text box that can browser server-side
 						files using a dojox.data.FileStore
-	* FileUploader - Convert (almost) any button into a file input. Multi-file
-						uploads supported. Uses a SWF file created with Deft.
-						Compatible with Flash Player versions 8-10.
+	* FileUploader - Allows for Multi-file uploads and file masking. Uses a SWF
+						file created with Deft. Compatible with Flash Player
+						versions 8-10. Degradeable to a multi-file HTML uploader.
 	
+	* ListInput - A text-box widget that allows inputting multiple items (similar
+						to the "to" field on many email clients)
+						
     * MultiComboBox - an experimental ComboBox that allows
 						multiple entries bases on a separator character.
 
diff --git a/dojox/form/RangeSlider.js b/dojox/form/RangeSlider.js
index 75a3657..a4f4e8d 100644
--- a/dojox/form/RangeSlider.js
+++ b/dojox/form/RangeSlider.js
@@ -11,32 +11,34 @@ dojo.provide("dojox.form.RangeSlider");
 dojo.require("dijit.form.HorizontalSlider");
 dojo.require("dijit.form.VerticalSlider");
 dojo.require("dojox.fx");
-dojo.declare("dojox.form._RangeSliderMixin",null,{value:[0,100],postCreate:function(){
-this.inherited(arguments);
-if(this._isReversed()){
-this.value.sort(function(a,b){
+(function(){
+var _1=function(a,b){
 return b-a;
-});
-}else{
-this.value.sort(function(a,b){
+},_2=function(a,b){
 return a-b;
+};
+dojo.declare("dojox.form._RangeSliderMixin",null,{value:[0,100],postMixInProperties:function(){
+this.value=dojo.map(this.value,function(i){
+return parseInt(i,10);
 });
-}
-var _5=this;
-var _6=function(){
+},postCreate:function(){
+this.inherited(arguments);
+this.value.sort(this._isReversed()?_1:_2);
+var _3=this;
+var _4=function(){
 dijit.form._SliderMoverMax.apply(this,arguments);
-this.widget=_5;
+this.widget=_3;
 };
-dojo.extend(_6,dijit.form._SliderMoverMax.prototype);
-this._movableMax=new dojo.dnd.Moveable(this.sliderHandleMax,{mover:_6});
+dojo.extend(_4,dijit.form._SliderMoverMax.prototype);
+this._movableMax=new dojo.dnd.Moveable(this.sliderHandleMax,{mover:_4});
 dijit.setWaiState(this.focusNodeMax,"valuemin",this.minimum);
 dijit.setWaiState(this.focusNodeMax,"valuemax",this.maximum);
-var _7=function(){
+var _5=function(){
 dijit.form._SliderBarMover.apply(this,arguments);
-this.widget=_5;
+this.widget=_3;
 };
-dojo.extend(_7,dijit.form._SliderBarMover.prototype);
-this._movableBar=new dojo.dnd.Moveable(this.progressBar,{mover:_7});
+dojo.extend(_5,dijit.form._SliderBarMover.prototype);
+this._movableBar=new dojo.dnd.Moveable(this.progressBar,{mover:_5});
 },destroy:function(){
 this.inherited(arguments);
 this._movableMax.destroy();
@@ -45,61 +47,51 @@ this._movableBar.destroy();
 if(this.disabled||this.readOnly||e.altKey||e.ctrlKey){
 return;
 }
-var _9=e.currentTarget;
-var _a=false;
-var _b=false;
-var _c;
-if(_9==this.sliderHandle){
-_a=true;
+var _6=e.currentTarget,_7=false,_8=false,k=dojo.keys;
+if(_6==this.sliderHandle){
+_7=true;
 }else{
-if(_9==this.progressBar){
-_b=true;
-_a=true;
+if(_6==this.progressBar){
+_8=_7=true;
 }else{
-if(_9==this.sliderHandleMax){
-_b=true;
+if(_6==this.sliderHandleMax){
+_8=true;
 }
 }
 }
 switch(e.keyCode){
-case dojo.keys.HOME:
-this._setValueAttr(this.minimum,true,_b);
+case k.HOME:
+this._setValueAttr(this.minimum,true,_8);
 break;
-case dojo.keys.END:
-this._setValueAttr(this.maximum,true,_b);
+case k.END:
+this._setValueAttr(this.maximum,true,_8);
 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):
-if(_a&&_b){
-_c=Array();
-_c[0]={"change":e.keyCode==dojo.keys.PAGE_UP?this.pageIncrement:1,"useMaxValue":true};
-_c[1]={"change":e.keyCode==dojo.keys.PAGE_UP?this.pageIncrement:1,"useMaxValue":false};
-this._bumpValue(_c);
+case ((this._descending||this.isLeftToRight())?k.RIGHT_ARROW:k.LEFT_ARROW):
+case (this._descending===false?k.DOWN_ARROW:k.UP_ARROW):
+case (this._descending===false?k.PAGE_DOWN:k.PAGE_UP):
+if(_7&&_8){
+this._bumpValue([{"change":e.keyCode==k.PAGE_UP?this.pageIncrement:1,"useMaxValue":true},{"change":e.keyCode==k.PAGE_UP?this.pageIncrement:1,"useMaxValue":false}]);
 }else{
-if(_a){
-this._bumpValue(e.keyCode==dojo.keys.PAGE_UP?this.pageIncrement:1,true);
+if(_7){
+this._bumpValue(e.keyCode==k.PAGE_UP?this.pageIncrement:1,true);
 }else{
-if(_b){
-this._bumpValue(e.keyCode==dojo.keys.PAGE_UP?this.pageIncrement:1);
+if(_8){
+this._bumpValue(e.keyCode==k.PAGE_UP?this.pageIncrement:1);
 }
 }
 }
 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):
-if(_a&&_b){
-_c=Array();
-_c[0]={"change":e.keyCode==dojo.keys.PAGE_DOWN?-this.pageIncrement:-1,"useMaxValue":false};
-_c[1]={"change":e.keyCode==dojo.keys.PAGE_DOWN?-this.pageIncrement:-1,"useMaxValue":true};
-this._bumpValue(_c);
+case ((this._descending||this.isLeftToRight())?k.LEFT_ARROW:k.RIGHT_ARROW):
+case (this._descending===false?k.UP_ARROW:k.DOWN_ARROW):
+case (this._descending===false?k.PAGE_UP:k.PAGE_DOWN):
+if(_7&&_8){
+this._bumpValue([{change:e.keyCode==k.PAGE_DOWN?-this.pageIncrement:-1,useMaxValue:false},{change:e.keyCode==k.PAGE_DOWN?-this.pageIncrement:-1,useMaxValue:true}]);
 }else{
-if(_a){
-this._bumpValue(e.keyCode==dojo.keys.PAGE_DOWN?-this.pageIncrement:-1);
+if(_7){
+this._bumpValue(e.keyCode==k.PAGE_DOWN?-this.pageIncrement:-1);
 }else{
-if(_b){
-this._bumpValue(e.keyCode==dojo.keys.PAGE_DOWN?-this.pageIncrement:-1,true);
+if(_8){
+this._bumpValue(e.keyCode==k.PAGE_DOWN?-this.pageIncrement:-1,true);
 }
 }
 }
@@ -120,36 +112,26 @@ dijit.focus(this.sliderHandleMax);
 dojo.stopEvent(e);
 },_onClkIncBumper:function(){
 this._setValueAttr(this._descending===false?this.minimum:this.maximum,true,true);
-},_bumpValue:function(_e,_f){
-var _10;
-if(!dojo.isArray(_e)){
-_10=this._getBumpValue(_e,_f);
-}else{
-_10=Array();
-_10[0]=this._getBumpValue(_e[0]["change"],_e[0]["useMaxValue"]);
-_10[1]=this._getBumpValue(_e[1]["change"],_e[1]["useMaxValue"]);
-}
-this._setValueAttr(_10,true,!dojo.isArray(_e)&&((_e>0&&!_f)||(_f&&_e<0)));
-},_getBumpValue:function(_11,_12){
-var s=dojo.getComputedStyle(this.sliderBarContainer);
-var c=dojo._getContentBox(this.sliderBarContainer,s);
-var _15=this.discreteValues;
-if(_15<=1||_15==Infinity){
-_15=c[this._pixelCount];
-}
-_15--;
-var _16=!_12?this.value[0]:this.value[1];
-if((this._isReversed()&&_11<0)||(_11>0&&!this._isReversed())){
-_16=!_12?this.value[1]:this.value[0];
-}
-var _17=(_16-this.minimum)*_15/(this.maximum-this.minimum)+_11;
-if(_17<0){
-_17=0;
-}
-if(_17>_15){
-_17=_15;
-}
-return _17*(this.maximum-this.minimum)/_15+this.minimum;
+},_bumpValue:function(_9,_a){
+var _b=dojo.isArray(_9)?[this._getBumpValue(_9[0].change,_9[0].useMaxValue),this._getBumpValue(_9[1].change,_9[1].useMaxValue)]:this._getBumpValue(_9,_a);
+this._setValueAttr(_b,true,!dojo.isArray(_9)&&((_9>0&&!_a)||(_a&&_9<0)));
+},_getBumpValue:function(_c,_d){
+var s=dojo.getComputedStyle(this.sliderBarContainer),c=dojo._getContentBox(this.sliderBarContainer,s),_e=this.discreteValues,_f=!_d?this.value[0]:this.value[1];
+if(_e<=1||_e==Infinity){
+_e=c[this._pixelCount];
+}
+_e--;
+if((this._isReversed()&&_c<0)||(_c>0&&!this._isReversed())){
+_f=!_d?this.value[1]:this.value[0];
+}
+var _10=(_f-this.minimum)*_e/(this.maximum-this.minimum)+_c;
+if(_10<0){
+_10=0;
+}
+if(_10>_e){
+_10=_e;
+}
+return _10*(this.maximum-this.minimum)/_e+this.minimum;
 },_onBarClick:function(e){
 if(this.disabled||this.readOnly){
 return;
@@ -165,166 +147,151 @@ return;
 if(!dojo.isIE){
 dijit.focus(this.progressBar);
 }
-var _1a=dojo.coords(this.sliderBarContainer,true);
-var bar=dojo.coords(this.progressBar,true);
-var _1c=e[this._mousePixelCoord]-_1a[this._startingPixelCoord];
-var _1d=bar[this._startingPixelCount];
-var _1e=bar[this._startingPixelCount]+bar[this._pixelCount];
-var _1f=this._isReversed()?_1c<=_1d:_1c>=_1e;
-this._setPixelValue(this._isReversed()?(_1a[this._pixelCount]-_1c):_1c,_1a[this._pixelCount],true,_1f);
+var _11=dojo.coords(this.sliderBarContainer,true),bar=dojo.coords(this.progressBar,true),_12=e[this._mousePixelCoord]-_11[this._startingPixelCoord],_13=bar[this._startingPixelCount],_14=_13+bar[this._pixelCount],_15=this._isReversed()?_12<=_13:_12>=_14,p=this._isReversed()?_11[this._pixelCount]-_12:_12;
+this._setPixelValue(p,_11[this._pixelCount],true,_15);
 dojo.stopEvent(e);
-},_setPixelValue:function(_20,_21,_22,_23){
+},_setPixelValue:function(_16,_17,_18,_19){
 if(this.disabled||this.readOnly){
 return;
 }
-var _24=this._getValueByPixelValue(_20,_21);
-this._setValueAttr(_24,_22,_23);
-},_getValueByPixelValue:function(_25,_26){
-_25=_25<0?0:_26<_25?_26:_25;
-var _27=this.discreteValues;
-if(_27<=1||_27==Infinity){
-_27=_26;
-}
-_27--;
-var _28=_26/_27;
-var _29=Math.round(_25/_28);
-return (this.maximum-this.minimum)*_29/_27+this.minimum;
-},_setValueAttr:function(_2a,_2b,_2c){
-var _2d=this.value;
-if(!dojo.isArray(_2a)){
-if(_2c){
+var _1a=this._getValueByPixelValue(_16,_17);
+this._setValueAttr(_1a,_18,_19);
+},_getValueByPixelValue:function(_1b,_1c){
+_1b=_1b<0?0:_1c<_1b?_1c:_1b;
+var _1d=this.discreteValues;
+if(_1d<=1||_1d==Infinity){
+_1d=_1c;
+}
+_1d--;
+var _1e=_1c/_1d;
+var _1f=Math.round(_1b/_1e);
+return (this.maximum-this.minimum)*_1f/_1d+this.minimum;
+},_setValueAttr:function(_20,_21,_22){
+var _23=this.value;
+if(!dojo.isArray(_20)){
+if(_22){
 if(this._isReversed()){
-_2d[0]=_2a;
+_23[0]=_20;
 }else{
-_2d[1]=_2a;
+_23[1]=_20;
 }
 }else{
 if(this._isReversed()){
-_2d[1]=_2a;
+_23[1]=_20;
 }else{
-_2d[0]=_2a;
+_23[0]=_20;
 }
 }
 }else{
-_2d=_2a;
+_23=_20;
 }
 this._lastValueReported="";
-this.valueNode.value=this.value=_2a=_2d;
-dijit.setWaiState(this.focusNode,"valuenow",_2d[0]);
-dijit.setWaiState(this.focusNodeMax,"valuenow",_2d[1]);
-if(this._isReversed()){
-this.value.sort(function(a,b){
-return b-a;
-});
-}else{
-this.value.sort(function(a,b){
-return a-b;
-});
-}
+this.valueNode.value=this.value=_20=_23;
+dijit.setWaiState(this.focusNode,"valuenow",_23[0]);
+dijit.setWaiState(this.focusNodeMax,"valuenow",_23[1]);
+this.value.sort(this._isReversed()?_1:_2);
 dijit.form._FormValueWidget.prototype._setValueAttr.apply(this,arguments);
-this._printSliderBar(_2b,_2c);
-},_printSliderBar:function(_32,_33){
-var _34=(this.value[0]-this.minimum)/(this.maximum-this.minimum);
-var _35=(this.value[1]-this.minimum)/(this.maximum-this.minimum);
-var _36=_34;
-if(_34>_35){
-_34=_35;
-_35=_36;
-}
-var _37=this._isReversed()?((1-_34)*100):(_34*100);
-var _38=this._isReversed()?((1-_35)*100):(_35*100);
-var _39=this._isReversed()?((1-_35)*100):(_34*100);
-if(_32&&this.slideDuration>0&&this.progressBar.style[this._progressPixelSize]){
-var _3a=_33?_35:_34;
-var _3b=this;
-var _3c={};
-var _3d=parseFloat(this.progressBar.style[this._handleOffsetCoord]);
-var _3e=this.slideDuration/10;
-if(_3e===0){
+this._printSliderBar(_21,_22);
+},_printSliderBar:function(_24,_25){
+var _26=(this.value[0]-this.minimum)/(this.maximum-this.minimum);
+var _27=(this.value[1]-this.minimum)/(this.maximum-this.minimum);
+var _28=_26;
+if(_26>_27){
+_26=_27;
+_27=_28;
+}
+var _29=this._isReversed()?((1-_26)*100):(_26*100);
+var _2a=this._isReversed()?((1-_27)*100):(_27*100);
+var _2b=this._isReversed()?((1-_27)*100):(_26*100);
+if(_24&&this.slideDuration>0&&this.progressBar.style[this._progressPixelSize]){
+var _2c=_25?_27:_26;
+var _2d=this;
+var _2e={};
+var _2f=parseFloat(this.progressBar.style[this._handleOffsetCoord]);
+var _30=this.slideDuration/10;
+if(_30===0){
 return;
 }
-if(_3e<0){
-_3e=0-_3e;
-}
-var _3f={};
-var _40={};
-var _41={};
-_3f[this._handleOffsetCoord]={start:this.sliderHandle.style[this._handleOffsetCoord],end:_37,units:"%"};
-_40[this._handleOffsetCoord]={start:this.sliderHandleMax.style[this._handleOffsetCoord],end:_38,units:"%"};
-_41[this._handleOffsetCoord]={start:this.progressBar.style[this._handleOffsetCoord],end:_39,units:"%"};
-_41[this._progressPixelSize]={start:this.progressBar.style[this._progressPixelSize],end:(_35-_34)*100,units:"%"};
-var _42=dojo.animateProperty({node:this.sliderHandle,duration:_3e,properties:_3f});
-var _43=dojo.animateProperty({node:this.sliderHandleMax,duration:_3e,properties:_40});
-var _44=dojo.animateProperty({node:this.progressBar,duration:_3e,properties:_41});
-var _45=dojo.fx.combine([_42,_43,_44]);
-_45.play();
+if(_30<0){
+_30=0-_30;
+}
+var _31={};
+var _32={};
+var _33={};
+_31[this._handleOffsetCoord]={start:this.sliderHandle.style[this._handleOffsetCoord],end:_29,units:"%"};
+_32[this._handleOffsetCoord]={start:this.sliderHandleMax.style[this._handleOffsetCoord],end:_2a,units:"%"};
+_33[this._handleOffsetCoord]={start:this.progressBar.style[this._handleOffsetCoord],end:_2b,units:"%"};
+_33[this._progressPixelSize]={start:this.progressBar.style[this._progressPixelSize],end:(_27-_26)*100,units:"%"};
+var _34=dojo.animateProperty({node:this.sliderHandle,duration:_30,properties:_31});
+var _35=dojo.animateProperty({node:this.sliderHandleMax,duration:_30,properties:_32});
+var _36=dojo.animateProperty({node:this.progressBar,duration:_30,properties:_33});
+var _37=dojo.fx.combine([_34,_35,_36]);
+_37.play();
 }else{
-this.sliderHandle.style[this._handleOffsetCoord]=_37+"%";
-this.sliderHandleMax.style[this._handleOffsetCoord]=_38+"%";
-this.progressBar.style[this._handleOffsetCoord]=_39+"%";
-this.progressBar.style[this._progressPixelSize]=((_35-_34)*100)+"%";
+this.sliderHandle.style[this._handleOffsetCoord]=_29+"%";
+this.sliderHandleMax.style[this._handleOffsetCoord]=_2a+"%";
+this.progressBar.style[this._handleOffsetCoord]=_2b+"%";
+this.progressBar.style[this._progressPixelSize]=((_27-_26)*100)+"%";
 }
 }});
 dojo.declare("dijit.form._SliderMoverMax",dijit.form._SliderMover,{onMouseMove:function(e){
-var _47=this.widget;
-var _48=_47._abspos;
-if(!_48){
-_48=_47._abspos=dojo.coords(_47.sliderBarContainer,true);
-_47._setPixelValue_=dojo.hitch(_47,"_setPixelValue");
-_47._isReversed_=_47._isReversed();
-}
-var _49=e[_47._mousePixelCoord]-_48[_47._startingPixelCoord];
-_47._setPixelValue_(_47._isReversed_?(_48[_47._pixelCount]-_49):_49,_48[_47._pixelCount],false,true);
+var _38=this.widget;
+var _39=_38._abspos;
+if(!_39){
+_39=_38._abspos=dojo.coords(_38.sliderBarContainer,true);
+_38._setPixelValue_=dojo.hitch(_38,"_setPixelValue");
+_38._isReversed_=_38._isReversed();
+}
+var _3a=e[_38._mousePixelCoord]-_39[_38._startingPixelCoord];
+_38._setPixelValue_(_38._isReversed_?(_39[_38._pixelCount]-_3a):_3a,_39[_38._pixelCount],false,true);
 },destroy:function(e){
 dojo.dnd.Mover.prototype.destroy.apply(this,arguments);
-var _4b=this.widget;
-_4b._abspos=null;
-_4b._setValueAttr(_4b.value,true);
+var _3b=this.widget;
+_3b._abspos=null;
+_3b._setValueAttr(_3b.value,true);
 }});
 dojo.declare("dijit.form._SliderBarMover",dojo.dnd.Mover,{onMouseMove:function(e){
-var _4d=this.widget;
-if(_4d.disabled||_4d.readOnly){
+var _3c=this.widget;
+if(_3c.disabled||_3c.readOnly){
 return;
 }
-var _4e=_4d._abspos;
-var bar=_4d._bar;
-var _50=_4d._mouseOffset;
-if(!_4e){
-_4e=_4d._abspos=dojo.coords(_4d.sliderBarContainer,true);
-_4d._setPixelValue_=dojo.hitch(_4d,"_setPixelValue");
-_4d._getValueByPixelValue_=dojo.hitch(_4d,"_getValueByPixelValue");
-_4d._isReversed_=_4d._isReversed();
+var _3d=_3c._abspos;
+var bar=_3c._bar;
+var _3e=_3c._mouseOffset;
+if(!_3d){
+_3d=_3c._abspos=dojo.coords(_3c.sliderBarContainer,true);
+_3c._setPixelValue_=dojo.hitch(_3c,"_setPixelValue");
+_3c._getValueByPixelValue_=dojo.hitch(_3c,"_getValueByPixelValue");
+_3c._isReversed_=_3c._isReversed();
 }
 if(!bar){
-bar=_4d._bar=dojo.coords(_4d.progressBar,true);
+bar=_3c._bar=dojo.coords(_3c.progressBar,true);
 }
-if(!_50){
-_50=_4d._mouseOffset=e[_4d._mousePixelCoord]-_4e[_4d._startingPixelCoord]-bar[_4d._startingPixelCount];
+if(!_3e){
+_3e=_3c._mouseOffset=e[_3c._mousePixelCoord]-_3d[_3c._startingPixelCoord]-bar[_3c._startingPixelCount];
 }
-var _51=e[_4d._mousePixelCoord]-_4e[_4d._startingPixelCoord]-_50;
-var _52=e[_4d._mousePixelCoord]-_4e[_4d._startingPixelCoord]-_50+bar[_4d._pixelCount];
-var _53=[_51,_52];
-_53.sort(function(a,b){
-return a-b;
-});
-if(_53[0]<=0){
-_53[0]=0;
-_53[1]=bar[_4d._pixelCount];
+var _3f=e[_3c._mousePixelCoord]-_3d[_3c._startingPixelCoord]-_3e,_40=_3f+bar[_3c._pixelCount];
+pixelValues=[_3f,_40];
+pixelValues.sort(_2);
+if(pixelValues[0]<=0){
+pixelValues[0]=0;
+pixelValues[1]=bar[_3c._pixelCount];
 }
-if(_53[1]>=_4e[_4d._pixelCount]){
-_53[1]=_4e[_4d._pixelCount];
-_53[0]=_4e[_4d._pixelCount]-bar[_4d._pixelCount];
+if(pixelValues[1]>=_3d[_3c._pixelCount]){
+pixelValues[1]=_3d[_3c._pixelCount];
+pixelValues[0]=_3d[_3c._pixelCount]-bar[_3c._pixelCount];
 }
-var _56=[_4d._getValueByPixelValue(_4d._isReversed_?(_4e[_4d._pixelCount]-_53[0]):_53[0],_4e[_4d._pixelCount]),_4d._getValueByPixelValue(_4d._isReversed_?(_4e[_4d._pixelCount]-_53[1]):_53[1],_4e[_4d._pixelCount])];
-_4d._setValueAttr(_56,false,false);
-},destroy:function(e){
+var _41=[_3c._getValueByPixelValue(_3c._isReversed_?(_3d[_3c._pixelCount]-pixelValues[0]):pixelValues[0],_3d[_3c._pixelCount]),_3c._getValueByPixelValue(_3c._isReversed_?(_3d[_3c._pixelCount]-pixelValues[1]):pixelValues[1],_3d[_3c._pixelCount])];
+_3c._setValueAttr(_41,false,false);
+},destroy:function(){
 dojo.dnd.Mover.prototype.destroy.apply(this,arguments);
-var _58=this.widget;
-_58._abspos=null;
-_58._bar=null;
-_58._mouseOffset=null;
-_58._setValueAttr(_58.value,true);
+var _42=this.widget;
+_42._abspos=null;
+_42._bar=null;
+_42._mouseOffset=null;
+_42._setValueAttr(_42.value,true);
 }});
-dojo.declare("dojox.form.HorizontalRangeSlider",[dijit.form.HorizontalSlider,dojox.form._RangeSliderMixin],{templateString:"<table class=\"dijit dijitReset dijitSlider dojoxRangeSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\"\n    ><tr class=\"dijitReset\"\n        ><td class=\"dijitReset\" colspan=\"2\"></td\n        ><td dojoAttachPoint=\"containerNode,topDecoration\" class=\"dijitReset\" style=\"text-align:center;width:100%;\"></td\n        ><td class=\"dijitR [...]
-dojo.declare("dojox.form.VerticalRangeSlider",[dijit.form.VerticalSlider,dojox.form._RangeSliderMixin],{templateString:"<table class=\"dijitReset dijitSlider dojoxRangeSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\"\n><tbody class=\"dijitReset\"\n    ><tr class=\"dijitReset\"\n        ><td class=\"dijitReset\"></td\n        ><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\"\n            ><div class=\"dijitSliderIncrementIconV\" tabIn [...]
+dojo.declare("dojox.form.HorizontalRangeSlider",[dijit.form.HorizontalSlider,dojox.form._RangeSliderMixin],{templateString:dojo.cache("dojox.form","resources/HorizontalRangeSlider.html","<table class=\"dijit dijitReset dijitSlider dojoxRangeSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\"\n    ><tr class=\"dijitReset\"\n        ><td class=\"dijitReset\" colspan=\"2\"></td\n        ><td dojoAttachPoint=\"containerNode,topDecoration\" class=\"dijitReset\" style=\"te [...]
+dojo.declare("dojox.form.VerticalRangeSlider",[dijit.form.VerticalSlider,dojox.form._RangeSliderMixin],{templateString:dojo.cache("dojox.form","resources/VerticalRangeSlider.html","<table class=\"dijitReset dijitSlider dojoxRangeSlider\" cellspacing=\"0\" cellpadding=\"0\" border=\"0\" rules=\"none\"\n><tbody class=\"dijitReset\"\n    ><tr class=\"dijitReset\"\n        ><td class=\"dijitReset\"></td\n        ><td class=\"dijitReset dijitSliderButtonContainer dijitSliderButtonContainerV\" [...]
+})();
 }
diff --git a/dojox/form/Rating.js b/dojox/form/Rating.js
index e8b95a4..a910f96 100644
--- a/dojox/form/Rating.js
+++ b/dojox/form/Rating.js
@@ -21,34 +21,34 @@ this.templateString=dojo.string.substitute(_2,{stars:_4});
 },postCreate:function(){
 this.inherited(arguments);
 this._renderStars(this.value);
-},_onMouse:function(_6){
+},_onMouse:function(_5){
 this.inherited(arguments);
 if(this._hovering){
-var _7=+dojo.attr(_6.target,"value");
-this.onMouseOver(_6,_7);
-this._renderStars(_7,true);
+var _6=+dojo.attr(_5.target,"value");
+this.onMouseOver(_5,_6);
+this._renderStars(_6,true);
 }else{
 this._renderStars(this.value);
 }
-},_renderStars:function(_8,_9){
-dojo.query(".dojoxRatingStar",this.domNode).forEach(function(_a,i){
-if(i+1>_8){
-dojo.removeClass(_a,"dojoxRatingStarHover");
-dojo.removeClass(_a,"dojoxRatingStarChecked");
+},_renderStars:function(_7,_8){
+dojo.query(".dojoxRatingStar",this.domNode).forEach(function(_9,i){
+if(i+1>_7){
+dojo.removeClass(_9,"dojoxRatingStarHover");
+dojo.removeClass(_9,"dojoxRatingStarChecked");
 }else{
-dojo.removeClass(_a,"dojoxRatingStar"+(_9?"Checked":"Hover"));
-dojo.addClass(_a,"dojoxRatingStar"+(_9?"Hover":"Checked"));
+dojo.removeClass(_9,"dojoxRatingStar"+(_8?"Checked":"Hover"));
+dojo.addClass(_9,"dojoxRatingStar"+(_8?"Hover":"Checked"));
 }
 });
-},onStarClick:function(_c){
-var _d=+dojo.attr(_c.target,"value");
-this.setAttribute("value",_d==this.value?0:_d);
+},onStarClick:function(_a){
+var _b=+dojo.attr(_a.target,"value");
+this.setAttribute("value",_b==this.value?0:_b);
 this._renderStars(this.value);
 this.onChange(this.value);
 },onMouseOver:function(){
-},setAttribute:function(_e,_f){
+},setAttribute:function(_c,_d){
 this.inherited("setAttribute",arguments);
-if(_e=="value"){
+if(_c=="value"){
 this._renderStars(this.value);
 this.onChange(this.value);
 }
diff --git a/dojox/form/TimeSpinner.js b/dojox/form/TimeSpinner.js
index 3f149f2..da296ad 100644
--- a/dojox/form/TimeSpinner.js
+++ b/dojox/form/TimeSpinner.js
@@ -24,5 +24,13 @@ if(dojo.isString(_5)){
 return _5;
 }
 return dojo.date.locale.format(_5,{selector:"time",formatLength:"short"});
-},serialize:dojo.date.stamp.toISOString,value:"12:00 AM"});
+},serialize:dojo.date.stamp.toISOString,value:"12:00 AM",_onKeyPress:function(e){
+if((e.charOrCode==dojo.keys.HOME||e.charOrCode==dojo.keys.END)&&!(e.ctrlKey||e.altKey||e.metaKey)&&typeof this.attr("value")!="undefined"){
+var _7=this.constraints[(e.charOrCode==dojo.keys.HOME?"min":"max")];
+if(_7){
+this._setValueAttr(_7,true);
+}
+dojo.stopEvent(e);
+}
+}});
 }
diff --git a/dojox/form/_FormSelectWidget.js b/dojox/form/_FormSelectWidget.js
index 327ac7f..3963dc3 100644
--- a/dojox/form/_FormSelectWidget.js
+++ b/dojox/form/_FormSelectWidget.js
@@ -7,205 +7,8 @@
 
 if(!dojo._hasResource["dojox.form._FormSelectWidget"]){
 dojo._hasResource["dojox.form._FormSelectWidget"]=true;
+dojo.deprecated("dojox.form._FormSelectWidget","Use dijit.form._FormSelectWidget instead","2.0");
 dojo.provide("dojox.form._FormSelectWidget");
-dojo.require("dijit.form._FormWidget");
-dojo.declare("dojox.form._FormSelectWidget",dijit.form._FormValueWidget,{multiple:"",_multiValue:false,options:null,getOptions:function(_1){
-var _2=_1,_3=this.options||[],l=_3.length;
-if(_2===undefined){
-return _3;
-}
-if(dojo.isArray(_2)){
-return dojo.map(_2,"return this.getOptions(item);",this);
-}
-if(dojo.isObject(_1)){
-if(!dojo.some(this.options,function(o,_6){
-if(o===_2||(o.value&&o.value===_2.value)){
-_2=_6;
-return true;
-}
-return false;
-})){
-_2=-1;
-}
-}
-if(typeof _2=="string"){
-for(var i=0;i<l;i++){
-if(_3[i].value===_2){
-_2=i;
-break;
-}
-}
-}
-if(typeof _2=="number"&&_2>=0&&_2<l){
-return this.options[_2];
-}
-return null;
-},addOption:function(_8){
-if(!dojo.isArray(_8)){
-_8=[_8];
-}
-dojo.forEach(_8,function(i){
-if(i&&dojo.isObject(i)){
-this.options.push(i);
-}
-},this);
-this._loadChildren();
-},removeOption:function(_a){
-if(!dojo.isArray(_a)){
-_a=[_a];
-}
-var _b=this.getOptions(_a);
-dojo.forEach(_b,function(i){
-this.options=dojo.filter(this.options,function(_d,_e){
-return (_d.value!==i.value);
-});
-this._removeOptionItem(i);
-},this);
-this._loadChildren();
-},updateOption:function(_f){
-if(!dojo.isArray(_f)){
-_f=[_f];
-}
-dojo.forEach(_f,function(i){
-var _11=this.getOptions(i),k;
-if(_11){
-for(k in i){
-_11[k]=i[k];
-}
-}
-},this);
-this._loadChildren();
-},_setValueAttr:function(_13,_14){
-var _15=this.getOptions()||[];
-if(!dojo.isArray(_13)){
-_13=[_13];
-}
-dojo.forEach(_13,function(i,idx){
-if(!dojo.isObject(i)){
-i=i+"";
-}
-if(typeof i==="string"){
-_13[idx]=dojo.filter(_15,function(_18){
-return _18.value===i;
-})[0]||{value:"",label:""};
-}
-},this);
-_13=dojo.filter(_13,function(i){
-return i&&i.value;
-});
-if(!this._multiValue&&(!_13[0]||!_13[0].value)&&_15.length){
-_13[0]=_15[0];
-}
-dojo.forEach(_15,function(i){
-i.selected=dojo.some(_13,function(v){
-return v.value===i.value;
-});
-});
-var val=dojo.map(_13,function(i){
-return i.value;
-}),_1e=dojo.map(_13,function(i){
-return i.label;
-});
-this.value=this._multiValue?val:val[0];
-this._setDisplay(this._multiValue?_1e:_1e[0]);
-this._updateSelection();
-this._handleOnChange(this.value,_14);
-},_getDisplayedValueAttr:function(){
-var val=this.attr("value");
-if(!dojo.isArray(val)){
-val=[val];
-}
-var ret=dojo.map(this.getOptions(val),function(v){
-if(v&&"label" in v){
-return v.label;
-}else{
-if(v){
-return v.value;
-}
-}
-return null;
-},this);
-return this._multiValue?ret:ret[0];
-},_getValueDeprecated:false,getValue:function(){
-return this._lastValue;
-},undo:function(){
-this._setValueAttr(this._lastValueReported,false);
-},_loadChildren:function(){
-dojo.forEach(this._getChildren(),function(_23){
-_23.destroyRecursive();
-});
-dojo.forEach(this.options,this._addOptionItem,this);
-this._updateSelection();
-},_updateSelection:function(){
-this.value=this._getValueFromOpts();
-var val=this.value;
-if(!dojo.isArray(val)){
-val=[val];
-}
-if(val&&val[0]){
-dojo.forEach(this._getChildren(),function(_25){
-var _26=dojo.some(val,function(v){
-return _25.option&&(v===_25.option.value);
-});
-dojo.toggleClass(_25.domNode,this.baseClass+"SelectedOption",_26);
-dijit.setWaiState(_25.domNode,"selected",_26);
-},this);
-}
-this._handleOnChange(this.value);
-},_getValueFromOpts:function(){
-var _28=this.getOptions()||[];
-if(!this._multiValue&&_28.length){
-var opt=dojo.filter(_28,function(i){
-return i.selected;
-})[0];
-if(opt&&opt.value){
-return opt.value;
-}else{
-_28[0].selected=true;
-return _28[0].value;
-}
-}else{
-if(this._multiValue){
-return dojo.map(dojo.filter(_28,function(i){
-return i.selected;
-}),function(i){
-return i.value;
-})||[];
-}
-}
-return "";
-},postMixInProperties:function(){
-this._multiValue=(this.multiple.toLowerCase()==="true");
-this.inherited(arguments);
-},_fillContent:function(){
-var _2d=this.options;
-if(!_2d){
-_2d=this.options=this.srcNodeRef?dojo.query(">",this.srcNodeRef).map(function(_2e){
-if(_2e.getAttribute("type")==="separator"){
-return {value:"",label:"",selected:false,disabled:false};
-}
-return {value:_2e.getAttribute("value"),label:String(_2e.innerHTML),selected:_2e.getAttribute("selected")||false,disabled:_2e.getAttribute("disabled")||false};
-},this):[];
-}
-if(!this.value){
-this.value=this._getValueFromOpts();
-}else{
-if(this._multiValue&&typeof this.value=="string"){
-this.value=this.value.split(",");
-}
-}
-},postCreate:function(){
-dojo.setSelectable(this.focusNode,false);
-this.inherited(arguments);
-this.connect(this,"onChange","_updateSelection");
-this.connect(this,"startup","_loadChildren");
-this._setValueAttr(this.value,null);
-},_addOptionItem:function(_2f){
-},_removeOptionItem:function(_30){
-},_setDisplay:function(_31){
-},_getChildren:function(){
-return [];
-},_getSelectedOptionsAttr:function(){
-return this.getOptions(this.attr("value"));
-}});
+dojo.require("dijit.form._FormSelectWidget");
+dojo.setObject("dojox.form._FormSelectWidget",dijit.form._FormSelectWidget);
 }
diff --git a/dojox/form/_HasDropDown.js b/dojox/form/_HasDropDown.js
index 305ae40..ba38e00 100644
--- a/dojox/form/_HasDropDown.js
+++ b/dojox/form/_HasDropDown.js
@@ -7,173 +7,8 @@
 
 if(!dojo._hasResource["dojox.form._HasDropDown"]){
 dojo._hasResource["dojox.form._HasDropDown"]=true;
+dojo.deprecated("dojox.form._HasDropDown","Use dijit._HasDropDown instead","2.0");
 dojo.provide("dojox.form._HasDropDown");
-dojo.require("dijit._Widget");
-dojo.declare("dojox.form._HasDropDown",null,{dropDownNode:null,popupStateNode:null,aroundNode:null,dropDown:null,autoWidth:true,_stopClickEvents:true,_onMenuMouseup:function(e){
-},_onDropDownMouse:function(e){
-if(e.type=="click"&&!this._seenKeydown){
-return;
-}
-this._seenKeydown=false;
-if(e.type=="mousedown"){
-this._docHandler=this.connect(dojo.doc,"onmouseup","_onDropDownMouseup");
-}
-if(this.disabled||this.readOnly){
-return;
-}
-if(this._stopClickEvents){
-dojo.stopEvent(e);
-}
-this.toggleDropDown();
-if(e.type=="click"||e.type=="keypress"){
-this._onDropDownMouseup();
-}
-},_onDropDownMouseup:function(e){
-if(e&&this._docHandler){
-this.disconnect(this._docHandler);
-}
-var _4=this.dropDown,_5=false;
-if(e&&this._opened){
-var t=e.target;
-while(t&&!_5){
-if(dojo.hasClass(t,"dijitPopup")){
-_5=true;
-}else{
-t=t.parentNode;
-}
-}
-if(_5){
-this._onMenuMouseup(e);
-return;
-}
-}
-if(this._opened&&_4.focus){
-window.setTimeout(dojo.hitch(_4,"focus"),1);
-}else{
-dijit.focus(this.focusNode);
-}
-},_setupDropdown:function(){
-this.dropDownNode=this.dropDownNode||this.focusNode||this.domNode;
-this.popupStateNode=this.popupStateNode||this.focusNode||this.dropDownNode;
-this.aroundNode=this.aroundNode||this.domNode;
-this.connect(this.dropDownNode,"onmousedown","_onDropDownMouse");
-this.connect(this.dropDownNode,"onclick","_onDropDownMouse");
-this.connect(this.dropDownNode,"onkeydown","_onDropDownKeydown");
-this.connect(this.dropDownNode,"onblur","_onDropDownBlur");
-this.connect(this.dropDownNode,"onkeypress","_onKey");
-if(this._setStateClass){
-this.connect(this,"openDropDown","_setStateClass");
-this.connect(this,"closeDropDown","_setStateClass");
-}
-},postCreate:function(){
-this._setupDropdown();
-this.inherited("postCreate",arguments);
-},startup:function(){
-dijit.popup.prepare(this.dropDown.domNode);
-this.inherited("startup",arguments);
-},destroyDescendants:function(){
-if(this.dropDown){
-this.dropDown.destroyRecursive();
-delete this.dropDown;
-}
-this.inherited("destroyDescendants",arguments);
-},_onDropDownKeydown:function(e){
-this._seenKeydown=true;
-},_onKeyPress:function(e){
-if(this._opened&&e.charOrCode==dojo.keys.ESCAPE&&!e.shiftKey&&!e.ctrlKey&&!e.altKey){
-this.toggleDropDown();
-dojo.stopEvent(e);
-return;
-}
-this.inherited(arguments);
-},_onDropDownBlur:function(e){
-this._seenKeydown=false;
-},_onKey:function(e){
-if(this.disabled||this.readOnly){
-return;
-}
-var d=this.dropDown;
-if(d&&this._opened&&d.handleKey){
-if(d.handleKey(e)===false){
-return;
-}
-}
-if(d&&this._opened&&e.keyCode==dojo.keys.ESCAPE){
-this.toggleDropDown();
-return;
-}
-if(e.keyCode==dojo.keys.DOWN_ARROW){
-this._onDropDownMouse(e);
-}
-},_onBlur:function(){
-this.closeDropDown();
-this.inherited("_onBlur",arguments);
-},isLoaded:function(){
-return true;
-},loadDropDown:function(_c){
-_c();
-},toggleDropDown:function(){
-if(this.disabled||this.readOnly){
-return;
-}
-this.focus();
-var _d=this.dropDown;
-if(!_d){
-return;
-}
-if(!this._opened){
-if(!this.isLoaded()){
-this.loadDropDown(dojo.hitch(this,"openDropDown"));
-return;
-}else{
-this.openDropDown();
-}
-}else{
-this.closeDropDown();
-}
-},openDropDown:function(){
-var _e=this.dropDown;
-var _f=_e.domNode.style.width;
-var _10=this;
-var _11=dijit.popup.open({parent:this,popup:_e,around:this.aroundNode,orient:this.isLeftToRight()?{"BL":"TL","BR":"TR","TL":"BL","TR":"BR"}:{"BR":"TR","BL":"TL","TR":"BR","TL":"BL"},onExecute:function(){
-_10.closeDropDown(true);
-},onCancel:function(){
-_10.closeDropDown(true);
-},onClose:function(){
-_e.domNode.style.width=_f;
-dojo.attr(_10.popupStateNode,"popupActive",false);
-dojo.removeClass(_10.popupStateNode,"dojoxHasDropDownOpen");
-_10._opened=false;
-_10.state="";
-}});
-if(this.autoWidth&&this.domNode.offsetWidth>_e.domNode.offsetWidth){
-var _12=null;
-if(!this.isLeftToRight()){
-_12=_e.domNode.parentNode;
-var _13=_12.offsetLeft+_12.offsetWidth;
-}
-if(_e.resize){
-_e.resize({w:this.domNode.offsetWidth});
-}else{
-dojo.marginBox(_e.domNode,{w:this.domNode.offsetWidth});
-}
-if(_12){
-_12.style.left=_13-this.domNode.offsetWidth+"px";
-}
-}
-dojo.attr(this.popupStateNode,"popupActive","true");
-dojo.addClass(_10.popupStateNode,"dojoxHasDropDownOpen");
-this._opened=true;
-this.state="Opened";
-return _11;
-},closeDropDown:function(_14){
-if(this._opened){
-dijit.popup.close(this.dropDown);
-if(_14){
-this.focus();
-}
-this._opened=false;
-this.state="";
-}
-}});
+dojo.require("dijit._HasDropDown");
+dojo.setObject("dojox.form._HasDropDown",dijit._HasDropDown);
 }
diff --git a/dojox/form/_SelectStackMixin.js b/dojox/form/_SelectStackMixin.js
index 513e4c9..3a35d1b 100644
--- a/dojox/form/_SelectStackMixin.js
+++ b/dojox/form/_SelectStackMixin.js
@@ -16,72 +16,110 @@ if(sp&&id.indexOf(sp)===0){
 return id.substring(sp.length);
 }
 return id;
-},_togglePane:function(_4,_5){
-if(_4._shown!=undefined&&_4._shown==_5){
+},_togglePane:function(_2,_3){
+if(_2._shown!=undefined&&_2._shown==_3){
 return;
 }
-var _6=dojo.filter(_4.getDescendants(),"return item.name;");
-if(!_5){
-_7={};
-dojo.forEach(_6,function(w){
-_7[w.id]=w.disabled;
+var _4=dojo.filter(_2.getDescendants(),"return item.name;");
+if(!_3){
+_5={};
+dojo.forEach(_4,function(w){
+_5[w.id]=w.disabled;
 w.attr("disabled",true);
 });
-_4._savedStates=_7;
+_2._savedStates=_5;
 }else{
-var _7=_4._savedStates||{};
-dojo.forEach(_6,function(w){
-var _a=_7[w.id];
-if(_a==undefined){
-_a=false;
+var _5=_2._savedStates||{};
+dojo.forEach(_4,function(w){
+var _6=_5[w.id];
+if(_6==undefined){
+_6=false;
 }
-w.attr("disabled",_a);
+w.attr("disabled",_6);
 });
-delete _4._savedStates;
-}
-_4._shown=_5;
-},onAddChild:function(_b,_c){
-if(!this._panes[_b.id]){
-this._panes[_b.id]=_b;
-this.addOption({value:this._optionValFromPane(_b.id),label:_b.title});
-}
-if(!_b.onShow||!_b.onHide||_b._shown==undefined){
-_b.onShow=dojo.hitch(this,"_togglePane",_b,true);
-_b.onHide=dojo.hitch(this,"_togglePane",_b,false);
-_b.onHide();
-}
-},onRemoveChild:function(_d){
-if(this._panes[_d.id]){
-delete this._panes[_d.id];
-this.removeOption(this._optionValFromPane(_d.id));
-}
-},onSelectChild:function(_e){
-this._setValueAttr(this._optionValFromPane(_e.id));
-},onStartup:function(_f){
-var _10=_f.selected;
-this.addOption(dojo.filter(dojo.map(_f.children,function(c){
+delete _2._savedStates;
+}
+_2._shown=_3;
+},_connectTitle:function(_7,_8){
+var fx=dojo.hitch(this,function(_9){
+this.updateOption({value:_8,label:_9});
+});
+if(_7._setTitleAttr){
+this.connect(_7,"_setTitleAttr",fx);
+}else{
+this.connect(_7,"attr",function(_a,_b){
+if(_a=="title"&&arguments.length>1){
+fx(_b);
+}
+});
+}
+},onAddChild:function(_c,_d){
+if(!this._panes[_c.id]){
+this._panes[_c.id]=_c;
+var v=this._optionValFromPane(_c.id);
+this.addOption({value:v,label:_c.title});
+this._connectTitle(_c,v);
+}
+if(!_c.onShow||!_c.onHide||_c._shown==undefined){
+_c.onShow=dojo.hitch(this,"_togglePane",_c,true);
+_c.onHide=dojo.hitch(this,"_togglePane",_c,false);
+_c.onHide();
+}
+},_setValueAttr:function(v){
+if("_savedValue" in this){
+return;
+}
+this.inherited(arguments);
+},attr:function(_e,_f){
+if(_e=="value"&&arguments.length==2&&"_savedValue" in this){
+this._savedValue=_f;
+}
+return this.inherited(arguments);
+},onRemoveChild:function(_10){
+if(this._panes[_10.id]){
+delete this._panes[_10.id];
+this.removeOption(this._optionValFromPane(_10.id));
+}
+},onSelectChild:function(_11){
+this._setValueAttr(this._optionValFromPane(_11.id));
+},onStartup:function(_12){
+var _13=_12.selected;
+this.addOption(dojo.filter(dojo.map(_12.children,function(c){
 var v=this._optionValFromPane(c.id);
-var _13=null;
+this._connectTitle(c,v);
+var _14=null;
 if(!this._panes[c.id]){
 this._panes[c.id]=c;
-_13={value:v,label:c.title};
+_14={value:v,label:c.title};
 }
 if(!c.onShow||!c.onHide||c._shown==undefined){
 c.onShow=dojo.hitch(this,"_togglePane",c,true);
 c.onHide=dojo.hitch(this,"_togglePane",c,false);
 c.onHide();
 }
-if(this._savedValue&&v){
-_10=c;
+if("_savedValue" in this&&v===this._savedValue){
+_13=c;
 }
-return _13;
+return _14;
 },this),function(i){
 return i;
 }));
-delete this._savedValue;
-this.onSelectChild(_10);
-if(!_10._shown){
-this._togglePane(_10,true);
+var _15=this;
+var fx=function(){
+delete _15._savedValue;
+_15.onSelectChild(_13);
+if(!_13._shown){
+_15._togglePane(_13,true);
+}
+};
+if(_13!==_12.selected){
+var _16=dijit.byId(this.stackId);
+var c=this.connect(_16,"_showChild",function(sel){
+this.disconnect(c);
+fx();
+});
+}else{
+fx();
 }
 },postMixInProperties:function(){
 this._savedValue=this.value;
@@ -91,18 +129,23 @@ this.connect(this,"onChange","_handleSelfOnChange");
 this.inherited(arguments);
 this._panes={};
 this._subscriptions=[dojo.subscribe(this.stackId+"-startup",this,"onStartup"),dojo.subscribe(this.stackId+"-addChild",this,"onAddChild"),dojo.subscribe(this.stackId+"-removeChild",this,"onRemoveChild"),dojo.subscribe(this.stackId+"-selectChild",this,"onSelectChild")];
-var _15=dijit.byId(this.stackId);
-if(_15&&_15._started){
-this.onStartup({children:_15.getChildren(),selected:_15.selectedChildWidget});
+var _17=dijit.byId(this.stackId);
+if(_17&&_17._started){
+this.onStartup({children:_17.getChildren(),selected:_17.selectedChildWidget});
 }
 },destroy:function(){
 dojo.forEach(this._subscriptions,dojo.unsubscribe);
 delete this._panes;
 this.inherited("destroy",arguments);
 },_handleSelfOnChange:function(val){
-var _17=this._panes[this._paneIdFromOption(val)];
-if(_17){
-dijit.byId(this.stackId).selectChild(_17);
+var _18=this._panes[this._paneIdFromOption(val)];
+if(_18){
+var s=dijit.byId(this.stackId);
+if(_18==s.selectedChildWidget){
+s._transition(_18);
+}else{
+s.selectChild(_18);
+}
 }
 }});
 }
diff --git a/dojox/form/manager/_ClassMixin.js b/dojox/form/manager/_ClassMixin.js
index 6ea5258..572af7a 100644
--- a/dojox/form/manager/_ClassMixin.js
+++ b/dojox/form/manager/_ClassMixin.js
@@ -11,20 +11,20 @@ dojo.provide("dojox.form.manager._ClassMixin");
 dojo.require("dojox.form.manager._Mixin");
 (function(){
 var fm=dojox.form.manager,aa=fm.actionAdapter,ia=fm.inspectorAdapter;
-dojo.declare("dojox.form.manager._ClassMixin",null,{gatherClassState:function(_4,_5){
-var _6=this.inspect(ia(function(_7,_8){
-return dojo.hasClass(_8,_4);
-}),_5);
-return _6;
-},addClass:function(_9,_a){
-this.inspect(aa(function(_b,_c){
-dojo.addClass(_c,_9);
-}),_a);
+dojo.declare("dojox.form.manager._ClassMixin",null,{gatherClassState:function(_1,_2){
+var _3=this.inspect(ia(function(_4,_5){
+return dojo.hasClass(_5,_1);
+}),_2);
+return _3;
+},addClass:function(_6,_7){
+this.inspect(aa(function(_8,_9){
+dojo.addClass(_9,_6);
+}),_7);
 return this;
-},removeClass:function(_d,_e){
-this.inspect(aa(function(_f,_10){
-dojo.removeClass(_10,_d);
-}),_e);
+},removeClass:function(_a,_b){
+this.inspect(aa(function(_c,_d){
+dojo.removeClass(_d,_a);
+}),_b);
 return this;
 }});
 })();
diff --git a/dojox/form/manager/_EnableMixin.js b/dojox/form/manager/_EnableMixin.js
index 5a699d8..7b45e88 100644
--- a/dojox/form/manager/_EnableMixin.js
+++ b/dojox/form/manager/_EnableMixin.js
@@ -11,33 +11,33 @@ dojo.provide("dojox.form.manager._EnableMixin");
 dojo.require("dojox.form.manager._Mixin");
 (function(){
 var fm=dojox.form.manager,aa=fm.actionAdapter,ia=fm.inspectorAdapter;
-dojo.declare("dojox.form.manager._EnableMixin",null,{gatherEnableState:function(_4){
-var _5=this.inspectFormWidgets(ia(function(_6,_7){
-return !_7.attr("disabled");
-}),_4);
+dojo.declare("dojox.form.manager._EnableMixin",null,{gatherEnableState:function(_1){
+var _2=this.inspectFormWidgets(ia(function(_3,_4){
+return !_4.attr("disabled");
+}),_1);
 if(this.inspectFormNodes){
-dojo.mixin(_5,this.inspectFormNodes(ia(function(_8,_9){
-return !dojo.attr(_9,"disabled");
-}),_4));
+dojo.mixin(_2,this.inspectFormNodes(ia(function(_5,_6){
+return !dojo.attr(_6,"disabled");
+}),_1));
 }
-return _5;
-},enable:function(_a,_b){
-if(arguments.length<2||_b===undefined){
-_b=true;
+return _2;
+},enable:function(_7,_8){
+if(arguments.length<2||_8===undefined){
+_8=true;
 }
-this.inspectFormWidgets(aa(function(_c,_d,_e){
-_d.attr("disabled",!_e);
-}),_a,_b);
+this.inspectFormWidgets(aa(function(_9,_a,_b){
+_a.attr("disabled",!_b);
+}),_7,_8);
 if(this.inspectFormNodes){
-this.inspectFormNodes(aa(function(_f,_10,_11){
-dojo.attr(_10,"disabled",!_11);
-}),_a,_b);
+this.inspectFormNodes(aa(function(_c,_d,_e){
+dojo.attr(_d,"disabled",!_e);
+}),_7,_8);
 }
 return this;
-},disable:function(_12){
-var _13=this.gatherEnableState();
-this.enable(_12,false);
-return _13;
+},disable:function(_f){
+var _10=this.gatherEnableState();
+this.enable(_f,false);
+return _10;
 }});
 })();
 }
diff --git a/dojox/form/manager/_FormMixin.js b/dojox/form/manager/_FormMixin.js
index 601680f..341788f 100644
--- a/dojox/form/manager/_FormMixin.js
+++ b/dojox/form/manager/_FormMixin.js
@@ -18,31 +18,31 @@ this.connect(this.domNode,"onreset","_onReset");
 this.connect(this.domNode,"onsubmit","_onSubmit");
 }
 this.inherited(arguments);
-},_onReset:function(_3){
-var _4={returnValue:true,preventDefault:function(){
+},_onReset:function(_1){
+var _2={returnValue:true,preventDefault:function(){
 this.returnValue=false;
 },stopPropagation:function(){
-},currentTarget:_3.currentTarget,target:_3.target};
-if(!(this.onReset(_4)===false)&&_4.returnValue){
+},currentTarget:_1.currentTarget,target:_1.target};
+if(!(this.onReset(_2)===false)&&_2.returnValue){
 this.reset();
 }
-dojo.stopEvent(_3);
+dojo.stopEvent(_1);
 return false;
 },onReset:function(){
 return true;
 },reset:function(){
-this.inspectFormWidgets(aa(function(_,_6){
-if(_6.reset){
-_6.reset();
+this.inspectFormWidgets(aa(function(_3,_4){
+if(_4.reset){
+_4.reset();
 }
 }));
 if(this.isForm){
 this.domNode.reset();
 }
 return this;
-},_onSubmit:function(_7){
-if(this.onSubmit(_7)===false){
-dojo.stopEvent(_7);
+},_onSubmit:function(_5){
+if(this.onSubmit(_5)===false){
+dojo.stopEvent(_5);
 }
 },onSubmit:function(){
 return this.isValid();
@@ -53,14 +53,14 @@ this.domNode.submit();
 }
 }
 },isValid:function(){
-for(var _8 in this.formWidgets){
-var _9=false;
-aa(function(_,_b){
-if(!_b.attr("disabled")&&_b.isValid&&!_b.isValid()){
-_9=true;
+for(var _6 in this.formWidgets){
+var _7=false;
+aa(function(_8,_9){
+if(!_9.attr("disabled")&&_9.isValid&&!_9.isValid()){
+_7=true;
 }
-}).call(this,null,this.formWidgets[_8].widget);
-if(_9){
+}).call(this,null,this.formWidgets[_6].widget);
+if(_7){
 return false;
 }
 }
diff --git a/dojox/form/manager/_Mixin.js b/dojox/form/manager/_Mixin.js
index 392f5b6..1d68232 100644
--- a/dojox/form/manager/_Mixin.js
+++ b/dojox/form/manager/_Mixin.js
@@ -10,81 +10,81 @@ dojo._hasResource["dojox.form.manager._Mixin"]=true;
 dojo.provide("dojox.form.manager._Mixin");
 dojo.require("dijit._Widget");
 (function(){
-var fm=dojox.form.manager,aa=fm.actionAdapter=function(_3){
-return function(_4,_5,_6){
-if(dojo.isArray(_5)){
-dojo.forEach(_5,function(_7){
-_3.call(this,_4,_7,_6);
+var fm=dojox.form.manager,aa=fm.actionAdapter=function(_1){
+return function(_2,_3,_4){
+if(dojo.isArray(_3)){
+dojo.forEach(_3,function(_5){
+_1.call(this,_2,_5,_4);
 },this);
 }else{
-_3.apply(this,arguments);
+_1.apply(this,arguments);
 }
 };
-},ia=fm.inspectorAdapter=function(_9){
-return function(_a,_b,_c){
-return _9.call(this,_a,dojo.isArray(_b)?_b[0]:_b,_c);
+},ia=fm.inspectorAdapter=function(_6){
+return function(_7,_8,_9){
+return _6.call(this,_7,dojo.isArray(_8)?_8[0]:_8,_9);
 };
-},_d={domNode:1,containerNode:1,srcNodeRef:1,bgIframe:1},_e=fm._keys=function(o){
-var _10=[],key;
-for(key in o){
-if(o.hasOwnProperty(key)){
-_10.push(key);
-}
-}
-return _10;
-},_12=function(_13){
-var _14=_13.attr("name");
-if(_14&&_13 instanceof dijit.form._FormWidget){
-if(_14 in this.formWidgets){
-var a=this.formWidgets[_14].widget;
+},_a={domNode:1,containerNode:1,srcNodeRef:1,bgIframe:1},_b=fm._keys=function(o){
+var _c=[],_d;
+for(_d in o){
+if(o.hasOwnProperty(_d)){
+_c.push(_d);
+}
+}
+return _c;
+},_e=function(_f){
+var _10=_f.attr("name");
+if(_10&&_f instanceof dijit.form._FormWidget){
+if(_10 in this.formWidgets){
+var a=this.formWidgets[_10].widget;
 if(dojo.isArray(a)){
-a.push(_13);
+a.push(_f);
 }else{
-this.formWidgets[_14].widget=[a,_13];
+this.formWidgets[_10].widget=[a,_f];
 }
 }else{
-this.formWidgets[_14]={widget:_13,connections:[]};
+this.formWidgets[_10]={widget:_f,connections:[]};
 }
 }else{
-_14=null;
+_10=null;
 }
-return _14;
-},_16=function(_17){
-var _18={};
-aa(function(_,w){
+return _10;
+},_11=function(_12){
+var _13={};
+aa(function(_14,w){
 var o=w.attr("observer");
 if(o&&typeof o=="string"){
 dojo.forEach(o.split(","),function(o){
 o=dojo.trim(o);
 if(o&&dojo.isFunction(this[o])){
-_18[o]=1;
+_13[o]=1;
 }
 },this);
 }
-}).call(this,null,this.formWidgets[_17].widget);
-return _e(_18);
-},_1d=function(_1e,_1f){
-var t=this.formWidgets[_1e],w=t.widget,c=t.connections;
+}).call(this,null,this.formWidgets[_12].widget);
+return _b(_13);
+},_15=function(_16,_17){
+var t=this.formWidgets[_16],w=t.widget,c=t.connections;
 if(c.length){
 dojo.forEach(c,dojo.disconnect);
 c=t.connections=[];
 }
 if(dojo.isArray(w)){
 dojo.forEach(w,function(w){
-dojo.forEach(_1f,function(o){
+dojo.forEach(_17,function(o){
 c.push(dojo.connect(w,"onChange",this,function(evt){
 if(this.watch&&dojo.attr(w.focusNode,"checked")){
-this[o](w.attr("value"),_1e,w,evt);
+this[o](w.attr("value"),_16,w,evt);
 }
 }));
 },this);
 },this);
 }else{
-var _26=w.declaredClass=="dijit.form.Button"?"onClick":"onChange";
-dojo.forEach(_1f,function(o){
-c.push(dojo.connect(w,_26,this,function(evt){
+var _18=w.declaredClass=="dijit.form.Button"?"onClick":"onChange";
+dojo.forEach(_17,function(o){
+c.push(dojo.connect(w,_18,this,function(evt){
 if(this.watch){
-this[o](w.attr("value"),_1e,w,evt);
+this[o](w.attr("value"),_16,w,evt);
 }
 }));
 },this);
@@ -99,175 +99,175 @@ this.formNodes={};
 this.registerWidgetDescendants(this);
 this.inherited(arguments);
 },destroy:function(){
-for(var _29 in this.formWidgets){
-dojo.forEach(this.formWidgets[_29].connections,dojo.disconnect);
+for(var _19 in this.formWidgets){
+dojo.forEach(this.formWidgets[_19].connections,dojo.disconnect);
 }
 this.formWidgets={};
 this.inherited(arguments);
-},registerWidget:function(_2a){
-if(typeof _2a=="string"){
-_2a=dijit.byId(_2a);
+},registerWidget:function(_1a){
+if(typeof _1a=="string"){
+_1a=dijit.byId(_1a);
 }else{
-if(_2a.tagName&&_2a.cloneNode){
-_2a=dijit.byNode(_2a);
+if(_1a.tagName&&_1a.cloneNode){
+_1a=dijit.byNode(_1a);
 }
 }
-var _2b=_12.call(this,_2a);
-if(_2b){
-_1d.call(this,_2b,_16.call(this,_2b));
+var _1b=_e.call(this,_1a);
+if(_1b){
+_15.call(this,_1b,_11.call(this,_1b));
 }
 return this;
-},unregisterWidget:function(_2c){
-if(_2c in this.formWidgets){
-dojo.forEach(this.formWidgets[_2c].connections,this.disconnect,this);
-delete this.formWidgets[_2c];
+},unregisterWidget:function(_1c){
+if(_1c in this.formWidgets){
+dojo.forEach(this.formWidgets[_1c].connections,this.disconnect,this);
+delete this.formWidgets[_1c];
 }
 return this;
-},registerWidgetDescendants:function(_2d){
-if(typeof _2d=="string"){
-_2d=dijit.byId(_2d);
+},registerWidgetDescendants:function(_1d){
+if(typeof _1d=="string"){
+_1d=dijit.byId(_1d);
 }else{
-if(_2d.tagName&&_2d.cloneNode){
-_2d=dijit.byNode(_2d);
+if(_1d.tagName&&_1d.cloneNode){
+_1d=dijit.byNode(_1d);
 }
 }
-var _2e=dojo.map(_2d.getDescendants(),_12,this);
-dojo.forEach(_2e,function(_2f){
-if(_2f){
-_1d.call(this,_2f,_16.call(this,_2f));
+var _1e=dojo.map(_1d.getDescendants(),_e,this);
+dojo.forEach(_1e,function(_1f){
+if(_1f){
+_15.call(this,_1f,_11.call(this,_1f));
 }
 },this);
-return this.registerNodeDescendants?this.registerNodeDescendants(_2d.domNode):this;
-},unregisterWidgetDescendants:function(_30){
-if(typeof _30=="string"){
-_30=dijit.byId(_30);
+return this.registerNodeDescendants?this.registerNodeDescendants(_1d.domNode):this;
+},unregisterWidgetDescendants:function(_20){
+if(typeof _20=="string"){
+_20=dijit.byId(_20);
 }else{
-if(_30.tagName&&_30.cloneNode){
-_30=dijit.byNode(_30);
+if(_20.tagName&&_20.cloneNode){
+_20=dijit.byNode(_20);
 }
 }
-dojo.forEach(dojo.map(_30.getDescendants(),function(w){
+dojo.forEach(dojo.map(_20.getDescendants(),function(w){
 return w instanceof dijit.form._FormWidget&&w.attr("name")||null;
-}),function(_32){
-if(_32){
-this.unregisterNode(_32);
+}),function(_21){
+if(_21){
+this.unregisterNode(_21);
 }
 },this);
-return this.unregisterNodeDescendants?this.unregisterNodeDescendants(_30.domNode):this;
-},formWidgetValue:function(_33,_34){
-var _35=arguments.length==2&&_34!==undefined,_36;
-if(typeof _33=="string"){
-_33=this.formWidgets[_33];
-if(_33){
-_33=_33.widget;
+return this.unregisterNodeDescendants?this.unregisterNodeDescendants(_20.domNode):this;
+},formWidgetValue:function(_22,_23){
+var _24=arguments.length==2&&_23!==undefined,_25;
+if(typeof _22=="string"){
+_22=this.formWidgets[_22];
+if(_22){
+_22=_22.widget;
 }
 }
-if(!_33){
+if(!_22){
 return null;
 }
-if(dojo.isArray(_33)){
-if(_35){
-dojo.forEach(_33,function(_37){
-_37.attr("checked",false);
+if(dojo.isArray(_22)){
+if(_24){
+dojo.forEach(_22,function(_26){
+_26.attr("checked",false);
 });
-dojo.forEach(_33,function(_38){
-_38.attr("checked",_38.attr("value")===_34);
+dojo.forEach(_22,function(_27){
+_27.attr("checked",_27.attr("value")===_23);
 });
 return this;
 }
-dojo.some(_33,function(_39){
-if(dojo.attr(_39.focusNode,"checked")){
-_36=_39;
+dojo.some(_22,function(_28){
+if(dojo.attr(_28.focusNode,"checked")){
+_25=_28;
 return true;
 }
 return false;
 });
-return _36?_36.attr("value"):"";
+return _25?_25.attr("value"):"";
 }
-if(_35){
-_33.attr("value",_34);
+if(_24){
+_22.attr("value",_23);
 return this;
 }
-return _33.attr("value");
-},formPointValue:function(_3a,_3b){
-if(_3a&&typeof _3a=="string"){
-_3a=this[_3a];
+return _22.attr("value");
+},formPointValue:function(_29,_2a){
+if(_29&&typeof _29=="string"){
+_29=this[_29];
 }
-if(!_3a||!_3a.tagName||!_3a.cloneNode){
+if(!_29||!_29.tagName||!_29.cloneNode){
 return null;
 }
-if(!dojo.hasClass(_3a,"dojoFormValue")){
+if(!dojo.hasClass(_29,"dojoFormValue")){
 return null;
 }
-if(arguments.length==2&&_3b!==undefined){
-_3a.innerHTML=_3b;
+if(arguments.length==2&&_2a!==undefined){
+_29.innerHTML=_2a;
 return this;
 }
-return _3a.innerHTML;
-},inspectFormWidgets:function(_3c,_3d,_3e){
-var _3f,_40={};
-if(_3d){
-if(dojo.isArray(_3d)){
-dojo.forEach(_3d,function(_41){
-if(_41 in this.formWidgets){
-_40[_41]=_3c.call(this,_41,this.formWidgets[_41].widget,_3e);
+return _29.innerHTML;
+},inspectFormWidgets:function(_2b,_2c,_2d){
+var _2e,_2f={};
+if(_2c){
+if(dojo.isArray(_2c)){
+dojo.forEach(_2c,function(_30){
+if(_30 in this.formWidgets){
+_2f[_30]=_2b.call(this,_30,this.formWidgets[_30].widget,_2d);
 }
 },this);
 }else{
-for(_3f in _3d){
-if(_3f in this.formWidgets){
-_40[_3f]=_3c.call(this,_3f,this.formWidgets[_3f].widget,_3d[_3f]);
+for(_2e in _2c){
+if(_2e in this.formWidgets){
+_2f[_2e]=_2b.call(this,_2e,this.formWidgets[_2e].widget,_2c[_2e]);
 }
 }
 }
 }else{
-for(_3f in this.formWidgets){
-_40[_3f]=_3c.call(this,_3f,this.formWidgets[_3f].widget,_3e);
+for(_2e in this.formWidgets){
+_2f[_2e]=_2b.call(this,_2e,this.formWidgets[_2e].widget,_2d);
 }
 }
-return _40;
-},inspectAttachedPoints:function(_42,_43,_44){
-var _45,_46={};
-if(_43){
-if(dojo.isArray(_43)){
-dojo.forEach(_43,function(_47){
-var _48=this[_47];
-if(_48&&_48.tagName&&_48.cloneNode){
-_46[_47]=_42.call(this,_47,_48,_44);
+return _2f;
+},inspectAttachedPoints:function(_31,_32,_33){
+var _34,_35={};
+if(_32){
+if(dojo.isArray(_32)){
+dojo.forEach(_32,function(_36){
+var _37=this[_36];
+if(_37&&_37.tagName&&_37.cloneNode){
+_35[_36]=_31.call(this,_36,_37,_33);
 }
 },this);
 }else{
-for(_45 in _43){
-var _49=this[_45];
-if(_49&&_49.tagName&&_49.cloneNode){
-_46[_45]=_42.call(this,_45,_49,_43[_45]);
+for(_34 in _32){
+var _38=this[_34];
+if(_38&&_38.tagName&&_38.cloneNode){
+_35[_34]=_31.call(this,_34,_38,_32[_34]);
 }
 }
 }
 }else{
-for(_45 in this){
-if(!(_45 in _d)){
-var _49=this[_45];
-if(_49&&_49.tagName&&_49.cloneNode){
-_46[_45]=_42.call(this,_45,_49,_44);
+for(_34 in this){
+if(!(_34 in _a)){
+var _38=this[_34];
+if(_38&&_38.tagName&&_38.cloneNode){
+_35[_34]=_31.call(this,_34,_38,_33);
 }
 }
 }
 }
-return _46;
-},inspect:function(_4a,_4b,_4c){
-var _4d=this.inspectFormWidgets(function(_4e,_4f,_50){
-if(dojo.isArray(_4f)){
-return _4a.call(this,_4e,dojo.map(_4f,function(w){
+return _35;
+},inspect:function(_39,_3a,_3b){
+var _3c=this.inspectFormWidgets(function(_3d,_3e,_3f){
+if(dojo.isArray(_3e)){
+return _39.call(this,_3d,dojo.map(_3e,function(w){
 return w.domNode;
-}),_50);
+}),_3f);
 }
-return _4a.call(this,_4e,_4f.domNode,_50);
-},_4b,_4c);
+return _39.call(this,_3d,_3e.domNode,_3f);
+},_3a,_3b);
 if(this.inspectFormNodes){
-dojo.mixin(_4d,this.inspectFormNodes(_4a,_4b,_4c));
+dojo.mixin(_3c,this.inspectFormNodes(_39,_3a,_3b));
 }
-return dojo.mixin(_4d,this.inspectAttachedPoints(_4a,_4b,_4c));
+return dojo.mixin(_3c,this.inspectAttachedPoints(_39,_3a,_3b));
 }});
 })();
 dojo.extend(dijit._Widget,{observer:""});
diff --git a/dojox/form/manager/_NodeMixin.js b/dojox/form/manager/_NodeMixin.js
index 85530f9..1fbb251 100644
--- a/dojox/form/manager/_NodeMixin.js
+++ b/dojox/form/manager/_NodeMixin.js
@@ -10,230 +10,230 @@ dojo._hasResource["dojox.form.manager._NodeMixin"]=true;
 dojo.provide("dojox.form.manager._NodeMixin");
 dojo.require("dojox.form.manager._Mixin");
 (function(){
-var fm=dojox.form.manager,aa=fm.actionAdapter,_3=fm._keys,ce=fm.changeEvent=function(_5){
-var _6="onclick";
-switch(_5.tagName.toLowerCase()){
+var fm=dojox.form.manager,aa=fm.actionAdapter,_1=fm._keys,ce=fm.changeEvent=function(_2){
+var _3="onclick";
+switch(_2.tagName.toLowerCase()){
 case "textarea":
-_6="onkeyup";
+_3="onkeyup";
 break;
 case "select":
-_6="onchange";
+_3="onchange";
 break;
 case "input":
-switch(_5.type.toLowerCase()){
+switch(_2.type.toLowerCase()){
 case "text":
 case "password":
-_6="onkeyup";
+_3="onkeyup";
 break;
 }
 break;
 }
-return _6;
-},_7=function(_8,_9){
-var _a=dojo.attr(_8,"name");
-_9=_9||this.domNode;
-if(_a&&!(_a in this.formWidgets)){
-for(var n=_8;n&&n!==_9;n=n.parentNode){
+return _3;
+},_4=function(_5,_6){
+var _7=dojo.attr(_5,"name");
+_6=_6||this.domNode;
+if(_7&&!(_7 in this.formWidgets)){
+for(var n=_5;n&&n!==_6;n=n.parentNode){
 if(dojo.attr(n,"widgetId")&&dijit.byNode(n) instanceof dijit.form._FormWidget){
 return null;
 }
 }
-if(_8.tagName.toLowerCase()=="input"&&_8.type.toLowerCase()=="radio"){
-var a=this.formNodes[_a];
+if(_5.tagName.toLowerCase()=="input"&&_5.type.toLowerCase()=="radio"){
+var a=this.formNodes[_7];
 a=a&&a.node;
 if(a&&dojo.isArray(a)){
-a.push(_8);
+a.push(_5);
 }else{
-this.formNodes[_a]={node:[_8],connections:[]};
+this.formNodes[_7]={node:[_5],connections:[]};
 }
 }else{
-this.formNodes[_a]={node:_8,connections:[]};
+this.formNodes[_7]={node:_5,connections:[]};
 }
 }else{
-_a=null;
+_7=null;
 }
-return _a;
-},_d=function(_e){
-var _f={};
-aa(function(_,n){
+return _7;
+},_8=function(_9){
+var _a={};
+aa(function(_b,n){
 var o=dojo.attr(n,"observer");
 if(o&&typeof o=="string"){
 dojo.forEach(o.split(","),function(o){
 o=dojo.trim(o);
 if(o&&dojo.isFunction(this[o])){
-_f[o]=1;
+_a[o]=1;
 }
 },this);
 }
-}).call(this,null,this.formNodes[_e].node);
-return _3(_f);
-},_14=function(_15,_16){
-var t=this.formNodes[_15],c=t.connections;
+}).call(this,null,this.formNodes[_9].node);
+return _1(_a);
+},_c=function(_d,_e){
+var t=this.formNodes[_d],c=t.connections;
 if(c.length){
 dojo.forEach(c,dojo.disconnect);
 c=t.connections=[];
 }
-aa(function(_,n){
-var _1b=ce(n);
-dojo.forEach(_16,function(o){
-c.push(dojo.connect(n,_1b,this,function(evt){
+aa(function(_f,n){
+var _10=ce(n);
+dojo.forEach(_e,function(o){
+c.push(dojo.connect(n,_10,this,function(evt){
 if(this.watch){
-this[o](this.formNodeValue(_15),_15,n,evt);
+this[o](this.formNodeValue(_d),_d,n,evt);
 }
 }));
 },this);
 }).call(this,null,t.node);
 };
 dojo.declare("dojox.form.manager._NodeMixin",null,{destroy:function(){
-for(var _1e in this.formNodes){
-dojo.forEach(this.formNodes[_1e].connections,dojo.disconnect);
+for(var _11 in this.formNodes){
+dojo.forEach(this.formNodes[_11].connections,dojo.disconnect);
 }
 this.formNodes={};
 this.inherited(arguments);
-},registerNode:function(_1f){
-if(typeof _1f=="string"){
-_1f=dojo.byId(_1f);
+},registerNode:function(_12){
+if(typeof _12=="string"){
+_12=dojo.byId(_12);
 }
-var _20=_7.call(this,_1f);
-if(_20){
-_14.call(this,_20,_d.call(this,_20));
+var _13=_4.call(this,_12);
+if(_13){
+_c.call(this,_13,_8.call(this,_13));
 }
 return this;
-},unregisterNode:function(_21){
-if(_21 in this.formNodes){
-dojo.forEach(this.formNodes[_21].connections,this.disconnect,this);
-delete this.formNodes[_21];
+},unregisterNode:function(_14){
+if(_14 in this.formNodes){
+dojo.forEach(this.formNodes[_14].connections,this.disconnect,this);
+delete this.formNodes[_14];
 }
 return this;
-},registerNodeDescendants:function(_22){
-if(typeof _22=="string"){
-_22=dojo.byId(_22);
+},registerNodeDescendants:function(_15){
+if(typeof _15=="string"){
+_15=dojo.byId(_15);
 }
-dojo.query("input, select, textarea, button",_22).map(function(n){
-return _7.call(this,n,_22);
-},this).forEach(function(_24){
-if(_24){
-_14.call(this,_24,_d.call(this,_24));
+dojo.query("input, select, textarea, button",_15).map(function(n){
+return _4.call(this,n,_15);
+},this).forEach(function(_16){
+if(_16){
+_c.call(this,_16,_8.call(this,_16));
 }
 },this);
 return this;
-},unregisterNodeDescendants:function(_25){
-if(typeof _25=="string"){
-_25=dojo.byId(_25);
+},unregisterNodeDescendants:function(_17){
+if(typeof _17=="string"){
+_17=dojo.byId(_17);
 }
-dojo.query("input, select, textarea, button",_25).map(function(n){
-return dojo.attr(_25,"name")||null;
-}).forEach(function(_27){
-if(_27){
-this.unregisterNode(_27);
+dojo.query("input, select, textarea, button",_17).map(function(n){
+return dojo.attr(_17,"name")||null;
+}).forEach(function(_18){
+if(_18){
+this.unregisterNode(_18);
 }
 },this);
 return this;
-},formNodeValue:function(_28,_29){
-var _2a=arguments.length==2&&_29!==undefined,_2b;
-if(typeof _28=="string"){
-_28=this.formNodes[_28];
-if(_28){
-_28=_28.node;
+},formNodeValue:function(_19,_1a){
+var _1b=arguments.length==2&&_1a!==undefined,_1c;
+if(typeof _19=="string"){
+_19=this.formNodes[_19];
+if(_19){
+_19=_19.node;
 }
 }
-if(!_28){
+if(!_19){
 return null;
 }
-if(dojo.isArray(_28)){
-if(_2a){
-dojo.forEach(_28,function(_2c){
-_2c.checked="";
+if(dojo.isArray(_19)){
+if(_1b){
+dojo.forEach(_19,function(_1d){
+_1d.checked="";
 });
-dojo.forEach(_28,function(_2d){
-_2d.checked=_2d.value===_29?"checked":"";
+dojo.forEach(_19,function(_1e){
+_1e.checked=_1e.value===_1a?"checked":"";
 });
 return this;
 }
-dojo.some(_28,function(_2e){
-if(_2e.checked){
-_2b=_2e;
+dojo.some(_19,function(_1f){
+if(_1f.checked){
+_1c=_1f;
 return true;
 }
 return false;
 });
-return _2b?_2b.value:"";
+return _1c?_1c.value:"";
 }
-switch(_28.tagName.toLowerCase()){
+switch(_19.tagName.toLowerCase()){
 case "select":
-if(_28.multiple){
-if(_2a){
-if(dojo.isArray(_29)){
-var _2f={};
-dojo.forEach(_29,function(v){
-_2f[v]=1;
+if(_19.multiple){
+if(_1b){
+if(dojo.isArray(_1a)){
+var _20={};
+dojo.forEach(_1a,function(v){
+_20[v]=1;
 });
-dojo.query("> option",_28).forEach(function(opt){
-opt.selected=opt.value in _2f;
+dojo.query("> option",_19).forEach(function(opt){
+opt.selected=opt.value in _20;
 });
 return this;
 }
-dojo.query("> option",_28).forEach(function(opt){
-opt.selected=opt.value===_29;
+dojo.query("> option",_19).forEach(function(opt){
+opt.selected=opt.value===_1a;
 });
 return this;
 }
-var _2b=dojo.query("> option",_28).filter(function(opt){
+var _1c=dojo.query("> option",_19).filter(function(opt){
 return opt.selected;
 }).map(function(opt){
 return opt.value;
 });
-return _2b.length==1?_2b[0]:_2b;
+return _1c.length==1?_1c[0]:_1c;
 }
-if(_2a){
-dojo.query("> option",_28).forEach(function(opt){
-opt.selected=opt.value===_29;
+if(_1b){
+dojo.query("> option",_19).forEach(function(opt){
+opt.selected=opt.value===_1a;
 });
 return this;
 }
-return _28.value||"";
+return _19.value||"";
 case "button":
-if(_2a){
-_28.innerHTML=""+_29;
+if(_1b){
+_19.innerHTML=""+_1a;
 return this;
 }
-return _28.innerHTML;
+return _19.innerHTML;
 case "input":
-if(_28.type.toLowerCase()=="checkbox"){
-if(_2a){
-_28.checked=_29?"checked":"";
+if(_19.type.toLowerCase()=="checkbox"){
+if(_1b){
+_19.checked=_1a?"checked":"";
 return this;
 }
-return Boolean(_28.checked);
+return Boolean(_19.checked);
 }
 }
-if(_2a){
-_28.value=""+_29;
+if(_1b){
+_19.value=""+_1a;
 return this;
 }
-return _28.value;
-},inspectFormNodes:function(_36,_37,_38){
-var _39,_3a={};
-if(_37){
-if(dojo.isArray(_37)){
-dojo.forEach(_37,function(_3b){
-if(_3b in this.formNodes){
-_3a[_3b]=_36.call(this,_3b,this.formNodes[_3b].node,_38);
+return _19.value;
+},inspectFormNodes:function(_21,_22,_23){
+var _24,_25={};
+if(_22){
+if(dojo.isArray(_22)){
+dojo.forEach(_22,function(_26){
+if(_26 in this.formNodes){
+_25[_26]=_21.call(this,_26,this.formNodes[_26].node,_23);
 }
 },this);
 }else{
-for(_39 in _37){
-if(_39 in this.formNodes){
-_3a[_39]=_36.call(this,_39,this.formNodes[_39].node,_37[_39]);
+for(_24 in _22){
+if(_24 in this.formNodes){
+_25[_24]=_21.call(this,_24,this.formNodes[_24].node,_22[_24]);
 }
 }
 }
 }else{
-for(_39 in this.formNodes){
-_3a[_39]=_36.call(this,_39,this.formNodes[_39].node,_38);
+for(_24 in this.formNodes){
+_25[_24]=_21.call(this,_24,this.formNodes[_24].node,_23);
 }
 }
-return _3a;
+return _25;
 }});
 })();
 }
diff --git a/dojox/form/nls/ar/PasswordValidator.js b/dojox/form/nls/ar/PasswordValidator.js
index 7ab0a3c..83a7761 100644
--- a/dojox/form/nls/ar/PasswordValidator.js
+++ b/dojox/form/nls/ar/PasswordValidator.js
@@ -1 +1 @@
-({"badPasswordMessage":"كلمة سرية غير صحيحة. ","nomatchMessage":"كلمات السرية غير مطابقة."})
\ No newline at end of file
+({"badPasswordMessage":"كلمة سرية غير صحيحة.","nomatchMessage":"كلمة السرية غير مطابقة."})
\ No newline at end of file
diff --git a/dojox/form/nls/ko/PasswordValidator.js b/dojox/form/nls/ko/PasswordValidator.js
index 48ebc29..52ac9cc 100644
--- a/dojox/form/nls/ko/PasswordValidator.js
+++ b/dojox/form/nls/ko/PasswordValidator.js
@@ -1 +1 @@
-({"badPasswordMessage":"올바르지 않은 비밀번호","nomatchMessage":"비밀번호가 일치하지 않습니다."})
\ No newline at end of file
+({"badPasswordMessage":"비밀번호가 올바르지 않습니다.","nomatchMessage":"비밀번호가 일치하지 않습니다."})
\ No newline at end of file
diff --git a/dojox/form/resources/BusyButton.css b/dojox/form/resources/BusyButton.css
index e8ccae4..668ee5c 100644
--- a/dojox/form/resources/BusyButton.css
+++ b/dojox/form/resources/BusyButton.css
@@ -5,4 +5,5 @@
 	vertical-align: middle;
 	margin-left: 4px;
 	background-image: url('images/loading_wheel.gif');
+	background-repeat: no-repeat;
 }
diff --git a/dojox/form/resources/DropDownSelect.css b/dojox/form/resources/DropDownSelect.css
deleted file mode 100644
index ffa6ad5..0000000
--- a/dojox/form/resources/DropDownSelect.css
+++ /dev/null
@@ -1,202 +0,0 @@
-
-.dojoxDropDownSelect {
-	margin: 0.2em;
-}
-.dojoxDropDownSelect .dijitButtonNode {
-	text-align: left;
-}
-.dijitRtl .dojoxDropDownSelect .dijitButtonNode {
-	text-align: right;
-}
-.dijitToolbar .dojoxDropDownSelect {
-	margin: 0;
-}
-.dj_webkit .dijitToolbar .dojoxDropDownSelect {
-	padding-left: 0.3em;
-}
-.dijit_a11y .dojoxDropDownSelectDisabled .dijitButtonNode {
-	border-style: outset!important;
-	border-width: medium!important;
-	border-color: #999 !important;
-	color:#999 !important;
-}
-.dojoxDropDownSelect .dijitButtonContents {
-	padding: 0px;
-	border-right: none;
-	background: transparent none;
-}
-.dojoxDropDownSelectFixedWidth .dijitButtonContents {
-	width: 100%;
-}
-.dojoxDropDownSelect .dijitArrowButton {
-	width: 16px;
-}
-.dojoxDropDownSelectLabel *
-{
-	vertical-align: baseline;
-}
-.dojoxDropDownSelectSelectedOption * {
-	font-weight: bold;
-}
-.dojoxDropDownSelectMenu {
-	border-width: 1px;
-}
-.dojoxDropDownSelect .dijitButtonContents {
-	white-space: nowrap;
-}
-.tundra .dojoxDropDownSelectDisabled * {
-    cursor: not-allowed !important;
-}
-.tundra .dojoxDropDownSelectReadOnly * {
-    cursor: default !important;
-}
-.tundra .dojoxDropDownSelect .dijitButtonNode {
-	padding: 0px;
-}
-.tundra .dojoxDropDownSelect .dijitButtonContents {
-	padding-top: 1px;
-    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;
-}
-.tundra .dojoxDropDownSelectHover .dijitButtonContents,
-.tundra .dojoxDropDownSelectActive .dijitButtonContents,
-.tundra .dojoxDropDownSelectOpened .dijitButtonContents,
-.tundra .dojoxDropDownSelectDisabled .dijitButtonContents,
-.tundra .dojoxDropDownSelectReadOnly .dijitButtonContents{
-	background: transparent none;
-}
-.dj_ie .tundra .dojoxDropDownSelect .dijitButtonContents {
-	padding-top: 0px;
-}
-.tundra .dojoxDropDownSelectDisabled .dijitButtonNode {
-    border-color: #d5d5d5 #bdbdbd #bdbdbd #d5d5d5;
-    background:#e4e4e4 url("../../../dijit/themes/tundra/images/buttonDisabled.png") top repeat-x;
-}
-.dj_ie .tundra .dojoxDropDownSelectDisabled  .dijitButtonNode * {
-	filter: gray() alpha(opacity=50); 
-}
-.tundra .dojoxDropDownSelectHover .dijitButtonNode {
-    border-color:#a5beda;
-    border-bottom-color:#5c7590;
-    border-right-color:#5c7590;
-    color:#243C5F;
-    background:#fcfdff url("../../../dijit/themes/tundra/images/buttonHover.png") repeat-x bottom;
-}
-.tundra .dojoxDropDownSelectActive .dijitButtonNode,
-.tundra .dojoxDropDownSelectOpened .dijitButtonNode {
-    border-color:#366dba;
-    background: #ededed url("../../../dijit/themes/tundra/images/buttonActive.png") bottom repeat-x;
-}
-.tundra .dojoxDropDownSelectMenu td {
-	padding: 0em;
-}
-.tundra .dojoxDropDownSelectMenu .dijitMenuItemIcon {
-	margin: 0.1em 0.2em;
-	display: none;
-}
-.tundra .dojoxDropDownSelectMenu .dijitMenuItemLabel,
-.tundra .dojoxDropDownSelectMenu .dijitMenuArrowCell {
-	padding: 0.1em 0.2em;
-}
-.soria .dojoxDropDownSelectDisabled * {
-    cursor: not-allowed !important;
-}
-.soria .dojoxDropDownSelectReadOnly * {
-    cursor: default !important;
-}
-.soria .dojoxDropDownSelect .dijitButtonNode {
-	padding: 0px;
-}
-.soria .dojoxDropDownSelect .dijitButtonContents {
-	padding-top: 1px;
-    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;
-}
-.soria .dojoxDropDownSelectHover .dijitButtonContents,
-.soria .dojoxDropDownSelectActive .dijitButtonContents,
-.soria .dojoxDropDownSelectOpened .dijitButtonContents,
-.soria .dojoxDropDownSelectDisabled .dijitButtonContents,
-.soria .dojoxDropDownSelectReadOnly .dijitButtonContents{
-	background: transparent none;
-}
-.dj_ie .soria .dojoxDropDownSelect .dijitButtonContents {
-	padding-top: 0px;
-}
-.soria .dojoxDropDownSelectDisabled .dijitButtonNode {
-    border-color: #b9bbdd #b9bbdd #b9bbdd #b9bbdd;
-    background:#c3d3e5 url("../../../dijit/themes/soria/images/buttonDisabled.png") top repeat-x;
-}
-.dj_ie .soria .dojoxDropDownSelectDisabled  .dijitButtonNode * {
-	filter: gray() alpha(opacity=50); 
-}
-.soria .dojoxDropDownSelectHover .dijitButtonNode {
-    color:#000;
-    background:#acc5e2 url("../../../dijit/themes/soria/images/buttonHover.png") repeat-x top left;
-}
-.soria .dojoxDropDownSelectActive .dijitButtonNode,
-.soria .dojoxDropDownSelectOpened .dijitButtonNode {
-    border-color:#657c9c;
-    background: #91b4e5 url("../../../dijit/themes/soria/images/buttonActive.png") top left repeat-x;
-}
-.soria .dojoxDropDownSelectMenu td {
-	padding: 0em;
-}
-.soria .dojoxDropDownSelectMenu .dijitMenuItemIcon {
-	margin: 0.1em 0.2em;
-	display: none;
-}
-.soria .dojoxDropDownSelectMenu .dijitMenuItemLabel,
-.soria .dojoxDropDownSelectMenu .dijitMenuArrowCell {
-	padding: 0.1em 0.2em;
-}
-.nihilo .dojoxDropDownSelectDisabled * {
-    cursor: not-allowed !important;
-}
-.nihilo .dojoxDropDownSelectReadOnly * {
-    cursor: default !important;
-}
-.nihilo .dojoxDropDownSelect .dijitButtonNode {
-	padding: 0px;
-}
-.nihilo .dojoxDropDownSelect .dijitButtonContents {
-	padding-top: 1px;
-    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;
-}
-.nihilo .dojoxDropDownSelectHover .dijitButtonContents,
-.nihilo .dojoxDropDownSelectActive .dijitButtonContents,
-.nihilo .dojoxDropDownSelectOpened .dijitButtonContents,
-.nihilo .dojoxDropDownSelectDisabled .dijitButtonContents,
-.nihilo .dojoxDropDownSelectReadOnly .dijitButtonContents{
-	background: transparent none;
-}
-.dj_ie .nihilo .dojoxDropDownSelect .dijitButtonContents {
-	padding-top: 0px;
-}
-.nihilo .dojoxDropDownSelectDisabled .dijitButtonNode {
-    border-color: #dedede;
-    background:#fafafa url("../../../dijit/themes/nihilo/images/buttonDisabled.png") top repeat-x;
-}
-.dj_ie .nihilo .dojoxDropDownSelectDisabled  .dijitButtonNode * {
-	filter: gray() alpha(opacity=50); 
-}
-.nihilo .dojoxDropDownSelectHover .dijitButtonNode {
-    color:#000;
-    background:#fcfcfc url("../../../dijit/themes/nihilo/images/buttonHover.png") repeat-x top left;
-}
-.nihilo .dojoxDropDownSelectActive .dijitButtonNode,
-.nihilo .dojoxDropDownSelectOpened .dijitButtonNode {
-    border-color:#dedede;
-    background: #f5f5f5 url("../../../dijit/themes/nihilo/images/buttonActive.png") top left repeat-x;
-}
-.nihilo .dojoxDropDownSelectMenu td {
-	padding: 0em;
-}
-.nihilo .dojoxDropDownSelectMenu .dijitMenuItemIcon {
-	margin: 0.1em 0.2em;
-	display: none;
-}
-.nihilo .dojoxDropDownSelectMenu .dijitMenuItemLabel,
-.nihilo .dojoxDropDownSelectMenu .dijitMenuArrowCell {
-	padding: 0.1em 0.2em;
-}
diff --git a/dojox/form/resources/DropDownSelect.html b/dojox/form/resources/DropDownSelect.html
deleted file mode 100644
index f581434..0000000
--- a/dojox/form/resources/DropDownSelect.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<table class='dijit dijitReset dijitInline dijitLeft'
-	dojoAttachPoint="dropDownNode,tableNode" cellspacing='0' cellpadding='0' waiRole="presentation"
-	dojoAttachEvent="onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse"
-	><tbody waiRole="presentation"><tr waiRole="presentation"
-		><td class="dijitReset dijitStretch dijitButtonContents dijitButtonNode" 
-			><span class="dijitReset dijitInline dijitButtonText"  dojoAttachPoint="containerNode,popupStateNode" id="${id}_label"></span
-			><input type="hidden" ${nameAttrSetting} dojoAttachPoint="valueNode" value="${value}" />
-		</td><td class="dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton" 
-				dojoAttachPoint="focusNode,titleNode" waiRole="button" waiState="haspopup-true,labelledby-${id}_label"
-			><div class="dijitReset dijitArrowButtonInner"> </div
-			><div class="dijitReset dijitArrowButtonChar" waiRole="presentation">▼</div
-		></td
-	></tr></tbody
-></table>
diff --git a/dojox/form/resources/FilePickerTextBox.html b/dojox/form/resources/FilePickerTextBox.html
index 923f638..e86b9d8 100644
--- a/dojox/form/resources/FilePickerTextBox.html
+++ b/dojox/form/resources/FilePickerTextBox.html
@@ -3,7 +3,7 @@
 	dojoAttachEvent="onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse" waiRole="combobox" tabIndex="-1"
 	><div style="overflow:hidden;"
 		><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton'
-			dojoAttachPoint="downArrowNode,dropDownNode,popupStateNode" waiRole="presentation"
+			dojoAttachPoint="downArrowNode,_buttonNode,_popupStateNode" waiRole="presentation"
 			><div class="dijitArrowButtonInner"> </div
 			><div class="dijitArrowButtonChar">▼</div
 		></div
diff --git a/dojox/form/resources/FileUploader.css b/dojox/form/resources/FileUploader.css
index 72aac86..4d071af 100644
--- a/dojox/form/resources/FileUploader.css
+++ b/dojox/form/resources/FileUploader.css
@@ -1,3 +1,96 @@
+.dojoxUploaderNorm{
+	font-family:Myriad,Helvetica,Tahoma,Arial,clean,sans-serif;
+	font-size:12px;
+	border: 1px solid #c0c0c0; 
+	border-bottom: 1px solid #9b9b9b; 
+	padding: 0.1em 0.2em 0.2em 0.2em; 
+	background: #fff url("../../../dijit/themes/tundra/images/buttonEnabled.png") repeat-x bottom left;
+	
+	vertical-align: middle;
+	
+	margin:0;
+	line-height:normal;
+	text-align:center;
+	white-space: nowrap;
+	
+	cursor: pointer;
+}
+.uploaderInsideNode{
+	visibility:hidden;
+}
+.dojoxUploaderHover{
+	border-color:		#a5beda; 
+	border-bottom-color:#5c7590; 
+	color:#243C5F;
+	background:#fcfdff url("../../../dijit/themes/tundra/images/buttonHover.png") repeat-x bottom;
+}
+.dojoxUploaderActive{
+	border-color:#366dba;
+	background: #ededed url("../../../dijit/themes/tundra/images/buttonActive.png") bottom repeat-x;
+}
+.dojoxUploaderDisabled{
+	color: #7F7F7F;
+	border-color: #d5d5d5 #d5d5d5 #bdbdbd #d5d5d5; 
+	background:#e4e4e4 url("../../../dijit/themes/tundra/images/buttonDisabled.png") top repeat-x;
+}
+.soria .dojoxUploaderNorm {
+	border: 1px solid #8ba0bd;
+	border-bottom:1px solid #657c9c;
+	padding: 0.1em 0.2em 0.2em 0.2em; 
+	background: #bcd5f0 url("../../../dijit/themes/soria/images/buttonEnabled.png") repeat-x top left;
+}
+.soria .dojoxUploaderHover{
+	color:#243C5F;
+	background:#acc5e2 url("../../../dijit/themes/soria/images/buttonHover.png") repeat-x top left !important;
+}
+.soria .dojoxUploaderActive{
+	border-color:#657c9c;
+	background: #91b4e5 url("../../../dijit/themes/soria/images/buttonActive.png") top left repeat-x !important;
+}
+.soria .dojoxUploaderDisabled{
+	border-color: #b9bbdd #b9bbdd #b9bbdd #b9bbdd;
+	background:#c3d3e5 url("../../../dijit/themes/soria/images/buttonDisabled.png") top repeat-x !important;
+	opacity: 0.60;
+}
+.nihilo .dojoxUploaderNorm {
+	border:1px solid #dedede;
+	border-bottom:1px solid #dedede;
+	padding: 0.1em 0.2em 0.2em 0.2em; 
+	background: #fff url("../../../dijit/themes/nihilo/images/buttonEnabled.png") repeat-x top left;
+}
+.nihilo .dojoxUploaderHover{
+	color:#243C5F;
+	background:#fcfcfc url("../../../dijit/themes/nihilo/images/buttonHover.png") repeat-x top left !important;
+}
+.nihilo .dojoxUploaderActive{
+	border-color:#dedede;
+	background: #f5f5f5 url("../../../dijit/themes/nihilo/images/buttonActive.png") top left repeat-x !important;
+}
+.nihilo .dojoxUploaderDisabled{
+	border-color: #dedede;
+	background:#fafafa url("../../../dijit/themes/nihilo/images/buttonDisabled.png") top repeat-x !important;
+	opacity: 0.60;
+}
+.noir .dojoxUploaderNorm {
+	vertical-align:top;
+	height:30px;
+	font-family:inherit;
+	font-size:inherit;
+	background-color:transparent;
+	background-image:none;
+	padding:0px !important;
+	line-height:25px;	
+	color:#cccccc;
+}
+.noir .dojoxUploaderHover{
+	color:#fa4242;
+}
+.noir .dojoxUploaderActive{
+	color:#31d397;
+}
+.noir .dojoxUploaderDisabled{
+	color:#3f3f3f;
+}
 .fileToUpload,
 .fileToUploadClose,
 .fileToUploadName,
diff --git a/dojox/form/resources/ListInput.css b/dojox/form/resources/ListInput.css
new file mode 100644
index 0000000..4d96bb0
--- /dev/null
+++ b/dojox/form/resources/ListInput.css
@@ -0,0 +1,75 @@
+.dojoxListInput {
+	border:1px solid #ccc;
+	background-color:#efefef;
+	height:auto !important;
+	max-height:60px;
+	min-height:20px;
+	overflow:auto;
+	position:relative
+}
+.dojoxListInput ul {
+	margin:0;
+	padding:0
+}
+.dijitDialogCloseIcon {
+	display:none;
+}
+.dojoxListInputClosable .dijitDialogCloseIcon{
+	display:inline 
+}
+.dojoxListInputClosable {
+	padding-right:18px !important
+}
+.dojoxListInputItem {
+	float:left;
+	list-style-type:none;
+	margin:1px 5px 1px 1px;
+	padding:0
+}
+.dojoxListInputItem .closeText {
+	display:none;
+	position:absolute;
+}
+.dojoxListInputItem .dijitDialogCloseIcon{
+	right:auto !important;
+	border:0 !important;
+	padding:0!important;
+}
+.dojoxListInputMatch {
+	border :1px solid #5EB55E;
+	background-color:#efffef
+}
+.dojoxListInputMismatch {
+	border :1px solid #B55E5E;
+	background-color:#ffefef
+}
+.dojoxListInput.dojoxListInputFocused {
+	border:1px solid #000;
+	border-right:1px solid #ccc;
+	border-bottom:1px solid #ccc;
+	background-color:#fff
+}
+.dojoxListInputNode {
+	cursor:text;
+}
+.dojoxListInput .dijitTextBox {
+	background:#efefef !important;
+	border:0 !important;
+}
+.dojoxListInputFocused .dijitTextBox {
+	background: #fff !important;
+	border:0 !important;
+}
+.dojoxListInputItem .dijitTextBox {
+	width:auto !important;
+	border:0 !important;
+}
+.dojoxListInputNode {
+	float:none;
+}
+.dojoxListInputItemEdited{
+	display:none !important
+}
+.dojoxListInputItem .dijitInline{
+	display:inline !important
+}
diff --git a/dojox/form/resources/UploadFile.php b/dojox/form/resources/UploadFile.php
deleted file mode 100644
index 30fdea1..0000000
--- a/dojox/form/resources/UploadFile.php
+++ /dev/null
@@ -1,226 +0,0 @@
-<?php
-// summary
-//		Test file to handle image uploads (remove the image size check to upload non-images)
-//
-//		This file handles both Flash and HTML uploads
-//
-//		NOTE: This is obviously a PHP file, and thus you need PHP running for this to work
-//		NOTE: Directories must have write permissions
-//		NOTE: This code uses the GD library (to get image sizes), that sometimes is not pre-installed in a 
-//				standard PHP build. 
-//
-require("cLOG.php");
-function findTempDirectory()
-  {
-    if(isset($_ENV["TMP"]) && is_writable($_ENV["TMP"])) return $_ENV["TMP"];
-    elseif( is_writable(ini_get('upload_tmp_dir'))) return ini_get('upload_tmp_dir');
-    elseif(isset($_ENV["TEMP"]) && is_writable($_ENV["TEMP"])) return $_ENV["TEMP"];
-    elseif(is_writable("/tmp")) return "/tmp";
-    elseif(is_writable("/windows/temp")) return "/windows/temp";
-    elseif(is_writable("/winnt/temp")) return "/winnt/temp";
-    else return null;
-  }
-function trace($txt, $isArray=false){
-	//creating a text file that we can log to
-	// this is helpful on a remote server if you don't
-	//have access to the log files
-	//
-	//echo($txt."<br/>");
-	$log = new cLOG("../resources/upload.txt", false);
-	//$log->clear();
-	if($isArray){
-		$log->printr($txt);
-	}else{
-		$log->write($txt);
-	}
-}
-function getImageType($filename){
-	return strtolower(substr(strrchr($filename,"."),1));
-}
-trace("---------------------------------------------------------");
-
-//
-//
-//	EDIT ME: According to your local directory structure.
-// 	NOTE: Folders must have write permissions
-//
-$upload_path = "../resources/"; 	// where image will be uploaded, relative to this file
-$download_path = "../resources/";	// same folder as above, but relative to the HTML file
-
-//
-// 	NOTE: maintain this path for JSON services
-//
-require("../../../dojo/tests/resources/JSON.php");
-$json = new Services_JSON();
-
-//
-// 	Determine if this is a Flash upload, or an HTML upload
-//	
-//
-
-//		First combine relavant postVars
-$postdata = array();
-$data = "";
-foreach ($_POST as $nm => $val) {
-	$data .= $nm ."=" . $val . ",";	// string for flash
-	$postdata[$nm] = $val;			// array for html
-}
-trace("POSTDATA:");
-trace($postdata, true);
-
-$fieldName = "flashUploadFiles";//Filedata";
-
-if( isset($_FILES[$fieldName])){
-	//
-	// If the data passed has $fieldName, then it's Flash.
-	// NOTE: "Filedata" is the default fieldname, but we're using a custom fieldname.
-	//
-	trace("returnFlashdata.... ");
-	
-	trace("");
-	trace("ID:");
-	trace($_POST['testId']);
-	
-	trace("Flash POST:");
-	trace($_POST, true);
-	
-	
-	
-	trace("GET:");
-	trace($_GET, true);
-	
-	trace("FILES:");
-	trace($_FILES[$fieldName], true);
-	
-	trace("REQUEST:");
-	trace($_REQUEST, true);
-	
-	
-	
-	
-	
-	$returnFlashdata = true; //for dev
-	$m = move_uploaded_file($_FILES[$fieldName]['tmp_name'],  $upload_path . $_FILES[$fieldName]['name']);
-	$name = $_FILES[$fieldName]['name'];
-	$file = $upload_path . $name;
-	try{
-	  list($width, $height) = getimagesize($file);
-	} catch(Exception $e){
-	  $width=0;
-	  $height=0;
-	}
-	$type = getImageType($file);
-	trace("file: " . $file ."  ".$type." ".$width);
-	// 		Flash gets a string back:
-	
-	$data .='file='.$file.',name='.$name.',width='.$width.',height='.$height.',type='.$type;
-	if($returnFlashdata){
-		trace("returnFlashdata:\n=======================");
-		trace($data);
-		trace("=======================");
-		// echo sends data to Flash:
-		echo($data);
-		// return is just to stop the script:
-		return;
-	}
-
-
-
-
-}elseif( isset($_FILES['uploadedfile']) ){
-	//
-	// 	If the data passed has 'uploadedfile', then it's HTML. 
-	//	There may be better ways to check this, but this *is* just a test file.
-	//
-	$m = move_uploaded_file($_FILES['uploadedfile']['tmp_name'],  $upload_path . $_FILES['uploadedfile']['name']);
-	
-	trace("HTML single POST:");
-	trace($postdata, true);
-	
-	$name = $_FILES['uploadedfile']['name'];
-	$file = $upload_path . $name;
-	$type = getImageType($file);
-	try{
-	  list($width, $height) = getimagesize($file);
-	} catch(Exception $e){
-	  $width=0;
-	  $height=0;
-	}
-	trace("file: " . $file );
-	
-	$postdata['file'] = $file;
-	$postdata['name'] = $name;
-	$postdata['width'] = $width;
-	$postdata['height'] = $height;
-	$postdata['type'] = $type;
-	$postdata['size'] = filesize($file);
-
-}elseif( isset($_FILES['uploadedfile0']) ){
-	//
-	//	Multiple files have been passed from HTML
-	//
-	$cnt = 0;
-	trace("HTML multiple POST:");
-	trace($postdata, true);
-	
-	$_post = $postdata;
-	$postdata = array();
-	
-	while(isset($_FILES['uploadedfile'.$cnt])){
-	  trace("izzaa file");
-		$moved = move_uploaded_file($_FILES['uploadedfile'.$cnt]['tmp_name'],  $upload_path . $_FILES['uploadedfile'.$cnt]['name']);
-		trace("moved:" . $moved ."  ". $_FILES['uploadedfile'.$cnt]['name']);
-		if($moved){
-			$name = $_FILES['uploadedfile'.$cnt]['name'];
-			$file = $upload_path . $name;
-			$type = getImageType($file);
-			try{
-			  list($width, $height) = getimagesize($file);
-			} catch(Exception $e){
-			  $width=0;
-			  $height=0;
-			}
-			trace("file: " . $file );
-			
-			$_post['file'] = $file;
-			$_post['name'] = $name;
-			$_post['width'] = $width;
-			$_post['height'] = $height;
-			$_post['type'] = $type;
-			$_post['size'] = filesize($file);
-		  
-			trace($_post, true);
-			
-			$postdata[$cnt] = $_post;
-			
-		}elseif(strlen($_FILES['uploadedfile'.$cnt]['name'])){
-		  $postdata[$cnt] =array("ERROR" => "File could not be moved: ".$_FILES['uploadedfile'.$cnt]['name']);
-		}
-		$cnt++;
-	}
-	trace("HTML multiple POST done:");
-	foreach($postdata as $key => $value){
-		trace($value, true);
-	}
-}elseif(isset($_GET['rmFiles'])){
-	trace("DELETING FILES" . $_GET['rmFiles']);
-	$rmFiles = explode(";", $_GET['rmFiles']);
-	foreach($rmFiles as $f){
-		if($f && file_exists($f)){
-			trace("deleted:" . $f. ":" .unlink($f));
-		}
-	}
-
-}else{
-	trace("IMROPER DATA SENT... $FILES:");
-	trace($_FILES);
-	$postdata = array("ERROR" => "Improper data sent - no files found");
-}
-
-//HTML gets a json array back:
-$data = $json->encode($postdata);
-trace("Json Data Returned:");
-trace($data);
-// in a text field:
-?>
-<textarea><?php print $data; ?></textarea>
\ No newline at end of file
diff --git a/dojox/form/resources/cLOG.php b/dojox/form/resources/cLOG.php
deleted file mode 100644
index 6a9a217..0000000
--- a/dojox/form/resources/cLOG.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-//
-//	summary
-//		Creates/Opens files for logging data
-//		Useful for logging iinformation on a remote server
-//		when you don't have access to log files
-//		Also helpful for XHRs - since the page doesn't change
-//		to the PHP location which normally shows log data
-//		or errors.
-//
-//
- class cLOG {
-	var $logfile;
-	var $boolTimestamp;
-	function cLOG($filename, $boolTimestamp){
-		$this->boolTimestamp = $boolTimestamp;
-		$this->logfile = $filename;
-	}
-	function write($txt){
-		if($this->boolTimestamp){
-			$dt = date("y.m.d G.i.s");
-			$txt = "[". $dt ."]: ".$txt;
-		}
-		$fh = fopen($this->logfile, "a");
-		if(is_array($txt)){
-			//$txt = "::::::::".$txt;
-			$ar = $txt;
-			$txt = "Array:::::\n";
-			foreach($ar as $key => $value){
-				$txt += $key."=".$value."\n";
-			}
-		}
-		fwrite($fh, $txt."\n");
-		fclose($fh);
-	}
-	function clear(){
-		$fh = fopen($this->logfile, "w");
-		fwrite($fh, "");
-		fclose($fh);
-	}
-	function newline(){
-		$fh = fopen($this->logfile, "a");
-		fwrite($fh, "\n\n");
-		fclose($fh);
-	}
-	function printr($ar){
-		$txt = "";
-		foreach ($ar as $nm => $val) {
-			$txt .= "    ".$nm ." = " . $val . "\n";
-		}
-		$this->write($txt);
-	}
-}
-?>
\ No newline at end of file
diff --git a/dojox/form/resources/uploader.swf b/dojox/form/resources/uploader.swf
index 60d03f6..dd5bdd2 100644
Binary files a/dojox/form/resources/uploader.swf and b/dojox/form/resources/uploader.swf differ
diff --git a/dojox/fx/README b/dojox/fx/README
index 30bc90d..edc8891 100644
--- a/dojox/fx/README
+++ b/dojox/fx/README
@@ -40,13 +40,13 @@ Documentation
 	- 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)
+	(all use standard Animation properties, like duration, easing, node, etc)
 
 	dojox.fx._core:
 	- dojox.fx._Line - a multi-dimensional _Line implementation, backwards compatible with
 		dojo._Line ... you might could safely do something akin to
 		dojo._Line = dojox.fx._Line;
-		and enable this for all dojo _Animations?
+		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
diff --git a/dojox/fx/Shadow.js b/dojox/fx/Shadow.js
index 64e08f6..510757a 100644
--- a/dojox/fx/Shadow.js
+++ b/dojox/fx/Shadow.js
@@ -28,41 +28,41 @@ this._makePiece("br","top",0,"left",0);
 this.nodeList=dojo.query(".shadowPiece",this.node);
 this.setOpacity(this.opacity);
 this.resize();
-},_makePiece:function(_4,_5,_6,_7,_8,_9){
-var _a;
-var _b=this.shadowPng+_4.toUpperCase()+".png";
+},_makePiece:function(_1,_2,_3,_4,_5,_6){
+var _7;
+var _8=this.shadowPng+_1.toUpperCase()+".png";
 if(dojo.isIE<7){
-_a=dojo.create("div");
-_a.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+_b+"'"+(_9?", sizingMethod='"+_9+"'":"")+")";
+_7=dojo.create("div");
+_7.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+_8+"'"+(_6?", sizingMethod='"+_6+"'":"")+")";
 }else{
-_a=dojo.create("img",{src:_b});
+_7=dojo.create("img",{src:_8});
 }
-_a.style.position="absolute";
-_a.style[_5]=_6+"px";
-_a.style[_7]=_8+"px";
-_a.style.width=this.shadowThickness+"px";
-_a.style.height=this.shadowThickness+"px";
-dojo.addClass(_a,"shadowPiece");
-this.pieces[_4]=_a;
-this.node.appendChild(_a);
-},setOpacity:function(n,_d){
+_7.style.position="absolute";
+_7.style[_2]=_3+"px";
+_7.style[_4]=_5+"px";
+_7.style.width=this.shadowThickness+"px";
+_7.style.height=this.shadowThickness+"px";
+dojo.addClass(_7,"shadowPiece");
+this.pieces[_1]=_7;
+this.node.appendChild(_7);
+},setOpacity:function(n,_9){
 if(dojo.isIE){
 return;
 }
-if(!_d){
-_d={};
+if(!_9){
+_9={};
 }
 if(this.animate){
-var _e=[];
-this.nodeList.forEach(function(_f){
-_e.push(dojo._fade(dojo.mixin(_d,{node:_f,end:n})));
+var _a=[];
+this.nodeList.forEach(function(_b){
+_a.push(dojo._fade(dojo.mixin(_9,{node:_b,end:n})));
 });
-dojo.fx.combine(_e).play();
+dojo.fx.combine(_a).play();
 }else{
 this.nodeList.style("opacity",n);
 }
-},setDisabled:function(_10){
-if(_10){
+},setDisabled:function(_c){
+if(_c){
 if(this.disabled){
 return;
 }
@@ -83,20 +83,20 @@ this.nodeList.style("visibility","visible");
 }
 this.disabled=false;
 }
-},resize:function(_11){
+},resize:function(_d){
 var x;
 var y;
-if(_11){
-x=_11.x;
-y=_11.y;
+if(_d){
+x=_d.x;
+y=_d.y;
 }else{
 var co=dojo._getBorderBox(this.node);
 x=co.w;
 y=co.h;
 }
-var _15=y-(this.shadowOffset+this.shadowThickness);
-if(_15<0){
-_15=0;
+var _e=y-(this.shadowOffset+this.shadowThickness);
+if(_e<0){
+_e=0;
 }
 if(y<1){
 y=1;
@@ -105,8 +105,8 @@ if(x<1){
 x=1;
 }
 with(this.pieces){
-l.style.height=_15+"px";
-r.style.height=_15+"px";
+l.style.height=_e+"px";
+r.style.height=_e+"px";
 b.style.width=x+"px";
 bl.style.top=y+"px";
 b.style.top=y+"px";
diff --git a/dojox/fx/_base.js b/dojox/fx/_base.js
index 444e0d2..8296f35 100644
--- a/dojox/fx/_base.js
+++ b/dojox/fx/_base.js
@@ -11,100 +11,96 @@ dojo.provide("dojox.fx._base");
 dojo.require("dojo.fx");
 dojo.mixin(dojox.fx,{anim:dojo.anim,animateProperty:dojo.animateProperty,fadeTo:dojo._fade,fadeIn:dojo.fadeIn,fadeOut:dojo.fadeOut,combine:dojo.fx.combine,chain:dojo.fx.chain,slideTo:dojo.fx.slideTo,wipeIn:dojo.fx.wipeIn,wipeOut:dojo.fx.wipeOut});
 dojox.fx.sizeTo=function(_1){
-var _2=_1.node=dojo.byId(_1.node);
-var _3=_1.method||"chain";
+var _2=_1.node=dojo.byId(_1.node),_3="absolute";
+var _4=_1.method||"chain";
 if(!_1.duration){
 _1.duration=500;
 }
-if(_3=="chain"){
+if(_4=="chain"){
 _1.duration=Math.floor(_1.duration/2);
 }
-var _4,_5,_6,_7,_8,_9=null;
-var _a=(function(n){
+var _5,_6,_7,_8,_9,_a=null;
+var _b=(function(n){
 return function(){
-var cs=dojo.getComputedStyle(n);
-var _d=cs.position;
-_4=(_d=="absolute"?n.offsetTop:parseInt(cs.top)||0);
-_6=(_d=="absolute"?n.offsetLeft:parseInt(cs.left)||0);
-_8=parseInt(cs.width);
-_9=parseInt(cs.height);
-_7=_6-Math.floor((_1.width-_8)/2);
-_5=_4-Math.floor((_1.height-_9)/2);
-if(_d!="absolute"&&_d!="relative"){
-var _e=dojo.coords(n,true);
-_4=_e.y;
-_6=_e.x;
-n.style.position="absolute";
-n.style.top=_4+"px";
-n.style.left=_6+"px";
+var cs=dojo.getComputedStyle(n),_c=cs.position,w=cs.width,h=cs.height;
+_5=(_c==_3?n.offsetTop:parseInt(cs.top)||0);
+_7=(_c==_3?n.offsetLeft:parseInt(cs.left)||0);
+_9=(w=="auto"?0:parseInt(w));
+_a=(h=="auto"?0:parseInt(h));
+_8=_7-Math.floor((_1.width-_9)/2);
+_6=_5-Math.floor((_1.height-_a)/2);
+if(_c!=_3&&_c!="relative"){
+var _d=dojo.coords(n,true);
+_5=_d.y;
+_7=_d.x;
+n.style.position=_3;
+n.style.top=_5+"px";
+n.style.left=_7+"px";
 }
 };
 })(_2);
-_a();
-var _f=dojo.animateProperty(dojo.mixin({properties:{height:{start:_9,end:_1.height||0,unit:"px"},top:{start:_4,end:_5}}},_1));
-var _10=dojo.animateProperty(dojo.mixin({properties:{width:{start:_8,end:_1.width||0,unit:"px"},left:{start:_6,end:_7}}},_1));
-var _11=dojo.fx[(_1.method=="combine"?"combine":"chain")]([_f,_10]);
-dojo.connect(_11,"beforeBegin",_11,_a);
-return _11;
+var _e=dojo.animateProperty(dojo.mixin({properties:{height:function(){
+_b();
+return {end:_1.height||0,start:_a};
+},top:function(){
+return {start:_5,end:_6};
+}}},_1));
+var _f=dojo.animateProperty(dojo.mixin({properties:{width:function(){
+return {start:_9,end:_1.width||0};
+},left:function(){
+return {start:_7,end:_8};
+}}},_1));
+var _10=dojo.fx[(_1.method=="combine"?"combine":"chain")]([_e,_f]);
+return _10;
 };
-dojox.fx.slideBy=function(_12){
-var _13=_12.node=dojo.byId(_12.node);
-var top=null;
-var _15=null;
-var _16=(function(n){
+dojox.fx.slideBy=function(_11){
+var _12=_11.node=dojo.byId(_11.node),top,_13;
+var _14=(function(n){
 return function(){
 var cs=dojo.getComputedStyle(n);
 var pos=cs.position;
 top=(pos=="absolute"?n.offsetTop:parseInt(cs.top)||0);
-_15=(pos=="absolute"?n.offsetLeft:parseInt(cs.left)||0);
+_13=(pos=="absolute"?n.offsetLeft:parseInt(cs.left)||0);
 if(pos!="absolute"&&pos!="relative"){
 var ret=dojo.coords(n,true);
 top=ret.y;
-_15=ret.x;
+_13=ret.x;
 n.style.position="absolute";
 n.style.top=top+"px";
-n.style.left=_15+"px";
+n.style.left=_13+"px";
 }
 };
-})(_13);
-_16();
-var _1b=dojo.animateProperty(dojo.mixin({properties:{top:top+(_12.top||0),left:_15+(_12.left||0)}},_12));
-dojo.connect(_1b,"beforeBegin",_1b,_16);
-return _1b;
+})(_12);
+_14();
+var _15=dojo.animateProperty(dojo.mixin({properties:{top:top+(_11.top||0),left:_13+(_11.left||0)}},_11));
+dojo.connect(_15,"beforeBegin",_15,_14);
+return _15;
 };
-dojox.fx.crossFade=function(_1c){
-if(dojo.isArray(_1c.nodes)){
-var _1d=_1c.nodes[0]=dojo.byId(_1c.nodes[0]);
-var op1=dojo.style(_1d,"opacity");
-var _1f=_1c.nodes[1]=dojo.byId(_1c.nodes[1]);
-var op2=dojo.style(_1f,"opacity");
-var _21=dojo.fx.combine([dojo[(op1==0?"fadeIn":"fadeOut")](dojo.mixin({node:_1d},_1c)),dojo[(op1==0?"fadeOut":"fadeIn")](dojo.mixin({node:_1f},_1c))]);
-return _21;
-}else{
-return false;
-}
+dojox.fx.crossFade=function(_16){
+var _17=_16.nodes[0]=dojo.byId(_16.nodes[0]),op1=dojo.style(_17,"opacity"),_18=_16.nodes[1]=dojo.byId(_16.nodes[1]),op2=dojo.style(_18,"opacity");
+var _19=dojo.fx.combine([dojo[(op1==0?"fadeIn":"fadeOut")](dojo.mixin({node:_17},_16)),dojo[(op1==0?"fadeOut":"fadeIn")](dojo.mixin({node:_18},_16))]);
+return _19;
 };
-dojox.fx.highlight=function(_22){
-var _23=_22.node=dojo.byId(_22.node);
-_22.duration=_22.duration||400;
-var _24=_22.color||"#ffff99";
-var _25=dojo.style(_23,"backgroundColor");
-var _26=(_25=="transparent"||_25=="rgba(0, 0, 0, 0)")?_25:false;
-var _27=dojo.animateProperty(dojo.mixin({properties:{backgroundColor:{start:_24,end:_25}}},_22));
-if(_26){
-dojo.connect(_27,"onEnd",_27,function(){
-_23.style.backgroundColor=_26;
+dojox.fx.highlight=function(_1a){
+var _1b=_1a.node=dojo.byId(_1a.node);
+_1a.duration=_1a.duration||400;
+var _1c=_1a.color||"#ffff99",_1d=dojo.style(_1b,"backgroundColor");
+if(_1d=="rgba(0, 0, 0, 0)"){
+_1d="transparent";
+}
+var _1e=dojo.animateProperty(dojo.mixin({properties:{backgroundColor:{start:_1c,end:_1d}}},_1a));
+if(_1d=="transparent"){
+dojo.connect(_1e,"onEnd",_1e,function(){
+_1b.style.backgroundColor=_1d;
 });
 }
-return _27;
+return _1e;
 };
-dojox.fx.wipeTo=function(_28){
-_28.node=dojo.byId(_28.node);
-var _29=_28.node,s=_29.style;
-var dir=(_28.width?"width":"height");
-var _2c=_28[dir];
-var _2d={};
-_2d[dir]={start:function(){
+dojox.fx.wipeTo=function(_1f){
+_1f.node=dojo.byId(_1f.node);
+var _20=_1f.node,s=_20.style;
+var dir=(_1f.width?"width":"height"),_21=_1f[dir],_22={};
+_22[dir]={start:function(){
 s.overflow="hidden";
 if(s.visibility=="hidden"||s.display=="none"){
 s[dir]="1px";
@@ -112,11 +108,11 @@ s.display="";
 s.visibility="";
 return 1;
 }else{
-var now=dojo.style(_29,dir);
+var now=dojo.style(_20,dir);
 return Math.max(now,1);
 }
-},end:_2c,unit:"px"};
-var _2f=dojo.animateProperty(dojo.mixin({properties:_2d},_28));
-return _2f;
+},end:_21};
+var _23=dojo.animateProperty(dojo.mixin({properties:_22},_1f));
+return _23;
 };
 }
diff --git a/dojox/fx/_core.js b/dojox/fx/_core.js
index 5d49d5d..2e0617d 100644
--- a/dojox/fx/_core.js
+++ b/dojox/fx/_core.js
@@ -17,11 +17,11 @@ dojo.forEach(this.start,function(s,i){
 d[i]=this.end[i]-s;
 },this);
 this.getValue=function(n){
-var _8=[];
+var _4=[];
 dojo.forEach(this.start,function(s,i){
-_8[i]=(d[i]*n)+s;
+_4[i]=(d[i]*n)+s;
 },this);
-return _8;
+return _4;
 };
 }else{
 this.getValue=function(n){
diff --git a/dojox/fx/ext-dojo/NodeList-style.js b/dojox/fx/ext-dojo/NodeList-style.js
new file mode 100644
index 0000000..c4ede54
--- /dev/null
+++ b/dojox/fx/ext-dojo/NodeList-style.js
@@ -0,0 +1,27 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.fx.ext-dojo.NodeList-style"]){
+dojo._hasResource["dojox.fx.ext-dojo.NodeList-style"]=true;
+dojo.provide("dojox.fx.ext-dojo.NodeList-style");
+dojo.experimental("dojox.fx.ext-dojo.NodeList-style");
+dojo.require("dojo.NodeList-fx");
+dojo.require("dojox.fx.style");
+dojo.extend(dojo.NodeList,{addClassFx:function(_1,_2){
+return dojo.fx.combine(this.map(function(n){
+return dojox.fx.addClass(n,_1,_2);
+}));
+},removeClassFx:function(_3,_4){
+return dojo.fx.combine(this.map(function(n){
+return dojox.fx.removeClass(n,_3,_4);
+}));
+},toggleClassFx:function(_5,_6,_7){
+return dojo.fx.combine(this.map(function(n){
+return dojox.fx.toggleClass(n,_5,_6,_7);
+}));
+}});
+}
diff --git a/dojox/fx/flip.js b/dojox/fx/flip.js
index 441fbfe..be9e263 100644
--- a/dojox/fx/flip.js
+++ b/dojox/fx/flip.js
@@ -13,171 +13,171 @@ dojo.require("dojo.fx");
 (function(){
 var _1="border",_2="Width",_3="Height",_4="Top",_5="Right",_6="Left",_7="Bottom";
 dojox.fx.flip=function(_8){
-var _9=dojo.create("div"),_a=_8.node=dojo.byId(_8.node),s=_a.style,_c=null,hs=null,pn=null,_f=_8.lightColor||"#dddddd",_10=_8.darkColor||"#555555",_11=dojo.style(_a,"backgroundColor"),_12=_8.endColor||_11,_13={},_14=[],_15=_8.duration?_8.duration/2:250,dir=_8.dir||"left",_17=0.9,_18="transparent",_19=_8.whichAnim,_1a=_8.axis||"center",_1b=_8.depth;
-var _1c=function(_1d){
-return ((new dojo.Color(_1d)).toHex()==="#000000")?"#000001":_1d;
+var _9=dojo.create("div"),_a=_8.node=dojo.byId(_8.node),s=_a.style,_b=null,hs=null,pn=null,_c=_8.lightColor||"#dddddd",_d=_8.darkColor||"#555555",_e=dojo.style(_a,"backgroundColor"),_f=_8.endColor||_e,_10={},_11=[],_12=_8.duration?_8.duration/2:250,dir=_8.dir||"left",_13=0.9,_14="transparent",_15=_8.whichAnim,_16=_8.axis||"center",_17=_8.depth;
+var _18=function(_19){
+return ((new dojo.Color(_19)).toHex()==="#000000")?"#000001":_19;
 };
 if(dojo.isIE<7){
-_12=_1c(_12);
-_f=_1c(_f);
-_10=_1c(_10);
-_11=_1c(_11);
-_18="black";
+_f=_18(_f);
+_c=_18(_c);
+_d=_18(_d);
+_e=_18(_e);
+_14="black";
 _9.style.filter="chroma(color='#000000')";
 }
-var _1e=(function(n){
+var _1a=(function(n){
 return function(){
 var ret=dojo.coords(n,true);
-_c={top:ret.y,left:ret.x,width:ret.w,height:ret.h};
+_b={top:ret.y,left:ret.x,width:ret.w,height:ret.h};
 };
 })(_a);
-_1e();
-hs={position:"absolute",top:_c["top"]+"px",left:_c["left"]+"px",height:"0",width:"0",zIndex:_8.zIndex||(s.zIndex||0),border:"0 solid "+_18,fontSize:"0",visibility:"hidden"};
-var _21=[{},{top:_c["top"],left:_c["left"]}];
-var _22={left:[_6,_5,_4,_7,_2,_3,"end"+_3+"Min",_6,"end"+_3+"Max"],right:[_5,_6,_4,_7,_2,_3,"end"+_3+"Min",_6,"end"+_3+"Max"],top:[_4,_7,_6,_5,_3,_2,"end"+_2+"Min",_4,"end"+_2+"Max"],bottom:[_7,_4,_6,_5,_3,_2,"end"+_2+"Min",_4,"end"+_2+"Max"]};
-pn=_22[dir];
-if(typeof _1b!="undefined"){
-_1b=Math.max(0,Math.min(1,_1b))/2;
-_17=0.4+(0.5-_1b);
+_1a();
+hs={position:"absolute",top:_b["top"]+"px",left:_b["left"]+"px",height:"0",width:"0",zIndex:_8.zIndex||(s.zIndex||0),border:"0 solid "+_14,fontSize:"0",visibility:"hidden"};
+var _1b=[{},{top:_b["top"],left:_b["left"]}];
+var _1c={left:[_6,_5,_4,_7,_2,_3,"end"+_3+"Min",_6,"end"+_3+"Max"],right:[_5,_6,_4,_7,_2,_3,"end"+_3+"Min",_6,"end"+_3+"Max"],top:[_4,_7,_6,_5,_3,_2,"end"+_2+"Min",_4,"end"+_2+"Max"],bottom:[_7,_4,_6,_5,_3,_2,"end"+_2+"Min",_4,"end"+_2+"Max"]};
+pn=_1c[dir];
+if(typeof _17!="undefined"){
+_17=Math.max(0,Math.min(1,_17))/2;
+_13=0.4+(0.5-_17);
 }else{
-_17=Math.min(0.9,Math.max(0.4,_c[pn[5].toLowerCase()]/_c[pn[4].toLowerCase()]));
+_13=Math.min(0.9,Math.max(0.4,_b[pn[5].toLowerCase()]/_b[pn[4].toLowerCase()]));
 }
-var p0=_21[0];
+var p0=_1b[0];
 for(var i=4;i<6;i++){
-if(_1a=="center"||_1a=="cube"){
-_c["end"+pn[i]+"Min"]=_c[pn[i].toLowerCase()]*_17;
-_c["end"+pn[i]+"Max"]=_c[pn[i].toLowerCase()]/_17;
+if(_16=="center"||_16=="cube"){
+_b["end"+pn[i]+"Min"]=_b[pn[i].toLowerCase()]*_13;
+_b["end"+pn[i]+"Max"]=_b[pn[i].toLowerCase()]/_13;
 }else{
-if(_1a=="shortside"){
-_c["end"+pn[i]+"Min"]=_c[pn[i].toLowerCase()];
-_c["end"+pn[i]+"Max"]=_c[pn[i].toLowerCase()]/_17;
+if(_16=="shortside"){
+_b["end"+pn[i]+"Min"]=_b[pn[i].toLowerCase()];
+_b["end"+pn[i]+"Max"]=_b[pn[i].toLowerCase()]/_13;
 }else{
-if(_1a=="longside"){
-_c["end"+pn[i]+"Min"]=_c[pn[i].toLowerCase()]*_17;
-_c["end"+pn[i]+"Max"]=_c[pn[i].toLowerCase()];
+if(_16=="longside"){
+_b["end"+pn[i]+"Min"]=_b[pn[i].toLowerCase()]*_13;
+_b["end"+pn[i]+"Max"]=_b[pn[i].toLowerCase()];
 }
 }
 }
 }
-if(_1a=="center"){
-p0[pn[2].toLowerCase()]=_c[pn[2].toLowerCase()]-(_c[pn[8]]-_c[pn[6]])/4;
+if(_16=="center"){
+p0[pn[2].toLowerCase()]=_b[pn[2].toLowerCase()]-(_b[pn[8]]-_b[pn[6]])/4;
 }else{
-if(_1a=="shortside"){
-p0[pn[2].toLowerCase()]=_c[pn[2].toLowerCase()]-(_c[pn[8]]-_c[pn[6]])/2;
+if(_16=="shortside"){
+p0[pn[2].toLowerCase()]=_b[pn[2].toLowerCase()]-(_b[pn[8]]-_b[pn[6]])/2;
 }
 }
-_13[pn[5].toLowerCase()]=_c[pn[5].toLowerCase()]+"px";
-_13[pn[4].toLowerCase()]="0";
-_13[_1+pn[1]+_2]=_c[pn[4].toLowerCase()]+"px";
-_13[_1+pn[1]+"Color"]=_11;
+_10[pn[5].toLowerCase()]=_b[pn[5].toLowerCase()]+"px";
+_10[pn[4].toLowerCase()]="0";
+_10[_1+pn[1]+_2]=_b[pn[4].toLowerCase()]+"px";
+_10[_1+pn[1]+"Color"]=_e;
 p0[_1+pn[1]+_2]=0;
-p0[_1+pn[1]+"Color"]=_10;
-p0[_1+pn[2]+_2]=p0[_1+pn[3]+_2]=_1a!="cube"?(_c["end"+pn[5]+"Max"]-_c["end"+pn[5]+"Min"])/2:_c[pn[6]]/2;
-p0[pn[7].toLowerCase()]=_c[pn[7].toLowerCase()]+_c[pn[4].toLowerCase()]/2+(_8.shift||0);
-p0[pn[5].toLowerCase()]=_c[pn[6]];
-var p1=_21[1];
-p1[_1+pn[0]+"Color"]={start:_f,end:_12};
-p1[_1+pn[0]+_2]=_c[pn[4].toLowerCase()];
+p0[_1+pn[1]+"Color"]=_d;
+p0[_1+pn[2]+_2]=p0[_1+pn[3]+_2]=_16!="cube"?(_b["end"+pn[5]+"Max"]-_b["end"+pn[5]+"Min"])/2:_b[pn[6]]/2;
+p0[pn[7].toLowerCase()]=_b[pn[7].toLowerCase()]+_b[pn[4].toLowerCase()]/2+(_8.shift||0);
+p0[pn[5].toLowerCase()]=_b[pn[6]];
+var p1=_1b[1];
+p1[_1+pn[0]+"Color"]={start:_c,end:_f};
+p1[_1+pn[0]+_2]=_b[pn[4].toLowerCase()];
 p1[_1+pn[2]+_2]=0;
 p1[_1+pn[3]+_2]=0;
-p1[pn[5].toLowerCase()]={start:_c[pn[6]],end:_c[pn[5].toLowerCase()]};
-dojo.mixin(hs,_13);
+p1[pn[5].toLowerCase()]={start:_b[pn[6]],end:_b[pn[5].toLowerCase()]};
+dojo.mixin(hs,_10);
 dojo.style(_9,hs);
 dojo.body().appendChild(_9);
-var _26=function(){
+var _1d=function(){
 dojo.destroy(_9);
-s.backgroundColor=_12;
+s.backgroundColor=_f;
 s.visibility="visible";
 };
-if(_19=="last"){
+if(_15=="last"){
 for(i in p0){
 p0[i]={start:p0[i]};
 }
-p0[_1+pn[1]+"Color"]={start:_10,end:_12};
+p0[_1+pn[1]+"Color"]={start:_d,end:_f};
 p1=p0;
 }
-if(!_19||_19=="first"){
-_14.push(dojo.animateProperty({node:_9,duration:_15,properties:p0}));
+if(!_15||_15=="first"){
+_11.push(dojo.animateProperty({node:_9,duration:_12,properties:p0}));
 }
-if(!_19||_19=="last"){
-_14.push(dojo.animateProperty({node:_9,duration:_15,properties:p1,onEnd:_26}));
+if(!_15||_15=="last"){
+_11.push(dojo.animateProperty({node:_9,duration:_12,properties:p1,onEnd:_1d}));
 }
-dojo.connect(_14[0],"play",function(){
+dojo.connect(_11[0],"play",function(){
 _9.style.visibility="visible";
 s.visibility="hidden";
 });
-return dojo.fx.chain(_14);
+return dojo.fx.chain(_11);
 };
-dojox.fx.flipCube=function(_27){
-var _28=[],mb=dojo.marginBox(_27.node),_2a=mb.w/2,_2b=mb.h/2,_2c={top:{pName:"height",args:[{whichAnim:"first",dir:"top",shift:-_2b},{whichAnim:"last",dir:"bottom",shift:_2b}]},right:{pName:"width",args:[{whichAnim:"first",dir:"right",shift:_2a},{whichAnim:"last",dir:"left",shift:-_2a}]},bottom:{pName:"height",args:[{whichAnim:"first",dir:"bottom",shift:_2b},{whichAnim:"last",dir:"top",shift:-_2b}]},left:{pName:"width",args:[{whichAnim:"first",dir:"left",shift:-_2a},{whichAnim:"last",dir [...]
-var d=_2c[_27.dir||"left"],p=d.args;
-_27.duration=_27.duration?_27.duration*2:500;
-_27.depth=0.8;
-_27.axis="cube";
+dojox.fx.flipCube=function(_1e){
+var _1f=[],mb=dojo.marginBox(_1e.node),_20=mb.w/2,_21=mb.h/2,_22={top:{pName:"height",args:[{whichAnim:"first",dir:"top",shift:-_21},{whichAnim:"last",dir:"bottom",shift:_21}]},right:{pName:"width",args:[{whichAnim:"first",dir:"right",shift:_20},{whichAnim:"last",dir:"left",shift:-_20}]},bottom:{pName:"height",args:[{whichAnim:"first",dir:"bottom",shift:_21},{whichAnim:"last",dir:"top",shift:-_21}]},left:{pName:"width",args:[{whichAnim:"first",dir:"left",shift:-_20},{whichAnim:"last",dir [...]
+var d=_22[_1e.dir||"left"],p=d.args;
+_1e.duration=_1e.duration?_1e.duration*2:500;
+_1e.depth=0.8;
+_1e.axis="cube";
 for(var i=p.length-1;i>=0;i--){
-dojo.mixin(_27,p[i]);
-_28.push(dojox.fx.flip(_27));
+dojo.mixin(_1e,p[i]);
+_1f.push(dojox.fx.flip(_1e));
 }
-return dojo.fx.combine(_28);
+return dojo.fx.combine(_1f);
 };
-dojox.fx.flipPage=function(_30){
-var n=_30.node,_32=dojo.coords(n,true),x=_32.x,y=_32.y,w=_32.w,h=_32.h,_37=dojo.style(n,"backgroundColor"),_38=_30.lightColor||"#dddddd",_39=_30.darkColor,_3a=dojo.create("div"),_3b=[],hn=[],dir=_30.dir||"right",pn={left:["left","right","x","w"],top:["top","bottom","y","h"],right:["left","left","x","w"],bottom:["top","top","y","h"]},_3f={right:[1,-1],left:[-1,1],top:[-1,1],bottom:[1,-1]};
-dojo.style(_3a,{position:"absolute",width:w+"px",height:h+"px",top:y+"px",left:x+"px",visibility:"hidden"});
+dojox.fx.flipPage=function(_23){
+var n=_23.node,_24=dojo.coords(n,true),x=_24.x,y=_24.y,w=_24.w,h=_24.h,_25=dojo.style(n,"backgroundColor"),_26=_23.lightColor||"#dddddd",_27=_23.darkColor,_28=dojo.create("div"),_29=[],hn=[],dir=_23.dir||"right",pn={left:["left","right","x","w"],top:["top","bottom","y","h"],right:["left","left","x","w"],bottom:["top","top","y","h"]},_2a={right:[1,-1],left:[-1,1],top:[-1,1],bottom:[1,-1]};
+dojo.style(_28,{position:"absolute",width:w+"px",height:h+"px",top:y+"px",left:x+"px",visibility:"hidden"});
 var hs=[];
 for(var i=0;i<2;i++){
-var r=i%2,d=r?pn[dir][1]:dir,wa=r?"last":"first",_45=r?_37:_38,_46=r?_45:_30.startColor||n.style.backgroundColor;
-hn[i]=dojo.clone(_3a);
-var _47=function(x){
+var r=i%2,d=r?pn[dir][1]:dir,wa=r?"last":"first",_2b=r?_25:_26,_2c=r?_2b:_23.startColor||n.style.backgroundColor;
+hn[i]=dojo.clone(_28);
+var _2d=function(x){
 return function(){
 dojo.destroy(hn[x]);
 };
 }(i);
 dojo.body().appendChild(hn[i]);
-hs[i]={backgroundColor:r?_46:_37};
-hs[i][pn[dir][0]]=_32[pn[dir][2]]+_3f[dir][0]*i*_32[pn[dir][3]]+"px";
+hs[i]={backgroundColor:r?_2c:_25};
+hs[i][pn[dir][0]]=_24[pn[dir][2]]+_2a[dir][0]*i*_24[pn[dir][3]]+"px";
 dojo.style(hn[i],hs[i]);
-_3b.push(dojox.fx.flip({node:hn[i],dir:d,axis:"shortside",depth:_30.depth,duration:_30.duration/2,shift:_3f[dir][i]*_32[pn[dir][3]]/2,darkColor:_39,lightColor:_38,whichAnim:wa,endColor:_45}));
-dojo.connect(_3b[i],"onEnd",_47);
+_29.push(dojox.fx.flip({node:hn[i],dir:d,axis:"shortside",depth:_23.depth,duration:_23.duration/2,shift:_2a[dir][i]*_24[pn[dir][3]]/2,darkColor:_27,lightColor:_26,whichAnim:wa,endColor:_2b}));
+dojo.connect(_29[i],"onEnd",_2d);
 }
-return dojo.fx.chain(_3b);
+return dojo.fx.chain(_29);
 };
-dojox.fx.flipGrid=function(_49){
-var _4a=_49.rows||4,_4b=_49.cols||4,_4c=[],_4d=dojo.create("div"),n=_49.node,_4f=dojo.coords(n,true),x=_4f.x,y=_4f.y,nw=_4f.w,nh=_4f.h,w=_4f.w/_4b,h=_4f.h/_4a,_56=[];
-dojo.style(_4d,{position:"absolute",width:w+"px",height:h+"px",backgroundColor:dojo.style(n,"backgroundColor")});
-for(var i=0;i<_4a;i++){
-var r=i%2,d=r?"right":"left",_5a=r?1:-1;
+dojox.fx.flipGrid=function(_2e){
+var _2f=_2e.rows||4,_30=_2e.cols||4,_31=[],_32=dojo.create("div"),n=_2e.node,_33=dojo.coords(n,true),x=_33.x,y=_33.y,nw=_33.w,nh=_33.h,w=_33.w/_30,h=_33.h/_2f,_34=[];
+dojo.style(_32,{position:"absolute",width:w+"px",height:h+"px",backgroundColor:dojo.style(n,"backgroundColor")});
+for(var i=0;i<_2f;i++){
+var r=i%2,d=r?"right":"left",_35=r?1:-1;
 var cn=dojo.clone(n);
 dojo.style(cn,{position:"absolute",width:nw+"px",height:nh+"px",top:y+"px",left:x+"px",clip:"rect("+i*h+"px,"+nw+"px,"+nh+"px,0)"});
 dojo.body().appendChild(cn);
-_4c[i]=[];
-for(var j=0;j<_4b;j++){
-var hn=dojo.clone(_4d),l=r?j:_4b-(j+1);
-var _5f=function(xn,_61,_62){
+_31[i]=[];
+for(var j=0;j<_30;j++){
+var hn=dojo.clone(_32),l=r?j:_30-(j+1);
+var _36=function(xn,_37,_38){
 return function(){
-if(!(_61%2)){
-dojo.style(xn,{clip:"rect("+_61*h+"px,"+(nw-(_62+1)*w)+"px,"+((_61+1)*h)+"px,0px)"});
+if(!(_37%2)){
+dojo.style(xn,{clip:"rect("+_37*h+"px,"+(nw-(_38+1)*w)+"px,"+((_37+1)*h)+"px,0px)"});
 }else{
-dojo.style(xn,{clip:"rect("+_61*h+"px,"+nw+"px,"+((_61+1)*h)+"px,"+((_62+1)*w)+"px)"});
+dojo.style(xn,{clip:"rect("+_37*h+"px,"+nw+"px,"+((_37+1)*h)+"px,"+((_38+1)*w)+"px)"});
 }
 };
 }(cn,i,j);
 dojo.body().appendChild(hn);
 dojo.style(hn,{left:x+l*w+"px",top:y+i*h+"px",visibility:"hidden"});
-var a=dojox.fx.flipPage({node:hn,dir:d,duration:_49.duration||900,shift:_5a*w/2,depth:0.2,darkColor:_49.darkColor,lightColor:_49.lightColor,startColor:_49.startColor||_49.node.style.backgroundColor}),_64=function(xn){
+var a=dojox.fx.flipPage({node:hn,dir:d,duration:_2e.duration||900,shift:_35*w/2,depth:0.2,darkColor:_2e.darkColor,lightColor:_2e.lightColor,startColor:_2e.startColor||_2e.node.style.backgroundColor}),_39=function(xn){
 return function(){
 dojo.destroy(xn);
 };
 }(hn);
-dojo.connect(a,"play",this,_5f);
-dojo.connect(a,"play",this,_64);
-_4c[i].push(a);
+dojo.connect(a,"play",this,_36);
+dojo.connect(a,"play",this,_39);
+_31[i].push(a);
 }
-_56.push(dojo.fx.chain(_4c[i]));
+_34.push(dojo.fx.chain(_31[i]));
 }
-dojo.connect(_56[0],"play",function(){
+dojo.connect(_34[0],"play",function(){
 dojo.style(n,{visibility:"hidden"});
 });
-return dojo.fx.combine(_56);
+return dojo.fx.combine(_34);
 };
 })();
 }
diff --git a/dojox/fx/scroll.js b/dojox/fx/scroll.js
index 178f1c7..9368372 100644
--- a/dojox/fx/scroll.js
+++ b/dojox/fx/scroll.js
@@ -21,7 +21,7 @@ _1.win.scrollTo(_4[0],_4[1]);
 _1.win.scrollLeft=_5[0];
 _1.win.scrollTop=_5[1];
 });
-var _6=new dojo._Animation(dojo.mixin({beforeBegin:function(){
+var _6=new dojo.Animation(dojo.mixin({beforeBegin:function(){
 if(this.curve){
 delete this.curve;
 }
diff --git a/dojox/fx/split.js b/dojox/fx/split.js
index b780b8e..c0909f1 100644
--- a/dojox/fx/split.js
+++ b/dojox/fx/split.js
@@ -14,304 +14,305 @@ dojo.mixin(dojox.fx,{_split:function(_1){
 _1.rows=_1.rows||3;
 _1.columns=_1.columns||3;
 _1.duration=_1.duration||1000;
-var _2=_1.node=dojo.byId(_1.node),_3=dojo.coords(_2,true),_4=Math.ceil(_3.h/_1.rows),_5=Math.ceil(_3.w/_1.columns),_6=dojo.create(_2.tagName),_7=[],_8=dojo.create(_2.tagName),_9;
-dojo.style(_6,{position:"absolute",padding:"0",margin:"0",border:"none",top:_3.y+"px",left:_3.x+"px",height:_3.h+"px",width:_3.w+"px",background:"none",overflow:_1.crop?"hidden":"visible"});
-_2.parentNode.appendChild(_6);
-dojo.style(_8,{position:"absolute",border:"none",padding:"0",margin:"0",height:_4+"px",width:_5+"px",overflow:"hidden"});
-for(var y=0;y<_1.rows;y++){
-for(var x=0;x<_1.columns;x++){
-_9=dojo.clone(_8);
-var _c=dojo.clone(_2);
-_c.style.filter="";
-dojo.style(_9,{border:"none",overflow:"hidden",top:(_4*y)+"px",left:(_5*x)+"px"});
-dojo.style(_c,{position:"static",opacity:"1",marginTop:(-y*_4)+"px",marginLeft:(-x*_5)+"px"});
-_9.appendChild(_c);
-_6.appendChild(_9);
-var _d=_1.pieceAnimation(_9,x,y,_3);
-if(dojo.isArray(_d)){
-_7=_7.concat(_d);
+var _2=_1.node=dojo.byId(_1.node),_3=_2.parentNode,_4=_3,_5=dojo.body(),_6="position";
+while(_4&&_4!=_5&&dojo.style(_4,_6)=="static"){
+_4=_4.parentNode;
+}
+var _7=_4!=_5?dojo.position(_4,true):{x:0,y:0},_8=dojo.position(_2,true),_9=dojo.style(_2,"height"),_a=dojo.style(_2,"width"),_b=dojo.style(_2,"borderLeftWidth")+dojo.style(_2,"borderRightWidth"),_c=dojo.style(_2,"borderTopWidth")+dojo.style(_2,"borderBottomWidth"),_d=Math.ceil(_9/_1.rows),_e=Math.ceil(_a/_1.columns),_f=dojo.create(_2.tagName,{style:{position:"absolute",padding:0,margin:0,border:"none",top:_8.y-_7.y+"px",left:_8.x-_7.x+"px",height:_9+_c+"px",width:_a+_b+"px",background:" [...]
+for(var y=0,ly=_1.rows;y<ly;y++){
+for(var x=0,lx=_1.columns;x<lx;x++){
+var _12=dojo.clone(_11),_13=dojo.clone(_2),_14=y*_d,_15=x*_e;
+_13.style.filter="";
+dojo.removeAttr(_13,"id");
+dojo.style(_12,{border:"none",overflow:"hidden",top:_14+"px",left:_15+"px"});
+dojo.style(_13,{position:"static",opacity:"1",marginTop:-_14+"px",marginLeft:-_15+"px"});
+_12.appendChild(_13);
+_f.appendChild(_12);
+var _16=_1.pieceAnimation(_12,x,y,_8);
+if(dojo.isArray(_16)){
+_10=_10.concat(_16);
 }else{
-_7.push(_d);
+_10.push(_16);
 }
 }
 }
-var _e=dojo.fx.combine(_7);
-dojo.connect(_e,"onEnd",_e,function(){
-_6.parentNode.removeChild(_6);
+var _17=dojo.fx.combine(_10);
+dojo.connect(_17,"onEnd",_17,function(){
+_f.parentNode.removeChild(_f);
 });
 if(_1.onPlay){
-dojo.connect(_e,"onPlay",_e,_1.onPlay);
+dojo.connect(_17,"onPlay",_17,_1.onPlay);
 }
 if(_1.onEnd){
-dojo.connect(_e,"onEnd",_e,_1.onEnd);
-}
-return _e;
-},explode:function(_f){
-var _10=_f.node=dojo.byId(_f.node);
-_f.rows=_f.rows||3;
-_f.columns=_f.columns||3;
-_f.distance=_f.distance||1;
-_f.duration=_f.duration||1000;
-_f.random=_f.random||0;
-if(!_f.fade){
-_f.fade=true;
-}
-if(typeof _f.sync=="undefined"){
-_f.sync=true;
-}
-_f.random=Math.abs(_f.random);
-_f.pieceAnimation=function(_11,x,y,_14){
-var _15=_14.h/_f.rows,_16=_14.w/_f.columns,_17=_f.distance*2,_18=_f.duration,ps=_11.style,_1a=parseInt(ps.top),_1b=parseInt(ps.left),_1c=0,_1d=0,_1e=0;
-if(_f.random){
-var _1f=(Math.random()*_f.random)+Math.max(1-_f.random,0);
-_17*=_1f;
-_18*=_1f;
-_1c=((_f.unhide&&_f.sync)||(!_f.unhide&&!_f.sync))?(_f.duration-_18):0;
-_1d=Math.random()-0.5;
-_1e=Math.random()-0.5;
-}
-var _20=((_14.h-_15)/2-_15*y),_21=((_14.w-_16)/2-_16*x),_22=Math.sqrt(Math.pow(_21,2)+Math.pow(_20,2)),_23=parseInt(_1a-_20*_17+_22*_1e),_24=parseInt(_1b-_21*_17+_22*_1d);
-var _25=dojo.animateProperty({node:_11,duration:_18,delay:_1c,easing:(_f.easing||(_f.unhide?dojo.fx.easing.sinOut:dojo.fx.easing.circOut)),beforeBegin:(_f.unhide?function(){
-if(_f.fade){
-dojo.style(_11,{opacity:"0"});
-}
-ps.top=_23+"px";
-ps.left=_24+"px";
-}:undefined),properties:{top:(_f.unhide?{start:_23,end:_1a}:{start:_1a,end:_23}),left:(_f.unhide?{start:_24,end:_1b}:{start:_1b,end:_24})}});
-if(_f.fade){
-var _26=dojo.animateProperty({node:_11,duration:_18,delay:_1c,easing:(_f.fadeEasing||dojo.fx.easing.quadOut),properties:{opacity:(_f.unhide?{start:"0",end:"1"}:{start:"1",end:"0"})}});
-return (_f.unhide?[_26,_25]:[_25,_26]);
+dojo.connect(_17,"onEnd",_17,_1.onEnd);
+}
+return _17;
+},explode:function(_18){
+var _19=_18.node=dojo.byId(_18.node);
+_18.rows=_18.rows||3;
+_18.columns=_18.columns||3;
+_18.distance=_18.distance||1;
+_18.duration=_18.duration||1000;
+_18.random=_18.random||0;
+if(!_18.fade){
+_18.fade=true;
+}
+if(typeof _18.sync=="undefined"){
+_18.sync=true;
+}
+_18.random=Math.abs(_18.random);
+_18.pieceAnimation=function(_1a,x,y,_1b){
+var _1c=_1b.h/_18.rows,_1d=_1b.w/_18.columns,_1e=_18.distance*2,_1f=_18.duration,ps=_1a.style,_20=parseInt(ps.top),_21=parseInt(ps.left),_22=0,_23=0,_24=0;
+if(_18.random){
+var _25=(Math.random()*_18.random)+Math.max(1-_18.random,0);
+_1e*=_25;
+_1f*=_25;
+_22=((_18.unhide&&_18.sync)||(!_18.unhide&&!_18.sync))?(_18.duration-_1f):0;
+_23=Math.random()-0.5;
+_24=Math.random()-0.5;
+}
+var _26=((_1b.h-_1c)/2-_1c*y),_27=((_1b.w-_1d)/2-_1d*x),_28=Math.sqrt(Math.pow(_27,2)+Math.pow(_26,2)),_29=parseInt(_20-_26*_1e+_28*_24),_2a=parseInt(_21-_27*_1e+_28*_23);
+var _2b=dojo.animateProperty({node:_1a,duration:_1f,delay:_22,easing:(_18.easing||(_18.unhide?dojo.fx.easing.sinOut:dojo.fx.easing.circOut)),beforeBegin:(_18.unhide?function(){
+if(_18.fade){
+dojo.style(_1a,{opacity:"0"});
+}
+ps.top=_29+"px";
+ps.left=_2a+"px";
+}:undefined),properties:{top:(_18.unhide?{start:_29,end:_20}:{start:_20,end:_29}),left:(_18.unhide?{start:_2a,end:_21}:{start:_21,end:_2a})}});
+if(_18.fade){
+var _2c=dojo.animateProperty({node:_1a,duration:_1f,delay:_22,easing:(_18.fadeEasing||dojo.fx.easing.quadOut),properties:{opacity:(_18.unhide?{start:"0",end:"1"}:{start:"1",end:"0"})}});
+return (_18.unhide?[_2c,_2b]:[_2b,_2c]);
 }else{
-return _25;
+return _2b;
 }
 };
-var _27=dojox.fx._split(_f);
-if(_f.unhide){
-dojo.connect(_27,"onEnd",null,function(){
-dojo.style(_10,{opacity:"1"});
+var _2d=dojox.fx._split(_18);
+if(_18.unhide){
+dojo.connect(_2d,"onEnd",null,function(){
+dojo.style(_19,{opacity:"1"});
 });
 }else{
-dojo.connect(_27,"onPlay",null,function(){
-dojo.style(_10,{opacity:"0"});
+dojo.connect(_2d,"onPlay",null,function(){
+dojo.style(_19,{opacity:"0"});
 });
 }
-return _27;
-},converge:function(_28){
-_28.unhide=true;
-return dojox.fx.explode(_28);
-},disintegrate:function(_29){
-var _2a=_29.node=dojo.byId(_29.node);
-_29.rows=_29.rows||5;
-_29.columns=_29.columns||5;
-_29.duration=_29.duration||1500;
-_29.interval=_29.interval||_29.duration/(_29.rows+_29.columns*2);
-_29.distance=_29.distance||1.5;
-_29.random=_29.random||0;
-if(typeof _29.fade=="undefined"){
-_29.fade=true;
-}
-var _2b=Math.abs(_29.random),_2c=_29.duration-(_29.rows+_29.columns)*_29.interval;
-_29.pieceAnimation=function(_2d,x,y,_30){
-var _31=Math.random()*(_29.rows+_29.columns)*_29.interval,ps=_2d.style,_33=(_29.reverseOrder||_29.distance<0)?((x+y)*_29.interval):(((_29.rows+_29.columns)-(x+y))*_29.interval),_34=_31*_2b+Math.max(1-_2b,0)*_33,_35={};
-if(_29.unhide){
-_35.top={start:(parseInt(ps.top)-_30.h*_29.distance),end:parseInt(ps.top)};
-if(_29.fade){
-_35.opacity={start:"0",end:"1"};
+return _2d;
+},converge:function(_2e){
+_2e.unhide=true;
+return dojox.fx.explode(_2e);
+},disintegrate:function(_2f){
+var _30=_2f.node=dojo.byId(_2f.node);
+_2f.rows=_2f.rows||5;
+_2f.columns=_2f.columns||5;
+_2f.duration=_2f.duration||1500;
+_2f.interval=_2f.interval||_2f.duration/(_2f.rows+_2f.columns*2);
+_2f.distance=_2f.distance||1.5;
+_2f.random=_2f.random||0;
+if(typeof _2f.fade=="undefined"){
+_2f.fade=true;
+}
+var _31=Math.abs(_2f.random),_32=_2f.duration-(_2f.rows+_2f.columns)*_2f.interval;
+_2f.pieceAnimation=function(_33,x,y,_34){
+var _35=Math.random()*(_2f.rows+_2f.columns)*_2f.interval,ps=_33.style,_36=(_2f.reverseOrder||_2f.distance<0)?((x+y)*_2f.interval):(((_2f.rows+_2f.columns)-(x+y))*_2f.interval),_37=_35*_31+Math.max(1-_31,0)*_36,_38={};
+if(_2f.unhide){
+_38.top={start:(parseInt(ps.top)-_34.h*_2f.distance),end:parseInt(ps.top)};
+if(_2f.fade){
+_38.opacity={start:"0",end:"1"};
 }
 }else{
-_35.top={end:(parseInt(ps.top)+_30.h*_29.distance)};
-if(_29.fade){
-_35.opacity={end:"0"};
+_38.top={end:(parseInt(ps.top)+_34.h*_2f.distance)};
+if(_2f.fade){
+_38.opacity={end:"0"};
 }
 }
-var _36=dojo.animateProperty({node:_2d,duration:_2c,delay:_34,easing:(_29.easing||(_29.unhide?dojo.fx.easing.sinIn:dojo.fx.easing.circIn)),properties:_35,beforeBegin:(_29.unhide?function(){
-if(_29.fade){
-dojo.style(_2d,{opacity:"0"});
+var _39=dojo.animateProperty({node:_33,duration:_32,delay:_37,easing:(_2f.easing||(_2f.unhide?dojo.fx.easing.sinIn:dojo.fx.easing.circIn)),properties:_38,beforeBegin:(_2f.unhide?function(){
+if(_2f.fade){
+dojo.style(_33,{opacity:"0"});
 }
-ps.top=_35.top.start+"px";
+ps.top=_38.top.start+"px";
 }:undefined)});
-return _36;
+return _39;
 };
-var _37=dojox.fx._split(_29);
-if(_29.unhide){
-dojo.connect(_37,"onEnd",_37,function(){
-dojo.style(_2a,{opacity:"1"});
+var _3a=dojox.fx._split(_2f);
+if(_2f.unhide){
+dojo.connect(_3a,"onEnd",_3a,function(){
+dojo.style(_30,{opacity:"1"});
 });
 }else{
-dojo.connect(_37,"onPlay",_37,function(){
-dojo.style(_2a,{opacity:"0"});
+dojo.connect(_3a,"onPlay",_3a,function(){
+dojo.style(_30,{opacity:"0"});
 });
 }
-return _37;
-},build:function(_38){
-_38.unhide=true;
-return dojox.fx.disintegrate(_38);
-},shear:function(_39){
-var _3a=_39.node=dojo.byId(_39.node);
-_39.rows=_39.rows||6;
-_39.columns=_39.columns||6;
-_39.duration=_39.duration||1000;
-_39.interval=_39.interval||0;
-_39.distance=_39.distance||1;
-_39.random=_39.random||0;
-if(typeof (_39.fade)=="undefined"){
-_39.fade=true;
-}
-var _3b=Math.abs(_39.random),_3c=(_39.duration-(_39.rows+_39.columns)*Math.abs(_39.interval));
-_39.pieceAnimation=function(_3d,x,y,_40){
-var _41=!(x%2),_42=!(y%2),_43=Math.random()*_3c,_44=(_39.reverseOrder)?(((_39.rows+_39.columns)-(x+y))*_39.interval):((x+y)*_39.interval),_45=_43*_3b+Math.max(1-_3b,0)*_44,_46={},ps=_3d.style;
-if(_39.fade){
-_46.opacity=(_39.unhide?{start:"0",end:"1"}:{end:"0"});
-}
-if(_39.columns==1){
-_41=_42;
+return _3a;
+},build:function(_3b){
+_3b.unhide=true;
+return dojox.fx.disintegrate(_3b);
+},shear:function(_3c){
+var _3d=_3c.node=dojo.byId(_3c.node);
+_3c.rows=_3c.rows||6;
+_3c.columns=_3c.columns||6;
+_3c.duration=_3c.duration||1000;
+_3c.interval=_3c.interval||0;
+_3c.distance=_3c.distance||1;
+_3c.random=_3c.random||0;
+if(typeof (_3c.fade)=="undefined"){
+_3c.fade=true;
+}
+var _3e=Math.abs(_3c.random),_3f=(_3c.duration-(_3c.rows+_3c.columns)*Math.abs(_3c.interval));
+_3c.pieceAnimation=function(_40,x,y,_41){
+var _42=!(x%2),_43=!(y%2),_44=Math.random()*_3f,_45=(_3c.reverseOrder)?(((_3c.rows+_3c.columns)-(x+y))*_3c.interval):((x+y)*_3c.interval),_46=_44*_3e+Math.max(1-_3e,0)*_45,_47={},ps=_40.style;
+if(_3c.fade){
+_47.opacity=(_3c.unhide?{start:"0",end:"1"}:{end:"0"});
+}
+if(_3c.columns==1){
+_42=_43;
 }else{
-if(_39.rows==1){
-_42=!_41;
+if(_3c.rows==1){
+_43=!_42;
 }
 }
-var _48=parseInt(ps.left),top=parseInt(ps.top),_4a=_39.distance*_40.w,_4b=_39.distance*_40.h;
-if(_39.unhide){
-if(_41==_42){
-_46.left=_41?{start:(_48-_4a),end:_48}:{start:(_48+_4a),end:_48};
+var _48=parseInt(ps.left),top=parseInt(ps.top),_49=_3c.distance*_41.w,_4a=_3c.distance*_41.h;
+if(_3c.unhide){
+if(_42==_43){
+_47.left=_42?{start:(_48-_49),end:_48}:{start:(_48+_49),end:_48};
 }else{
-_46.top=_41?{start:(top+_4b),end:top}:{start:(top-_4b),end:top};
+_47.top=_42?{start:(top+_4a),end:top}:{start:(top-_4a),end:top};
 }
 }else{
-if(_41==_42){
-_46.left=_41?{end:(_48-_4a)}:{end:(_48+_4a)};
+if(_42==_43){
+_47.left=_42?{end:(_48-_49)}:{end:(_48+_49)};
 }else{
-_46.top=_41?{end:(top+_4b)}:{end:(top-_4b)};
+_47.top=_42?{end:(top+_4a)}:{end:(top-_4a)};
 }
 }
-var _4c=dojo.animateProperty({node:_3d,duration:_3c,delay:_45,easing:(_39.easing||dojo.fx.easing.sinInOut),properties:_46,beforeBegin:(_39.unhide?function(){
-if(_39.fade){
+var _4b=dojo.animateProperty({node:_40,duration:_3f,delay:_46,easing:(_3c.easing||dojo.fx.easing.sinInOut),properties:_47,beforeBegin:(_3c.unhide?function(){
+if(_3c.fade){
 ps.opacity="0";
 }
-if(_41==_42){
-ps.left=_46.left.start+"px";
+if(_42==_43){
+ps.left=_47.left.start+"px";
 }else{
-ps.top=_46.top.start+"px";
+ps.top=_47.top.start+"px";
 }
 }:undefined)});
-return _4c;
+return _4b;
 };
-var _4d=dojox.fx._split(_39);
-if(_39.unhide){
-dojo.connect(_4d,"onEnd",_4d,function(){
-dojo.style(_3a,{opacity:"1"});
+var _4c=dojox.fx._split(_3c);
+if(_3c.unhide){
+dojo.connect(_4c,"onEnd",_4c,function(){
+dojo.style(_3d,{opacity:"1"});
 });
 }else{
-dojo.connect(_4d,"onPlay",_4d,function(){
-dojo.style(_3a,{opacity:"0"});
+dojo.connect(_4c,"onPlay",_4c,function(){
+dojo.style(_3d,{opacity:"0"});
 });
 }
-return _4d;
-},unShear:function(_4e){
-_4e.unhide=true;
-return dojox.fx.shear(_4e);
-},pinwheel:function(_4f){
-var _50=_4f.node=dojo.byId(_4f.node);
-_4f.rows=_4f.rows||4;
-_4f.columns=_4f.columns||4;
-_4f.duration=_4f.duration||1000;
-_4f.interval=_4f.interval||0;
-_4f.distance=_4f.distance||1;
-_4f.random=_4f.random||0;
-if(typeof _4f.fade=="undefined"){
-_4f.fade=true;
-}
-var _51=(_4f.duration-(_4f.rows+_4f.columns)*Math.abs(_4f.interval));
-_4f.pieceAnimation=function(_52,x,y,_55){
-var _56=_55.h/_4f.rows,_57=_55.w/_4f.columns,_58=!(x%2),_59=!(y%2),_5a=Math.random()*_51,_5b=(_4f.interval<0)?(((_4f.rows+_4f.columns)-(x+y))*_4f.interval*-1):((x+y)*_4f.interval),_5c=_5a*_4f.random+Math.max(1-_4f.random,0)*_5b,_5d={},ps=_52.style;
-if(_4f.fade){
-_5d.opacity=(_4f.unhide?{start:0,end:1}:{end:0});
-}
-if(_4f.columns==1){
-_58=!_59;
+return _4c;
+},unShear:function(_4d){
+_4d.unhide=true;
+return dojox.fx.shear(_4d);
+},pinwheel:function(_4e){
+var _4f=_4e.node=dojo.byId(_4e.node);
+_4e.rows=_4e.rows||4;
+_4e.columns=_4e.columns||4;
+_4e.duration=_4e.duration||1000;
+_4e.interval=_4e.interval||0;
+_4e.distance=_4e.distance||1;
+_4e.random=_4e.random||0;
+if(typeof _4e.fade=="undefined"){
+_4e.fade=true;
+}
+var _50=(_4e.duration-(_4e.rows+_4e.columns)*Math.abs(_4e.interval));
+_4e.pieceAnimation=function(_51,x,y,_52){
+var _53=_52.h/_4e.rows,_54=_52.w/_4e.columns,_55=!(x%2),_56=!(y%2),_57=Math.random()*_50,_58=(_4e.interval<0)?(((_4e.rows+_4e.columns)-(x+y))*_4e.interval*-1):((x+y)*_4e.interval),_59=_57*_4e.random+Math.max(1-_4e.random,0)*_58,_5a={},ps=_51.style;
+if(_4e.fade){
+_5a.opacity=(_4e.unhide?{start:0,end:1}:{end:0});
+}
+if(_4e.columns==1){
+_55=!_56;
 }else{
-if(_4f.rows==1){
-_59=_58;
+if(_4e.rows==1){
+_56=_55;
 }
 }
-var _5f=parseInt(ps.left),top=parseInt(ps.top);
-if(_58){
-if(_59){
-_5d.top=_4f.unhide?{start:top+_56*_4f.distance,end:top}:{start:top,end:top+_56*_4f.distance};
+var _5b=parseInt(ps.left),top=parseInt(ps.top);
+if(_55){
+if(_56){
+_5a.top=_4e.unhide?{start:top+_53*_4e.distance,end:top}:{start:top,end:top+_53*_4e.distance};
 }else{
-_5d.left=_4f.unhide?{start:_5f+_57*_4f.distance,end:_5f}:{start:_5f,end:_5f+_57*_4f.distance};
+_5a.left=_4e.unhide?{start:_5b+_54*_4e.distance,end:_5b}:{start:_5b,end:_5b+_54*_4e.distance};
 }
 }
-if(_58!=_59){
-_5d.width=_4f.unhide?{start:_57*(1-_4f.distance),end:_57}:{start:_57,end:_57*(1-_4f.distance)};
+if(_55!=_56){
+_5a.width=_4e.unhide?{start:_54*(1-_4e.distance),end:_54}:{start:_54,end:_54*(1-_4e.distance)};
 }else{
-_5d.height=_4f.unhide?{start:_56*(1-_4f.distance),end:_56}:{start:_56,end:_56*(1-_4f.distance)};
+_5a.height=_4e.unhide?{start:_53*(1-_4e.distance),end:_53}:{start:_53,end:_53*(1-_4e.distance)};
 }
-var _61=dojo.animateProperty({node:_52,duration:_51,delay:_5c,easing:(_4f.easing||dojo.fx.easing.sinInOut),properties:_5d,beforeBegin:(_4f.unhide?function(){
-if(_4f.fade){
-dojo.style(_52,"opacity",0);
+var _5c=dojo.animateProperty({node:_51,duration:_50,delay:_59,easing:(_4e.easing||dojo.fx.easing.sinInOut),properties:_5a,beforeBegin:(_4e.unhide?function(){
+if(_4e.fade){
+dojo.style(_51,"opacity",0);
 }
-if(_58){
-if(_59){
-ps.top=(top+_56*(1-_4f.distance))+"px";
+if(_55){
+if(_56){
+ps.top=(top+_53*(1-_4e.distance))+"px";
 }else{
-ps.left=(_5f+_57*(1-_4f.distance))+"px";
+ps.left=(_5b+_54*(1-_4e.distance))+"px";
 }
 }else{
-ps.left=_5f+"px";
+ps.left=_5b+"px";
 ps.top=top+"px";
 }
-if(_58!=_59){
-ps.width=(_57*(1-_4f.distance))+"px";
+if(_55!=_56){
+ps.width=(_54*(1-_4e.distance))+"px";
 }else{
-ps.height=(_56*(1-_4f.distance))+"px";
+ps.height=(_53*(1-_4e.distance))+"px";
 }
 }:undefined)});
-return _61;
+return _5c;
 };
-var _62=dojox.fx._split(_4f);
-if(_4f.unhide){
-dojo.connect(_62,"onEnd",_62,function(){
-dojo.style(_50,{opacity:"1"});
+var _5d=dojox.fx._split(_4e);
+if(_4e.unhide){
+dojo.connect(_5d,"onEnd",_5d,function(){
+dojo.style(_4f,{opacity:"1"});
 });
 }else{
-dojo.connect(_62,"play",_62,function(){
-dojo.style(_50,{opacity:"0"});
+dojo.connect(_5d,"play",_5d,function(){
+dojo.style(_4f,{opacity:"0"});
 });
 }
-return _62;
-},unPinwheel:function(_63){
-_63.unhide=true;
-return dojox.fx.pinwheel(_63);
-},blockFadeOut:function(_64){
-var _65=_64.node=dojo.byId(_64.node);
-_64.rows=_64.rows||5;
-_64.columns=_64.columns||5;
-_64.duration=_64.duration||1000;
-_64.interval=_64.interval||_64.duration/(_64.rows+_64.columns*2);
-_64.random=_64.random||0;
-var _66=Math.abs(_64.random),_67=_64.duration-(_64.rows+_64.columns)*_64.interval;
-_64.pieceAnimation=function(_68,x,y,_6b){
-var _6c=Math.random()*_64.duration,_6d=(_64.reverseOrder)?(((_64.rows+_64.columns)-(x+y))*Math.abs(_64.interval)):((x+y)*_64.interval),_6e=_6c*_66+Math.max(1-_66,0)*_6d,_6f=dojo.animateProperty({node:_68,duration:_67,delay:_6e,easing:(_64.easing||dojo.fx.easing.sinInOut),properties:{opacity:(_64.unhide?{start:"0",end:"1"}:{start:"1",end:"0"})},beforeBegin:(_64.unhide?function(){
-dojo.style(_68,{opacity:"0"});
+return _5d;
+},unPinwheel:function(_5e){
+_5e.unhide=true;
+return dojox.fx.pinwheel(_5e);
+},blockFadeOut:function(_5f){
+var _60=_5f.node=dojo.byId(_5f.node);
+_5f.rows=_5f.rows||5;
+_5f.columns=_5f.columns||5;
+_5f.duration=_5f.duration||1000;
+_5f.interval=_5f.interval||_5f.duration/(_5f.rows+_5f.columns*2);
+_5f.random=_5f.random||0;
+var _61=Math.abs(_5f.random),_62=_5f.duration-(_5f.rows+_5f.columns)*_5f.interval;
+_5f.pieceAnimation=function(_63,x,y,_64){
+var _65=Math.random()*_5f.duration,_66=(_5f.reverseOrder)?(((_5f.rows+_5f.columns)-(x+y))*Math.abs(_5f.interval)):((x+y)*_5f.interval),_67=_65*_61+Math.max(1-_61,0)*_66,_68=dojo.animateProperty({node:_63,duration:_62,delay:_67,easing:(_5f.easing||dojo.fx.easing.sinInOut),properties:{opacity:(_5f.unhide?{start:"0",end:"1"}:{start:"1",end:"0"})},beforeBegin:(_5f.unhide?function(){
+dojo.style(_63,{opacity:"0"});
 }:function(){
-_68.style.filter="";
+_63.style.filter="";
 })});
-return _6f;
+return _68;
 };
-var _70=dojox.fx._split(_64);
-if(_64.unhide){
-dojo.connect(_70,"onEnd",_70,function(){
-dojo.style(_65,{opacity:"1"});
+var _69=dojox.fx._split(_5f);
+if(_5f.unhide){
+dojo.connect(_69,"onEnd",_69,function(){
+dojo.style(_60,{opacity:"1"});
 });
 }else{
-dojo.connect(_70,"onPlay",_70,function(){
-dojo.style(_65,{opacity:"0"});
+dojo.connect(_69,"onPlay",_69,function(){
+dojo.style(_60,{opacity:"0"});
 });
 }
-return _70;
-},blockFadeIn:function(_71){
-_71.unhide=true;
-return dojox.fx.blockFadeOut(_71);
+return _69;
+},blockFadeIn:function(_6a){
+_6a.unhide=true;
+return dojox.fx.blockFadeOut(_6a);
 }});
 }
diff --git a/dojox/fx/style.js b/dojox/fx/style.js
index dd01310..577d49a 100644
--- a/dojox/fx/style.js
+++ b/dojox/fx/style.js
@@ -12,58 +12,58 @@ dojo.experimental("dojox.fx.style");
 dojo.require("dojo.fx");
 (function(){
 var d=dojo;
-var _2=function(_3){
-return d.map(dojox.fx._allowedProperties,function(_4){
-return _3[_4];
+var _1=function(_2){
+return d.map(dojox.fx._allowedProperties,function(_3){
+return _2[_3];
 });
 };
-var _5=function(_6,_7){
-var _8=_6.node=d.byId(_6.node);
-var cs=d.getComputedStyle(_8);
-var _a=_2(cs);
-d[(_7?"addClass":"removeClass")](_8,_6.cssClass);
-var _b=_2(cs);
-d[(_7?"removeClass":"addClass")](_8,_6.cssClass);
-var _c={},i=0;
-d.forEach(dojox.fx._allowedProperties,function(_e){
-if(_a[i]!=_b[i]){
-_c[_e]=parseInt(_b[i]);
+var _4=function(_5,_6,_7){
+_5=d.byId(_5);
+var cs=d.getComputedStyle(_5);
+var _8=_1(cs);
+d[(_7?"addClass":"removeClass")](_5,_6);
+var _9=_1(cs);
+d[(_7?"removeClass":"addClass")](_5,_6);
+var _a={},i=0;
+d.forEach(dojox.fx._allowedProperties,function(_b){
+if(_8[i]!=_9[i]){
+_a[_b]=parseInt(_9[i]);
 }
 i++;
 });
-return _c;
+return _a;
 };
-d.mixin(dojox.fx,{addClass:function(_f){
-var _10=_f.node=d.byId(_f.node);
-var _11=(function(n){
+d.mixin(dojox.fx,{addClass:function(_c,_d,_e){
+_c=d.byId(_c);
+var _f=(function(n){
 return function(){
-d.addClass(n,_f.cssClass);
-n.style.cssText=_13;
+d.addClass(n,_d);
+n.style.cssText=_10;
 };
-})(_10);
-var _14=_5(_f,true);
-var _13=_10.style.cssText;
-var _15=d.animateProperty(d.mixin({properties:_14},_f));
-d.connect(_15,"onEnd",_15,_11);
-return _15;
-},removeClass:function(_16){
-var _17=(_16.node=dojo.byId(_16.node));
-var _18=(function(n){
+})(_c);
+var _11=_4(_c,_d,true);
+var _10=_c.style.cssText;
+var _12=d.animateProperty(d.mixin({node:_c,properties:_11},_e));
+d.connect(_12,"onEnd",_12,_f);
+return _12;
+},removeClass:function(_13,_14,_15){
+_13=d.byId(_13);
+var _16=(function(n){
 return function(){
-d.removeClass(n,_16.cssClass);
-n.style.cssText=_1a;
+d.removeClass(n,_14);
+n.style.cssText=_17;
 };
-})(_17);
-var _1b=_5(_16,false);
-var _1a=_17.style.cssText;
-var _1c=d.animateProperty(d.mixin({properties:_1b},_16));
-d.connect(_1c,"onEnd",_1c,_18);
-return _1c;
-},toggleClass:function(_1d,_1e,_1f){
-if(typeof _1f=="undefined"){
-_1f=!d.hasClass(_1d,_1e);
+})(_13);
+var _18=_4(_13,_14);
+var _17=_13.style.cssText;
+var _19=d.animateProperty(d.mixin({node:_13,properties:_18},_15));
+d.connect(_19,"onEnd",_19,_16);
+return _19;
+},toggleClass:function(_1a,_1b,_1c,_1d){
+if(typeof _1c=="undefined"){
+_1c=!d.hasClass(_1a,_1b);
 }
-return dojox.fx[(_1f?"addClass":"removeClass")]({node:_1d,cssClass:_1e});
+return dojox.fx[(_1c?"addClass":"removeClass")](_1a,_1b,_1d);
 },_allowedProperties:["width","height","left","top","backgroundColor","color","borderBottomWidth","borderTopWidth","borderLeftWidth","borderRightWidth","paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginTop","marginRight","marginBottom","lineHeight","letterSpacing","fontSize"]});
 })();
 }
diff --git a/dojox/fx/text.js b/dojox/fx/text.js
index 54def74..5c9acd2 100644
--- a/dojox/fx/text.js
+++ b/dojox/fx/text.js
@@ -11,246 +11,246 @@ dojo.provide("dojox.fx.text");
 dojo.require("dojo.fx");
 dojo.require("dojo.fx.easing");
 dojox.fx.text._split=function(_1){
-var _2=_1.node=dojo.byId(_1.node),s=_2.style,cs=dojo.getComputedStyle(_2),_5=dojo.coords(_2,true);
+var _2=_1.node=dojo.byId(_1.node),s=_2.style,cs=dojo.getComputedStyle(_2),_3=dojo.coords(_2,true);
 _1.duration=_1.duration||1000;
 _1.words=_1.words||false;
-var _6=(_1.text&&typeof (_1.text)=="string")?_1.text:_2.innerHTML,_7=s.height,_8=s.width,_9=[];
+var _4=(_1.text&&typeof (_1.text)=="string")?_1.text:_2.innerHTML,_5=s.height,_6=s.width,_7=[];
 dojo.style(_2,{height:cs.height,width:cs.width});
-var _a=/(<\/?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)\/?>)/g;
-var _b=(_1.words?/(<\/?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)\/?>)\s*|([^\s<]+\s*)/g:/(<\/?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)\/?>)\s*|([^\s<]\s*)/g);
-var _c=(typeof _1.text=="string")?_1.text.match(_b):_2.innerHTML.match(_b);
-var _d="";
-var _e=0;
-var _f=0;
-for(var i=0;i<_c.length;i++){
-var _11=_c[i];
-if(!_11.match(_a)){
-_d+="<span>"+_11+"</span>";
-_e++;
+var _8=/(<\/?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)\/?>)/g;
+var _9=(_1.words?/(<\/?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)\/?>)\s*|([^\s<]+\s*)/g:/(<\/?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[^'">\s]+))?)+\s*|\s*)\/?>)\s*|([^\s<]\s*)/g);
+var _a=(typeof _1.text=="string")?_1.text.match(_9):_2.innerHTML.match(_9);
+var _b="";
+var _c=0;
+var _d=0;
+for(var i=0;i<_a.length;i++){
+var _e=_a[i];
+if(!_e.match(_8)){
+_b+="<span>"+_e+"</span>";
+_c++;
 }else{
-_d+=_11;
+_b+=_e;
 }
 }
-_2.innerHTML=_d;
-function _12(_13){
-var _14=_13.nextSibling;
-if(_13.tagName=="SPAN"&&_13.childNodes.length==1&&_13.firstChild.nodeType==3){
-var _15=dojo.coords(_13,true);
-_f++;
-dojo.style(_13,{padding:0,margin:0,top:(_1.crop?"0px":_15.t+"px"),left:(_1.crop?"0px":_15.l+"px"),display:"inline"});
-var _16=_1.pieceAnimation(_13,_15,_5,_f,_e);
-if(dojo.isArray(_16)){
-_9=_9.concat(_16);
+_2.innerHTML=_b;
+function _f(_10){
+var _11=_10.nextSibling;
+if(_10.tagName=="SPAN"&&_10.childNodes.length==1&&_10.firstChild.nodeType==3){
+var _12=dojo.coords(_10,true);
+_d++;
+dojo.style(_10,{padding:0,margin:0,top:(_1.crop?"0px":_12.t+"px"),left:(_1.crop?"0px":_12.l+"px"),display:"inline"});
+var _13=_1.pieceAnimation(_10,_12,_3,_d,_c);
+if(dojo.isArray(_13)){
+_7=_7.concat(_13);
 }else{
-_9[_9.length]=_16;
+_7[_7.length]=_13;
 }
 }else{
-if(_13.firstChild){
-_12(_13.firstChild);
+if(_10.firstChild){
+_f(_10.firstChild);
 }
 }
-if(_14){
-_12(_14);
+if(_11){
+_f(_11);
 }
 };
-_12(_2.firstChild);
-var _17=dojo.fx.combine(_9);
-dojo.connect(_17,"onEnd",_17,function(){
-_2.innerHTML=_6;
-dojo.style(_2,{height:_7,width:_8});
+_f(_2.firstChild);
+var _14=dojo.fx.combine(_7);
+dojo.connect(_14,"onEnd",_14,function(){
+_2.innerHTML=_4;
+dojo.style(_2,{height:_5,width:_6});
 });
 if(_1.onPlay){
-dojo.connect(_17,"onPlay",_17,_1.onPlay);
+dojo.connect(_14,"onPlay",_14,_1.onPlay);
 }
 if(_1.onEnd){
-dojo.connect(_17,"onEnd",_17,_1.onEnd);
+dojo.connect(_14,"onEnd",_14,_1.onEnd);
 }
-return _17;
+return _14;
 };
-dojox.fx.text.explode=function(_18){
-var _19=_18.node=dojo.byId(_18.node);
-var s=_19.style;
-_18.distance=_18.distance||1;
-_18.duration=_18.duration||1000;
-_18.random=_18.random||0;
-if(typeof (_18.fade)=="undefined"){
-_18.fade=true;
+dojox.fx.text.explode=function(_15){
+var _16=_15.node=dojo.byId(_15.node);
+var s=_16.style;
+_15.distance=_15.distance||1;
+_15.duration=_15.duration||1000;
+_15.random=_15.random||0;
+if(typeof (_15.fade)=="undefined"){
+_15.fade=true;
 }
-if(typeof (_18.sync)=="undefined"){
-_18.sync=true;
+if(typeof (_15.sync)=="undefined"){
+_15.sync=true;
 }
-_18.random=Math.abs(_18.random);
-_18.pieceAnimation=function(_1b,_1c,_1d,_1e,_1f){
-var _20=_1c.h;
-var _21=_1c.w;
-var _22=_18.distance*2;
-var _23=_18.duration;
-var _24=parseFloat(_1b.style.top);
-var _25=parseFloat(_1b.style.left);
-var _26=0;
-var _27=0;
-var _28=0;
-if(_18.random){
-var _29=(Math.random()*_18.random)+Math.max(1-_18.random,0);
-_22*=_29;
-_23*=_29;
-_26=((_18.unhide&&_18.sync)||(!_18.unhide&&!_18.sync))?(_18.duration-_23):0;
-_27=Math.random()-0.5;
-_28=Math.random()-0.5;
+_15.random=Math.abs(_15.random);
+_15.pieceAnimation=function(_17,_18,_19,_1a,_1b){
+var _1c=_18.h;
+var _1d=_18.w;
+var _1e=_15.distance*2;
+var _1f=_15.duration;
+var _20=parseFloat(_17.style.top);
+var _21=parseFloat(_17.style.left);
+var _22=0;
+var _23=0;
+var _24=0;
+if(_15.random){
+var _25=(Math.random()*_15.random)+Math.max(1-_15.random,0);
+_1e*=_25;
+_1f*=_25;
+_22=((_15.unhide&&_15.sync)||(!_15.unhide&&!_15.sync))?(_15.duration-_1f):0;
+_23=Math.random()-0.5;
+_24=Math.random()-0.5;
 }
-var _2a=((_1d.h-_20)/2-(_1c.y-_1d.y));
-var _2b=((_1d.w-_21)/2-(_1c.x-_1d.x));
-var _2c=Math.sqrt(Math.pow(_2b,2)+Math.pow(_2a,2));
-var _2d=_24-_2a*_22+_2c*_28;
-var _2e=_25-_2b*_22+_2c*_27;
-var _2f=dojo.animateProperty({node:_1b,duration:_23,delay:_26,easing:(_18.easing||(_18.unhide?dojo.fx.easing.sinOut:dojo.fx.easing.circOut)),beforeBegin:(_18.unhide?function(){
-if(_18.fade){
-dojo.style(_1b,"opacity",0);
+var _26=((_19.h-_1c)/2-(_18.y-_19.y));
+var _27=((_19.w-_1d)/2-(_18.x-_19.x));
+var _28=Math.sqrt(Math.pow(_27,2)+Math.pow(_26,2));
+var _29=_20-_26*_1e+_28*_24;
+var _2a=_21-_27*_1e+_28*_23;
+var _2b=dojo.animateProperty({node:_17,duration:_1f,delay:_22,easing:(_15.easing||(_15.unhide?dojo.fx.easing.sinOut:dojo.fx.easing.circOut)),beforeBegin:(_15.unhide?function(){
+if(_15.fade){
+dojo.style(_17,"opacity",0);
 }
-_1b.style.position=_18.crop?"relative":"absolute";
-_1b.style.top=_2d+"px";
-_1b.style.left=_2e+"px";
+_17.style.position=_15.crop?"relative":"absolute";
+_17.style.top=_29+"px";
+_17.style.left=_2a+"px";
 }:function(){
-_1b.style.position=_18.crop?"relative":"absolute";
-}),properties:{top:(_18.unhide?{start:_2d,end:_24}:{start:_24,end:_2d}),left:(_18.unhide?{start:_2e,end:_25}:{start:_25,end:_2e})}});
-if(_18.fade){
-var _30=dojo.animateProperty({node:_1b,duration:_23,delay:_26,easing:(_18.fadeEasing||dojo.fx.easing.quadOut),properties:{opacity:(_18.unhide?{start:0,end:1}:{end:0})}});
-return (_18.unhide?[_30,_2f]:[_2f,_30]);
+_17.style.position=_15.crop?"relative":"absolute";
+}),properties:{top:(_15.unhide?{start:_29,end:_20}:{start:_20,end:_29}),left:(_15.unhide?{start:_2a,end:_21}:{start:_21,end:_2a})}});
+if(_15.fade){
+var _2c=dojo.animateProperty({node:_17,duration:_1f,delay:_22,easing:(_15.fadeEasing||dojo.fx.easing.quadOut),properties:{opacity:(_15.unhide?{start:0,end:1}:{end:0})}});
+return (_15.unhide?[_2c,_2b]:[_2b,_2c]);
 }else{
-return _2f;
+return _2b;
 }
 };
-var _31=dojox.fx.text._split(_18);
-return _31;
+var _2d=dojox.fx.text._split(_15);
+return _2d;
 };
-dojox.fx.text.converge=function(_32){
-_32.unhide=true;
-return dojox.fx.text.explode(_32);
+dojox.fx.text.converge=function(_2e){
+_2e.unhide=true;
+return dojox.fx.text.explode(_2e);
 };
-dojox.fx.text.disintegrate=function(_33){
-var _34=_33.node=dojo.byId(_33.node);
-var s=_34.style;
-_33.duration=_33.duration||1500;
-_33.distance=_33.distance||1.5;
-_33.random=_33.random||0;
-if(!_33.fade){
-_33.fade=true;
+dojox.fx.text.disintegrate=function(_2f){
+var _30=_2f.node=dojo.byId(_2f.node);
+var s=_30.style;
+_2f.duration=_2f.duration||1500;
+_2f.distance=_2f.distance||1.5;
+_2f.random=_2f.random||0;
+if(!_2f.fade){
+_2f.fade=true;
 }
-var _36=Math.abs(_33.random);
-_33.pieceAnimation=function(_37,_38,_39,_3a,_3b){
-var _3c=_38.h;
-var _3d=_38.w;
-var _3e=_33.interval||(_33.duration/(1.5*_3b));
-var _3f=(_33.duration-_3b*_3e);
-var _40=Math.random()*_3b*_3e;
-var _41=(_33.reverseOrder||_33.distance<0)?(_3a*_3e):((_3b-_3a)*_3e);
-var _42=_40*_36+Math.max(1-_36,0)*_41;
-var _43={};
-if(_33.unhide){
-_43.top={start:(parseFloat(_37.style.top)-_39.h*_33.distance),end:parseFloat(_37.style.top)};
-if(_33.fade){
-_43.opacity={start:0,end:1};
+var _31=Math.abs(_2f.random);
+_2f.pieceAnimation=function(_32,_33,_34,_35,_36){
+var _37=_33.h;
+var _38=_33.w;
+var _39=_2f.interval||(_2f.duration/(1.5*_36));
+var _3a=(_2f.duration-_36*_39);
+var _3b=Math.random()*_36*_39;
+var _3c=(_2f.reverseOrder||_2f.distance<0)?(_35*_39):((_36-_35)*_39);
+var _3d=_3b*_31+Math.max(1-_31,0)*_3c;
+var _3e={};
+if(_2f.unhide){
+_3e.top={start:(parseFloat(_32.style.top)-_34.h*_2f.distance),end:parseFloat(_32.style.top)};
+if(_2f.fade){
+_3e.opacity={start:0,end:1};
 }
 }else{
-_43.top={end:(parseFloat(_37.style.top)+_39.h*_33.distance)};
-if(_33.fade){
-_43.opacity={end:0};
+_3e.top={end:(parseFloat(_32.style.top)+_34.h*_2f.distance)};
+if(_2f.fade){
+_3e.opacity={end:0};
 }
 }
-var _44=dojo.animateProperty({node:_37,duration:_3f,delay:_42,easing:(_33.easing||(_33.unhide?dojo.fx.easing.sinIn:dojo.fx.easing.circIn)),properties:_43,beforeBegin:(_33.unhide?function(){
-if(_33.fade){
-dojo.style(_37,"opacity",0);
+var _3f=dojo.animateProperty({node:_32,duration:_3a,delay:_3d,easing:(_2f.easing||(_2f.unhide?dojo.fx.easing.sinIn:dojo.fx.easing.circIn)),properties:_3e,beforeBegin:(_2f.unhide?function(){
+if(_2f.fade){
+dojo.style(_32,"opacity",0);
 }
-_37.style.position=_33.crop?"relative":"absolute";
-_37.style.top=_43.top.start+"px";
+_32.style.position=_2f.crop?"relative":"absolute";
+_32.style.top=_3e.top.start+"px";
 }:function(){
-_37.style.position=_33.crop?"relative":"absolute";
+_32.style.position=_2f.crop?"relative":"absolute";
 })});
-return _44;
+return _3f;
 };
-var _45=dojox.fx.text._split(_33);
-return _45;
+var _40=dojox.fx.text._split(_2f);
+return _40;
 };
-dojox.fx.text.build=function(_46){
-_46.unhide=true;
-return dojox.fx.text.disintegrate(_46);
+dojox.fx.text.build=function(_41){
+_41.unhide=true;
+return dojox.fx.text.disintegrate(_41);
 };
-dojox.fx.text.blockFadeOut=function(_47){
-var _48=_47.node=dojo.byId(_47.node);
-var s=_48.style;
-_47.duration=_47.duration||1000;
-_47.random=_47.random||0;
-var _4a=Math.abs(_47.random);
-_47.pieceAnimation=function(_4b,_4c,_4d,_4e,_4f){
-var _50=_47.interval||(_47.duration/(1.5*_4f));
-var _51=(_47.duration-_4f*_50);
-var _52=Math.random()*_4f*_50;
-var _53=(_47.reverseOrder)?((_4f-_4e)*_50):(_4e*_50);
-var _54=_52*_4a+Math.max(1-_4a,0)*_53;
-var _55=dojo.animateProperty({node:_4b,duration:_51,delay:_54,easing:(_47.easing||dojo.fx.easing.sinInOut),properties:{opacity:(_47.unhide?{start:0,end:1}:{end:0})},beforeBegin:(_47.unhide?function(){
-dojo.style(_4b,"opacity",0);
+dojox.fx.text.blockFadeOut=function(_42){
+var _43=_42.node=dojo.byId(_42.node);
+var s=_43.style;
+_42.duration=_42.duration||1000;
+_42.random=_42.random||0;
+var _44=Math.abs(_42.random);
+_42.pieceAnimation=function(_45,_46,_47,_48,_49){
+var _4a=_42.interval||(_42.duration/(1.5*_49));
+var _4b=(_42.duration-_49*_4a);
+var _4c=Math.random()*_49*_4a;
+var _4d=(_42.reverseOrder)?((_49-_48)*_4a):(_48*_4a);
+var _4e=_4c*_44+Math.max(1-_44,0)*_4d;
+var _4f=dojo.animateProperty({node:_45,duration:_4b,delay:_4e,easing:(_42.easing||dojo.fx.easing.sinInOut),properties:{opacity:(_42.unhide?{start:0,end:1}:{end:0})},beforeBegin:(_42.unhide?function(){
+dojo.style(_45,"opacity",0);
 }:undefined)});
-return _55;
+return _4f;
 };
-var _56=dojox.fx.text._split(_47);
-return _56;
+var _50=dojox.fx.text._split(_42);
+return _50;
 };
-dojox.fx.text.blockFadeIn=function(_57){
-_57.unhide=true;
-return dojox.fx.text.blockFadeOut(_57);
+dojox.fx.text.blockFadeIn=function(_51){
+_51.unhide=true;
+return dojox.fx.text.blockFadeOut(_51);
 };
-dojox.fx.text.backspace=function(_58){
-var _59=_58.node=dojo.byId(_58.node);
-var s=_59.style;
-_58.words=false;
-_58.duration=_58.duration||2000;
-_58.random=_58.random||0;
-var _5b=Math.abs(_58.random);
-var _5c=10;
-_58.pieceAnimation=function(_5d,_5e,_5f,_60,_61){
-var _62=_58.interval||(_58.duration/(1.5*_61));
-var _63=_5d.textContent;
-var _64=_63.match(/\s/g);
-if(typeof (_58.wordDelay)=="undefined"){
-_58.wordDelay=_62*2;
+dojox.fx.text.backspace=function(_52){
+var _53=_52.node=dojo.byId(_52.node);
+var s=_53.style;
+_52.words=false;
+_52.duration=_52.duration||2000;
+_52.random=_52.random||0;
+var _54=Math.abs(_52.random);
+var _55=10;
+_52.pieceAnimation=function(_56,_57,_58,_59,_5a){
+var _5b=_52.interval||(_52.duration/(1.5*_5a));
+var _5c=_56.textContent;
+var _5d=_5c.match(/\s/g);
+if(typeof (_52.wordDelay)=="undefined"){
+_52.wordDelay=_5b*2;
 }
-if(!_58.unhide){
-_5c=(_61-_60-1)*_62;
+if(!_52.unhide){
+_55=(_5a-_59-1)*_5b;
 }
-var _65,_66;
-if(_58.fixed){
-if(_58.unhide){
-var _65=function(){
-dojo.style(_5d,"opacity",0);
+var _5e,_5f;
+if(_52.fixed){
+if(_52.unhide){
+var _5e=function(){
+dojo.style(_56,"opacity",0);
 };
 }
 }else{
-if(_58.unhide){
-var _65=function(){
-_5d.style.display="none";
+if(_52.unhide){
+var _5e=function(){
+_56.style.display="none";
 };
-var _66=function(){
-_5d.style.display="inline";
+var _5f=function(){
+_56.style.display="inline";
 };
 }else{
-var _66=function(){
-_5d.style.display="none";
+var _5f=function(){
+_56.style.display="none";
 };
 }
 }
-var _67=dojo.animateProperty({node:_5d,duration:1,delay:_5c,easing:(_58.easing||dojo.fx.easing.sinInOut),properties:{opacity:(_58.unhide?{start:0,end:1}:{end:0})},beforeBegin:_65,onEnd:_66});
-if(_58.unhide){
-var _68=Math.random()*_63.length*_62;
-var _69=_68*_5b/2+Math.max(1-_5b/2,0)*_58.wordDelay;
-_5c+=_68*_5b+Math.max(1-_5b,0)*_62*_63.length+(_69*(_64&&_63.lastIndexOf(_64[_64.length-1])==_63.length-1));
+var _60=dojo.animateProperty({node:_56,duration:1,delay:_55,easing:(_52.easing||dojo.fx.easing.sinInOut),properties:{opacity:(_52.unhide?{start:0,end:1}:{end:0})},beforeBegin:_5e,onEnd:_5f});
+if(_52.unhide){
+var _61=Math.random()*_5c.length*_5b;
+var _62=_61*_54/2+Math.max(1-_54/2,0)*_52.wordDelay;
+_55+=_61*_54+Math.max(1-_54,0)*_5b*_5c.length+(_62*(_5d&&_5c.lastIndexOf(_5d[_5d.length-1])==_5c.length-1));
 }
-return _67;
+return _60;
 };
-var _6a=dojox.fx.text._split(_58);
-return _6a;
+var _63=dojox.fx.text._split(_52);
+return _63;
 };
-dojox.fx.text.type=function(_6b){
-_6b.unhide=true;
-return dojox.fx.text.backspace(_6b);
+dojox.fx.text.type=function(_64){
+_64.unhide=true;
+return dojox.fx.text.backspace(_64);
 };
 }
diff --git a/dojox/gfx.js b/dojox/gfx.js
index b32ebf6..717f9eb 100644
--- a/dojox/gfx.js
+++ b/dojox/gfx.js
@@ -13,4 +13,4 @@
 	for documentation and information on getting the source.
 */
 
-if(!dojo._hasResource["dojox.gfx.matrix"]){dojo._hasResource["dojox.gfx.matrix"]=true;dojo.provide("dojox.gfx.matrix");(function(){var m=dojox.gfx.matrix;var _2={};m._degToRad=function(_3){return _2[_3]||(_2[_3]=(Math.PI*_3/180));};m._radToDeg=function(_4){return _4/Math.PI*180;};m.Matrix2D=function(_5){if(_5){if(typeof _5=="number"){this.xx=this.yy=_5;}else{if(_5 instanceof Array){if(_5.length>0){var _6=m.normalize(_5[0]);for(var i=1;i<_5.length;++i){var l=_6,r=dojox.gfx.matrix.normaliz [...]
+if(!dojo._hasResource["dojox.gfx.matrix"]){dojo._hasResource["dojox.gfx.matrix"]=true;dojo.provide("dojox.gfx.matrix");(function(){var m=dojox.gfx.matrix;var _1={};m._degToRad=function(_2){return _1[_2]||(_1[_2]=(Math.PI*_2/180));};m._radToDeg=function(_3){return _3/Math.PI*180;};m.Matrix2D=function(_4){if(_4){if(typeof _4=="number"){this.xx=this.yy=_4;}else{if(_4 instanceof Array){if(_4.length>0){var _5=m.normalize(_4[0]);for(var i=1;i<_4.length;++i){var l=_5,r=dojox.gfx.matrix.normaliz [...]
diff --git a/dojox/gfx.js.uncompressed.js b/dojox/gfx.js.uncompressed.js
index 90d0f29..0913a62 100644
--- a/dojox/gfx.js.uncompressed.js
+++ b/dojox/gfx.js.uncompressed.js
@@ -555,8 +555,10 @@ dojo.provide("dojox.gfx._base");
 	// candidate for dojox.html.metrics
 
 	var measuringNode = null, empty = {};
-	b._getTextBox = function(/* String */ text, /* Object */ style, /* String? */ className){
-		var m, s;
+	b._getTextBox = function(	/*String*/ text,
+								/*Object*/ style,
+								/*String?*/ className){
+		var m, s, al = arguments.length;
 		if(!measuringNode){
 			m = measuringNode = dojo.doc.createElement("div");
 			s = m.style;
@@ -575,19 +577,25 @@ dojo.provide("dojox.gfx._base");
 		s.padding = "0";
 		s.outline = "0";
 		// set new style
-		if(arguments.length > 1 && style){
+		if(al > 1 && style){
 			for(var i in style){
 				if(i in empty){ continue; }
 				s[i] = style[i];
 			}
 		}
 		// set classes
-		if(arguments.length > 2 && className){
+		if(al > 2 && className){
 			m.className = className;
 		}
 		// take a measure
 		m.innerHTML = text;
-		return dojo.marginBox(m);
+
+		if(m["getBoundingClientRect"]){
+			var bcr = m.getBoundingClientRect();
+			return {l: bcr.left, t: bcr.top, w: bcr.width || (bcr.right - bcr.left), h: bcr.height || (bcr.bottom - bcr.top)};
+		}else{
+			return dojo.marginBox(m);
+		}
 	};
 
 	// candidate for dojo.dom
@@ -671,7 +679,7 @@ dojo.mixin(dojox.gfx, {
 			if(t){
 				return new t();
 			}
-			t = typeCtorCache[type] = function(){};
+			t = typeCtorCache[type] = new Function;
 			t.prototype = dojox.gfx[ "default" + type ];
 			return new t();
 		}
@@ -747,31 +755,36 @@ dojo.mixin(dojox.gfx, {
 		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
+		// summary:
+		//		converts a CSS font string to a font object
+		// description:
+		//		Converts a CSS font string to a gfx font object. The CSS font
+		//		string components should follow the W3C specified order
+		//		(see http://www.w3.org/TR/CSS2/fonts.html#font-shorthand):
+		//		style, variant, weight, size, optional line height (will be
+		//		ignored), and family.
+		// str: String
+		//		a CSS font string
 		var font = dojox.gfx.getDefault("Font");
 		var t = str.split(/\s+/);
 		do{
 			if(t.length < 5){ break; }
-			font.style  = t[0];
-			font.varian = t[1];
-			font.weight = t[2];
+			font.style   = t[0];
+			font.variant = 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) == "/"){
+				}else if(t[4].charAt(0) == "/"){
 					j = 5;
-					break;
 				}
 			}
-			if(j + 3 > t.length){ break; }
-			font.size = t[j];
-			font.family = t[j + 1];
+			if(j < t.length){
+				font.family = t.slice(j).join(" ");
+			}
 		}while(false);
 		return font;	// Object
 	},
@@ -836,6 +849,12 @@ dojo.loadInit(function(){
 	//has not been defined yet.
 	var gfx = dojo.getObject("dojox.gfx", true), sl, flag, match;
 	if(!gfx.renderer){
+		//Have a way to force a GFX renderer, if so desired.
+		//Useful for being able to serialize GFX data in a particular format.
+		if(dojo.config.forceGfxRenderer){
+			dojox.gfx.renderer = dojo.config.forceGfxRenderer;
+			return;
+		}
 		var renderers = (typeof dojo.config.gfxRenderer == "string" ?
 			dojo.config.gfxRenderer : "svg,vml,silverlight,canvas").split(",");
 
@@ -911,7 +930,7 @@ dojo.loadInit(function(){
 			if(dojox.gfx.renderer){ break; }
 		}
 		if(dojo.config.isDebug){
-			
+			console.log("gfx renderer = " + dojox.gfx.renderer);
 		}
 	}
 });
diff --git a/dojox/gfx/Moveable.js b/dojox/gfx/Moveable.js
index aa7c799..9459d04 100644
--- a/dojox/gfx/Moveable.js
+++ b/dojox/gfx/Moveable.js
@@ -36,18 +36,18 @@ dojo.stopEvent(e);
 },onMouseUp:function(e){
 this.shape.disconnect(this.events.pop());
 this.shape.disconnect(this.events.pop());
-},onMoveStart:function(_6){
-dojo.publish("/gfx/move/start",[_6]);
+},onMoveStart:function(_3){
+dojo.publish("/gfx/move/start",[_3]);
 dojo.addClass(dojo.body(),"dojoMove");
-},onMoveStop:function(_7){
-dojo.publish("/gfx/move/stop",[_7]);
+},onMoveStop:function(_4){
+dojo.publish("/gfx/move/stop",[_4]);
 dojo.removeClass(dojo.body(),"dojoMove");
-},onFirstMove:function(_8){
-},onMove:function(_9,_a){
-this.onMoving(_9,_a);
-this.shape.applyLeftTransform(_a);
-this.onMoved(_9,_a);
-},onMoving:function(_b,_c){
-},onMoved:function(_d,_e){
+},onFirstMove:function(_5){
+},onMove:function(_6,_7){
+this.onMoving(_6,_7);
+this.shape.applyLeftTransform(_7);
+this.onMoved(_6,_7);
+},onMoving:function(_8,_9){
+},onMoved:function(_a,_b){
 }});
 }
diff --git a/dojox/gfx/Mover.js b/dojox/gfx/Mover.js
index 0bf519d..dcc0765 100644
--- a/dojox/gfx/Mover.js
+++ b/dojox/gfx/Mover.js
@@ -8,12 +8,12 @@
 if(!dojo._hasResource["dojox.gfx.Mover"]){
 dojo._hasResource["dojox.gfx.Mover"]=true;
 dojo.provide("dojox.gfx.Mover");
-dojo.declare("dojox.gfx.Mover",null,{constructor:function(_1,e,_3){
+dojo.declare("dojox.gfx.Mover",null,{constructor:function(_1,e,_2){
 this.shape=_1;
 this.lastX=e.clientX;
 this.lastY=e.clientY;
-var h=this.host=_3,d=document,_6=dojo.connect(d,"onmousemove",this,"onFirstMove");
-this.events=[dojo.connect(d,"onmousemove",this,"onMouseMove"),dojo.connect(d,"onmouseup",this,"destroy"),dojo.connect(d,"ondragstart",dojo,"stopEvent"),dojo.connect(d,"onselectstart",dojo,"stopEvent"),_6];
+var h=this.host=_2,d=document,_3=dojo.connect(d,"onmousemove",this,"onFirstMove");
+this.events=[dojo.connect(d,"onmousemove",this,"onMouseMove"),dojo.connect(d,"onmouseup",this,"destroy"),dojo.connect(d,"ondragstart",dojo,"stopEvent"),dojo.connect(d,"onselectstart",dojo,"stopEvent"),_3];
 if(h&&h.onMoveStart){
 h.onMoveStart(this);
 }
diff --git a/dojox/gfx/VectorText.js b/dojox/gfx/VectorText.js
index 165dad0..cf4e459 100644
--- a/dojox/gfx/VectorText.js
+++ b/dojox/gfx/VectorText.js
@@ -23,65 +23,65 @@ if(!_2.match(this._entityRe)){
 return;
 }
 var _3={amp:"&",apos:"'",quot:"\"",lt:"<",gt:">"};
-var r,_5="";
+var r,_4="";
 while((r=this._entityRe.exec(_2))!==null){
 if(r[1].charAt(1)=="x"){
-_5+=String.fromCharCode(r[1].slice(2),16);
+_4+=String.fromCharCode(r[1].slice(2),16);
 }else{
 if(!isNaN(parseInt(r[1].slice(1),10))){
-_5+=String.fromCharCode(r[1].slice(1));
+_4+=String.fromCharCode(r[1].slice(1));
 }else{
-_5+=_3(r[1]);
+_4+=_3(r[1]);
 }
 }
 }
-return _5;
-},_parse:function(_6,_7){
-var _8=dojox.gfx._svgFontCache[_7]||dojox.xml.DomParser.parse(_6);
-var f=_8.documentElement.byName("font")[0],_a=_8.documentElement.byName("font-face")[0];
-var _b=parseFloat(_a.getAttribute("units-per-em")||1000,10);
-var _c={x:parseFloat(f.getAttribute("horiz-adv-x"),10),y:parseFloat(f.getAttribute("vert-adv-y")||0,10)};
-if(!_c.y){
-_c.y=_b;
+return _4;
+},_parse:function(_5,_6){
+var _7=dojox.gfx._svgFontCache[_6]||dojox.xml.DomParser.parse(_5);
+var f=_7.documentElement.byName("font")[0],_8=_7.documentElement.byName("font-face")[0];
+var _9=parseFloat(_8.getAttribute("units-per-em")||1000,10);
+var _a={x:parseFloat(f.getAttribute("horiz-adv-x"),10),y:parseFloat(f.getAttribute("vert-adv-y")||0,10)};
+if(!_a.y){
+_a.y=_9;
 }
-var _d={horiz:{x:parseFloat(f.getAttribute("horiz-origin-x")||0,10),y:parseFloat(f.getAttribute("horiz-origin-y")||0,10)},vert:{x:parseFloat(f.getAttribute("vert-origin-x")||0,10),y:parseFloat(f.getAttribute("vert-origin-y")||0,10)}};
-var _e=_a.getAttribute("font-family"),_f=_a.getAttribute("font-style")||"all",_10=_a.getAttribute("font-variant")||"normal",_11=_a.getAttribute("font-weight")||"all",_12=_a.getAttribute("font-stretch")||"normal",_13=_a.getAttribute("unicode-range")||"U+0-10FFFF",_14=_a.getAttribute("panose-1")||"0 0 0 0 0 0 0 0 0 0",_15=_a.getAttribute("cap-height"),_16=parseFloat(_a.getAttribute("ascent")||(_b-_d.vert.y),10),_17=parseFloat(_a.getAttribute("descent")||_d.vert.y,10),_18={};
-var _19=_e;
-if(_a.byName("font-face-name")[0]){
-_19=_a.byName("font-face-name")[0].getAttribute("name");
+var _b={horiz:{x:parseFloat(f.getAttribute("horiz-origin-x")||0,10),y:parseFloat(f.getAttribute("horiz-origin-y")||0,10)},vert:{x:parseFloat(f.getAttribute("vert-origin-x")||0,10),y:parseFloat(f.getAttribute("vert-origin-y")||0,10)}};
+var _c=_8.getAttribute("font-family"),_d=_8.getAttribute("font-style")||"all",_e=_8.getAttribute("font-variant")||"normal",_f=_8.getAttribute("font-weight")||"all",_10=_8.getAttribute("font-stretch")||"normal",_11=_8.getAttribute("unicode-range")||"U+0-10FFFF",_12=_8.getAttribute("panose-1")||"0 0 0 0 0 0 0 0 0 0",_13=_8.getAttribute("cap-height"),_14=parseFloat(_8.getAttribute("ascent")||(_9-_b.vert.y),10),_15=parseFloat(_8.getAttribute("descent")||_b.vert.y,10),_16={};
+var _17=_c;
+if(_8.byName("font-face-name")[0]){
+_17=_8.byName("font-face-name")[0].getAttribute("name");
 }
-if(dojox.gfx._vectorFontCache[_19]){
+if(dojox.gfx._vectorFontCache[_17]){
 return;
 }
-dojo.forEach(["alphabetic","ideographic","mathematical","hanging"],function(_1a){
-var a=_a.getAttribute(_1a);
+dojo.forEach(["alphabetic","ideographic","mathematical","hanging"],function(_18){
+var a=_8.getAttribute(_18);
 if(a!==null){
-_18[_1a]=parseFloat(a,10);
+_16[_18]=parseFloat(a,10);
 }
 });
-var _1c=parseFloat(_8.documentElement.byName("missing-glyph")[0].getAttribute("horiz-adv-x")||_c.x,10);
-var _1d={},_1e={},g=_8.documentElement.byName("glyph");
-dojo.forEach(g,function(_20){
-var _21=_20.getAttribute("unicode"),_19=_20.getAttribute("glyph-name"),_22=parseFloat(_20.getAttribute("horiz-adv-x")||_c.x,10),_23=_20.getAttribute("d");
-if(_21.match(this._entityRe)){
-_21=this._decodeEntitySequence(_21);
-}
-var o={code:_21,name:_19,xAdvance:_22,path:_23};
-_1d[_21]=o;
-_1e[_19]=o;
+var _19=parseFloat(_7.documentElement.byName("missing-glyph")[0].getAttribute("horiz-adv-x")||_a.x,10);
+var _1a={},_1b={},g=_7.documentElement.byName("glyph");
+dojo.forEach(g,function(_1c){
+var _1d=_1c.getAttribute("unicode"),_17=_1c.getAttribute("glyph-name"),_1e=parseFloat(_1c.getAttribute("horiz-adv-x")||_a.x,10),_1f=_1c.getAttribute("d");
+if(_1d.match(this._entityRe)){
+_1d=this._decodeEntitySequence(_1d);
+}
+var o={code:_1d,name:_17,xAdvance:_1e,path:_1f};
+_1a[_1d]=o;
+_1b[_17]=o;
 },this);
-var _25=_8.documentElement.byName("hkern");
-dojo.forEach(_25,function(_26,i){
-var k=-parseInt(_26.getAttribute("k"),10);
-var u1=_26.getAttribute("u1"),g1=_26.getAttribute("g1"),u2=_26.getAttribute("u2"),g2=_26.getAttribute("g2"),gl;
+var _20=_7.documentElement.byName("hkern");
+dojo.forEach(_20,function(_21,i){
+var k=-parseInt(_21.getAttribute("k"),10);
+var u1=_21.getAttribute("u1"),g1=_21.getAttribute("g1"),u2=_21.getAttribute("u2"),g2=_21.getAttribute("g2"),gl;
 if(u1){
 u1=this._decodeEntitySequence(u1);
-if(_1d[u1]){
-gl=_1d[u1];
+if(_1a[u1]){
+gl=_1a[u1];
 }
 }else{
-if(_1e[g1]){
-gl=_1e[g1];
+if(_1b[g1]){
+gl=_1b[g1];
 }
 }
 if(gl){
@@ -92,35 +92,35 @@ if(u2){
 u2=this._decodeEntitySequence(u2);
 gl.kern[u2]={x:k};
 }else{
-if(_1e[g2]){
-gl.kern[_1e[g2].code]={x:k};
+if(_1b[g2]){
+gl.kern[_1b[g2].code]={x:k};
 }
 }
 }
 },this);
-dojo.mixin(this,{family:_e,name:_19,style:_f,variant:_10,weight:_11,stretch:_12,range:_13,viewbox:{width:_b,height:_b},origin:_d,advance:dojo.mixin(_c,{missing:{x:_1c,y:_1c}}),ascent:_16,descent:_17,baseline:_18,glyphs:_1d});
-dojox.gfx._vectorFontCache[_19]=this;
-dojox.gfx._vectorFontCache[_7]=this;
-if(_19!=_e&&!dojox.gfx._vectorFontCache[_e]){
-dojox.gfx._vectorFontCache[_e]=this;
+dojo.mixin(this,{family:_c,name:_17,style:_d,variant:_e,weight:_f,stretch:_10,range:_11,viewbox:{width:_9,height:_9},origin:_b,advance:dojo.mixin(_a,{missing:{x:_19,y:_19}}),ascent:_14,descent:_15,baseline:_16,glyphs:_1a});
+dojox.gfx._vectorFontCache[_17]=this;
+dojox.gfx._vectorFontCache[_6]=this;
+if(_17!=_c&&!dojox.gfx._vectorFontCache[_c]){
+dojox.gfx._vectorFontCache[_c]=this;
 }
-if(!dojox.gfx._svgFontCache[_7]){
-dojox.gfx._svgFontCache[_7]=_8;
+if(!dojox.gfx._svgFontCache[_6]){
+dojox.gfx._svgFontCache[_6]=_7;
 }
 },_clean:function(){
-var _2e=this.name,_2f=this.family;
-dojo.forEach(["family","name","style","variant","weight","stretch","range","viewbox","origin","advance","ascent","descent","baseline","glyphs"],function(_30){
+var _22=this.name,_23=this.family;
+dojo.forEach(["family","name","style","variant","weight","stretch","range","viewbox","origin","advance","ascent","descent","baseline","glyphs"],function(_24){
 try{
-delete this[_30];
+delete this[_24];
 }
 catch(e){
 }
 },this);
-if(dojox.gfx._vectorFontCache[_2e]){
-delete dojox.gfx._vectorFontCache[_2e];
+if(dojox.gfx._vectorFontCache[_22]){
+delete dojox.gfx._vectorFontCache[_22];
 }
-if(dojox.gfx._vectorFontCache[_2f]){
-delete dojox.gfx._vectorFontCache[_2f];
+if(dojox.gfx._vectorFontCache[_23]){
+delete dojox.gfx._vectorFontCache[_23];
 }
 return this;
 },constructor:function(url){
@@ -137,35 +137,35 @@ return this;
 return (this.glyphs!==null);
 },_round:function(n){
 return Math.round(1000*n)/1000;
-},_leading:function(_34){
-return this.viewbox.height*(_34||this._defaultLeading);
+},_leading:function(_25){
+return this.viewbox.height*(_25||this._defaultLeading);
 },_normalize:function(str){
 return str.replace(/\s+/g,String.fromCharCode(32));
-},_getWidth:function(_36){
-var w=0,_38=0,_39=null;
-dojo.forEach(_36,function(_3a,i){
-_38=_3a.xAdvance;
-if(_36[i]&&_3a.kern&&_3a.kern[_36[i].code]){
-_38+=_3a.kern[_36[i].code].x;
-}
-w+=_38;
-_39=_3a;
+},_getWidth:function(_26){
+var w=0,_27=0,_28=null;
+dojo.forEach(_26,function(_29,i){
+_27=_29.xAdvance;
+if(_26[i]&&_29.kern&&_29.kern[_26[i].code]){
+_27+=_29.kern[_26[i].code].x;
+}
+w+=_27;
+_28=_29;
 });
-if(_39&&_39.code==" "){
-w-=_39.xAdvance;
+if(_28&&_28.code==" "){
+w-=_28.xAdvance;
 }
 return this._round(w);
-},_getLongestLine:function(_3c){
-var _3d=0,idx=0;
-dojo.forEach(_3c,function(_3f,i){
-var max=Math.max(_3d,this._getWidth(_3f));
-if(max>_3d){
-_3d=max;
+},_getLongestLine:function(_2a){
+var _2b=0,idx=0;
+dojo.forEach(_2a,function(_2c,i){
+var max=Math.max(_2b,this._getWidth(_2c));
+if(max>_2b){
+_2b=max;
 idx=i;
 }
 },this);
-return {width:_3d,index:idx,line:_3c[idx]};
-},_trim:function(_42){
+return {width:_2b,index:idx,line:_2a[idx]};
+},_trim:function(_2d){
 var fn=function(arr){
 if(!arr.length){
 return;
@@ -180,187 +180,187 @@ if(arr[0].code==" "){
 arr.splice(0,1);
 }
 };
-if(dojo.isArray(_42[0])){
-dojo.forEach(_42,fn);
+if(dojo.isArray(_2d[0])){
+dojo.forEach(_2d,fn);
 }else{
-fn(_42);
-}
-return _42;
-},_split:function(_45,_46){
-var w=this._getWidth(_45),_48=Math.floor(w/_46),_49=[],cw=0,c=[],_4c=false;
-for(var i=0,l=_45.length;i<l;i++){
-if(_45[i].code==" "){
-_4c=true;
-}
-cw+=_45[i].xAdvance;
-if(i+1<l&&_45[i].kern&&_45[i].kern[_45[i+1].code]){
-cw+=_45[i].kern[_45[i+1].code].x;
-}
-if(cw>=_48){
-var chr=_45[i];
-while(_4c&&chr.code!=" "&&i>=0){
+fn(_2d);
+}
+return _2d;
+},_split:function(_2e,_2f){
+var w=this._getWidth(_2e),_30=Math.floor(w/_2f),_31=[],cw=0,c=[],_32=false;
+for(var i=0,l=_2e.length;i<l;i++){
+if(_2e[i].code==" "){
+_32=true;
+}
+cw+=_2e[i].xAdvance;
+if(i+1<l&&_2e[i].kern&&_2e[i].kern[_2e[i+1].code]){
+cw+=_2e[i].kern[_2e[i+1].code].x;
+}
+if(cw>=_30){
+var chr=_2e[i];
+while(_32&&chr.code!=" "&&i>=0){
 chr=c.pop();
 i--;
 }
-_49.push(c);
+_31.push(c);
 c=[];
 cw=0;
-_4c=false;
+_32=false;
 }
-c.push(_45[i]);
+c.push(_2e[i]);
 }
 if(c.length){
-_49.push(c);
-}
-return this._trim(_49);
-},_getSizeFactor:function(_50){
-_50+="";
-var _51=dojox.html.metrics.getCachedFontMeasurements(),_52=this.viewbox.height,f=_51["1em"],_54=parseFloat(_50,10);
-if(_50.indexOf("em")>-1){
-return this._round((_51["1em"]*_54)/_52);
+_31.push(c);
+}
+return this._trim(_31);
+},_getSizeFactor:function(_33){
+_33+="";
+var _34=dojox.html.metrics.getCachedFontMeasurements(),_35=this.viewbox.height,f=_34["1em"],_36=parseFloat(_33,10);
+if(_33.indexOf("em")>-1){
+return this._round((_34["1em"]*_36)/_35);
 }else{
-if(_50.indexOf("ex")>-1){
-return this._round((_51["1ex"]*_54)/_52);
+if(_33.indexOf("ex")>-1){
+return this._round((_34["1ex"]*_36)/_35);
 }else{
-if(_50.indexOf("pt")>-1){
-return this._round(((_51["12pt"]/12)*_54)/_52);
+if(_33.indexOf("pt")>-1){
+return this._round(((_34["12pt"]/12)*_36)/_35);
 }else{
-if(_50.indexOf("px")>-1){
-return this._round(((_51["16px"]/16)*_54)/_52);
+if(_33.indexOf("px")>-1){
+return this._round(((_34["16px"]/16)*_36)/_35);
 }else{
-if(_50.indexOf("%")>-1){
-return this._round((_51["1em"]*(_54/100))/_52);
+if(_33.indexOf("%")>-1){
+return this._round((_34["1em"]*(_36/100))/_35);
 }else{
-f=_51[_50]||_51.medium;
-return this._round(f/_52);
+f=_34[_33]||_34.medium;
+return this._round(f/_35);
 }
 }
 }
 }
 }
-},_getFitFactor:function(_55,w,h,l){
+},_getFitFactor:function(_37,w,h,l){
 if(!h){
-return this._round(w/this._getWidth(_55));
+return this._round(w/this._getWidth(_37));
 }else{
-var _59=this._getLongestLine(_55).width,_5a=(_55.length*(this.viewbox.height*l))-((this.viewbox.height*l)-this.viewbox.height);
-return this._round(Math.min(w/_59,h/_5a));
-}
-},_getBestFit:function(_5b,w,h,_5e){
-var _5f=32,_60=0,_61=_5f;
-while(_5f>0){
-var f=this._getFitFactor(this._split(_5b,_5f),w,h,_5e);
-if(f>_60){
-_60=f;
-_61=_5f;
-}
-_5f--;
-}
-return {scale:_60,lines:this._split(_5b,_61)};
-},_getBestFlow:function(_63,w,_65){
-var _66=[],cw=0,c=[],_69=false;
-for(var i=0,l=_63.length;i<l;i++){
-if(_63[i].code==" "){
-_69=true;
-}
-var tw=_63[i].xAdvance;
-if(i+1<l&&_63[i].kern&&_63[i].kern[_63[i+1].code]){
-tw+=_63[i].kern[_63[i+1].code].x;
-}
-cw+=_65*tw;
+var _38=this._getLongestLine(_37).width,_39=(_37.length*(this.viewbox.height*l))-((this.viewbox.height*l)-this.viewbox.height);
+return this._round(Math.min(w/_38,h/_39));
+}
+},_getBestFit:function(_3a,w,h,_3b){
+var _3c=32,_3d=0,_3e=_3c;
+while(_3c>0){
+var f=this._getFitFactor(this._split(_3a,_3c),w,h,_3b);
+if(f>_3d){
+_3d=f;
+_3e=_3c;
+}
+_3c--;
+}
+return {scale:_3d,lines:this._split(_3a,_3e)};
+},_getBestFlow:function(_3f,w,_40){
+var _41=[],cw=0,c=[],_42=false;
+for(var i=0,l=_3f.length;i<l;i++){
+if(_3f[i].code==" "){
+_42=true;
+}
+var tw=_3f[i].xAdvance;
+if(i+1<l&&_3f[i].kern&&_3f[i].kern[_3f[i+1].code]){
+tw+=_3f[i].kern[_3f[i+1].code].x;
+}
+cw+=_40*tw;
 if(cw>=w){
-var chr=_63[i];
-while(_69&&chr.code!=" "&&i>=0){
+var chr=_3f[i];
+while(_42&&chr.code!=" "&&i>=0){
 chr=c.pop();
 i--;
 }
-_66.push(c);
+_41.push(c);
 c=[];
 cw=0;
-_69=false;
+_42=false;
 }
-c.push(_63[i]);
+c.push(_3f[i]);
 }
 if(c.length){
-_66.push(c);
+_41.push(c);
 }
-return this._trim(_66);
-},getWidth:function(_6e,_6f){
-return this._getWidth(dojo.map(this._normalize(_6e).split(""),function(chr){
+return this._trim(_41);
+},getWidth:function(_43,_44){
+return this._getWidth(dojo.map(this._normalize(_43).split(""),function(chr){
 return this.glyphs[chr]||{xAdvance:this.advance.missing.x};
-},this))*(_6f||1);
-},getLineHeight:function(_71){
-return this.viewbox.height*(_71||1);
-},getCenterline:function(_72){
-return (_72||1)*(this.viewbox.height/2);
-},getBaseline:function(_73){
-return (_73||1)*(this.viewbox.height+this.descent);
-},draw:function(_74,_75,_76,_77,_78){
+},this))*(_44||1);
+},getLineHeight:function(_45){
+return this.viewbox.height*(_45||1);
+},getCenterline:function(_46){
+return (_46||1)*(this.viewbox.height/2);
+},getBaseline:function(_47){
+return (_47||1)*(this.viewbox.height+this.descent);
+},draw:function(_48,_49,_4a,_4b,_4c){
 if(!this.initialized()){
 throw new Error("dojox.gfx.VectorFont.draw(): we have not been initialized yet.");
 }
-var g=_74.createGroup();
-if(_75.x||_75.y){
-_74.applyTransform({dx:_75.x||0,dy:_75.y||0});
+var g=_48.createGroup();
+if(_49.x||_49.y){
+_48.applyTransform({dx:_49.x||0,dy:_49.y||0});
 }
-var _7a=dojo.map(this._normalize(_75.text).split(""),function(chr){
+var _4d=dojo.map(this._normalize(_49.text).split(""),function(chr){
 return this.glyphs[chr]||{path:null,xAdvance:this.advance.missing.x};
 },this);
-var _7c=_76.size,_7d=_75.fitting,_7e=_75.width,_7f=_75.height,_80=_75.align,_81=_75.leading||this._defaultLeading;
-if(_7d){
-if((_7d==dojox.gfx.vectorFontFitting.FLOW&&!_7e)||(_7d==dojox.gfx.vectorFontFitting.FIT&&(!_7e||!_7f))){
-_7d=dojox.gfx.vectorFontFitting.NONE;
+var _4e=_4a.size,_4f=_49.fitting,_50=_49.width,_51=_49.height,_52=_49.align,_53=_49.leading||this._defaultLeading;
+if(_4f){
+if((_4f==dojox.gfx.vectorFontFitting.FLOW&&!_50)||(_4f==dojox.gfx.vectorFontFitting.FIT&&(!_50||!_51))){
+_4f=dojox.gfx.vectorFontFitting.NONE;
 }
 }
-var _82,_83;
-switch(_7d){
+var _54,_55;
+switch(_4f){
 case dojox.gfx.vectorFontFitting.FIT:
-var o=this._getBestFit(_7a,_7e,_7f,_81);
-_83=o.scale;
-_82=o.lines;
+var o=this._getBestFit(_4d,_50,_51,_53);
+_55=o.scale;
+_54=o.lines;
 break;
 case dojox.gfx.vectorFontFitting.FLOW:
-_83=this._getSizeFactor(_7c);
-_82=this._getBestFlow(_7a,_7e,_83);
+_55=this._getSizeFactor(_4e);
+_54=this._getBestFlow(_4d,_50,_55);
 break;
 default:
-_83=this._getSizeFactor(_7c);
-_82=[_7a];
+_55=this._getSizeFactor(_4e);
+_54=[_4d];
 }
-_82=dojo.filter(_82,function(_85){
-return _85.length>0;
+_54=dojo.filter(_54,function(_56){
+return _56.length>0;
 });
-var cy=0,_87=this._getLongestLine(_82).width;
-for(var i=0,l=_82.length;i<l;i++){
-var cx=0,_8b=_82[i],_8c=this._getWidth(_8b),lg=g.createGroup();
-for(var j=0;j<_8b.length;j++){
-var _8f=_8b[j];
-if(_8f.path!==null){
-var p=lg.createPath(_8f.path).setFill(_77);
-if(_78){
-p.setStroke(_78);
+var cy=0,_57=this._getLongestLine(_54).width;
+for(var i=0,l=_54.length;i<l;i++){
+var cx=0,_58=_54[i],_59=this._getWidth(_58),lg=g.createGroup();
+for(var j=0;j<_58.length;j++){
+var _5a=_58[j];
+if(_5a.path!==null){
+var p=lg.createPath(_5a.path).setFill(_4b);
+if(_4c){
+p.setStroke(_4c);
 }
 p.setTransform([dojox.gfx.matrix.flipY,dojox.gfx.matrix.translate(cx,-this.viewbox.height-this.descent)]);
 }
-cx+=_8f.xAdvance;
-if(j+1<_8b.length&&_8f.kern&&_8f.kern[_8b[j+1].code]){
-cx+=_8f.kern[_8b[j+1].code].x;
+cx+=_5a.xAdvance;
+if(j+1<_58.length&&_5a.kern&&_5a.kern[_58[j+1].code]){
+cx+=_5a.kern[_58[j+1].code].x;
 }
 }
 var dx=0;
-if(_80=="middle"){
-dx=_87/2-_8c/2;
+if(_52=="middle"){
+dx=_57/2-_59/2;
 }else{
-if(_80=="end"){
-dx=_87-_8c;
+if(_52=="end"){
+dx=_57-_59;
 }
 }
 lg.setTransform({dx:dx,dy:cy});
-cy+=this.viewbox.height*_81;
+cy+=this.viewbox.height*_53;
 }
-g.setTransform(dojox.gfx.matrix.scale(_83));
+g.setTransform(dojox.gfx.matrix.scale(_55));
 return g;
 },onLoadBegin:function(url){
-},onLoad:function(_93){
+},onLoad:function(_5b){
 }});
 })();
 }
diff --git a/dojox/gfx/_base.js b/dojox/gfx/_base.js
index 6aaa0c1..7b2f04a 100644
--- a/dojox/gfx/_base.js
+++ b/dojox/gfx/_base.js
@@ -10,29 +10,29 @@ dojo._hasResource["dojox.gfx._base"]=true;
 dojo.provide("dojox.gfx._base");
 (function(){
 var g=dojox.gfx,b=g._base;
-g._hasClass=function(_3,_4){
-var _5=_3.getAttribute("className");
-return _5&&(" "+_5+" ").indexOf(" "+_4+" ")>=0;
+g._hasClass=function(_1,_2){
+var _3=_1.getAttribute("className");
+return _3&&(" "+_3+" ").indexOf(" "+_2+" ")>=0;
 };
-g._addClass=function(_6,_7){
-var _8=_6.getAttribute("className")||"";
-if(!_8||(" "+_8+" ").indexOf(" "+_7+" ")<0){
-_6.setAttribute("className",_8+(_8?" ":"")+_7);
+g._addClass=function(_4,_5){
+var _6=_4.getAttribute("className")||"";
+if(!_6||(" "+_6+" ").indexOf(" "+_5+" ")<0){
+_4.setAttribute("className",_6+(_6?" ":"")+_5);
 }
 };
-g._removeClass=function(_9,_a){
-var _b=_9.getAttribute("className");
-if(_b){
-_9.setAttribute("className",_b.replace(new RegExp("(^|\\s+)"+_a+"(\\s+|$)"),"$1$2"));
+g._removeClass=function(_7,_8){
+var _9=_7.getAttribute("className");
+if(_9){
+_7.setAttribute("className",_9.replace(new RegExp("(^|\\s+)"+_8+"(\\s+|$)"),"$1$2"));
 }
 };
 b._getFontMeasurements=function(){
-var _c={"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};
+var _a={"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){
 dojo.doc.documentElement.style.fontSize="100%";
 }
-var _d=dojo.doc.createElement("div");
-var s=_d.style;
+var _b=dojo.doc.createElement("div");
+var s=_b.style;
 s.position="absolute";
 s.left="-100px";
 s.top="0px";
@@ -44,34 +44,34 @@ s.padding="0px";
 s.outline="none";
 s.lineHeight="1";
 s.overflow="hidden";
-dojo.body().appendChild(_d);
-for(var p in _c){
-_d.style.fontSize=p;
-_c[p]=Math.round(_d.offsetHeight*12/16)*16/12/1000;
-}
-dojo.body().removeChild(_d);
-_d=null;
-return _c;
+dojo.body().appendChild(_b);
+for(var p in _a){
+_b.style.fontSize=p;
+_a[p]=Math.round(_b.offsetHeight*12/16)*16/12/1000;
+}
+dojo.body().removeChild(_b);
+_b=null;
+return _a;
 };
-var _10=null;
-b._getCachedFontMeasurements=function(_11){
-if(_11||!_10){
-_10=b._getFontMeasurements();
+var _c=null;
+b._getCachedFontMeasurements=function(_d){
+if(_d||!_c){
+_c=b._getFontMeasurements();
 }
-return _10;
+return _c;
 };
-var _12=null,_13={};
-b._getTextBox=function(_14,_15,_16){
-var m,s;
-if(!_12){
-m=_12=dojo.doc.createElement("div");
+var _e=null,_f={};
+b._getTextBox=function(_10,_11,_12){
+var m,s,al=arguments.length;
+if(!_e){
+m=_e=dojo.doc.createElement("div");
 s=m.style;
 s.position="absolute";
 s.left="-10000px";
 s.top="0";
 dojo.body().appendChild(m);
 }else{
-m=_12;
+m=_e;
 s=m.style;
 }
 m.className="";
@@ -79,110 +79,111 @@ s.border="0";
 s.margin="0";
 s.padding="0";
 s.outline="0";
-if(arguments.length>1&&_15){
-for(var i in _15){
-if(i in _13){
+if(al>1&&_11){
+for(var i in _11){
+if(i in _f){
 continue;
 }
-s[i]=_15[i];
+s[i]=_11[i];
 }
 }
-if(arguments.length>2&&_16){
-m.className=_16;
+if(al>2&&_12){
+m.className=_12;
 }
-m.innerHTML=_14;
+m.innerHTML=_10;
+if(m["getBoundingClientRect"]){
+var bcr=m.getBoundingClientRect();
+return {l:bcr.left,t:bcr.top,w:bcr.width||(bcr.right-bcr.left),h:bcr.height||(bcr.bottom-bcr.top)};
+}else{
 return dojo.marginBox(m);
+}
 };
-var _1a=0;
+var _13=0;
 b._getUniqueId=function(){
 var id;
 do{
-id=dojo._scopeName+"Unique"+(++_1a);
+id=dojo._scopeName+"Unique"+(++_13);
 }while(dojo.byId(id));
 return id;
 };
 })();
 dojo.mixin(dojox.gfx,{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:{typ [...]
-var _1c={};
-return function(_1d){
-var t=_1c[_1d];
+var _14={};
+return function(_15){
+var t=_14[_15];
 if(t){
 return new t();
 }
-t=_1c[_1d]=function(){
-};
-t.prototype=dojox.gfx["default"+_1d];
+t=_14[_15]=new Function;
+t.prototype=dojox.gfx["default"+_15];
 return new t();
 };
-})(),normalizeColor:function(_1f){
-return (_1f instanceof dojo.Color)?_1f:new dojo.Color(_1f);
-},normalizeParameters:function(_20,_21){
-if(_21){
-var _22={};
-for(var x in _20){
-if(x in _21&&!(x in _22)){
-_20[x]=_21[x];
+})(),normalizeColor:function(_16){
+return (_16 instanceof dojo.Color)?_16:new dojo.Color(_16);
+},normalizeParameters:function(_17,_18){
+if(_18){
+var _19={};
+for(var x in _17){
+if(x in _18&&!(x in _19)){
+_17[x]=_18[x];
 }
 }
 }
-return _20;
-},makeParameters:function(_24,_25){
-if(!_25){
-return dojo.delegate(_24);
+return _17;
+},makeParameters:function(_1a,_1b){
+if(!_1b){
+return dojo.delegate(_1a);
 }
-var _26={};
-for(var i in _24){
-if(!(i in _26)){
-_26[i]=dojo.clone((i in _25)?_25[i]:_24[i]);
+var _1c={};
+for(var i in _1a){
+if(!(i in _1c)){
+_1c[i]=dojo.clone((i in _1b)?_1b[i]:_1a[i]);
 }
 }
-return _26;
-},formatNumber:function(x,_29){
+return _1c;
+},formatNumber:function(x,_1d){
 var val=x.toString();
 if(val.indexOf("e")>=0){
 val=x.toFixed(4);
 }else{
-var _2b=val.indexOf(".");
-if(_2b>=0&&val.length-_2b>5){
+var _1e=val.indexOf(".");
+if(_1e>=0&&val.length-_1e>5){
 val=x.toFixed(4);
 }
 }
 if(x<0){
 return val;
 }
-return _29?" "+val:val;
-},makeFontString:function(_2c){
-return _2c.style+" "+_2c.variant+" "+_2c.weight+" "+_2c.size+" "+_2c.family;
+return _1d?" "+val:val;
+},makeFontString:function(_1f){
+return _1f.style+" "+_1f.variant+" "+_1f.weight+" "+_1f.size+" "+_1f.family;
 },splitFontString:function(str){
-var _2e=dojox.gfx.getDefault("Font");
+var _20=dojox.gfx.getDefault("Font");
 var t=str.split(/\s+/);
 do{
 if(t.length<5){
 break;
 }
-_2e.style=t[0];
-_2e.varian=t[1];
-_2e.weight=t[2];
+_20.style=t[0];
+_20.variant=t[1];
+_20.weight=t[2];
 var i=t[3].indexOf("/");
-_2e.size=i<0?t[3]:t[3].substring(0,i);
+_20.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)=="/"){
+}else{
+if(t[4].charAt(0)=="/"){
 j=5;
-break;
 }
 }
-if(j+3>t.length){
-break;
 }
-_2e.size=t[j];
-_2e.family=t[j+1];
+if(j<t.length){
+_20.family=t.slice(j).join(" ");
+}
 }while(false);
-return _2e;
+return _20;
 },cm_in_pt:72/2.54,mm_in_pt:7.2/2.54,px_in_pt:function(){
 return dojox.gfx._base._getCachedFontMeasurements()["12pt"]/12;
 },pt2px:function(len){
@@ -194,21 +195,21 @@ if(len.length==0){
 return 0;
 }
 if(len.length>2){
-var _35=dojox.gfx.px_in_pt();
+var _21=dojox.gfx.px_in_pt();
 var val=parseFloat(len);
 switch(len.slice(-2)){
 case "px":
 return val;
 case "pt":
-return val*_35;
+return val*_21;
 case "in":
-return val*72*_35;
+return val*72*_21;
 case "pc":
-return val*12*_35;
+return val*12*_21;
 case "mm":
-return val*dojox.gfx.mm_in_pt*_35;
+return val*dojox.gfx.mm_in_pt*_21;
 case "cm":
-return val*dojox.gfx.cm_in_pt*_35;
+return val*dojox.gfx.cm_in_pt*_21;
 }
 }
 return parseFloat(len);
diff --git a/dojox/gfx/arc.js b/dojox/gfx/arc.js
index f707fed..42fc959 100644
--- a/dojox/gfx/arc.js
+++ b/dojox/gfx/arc.js
@@ -10,56 +10,56 @@ dojo._hasResource["dojox.gfx.arc"]=true;
 dojo.provide("dojox.gfx.arc");
 dojo.require("dojox.gfx.matrix");
 (function(){
-var m=dojox.gfx.matrix,_2=function(_3){
-var _4=Math.cos(_3),_5=Math.sin(_3),p2={x:_4+(4/3)*(1-_4),y:_5-(4/3)*_4*(1-_4)/_5};
-return {s:{x:_4,y:-_5},c1:{x:p2.x,y:-p2.y},c2:p2,e:{x:_4,y:_5}};
-},_7=2*Math.PI,_8=Math.PI/4,_9=Math.PI/8,_a=_8+_9,_b=_2(_9);
-dojo.mixin(dojox.gfx.arc,{unitArcAsBezier:_2,curvePI4:_b,arcAsBezier:function(_c,rx,ry,_f,_10,_11,x,y){
-_10=Boolean(_10);
-_11=Boolean(_11);
-var _14=m._degToRad(_f),rx2=rx*rx,ry2=ry*ry,pa=m.multiplyPoint(m.rotate(-_14),{x:(_c.x-x)/2,y:(_c.y-y)/2}),_18=pa.x*pa.x,_19=pa.y*pa.y,c1=Math.sqrt((rx2*ry2-rx2*_19-ry2*_18)/(rx2*_19+ry2*_18));
+var m=dojox.gfx.matrix,_1=function(_2){
+var _3=Math.cos(_2),_4=Math.sin(_2),p2={x:_3+(4/3)*(1-_3),y:_4-(4/3)*_3*(1-_3)/_4};
+return {s:{x:_3,y:-_4},c1:{x:p2.x,y:-p2.y},c2:p2,e:{x:_3,y:_4}};
+},_5=2*Math.PI,_6=Math.PI/4,_7=Math.PI/8,_8=_6+_7,_9=_1(_7);
+dojo.mixin(dojox.gfx.arc,{unitArcAsBezier:_1,curvePI4:_9,arcAsBezier:function(_a,rx,ry,_b,_c,_d,x,y){
+_c=Boolean(_c);
+_d=Boolean(_d);
+var _e=m._degToRad(_b),_f=rx*rx,ry2=ry*ry,pa=m.multiplyPoint(m.rotate(-_e),{x:(_a.x-x)/2,y:(_a.y-y)/2}),_10=pa.x*pa.x,_11=pa.y*pa.y,c1=Math.sqrt((_f*ry2-_f*_11-ry2*_10)/(_f*_11+ry2*_10));
 if(isNaN(c1)){
 c1=0;
 }
 var ca={x:c1*rx*pa.y/ry,y:-c1*ry*pa.x/rx};
-if(_10==_11){
+if(_c==_d){
 ca={x:-ca.x,y:-ca.y};
 }
-var c=m.multiplyPoint([m.translate((_c.x+x)/2,(_c.y+y)/2),m.rotate(_14)],ca);
-var _1d=m.normalize([m.translate(c.x,c.y),m.rotate(_14),m.scale(rx,ry)]);
-var _1e=m.invert(_1d),sp=m.multiplyPoint(_1e,_c),ep=m.multiplyPoint(_1e,x,y),_21=Math.atan2(sp.y,sp.x),_22=Math.atan2(ep.y,ep.x),_23=_21-_22;
-if(_11){
-_23=-_23;
+var c=m.multiplyPoint([m.translate((_a.x+x)/2,(_a.y+y)/2),m.rotate(_e)],ca);
+var _12=m.normalize([m.translate(c.x,c.y),m.rotate(_e),m.scale(rx,ry)]);
+var _13=m.invert(_12),sp=m.multiplyPoint(_13,_a),ep=m.multiplyPoint(_13,x,y),_14=Math.atan2(sp.y,sp.x),_15=Math.atan2(ep.y,ep.x),_16=_14-_15;
+if(_d){
+_16=-_16;
 }
-if(_23<0){
-_23+=_7;
+if(_16<0){
+_16+=_5;
 }else{
-if(_23>_7){
-_23-=_7;
+if(_16>_5){
+_16-=_5;
 }
 }
-var _24=_9,_25=_b,_26=_11?_24:-_24,_27=[];
-for(var _28=_23;_28>0;_28-=_8){
-if(_28<_a){
-_24=_28/2;
-_25=_2(_24);
-_26=_11?_24:-_24;
-_28=0;
+var _17=_7,_18=_9,_19=_d?_17:-_17,_1a=[];
+for(var _1b=_16;_1b>0;_1b-=_6){
+if(_1b<_8){
+_17=_1b/2;
+_18=_1(_17);
+_19=_d?_17:-_17;
+_1b=0;
 }
-var c1,c2,e,M=m.normalize([_1d,m.rotate(_21+_26)]);
-if(_11){
-c1=m.multiplyPoint(M,_25.c1);
-c2=m.multiplyPoint(M,_25.c2);
-e=m.multiplyPoint(M,_25.e);
+var c1,c2,e,M=m.normalize([_12,m.rotate(_14+_19)]);
+if(_d){
+c1=m.multiplyPoint(M,_18.c1);
+c2=m.multiplyPoint(M,_18.c2);
+e=m.multiplyPoint(M,_18.e);
 }else{
-c1=m.multiplyPoint(M,_25.c2);
-c2=m.multiplyPoint(M,_25.c1);
-e=m.multiplyPoint(M,_25.s);
+c1=m.multiplyPoint(M,_18.c2);
+c2=m.multiplyPoint(M,_18.c1);
+e=m.multiplyPoint(M,_18.s);
 }
-_27.push([c1.x,c1.y,c2.x,c2.y,e.x,e.y]);
-_21+=2*_26;
+_1a.push([c1.x,c1.y,c2.x,c2.y,e.x,e.y]);
+_14+=2*_19;
 }
-return _27;
+return _1a;
 }});
 })();
 }
diff --git a/dojox/gfx/canvas.js b/dojox/gfx/canvas.js
index 8487423..2535bff 100644
--- a/dojox/gfx/canvas.js
+++ b/dojox/gfx/canvas.js
@@ -15,54 +15,54 @@ 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,_7=2*pi,_8=pi/2;
-dojo.extend(g.Shape,{_render:function(_9){
-_9.save();
-this._renderTransform(_9);
-this._renderShape(_9);
-this._renderFill(_9,true);
-this._renderStroke(_9,true);
-_9.restore();
-},_renderTransform:function(_a){
+var d=dojo,g=dojox.gfx,gs=g.shape,ga=g.arc,m=g.matrix,mp=m.multiplyPoint,pi=Math.PI,_1=2*pi,_2=pi/2;
+d.extend(g.Shape,{_render:function(_3){
+_3.save();
+this._renderTransform(_3);
+this._renderShape(_3);
+this._renderFill(_3,true);
+this._renderStroke(_3,true);
+_3.restore();
+},_renderTransform:function(_4){
 if("canvasTransform" in this){
 var t=this.canvasTransform;
-_a.translate(t.dx,t.dy);
-_a.rotate(t.angle2);
-_a.scale(t.sx,t.sy);
-_a.rotate(t.angle1);
+_4.translate(t.dx,t.dy);
+_4.rotate(t.angle2);
+_4.scale(t.sx,t.sy);
+_4.rotate(t.angle1);
 }
-},_renderShape:function(_c){
-},_renderFill:function(_d,_e){
+},_renderShape:function(_5){
+},_renderFill:function(_6,_7){
 if("canvasFill" in this){
 if("canvasFillImage" in this){
-this.canvasFill=_d.createPattern(this.canvasFillImage,"repeat");
+this.canvasFill=_6.createPattern(this.canvasFillImage,"repeat");
 delete this.canvasFillImage;
 }
-_d.fillStyle=this.canvasFill;
-if(_e){
-_d.fill();
+_6.fillStyle=this.canvasFill;
+if(_7){
+_6.fill();
 }
 }else{
-_d.fillStyle="rgba(0,0,0,0.0)";
+_6.fillStyle="rgba(0,0,0,0.0)";
 }
-},_renderStroke:function(_f,_10){
+},_renderStroke:function(_8,_9){
 var s=this.strokeStyle;
 if(s){
-_f.strokeStyle=s.color.toString();
-_f.lineWidth=s.width;
-_f.lineCap=s.cap;
+_8.strokeStyle=s.color.toString();
+_8.lineWidth=s.width;
+_8.lineCap=s.cap;
 if(typeof s.join=="number"){
-_f.lineJoin="miter";
-_f.miterLimit=s.join;
+_8.lineJoin="miter";
+_8.miterLimit=s.join;
 }else{
-_f.lineJoin=s.join;
+_8.lineJoin=s.join;
 }
-if(_10){
-_f.stroke();
+if(_9){
+_8.stroke();
 }
 }else{
-if(!_10){
-_f.strokeStyle="rgba(0,0,0,0.0)";
+if(!_9){
+_8.strokeStyle="rgba(0,0,0,0.0)";
 }
 }
 },getEventSource:function(){
@@ -70,36 +70,36 @@ return null;
 },connect:function(){
 },disconnect:function(){
 }});
-var _12=function(_13,_14,_15){
-var old=_13.prototype[_14];
-_13.prototype[_14]=_15?function(){
+var _a=function(_b,_c,_d){
+var _e=_b.prototype[_c];
+_b.prototype[_c]=_d?function(){
 this.surface.makeDirty();
-old.apply(this,arguments);
-_15.call(this);
+_e.apply(this,arguments);
+_d.call(this);
 return this;
 }:function(){
 this.surface.makeDirty();
-return old.apply(this,arguments);
+return _e.apply(this,arguments);
 };
 };
-_12(g.Shape,"setTransform",function(){
+_a(g.Shape,"setTransform",function(){
 if(this.matrix){
 this.canvasTransform=g.decompose(this.matrix);
 }else{
 delete this.canvasTransform;
 }
 });
-_12(g.Shape,"setFill",function(){
+_a(g.Shape,"setFill",function(){
 var fs=this.fillStyle,f;
 if(fs){
 if(typeof (fs)=="object"&&"type" in fs){
-var ctx=this.surface.rawNode.getContext("2d");
+var _f=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(_1a){
-f.addColorStop(_1a.offset,g.normalizeColor(_1a.color).toString());
+f=fs.type=="linear"?_f.createLinearGradient(fs.x1,fs.y1,fs.x2,fs.y2):_f.createRadialGradient(fs.cx,fs.cy,0,fs.cx,fs.cy,fs.r);
+d.forEach(fs.colors,function(_10){
+f.addColorStop(_10.offset,g.normalizeColor(_10.color).toString());
 });
 break;
 case "pattern":
@@ -115,8 +115,8 @@ this.canvasFill=f;
 delete this.canvasFill;
 }
 });
-_12(g.Shape,"setStroke");
-_12(g.Shape,"setShape");
+_a(g.Shape,"setStroke");
+_a(g.Shape,"setShape");
 dojo.declare("dojox.gfx.Group",g.Shape,{constructor:function(){
 gs.Container._init.call(this);
 },_render:function(ctx){
@@ -134,10 +134,10 @@ var s=this.shape,r=Math.min(s.r,s.height/2,s.width/2),xl=s.x,xr=xl+s.width,yt=s.
 ctx.beginPath();
 ctx.moveTo(xl2,yt);
 if(r){
-ctx.arc(xr2,yt2,r,-_8,0,false);
-ctx.arc(xr2,yb2,r,0,_8,false);
-ctx.arc(xl2,yb2,r,_8,pi,false);
-ctx.arc(xl2,yt2,r,pi,_8,false);
+ctx.arc(xr2,yt2,r,-_2,0,false);
+ctx.arc(xr2,yb2,r,0,_2,false);
+ctx.arc(xl2,yb2,r,_2,pi,false);
+ctx.arc(xl2,yt2,r,pi,pi+_2,false);
 }else{
 ctx.lineTo(xr2,yt);
 ctx.lineTo(xr,yb2);
@@ -146,24 +146,24 @@ ctx.lineTo(xl,yt2);
 }
 ctx.closePath();
 }});
-var _29=[];
+var _11=[];
 (function(){
 var u=ga.curvePI4;
-_29.push(u.s,u.c1,u.c2,u.e);
+_11.push(u.s,u.c1,u.c2,u.e);
 for(var a=45;a<360;a+=45){
 var r=m.rotateg(a);
-_29.push(mp(r,u.c1),mp(r,u.c2),mp(r,u.e));
+_11.push(mp(r,u.c1),mp(r,u.c2),mp(r,u.e));
 }
 })();
 dojo.declare("dojox.gfx.Ellipse",gs.Ellipse,{setShape:function(){
 g.Ellipse.superclass.setShape.apply(this,arguments);
 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,_29[0]);
+t=mp(M,_11[0]);
 r.push([t.x,t.y]);
-for(var i=1;i<_29.length;i+=3){
-c1=mp(M,_29[i]);
-c2=mp(M,_29[i+1]);
-t=mp(M,_29[i+2]);
+for(var i=1;i<_11.length;i+=3){
+c1=mp(M,_11[i]);
+c2=mp(M,_11[i+1]);
+t=mp(M,_11[i+2]);
 r.push([c1.x,c1.y,c2.x,c2.y,t.x,t.y]);
 }
 this.canvasEllipse=r;
@@ -180,7 +180,7 @@ ctx.closePath();
 dojo.declare("dojox.gfx.Circle",gs.Circle,{_renderShape:function(ctx){
 var s=this.shape;
 ctx.beginPath();
-ctx.arc(s.cx,s.cy,s.r,0,_7,1);
+ctx.arc(s.cx,s.cy,s.r,0,_1,1);
 }});
 dojo.declare("dojox.gfx.Line",gs.Line,{_renderShape:function(ctx){
 var s=this.shape;
@@ -233,17 +233,17 @@ ctx.drawImage(this.canvasImage,s.x,s.y,s.width,s.height);
 dojo.declare("dojox.gfx.Text",gs.Text,{_renderShape:function(ctx){
 var s=this.shape;
 }});
-_12(g.Text,"setFont");
-var _48={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"};
+_a(g.Text,"setFont");
+var _12={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,{constructor:function(){
 this.lastControl={};
 },setShape:function(){
 this.canvasPath=[];
 return g.Path.superclass.setShape.apply(this,arguments);
-},_updateWithSegment:function(_49){
-var _4a=dojo.clone(this.last);
-this[_48[_49.action]](this.canvasPath,_49.action,_49.args);
-this.last=_4a;
+},_updateWithSegment:function(_13){
+var _14=d.clone(this.last);
+this[_12[_13.action]](this.canvasPath,_13.action,_13.args);
+this.last=_14;
 g.Path.superclass._updateWithSegment.apply(this,arguments);
 },_renderShape:function(ctx){
 var r=this.canvasPath;
@@ -251,148 +251,148 @@ ctx.beginPath();
 for(var i=0;i<r.length;i+=2){
 ctx[r[i]].apply(ctx,r[i+1]);
 }
-},_moveToA:function(_4e,_4f,_50){
-_4e.push("moveTo",[_50[0],_50[1]]);
-for(var i=2;i<_50.length;i+=2){
-_4e.push("lineTo",[_50[i],_50[i+1]]);
+},_moveToA:function(_15,_16,_17){
+_15.push("moveTo",[_17[0],_17[1]]);
+for(var i=2;i<_17.length;i+=2){
+_15.push("lineTo",[_17[i],_17[i+1]]);
 }
-this.last.x=_50[_50.length-2];
-this.last.y=_50[_50.length-1];
+this.last.x=_17[_17.length-2];
+this.last.y=_17[_17.length-1];
 this.lastControl={};
-},_moveToR:function(_52,_53,_54){
+},_moveToR:function(_18,_19,_1a){
 if("x" in this.last){
-_52.push("moveTo",[this.last.x+=_54[0],this.last.y+=_54[1]]);
+_18.push("moveTo",[this.last.x+=_1a[0],this.last.y+=_1a[1]]);
 }else{
-_52.push("moveTo",[this.last.x=_54[0],this.last.y=_54[1]]);
+_18.push("moveTo",[this.last.x=_1a[0],this.last.y=_1a[1]]);
 }
-for(var i=2;i<_54.length;i+=2){
-_52.push("lineTo",[this.last.x+=_54[i],this.last.y+=_54[i+1]]);
+for(var i=2;i<_1a.length;i+=2){
+_18.push("lineTo",[this.last.x+=_1a[i],this.last.y+=_1a[i+1]]);
 }
 this.lastControl={};
-},_lineToA:function(_56,_57,_58){
-for(var i=0;i<_58.length;i+=2){
-_56.push("lineTo",[_58[i],_58[i+1]]);
+},_lineToA:function(_1b,_1c,_1d){
+for(var i=0;i<_1d.length;i+=2){
+_1b.push("lineTo",[_1d[i],_1d[i+1]]);
 }
-this.last.x=_58[_58.length-2];
-this.last.y=_58[_58.length-1];
+this.last.x=_1d[_1d.length-2];
+this.last.y=_1d[_1d.length-1];
 this.lastControl={};
-},_lineToR:function(_5a,_5b,_5c){
-for(var i=0;i<_5c.length;i+=2){
-_5a.push("lineTo",[this.last.x+=_5c[i],this.last.y+=_5c[i+1]]);
+},_lineToR:function(_1e,_1f,_20){
+for(var i=0;i<_20.length;i+=2){
+_1e.push("lineTo",[this.last.x+=_20[i],this.last.y+=_20[i+1]]);
 }
 this.lastControl={};
-},_hLineToA:function(_5e,_5f,_60){
-for(var i=0;i<_60.length;++i){
-_5e.push("lineTo",[_60[i],this.last.y]);
+},_hLineToA:function(_21,_22,_23){
+for(var i=0;i<_23.length;++i){
+_21.push("lineTo",[_23[i],this.last.y]);
 }
-this.last.x=_60[_60.length-1];
+this.last.x=_23[_23.length-1];
 this.lastControl={};
-},_hLineToR:function(_62,_63,_64){
-for(var i=0;i<_64.length;++i){
-_62.push("lineTo",[this.last.x+=_64[i],this.last.y]);
+},_hLineToR:function(_24,_25,_26){
+for(var i=0;i<_26.length;++i){
+_24.push("lineTo",[this.last.x+=_26[i],this.last.y]);
 }
 this.lastControl={};
-},_vLineToA:function(_66,_67,_68){
-for(var i=0;i<_68.length;++i){
-_66.push("lineTo",[this.last.x,_68[i]]);
+},_vLineToA:function(_27,_28,_29){
+for(var i=0;i<_29.length;++i){
+_27.push("lineTo",[this.last.x,_29[i]]);
 }
-this.last.y=_68[_68.length-1];
+this.last.y=_29[_29.length-1];
 this.lastControl={};
-},_vLineToR:function(_6a,_6b,_6c){
-for(var i=0;i<_6c.length;++i){
-_6a.push("lineTo",[this.last.x,this.last.y+=_6c[i]]);
+},_vLineToR:function(_2a,_2b,_2c){
+for(var i=0;i<_2c.length;++i){
+_2a.push("lineTo",[this.last.x,this.last.y+=_2c[i]]);
 }
 this.lastControl={};
-},_curveToA:function(_6e,_6f,_70){
-for(var i=0;i<_70.length;i+=6){
-_6e.push("bezierCurveTo",_70.slice(i,i+6));
-}
-this.last.x=_70[_70.length-2];
-this.last.y=_70[_70.length-1];
-this.lastControl.x=_70[_70.length-4];
-this.lastControl.y=_70[_70.length-3];
+},_curveToA:function(_2d,_2e,_2f){
+for(var i=0;i<_2f.length;i+=6){
+_2d.push("bezierCurveTo",_2f.slice(i,i+6));
+}
+this.last.x=_2f[_2f.length-2];
+this.last.y=_2f[_2f.length-1];
+this.lastControl.x=_2f[_2f.length-4];
+this.lastControl.y=_2f[_2f.length-3];
 this.lastControl.type="C";
-},_curveToR:function(_72,_73,_74){
-for(var i=0;i<_74.length;i+=6){
-_72.push("bezierCurveTo",[this.last.x+_74[i],this.last.y+_74[i+1],this.lastControl.x=this.last.x+_74[i+2],this.lastControl.y=this.last.y+_74[i+3],this.last.x+_74[i+4],this.last.y+_74[i+5]]);
-this.last.x+=_74[i+4];
-this.last.y+=_74[i+5];
+},_curveToR:function(_30,_31,_32){
+for(var i=0;i<_32.length;i+=6){
+_30.push("bezierCurveTo",[this.last.x+_32[i],this.last.y+_32[i+1],this.lastControl.x=this.last.x+_32[i+2],this.lastControl.y=this.last.y+_32[i+3],this.last.x+_32[i+4],this.last.y+_32[i+5]]);
+this.last.x+=_32[i+4];
+this.last.y+=_32[i+5];
 }
 this.lastControl.type="C";
-},_smoothCurveToA:function(_76,_77,_78){
-for(var i=0;i<_78.length;i+=4){
-var _7a=this.lastControl.type=="C";
-_76.push("bezierCurveTo",[_7a?2*this.last.x-this.lastControl.x:this.last.x,_7a?2*this.last.y-this.lastControl.y:this.last.y,_78[i],_78[i+1],_78[i+2],_78[i+3]]);
-this.lastControl.x=_78[i];
-this.lastControl.y=_78[i+1];
+},_smoothCurveToA:function(_33,_34,_35){
+for(var i=0;i<_35.length;i+=4){
+var _36=this.lastControl.type=="C";
+_33.push("bezierCurveTo",[_36?2*this.last.x-this.lastControl.x:this.last.x,_36?2*this.last.y-this.lastControl.y:this.last.y,_35[i],_35[i+1],_35[i+2],_35[i+3]]);
+this.lastControl.x=_35[i];
+this.lastControl.y=_35[i+1];
 this.lastControl.type="C";
 }
-this.last.x=_78[_78.length-2];
-this.last.y=_78[_78.length-1];
-},_smoothCurveToR:function(_7b,_7c,_7d){
-for(var i=0;i<_7d.length;i+=4){
-var _7f=this.lastControl.type=="C";
-_7b.push("bezierCurveTo",[_7f?2*this.last.x-this.lastControl.x:this.last.x,_7f?2*this.last.y-this.lastControl.y:this.last.y,this.last.x+_7d[i],this.last.y+_7d[i+1],this.last.x+_7d[i+2],this.last.y+_7d[i+3]]);
-this.lastControl.x=this.last.x+_7d[i];
-this.lastControl.y=this.last.y+_7d[i+1];
+this.last.x=_35[_35.length-2];
+this.last.y=_35[_35.length-1];
+},_smoothCurveToR:function(_37,_38,_39){
+for(var i=0;i<_39.length;i+=4){
+var _3a=this.lastControl.type=="C";
+_37.push("bezierCurveTo",[_3a?2*this.last.x-this.lastControl.x:this.last.x,_3a?2*this.last.y-this.lastControl.y:this.last.y,this.last.x+_39[i],this.last.y+_39[i+1],this.last.x+_39[i+2],this.last.y+_39[i+3]]);
+this.lastControl.x=this.last.x+_39[i];
+this.lastControl.y=this.last.y+_39[i+1];
 this.lastControl.type="C";
-this.last.x+=_7d[i+2];
-this.last.y+=_7d[i+3];
+this.last.x+=_39[i+2];
+this.last.y+=_39[i+3];
 }
-},_qCurveToA:function(_80,_81,_82){
-for(var i=0;i<_82.length;i+=4){
-_80.push("quadraticCurveTo",_82.slice(i,i+4));
+},_qCurveToA:function(_3b,_3c,_3d){
+for(var i=0;i<_3d.length;i+=4){
+_3b.push("quadraticCurveTo",_3d.slice(i,i+4));
 }
-this.last.x=_82[_82.length-2];
-this.last.y=_82[_82.length-1];
-this.lastControl.x=_82[_82.length-4];
-this.lastControl.y=_82[_82.length-3];
+this.last.x=_3d[_3d.length-2];
+this.last.y=_3d[_3d.length-1];
+this.lastControl.x=_3d[_3d.length-4];
+this.lastControl.y=_3d[_3d.length-3];
 this.lastControl.type="Q";
-},_qCurveToR:function(_84,_85,_86){
-for(var i=0;i<_86.length;i+=4){
-_84.push("quadraticCurveTo",[this.lastControl.x=this.last.x+_86[i],this.lastControl.y=this.last.y+_86[i+1],this.last.x+_86[i+2],this.last.y+_86[i+3]]);
-this.last.x+=_86[i+2];
-this.last.y+=_86[i+3];
+},_qCurveToR:function(_3e,_3f,_40){
+for(var i=0;i<_40.length;i+=4){
+_3e.push("quadraticCurveTo",[this.lastControl.x=this.last.x+_40[i],this.lastControl.y=this.last.y+_40[i+1],this.last.x+_40[i+2],this.last.y+_40[i+3]]);
+this.last.x+=_40[i+2];
+this.last.y+=_40[i+3];
 }
 this.lastControl.type="Q";
-},_qSmoothCurveToA:function(_88,_89,_8a){
-for(var i=0;i<_8a.length;i+=2){
-var _8c=this.lastControl.type=="Q";
-_88.push("quadraticCurveTo",[this.lastControl.x=_8c?2*this.last.x-this.lastControl.x:this.last.x,this.lastControl.y=_8c?2*this.last.y-this.lastControl.y:this.last.y,_8a[i],_8a[i+1]]);
+},_qSmoothCurveToA:function(_41,_42,_43){
+for(var i=0;i<_43.length;i+=2){
+var _44=this.lastControl.type=="Q";
+_41.push("quadraticCurveTo",[this.lastControl.x=_44?2*this.last.x-this.lastControl.x:this.last.x,this.lastControl.y=_44?2*this.last.y-this.lastControl.y:this.last.y,_43[i],_43[i+1]]);
 this.lastControl.type="Q";
 }
-this.last.x=_8a[_8a.length-2];
-this.last.y=_8a[_8a.length-1];
-},_qSmoothCurveToR:function(_8d,_8e,_8f){
-for(var i=0;i<_8f.length;i+=2){
-var _91=this.lastControl.type=="Q";
-_8d.push("quadraticCurveTo",[this.lastControl.x=_91?2*this.last.x-this.lastControl.x:this.last.x,this.lastControl.y=_91?2*this.last.y-this.lastControl.y:this.last.y,this.last.x+_8f[i],this.last.y+_8f[i+1]]);
+this.last.x=_43[_43.length-2];
+this.last.y=_43[_43.length-1];
+},_qSmoothCurveToR:function(_45,_46,_47){
+for(var i=0;i<_47.length;i+=2){
+var _48=this.lastControl.type=="Q";
+_45.push("quadraticCurveTo",[this.lastControl.x=_48?2*this.last.x-this.lastControl.x:this.last.x,this.lastControl.y=_48?2*this.last.y-this.lastControl.y:this.last.y,this.last.x+_47[i],this.last.y+_47[i+1]]);
 this.lastControl.type="Q";
-this.last.x+=_8f[i];
-this.last.y+=_8f[i+1];
-}
-},_arcTo:function(_92,_93,_94){
-var _95=_93=="a";
-for(var i=0;i<_94.length;i+=7){
-var x1=_94[i+5],y1=_94[i+6];
-if(_95){
+this.last.x+=_47[i];
+this.last.y+=_47[i+1];
+}
+},_arcTo:function(_49,_4a,_4b){
+var _4c=_4a=="a";
+for(var i=0;i<_4b.length;i+=7){
+var x1=_4b[i+5],y1=_4b[i+6];
+if(_4c){
 x1+=this.last.x;
 y1+=this.last.y;
 }
-var _99=ga.arcAsBezier(this.last,_94[i],_94[i+1],_94[i+2],_94[i+3]?1:0,_94[i+4]?1:0,x1,y1);
-dojo.forEach(_99,function(p){
-_92.push("bezierCurveTo",p);
+var _4d=ga.arcAsBezier(this.last,_4b[i],_4b[i+1],_4b[i+2],_4b[i+3]?1:0,_4b[i+4]?1:0,x1,y1);
+d.forEach(_4d,function(p){
+_49.push("bezierCurveTo",p);
 });
 this.last.x=x1;
 this.last.y=y1;
 }
 this.lastControl={};
-},_closePath:function(_9b,_9c,_9d){
-_9b.push("closePath",[]);
+},_closePath:function(_4e,_4f,_50){
+_4e.push("closePath",[]);
 this.lastControl={};
 }});
-dojo.forEach(["moveTo","lineTo","hLineTo","vLineTo","curveTo","smoothCurveTo","qCurveTo","qSmoothCurveTo","arcTo","closePath"],function(_9e){
-_12(g.Path,_9e);
+d.forEach(["moveTo","lineTo","hLineTo","vLineTo","curveTo","smoothCurveTo","qCurveTo","qSmoothCurveTo","arcTo","closePath"],function(_51){
+_a(g.Path,_51);
 });
 dojo.declare("dojox.gfx.TextPath",g.path.TextPath,{_renderShape:function(ctx){
 var s=this.shape;
@@ -401,14 +401,14 @@ dojo.declare("dojox.gfx.Surface",gs.Surface,{constructor:function(){
 gs.Container._init.call(this);
 this.pendingImageCount=0;
 this.makeDirty();
-},setDimensions:function(_a1,_a2){
-this.width=g.normalizedLength(_a1);
-this.height=g.normalizedLength(_a2);
+},setDimensions:function(_52,_53){
+this.width=g.normalizedLength(_52);
+this.height=g.normalizedLength(_53);
 if(!this.rawNode){
 return this;
 }
-this.rawNode.width=_a1;
-this.rawNode.height=_a2;
+this.rawNode.width=_52;
+this.rawNode.height=_53;
 this.makeDirty();
 return this;
 },getDimensions:function(){
@@ -430,17 +430,17 @@ delete this.pendingRender;
 }
 },makeDirty:function(){
 if(!this.pendingImagesCount&&!("pendingRender" in this)){
-this.pendingRender=setTimeout(dojo.hitch(this,this._render),0);
+this.pendingRender=setTimeout(d.hitch(this,this._render),0);
 }
 },downloadImage:function(img,url){
-var _a7=dojo.hitch(this,this.onImageLoad);
+var _54=d.hitch(this,this.onImageLoad);
 if(!this.pendingImageCount++&&"pendingRender" in this){
 clearTimeout(this.pendingRender);
 delete this.pendingRender;
 }
-img.onload=_a7;
-img.onerror=_a7;
-img.onabort=_a7;
+img.onload=_54;
+img.onerror=_54;
+img.onabort=_54;
 img.src=url;
 },onImageLoad:function(){
 if(!--this.pendingImageCount){
@@ -451,48 +451,53 @@ return null;
 },connect:function(){
 },disconnect:function(){
 }});
-g.createSurface=function(_a8,_a9,_aa){
-if(!_a9){
-_a9="100%";
+g.createSurface=function(_55,_56,_57){
+if(!_56&&!_57){
+var pos=d.position(_55);
+_56=_56||pos.w;
+_57=_57||pos.h;
 }
-if(!_aa){
-_aa="100%";
+if(typeof _56=="number"){
+_56=_56+"px";
 }
-var s=new g.Surface(),p=dojo.byId(_a8),c=p.ownerDocument.createElement("canvas");
-c.width=_a9;
-c.height=_aa;
+if(typeof _57=="number"){
+_57=_57+"px";
+}
+var s=new g.Surface(),p=d.byId(_55),c=p.ownerDocument.createElement("canvas");
+c.width=dojox.gfx.normalizedLength(_56);
+c.height=dojox.gfx.normalizedLength(_57);
 p.appendChild(c);
 s.rawNode=c;
 s._parent=p;
 s.surface=s;
 return s;
 };
-var C=gs.Container,_af={add:function(_b0){
+var C=gs.Container,_58={add:function(_59){
 this.surface.makeDirty();
 return C.add.apply(this,arguments);
-},remove:function(_b1,_b2){
+},remove:function(_5a,_5b){
 this.surface.makeDirty();
 return C.remove.apply(this,arguments);
 },clear:function(){
 this.surface.makeDirty();
 return C.clear.apply(this,arguments);
-},_moveChildToFront:function(_b3){
+},_moveChildToFront:function(_5c){
 this.surface.makeDirty();
 return C._moveChildToFront.apply(this,arguments);
-},_moveChildToBack:function(_b4){
+},_moveChildToBack:function(_5d){
 this.surface.makeDirty();
 return C._moveChildToBack.apply(this,arguments);
 }};
-dojo.mixin(gs.Creator,{createObject:function(_b5,_b6){
-var _b7=new _b5();
-_b7.surface=this.surface;
-_b7.setShape(_b6);
-this.add(_b7);
-return _b7;
+d.mixin(gs.Creator,{createObject:function(_5e,_5f){
+var _60=new _5e();
+_60.surface=this.surface;
+_60.setShape(_5f);
+this.add(_60);
+return _60;
 }});
-dojo.extend(g.Group,_af);
-dojo.extend(g.Group,gs.Creator);
-dojo.extend(g.Surface,_af);
-dojo.extend(g.Surface,gs.Creator);
+d.extend(g.Group,_58);
+d.extend(g.Group,gs.Creator);
+d.extend(g.Surface,_58);
+d.extend(g.Surface,gs.Creator);
 })();
 }
diff --git a/dojox/gfx/decompose.js b/dojox/gfx/decompose.js
index 91bb944..fcdb844 100644
--- a/dojox/gfx/decompose.js
+++ b/dojox/gfx/decompose.js
@@ -14,7 +14,7 @@ var m=dojox.gfx.matrix;
 var eq=function(a,b){
 return Math.abs(a-b)<=0.000001*(Math.abs(a)+Math.abs(b));
 };
-var _5=function(r1,m1,r2,m2){
+var _1=function(r1,m1,r2,m2){
 if(!isFinite(r1)){
 return r2;
 }else{
@@ -25,82 +25,82 @@ return r1;
 m1=Math.abs(m1),m2=Math.abs(m2);
 return (m1*r1+m2*r2)/(m1+m2);
 };
-var _a=function(_b){
-var M=new m.Matrix2D(_b);
+var _2=function(_3){
+var M=new m.Matrix2D(_3);
 return dojo.mixin(M,{dx:0,dy:0,xy:M.yx,yx:M.xy});
 };
-var _d=function(_e){
-return (_e.xx*_e.yy<0||_e.xy*_e.yx>0)?-1:1;
+var _4=function(_5){
+return (_5.xx*_5.yy<0||_5.xy*_5.yx>0)?-1:1;
 };
-var _f=function(_10){
-var M=m.normalize(_10),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;
+var _6=function(_7){
+var M=m.normalize(_7),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,_8=M.xy/(l1-M.xx),_9=1,_a=M.xy/(l2-M.xx),_b=1;
 if(eq(l1,l2)){
-vx1=1,vy1=0,vx2=0,vy2=1;
+_8=1,_9=0,_a=0,_b=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(_8)){
+_8=1,_9=(l1-M.xx)/M.xy;
+if(!isFinite(_9)){
+_8=(l1-M.yy)/M.yx,_9=1;
+if(!isFinite(_8)){
+_8=1,_9=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);
+if(!isFinite(_a)){
+_a=1,_b=(l2-M.xx)/M.xy;
+if(!isFinite(_b)){
+_a=(l2-M.yy)/M.yx,_b=1;
+if(!isFinite(_a)){
+_a=1,_b=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;
+var d1=Math.sqrt(_8*_8+_9*_9),d2=Math.sqrt(_a*_a+_b*_b);
+if(!isFinite(_8/=d1)){
+_8=0;
 }
-if(!isFinite(vy1/=d1)){
-vy1=0;
+if(!isFinite(_9/=d1)){
+_9=0;
 }
-if(!isFinite(vx2/=d2)){
-vx2=0;
+if(!isFinite(_a/=d2)){
+_a=0;
 }
-if(!isFinite(vy2/=d2)){
-vy2=0;
+if(!isFinite(_b/=d2)){
+_b=0;
 }
-return {value1:l1,value2:l2,vector1:{x:vx1,y:vy1},vector2:{x:vx2,y:vy2}};
+return {value1:l1,value2:l2,vector1:{x:_8,y:_9},vector2:{x:_a,y:_b}};
 };
-var _1d=function(M,_1f){
-var _20=_d(M),a=_1f.angle1=(Math.atan2(M.yx,M.yy)+Math.atan2(-_20*M.xy,_20*M.xx))/2,cos=Math.cos(a),sin=Math.sin(a);
-_1f.sx=_5(M.xx/cos,cos,-M.xy/sin,sin);
-_1f.sy=_5(M.yy/cos,cos,M.yx/sin,sin);
-return _1f;
+var _c=function(M,_d){
+var _e=_4(M),a=_d.angle1=(Math.atan2(M.yx,M.yy)+Math.atan2(-_e*M.xy,_e*M.xx))/2,_f=Math.cos(a),sin=Math.sin(a);
+_d.sx=_1(M.xx/_f,_f,-M.xy/sin,sin);
+_d.sy=_1(M.yy/_f,_f,M.yx/sin,sin);
+return _d;
 };
-var _24=function(M,_26){
-var _27=_d(M),a=_26.angle2=(Math.atan2(_27*M.yx,_27*M.xx)+Math.atan2(-M.xy,M.yy))/2,cos=Math.cos(a),sin=Math.sin(a);
-_26.sx=_5(M.xx/cos,cos,M.yx/sin,sin);
-_26.sy=_5(M.yy/cos,cos,-M.xy/sin,sin);
-return _26;
+var _10=function(M,_11){
+var _12=_4(M),a=_11.angle2=(Math.atan2(_12*M.yx,_12*M.xx)+Math.atan2(-M.xy,M.yy))/2,cos=Math.cos(a),sin=Math.sin(a);
+_11.sx=_1(M.xx/cos,cos,M.yx/sin,sin);
+_11.sy=_1(M.yy/cos,cos,-M.xy/sin,sin);
+return _11;
 };
-dojox.gfx.decompose=function(_2b){
-var M=m.normalize(_2b),_2d={dx:M.dx,dy:M.dy,sx:1,sy:1,angle1:0,angle2:0};
+dojox.gfx.decompose=function(_13){
+var M=m.normalize(_13),_14={dx:M.dx,dy:M.dy,sx:1,sy:1,angle1:0,angle2:0};
 if(eq(M.xy,0)&&eq(M.yx,0)){
-return dojo.mixin(_2d,{sx:M.xx,sy:M.yy});
+return dojo.mixin(_14,{sx:M.xx,sy:M.yy});
 }
 if(eq(M.xx*M.yx,-M.xy*M.yy)){
-return _1d(M,_2d);
+return _c(M,_14);
 }
 if(eq(M.xx*M.xy,-M.yx*M.yy)){
-return _24(M,_2d);
-}
-var MT=_a(M),u=_f([M,MT]),v=_f([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)]);
-_1d(VT,_2d);
-S.xx*=_2d.sx;
-S.yy*=_2d.sy;
-_24(U,_2d);
-S.xx*=_2d.sx;
-S.yy*=_2d.sy;
-return dojo.mixin(_2d,{sx:S.xx,sy:S.yy});
+return _10(M,_14);
+}
+var MT=_2(M),u=_6([M,MT]),v=_6([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)]);
+_c(VT,_14);
+S.xx*=_14.sx;
+S.yy*=_14.sy;
+_10(U,_14);
+S.xx*=_14.sx;
+S.yy*=_14.sy;
+return dojo.mixin(_14,{sx:S.xx,sy:S.yy});
 };
 })();
 }
diff --git a/dojox/gfx/fx.js b/dojox/gfx/fx.js
index c3b42c1..46a44d9 100644
--- a/dojox/gfx/fx.js
+++ b/dojox/gfx/fx.js
@@ -11,49 +11,49 @@ dojo.provide("dojox.gfx.fx");
 dojo.require("dojox.gfx.matrix");
 (function(){
 var d=dojo,g=dojox.gfx,m=g.matrix;
-var _4=function(_5,_6){
-this.start=_5,this.end=_6;
+var _1=function(_2,_3){
+this.start=_2,this.end=_3;
 };
-d.extend(_4,{getValue:function(r){
+d.extend(_1,{getValue:function(r){
 return (this.end-this.start)*r+this.start;
 }});
-var _8=function(_9,_a,_b){
-this.start=_9,this.end=_a;
-this.unit=_b;
+var _4=function(_5,_6,_7){
+this.start=_5,this.end=_6;
+this.units=_7;
 };
-d.extend(_8,{getValue:function(r){
-return (this.end-this.start)*r+this.start+this.unit;
+d.extend(_4,{getValue:function(r){
+return (this.end-this.start)*r+this.start+this.units;
 }});
-var _d=function(_e,_f){
-this.start=_e,this.end=_f;
+var _8=function(_9,_a){
+this.start=_9,this.end=_a;
 this.temp=new dojo.Color();
 };
-d.extend(_d,{getValue:function(r){
+d.extend(_8,{getValue:function(r){
 return d.blendColors(this.start,this.end,r,this.temp);
 }});
-var _11=function(_12){
-this.values=_12;
-this.length=_12.length;
+var _b=function(_c){
+this.values=_c;
+this.length=_c.length;
 };
-d.extend(_11,{getValue:function(r){
+d.extend(_b,{getValue:function(r){
 return this.values[Math.min(Math.floor(r*this.length),this.length-1)];
 }});
-var _14=function(_15,def){
-this.values=_15;
-this.def=def?def:{};
+var _d=function(_e,_f){
+this.values=_e;
+this.def=_f?_f:{};
 };
-d.extend(_14,{getValue:function(r){
+d.extend(_d,{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 _1a=function(_1b,_1c){
-this.stack=_1b;
-this.original=_1c;
+var _10=function(_11,_12){
+this.stack=_11;
+this.original=_12;
 };
-d.extend(_1a,{getValue:function(r){
+d.extend(_10,{getValue:function(r){
 var ret=[];
 dojo.forEach(this.stack,function(t){
 if(t instanceof m.Matrix2D){
@@ -74,154 +74,154 @@ return;
 }
 var val=dojo.map(t.start,function(v,i){
 return (t.end[i]-v)*r+v;
-}),_24=f.apply(m,val);
-if(_24 instanceof m.Matrix2D){
-ret.push(_24);
+}),_13=f.apply(m,val);
+if(_13 instanceof m.Matrix2D){
+ret.push(_13);
 }
 },this);
 return ret;
 }});
-var _25=new d.Color(0,0,0,0);
-var _26=function(_27,obj,_29,def){
-if(_27.values){
-return new _11(_27.values);
-}
-var _2b,_2c,end;
-if(_27.start){
-_2c=g.normalizeColor(_27.start);
+var _14=new d.Color(0,0,0,0);
+var _15=function(_16,obj,_17,def){
+if(_16.values){
+return new _b(_16.values);
+}
+var _18,_19,end;
+if(_16.start){
+_19=g.normalizeColor(_16.start);
 }else{
-_2c=_2b=obj?(_29?obj[_29]:obj):def;
+_19=_18=obj?(_17?obj[_17]:obj):def;
 }
-if(_27.end){
-end=g.normalizeColor(_27.end);
+if(_16.end){
+end=g.normalizeColor(_16.end);
 }else{
-if(!_2b){
-_2b=obj?(_29?obj[_29]:obj):def;
+if(!_18){
+_18=obj?(_17?obj[_17]:obj):def;
 }
-end=_2b;
+end=_18;
 }
-return new _d(_2c,end);
+return new _8(_19,end);
 };
-var _2e=function(_2f,obj,_31,def){
-if(_2f.values){
-return new _11(_2f.values);
+var _1a=function(_1b,obj,_1c,def){
+if(_1b.values){
+return new _b(_1b.values);
 }
-var _33,_34,end;
-if(_2f.start){
-_34=_2f.start;
+var _1d,_1e,end;
+if(_1b.start){
+_1e=_1b.start;
 }else{
-_34=_33=obj?obj[_31]:def;
+_1e=_1d=obj?obj[_1c]:def;
 }
-if(_2f.end){
-end=_2f.end;
+if(_1b.end){
+end=_1b.end;
 }else{
-if(typeof _33!="number"){
-_33=obj?obj[_31]:def;
+if(typeof _1d!="number"){
+_1d=obj?obj[_1c]:def;
 }
-end=_33;
+end=_1d;
 }
-return new _4(_34,end);
+return new _1(_1e,end);
 };
-g.fx.animateStroke=function(_36){
-if(!_36.easing){
-_36.easing=d._defaultEasing;
-}
-var _37=new d._Animation(_36),_38=_36.shape,_39;
-d.connect(_37,"beforeBegin",_37,function(){
-_39=_38.getStroke();
-var _3a=_36.color,_3b={},_3c,_3d,end;
-if(_3a){
-_3b.color=_26(_3a,_39,"color",_25);
-}
-_3a=_36.style;
-if(_3a&&_3a.values){
-_3b.style=new _11(_3a.values);
-}
-_3a=_36.width;
-if(_3a){
-_3b.width=_2e(_3a,_39,"width",1);
-}
-_3a=_36.cap;
-if(_3a&&_3a.values){
-_3b.cap=new _11(_3a.values);
-}
-_3a=_36.join;
-if(_3a){
-if(_3a.values){
-_3b.join=new _11(_3a.values);
+g.fx.animateStroke=function(_1f){
+if(!_1f.easing){
+_1f.easing=d._defaultEasing;
+}
+var _20=new d.Animation(_1f),_21=_1f.shape,_22;
+d.connect(_20,"beforeBegin",_20,function(){
+_22=_21.getStroke();
+var _23=_1f.color,_24={},_25,_26,end;
+if(_23){
+_24.color=_15(_23,_22,"color",_14);
+}
+_23=_1f.style;
+if(_23&&_23.values){
+_24.style=new _b(_23.values);
+}
+_23=_1f.width;
+if(_23){
+_24.width=_1a(_23,_22,"width",1);
+}
+_23=_1f.cap;
+if(_23&&_23.values){
+_24.cap=new _b(_23.values);
+}
+_23=_1f.join;
+if(_23){
+if(_23.values){
+_24.join=new _b(_23.values);
 }else{
-_3d=_3a.start?_3a.start:(_39&&_39.join||0);
-end=_3a.end?_3a.end:(_39&&_39.join||0);
-if(typeof _3d=="number"&&typeof end=="number"){
-_3b.join=new _4(_3d,end);
+_26=_23.start?_23.start:(_22&&_22.join||0);
+end=_23.end?_23.end:(_22&&_22.join||0);
+if(typeof _26=="number"&&typeof end=="number"){
+_24.join=new _1(_26,end);
 }
 }
 }
-this.curve=new _14(_3b,_39);
+this.curve=new _d(_24,_22);
 });
-d.connect(_37,"onAnimate",_38,"setStroke");
-return _37;
+d.connect(_20,"onAnimate",_21,"setStroke");
+return _20;
 };
-g.fx.animateFill=function(_3f){
-if(!_3f.easing){
-_3f.easing=d._defaultEasing;
+g.fx.animateFill=function(_27){
+if(!_27.easing){
+_27.easing=d._defaultEasing;
 }
-var _40=new d._Animation(_3f),_41=_3f.shape,_42;
-d.connect(_40,"beforeBegin",_40,function(){
-_42=_41.getFill();
-var _43=_3f.color,_44={};
-if(_43){
-this.curve=_26(_43,_42,"",_25);
+var _28=new d.Animation(_27),_29=_27.shape,_2a;
+d.connect(_28,"beforeBegin",_28,function(){
+_2a=_29.getFill();
+var _2b=_27.color,_2c={};
+if(_2b){
+this.curve=_15(_2b,_2a,"",_14);
 }
 });
-d.connect(_40,"onAnimate",_41,"setFill");
-return _40;
+d.connect(_28,"onAnimate",_29,"setFill");
+return _28;
 };
-g.fx.animateFont=function(_45){
-if(!_45.easing){
-_45.easing=d._defaultEasing;
-}
-var _46=new d._Animation(_45),_47=_45.shape,_48;
-d.connect(_46,"beforeBegin",_46,function(){
-_48=_47.getFont();
-var _49=_45.style,_4a={},_4b,_4c,end;
-if(_49&&_49.values){
-_4a.style=new _11(_49.values);
-}
-_49=_45.variant;
-if(_49&&_49.values){
-_4a.variant=new _11(_49.values);
-}
-_49=_45.weight;
-if(_49&&_49.values){
-_4a.weight=new _11(_49.values);
-}
-_49=_45.family;
-if(_49&&_49.values){
-_4a.family=new _11(_49.values);
-}
-_49=_45.size;
-if(_49&&_49.unit){
-_4c=parseFloat(_49.start?_49.start:(_47.font&&_47.font.size||"0"));
-end=parseFloat(_49.end?_49.end:(_47.font&&_47.font.size||"0"));
-_4a.size=new _8(_4c,end,_49.unit);
-}
-this.curve=new _14(_4a,_48);
+g.fx.animateFont=function(_2d){
+if(!_2d.easing){
+_2d.easing=d._defaultEasing;
+}
+var _2e=new d.Animation(_2d),_2f=_2d.shape,_30;
+d.connect(_2e,"beforeBegin",_2e,function(){
+_30=_2f.getFont();
+var _31=_2d.style,_32={},_33,_34,end;
+if(_31&&_31.values){
+_32.style=new _b(_31.values);
+}
+_31=_2d.variant;
+if(_31&&_31.values){
+_32.variant=new _b(_31.values);
+}
+_31=_2d.weight;
+if(_31&&_31.values){
+_32.weight=new _b(_31.values);
+}
+_31=_2d.family;
+if(_31&&_31.values){
+_32.family=new _b(_31.values);
+}
+_31=_2d.size;
+if(_31&&_31.units){
+_34=parseFloat(_31.start?_31.start:(_2f.font&&_2f.font.size||"0"));
+end=parseFloat(_31.end?_31.end:(_2f.font&&_2f.font.size||"0"));
+_32.size=new _4(_34,end,_31.units);
+}
+this.curve=new _d(_32,_30);
 });
-d.connect(_46,"onAnimate",_47,"setFont");
-return _46;
+d.connect(_2e,"onAnimate",_2f,"setFont");
+return _2e;
 };
-g.fx.animateTransform=function(_4e){
-if(!_4e.easing){
-_4e.easing=d._defaultEasing;
-}
-var _4f=new d._Animation(_4e),_50=_4e.shape,_51;
-d.connect(_4f,"beforeBegin",_4f,function(){
-_51=_50.getTransform();
-this.curve=new _1a(_4e.transform,_51);
+g.fx.animateTransform=function(_35){
+if(!_35.easing){
+_35.easing=d._defaultEasing;
+}
+var _36=new d.Animation(_35),_37=_35.shape,_38;
+d.connect(_36,"beforeBegin",_36,function(){
+_38=_37.getTransform();
+this.curve=new _10(_35.transform,_38);
 });
-d.connect(_4f,"onAnimate",_50,"setTransform");
-return _4f;
+d.connect(_36,"onAnimate",_37,"setTransform");
+return _36;
 };
 })();
 }
diff --git a/dojox/gfx/matrix.js b/dojox/gfx/matrix.js
index 72b90c8..7b9a02a 100644
--- a/dojox/gfx/matrix.js
+++ b/dojox/gfx/matrix.js
@@ -10,36 +10,36 @@ dojo._hasResource["dojox.gfx.matrix"]=true;
 dojo.provide("dojox.gfx.matrix");
 (function(){
 var m=dojox.gfx.matrix;
-var _2={};
-m._degToRad=function(_3){
-return _2[_3]||(_2[_3]=(Math.PI*_3/180));
+var _1={};
+m._degToRad=function(_2){
+return _1[_2]||(_1[_2]=(Math.PI*_2/180));
 };
-m._radToDeg=function(_4){
-return _4/Math.PI*180;
+m._radToDeg=function(_3){
+return _3/Math.PI*180;
 };
-m.Matrix2D=function(_5){
-if(_5){
-if(typeof _5=="number"){
-this.xx=this.yy=_5;
+m.Matrix2D=function(_4){
+if(_4){
+if(typeof _4=="number"){
+this.xx=this.yy=_4;
 }else{
-if(_5 instanceof Array){
-if(_5.length>0){
-var _6=m.normalize(_5[0]);
-for(var i=1;i<_5.length;++i){
-var l=_6,r=dojox.gfx.matrix.normalize(_5[i]);
-_6=new m.Matrix2D();
-_6.xx=l.xx*r.xx+l.xy*r.yx;
-_6.xy=l.xx*r.xy+l.xy*r.yy;
-_6.yx=l.yx*r.xx+l.yy*r.yx;
-_6.yy=l.yx*r.xy+l.yy*r.yy;
-_6.dx=l.xx*r.dx+l.xy*r.dy+l.dx;
-_6.dy=l.yx*r.dx+l.yy*r.dy+l.dy;
-}
-dojo.mixin(this,_6);
+if(_4 instanceof Array){
+if(_4.length>0){
+var _5=m.normalize(_4[0]);
+for(var i=1;i<_4.length;++i){
+var l=_5,r=dojox.gfx.matrix.normalize(_4[i]);
+_5=new m.Matrix2D();
+_5.xx=l.xx*r.xx+l.xy*r.yx;
+_5.xy=l.xx*r.xy+l.xy*r.yy;
+_5.yx=l.yx*r.xx+l.yy*r.yx;
+_5.yy=l.yx*r.xy+l.yy*r.yy;
+_5.dx=l.xx*r.dx+l.xy*r.dy+l.dx;
+_5.dy=l.yx*r.dx+l.yy*r.dy+l.dy;
 }
-}else{
 dojo.mixin(this,_5);
 }
+}else{
+dojo.mixin(this,_4);
+}
 }
 }
 };
@@ -57,20 +57,20 @@ if(typeof a=="number"){
 return new m.Matrix2D({xx:a,yy:a});
 }
 return new m.Matrix2D({xx:a.x,yy:a.y});
-},rotate:function(_e){
-var c=Math.cos(_e);
-var s=Math.sin(_e);
+},rotate:function(_6){
+var c=Math.cos(_6);
+var s=Math.sin(_6);
 return new m.Matrix2D({xx:c,xy:-s,yx:s,yy:c});
-},rotateg:function(_11){
-return m.rotate(m._degToRad(_11));
-},skewX:function(_12){
-return new m.Matrix2D({xy:Math.tan(_12)});
-},skewXg:function(_13){
-return m.skewX(m._degToRad(_13));
-},skewY:function(_14){
-return new m.Matrix2D({yx:Math.tan(_14)});
-},skewYg:function(_15){
-return m.skewY(m._degToRad(_15));
+},rotateg:function(_7){
+return m.rotate(m._degToRad(_7));
+},skewX:function(_8){
+return new m.Matrix2D({xy:Math.tan(_8)});
+},skewXg:function(_9){
+return m.skewX(m._degToRad(_9));
+},skewY:function(_a){
+return new m.Matrix2D({yx:Math.tan(_a)});
+},skewYg:function(_b){
+return m.skewY(m._degToRad(_b));
 },reflect:function(a,b){
 if(arguments.length==1){
 b=a.y;
@@ -85,29 +85,29 @@ a=a.x;
 }
 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});
-},normalize:function(_22){
-return (_22 instanceof m.Matrix2D)?_22:new m.Matrix2D(_22);
-},clone:function(_23){
-var obj=new m.Matrix2D();
-for(var i in _23){
-if(typeof (_23[i])=="number"&&typeof (obj[i])=="number"&&obj[i]!=_23[i]){
-obj[i]=_23[i];
-}
-}
-return obj;
-},invert:function(_26){
-var M=m.normalize(_26),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});
+},normalize:function(_c){
+return (_c instanceof m.Matrix2D)?_c:new m.Matrix2D(_c);
+},clone:function(_d){
+var _e=new m.Matrix2D();
+for(var i in _d){
+if(typeof (_d[i])=="number"&&typeof (_e[i])=="number"&&_e[i]!=_d[i]){
+_e[i]=_d[i];
+}
+}
+return _e;
+},invert:function(_f){
+var M=m.normalize(_f),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;
-},_multiplyPoint:function(_29,x,y){
-return {x:_29.xx*x+_29.xy*y+_29.dx,y:_29.yx*x+_29.yy*y+_29.dy};
-},multiplyPoint:function(_2c,a,b){
-var M=m.normalize(_2c);
+},_multiplyPoint:function(_10,x,y){
+return {x:_10.xx*x+_10.xy*y+_10.dx,y:_10.yx*x+_10.yy*y+_10.dy};
+},multiplyPoint:function(_11,a,b){
+var M=m.normalize(_11);
 if(typeof a=="number"&&typeof b=="number"){
 return m._multiplyPoint(M,a,b);
 }
 return m._multiplyPoint(M,a.x,a.y);
-},multiply:function(_30){
-var M=m.normalize(_30);
+},multiply:function(_12){
+var M=m.normalize(_12);
 for(var i=1;i<arguments.length;++i){
 var l=M,r=m.normalize(arguments[i]);
 M=new m.Matrix2D();
@@ -119,8 +119,8 @@ 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;
-},_sandwich:function(_35,x,y){
-return m.multiply(m.translate(x,y),_35,m.translate(-x,-y));
+},_sandwich:function(_13,x,y){
+return m.multiply(m.translate(x,y),_13,m.translate(-x,-y));
 },scaleAt:function(a,b,c,d){
 switch(arguments.length){
 case 4:
@@ -132,36 +132,36 @@ return m._sandwich(m.scale(a),b,c);
 return m._sandwich(m.scale(a,b),c.x,c.y);
 }
 return m._sandwich(m.scale(a),b.x,b.y);
-},rotateAt:function(_3c,a,b){
+},rotateAt:function(_14,a,b){
 if(arguments.length>2){
-return m._sandwich(m.rotate(_3c),a,b);
+return m._sandwich(m.rotate(_14),a,b);
 }
-return m._sandwich(m.rotate(_3c),a.x,a.y);
-},rotategAt:function(_3f,a,b){
+return m._sandwich(m.rotate(_14),a.x,a.y);
+},rotategAt:function(_15,a,b){
 if(arguments.length>2){
-return m._sandwich(m.rotateg(_3f),a,b);
+return m._sandwich(m.rotateg(_15),a,b);
 }
-return m._sandwich(m.rotateg(_3f),a.x,a.y);
-},skewXAt:function(_42,a,b){
+return m._sandwich(m.rotateg(_15),a.x,a.y);
+},skewXAt:function(_16,a,b){
 if(arguments.length>2){
-return m._sandwich(m.skewX(_42),a,b);
+return m._sandwich(m.skewX(_16),a,b);
 }
-return m._sandwich(m.skewX(_42),a.x,a.y);
-},skewXgAt:function(_45,a,b){
+return m._sandwich(m.skewX(_16),a.x,a.y);
+},skewXgAt:function(_17,a,b){
 if(arguments.length>2){
-return m._sandwich(m.skewXg(_45),a,b);
+return m._sandwich(m.skewXg(_17),a,b);
 }
-return m._sandwich(m.skewXg(_45),a.x,a.y);
-},skewYAt:function(_48,a,b){
+return m._sandwich(m.skewXg(_17),a.x,a.y);
+},skewYAt:function(_18,a,b){
 if(arguments.length>2){
-return m._sandwich(m.skewY(_48),a,b);
+return m._sandwich(m.skewY(_18),a,b);
 }
-return m._sandwich(m.skewY(_48),a.x,a.y);
-},skewYgAt:function(_4b,a,b){
+return m._sandwich(m.skewY(_18),a.x,a.y);
+},skewYgAt:function(_19,a,b){
 if(arguments.length>2){
-return m._sandwich(m.skewYg(_4b),a,b);
+return m._sandwich(m.skewYg(_19),a,b);
 }
-return m._sandwich(m.skewYg(_4b),a.x,a.y);
+return m._sandwich(m.skewYg(_19),a.x,a.y);
 }});
 })();
 dojox.gfx.Matrix2D=dojox.gfx.matrix.Matrix2D;
diff --git a/dojox/gfx/path.js b/dojox/gfx/path.js
index 8612651..81f9455 100644
--- a/dojox/gfx/path.js
+++ b/dojox/gfx/path.js
@@ -41,9 +41,9 @@ this.bbox.b=y;
 }else{
 this.bbox={l:x,b:y,r:x,t:y};
 }
-},_updateWithSegment:function(_5){
-var n=_5.args,l=n.length;
-switch(_5.action){
+},_updateWithSegment:function(_3){
+var n=_3.args,l=n.length;
+switch(_3.action){
 case "M":
 case "L":
 case "C":
@@ -72,12 +72,12 @@ this.last.y=n[l-1];
 this.absolute=true;
 break;
 case "m":
-var _9=0;
+var _4=0;
 if(!("x" in this.last)){
 this._updateBBox(this.last.x=n[0],this.last.y=n[1]);
-_9=2;
+_4=2;
 }
-for(var i=_9;i<l;i+=2){
+for(var i=_4;i<l;i+=2){
 this._updateBBox(this.last.x+=n[i],this.last.y+=n[i+1]);
 }
 this.absolute=false;
@@ -132,99 +132,99 @@ this._updateBBox(this.last.x+=n[i+5],this.last.y+=n[i+6]);
 this.absolute=false;
 break;
 }
-var _a=[_5.action];
+var _5=[_3.action];
 for(var i=0;i<l;++i){
-_a.push(dojox.gfx.formatNumber(n[i],true));
+_5.push(dojox.gfx.formatNumber(n[i],true));
 }
 if(typeof this.shape.path=="string"){
-this.shape.path+=_a.join("");
+this.shape.path+=_5.join("");
 }else{
-Array.prototype.push.apply(this.shape.path,_a);
+Array.prototype.push.apply(this.shape.path,_5);
 }
-},_validSegments:{m:2,l:2,h:1,v:1,c:6,s:4,q:4,t:2,a:7,z:0},_pushSegment:function(_b,_c){
-var _d=this._validSegments[_b.toLowerCase()];
-if(typeof _d=="number"){
-if(_d){
-if(_c.length>=_d){
-var _e={action:_b,args:_c.slice(0,_c.length-_c.length%_d)};
-this.segments.push(_e);
-this._updateWithSegment(_e);
+},_validSegments:{m:2,l:2,h:1,v:1,c:6,s:4,q:4,t:2,a:7,z:0},_pushSegment:function(_6,_7){
+var _8=this._validSegments[_6.toLowerCase()];
+if(typeof _8=="number"){
+if(_8){
+if(_7.length>=_8){
+var _9={action:_6,args:_7.slice(0,_7.length-_7.length%_8)};
+this.segments.push(_9);
+this._updateWithSegment(_9);
 }
 }else{
-var _e={action:_b,args:[]};
-this.segments.push(_e);
-this._updateWithSegment(_e);
+var _9={action:_6,args:[]};
+this.segments.push(_9);
+this._updateWithSegment(_9);
 }
 }
-},_collectArgs:function(_f,_10){
-for(var i=0;i<_10.length;++i){
-var t=_10[i];
+},_collectArgs:function(_a,_b){
+for(var i=0;i<_b.length;++i){
+var t=_b[i];
 if(typeof t=="boolean"){
-_f.push(t?1:0);
+_a.push(t?1:0);
 }else{
 if(typeof t=="number"){
-_f.push(t);
+_a.push(t);
 }else{
 if(t instanceof Array){
-this._collectArgs(_f,t);
+this._collectArgs(_a,t);
 }else{
 if("x" in t&&"y" in t){
-_f.push(t.x,t.y);
+_a.push(t.x,t.y);
 }
 }
 }
 }
 }
 },moveTo:function(){
-var _13=[];
-this._collectArgs(_13,arguments);
-this._pushSegment(this.absolute?"M":"m",_13);
+var _c=[];
+this._collectArgs(_c,arguments);
+this._pushSegment(this.absolute?"M":"m",_c);
 return this;
 },lineTo:function(){
-var _14=[];
-this._collectArgs(_14,arguments);
-this._pushSegment(this.absolute?"L":"l",_14);
+var _d=[];
+this._collectArgs(_d,arguments);
+this._pushSegment(this.absolute?"L":"l",_d);
 return this;
 },hLineTo:function(){
-var _15=[];
-this._collectArgs(_15,arguments);
-this._pushSegment(this.absolute?"H":"h",_15);
+var _e=[];
+this._collectArgs(_e,arguments);
+this._pushSegment(this.absolute?"H":"h",_e);
 return this;
 },vLineTo:function(){
-var _16=[];
-this._collectArgs(_16,arguments);
-this._pushSegment(this.absolute?"V":"v",_16);
+var _f=[];
+this._collectArgs(_f,arguments);
+this._pushSegment(this.absolute?"V":"v",_f);
 return this;
 },curveTo:function(){
-var _17=[];
-this._collectArgs(_17,arguments);
-this._pushSegment(this.absolute?"C":"c",_17);
+var _10=[];
+this._collectArgs(_10,arguments);
+this._pushSegment(this.absolute?"C":"c",_10);
 return this;
 },smoothCurveTo:function(){
-var _18=[];
-this._collectArgs(_18,arguments);
-this._pushSegment(this.absolute?"S":"s",_18);
+var _11=[];
+this._collectArgs(_11,arguments);
+this._pushSegment(this.absolute?"S":"s",_11);
 return this;
 },qCurveTo:function(){
-var _19=[];
-this._collectArgs(_19,arguments);
-this._pushSegment(this.absolute?"Q":"q",_19);
+var _12=[];
+this._collectArgs(_12,arguments);
+this._pushSegment(this.absolute?"Q":"q",_12);
 return this;
 },qSmoothCurveTo:function(){
-var _1a=[];
-this._collectArgs(_1a,arguments);
-this._pushSegment(this.absolute?"T":"t",_1a);
+var _13=[];
+this._collectArgs(_13,arguments);
+this._pushSegment(this.absolute?"T":"t",_13);
 return this;
 },arcTo:function(){
-var _1b=[];
-this._collectArgs(_1b,arguments);
-this._pushSegment(this.absolute?"A":"a",_1b);
+var _14=[];
+this._collectArgs(_14,arguments);
+this._pushSegment(this.absolute?"A":"a",_14);
 return this;
 },closePath:function(){
 this._pushSegment("Z",[]);
 return this;
-},_setPath:function(_1c){
-var p=dojo.isArray(_1c)?_1c:_1c.match(dojox.gfx.pathSvgRegExp);
+},_setPath:function(_15){
+var p=dojo.isArray(_15)?_15:_15.match(dojox.gfx.pathSvgRegExp);
 this.segments=[];
 this.absolute=true;
 this.bbox={};
@@ -232,29 +232,29 @@ this.last={};
 if(!p){
 return;
 }
-var _1e="",_1f=[],l=p.length;
+var _16="",_17=[],l=p.length;
 for(var i=0;i<l;++i){
 var t=p[i],x=parseFloat(t);
 if(isNaN(x)){
-if(_1e){
-this._pushSegment(_1e,_1f);
+if(_16){
+this._pushSegment(_16,_17);
 }
-_1f=[];
-_1e=t;
+_17=[];
+_16=t;
 }else{
-_1f.push(x);
+_17.push(x);
 }
 }
-this._pushSegment(_1e,_1f);
-},setShape:function(_24){
-dojox.gfx.Shape.prototype.setShape.call(this,typeof _24=="string"?{path:_24}:_24);
-var _25=this.shape.path;
+this._pushSegment(_16,_17);
+},setShape:function(_18){
+dojox.gfx.Shape.prototype.setShape.call(this,typeof _18=="string"?{path:_18}:_18);
+var _19=this.shape.path;
 this.shape.path=[];
-this._setPath(_25);
+this._setPath(_19);
 this.shape.path=this.shape.path.join("");
 return this;
 },_2PI:Math.PI*2});
-dojo.declare("dojox.gfx.path.TextPath",dojox.gfx.path.Path,{constructor:function(_26){
+dojo.declare("dojox.gfx.path.TextPath",dojox.gfx.path.Path,{constructor:function(_1a){
 if(!("text" in this)){
 this.text=dojo.clone(dojox.gfx.defaultTextPath);
 }
@@ -263,14 +263,14 @@ this.fontStyle=dojo.clone(dojox.gfx.defaultFont);
 }
 },getText:function(){
 return this.text;
-},setText:function(_27){
-this.text=dojox.gfx.makeParameters(this.text,typeof _27=="string"?{text:_27}:_27);
+},setText:function(_1b){
+this.text=dojox.gfx.makeParameters(this.text,typeof _1b=="string"?{text:_1b}:_1b);
 this._setText();
 return this;
 },getFont:function(){
 return this.fontStyle;
-},setFont:function(_28){
-this.fontStyle=typeof _28=="string"?dojox.gfx.splitFontString(_28):dojox.gfx.makeParameters(dojox.gfx.defaultFont,_28);
+},setFont:function(_1c){
+this.fontStyle=typeof _1c=="string"?dojox.gfx.splitFontString(_1c):dojox.gfx.makeParameters(dojox.gfx.defaultFont,_1c);
 this._setFont();
 return this;
 }});
diff --git a/dojox/gfx/resources/gfxSvgProxyFrame.html b/dojox/gfx/resources/gfxSvgProxyFrame.html
new file mode 100644
index 0000000..1a9ed5e
--- /dev/null
+++ b/dojox/gfx/resources/gfxSvgProxyFrame.html
@@ -0,0 +1,14 @@
+<html>
+    <head>
+        <script type="text/javascript">
+    		djConfig = {forceGfxRenderer: "svg"};
+    	</script>
+        <script type="text/javascript" src="../../../dojo/dojo.js" ></script>
+        <script type="text/javascript">
+			dojo.require("dojox.gfx");
+			dojo.require("dojox.gfx.utils");
+        </script>
+    </head>
+    <body>
+    </body>
+</html>
diff --git a/dojox/gfx/resources/svg2gfx-simple.xsl b/dojox/gfx/resources/svg2gfx-simple.xsl
new file mode 100644
index 0000000..90a463f
--- /dev/null
+++ b/dojox/gfx/resources/svg2gfx-simple.xsl
@@ -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) > 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) > 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) > 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) > 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) > 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) > 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) > 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>
diff --git a/dojox/gfx/resources/svg2gfx.xsl b/dojox/gfx/resources/svg2gfx.xsl
new file mode 100644
index 0000000..a8dc5cd
--- /dev/null
+++ b/dojox/gfx/resources/svg2gfx.xsl
@@ -0,0 +1,1046 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY SupportedElements "svg:a|svg:circle|svg:ellipse|svg:g|svg:image|svg:line|svg:path|svg:polygon|svg:polyline|svg:rect|svg:text|svg:textPath|svg:use">
+]>
+<!-- This is a complete rewrite of the original svg2gfx.xslt used for testing. -->
+<!--
+This version supports polygons, polylines, circles, ellipses, rectangles,
+lines, images, text, patterns, linear gradients, radial gradients, transforms
+(although gradient transforms are limited), and more in addition to the
+paths, strokes, groups, and constant fills supported by the original.  It
+even handles little niceties like the SVG use element.  All that being said,
+It does not even come close to supporting all of the features found in SVG,
+but should hopefully be a fairly useful subset.
+
+Caveats: Completely ignores many SVG features (such as named views, filters,
+object bounding box in gradient transforms, etc.).  Now requires properly
+formed SVG (that is, SVG using the appropriate SVG namespace) which most
+editors create by default these days anyhow (the old version required that
+namespaces be stripped off).  Can't convert to GFX constructs that cannot
+be reconstructed from JSON (such as textpath or using vector fonts).
+Requires EXSLT for many transforms. Handles nested styles in a simple way
+that is usually right but sometimes wrong.
+
+Questions / comments / bug reports can be sent to Feneric (on Twitter, IRC,
+GMail, etc.) or Eric (Saugus.net, ShellTown, etc.)
+-->
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+        xmlns:svg="http://www.w3.org/2000/svg"
+	xmlns:xlink="http://www.w3.org/1999/xlink"
+	xmlns:math="http://exslt.org/math"
+	xmlns:exsl="http://exslt.org/common"
+	xmlns:saxon="http://icl.com/saxon"
+	xmlns:xalan="http://xml.apache.org/Xalan"
+	extension-element-prefixes="math exsl saxon xalan">
+	<xsl:output method="text" version="1.0" encoding="UTF-8"/>
+	<xsl:strip-space elements="*"/>
+
+	<!-- We currently need this constant for some transformation calculations. -->
+	<!-- GFX enhancements could obviate it in the future. -->
+	<xsl:variable name="degressInRadian" select="57.295779513082322"/>
+	
+	<!-- The following templates process little bits of things that can often occur in multiple contexts -->
+	
+	<xsl:template name="kill-extra-spaces" mode="kill-extra-spaces">
+		<xsl:param name="string"/>
+		<!-- Some don't feel that SVG is verbose enough and thus add extra spaces, which when -->
+		<!-- untreated can look exactly like delimiters in point sets. -->
+		<xsl:choose>
+			<!-- Hopefully most cases won't have the extra spaces -->
+			<xsl:when test="not(contains($string,', '))">
+				<xsl:value-of select="$string"/>
+			</xsl:when>
+			<xsl:otherwise>
+				<!-- We split at comma / space pairs and recursively chop spaces -->
+				<xsl:call-template name="kill-extra-spaces">
+					<xsl:with-param name="string" select="substring-before($string,', ')"/>
+				</xsl:call-template>
+				<xsl:text>,</xsl:text>
+				<xsl:call-template name="kill-extra-spaces">
+					<xsl:with-param name="string" select="substring-after($string,', ')"/>
+				</xsl:call-template>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+	<xsl:template name="arg-processor" mode="arg-processor">
+		<xsl:param name="values"/>
+		<xsl:param name="labels"/>
+		<!-- Recursively chew through the arguments in a traditional CAR / CDR pattern -->
+		<xsl:variable name="valuesCdr" select="substring-after($values,',')"/>
+		<!-- We're going "backwards" here to take advantage of tail recursion -->
+		<xsl:choose>
+			<xsl:when test="not($valuesCdr)">
+				<!-- handle the final argument -->
+				<xsl:value-of select="$labels"/>
+				<xsl:text>:</xsl:text>
+				<xsl:value-of select="$values"/>
+				<!-- This last trailing comma is needed in the (odd) case of multiple transforms -->
+				<xsl:text>,</xsl:text>
+			</xsl:when>
+			<xsl:otherwise>
+				<!-- handle the current argument -->
+				<xsl:value-of select="substring-before($labels,',')"/>
+				<xsl:text>:</xsl:text>
+				<xsl:value-of select="substring-before($values,',')"/>
+				<xsl:text>,</xsl:text>
+				<xsl:call-template name="arg-processor">
+					<xsl:with-param name="values" select="$valuesCdr"/>
+					<xsl:with-param name="labels" select="substring-after($labels,',')"/>
+				</xsl:call-template>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+	<xsl:template name="background-processor" mode="background-processor">
+		<xsl:param name="background"/>
+		<xsl:choose>
+			<xsl:when test="starts-with($background,'url')">
+				<!-- Check if we have a URL (for a gradient or pattern) -->
+				<xsl:variable name="arguments" select="translate(normalize-space(substring-before(substring-after($background,'('),')')),' ',',')"/>
+				<xsl:call-template name="url-processor">
+					<xsl:with-param name="url" select="$arguments"/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:otherwise>
+				<!-- We probably have a solid color. -->
+				<xsl:call-template name="color-processor">
+					<xsl:with-param name="color" select="$background"/>
+				</xsl:call-template>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+	<xsl:template name="color-processor">
+		<xsl:param name="color"/>
+		<xsl:choose>
+			<xsl:when test="starts-with($color,'rgb')">
+				<!-- Check if we have an RGB triple -->
+				<xsl:variable name="arguments" select="normalize-space(substring-before(substring-after($color,'('),')'))"/>
+				<xsl:call-template name="rgb-triple-processor">
+					<xsl:with-param name="triple" select="$arguments"/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:when test="$color='none'">
+				<!-- Check if we have a literal 'none' -->
+				<!-- Literal nones seem to actually map to black in practice -->
+				<xsl:text>"#000000",</xsl:text>
+			</xsl:when>
+			<xsl:otherwise>
+				<!-- This color could either be by name or value.  Either way, we -->
+				<!-- have to ensure that there are no bogus semi-colons. -->
+				<xsl:text>"</xsl:text>
+				<xsl:value-of select="normalize-space(translate($color,';',' '))"/>
+				<xsl:text>",</xsl:text>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+	<xsl:template name="point-processor" mode="point-processor">
+		<xsl:param name="points"/>
+		<!-- Recursively process points in a traditional CAR / CDR pattern -->
+		<xsl:variable name="pointsCdr" select="normalize-space(substring-after($points,' '))"/>
+		<!-- We're going "backwards" here to take advantage of tail recursion -->
+		<xsl:choose>
+			<xsl:when test="not($pointsCdr)">
+				<!-- handle the final argument -->
+				<xsl:text>{x:</xsl:text>
+				<xsl:value-of select="substring-before($points,',')"/>
+				<xsl:text>,y:</xsl:text>
+				<xsl:value-of select="substring-after($points,',')"/>
+				<xsl:text>},</xsl:text>
+			</xsl:when>
+			<xsl:otherwise>
+				<!-- handle the current argument -->
+				<xsl:variable name="pointsCar" select="substring-before($points,' ')"/>
+				<xsl:text>{x:</xsl:text>
+				<xsl:value-of select="substring-before($pointsCar,',')"/>
+				<xsl:text>,y:</xsl:text>
+				<xsl:value-of select="substring-after($pointsCar,',')"/>
+				<xsl:text>},</xsl:text>
+				<xsl:call-template name="point-processor">
+					<xsl:with-param name="points" select="$pointsCdr"/>
+				</xsl:call-template>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+	
+	<xsl:template name="rgb-triple-processor" mode="rgb-triple-processor">
+		<xsl:param name="triple"/>
+		<!-- Note that as SVG triples cannot contain alpha values, we hardcode it to be fully opaque -->
+		<!-- This could theoretically be better handled by watching for fill-opacity -->
+		<xsl:variable name="red" select="substring-before($triple,',')"/>
+		<xsl:variable name="green" select="substring-before(substring-after($triple,concat($red,',')),',')"/>
+		<xsl:variable name="blue" select="substring-after($triple,concat($red,',',$green,','))"/>
+		<xsl:text>{"r":</xsl:text>
+		<xsl:value-of select="normalize-space($red)"/>
+		<xsl:text>,"g":</xsl:text>
+		<xsl:value-of select="normalize-space($green)"/>
+		<xsl:text>,"b":</xsl:text>
+		<xsl:value-of select="normalize-space($blue)"/>
+		<xsl:text>,"a":1},</xsl:text>
+	</xsl:template>
+	
+	<xsl:template name="styles-processor" mode="styles-processor">
+		<xsl:param name="styles"/>
+		<!-- Recursively chew through the styles in a traditional CAR / CDR pattern -->
+		<xsl:variable name="stylesCdr" select="substring-after($styles,';')"/>
+		<!-- We're going "backwards" here to take advantage of tail recursion -->
+		<xsl:choose>
+			<xsl:when test="not($stylesCdr)">
+				<!-- handle the final style -->
+				<xsl:attribute name="{normalize-space(substring-before($styles,':'))}">
+					<xsl:value-of select="normalize-space(substring-after($styles,':'))"/>
+				</xsl:attribute>
+			</xsl:when>
+			<xsl:otherwise>
+				<!-- handle the current style -->
+				<xsl:variable name="stylesCar" select="substring-before($styles,';')"/>
+				<xsl:attribute name="{normalize-space(substring-before($stylesCar,':'))}">
+					<xsl:value-of select="normalize-space(substring-after($stylesCar,':'))"/>
+				</xsl:attribute>
+				<xsl:call-template name="styles-processor">
+					<xsl:with-param name="styles" select="$stylesCdr"/>
+				</xsl:call-template>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+	<xsl:template name="transform-processor" mode="transform-processor">
+		<xsl:param name="transforms"/>
+		<!-- Recursively chew through the transforms in a traditional CAR / CDR pattern -->
+		<xsl:variable name="transformsCdr" select="normalize-space(substring-after($transforms,')'))"/>
+		<xsl:variable name="arguments" select="translate(normalize-space(substring-before(substring-after($transforms,'('),')')),' ',',')"/>
+		<xsl:choose>
+			<!-- We only handle simple (i.e. nonoverlapping) chained transforms. -->
+			<!-- This covers most real-world cases, and exceptions are generally -->
+			<!-- hand-generated and can likewise be hand fixed. -->
+			<xsl:when test="starts-with($transforms,'matrix')">
+				<xsl:call-template name="arg-processor">
+					<xsl:with-param name="values" select="$arguments"/>
+					<xsl:with-param name="labels" select="string('xx,yx,xy,yy,dx,dy')"/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:when test="starts-with($transforms,'translate')">
+				<!-- If only one argument is provided, it's assumed for both -->
+				<xsl:choose>
+					<xsl:when test="contains($arguments,',')">
+						<xsl:call-template name="arg-processor">
+							<xsl:with-param name="values" select="$arguments"/>
+							<xsl:with-param name="labels" select="string('dx,dy')"/>
+						</xsl:call-template>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:call-template name="arg-processor">
+							<xsl:with-param name="values" select="concat($arguments,',',$arguments)"/>
+							<xsl:with-param name="labels" select="string('dx,dy')"/>
+						</xsl:call-template>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:when>
+			<xsl:when test="starts-with($transforms,'scale')">
+				<!-- If only one argument is provided, it's assumed for both -->
+				<xsl:choose>
+					<xsl:when test="contains($arguments,',')">
+						<xsl:call-template name="arg-processor">
+							<xsl:with-param name="values" select="$arguments"/>
+							<xsl:with-param name="labels" select="string('xx,yy')"/>
+						</xsl:call-template>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:call-template name="arg-processor">
+							<xsl:with-param name="values" select="concat($arguments,',',$arguments)"/>
+							<xsl:with-param name="labels" select="string('xx,yy')"/>
+						</xsl:call-template>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:when>
+			<xsl:when test="starts-with($transforms,'rotate')">
+				<!-- Kluge alert - we're redoing a function GFX aleady provides here because -->
+				<!-- GFX doesn't yet expose it to JSON input. It requires XSLT extensions, too. -->
+				<!-- If you don't have the extensions, comment the following out (bye bye rotate). -->
+				<xsl:choose>
+					<xsl:when test="function-available('math:sin') and function-available('math:cos')">
+						<xsl:variable name="sinOfAngle" select="math:sin($arguments div $degressInRadian)"/>
+						<xsl:variable name="cosOfAngle" select="math:cos($arguments div $degressInRadian)"/>
+						<xsl:variable name="subarguments" select="concat($cosOfAngle,',',-$sinOfAngle,',',$sinOfAngle,',',$cosOfAngle)"/>
+						<xsl:call-template name="arg-processor">
+							<xsl:with-param name="values" select="$subarguments"/>
+							<xsl:with-param name="labels" select="string('xx,yx,xy,yy')"/>
+						</xsl:call-template>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:message>
+							<xsl:text>exslt:sin and exslt:cos must be supported for a rotation.</xsl:text>
+						</xsl:message>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:when>
+			<xsl:when test="starts-with($transforms,'skewX')">
+				<!-- Kluge alert - we're redoing a function GFX aleady provides here because -->
+				<!-- GFX doesn't yet expose it to JSON input. It requires XSLT extensions, too. -->
+				<!-- If you don't have the extensions, comment the following out (bye bye skewX). -->
+				<xsl:choose>
+					<xsl:when test="function-available('math:tan')">
+						<xsl:variable name="tanOfAngle" select="math:tan($arguments div $degressInRadian)"/>
+						<xsl:call-template name="arg-processor">
+							<xsl:with-param name="values" select="$tanOfAngle"/>
+							<xsl:with-param name="labels" select="string('xy')"/>
+						</xsl:call-template>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:message>
+							<xsl:text>exslt:tan must be supported for a skewX.</xsl:text>
+						</xsl:message>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:when>
+			<xsl:when test="starts-with($transforms,'skewY')">
+				<!-- Kluge alert - we're redoing a function GFX aleady provides here because -->
+				<!-- GFX doesn't yet expose it to JSON input. It requires XSLT extensions, too. -->
+				<!-- If you don't have the extensions, comment the following out (bye bye skewY). -->
+				<xsl:choose>
+					<xsl:when test="function-available('math:tan')">
+						<xsl:variable name="tanOfAngle" select="math:tan($arguments div $degressInRadian)"/>
+						<xsl:call-template name="arg-processor">
+							<xsl:with-param name="values" select="$tanOfAngle"/>
+							<xsl:with-param name="labels" select="string('yx')"/>
+						</xsl:call-template>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:message>
+							<xsl:text>exslt:tan must be supported for a skewY.</xsl:text>
+						</xsl:message>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:when>
+		</xsl:choose>
+		<xsl:if test="$transformsCdr">
+			<!-- handle the other transforms -->
+			<xsl:call-template name="transform-processor">
+				<xsl:with-param name="transforms" select="$transformsCdr"/>
+			</xsl:call-template>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template name="url-processor" mode="url-processor">
+		<xsl:param name="url"/>
+		<xsl:param name="groupAttrs" select="''"/>
+		<!-- We can only handle local references; that's probably all we should get anyway -->
+		<xsl:if test="starts-with($url,'#')">
+			<xsl:apply-templates select="id(substring-after($url,'#'))">
+				<xsl:with-param name="groupAttrs" select="$groupAttrs"/>
+			</xsl:apply-templates>
+		</xsl:if>
+	</xsl:template>
+
+	<!-- The following templates help with gradient transforms -->
+
+	<!-- We're temporarily supporting a few SVG features that GFX does not currently support. -->
+	<!-- The biggest of these is gradient transforms; when GFX natively supports it all the -->
+	<!-- kluges made to support it here (including all the following code) should be removed. -->
+	
+	<xsl:template name="gradient-transform-helper" mode="gradient-transform-helper">
+		<!-- This nasty little routine helps gradient adjuster and can be -->
+		<!-- removed when GFX gets gradientTransform support. -->
+		<xsl:param name="cxa"/>
+		<xsl:param name="cya"/>
+		<xsl:param name="x1a"/>
+		<xsl:param name="y1a"/>
+		<xsl:param name="x2a"/>
+		<xsl:param name="y2a"/>
+		<xsl:param name="xx"/>
+		<xsl:param name="xy"/>
+		<xsl:param name="yx"/>
+		<xsl:param name="yy"/>
+		<xsl:param name="dx"/>
+		<xsl:param name="dy"/>
+		<xsl:choose>
+			<xsl:when test="local-name()='radialGradient'">
+				<xsl:variable name="cx" select="$xx*$cxa+$xy*$cya+$dx"/>
+				<xsl:text>cx:</xsl:text>
+				<xsl:value-of select="$cx"/>
+				<xsl:text>,</xsl:text>
+				<xsl:variable name="cy" select="$yx*$cxa+$yy*$cya+$dy"/>
+				<xsl:text>cy:</xsl:text>
+				<xsl:value-of select="$cy"/>
+				<xsl:text>,</xsl:text>
+				<!-- The results for r here are going to just be approximate -->
+				<xsl:variable name="r" select="($cx+$cy) div 2"/>
+				<xsl:text>r:</xsl:text>
+				<xsl:value-of select="$r"/>
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:variable name="x1" select="$xx*$x1a+$xy*$y1a+$dx"/>
+				<xsl:text>x1:</xsl:text>
+				<xsl:value-of select="$x1"/>
+				<xsl:text>,</xsl:text>
+				<xsl:variable name="y1" select="$yx*$x1a+$yy*$y1a+$dy"/>
+				<xsl:text>y1:</xsl:text>
+				<xsl:value-of select="$y1"/>
+				<xsl:text>,</xsl:text>
+				<xsl:variable name="x2" select="$xx*$x2a+$xy*$y2a+$dx"/>
+				<xsl:text>x2:</xsl:text>
+				<xsl:value-of select="$x2"/>
+				<xsl:text>,</xsl:text>
+				<xsl:variable name="y2" select="$yx*$x2a+$yy*$y2a+$dy"/>
+				<xsl:text>y2:</xsl:text>
+				<xsl:value-of select="$y2"/>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+	
+	<xsl:template name="gradient-adjuster" mode="gradient-adjuster">
+		<xsl:param name="node"/>
+		<!-- This code is awful and only meant to serve until GFX gets gradientTransform support. -->
+		<!-- Once GFX does gradientTransforms, the following should be destroyed and forgotten. -->
+		<!-- While this support is better than nothing, it cannot 100% reproduce the effects -->
+		<!-- that true gradientTransform support in GFX could provide. -->
+		<xsl:choose>
+			<xsl:when test="starts-with($node/@gradientTransform,'matrix')">
+				<xsl:variable name="args" select="normalize-space(substring-before(substring-after($node/@gradientTransform,'matrix('),')'))"/>
+				<xsl:variable name="xx" select="substring-before($args,' ')"/>
+				<xsl:variable name="yx" select="substring-before(substring-after($args,' '),' ')"/>
+				<xsl:variable name="xy" select="substring-before(substring-after($args,concat($xx,' ',$yx,' ')),' ')"/>
+				<xsl:variable name="yy" select="substring-before(substring-after($args,concat($xx,' ',$yx,' ',$xy,' ')),' ')"/>
+				<xsl:variable name="dx" select="substring-before(substring-after($args,concat($xx,' ',$yx,' ',$xy,' ',$yy,' ')),' ')"/>
+				<xsl:variable name="dy" select="substring-after($args,concat($xx,' ',$yx,' ',$xy,' ',$yy,' ',$dx,' '))"/>
+				<xsl:call-template name="gradient-transform-helper">
+					<xsl:with-param name="cxa" select="$node/@cx"/>
+					<xsl:with-param name="cya" select="$node/@cy"/>
+					<xsl:with-param name="x1a" select="$node/@x1"/>
+					<xsl:with-param name="y1a" select="$node/@y1"/>
+					<xsl:with-param name="x2a" select="$node/@x2"/>
+					<xsl:with-param name="y2a" select="$node/@y2"/>
+					<xsl:with-param name="xx" select="$xx"/>
+					<xsl:with-param name="yx" select="$yx"/>
+					<xsl:with-param name="xy" select="$xy"/>
+					<xsl:with-param name="yy" select="$yy"/>
+					<xsl:with-param name="dx" select="$dx"/>
+					<xsl:with-param name="dy" select="$dy"/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:when test="starts-with($node/@gradientTransform,'translate')">
+				<xsl:variable name="args" select="normalize-space(substring-before(substring-after($node/@gradientTransform,'translate('),')'))"/>
+				<!-- If only one argument is provided, it's assumed for both -->
+				<xsl:choose>
+					<xsl:when test="contains($args,',')">
+						<xsl:call-template name="gradient-transform-helper">
+							<xsl:with-param name="cxa" select="$node/@cx"/>
+							<xsl:with-param name="cya" select="$node/@cy"/>
+							<xsl:with-param name="x1a" select="$node/@x1"/>
+							<xsl:with-param name="y1a" select="$node/@y1"/>
+							<xsl:with-param name="x2a" select="$node/@x2"/>
+							<xsl:with-param name="y2a" select="$node/@y2"/>
+							<xsl:with-param name="xx" select="1"/>
+							<xsl:with-param name="yx" select="0"/>
+							<xsl:with-param name="xy" select="1"/>
+							<xsl:with-param name="yy" select="0"/>
+							<xsl:with-param name="dx" select="substring-before($args,' ')"/>
+							<xsl:with-param name="dy" select="substring-after($args,' ')"/>
+						</xsl:call-template>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:call-template name="gradient-transform-helper">
+							<xsl:with-param name="cxa" select="$node/@cx"/>
+							<xsl:with-param name="cya" select="$node/@cy"/>
+							<xsl:with-param name="x1a" select="$node/@x1"/>
+							<xsl:with-param name="y1a" select="$node/@y1"/>
+							<xsl:with-param name="x2a" select="$node/@x2"/>
+							<xsl:with-param name="y2a" select="$node/@y2"/>
+							<xsl:with-param name="xx" select="1"/>
+							<xsl:with-param name="yx" select="0"/>
+							<xsl:with-param name="xy" select="1"/>
+							<xsl:with-param name="yy" select="0"/>
+							<xsl:with-param name="dx" select="$args"/>
+							<xsl:with-param name="dy" select="$args"/>
+						</xsl:call-template>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:when>
+			<xsl:when test="starts-with($node/@gradientTransform,'scale')">
+				<xsl:variable name="args" select="normalize-space(substring-before(substring-after($node/@gradientTransform,'scale('),')'))"/>
+				<!-- If only one argument is provided, it's assumed for both -->
+				<xsl:choose>
+					<xsl:when test="contains($args,',')">
+						<xsl:call-template name="gradient-transform-helper">
+							<xsl:with-param name="cxa" select="$node/@cx"/>
+							<xsl:with-param name="cya" select="$node/@cy"/>
+							<xsl:with-param name="x1a" select="$node/@x1"/>
+							<xsl:with-param name="y1a" select="$node/@y1"/>
+							<xsl:with-param name="x2a" select="$node/@x2"/>
+							<xsl:with-param name="y2a" select="$node/@y2"/>
+							<xsl:with-param name="xx" select="substring-before($args,' ')"/>
+							<xsl:with-param name="yx" select="0"/>
+							<xsl:with-param name="xy" select="substring-after($args,' ')"/>
+							<xsl:with-param name="yy" select="0"/>
+							<xsl:with-param name="dx" select="0"/>
+							<xsl:with-param name="dy" select="0"/>
+						</xsl:call-template>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:call-template name="gradient-transform-helper">
+							<xsl:with-param name="cxa" select="$node/@cx"/>
+							<xsl:with-param name="cya" select="$node/@cy"/>
+							<xsl:with-param name="x1a" select="$node/@x1"/>
+							<xsl:with-param name="y1a" select="$node/@y1"/>
+							<xsl:with-param name="x2a" select="$node/@x2"/>
+							<xsl:with-param name="y2a" select="$node/@y2"/>
+							<xsl:with-param name="xx" select="$args"/>
+							<xsl:with-param name="yx" select="0"/>
+							<xsl:with-param name="xy" select="$args"/>
+							<xsl:with-param name="yy" select="0"/>
+							<xsl:with-param name="dx" select="0"/>
+							<xsl:with-param name="dy" select="0"/>
+						</xsl:call-template>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:when>
+			<xsl:otherwise>	<!-- Otherwise it's got to be a rotation -->
+				<xsl:variable name="args" select="normalize-space(substring-before(substring-after($node/@gradientTransform,'rotate('),')'))"/>
+				<xsl:choose>
+					<xsl:when test="function-available('math:sin') and function-available('math:cos')">
+						<xsl:variable name="sinOfAngle" select="math:sin($args div $degressInRadian)"/>
+						<xsl:variable name="cosOfAngle" select="math:cos($args div $degressInRadian)"/>
+						<xsl:call-template name="gradient-transform-helper">
+							<xsl:with-param name="cxa" select="$node/@cx"/>
+							<xsl:with-param name="cya" select="$node/@cy"/>
+							<xsl:with-param name="x1a" select="$node/@x1"/>
+							<xsl:with-param name="y1a" select="$node/@y1"/>
+							<xsl:with-param name="x2a" select="$node/@x2"/>
+							<xsl:with-param name="y2a" select="$node/@y2"/>
+							<xsl:with-param name="xx" select="$cosOfAngle"/>
+							<xsl:with-param name="yx" select="-$sinOfAngle"/>
+							<xsl:with-param name="xy" select="$sinOfAngle"/>
+							<xsl:with-param name="yy" select="$cosOfAngle"/>
+							<xsl:with-param name="dy" select="0"/>
+							<xsl:with-param name="dy" select="0"/>
+						</xsl:call-template>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:message>
+							<xsl:text>exslt:sin and exslt:cos must be supported for a gradient rotation.</xsl:text>
+						</xsl:message>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:otherwise>
+		</xsl:choose>
+		<xsl:text>,</xsl:text>
+	</xsl:template>
+	
+	<!-- The following templates handle related batches of attributes -->
+	
+	<xsl:template name="font">
+		<xsl:param name="node"/>
+		<!-- Only include if we have at least some font properties defined -->
+		<xsl:if test="$node/@font-style or $node/@font-variant or $node/@font-weight or $node/@font-size or $node/@font-family">
+			<xsl:text>font:{ type:"font",</xsl:text>
+			<xsl:if test="$node/@font-style">
+				<xsl:text>style:"</xsl:text>
+				<xsl:value-of select="$node/@font-style"/>
+				<xsl:text>",</xsl:text>
+			</xsl:if>
+			<xsl:if test="$node/@font-variant">
+				<xsl:text>variant:"</xsl:text>
+				<xsl:value-of select="$node/@font-variant"/>
+				<xsl:text>",</xsl:text>
+			</xsl:if>
+			<xsl:if test="$node/@font-weight">
+				<xsl:text>weight:"</xsl:text>
+				<xsl:value-of select="$node/@font-weight"/>
+				<xsl:text>",</xsl:text>
+			</xsl:if>
+			<xsl:if test="$node/@font-size">
+				<xsl:text>size:"</xsl:text>
+				<xsl:value-of select="$node/@font-size"/>
+				<xsl:text>",</xsl:text>
+			</xsl:if>
+			<xsl:if test="$node/@font-family">
+				<xsl:text>family:"</xsl:text>
+				<xsl:value-of select="$node/@font-family"/>
+				<xsl:text>",</xsl:text>
+			</xsl:if>
+			<xsl:text>},</xsl:text>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template name="stroke">
+		<xsl:param name="node"/>
+		<!-- Only include if we have at least some stroke properties defined -->
+		<xsl:if test="$node/@stroke or $node/@stroke-width or $node/@stroke-linecap or $node/@stroke-linejoin">
+			<xsl:text>stroke:{</xsl:text>
+			<!-- We don't currently handle stroke-dasharray or stroke-dashoffset -->
+			<!-- Note that while we'll pass stroke background info, GFX won't yet use it. -->
+			<xsl:if test="$node/@stroke">
+				<xsl:text>color:</xsl:text>
+				<xsl:call-template name="background-processor">
+					<xsl:with-param name="background" select="$node/@stroke"/>
+				</xsl:call-template>
+			</xsl:if>
+			<xsl:if test="$node/@stroke-width">
+				<xsl:text>width:"</xsl:text>
+				<xsl:value-of select="$node/@stroke-width"/>
+				<xsl:text>",</xsl:text>
+			</xsl:if>
+			<xsl:if test="$node/@stroke-linecap">
+				<xsl:text>cap:"</xsl:text>
+				<xsl:value-of select="$node/@stroke-linecap"/>
+				<xsl:text>",</xsl:text>
+			</xsl:if>
+			<xsl:if test="$node/@stroke-linejoin">
+				<xsl:text>join:"</xsl:text>
+				<xsl:value-of select="$node/@stroke-linejoin"/>
+				<xsl:text>",</xsl:text>
+			</xsl:if>
+			<xsl:choose>
+				<!-- This is really cheesy but better than nothing. -->
+				<!-- We probably ought to match a few specific cases when we can. %FIX% -->
+				<xsl:when test="$node/@stroke-dasharray">
+					<xsl:text>style:"Dash",</xsl:text>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:text>style:"Solid",</xsl:text>
+				</xsl:otherwise>
+			</xsl:choose>
+			<xsl:text>},</xsl:text>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template name="common-attributes">
+		<xsl:param name="node"/>
+		<!-- Pretty much every shape has to handle this same batch of attributes. -->
+		<xsl:apply-templates select="$node/@style"/>
+		<!-- Note that we make no effort to guard against overlapping styles. -->
+		<xsl:apply-templates select="$node/@fill"/>
+		<xsl:call-template name="stroke">
+			<xsl:with-param name="node" select="$node"/>
+		</xsl:call-template>
+		<xsl:apply-templates select="$node/@transform"/>
+		<!-- Fonts are actually illegal in most shapes, but including them here doesn't -->
+		<!-- really slow things down much and does clean up code a bit for the shapes -->
+		<!-- that do allow them. -->
+		<xsl:call-template name="font">
+			<xsl:with-param name="node" select="$node"/>
+		</xsl:call-template>
+		<!-- Ditto for stop-colors. -->
+		<xsl:apply-templates select="$node/@stop-color"/>
+	</xsl:template>
+
+	<!-- SVG Attribute Handling -->
+	
+	<xsl:template match="@id">
+		<xsl:text>name:"</xsl:text>
+		<xsl:apply-templates/>
+		<xsl:text>",</xsl:text>
+	</xsl:template>
+	
+	<xsl:template match="@x|@y|@x1|@x2|@y1|@y2|@cx|@cy|@r|@rx|@ry|@fx|@fy|@width|@height|@offset">
+		<!-- Generic attribute followed by comma -->
+		<xsl:value-of select="local-name()"/>
+		<xsl:text>:</xsl:text>
+		<xsl:value-of select="."/>
+		<xsl:text>,</xsl:text>
+	</xsl:template>
+	
+	<xsl:template match="@d">
+		<!-- Used only by path objects; often has tons of extra whitespace -->
+		<xsl:text>path:"</xsl:text>
+		<xsl:value-of select="normalize-space(.)"/>
+		<xsl:text>",</xsl:text>
+	</xsl:template>
+	
+	<xsl:template match="@fill">
+		<!-- Used by most shapes and can have a URL, a solid color, or "none" -->
+		<xsl:if test=". != 'none'">
+			<xsl:text>fill:</xsl:text>
+			<xsl:call-template name="background-processor">
+				<xsl:with-param name="background" select="."/>
+			</xsl:call-template>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template match="@stop-color">
+		<xsl:call-template name="color-processor">
+			<xsl:with-param name="color" select="."/>
+		</xsl:call-template>
+	</xsl:template>
+
+	<xsl:template match="@style">
+		<!-- A style property is really a bunch of other properties crammed together. -->
+		<!-- We therefore make a dummy element and process it as normal. -->
+		<xsl:variable name="dummy">
+			<dummy>
+				<xsl:call-template name="styles-processor">
+					<xsl:with-param name="styles" select="."/>
+				</xsl:call-template>
+			</dummy>
+		</xsl:variable>
+		<xsl:choose>
+			<!-- Using a dummy element requires node-set capability. Straight XSLT 1.0 -->
+			<!-- lacks this, but pretty much every XSLT processor offers it as an extension. -->
+			<xsl:when test="function-available('exsl:node-set')">
+				<xsl:call-template name="common-attributes">
+					<xsl:with-param name="node" select="exsl:node-set($dummy)/dummy"/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:when test="function-available('saxon:node-set')">
+				<xsl:call-template name="common-attributes">
+					<xsl:with-param name="node" select="saxon:node-set($dummy)"/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:when test="function-available('xalan:nodeSet')">
+				<xsl:call-template name="common-attributes">
+					<xsl:with-param name="node" select="xalan:nodeSet($dummy)"/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:message>
+					<xsl:text>exslt:node-set is required for processing the style attribute.</xsl:text>
+				</xsl:message>
+			</xsl:otherwise>
+		</xsl:choose>
+	</xsl:template>
+
+	<xsl:template match="@transform|@gradientTransform">
+		<!-- Several transform types are supported -->
+		<xsl:text>transform:{</xsl:text>
+		<xsl:call-template name="transform-processor">
+			<xsl:with-param name="transforms" select="."/>
+		</xsl:call-template>
+		<xsl:text>},</xsl:text>		
+	</xsl:template>
+
+	<!-- SVG Element Handling -->
+	
+	<xsl:template match="svg:a">
+		<xsl:param name="groupAttrs" select="''"/>
+		<!-- Anchors are actually meaningless to us, but their contents should usually be processed. -->
+		<xsl:variable name="newGroupAttrs">
+			<xsl:value-of select="$groupAttrs"/>
+			<xsl:apply-templates select="@style"/>
+			<!-- Note that we make no effort to guard against overlapping styles; we just order -->
+			<!-- them to be consistent.  This naive approach will usually, but not always, work. -->
+			<xsl:apply-templates select="@fill"/>
+			<xsl:call-template name="stroke">
+				<xsl:with-param name="node" select="."/>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:apply-templates select="&SupportedElements;">
+			<xsl:with-param name="groupAttrs" select="$newGroupAttrs"/>
+		</xsl:apply-templates>
+	</xsl:template>
+
+	<xsl:template match="svg:circle">
+		<xsl:param name="groupAttrs" select="''"/>
+		<xsl:text>{</xsl:text>
+		<xsl:apply-templates select="@id"/>
+		<xsl:text>shape:{type:"circle",</xsl:text>
+		<xsl:apply-templates select="@cx|@cy|@r"/>
+		<xsl:text>},</xsl:text>
+		<xsl:value-of select="$groupAttrs"/>
+		<xsl:call-template name="common-attributes">
+			<xsl:with-param name="node" select="."/>
+		</xsl:call-template>
+		<xsl:text>},</xsl:text>
+	</xsl:template>
+
+	<xsl:template match="svg:ellipse">
+		<xsl:param name="groupAttrs" select="''"/>
+		<xsl:text>{</xsl:text>
+		<xsl:apply-templates select="@id"/>
+		<xsl:text>shape:{type:"ellipse",</xsl:text>
+		<xsl:apply-templates select="@cx|@cy|@rx|@ry"/>
+		<xsl:text>},</xsl:text>
+		<xsl:value-of select="$groupAttrs"/>
+		<xsl:call-template name="common-attributes">
+			<xsl:with-param name="node" select="."/>
+		</xsl:call-template>
+		<xsl:text>},</xsl:text>
+	</xsl:template>
+
+	<xsl:template match="svg:g">
+		<xsl:param name="groupAttrs" select="''"/>
+		<!-- The basic grouping type can contain shapes, other groups, and have a transform -->
+		<xsl:text>{</xsl:text>
+		<xsl:apply-templates select="@id"/>
+		<xsl:text>children:[</xsl:text>
+		<!-- Note that GFX does not yet support fills etc. on a group, even though SVG does. -->
+		<!-- It's a planned enhancement though, so when GFX gets the ability to handle these, -->
+		<!-- remove the following ten lines and stop propagating groupAttrs. -->
+		<xsl:variable name="newGroupAttrs">
+			<xsl:value-of select="$groupAttrs"/>
+			<xsl:apply-templates select="@style"/>
+			<!-- Note that we make no effort to guard against overlapping styles; we just order -->
+			<!-- them to be consistent.  This naive approach will usually, but not always, work. -->
+			<xsl:apply-templates select="@fill"/>
+			<xsl:call-template name="stroke">
+				<xsl:with-param name="node" select="."/>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:apply-templates select="&SupportedElements;">
+			<xsl:with-param name="groupAttrs" select="$newGroupAttrs"/>
+		</xsl:apply-templates>
+		<xsl:text>],</xsl:text>
+		<!-- When GFX gets group fills etc., remove the following line and uncomment the ones below. -->
+		<xsl:apply-templates select="@transform"/>
+		<!--<xsl:call-template name="common-attributes">-->
+		<!--	<xsl:with-param name="node" select="."/>-->
+		<!--</xsl:call-template>-->
+		<xsl:text>},</xsl:text>
+	</xsl:template>
+
+	<xsl:template match="svg:image">
+		<xsl:param name="groupAttrs" select="''"/>
+		<!-- Note that images must be GIF, JPEG, or PNG. -->
+		<xsl:if test="not(parent::pattern)">
+			<!-- When being used as a background pattern we don't want type info. -->
+			<xsl:text>{</xsl:text>
+			<xsl:apply-templates select="@id"/>
+			<xsl:text>shape:{type:"image",</xsl:text>
+		</xsl:if>
+		<xsl:apply-templates select="@x|@y|@width|@height"/>
+		<xsl:text>src:"</xsl:text>
+		<xsl:value-of select="@xlink:href"/>
+		<xsl:text>",</xsl:text>
+		<xsl:if test="not(parent::pattern)">
+			<xsl:text>},</xsl:text>
+			<xsl:value-of select="$groupAttrs"/>
+			<xsl:call-template name="common-attributes">
+				<xsl:with-param name="node" select="."/>
+			</xsl:call-template>
+			<xsl:text>},</xsl:text>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template match="svg:line">
+		<xsl:param name="groupAttrs" select="''"/>
+		<xsl:text>{</xsl:text>
+		<xsl:apply-templates select="@id"/>
+		<xsl:text>shape:{type:"line",</xsl:text>
+		<xsl:apply-templates select="@x1|@y1|@x2|@y2"/>
+		<xsl:text>},</xsl:text>
+		<xsl:value-of select="$groupAttrs"/>
+		<xsl:call-template name="common-attributes">
+			<xsl:with-param name="node" select="."/>
+		</xsl:call-template>
+		<xsl:text>},</xsl:text>
+	</xsl:template>
+
+	<xsl:template match="svg:linearGradient">
+		<xsl:text>{type:"linear",</xsl:text>
+		<!-- Kluge alert - GFX doesn't handle gradientTransforms. We can help in -->
+		<!-- the common case of matrix transforms in user space. Other cases we ignore. -->
+		<!-- Even for this one case the results aren't anywhere near as good as real support in GFX. -->
+		<xsl:choose>
+			<!-- Kluge alert - this code is only meant to serve until GFX gets gradientTransform support. -->
+			<!-- Once GFX does gradientTransforms, only the straight apply-templates should be kept. -->
+			<xsl:when test="starts-with(@gradientTransform,'matrix') and @gradientUnits='userSpaceOnUse'">
+				<xsl:call-template name="gradient-adjuster">
+					<xsl:with-param name="node" select="."/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:apply-templates select="@x1|@x2|@y1|@y2"/>
+			</xsl:otherwise>
+		</xsl:choose>
+		<xsl:text>colors:[</xsl:text>
+		<xsl:apply-templates select="svg:stop"/>
+		<!-- Unfortunately GFX doesn't do gradientTransforms. -->
+		<!-- Uncommenting the following would support it here. -->
+		<!-- <xsl:apply-templates select="@x1|@x2|@y1|@y2"/> -->
+		<!-- <xsl:apply-templates select="@gradientTransform"/> -->
+		<xsl:text>]},</xsl:text>
+	</xsl:template>
+
+	<xsl:template match="svg:path">
+		<xsl:param name="groupAttrs" select="''"/>
+		<xsl:if test="not(parent::textpath)">
+			<!-- When being used within a textpath we don't want type info. -->
+			<xsl:text>{</xsl:text>
+			<xsl:apply-templates select="@id"/>
+			<xsl:text>shape:{type:"path",</xsl:text>
+		</xsl:if>
+		<xsl:apply-templates select="@d"/>
+		<xsl:if test="not(parent::textpath)">
+			<xsl:text>},</xsl:text>
+			<xsl:value-of select="$groupAttrs"/>
+			<xsl:call-template name="common-attributes">
+				<xsl:with-param name="node" select="."/>
+			</xsl:call-template>
+			<xsl:text>},</xsl:text>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template match="svg:pattern">
+		<!-- GFX only seems to handle image pattern type fills, so that's all we do -->
+		<xsl:text>{type:"pattern",</xsl:text>
+		<xsl:apply-templates select="@width|@height|@xlink:href"/>
+		<xsl:text>},</xsl:text>
+	</xsl:template>
+
+	<xsl:template match="svg:polygon|svg:polyline">
+		<xsl:param name="groupAttrs" select="''"/>
+		<!-- Polygons are mostly treated as polylines -->
+		<xsl:text>{</xsl:text>
+		<xsl:apply-templates select="@id"/>
+		<xsl:text>shape:{type:"polyline",points:[</xsl:text>
+		<!-- We just have to ensure that endpoints match for a polygon; it's assumed in SVG -->
+		<xsl:variable name="seminormalizedPoints" select="normalize-space(@points)"/>
+		<xsl:variable name="normalizedPoints">
+			<xsl:call-template name="kill-extra-spaces">
+				<xsl:with-param name="string" select="$seminormalizedPoints"/>
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:variable name="firstPoint" select="substring-before($normalizedPoints,' ')"/>
+		<xsl:choose>
+			<xsl:when test="contains(local-name(),'polygon') and
+				$firstPoint!=substring($normalizedPoints,string-length($normalizedPoints)-string-length($firstPoint)+1)">
+				<xsl:call-template name="point-processor">
+					<xsl:with-param name="points" select="concat($normalizedPoints,' ',$firstPoint)"/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:call-template name="point-processor">
+					<xsl:with-param name="points" select="$normalizedPoints"/>
+				</xsl:call-template>
+			</xsl:otherwise>
+		</xsl:choose>
+		<xsl:text>]},</xsl:text>
+		<xsl:value-of select="$groupAttrs"/>
+		<xsl:call-template name="common-attributes">
+			<xsl:with-param name="node" select="."/>
+		</xsl:call-template>
+		<xsl:text>},</xsl:text>
+	</xsl:template>
+
+	<xsl:template match="svg:radialGradient">
+		<xsl:text>{type:"radial",</xsl:text>
+		<!-- Kluge alert - GFX doesn't handle gradientTransforms. We can help in -->
+		<!-- the common case of matrix transforms in user space. Other cases we ignore. -->
+		<!-- Even for this one case the results aren't anywhere near as good as real support in GFX. -->
+		<xsl:choose>
+			<!-- Kluge alert - this code is only meant to serve until GFX gets gradientTransform support. -->
+			<!-- Once GFX does gradientTransforms, only the straight apply-templates should be kept. -->
+			<xsl:when test="starts-with(@gradientTransform,'matrix') and @gradientUnits='userSpaceOnUse'">
+				<xsl:call-template name="gradient-adjuster">
+					<xsl:with-param name="node" select="."/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:apply-templates select="@cx|@cy|@r"/>
+			</xsl:otherwise>
+		</xsl:choose>
+		<!-- GFX doesn't currently support fx & fy -->
+		<!-- Uncommenting the following would support it here. -->
+		<!-- <xsl:apply-templates select="@fx|@fy"/> -->
+		<xsl:text>colors:[</xsl:text>
+		<xsl:apply-templates select="svg:stop"/>
+		<!-- Unfortunately GFX doesn't do gradientTransforms. -->
+		<!-- Uncommenting the following would support it here. -->
+		<!-- <xsl:apply-templates select="@cx|@cy|@r"/> -->
+		<!-- <xsl:apply-templates select="@gradientTransform"/> -->
+		<xsl:text>]},</xsl:text>
+	</xsl:template>
+
+	<xsl:template match="svg:rect">
+		<xsl:param name="groupAttrs" select="''"/>
+		<xsl:text>{</xsl:text>
+		<xsl:apply-templates select="@id"/>
+		<xsl:text>shape:{type:"rect",</xsl:text>
+		<xsl:apply-templates select="@x|@y|@width|@height"/>
+		<xsl:if test="@rx and @ry">
+			<!-- Do approximate rounded corners if both an rx and ry are present. -->
+			<xsl:variable name="r" select="(@rx+ at ry) div 2"/>
+			<xsl:text>r:</xsl:text>
+			<xsl:value-of select="$r"/>
+		</xsl:if>
+		<xsl:text>},</xsl:text>
+		<xsl:value-of select="$groupAttrs"/>
+		<xsl:call-template name="common-attributes">
+			<xsl:with-param name="node" select="."/>
+		</xsl:call-template>
+		<xsl:text>},</xsl:text>
+	</xsl:template>
+
+	<xsl:template match="svg:stop">
+		<!-- Both gradient types use the same sort of stops -->
+		<xsl:text>{</xsl:text>
+		<xsl:apply-templates select="@offset"/>
+		<xsl:text>color:</xsl:text>
+		<xsl:apply-templates select="@style"/>
+		<xsl:text>},</xsl:text>
+	</xsl:template>
+
+	<xsl:template match="svg:text|svg:textPath">
+		<xsl:param name="groupAttrs" select="''"/>
+		<!-- Support for textPath is not functional as GFX doesn't seem to have a -->
+		<!-- complete serialized form at this time. %FIX% -->
+		<xsl:text>{</xsl:text>
+		<xsl:apply-templates select="@id"/>
+		<xsl:choose>
+			<xsl:when test="contains(local-name(),'textpath')">
+				<xsl:text>shape:{type:"textpath",text:"</xsl:text>
+				<xsl:apply-templates/>
+				<xsl:text>",</xsl:text>
+				<xsl:variable name="arguments" select="translate(normalize-space(substring-before(substring-after(@xlink:href,'('),')')),' ',',')"/>
+				<xsl:call-template name="url-processor">
+					<xsl:with-param name="url" select="$arguments"/>
+				</xsl:call-template>
+			</xsl:when>
+			<xsl:otherwise>
+				<!-- Regular text has slightly different attributes -->
+				<xsl:choose>
+					<!-- It's possible for a text element to contain a textpath element. -->
+					<xsl:when test="not(textpath)">
+						<xsl:text>shape:{type:"text",text:"</xsl:text>
+						<xsl:apply-templates/>
+						<xsl:text>",</xsl:text>
+						<xsl:apply-templates select="@x|@y"/>
+					</xsl:when>
+					<xsl:otherwise>
+						<xsl:apply-templates/>
+					</xsl:otherwise>
+				</xsl:choose>
+			</xsl:otherwise>
+		</xsl:choose>
+		<xsl:text>},</xsl:text>
+		<!-- Kluge alert - if no fill is defined, GFX won't display anything -->
+		<!-- Our quick fix here is to force a fill of some sort. -->
+		<xsl:if test="not(@fill)">
+			<xsl:text>fill:"#000000",</xsl:text>
+		</xsl:if>
+		<xsl:value-of select="$groupAttrs"/>
+		<xsl:call-template name="common-attributes">
+			<xsl:with-param name="node" select="."/>
+		</xsl:call-template>
+		<xsl:text>},</xsl:text>
+	</xsl:template>
+	
+	<xsl:template match="svg:use">
+		<xsl:param name="groupAttrs" select="''"/>
+		<!-- Use just refers to an existing element, essentially duplicating it. -->
+		<xsl:variable name="newGroupAttrs">
+			<xsl:value-of select="$groupAttrs"/>
+			<xsl:apply-templates select="@style"/>
+			<!-- Note that we make no effort to guard against overlapping styles; we just order -->
+			<!-- them to be consistent.  This naive approach will usually, but not always, work. -->
+			<xsl:apply-templates select="@fill"/>
+			<xsl:call-template name="stroke">
+				<xsl:with-param name="node" select="."/>
+			</xsl:call-template>
+			<xsl:apply-templates select="@transform"/>
+		</xsl:variable>
+		<xsl:call-template name="url-processor">
+			<xsl:with-param name="url" select="normalize-space(@xlink:href)"/>
+			<xsl:with-param name="groupAttrs" select="$newGroupAttrs"/>
+		</xsl:call-template>
+	</xsl:template>
+
+	<!-- The main SVG element itself -->
+	
+	<xsl:template match="/svg:svg">
+		<xsl:text>[</xsl:text>
+		<xsl:apply-templates select="&SupportedElements;"/>
+		<xsl:text>]</xsl:text>
+	</xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/dojox/gfx/shape.js b/dojox/gfx/shape.js
index 5b34141..4c70837 100644
--- a/dojox/gfx/shape.js
+++ b/dojox/gfx/shape.js
@@ -47,46 +47,46 @@ r.push(g.multiplyPoint(m,b.x,b.y+b.height));
 return r;
 },getEventSource:function(){
 return this.rawNode;
-},setShape:function(_5){
-this.shape=dojox.gfx.makeParameters(this.shape,_5);
+},setShape:function(_1){
+this.shape=dojox.gfx.makeParameters(this.shape,_1);
 this.bbox=null;
 return this;
-},setFill:function(_6){
-if(!_6){
+},setFill:function(_2){
+if(!_2){
 this.fillStyle=null;
 return this;
 }
 var f=null;
-if(typeof (_6)=="object"&&"type" in _6){
-switch(_6.type){
+if(typeof (_2)=="object"&&"type" in _2){
+switch(_2.type){
 case "linear":
-f=dojox.gfx.makeParameters(dojox.gfx.defaultLinearGradient,_6);
+f=dojox.gfx.makeParameters(dojox.gfx.defaultLinearGradient,_2);
 break;
 case "radial":
-f=dojox.gfx.makeParameters(dojox.gfx.defaultRadialGradient,_6);
+f=dojox.gfx.makeParameters(dojox.gfx.defaultRadialGradient,_2);
 break;
 case "pattern":
-f=dojox.gfx.makeParameters(dojox.gfx.defaultPattern,_6);
+f=dojox.gfx.makeParameters(dojox.gfx.defaultPattern,_2);
 break;
 }
 }else{
-f=dojox.gfx.normalizeColor(_6);
+f=dojox.gfx.normalizeColor(_2);
 }
 this.fillStyle=f;
 return this;
-},setStroke:function(_8){
-if(!_8){
+},setStroke:function(_3){
+if(!_3){
 this.strokeStyle=null;
 return this;
 }
-if(typeof _8=="string"||dojo.isArray(_8)||_8 instanceof dojo.Color){
-_8={color:_8};
+if(typeof _3=="string"||dojo.isArray(_3)||_3 instanceof dojo.Color){
+_3={color:_3};
 }
-var s=this.strokeStyle=dojox.gfx.makeParameters(dojox.gfx.defaultStroke,_8);
+var s=this.strokeStyle=dojox.gfx.makeParameters(dojox.gfx.defaultStroke,_3);
 s.color=dojox.gfx.normalizeColor(s.color);
 return this;
-},setTransform:function(_a){
-this.matrix=dojox.gfx.matrix.clone(_a?dojox.gfx.matrix.normalize(_a):dojox.gfx.matrix.identity);
+},setTransform:function(_4){
+this.matrix=dojox.gfx.matrix.clone(_4?dojox.gfx.matrix.normalize(_4):dojox.gfx.matrix.identity);
 return this._applyTransform();
 },_applyTransform:function(){
 return this;
@@ -106,22 +106,22 @@ this._moveToBack();
 return this;
 },_moveToFront:function(){
 },_moveToBack:function(){
-},applyRightTransform:function(_d){
-return _d?this.setTransform([this.matrix,_d]):this;
-},applyLeftTransform:function(_e){
-return _e?this.setTransform([_e,this.matrix]):this;
-},applyTransform:function(_f){
-return _f?this.setTransform([this.matrix,_f]):this;
-},removeShape:function(_10){
+},applyRightTransform:function(_5){
+return _5?this.setTransform([this.matrix,_5]):this;
+},applyLeftTransform:function(_6){
+return _6?this.setTransform([_6,this.matrix]):this;
+},applyTransform:function(_7){
+return _7?this.setTransform([this.matrix,_7]):this;
+},removeShape:function(_8){
 if(this.parent){
-this.parent.remove(this,_10);
+this.parent.remove(this,_8);
 }
 return this;
-},_setParent:function(_11,_12){
-this.parent=_11;
-return this._updateParentMatrix(_12);
-},_updateParentMatrix:function(_13){
-this.parentMatrix=_13?dojox.gfx.matrix.clone(_13):null;
+},_setParent:function(_9,_a){
+this.parent=_9;
+return this._updateParentMatrix(_a);
+},_updateParentMatrix:function(_b){
+this.parentMatrix=_b?dojox.gfx.matrix.clone(_b):null;
 return this._applyTransform();
 },_getRealMatrix:function(){
 var m=this.matrix;
@@ -134,28 +134,28 @@ p=p.parent;
 }
 return m;
 }});
-dojox.gfx.shape._eventsProcessing={connect:function(_16,_17,_18){
-return arguments.length>2?dojo.connect(this.getEventSource(),_16,_17,_18):dojo.connect(this.getEventSource(),_16,_17);
-},disconnect:function(_19){
-dojo.disconnect(_19);
+dojox.gfx.shape._eventsProcessing={connect:function(_c,_d,_e){
+return arguments.length>2?dojo.connect(this.getEventSource(),_c,_d,_e):dojo.connect(this.getEventSource(),_c,_d);
+},disconnect:function(_f){
+dojo.disconnect(_f);
 }};
 dojo.extend(dojox.gfx.Shape,dojox.gfx.shape._eventsProcessing);
 dojox.gfx.shape.Container={_init:function(){
 this.children=[];
-},add:function(_1a){
-var _1b=_1a.getParent();
-if(_1b){
-_1b.remove(_1a,true);
-}
-this.children.push(_1a);
-return _1a._setParent(this,this._getRealMatrix());
-},remove:function(_1c,_1d){
+},add:function(_10){
+var _11=_10.getParent();
+if(_11){
+_11.remove(_10,true);
+}
+this.children.push(_10);
+return _10._setParent(this,this._getRealMatrix());
+},remove:function(_12,_13){
 for(var i=0;i<this.children.length;++i){
-if(this.children[i]==_1c){
-if(_1d){
+if(this.children[i]==_12){
+if(_13){
 }else{
-_1c.parent=null;
-_1c.parentMatrix=null;
+_12.parent=null;
+_12.parentMatrix=null;
 }
 this.children.splice(i,1);
 break;
@@ -165,20 +165,20 @@ return this;
 },clear:function(){
 this.children=[];
 return this;
-},_moveChildToFront:function(_1f){
+},_moveChildToFront:function(_14){
 for(var i=0;i<this.children.length;++i){
-if(this.children[i]==_1f){
+if(this.children[i]==_14){
 this.children.splice(i,1);
-this.children.push(_1f);
+this.children.push(_14);
 break;
 }
 }
 return this;
-},_moveChildToBack:function(_21){
+},_moveChildToBack:function(_15){
 for(var i=0;i<this.children.length;++i){
-if(this.children[i]==_21){
+if(this.children[i]==_15){
 this.children.splice(i,1);
-this.children.unshift(_21);
+this.children.unshift(_15);
 break;
 }
 }
@@ -207,98 +207,107 @@ this._parent=null;
 return this.rawNode;
 },_getRealMatrix:function(){
 return null;
-},isLoaded:true,onLoad:function(_23){
-},whenLoaded:function(_24,_25){
-var f=dojo.hitch(_24,_25);
+},isLoaded:true,onLoad:function(_16){
+},whenLoaded:function(_17,_18){
+var f=dojo.hitch(_17,_18);
 if(this.isLoaded){
 f(this);
 }else{
-var h=dojo.connect(this,"onLoad",function(_28){
+var h=dojo.connect(this,"onLoad",function(_19){
 dojo.disconnect(h);
-f(_28);
+f(_19);
 });
 }
 }});
 dojo.extend(dojox.gfx.shape.Surface,dojox.gfx.shape._eventsProcessing);
 dojo.declare("dojox.gfx.Point",null,{});
 dojo.declare("dojox.gfx.Rectangle",null,{});
-dojo.declare("dojox.gfx.shape.Rect",dojox.gfx.Shape,{constructor:function(_29){
+dojo.declare("dojox.gfx.shape.Rect",dojox.gfx.Shape,{constructor:function(_1a){
 this.shape=dojox.gfx.getDefault("Rect");
-this.rawNode=_29;
+this.rawNode=_1a;
 },getBoundingBox:function(){
 return this.shape;
 }});
-dojo.declare("dojox.gfx.shape.Ellipse",dojox.gfx.Shape,{constructor:function(_2a){
+dojo.declare("dojox.gfx.shape.Ellipse",dojox.gfx.Shape,{constructor:function(_1b){
 this.shape=dojox.gfx.getDefault("Ellipse");
-this.rawNode=_2a;
+this.rawNode=_1b;
 },getBoundingBox:function(){
 if(!this.bbox){
-var _2b=this.shape;
-this.bbox={x:_2b.cx-_2b.rx,y:_2b.cy-_2b.ry,width:2*_2b.rx,height:2*_2b.ry};
+var _1c=this.shape;
+this.bbox={x:_1c.cx-_1c.rx,y:_1c.cy-_1c.ry,width:2*_1c.rx,height:2*_1c.ry};
 }
 return this.bbox;
 }});
-dojo.declare("dojox.gfx.shape.Circle",dojox.gfx.Shape,{constructor:function(_2c){
+dojo.declare("dojox.gfx.shape.Circle",dojox.gfx.Shape,{constructor:function(_1d){
 this.shape=dojox.gfx.getDefault("Circle");
-this.rawNode=_2c;
+this.rawNode=_1d;
 },getBoundingBox:function(){
 if(!this.bbox){
-var _2d=this.shape;
-this.bbox={x:_2d.cx-_2d.r,y:_2d.cy-_2d.r,width:2*_2d.r,height:2*_2d.r};
+var _1e=this.shape;
+this.bbox={x:_1e.cx-_1e.r,y:_1e.cy-_1e.r,width:2*_1e.r,height:2*_1e.r};
 }
 return this.bbox;
 }});
-dojo.declare("dojox.gfx.shape.Line",dojox.gfx.Shape,{constructor:function(_2e){
+dojo.declare("dojox.gfx.shape.Line",dojox.gfx.Shape,{constructor:function(_1f){
 this.shape=dojox.gfx.getDefault("Line");
-this.rawNode=_2e;
+this.rawNode=_1f;
 },getBoundingBox:function(){
 if(!this.bbox){
-var _2f=this.shape;
-this.bbox={x:Math.min(_2f.x1,_2f.x2),y:Math.min(_2f.y1,_2f.y2),width:Math.abs(_2f.x2-_2f.x1),height:Math.abs(_2f.y2-_2f.y1)};
+var _20=this.shape;
+this.bbox={x:Math.min(_20.x1,_20.x2),y:Math.min(_20.y1,_20.y2),width:Math.abs(_20.x2-_20.x1),height:Math.abs(_20.y2-_20.y1)};
 }
 return this.bbox;
 }});
-dojo.declare("dojox.gfx.shape.Polyline",dojox.gfx.Shape,{constructor:function(_30){
+dojo.declare("dojox.gfx.shape.Polyline",dojox.gfx.Shape,{constructor:function(_21){
 this.shape=dojox.gfx.getDefault("Polyline");
-this.rawNode=_30;
-},setShape:function(_31,_32){
-if(_31&&_31 instanceof Array){
-dojox.gfx.Shape.prototype.setShape.call(this,{points:_31});
-if(_32&&this.shape.points.length){
+this.rawNode=_21;
+},setShape:function(_22,_23){
+if(_22&&_22 instanceof Array){
+dojox.gfx.Shape.prototype.setShape.call(this,{points:_22});
+if(_23&&this.shape.points.length){
 this.shape.points.push(this.shape.points[0]);
 }
 }else{
-dojox.gfx.Shape.prototype.setShape.call(this,_31);
+dojox.gfx.Shape.prototype.setShape.call(this,_22);
 }
 return this;
+},_normalizePoints:function(){
+var p=this.shape.points,l=p&&p.length;
+if(l&&typeof p[0]=="number"){
+var _24=[];
+for(var i=0;i<l;i+=2){
+_24.push({x:p[i],y:p[i+1]});
+}
+this.shape.points=_24;
+}
 },getBoundingBox:function(){
 if(!this.bbox&&this.shape.points.length){
 var p=this.shape.points;
 var l=p.length;
 var t=p[0];
-var _36={l:t.x,t:t.y,r:t.x,b:t.y};
+var _25={l:t.x,t:t.y,r:t.x,b:t.y};
 for(var i=1;i<l;++i){
 t=p[i];
-if(_36.l>t.x){
-_36.l=t.x;
+if(_25.l>t.x){
+_25.l=t.x;
 }
-if(_36.r<t.x){
-_36.r=t.x;
+if(_25.r<t.x){
+_25.r=t.x;
 }
-if(_36.t>t.y){
-_36.t=t.y;
+if(_25.t>t.y){
+_25.t=t.y;
 }
-if(_36.b<t.y){
-_36.b=t.y;
+if(_25.b<t.y){
+_25.b=t.y;
 }
 }
-this.bbox={x:_36.l,y:_36.t,width:_36.r-_36.l,height:_36.b-_36.t};
+this.bbox={x:_25.l,y:_25.t,width:_25.r-_25.l,height:_25.b-_25.t};
 }
 return this.bbox;
 }});
-dojo.declare("dojox.gfx.shape.Image",dojox.gfx.Shape,{constructor:function(_38){
+dojo.declare("dojox.gfx.shape.Image",dojox.gfx.Shape,{constructor:function(_26){
 this.shape=dojox.gfx.getDefault("Image");
-this.rawNode=_38;
+this.rawNode=_26;
 },getBoundingBox:function(){
 return this.shape;
 },setStroke:function(){
@@ -306,61 +315,61 @@ return this;
 },setFill:function(){
 return this;
 }});
-dojo.declare("dojox.gfx.shape.Text",dojox.gfx.Shape,{constructor:function(_39){
+dojo.declare("dojox.gfx.shape.Text",dojox.gfx.Shape,{constructor:function(_27){
 this.fontStyle=null;
 this.shape=dojox.gfx.getDefault("Text");
-this.rawNode=_39;
+this.rawNode=_27;
 },getFont:function(){
 return this.fontStyle;
-},setFont:function(_3a){
-this.fontStyle=typeof _3a=="string"?dojox.gfx.splitFontString(_3a):dojox.gfx.makeParameters(dojox.gfx.defaultFont,_3a);
+},setFont:function(_28){
+this.fontStyle=typeof _28=="string"?dojox.gfx.splitFontString(_28):dojox.gfx.makeParameters(dojox.gfx.defaultFont,_28);
 this._setFont();
 return this;
 }});
-dojox.gfx.shape.Creator={createShape:function(_3b){
+dojox.gfx.shape.Creator={createShape:function(_29){
 var gfx=dojox.gfx;
-switch(_3b.type){
+switch(_29.type){
 case gfx.defaultPath.type:
-return this.createPath(_3b);
+return this.createPath(_29);
 case gfx.defaultRect.type:
-return this.createRect(_3b);
+return this.createRect(_29);
 case gfx.defaultCircle.type:
-return this.createCircle(_3b);
+return this.createCircle(_29);
 case gfx.defaultEllipse.type:
-return this.createEllipse(_3b);
+return this.createEllipse(_29);
 case gfx.defaultLine.type:
-return this.createLine(_3b);
+return this.createLine(_29);
 case gfx.defaultPolyline.type:
-return this.createPolyline(_3b);
+return this.createPolyline(_29);
 case gfx.defaultImage.type:
-return this.createImage(_3b);
+return this.createImage(_29);
 case gfx.defaultText.type:
-return this.createText(_3b);
+return this.createText(_29);
 case gfx.defaultTextPath.type:
-return this.createTextPath(_3b);
+return this.createTextPath(_29);
 }
 return null;
 },createGroup:function(){
 return this.createObject(dojox.gfx.Group);
-},createRect:function(_3d){
-return this.createObject(dojox.gfx.Rect,_3d);
-},createEllipse:function(_3e){
-return this.createObject(dojox.gfx.Ellipse,_3e);
-},createCircle:function(_3f){
-return this.createObject(dojox.gfx.Circle,_3f);
-},createLine:function(_40){
-return this.createObject(dojox.gfx.Line,_40);
-},createPolyline:function(_41){
-return this.createObject(dojox.gfx.Polyline,_41);
-},createImage:function(_42){
-return this.createObject(dojox.gfx.Image,_42);
-},createText:function(_43){
-return this.createObject(dojox.gfx.Text,_43);
-},createPath:function(_44){
-return this.createObject(dojox.gfx.Path,_44);
-},createTextPath:function(_45){
-return this.createObject(dojox.gfx.TextPath,{}).setText(_45);
-},createObject:function(_46,_47){
+},createRect:function(_2a){
+return this.createObject(dojox.gfx.Rect,_2a);
+},createEllipse:function(_2b){
+return this.createObject(dojox.gfx.Ellipse,_2b);
+},createCircle:function(_2c){
+return this.createObject(dojox.gfx.Circle,_2c);
+},createLine:function(_2d){
+return this.createObject(dojox.gfx.Line,_2d);
+},createPolyline:function(_2e){
+return this.createObject(dojox.gfx.Polyline,_2e);
+},createImage:function(_2f){
+return this.createObject(dojox.gfx.Image,_2f);
+},createText:function(_30){
+return this.createObject(dojox.gfx.Text,_30);
+},createPath:function(_31){
+return this.createObject(dojox.gfx.Path,_31);
+},createTextPath:function(_32){
+return this.createObject(dojox.gfx.TextPath,{}).setText(_32);
+},createObject:function(_33,_34){
 return null;
 }};
 }
diff --git a/dojox/gfx/silverlight.js b/dojox/gfx/silverlight.js
index 5512e6b..ab38466 100644
--- a/dojox/gfx/silverlight.js
+++ b/dojox/gfx/silverlight.js
@@ -22,43 +22,43 @@ var c=dojox.gfx.normalizeColor(_1),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);
 };
-dojo.extend(dojox.gfx.Shape,{setFill:function(_5){
+dojo.extend(dojox.gfx.Shape,{setFill:function(_2){
 var p=this.rawNode.getHost().content,r=this.rawNode,f;
-if(!_5){
+if(!_2){
 this.fillStyle=null;
 this._setFillAttr(null);
 return this;
 }
-if(typeof (_5)=="object"&&"type" in _5){
-switch(_5.type){
+if(typeof (_2)=="object"&&"type" in _2){
+switch(_2.type){
 case "linear":
-this.fillStyle=f=dojox.gfx.makeParameters(dojox.gfx.defaultLinearGradient,_5);
-var _9=p.createFromXaml("<LinearGradientBrush/>");
-_9.mappingMode="Absolute";
-_9.startPoint=f.x1+","+f.y1;
-_9.endPoint=f.x2+","+f.y2;
+this.fillStyle=f=dojox.gfx.makeParameters(dojox.gfx.defaultLinearGradient,_2);
+var _3=p.createFromXaml("<LinearGradientBrush/>");
+_3.mappingMode="Absolute";
+_3.startPoint=f.x1+","+f.y1;
+_3.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);
-_9.gradientStops.add(t);
+_3.gradientStops.add(t);
 });
-this._setFillAttr(_9);
+this._setFillAttr(_3);
 break;
 case "radial":
-this.fillStyle=f=dojox.gfx.makeParameters(dojox.gfx.defaultRadialGradient,_5);
-var _c=p.createFromXaml("<RadialGradientBrush/>"),c=dojox.gfx.matrix.multiplyPoint(dojox.gfx.matrix.invert(this._getAdjustedMatrix()),f.cx,f.cy),pt=c.x+","+c.y;
-_c.mappingMode="Absolute";
-_c.gradientOrigin=pt;
-_c.center=pt;
-_c.radiusX=_c.radiusY=f.r;
+this.fillStyle=f=dojox.gfx.makeParameters(dojox.gfx.defaultRadialGradient,_2);
+var _4=p.createFromXaml("<RadialGradientBrush/>"),c=dojox.gfx.matrix.multiplyPoint(dojox.gfx.matrix.invert(this._getAdjustedMatrix()),f.cx,f.cy),pt=c.x+","+c.y;
+_4.mappingMode="Absolute";
+_4.gradientOrigin=pt;
+_4.center=pt;
+_4.radiusX=_4.radiusY=f.r;
 dojo.forEach(f.colors,function(c){
 var t=p.createFromXaml("<GradientStop/>");
 t.offset=c.offset;
 t.color=dojox.gfx.silverlight.hexColor(c.color);
-_c.gradientStops.add(t);
+_4.gradientStops.add(t);
 });
-this._setFillAttr(_c);
+this._setFillAttr(_4);
 break;
 case "pattern":
 this.fillStyle=null;
@@ -67,31 +67,31 @@ break;
 }
 return this;
 }
-this.fillStyle=f=dojox.gfx.normalizeColor(_5);
-var scb=p.createFromXaml("<SolidColorBrush/>");
-scb.color=f.toHex();
-scb.opacity=f.a;
-this._setFillAttr(scb);
+this.fillStyle=f=dojox.gfx.normalizeColor(_2);
+var _5=p.createFromXaml("<SolidColorBrush/>");
+_5.color=f.toHex();
+_5.opacity=f.a;
+this._setFillAttr(_5);
 return this;
 },_setFillAttr:function(f){
 this.rawNode.fill=f;
-},setStroke:function(_13){
+},setStroke:function(_6){
 var p=this.rawNode.getHost().content,r=this.rawNode;
-if(!_13){
+if(!_6){
 this.strokeStyle=null;
 r.stroke=null;
 return this;
 }
-if(typeof _13=="string"||dojo.isArray(_13)||_13 instanceof dojo.Color){
-_13={color:_13};
+if(typeof _6=="string"||dojo.isArray(_6)||_6 instanceof dojo.Color){
+_6={color:_6};
 }
-var s=this.strokeStyle=dojox.gfx.makeParameters(dojox.gfx.defaultStroke,_13);
+var s=this.strokeStyle=dojox.gfx.makeParameters(dojox.gfx.defaultStroke,_6);
 s.color=dojox.gfx.normalizeColor(s.color);
 if(s){
-var scb=p.createFromXaml("<SolidColorBrush/>");
-scb.color=s.color.toHex();
-scb.opacity=s.color.a;
-r.stroke=scb;
+var _7=p.createFromXaml("<SolidColorBrush/>");
+_7.color=s.color.toHex();
+_7.opacity=s.color.a;
+r.stroke=_7;
 r.strokeThickness=s.width;
 r.strokeStartLineCap=r.strokeEndLineCap=r.strokeDashCap=dojox.gfx.silverlight.caps[s.cap];
 if(typeof s.join=="number"){
@@ -106,14 +106,15 @@ da=dojox.gfx.silverlight.dasharray[da];
 }
 if(da instanceof Array){
 da=dojo.clone(da);
+var i;
 if(s.cap!="butt"){
-for(var i=0;i<da.length;i+=2){
+for(i=0;i<da.length;i+=2){
 --da[i];
 if(da[i]<1){
 da[i]=1;
 }
 }
-for(var i=1;i<da.length;i+=2){
+for(i=1;i<da.length;i+=2){
 ++da[i];
 }
 }
@@ -124,10 +125,10 @@ r.strokeDashArray=null;
 }
 return this;
 },_getParentSurface:function(){
-var _1a=this.parent;
-for(;_1a&&!(_1a instanceof dojox.gfx.Surface);_1a=_1a.parent){
+var _8=this.parent;
+for(;_8&&!(_8 instanceof dojox.gfx.Surface);_8=_8.parent){
 }
-return _1a;
+return _8;
 },_applyTransform:function(){
 var tm=this._getAdjustedMatrix(),r=this.rawNode;
 if(tm){
@@ -144,10 +145,10 @@ r.renderTransform=m;
 r.renderTransform=null;
 }
 return this;
-},setRawNode:function(_20){
-_20.fill=null;
-_20.stroke=null;
-this.rawNode=_20;
+},setRawNode:function(_9){
+_9.fill=null;
+_9.stroke=null;
+this.rawNode=_9;
 },_moveToFront:function(){
 var c=this.parent.rawNode.children,r=this.rawNode;
 c.remove(r);
@@ -163,12 +164,12 @@ return this.matrix;
 }});
 dojo.declare("dojox.gfx.Group",dojox.gfx.Shape,{constructor:function(){
 dojox.gfx.silverlight.Container._init.call(this);
-},setRawNode:function(_25){
-this.rawNode=_25;
+},setRawNode:function(_a){
+this.rawNode=_a;
 }});
 dojox.gfx.Group.nodeType="Canvas";
-dojo.declare("dojox.gfx.Rect",dojox.gfx.shape.Rect,{setShape:function(_26){
-this.shape=dojox.gfx.makeParameters(this.shape,_26);
+dojo.declare("dojox.gfx.Rect",dojox.gfx.shape.Rect,{setShape:function(_b){
+this.shape=dojox.gfx.makeParameters(this.shape,_b);
 this.bbox=null;
 var r=this.rawNode,n=this.shape;
 r.width=n.width;
@@ -180,8 +181,8 @@ var m=this.matrix,s=this.shape,d={dx:s.x,dy:s.y};
 return new dojox.gfx.Matrix2D(m?[m,d]:d);
 }});
 dojox.gfx.Rect.nodeType="Rectangle";
-dojo.declare("dojox.gfx.Ellipse",dojox.gfx.shape.Ellipse,{setShape:function(_2c){
-this.shape=dojox.gfx.makeParameters(this.shape,_2c);
+dojo.declare("dojox.gfx.Ellipse",dojox.gfx.shape.Ellipse,{setShape:function(_c){
+this.shape=dojox.gfx.makeParameters(this.shape,_c);
 this.bbox=null;
 var r=this.rawNode,n=this.shape;
 r.width=2*n.rx;
@@ -192,8 +193,8 @@ var m=this.matrix,s=this.shape,d={dx:s.cx-s.rx,dy:s.cy-s.ry};
 return new dojox.gfx.Matrix2D(m?[m,d]:d);
 }});
 dojox.gfx.Ellipse.nodeType="Ellipse";
-dojo.declare("dojox.gfx.Circle",dojox.gfx.shape.Circle,{setShape:function(_32){
-this.shape=dojox.gfx.makeParameters(this.shape,_32);
+dojo.declare("dojox.gfx.Circle",dojox.gfx.shape.Circle,{setShape:function(_d){
+this.shape=dojox.gfx.makeParameters(this.shape,_d);
 this.bbox=null;
 var r=this.rawNode,n=this.shape;
 r.width=r.height=2*n.r;
@@ -203,8 +204,8 @@ var m=this.matrix,s=this.shape,d={dx:s.cx-s.r,dy:s.cy-s.r};
 return new dojox.gfx.Matrix2D(m?[m,d]:d);
 }});
 dojox.gfx.Circle.nodeType="Ellipse";
-dojo.declare("dojox.gfx.Line",dojox.gfx.shape.Line,{setShape:function(_38){
-this.shape=dojox.gfx.makeParameters(this.shape,_38);
+dojo.declare("dojox.gfx.Line",dojox.gfx.shape.Line,{setShape:function(_e){
+this.shape=dojox.gfx.makeParameters(this.shape,_e);
 this.bbox=null;
 var r=this.rawNode,n=this.shape;
 r.x1=n.x1;
@@ -214,30 +215,27 @@ r.y2=n.y2;
 return this;
 }});
 dojox.gfx.Line.nodeType="Line";
-dojo.declare("dojox.gfx.Polyline",dojox.gfx.shape.Polyline,{setShape:function(_3b,_3c){
-if(_3b&&_3b instanceof Array){
-this.shape=dojox.gfx.makeParameters(this.shape,{points:_3b});
-if(_3c&&this.shape.points.length){
+dojo.declare("dojox.gfx.Polyline",dojox.gfx.shape.Polyline,{setShape:function(_f,_10){
+if(_f&&_f instanceof Array){
+this.shape=dojox.gfx.makeParameters(this.shape,{points:_f});
+if(_10&&this.shape.points.length){
 this.shape.points.push(this.shape.points[0]);
 }
 }else{
-this.shape=dojox.gfx.makeParameters(this.shape,_3b);
+this.shape=dojox.gfx.makeParameters(this.shape,_f);
 }
-this.box=null;
+this.bbox=null;
+this._normalizePoints();
 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;
 }});
 dojox.gfx.Polyline.nodeType="Polyline";
-dojo.declare("dojox.gfx.Image",dojox.gfx.shape.Image,{setShape:function(_40){
-this.shape=dojox.gfx.makeParameters(this.shape,_40);
+dojo.declare("dojox.gfx.Image",dojox.gfx.shape.Image,{setShape:function(_11){
+this.shape=dojox.gfx.makeParameters(this.shape,_11);
 this.bbox=null;
 var r=this.rawNode,n=this.shape;
 r.width=n.width;
@@ -247,12 +245,12 @@ return this._applyTransform();
 },_getAdjustedMatrix:function(){
 var m=this.matrix,s=this.shape,d={dx:s.x,dy:s.y};
 return new dojox.gfx.Matrix2D(m?[m,d]:d);
-},setRawNode:function(_46){
-this.rawNode=_46;
+},setRawNode:function(_12){
+this.rawNode=_12;
 }});
 dojox.gfx.Image.nodeType="Image";
-dojo.declare("dojox.gfx.Text",dojox.gfx.shape.Text,{setShape:function(_47){
-this.shape=dojox.gfx.makeParameters(this.shape,_47);
+dojo.declare("dojox.gfx.Text",dojox.gfx.shape.Text,{setShape:function(_13){
+this.shape=dojox.gfx.makeParameters(this.shape,_13);
 this.bbox=null;
 var r=this.rawNode,s=this.shape;
 r.text=s.text;
@@ -290,27 +288,27 @@ return new dojox.gfx.Matrix2D(x);
 return this;
 },_setFillAttr:function(f){
 this.rawNode.foreground=f;
-},setRawNode:function(_54){
-this.rawNode=_54;
+},setRawNode:function(_14){
+this.rawNode=_14;
 },getTextWidth:function(){
 return this.rawNode.actualWidth;
 }});
 dojox.gfx.Text.nodeType="TextBlock";
-dojo.declare("dojox.gfx.Path",dojox.gfx.path.Path,{_updateWithSegment:function(_55){
+dojo.declare("dojox.gfx.Path",dojox.gfx.path.Path,{_updateWithSegment:function(_15){
 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(_57){
+},setShape:function(_16){
 dojox.gfx.Path.superclass.setShape.apply(this,arguments);
 var p=this.shape.path;
 this.rawNode.data=p?p:null;
 return this;
 }});
 dojox.gfx.Path.nodeType="Path";
-dojo.declare("dojox.gfx.TextPath",dojox.gfx.path.TextPath,{_updateWithSegment:function(_59){
-},setShape:function(_5a){
+dojo.declare("dojox.gfx.TextPath",dojox.gfx.path.TextPath,{_updateWithSegment:function(_17){
+},setShape:function(_18){
 },_setText:function(){
 }});
 dojox.gfx.TextPath.nodeType="text";
@@ -323,13 +321,13 @@ dojox.gfx.silverlight.Container._init.call(this);
 window[this._onLoadName]=dojox.gfx.silverlight.nullFunc;
 delete dojox.gfx.silverlight.surfaces[this.rawNode.name];
 this.inherited(arguments);
-},setDimensions:function(_5b,_5c){
-this.width=dojox.gfx.normalizedLength(_5b);
-this.height=dojox.gfx.normalizedLength(_5c);
+},setDimensions:function(_19,_1a){
+this.width=dojox.gfx.normalizedLength(_19);
+this.height=dojox.gfx.normalizedLength(_1a);
 var p=this.rawNode&&this.rawNode.getHost();
 if(p){
-p.width=_5b;
-p.height=_5c;
+p.width=_19;
+p.height=_1a;
 }
 return this;
 },getDimensions:function(){
@@ -343,47 +341,56 @@ t.height=this.height;
 }
 return t;
 }});
-dojox.gfx.createSurface=function(_60,_61,_62){
+dojox.gfx.createSurface=function(_1b,_1c,_1d){
+if(!_1c&&!_1d){
+var pos=d.position(_1b);
+_1c=_1c||pos.w;
+_1d=_1d||pos.h;
+}
+if(typeof _1c=="number"){
+_1c=_1c+"px";
+}
+if(typeof _1d=="number"){
+_1d=_1d+"px";
+}
 var s=new dojox.gfx.Surface();
-_60=dojo.byId(_60);
-s._parent=_60;
-var t=_60.ownerDocument.createElement("script");
+_1b=dojo.byId(_1b);
+s._parent=_1b;
+var t=_1b.ownerDocument.createElement("script");
 t.type="text/xaml";
 t.id=dojox.gfx._base._getUniqueId();
 t.text="<?xml version='1.0'?><Canvas xmlns='http://schemas.microsoft.com/client/2007' Name='"+dojox.gfx._base._getUniqueId()+"'/>";
-_60.parentNode.insertBefore(t,_60);
+_1b.parentNode.insertBefore(t,_1b);
 s._nodes.push(t);
-var obj,_66=dojox.gfx._base._getUniqueId(),_67="__"+dojox.gfx._base._getUniqueId()+"_onLoad";
-s._onLoadName=_67;
-window[_67]=function(_68){
-
+var obj,_1e=dojox.gfx._base._getUniqueId(),_1f="__"+dojox.gfx._base._getUniqueId()+"_onLoad";
+s._onLoadName=_1f;
+window[_1f]=function(_20){
 if(!s.rawNode){
-s.rawNode=dojo.byId(_66).content.root;
-dojox.gfx.silverlight.surfaces[s.rawNode.name]=_60;
+s.rawNode=dojo.byId(_1e).content.root;
+dojox.gfx.silverlight.surfaces[s.rawNode.name]=_1b;
 s.onLoad(s);
-
 }
 };
 if(dojo.isSafari){
-obj="<embed type='application/x-silverlight' id='"+_66+"' width='"+_61+"' height='"+_62+" background='transparent'"+" source='#"+t.id+"'"+" windowless='true'"+" maxFramerate='60'"+" onLoad='"+_67+"'"+" onError='__dojoSilverlightError'"+" /><iframe style='visibility:hidden;height:0;width:0'/>";
+obj="<embed type='application/x-silverlight' id='"+_1e+"' width='"+_1c+"' height='"+_1d+" background='transparent'"+" source='#"+t.id+"'"+" windowless='true'"+" maxFramerate='60'"+" onLoad='"+_1f+"'"+" onError='__dojoSilverlightError'"+" /><iframe style='visibility:hidden;height:0;width:0'/>";
 }else{
-obj="<object type='application/x-silverlight' data='data:application/x-silverlight,' id='"+_66+"' width='"+_61+"' height='"+_62+"'>"+"<param name='background' value='transparent' />"+"<param name='source' value='#"+t.id+"' />"+"<param name='windowless' value='true' />"+"<param name='maxFramerate' value='60' />"+"<param name='onLoad' value='"+_67+"' />"+"<param name='onError' value='__dojoSilverlightError' />"+"</object>";
+obj="<object type='application/x-silverlight' data='data:application/x-silverlight,' id='"+_1e+"' width='"+_1c+"' height='"+_1d+"'>"+"<param name='background' value='transparent' />"+"<param name='source' value='#"+t.id+"' />"+"<param name='windowless' value='true' />"+"<param name='maxFramerate' value='60' />"+"<param name='onLoad' value='"+_1f+"' />"+"<param name='onError' value='__dojoSilverlightError' />"+"</object>";
 }
-_60.innerHTML=obj;
-var _69=dojo.byId(_66);
-if(_69.content&&_69.content.root){
-s.rawNode=_69.content.root;
-dojox.gfx.silverlight.surfaces[s.rawNode.name]=_60;
+_1b.innerHTML=obj;
+var _21=dojo.byId(_1e);
+if(_21.content&&_21.content.root){
+s.rawNode=_21.content.root;
+dojox.gfx.silverlight.surfaces[s.rawNode.name]=_1b;
 }else{
 s.rawNode=null;
 s.isLoaded=false;
 }
-s._nodes.push(_69);
-s.width=dojox.gfx.normalizedLength(_61);
-s.height=dojox.gfx.normalizedLength(_62);
+s._nodes.push(_21);
+s.width=dojox.gfx.normalizedLength(_1c);
+s.height=dojox.gfx.normalizedLength(_1d);
 return s;
 };
-__dojoSilverlightError=function(_6a,err){
+__dojoSilverlightError=function(_22,err){
 var t="Silverlight Error:\n"+"Code: "+err.ErrorCode+"\n"+"Type: "+err.ErrorType+"\n"+"Message: "+err.ErrorMessage+"\n";
 switch(err.ErrorType){
 case "ParserError":
@@ -410,17 +417,17 @@ this._delay=window.setTimeout(dojo.hitch(this,"_delayAlignment"),10);
 }};
 dojox.gfx.silverlight.Container={_init:function(){
 dojox.gfx.shape.Container._init.call(this);
-},add:function(_72){
-if(this!=_72.getParent()){
+},add:function(_23){
+if(this!=_23.getParent()){
 dojox.gfx.shape.Container.add.apply(this,arguments);
-this.rawNode.children.add(_72.rawNode);
+this.rawNode.children.add(_23.rawNode);
 }
 return this;
-},remove:function(_73,_74){
-if(this==_73.getParent()){
-var _75=_73.rawNode.getParent();
-if(_75){
-_75.children.remove(_73.rawNode);
+},remove:function(_24,_25){
+if(this==_24.getParent()){
+var _26=_24.rawNode.getParent();
+if(_26){
+_26.children.remove(_24.rawNode);
 }
 dojox.gfx.shape.Container.remove.apply(this,arguments);
 }
@@ -429,16 +436,16 @@ return this;
 this.rawNode.children.clear();
 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(_76,_77){
+dojo.mixin(dojox.gfx.shape.Creator,{createObject:function(_27,_28){
 if(!this.rawNode){
 return null;
 }
-var _78=new _76();
-var _79=this.rawNode.getHost().content.createFromXaml("<"+_76.nodeType+"/>");
-_78.setRawNode(_79);
-_78.setShape(_77);
-this.add(_78);
-return _78;
+var _29=new _27();
+var _2a=this.rawNode.getHost().content.createFromXaml("<"+_27.nodeType+"/>");
+_29.setRawNode(_2a);
+_29.setShape(_28);
+this.add(_29);
+return _29;
 }});
 dojo.extend(dojox.gfx.Text,dojox.gfx.silverlight.Font);
 dojo.extend(dojox.gfx.Group,dojox.gfx.silverlight.Container);
@@ -446,8 +453,8 @@ 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 _7a=dojox.gfx.silverlight.surfaces;
-var _7b=function(s,a){
+var _2b=dojox.gfx.silverlight.surfaces;
+var _2c=function(s,a){
 var ev={target:s,currentTarget:s,preventDefault:function(){
 },stopPropagation:function(){
 }};
@@ -458,8 +465,8 @@ 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;
-var _80=_7a[s.getHost().content.root.name];
-var t=dojo._abs(_80);
+var _2d=_2b[s.getHost().content.root.name];
+var t=dojo.position(_2d);
 ev.clientX=t.x+p.x;
 ev.clientY=t.y+p.y;
 }
@@ -468,30 +475,30 @@ catch(e){
 }
 return ev;
 };
-var _82=function(s,a){
+var _2e=function(s,a){
 var ev={keyCode:a.platformKeyCode,ctrlKey:a.ctrl,shiftKey:a.shift};
 return ev;
 };
-var _86={onclick:{name:"MouseLeftButtonUp",fix:_7b},onmouseenter:{name:"MouseEnter",fix:_7b},onmouseleave:{name:"MouseLeave",fix:_7b},onmouseover:{name:"MouseEnter",fix:_7b},onmouseout:{name:"MouseLeave",fix:_7b},onmousedown:{name:"MouseLeftButtonDown",fix:_7b},onmouseup:{name:"MouseLeftButtonUp",fix:_7b},onmousemove:{name:"MouseMove",fix:_7b},onkeydown:{name:"KeyDown",fix:_82},onkeyup:{name:"KeyUp",fix:_82}};
-var _87={connect:function(_88,_89,_8a){
-var _8b,n=_88 in _86?_86[_88]:{name:_88,fix:function(){
+var _2f={onclick:{name:"MouseLeftButtonUp",fix:_2c},onmouseenter:{name:"MouseEnter",fix:_2c},onmouseleave:{name:"MouseLeave",fix:_2c},onmouseover:{name:"MouseEnter",fix:_2c},onmouseout:{name:"MouseLeave",fix:_2c},onmousedown:{name:"MouseLeftButtonDown",fix:_2c},onmouseup:{name:"MouseLeftButtonUp",fix:_2c},onmousemove:{name:"MouseMove",fix:_2c},onkeydown:{name:"KeyDown",fix:_2e},onkeyup:{name:"KeyUp",fix:_2e}};
+var _30={connect:function(_31,_32,_33){
+var _34,n=_31 in _2f?_2f[_31]:{name:_31,fix:function(){
 return {};
 }};
 if(arguments.length>2){
-_8b=this.getEventSource().addEventListener(n.name,function(s,a){
-dojo.hitch(_89,_8a)(n.fix(s,a));
+_34=this.getEventSource().addEventListener(n.name,function(s,a){
+dojo.hitch(_32,_33)(n.fix(s,a));
 });
 }else{
-_8b=this.getEventSource().addEventListener(n.name,function(s,a){
-_89(n.fix(s,a));
+_34=this.getEventSource().addEventListener(n.name,function(s,a){
+_32(n.fix(s,a));
 });
 }
-return {name:n.name,token:_8b};
-},disconnect:function(_91){
-this.getEventSource().removeEventListener(_91.name,_91.token);
+return {name:n.name,token:_34};
+},disconnect:function(_35){
+this.getEventSource().removeEventListener(_35.name,_35.token);
 }};
-dojo.extend(dojox.gfx.Shape,_87);
-dojo.extend(dojox.gfx.Surface,_87);
+dojo.extend(dojox.gfx.Shape,_30);
+dojo.extend(dojox.gfx.Surface,_30);
 dojox.gfx.equalSources=function(a,b){
 return a&&b&&a.equals(b);
 };
diff --git a/dojox/gfx/silverlight_attach.js b/dojox/gfx/silverlight_attach.js
index b20fd2e..66a9800 100644
--- a/dojox/gfx/silverlight_attach.js
+++ b/dojox/gfx/silverlight_attach.js
@@ -39,20 +39,23 @@ s=new dojox.gfx.Image(_1);
 break;
 case dojox.gfx.Text.nodeType:
 s=new dojox.gfx.Text(_1);
-_3(s);
+_2(s);
 break;
 default:
 return null;
 }
-_4(s);
+_3(s);
 if(!(s instanceof dojox.gfx.Image)){
+_4(s);
 _5(s);
-_6(s);
 }
-_7(s);
+_6(s);
 return s;
 };
-dojox.gfx.attachSurface=function(_8){
+dojox.gfx.attachSurface=function(_7){
+return null;
+};
+var _4=function(_8){
 return null;
 };
 var _5=function(_9){
@@ -61,13 +64,10 @@ return null;
 var _6=function(_a){
 return null;
 };
-var _7=function(_b){
+var _2=function(_b){
 return null;
 };
 var _3=function(_c){
 return null;
 };
-var _4=function(_d){
-return null;
-};
 })();
diff --git a/dojox/gfx/svg.js b/dojox/gfx/svg.js
index cc989ef..b6f2441 100644
--- a/dojox/gfx/svg.js
+++ b/dojox/gfx/svg.js
@@ -11,71 +11,80 @@ 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(_1){
-if(!_1||_1=="none"){
+(function(){
+var d=dojo,g=dojox.gfx,gs=g.shape,_1=g.svg;
+var _2=function(ns,_3){
+if(document.createElementNS){
+return document.createElementNS(ns,_3);
+}else{
+return document.createElement(_3);
+}
+};
+_1.xmlns={xlink:"http://www.w3.org/1999/xlink",svg:"http://www.w3.org/2000/svg"};
+_1.getRef=function(_4){
+if(!_4||_4=="none"){
 return null;
 }
-if(_1.match(/^url\(#.+\)$/)){
-return dojo.byId(_1.slice(5,-1));
+if(_4.match(/^url\(#.+\)$/)){
+return d.byId(_4.slice(5,-1));
 }
-if(_1.match(/^#dojoUnique\d+$/)){
-return dojo.byId(_1.slice(1));
+if(_4.match(/^#dojoUnique\d+$/)){
+return d.byId(_4.slice(1));
 }
 return null;
 };
-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,{setFill:function(_2){
-if(!_2){
+_1.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]};
+d.extend(g.Shape,{setFill:function(_5){
+if(!_5){
 this.fillStyle=null;
 this.rawNode.setAttribute("fill","none");
 this.rawNode.setAttribute("fill-opacity",0);
 return this;
 }
 var f;
-var _4=function(x){
+var _6=function(x){
 this.setAttribute(x,f[x].toFixed(8));
 };
-if(typeof (_2)=="object"&&"type" in _2){
-switch(_2.type){
+if(typeof (_5)=="object"&&"type" in _5){
+switch(_5.type){
 case "linear":
-f=dojox.gfx.makeParameters(dojox.gfx.defaultLinearGradient,_2);
-var _6=this._setFillObject(f,"linearGradient");
-dojo.forEach(["x1","y1","x2","y2"],_4,_6);
+f=g.makeParameters(g.defaultLinearGradient,_5);
+var _7=this._setFillObject(f,"linearGradient");
+d.forEach(["x1","y1","x2","y2"],_6,_7);
 break;
 case "radial":
-f=dojox.gfx.makeParameters(dojox.gfx.defaultRadialGradient,_2);
-var _6=this._setFillObject(f,"radialGradient");
-dojo.forEach(["cx","cy","r"],_4,_6);
+f=g.makeParameters(g.defaultRadialGradient,_5);
+var _7=this._setFillObject(f,"radialGradient");
+d.forEach(["cx","cy","r"],_6,_7);
 break;
 case "pattern":
-f=dojox.gfx.makeParameters(dojox.gfx.defaultPattern,_2);
-var _7=this._setFillObject(f,"pattern");
-dojo.forEach(["x","y","width","height"],_4,_7);
+f=g.makeParameters(g.defaultPattern,_5);
+var _8=this._setFillObject(f,"pattern");
+d.forEach(["x","y","width","height"],_6,_8);
 break;
 }
 this.fillStyle=f;
 return this;
 }
-var f=dojox.gfx.normalizeColor(_2);
+var f=g.normalizeColor(_5);
 this.fillStyle=f;
 this.rawNode.setAttribute("fill",f.toCss());
 this.rawNode.setAttribute("fill-opacity",f.a);
 this.rawNode.setAttribute("fill-rule","evenodd");
 return this;
-},setStroke:function(_8){
+},setStroke:function(_9){
 var rn=this.rawNode;
-if(!_8){
+if(!_9){
 this.strokeStyle=null;
 rn.setAttribute("stroke","none");
 rn.setAttribute("stroke-opacity",0);
 return this;
 }
-if(typeof _8=="string"||dojo.isArray(_8)||_8 instanceof dojo.Color){
-_8={color:_8};
+if(typeof _9=="string"||d.isArray(_9)||_9 instanceof d.Color){
+_9={color:_9};
 }
-var s=this.strokeStyle=dojox.gfx.makeParameters(dojox.gfx.defaultStroke,_8);
-s.color=dojox.gfx.normalizeColor(s.color);
+var s=this.strokeStyle=g.makeParameters(g.defaultStroke,_9);
+s.color=g.normalizeColor(s.color);
 if(s){
 rn.setAttribute("stroke",s.color.toCss());
 rn.setAttribute("stroke-opacity",s.color.a);
@@ -88,11 +97,11 @@ rn.setAttribute("stroke-miterlimit",s.join);
 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 in _1.dasharray){
+da=_1.dasharray[da];
 }
 if(da instanceof Array){
-da=dojo._toArray(da);
+da=d._toArray(da);
 for(var i=0;i<da.length;++i){
 da[i]*=s.width;
 }
@@ -114,67 +123,69 @@ rn.setAttribute("dojoGfxStrokeStyle",s.style);
 }
 return this;
 },_getParentSurface:function(){
-var _d=this.parent;
-for(;_d&&!(_d instanceof dojox.gfx.Surface);_d=_d.parent){
+var _a=this.parent;
+for(;_a&&!(_a instanceof g.Surface);_a=_a.parent){
 }
-return _d;
-},_setFillObject:function(f,_f){
-var _10=dojox.gfx.svg.xmlns.svg;
+return _a;
+},_setFillObject:function(f,_b){
+var _c=_1.xmlns.svg;
 this.fillStyle=f;
-var _11=this._getParentSurface(),_12=_11.defNode,_13=this.rawNode.getAttribute("fill"),ref=dojox.gfx.svg.getRef(_13);
+var _d=this._getParentSurface(),_e=_d.defNode,_f=this.rawNode.getAttribute("fill"),ref=_1.getRef(_f);
 if(ref){
-_13=ref;
-if(_13.tagName.toLowerCase()!=_f.toLowerCase()){
-var id=_13.id;
-_13.parentNode.removeChild(_13);
-_13=document.createElementNS(_10,_f);
-_13.setAttribute("id",id);
-_12.appendChild(_13);
+_f=ref;
+if(_f.tagName.toLowerCase()!=_b.toLowerCase()){
+var id=_f.id;
+_f.parentNode.removeChild(_f);
+_f=_2(_c,_b);
+_f.setAttribute("id",id);
+_e.appendChild(_f);
 }else{
-while(_13.childNodes.length){
-_13.removeChild(_13.lastChild);
+while(_f.childNodes.length){
+_f.removeChild(_f.lastChild);
 }
 }
 }else{
-_13=document.createElementNS(_10,_f);
-_13.setAttribute("id",dojox.gfx._base._getUniqueId());
-_12.appendChild(_13);
+_f=_2(_c,_b);
+_f.setAttribute("id",g._base._getUniqueId());
+_e.appendChild(_f);
 }
-if(_f=="pattern"){
-_13.setAttribute("patternUnits","userSpaceOnUse");
-var img=document.createElementNS(_10,"image");
+if(_b=="pattern"){
+_f.setAttribute("patternUnits","userSpaceOnUse");
+var img=_2(_c,"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);
-_13.appendChild(img);
+img.setAttributeNS(_1.xmlns.xlink,"href",f.src);
+_f.appendChild(img);
 }else{
-_13.setAttribute("gradientUnits","userSpaceOnUse");
+_f.setAttribute("gradientUnits","userSpaceOnUse");
 for(var i=0;i<f.colors.length;++i){
-var c=f.colors[i],t=document.createElementNS(_10,"stop"),cc=c.color=dojox.gfx.normalizeColor(c.color);
+var c=f.colors[i],t=_2(_c,"stop"),cc=c.color=g.normalizeColor(c.color);
 t.setAttribute("offset",c.offset.toFixed(8));
 t.setAttribute("stop-color",cc.toCss());
 t.setAttribute("stop-opacity",cc.a);
-_13.appendChild(t);
+_f.appendChild(t);
 }
 }
-this.rawNode.setAttribute("fill","url(#"+_13.getAttribute("id")+")");
+this.rawNode.setAttribute("fill","url(#"+_f.getAttribute("id")+")");
 this.rawNode.removeAttribute("fill-opacity");
 this.rawNode.setAttribute("fill-rule","evenodd");
-return _13;
+return _f;
 },_applyTransform:function(){
-var _1b=this.matrix;
-if(_1b){
+var _10=this.matrix;
+if(_10){
 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(_1d){
-var r=this.rawNode=_1d;
+},setRawNode:function(_11){
+var r=this.rawNode=_11;
+if(this.shape.type!="image"){
 r.setAttribute("fill","none");
+}
 r.setAttribute("fill-opacity",0);
 r.setAttribute("stroke","none");
 r.setAttribute("stroke-opacity",0);
@@ -182,13 +193,14 @@ r.setAttribute("stroke-width",1);
 r.setAttribute("stroke-linecap","butt");
 r.setAttribute("stroke-linejoin","miter");
 r.setAttribute("stroke-miterlimit",4);
-},setShape:function(_1f){
-this.shape=dojox.gfx.makeParameters(this.shape,_1f);
+},setShape:function(_12){
+this.shape=g.makeParameters(this.shape,_12);
 for(var i in this.shape){
 if(i!="type"){
 this.rawNode.setAttribute(i,this.shape[i]);
 }
 }
+this.bbox=null;
 return this;
 },_moveToFront:function(){
 this.rawNode.parentNode.appendChild(this.rawNode);
@@ -197,14 +209,14 @@ return this;
 this.rawNode.parentNode.insertBefore(this.rawNode,this.rawNode.parentNode.firstChild);
 return this;
 }});
-dojo.declare("dojox.gfx.Group",dojox.gfx.Shape,{constructor:function(){
-dojox.gfx.svg.Container._init.call(this);
-},setRawNode:function(_21){
-this.rawNode=_21;
+dojo.declare("dojox.gfx.Group",g.Shape,{constructor:function(){
+_1.Container._init.call(this);
+},setRawNode:function(_13){
+this.rawNode=_13;
 }});
-dojox.gfx.Group.nodeType="g";
-dojo.declare("dojox.gfx.Rect",dojox.gfx.shape.Rect,{setShape:function(_22){
-this.shape=dojox.gfx.makeParameters(this.shape,_22);
+g.Group.nodeType="g";
+dojo.declare("dojox.gfx.Rect",gs.Rect,{setShape:function(_14){
+this.shape=g.makeParameters(this.shape,_14);
 this.bbox=null;
 for(var i in this.shape){
 if(i!="type"&&i!="r"){
@@ -217,51 +229,48 @@ this.rawNode.setAttribute("rx",this.shape.r);
 }
 return this;
 }});
-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,{setShape:function(_24,_25){
-if(_24&&_24 instanceof Array){
-this.shape=dojox.gfx.makeParameters(this.shape,{points:_24});
-if(_25&&this.shape.points.length){
+g.Rect.nodeType="rect";
+g.Ellipse=gs.Ellipse;
+g.Ellipse.nodeType="ellipse";
+g.Circle=gs.Circle;
+g.Circle.nodeType="circle";
+g.Line=gs.Line;
+g.Line.nodeType="line";
+dojo.declare("dojox.gfx.Polyline",gs.Polyline,{setShape:function(_15,_16){
+if(_15&&_15 instanceof Array){
+this.shape=g.makeParameters(this.shape,{points:_15});
+if(_16&&this.shape.points.length){
 this.shape.points.push(this.shape.points[0]);
 }
 }else{
-this.shape=dojox.gfx.makeParameters(this.shape,_24);
+this.shape=g.makeParameters(this.shape,_15);
 }
-this.box=null;
-var _26=[],p=this.shape.points;
+this.bbox=null;
+this._normalizePoints();
+var _17=[],p=this.shape.points;
 for(var i=0;i<p.length;++i){
-if(typeof p[i]=="number"){
-_26.push(p[i].toFixed(8));
-}else{
-_26.push(p[i].x.toFixed(8));
-_26.push(p[i].y.toFixed(8));
-}
+_17.push(p[i].x.toFixed(8),p[i].y.toFixed(8));
 }
-this.rawNode.setAttribute("points",_26.join(" "));
+this.rawNode.setAttribute("points",_17.join(" "));
 return this;
 }});
-dojox.gfx.Polyline.nodeType="polyline";
-dojo.declare("dojox.gfx.Image",dojox.gfx.shape.Image,{setShape:function(_29){
-this.shape=dojox.gfx.makeParameters(this.shape,_29);
+g.Polyline.nodeType="polyline";
+dojo.declare("dojox.gfx.Image",gs.Image,{setShape:function(_18){
+this.shape=g.makeParameters(this.shape,_18);
 this.bbox=null;
-var _2a=this.rawNode;
+var _19=this.rawNode;
 for(var i in this.shape){
 if(i!="type"&&i!="src"){
-_2a.setAttribute(i,this.shape[i]);
+_19.setAttribute(i,this.shape[i]);
 }
 }
-_2a.setAttributeNS(dojox.gfx.svg.xmlns.xlink,"href",this.shape.src);
+_19.setAttribute("preserveAspectRatio","none");
+_19.setAttributeNS(_1.xmlns.xlink,"href",this.shape.src);
 return this;
 }});
-dojox.gfx.Image.nodeType="image";
-dojo.declare("dojox.gfx.Text",dojox.gfx.shape.Text,{setShape:function(_2c){
-this.shape=dojox.gfx.makeParameters(this.shape,_2c);
+g.Image.nodeType="image";
+dojo.declare("dojox.gfx.Text",gs.Text,{setShape:function(_1a){
+this.shape=g.makeParameters(this.shape,_1a);
 this.bbox=null;
 var r=this.rawNode,s=this.shape;
 r.setAttribute("x",s.x);
@@ -271,38 +280,42 @@ 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");
+if(!dojo.isIE){
 r.textContent=s.text;
+}else{
+r.appendChild(document.createTextNode(s.text));
+}
 return this;
 },getTextWidth:function(){
-var _2f=this.rawNode,_30=_2f.parentNode,_31=_2f.cloneNode(true);
-_31.style.visibility="hidden";
-var _32=0,_33=_31.firstChild.nodeValue;
-_30.appendChild(_31);
-if(_33!=""){
-while(!_32){
-_32=parseInt(_31.getBBox().width);
+var _1b=this.rawNode,_1c=_1b.parentNode,_1d=_1b.cloneNode(true);
+_1d.style.visibility="hidden";
+var _1e=0,_1f=_1d.firstChild.nodeValue;
+_1c.appendChild(_1d);
+if(_1f!=""){
+while(!_1e){
+_1e=parseInt(_1d.getBBox().width);
 }
 }
-_30.removeChild(_31);
-return _32;
+_1c.removeChild(_1d);
+return _1e;
 }});
-dojox.gfx.Text.nodeType="text";
-dojo.declare("dojox.gfx.Path",dojox.gfx.path.Path,{_updateWithSegment:function(_34){
-dojox.gfx.Path.superclass._updateWithSegment.apply(this,arguments);
+g.Text.nodeType="text";
+dojo.declare("dojox.gfx.Path",g.path.Path,{_updateWithSegment:function(_20){
+g.Path.superclass._updateWithSegment.apply(this,arguments);
 if(typeof (this.shape.path)=="string"){
 this.rawNode.setAttribute("d",this.shape.path);
 }
-},setShape:function(_35){
-dojox.gfx.Path.superclass.setShape.apply(this,arguments);
+},setShape:function(_21){
+g.Path.superclass.setShape.apply(this,arguments);
 this.rawNode.setAttribute("d",this.shape.path);
 return this;
 }});
-dojox.gfx.Path.nodeType="path";
-dojo.declare("dojox.gfx.TextPath",dojox.gfx.path.TextPath,{_updateWithSegment:function(_36){
-dojox.gfx.Path.superclass._updateWithSegment.apply(this,arguments);
+g.Path.nodeType="path";
+dojo.declare("dojox.gfx.TextPath",g.path.TextPath,{_updateWithSegment:function(_22){
+g.Path.superclass._updateWithSegment.apply(this,arguments);
 this._setTextPath();
-},setShape:function(_37){
-dojox.gfx.Path.superclass.setShape.apply(this,arguments);
+},setShape:function(_23){
+g.Path.superclass.setShape.apply(this,arguments);
 this._setTextPath();
 return this;
 },_setTextPath:function(){
@@ -311,29 +324,29 @@ return;
 }
 var r=this.rawNode;
 if(!r.firstChild){
-var tp=document.createElementNS(dojox.gfx.svg.xmlns.svg,"textPath"),tx=document.createTextNode("");
+var tp=_2(_1.xmlns.svg,"textPath"),tx=document.createTextNode("");
 tp.appendChild(tx);
 r.appendChild(tp);
 }
-var ref=r.firstChild.getAttributeNS(dojox.gfx.svg.xmlns.xlink,"href"),_3c=ref&&dojox.gfx.svg.getRef(ref);
-if(!_3c){
-var _3d=this._getParentSurface();
-if(_3d){
-var _3e=_3d.defNode;
-_3c=document.createElementNS(dojox.gfx.svg.xmlns.svg,"path");
-var id=dojox.gfx._base._getUniqueId();
-_3c.setAttribute("id",id);
-_3e.appendChild(_3c);
-r.firstChild.setAttributeNS(dojox.gfx.svg.xmlns.xlink,"href","#"+id);
+var ref=r.firstChild.getAttributeNS(_1.xmlns.xlink,"href"),_24=ref&&_1.getRef(ref);
+if(!_24){
+var _25=this._getParentSurface();
+if(_25){
+var _26=_25.defNode;
+_24=_2(_1.xmlns.svg,"path");
+var id=g._base._getUniqueId();
+_24.setAttribute("id",id);
+_26.appendChild(_24);
+r.firstChild.setAttributeNS(_1.xmlns.xlink,"href","#"+id);
 }
 }
-if(_3c){
-_3c.setAttribute("d",this.shape.path);
+if(_24){
+_24.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("");
+var tp=_2(_1.xmlns.svg,"textPath"),tx=document.createTextNode("");
 tp.appendChild(tx);
 r.appendChild(tp);
 }
@@ -360,35 +373,40 @@ 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,{constructor:function(){
-dojox.gfx.svg.Container._init.call(this);
+g.TextPath.nodeType="text";
+dojo.declare("dojox.gfx.Surface",gs.Surface,{constructor:function(){
+_1.Container._init.call(this);
 },destroy:function(){
 this.defNode=null;
 this.inherited(arguments);
-},setDimensions:function(_44,_45){
+},setDimensions:function(_27,_28){
 if(!this.rawNode){
 return this;
 }
-this.rawNode.setAttribute("width",_44);
-this.rawNode.setAttribute("height",_45);
+this.rawNode.setAttribute("width",_27);
+this.rawNode.setAttribute("height",_28);
 return this;
 },getDimensions:function(){
-return this.rawNode?{width:this.rawNode.getAttribute("width"),height:this.rawNode.getAttribute("height")}:null;
+var t=this.rawNode?{width:g.normalizedLength(this.rawNode.getAttribute("width")),height:g.normalizedLength(this.rawNode.getAttribute("height"))}:null;
+return t;
 }});
-dojox.gfx.createSurface=function(_46,_47,_48){
-var s=new dojox.gfx.Surface();
-s.rawNode=document.createElementNS(dojox.gfx.svg.xmlns.svg,"svg");
-s.rawNode.setAttribute("width",_47);
-s.rawNode.setAttribute("height",_48);
-var _4a=document.createElementNS(dojox.gfx.svg.xmlns.svg,"defs");
-s.rawNode.appendChild(_4a);
-s.defNode=_4a;
-s._parent=dojo.byId(_46);
+g.createSurface=function(_29,_2a,_2b){
+var s=new g.Surface();
+s.rawNode=_2(_1.xmlns.svg,"svg");
+if(_2a){
+s.rawNode.setAttribute("width",_2a);
+}
+if(_2b){
+s.rawNode.setAttribute("height",_2b);
+}
+var _2c=_2(_1.xmlns.svg,"defs");
+s.rawNode.appendChild(_2c);
+s.defNode=_2c;
+s._parent=d.byId(_29);
 s._parent.appendChild(s.rawNode);
 return s;
 };
-dojox.gfx.svg.Font={_setFont:function(){
+_1.Font={_setFont:function(){
 var f=this.fontStyle;
 this.rawNode.setAttribute("font-style",f.style);
 this.rawNode.setAttribute("font-variant",f.variant);
@@ -396,20 +414,20 @@ 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(_4c){
-if(this!=_4c.getParent()){
-this.rawNode.appendChild(_4c.rawNode);
-dojox.gfx.shape.Container.add.apply(this,arguments);
+_1.Container={_init:function(){
+gs.Container._init.call(this);
+},add:function(_2d){
+if(this!=_2d.getParent()){
+this.rawNode.appendChild(_2d.rawNode);
+gs.Container.add.apply(this,arguments);
 }
 return this;
-},remove:function(_4d,_4e){
-if(this==_4d.getParent()){
-if(this.rawNode==_4d.rawNode.parentNode){
-this.rawNode.removeChild(_4d.rawNode);
+},remove:function(_2e,_2f){
+if(this==_2e.getParent()){
+if(this.rawNode==_2e.rawNode.parentNode){
+this.rawNode.removeChild(_2e.rawNode);
 }
-dojox.gfx.shape.Container.remove.apply(this,arguments);
+gs.Container.remove.apply(this,arguments);
 }
 return this;
 },clear:function(){
@@ -417,30 +435,31 @@ var r=this.rawNode;
 while(r.lastChild){
 r.removeChild(r.lastChild);
 }
-var d=this.defNode;
-if(d){
-while(d.lastChild){
-d.removeChild(d.lastChild);
+var _30=this.defNode;
+if(_30){
+while(_30.lastChild){
+_30.removeChild(_30.lastChild);
 }
-r.appendChild(d);
+r.appendChild(_30);
 }
-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(_51,_52){
+return gs.Container.clear.apply(this,arguments);
+},_moveChildToFront:gs.Container._moveChildToFront,_moveChildToBack:gs.Container._moveChildToBack};
+d.mixin(gs.Creator,{createObject:function(_31,_32){
 if(!this.rawNode){
 return null;
 }
-var _53=new _51(),_54=document.createElementNS(dojox.gfx.svg.xmlns.svg,_51.nodeType);
-_53.setRawNode(_54);
-this.rawNode.appendChild(_54);
-_53.setShape(_52);
-this.add(_53);
-return _53;
+var _33=new _31(),_34=_2(_1.xmlns.svg,_31.nodeType);
+_33.setRawNode(_34);
+this.rawNode.appendChild(_34);
+_33.setShape(_32);
+this.add(_33);
+return _33;
 }});
-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);
+d.extend(g.Text,_1.Font);
+d.extend(g.TextPath,_1.Font);
+d.extend(g.Group,_1.Container);
+d.extend(g.Group,gs.Creator);
+d.extend(g.Surface,_1.Container);
+d.extend(g.Surface,gs.Creator);
+})();
 }
diff --git a/dojox/gfx/svg_attach.js b/dojox/gfx/svg_attach.js
index bd06745..ff0e898 100644
--- a/dojox/gfx/svg_attach.js
+++ b/dojox/gfx/svg_attach.js
@@ -16,176 +16,176 @@ var s=null;
 switch(_1.tagName.toLowerCase()){
 case dojox.gfx.Rect.nodeType:
 s=new dojox.gfx.Rect(_1);
-_3(s);
+_2(s);
 break;
 case dojox.gfx.Ellipse.nodeType:
 s=new dojox.gfx.Ellipse(_1);
-_4(s,dojox.gfx.defaultEllipse);
+_3(s,dojox.gfx.defaultEllipse);
 break;
 case dojox.gfx.Polyline.nodeType:
 s=new dojox.gfx.Polyline(_1);
-_4(s,dojox.gfx.defaultPolyline);
+_3(s,dojox.gfx.defaultPolyline);
 break;
 case dojox.gfx.Path.nodeType:
 s=new dojox.gfx.Path(_1);
-_4(s,dojox.gfx.defaultPath);
+_3(s,dojox.gfx.defaultPath);
 break;
 case dojox.gfx.Circle.nodeType:
 s=new dojox.gfx.Circle(_1);
-_4(s,dojox.gfx.defaultCircle);
+_3(s,dojox.gfx.defaultCircle);
 break;
 case dojox.gfx.Line.nodeType:
 s=new dojox.gfx.Line(_1);
-_4(s,dojox.gfx.defaultLine);
+_3(s,dojox.gfx.defaultLine);
 break;
 case dojox.gfx.Image.nodeType:
 s=new dojox.gfx.Image(_1);
-_4(s,dojox.gfx.defaultImage);
+_3(s,dojox.gfx.defaultImage);
 break;
 case dojox.gfx.Text.nodeType:
 var t=_1.getElementsByTagName("textPath");
 if(t&&t.length){
 s=new dojox.gfx.TextPath(_1);
-_4(s,dojox.gfx.defaultPath);
-_6(s);
+_3(s,dojox.gfx.defaultPath);
+_4(s);
 }else{
 s=new dojox.gfx.Text(_1);
-_7(s);
+_5(s);
 }
-_8(s);
+_6(s);
 break;
 default:
 return null;
 }
 if(!(s instanceof dojox.gfx.Image)){
-_9(s);
-_a(s);
+_7(s);
+_8(s);
 }
-_b(s);
+_9(s);
 return s;
 };
-dojox.gfx.attachSurface=function(_c){
+dojox.gfx.attachSurface=function(_a){
 var s=new dojox.gfx.Surface();
-s.rawNode=_c;
-var _e=_c.getElementsByTagName("defs");
-if(_e.length==0){
+s.rawNode=_a;
+var _b=_a.getElementsByTagName("defs");
+if(_b.length==0){
 return null;
 }
-s.defNode=_e[0];
+s.defNode=_b[0];
 return s;
 };
-var _9=function(_f){
-var _10=_f.rawNode.getAttribute("fill");
-if(_10=="none"){
-_f.fillStyle=null;
+var _7=function(_c){
+var _d=_c.rawNode.getAttribute("fill");
+if(_d=="none"){
+_c.fillStyle=null;
 return;
 }
-var _11=null,_12=dojox.gfx.svg.getRef(_10);
-if(_12){
-switch(_12.tagName.toLowerCase()){
+var _e=null,_f=dojox.gfx.svg.getRef(_d);
+if(_f){
+switch(_f.tagName.toLowerCase()){
 case "lineargradient":
-_11=_13(dojox.gfx.defaultLinearGradient,_12);
+_e=_10(dojox.gfx.defaultLinearGradient,_f);
 dojo.forEach(["x1","y1","x2","y2"],function(x){
-_11[x]=_12.getAttribute(x);
+_e[x]=_f.getAttribute(x);
 });
 break;
 case "radialgradient":
-_11=_13(dojox.gfx.defaultRadialGradient,_12);
+_e=_10(dojox.gfx.defaultRadialGradient,_f);
 dojo.forEach(["cx","cy","r"],function(x){
-_11[x]=_12.getAttribute(x);
+_e[x]=_f.getAttribute(x);
 });
-_11.cx=_12.getAttribute("cx");
-_11.cy=_12.getAttribute("cy");
-_11.r=_12.getAttribute("r");
+_e.cx=_f.getAttribute("cx");
+_e.cy=_f.getAttribute("cy");
+_e.r=_f.getAttribute("r");
 break;
 case "pattern":
-_11=dojo.lang.shallowCopy(dojox.gfx.defaultPattern,true);
+_e=dojo.lang.shallowCopy(dojox.gfx.defaultPattern,true);
 dojo.forEach(["x","y","width","height"],function(x){
-_11[x]=_12.getAttribute(x);
+_e[x]=_f.getAttribute(x);
 });
-_11.src=_12.firstChild.getAttributeNS(dojox.gfx.svg.xmlns.xlink,"href");
+_e.src=_f.firstChild.getAttributeNS(dojox.gfx.svg.xmlns.xlink,"href");
 break;
 }
 }else{
-_11=new dojo.Color(_10);
-var _17=_f.rawNode.getAttribute("fill-opacity");
-if(_17!=null){
-_11.a=_17;
+_e=new dojo.Color(_d);
+var _11=_c.rawNode.getAttribute("fill-opacity");
+if(_11!=null){
+_e.a=_11;
 }
 }
-_f.fillStyle=_11;
+_c.fillStyle=_e;
 };
-var _13=function(_18,_19){
-var _1a=dojo.clone(_18);
-_1a.colors=[];
-for(var i=0;i<_19.childNodes.length;++i){
-_1a.colors.push({offset:_19.childNodes[i].getAttribute("offset"),color:new dojo.Color(_19.childNodes[i].getAttribute("stop-color"))});
+var _10=function(_12,_13){
+var _14=dojo.clone(_12);
+_14.colors=[];
+for(var i=0;i<_13.childNodes.length;++i){
+_14.colors.push({offset:_13.childNodes[i].getAttribute("offset"),color:new dojo.Color(_13.childNodes[i].getAttribute("stop-color"))});
 }
-return _1a;
+return _14;
 };
-var _a=function(_1c){
-var _1d=_1c.rawNode,_1e=_1d.getAttribute("stroke");
-if(_1e==null||_1e=="none"){
-_1c.strokeStyle=null;
+var _8=function(_15){
+var _16=_15.rawNode,_17=_16.getAttribute("stroke");
+if(_17==null||_17=="none"){
+_15.strokeStyle=null;
 return;
 }
-var _1f=_1c.strokeStyle=dojo.clone(dojox.gfx.defaultStroke);
-var _20=new dojo.Color(_1e);
-if(_20){
-_1f.color=_20;
-_1f.color.a=_1d.getAttribute("stroke-opacity");
-_1f.width=_1d.getAttribute("stroke-width");
-_1f.cap=_1d.getAttribute("stroke-linecap");
-_1f.join=_1d.getAttribute("stroke-linejoin");
-if(_1f.join=="miter"){
-_1f.join=_1d.getAttribute("stroke-miterlimit");
+var _18=_15.strokeStyle=dojo.clone(dojox.gfx.defaultStroke);
+var _19=new dojo.Color(_17);
+if(_19){
+_18.color=_19;
+_18.color.a=_16.getAttribute("stroke-opacity");
+_18.width=_16.getAttribute("stroke-width");
+_18.cap=_16.getAttribute("stroke-linecap");
+_18.join=_16.getAttribute("stroke-linejoin");
+if(_18.join=="miter"){
+_18.join=_16.getAttribute("stroke-miterlimit");
 }
-_1f.style=_1d.getAttribute("dojoGfxStrokeStyle");
+_18.style=_16.getAttribute("dojoGfxStrokeStyle");
 }
 };
-var _b=function(_21){
-var _22=_21.rawNode.getAttribute("transform");
-if(_22.match(/^matrix\(.+\)$/)){
-var t=_22.slice(7,-1).split(",");
-_21.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])});
+var _9=function(_1a){
+var _1b=_1a.rawNode.getAttribute("transform");
+if(_1b.match(/^matrix\(.+\)$/)){
+var t=_1b.slice(7,-1).split(",");
+_1a.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{
-_21.matrix=null;
+_1a.matrix=null;
 }
 };
-var _8=function(_24){
-var _25=_24.fontStyle=dojo.clone(dojox.gfx.defaultFont),r=_24.rawNode;
-_25.style=r.getAttribute("font-style");
-_25.variant=r.getAttribute("font-variant");
-_25.weight=r.getAttribute("font-weight");
-_25.size=r.getAttribute("font-size");
-_25.family=r.getAttribute("font-family");
+var _6=function(_1c){
+var _1d=_1c.fontStyle=dojo.clone(dojox.gfx.defaultFont),r=_1c.rawNode;
+_1d.style=r.getAttribute("font-style");
+_1d.variant=r.getAttribute("font-variant");
+_1d.weight=r.getAttribute("font-weight");
+_1d.size=r.getAttribute("font-size");
+_1d.family=r.getAttribute("font-family");
 };
-var _4=function(_27,def){
-var _29=_27.shape=dojo.clone(def),r=_27.rawNode;
-for(var i in _29){
-_29[i]=r.getAttribute(i);
+var _3=function(_1e,def){
+var _1f=_1e.shape=dojo.clone(def),r=_1e.rawNode;
+for(var i in _1f){
+_1f[i]=r.getAttribute(i);
 }
 };
-var _3=function(_2c){
-_4(_2c,dojox.gfx.defaultRect);
-_2c.shape.r=Math.min(_2c.rawNode.getAttribute("rx"),_2c.rawNode.getAttribute("ry"));
+var _2=function(_20){
+_3(_20,dojox.gfx.defaultRect);
+_20.shape.r=Math.min(_20.rawNode.getAttribute("rx"),_20.rawNode.getAttribute("ry"));
 };
-var _7=function(_2d){
-var _2e=_2d.shape=dojo.clone(dojox.gfx.defaultText),r=_2d.rawNode;
-_2e.x=r.getAttribute("x");
-_2e.y=r.getAttribute("y");
-_2e.align=r.getAttribute("text-anchor");
-_2e.decoration=r.getAttribute("text-decoration");
-_2e.rotated=parseFloat(r.getAttribute("rotate"))!=0;
-_2e.kerning=r.getAttribute("kerning")=="auto";
-_2e.text=r.firstChild.nodeValue;
+var _5=function(_21){
+var _22=_21.shape=dojo.clone(dojox.gfx.defaultText),r=_21.rawNode;
+_22.x=r.getAttribute("x");
+_22.y=r.getAttribute("y");
+_22.align=r.getAttribute("text-anchor");
+_22.decoration=r.getAttribute("text-decoration");
+_22.rotated=parseFloat(r.getAttribute("rotate"))!=0;
+_22.kerning=r.getAttribute("kerning")=="auto";
+_22.text=r.firstChild.nodeValue;
 };
-var _6=function(_30){
-var _31=_30.shape=dojo.clone(dojox.gfx.defaultTextPath),r=_30.rawNode;
-_31.align=r.getAttribute("text-anchor");
-_31.decoration=r.getAttribute("text-decoration");
-_31.rotated=parseFloat(r.getAttribute("rotate"))!=0;
-_31.kerning=r.getAttribute("kerning")=="auto";
-_31.text=r.firstChild.nodeValue;
+var _4=function(_23){
+var _24=_23.shape=dojo.clone(dojox.gfx.defaultTextPath),r=_23.rawNode;
+_24.align=r.getAttribute("text-anchor");
+_24.decoration=r.getAttribute("text-decoration");
+_24.rotated=parseFloat(r.getAttribute("rotate"))!=0;
+_24.kerning=r.getAttribute("kerning")=="auto";
+_24.text=r.firstChild.nodeValue;
 };
 })();
diff --git a/dojox/gfx/utils.js b/dojox/gfx/utils.js
index 62d140e..8404144 100644
--- a/dojox/gfx/utils.js
+++ b/dojox/gfx/utils.js
@@ -11,74 +11,188 @@ dojo.provide("dojox.gfx.utils");
 dojo.require("dojox.gfx");
 (function(){
 var d=dojo,g=dojox.gfx,gu=g.utils;
-dojo.mixin(gu,{forEach:function(_4,f,o){
+dojo.mixin(gu,{forEach:function(_1,f,o){
 o=o||d.global;
-f.call(o,_4);
-if(_4 instanceof g.Surface||_4 instanceof g.Group){
-d.forEach(_4.children,function(_7){
-gu.forEach(_7,f,o);
+f.call(o,_1);
+if(_1 instanceof g.Surface||_1 instanceof g.Group){
+d.forEach(_1.children,function(_2){
+gu.forEach(_2,f,o);
 });
 }
-},serialize:function(_8){
-var t={},v,_b=_8 instanceof g.Surface;
-if(_b||_8 instanceof g.Group){
-t.children=d.map(_8.children,gu.serialize);
-if(_b){
+},serialize:function(_3){
+var t={},v,_4=_3 instanceof g.Surface;
+if(_4||_3 instanceof g.Group){
+t.children=d.map(_3.children,gu.serialize);
+if(_4){
 return t.children;
 }
 }else{
-t.shape=_8.getShape();
+t.shape=_3.getShape();
 }
-if(_8.getTransform){
-v=_8.getTransform();
+if(_3.getTransform){
+v=_3.getTransform();
 if(v){
 t.transform=v;
 }
 }
-if(_8.getStroke){
-v=_8.getStroke();
+if(_3.getStroke){
+v=_3.getStroke();
 if(v){
 t.stroke=v;
 }
 }
-if(_8.getFill){
-v=_8.getFill();
+if(_3.getFill){
+v=_3.getFill();
 if(v){
 t.fill=v;
 }
 }
-if(_8.getFont){
-v=_8.getFont();
+if(_3.getFont){
+v=_3.getFont();
 if(v){
 t.font=v;
 }
 }
 return t;
-},toJson:function(_c,_d){
-return d.toJson(gu.serialize(_c),_d);
-},deserialize:function(_e,_f){
-if(_f instanceof Array){
-return d.map(_f,d.hitch(null,gu.deserialize,_e));
+},toJson:function(_5,_6){
+return d.toJson(gu.serialize(_5),_6);
+},deserialize:function(_7,_8){
+if(_8 instanceof Array){
+return d.map(_8,d.hitch(null,gu.deserialize,_7));
 }
-var _10=("shape" in _f)?_e.createShape(_f.shape):_e.createGroup();
-if("transform" in _f){
-_10.setTransform(_f.transform);
+var _9=("shape" in _8)?_7.createShape(_8.shape):_7.createGroup();
+if("transform" in _8){
+_9.setTransform(_8.transform);
 }
-if("stroke" in _f){
-_10.setStroke(_f.stroke);
+if("stroke" in _8){
+_9.setStroke(_8.stroke);
 }
-if("fill" in _f){
-_10.setFill(_f.fill);
+if("fill" in _8){
+_9.setFill(_8.fill);
 }
-if("font" in _f){
-_10.setFont(_f.font);
+if("font" in _8){
+_9.setFont(_8.font);
 }
-if("children" in _f){
-d.forEach(_f.children,d.hitch(null,gu.deserialize,_10));
+if("children" in _8){
+d.forEach(_8.children,d.hitch(null,gu.deserialize,_9));
 }
-return _10;
-},fromJson:function(_11,_12){
-return gu.deserialize(_11,d.fromJson(_12));
+return _9;
+},fromJson:function(_a,_b){
+return gu.deserialize(_a,d.fromJson(_b));
+},toSvg:function(_c){
+var _d=new dojo.Deferred();
+if(dojox.gfx.renderer==="svg"){
+try{
+var _e=gu._cleanSvg(gu._innerXML(_c.rawNode));
+_d.callback(_e);
+}
+catch(e){
+_d.errback(e);
+}
+}else{
+if(!gu._initSvgSerializerDeferred){
+gu._initSvgSerializer();
+}
+var _f=dojox.gfx.utils.toJson(_c);
+var _10=function(){
+try{
+var _11=_c.getDimensions();
+var _12=_11.width;
+var _13=_11.height;
+var _14=gu._gfxSvgProxy.document.createElement("div");
+gu._gfxSvgProxy.document.body.appendChild(_14);
+dojo.withDoc(gu._gfxSvgProxy.document,function(){
+dojo.style(_14,"width",_12);
+dojo.style(_14,"height",_13);
+},this);
+var ts=gu._gfxSvgProxy[dojox._scopeName].gfx.createSurface(_14,_12,_13);
+var _15=function(_16){
+try{
+gu._gfxSvgProxy[dojox._scopeName].gfx.utils.fromJson(_16,_f);
+var svg=gu._cleanSvg(_14.innerHTML);
+_16.clear();
+_16.destroy();
+gu._gfxSvgProxy.document.body.removeChild(_14);
+_d.callback(svg);
+}
+catch(e){
+_d.errback(e);
+}
+};
+ts.whenLoaded(null,_15);
+}
+catch(ex){
+_d.errback(ex);
+}
+};
+if(gu._initSvgSerializerDeferred.fired>0){
+_10();
+}else{
+gu._initSvgSerializerDeferred.addCallback(_10);
+}
+}
+return _d;
+},_gfxSvgProxy:null,_initSvgSerializerDeferred:null,_svgSerializerInitialized:function(){
+gu._initSvgSerializerDeferred.callback(true);
+},_initSvgSerializer:function(){
+if(!gu._initSvgSerializerDeferred){
+gu._initSvgSerializerDeferred=new dojo.Deferred();
+var f=dojo.doc.createElement("iframe");
+dojo.style(f,{display:"none",position:"absolute",width:"1em",height:"1em",top:"-10000px"});
+var _17;
+if(dojo.isIE){
+f.onreadystatechange=function(){
+if(f.contentWindow.document.readyState=="complete"){
+f.onreadystatechange=function(){
+};
+_17=setInterval(function(){
+if(f.contentWindow[dojo._scopeName]&&f.contentWindow[dojox._scopeName].gfx&&f.contentWindow[dojox._scopeName].gfx.utils){
+clearInterval(_17);
+f.contentWindow.parent[dojox._scopeName].gfx.utils._gfxSvgProxy=f.contentWindow;
+f.contentWindow.parent[dojox._scopeName].gfx.utils._svgSerializerInitialized();
+}
+},50);
+}
+};
+}else{
+f.onload=function(){
+f.onload=function(){
+};
+_17=setInterval(function(){
+if(f.contentWindow[dojo._scopeName]&&f.contentWindow[dojox._scopeName].gfx&&f.contentWindow[dojox._scopeName].gfx.utils){
+clearInterval(_17);
+f.contentWindow.parent[dojox._scopeName].gfx.utils._gfxSvgProxy=f.contentWindow;
+f.contentWindow.parent[dojox._scopeName].gfx.utils._svgSerializerInitialized();
+}
+},50);
+};
+}
+var uri=(dojo.config["dojoxGfxSvgProxyFrameUrl"]||dojo.moduleUrl("dojox","gfx/resources/gfxSvgProxyFrame.html"));
+f.setAttribute("src",uri);
+dojo.body().appendChild(f);
+}
+},_innerXML:function(_18){
+if(_18.innerXML){
+return _18.innerXML;
+}else{
+if(_18.xml){
+return _18.xml;
+}else{
+if(typeof XMLSerializer!="undefined"){
+return (new XMLSerializer()).serializeToString(_18);
+}
+}
+}
+return null;
+},_cleanSvg:function(svg){
+if(svg){
+if(svg.indexOf("xmlns=\"http://www.w3.org/2000/svg\"")==-1){
+svg=svg.substring(4,svg.length);
+svg="<svg xmlns=\"http://www.w3.org/2000/svg\""+svg;
+}
+svg=svg.replace(/\bdojoGfx\w*\s*=\s*(['"])\w*\1/g,"");
+}
+return svg;
 }});
 })();
 }
diff --git a/dojox/gfx/vml.js b/dojox/gfx/vml.js
index f787a1f..6b6698d 100644
--- a/dojox/gfx/vml.js
+++ b/dojox/gfx/vml.js
@@ -13,29 +13,29 @@ dojo.require("dojox.gfx.shape");
 dojo.require("dojox.gfx.path");
 dojo.require("dojox.gfx.arc");
 (function(){
-var g=dojox.gfx,m=g.matrix,_3=g.vml,sh=g.shape;
-_3.xmlns="urn:schemas-microsoft-com:vml";
-_3.text_alignment={start:"left",middle:"center",end:"right"};
-_3._parseFloat=function(_5){
-return _5.match(/^\d+f$/i)?parseInt(_5)/65536:parseFloat(_5);
+var d=dojo,g=dojox.gfx,m=g.matrix,gs=g.shape,_1=g.vml;
+_1.xmlns="urn:schemas-microsoft-com:vml";
+_1.text_alignment={start:"left",middle:"center",end:"right"};
+_1._parseFloat=function(_2){
+return _2.match(/^\d+f$/i)?parseInt(_2)/65536:parseFloat(_2);
 };
-_3._bool={"t":1,"true":1};
-dojo.extend(g.Shape,{setFill:function(_6){
-if(!_6){
+_1._bool={"t":1,"true":1};
+d.extend(g.Shape,{setFill:function(_3){
+if(!_3){
 this.fillStyle=null;
 this.rawNode.filled="f";
 return this;
 }
 var i,f,fo,a,s;
-if(typeof _6=="object"&&"type" in _6){
-switch(_6.type){
+if(typeof _3=="object"&&"type" in _3){
+switch(_3.type){
 case "linear":
-var _c=this._getRealMatrix();
+var _4=this._getRealMatrix();
 s=[];
-f=g.makeParameters(g.defaultLinearGradient,_6);
+f=g.makeParameters(g.defaultLinearGradient,_3);
 a=f.colors;
 this.fillStyle=f;
-dojo.forEach(a,function(v,i,a){
+d.forEach(a,function(v,i,a){
 a[i].color=g.normalizeColor(v.color);
 });
 if(a[0].offset>0){
@@ -52,19 +52,19 @@ fo=this.rawNode.fill;
 fo.colors.value=s.join(";");
 fo.method="sigma";
 fo.type="gradient";
-var fc1=_c?m.multiplyPoint(_c,f.x1,f.y1):{x:f.x1,y:f.y1},fc2=_c?m.multiplyPoint(_c,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;
+var _5=_4?m.multiplyPoint(_4,f.x1,f.y1):{x:f.x1,y:f.y1},_6=_4?m.multiplyPoint(_4,f.x2,f.y2):{x:f.x2,y:f.y2};
+fo.angle=(m._radToDeg(Math.atan2(_6.x-_5.x,_6.y-_5.y))+180)%360;
 fo.on=true;
 break;
 case "radial":
-f=g.makeParameters(g.defaultRadialGradient,_6);
+f=g.makeParameters(g.defaultRadialGradient,_3);
 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=[];
 if(f.colors[0].offset>0){
 a.push({offset:1,color:g.normalizeColor(f.colors[0].color)});
 }
-dojo.forEach(f.colors,function(v,i){
+d.forEach(f.colors,function(v,i){
 a.push({offset:1-v.offset*c,color:g.normalizeColor(v.color)});
 });
 i=a.length-1;
@@ -73,7 +73,7 @@ while(i>=0&&a[i].offset<0){
 }
 if(i<a.length-1){
 var q=a[i],p=a[i+1];
-p.color=dojo.blendColors(q.color,p.color,q.offset/(q.offset-p.offset));
+p.color=d.blendColors(q.color,p.color,q.offset/(q.offset-p.offset));
 p.offset=0;
 while(a.length-i>2){
 a.pop();
@@ -99,7 +99,7 @@ fo.focussize="0 0";
 fo.on=true;
 break;
 case "pattern":
-f=g.makeParameters(g.defaultPattern,_6);
+f=g.makeParameters(g.defaultPattern,_3);
 this.fillStyle=f;
 fo=this.rawNode.fill;
 fo.type="tile";
@@ -119,7 +119,7 @@ break;
 this.rawNode.fill.opacity=1;
 return this;
 }
-this.fillStyle=g.normalizeColor(_6);
+this.fillStyle=g.normalizeColor(_3);
 fo=this.rawNode.fill;
 if(!fo){
 fo=this.rawNode.ownerDocument.createElement("v:fill");
@@ -130,16 +130,16 @@ fo.opacity=this.fillStyle.a;
 this.rawNode.fillcolor=this.fillStyle.toHex();
 this.rawNode.filled=true;
 return this;
-},setStroke:function(_1b){
-if(!_1b){
+},setStroke:function(_7){
+if(!_7){
 this.strokeStyle=null;
 this.rawNode.stroked="f";
 return this;
 }
-if(typeof _1b=="string"||dojo.isArray(_1b)||_1b instanceof dojo.Color){
-_1b={color:_1b};
+if(typeof _7=="string"||d.isArray(_7)||_7 instanceof d.Color){
+_7={color:_7};
 }
-var s=this.strokeStyle=g.makeParameters(g.defaultStroke,_1b);
+var s=this.strokeStyle=g.makeParameters(g.defaultStroke,_7);
 s.color=g.normalizeColor(s.color);
 var rn=this.rawNode;
 rn.stroked=true;
@@ -157,53 +157,53 @@ rn.stroke.joinstyle=s.join;
 rn.stroke.dashstyle=s.style=="none"?"Solid":s.style;
 }
 return this;
-},_capMap:{butt:"flat"},_capMapReversed:{flat:"butt"},_translate:function(_1e,_1f){
-return (_1f in _1e)?_1e[_1f]:_1f;
+},_capMap:{butt:"flat"},_capMapReversed:{flat:"butt"},_translate:function(_8,_9){
+return (_9 in _8)?_8[_9]:_9;
 },_applyTransform:function(){
 if(this.fillStyle&&this.fillStyle.type=="linear"){
 this.setFill(this.fillStyle);
 }
-var _20=this._getRealMatrix();
-if(!_20){
+var _a=this._getRealMatrix();
+if(!_a){
 return this;
 }
-var _21=this.rawNode.skew;
-if(typeof _21=="undefined"){
+var _b=this.rawNode.skew;
+if(typeof _b=="undefined"){
 for(var i=0;i<this.rawNode.childNodes.length;++i){
 if(this.rawNode.childNodes[i].tagName=="skew"){
-_21=this.rawNode.childNodes[i];
+_b=this.rawNode.childNodes[i];
 break;
 }
 }
 }
-if(_21){
-_21.on="f";
-var mt=_20.xx.toFixed(8)+" "+_20.xy.toFixed(8)+" "+_20.yx.toFixed(8)+" "+_20.yy.toFixed(8)+" 0 0",_24=Math.floor(_20.dx).toFixed()+"px "+Math.floor(_20.dy).toFixed()+"px",s=this.rawNode.style,l=parseFloat(s.left),t=parseFloat(s.top),w=parseFloat(s.width),h=parseFloat(s.height);
+if(_b){
+_b.on="f";
+var mt=_a.xx.toFixed(8)+" "+_a.xy.toFixed(8)+" "+_a.yx.toFixed(8)+" "+_a.yy.toFixed(8)+" 0 0",_c=Math.floor(_a.dx).toFixed()+"px "+Math.floor(_a.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)){
+if(isNaN(w)||!w){
 w=1;
 }
-if(isNaN(h)){
+if(isNaN(h)||!h){
 h=1;
 }
-var _2a=(-l/w-0.5).toFixed(8)+" "+(-t/h-0.5).toFixed(8);
-_21.matrix=mt;
-_21.origin=_2a;
-_21.offset=_24;
-_21.on=true;
+var _d=(-l/w-0.5).toFixed(8)+" "+(-t/h-0.5).toFixed(8);
+_b.matrix=mt;
+_b.origin=_d;
+_b.offset=_c;
+_b.on=true;
 }
 return this;
-},_setDimensions:function(_2b,_2c){
+},_setDimensions:function(_e,_f){
 return this;
-},setRawNode:function(_2d){
-_2d.stroked="f";
-_2d.filled="f";
-this.rawNode=_2d;
+},setRawNode:function(_10){
+_10.stroked="f";
+_10.filled="f";
+this.rawNode=_10;
 },_moveToFront:function(){
 this.rawNode.parentNode.appendChild(this.rawNode);
 return this;
@@ -217,200 +217,188 @@ return this;
 },_getRealMatrix:function(){
 return this.parentMatrix?new g.Matrix2D([this.parentMatrix,this.matrix]):this.matrix;
 }});
-dojo.declare("dojox.gfx.Group",dojox.gfx.Shape,{constructor:function(){
-_3.Container._init.call(this);
+dojo.declare("dojox.gfx.Group",g.Shape,{constructor:function(){
+_1.Container._init.call(this);
 },_applyTransform:function(){
-var _31=this._getRealMatrix();
+var _11=this._getRealMatrix();
 for(var i=0;i<this.children.length;++i){
-this.children[i]._updateParentMatrix(_31);
+this.children[i]._updateParentMatrix(_11);
 }
 return this;
-},_setDimensions:function(_33,_34){
+},_setDimensions:function(_12,_13){
 var r=this.rawNode,rs=r.style,bs=this.bgNode.style;
-rs.width=_33;
-rs.height=_34;
-r.coordsize=_33+" "+_34;
-bs.width=_33;
-bs.height=_34;
+rs.width=_12;
+rs.height=_13;
+r.coordsize=_12+" "+_13;
+bs.width=_12;
+bs.height=_13;
 for(var i=0;i<this.children.length;++i){
-this.children[i]._setDimensions(_33,_34);
+this.children[i]._setDimensions(_12,_13);
 }
 return this;
 }});
 g.Group.nodeType="group";
-dojo.declare("dojox.gfx.Rect",dojox.gfx.shape.Rect,{setShape:function(_39){
-var _3a=this.shape=g.makeParameters(this.shape,_39);
+dojo.declare("dojox.gfx.Rect",gs.Rect,{setShape:function(_14){
+var _15=this.shape=g.makeParameters(this.shape,_14);
 this.bbox=null;
-var r=Math.min(1,(_3a.r/Math.min(parseFloat(_3a.width),parseFloat(_3a.height)))).toFixed(8);
-var _3c=this.rawNode.parentNode,_3d=null;
-if(_3c){
-if(_3c.lastChild!==this.rawNode){
-for(var i=0;i<_3c.childNodes.length;++i){
-if(_3c.childNodes[i]===this.rawNode){
-_3d=_3c.childNodes[i+1];
+var r=Math.min(1,(_15.r/Math.min(parseFloat(_15.width),parseFloat(_15.height)))).toFixed(8);
+var _16=this.rawNode.parentNode,_17=null;
+if(_16){
+if(_16.lastChild!==this.rawNode){
+for(var i=0;i<_16.childNodes.length;++i){
+if(_16.childNodes[i]===this.rawNode){
+_17=_16.childNodes[i+1];
 break;
 }
 }
 }
-_3c.removeChild(this.rawNode);
+_16.removeChild(this.rawNode);
 }
-if(dojo.isIE>7){
-var _3f=this.rawNode.ownerDocument.createElement("v:roundrect");
-_3f.arcsize=r;
-_3f.style.display="inline-block";
-this.rawNode=_3f;
+if(d.isIE>7){
+var _18=this.rawNode.ownerDocument.createElement("v:roundrect");
+_18.arcsize=r;
+_18.style.display="inline-block";
+this.rawNode=_18;
 }else{
 this.rawNode.arcsize=r;
 }
-if(_3c){
-if(_3d){
-_3c.insertBefore(this.rawNode,_3d);
+if(_16){
+if(_17){
+_16.insertBefore(this.rawNode,_17);
 }else{
-_3c.appendChild(this.rawNode);
+_16.appendChild(this.rawNode);
 }
 }
-var _40=this.rawNode.style;
-_40.left=_3a.x.toFixed();
-_40.top=_3a.y.toFixed();
-_40.width=(typeof _3a.width=="string"&&_3a.width.indexOf("%")>=0)?_3a.width:_3a.width.toFixed();
-_40.height=(typeof _3a.width=="string"&&_3a.height.indexOf("%")>=0)?_3a.height:_3a.height.toFixed();
+var _19=this.rawNode.style;
+_19.left=_15.x.toFixed();
+_19.top=_15.y.toFixed();
+_19.width=(typeof _15.width=="string"&&_15.width.indexOf("%")>=0)?_15.width:_15.width.toFixed();
+_19.height=(typeof _15.width=="string"&&_15.height.indexOf("%")>=0)?_15.height:_15.height.toFixed();
 return this.setTransform(this.matrix).setFill(this.fillStyle).setStroke(this.strokeStyle);
 }});
 g.Rect.nodeType="roundrect";
-dojo.declare("dojox.gfx.Ellipse",dojox.gfx.shape.Ellipse,{setShape:function(_41){
-var _42=this.shape=g.makeParameters(this.shape,_41);
+dojo.declare("dojox.gfx.Ellipse",gs.Ellipse,{setShape:function(_1a){
+var _1b=this.shape=g.makeParameters(this.shape,_1a);
 this.bbox=null;
-var _43=this.rawNode.style;
-_43.left=(_42.cx-_42.rx).toFixed();
-_43.top=(_42.cy-_42.ry).toFixed();
-_43.width=(_42.rx*2).toFixed();
-_43.height=(_42.ry*2).toFixed();
+var _1c=this.rawNode.style;
+_1c.left=(_1b.cx-_1b.rx).toFixed();
+_1c.top=(_1b.cy-_1b.ry).toFixed();
+_1c.width=(_1b.rx*2).toFixed();
+_1c.height=(_1b.ry*2).toFixed();
 return this.setTransform(this.matrix);
 }});
 g.Ellipse.nodeType="oval";
-dojo.declare("dojox.gfx.Circle",dojox.gfx.shape.Circle,{setShape:function(_44){
-var _45=this.shape=g.makeParameters(this.shape,_44);
+dojo.declare("dojox.gfx.Circle",gs.Circle,{setShape:function(_1d){
+var _1e=this.shape=g.makeParameters(this.shape,_1d);
 this.bbox=null;
-var _46=this.rawNode.style;
-_46.left=(_45.cx-_45.r).toFixed();
-_46.top=(_45.cy-_45.r).toFixed();
-_46.width=(_45.r*2).toFixed();
-_46.height=(_45.r*2).toFixed();
+var _1f=this.rawNode.style;
+_1f.left=(_1e.cx-_1e.r).toFixed();
+_1f.top=(_1e.cy-_1e.r).toFixed();
+_1f.width=(_1e.r*2).toFixed();
+_1f.height=(_1e.r*2).toFixed();
 return this;
 }});
 g.Circle.nodeType="oval";
-dojo.declare("dojox.gfx.Line",dojox.gfx.shape.Line,{constructor:function(_47){
-if(_47){
-_47.setAttribute("dojoGfxType","line");
+dojo.declare("dojox.gfx.Line",gs.Line,{constructor:function(_20){
+if(_20){
+_20.setAttribute("dojoGfxType","line");
 }
-},setShape:function(_48){
-var _49=this.shape=g.makeParameters(this.shape,_48);
+},setShape:function(_21){
+var _22=this.shape=g.makeParameters(this.shape,_21);
 this.bbox=null;
-this.rawNode.path.v="m"+_49.x1.toFixed()+" "+_49.y1.toFixed()+"l"+_49.x2.toFixed()+" "+_49.y2.toFixed()+"e";
+this.rawNode.path.v="m"+_22.x1.toFixed()+" "+_22.y1.toFixed()+"l"+_22.x2.toFixed()+" "+_22.y2.toFixed()+"e";
 return this.setTransform(this.matrix);
 }});
 g.Line.nodeType="shape";
-dojo.declare("dojox.gfx.Polyline",dojox.gfx.shape.Polyline,{constructor:function(_4a){
-if(_4a){
-_4a.setAttribute("dojoGfxType","polyline");
-}
-},setShape:function(_4b,_4c){
-if(_4b&&_4b instanceof Array){
-this.shape=g.makeParameters(this.shape,{points:_4b});
-if(_4c&&this.shape.points.length){
+dojo.declare("dojox.gfx.Polyline",gs.Polyline,{constructor:function(_23){
+if(_23){
+_23.setAttribute("dojoGfxType","polyline");
+}
+},setShape:function(_24,_25){
+if(_24&&_24 instanceof Array){
+this.shape=g.makeParameters(this.shape,{points:_24});
+if(_25&&this.shape.points.length){
 this.shape.points.push(this.shape.points[0]);
 }
 }else{
-this.shape=g.makeParameters(this.shape,_4b);
+this.shape=g.makeParameters(this.shape,_24);
 }
 this.bbox=null;
-var _4d=[],p=this.shape.points;
+this._normalizePoints();
+var _26=[],p=this.shape.points;
 if(p.length>0){
-_4d.push("m");
-var k=1;
-if(typeof p[0]=="number"){
-_4d.push(p[0].toFixed());
-_4d.push(p[1].toFixed());
-k=2;
-}else{
-_4d.push(p[0].x.toFixed());
-_4d.push(p[0].y.toFixed());
-}
-if(p.length>k){
-_4d.push("l");
-for(var i=k;i<p.length;++i){
-if(typeof p[i]=="number"){
-_4d.push(p[i].toFixed());
-}else{
-_4d.push(p[i].x.toFixed());
-_4d.push(p[i].y.toFixed());
+_26.push("m");
+_26.push(p[0].x.toFixed(),p[0].y.toFixed());
+if(p.length>1){
+_26.push("l");
+for(var i=1;i<p.length;++i){
+_26.push(p[i].x.toFixed(),p[i].y.toFixed());
 }
 }
 }
-}
-_4d.push("e");
-this.rawNode.path.v=_4d.join(" ");
+_26.push("e");
+this.rawNode.path.v=_26.join(" ");
 return this.setTransform(this.matrix);
 }});
 g.Polyline.nodeType="shape";
-dojo.declare("dojox.gfx.Image",dojox.gfx.shape.Image,{setShape:function(_51){
-var _52=this.shape=g.makeParameters(this.shape,_51);
+dojo.declare("dojox.gfx.Image",gs.Image,{setShape:function(_27){
+var _28=this.shape=g.makeParameters(this.shape,_27);
 this.bbox=null;
-this.rawNode.firstChild.src=_52.src;
+this.rawNode.firstChild.src=_28.src;
 return this.setTransform(this.matrix);
 },_applyTransform:function(){
-var _53=this._getRealMatrix(),_54=this.rawNode,s=_54.style,_56=this.shape;
-if(_53){
-_53=m.multiply(_53,{dx:_56.x,dy:_56.y});
+var _29=this._getRealMatrix(),_2a=this.rawNode,s=_2a.style,_2b=this.shape;
+if(_29){
+_29=m.multiply(_29,{dx:_2b.x,dy:_2b.y});
 }else{
-_53=m.normalize({dx:_56.x,dy:_56.y});
+_29=m.normalize({dx:_2b.x,dy:_2b.y});
 }
-if(_53.xy==0&&_53.yx==0&&_53.xx>0&&_53.yy>0){
+if(_29.xy==0&&_29.yx==0&&_29.xx>0&&_29.yy>0){
 s.filter="";
-s.width=Math.floor(_53.xx*_56.width);
-s.height=Math.floor(_53.yy*_56.height);
-s.left=Math.floor(_53.dx);
-s.top=Math.floor(_53.dy);
+s.width=Math.floor(_29.xx*_2b.width);
+s.height=Math.floor(_29.yy*_2b.height);
+s.left=Math.floor(_29.dx);
+s.top=Math.floor(_29.dy);
 }else{
-var ps=_54.parentNode.style;
+var ps=_2a.parentNode.style;
 s.left="0px";
 s.top="0px";
 s.width=ps.width;
 s.height=ps.height;
-_53=m.multiply(_53,{xx:_56.width/parseInt(s.width),yy:_56.height/parseInt(s.height)});
-var f=_54.filters["DXImageTransform.Microsoft.Matrix"];
+_29=m.multiply(_29,{xx:_2b.width/parseInt(s.width),yy:_2b.height/parseInt(s.height)});
+var f=_2a.filters["DXImageTransform.Microsoft.Matrix"];
 if(f){
-f.M11=_53.xx;
-f.M12=_53.xy;
-f.M21=_53.yx;
-f.M22=_53.yy;
-f.Dx=_53.dx;
-f.Dy=_53.dy;
+f.M11=_29.xx;
+f.M12=_29.xy;
+f.M21=_29.yx;
+f.M22=_29.yy;
+f.Dx=_29.dx;
+f.Dy=_29.dy;
 }else{
-s.filter="progid:DXImageTransform.Microsoft.Matrix(M11="+_53.xx+", M12="+_53.xy+", M21="+_53.yx+", M22="+_53.yy+", Dx="+_53.dx+", Dy="+_53.dy+")";
+s.filter="progid:DXImageTransform.Microsoft.Matrix(M11="+_29.xx+", M12="+_29.xy+", M21="+_29.yx+", M22="+_29.yy+", Dx="+_29.dx+", Dy="+_29.dy+")";
 }
 }
 return this;
-},_setDimensions:function(_59,_5a){
+},_setDimensions:function(_2c,_2d){
 var r=this.rawNode,f=r.filters["DXImageTransform.Microsoft.Matrix"];
 if(f){
 var s=r.style;
-s.width=_59;
-s.height=_5a;
+s.width=_2c;
+s.height=_2d;
 return this._applyTransform();
 }
 return this;
 }});
 g.Image.nodeType="rect";
-dojo.declare("dojox.gfx.Text",dojox.gfx.shape.Text,{constructor:function(_5e){
-if(_5e){
-_5e.setAttribute("dojoGfxType","text");
+dojo.declare("dojox.gfx.Text",gs.Text,{constructor:function(_2e){
+if(_2e){
+_2e.setAttribute("dojoGfxType","text");
 }
 this.fontStyle=null;
-},_alignment:{start:"left",middle:"center",end:"right"},setShape:function(_5f){
-this.shape=g.makeParameters(this.shape,_5f);
+},_alignment:{start:"left",middle:"center",end:"right"},setShape:function(_2f){
+this.shape=g.makeParameters(this.shape,_2f);
 this.bbox=null;
-var r=this.rawNode,s=this.shape,x=s.x,y=s.y.toFixed(),_64;
+var r=this.rawNode,s=this.shape,x=s.x,y=s.y.toFixed(),_30;
 switch(s.align){
 case "middle":
 x-=5;
@@ -419,7 +407,7 @@ case "end":
 x-=10;
 break;
 }
-_64="m"+x.toFixed()+","+y+"l"+(x+10).toFixed()+","+y+"e";
+_30="m"+x.toFixed()+","+y+"l"+(x+10).toFixed()+","+y+"e";
 var p=null,t=null,c=r.childNodes;
 for(var i=0;i<c.length;++i){
 var tag=c[i].tagName;
@@ -445,10 +433,10 @@ if(!t){
 t=r.ownerDocument.createElement("v:textpath");
 r.appendChild(t);
 }
-p.v=_64;
+p.v=_30;
 p.textPathOk=true;
 t.on=true;
-var a=_3.text_alignment[s.align];
+var a=_1.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;
@@ -465,84 +453,84 @@ break;
 }
 this.setTransform(this.matrix);
 },_getRealMatrix:function(){
-var _6e=g.Shape.prototype._getRealMatrix.call(this);
-if(_6e){
-_6e=m.multiply(_6e,{dy:-g.normalizedLength(this.fontStyle?this.fontStyle.size:"10pt")*0.35});
+var _31=g.Shape.prototype._getRealMatrix.call(this);
+if(_31){
+_31=m.multiply(_31,{dy:-g.normalizedLength(this.fontStyle?this.fontStyle.size:"10pt")*0.35});
 }
-return _6e;
+return _31;
 },getTextWidth:function(){
-var _6f=this.rawNode,_70=_6f.style.display;
-_6f.style.display="inline";
-var _71=g.pt2px(parseFloat(_6f.currentStyle.width));
-_6f.style.display=_70;
-return _71;
+var _32=this.rawNode,_33=_32.style.display;
+_32.style.display="inline";
+var _34=g.pt2px(parseFloat(_32.currentStyle.width));
+_32.style.display=_33;
+return _34;
 }});
 g.Text.nodeType="shape";
-g.path._calcArc=function(_72){
-var _73=Math.cos(_72),_74=Math.sin(_72),p2={x:_73+(4/3)*(1-_73),y:_74-(4/3)*_73*(1-_73)/_74};
-return {s:{x:_73,y:-_74},c1:{x:p2.x,y:-p2.y},c2:p2,e:{x:_73,y:_74}};
+g.path._calcArc=function(_35){
+var _36=Math.cos(_35),_37=Math.sin(_35),p2={x:_36+(4/3)*(1-_36),y:_37-(4/3)*_36*(1-_36)/_37};
+return {s:{x:_36,y:-_37},c1:{x:p2.x,y:-p2.y},c2:p2,e:{x:_36,y:_37}};
 };
-dojo.declare("dojox.gfx.Path",dojox.gfx.path.Path,{constructor:function(_76){
-if(_76&&!_76.getAttribute("dojoGfxType")){
-_76.setAttribute("dojoGfxType","path");
+dojo.declare("dojox.gfx.Path",g.path.Path,{constructor:function(_38){
+if(_38&&!_38.getAttribute("dojoGfxType")){
+_38.setAttribute("dojoGfxType","path");
 }
 this.vmlPath="";
 this.lastControl={};
-},_updateWithSegment:function(_77){
-var _78=dojo.clone(this.last);
+},_updateWithSegment:function(_39){
+var _3a=d.clone(this.last);
 g.Path.superclass._updateWithSegment.apply(this,arguments);
-var _79=this[this.renderers[_77.action]](_77,_78);
+var _3b=this[this.renderers[_39.action]](_39,_3a);
 if(typeof this.vmlPath=="string"){
-this.vmlPath+=_79.join("");
+this.vmlPath+=_3b.join("");
 this.rawNode.path.v=this.vmlPath+" r0,0 e";
 }else{
-Array.prototype.push.apply(this.vmlPath,_79);
+Array.prototype.push.apply(this.vmlPath,_3b);
 }
-},setShape:function(_7a){
+},setShape:function(_3c){
 this.vmlPath=[];
 this.lastControl.type="";
 g.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:""},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(_7b,_7c,_7d,_7e){
-var n=_7c instanceof Array?_7c:_7c.args;
-for(var i=_7d;i<_7e;++i){
-_7b.push(" ",n[i].toFixed());
+},_pathVmlToSvgMap:{m:"M",l:"L",t:"m",r:"l",c:"C",v:"c",qb:"Q",x:"z",e:""},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(_3d,_3e,_3f,_40){
+var n=_3e instanceof Array?_3e:_3e.args;
+for(var i=_3f;i<_40;++i){
+_3d.push(" ",n[i].toFixed());
 }
-},_adjustRelCrd:function(_81,_82,_83){
-var n=_82 instanceof Array?_82:_82.args,l=n.length,_86=new Array(l),i=0,x=_81.x,y=_81.y;
+},_adjustRelCrd:function(_41,_42,_43){
+var n=_42 instanceof Array?_42:_42.args,l=n.length,_44=new Array(l),i=0,x=_41.x,y=_41.y;
 if(typeof x!="number"){
-_86[0]=x=n[0];
-_86[1]=y=n[1];
+_44[0]=x=n[0];
+_44[1]=y=n[1];
 i=2;
 }
-if(typeof _83=="number"&&_83!=2){
-var j=_83;
+if(typeof _43=="number"&&_43!=2){
+var j=_43;
 while(j<=l){
 for(;i<j;i+=2){
-_86[i]=x+n[i];
-_86[i+1]=y+n[i+1];
+_44[i]=x+n[i];
+_44[i+1]=y+n[i+1];
 }
-x=_86[j-2];
-y=_86[j-1];
-j+=_83;
+x=_44[j-2];
+y=_44[j-1];
+j+=_43;
 }
 }else{
 for(;i<l;i+=2){
-_86[i]=(x+=n[i]);
-_86[i+1]=(y+=n[i+1]);
+_44[i]=(x+=n[i]);
+_44[i+1]=(y+=n[i+1]);
 }
 }
-return _86;
-},_adjustRelPos:function(_8b,_8c){
-var n=_8c instanceof Array?_8c:_8c.args,l=n.length,_8f=new Array(l);
+return _44;
+},_adjustRelPos:function(_45,_46){
+var n=_46 instanceof Array?_46:_46.args,l=n.length,_47=new Array(l);
 for(var i=0;i<l;++i){
-_8f[i]=(_8b+=n[i]);
+_47[i]=(_45+=n[i]);
 }
-return _8f;
-},_moveToA:function(_91){
-var p=[" m"],n=_91 instanceof Array?_91:_91.args,l=n.length;
+return _47;
+},_moveToA:function(_48){
+var p=[" m"],n=_48 instanceof Array?_48:_48.args,l=n.length;
 this._addArgs(p,n,0,2);
 if(l>2){
 p.push(" l");
@@ -550,35 +538,35 @@ this._addArgs(p,n,2,l);
 }
 this.lastControl.type="";
 return p;
-},_moveToR:function(_95,_96){
-return this._moveToA(this._adjustRelCrd(_96,_95));
-},_lineToA:function(_97){
-var p=[" l"],n=_97 instanceof Array?_97:_97.args;
+},_moveToR:function(_49,_4a){
+return this._moveToA(this._adjustRelCrd(_4a,_49));
+},_lineToA:function(_4b){
+var p=[" l"],n=_4b instanceof Array?_4b:_4b.args;
 this._addArgs(p,n,0,n.length);
 this.lastControl.type="";
 return p;
-},_lineToR:function(_9a,_9b){
-return this._lineToA(this._adjustRelCrd(_9b,_9a));
-},_hLineToA:function(_9c,_9d){
-var p=[" l"],y=" "+_9d.y.toFixed(),n=_9c instanceof Array?_9c:_9c.args,l=n.length;
+},_lineToR:function(_4c,_4d){
+return this._lineToA(this._adjustRelCrd(_4d,_4c));
+},_hLineToA:function(_4e,_4f){
+var p=[" l"],y=" "+_4f.y.toFixed(),n=_4e instanceof Array?_4e:_4e.args,l=n.length;
 for(var i=0;i<l;++i){
 p.push(" ",n[i].toFixed(),y);
 }
 this.lastControl.type="";
 return p;
-},_hLineToR:function(_a3,_a4){
-return this._hLineToA(this._adjustRelPos(_a4.x,_a3),_a4);
-},_vLineToA:function(_a5,_a6){
-var p=[" l"],x=" "+_a6.x.toFixed(),n=_a5 instanceof Array?_a5:_a5.args,l=n.length;
+},_hLineToR:function(_50,_51){
+return this._hLineToA(this._adjustRelPos(_51.x,_50),_51);
+},_vLineToA:function(_52,_53){
+var p=[" l"],x=" "+_53.x.toFixed(),n=_52 instanceof Array?_52:_52.args,l=n.length;
 for(var i=0;i<l;++i){
 p.push(x," ",n[i].toFixed());
 }
 this.lastControl.type="";
 return p;
-},_vLineToR:function(_ac,_ad){
-return this._vLineToA(this._adjustRelPos(_ad.y,_ac),_ad);
-},_curveToA:function(_ae){
-var p=[],n=_ae instanceof Array?_ae:_ae.args,l=n.length,lc=this.lastControl;
+},_vLineToR:function(_54,_55){
+return this._vLineToA(this._adjustRelPos(_55.y,_54),_55);
+},_curveToA:function(_56){
+var p=[],n=_56 instanceof Array?_56:_56.args,l=n.length,lc=this.lastControl;
 for(var i=0;i<l;i+=6){
 p.push(" c");
 this._addArgs(p,n,i,i+6);
@@ -587,13 +575,13 @@ lc.x=n[l-4];
 lc.y=n[l-3];
 lc.type="C";
 return p;
-},_curveToR:function(_b4,_b5){
-return this._curveToA(this._adjustRelCrd(_b5,_b4,6));
-},_smoothCurveToA:function(_b6,_b7){
-var p=[],n=_b6 instanceof Array?_b6:_b6.args,l=n.length,lc=this.lastControl,i=0;
+},_curveToR:function(_57,_58){
+return this._curveToA(this._adjustRelCrd(_58,_57,6));
+},_smoothCurveToA:function(_59,_5a){
+var p=[],n=_59 instanceof Array?_59:_59.args,l=n.length,lc=this.lastControl,i=0;
 if(lc.type!="C"){
 p.push(" c");
-this._addArgs(p,[_b7.x,_b7.y],0,2);
+this._addArgs(p,[_5a.x,_5a.y],0,2);
 this._addArgs(p,n,0,4);
 lc.x=n[0];
 lc.y=n[1];
@@ -602,16 +590,16 @@ i=4;
 }
 for(;i<l;i+=4){
 p.push(" c");
-this._addArgs(p,[2*_b7.x-lc.x,2*_b7.y-lc.y],0,2);
+this._addArgs(p,[2*_5a.x-lc.x,2*_5a.y-lc.y],0,2);
 this._addArgs(p,n,i,i+4);
 lc.x=n[i];
 lc.y=n[i+1];
 }
 return p;
-},_smoothCurveToR:function(_bd,_be){
-return this._smoothCurveToA(this._adjustRelCrd(_be,_bd,4),_be);
-},_qCurveToA:function(_bf){
-var p=[],n=_bf instanceof Array?_bf:_bf.args,l=n.length,lc=this.lastControl;
+},_smoothCurveToR:function(_5b,_5c){
+return this._smoothCurveToA(this._adjustRelCrd(_5c,_5b,4),_5c);
+},_qCurveToA:function(_5d){
+var p=[],n=_5d instanceof Array?_5d:_5d.args,l=n.length,lc=this.lastControl;
 for(var i=0;i<l;i+=4){
 p.push(" qb");
 this._addArgs(p,n,i,i+4);
@@ -620,41 +608,41 @@ lc.x=n[l-4];
 lc.y=n[l-3];
 lc.type="Q";
 return p;
-},_qCurveToR:function(_c5,_c6){
-return this._qCurveToA(this._adjustRelCrd(_c6,_c5,4));
-},_qSmoothCurveToA:function(_c7,_c8){
-var p=[],n=_c7 instanceof Array?_c7:_c7.args,l=n.length,lc=this.lastControl,i=0;
+},_qCurveToR:function(_5e,_5f){
+return this._qCurveToA(this._adjustRelCrd(_5f,_5e,4));
+},_qSmoothCurveToA:function(_60,_61){
+var p=[],n=_60 instanceof Array?_60:_60.args,l=n.length,lc=this.lastControl,i=0;
 if(lc.type!="Q"){
 p.push(" qb");
-this._addArgs(p,[lc.x=_c8.x,lc.y=_c8.y],0,2);
+this._addArgs(p,[lc.x=_61.x,lc.y=_61.y],0,2);
 lc.type="Q";
 this._addArgs(p,n,0,2);
 i=2;
 }
 for(;i<l;i+=2){
 p.push(" qb");
-this._addArgs(p,[lc.x=2*_c8.x-lc.x,lc.y=2*_c8.y-lc.y],0,2);
+this._addArgs(p,[lc.x=2*_61.x-lc.x,lc.y=2*_61.y-lc.y],0,2);
 this._addArgs(p,n,i,i+2);
 }
 return p;
-},_qSmoothCurveToR:function(_ce,_cf){
-return this._qSmoothCurveToA(this._adjustRelCrd(_cf,_ce,2),_cf);
-},_arcTo:function(_d0,_d1){
-var p=[],n=_d0.args,l=n.length,_d5=_d0.action=="a";
+},_qSmoothCurveToR:function(_62,_63){
+return this._qSmoothCurveToA(this._adjustRelCrd(_63,_62,2),_63);
+},_arcTo:function(_64,_65){
+var p=[],n=_64.args,l=n.length,_66=_64.action=="a";
 for(var i=0;i<l;i+=7){
 var x1=n[i+5],y1=n[i+6];
-if(_d5){
-x1+=_d1.x;
-y1+=_d1.y;
+if(_66){
+x1+=_65.x;
+y1+=_65.y;
 }
-var _d9=g.arc.arcAsBezier(_d1,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<_d9.length;++j){
+var _67=g.arc.arcAsBezier(_65,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<_67.length;++j){
 p.push(" c");
-var t=_d9[j];
+var t=_67[j];
 this._addArgs(p,t,0,t.length);
 }
-_d1.x=x1;
-_d1.y=y1;
+_65.x=x1;
+_65.y=y1;
 }
 this.lastControl.type="";
 return p;
@@ -663,23 +651,23 @@ this.lastControl.type="";
 return ["x"];
 }});
 g.Path.nodeType="shape";
-dojo.declare("dojox.gfx.TextPath",dojox.gfx.Path,{constructor:function(_dc){
-if(_dc){
-_dc.setAttribute("dojoGfxType","textpath");
+dojo.declare("dojox.gfx.TextPath",g.Path,{constructor:function(_68){
+if(_68){
+_68.setAttribute("dojoGfxType","textpath");
 }
 this.fontStyle=null;
 if(!("text" in this)){
-this.text=dojo.clone(g.defaultTextPath);
+this.text=d.clone(g.defaultTextPath);
 }
 if(!("fontStyle" in this)){
-this.fontStyle=dojo.clone(g.defaultFont);
+this.fontStyle=d.clone(g.defaultFont);
 }
-},setText:function(_dd){
-this.text=g.makeParameters(this.text,typeof _dd=="string"?{text:_dd}:_dd);
+},setText:function(_69){
+this.text=g.makeParameters(this.text,typeof _69=="string"?{text:_69}:_69);
 this._setText();
 return this;
-},setFont:function(_de){
-this.fontStyle=typeof _de=="string"?g.splitFontString(_de):g.makeParameters(g.defaultFont,_de);
+},setFont:function(_6a){
+this.fontStyle=typeof _6a=="string"?g.splitFontString(_6a):g.makeParameters(g.defaultFont,_6a);
 this._setFont();
 return this;
 },_setText:function(){
@@ -711,7 +699,7 @@ r.appendChild(t);
 }
 p.textPathOk=true;
 t.on=true;
-var a=_3.text_alignment[s.align];
+var a=_1.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;
@@ -727,27 +715,27 @@ break;
 }
 }});
 g.TextPath.nodeType="shape";
-dojo.declare("dojox.gfx.Surface",dojox.gfx.shape.Surface,{constructor:function(){
-_3.Container._init.call(this);
-},setDimensions:function(_ea,_eb){
-this.width=g.normalizedLength(_ea);
-this.height=g.normalizedLength(_eb);
+dojo.declare("dojox.gfx.Surface",gs.Surface,{constructor:function(){
+_1.Container._init.call(this);
+},setDimensions:function(_6b,_6c){
+this.width=g.normalizedLength(_6b);
+this.height=g.normalizedLength(_6c);
 if(!this.rawNode){
 return this;
 }
 var cs=this.clipNode.style,r=this.rawNode,rs=r.style,bs=this.bgNode.style,ps=this._parent.style,i;
-ps.width=_ea;
-ps.height=_eb;
-cs.width=_ea;
-cs.height=_eb;
-cs.clip="rect(0px "+_ea+"px "+_eb+"px 0px)";
-rs.width=_ea;
-rs.height=_eb;
-r.coordsize=_ea+" "+_eb;
-bs.width=_ea;
-bs.height=_eb;
+ps.width=_6b;
+ps.height=_6c;
+cs.width=_6b;
+cs.height=_6c;
+cs.clip="rect(0px "+_6b+"px "+_6c+"px 0px)";
+rs.width=_6b;
+rs.height=_6c;
+r.coordsize=_6b+" "+_6c;
+bs.width=_6b;
+bs.height=_6c;
 for(i=0;i<this.children.length;++i){
-this.children[i]._setDimensions(_ea,_eb);
+this.children[i]._setDimensions(_6b,_6c);
 }
 return this;
 },getDimensions:function(){
@@ -760,29 +748,34 @@ t.height=this.height;
 }
 return t;
 }});
-dojox.gfx.createSurface=function(_f3,_f4,_f5){
-if(!_f4){
-_f4="100%";
+g.createSurface=function(_6d,_6e,_6f){
+if(!_6e&&!_6f){
+var pos=d.position(_6d);
+_6e=_6e||pos.w;
+_6f=_6f||pos.h;
+}
+if(typeof _6e=="number"){
+_6e=_6e+"px";
 }
-if(!_f5){
-_f5="100%";
+if(typeof _6f=="number"){
+_6f=_6f+"px";
 }
-var s=new g.Surface(),p=dojo.byId(_f3),c=s.clipNode=p.ownerDocument.createElement("div"),r=s.rawNode=p.ownerDocument.createElement("v:group"),cs=c.style,rs=r.style;
-if(dojo.isIE>7){
+var s=new g.Surface(),p=d.byId(_6d),c=s.clipNode=p.ownerDocument.createElement("div"),r=s.rawNode=p.ownerDocument.createElement("v:group"),cs=c.style,rs=r.style;
+if(d.isIE>7){
 rs.display="inline-block";
 }
 s._parent=p;
 s._nodes.push(c);
-p.style.width=_f4;
-p.style.height=_f5;
+p.style.width=_6e;
+p.style.height=_6f;
 cs.position="absolute";
-cs.width=_f4;
-cs.height=_f5;
-cs.clip="rect(0px "+_f4+"px "+_f5+"px 0px)";
+cs.width=_6e;
+cs.height=_6f;
+cs.clip="rect(0px "+_6e+" "+_6f+" 0px)";
 rs.position="absolute";
-rs.width=_f4;
-rs.height=_f5;
-r.coordsize=(_f4=="100%"?_f4:parseFloat(_f4))+" "+(_f5=="100%"?_f5:parseFloat(_f5));
+rs.width=_6e;
+rs.height=_6f;
+r.coordsize=(_6e==="100%"?_6e:parseFloat(_6e))+" "+(_6f==="100%"?_6f:parseFloat(_6f));
 r.coordorigin="0 0";
 var b=s.bgNode=r.ownerDocument.createElement("v:rect"),bs=b.style;
 bs.left=bs.top=0;
@@ -792,28 +785,28 @@ b.filled=b.stroked="f";
 r.appendChild(b);
 c.appendChild(r);
 p.appendChild(c);
-s.width=g.normalizedLength(_f4);
-s.height=g.normalizedLength(_f5);
+s.width=g.normalizedLength(_6e);
+s.height=g.normalizedLength(_6f);
 return s;
 };
-_3.Container={_init:function(){
-sh.Container._init.call(this);
-},add:function(_fe){
-if(this!=_fe.getParent()){
-this.rawNode.appendChild(_fe.rawNode);
-if(!_fe.getParent()){
-_fe.setFill(_fe.getFill());
-_fe.setStroke(_fe.getStroke());
+_1.Container={_init:function(){
+gs.Container._init.call(this);
+},add:function(_70){
+if(this!=_70.getParent()){
+this.rawNode.appendChild(_70.rawNode);
+if(!_70.getParent()){
+_70.setFill(_70.getFill());
+_70.setStroke(_70.getStroke());
 }
-sh.Container.add.apply(this,arguments);
+gs.Container.add.apply(this,arguments);
 }
 return this;
-},remove:function(_ff,_100){
-if(this==_ff.getParent()){
-if(this.rawNode==_ff.rawNode.parentNode){
-this.rawNode.removeChild(_ff.rawNode);
+},remove:function(_71,_72){
+if(this==_71.getParent()){
+if(this.rawNode==_71.rawNode.parentNode){
+this.rawNode.removeChild(_71.rawNode);
 }
-sh.Container.remove.apply(this,arguments);
+gs.Container.remove.apply(this,arguments);
 }
 return this;
 },clear:function(){
@@ -826,54 +819,54 @@ if(r.lastChild!=this.bgNode){
 r.removeChild(r.lastChild);
 }
 }
-return sh.Container.clear.apply(this,arguments);
-},_moveChildToFront:sh.Container._moveChildToFront,_moveChildToBack:sh.Container._moveChildToBack};
-dojo.mixin(sh.Creator,{createGroup:function(){
-var node=this.createObject(g.Group,null);
-var r=node.rawNode.ownerDocument.createElement("v:rect");
+return gs.Container.clear.apply(this,arguments);
+},_moveChildToFront:gs.Container._moveChildToFront,_moveChildToBack:gs.Container._moveChildToBack};
+dojo.mixin(gs.Creator,{createGroup:function(){
+var _73=this.createObject(g.Group,null);
+var r=_73.rawNode.ownerDocument.createElement("v:rect");
 r.style.left=r.style.top=0;
-r.style.width=node.rawNode.style.width;
-r.style.height=node.rawNode.style.height;
+r.style.width=_73.rawNode.style.width;
+r.style.height=_73.rawNode.style.height;
 r.filled=r.stroked="f";
-node.rawNode.appendChild(r);
-node.bgNode=r;
-return node;
-},createImage:function(_104){
+_73.rawNode.appendChild(r);
+_73.bgNode=r;
+return _73;
+},createImage:function(_74){
 if(!this.rawNode){
 return null;
 }
-var _105=new g.Image(),doc=this.rawNode.ownerDocument,node=doc.createElement("v:rect");
-node.stroked="f";
-node.style.width=this.rawNode.style.width;
-node.style.height=this.rawNode.style.height;
+var _75=new g.Image(),doc=this.rawNode.ownerDocument,_76=doc.createElement("v:rect");
+_76.stroked="f";
+_76.style.width=this.rawNode.style.width;
+_76.style.height=this.rawNode.style.height;
 var img=doc.createElement("v:imagedata");
-node.appendChild(img);
-_105.setRawNode(node);
-this.rawNode.appendChild(node);
-_105.setShape(_104);
-this.add(_105);
-return _105;
-},createRect:function(rect){
+_76.appendChild(img);
+_75.setRawNode(_76);
+this.rawNode.appendChild(_76);
+_75.setShape(_74);
+this.add(_75);
+return _75;
+},createRect:function(_77){
 if(!this.rawNode){
 return null;
 }
-var _10a=new g.Rect,node=this.rawNode.ownerDocument.createElement("v:roundrect");
-if(dojo.isIE>7){
-node.style.display="inline-block";
+var _78=new g.Rect,_79=this.rawNode.ownerDocument.createElement("v:roundrect");
+if(d.isIE>7){
+_79.style.display="inline-block";
 }
-_10a.setRawNode(node);
-this.rawNode.appendChild(node);
-_10a.setShape(rect);
-this.add(_10a);
-return _10a;
-},createObject:function(_10c,_10d){
+_78.setRawNode(_79);
+this.rawNode.appendChild(_79);
+_78.setShape(_77);
+this.add(_78);
+return _78;
+},createObject:function(_7a,_7b){
 if(!this.rawNode){
 return null;
 }
-var _10e=new _10c(),node=this.rawNode.ownerDocument.createElement("v:"+_10c.nodeType);
-_10e.setRawNode(node);
-this.rawNode.appendChild(node);
-switch(_10c){
+var _7c=new _7a(),_7d=this.rawNode.ownerDocument.createElement("v:"+_7a.nodeType);
+_7c.setRawNode(_7d);
+this.rawNode.appendChild(_7d);
+switch(_7a){
 case g.Group:
 case g.Line:
 case g.Polyline:
@@ -881,20 +874,20 @@ case g.Image:
 case g.Text:
 case g.Path:
 case g.TextPath:
-this._overrideSize(node);
+this._overrideSize(_7d);
 }
-_10e.setShape(_10d);
-this.add(_10e);
-return _10e;
-},_overrideSize:function(node){
+_7c.setShape(_7b);
+this.add(_7c);
+return _7c;
+},_overrideSize:function(_7e){
 var s=this.rawNode.style,w=s.width,h=s.height;
-node.style.width=w;
-node.style.height=h;
-node.coordsize=parseInt(w)+" "+parseInt(h);
+_7e.style.width=w;
+_7e.style.height=h;
+_7e.coordsize=parseInt(w)+" "+parseInt(h);
 }});
-dojo.extend(g.Group,_3.Container);
-dojo.extend(g.Group,sh.Creator);
-dojo.extend(g.Surface,_3.Container);
-dojo.extend(g.Surface,sh.Creator);
+d.extend(g.Group,_1.Container);
+d.extend(g.Group,gs.Creator);
+d.extend(g.Surface,_1.Container);
+d.extend(g.Surface,gs.Creator);
 })();
 }
diff --git a/dojox/gfx/vml_attach.js b/dojox/gfx/vml_attach.js
index 37e4a0d..0fc8970 100644
--- a/dojox/gfx/vml_attach.js
+++ b/dojox/gfx/vml_attach.js
@@ -16,42 +16,42 @@ var s=null;
 switch(_1.tagName.toLowerCase()){
 case dojox.gfx.Rect.nodeType:
 s=new dojox.gfx.Rect(_1);
-_3(s);
+_2(s);
 break;
 case dojox.gfx.Ellipse.nodeType:
 if(_1.style.width==_1.style.height){
 s=new dojox.gfx.Circle(_1);
-_4(s);
+_3(s);
 }else{
 s=new dojox.gfx.Ellipse(_1);
-_5(s);
+_4(s);
 }
 break;
 case dojox.gfx.Path.nodeType:
 switch(_1.getAttribute("dojoGfxType")){
 case "line":
 s=new dojox.gfx.Line(_1);
-_6(s);
+_5(s);
 break;
 case "polyline":
 s=new dojox.gfx.Polyline(_1);
-_7(s);
+_6(s);
 break;
 case "path":
 s=new dojox.gfx.Path(_1);
-_8(s);
+_7(s);
 break;
 case "text":
 s=new dojox.gfx.Text(_1);
+_8(s);
 _9(s);
 _a(s);
-_b(s);
 break;
 case "textpath":
 s=new dojox.gfx.TextPath(_1);
+_7(s);
 _8(s);
 _9(s);
-_a(s);
 break;
 }
 break;
@@ -59,8 +59,8 @@ case dojox.gfx.Image.nodeType:
 switch(_1.getAttribute("dojoGfxType")){
 case "image":
 s=new dojox.gfx.Image(_1);
+_b(s);
 _c(s);
-_d(s);
 break;
 }
 break;
@@ -68,18 +68,18 @@ default:
 return null;
 }
 if(!(s instanceof dojox.gfx.Image)){
+_d(s);
 _e(s);
-_f(s);
 if(!(s instanceof dojox.gfx.Text)){
-_10(s);
+_f(s);
 }
 }
 return s;
 };
-dojox.gfx.attachSurface=function(_11){
+dojox.gfx.attachSurface=function(_10){
 var s=new dojox.gfx.Surface();
-s.clipNode=_11;
-var r=s.rawNode=_11.firstChild;
+s.clipNode=_10;
+var r=s.rawNode=_10.firstChild;
 var b=r.firstChild;
 if(!b||b.tagName!="rect"){
 return null;
@@ -87,102 +87,102 @@ return null;
 s.bgNode=r;
 return s;
 };
-var _e=function(_15){
-var _16=null,r=_15.rawNode,fo=r.fill;
+var _d=function(_11){
+var _12=null,r=_11.rawNode,fo=r.fill;
 if(fo.on&&fo.type=="gradient"){
-var _16=dojo.clone(dojox.gfx.defaultLinearGradient),rad=dojox.gfx.matrix._degToRad(fo.angle);
-_16.x2=Math.cos(rad);
-_16.y2=Math.sin(rad);
-_16.colors=[];
-var _1a=fo.colors.value.split(";");
-for(var i=0;i<_1a.length;++i){
-var t=_1a[i].match(/\S+/g);
+var _12=dojo.clone(dojox.gfx.defaultLinearGradient),rad=dojox.gfx.matrix._degToRad(fo.angle);
+_12.x2=Math.cos(rad);
+_12.y2=Math.sin(rad);
+_12.colors=[];
+var _13=fo.colors.value.split(";");
+for(var i=0;i<_13.length;++i){
+var t=_13[i].match(/\S+/g);
 if(!t||t.length!=2){
 continue;
 }
-_16.colors.push({offset:dojox.gfx.vml._parseFloat(t[0]),color:new dojo.Color(t[1])});
+_12.colors.push({offset:dojox.gfx.vml._parseFloat(t[0]),color:new dojo.Color(t[1])});
 }
 }else{
 if(fo.on&&fo.type=="gradientradial"){
-var _16=dojo.clone(dojox.gfx.defaultRadialGradient),w=parseFloat(r.style.width),h=parseFloat(r.style.height);
-_16.cx=isNaN(w)?0:fo.focusposition.x*w;
-_16.cy=isNaN(h)?0:fo.focusposition.y*h;
-_16.r=isNaN(w)?1:w/2;
-_16.colors=[];
-var _1a=fo.colors.value.split(";");
-for(var i=_1a.length-1;i>=0;--i){
-var t=_1a[i].match(/\S+/g);
+var _12=dojo.clone(dojox.gfx.defaultRadialGradient),w=parseFloat(r.style.width),h=parseFloat(r.style.height);
+_12.cx=isNaN(w)?0:fo.focusposition.x*w;
+_12.cy=isNaN(h)?0:fo.focusposition.y*h;
+_12.r=isNaN(w)?1:w/2;
+_12.colors=[];
+var _13=fo.colors.value.split(";");
+for(var i=_13.length-1;i>=0;--i){
+var t=_13[i].match(/\S+/g);
 if(!t||t.length!=2){
 continue;
 }
-_16.colors.push({offset:dojox.gfx.vml._parseFloat(t[0]),color:new dojo.Color(t[1])});
+_12.colors.push({offset:dojox.gfx.vml._parseFloat(t[0]),color:new dojo.Color(t[1])});
 }
 }else{
 if(fo.on&&fo.type=="tile"){
-var _16=dojo.clone(dojox.gfx.defaultPattern);
-_16.width=dojox.gfx.pt2px(fo.size.x);
-_16.height=dojox.gfx.pt2px(fo.size.y);
-_16.x=fo.origin.x*_16.width;
-_16.y=fo.origin.y*_16.height;
-_16.src=fo.src;
+var _12=dojo.clone(dojox.gfx.defaultPattern);
+_12.width=dojox.gfx.pt2px(fo.size.x);
+_12.height=dojox.gfx.pt2px(fo.size.y);
+_12.x=fo.origin.x*_12.width;
+_12.y=fo.origin.y*_12.height;
+_12.src=fo.src;
 }else{
 if(fo.on&&r.fillcolor){
-_16=new dojo.Color(r.fillcolor+"");
-_16.a=fo.opacity;
+_12=new dojo.Color(r.fillcolor+"");
+_12.a=fo.opacity;
 }
 }
 }
 }
-_15.fillStyle=_16;
+_11.fillStyle=_12;
 };
-var _f=function(_1f){
-var r=_1f.rawNode;
+var _e=function(_14){
+var r=_14.rawNode;
 if(!r.stroked){
-_1f.strokeStyle=null;
+_14.strokeStyle=null;
 return;
 }
-var _21=_1f.strokeStyle=dojo.clone(dojox.gfx.defaultStroke),rs=r.stroke;
-_21.color=new dojo.Color(r.strokecolor.value);
-_21.width=dojox.gfx.normalizedLength(r.strokeweight+"");
-_21.color.a=rs.opacity;
-_21.cap=this._translate(this._capMapReversed,rs.endcap);
-_21.join=rs.joinstyle=="miter"?rs.miterlimit:rs.joinstyle;
-_21.style=rs.dashstyle;
+var _15=_14.strokeStyle=dojo.clone(dojox.gfx.defaultStroke),rs=r.stroke;
+_15.color=new dojo.Color(r.strokecolor.value);
+_15.width=dojox.gfx.normalizedLength(r.strokeweight+"");
+_15.color.a=rs.opacity;
+_15.cap=this._translate(this._capMapReversed,rs.endcap);
+_15.join=rs.joinstyle=="miter"?rs.miterlimit:rs.joinstyle;
+_15.style=rs.dashstyle;
 };
-var _10=function(_23){
-var s=_23.rawNode.skew,sm=s.matrix,so=s.offset;
-_23.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 _f=function(_16){
+var s=_16.rawNode.skew,sm=s.matrix,so=s.offset;
+_16.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 _27=function(_28){
-_28.bgNode=_28.rawNode.firstChild;
+var _17=function(_18){
+_18.bgNode=_18.rawNode.firstChild;
 };
-var _3=function(_29){
-var r=_29.rawNode,_2b=r.outerHTML.match(/arcsize = \"(\d*\.?\d+[%f]?)\"/)[1],_2c=r.style,_2d=parseFloat(_2c.width),_2e=parseFloat(_2c.height);
-_2b=(_2b.indexOf("%")>=0)?parseFloat(_2b)/100:dojox.gfx.vml._parseFloat(_2b);
-_29.shape=dojox.gfx.makeParameters(dojox.gfx.defaultRect,{x:parseInt(_2c.left),y:parseInt(_2c.top),width:_2d,height:_2e,r:Math.min(_2d,_2e)*_2b});
+var _2=function(_19){
+var r=_19.rawNode,_1a=r.outerHTML.match(/arcsize = \"(\d*\.?\d+[%f]?)\"/)[1],_1b=r.style,_1c=parseFloat(_1b.width),_1d=parseFloat(_1b.height);
+_1a=(_1a.indexOf("%")>=0)?parseFloat(_1a)/100:dojox.gfx.vml._parseFloat(_1a);
+_19.shape=dojox.gfx.makeParameters(dojox.gfx.defaultRect,{x:parseInt(_1b.left),y:parseInt(_1b.top),width:_1c,height:_1d,r:Math.min(_1c,_1d)*_1a});
 };
-var _5=function(_2f){
-var _30=_2f.rawNode.style,rx=parseInt(_30.width)/2,ry=parseInt(_30.height)/2;
-_2f.shape=dojox.gfx.makeParameters(dojox.gfx.defaultEllipse,{cx:parseInt(_30.left)+rx,cy:parseInt(_30.top)+ry,rx:rx,ry:ry});
+var _4=function(_1e){
+var _1f=_1e.rawNode.style,rx=parseInt(_1f.width)/2,ry=parseInt(_1f.height)/2;
+_1e.shape=dojox.gfx.makeParameters(dojox.gfx.defaultEllipse,{cx:parseInt(_1f.left)+rx,cy:parseInt(_1f.top)+ry,rx:rx,ry:ry});
 };
-var _4=function(_33){
-var _34=_33.rawNode.style,r=parseInt(_34.width)/2;
-_33.shape=dojox.gfx.makeParameters(dojox.gfx.defaultCircle,{cx:parseInt(_34.left)+r,cy:parseInt(_34.top)+r,r:r});
+var _3=function(_20){
+var _21=_20.rawNode.style,r=parseInt(_21.width)/2;
+_20.shape=dojox.gfx.makeParameters(dojox.gfx.defaultCircle,{cx:parseInt(_21.left)+r,cy:parseInt(_21.top)+r,r:r});
 };
-var _6=function(_36){
-var _37=_36.shape=dojo.clone(dojox.gfx.defaultLine),p=_36.rawNode.path.v.match(dojox.gfx.pathVmlRegExp);
+var _5=function(_22){
+var _23=_22.shape=dojo.clone(dojox.gfx.defaultLine),p=_22.rawNode.path.v.match(dojox.gfx.pathVmlRegExp);
 do{
 if(p.length<7||p[0]!="m"||p[3]!="l"||p[6]!="e"){
 break;
 }
-_37.x1=parseInt(p[1]);
-_37.y1=parseInt(p[2]);
-_37.x2=parseInt(p[4]);
-_37.y2=parseInt(p[5]);
+_23.x1=parseInt(p[1]);
+_23.y1=parseInt(p[2]);
+_23.x2=parseInt(p[4]);
+_23.y2=parseInt(p[5]);
 }while(false);
 };
-var _7=function(_39){
-var _3a=_39.shape=dojo.clone(dojox.gfx.defaultPolyline),p=_39.rawNode.path.v.match(dojox.gfx.pathVmlRegExp);
+var _6=function(_24){
+var _25=_24.shape=dojo.clone(dojox.gfx.defaultPolyline),p=_24.rawNode.path.v.match(dojox.gfx.pathVmlRegExp);
 do{
 if(p.length<3||p[0]!="m"){
 break;
@@ -191,7 +191,7 @@ var x=parseInt(p[0]),y=parseInt(p[1]);
 if(isNaN(x)||isNaN(y)){
 break;
 }
-_3a.points.push({x:x,y:y});
+_25.points.push({x:x,y:y});
 if(p.length<6||p[3]!="l"){
 break;
 }
@@ -201,20 +201,20 @@ y=parseInt(p[i+1]);
 if(isNaN(x)||isNaN(y)){
 break;
 }
-_3a.points.push({x:x,y:y});
+_25.points.push({x:x,y:y});
 }
 }while(false);
 };
-var _c=function(_3f){
-_3f.shape=dojo.clone(dojox.gfx.defaultImage);
-_3f.shape.src=_3f.rawNode.firstChild.src;
+var _b=function(_26){
+_26.shape=dojo.clone(dojox.gfx.defaultImage);
+_26.shape.src=_26.rawNode.firstChild.src;
 };
-var _d=function(_40){
-var m=_40.rawNode.filters["DXImageTransform.Microsoft.Matrix"];
-_40.matrix=dojox.gfx.matrix.normalize({xx:m.M11,xy:m.M12,yx:m.M21,yy:m.M22,dx:m.Dx,dy:m.Dy});
+var _c=function(_27){
+var m=_27.rawNode.filters["DXImageTransform.Microsoft.Matrix"];
+_27.matrix=dojox.gfx.matrix.normalize({xx:m.M11,xy:m.M12,yx:m.M21,yy:m.M22,dx:m.Dx,dy:m.Dy});
 };
-var _9=function(_42){
-var _43=_42.shape=dojo.clone(dojox.gfx.defaultText),r=_42.rawNode,p=r.path.v.match(dojox.gfx.pathVmlRegExp);
+var _8=function(_28){
+var _29=_28.shape=dojo.clone(dojox.gfx.defaultText),r=_28.rawNode,p=r.path.v.match(dojox.gfx.pathVmlRegExp);
 do{
 if(!p||p.length!=7){
 break;
@@ -226,63 +226,63 @@ if(i>=c.length){
 break;
 }
 var s=c[i].style;
-_43.text=c[i].string;
+_29.text=c[i].string;
 switch(s["v-text-align"]){
 case "left":
-_43.x=parseInt(p[1]);
-_43.align="start";
+_29.x=parseInt(p[1]);
+_29.align="start";
 break;
 case "center":
-_43.x=(parseInt(p[1])+parseInt(p[4]))/2;
-_43.align="middle";
+_29.x=(parseInt(p[1])+parseInt(p[4]))/2;
+_29.align="middle";
 break;
 case "right":
-_43.x=parseInt(p[4]);
-_43.align="end";
+_29.x=parseInt(p[4]);
+_29.align="end";
 break;
 }
-_43.y=parseInt(p[2]);
-_43.decoration=s["text-decoration"];
-_43.rotated=s["v-rotate-letters"].toLowerCase() in dojox.gfx.vml._bool;
-_43.kerning=s["v-text-kern"].toLowerCase() in dojox.gfx.vml._bool;
+_29.y=parseInt(p[2]);
+_29.decoration=s["text-decoration"];
+_29.rotated=s["v-rotate-letters"].toLowerCase() in dojox.gfx.vml._bool;
+_29.kerning=s["v-text-kern"].toLowerCase() in dojox.gfx.vml._bool;
 return;
 }while(false);
-_42.shape=null;
+_28.shape=null;
 };
-var _a=function(_49){
-var _4a=_49.fontStyle=dojo.clone(dojox.gfx.defaultFont),c=_49.rawNode.childNodes,i=0;
+var _9=function(_2a){
+var _2b=_2a.fontStyle=dojo.clone(dojox.gfx.defaultFont),c=_2a.rawNode.childNodes,i=0;
 for(;i<c.length&&c[i].tagName=="textpath";++i){
 }
 if(i>=c.length){
-_49.fontStyle=null;
+_2a.fontStyle=null;
 return;
 }
 var s=c[i].style;
-_4a.style=s.fontstyle;
-_4a.variant=s.fontvariant;
-_4a.weight=s.fontweight;
-_4a.size=s.fontsize;
-_4a.family=s.fontfamily;
+_2b.style=s.fontstyle;
+_2b.variant=s.fontvariant;
+_2b.weight=s.fontweight;
+_2b.size=s.fontsize;
+_2b.family=s.fontfamily;
 };
-var _b=function(_4e){
-_10(_4e);
-var _4f=_4e.matrix,fs=_4e.fontStyle;
-if(_4f&&fs){
-_4e.matrix=dojox.gfx.matrix.multiply(_4f,{dy:dojox.gfx.normalizedLength(fs.size)*0.35});
+var _a=function(_2c){
+_f(_2c);
+var _2d=_2c.matrix,fs=_2c.fontStyle;
+if(_2d&&fs){
+_2c.matrix=dojox.gfx.matrix.multiply(_2d,{dy:dojox.gfx.normalizedLength(fs.size)*0.35});
 }
 };
-var _8=function(_51){
-var _52=_51.shape=dojo.clone(dojox.gfx.defaultPath),p=_51.rawNode.path.v.match(dojox.gfx.pathVmlRegExp),t=[],_55=false,map=dojox.gfx.Path._pathVmlToSvgMap;
+var _7=function(_2e){
+var _2f=_2e.shape=dojo.clone(dojox.gfx.defaultPath),p=_2e.rawNode.path.v.match(dojox.gfx.pathVmlRegExp),t=[],_30=false,map=dojox.gfx.Path._pathVmlToSvgMap;
 for(var i=0;i<p.length;++p){
 var s=p[i];
 if(s in map){
-_55=false;
+_30=false;
 t.push(map[s]);
 }else{
-if(!_55){
+if(!_30){
 var n=parseInt(s);
 if(isNaN(n)){
-_55=true;
+_30=true;
 }else{
 t.push(n);
 }
@@ -294,7 +294,7 @@ 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){
-_52.path=t.join(" ");
+_2f.path=t.join(" ");
 }
 };
 })();
diff --git a/dojox/gfx3d/gradient.js b/dojox/gfx3d/gradient.js
index c3bd23d..a6080e0 100644
--- a/dojox/gfx3d/gradient.js
+++ b/dojox/gfx3d/gradient.js
@@ -15,14 +15,14 @@ var _1=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(_5,_6,_7,_8,_9,to,_b){
-var m=dojox.gfx3d.matrix,v=dojox.gfx3d.vector,mx=m.normalize(_b),f=m.multiplyPoint(mx,_8*Math.cos(_9)+_7.x,_8*Math.sin(_9)+_7.y,_7.z),t=m.multiplyPoint(mx,_8*Math.cos(to)+_7.x,_8*Math.sin(to)+_7.y,_7.z),c=m.multiplyPoint(mx,_7.x,_7.y,_7.z),_12=(to-_9)/N,r=_1(f,t)/2,mod=_5[_6.type],fin=_6.finish,pmt=_6.color,_17=[{offset:0,color:mod.call(_5,v.substract(f,c),fin,pmt)}];
-for(var a=_9+_12;a<to;a+=_12){
-var p=m.multiplyPoint(mx,_8*Math.cos(a)+_7.x,_8*Math.sin(a)+_7.y,_7.z),df=_1(f,p),dt=_1(t,p);
-_17.push({offset:df/(df+dt),color:mod.call(_5,v.substract(p,c),fin,pmt)});
+dojox.gfx3d.gradient=function(_2,_3,_4,_5,_6,to,_7){
+var m=dojox.gfx3d.matrix,v=dojox.gfx3d.vector,mx=m.normalize(_7),f=m.multiplyPoint(mx,_5*Math.cos(_6)+_4.x,_5*Math.sin(_6)+_4.y,_4.z),t=m.multiplyPoint(mx,_5*Math.cos(to)+_4.x,_5*Math.sin(to)+_4.y,_4.z),c=m.multiplyPoint(mx,_4.x,_4.y,_4.z),_8=(to-_6)/N,r=_1(f,t)/2,_9=_2[_3.type],_a=_3.finish,_b=_3.color,_c=[{offset:0,color:_9.call(_2,v.substract(f,c),_a,_b)}];
+for(var a=_6+_8;a<to;a+=_8){
+var p=m.multiplyPoint(mx,_5*Math.cos(a)+_4.x,_5*Math.sin(a)+_4.y,_4.z),df=_1(f,p),dt=_1(t,p);
+_c.push({offset:df/(df+dt),color:_9.call(_2,v.substract(p,c),_a,_b)});
 }
-_17.push({offset:1,color:mod.call(_5,v.substract(t,c),fin,pmt)});
-return {type:"linear",x1:0,y1:-r,x2:0,y2:r,colors:_17};
+_c.push({offset:1,color:_9.call(_2,v.substract(t,c),_a,_b)});
+return {type:"linear",x1:0,y1:-r,x2:0,y2:r,colors:_c};
 };
 })();
 }
diff --git a/dojox/gfx3d/lighting.js b/dojox/gfx3d/lighting.js
index 88e098d..dd99fbe 100644
--- a/dojox/gfx3d/lighting.js
+++ b/dojox/gfx3d/lighting.js
@@ -57,41 +57,41 @@ 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));
-},diffuse:function(_25,_26){
+},diffuse:function(_2,_3){
 var c=_1.black();
-for(var i=0;i<_26.length;++i){
-var l=_26[i],d=_1.dot(_1.normalize(l.direction),_25);
+for(var i=0;i<_3.length;++i){
+var l=_3[i],d=_1.dot(_1.normalize(l.direction),_2);
 c=_1.addColor(c,_1.scaleColor(d,l.color));
 }
 return _1.saturateColor(c);
-},specular:function(_2b,v,_2d,_2e){
+},specular:function(_4,v,_5,_6){
 var c=_1.black();
-for(var i=0;i<_2e.length;++i){
-var l=_2e[i],h=_1.normalize(_1.add(_1.normalize(l.direction),v)),s=Math.pow(Math.max(0,_1.dot(_2b,h)),1/_2d);
+for(var i=0;i<_6.length;++i){
+var l=_6[i],h=_1.normalize(_1.add(_1.normalize(l.direction),v)),s=Math.pow(Math.max(0,_1.dot(_4,h)),1/_5);
 c=_1.addColor(c,_1.scaleColor(s,l.color));
 }
 return _1.saturateColor(c);
-},phong:function(_34,v,_36,_37){
-_34=_1.normalize(_34);
+},phong:function(_7,v,_8,_9){
+_7=_1.normalize(_7);
 var c=_1.black();
-for(var i=0;i<_37.length;++i){
-var l=_37[i],r=_1.reflect(_1.scale(-1,_1.normalize(v)),_34),s=Math.pow(Math.max(0,_1.dot(r,_1.normalize(l.direction))),_36);
+for(var i=0;i<_9.length;++i){
+var l=_9[i],r=_1.reflect(_1.scale(-1,_1.normalize(v)),_7),s=Math.pow(Math.max(0,_1.dot(r,_1.normalize(l.direction))),_8);
 c=_1.addColor(c,_1.scaleColor(s,l.color));
 }
 return _1.saturateColor(c);
 }});
-dojo.declare("dojox.gfx3d.lighting.Model",null,{constructor:function(_3d,_3e,_3f,_40){
-this.incident=_1.normalize(_3d);
+dojo.declare("dojox.gfx3d.lighting.Model",null,{constructor:function(_a,_b,_c,_d){
+this.incident=_1.normalize(_a);
 this.lights=[];
-for(var i=0;i<_3e.length;++i){
-var l=_3e[i];
+for(var i=0;i<_b.length;++i){
+var l=_b[i];
 this.lights.push({direction:_1.normalize(l.direction),color:_1.toStdColor(l.color)});
 }
-this.ambient=_1.toStdColor(_3f.color?_3f.color:"white");
-this.ambient=_1.scaleColor(_3f.intensity,this.ambient);
+this.ambient=_1.toStdColor(_c.color?_c.color:"white");
+this.ambient=_1.scaleColor(_c.intensity,this.ambient);
 this.ambient=_1.scaleColor(this.ambient.a,this.ambient);
 this.ambient.a=1;
-this.specular=_1.toStdColor(_40?_40:"white");
+this.specular=_1.toStdColor(_d?_d:"white");
 this.specular=_1.scaleColor(this.specular.a,this.specular);
 this.specular.a=1;
 this.npr_cool={r:0,g:0,b:0.4,a:1};
@@ -99,59 +99,59 @@ 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(_43,_44,_45){
-_45=_1.toStdColor(_45);
-var _46=_45.a,_47=_1.scaleColor(_46,_45);
-_47.a=_46;
-return _1.fromStdColor(_1.saturateColor(_47));
-},matte:function(_48,_49,_4a){
-if(typeof _49=="string"){
-_49=_1.finish[_49];
+},constant:function(_e,_f,_10){
+_10=_1.toStdColor(_10);
+var _11=_10.a,_12=_1.scaleColor(_11,_10);
+_12.a=_11;
+return _1.fromStdColor(_1.saturateColor(_12));
+},matte:function(_13,_14,_15){
+if(typeof _14=="string"){
+_14=_1.finish[_14];
 }
-_4a=_1.toStdColor(_4a);
-_48=_1.faceforward(_1.normalize(_48),this.incident);
-var _4b=_1.scaleColor(_49.Ka,this.ambient),_4c=_1.saturate(-4*_1.dot(_48,this.incident)),_4d=_1.scaleColor(_4c*_49.Kd,_1.diffuse(_48,this.lights)),_4e=_1.scaleColor(_4a.a,_1.multiplyColor(_4a,_1.addColor(_4b,_4d)));
-_4e.a=_4a.a;
-return _1.fromStdColor(_1.saturateColor(_4e));
-},metal:function(_4f,_50,_51){
-if(typeof _50=="string"){
-_50=_1.finish[_50];
+_15=_1.toStdColor(_15);
+_13=_1.faceforward(_1.normalize(_13),this.incident);
+var _16=_1.scaleColor(_14.Ka,this.ambient),_17=_1.saturate(-4*_1.dot(_13,this.incident)),_18=_1.scaleColor(_17*_14.Kd,_1.diffuse(_13,this.lights)),_19=_1.scaleColor(_15.a,_1.multiplyColor(_15,_1.addColor(_16,_18)));
+_19.a=_15.a;
+return _1.fromStdColor(_1.saturateColor(_19));
+},metal:function(_1a,_1b,_1c){
+if(typeof _1b=="string"){
+_1b=_1.finish[_1b];
 }
-_51=_1.toStdColor(_51);
-_4f=_1.faceforward(_1.normalize(_4f),this.incident);
-var v=_1.scale(-1,this.incident),_53,_54,_55=_1.scaleColor(_50.Ka,this.ambient),_56=_1.saturate(-4*_1.dot(_4f,this.incident));
-if("phong" in _50){
-_53=_1.scaleColor(_56*_50.Ks*_50.phong,_1.phong(_4f,v,_50.phong_size,this.lights));
+_1c=_1.toStdColor(_1c);
+_1a=_1.faceforward(_1.normalize(_1a),this.incident);
+var v=_1.scale(-1,this.incident),_1d,_1e,_1f=_1.scaleColor(_1b.Ka,this.ambient),_20=_1.saturate(-4*_1.dot(_1a,this.incident));
+if("phong" in _1b){
+_1d=_1.scaleColor(_20*_1b.Ks*_1b.phong,_1.phong(_1a,v,_1b.phong_size,this.lights));
 }else{
-_53=_1.scaleColor(_56*_50.Ks,_1.specular(_4f,v,_50.roughness,this.lights));
+_1d=_1.scaleColor(_20*_1b.Ks,_1.specular(_1a,v,_1b.roughness,this.lights));
 }
-_54=_1.scaleColor(_51.a,_1.addColor(_1.multiplyColor(_51,_55),_1.multiplyColor(this.specular,_53)));
-_54.a=_51.a;
-return _1.fromStdColor(_1.saturateColor(_54));
-},plastic:function(_57,_58,_59){
-if(typeof _58=="string"){
-_58=_1.finish[_58];
+_1e=_1.scaleColor(_1c.a,_1.addColor(_1.multiplyColor(_1c,_1f),_1.multiplyColor(this.specular,_1d)));
+_1e.a=_1c.a;
+return _1.fromStdColor(_1.saturateColor(_1e));
+},plastic:function(_21,_22,_23){
+if(typeof _22=="string"){
+_22=_1.finish[_22];
 }
-_59=_1.toStdColor(_59);
-_57=_1.faceforward(_1.normalize(_57),this.incident);
-var v=_1.scale(-1,this.incident),_5b,_5c,_5d=_1.scaleColor(_58.Ka,this.ambient),_5e=_1.saturate(-4*_1.dot(_57,this.incident)),_5f=_1.scaleColor(_5e*_58.Kd,_1.diffuse(_57,this.lights));
-if("phong" in _58){
-_5b=_1.scaleColor(_5e*_58.Ks*_58.phong,_1.phong(_57,v,_58.phong_size,this.lights));
+_23=_1.toStdColor(_23);
+_21=_1.faceforward(_1.normalize(_21),this.incident);
+var v=_1.scale(-1,this.incident),_24,_25,_26=_1.scaleColor(_22.Ka,this.ambient),_27=_1.saturate(-4*_1.dot(_21,this.incident)),_28=_1.scaleColor(_27*_22.Kd,_1.diffuse(_21,this.lights));
+if("phong" in _22){
+_24=_1.scaleColor(_27*_22.Ks*_22.phong,_1.phong(_21,v,_22.phong_size,this.lights));
 }else{
-_5b=_1.scaleColor(_5e*_58.Ks,_1.specular(_57,v,_58.roughness,this.lights));
+_24=_1.scaleColor(_27*_22.Ks,_1.specular(_21,v,_22.roughness,this.lights));
 }
-_5c=_1.scaleColor(_59.a,_1.addColor(_1.multiplyColor(_59,_1.addColor(_5d,_5f)),_1.multiplyColor(this.specular,_5b)));
-_5c.a=_59.a;
-return _1.fromStdColor(_1.saturateColor(_5c));
-},npr:function(_60,_61,_62){
-if(typeof _61=="string"){
-_61=_1.finish[_61];
+_25=_1.scaleColor(_23.a,_1.addColor(_1.multiplyColor(_23,_1.addColor(_26,_28)),_1.multiplyColor(this.specular,_24)));
+_25.a=_23.a;
+return _1.fromStdColor(_1.saturateColor(_25));
+},npr:function(_29,_2a,_2b){
+if(typeof _2a=="string"){
+_2a=_1.finish[_2a];
 }
-_62=_1.toStdColor(_62);
-_60=_1.faceforward(_1.normalize(_60),this.incident);
-var _63=_1.scaleColor(_61.Ka,this.ambient),_64=_1.saturate(-4*_1.dot(_60,this.incident)),_65=_1.scaleColor(_64*_61.Kd,_1.diffuse(_60,this.lights)),_66=_1.scaleColor(_62.a,_1.multiplyColor(_62,_1.addColor(_63,_65))),_67=_1.addColor(this.npr_cool,_1.scaleColor(this.npr_alpha,_66)),_68=_1.addColor(this.npr_warm,_1.scaleColor(this.npr_beta,_66)),d=(1+_1.dot(this.incident,_60))/2,_66=_1.scaleColor(this.npr_scale,_1.addColor(_66,_1.mixColor(_67,_68,d)));
-_66.a=_62.a;
-return _1.fromStdColor(_1.saturateColor(_66));
+_2b=_1.toStdColor(_2b);
+_29=_1.faceforward(_1.normalize(_29),this.incident);
+var _2c=_1.scaleColor(_2a.Ka,this.ambient),_2d=_1.saturate(-4*_1.dot(_29,this.incident)),_2e=_1.scaleColor(_2d*_2a.Kd,_1.diffuse(_29,this.lights)),_2f=_1.scaleColor(_2b.a,_1.multiplyColor(_2b,_1.addColor(_2c,_2e))),_30=_1.addColor(this.npr_cool,_1.scaleColor(this.npr_alpha,_2f)),_31=_1.addColor(this.npr_warm,_1.scaleColor(this.npr_beta,_2f)),d=(1+_1.dot(this.incident,_29))/2,_2f=_1.scaleColor(this.npr_scale,_1.addColor(_2f,_1.mixColor(_30,_31,d)));
+_2f.a=_2b.a;
+return _1.fromStdColor(_1.saturateColor(_2f));
 }});
 })();
 dojox.gfx3d.lighting.finish={defaults:{Ka:0.1,Kd:0.6,Ks: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,roughness:0.001},glossy:{Ka:0.1,Kd:0.6,Ks:1,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,phong:1,phong_size:200},phong_glossy:{Ka:0.1,Kd:0.6,Ks:1,phong:1,phong_size:300},luminous:{Ka:1,Kd:0,Ks:0,roughness:0.05},metalA:{Ka:0.35,Kd:0.3,Ks:0.8,roughness:1/20},metalB:{Ka:0.3,Kd:0.4,Ks:0.7,r [...]
diff --git a/dojox/gfx3d/matrix.js b/dojox/gfx3d/matrix.js
index bc68c44..7934e61 100644
--- a/dojox/gfx3d/matrix.js
+++ b/dojox/gfx3d/matrix.js
@@ -61,72 +61,72 @@ if(typeof a=="number"){
 return new dojox.gfx3d.matrix.Matrix3D({xx:a,yy:a,zz:a});
 }
 return new dojox.gfx3d.matrix.Matrix3D({xx:a.x,yy:a.y,zz:a.z});
-},rotateX:function(_e){
-var c=Math.cos(_e);
-var s=Math.sin(_e);
+},rotateX:function(_4){
+var c=Math.cos(_4);
+var s=Math.sin(_4);
 return new dojox.gfx3d.matrix.Matrix3D({yy:c,yz:-s,zy:s,zz:c});
-},rotateXg:function(_11){
-return dojox.gfx3d.matrix.rotateX(dojox.gfx3d.matrix._degToRad(_11));
-},rotateY:function(_12){
-var c=Math.cos(_12);
-var s=Math.sin(_12);
+},rotateXg:function(_5){
+return dojox.gfx3d.matrix.rotateX(dojox.gfx3d.matrix._degToRad(_5));
+},rotateY:function(_6){
+var c=Math.cos(_6);
+var s=Math.sin(_6);
 return new dojox.gfx3d.matrix.Matrix3D({xx:c,xz:s,zx:-s,zz:c});
-},rotateYg:function(_15){
-return dojox.gfx3d.matrix.rotateY(dojox.gfx3d.matrix._degToRad(_15));
-},rotateZ:function(_16){
-var c=Math.cos(_16);
-var s=Math.sin(_16);
+},rotateYg:function(_7){
+return dojox.gfx3d.matrix.rotateY(dojox.gfx3d.matrix._degToRad(_7));
+},rotateZ:function(_8){
+var c=Math.cos(_8);
+var s=Math.sin(_8);
 return new dojox.gfx3d.matrix.Matrix3D({xx:c,xy:-s,yx:s,yy:c});
-},rotateZg:function(_19){
-return dojox.gfx3d.matrix.rotateZ(dojox.gfx3d.matrix._degToRad(_19));
+},rotateZg:function(_9){
+return dojox.gfx3d.matrix.rotateZ(dojox.gfx3d.matrix._degToRad(_9));
 },cameraTranslate:function(a,b,c){
 if(arguments.length>1){
 return new dojox.gfx3d.matrix.Matrix3D({dx:-a,dy:-b,dz:-c});
 }
 return new dojox.gfx3d.matrix.Matrix3D({dx:-a.x,dy:-a.y,dz:-a.z});
-},cameraRotateX:function(_1d){
-var c=Math.cos(-_1d);
-var s=Math.sin(-_1d);
+},cameraRotateX:function(_a){
+var c=Math.cos(-_a);
+var s=Math.sin(-_a);
 return new dojox.gfx3d.matrix.Matrix3D({yy:c,yz:-s,zy:s,zz:c});
-},cameraRotateXg:function(_20){
-return dojox.gfx3d.matrix.rotateX(dojox.gfx3d.matrix._degToRad(_20));
-},cameraRotateY:function(_21){
-var c=Math.cos(-_21);
-var s=Math.sin(-_21);
+},cameraRotateXg:function(_b){
+return dojox.gfx3d.matrix.rotateX(dojox.gfx3d.matrix._degToRad(_b));
+},cameraRotateY:function(_c){
+var c=Math.cos(-_c);
+var s=Math.sin(-_c);
 return new dojox.gfx3d.matrix.Matrix3D({xx:c,xz:s,zx:-s,zz:c});
-},cameraRotateYg:function(_24){
-return dojox.gfx3d.matrix.rotateY(dojox.gfx3d.matrix._degToRad(_24));
-},cameraRotateZ:function(_25){
-var c=Math.cos(-_25);
-var s=Math.sin(-_25);
+},cameraRotateYg:function(_d){
+return dojox.gfx3d.matrix.rotateY(dojox.gfx3d.matrix._degToRad(_d));
+},cameraRotateZ:function(_e){
+var c=Math.cos(-_e);
+var s=Math.sin(-_e);
 return new dojox.gfx3d.matrix.Matrix3D({xx:c,xy:-s,yx:s,yy:c});
-},cameraRotateZg:function(_28){
-return dojox.gfx3d.matrix.rotateZ(dojox.gfx3d.matrix._degToRad(_28));
-},normalize:function(_29){
-return (_29 instanceof dojox.gfx3d.matrix.Matrix3D)?_29:new dojox.gfx3d.matrix.Matrix3D(_29);
-},clone:function(_2a){
+},cameraRotateZg:function(_f){
+return dojox.gfx3d.matrix.rotateZ(dojox.gfx3d.matrix._degToRad(_f));
+},normalize:function(_10){
+return (_10 instanceof dojox.gfx3d.matrix.Matrix3D)?_10:new dojox.gfx3d.matrix.Matrix3D(_10);
+},clone:function(_11){
 var obj=new dojox.gfx3d.matrix.Matrix3D();
-for(var i in _2a){
-if(typeof (_2a[i])=="number"&&typeof (obj[i])=="number"&&obj[i]!=_2a[i]){
-obj[i]=_2a[i];
+for(var i in _11){
+if(typeof (_11[i])=="number"&&typeof (obj[i])=="number"&&obj[i]!=_11[i]){
+obj[i]=_11[i];
 }
 }
 return obj;
-},invert:function(_2d){
-var m=dojox.gfx3d.matrix.normalize(_2d);
+},invert:function(_12){
+var m=dojox.gfx3d.matrix.normalize(_12);
 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 [...]
 return M;
 },_multiplyPoint:function(m,x,y,z){
 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};
-},multiplyPoint:function(_35,a,b,c){
-var m=dojox.gfx3d.matrix.normalize(_35);
+},multiplyPoint:function(_13,a,b,c){
+var m=dojox.gfx3d.matrix.normalize(_13);
 if(typeof a=="number"&&typeof b=="number"&&typeof c=="number"){
 return dojox.gfx3d.matrix._multiplyPoint(m,a,b,c);
 }
 return dojox.gfx3d.matrix._multiplyPoint(m,a.x,a.y,a.z);
-},multiply:function(_3a){
-var m=dojox.gfx3d.matrix.normalize(_3a);
+},multiply:function(_14){
+var m=dojox.gfx3d.matrix.normalize(_14);
 for(var i=1;i<arguments.length;++i){
 var l=m;
 var r=dojox.gfx3d.matrix.normalize(arguments[i]);
@@ -147,8 +147,8 @@ m.dz=l.zx*r.dx+l.zy*r.dy+l.zz*r.dz+l.dz;
 return m;
 },_project:function(m,x,y,z){
 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};
-},project:function(_43,a,b,c){
-var m=dojox.gfx3d.matrix.normalize(_43);
+},project:function(_15,a,b,c){
+var m=dojox.gfx3d.matrix.normalize(_15);
 if(typeof a=="number"&&typeof b=="number"&&typeof c=="number"){
 return dojox.gfx3d.matrix._project(m,a,b,c);
 }
diff --git a/dojox/gfx3d/object.js b/dojox/gfx3d/object.js
index 749f369..e4982d5 100644
--- a/dojox/gfx3d/object.js
+++ b/dojox/gfx3d/object.js
@@ -33,26 +33,26 @@ this.parent=null;
 this.strokeStyle=null;
 this.fillStyle=null;
 this.shape=null;
-},setObject:function(_5){
-this.object=dojox.gfx.makeParameters(this.object,_5);
+},setObject:function(_1){
+this.object=dojox.gfx.makeParameters(this.object,_1);
 return this;
-},setTransform:function(_6){
-this.matrix=dojox.gfx3d.matrix.clone(_6?dojox.gfx3d.matrix.normalize(_6):dojox.gfx3d.identity,true);
+},setTransform:function(_2){
+this.matrix=dojox.gfx3d.matrix.clone(_2?dojox.gfx3d.matrix.normalize(_2):dojox.gfx3d.identity,true);
 return this;
-},applyRightTransform:function(_7){
-return _7?this.setTransform([this.matrix,_7]):this;
-},applyLeftTransform:function(_8){
-return _8?this.setTransform([_8,this.matrix]):this;
-},applyTransform:function(_9){
-return _9?this.setTransform([this.matrix,_9]):this;
-},setFill:function(_a){
-this.fillStyle=_a;
+},applyRightTransform:function(_3){
+return _3?this.setTransform([this.matrix,_3]):this;
+},applyLeftTransform:function(_4){
+return _4?this.setTransform([_4,this.matrix]):this;
+},applyTransform:function(_5){
+return _5?this.setTransform([this.matrix,_5]):this;
+},setFill:function(_6){
+this.fillStyle=_6;
 return this;
-},setStroke:function(_b){
-this.strokeStyle=_b;
+},setStroke:function(_7){
+this.strokeStyle=_7;
 return this;
-},toStdFill:function(_c,_d){
-return (this.fillStyle&&typeof this.fillStyle["type"]!="undefined")?_c[this.fillStyle.type](_d,this.fillStyle.finish,this.fillStyle.color):this.fillStyle;
+},toStdFill:function(_8,_9){
+return (this.fillStyle&&typeof this.fillStyle["type"]!="undefined")?_8[this.fillStyle.type](_9,this.fillStyle.finish,this.fillStyle.color):this.fillStyle;
 },invalidate:function(){
 this.renderer.addTodo(this);
 },destroy:function(){
@@ -63,9 +63,9 @@ p.remove(this.shape);
 }
 this.shape=null;
 }
-},render:function(_f){
+},render:function(_a){
 throw "Pure virtual function, not implemented";
-},draw:function(_10){
+},draw:function(_b){
 throw "Pure virtual function, not implemented";
 },getZOrder:function(){
 return 0;
@@ -77,60 +77,60 @@ this.objects=[];
 this.todos=[];
 this.schedule=dojox.gfx3d.scheduler.zOrder;
 this._draw=dojox.gfx3d.drawer.conservative;
-},setFill:function(_11){
-this.fillStyle=_11;
-dojo.forEach(this.objects,function(_12){
-_12.setFill(_11);
+},setFill:function(_c){
+this.fillStyle=_c;
+dojo.forEach(this.objects,function(_d){
+_d.setFill(_c);
 });
 return this;
-},setStroke:function(_13){
-this.strokeStyle=_13;
-dojo.forEach(this.objects,function(_14){
-_14.setStroke(_13);
+},setStroke:function(_e){
+this.strokeStyle=_e;
+dojo.forEach(this.objects,function(_f){
+_f.setStroke(_e);
 });
 return this;
-},render:function(_15,_16){
-var m=dojox.gfx3d.matrix.multiply(_15,this.matrix);
-if(_16){
+},render:function(_10,_11){
+var m=dojox.gfx3d.matrix.multiply(_10,this.matrix);
+if(_11){
 this.todos=this.objects;
 }
-dojo.forEach(this.todos,function(_18){
-_18.render(m,_16);
+dojo.forEach(this.todos,function(_12){
+_12.render(m,_11);
 });
-},draw:function(_19){
+},draw:function(_13){
 this.objects=this.schedule(this.objects);
 this._draw(this.todos,this.objects,this.renderer);
-},addTodo:function(_1a){
-if(dojo.every(this.todos,function(_1b){
-return _1b!=_1a;
+},addTodo:function(_14){
+if(dojo.every(this.todos,function(_15){
+return _15!=_14;
 })){
-this.todos.push(_1a);
+this.todos.push(_14);
 this.invalidate();
 }
 },invalidate:function(){
 this.parent.addTodo(this);
 },getZOrder:function(){
-var _1c=0;
-dojo.forEach(this.objects,function(_1d){
-_1c+=_1d.getZOrder();
+var _16=0;
+dojo.forEach(this.objects,function(_17){
+_16+=_17.getZOrder();
 });
-return (this.objects.length>1)?_1c/this.objects.length:0;
+return (this.objects.length>1)?_16/this.objects.length:0;
 }});
 dojo.declare("dojox.gfx3d.Edges",dojox.gfx3d.Object,{constructor:function(){
 this.object=dojo.clone(dojox.gfx3d.defaultEdges);
-},setObject:function(_1e,_1f){
-this.object=dojox.gfx.makeParameters(this.object,(_1e instanceof Array)?{points:_1e,style:_1f}:_1e);
+},setObject:function(_18,_19){
+this.object=dojox.gfx.makeParameters(this.object,(_18 instanceof Array)?{points:_18,style:_19}:_18);
 return this;
 },getZOrder:function(){
-var _20=0;
-dojo.forEach(this.cache,function(_21){
-_20+=_21.z;
+var _1a=0;
+dojo.forEach(this.cache,function(_1b){
+_1a+=_1b.z;
 });
-return (this.cache.length>1)?_20/this.cache.length:0;
-},render:function(_22){
-var m=dojox.gfx3d.matrix.multiply(_22,this.matrix);
-this.cache=dojo.map(this.object.points,function(_24){
-return dojox.gfx3d.matrix.multiplyPoint(m,_24);
+return (this.cache.length>1)?_1a/this.cache.length:0;
+},render:function(_1c){
+var m=dojox.gfx3d.matrix.multiply(_1c,this.matrix);
+this.cache=dojo.map(this.object.points,function(_1d){
+return dojox.gfx3d.matrix.multiplyPoint(m,_1d);
 });
 },draw:function(){
 var c=this.cache;
@@ -142,8 +142,8 @@ 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(_27){
-p.lineTo(_27.x,_27.y);
+dojo.forEach(c.slice(1),function(_1e){
+p.lineTo(_1e.x,_1e.y);
 });
 if(this.object.style=="loop"){
 p.closePath();
@@ -160,43 +160,43 @@ p.setStroke(this.strokeStyle);
 }});
 dojo.declare("dojox.gfx3d.Orbit",dojox.gfx3d.Object,{constructor:function(){
 this.object=dojo.clone(dojox.gfx3d.defaultOrbit);
-},render:function(_29){
-var m=dojox.gfx3d.matrix.multiply(_29,this.matrix);
-var _2b=[0,Math.PI/4,Math.PI/3];
-var _2c=dojox.gfx3d.matrix.multiplyPoint(m,this.object.center);
-var _2d=dojo.map(_2b,function(_2e){
-return {x:this.center.x+this.radius*Math.cos(_2e),y:this.center.y+this.radius*Math.sin(_2e),z:this.center.z};
+},render:function(_1f){
+var m=dojox.gfx3d.matrix.multiply(_1f,this.matrix);
+var _20=[0,Math.PI/4,Math.PI/3];
+var _21=dojox.gfx3d.matrix.multiplyPoint(m,this.object.center);
+var _22=dojo.map(_20,function(_23){
+return {x:this.center.x+this.radius*Math.cos(_23),y:this.center.y+this.radius*Math.sin(_23),z:this.center.z};
 },this.object);
-_2d=dojo.map(_2d,function(_2f){
-return dojox.gfx3d.matrix.multiplyPoint(m,_2f);
+_22=dojo.map(_22,function(_24){
+return dojox.gfx3d.matrix.multiplyPoint(m,_24);
 });
-var _30=dojox.gfx3d.vector.normalize(_2d);
-_2d=dojo.map(_2d,function(_31){
-return dojox.gfx3d.vector.substract(_31,_2c);
+var _25=dojox.gfx3d.vector.normalize(_22);
+_22=dojo.map(_22,function(_26){
+return dojox.gfx3d.vector.substract(_26,_21);
 });
-var A={xx:_2d[0].x*_2d[0].y,xy:_2d[0].y*_2d[0].y,xz:1,yx:_2d[1].x*_2d[1].y,yy:_2d[1].y*_2d[1].y,yz:1,zx:_2d[2].x*_2d[2].y,zy:_2d[2].y*_2d[2].y,zz:1,dx:0,dy:0,dz:0};
-var B=dojo.map(_2d,function(_34){
-return -Math.pow(_34.x,2);
+var A={xx:_22[0].x*_22[0].y,xy:_22[0].y*_22[0].y,xz:1,yx:_22[1].x*_22[1].y,yy:_22[1].y*_22[1].y,yz:1,zx:_22[2].x*_22[2].y,zy:_22[2].y*_22[2].y,zz:1,dx:0,dy:0,dz:0};
+var B=dojo.map(_22,function(_27){
+return -Math.pow(_27.x,2);
 });
 var X=dojox.gfx3d.matrix.multiplyPoint(dojox.gfx3d.matrix.invert(A),B[0],B[1],B[2]);
-var _36=Math.atan2(X.x,1-X.y)/2;
-var _37=dojo.map(_2d,function(_38){
-return dojox.gfx.matrix.multiplyPoint(dojox.gfx.matrix.rotate(-_36),_38.x,_38.y);
+var _28=Math.atan2(X.x,1-X.y)/2;
+var _29=dojo.map(_22,function(_2a){
+return dojox.gfx.matrix.multiplyPoint(dojox.gfx.matrix.rotate(-_28),_2a.x,_2a.y);
 });
-var a=Math.pow(_37[0].x,2);
-var b=Math.pow(_37[0].y,2);
-var c=Math.pow(_37[1].x,2);
-var d=Math.pow(_37[1].y,2);
+var a=Math.pow(_29[0].x,2);
+var b=Math.pow(_29[0].y,2);
+var c=Math.pow(_29[1].x,2);
+var d=Math.pow(_29[1].y,2);
 var rx=Math.sqrt((a*d-b*c)/(d-b));
 var ry=Math.sqrt((a*d-b*c)/(a-c));
-this.cache={cx:_2c.x,cy:_2c.y,rx:rx,ry:ry,theta:_36,normal:_30};
-},draw:function(_3f){
+this.cache={cx:_21.x,cy:_21.y,rx:rx,ry:ry,theta:_28,normal:_25};
+},draw:function(_2b){
 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(_3f,this.cache.normal));
+this.shape.applyTransform(dojox.gfx.matrix.rotateAt(this.cache.theta,this.cache.cx,this.cache.cy)).setStroke(this.strokeStyle).setFill(this.toStdFill(_2b,this.cache.normal));
 }});
 dojo.declare("dojox.gfx3d.Path3d",dojox.gfx3d.Object,{constructor:function(){
 this.object=dojo.clone(dojox.gfx3d.defaultPath3d);
@@ -204,98 +204,98 @@ this.segments=[];
 this.absolute=true;
 this.last={};
 this.path="";
-},_collectArgs:function(_40,_41){
-for(var i=0;i<_41.length;++i){
-var t=_41[i];
+},_collectArgs:function(_2c,_2d){
+for(var i=0;i<_2d.length;++i){
+var t=_2d[i];
 if(typeof (t)=="boolean"){
-_40.push(t?1:0);
+_2c.push(t?1:0);
 }else{
 if(typeof (t)=="number"){
-_40.push(t);
+_2c.push(t);
 }else{
 if(t instanceof Array){
-this._collectArgs(_40,t);
+this._collectArgs(_2c,t);
 }else{
 if("x" in t&&"y" in t){
-_40.push(t.x);
-_40.push(t.y);
+_2c.push(t.x);
+_2c.push(t.y);
 }
 }
 }
 }
 }
-},_validSegments:{m:3,l:3,z:0},_pushSegment:function(_44,_45){
-var _46=this._validSegments[_44.toLowerCase()],_47;
-if(typeof (_46)=="number"){
-if(_46){
-if(_45.length>=_46){
-_47={action:_44,args:_45.slice(0,_45.length-_45.length%_46)};
-this.segments.push(_47);
+},_validSegments:{m:3,l:3,z:0},_pushSegment:function(_2e,_2f){
+var _30=this._validSegments[_2e.toLowerCase()],_31;
+if(typeof (_30)=="number"){
+if(_30){
+if(_2f.length>=_30){
+_31={action:_2e,args:_2f.slice(0,_2f.length-_2f.length%_30)};
+this.segments.push(_31);
 }
 }else{
-_47={action:_44,args:[]};
-this.segments.push(_47);
+_31={action:_2e,args:[]};
+this.segments.push(_31);
 }
 }
 },moveTo:function(){
-var _48=[];
-this._collectArgs(_48,arguments);
-this._pushSegment(this.absolute?"M":"m",_48);
+var _32=[];
+this._collectArgs(_32,arguments);
+this._pushSegment(this.absolute?"M":"m",_32);
 return this;
 },lineTo:function(){
-var _49=[];
-this._collectArgs(_49,arguments);
-this._pushSegment(this.absolute?"L":"l",_49);
+var _33=[];
+this._collectArgs(_33,arguments);
+this._pushSegment(this.absolute?"L":"l",_33);
 return this;
 },closePath:function(){
 this._pushSegment("Z",[]);
 return this;
-},render:function(_4a){
-var m=dojox.gfx3d.matrix.multiply(_4a,this.matrix);
-var _4c="";
-var _4d=this._validSegments;
-dojo.forEach(this.segments,function(_4e){
-_4c+=_4e.action;
-for(var i=0;i<_4e.args.length;i+=_4d[_4e.action.toLowerCase()]){
-var pt=dojox.gfx3d.matrix.multiplyPoint(m,_4e.args[i],_4e.args[i+1],_4e.args[i+2]);
-_4c+=" "+pt.x+" "+pt.y;
+},render:function(_34){
+var m=dojox.gfx3d.matrix.multiply(_34,this.matrix);
+var _35="";
+var _36=this._validSegments;
+dojo.forEach(this.segments,function(_37){
+_35+=_37.action;
+for(var i=0;i<_37.args.length;i+=_36[_37.action.toLowerCase()]){
+var pt=dojox.gfx3d.matrix.multiplyPoint(m,_37.args[i],_37.args[i+1],_37.args[i+2]);
+_35+=" "+pt.x+" "+pt.y;
 }
 });
-this.cache=_4c;
+this.cache=_35;
 },_draw:function(){
 return this.parent.createPath(this.cache);
 }});
 dojo.declare("dojox.gfx3d.Triangles",dojox.gfx3d.Object,{constructor:function(){
 this.object=dojo.clone(dojox.gfx3d.defaultTriangles);
-},setObject:function(_51,_52){
-if(_51 instanceof Array){
-this.object=dojox.gfx.makeParameters(this.object,{points:_51,style:_52});
+},setObject:function(_38,_39){
+if(_38 instanceof Array){
+this.object=dojox.gfx.makeParameters(this.object,{points:_38,style:_39});
 }else{
-this.object=dojox.gfx.makeParameters(this.object,_51);
+this.object=dojox.gfx.makeParameters(this.object,_38);
 }
 return this;
-},render:function(_53){
-var m=dojox.gfx3d.matrix.multiply(_53,this.matrix);
-var c=dojo.map(this.object.points,function(_56){
-return dojox.gfx3d.matrix.multiplyPoint(m,_56);
+},render:function(_3a){
+var m=dojox.gfx3d.matrix.multiply(_3a,this.matrix);
+var c=dojo.map(this.object.points,function(_3b){
+return dojox.gfx3d.matrix.multiplyPoint(m,_3b);
 });
 this.cache=[];
-var _57=c.slice(0,2);
-var _58=c[0];
+var _3c=c.slice(0,2);
+var _3d=c[0];
 if(this.object.style=="strip"){
-dojo.forEach(c.slice(2),function(_59){
-_57.push(_59);
-_57.push(_57[0]);
-this.cache.push(_57);
-_57=_57.slice(1,3);
+dojo.forEach(c.slice(2),function(_3e){
+_3c.push(_3e);
+_3c.push(_3c[0]);
+this.cache.push(_3c);
+_3c=_3c.slice(1,3);
 },this);
 }else{
 if(this.object.style=="fan"){
-dojo.forEach(c.slice(2),function(_5a){
-_57.push(_5a);
-_57.push(_58);
-this.cache.push(_57);
-_57=[_58,_5a];
+dojo.forEach(c.slice(2),function(_3f){
+_3c.push(_3f);
+_3c.push(_3d);
+this.cache.push(_3c);
+_3c=[_3d,_3f];
 },this);
 }else{
 for(var i=0;i<c.length;){
@@ -304,7 +304,7 @@ i+=3;
 }
 }
 }
-},draw:function(_5c){
+},draw:function(_40){
 this.cache=dojox.gfx3d.scheduler.bsp(this.cache,function(it){
 return it;
 });
@@ -313,33 +313,33 @@ this.shape.clear();
 }else{
 this.shape=this.renderer.createGroup();
 }
-dojo.forEach(this.cache,function(_5e){
-this.shape.createPolyline(_5e).setStroke(this.strokeStyle).setFill(this.toStdFill(_5c,dojox.gfx3d.vector.normalize(_5e)));
+dojo.forEach(this.cache,function(_41){
+this.shape.createPolyline(_41).setStroke(this.strokeStyle).setFill(this.toStdFill(_40,dojox.gfx3d.vector.normalize(_41)));
 },this);
 },getZOrder:function(){
-var _5f=0;
-dojo.forEach(this.cache,function(_60){
-_5f+=(_60[0].z+_60[1].z+_60[2].z)/3;
+var _42=0;
+dojo.forEach(this.cache,function(_43){
+_42+=(_43[0].z+_43[1].z+_43[2].z)/3;
 });
-return (this.cache.length>1)?_5f/this.cache.length:0;
+return (this.cache.length>1)?_42/this.cache.length:0;
 }});
 dojo.declare("dojox.gfx3d.Quads",dojox.gfx3d.Object,{constructor:function(){
 this.object=dojo.clone(dojox.gfx3d.defaultQuads);
-},setObject:function(_61,_62){
-this.object=dojox.gfx.makeParameters(this.object,(_61 instanceof Array)?{points:_61,style:_62}:_61);
+},setObject:function(_44,_45){
+this.object=dojox.gfx.makeParameters(this.object,(_44 instanceof Array)?{points:_44,style:_45}:_44);
 return this;
-},render:function(_63){
-var m=dojox.gfx3d.matrix.multiply(_63,this.matrix),i;
-var c=dojo.map(this.object.points,function(_67){
-return dojox.gfx3d.matrix.multiplyPoint(m,_67);
+},render:function(_46){
+var m=dojox.gfx3d.matrix.multiply(_46,this.matrix),i;
+var c=dojo.map(this.object.points,function(_47){
+return dojox.gfx3d.matrix.multiplyPoint(m,_47);
 });
 this.cache=[];
 if(this.object.style=="strip"){
-var _68=c.slice(0,2);
+var _48=c.slice(0,2);
 for(i=2;i<c.length;){
-_68=_68.concat([c[i],c[i+1],_68[0]]);
-this.cache.push(_68);
-_68=_68.slice(2,4);
+_48=_48.concat([c[i],c[i+1],_48[0]]);
+this.cache.push(_48);
+_48=_48.slice(2,4);
 i+=2;
 }
 }else{
@@ -348,7 +348,7 @@ this.cache.push([c[i],c[i+1],c[i+2],c[i+3],c[i]]);
 i+=4;
 }
 }
-},draw:function(_69){
+},draw:function(_49){
 this.cache=dojox.gfx3d.scheduler.bsp(this.cache,function(it){
 return it;
 });
@@ -358,49 +358,49 @@ this.shape.clear();
 this.shape=this.renderer.createGroup();
 }
 for(var x=0;x<this.cache.length;x++){
-this.shape.createPolyline(this.cache[x]).setStroke(this.strokeStyle).setFill(this.toStdFill(_69,dojox.gfx3d.vector.normalize(this.cache[x])));
+this.shape.createPolyline(this.cache[x]).setStroke(this.strokeStyle).setFill(this.toStdFill(_49,dojox.gfx3d.vector.normalize(this.cache[x])));
 }
 },getZOrder:function(){
-var _6c=0;
+var _4a=0;
 for(var x=0;x<this.cache.length;x++){
 var i=this.cache[x];
-_6c+=(i[0].z+i[1].z+i[2].z+i[3].z)/4;
+_4a+=(i[0].z+i[1].z+i[2].z+i[3].z)/4;
 }
-return (this.cache.length>1)?_6c/this.cache.length:0;
+return (this.cache.length>1)?_4a/this.cache.length:0;
 }});
 dojo.declare("dojox.gfx3d.Polygon",dojox.gfx3d.Object,{constructor:function(){
 this.object=dojo.clone(dojox.gfx3d.defaultPolygon);
-},setObject:function(_6f){
-this.object=dojox.gfx.makeParameters(this.object,(_6f instanceof Array)?{path:_6f}:_6f);
+},setObject:function(_4b){
+this.object=dojox.gfx.makeParameters(this.object,(_4b instanceof Array)?{path:_4b}:_4b);
 return this;
-},render:function(_70){
-var m=dojox.gfx3d.matrix.multiply(_70,this.matrix);
-this.cache=dojo.map(this.object.path,function(_72){
-return dojox.gfx3d.matrix.multiplyPoint(m,_72);
+},render:function(_4c){
+var m=dojox.gfx3d.matrix.multiply(_4c,this.matrix);
+this.cache=dojo.map(this.object.path,function(_4d){
+return dojox.gfx3d.matrix.multiplyPoint(m,_4d);
 });
 this.cache.push(this.cache[0]);
-},draw:function(_73){
+},draw:function(_4e){
 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(_73,dojox.gfx3d.matrix.normalize(this.cache)));
+this.shape.setStroke(this.strokeStyle).setFill(this.toStdFill(_4e,dojox.gfx3d.matrix.normalize(this.cache)));
 },getZOrder:function(){
-var _74=0;
+var _4f=0;
 for(var x=0;x<this.cache.length;x++){
-_74+=this.cache[x].z;
+_4f+=this.cache[x].z;
 }
-return (this.cache.length>1)?_74/this.cache.length:0;
+return (this.cache.length>1)?_4f/this.cache.length:0;
 },getOutline:function(){
 return this.cache.slice(0,3);
 }});
 dojo.declare("dojox.gfx3d.Cube",dojox.gfx3d.Object,{constructor:function(){
 this.object=dojo.clone(dojox.gfx3d.defaultCube);
 this.polygons=[];
-},setObject:function(_76){
-this.object=dojox.gfx.makeParameters(this.object,_76);
-},render:function(_77){
+},setObject:function(_50){
+this.object=dojox.gfx.makeParameters(this.object,_50);
+},render:function(_51){
 var a=this.object.top;
 var g=this.object.bottom;
 var b={x:g.x,y:a.y,z:a.z};
@@ -409,10 +409,10 @@ 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 _80=[a,b,c,d,e,f,g,h];
-var m=dojox.gfx3d.matrix.multiply(_77,this.matrix);
-var p=dojo.map(_80,function(_83){
-return dojox.gfx3d.matrix.multiplyPoint(m,_83);
+var _52=[a,b,c,d,e,f,g,h];
+var m=dojox.gfx3d.matrix.multiply(_51,this.matrix);
+var p=dojo.map(_52,function(_53){
+return dojox.gfx3d.matrix.multiplyPoint(m,_53);
 });
 a=p[0];
 b=p[1];
@@ -423,78 +423,78 @@ 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(_84){
+},draw:function(_54){
 this.cache=dojox.gfx3d.scheduler.bsp(this.cache,function(it){
 return it;
 });
-var _86=this.cache.slice(3);
+var _55=this.cache.slice(3);
 if(this.shape){
 this.shape.clear();
 }else{
 this.shape=this.renderer.createGroup();
 }
-for(var x=0;x<_86.length;x++){
-this.shape.createPolyline(_86[x]).setStroke(this.strokeStyle).setFill(this.toStdFill(_84,dojox.gfx3d.vector.normalize(_86[x])));
+for(var x=0;x<_55.length;x++){
+this.shape.createPolyline(_55[x]).setStroke(this.strokeStyle).setFill(this.toStdFill(_54,dojox.gfx3d.vector.normalize(_55[x])));
 }
 },getZOrder:function(){
 var top=this.cache[0][0];
-var _89=this.cache[1][2];
-return (top.z+_89.z)/2;
+var _56=this.cache[1][2];
+return (top.z+_56.z)/2;
 }});
 dojo.declare("dojox.gfx3d.Cylinder",dojox.gfx3d.Object,{constructor:function(){
 this.object=dojo.clone(dojox.gfx3d.defaultCylinder);
-},render:function(_8a){
-var m=dojox.gfx3d.matrix.multiply(_8a,this.matrix);
-var _8c=[0,Math.PI/4,Math.PI/3];
-var _8d=dojox.gfx3d.matrix.multiplyPoint(m,this.object.center);
-var _8e=dojo.map(_8c,function(_8f){
-return {x:this.center.x+this.radius*Math.cos(_8f),y:this.center.y+this.radius*Math.sin(_8f),z:this.center.z};
+},render:function(_57){
+var m=dojox.gfx3d.matrix.multiply(_57,this.matrix);
+var _58=[0,Math.PI/4,Math.PI/3];
+var _59=dojox.gfx3d.matrix.multiplyPoint(m,this.object.center);
+var _5a=dojo.map(_58,function(_5b){
+return {x:this.center.x+this.radius*Math.cos(_5b),y:this.center.y+this.radius*Math.sin(_5b),z:this.center.z};
 },this.object);
-_8e=dojo.map(_8e,function(_90){
-return dojox.gfx3d.vector.substract(dojox.gfx3d.matrix.multiplyPoint(m,_90),_8d);
+_5a=dojo.map(_5a,function(_5c){
+return dojox.gfx3d.vector.substract(dojox.gfx3d.matrix.multiplyPoint(m,_5c),_59);
 });
-var A={xx:_8e[0].x*_8e[0].y,xy:_8e[0].y*_8e[0].y,xz:1,yx:_8e[1].x*_8e[1].y,yy:_8e[1].y*_8e[1].y,yz:1,zx:_8e[2].x*_8e[2].y,zy:_8e[2].y*_8e[2].y,zz:1,dx:0,dy:0,dz:0};
-var B=dojo.map(_8e,function(_93){
-return -Math.pow(_93.x,2);
+var A={xx:_5a[0].x*_5a[0].y,xy:_5a[0].y*_5a[0].y,xz:1,yx:_5a[1].x*_5a[1].y,yy:_5a[1].y*_5a[1].y,yz:1,zx:_5a[2].x*_5a[2].y,zy:_5a[2].y*_5a[2].y,zz:1,dx:0,dy:0,dz:0};
+var B=dojo.map(_5a,function(_5d){
+return -Math.pow(_5d.x,2);
 });
 var X=dojox.gfx3d.matrix.multiplyPoint(dojox.gfx3d.matrix.invert(A),B[0],B[1],B[2]);
-var _95=Math.atan2(X.x,1-X.y)/2;
-var _96=dojo.map(_8e,function(_97){
-return dojox.gfx.matrix.multiplyPoint(dojox.gfx.matrix.rotate(-_95),_97.x,_97.y);
+var _5e=Math.atan2(X.x,1-X.y)/2;
+var _5f=dojo.map(_5a,function(_60){
+return dojox.gfx.matrix.multiplyPoint(dojox.gfx.matrix.rotate(-_5e),_60.x,_60.y);
 });
-var a=Math.pow(_96[0].x,2);
-var b=Math.pow(_96[0].y,2);
-var c=Math.pow(_96[1].x,2);
-var d=Math.pow(_96[1].y,2);
+var a=Math.pow(_5f[0].x,2);
+var b=Math.pow(_5f[0].y,2);
+var c=Math.pow(_5f[1].x,2);
+var d=Math.pow(_5f[1].y,2);
 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;
-_95-=Math.PI/2;
+_5e-=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 _a0=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(_95)){
-rx=this.object.radius,ry=0,_95=0;
+var _61=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(_5e)){
+rx=this.object.radius,ry=0,_5e=0;
 }
-this.cache={center:_8d,top:top,rx:rx,ry:ry,theta:_95,gradient:_a0};
+this.cache={center:_59,top:top,rx:rx,ry:ry,theta:_5e,gradient:_61};
 },draw:function(){
-var c=this.cache,v=dojox.gfx3d.vector,m=dojox.gfx.matrix,_a4=[c.center,c.top],_a5=v.substract(c.top,c.center);
-if(v.dotProduct(_a5,this.renderer.lighting.incident)>0){
-_a4=[c.top,c.center];
-_a5=v.substract(c.center,c.top);
+var c=this.cache,v=dojox.gfx3d.vector,m=dojox.gfx.matrix,_62=[c.center,c.top],_63=v.substract(c.top,c.center);
+if(v.dotProduct(_63,this.renderer.lighting.incident)>0){
+_62=[c.top,c.center];
+_63=v.substract(c.center,c.top);
 }
-var _a6=this.renderer.lighting[this.fillStyle.type](_a5,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));
+var _64=this.renderer.lighting[this.fillStyle.type](_63,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(_a4[0]),m.rotate(Math.atan2(_a4[1].y-_a4[0].y,_a4[1].x-_a4[0].x))]);
+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(_62[0]),m.rotate(Math.atan2(_62[1].y-_62[0].y,_62[1].x-_62[0].x))]);
 if(c.rx>0&&c.ry>0){
-this.shape.createEllipse({cx:_a4[1].x,cy:_a4[1].y,rx:c.rx,ry:c.ry}).setFill(_a6).setStroke(this.strokeStyle).applyTransform(m.rotateAt(c.theta,_a4[1]));
+this.shape.createEllipse({cx:_62[1].x,cy:_62[1].y,rx:c.rx,ry:c.ry}).setFill(_64).setStroke(this.strokeStyle).applyTransform(m.rotateAt(c.theta,_62[1]));
 }
 }});
 dojo.declare("dojox.gfx3d.Viewport",dojox.gfx.Group,{constructor:function(){
@@ -507,29 +507,29 @@ this.draw=dojox.gfx3d.drawer.conservative;
 this.deep=false;
 this.lights=[];
 this.lighting=null;
-},setCameraTransform:function(_a8){
-this.camera=dojox.gfx3d.matrix.clone(_a8?dojox.gfx3d.matrix.normalize(_a8):dojox.gfx3d.identity,true);
+},setCameraTransform:function(_65){
+this.camera=dojox.gfx3d.matrix.clone(_65?dojox.gfx3d.matrix.normalize(_65):dojox.gfx3d.identity,true);
 this.invalidate();
 return this;
-},applyCameraRightTransform:function(_a9){
-return _a9?this.setCameraTransform([this.camera,_a9]):this;
-},applyCameraLeftTransform:function(_aa){
-return _aa?this.setCameraTransform([_aa,this.camera]):this;
-},applyCameraTransform:function(_ab){
-return this.applyCameraRightTransform(_ab);
-},setLights:function(_ac,_ad,_ae){
-this.lights=(_ac instanceof Array)?{sources:_ac,ambient:_ad,specular:_ae}:_ac;
-var _af={x:0,y:0,z:1};
-this.lighting=new dojox.gfx3d.lighting.Model(_af,this.lights.sources,this.lights.ambient,this.lights.specular);
+},applyCameraRightTransform:function(_66){
+return _66?this.setCameraTransform([this.camera,_66]):this;
+},applyCameraLeftTransform:function(_67){
+return _67?this.setCameraTransform([_67,this.camera]):this;
+},applyCameraTransform:function(_68){
+return this.applyCameraRightTransform(_68);
+},setLights:function(_69,_6a,_6b){
+this.lights=(_69 instanceof Array)?{sources:_69,ambient:_6a,specular:_6b}:_69;
+var _6c={x:0,y:0,z:1};
+this.lighting=new dojox.gfx3d.lighting.Model(_6c,this.lights.sources,this.lights.ambient,this.lights.specular);
 this.invalidate();
 return this;
-},addLights:function(_b0){
-return this.setLights(this.lights.sources.concat(_b0));
-},addTodo:function(_b1){
-if(dojo.every(this.todos,function(_b2){
-return _b2!=_b1;
+},addLights:function(_6d){
+return this.setLights(this.lights.sources.concat(_6d));
+},addTodo:function(_6e){
+if(dojo.every(this.todos,function(_6f){
+return _6f!=_6e;
 })){
-this.todos.push(_b1);
+this.todos.push(_6e);
 }
 },invalidate:function(){
 this.deep=true;
@@ -559,29 +559,29 @@ this.todos=[];
 this.deep=false;
 }});
 dojox.gfx3d.Viewport.nodeType=dojox.gfx.Group.nodeType;
-dojox.gfx3d._creators={createEdges:function(_b9,_ba){
-return this.create3DObject(dojox.gfx3d.Edges,_b9,_ba);
-},createTriangles:function(_bb,_bc){
-return this.create3DObject(dojox.gfx3d.Triangles,_bb,_bc);
-},createQuads:function(_bd,_be){
-return this.create3DObject(dojox.gfx3d.Quads,_bd,_be);
-},createPolygon:function(_bf){
-return this.create3DObject(dojox.gfx3d.Polygon,_bf);
-},createOrbit:function(_c0){
-return this.create3DObject(dojox.gfx3d.Orbit,_c0);
-},createCube:function(_c1){
-return this.create3DObject(dojox.gfx3d.Cube,_c1);
-},createCylinder:function(_c2){
-return this.create3DObject(dojox.gfx3d.Cylinder,_c2);
-},createPath3d:function(_c3){
-return this.create3DObject(dojox.gfx3d.Path3d,_c3);
+dojox.gfx3d._creators={createEdges:function(_70,_71){
+return this.create3DObject(dojox.gfx3d.Edges,_70,_71);
+},createTriangles:function(_72,_73){
+return this.create3DObject(dojox.gfx3d.Triangles,_72,_73);
+},createQuads:function(_74,_75){
+return this.create3DObject(dojox.gfx3d.Quads,_74,_75);
+},createPolygon:function(_76){
+return this.create3DObject(dojox.gfx3d.Polygon,_76);
+},createOrbit:function(_77){
+return this.create3DObject(dojox.gfx3d.Orbit,_77);
+},createCube:function(_78){
+return this.create3DObject(dojox.gfx3d.Cube,_78);
+},createCylinder:function(_79){
+return this.create3DObject(dojox.gfx3d.Cylinder,_79);
+},createPath3d:function(_7a){
+return this.create3DObject(dojox.gfx3d.Path3d,_7a);
 },createScene:function(){
 return this.create3DObject(dojox.gfx3d.Scene);
-},create3DObject:function(_c4,_c5,_c6){
-var obj=new _c4();
+},create3DObject:function(_7b,_7c,_7d){
+var obj=new _7b();
 this.adopt(obj);
-if(_c5){
-obj.setObject(_c5,_c6);
+if(_7c){
+obj.setObject(_7c,_7d);
 }
 return obj;
 },adopt:function(obj){
@@ -590,7 +590,7 @@ obj.parent=this;
 this.objects.push(obj);
 this.addTodo(obj);
 return this;
-},abandon:function(obj,_ca){
+},abandon:function(obj,_7e){
 for(var i=0;i<this.objects.length;++i){
 if(this.objects[i]==obj){
 this.objects.splice(i,1);
@@ -598,17 +598,17 @@ this.objects.splice(i,1);
 }
 obj.parent=null;
 return this;
-},setScheduler:function(_cc){
-this.schedule=_cc;
-},setDrawer:function(_cd){
-this.draw=_cd;
+},setScheduler:function(_7f){
+this.schedule=_7f;
+},setDrawer:function(_80){
+this.draw=_80;
 }};
 dojo.extend(dojox.gfx3d.Viewport,dojox.gfx3d._creators);
 dojo.extend(dojox.gfx3d.Scene,dojox.gfx3d._creators);
 delete dojox.gfx3d._creators;
 dojo.extend(dojox.gfx.Surface,{createViewport:function(){
-var _ce=this.createObject(dojox.gfx3d.Viewport,null,true);
-_ce.setDimensions(this.getDimensions());
-return _ce;
+var _81=this.createObject(dojox.gfx3d.Viewport,null,true);
+_81.setDimensions(this.getDimensions());
+return _81;
 }});
 }
diff --git a/dojox/gfx3d/scheduler.js b/dojox/gfx3d/scheduler.js
index 637aad3..8d18a91 100644
--- a/dojox/gfx3d/scheduler.js
+++ b/dojox/gfx3d/scheduler.js
@@ -16,78 +16,78 @@ _1.sort(function(a,b){
 return _2(b)-_2(a);
 });
 return _1;
-},bsp:function(_5,_6){
-_6=_6?_6:dojox.gfx3d.scheduler.outline;
-var p=new dojox.gfx3d.scheduler.BinarySearchTree(_5[0],_6);
-dojo.forEach(_5.slice(1),function(_8){
-p.add(_8,_6);
+},bsp:function(_3,_4){
+_4=_4?_4:dojox.gfx3d.scheduler.outline;
+var p=new dojox.gfx3d.scheduler.BinarySearchTree(_3[0],_4);
+dojo.forEach(_3.slice(1),function(_5){
+p.add(_5,_4);
 });
-return p.iterate(_6);
+return p.iterate(_4);
 },order:function(it){
 return it.getZOrder();
 },outline:function(it){
 return it.getOutline();
 }});
-dojo.declare("dojox.gfx3d.scheduler.BinarySearchTree",null,{constructor:function(_b,_c){
+dojo.declare("dojox.gfx3d.scheduler.BinarySearchTree",null,{constructor:function(_6,_7){
 this.plus=null;
 this.minus=null;
-this.object=_b;
-var o=_c(_b);
+this.object=_6;
+var o=_7(_6);
 this.orient=o[0];
 this.normal=dojox.gfx3d.vector.normalize(o);
-},add:function(_e,_f){
-var _10=0.5,o=_f(_e),v=dojox.gfx3d.vector,n=this.normal,a=this.orient,BST=dojox.gfx3d.scheduler.BinarySearchTree;
-if(dojo.every(o,function(_16){
-return Math.floor(_10+v.dotProduct(n,v.substract(_16,a)))<=0;
+},add:function(_8,_9){
+var _a=0.5,o=_9(_8),v=dojox.gfx3d.vector,n=this.normal,a=this.orient,_b=dojox.gfx3d.scheduler.BinarySearchTree;
+if(dojo.every(o,function(_c){
+return Math.floor(_a+v.dotProduct(n,v.substract(_c,a)))<=0;
 })){
 if(this.minus){
-this.minus.add(_e,_f);
+this.minus.add(_8,_9);
 }else{
-this.minus=new BST(_e,_f);
+this.minus=new _b(_8,_9);
 }
 }else{
-if(dojo.every(o,function(_17){
-return Math.floor(_10+v.dotProduct(n,v.substract(_17,a)))>=0;
+if(dojo.every(o,function(_d){
+return Math.floor(_a+v.dotProduct(n,v.substract(_d,a)))>=0;
 })){
 if(this.plus){
-this.plus.add(_e,_f);
+this.plus.add(_8,_9);
 }else{
-this.plus=new BST(_e,_f);
+this.plus=new _b(_8,_9);
 }
 }else{
 throw "The case: polygon cross siblings' plate is not implemneted yet";
 }
 }
-},iterate:function(_18){
-var _19=0.5;
+},iterate:function(_e){
+var _f=0.5;
 var v=dojox.gfx3d.vector;
-var _1b=[];
-var _1c=null;
-var _1d={x:0,y:0,z:-10000};
-if(Math.floor(_19+v.dotProduct(this.normal,v.substract(_1d,this.orient)))<=0){
-_1c=[this.plus,this.minus];
+var _10=[];
+var _11=null;
+var _12={x:0,y:0,z:-10000};
+if(Math.floor(_f+v.dotProduct(this.normal,v.substract(_12,this.orient)))<=0){
+_11=[this.plus,this.minus];
 }else{
-_1c=[this.minus,this.plus];
+_11=[this.minus,this.plus];
 }
-if(_1c[0]){
-_1b=_1b.concat(_1c[0].iterate());
+if(_11[0]){
+_10=_10.concat(_11[0].iterate());
 }
-_1b.push(this.object);
-if(_1c[1]){
-_1b=_1b.concat(_1c[1].iterate());
+_10.push(this.object);
+if(_11[1]){
+_10=_10.concat(_11[1].iterate());
 }
-return _1b;
+return _10;
 }});
-dojo.mixin(dojox.gfx3d.drawer,{conservative:function(_1e,_1f,_20){
-dojo.forEach(this.objects,function(_21){
-_21.destroy();
+dojo.mixin(dojox.gfx3d.drawer,{conservative:function(_13,_14,_15){
+dojo.forEach(this.objects,function(_16){
+_16.destroy();
 });
-dojo.forEach(_1f,function(_22){
-_22.draw(_20.lighting);
+dojo.forEach(_14,function(_17){
+_17.draw(_15.lighting);
 });
-},chart:function(_23,_24,_25){
-dojo.forEach(this.todos,function(_26){
-_26.draw(_25.lighting);
+},chart:function(_18,_19,_1a){
+dojo.forEach(this.todos,function(_1b){
+_1b.draw(_1a.lighting);
 });
 }});
 }
diff --git a/dojox/gfx3d/vector.js b/dojox/gfx3d/vector.js
index a1930cd..c2444e4 100644
--- a/dojox/gfx3d/vector.js
+++ b/dojox/gfx3d/vector.js
@@ -10,10 +10,10 @@ dojo._hasResource["dojox.gfx3d.vector"]=true;
 dojo.provide("dojox.gfx3d.vector");
 dojo.mixin(dojox.gfx3d.vector,{sum:function(){
 var v={x:0,y:0,z:0};
-dojo.forEach(arguments,function(_2){
-v.x+=_2.x;
-v.y+=_2.y;
-v.z+=_2.z;
+dojo.forEach(arguments,function(_1){
+v.x+=_1.x;
+v.y+=_1.y;
+v.z+=_1.z;
 });
 return v;
 },center:function(){
@@ -28,8 +28,8 @@ return {x:a.x-b.x,y:a.y-b.y,z:a.z-b.z};
 },_crossProduct:function(x,y,z,u,v,w){
 return {x:y*w-z*v,y:z*u-x*w,z:x*v-y*u};
 },crossProduct:function(a,b,c,d,e,f){
-if(arguments.length==6&&dojo.every(arguments,function(_13){
-return typeof _13=="number";
+if(arguments.length==6&&dojo.every(arguments,function(_2){
+return typeof _2=="number";
 })){
 return dojox.gfx3d.vector._crossProduct(a,b,c,d,e,f);
 }
@@ -37,8 +37,8 @@ return dojox.gfx3d.vector._crossProduct(a.x,a.y,a.z,b.x,b.y,b.z);
 },_dotProduct:function(x,y,z,u,v,w){
 return x*u+y*v+z*w;
 },dotProduct:function(a,b,c,d,e,f){
-if(arguments.length==6&&dojo.every(arguments,function(_20){
-return typeof _20=="number";
+if(arguments.length==6&&dojo.every(arguments,function(_3){
+return typeof _3=="number";
 })){
 return dojox.gfx3d.vector._dotProduct(a,b,c,d,e,f);
 }
diff --git a/dojox/grid/DataGrid.js b/dojox/grid/DataGrid.js
index 69f19da..2e26948 100644
--- a/dojox/grid/DataGrid.js
+++ b/dojox/grid/DataGrid.js
@@ -13,4 +13,4 @@
 	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.doc;if(_1.selection){var s=_1.selection;if(s.type=="Text"){return !s.createRange().htmlText.length;}else{return !s.createRange().length;}}else{var _3=dojo.global;var _4=_3.getSelection();if(dojo.isString(_4)){return !_4;}else{return !_4||_4.isCollapsed||!_4.toString();}}},getBookmark:f [...]
+if(!dojo._hasResource["dijit._base.manager"]){dojo._hasResource["dijit._base.manager"]=true;dojo.provide("dijit._base.manager");dojo.declare("dijit.WidgetSet",null,{constructor:function(){this._hash={};this.length=0;},add:function(_1){if(this._hash[_1.id]){throw new Error("Tried to register widget with id=="+_1.id+" but that id is already registered");}this._hash[_1.id]=_1;this.length++;},remove:function(id){if(this._hash[id]){delete this._hash[id];this.length--;}},forEach:function(_2,_3 [...]
diff --git a/dojox/grid/DataGrid.js.uncompressed.js b/dojox/grid/DataGrid.js.uncompressed.js
index 73abb88..fc425be 100644
--- a/dojox/grid/DataGrid.js.uncompressed.js
+++ b/dojox/grid/DataGrid.js.uncompressed.js
@@ -13,25 +13,465 @@
 	for documentation and information on getting the source.
 */
 
+if(!dojo._hasResource["dijit._base.manager"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dijit._base.manager"] = true;
+dojo.provide("dijit._base.manager");
+
+dojo.declare("dijit.WidgetSet", null, {
+	// summary:
+	//		A set of widgets indexed by id. A default instance of this class is
+	//		available as `dijit.registry`
+	//
+	// example:
+	//		Create a small list of widgets:
+	//		|	var ws = new dijit.WidgetSet();
+	//		|	ws.add(dijit.byId("one"));
+	//		| 	ws.add(dijit.byId("two"));
+	//		|	// destroy both:
+	//		|	ws.forEach(function(w){ w.destroy(); });
+	//
+	// example:
+	//		Using dijit.registry:
+	//		|	dijit.registry.forEach(function(w){ /* do something */ });
+
+	constructor: function(){
+		this._hash = {};
+		this.length = 0;
+	},
+
+	add: function(/*dijit._Widget*/ widget){
+		// summary:
+		//		Add a widget to this list. If a duplicate ID is detected, a error is thrown.
+		//
+		// widget: dijit._Widget
+		//		Any dijit._Widget subclass.
+		if(this._hash[widget.id]){
+			throw new Error("Tried to register widget with id==" + widget.id + " but that id is already registered");
+		}
+		this._hash[widget.id] = widget;
+		this.length++;
+	},
+
+	remove: function(/*String*/ id){
+		// summary:
+		//		Remove a widget from this WidgetSet. Does not destroy the widget; simply
+		//		removes the reference.
+		if(this._hash[id]){
+			delete this._hash[id];
+			this.length--;
+		}
+	},
+
+	forEach: function(/*Function*/ func, /* Object? */thisObj){
+		// summary:
+		//		Call specified function for each widget in this set.
+		//
+		// func:
+		//		A callback function to run for each item. Is passed the widget, the index
+		//		in the iteration, and the full hash, similar to `dojo.forEach`.
+		//
+		// thisObj:
+		//		An optional scope parameter
+		//
+		// example:
+		//		Using the default `dijit.registry` instance:
+		//		|	dijit.registry.forEach(function(widget){
+		//		|		console.log(widget.declaredClass);
+		//		|	});
+		//
+		// returns:
+		//		Returns self, in order to allow for further chaining.
+
+		thisObj = thisObj || dojo.global;
+		var i = 0, id;
+		for(id in this._hash){
+			func.call(thisObj, this._hash[id], i++, this._hash);
+		}
+		return this;	// dijit.WidgetSet
+	},
+
+	filter: function(/*Function*/ filter, /* Object? */thisObj){
+		// summary:
+		//		Filter down this WidgetSet to a smaller new WidgetSet
+		//		Works the same as `dojo.filter` and `dojo.NodeList.filter`
+		//
+		// filter:
+		//		Callback function to test truthiness. Is passed the widget
+		//		reference and the pseudo-index in the object.
+		//
+		// thisObj: Object?
+		//		Option scope to use for the filter function.
+		//
+		// example:
+		//		Arbitrary: select the odd widgets in this list
+		//		|	dijit.registry.filter(function(w, i){
+		//		|		return i % 2 == 0;
+		//		|	}).forEach(function(w){ /* odd ones */ });
+
+		thisObj = thisObj || dojo.global;
+		var res = new dijit.WidgetSet(), i = 0, id;
+		for(id in this._hash){
+			var w = this._hash[id];
+			if(filter.call(thisObj, w, i++, this._hash)){
+				res.add(w);
+			}
+		}
+		return res; // dijit.WidgetSet
+	},
+
+	byId: function(/*String*/ id){
+		// summary:
+		//		Find a widget in this list by it's id.
+		// example:
+		//		Test if an id is in a particular WidgetSet
+		//		| var ws = new dijit.WidgetSet();
+		//		| ws.add(dijit.byId("bar"));
+		//		| var t = ws.byId("bar") // returns a widget
+		//		| var x = ws.byId("foo"); // returns undefined
+
+		return this._hash[id];	// dijit._Widget
+	},
+
+	byClass: function(/*String*/ cls){
+		// summary:
+		//		Reduce this widgetset to a new WidgetSet of a particular `declaredClass`
+		//
+		// cls: String
+		//		The Class to scan for. Full dot-notated string.
+		//
+		// example:
+		//		Find all `dijit.TitlePane`s in a page:
+		//		|	dijit.registry.byClass("dijit.TitlePane").forEach(function(tp){ tp.close(); });
+
+		var res = new dijit.WidgetSet(), id, widget;
+		for(id in this._hash){
+			widget = this._hash[id];
+			if(widget.declaredClass == cls){
+				res.add(widget);
+			}
+		 }
+		 return res; // dijit.WidgetSet
+},
+
+	toArray: function(){
+		// summary:
+		//		Convert this WidgetSet into a true Array
+		//
+		// example:
+		//		Work with the widget .domNodes in a real Array
+		//		|	dojo.map(dijit.registry.toArray(), function(w){ return w.domNode; });
+
+		var ar = [];
+		for(var id in this._hash){
+			ar.push(this._hash[id]);
+		}
+		return ar;	// dijit._Widget[]
+},
+
+	map: function(/* Function */func, /* Object? */thisObj){
+		// summary:
+		//		Create a new Array from this WidgetSet, following the same rules as `dojo.map`
+		// example:
+		//		|	var nodes = dijit.registry.map(function(w){ return w.domNode; });
+		//
+		// returns:
+		//		A new array of the returned values.
+		return dojo.map(this.toArray(), func, thisObj); // Array
+	},
+
+	every: function(func, thisObj){
+		// summary:
+		// 		A synthetic clone of `dojo.every` acting explictly on this WidgetSet
+		//
+		// func: Function
+		//		A callback function run for every widget in this list. Exits loop
+		//		when the first false return is encountered.
+		//
+		// thisObj: Object?
+		//		Optional scope parameter to use for the callback
+
+		thisObj = thisObj || dojo.global;
+		var x = 0, i;
+		for(i in this._hash){
+			if(!func.call(thisObj, this._hash[i], x++, this._hash)){
+				return false; // Boolean
+			}
+		}
+		return true; // Boolean
+	},
+
+	some: function(func, thisObj){
+		// summary:
+		// 		A synthetic clone of `dojo.some` acting explictly on this WidgetSet
+		//
+		// func: Function
+		//		A callback function run for every widget in this list. Exits loop
+		//		when the first true return is encountered.
+		//
+		// thisObj: Object?
+		//		Optional scope parameter to use for the callback
+
+		thisObj = thisObj || dojo.global;
+		var x = 0, i;
+		for(i in this._hash){
+			if(func.call(thisObj, this._hash[i], x++, this._hash)){
+				return true; // Boolean
+			}
+		}
+		return false; // Boolean
+	}
+
+});
+
+/*=====
+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
+};
+
+dijit.findWidgets = function(/*DomNode*/ root){
+	// summary:
+	//		Search subtree under root returning widgets found.
+	//		Doesn't search for nested widgets (ie, widgets inside other widgets).
+
+	var outAry = [];
+
+	function getChildrenHelper(root){
+		for(var node = root.firstChild; node; node = node.nextSibling){
+			if(node.nodeType == 1){
+				var widgetId = node.getAttribute("widgetId");
+				if(widgetId){
+					var widget = dijit.byId(widgetId);
+					outAry.push(widget);
+				}else{
+					getChildrenHelper(node);
+				}
+			}
+		}
+	}
+
+	getChildrenHelper(root);
+	return outAry;
+};
+
+dijit._destroyAll = function(){
+	// summary:
+	//		Code to destroy all widgets and do other cleanup on page unload
+
+	// Clean up focus manager lingering references to widgets and nodes
+	dijit._curFocus = null;
+	dijit._prevFocus = null;
+	dijit._activeStack = [];
+
+	// Destroy all the widgets, top down
+	dojo.forEach(dijit.findWidgets(dojo.body()), function(widget){
+		// Avoid double destroy of widgets like Menu that are attached to <body>
+		// even though they are logically children of other widgets.
+		if(!widget._destroyed){
+			if(widget.destroyRecursive){
+				widget.destroyRecursive();
+			}else if(widget.destroy){
+				widget.destroy();
+			}
+		}
+	});
+};
+
+if(dojo.isIE){
+	// Only run _destroyAll() for IE because we think it's only necessary in that case,
+	// and because it causes problems on FF.  See bug #3531 for details.
+	dojo.addOnWindowUnload(function(){
+		dijit._destroyAll();
+	});
+}
+
+dijit.byId = function(/*String|Widget*/id){
+	// summary:
+	//		Returns a widget by it's id, or if passed a widget, no-op (like dojo.byId())
+	return typeof id == "string" ? dijit.registry._hash[id] : id; // dijit._Widget
+};
+
+dijit.byNode = function(/* DOMNode */ node){
+	// summary:
+	//		Returns the widget corresponding to the given DOMNode
+	return dijit.registry.byId(node.getAttribute("widgetId")); // dijit._Widget
+};
+
+dijit.getEnclosingWidget = function(/* DOMNode */ node){
+	// summary:
+	//		Returns the widget whose DOM tree contains the specified DOMNode, or null if
+	//		the node is not contained within the DOM tree of any widget
+	while(node){
+		var id = node.getAttribute && node.getAttribute("widgetId");
+		if(id){
+			return dijit.byId(id);
+		}
+		node = node.parentNode;
+	}
+	return null;
+};
+
+dijit._isElementShown = function(/*Element*/elem){
+	var style = dojo.style(elem);
+	return (style.visibility != "hidden")
+		&& (style.visibility != "collapsed")
+		&& (style.display != "none")
+		&& (dojo.attr(elem, "type") != "hidden");
+}
+
+dijit.isTabNavigable = function(/*Element*/elem){
+	// summary:
+	//		Tests if an element is tab-navigable
+
+	// TODO: convert (and rename method) to return effectivite tabIndex; will save time in _getTabNavigable()
+	if(dojo.attr(elem, "disabled")){
+		return false;
+	}else if(dojo.hasAttr(elem, "tabIndex")){
+		// Explicit tab index setting
+		return dojo.attr(elem, "tabIndex") >= 0; // boolean
+	}else{
+		// No explicit tabIndex setting, need to investigate node type
+		switch(elem.nodeName.toLowerCase()){
+			case "a":
+				// An <a> w/out a tabindex is only navigable if it has an href
+				return dojo.hasAttr(elem, "href");
+			case "area":
+			case "button":
+			case "input":
+			case "object":
+			case "select":
+			case "textarea":
+				// These are navigable by default
+				return true;
+			case "iframe":
+				// If it's an editor <iframe> then it's tab navigable.
+				if(dojo.isMoz){
+					return elem.contentDocument.designMode == "on";
+				}else if(dojo.isWebKit){
+					var doc = elem.contentDocument,
+						body = doc && doc.body;
+					return body && body.contentEditable == 'true';
+				}else{
+					doc = elem.contentWindow.document;
+					body = doc && doc.body;
+					return body && body.firstChild && body.firstChild.contentEditable == 'true';
+				}
+			default:
+				return elem.contentEditable == 'true';
+		}
+	}
+};
+
+dijit._getTabNavigable = function(/*DOMNode*/root){
+	// summary:
+	//		Finds descendants of the specified root node.
+	//
+	// description:
+	//		Finds the following descendants of the specified root node:
+	//		* the first tab-navigable element in document order
+	//		  without a tabIndex or with tabIndex="0"
+	//		* the last tab-navigable element in document order
+	//		  without a tabIndex or with tabIndex="0"
+	//		* the first element in document order with the lowest
+	//		  positive tabIndex value
+	//		* the last element in document order with the highest
+	//		  positive tabIndex value
+	var first, last, lowest, lowestTabindex, highest, highestTabindex;
+	var walkTree = function(/*DOMNode*/parent){
+		dojo.query("> *", parent).forEach(function(child){
+			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 && child.nodeName.toUpperCase() != 'SELECT'){ 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; // DomNode
+};
+
+dijit.getLastInTabbingOrder = function(/*String|DOMNode*/root){
+	// summary:
+	//		Finds the descendant of the specified root node
+	//		that is last in the tabbing order
+	var elems = dijit._getTabNavigable(dojo.byId(root));
+	return elems.last ? elems.last : elems.highest; // DomNode
+};
+
+/*=====
+dojo.mixin(dijit, {
+	// defaultDuration: Integer
+	//		The default animation speed (in ms) to use for all Dijit
+	//		transitional animations, unless otherwise specified
+	//		on a per-instance basis. Defaults to 200, overrided by
+	//		`djConfig.defaultDuration`
+	defaultDuration: 300
+});
+=====*/
+
+dijit.defaultDuration = dojo.config["defaultDuration"] || 200;
+
+}
+
 if(!dojo._hasResource["dijit._base.focus"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
 dojo._hasResource["dijit._base.focus"] = true;
 dojo.provide("dijit._base.focus");
 
+	// for dijit.isTabNavigable()
+
 // summary:
 //		These functions are used to query or set the focus and selection.
 //
-//		Also, they trace when widgets become actived/deactivated,
+//		Also, they trace when widgets become activated/deactivated,
 //		so that the widget can fire _onFocus/_onBlur events.
 //		"Active" here means something similar to "focused", but
 //		"focus" isn't quite the right word because we keep track of
-//		a whole stack of "active" widgets.  Example:  Combobutton --> Menu -->
-//		MenuItem.   The onBlur event for Combobutton doesn't fire due to focusing
+//		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
+//		ComboButton widget.  It only happens when focus is shifted
 //		somewhere completely different.
 
-dojo.mixin(dijit,
-{
+dojo.mixin(dijit, {
 	// _curFocus: DomNode
 	//		Currently focused item on screen
 	_curFocus: null,
@@ -43,116 +483,166 @@ dojo.mixin(dijit,
 	isCollapsed: function(){
 		// summary:
 		//		Returns true if there is no text selected
-		var _document = dojo.doc;
-		if(_document.selection){ // IE
-			var s=_document.selection;
-			if(s.type=='Text'){
-				return !s.createRange().htmlText.length; // Boolean
-			}else{ //Control range
-				return !s.createRange().length; // Boolean
-			}
-		}else{
-			var _window = dojo.global;
-			var selection = _window.getSelection();
-			
-			if(dojo.isString(selection)){ // Safari
-				// TODO: this is dead code; safari is taking the else branch.  remove after 1.3.
-				return !selection; // Boolean
-			}else{ // Mozilla/W3
-				return !selection || selection.isCollapsed || !selection.toString(); // Boolean
-			}
-		}
+		return dijit.getBookmark().isCollapsed;
 	},
 
 	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++));
+		var bm, rg, tg, sel = dojo.doc.selection, cf = dijit._curFocus;
+
+		if(dojo.global.getSelection){
+			//W3C Range API for selections.
+			sel = dojo.global.getSelection();
+			if(sel){
+				if(sel.isCollapsed){
+					tg = cf? cf.tagName : "";
+					if(tg){
+						//Create a fake rangelike item to restore selections.
+						tg = tg.toLowerCase();
+						if(tg == "textarea" ||
+								(tg == "input" && (!cf.type || cf.type.toLowerCase() == "text"))){
+							sel = {
+								start: cf.selectionStart,
+								end: cf.selectionEnd,
+								node: cf,
+								pRange: true
+							};
+							return {isCollapsed: (sel.end <= sel.start), mark: sel}; //Object.
+						}
+					}
+					bm = {isCollapsed:true};
+				}else{
+					rg = sel.getRangeAt(0);
+					bm = {isCollapsed: false, mark: rg.cloneRange()};
+				}
+			}
+		}else if(sel){
+			// If the current focus was a input of some sort and no selection, don't bother saving
+			// a native bookmark.  This is because it causes issues with dialog/page selection restore.
+			// So, we need to create psuedo bookmarks to work with.
+			tg = cf ? cf.tagName : "";
+			tg = tg.toLowerCase();
+			if(cf && tg && (tg == "button" || tg == "textarea" || tg == "input")){
+				if(sel.type && sel.type.toLowerCase() == "none"){
+					return {
+						isCollapsed: true,
+						mark: null
 					}
 				}else{
-					bookmark=null;
+					rg = sel.createRange();
+					return {
+						isCollapsed: rg.text && rg.text.length?false:true,
+						mark: {
+							range: rg,
+							pRange: true
+						}
+					};
 				}
-			}else{
-				bookmark = range.getBookmark();
 			}
-		}else{
-			if(window.getSelection){
-				selection = dojo.global.getSelection();
-				if(selection){
-					range = selection.getRangeAt(0);
-					bookmark = range.cloneRange();
+			bm = {};
+
+			//'IE' way for selections.
+			try{
+				// createRange() throws exception when dojo in iframe
+				//and nothing selected, see #9632
+				rg = sel.createRange();
+				bm.isCollapsed = !(sel.type == 'Text' ? rg.htmlText.length : rg.length);
+			}catch(e){
+				bm.isCollapsed = true;
+				return bm;
+			}
+			if(sel.type.toUpperCase() == 'CONTROL'){
+				if(rg.length){
+					bm.mark=[];
+					var i=0,len=rg.length;
+					while(i<len){
+						bm.mark.push(rg.item(i++));
+					}
+				}else{
+					bm.isCollapsed = true;
+					bm.mark = null;
 				}
 			}else{
-				console.warn("No idea how to store the current selection for this browser!");
+				bm.mark = rg.getBookmark();
 			}
+		}else{
+			console.warn("No idea how to store the current selection for this browser!");
 		}
-		return bookmark; // Array
+		return bm; // Object
 	},
 
 	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();
-				//range.addElement does not have call/apply method, so can not call it directly
-				//range is not available in "range.addElement(item)", so can't use that either
-				dojo.forEach(bookmark, function(n){
-					range.addElement(n);
-				});
-			}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!");
+		//		This should be a returned object from dijit.getBookmark()
+
+		var _doc = dojo.doc,
+			mark = bookmark.mark;
+		if(mark){
+			if(dojo.global.getSelection){
+				//W3C Rangi API (FF, WebKit, Opera, etc)
+				var sel = dojo.global.getSelection();
+				if(sel && sel.removeAllRanges){
+					if(mark.pRange){
+						var r = mark;
+						var n = r.node;
+						n.selectionStart = r.start;
+						n.selectionEnd = r.end;
+					}else{
+						sel.removeAllRanges();
+						sel.addRange(mark);
+					}
+				}else{
+					console.warn("No idea how to restore selection for this browser!");
+				}
+			}else if(_doc.selection && mark){
+				//'IE' way.
+				var rg;
+				if(mark.pRange){
+					rg = mark.range;
+				}else if(dojo.isArray(mark)){
+					rg = _doc.body.createControlRange();
+					//rg.addElement does not have call/apply method, so can not call it directly
+					//rg is not available in "range.addElement(item)", so can't use that either
+					dojo.forEach(mark, function(n){
+						rg.addElement(n);
+					});
+				}else{
+					rg = _doc.body.createTextRange();
+					rg.moveToBookmark(mark);
+				}
+				rg.select();
 			}
 		}
 	},
 
-	getFocus: function(/*Widget?*/menu, /*Window?*/openedForWindow){
+	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
+		//		Called as getFocus(), this returns an Object showing the current focus
+		//		and selected text.
+		//
+		//		Called as getFocus(widget), where widget is a (widget representing) a button
+		//		that was just pressed, it returns where focus was before that button
+		//		was pressed.   (Pressing the button may have either shifted focus to the button,
+		//		or removed focus altogether.)   In this case the selected text is not returned,
+		//		since it can't be accurately determined.
 		//
-		// menu:
-		//		The menu that's being opened
+		// menu: dijit._Widget or {domNode: DomNode} structure
+		//		The button that was just pressed.  If focus has disappeared or moved
+		//		to this button, returns the previous focus.  In this case the bookmark
+		//		information is already lost, and null is returned.
 		//
 		// openedForWindow:
 		//		iframe in which menu was opened
 		//
 		// returns:
-		//		A handle to restore focus/selection
-
+		//		A handle to restore focus/selection, to be passed to `dijit.focus`
+		var node = !dijit._curFocus || (menu && dojo.isDescendant(dijit._curFocus, menu.domNode)) ? dijit._prevFocus : dijit._curFocus;
 		return {
-			// Node 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,
-
+			node: node,
+			bookmark: (node == dijit._curFocus) && dojo.withGlobal(openedForWindow || dojo.global, dijit.getBookmark),
 			openedForWindow: openedForWindow
 		}; // Object
 	},
@@ -168,39 +658,41 @@ dojo.mixin(dijit,
 
 		var node = "node" in handle ? handle.node : handle,		// because handle is either DomNode or a composite object
 			bookmark = handle.bookmark,
-			openedForWindow = handle.openedForWindow;
+			openedForWindow = handle.openedForWindow,
+			collapsed = bookmark ? bookmark.isCollapsed : false;
 
 		// Set the focus
 		// Note that for iframe's we need to use the <iframe> to follow the parentNode chain,
 		// but we need to set focus to iframe.contentWindow
 		if(node){
-			var focusNode = (node.tagName.toLowerCase()=="iframe") ? node.contentWindow : node;
+			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)){
+		// (use keyboard to select a menu item) or if previous selection was collapsed
+		// as it may cause focus shift (Esp in IE).
+		if(bookmark && dojo.withGlobal(openedForWindow || dojo.global, dijit.isCollapsed) && !collapsed){
 			if(openedForWindow){
 				openedForWindow.focus();
 			}
 			try{
-				dojo.withGlobal(openedForWindow||dojo.global, dijit.moveToBookmark, null, [bookmark]);
-			}catch(e){
+				dojo.withGlobal(openedForWindow || dojo.global, dijit.moveToBookmark, null, [bookmark]);
+			}catch(e2){
 				/*squelch IE internal error, see http://trac.dojotoolkit.org/ticket/1984 */
 			}
 		}
 	},
 
-	// _activeStack: Array
+	// _activeStack: dijit._Widget[]
 	//		List of currently active widgets (focused widget and it's ancestors)
 	_activeStack: [],
 
@@ -211,9 +703,20 @@ dojo.mixin(dijit,
 		//		as a focus/click event on the <iframe> itself.
 		// description:
 		//		Currently only used by editor.
-		dijit.registerWin(iframe.contentWindow, iframe);
+		// returns:
+		//		Handle to pass to unregisterIframe()
+		return dijit.registerWin(iframe.contentWindow, iframe);
+	},
+
+	unregisterIframe: function(/*Object*/ handle){
+		// summary:
+		//		Unregisters listeners on the specified iframe created by registerIframe.
+		//		After calling be sure to delete or null out the handle itself.
+		// handle:
+		//		Handle returned by registerIframe()
+
+		dijit.unregisterWin(handle);
 	},
-		
 
 	registerWin: function(/*Window?*/targetWindow, /*DomNode?*/ effectiveNode){
 		// summary:
@@ -228,43 +731,79 @@ dojo.mixin(dijit,
 		// effectiveNode:
 		//		If specified, report any focus events inside targetWindow as
 		//		an event on effectiveNode, rather than on evt.target.
+		// returns:
+		//		Handle to pass to unregisterWin()
 
 		// TODO: make this function private in 2.0; Editor/users should call registerIframe(),
-		// or if Editor stops using <iframe> altogether than we can probably just drop
-		// the whole public API.
 
-		dojo.connect(targetWindow.document, "onmousedown", function(evt){
+		var mousedownListener = function(evt){
 			dijit._justMouseDowned = true;
 			setTimeout(function(){ dijit._justMouseDowned = false; }, 0);
-			dijit._onTouchNode(effectiveNode||evt.target||evt.srcElement);
-		});
+			dijit._onTouchNode(effectiveNode || evt.target || evt.srcElement, "mouse");
+		};
 		//dojo.connect(targetWindow, "onscroll", ???);
 
 		// Listen for blur and focus events on targetWindow's document.
 		// IIRC, I'm using attachEvent() rather than dojo.connect() because focus/blur events don't bubble
 		// through dojo.connect(), and also maybe to catch the focus events early, before onfocus handlers
 		// fire.
-		var doc = targetWindow.document;
+		// Connect to <html> (rather than document) on IE to avoid memory leaks, but document on other browsers because
+		// (at least for FF) the focus event doesn't fire on <html> or <body>.
+		var doc = dojo.isIE ? targetWindow.document.documentElement : targetWindow.document;
 		if(doc){
 			if(dojo.isIE){
-				doc.attachEvent('onactivate', function(evt){
-					if(evt.srcElement.tagName.toLowerCase() != "#document"){
-						dijit._onFocusNode(effectiveNode||evt.srcElement);
+				doc.attachEvent('onmousedown', mousedownListener);
+				var activateListener = function(evt){
+					// IE reports that nodes like <body> have gotten focus, even though they have tabIndex=-1,
+					// Should consider those more like a mouse-click than a focus....
+					if(evt.srcElement.tagName.toLowerCase() != "#document" &&
+						dijit.isTabNavigable(evt.srcElement)){
+						dijit._onFocusNode(effectiveNode || evt.srcElement);
+					}else{
+						dijit._onTouchNode(effectiveNode || evt.srcElement);
 					}
-				});
-				doc.attachEvent('ondeactivate', function(evt){
-					dijit._onBlurNode(effectiveNode||evt.srcElement);
-				});
+				};
+				doc.attachEvent('onactivate', activateListener);
+				var deactivateListener =  function(evt){
+					dijit._onBlurNode(effectiveNode || evt.srcElement);
+				};
+				doc.attachEvent('ondeactivate', deactivateListener);
+
+				return function(){
+					doc.detachEvent('onmousedown', mousedownListener);
+					doc.detachEvent('onactivate', activateListener);
+					doc.detachEvent('ondeactivate', deactivateListener);
+					doc = null;	// prevent memory leak (apparent circular reference via closure)
+				};
 			}else{
-				doc.addEventListener('focus', function(evt){
-					dijit._onFocusNode(effectiveNode||evt.target);
-				}, true);
-				doc.addEventListener('blur', function(evt){
-					dijit._onBlurNode(effectiveNode||evt.target);
-				}, true);
+				doc.addEventListener('mousedown', mousedownListener, true);
+				var focusListener = function(evt){
+					dijit._onFocusNode(effectiveNode || evt.target);
+				};
+				doc.addEventListener('focus', focusListener, true);
+				var blurListener = function(evt){
+					dijit._onBlurNode(effectiveNode || evt.target);
+				};
+				doc.addEventListener('blur', blurListener, true);
+
+				return function(){
+					doc.removeEventListener('mousedown', mousedownListener, true);
+					doc.removeEventListener('focus', focusListener, true);
+					doc.removeEventListener('blur', blurListener, true);
+					doc = null;	// prevent memory leak (apparent circular reference via closure)
+				};
 			}
 		}
-		doc = null;	// prevent memory leak (apparent circular reference via closure)
+	},
+
+	unregisterWin: function(/*Handle*/ handle){
+		// summary:
+		//		Unregisters listeners on the specified window (either the main
+		//		window or an iframe's window) according to handle returned from registerWin().
+		//		After calling be sure to delete or null out the handle itself.
+
+		// Currently our handle is actually a function
+		handle && handle();
 	},
 
 	_onBlurNode: function(/*DomNode*/ node){
@@ -293,9 +832,13 @@ dojo.mixin(dijit,
 		}, 100);
 	},
 
-	_onTouchNode: function(/*DomNode*/ node){
+	_onTouchNode: function(/*DomNode*/ node, /*String*/ by){
 		// summary:
 		//		Callback when node is focused or mouse-downed
+		// node:
+		//		The node that was touched.
+		// by:
+		//		"mouse" if the focus/touch was caused by a mouse down event
 
 		// ignore the recent blurNode event
 		if(dijit._clearActiveWidgetsTimer){
@@ -307,11 +850,12 @@ dojo.mixin(dijit,
 		var newStack=[];
 		try{
 			while(node){
-				if(node.dijitPopupParent){
-					node=dijit.byId(node.dijitPopupParent).domNode;
-				}else if(node.tagName && node.tagName.toLowerCase()=="body"){
+				var popupParent = dojo.attr(node, "dijitPopupParent");
+				if(popupParent){
+					node=dijit.byId(popupParent).domNode;
+				}else if(node.tagName && node.tagName.toLowerCase() == "body"){
 					// is this the root of the document or just the root of an iframe?
-					if(node===dojo.body()){
+					if(node === dojo.body()){
 						// node is the root of the main document
 						break;
 					}
@@ -328,7 +872,7 @@ dojo.mixin(dijit,
 			}
 		}catch(e){ /* squelch */ }
 
-		dijit._setStack(newStack);
+		dijit._setStack(newStack, by);
 	},
 
 	_onFocusNode: function(/*DomNode*/ node){
@@ -348,7 +892,7 @@ dojo.mixin(dijit,
 
 		dijit._onTouchNode(node);
 
-		if(node==dijit._curFocus){ return; }
+		if(node == dijit._curFocus){ return; }
 		if(dijit._curFocus){
 			dijit._prevFocus = dijit._curFocus;
 		}
@@ -356,9 +900,13 @@ dojo.mixin(dijit,
 		dojo.publish("focusNode", [node]);
 	},
 
-	_setStack: function(newStack){
+	_setStack: function(/*String[]*/ newStack, /*String*/ by){
 		// summary:
 		//		The stack of active widgets has changed.  Send out appropriate events and records new stack.
+		// newStack:
+		//		array of widget id's, starting from the top (outermost) widget
+		// by:
+		//		"mouse" if the focus/touch was caused by a mouse down event
 
 		var oldStack = dijit._activeStack;
 		dijit._activeStack = newStack;
@@ -368,346 +916,52 @@ dojo.mixin(dijit,
 			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(function(){dijit.registerWin(window); });
-
-}
-
-if(!dojo._hasResource["dijit._base.manager"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._base.manager"] = true;
-dojo.provide("dijit._base.manager");
-
-dojo.declare("dijit.WidgetSet", null, {
-	// summary:
-	//		A set of widgets indexed by id. A default instance of this class is 
-	//		available as `dijit.registry`
-	//
-	// example:
-	//		Create a small list of widgets:
-	//		|	var ws = new dijit.WidgetSet();
-	//		|	ws.add(dijit.byId("one"));
-	//		| 	ws.add(dijit.byId("two"));
-	//		|	// destroy both:
-	//		|	ws.forEach(function(w){ w.destroy(); });
-	//
-	// example:
-	//		Using dijit.registry:
-	//		|	dijit.registry.forEach(function(w){ /* do something */ });
-	
-	constructor: function(){
-		this._hash = {};
-	},
-
-	add: function(/*Widget*/ widget){
-		// summary:
-		//		Add a widget to this list. If a duplicate ID is detected, a error is thrown.
-		//
-		// widget: dijit._Widget
-		//		Any dijit._Widget subclass.
-		if(this._hash[widget.id]){
-			throw new Error("Tried to register widget with id==" + widget.id + " but that id is already registered");
-		}
-		this._hash[widget.id]=widget;
-	},
-
-	remove: function(/*String*/ id){
-		// summary:
-		//		Remove a widget from this WidgetSet. Does not destroy the widget; simply
-		//		removes the reference.
-		delete this._hash[id];
-	},
-
-	forEach: function(/*Function*/ func){
-		// summary:
-		//		Call specified function for each widget in this set.
-		//
-		// func:
-		//		A callback function to run for each item. Is passed a the widget.
-		//
-		// example:
-		//		Using the default `dijit.registry` instance:
-		//		|	dijit.registry.forEach(function(widget){
-		//		|			
-		//		|	});
-		for(var id in this._hash){
-			func(this._hash[id]);
-		}
-	},
-
-	filter: function(/*Function*/ filter){
-		// summary:
-		//		Filter down this WidgetSet to a smaller new WidgetSet
-		//		Works the same as `dojo.filter` and `dojo.NodeList.filter`
-		//		
-		// filter:
-		//		Callback function to test truthiness.
-		//
-		// example:
-		//		Arbitrary: select the odd widgets in this list
-		//		|	var i = 0;
-		//		|	dijit.registry.filter(function(w){
-		//		|		return ++i % 2 == 0;
-		//		|	}).forEach(function(w){ /* odd ones */ });
-
-		var res = new dijit.WidgetSet();
-		this.forEach(function(widget){
-			if(filter(widget)){ res.add(widget); }
-		});
-		return res; // dijit.WidgetSet
-	},
-
-	byId: function(/*String*/ id){
-		// summary:
-		//		Find a widget in this list by it's id. 
-		// example:
-		//		Test if an id is in a particular WidgetSet
-		//		| var ws = new dijit.WidgetSet();
-		//		| ws.add(dijit.byId("bar"));
-		//		| var t = ws.byId("bar") // returns a widget
-		//		| var x = ws.byId("foo"); // returns undefined
-		
-		return this._hash[id];	// dijit._Widget
-	},
-
-	byClass: function(/*String*/ cls){
-		// summary:
-		//		Reduce this widgetset to a new WidgetSet of a particular declaredClass
-		// 
-		// example:
-		//		Find all titlePane's in a page:
-		//		|	dijit.registry.byClass("dijit.TitlePane").forEach(function(tp){ tp.close(); });
-		
-		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
-};
-
-dijit.findWidgets = function(/*DomNode*/ root){
-	// summary:
-	//		Search subtree under root, putting found widgets in outAry.
-	//		Doesn't search for nested widgets (ie, widgets inside other widgets)
-	
-	var outAry = [];
-
-	function getChildrenHelper(root){
-		var list = dojo.isIE ? root.children : root.childNodes, i = 0, node;
-		while(node = list[i++]){
-			if(node.nodeType != 1){ continue; }
-			var widgetId = node.getAttribute("widgetId");
-			if(widgetId){
-				var widget = dijit.byId(widgetId);
-				outAry.push(widget);
-			}else{
-				getChildrenHelper(node);
-			}
-		}
-	}
-
-	getChildrenHelper(root);
-	return outAry;
-};
-
-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.addOnWindowUnload(function(){
-		dojo.forEach(dijit.findWidgets(dojo.body()), function(widget){
-			if(widget.destroyRecursive){
-				widget.destroyRecursive();
-			}else if(widget.destroy){
-				widget.destroy();
-			}
-		});
-	});
-}
-
-dijit.byId = function(/*String|Widget*/id){
-	// summary:
-	//		Returns a widget by it's 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 corresponding to the given DOMNode
-	return dijit.registry.byId(node.getAttribute("widgetId")); // Widget
-};
-
-dijit.getEnclosingWidget = function(/* DOMNode */ node){
-	// summary:
-	//		Returns the widget whose DOM tree contains the specified DOMNode, or null if
-	//		the node is not contained within the DOM tree of any widget
-	while(node){
-		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")
-		&& (dojo.attr(elem, "type") != "hidden");
-}
-
-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 descendants of the specified root node.
-	//
-	// description:
-	//		Finds the following descendants of the specified root node:
-	//		* the first tab-navigable element in document order
-	//		  without a tabindex or with tabindex="0"
-	//		* the last tab-navigable element in document order
-	//		  without a tabindex or with tabindex="0"
-	//		* the first element in document order with the lowest
-	//		  positive tabindex value
-	//		* the last element in document order with the highest
-	//		  positive tabindex value
-	var first, last, lowest, lowestTabindex, highest, highestTabindex;
-	var walkTree = function(/*DOMNode*/parent){
-		dojo.query("> *", parent).forEach(function(child){
-			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 && child.nodeName.toUpperCase() != 'SELECT'){ 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; // DomNode
-};
+		}
 
-dijit.getLastInTabbingOrder = function(/*String|DOMNode*/root){
-	// summary:
-	//		Finds the descendant of the specified root node
-	//		that is last in the tabbing order
-	var elems = dijit._getTabNavigable(dojo.byId(root));
-	return elems.last ? elems.last : elems.highest; // DomNode
-};
+		var widget;
+		// for all elements that have gone out of focus, send blur event
+		for(var i=oldStack.length-1; i>=nCommon; i--){
+			widget = dijit.byId(oldStack[i]);
+			if(widget){
+				widget._focused = false;
+				widget._hasBeenBlurred = true;
+				if(widget._onBlur){
+					widget._onBlur(by);
+				}
+				if(widget._setStateClass){
+					widget._setStateClass();
+				}
+				dojo.publish("widgetBlur", [widget, by]);
+			}
+		}
 
-/*=====
-dojo.mixin(dijit, {
-	// defaultDuration: Integer
-	//		The default animation speed (in ms) to use for all Dijit
-	//		transitional animations, unless otherwise specified 
-	//		on a per-instance basis. Defaults to 200, overrided by 
-	//		`djConfig.defaultDuration`
-	defaultDuration: 300
+		// for all element that have come into focus, send focus event
+		for(i=nCommon; i<newStack.length; i++){
+			widget = dijit.byId(newStack[i]);
+			if(widget){
+				widget._focused = true;
+				if(widget._onFocus){
+					widget._onFocus(by);
+				}
+				if(widget._setStateClass){
+					widget._setStateClass();
+				}
+				dojo.publish("widgetFocus", [widget, by]);
+			}
+		}
+	}
 });
-=====*/
 
-dijit.defaultDuration = dojo.config["defaultDuration"] || 200;
+// register top window and all the iframes it contains
+dojo.addOnLoad(function(){
+	var handle = dijit.registerWin(window);
+	if(dojo.isIE){
+		dojo.addOnWindowUnload(function(){
+			dijit.unregisterWin(handle);
+			handle = null;
+		})
+	}
+});
 
 }
 
@@ -848,10 +1102,10 @@ dijit.placeOnScreen = function(
 	/* dijit.__Position */	pos,
 	/* String[] */			corners,
 	/* dijit.__Position? */	padding){
-	//	summary:
+	// summary:
 	//		Positions one of the node's corners at specified position
 	//		such that node is fully visible in viewport.
-	//	description:
+	// description:
 	//		NOTE: node is assumed to be absolutely or relatively positioned.
 	//	pos:
 	//		Object like {x: 10, y: 20}
@@ -864,7 +1118,7 @@ dijit.placeOnScreen = function(
 	//			* "TR" - top right
 	//	padding:
 	//		set padding to put some buffer around the element you want to position.
-	//	example:	
+	// example:
 	//		Try to place node's top right corner at (10,20).
 	//		If that makes node go (partially) off screen, then try placing
 	//		bottom left corner at (10,20).
@@ -876,7 +1130,7 @@ dijit.placeOnScreen = function(
 			c.pos.x += corner.charAt(1) == 'L' ? padding.x : -padding.x;
 			c.pos.y += corner.charAt(0) == 'T' ? padding.y : -padding.y;
 		}
-		return c; 
+		return c;
 	});
 
 	return dijit._place(node, choices);
@@ -928,10 +1182,10 @@ dijit._place = function(/*DomNode*/ node, /* Array */ choices, /* Function */ la
 
 		// 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),
+		var startX = Math.max(view.l, corner.charAt(1) == 'L' ? pos.x : (pos.x - mb.w)),
+			startY = Math.max(view.t, corner.charAt(0) == 'T' ? pos.y : (pos.y - mb.h)),
+			endX = Math.min(view.l + view.w, corner.charAt(1) == 'L' ? (startX + mb.w) : pos.x),
+			endY = Math.min(view.t + view.h, corner.charAt(0) == 'T' ? (startY + mb.h) : pos.y),
 			width = endX - startX,
 			height = endY - startY,
 			overflow = (mb.w - width) + (mb.h - height);
@@ -978,7 +1232,7 @@ dijit.placeOnScreenAroundNode = function(
 	//		where the key corresponds to the aroundNode's corner, and
 	//		the value corresponds to the node's corner:
 	//
-	//	|	{ aroundNodeCorner1: nodeCorner1, aroundNodeCorner2: nodeCorner2,  ...}
+	//	|	{ aroundNodeCorner1: nodeCorner1, aroundNodeCorner2: nodeCorner2, ...}
 	//
 	//		The following strings are used to represent the four corners:
 	//			* "BL" - bottom left
@@ -991,7 +1245,7 @@ dijit.placeOnScreenAroundNode = function(
 	//		based on their orientation relative to the parent.   This adjusts the popup based on orientation.
 	//
 	// example:
-	//	|	dijit.placeOnScreenAroundNode(node, aroundNode, {'BL':'TL', 'TR':'BR'}); 
+	//	|	dijit.placeOnScreenAroundNode(node, aroundNode, {'BL':'TL', 'TR':'BR'});
 	//		This will try to position node such that node's top-left corner is at the same position
 	//		as the bottom left corner of the aroundNode (ie, put node below
 	//		aroundNode, with left edges aligned).  If that fails it will try to put
@@ -1004,14 +1258,12 @@ dijit.placeOnScreenAroundNode = function(
 	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);
+	var aroundNodePos = dojo.position(aroundNode, true);
 	aroundNode.style.display=oldDisplay;
 
 	// place the node around the calculated rectangle
-	return dijit._placeOnScreenAroundRect(node, 
-		aroundNodePos.x, aroundNodePos.y, aroundNodeW, aroundNodeH,	// rectangle
+	return dijit._placeOnScreenAroundRect(node,
+		aroundNodePos.x, aroundNodePos.y, aroundNodePos.w, aroundNodePos.h,	// rectangle
 		aroundCorners, layoutNode);
 };
 
@@ -1026,9 +1278,9 @@ dijit.__Rectangle = function(){
 	// height: Integer
 	//		height in pixels
 
-	thix.x = x;
+	this.x = x;
 	this.y = y;
-	thix.width = width;
+	this.width = width;
 	this.height = height;
 }
 =====*/
@@ -1045,7 +1297,7 @@ dijit.placeOnScreenAroundRectangle = function(
 	//		parameter is an arbitrary rectangle on the screen (x, y, width, height)
 	//		instead of a dom node.
 
-	return dijit._placeOnScreenAroundRect(node, 
+	return dijit._placeOnScreenAroundRect(node,
 		aroundRect.x, aroundRect.y, aroundRect.width, aroundRect.height,	// rectangle
 		aroundCorners, layoutNode);
 };
@@ -1081,7 +1333,7 @@ dijit._placeOnScreenAroundRect = function(
 	return dijit._place(node, choices, layoutNode);
 };
 
-dijit.placementRegistry = new dojo.AdapterRegistry();
+dijit.placementRegistry= new dojo.AdapterRegistry();
 dijit.placementRegistry.register("node",
 	function(n, x){
 		return typeof x == "object" &&
@@ -1108,6 +1360,97 @@ dijit.placeOnScreenAroundElement = function(
 	return dijit.placementRegistry.match.apply(dijit.placementRegistry, arguments);
 };
 
+dijit.getPopupAlignment = function(/*Array*/ position, /*Boolean*/ leftToRight){
+	// summary:
+	//		Transforms the passed array of preferred positions into a format suitable for passing as the aroundCorners argument to dijit.placeOnScreenAroundElement.
+	//
+	// position: String[]
+	//		This variable controls the position of the drop down.
+	//		It's an array of strings with the following values:
+	//
+	//			* before: places drop down to the left of the target node/widget, or to the right in
+	//			  the case of RTL scripts like Hebrew and Arabic
+	//			* after: places drop down to the right of the target node/widget, or to the left in
+	//			  the case of RTL scripts like Hebrew and Arabic
+	//			* above: drop down goes above target node
+	//			* below: drop down goes below target node
+	//
+	//		The list is positions is tried, in order, until a position is found where the drop down fits
+	//		within the viewport.
+	//
+	// leftToRight: Boolean
+	//		Whether the popup will be displaying in leftToRight mode.
+	//
+	var align = {};
+	dojo.forEach(position, function(pos){
+		switch(pos){
+			case "after":
+				align[leftToRight ? "BR" : "BL"] = leftToRight ? "BL" : "BR";
+				break;
+			case "before":
+				align[leftToRight ? "BL" : "BR"] = leftToRight ? "BR" : "BL";
+				break;
+			case "below":
+				// first try to align left borders, next try to align right borders (or reverse for RTL mode)
+				align[leftToRight ? "BL" : "BR"] = leftToRight ? "TL" : "TR";
+				align[leftToRight ? "BR" : "BL"] = leftToRight ? "TR" : "TL";
+				break;
+			case "above":
+			default:
+				// first try to align left borders, next try to align right borders (or reverse for RTL mode)
+				align[leftToRight ? "TL" : "TR"] = leftToRight ? "BL" : "BR";
+				align[leftToRight ? "TR" : "TL"] = leftToRight ? "BR" : "BL";
+				break;
+		}
+	});
+	return align;
+};
+dijit.getPopupAroundAlignment = function(/*Array*/ position, /*Boolean*/ leftToRight){
+	// summary:
+	//		Transforms the passed array of preferred positions into a format suitable for passing as the aroundCorners argument to dijit.placeOnScreenAroundElement.
+	//
+	// position: String[]
+	//		This variable controls the position of the drop down.
+	//		It's an array of strings with the following values:
+	//
+	//			* before: places drop down to the left of the target node/widget, or to the right in
+	//			  the case of RTL scripts like Hebrew and Arabic
+	//			* after: places drop down to the right of the target node/widget, or to the left in
+	//			  the case of RTL scripts like Hebrew and Arabic
+	//			* above: drop down goes above target node
+	//			* below: drop down goes below target node
+	//
+	//		The list is positions is tried, in order, until a position is found where the drop down fits
+	//		within the viewport.
+	//
+	// leftToRight: Boolean
+	//		Whether the popup will be displaying in leftToRight mode.
+	//
+	var align = {};
+	dojo.forEach(position, function(pos){
+		switch(pos){
+			case "after":
+				align[leftToRight ? "BR" : "BL"] = leftToRight ? "BL" : "BR";
+				break;
+			case "before":
+				align[leftToRight ? "BL" : "BR"] = leftToRight ? "BR" : "BL";
+				break;
+			case "below":
+				// first try to align left borders, next try to align right borders (or reverse for RTL mode)
+				align[leftToRight ? "BL" : "BR"] = leftToRight ? "TL" : "TR";
+				align[leftToRight ? "BR" : "BL"] = leftToRight ? "TR" : "TL";
+				break;
+			case "above":
+			default:
+				// first try to align left borders, next try to align right borders (or reverse for RTL mode)
+				align[leftToRight ? "TL" : "TR"] = leftToRight ? "BL" : "BR";
+				align[leftToRight ? "TR" : "TL"] = leftToRight ? "BR" : "BL";
+				break;
+		}
+	});
+	return align;
+};
+
 }
 
 if(!dojo._hasResource["dijit._base.window"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
@@ -1158,9 +1501,10 @@ dijit.popup = new function(){
 		beginZIndex=1000,
 		idGen = 1;
 
-	this.prepare = function(/*DomNode*/ node){
+	this.moveOffScreen = function(/*DomNode*/ node){
 		// summary:
-		//		Prepares a node to be used as a popup
+		//		Moves node offscreen without hiding it (so that all layout widgets included 
+		//		in this node can still layout properly)
 		//
 		// description:
 		//		Attaches node to dojo.doc.body, and
@@ -1192,7 +1536,7 @@ dijit.popup.__OpenArgs = function(){
 	// y: Integer
 	//		Absolute vertical position (in pixels) to place node at.  (Specity this *or* "around" parameter.)
 	// orient: Object || String
-	//		When the around parameter is specified, orient should be an 
+	//		When the around parameter is specified, orient should be an
 	//		ordered list of tuples of the form (around-node-corner, popup-node-corner).
 	//		dijit.popup.open() tries to position the popup according to each tuple in the list, in order,
 	//		until the popup appears fully within the viewport.
@@ -1233,6 +1577,17 @@ dijit.popup.__OpenArgs = function(){
 	this.padding = padding;
 }
 =====*/
+
+	// 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];
+	};
+
+	var wrappers=[];
 	this.open = function(/*dijit.popup.__OpenArgs*/ args){
 		// summary:
 		//		Popup the widget at the specified position
@@ -1243,36 +1598,48 @@ dijit.popup.__OpenArgs = function(){
 		//
 		// example:
 		//		opening the widget as a dropdown
-		//		|		dijit.popup.open({parent: this, popup: menuWidget, around: this.domNode, onClose: function(){...}  });
+		//		|		dijit.popup.open({parent: this, popup: menuWidget, around: this.domNode, onClose: function(){...}});
 		//
 		//		Note that whatever widget called dijit.popup.open() should also listen to its own _onBlur callback
 		//		(fired from _base/focus.js) to know that focus has moved somewhere else and thus the popup should be closed.
 
 		var widget = args.popup,
-			orient = args.orient || {'BL':'TL', 'TL':'BL'},
+			orient = args.orient || (
+				dojo._isBodyLtr() ?
+				{'BL':'TL', 'BR':'TR', 'TL':'BL', 'TR':'BR'} :
+				{'BR':'TR', 'BL':'TL', 'TR':'BR', 'TL':'BL'}
+			),
 			around = args.around,
 			id = (args.around && args.around.id) ? (args.around.id+"_dropdown") : ("popup_"+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.create("div",{
-			id: id, 
-			"class":"dijitPopup",
-			style:{
-				zIndex: beginZIndex + stack.length,
-				visibility:"hidden"
-			}
-		}, dojo.body());
-		dijit.setWaiRole(wrapper, "presentation");
-		
-		// prevent transient scrollbar causing misalign (#5776)
-		wrapper.style.left = wrapper.style.top = "0px";		
 
-		if(args.parent){
-			wrapper.dijitPopupParent=args.parent.id;
+		var wrapperobj = wrappers.pop(), wrapper, iframe;
+		if(!wrapperobj){
+			wrapper = dojo.create("div",{
+				"class":"dijitPopup"
+			}, dojo.body());
+			dijit.setWaiRole(wrapper, "presentation");
+		}else{
+			// recycled a old wrapper, so that we don't need to reattach the iframe
+			// which is slow even if the iframe is empty, see #10167
+			wrapper = wrapperobj[0];
+			iframe = wrapperobj[1];
 		}
 
+		dojo.attr(wrapper,{
+			id: id,
+			style:{
+				zIndex: beginZIndex + stack.length,
+				visibility:"hidden",
+				// prevent transient scrollbar causing misalign (#5776), and initial flash in upper left (#10111)
+				top: "-9999px"
+			},
+			dijitPopupParent: args.parent ? args.parent.id : ""
+		});
+
 		var s = widget.domNode.style;
 		s.display = "";
 		s.visibility = "";
@@ -1280,7 +1647,11 @@ dijit.popup.__OpenArgs = function(){
 		s.top = "0px";
 		wrapper.appendChild(widget.domNode);
 
-		var iframe = new dijit.BackgroundIframe(wrapper);
+		if(!iframe){
+			iframe = new dijit.BackgroundIframe(wrapper);
+		}else{
+			iframe.resize(wrapper)
+		}
 
 		// position the wrapper node
 		var best = around ?
@@ -1292,15 +1663,6 @@ dijit.popup.__OpenArgs = function(){
 
 		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){
@@ -1319,10 +1681,10 @@ dijit.popup.__OpenArgs = function(){
 		// 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, "onCancel", args.onCancel));
 		}
 
-		handlers.push(dojo.connect(widget, widget.onExecute ? "onExecute" : "onChange", null, function(){
+		handlers.push(dojo.connect(widget, widget.onExecute ? "onExecute" : "onChange", function(){
 			var topPopup = getTopPopup();
 			if(topPopup && topPopup.onExecute){
 				topPopup.onExecute();
@@ -1341,35 +1703,46 @@ dijit.popup.__OpenArgs = function(){
 		});
 
 		if(widget.onOpen){
+			// TODO: in 2.0 standardize onShow() (used by StackContainer) and onOpen() (used here)
 			widget.onOpen(best);
 		}
 
 		return best;
 	};
 
-	this.close = function(/*Widget*/ popup){
+	this.close = function(/*dijit._Widget*/ popup){
 		// summary:
 		//		Close specified popup and any popups that it parented
+		
+		// Basically work backwards from the top of the stack closing popups
+		// until we hit the specified popup, but IIRC there was some issue where closing
+		// a popup would cause others to close too.  Thus if we are trying to close B in [A,B,C]
+		// closing C might close B indirectly and then the while() condition will run where stack==[A]...
+		// so the while condition is constructed defensively.
 		while(dojo.some(stack, function(elem){return elem.widget == popup;})){
 			var top = stack.pop(),
 				wrapper = top.wrapper,
 				iframe = top.iframe,
 				widget = top.widget,
 				onClose = top.onClose;
-	
+
 			if(widget.onClose){
+				// TODO: in 2.0 standardize onHide() (used by StackContainer) and onClose() (used here)
 				widget.onClose();
 			}
 			dojo.forEach(top.handlers, dojo.disconnect);
-	
-			// #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.destroy(wrapper);
-	
+			// Move the widget offscreen, unless it has already been destroyed in above onClose() etc.
+			if(widget && widget.domNode){
+				this.moveOffScreen(widget.domNode);
+			}
+                        
+			// recycle the wrapper plus iframe, so we prevent reattaching iframe everytime an popup opens
+			// don't use moveOffScreen which would also reattach the wrapper to body, which causes reloading of iframe
+			wrapper.style.top = "-9999px";
+			wrapper.style.visibility = "hidden";
+			wrappers.push([wrapper,iframe]);
+
 			if(onClose){
 				onClose();
 			}
@@ -1378,7 +1751,8 @@ dijit.popup.__OpenArgs = function(){
 }();
 
 dijit._frames = new function(){
-	// summary: cache of iframes
+	// summary:
+	//		cache of iframes
 	var queue = [];
 
 	this.pop = function(){
@@ -1397,19 +1771,15 @@ dijit._frames = new function(){
 			 	iframe = dojo.create("iframe");
 				iframe.src = 'javascript:""';
 				iframe.className = "dijitBackgroundIframe";
+				dojo.style(iframe, "opacity", 0.1);
 			}
 			iframe.tabIndex = -1; // Magic to prevent iframe from getting focus on tab keypress - as style didnt work.
-			dojo.body().appendChild(iframe);
 		}
 		return iframe;
 	};
 
 	this.push = function(iframe){
 		iframe.style.display="none";
-		if(dojo.isIE){
-			iframe.style.removeExpression("width");
-			iframe.style.removeExpression("height");
-		}
 		queue.push(iframe);
 	}
 }();
@@ -1417,7 +1787,7 @@ dijit._frames = new function(){
 
 dijit.BackgroundIframe = function(/* DomNode */node){
 	// summary:
-	//		For IE z-index schenanigans. id attribute is required.
+	//		For IE/FF z-index schenanigans. id attribute is required.
 	//
 	// description:
 	//		new dijit.BackgroundIframe(node)
@@ -1425,20 +1795,46 @@ dijit.BackgroundIframe = function(/* DomNode */node){
 	//			area (and position) of node
 
 	if(!node.id){ throw new Error("no id"); }
-	if(dojo.isIE < 7 || (dojo.isFF < 3 && dojo.hasClass(dojo.body(), "dijit_a11y"))){
+	if(dojo.isIE || dojo.isMoz){
 		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");
+		if(dojo.isIE<7){
+			this.resize(node);
+			this._conn = dojo.connect(node, 'onresize', this, function(){
+				this.resize(node);
+			});
+		}else{
+			dojo.style(iframe, {
+				width: '100%',
+				height: '100%'
+			});
 		}
 		this.iframe = iframe;
 	}
 };
 
 dojo.extend(dijit.BackgroundIframe, {
+	resize: function(node){
+		// summary:
+		// 		resize the iframe so its the same size as node
+		// description:
+		//		this function is a no-op in all browsers except
+		//		IE6, which does not support 100% width/height 
+		//		of absolute positioned iframes
+		if(this.iframe && dojo.isIE<7){
+			dojo.style(this.iframe, {
+				width: node.offsetWidth + 'px',
+				height: node.offsetHeight + 'px'
+			});
+		}
+	},
 	destroy: function(){
-		//	summary: destroy the iframe
+		// summary:
+		//		destroy the iframe
+		if(this._conn){
+			dojo.disconnect(this._conn);
+			this._conn = null;
+		}
 		if(this.iframe){
 			dijit._frames.push(this.iframe);
 			delete this.iframe;
@@ -1452,221 +1848,96 @@ if(!dojo._hasResource["dijit._base.scroll"]){ //_hasResource checks added by bui
 dojo._hasResource["dijit._base.scroll"] = true;
 dojo.provide("dijit._base.scroll");
 
-dijit.scrollIntoView = function(/* DomNode */node){
+dijit.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){
 	// summary:
-	//		Scroll the passed node into view, if it is not.
-
+	//		Scroll the passed node into view, if it is not already.
+	
 	// 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
-	// 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 testdir="H"; //debug
+
 	try{ // catch unexpected/unrecreatable errors (#7808) since we can recover using a semi-acceptable native method
 	node = dojo.byId(node);
-	var doc = dojo.doc;
-	var body = dojo.body();
-	var html = body.parentNode;
-	// if FF2 (which is perfect) or an untested browser, then use the native method
-
-	if((!(dojo.isFF >= 3 || dojo.isIE || dojo.isWebKit) || node == body || node == html) && (typeof node.scrollIntoView == "function")){ // FF2 is perfect, too bad FF3 is not
+	var doc = node.ownerDocument || dojo.doc,
+		body = doc.body || dojo.body(),
+		html = doc.documentElement || body.parentNode,
+		isIE = dojo.isIE, isWK = dojo.isWebKit;
+	// if an untested browser, then use the native method
+	if((!(dojo.isMoz || isIE || isWK) || node == body || node == html) && (typeof node.scrollIntoView != "undefined")){
 		node.scrollIntoView(false); // short-circuit to native if possible
 		return;
 	}
-	var ltr = dojo._isBodyLtr();
-	var isIE8strict = dojo.isIE >= 8 && !compatMode;
-	var rtl = !ltr && !isIE8strict; // IE8 flips scrolling so pretend it's ltr
-	// body and html elements are all messed up due to browser bugs and inconsistencies related to doctype
-	// normalize the values before proceeding (FF2 is not listed since its native behavior is perfect)
-	// for computation simplification, client and offset width and height are the same for body and html
-	// strict:       html:       |      body:       | compatMode:
-	//           width   height  |  width   height  |------------
-	//    ie*:  clientW  clientH | scrollW  clientH | CSS1Compat
-	//    ff3:  clientW  clientH |HscrollW  clientH | CSS1Compat
-	//    sf3:  clientW  clientH | clientW HclientH | CSS1Compat
-	//    op9:  clientW  clientH |HscrollW  clientH | CSS1Compat
-	// ---------------------------------------------|-----------
-	//   none:        html:      |      body:       |
-	//           width    height |  width   height  |
-	//    ie*: BclientW BclientH | clientW  clientH | BackCompat
-	//    ff3: BclientW BclientH | clientW  clientH | BackCompat
-	//    sf3:  clientW  clientH | clientW HclientH | CSS1Compat
-	//    op9: BclientW BclientH | clientW  clientH | BackCompat
-	// ---------------------------------------------|-----------
-	//  loose:        html:      |      body:       |
-	//           width    height |  width   height  |
-	//    ie*:  clientW  clientH | scrollW  clientH | CSS1Compat
-	//    ff3: BclientW BclientH | clientW  clientH | BackCompat
-	//    sf3:  clientW  clientH | clientW HclientH | CSS1Compat
-	//    op9:  clientW  clientH |HscrollW  clientH | CSS1Compat
-	var scrollRoot = body;
-	var compatMode = doc.compatMode == 'BackCompat';
-	if(compatMode){ // BODY is scrollable, HTML has same client size
-		// body client values already OK
-		html._offsetWidth = html._clientWidth = body._offsetWidth = body.clientWidth;
-		html._offsetHeight = html._clientHeight = body._offsetHeight = body.clientHeight;
-	}else{
-		if(dojo.isWebKit){
-			body._offsetWidth = body._clientWidth  = html.clientWidth;
-			body._offsetHeight = body._clientHeight = html.clientHeight;
-		}else{
-			scrollRoot = html;
-		}
-		html._offsetHeight = html.clientHeight;
-		html._offsetWidth  = html.clientWidth;
-	}
-
-	function isFixedPosition(element){
-		var ie = dojo.isIE;
-		return ((ie <= 6 || (ie >= 7 && compatMode))? false : (dojo.style(element, 'position').toLowerCase() == "fixed"));
-	}
-
-	function addPseudoAttrs(element){
-		var parent = element.parentNode;
-		var offsetParent = element.offsetParent;
-		if(offsetParent == null || isFixedPosition(element)){ // position:fixed has no real offsetParent
-			offsetParent = html; // prevents exeptions
-			parent = (element == body)? html : null;
-		}
-		// all the V/H object members below are to reuse code for both directions
-		element._offsetParent = offsetParent;
-		element._parent = parent;
-		//
-		//
-		var bp = dojo._getBorderExtents(element);
-		element._borderStart = { H:(isIE8strict && !ltr)? (bp.w-bp.l):bp.l, V:bp.t };
-		element._borderSize = { H:bp.w, V:bp.h };
-		element._scrolledAmount = { H:element.scrollLeft, V:element.scrollTop };
-		element._offsetSize = { H: element._offsetWidth||element.offsetWidth, V: element._offsetHeight||element.offsetHeight };
-		//
-		// IE8 flips everything in rtl mode except offsetLeft and borderLeft - so manually change offsetLeft to offsetRight here 
-		element._offsetStart = { H:(isIE8strict && !ltr)? offsetParent.clientWidth-element.offsetLeft-element._offsetSize.H:element.offsetLeft, V:element.offsetTop };
-		//
-		element._clientSize = { H:element._clientWidth||element.clientWidth, V:element._clientHeight||element.clientHeight };
-		if(element != body && element != html && element != node){
-			for(var dir in element._offsetSize){ // for both x and y directions
-				var scrollBarSize = element._offsetSize[dir] - element._clientSize[dir] - element._borderSize[dir];
-				//if(dir==testdir)
-				var hasScrollBar = element._clientSize[dir] > 0 && scrollBarSize > 0; // can't check for a specific scrollbar size since it changes dramatically as you zoom
-				//if(dir==testdir)
-				if(hasScrollBar){
-					element._offsetSize[dir] -= scrollBarSize;
-					if(dojo.isIE && rtl && dir=="H"){ element._offsetStart[dir] += scrollBarSize; }
-				}
-			}
-		}
-	}
-
-	var element = node;
-	while(element != null){
-		if(isFixedPosition(element)){ node.scrollIntoView(false); return; } //TODO: handle without native call
-		addPseudoAttrs(element);
-		element = element._parent;
-	}
-	if(dojo.isIE && node._parent){ // if no parent, then offsetParent._borderStart may not tbe set
-		var offsetParent = node._offsetParent;
-		//
-		node._offsetStart.H += offsetParent._borderStart.H;
-		node._offsetStart.V += offsetParent._borderStart.V;
-	}
-	if(dojo.isIE >= 7 && scrollRoot == html && rtl && body._offsetStart && body._offsetStart.H == 0){ // IE7 bug
-		var scroll = html.scrollWidth - html._offsetSize.H;
-		if(scroll > 0){
-			//
-			body._offsetStart.H = -scroll;
-		}
-	}
-	if(dojo.isIE <= 6 && !compatMode){
-		html._offsetSize.H += html._borderSize.H;
-		html._offsetSize.V += html._borderSize.V;
-	}
-	// eliminate offsetLeft/Top oddities by tweaking scroll for ease of computation
-	if(rtl && body._offsetStart && scrollRoot == html && html._scrolledAmount){
-		var ofs = body._offsetStart.H;
-		if(ofs < 0){
-			html._scrolledAmount.H += ofs;
-			body._offsetStart.H = 0;
-		}
-	}
-	element = node;
-	while(element){
-		var parent = element._parent;
-		if(!parent){ break; }
-			//
-			if(parent.tagName == "TD"){
-				var table = parent._parent._parent._parent; // point to TABLE
-				if(parent != element._offsetParent && parent._offsetParent != element._offsetParent){
-					parent = table; // child of TD has the same offsetParent as TABLE, so skip TD, TR, and TBODY (ie. verticalslider)
+	var backCompat = doc.compatMode == 'BackCompat',
+		clientAreaRoot = backCompat? body : html,
+		scrollRoot = isWK ? body : clientAreaRoot,
+		rootWidth = clientAreaRoot.clientWidth,
+		rootHeight = clientAreaRoot.clientHeight,
+		rtl = !dojo._isBodyLtr(),
+		nodePos = pos || dojo.position(node),
+		el = node.parentNode,
+		isFixed = function(el){
+			return ((isIE <= 6 || (isIE && backCompat))? false : (dojo.style(el, 'position').toLowerCase() == "fixed"));
+		};
+	if(isFixed(node)){ return; } // nothing to do
+	while(el){
+		if(el == body){ el = scrollRoot; }
+		var elPos = dojo.position(el),
+			fixedPos = isFixed(el);
+		with(elPos){
+			if(el == scrollRoot){
+				w = rootWidth, h = rootHeight;
+				if(scrollRoot == html && isIE && rtl){ x += scrollRoot.offsetWidth-w; } // IE workaround where scrollbar causes negative x
+				if(x < 0 || !isIE){ x = 0; } // IE can have values > 0
+				if(y < 0 || !isIE){ y = 0; }
+			}else{
+				var pb = dojo._getPadBorderExtents(el);
+				w -= pb.w; h -= pb.h; x += pb.l; y += pb.t;
+			}
+			with(el){
+				if(el != scrollRoot){ // body, html sizes already have the scrollbar removed
+					var clientSize = clientWidth,
+						scrollBarSize = w - clientSize;
+					if(clientSize > 0 && scrollBarSize > 0){
+						w = clientSize;
+						if(isIE && rtl){ x += scrollBarSize; }
+					}
+					clientSize = clientHeight;
+					scrollBarSize = h - clientSize;
+					if(clientSize > 0 && scrollBarSize > 0){
+						h = clientSize;
+					}
 				}
-			}
-			// check if this node and its parent share the same offsetParent
-			var relative = element._offsetParent == parent;
-			//
-			for(var dir in element._offsetStart){ // for both x and y directions
-				var otherDir = dir=="H"? "V" : "H";
-				if(rtl && dir=="H" && (parent != html) && (parent != body) && (dojo.isIE || dojo.isWebKit) && parent._clientSize.H > 0 && parent.scrollWidth > parent._clientSize.H){ // scroll starts on the right
-					var delta = parent.scrollWidth - parent._clientSize.H;
-					//
-					if(delta > 0){
-						parent._scrolledAmount.H -= delta;
-					} // match FF3 which has cool negative scrollLeft values
-				}
-				if(parent._offsetParent.tagName == "TABLE"){ // make it consistent
-					if(dojo.isIE){ // make it consistent with Safari and FF3 and exclude the starting TABLE border of TABLE children
-						parent._offsetStart[dir] -= parent._offsetParent._borderStart[dir];
-						parent._borderStart[dir] = parent._borderSize[dir] = 0;
+				if(fixedPos){ // bounded by viewport, not parents
+					if(y < 0){
+						h += y, y = 0;
 					}
-					else{
-						parent._offsetStart[dir] += parent._offsetParent._borderStart[dir];
+					if(x < 0){
+						w += x, x = 0;
+					}
+					if(y + h > rootHeight){
+						h = rootHeight - y;
+					}
+					if(x + w > rootWidth){
+						w = rootWidth - x;
 					}
 				}
-				//if(dir==testdir)
-				if(dojo.isIE){
-					//if(dir==testdir)
-					parent._offsetStart[dir] += parent._offsetParent._borderStart[dir];
-				}
-				//if(dir==testdir)
-				// underflow = visible gap between parent and this node taking scrolling into account
-				// if negative, part of the node is obscured by the parent's beginning and should be scrolled to become visible
-				var underflow = element._offsetStart[dir] - parent._scrolledAmount[dir] - (relative? 0 : parent._offsetStart[dir]) - parent._borderStart[dir];
-				// if overflow is positive, number of pixels obscured by the parent's end
-				var overflow = underflow + element._offsetSize[dir] - parent._offsetSize[dir] + parent._borderSize[dir];
-				//if(dir==testdir)
-				var scrollAttr = (dir=="H")? "scrollLeft" : "scrollTop";
-				// see if we should scroll forward or backward
-				var reverse = dir=="H" && rtl; // flip everything
-				var underflowScroll = reverse? -overflow : underflow;
-				var overflowScroll = reverse? -underflow : overflow;
-				// don't scroll if the over/underflow signs are opposite since that means that
-				// the node extends beyond parent's boundary in both/neither directions
-				var scrollAmount = (underflowScroll*overflowScroll <= 0)? 0 : Math[(underflowScroll < 0)? "max" : "min"](underflowScroll, overflowScroll);
-				//if(dir==testdir)
-				if(scrollAmount != 0){
-					var oldScroll = parent[scrollAttr];
-					parent[scrollAttr] += (reverse)? -scrollAmount : scrollAmount; // actually perform the scroll
-					var scrolledAmount = parent[scrollAttr] - oldScroll; // in case the scroll failed
-					//if(dir==testdir)
-				}
-				if(relative){
-					element._offsetStart[dir] += parent._offsetStart[dir];
-				}
-				element._offsetStart[dir] -= parent[scrollAttr];
-			}
-			element._parent = parent._parent;
-			element._offsetParent = parent._offsetParent;
-	}
-	parent = node;
-	var next;
-	while(parent && parent.removeAttribute){
-		next = parent.parentNode;
-		parent.removeAttribute('_offsetParent');
-		parent.removeAttribute('_parent');
-		parent = next;
+				// calculate overflow in all 4 directions
+				var l = nodePos.x - x, // beyond left: < 0
+					t = nodePos.y - Math.max(y, 0), // beyond top: < 0
+					r = l + nodePos.w - w, // beyond right: > 0
+					bot = t + nodePos.h - h; // beyond bottom: > 0
+				if(r * l > 0){
+					var s = Math[l < 0? "max" : "min"](l, r);
+					nodePos.x += scrollLeft;
+					scrollLeft += (isIE >= 8 && !backCompat && rtl)? -s : s;
+					nodePos.x -= scrollLeft;
+				}
+				if(bot * t > 0){
+					nodePos.y += scrollTop;
+					scrollTop += Math[t < 0? "max" : "min"](t, bot);
+					nodePos.y -= scrollTop;
+				}
+			}
+		}
+		el = (el != scrollRoot) && !fixedPos && el.parentNode;
 	}
 	}catch(error){
 		console.error('scrollIntoView: ' + error);
@@ -1694,7 +1965,7 @@ dojo._hasResource["dijit._base.sniff"] = true;
 dojo.provide("dijit._base.sniff");
 
 (function(){
-	
+
 	var d = dojo,
 		html = d.doc.documentElement,
 		ie = d.isIE,
@@ -1702,26 +1973,29 @@ dojo.provide("dijit._base.sniff");
 		maj = Math.floor,
 		ff = d.isFF,
 		boxModel = d.boxModel.replace(/-/,''),
+
 		classes = {
 			dj_ie: ie,
-//			dj_ie55: ie == 5.5,
 			dj_ie6: maj(ie) == 6,
 			dj_ie7: maj(ie) == 7,
+			dj_ie8: maj(ie) == 8,
 			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_webkit: d.isWebKit,
 			dj_safari: d.isSafari,
+			dj_chrome: d.isChrome,
+
 			dj_gecko: d.isMozilla,
-			dj_ff2: maj(ff) == 2,
 			dj_ff3: maj(ff) == 3
 		}; // no dojo unsupported browsers
-		
+
 	classes["dj_" + boxModel] = true;
-	
+
 	// apply browser, browser version, and box model class names
 	for(var p in classes){
 		if(classes[p]){
@@ -1746,7 +2020,7 @@ dojo.provide("dijit._base.sniff");
 			}
 		}
 	});
-	
+
 })();
 
 }
@@ -1765,16 +2039,22 @@ 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));
+		
+		// Schedule next event, reducing the timer a little bit each iteration, bottoming-out at 10 to avoid
+		// browser overload (particularly avoiding starving DOH robot so it never gets to send a mouseup)
+		this._currentTimeout = Math.max(
+			this._currentTimeout < 0 ? this._initialDelay :
+				(this._subsequentDelay > 1 ? this._subsequentDelay : Math.round(this._currentTimeout * this._subsequentDelay)),
+			10);
 		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.
+		//		Start a timed, repeating callback sequence.
+		//		If already started, the function call is ignored.
+		//		This method is not normally called by the user but can be
+		//		when the normal listener code is insufficient.
 		// evt:
 		//		key or mouse event object to pass to the user callback
 		// _this:
@@ -1812,7 +2092,7 @@ dijit.typematic = {
 
 	stop: function(){
 		// summary:
-		//	  Stop an ongoing timed, repeating callback sequence.
+		//		Stop an ongoing timed, repeating callback sequence.
 		if(this._timer){
 			clearTimeout(this._timer);
 			this._timer = null;
@@ -1857,8 +2137,9 @@ dijit.typematic = {
 			dojo.connect(node, "onkeypress", this, function(evt){
 				if(evt.charOrCode == keyObject.charOrCode &&
 				(keyObject.ctrlKey === undefined || keyObject.ctrlKey == evt.ctrlKey) &&
-				(keyObject.altKey === undefined || keyObject.altKey == evt.ctrlKey) &&
-				(keyObject.shiftKey === undefined || keyObject.shiftKey == evt.ctrlKey)){
+				(keyObject.altKey === undefined || keyObject.altKey == evt.altKey) &&
+				(keyObject.metaKey === undefined || keyObject.metaKey == (evt.metaKey || false)) && // IE doesn't even set metaKey
+				(keyObject.shiftKey === undefined || keyObject.shiftKey == evt.shiftKey)){
 					dojo.stopEvent(evt);
 					dijit.typematic.trigger(keyObject, _this, node, callback, keyObject, subsequentDelay, initialDelay);
 				}else if(dijit.typematic._obj == keyObject){
@@ -1955,7 +2236,7 @@ dijit.wai = {
 		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:)" ));
+			var needsA11y = (cs.borderTopColor == cs.borderRightColor) || (bkImg != null && (bkImg == "none" || bkImg == "url(invalid-url:)" ));
 			dojo[needsA11y ? "addClass" : "removeClass"](dojo.body(), "dijit_a11y");
 			if(dojo.isIE){
 				div.outerHTML = "";		// prevent mixed-content warning, see http://support.microsoft.com/kb/925014
@@ -1972,8 +2253,7 @@ if(dojo.isIE || dojo.isMoz){	// NOTE: checking in Safari messes things up
 	dojo._loaders.unshift(dijit.wai.onload);
 }
 
-dojo.mixin(dijit,
-{
+dojo.mixin(dijit, {
 	_XhtmlRoles: /banner|contentinfo|definition|main|navigation|search|note|secondary|seealso/,
 
 	hasWaiRole: function(/*Element*/ elem, /*String*/ role){
@@ -1981,9 +2261,9 @@ dojo.mixin(dijit,
 		//		Determines if an element has a particular non-XHTML role.
 		// returns:
 		//		True if elem has the specific non-XHTML role attribute and false if not.
-		// 		For backwards compatibility if role parameter not provided, 
-		// 		returns true if has non XHTML role 
-		var waiRole = this.getWaiRole(elem);		
+		// 		For backwards compatibility if role parameter not provided,
+		// 		returns true if has non XHTML role
+		var waiRole = this.getWaiRole(elem);
 		return role ? (waiRole.indexOf(role) > -1) : (waiRole.length > 0);
 	},
 
@@ -2000,21 +2280,18 @@ dojo.mixin(dijit,
 		// summary:
 		//		Sets the role on an element.
 		// description:
-		//		In other than FF2 replace existing role attribute with new role.
-		//		FF3 supports XHTML and ARIA roles so    
-		//		if elem already has an XHTML role, append this role to XHTML role 
+		//		Replace existing role attribute with new role.
+		//		If elem already has an XHTML role, append this role to XHTML role
 		//		and remove other ARIA roles.
-		//		On Firefox 2 and below, "wairole:" is
-		//		prepended to the provided role value.
 
 		var curRole = dojo.attr(elem, "role") || "";
-		if(dojo.isFF < 3 || !this._XhtmlRoles.test(curRole)){
-			dojo.attr(elem, "role", dojo.isFF < 3 ? "wairole:" + role : role);
+		if(!this._XhtmlRoles.test(curRole)){
+			dojo.attr(elem, "role", role);
 		}else{
 			if((" "+ curRole +" ").indexOf(" " + role + " ") < 0){
 				var clearXhtml = dojo.trim(curRole.replace(this._XhtmlRoles, ""));
-				var cleanRole = dojo.trim(curRole.replace(clearXhtml, ""));	 
-         		dojo.attr(elem, "role", cleanRole + (cleanRole ? ' ' : '') + role);
+				var cleanRole = dojo.trim(curRole.replace(clearXhtml, ""));
+				dojo.attr(elem, "role", cleanRole + (cleanRole ? ' ' : '') + role);
 			}
 		}
 	},
@@ -2024,14 +2301,13 @@ dojo.mixin(dijit,
 		//		Removes the specified non-XHTML role from an element.
 		// 		Removes role attribute if no specific role provided (for backwards compat.)
 
-		var roleValue = dojo.attr(elem, "role"); 
+		var roleValue = dojo.attr(elem, "role");
 		if(!roleValue){ return; }
 		if(role){
-			var searchRole = dojo.isFF < 3 ? "wairole:" + role : role;
-			var t = dojo.trim((" " + roleValue + " ").replace(" " + searchRole + " ", " "));
+			var t = dojo.trim((" " + roleValue + " ").replace(" " + role + " ", " "));
 			dojo.attr(elem, "role", t);
 		}else{
-			elem.removeAttribute("role");	
+			elem.removeAttribute("role");
 		}
 	},
 
@@ -2039,16 +2315,11 @@ dojo.mixin(dijit,
 		// 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.
+		//		Checks for an attribute called "aria-"+state.
 		// returns:
 		//		true if elem has a value for the given state and
 		//		false if it does not.
-		if(dojo.isFF < 3){
-			return elem.hasAttributeNS("http://www.w3.org/2005/07/aaa", state);
-		}
+
 		return elem.hasAttribute ? elem.hasAttribute("aria-"+state) : !!elem.getAttribute("aria-"+state);
 	},
 
@@ -2056,16 +2327,11 @@ dojo.mixin(dijit,
 		// 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.
+		//		Checks for an attribute called "aria-"+state.
 		// returns:
 		//		The value of the requested state on elem
 		//		or an empty string if elem has no value for state.
-		if(dojo.isFF < 3){
-			return elem.getAttributeNS("http://www.w3.org/2005/07/aaa", state);
-		}
+
 		return elem.getAttribute("aria-"+state) || "";
 	},
 
@@ -2073,31 +2339,18 @@ dojo.mixin(dijit,
 		// 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 < 3){
-			elem.setAttributeNS("http://www.w3.org/2005/07/aaa",
-				"aaa:"+state, value);
-		}else{
-			elem.setAttribute("aria-"+state, value);
-		}
+		//		Sets an attribute called "aria-"+state.
+
+		elem.setAttribute("aria-"+state, value);
 	},
 
 	removeWaiState: function(/*Element*/ elem, /*String*/ state){
 		// summary:
 		//		Removes a state from an element.
 		// description:
-		//		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 < 3){
-			elem.removeAttributeNS("http://www.w3.org/2005/07/aaa", state);
-		}else{
-			elem.removeAttribute("aria-"+state);
-		}
+		//		Sets an attribute called "aria-"+state.
+
+		elem.removeAttribute("aria-"+state);
 	}
 });
 
@@ -2164,8 +2417,8 @@ dojo.date.stamp.fromISOString = function(/*String*/formattedString, /*Number?*/d
 			/^(?:(\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;
+	var match = dojo.date.stamp._isoRegExp.exec(formattedString),
+		result = null;
 
 	if(match){
 		match.shift();
@@ -2183,11 +2436,13 @@ dojo.date.stamp.fromISOString = function(/*String*/formattedString, /*Number?*/d
 				}
 			});
 		}
-		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
+		result = new Date(match[0]||1970, match[1]||0, match[2]||1, match[3]||0, match[4]||0, match[5]||0, match[6]||0); //TODO: UTC defaults
+		if(match[0] < 100){
+			result.setFullYear(match[0] || 1970);
+		}
 
-		var offset = 0;
-		var zoneSign = match[7] && match[7].charAt(0);
+		var offset = 0,
+			zoneSign = match[7] && match[7].charAt(0);
 		if(zoneSign != 'Z'){
 			offset = ((match[8] || 0) * 60) + (Number(match[9]) || 0);
 			if(zoneSign != '-'){ offset *= -1; }
@@ -2232,9 +2487,9 @@ dojo.date.stamp.toISOString = function(/*Date*/dateObject, /*dojo.date.stamp.__O
 
 	var _ = function(n){ return (n < 10) ? "0" + n : n; };
 	options = options || {};
-	var formattedDate = [];
-	var getter = options.zulu ? "getUTC" : "get";
-	var date = "";
+	var formattedDate = [],
+		getter = options.zulu ? "getUTC" : "get",
+		date = "";
 	if(options.selector != "time"){
 		var year = dateObject[getter+"FullYear"]();
 		date = ["0000".substr((year+"").length)+year, _(dateObject[getter+"Month"]()+1), _(dateObject[getter+"Date"]())].join('-');
@@ -2270,28 +2525,8 @@ dojo.parser = new function(){
 	// summary: The Dom/Widget parsing package
 
 	var d = dojo;
-	var dtName = d._scopeName + "Type";
-	var qry = "[" + dtName + "]";
-
-	var _anonCtr = 0, _anon = {};
-	var 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 nso = thisObj || _anon;
-		if(dojo.isIE){
-			var cn = anonFuncPtr["__dojoNameCache"];
-			if(cn && nso[cn] === anonFuncPtr){
-				return cn;
-			}
-		}
-		var name;
-		do{
-			name = "__" + _anonCtr++;
-		}while(name in nso)
-		nso[name] = anonFuncPtr;
-		return name; // String
-	}
+	this._attrName = d._scopeName + "Type";
+	this._query = "[" + this._attrName + "]";
 
 	function val2type(/*Object*/ value){
 		// summary:
@@ -2328,10 +2563,12 @@ dojo.parser = new function(){
 				}
 				try{
 					if(value.search(/[^\w\.]+/i) != -1){
-						// TODO: "this" here won't work
-						value = nameAnonFunc(new Function(value), this);
+						// The user has specified some text for a function like "return x+5"
+						return new Function(value);
+					}else{
+						// The user has specified the name of a function like "myOnClick"
+						return d.getObject(value, false);
 					}
-					return d.getObject(value, false);
 				}catch(e){ return new Function(); }
 			case "array":
 				return value ? value.split(/\s*,\s*/) : [];
@@ -2352,7 +2589,14 @@ dojo.parser = new function(){
 		// map from fully qualified name (like "dijit.Button") to structure like
 		// { cls: dijit.Button, params: {label: "string", disabled: "boolean"} }
 	};
-	
+
+	// Widgets like BorderContainer add properties to _Widget via dojo.extend().
+	// If BorderContainer is loaded after _Widget's parameter list has been cached,
+	// we need to refresh that parameter list (for _Widget and all widgets that extend _Widget).
+	dojo.connect(dojo, "extend", function(){
+		instanceClasses = {};
+	});
+
 	function getClassInfo(/*String*/ className){
 		// className:
 		//		fully qualified name (like "dijit.form.Button")
@@ -2405,20 +2649,25 @@ dojo.parser = new function(){
 		return new Function(preamble+script.innerHTML+suffix);
 	}
 
-	this.instantiate = function(/* Array */nodes, /* Object? */mixin){
+	this.instantiate = function(/* Array */nodes, /* Object? */mixin, /* Object? */args){
 		// 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		
-		// mixin: Object
+		// mixin: Object?
 		//		An object that will be mixed in with each node in the array.
 		//		Values in the mixin will override values in the node, if they
 		//		exist.
-		var thelist = [];
+		// args: Object?
+		//		An object used to hold kwArgs for instantiation.
+		//		Only supports 'noStart' currently.
+		var thelist = [], dp = dojo.parser;
 		mixin = mixin||{};
+		args = args||{};
+		
 		d.forEach(nodes, function(node){
 			if(!node){ return; }
-			var type = dtName in mixin?mixin[dtName]:node.getAttribute(dtName);
+			var type = dp._attrName in mixin?mixin[dp._attrName]:node.getAttribute(dp._attrName);
 			if(!type || !type.length){ return; }
 			var clsInfo = getClassInfo(type),
 				clazz = clsInfo.cls,
@@ -2474,10 +2723,7 @@ dojo.parser = new function(){
 				});
 			}
 
-			var markupFactory = clazz["markupFactory"];
-			if(!markupFactory && clazz["prototype"]){
-				markupFactory = clazz.prototype["markupFactory"];
-			}
+			var markupFactory = clazz.markupFactory || clazz.prototype && clazz.prototype.markupFactory;
 			// create the instance
 			var instance = markupFactory ? markupFactory(params, node, clazz) : new clazz(params, node);
 			thelist.push(instance);
@@ -2502,27 +2748,77 @@ dojo.parser = new function(){
 		// 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();
-			}
-		});
+		if(!mixin._started){
+			d.forEach(thelist, function(instance){
+				if(	!args.noStart && instance  && 
+					instance.startup &&
+					!instance._started && 
+					(!instance.getParent || !instance.getParent())
+				){
+					instance.startup();
+				}
+			});
+		}
 		return thelist;
 	};
 
-	this.parse = function(/*DomNode?*/ rootNode){
+	this.parse = function(/*DomNode?*/ rootNode, /* Object? */ args){
 		// summary:
+		//		Scan the DOM for class instances, and instantiate them.
+		//
+		// description:
 		//		Search specified node (or root node) recursively for class instances,
 		//		and instantiate them Searches for
 		//		dojoType="qualified.class.name"
-		var list = d.query(qry, rootNode);
-		// go build the object instances
-		var instances = this.instantiate(list);
-		return instances;
+		//
+		// rootNode: DomNode?
+		//		A default starting root node from which to start the parsing. Can be
+		//		omitted, defaulting to the entire document. If omitted, the `args`
+		//		object can be passed in this place. If the `args` object has a 
+		//		`rootNode` member, that is used.
+		//
+		// args:
+		//		a kwArgs object passed along to instantiate()
+		//		
+		//			* noStart: Boolean?
+		//				when set will prevent the parser from calling .startup()
+		//				when locating the nodes. 
+		//			* rootNode: DomNode?
+		//				identical to the function's `rootNode` argument, though
+		//				allowed to be passed in via this `args object. 
+		//
+		// example:
+		//		Parse all widgets on a page:
+		//	|		dojo.parser.parse();
+		//
+		// example:
+		//		Parse all classes within the node with id="foo"
+		//	|		dojo.parser.parse(dojo.byId(foo));
+		//
+		// example:
+		//		Parse all classes in a page, but do not call .startup() on any 
+		//		child
+		//	|		dojo.parser.parse({ noStart: true })
+		//
+		// example:
+		//		Parse all classes in a node, but do not call .startup()
+		//	|		dojo.parser.parse(someNode, { noStart:true });
+		//	|		// or
+		// 	|		dojo.parser.parse({ noStart:true, rootNode: someNode });
+
+		// determine the root node based on the passed arguments.
+		var root;
+		if(!args && rootNode && rootNode.rootNode){
+			args = rootNode;
+			root = args.rootNode;
+		}else{
+			root = rootNode;
+		}
+
+		var	list = d.query(this._query, root);
+			// go build the object instances
+		return this.instantiate(list, null, args); // Array
+
 	};
 }();
 
@@ -2531,7 +2827,7 @@ dojo.parser = new function(){
 
 (function(){
 	var parseRunner = function(){ 
-		if(dojo.config["parseOnLoad"] == true){
+		if(dojo.config.parseOnLoad){
 			dojo.parser.parse(); 
 		}
 	};
@@ -2552,8 +2848,11 @@ dojo.provide("dijit._Widget");
 
 dojo.require( "dijit._base" );
 
-dojo.connect(dojo, "connect", 
-	function(/*Widget*/ widget, /*String*/ event){
+
+// This code is to assist deferring dojo.connect() calls in widgets (connecting to events on the widgets'
+// DOM nodes) until someone actually needs to monitor that event.
+dojo.connect(dojo, "_connect",
+	function(/*dijit._Widget*/ widget, /*String*/ event){
 		if(widget && dojo.isFunction(widget._onConnect)){
 			widget._onConnect(event);
 		}
@@ -2561,27 +2860,53 @@ dojo.connect(dojo, "connect",
 
 dijit._connectOnUseEventHandler = function(/*Event*/ event){};
 
+// Keep track of where the last keydown event was, to help avoid generating
+// spurious ondijitclick events when:
+// 1. focus is on a <button> or <a>
+// 2. user presses then releases the ENTER key
+// 3. onclick handler fires and shifts focus to another node, with an ondijitclick handler
+// 4. onkeyup event fires, causing the ondijitclick handler to fire
+dijit._lastKeyDownNode = null;
+if(dojo.isIE){
+	(function(){
+		var keydownCallback = function(evt){
+			dijit._lastKeyDownNode = evt.srcElement;
+		};
+		dojo.doc.attachEvent('onkeydown', keydownCallback);
+		dojo.addOnWindowUnload(function(){
+			dojo.doc.detachEvent('onkeydown', keydownCallback);
+		});
+	})();
+}else{
+	dojo.doc.addEventListener('keydown', function(evt){
+		dijit._lastKeyDownNode = evt.target;
+	}, true);
+}
+
 (function(){
 
-var _attrReg = {};
-var getAttrReg = function(dc){
-	if(!_attrReg[dc]){
-		var r = [];
-		var attrs;
-		var proto = dojo.getObject(dc).prototype;
-		for(var fxName in proto){
-			if(dojo.isFunction(proto[fxName]) && (attrs = fxName.match(/^_set([a-zA-Z]*)Attr$/)) && attrs[1]){
-				r.push(attrs[1].charAt(0).toLowerCase() + attrs[1].substr(1));
+var _attrReg = {},	// cached results from getSetterAttributes
+	getSetterAttributes = function(widget){
+		// summary:
+		//		Returns list of attributes with custom setters for specified widget
+		var dc = widget.declaredClass;
+		if(!_attrReg[dc]){
+			var r = [],
+				attrs,
+				proto = widget.constructor.prototype;
+			for(var fxName in proto){
+				if(dojo.isFunction(proto[fxName]) && (attrs = fxName.match(/^_set([a-zA-Z]*)Attr$/)) && attrs[1]){
+					r.push(attrs[1].charAt(0).toLowerCase() + attrs[1].substr(1));
+				}
 			}
+			_attrReg[dc] = r;
 		}
-		_attrReg[dc] = r;
-	}
-	return _attrReg[dc]||[];
-}
+		return _attrReg[dc] || [];	// String[]
+	};
 
 dojo.declare("dijit._Widget", null, {
 	// summary:
-	//		Base class for all dijit widgets. 	
+	//		Base class for all Dijit widgets.
 
 	// id: [const] String
 	//		A unique, opaque ID string that can be assigned by users or by the
@@ -2613,11 +2938,22 @@ dojo.declare("dijit._Widget", null, {
 	style: "",
 
 	// title: String
-	//		HTML title attribute, used to specify the title of tabs, accordion panes, etc.
+	//		HTML title attribute.
+	//
+	//		For form widgets this specifies a tooltip to display when hovering over
+	//		the widget (just like the native HTML title attribute).
+	//
+	//		For TitlePane or for when this widget is a child of a TabContainer, AccordionContainer,
+	//		etc., it's used to specify the tab label, accordion pane title, etc.
 	title: "",
 
+	// tooltip: String
+	//		When this widget's title attribute is used to for a tab label, accordion pane title, etc.,
+	//		this specifies the tooltip to appear when the mouse is hovered over that text.
+	tooltip: "",
+
 	// srcNodeRef: [readonly] DomNode
-	//		pointer to original dom node
+	//		pointer to original DOM node
 	srcNodeRef: null,
 
 	// domNode: [readonly] DomNode
@@ -2628,21 +2964,21 @@ dojo.declare("dijit._Widget", null, {
 	domNode: null,
 
 	// containerNode: [readonly] DomNode
-	//		Designates where children of the source dom node will be placed.
-	//		"Children" in this case refers to both dom nodes and widgets.
+	//		Designates where children of the source DOM node will be placed.
+	//		"Children" in this case refers to both DOM nodes and widgets.
 	//		For example, for myWidget:
 	//
 	//		|	<div dojoType=myWidget>
-	//		|		<b> here's a plain dom node
+	//		|		<b> here's a plain DOM node
 	//		|		<span dojoType=subWidget>and a widget</span>
-	//		|		<i> and another plain dom node </i>
+	//		|		<i> and another plain DOM node </i>
 	//		|	</div>
 	//
 	//		containerNode would point to:
 	//
-	//		|		<b> here's a plain dom node
+	//		|		<b> here's a plain DOM node
 	//		|		<span dojoType=subWidget>and a widget</span>
-	//		|		<i> and another plain dom node </i>
+	//		|		<i> and another plain DOM node </i>
 	//
 	//		In templated widgets, "containerNode" is set via a
 	//		dojoAttachPoint assignment.
@@ -2652,10 +2988,16 @@ dojo.declare("dijit._Widget", null, {
 	//		is null for widgets that don't, like TextBox.
 	containerNode: null,
 
+/*=====
+	// _started: Boolean
+	//		startup() has completed.
+	_started: false,
+=====*/
+
 	// attributeMap: [protected] Object
 	//		attributeMap sets up a "binding" between attributes (aka properties)
 	//		of the widget and the widget's DOM.
-	//		Changes to widget attributes listed in attributeMap will be 
+	//		Changes to widget attributes listed in attributeMap will be
 	//		reflected into the DOM.
 	//
 	//		For example, calling attr('title', 'hello')
@@ -2673,6 +3015,10 @@ dojo.declare("dijit._Widget", null, {
 	//	|		title: { node: "titleNode", type: "innerHTML" }
 	//		Maps this.title to this.titleNode.innerHTML
 	//
+	//		- DOM node innerText
+	//	|		title: { node: "titleNode", type: "innerText" }
+	//		Maps this.title to this.titleNode.innerText
+	//
 	//		- DOM node CSS class
 	// |		myClass: { node: "domNode", type: "class" }
 	//		Maps this.myClass to this.domNode.className
@@ -2700,12 +3046,13 @@ dojo.declare("dijit._Widget", null, {
 		onMouseOver: "",
 		onMouseLeave: "",
 		onMouseEnter: "",
-		onMouseUp: ""},
+		onMouseUp: ""
+	},
 
 	onClick: dijit._connectOnUseEventHandler,
 	/*=====
 	onClick: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of mouse click events.
 		// event:
 		//		mouse Event
@@ -2716,7 +3063,7 @@ dojo.declare("dijit._Widget", null, {
 	onDblClick: dijit._connectOnUseEventHandler,
 	/*=====
 	onDblClick: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of mouse double click events.
 		// event:
 		//		mouse Event
@@ -2727,7 +3074,7 @@ dojo.declare("dijit._Widget", null, {
 	onKeyDown: dijit._connectOnUseEventHandler,
 	/*=====
 	onKeyDown: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of keys being pressed down.
 		// event:
 		//		key Event
@@ -2738,7 +3085,7 @@ dojo.declare("dijit._Widget", null, {
 	onKeyPress: dijit._connectOnUseEventHandler,
 	/*=====
 	onKeyPress: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of printable keys being typed.
 		// event:
 		//		key Event
@@ -2749,7 +3096,7 @@ dojo.declare("dijit._Widget", null, {
 	onKeyUp: dijit._connectOnUseEventHandler,
 	/*=====
 	onKeyUp: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of keys being released.
 		// event:
 		//		key Event
@@ -2760,7 +3107,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseDown: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseDown: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse button is pressed down.
 		// event:
 		//		mouse Event
@@ -2771,7 +3118,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseMove: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseMove: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse moves over nodes contained within this widget.
 		// event:
 		//		mouse Event
@@ -2782,7 +3129,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseOut: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseOut: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse moves off of nodes contained within this widget.
 		// event:
 		//		mouse Event
@@ -2793,7 +3140,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseOver: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseOver: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse moves onto nodes contained within this widget.
 		// event:
 		//		mouse Event
@@ -2804,7 +3151,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseLeave: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseLeave: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse moves off of this widget.
 		// event:
 		//		mouse Event
@@ -2815,7 +3162,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseEnter: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseEnter: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse moves onto this widget.
 		// event:
 		//		mouse Event
@@ -2826,7 +3173,7 @@ dojo.declare("dijit._Widget", null, {
 	onMouseUp: dijit._connectOnUseEventHandler,
 	/*=====
 	onMouseUp: function(event){
-		// summary: 
+		// summary:
 		//		Connect to this function to receive notifications of when the mouse button is released.
 		// event:
 		//		mouse Event
@@ -2836,10 +3183,11 @@ dojo.declare("dijit._Widget", null, {
 	=====*/
 
 	// Constants used in templates
-	
-	// _blankGif: [protected] URL
-	//		Used by <img> nodes in templates that really get there image via CSS background-image
-	_blankGif: (dojo.config.blankGif || dojo.moduleUrl("dojo", "resources/blank.gif")),
+
+	// _blankGif: [protected] String
+	//		Path to a blank 1x1 image.
+	//		Used by <img> nodes in templates that really get their image via CSS background-image.
+	_blankGif: (dojo.config.blankGif || dojo.moduleUrl("dojo", "resources/blank.gif")).toString(),
 
 	//////////// INITIALIZATION METHODS ///////////////////////////////////////
 
@@ -2859,45 +3207,33 @@ dojo.declare("dijit._Widget", null, {
 		//		scalar values (like title, duration etc.) and functions,
 		//		typically callbacks like onClick.
 		// srcNodeRef:
-		//		If a srcNodeRef (dom node) is specified:
+		//		If a srcNodeRef (DOM node) is specified:
 		//			- use srcNodeRef.innerHTML as my contents
 		//			- if this is a behavioral widget then apply behavior
-		//			  to that srcNodeRef 
+		//			  to that srcNodeRef
 		//			- otherwise, replace srcNodeRef with my generated DOM
 		//			  tree
 		// 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.
+		//		Create calls a number of widget methods (postMixInProperties, buildRendering, postCreate,
+		//		etc.), some of which of you'll want to override. See http://docs.dojocampus.org/dijit/_Widget
+		//		for a discussion of the widget creation lifecycle.
 		//
-		//		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
+		//		Of course, adventurous developers could override create entirely, but this should
+		//		only be done as a last resort.
 		// tags:
 		//		private
 
-		// store pointer to original dom tree
+		// store pointer to original DOM tree
 		this.srcNodeRef = dojo.byId(srcNodeRef);
 
 		// For garbage collection.  An array of handles returned by Widget.connect()
 		// Each handle returned from Widget.connect() is an array of handles from dojo.connect()
 		this._connects = [];
 
+		// For garbage collection.  An array of handles returned by Widget.subscribe()
+		// The handle returned from Widget.subscribe() is the handle returned from dojo.subscribe()
+		this._subscribes = [];
+
 		// To avoid double-connects, remove entries from _deferredConnects
 		// that have been setup manually by a subclass (ex, by dojoAttachEvent).
 		// If a subclass has redefined a callback (ex: onClick) then assume it's being
@@ -2941,12 +3277,12 @@ dojo.declare("dijit._Widget", null, {
 
 			// If the developer has specified a handler as a widget parameter
 			// (ex: new Button({onClick: ...})
-			// then naturally need to connect from dom node to that handler immediately, 
+			// then naturally need to connect from DOM node to that handler immediately,
 			for(attr in this.params){
 				this._onConnect(attr);
 			}
 		}
-		
+
 		if(this.domNode){
 			this.domNode.setAttribute("widgetId", this.id);
 		}
@@ -2955,7 +3291,7 @@ dojo.declare("dijit._Widget", null, {
 		// If srcNodeRef has been processed and removed from the DOM (e.g. TemplatedWidget) then delete it to allow GC.
 		if(this.srcNodeRef && !this.srcNodeRef.parentNode){
 			delete this.srcNodeRef;
-		}	
+		}
 
 		this._created = true;
 	},
@@ -2975,14 +3311,18 @@ dojo.declare("dijit._Widget", null, {
 		// tags:
 		//		private
 		var condAttrApply = function(attr, scope){
-			if( (scope.params && attr in scope.params) || scope[attr]){
+			if((scope.params && attr in scope.params) || scope[attr]){
 				scope.attr(attr, scope[attr]);
 			}
 		};
+
+		// Do the attributes in attributeMap
 		for(var attr in this.attributeMap){
 			condAttrApply(attr, this);
 		}
-		dojo.forEach(getAttrReg(this.declaredClass), function(a){
+
+		// And also any attributes with custom setters
+		dojo.forEach(getSetterAttributes(this), function(a){
 			if(!(a in this.attributeMap)){
 				condAttrApply(a, this);
 			}
@@ -3001,8 +3341,9 @@ dojo.declare("dijit._Widget", null, {
 
 	buildRendering: function(){
 		// summary:
-		//		Construct the UI for this widget, setting this.domNode.  Most
-		//		widgets will mixin `dijit._Templated`, which implements this
+		//		Construct the UI for this widget, setting this.domNode
+		// description:
+		//		Most widgets will mixin `dijit._Templated`, which implements this
 		//		method.
 		// tags:
 		//		protected
@@ -3011,15 +3352,21 @@ dojo.declare("dijit._Widget", null, {
 
 	postCreate: function(){
 		// summary:
-		//		Called after a widget's dom has been setup
+		//		Processing after the DOM fragment is created
+		// description:
+		//		Called after the DOM fragment has been created, but not necessarily
+		//		added to the document.  Do not include any operations which rely on
+		//		node dimensions or placement.
 		// tags:
 		//		protected
 	},
 
 	startup: function(){
 		// summary:
-		//		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.
+		//		Processing after the DOM fragment is added to the document
+		// description:
+		//		Called after a widget and its children have been created and added to the page,
+		//		and all related widgets have finished their create() cycle, up through postCreate().
 		//		This is useful for composite widgets that need to control or layout sub-widgets.
 		//		Many layout widgets can use this as a wiring phase.
 		this._started = true;
@@ -3029,15 +3376,17 @@ dojo.declare("dijit._Widget", null, {
 
 	destroyRecursive: function(/*Boolean?*/ preserveDom){
 		// 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.
+		// 		Destroy this widget and its descendants
+		// description:
+		//		This is the generic "destructor" function that all widget users
+		// 		should call to cleanly discard with a widget. Once a widget is
+		// 		destroyed, it is removed from the manager object.
 		// preserveDom:
-		//		If true, this method will leave the original Dom structure
+		//		If true, this method will leave the original DOM structure
 		//		alone of descendant Widgets. Note: This will NOT work with
 		//		dijit._Templated widgets.
 
+		this._beingDestroyed = true;
 		this.destroyDescendants(preserveDom);
 		this.destroy(preserveDom);
 	},
@@ -3045,34 +3394,44 @@ dojo.declare("dijit._Widget", null, {
 	destroy: function(/*Boolean*/ preserveDom){
 		// summary:
 		// 		Destroy this widget, but not its descendants.
-		//		Will, however, destroy internal widgets such as those used within a template.
+		//		This method will, however, destroy internal widgets such as those used within a template.
 		// preserveDom: Boolean
-		//		If true, this method will leave the original Dom structure alone.
+		//		If true, this method will leave the original DOM structure alone.
 		//		Note: This will not yet work with _Templated widgets
 
+		this._beingDestroyed = true;
 		this.uninitialize();
-		dojo.forEach(this._connects, function(array){
-			dojo.forEach(array, dojo.disconnect);
+		var d = dojo,
+			dfe = d.forEach,
+			dun = d.unsubscribe;
+		dfe(this._connects, function(array){
+			dfe(array, d.disconnect);
+		});
+		dfe(this._subscribes, function(handle){
+			dun(handle);
 		});
 
 		// destroy widgets created as part of template, etc.
-		dojo.forEach(this._supportingWidgets||[], function(w){ 
-			if(w.destroy){
+		dfe(this._supportingWidgets || [], function(w){
+			if(w.destroyRecursive){
+				w.destroyRecursive();
+			}else if(w.destroy){
 				w.destroy();
 			}
 		});
-		
+
 		this.destroyRendering(preserveDom);
 		dijit.registry.remove(this.id);
+		this._destroyed = true;
 	},
 
 	destroyRendering: function(/*Boolean?*/ preserveDom){
 		// summary:
 		//		Destroys the DOM nodes associated with this widget
 		// preserveDom:
-		//		If true, this method will leave the original Dom structure alone
+		//		If true, this method will leave the original DOM structure alone
 		//		during tear-down. Note: this will not work with _Templated
-		//		widgets yet. 
+		//		widgets yet.
 		// tags:
 		//		protected
 
@@ -3108,7 +3467,7 @@ dojo.declare("dijit._Widget", null, {
 		//		widgets.
 
 		// get all direct descendants and destroy them recursively
-		dojo.forEach(this.getChildren(), function(widget){ 
+		dojo.forEach(this.getChildren(), function(widget){
 			if(widget.destroyRecursive){
 				widget.destroyRecursive(preserveDom);
 			}
@@ -3174,7 +3533,7 @@ dojo.declare("dijit._Widget", null, {
 		// tags:
 		//		private
 		if(event in this._deferredConnects){
-			var mapNode = this[this._deferredConnects[event]||'domNode'];
+			var mapNode = this[this._deferredConnects[event] || 'domNode'];
 			this.connect(mapNode, event.toLowerCase(), event);
 			delete this._deferredConnects[event];
 		}
@@ -3185,7 +3544,7 @@ dojo.declare("dijit._Widget", null, {
 		//		Custom setter for the CSS "class" attribute
 		// tags:
 		//		protected
-		var mapNode = this[this.attributeMap["class"]||'domNode'];
+		var mapNode = this[this.attributeMap["class"] || 'domNode'];
 		dojo.removeClass(mapNode, this["class"])
 		this["class"] = value;
 		dojo.addClass(mapNode, value);
@@ -3202,8 +3561,8 @@ dojo.declare("dijit._Widget", null, {
 		// tags:
 		//		protected
 
-		var mapNode = this[this.attributeMap["style"]||'domNode'];
-		
+		var mapNode = this[this.attributeMap.style || 'domNode'];
+
 		// Note: technically we should revert any style setting made in a previous call
 		// to his method, but that's difficult to keep track of.
 
@@ -3217,7 +3576,7 @@ dojo.declare("dijit._Widget", null, {
 			}
 		}
 
-		this["style"] = value;
+		this.style = value;
 	},
 
 	setAttribute: function(/*String*/ attr, /*anything*/ value){
@@ -3228,7 +3587,7 @@ dojo.declare("dijit._Widget", null, {
 		dojo.deprecated(this.declaredClass+"::setAttribute() is deprecated. Use attr() instead.", "", "2.0");
 		this.attr(attr, value);
 	},
-	
+
 	_attrToDom: function(/*String*/ attr, /*String*/ value){
 		// summary:
 		//		Reflect a widget attribute (title, tabIndex, duration etc.) to
@@ -3243,21 +3602,29 @@ dojo.declare("dijit._Widget", null, {
 		//		private
 
 		var commands = this.attributeMap[attr];
-		dojo.forEach( dojo.isArray(commands) ? commands : [commands], function(command){
+		dojo.forEach(dojo.isArray(commands) ? commands : [commands], function(command){
 
 			// Get target node and what we are doing to that node
 			var mapNode = this[command.node || command || "domNode"];	// DOM node
-			var type = command.type || "attribute";	// class, innerHTML, or attribute
-	
+			var type = command.type || "attribute";	// class, innerHTML, innerText, or attribute
+
 			switch(type){
 				case "attribute":
 					if(dojo.isFunction(value)){ // functions execute in the context of the widget
 						value = dojo.hitch(this, value);
 					}
-					if(/^on[A-Z][a-zA-Z]*$/.test(attr)){ // eg. onSubmit needs to be onsubmit
-						attr = attr.toLowerCase();
-					}
-					dojo.attr(mapNode, attr, value);
+
+					// Get the name of the DOM node attribute; usually it's the same
+					// as the name of the attribute in the widget (attr), but can be overridden.
+					// Also maps handler names to lowercase, like onSubmit --> onsubmit
+					var attrName = command.attribute ? command.attribute :
+						(/^on[A-Z][a-zA-Z]*$/.test(attr) ? attr.toLowerCase() : attr);
+
+					dojo.attr(mapNode, attrName, value);
+					break;
+				case "innerText":
+					mapNode.innerHTML = "";
+					mapNode.appendChild(dojo.doc.createTextNode(value));
 					break;
 				case "innerHTML":
 					mapNode.innerHTML = value;
@@ -3272,7 +3639,7 @@ dojo.declare("dijit._Widget", null, {
 	},
 
 	attr: function(/*String|Object*/name, /*Object?*/value){
-		//	summary:
+		// summary:
 		//		Set or get properties on a widget instance.
 		//	name:
 		//		The property to get or set. If an object is passed here and not
@@ -3281,7 +3648,7 @@ dojo.declare("dijit._Widget", null, {
 		//	value:
 		//		Optional. If provided, attr() operates as a setter. If omitted,
 		//		the current value of the named property is returned.
-		//	description:
+		// description:
 		//		Get or set named properties on a widget. If no value is
 		//		provided, the current value of the attribute is returned,
 		//		potentially via a getter method. If a value is provided, then
@@ -3304,7 +3671,7 @@ dojo.declare("dijit._Widget", null, {
 		//		will do
 		//	|	myTitlePane.title = "Howdy!";
 		//	|	myTitlePane.title.innerHTML = "Howdy!";
-		//		It works for dom node attributes too.  Calling
+		//		It works for DOM node attributes too.  Calling
 		//	|	widget.attr("disabled", true)
 		//		will set the disabled attribute on the widget's focusNode,
 		//		among other housekeeping for a change in disabled state.
@@ -3320,10 +3687,11 @@ dojo.declare("dijit._Widget", null, {
 			return this;
 		}
 		var names = this._getAttrNames(name);
-		if(args == 2){ // setter
+		if(args >= 2){ // setter
 			if(this[names.s]){
 				// use the explicit setter
-				return this[names.s](value) || this;
+				args = dojo._toArray(arguments, 1);
+				return this[names.s].apply(this, args) || this;
 			}else{
 				// if param is specified as DOM node attribute, copy it
 				if(name in this.attributeMap){
@@ -3335,11 +3703,7 @@ dojo.declare("dijit._Widget", null, {
 			}
 			return this;
 		}else{ // getter
-			if(this[names.g]){
-				return this[names.g]();
-			}else{
-				return this[name];
-			}
+			return this[names.g] ? this[names.g]() : this[name];
 		}
 	},
 
@@ -3354,45 +3718,37 @@ dojo.declare("dijit._Widget", null, {
 		var apn = this._attrPairNames;
 		if(apn[name]){ return apn[name]; }
 		var uc = name.charAt(0).toUpperCase() + name.substr(1);
-		return apn[name] = {
+		return (apn[name] = {
 			n: name+"Node",
 			s: "_set"+uc+"Attr",
 			g: "_get"+uc+"Attr"
-		};
+		});
 	},
 
 	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
+		//		Returns a string that represents the widget
+		// description:
+		//		When a widget is cast to a string, this method will be used to generate the
+		//		output. Currently, it does not implement any sort of reversible
 		//		serialization.
 		return '[Widget ' + this.declaredClass + ', ' + (this.id || 'NO ID') + ']'; // String
 	},
 
 	getDescendants: function(){
 		// summary:
-		//		Returns all the widgets that contained by this, i.e., all widgets underneath this.containerNode.
+		//		Returns all the widgets contained by this, i.e., all widgets underneath this.containerNode.
 		//		This method should generally be avoided as it returns widgets declared in templates, which are
 		//		supposed to be internal/hidden, but it's left here for back-compat reasons.
 
-		if(this.containerNode){
-			var list = dojo.query('[widgetId]', this.containerNode);
-			return list.map(dijit.byNode);		// Array
-		}else{
-			return [];
-		}
+		return this.containerNode ? dojo.query('[widgetId]', this.containerNode).map(dijit.byNode) : []; // dijit._Widget[]
 	},
 
 	getChildren: function(){
 		// summary:
 		//		Returns all the widgets contained by this, i.e., all widgets underneath this.containerNode.
 		//		Does not return nested widgets, nor widgets that are part of this widget's template.
-		if(this.containerNode){
-			return dijit.findWidgets(this.containerNode);
-		}else{
-			return [];
-		}
+		return this.containerNode ? dijit.findWidgets(this.containerNode) : []; // dijit._Widget[]
 	},
 
 	// nodesWithKeyClick: [private] String[]
@@ -3411,68 +3767,67 @@ dojo.declare("dijit._Widget", null, {
 		//		Provide widget-specific analog to dojo.connect, except with the
 		//		implicit use of this widget as the target object.
 		//		This version of connect also provides a special "ondijitclick"
-		//		event which triggers on a click or space-up, enter-down in IE
-		//		or enter press in FF (since often can't cancel enter onkeydown
-		//		in FF)
+		//		event which triggers on a click or space or enter keyup
+		// returns:
+		//		A handle that can be passed to `disconnect` in order to disconnect before
+		//		the widget is destroyed.
 		// example:
 		//	|	var btn = new dijit.form.Button();
 		//	|	// when foo.bar() is called, call the listener we're going to
 		//	|	// provide in the scope of btn
-		//	|	btn.connect(foo, "bar", function(){ 
-		//	|		
+		//	|	btn.connect(foo, "bar", function(){
+		//	|		console.debug(this.toString());
 		//	|	});
 		// tags:
 		//		protected
 
-		var d = dojo;
-		var dc = dojo.connect;
-		var handles =[];
+		var d = dojo,
+			dc = d._connect,
+			handles = [];
 		if(event == "ondijitclick"){
 			// add key based click activation for unsupported nodes.
-			if(!this.nodesWithKeyClick[obj.nodeName]){
+			// do all processing onkey up to prevent spurious clicks
+			// for details see comments at top of this file where _lastKeyDownNode is defined
+			if(!this.nodesWithKeyClick[obj.tagName.toLowerCase()]){
 				var m = d.hitch(this, method);
 				handles.push(
 					dc(obj, "onkeydown", this, function(e){
-						if(!d.isFF && e.keyCode == d.keys.ENTER &&
+						//console.log(this.id + ": onkeydown, e.target = ", e.target, ", lastKeyDownNode was ", dijit._lastKeyDownNode, ", equality is ", (e.target === dijit._lastKeyDownNode));
+						if((e.keyCode == d.keys.ENTER || e.keyCode == d.keys.SPACE) &&
 							!e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey){
-							return m(e);
-						}else if(e.keyCode == d.keys.SPACE){
-							// stop space down as it causes IE to scroll
-							// the browser window
-							d.stopEvent(e);
+							// needed on IE for when focus changes between keydown and keyup - otherwise dropdown menus do not work
+							dijit._lastKeyDownNode = e.target;
+							d.stopEvent(e);		// stop event to prevent scrolling on space key in IE
 						}
 			 		}),
 					dc(obj, "onkeyup", this, function(e){
-						if(e.keyCode == d.keys.SPACE && 
-							!e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey){ return m(e); }
+						//console.log(this.id + ": onkeyup, e.target = ", e.target, ", lastKeyDownNode was ", dijit._lastKeyDownNode, ", equality is ", (e.target === dijit._lastKeyDownNode));
+						if( (e.keyCode == d.keys.ENTER || e.keyCode == d.keys.SPACE) &&
+							e.target === dijit._lastKeyDownNode &&
+							!e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey){
+								//need reset here or have problems in FF when focus returns to trigger element after closing popup/alert
+								dijit._lastKeyDownNode = null;
+								return m(e);
+						}
 					})
 				);
-			 	if(d.isFF){
-					handles.push(
-						dc(obj, "onkeypress", this, function(e){
-							if(e.keyCode == d.keys.ENTER &&
-								!e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey){ return m(e); }
-						})
-					);
-			 	}
 			}
 			event = "onclick";
 		}
 		handles.push(dc(obj, event, this, method));
 
-		// return handles for FormElement and ComboBox
 		this._connects.push(handles);
-		return handles;
+		return handles;		// _Widget.Handle
 	},
 
-	disconnect: function(/*Object*/ handles){
+	disconnect: function(/* _Widget.Handle */ handles){
 		// summary:
-		//		Disconnects handle created by this.connect.
-		//		Also removes handle from this widget's list of connects
+		//		Disconnects handle created by `connect`.
+		//		Also removes handle from this widget's list of connects.
 		// tags:
 		//		protected
 		for(var i=0; i<this._connects.length; i++){
-			if(this._connects[i]==handles){
+			if(this._connects[i] == handles){
 				dojo.forEach(handles, dojo.disconnect);
 				this._connects.splice(i, 1);
 				return;
@@ -3480,6 +3835,43 @@ dojo.declare("dijit._Widget", null, {
 		}
 	},
 
+	subscribe: function(
+			/*String*/ topic,
+			/*String|Function*/ method){
+		// summary:
+		//		Subscribes to the specified topic and calls the specified method
+		//		of this object and registers for unsubscribe() on widget destroy.
+		// description:
+		//		Provide widget-specific analog to dojo.subscribe, except with the
+		//		implicit use of this widget as the target object.
+		// example:
+		//	|	var btn = new dijit.form.Button();
+		//	|	// when /my/topic is published, this button changes its label to
+		//	|   // be the parameter of the topic.
+		//	|	btn.subscribe("/my/topic", function(v){
+		//	|		this.attr("label", v);
+		//	|	});
+		var d = dojo,
+			handle = d.subscribe(topic, this, method);
+
+		// return handles for Any widget that may need them
+		this._subscribes.push(handle);
+		return handle;
+	},
+
+	unsubscribe: function(/*Object*/ handle){
+		// summary:
+		//		Unsubscribes handle created by this.subscribe.
+		//		Also removes handle from this widget's list of subscriptions
+		for(var i=0; i<this._subscribes.length; i++){
+			if(this._subscribes[i] == handle){
+				dojo.unsubscribe(handle);
+				this._subscribes.splice(i, 1);
+				return;
+			}
+		}
+	},
+
 	isLeftToRight: function(){
 		// summary:
 		//		Checks the page for text direction
@@ -3494,7 +3886,7 @@ dojo.declare("dijit._Widget", null, {
 		//		and false if not
 		return this.focus && (dojo.style(this.domNode, "display") != "none");
 	},
-	
+
 	placeAt: function(/* String|DomNode|_Widget */reference, /* String?|Int? */position){
 		// summary:
 		//		Place this widget's domNode reference somewhere in the DOM based
@@ -3506,29 +3898,30 @@ dojo.declare("dijit._Widget", null, {
 		//		shorthand mechanism to put an existing (or newly created) Widget
 		//		somewhere in the dom, and allow chaining.
 		//
-		// reference: 
-		//		The String id of a domNode, a domNode reference, or a reference to a Widget posessing 
+		// reference:
+		//		The String id of a domNode, a domNode reference, or a reference to a Widget posessing
 		//		an addChild method.
 		//
-		// position: 
+		// position:
 		//		If passed a string or domNode reference, the position argument
-		//		accepts a string just as dojo.place does, one of: "first", "last", 
-		//		"before", or "after". 
+		//		accepts a string just as dojo.place does, one of: "first", "last",
+		//		"before", or "after".
 		//
-		//		If passed a _Widget reference, and that widget reference has an ".addChild" method, 
+		//		If passed a _Widget reference, and that widget reference has an ".addChild" method,
 		//		it will be called passing this widget instance into that method, supplying the optional
 		//		position index passed.
 		//
-		// returns: dijit._Widget
-		//		Provides a useful return of the newly created dijit._Widget instance so you 
+		// returns:
+		//		dijit._Widget
+		//		Provides a useful return of the newly created dijit._Widget instance so you
 		//		can "chain" this function by instantiating, placing, then saving the return value
-		//		to a variable. 
+		//		to a variable.
 		//
 		// example:
 		// | 	// create a Button with no srcNodeRef, and place it in the body:
 		// | 	var button = new dijit.form.Button({ label:"click" }).placeAt(dojo.body());
 		// | 	// now, 'button' is still the widget reference to the newly created button
-		// | 	dojo.connect(button, "onClick", function(e){  });
+		// | 	dojo.connect(button, "onClick", function(e){ console.log('click'); });
 		//
 		// example:
 		// |	// create a button out of a node with id="src" and append it to id="wrapper":
@@ -3538,19 +3931,47 @@ dojo.declare("dijit._Widget", null, {
 		// |	// place a new button as the first element of some div
 		// |	var button = new dijit.form.Button({ label:"click" }).placeAt("wrapper","first");
 		//
-		// example: 
+		// example:
 		// |	// create a contentpane and add it to a TabContainer
 		// |	var tc = dijit.byId("myTabs");
 		// |	new dijit.layout.ContentPane({ href:"foo.html", title:"Wow!" }).placeAt(tc)
 
-		if(reference["declaredClass"] && reference["addChild"]){
+		if(reference.declaredClass && reference.addChild){
 			reference.addChild(this, position);
 		}else{
 			dojo.place(this.domNode, reference, position);
 		}
 		return this;
-	}
+	},
+
+	_onShow: function(){
+		// summary:
+		//		Internal method called when this widget is made visible.
+		//		See `onShow` for details.
+		this.onShow();
+	},
+
+	onShow: function(){
+		// summary:
+		//		Called when this widget becomes the selected pane in a
+		//		`dijit.layout.TabContainer`, `dijit.layout.StackContainer`,
+		//		`dijit.layout.AccordionContainer`, etc.
+		//
+		//		Also called to indicate display of a `dijit.Dialog`, `dijit.TooltipDialog`, or `dijit.TitlePane`.
+		// tags:
+		//		callback
+	},
 
+	onHide: function(){
+		// summary:
+			//		Called when another widget becomes the selected pane in a
+			//		`dijit.layout.TabContainer`, `dijit.layout.StackContainer`,
+			//		`dijit.layout.AccordionContainer`, etc.
+			//
+			//		Also called to indicate hide of a `dijit.Dialog`, `dijit.TooltipDialog`, or `dijit.TitlePane`.
+			// tags:
+			//		callback
+	}
 });
 
 })();
@@ -3627,24 +4048,28 @@ dojo.string.substitute = function(	/*String*/		template,
 	//		hash to search for substitutions
 	//	transform: 
 	//		a function to process all parameters before substitution takes
-	//		place, e.g. dojo.string.encodeXML
+	//		place, e.g. mylib.encodeXML
 	//	thisObject: 
 	//		where to look for optional format function; default to the global
 	//		namespace
 	//	example:
+	//		Substitutes two expressions in a string from an Array or Object
 	//	|	// returns "File 'foo.html' is not found in directory '/temp'."
+	//	|	// by providing substitution data in an Array
 	//	|	dojo.string.substitute(
 	//	|		"File '${0}' is not found in directory '${1}'.",
 	//	|		["foo.html","/temp"]
 	//	|	);
 	//	|
 	//	|	// also returns "File 'foo.html' is not found in directory '/temp'."
+	//	|	// but provides substitution data in an Object structure.  Dotted
+	//	|	// notation may be used to traverse the structure.
 	//	|	dojo.string.substitute(
 	//	|		"File '${name}' is not found in directory '${info.dir}'.",
 	//	|		{ name: "foo.html", info: { dir: "/temp" } }
 	//	|	);
 	//	example:
-	//		use a transform function to modify the values:
+	//		Use a transform function to modify the values:
 	//	|	// returns "file 'foo.html' is not found in directory '/temp'."
 	//	|	dojo.string.substitute(
 	//	|		"${0} is not found in ${1}.",
@@ -3656,7 +4081,7 @@ dojo.string.substitute = function(	/*String*/		template,
 	//	|		}
 	//	|	);
 	//	example:
-	//		use a formatter
+	//		Use a formatter
 	//	|	// returns "thinger -- howdy"
 	//	|	dojo.string.substitute(
 	//	|		"${0:postfix}", ["thinger"], null, {
@@ -3666,18 +4091,18 @@ dojo.string.substitute = function(	/*String*/		template,
 	//	|		}
 	//	|	);
 
-	thisObject = thisObject||dojo.global;
-	transform = (!transform) ? 
-					function(v){ return v; } : 
-					dojo.hitch(thisObject, transform);
+	thisObject = thisObject || dojo.global;
+	transform = transform ? 
+		dojo.hitch(thisObject, transform) : function(v){ return v; };
 
-	return template.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g, function(match, key, format){
-		var value = dojo.getObject(key, false, map);
-		if(format){
-			value = dojo.getObject(format, false, thisObject).call(thisObject, value, key);
-		}
-		return transform(value, key).toString();
-	}); // string
+	return template.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,
+		function(match, key, format){
+			var value = dojo.getObject(key, false, map);
+			if(format){
+				value = dojo.getObject(format, false, thisObject).call(thisObject, value, key);
+			}
+			return transform(value, key).toString();
+		}); // String
 };
 
 /*=====
@@ -3711,6 +4136,128 @@ dojo.string.trim = String.prototype.trim ?
 
 }
 
+if(!dojo._hasResource["dojo.cache"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
+dojo._hasResource["dojo.cache"] = true;
+dojo.provide("dojo.cache");
+
+/*=====
+dojo.cache = { 
+	// summary:
+	// 		A way to cache string content that is fetchable via `dojo.moduleUrl`.
+};
+=====*/
+
+(function(){
+	var cache = {};
+	dojo.cache = function(/*String||Object*/module, /*String*/url, /*String||Object?*/value){
+		// summary:
+		// 		A getter and setter for storing the string content associated with the
+		// 		module and url arguments.
+		// description:
+		// 		module and url are used to call `dojo.moduleUrl()` to generate a module URL.
+		// 		If value is specified, the cache value for the moduleUrl will be set to
+		// 		that value. Otherwise, dojo.cache will fetch the moduleUrl and store it
+		// 		in its internal cache and return that cached value for the URL. To clear
+		// 		a cache value pass null for value. Since XMLHttpRequest (XHR) is used to fetch the
+		// 		the URL contents, only modules on the same domain of the page can use this capability.
+		// 		The build system can inline the cache values though, to allow for xdomain hosting.
+		// module: String||Object
+		// 		If a String, the module name to use for the base part of the URL, similar to module argument
+		// 		to `dojo.moduleUrl`. If an Object, something that has a .toString() method that
+		// 		generates a valid path for the cache item. For example, a dojo._Url object.
+		// url: String
+		// 		The rest of the path to append to the path derived from the module argument. If
+		// 		module is an object, then this second argument should be the "value" argument instead.
+		// value: String||Object?
+		// 		If a String, the value to use in the cache for the module/url combination.
+		// 		If an Object, it can have two properties: value and sanitize. The value property
+		// 		should be the value to use in the cache, and sanitize can be set to true or false,
+		// 		to indicate if XML declarations should be removed from the value and if the HTML
+		// 		inside a body tag in the value should be extracted as the real value. The value argument
+		// 		or the value property on the value argument are usually only used by the build system
+		// 		as it inlines cache content.
+		//	example:
+		//		To ask dojo.cache to fetch content and store it in the cache (the dojo["cache"] style
+		// 		of call is used to avoid an issue with the build system erroneously trying to intern
+		// 		this example. To get the build system to intern your dojo.cache calls, use the
+		// 		"dojo.cache" style of call):
+		// 		|	//If template.html contains "<h1>Hello</h1>" that will be
+		// 		|	//the value for the text variable.
+		//		|	var text = dojo["cache"]("my.module", "template.html");
+		//	example:
+		//		To ask dojo.cache to fetch content and store it in the cache, and sanitize the input
+		// 		 (the dojo["cache"] style of call is used to avoid an issue with the build system 
+		// 		erroneously trying to intern this example. To get the build system to intern your
+		// 		dojo.cache calls, use the "dojo.cache" style of call):
+		// 		|	//If template.html contains "<html><body><h1>Hello</h1></body></html>", the
+		// 		|	//text variable will contain just "<h1>Hello</h1>".
+		//		|	var text = dojo["cache"]("my.module", "template.html", {sanitize: true});
+		//	example:
+		//		Same example as previous, but demostrates how an object can be passed in as
+		//		the first argument, then the value argument can then be the second argument.
+		// 		|	//If template.html contains "<html><body><h1>Hello</h1></body></html>", the
+		// 		|	//text variable will contain just "<h1>Hello</h1>".
+		//		|	var text = dojo["cache"](new dojo._Url("my/module/template.html"), {sanitize: true});
+
+		//Module could be a string, or an object that has a toString() method
+		//that will return a useful path. If it is an object, then the "url" argument
+		//will actually be the value argument.
+		if(typeof module == "string"){
+			var pathObj = dojo.moduleUrl(module, url);
+		}else{
+			pathObj = module;
+			value = url;
+		}
+		var key = pathObj.toString();
+
+		var val = value;
+		if(value !== undefined && !dojo.isString(value)){
+			val = ("value" in value ? value.value : undefined);
+		}
+
+		var sanitize = value && value.sanitize ? true : false;
+
+		if(val || val === null){
+			//We have a value, either clear or set the cache value.
+			if(val == null){
+				delete cache[key];
+			}else{
+				val = cache[key] = sanitize ? dojo.cache._sanitize(val) : val;
+			}
+		}else{
+			//Allow cache values to be empty strings. If key property does
+			//not exist, fetch it.
+			if(!(key in cache)){
+				val = dojo._getText(key);
+				cache[key] = sanitize ? dojo.cache._sanitize(val) : val;
+			}
+			val = cache[key];
+		}
+		return val; //String
+	};
+
+	dojo.cache._sanitize = function(/*String*/val){
+		// summary: 
+		//		Strips <?xml ...?> declarations so that external SVG and XML
+		// 		documents can be added to a document without worry. Also, if the string
+		//		is an HTML document, only the part inside the body tag is returned.
+		// description:
+		// 		Copied from dijit._Templated._sanitizeTemplateString.
+		if(val){
+			val = val.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, "");
+			var matches = val.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);
+			if(matches){
+				val = matches[1];
+			}
+		}else{
+			val = "";
+		}
+		return val; //String
+	};
+})();
+
+}
+
 if(!dojo._hasResource["dijit._Templated"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
 dojo._hasResource["dijit._Templated"] = true;
 dojo.provide("dijit._Templated");
@@ -3719,22 +4266,25 @@ dojo.provide("dijit._Templated");
 
 
 
+
 dojo.declare("dijit._Templated",
 	null,
 	{
-		//	summary:
+		// summary:
 		//		Mixin for widgets that are instantiated from a template
-		// 
 
 		// templateString: [protected] String
 		//		A string that represents the widget template. Pre-empts the
 		//		templatePath. In builds that have their strings "interned", the
 		//		templatePath is converted to an inline templateString, thereby
 		//		preventing a synchronous network call.
+		//
+		//		Use in conjunction with dojo.cache() to load from a file.
 		templateString: null,
 
-		// templatePath: [protected] String
-		//		Path to template (HTML file) for this widget relative to dojo.baseUrl
+		// templatePath: [protected deprecated] String
+		//		Path to template (HTML file) for this widget relative to dojo.baseUrl.
+		//		Deprecated: use templateString with dojo.cache() instead.
 		templatePath: null,
 
 		// widgetsInTemplate: [protected] Boolean
@@ -3748,6 +4298,26 @@ dojo.declare("dijit._Templated",
 		//		that its template is always re-built from a string
 		_skipNodeCache: false,
 
+		// _earlyTemplatedStartup: Boolean
+		//		A fallback to preserve the 1.0 - 1.3 behavior of children in
+		//		templates having their startup called before the parent widget
+		//		fires postCreate. Defaults to 'false', causing child widgets to
+		//		have their .startup() called immediately before a parent widget
+		//		.startup(), but always after the parent .postCreate(). Set to
+		//		'true' to re-enable to previous, arguably broken, behavior.
+		_earlyTemplatedStartup: false,
+
+		// _attachPoints: [private] String[]
+		//		List of widget attribute names associated with dojoAttachPoint=... in the
+		//		template, ex: ["containerNode", "labelNode"]
+/*=====
+ 		_attachPoints: [],
+ =====*/
+
+		constructor: function(){
+			this._attachPoints = [];
+		},
+
 		_stringRepl: function(tmpl){
 			// summary:
 			//		Does substitution of ${foo} type properties in template string
@@ -3785,6 +4355,10 @@ dojo.declare("dijit._Templated",
 			var node;
 			if(dojo.isString(cached)){
 				node = dojo._toDom(this._stringRepl(cached));
+				if(node.nodeType != 1){
+					// Flag common problems such as templates with multiple top level nodes (nodeType == 11)
+					throw new Error("Invalid template: " + cached);
+				}
 			}else{
 				// if it's a node, all we have to do is clone it
 				node = cached.cloneNode(true);
@@ -3797,7 +4371,29 @@ dojo.declare("dijit._Templated",
 			this._attachTemplateNodes(node);
 
 			if(this.widgetsInTemplate){
-				var cw = (this._supportingWidgets = dojo.parser.parse(node));
+				// Make sure dojoType is used for parsing widgets in template.
+				// The dojo.parser.query could be changed from multiversion support.
+				var parser = dojo.parser, qry, attr;
+				if(parser._query != "[dojoType]"){
+					qry = parser._query;
+					attr = parser._attrName;
+					parser._query = "[dojoType]";
+					parser._attrName = "dojoType";
+				}
+
+				// Store widgets that we need to start at a later point in time
+				var cw = (this._startupWidgets = dojo.parser.parse(node, {
+					noStart: !this._earlyTemplatedStartup
+				}));
+
+				// Restore the query.
+				if(qry){
+					parser._query = qry;
+					parser._attrName = attr;
+				}
+
+				this._supportingWidgets = dijit.findWidgets(node);
+
 				this._attachTemplateNodes(cw, function(n,p){
 					return n[p];
 				});
@@ -3822,13 +4418,13 @@ dojo.declare("dijit._Templated",
 
 		_attachTemplateNodes: function(rootNode, getAttrFunc){
 			// summary:
-			//		Iterate through the template and attach functions and nodes accordingly.	
-			// description:		
+			//		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	
+			//			* dojoAttachEvent
 			//			* waiRole
 			//			* waiState
 			// rootNode: DomNode|Array[Widgets]
@@ -3858,6 +4454,7 @@ dojo.declare("dijit._Templated",
 						}else{
 							this[point]=baseNode;
 						}
+						this._attachPoints.push(point);
 					}
 				}
 
@@ -3902,6 +4499,25 @@ dojo.declare("dijit._Templated",
 					});
 				}
 			}
+		},
+
+		startup: function(){
+			dojo.forEach(this._startupWidgets, function(w){
+				if(w && !w._started && w.startup){
+					w.startup();
+				}
+			});
+			this.inherited(arguments);
+		},
+
+		destroyRendering: function(){
+			// Delete all attach points to prevent IE6 memory leaks.
+			dojo.forEach(this._attachPoints, function(point){
+				delete this[point];
+			}, this);
+			this._attachPoints = [];
+
+			this.inherited(arguments);
 		}
 	}
 );
@@ -3913,8 +4529,8 @@ dijit._Templated.getCachedTemplate = function(templatePath, templateString, alwa
 	// 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.
+	// templatePath: String||dojo.uri.Uri
+	//		The URL to get the template from.
 	// templateString: String?
 	//		a string to use in lieu of fetching the template from a URL. Takes precedence
 	//		over templatePath
@@ -3927,19 +4543,20 @@ dijit._Templated.getCachedTemplate = function(templatePath, templateString, alwa
 	var key = templateString || templatePath;
 	var cached = tmplts[key];
 	if(cached){
-		if(!cached.ownerDocument || cached.ownerDocument == dojo.doc){
-			// string or node of the same document
-			return cached;
-		}
-		// destroy the old cached node of a different document
+		try{
+			// if the cached value is an innerHTML string (no ownerDocument) or a DOM tree created within the current document, then use the current cached value
+			if(!cached.ownerDocument || cached.ownerDocument == dojo.doc){
+				// string or node of the same document
+				return cached;
+			}
+		}catch(e){ /* squelch */ } // IE can throw an exception if cached.ownerDocument was reloaded
 		dojo.destroy(cached);
 	}
 
 	// If necessary, load template string from template path
 	if(!templateString){
-		templateString = dijit._Templated._sanitizeTemplateString(dojo.trim(dojo._getText(templatePath)));
+		templateString = dojo.cache(templatePath, {sanitize: true});
 	}
-
 	templateString = dojo.string.trim(templateString);
 
 	if(alwaysUseString || templateString.match(/\$\{([^\}]+)\}/g)){
@@ -3947,34 +4564,20 @@ dijit._Templated.getCachedTemplate = function(templatePath, templateString, alwa
 		return (tmplts[key] = templateString); //String
 	}else{
 		// there are no variables in the template so we can cache the DOM tree
-		return (tmplts[key] = dojo._toDom(templateString)); //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];
+		var node = dojo._toDom(templateString);
+		if(node.nodeType != 1){
+			throw new Error("Invalid template: " + templateString);
 		}
-	}else{
-		tString = "";
+		return (tmplts[key] = node); //Node
 	}
-	return tString; //String
 };
 
-
 if(dojo.isIE){
 	dojo.addOnWindowUnload(function(){
 		var cache = dijit._Templated._templateCache;
 		for(var key in cache){
 			var value = cache[key];
-			if(!isNaN(value.nodeType)){ // isNode equivalent
+			if(typeof value == "object"){ // value is either a string or a DOM node template
 				dojo.destroy(value);
 			}
 			delete cache[key];
@@ -4015,18 +4618,20 @@ dojo.declare("dijit._Container",
 		//		wouldn't make sense.
 
 		// isContainer: [protected] Boolean
-		//		Just a flag indicating that this widget descends from dijit._Container
+		//		Indicates that this widget acts as a "parent" to the descendant widgets.
+		//		When the parent is started it will call startup() on the child widgets.
+		//		See also `isLayoutContainer`.
 		isContainer: true,
 
 		buildRendering: function(){
 			this.inherited(arguments);
 			if(!this.containerNode){
 				// all widgets with descendants must set containerNode
-   				this.containerNode = this.domNode;
+	 				this.containerNode = this.domNode;
 			}
 		},
 
-		addChild: function(/*Widget*/ widget, /*int?*/ insertIndex){
+		addChild: function(/*dijit._Widget*/ widget, /*int?*/ insertIndex){
 			// summary:
 			//		Makes the given widget a child of this widget.
 			// description:
@@ -4057,37 +4662,15 @@ dojo.declare("dijit._Container",
 			//		Removes the passed widget instance from this widget but does
 			//		not destroy it.  You can also pass in an integer indicating
 			//		the index within the container to remove
+
 			if(typeof widget == "number" && widget > 0){
 				widget = this.getChildren()[widget];
 			}
-			// If we cannot find the widget, just return
-			if(!widget || !widget.domNode){ return; }
-			
-			var node = widget.domNode;
-			node.parentNode.removeChild(node);	// detach but don't destroy
-		},
-
-		_nextElement: function(node){
-			// summary:
-			//      Find the next (non-text, non-comment etc) node
-			// tags:
-			//      private
-			do{
-				node = node.nextSibling;
-			}while(node && node.nodeType != 1);
-			return node;
-		},
 
-		_firstElement: function(node){
-			// summary:
-			//      Find the first (non-text, non-comment etc) node
-			// tags:
-			//      private
-			node = node.firstChild;
-			if(node && node.nodeType != 1){
-				node = this._nextElement(node);
+			if(widget && widget.domNode){
+				var node = widget.domNode;
+				node.parentNode.removeChild(node); // detach but don't destroy
 			}
-			return node;
 		},
 
 		getChildren: function(){
@@ -4101,7 +4684,7 @@ dojo.declare("dijit._Container",
 		hasChildren: function(){
 			// summary:
 			//		Returns true if widget has children, i.e. if this.containerNode contains something.
-			return !!this._firstElement(this.containerNode); // Boolean
+			return dojo.query("> [widgetId]", this.containerNode).length > 0;	// Boolean
 		},
 
 		destroyDescendants: function(/*Boolean*/ preserveDom){
@@ -4110,8 +4693,8 @@ dojo.declare("dijit._Container",
 			//      but not this widget itself
 			dojo.forEach(this.getChildren(), function(child){ child.destroyRecursive(preserveDom); });
 		},
-	
-		_getSiblingOfChild: function(/*Widget*/ child, /*int*/ dir){
+
+		_getSiblingOfChild: function(/*dijit._Widget*/ child, /*int*/ dir){
 			// summary:
 			//		Get the next or previous widget sibling of child
 			// dir:
@@ -4119,24 +4702,38 @@ dojo.declare("dijit._Container",
 			//		if -1, get the previous sibling
 			// tags:
 			//      private
-			var node = child.domNode;
-			var which = (dir>0 ? "nextSibling" : "previousSibling");
+			var node = child.domNode,
+				which = (dir>0 ? "nextSibling" : "previousSibling");
 			do{
 				node = node[which];
 			}while(node && (node.nodeType != 1 || !dijit.byNode(node)));
-			return node ? dijit.byNode(node) : null;
+			return node && dijit.byNode(node);	// dijit._Widget
 		},
-		
-		getIndexOfChild: function(/*Widget*/ child){
+
+		getIndexOfChild: function(/*dijit._Widget*/ child){
 			// summary:
 			//		Gets the index of the child in this container or -1 if not found
-			var children = this.getChildren();
-			for(var i=0, c; c=children[i]; i++){
-				if(c == child){ 
-					return i; // int
-				}
-			}
-			return -1; // int
+			return dojo.indexOf(this.getChildren(), child);	// int
+		},
+
+		startup: function(){
+			// summary:
+			//		Called after all the widgets have been instantiated and their
+			//		dom nodes have been inserted somewhere under dojo.doc.body.
+			//
+			//		Widgets should override this method to do any initialization
+			//		dependent on other widgets existing, and then call
+			//		this superclass method to finish things off.
+			//
+			//		startup() in subclasses shouldn't do anything
+			//		size related because the size of the widget hasn't been set yet.
+
+			if(this._started){ return; }
+
+			// Startup all children of this widget
+			dojo.forEach(this.getChildren(), function(child){ child.startup(); });
+
+			this.inherited(arguments);
 		}
 	}
 );
@@ -4150,28 +4747,22 @@ dojo.provide("dijit._Contained");
 dojo.declare("dijit._Contained",
 		null,
 		{
-			// summary
+			// 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;
+				//		specifies isContainer
+				var parent = dijit.getEnclosingWidget(this.domNode.parentNode);
+				return parent && parent.isContainer ? parent : null;
 			},
 
-			_getSibling: function(which){
+			_getSibling: function(/*String*/ which){
 				// summary:
 				//      Returns next or previous sibling
 				// which:
@@ -4182,9 +4773,7 @@ dojo.declare("dijit._Contained",
 				do{
 					node = node[which+"Sibling"];
 				}while(node && node.nodeType != 1);
-				if(!node){ return null; } // null
-				var id = node.getAttribute("widgetId");
-				return dijit.byId(id);
+				return node && dijit.byNode(node);	// dijit._Widget
 			},
 
 			getPreviousSibling: function(){
@@ -4192,7 +4781,7 @@ dojo.declare("dijit._Contained",
 				//		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
+				return this._getSibling("previous"); // dijit._Widget
 			},
 
 			getNextSibling: function(){
@@ -4200,15 +4789,15 @@ dojo.declare("dijit._Contained",
 				//		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
+				return this._getSibling("next"); // dijit._Widget
 			},
-			
+
 			getIndexInParent: function(){
 				// summary:
 				//		Returns the index of this widget within its container parent.
 				//		It returns -1 if the parent does not exist, or if the parent
 				//		is not a dijit._Container
-				
+
 				var p = this.getParent();
 				if(!p || !p.getIndexOfChild){
 					return -1; // int
@@ -4234,25 +4823,24 @@ dojo.declare("dijit.layout._LayoutWidget",
 	{
 		// summary:
 		//		Base class for a _Container widget which is responsible for laying out its children.
-		//		Widgets which mixin this code must define layout() to lay out the children.
+		//		Widgets which mixin this code must define layout() to manage placement and sizing of the children.
 
 		// baseClass: [protected extension] String
 		//		This class name is applied to the widget's domNode
 		//		and also may be used to generate names for sub nodes,
-		//		like for example dijitTabContainer-content.
+		//		for example dijitTabContainer-content.
 		baseClass: "dijitLayoutContainer",
 
-		// isLayoutContainer: [private deprecated] Boolean
-		//		TODO: this is unused, but maybe it *should* be used for a child to
-		//		detect whether the parent is going to call resize() on it or not
-		//		(see calls to getParent() and resize() in this file)
+		// isLayoutContainer: [protected] Boolean
+		//		Indicates that this widget is going to call resize() on its
+		//		children widgets, setting their size, when they become visible.
 		isLayoutContainer: true,
 
 		postCreate: function(){
 			dojo.addClass(this.domNode, "dijitContainer");
 			dojo.addClass(this.domNode, this.baseClass);
-			
-			// TODO: this.inherited()
+
+			this.inherited(arguments);
 		},
 
 		startup: function(){
@@ -4269,32 +4857,27 @@ dojo.declare("dijit.layout._LayoutWidget",
 
 			if(this._started){ return; }
 
-			// TODO: seems like this code should be in _Container.startup().
-			// Then things that don't extend LayoutContainer (like GridContainer)
-			// would get the behavior for free.
-			dojo.forEach(this.getChildren(), function(child){ child.startup(); });
+			// Need to call inherited first - so that child widgets get started
+			// up correctly
+			this.inherited(arguments);
 
-			// If I am a top level widget
-			if(!this.getParent || !this.getParent()){
+			// If I am a not being controlled by a parent layout widget...
+			var parent = this.getParent && this.getParent()
+			if(!(parent && parent.isLayoutContainer)){
 				// Do recursive sizing and layout of all my descendants
 				// (passing in no argument to resize means that it has to glean the size itself)
 				this.resize();
 
-				// Since my parent isn't a layout container, and my style is width=height=100% (or something similar),
-				// then I need to watch when the window resizes, and size myself accordingly.
-				// (Passing in no arguments to resize means that it has to glean the size itself.)
-				// TODO: make one global listener to avoid getViewport() per widget.
-				this._viewport = dijit.getViewport();
-				this.connect(dojo.global, 'onresize', function(){
-					var newViewport = dijit.getViewport();
-					if(newViewport.w != this._viewport.w ||  newViewport.h != this._viewport.h){
-						this._viewport = newViewport;
-						this.resize();
-					}
+				// Since my parent isn't a layout container, and my style *may be* width=height=100%
+				// or something similar (either set directly or via a CSS class),
+				// monitor when my size changes so that I can re-layout.
+				// For browsers where I can't directly monitor when my size changes,
+				// monitor when the viewport changes size, which *may* indicate a size change for me.
+				this.connect(dojo.isIE ? this.domNode : dojo.global, 'onresize', function(){
+					// Using function(){} closure to ensure no arguments to resize.
+					this.resize();
 				});
 			}
-			
-			this.inherited(arguments);
 		},
 
 		resize: function(changeSize, resultSize){
@@ -4303,7 +4886,7 @@ dojo.declare("dijit.layout._LayoutWidget",
 			// description:
 			//		Change size mode:
 			//			When changeSize is specified, changes the marginBox of this widget
-			//			 and forces it to relayout its contents accordingly.
+			//			and forces it to relayout its contents accordingly.
 			//			changeSize may specify height, width, or both.
 			//
 			//			If resultSize is specified it indicates the size the widget will
@@ -4312,7 +4895,7 @@ dojo.declare("dijit.layout._LayoutWidget",
 			//		Notification mode:
 			//			When changeSize is null, indicates that the caller has already changed
 			//			the size of the widget, or perhaps it changed because the browser
-			//			window was resized.  Tells widget to relayout it's contents accordingly.
+			//			window was resized.  Tells widget to relayout its contents accordingly.
 			//
 			//			If resultSize is also specified it indicates the size the widget has
 			//			become.
@@ -4320,7 +4903,7 @@ dojo.declare("dijit.layout._LayoutWidget",
 			//		In either mode, this method also:
 			//			1. Sets this._borderBox and this._contentBox to the new size of
 			//				the widget.  Queries the current domNode size if necessary.
-			//			2. Calls layout() to resize contents (and maybe adjust child widgets).	
+			//			2. Calls layout() to resize contents (and maybe adjust child widgets).
 			//
 			// changeSize: Object?
 			//		Sets the widget to this margin-box size and position.
@@ -4328,7 +4911,7 @@ dojo.declare("dijit.layout._LayoutWidget",
 			//	|	{w: int, h: int, l: int, t: int}
 			//
 			// resultSize: Object?
-			//		The margin-box size of this widget after applying changeSize (if 
+			//		The margin-box size of this widget after applying changeSize (if
 			//		changeSize is specified).  If caller knows this size and
 			//		passes it in, we don't need to query the browser to get the size.
 			//	|	{w: int, h: int}
@@ -4349,7 +4932,7 @@ dojo.declare("dijit.layout._LayoutWidget",
 			// inaccurate results, so try not to depend on it.
 			var mb = resultSize || {};
 			dojo.mixin(mb, changeSize || {});	// changeSize overrides resultSize
-			if ( !("h" in mb) || !("w" in mb) ){
+			if( !("h" in mb) || !("w" in mb) ){
 				mb = dojo.mixin(dojo.marginBox(node), mb);	// just use dojo.marginBox() to fill in missing values
 			}
 
@@ -4370,7 +4953,7 @@ dojo.declare("dijit.layout._LayoutWidget",
 				h: bb.h - pe.h
 			};
 
-			// Callback for widget to adjust size of it's children
+			// Callback for widget to adjust size of its children
 			this.layout();
 		},
 
@@ -4385,7 +4968,7 @@ dojo.declare("dijit.layout._LayoutWidget",
 			//		protected extension
 		},
 
-		_setupChild: function(/*Widget*/child){
+		_setupChild: function(/*dijit._Widget*/child){
 			// summary:
 			//		Common setup for initial children and children which are added after startup
 			// tags:
@@ -4397,7 +4980,7 @@ dojo.declare("dijit.layout._LayoutWidget",
 			}
 		},
 
-		addChild: function(/*Widget*/ child, /*Integer?*/ insertIndex){
+		addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){
 			// Overrides _Container.addChild() to call _setupChild()
 			this.inherited(arguments);
 			if(this._started){
@@ -4405,7 +4988,7 @@ dojo.declare("dijit.layout._LayoutWidget",
 			}
 		},
 
-		removeChild: function(/*Widget*/ child){
+		removeChild: function(/*dijit._Widget*/ child){
 			// Overrides _Container.removeChild() to remove class added by _setupChild()
 			dojo.removeClass(child.domNode, this.baseClass+"-child");
 			if(child.baseClass){
@@ -4482,11 +5065,11 @@ dijit.layout.marginBox2contentBox = function(/*DomNode*/ node, /*Object*/ mb){
 			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.
+			// note that setting the width of a <div> may affect its height.
 			if(pos == "top" || pos == "bottom"){
 				size(child, { w: dim.w });
 				dim.h -= child.h;
-				if(pos=="top"){
+				if(pos == "top"){
 					dim.t += child.h;
 				}else{
 					elmStyle.top = dim.t + dim.h + "px";
@@ -4518,7 +5101,6 @@ dojo.provide("dijit.form._FormWidget");
 
 dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 	{
-	//
 	// summary:
 	//		Base class for widgets corresponding to native HTML elements such as <checkbox> or <button>,
 	//		which can be children of a <form> node or a `dijit.form.Form` widget.
@@ -4528,7 +5110,7 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 	//		All these widgets should have these attributes just like native HTML input elements.
 	//		You can set them during widget construction or afterwards, via `dijit._Widget.attr`.
 	//
-	//	They also share some common methods.
+	//		They also share some common methods.
 
 	// baseClass: [protected] String
 	//		Root CSS class of the widget (ex: dijitTextBox), used to add CSS classes of widget
@@ -4561,12 +5143,6 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 	//		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,
@@ -4578,11 +5154,10 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 	// These mixins assume that the focus node is an INPUT, as many but not all _FormWidgets are.
 	attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
 		value: "focusNode",
-		disabled: "focusNode",
-		readOnly: "focusNode",
 		id: "focusNode",
 		tabIndex: "focusNode",
-		alt: "focusNode"
+		alt: "focusNode",
+		title: "focusNode"
 	}),
 
 	postMixInProperties: function(){
@@ -4595,19 +5170,22 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 	_setDisabledAttr: function(/*Boolean*/ value){
 		this.disabled = value;
 		dojo.attr(this.focusNode, 'disabled', value);
+		if(this.valueNode){
+			dojo.attr(this.valueNode, 'disabled', value);
+		}
 		dijit.setWaiState(this.focusNode, "disabled", value);
-
-				if(value){
-					//reset 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
-					this.focusNode.removeAttribute('tabIndex');
-				}else{
-					this.focusNode.setAttribute('tabIndex', this.tabIndex);
-				}
-				this._setStateClass();
+
+		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
+			this.focusNode.setAttribute('tabIndex', "-1");
+		}else{
+			this.focusNode.setAttribute('tabIndex', this.tabIndex);
+		}
+		this._setStateClass();
 	},
 
 	setDisabled: function(/*Boolean*/ disabled){
@@ -4657,8 +5235,8 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 					// 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(){
-						//if user clicks on the button, even if the mouse is released outside of it,
-						//this button should get focus (which mimics native browser buttons)
+						// if user clicks on the button, even if the mouse is released outside of it,
+						// this button should get focus (which mimics native browser buttons)
 						if(this._mouseDown && this.isFocusable()){
 							this.focus();
 						}
@@ -4775,11 +5353,15 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 		//		Compare 2 values (as returned by attr('value') for this widget).
 		// tags:
 		//		protected
-		if((typeof val1 == "number") && (typeof val2 == "number")){
-			return (isNaN(val1) && isNaN(val2))? 0 : (val1-val2);
-		}else if(val1 > val2){ return 1; }
-		else if(val1 < val2){ return -1; }
-		else { return 0; }
+		if(typeof val1 == "number" && typeof val2 == "number"){
+			return (isNaN(val1) && isNaN(val2)) ? 0 : val1 - val2;
+		}else if(val1 > val2){
+			return 1;
+		}else if(val1 < val2){
+			return -1;
+		}else{
+			return 0;
+		}
 	},
 
 	onChange: function(newValue){
@@ -4816,7 +5398,18 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 			((typeof newValue != typeof this._lastValueReported) ||
 				this.compare(newValue, this._lastValueReported) != 0)){
 			this._lastValueReported = newValue;
-			if(this._onChangeActive){ this.onChange(newValue); }
+			if(this._onChangeActive){
+				if(this._onChangeHandle){
+					clearTimeout(this._onChangeHandle);
+				}
+				// setTimout allows hidden value processing to run and
+				// also the onChange handler can safely adjust focus, etc
+				this._onChangeHandle = setTimeout(dojo.hitch(this,
+					function(){
+						this._onChangeHandle = null;
+						this.onChange(newValue);
+					}), 0); // try to collapse multiple onChange's fired faster than can be processed
+			}
 		}
 	},
 
@@ -4828,8 +5421,9 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 	},
 
 	destroy: function(){
-		if(this._layoutHackHandle){
-			clearTimeout(this._layoutHackHandle);
+		if(this._onChangeHandle){ // destroy called before last onChange has fired
+			clearTimeout(this._onChangeHandle);
+			this.onChange(this._lastValueReported);
 		}
 		this.inherited(arguments);
 	},
@@ -4846,21 +5440,6 @@ dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated],
 		//		Deprecated.   Use attr('value') instead.
 		dojo.deprecated(this.declaredClass+"::getValue() is deprecated. Use attr('value') instead.", "", "2.0");
 		return this.attr('value');
-	},
-
-	_layoutHack: function(){
-		// summary:
-		//		Work around table sizing bugs on FF2 by forcing redraw
-
-		if(dojo.isFF == 2 && !this._layoutHackHandle){
-			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);
-		}
 	}
 });
 
@@ -4880,10 +5459,27 @@ dojo.declare("dijit.form._FormValueWidget", dijit.form._FormWidget,
 	// so maybe {value: ""} is so the value *doesn't* get copied to focusNode?
 	// Seems like we really want value removed from attributeMap altogether
 	// (although there's no easy way to do that now)
-	attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, { value: "" }),
+
+	// readOnly: Boolean
+	//		Should this widget respond to user input?
+	//		In markup, this is specified as "readOnly".
+	//		Similar to disabled except readOnly form values are submitted.
+	readOnly: false,
+
+	attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, {
+		value: "",
+		readOnly: "focusNode"
+	}),
+
+	_setReadOnlyAttr: function(/*Boolean*/ value){
+		this.readOnly = value;
+		dojo.attr(this.focusNode, 'readOnly', value);
+		dijit.setWaiState(this.focusNode, "readonly", value);
+		this._setStateClass();
+	},
 
 	postCreate: function(){
-		if(dojo.isIE || dojo.isWebKit){ // IE won't stop the event with keypress and Safari won't send an ESCAPE to keypress at all
+		if(dojo.isIE){ // IE won't stop the event with keypress
 			this.connect(this.focusNode || this.domNode, "onkeydown", this._onKeyDown);
 		}
 		// Update our reset value if it hasn't yet been set (because this.attr
@@ -4904,7 +5500,7 @@ dojo.declare("dijit.form._FormValueWidget", dijit.form._FormWidget,
 		this._handleOnChange(newValue, priorityChange);
 	},
 
-	_getValueAttr: function(/*String*/ value){
+	_getValueAttr: function(){
 		// summary:
 		//		Hook so attr('value') works.
 		return this._lastValue;
@@ -4924,20 +5520,35 @@ dojo.declare("dijit.form._FormValueWidget", dijit.form._FormWidget,
 	},
 
 	_onKeyDown: function(e){
-		if(e.keyCode == dojo.keys.ESCAPE && !e.ctrlKey && !e.altKey){
+		if(e.keyCode == dojo.keys.ESCAPE && !(e.ctrlKey || e.altKey || e.metaKey)){
 			var te;
-			if(dojo.isIE){ 
+			if(dojo.isIE){
 				e.preventDefault(); // default behavior needs to be stopped here since keypress is too late
 				te = document.createEventObject();
 				te.keyCode = dojo.keys.ESCAPE;
 				te.shiftKey = e.shiftKey;
 				e.srcElement.fireEvent('onkeypress', te);
-			}else if(dojo.isWebKit){ // ESCAPE needs help making it into keypress
-				te = document.createEvent('Events');
-				te.initEvent('keypress', true, true);
-				te.keyCode = dojo.keys.ESCAPE;
-				te.shiftKey = e.shiftKey;
-				e.target.dispatchEvent(te);
+			}
+		}
+	},
+
+	_layoutHackIE7: function(){
+		// summary:
+		//		Work around table sizing bugs on IE7 by forcing redraw
+
+		if(dojo.isIE == 7){ // fix IE7 layout bug when the widget is scrolled out of sight
+			var domNode = this.domNode;
+			var parent = domNode.parentNode;
+			var pingNode = domNode.firstChild || domNode; // target node most unlikely to have a custom filter
+			var origFilter = pingNode.style.filter; // save custom filter, most likely nothing
+			while(parent && parent.clientHeight == 0){ // search for parents that haven't rendered yet
+				parent._disconnectHandle = this.connect(parent, "onscroll", dojo.hitch(this, function(e){
+					this.disconnect(parent._disconnectHandle); // only call once
+					parent.removeAttribute("_disconnectHandle"); // clean up DOM node
+					pingNode.style.filter = (new Date()).getMilliseconds(); // set to anything that's unique
+					setTimeout(function(){ pingNode.style.filter = origFilter }, 0); // restore custom filter, if any
+				}));
+				parent = parent.parentNode;
 			}
 		}
 	}
@@ -4951,11 +5562,12 @@ dojo.provide("dijit.dijit");
 
 /*=====
 dijit.dijit = {
-	// summary: A roll-up for common dijit methods
+	// 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>
 	//
@@ -4981,7 +5593,7 @@ dojo.provide("dijit._KeyNavContainer");
 
 
 dojo.declare("dijit._KeyNavContainer",
-	[dijit._Container],
+	dijit._Container,
 	{
 
 		// summary:
@@ -4998,12 +5610,11 @@ dojo.declare("dijit._KeyNavContainer",
 =====*/
 
 		// tabIndex: Integer
-		//		Tab index of the container; same as HTML tabindex attribute.
+		//		Tab index of the container; same as HTML tabIndex attribute.
 		//		Note then when user tabs into the container, focus is immediately
 		//		moved to the first item in the container.
 		tabIndex: "0",
 
-
 		_keyNavCodes: {},
 
 		connectKeyNavHandlers: function(/*dojo.keys[]*/ prevKeyCodes, /*dojo.keys[]*/ nextKeyCodes){
@@ -5017,7 +5628,7 @@ dojo.declare("dijit._KeyNavContainer",
 			// tags:
 			//		protected
 
-			var keyCodes = this._keyNavCodes = {};
+			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; });
@@ -5034,7 +5645,7 @@ dojo.declare("dijit._KeyNavContainer",
 			dojo.forEach(this.getChildren(), dojo.hitch(this, "_startupChild"));
 		},
 
-		addChild: function(/*Widget*/ widget, /*int?*/ insertIndex){
+		addChild: function(/*dijit._Widget*/ widget, /*int?*/ insertIndex){
 			// summary:
 			//		Add a child to our _Container
 			dijit._KeyNavContainer.superclass.addChild.apply(this, arguments);
@@ -5052,94 +5663,67 @@ dojo.declare("dijit._KeyNavContainer",
 			//		Focus the first focusable child in the container.
 			// tags:
 			//		protected
-			this.focusChild(this._getFirstFocusableChild());
+			var child = this._getFirstFocusableChild();
+			if(child){ // edge case: Menu could be empty or hidden
+				this.focusChild(child);
+			}
 		},
 
 		focusNext: function(){
 			// summary:
-			//		Focus the next widget or focal node (for widgets
-			//		with multiple focal nodes) within this container.
+			//		Focus the next widget
 			// tags:
 			//		protected
-			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);
-			}
+			this.focusChild(child);
 		},
 
 		focusPrev: function(){
 			// summary:
-			//		Focus the previous widget or focal node (for widgets
-			//		with multiple focal nodes) within this container.
+			//		Focus the last focusable node in the previous widget
+			//		(ex: go to the ComboButton icon section rather than button section)
 			// tags:
 			//		protected
-			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);
-			}
+			this.focusChild(child, true);
 		},
 
-		focusChild: function(/*Widget*/ widget, /*Node?*/ node){
+		focusChild: function(/*dijit._Widget*/ widget, /*Boolean*/ last){
 			// summary:
-			//		Focus widget. Optionally focus 'node' within widget.
+			//		Focus widget.
+			// widget:
+			//		Reference to container's child widget
+			// last:
+			//		If true and if widget has multiple focusable nodes, focus the
+			//		last one instead of the first one
 			// tags:
 			//		protected
-			if(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.
-			// tags:
-			//		private
-			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);
+			
+			if(this.focusedChild && widget !== this.focusedChild){
+				this._onChildBlur(this.focusedChild);
 			}
+			widget.focus(last ? "end" : "start");
+			this.focusedChild = widget;
 		},
 
-		_connectNode: function(/*Element*/ node){
+		_startupChild: function(/*dijit._Widget*/ widget){
 			// summary:
-			//		Monitor focus and blur events on the node
+			//		Setup for each child widget
+			// description:
+			//		Sets tabIndex=-1 on each child, so that the tab key will 
+			//		leave the container rather than visiting each child.
 			// tags:
 			//		private
-			this.connect(node, "onfocus", "_onNodeFocus");
-			this.connect(node, "onblur", "_onNodeBlur");
+			
+			widget.attr("tabIndex", "-1");
+			
+			this.connect(widget, "_onFocus", function(){
+				// Set valid tabIndex so tabbing away from widget goes to right place, see #10272
+				widget.attr("tabIndex", this.tabIndex);
+			});
+			this.connect(widget, "_onBlur", function(){
+				widget.attr("tabIndex", "-1");
+			});
 		},
 
 		_onContainerFocus: function(evt){
@@ -5160,11 +5744,12 @@ dojo.declare("dijit._KeyNavContainer",
 			if(evt.target !== this.domNode){ return; }
 
 			this.focusFirstChild();
-			
-			// and then remove the container's tabIndex,
+
+			// and then set the container's tabIndex to -1,
+			// (don't remove as that breaks Safari 4)
 			// so that tab or shift-tab will go to the fields after/before
 			// the container, rather than the container itself
-			dojo.removeAttr(this.domNode, "tabIndex");
+			dojo.attr(this.domNode, "tabIndex", "-1");
 		},
 
 		_onBlur: function(evt){
@@ -5173,9 +5758,9 @@ dojo.declare("dijit._KeyNavContainer",
 			// Note that using _onBlur() so that this doesn't happen when focus is shifted
 			// to one of my child widgets (typically a popup)
 			if(this.tabIndex){
-				dojo.attr(this.domNode, "tabindex", this.tabIndex);
+				dojo.attr(this.domNode, "tabIndex", this.tabIndex);
 			}
-			// TODO: this.inherited(arguments);
+			this.inherited(arguments);
 		},
 
 		_onContainerKeypress: function(evt){
@@ -5192,29 +5777,7 @@ dojo.declare("dijit._KeyNavContainer",
 			}
 		},
 
-		_onNodeFocus: function(evt){
-			// summary:
-			//		Handler for onfocus event on a child node
-			// tags:
-			//		private
-
-			// 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){
-			// summary:
-			//		Handler for onblur event on a child node
-			// tags:
-			//		private
-			dojo.stopEvent(evt);
-		},
-
-		_onChildBlur: function(/*Widget*/ widget){
+		_onChildBlur: function(/*dijit._Widget*/ widget){
 			// summary:
 			//		Called when focus leaves a child widget to go
 			//		to a sibling widget.
@@ -5225,7 +5788,7 @@ dojo.declare("dijit._KeyNavContainer",
 		_getFirstFocusableChild: function(){
 			// summary:
 			//		Returns first child that can be focused
-			return this._getNextFocusableChild(null, 1);
+			return this._getNextFocusableChild(null, 1);	// dijit._Widget
 		},
 
 		_getNextFocusableChild: function(child, dir){
@@ -5246,12 +5809,12 @@ dojo.declare("dijit._KeyNavContainer",
 					child = children[(dir>0) ? 0 : (children.length-1)];
 				}
 				if(child.isFocusable()){
-					return child;
+					return child;	// dijit._Widget
 				}
 				child = this._getSiblingOfChild(child, dir);
 			}
 			// no focusable child found
-			return null;
+			return null;	// dijit._Widget
 		}
 	}
 );
@@ -5274,7 +5837,7 @@ dojo.declare("dijit.MenuItem",
 
 		// Make 3 columns
 		// icon, label, and expand arrow (BiDi-dependent) indicating sub-menu
-		templateString:"<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset\" waiRole=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon\" dojoAttachPoint=\"iconNode\">\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" dojoAttachPoint=\"containerNode\"></td>\n\t<td class [...]
+		templateString: dojo.cache("dijit", "templates/MenuItem.html", "<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset\" waiRole=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon\" dojoAttachPoint=\"iconNode\">\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" dojo [...]
 
 		attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
 			label: { node: "containerNode", type: "innerHTML" },
@@ -5311,8 +5874,13 @@ dojo.declare("dijit.MenuItem",
 
 		postCreate: function(){
 			dojo.setSelectable(this.domNode, false);
-			dojo.attr(this.containerNode, "id", this.id+"_text");
-			dijit.setWaiState(this.domNode, "labelledby", this.id+"_text");
+			var label = this.id+"_text";
+			dojo.attr(this.containerNode, "id", label);
+			if(this.accelKeyNode){
+				dojo.attr(this.accelKeyNode, "id", this.id + "_accel");
+				label += " " + this.id + "_accel";
+			}
+			dijit.setWaiState(this.domNode, "labelledby", label);
 		},
 
 		_onHover: function(){
@@ -5358,6 +5926,10 @@ dojo.declare("dijit.MenuItem",
 			// summary:
 			//		Focus on this MenuItem
 			try{
+				if(dojo.isIE == 8){
+					// needed for IE8 which won't scroll TR tags into view on focus yet calling scrollIntoView creates flicker (#10275)
+					this.containerNode.focus();
+				}
 				dijit.focus(this.focusNode);
 			}catch(e){
 				// this throws on IE (at least) in some scenarios
@@ -5371,8 +5943,9 @@ dojo.declare("dijit.MenuItem",
 			// tags:
 			//		protected
 			this._setSelected(true);
+			this.getParent()._onItemFocus(this);
 
-			// TODO: this.inherited(arguments);
+			this.inherited(arguments);
 		},
 
 		_setSelected: function(selected){
@@ -5390,7 +5963,7 @@ dojo.declare("dijit.MenuItem",
 			 * MenuItem is not in the chain of active widgets and gets a premature call to
 			 * _onBlur()
 			 */
-			
+
 			dojo.toggleClass(this.domNode, "dijitMenuItemSelected", selected);
 		},
 
@@ -5444,13 +6017,13 @@ dojo.declare("dijit.PopupMenuItem",
 		dijit.MenuItem,
 		{
 		_fillContent: function(){
-			// summary: 
+			// summary:
 			//		When Menu is declared in markup, this code gets the menu label and
 			//		the popup widget from the srcNodeRef.
 			// description:
 			//		srcNodeRefinnerHTML contains both the menu item text and a popup widget
 			//		The first part holds the menu item text and the second part is the popup
-			// example: 
+			// example:
 			// |	<div dojoType="dijit.PopupMenuItem">
 			// |		<span>pick me</span>
 			// |		<popup> ... </popup>
@@ -5485,10 +6058,14 @@ dojo.declare("dijit.PopupMenuItem",
 			}
 			dijit.setWaiState(this.focusNode, "haspopup", "true");
 		},
-		
+
 		destroyDescendants: function(){
 			if(this.popup){
-				this.popup.destroyRecursive();
+				// Destroy the popup, unless it's already been destroyed.  This can happen because
+				// the popup is a direct child of <body> even though it's logically my child.
+				if(!this.popup._destroyed){
+					this.popup.destroyRecursive();
+				}
 				delete this.popup;
 			}
 			this.inherited(arguments);
@@ -5509,8 +6086,8 @@ dojo.declare("dijit.CheckedMenuItem",
 		{
 		// summary:
 		//		A checkbox-like menu item for toggling on and off
-		
-		templateString:"<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitemcheckbox\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset\" waiRole=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon dijitCheckedMenuItemIcon\" dojoAttachPoint=\"iconNode\">\n\t\t<span class=\"dijitCheckedMenuItemIconChar\">✓</span>\n\t</td>\n\t<td class=\ [...]
+
+		templateString: dojo.cache("dijit", "templates/CheckedMenuItem.html", "<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitemcheckbox\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset\" waiRole=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon dijitCheckedMenuItemIcon\" dojoAttachPoint=\"iconNode\">\n\t\t<span class=\"dijitCheckedMen [...]
 
 		// checked: Boolean
 		//		Our checked state
@@ -5560,12 +6137,12 @@ dojo.declare("dijit.MenuSeparator",
 		// summary:
 		//		A line between two menu items
 
-		templateString:"<tr class=\"dijitMenuSeparator\">\n\t<td colspan=\"4\">\n\t\t<div class=\"dijitMenuSeparatorTop\"></div>\n\t\t<div class=\"dijitMenuSeparatorBottom\"></div>\n\t</td>\n</tr>\n",
+		templateString: dojo.cache("dijit", "templates/MenuSeparator.html", "<tr class=\"dijitMenuSeparator\">\n\t<td colspan=\"4\">\n\t\t<div class=\"dijitMenuSeparatorTop\"></div>\n\t\t<div class=\"dijitMenuSeparatorBottom\"></div>\n\t</td>\n</tr>\n"),
 
 		postCreate: function(){
 			dojo.setSelectable(this.domNode, false);
 		},
-		
+
 		isFocusable: function(){
 			// summary:
 			//		Override to always return false
@@ -5647,6 +6224,28 @@ dojo.declare("dijit._MenuBase",
 		}
 	},
 
+	_onPopupHover: function(/*Event*/ evt){
+		// summary:
+		//		This handler is called when the mouse moves over the popup.
+		// tags:
+		//		private
+
+		// if the mouse hovers over a menu popup that is in pending-close state,
+		// then stop the close operation.
+		// This can't be done in onItemHover since some popup targets don't have MenuItems (e.g. ColorPicker)
+		if(this.currentPopup && this.currentPopup._pendingClose_timer){
+			var parentMenu = this.currentPopup.parentMenu;
+			// highlight the parent menu item pointing to this popup
+			if(parentMenu.focusedChild){
+				parentMenu.focusedChild._setSelected(false);
+			}
+			parentMenu.focusedChild = this.currentPopup.from_item;
+			parentMenu.focusedChild._setSelected(true);
+			// cancel the pending close
+			this._stopPendingCloseTimer(this.currentPopup);
+		}
+	},
+
 	onItemHover: function(/*MenuItem*/ item){
 		// summary:
 		//		Called when cursor is over a MenuItem.
@@ -5655,15 +6254,21 @@ dojo.declare("dijit._MenuBase",
 
 		// Don't do anything unless user has "activated" the menu by:
 		//		1) clicking it
-		//		2) tabbing into it
-		//		3) opening it from a parent menu (which automatically focuses it)
+		//		2) opening it from a parent menu (which automatically focuses it)
 		if(this.isActive){
 			this.focusChild(item);
-	
 			if(this.focusedChild.popup && !this.focusedChild.disabled && !this.hover_timer){
 				this.hover_timer = setTimeout(dojo.hitch(this, "_openPopup"), this.popupDelay);
 			}
 		}
+		// if the user is mixing mouse and keyboard navigation,
+		// then the menu may not be active but a menu item has focus,
+		// but it's not the item that the mouse just hovered over.
+		// To avoid both keyboard and mouse selections, use the latest.
+		if(this.focusedChild){
+			this.focusChild(item);
+		}
+		this._hoveredChild = item;
 	},
 
 	_onChildBlur: function(item){
@@ -5672,12 +6277,20 @@ dojo.declare("dijit._MenuBase",
 		//		has been removed from the MenuItem *and* it's descendant menus.
 		// tags:
 		//		private
-
+		this._stopPopupTimer();
 		item._setSelected(false);
-
 		// Close all popups that are open and descendants of this menu
-		dijit.popup.close(item.popup);
-		this._stopPopupTimer();
+		var itemPopup = item.popup;
+		if(itemPopup){
+			this._stopPendingCloseTimer(itemPopup);
+			itemPopup._pendingClose_timer = setTimeout(function(){
+				itemPopup._pendingClose_timer = null;
+				if(itemPopup.parentMenu){
+					itemPopup.parentMenu.currentPopup = null;
+				}
+				dijit.popup.close(itemPopup); // this calls onClose
+			}, this.popupDelay);
+		}
 	},
 
 	onItemUnhover: function(/*MenuItem*/ item){
@@ -5685,9 +6298,11 @@ dojo.declare("dijit._MenuBase",
 		//		Callback fires when mouse exits a MenuItem
 		// tags:
 		//		protected
+
 		if(this.isActive){
 			this._stopPopupTimer();
 		}
+		if(this._hoveredChild == item){ this._hoveredChild = null; }
 	},
 
 	_stopPopupTimer: function(){
@@ -5702,6 +6317,28 @@ dojo.declare("dijit._MenuBase",
 		}
 	},
 
+	_stopPendingCloseTimer: function(/*dijit._Widget*/ popup){
+		// summary:
+		//		Cancels the pending-close timer because the close has been preempted
+		// tags:
+		//		private
+		if(popup._pendingClose_timer){
+			clearTimeout(popup._pendingClose_timer);
+			popup._pendingClose_timer = null;
+		}
+	},
+
+	_stopFocusTimer: function(){
+		// summary:
+		//		Cancels the pending-focus timer because the menu was closed before focus occured
+		// tags:
+		//		private
+		if(this._focus_timer){
+			clearTimeout(this._focus_timer);
+			this._focus_timer = null;
+		}
+	},
+
 	_getTopMenu: function(){
 		// summary:
 		//		Returns the top menu in this chain of Menus
@@ -5711,19 +6348,22 @@ dojo.declare("dijit._MenuBase",
 		return top;
 	},
 
-	onItemClick: function(/*Widget*/ item, /*Event*/ evt){
+	onItemClick: function(/*dijit._Widget*/ item, /*Event*/ evt){
 		// summary:
 		//		Handle clicks on an item.
 		// tags:
 		//		private
 		if(item.disabled){ return false; }
 
+		// this can't be done in _onFocus since the _onFocus events occurs asynchronously
+		if(typeof this.isShowingNow == 'undefined'){ // non-popup menu
+			this._markActive();
+		}
+
 		this.focusChild(item);
 
 		if(item.popup){
-			if(!this.is_open){
-				this._openPopup();
-			}
+			this._openPopup();
 		}else{
 			// before calling user defined handler, close hierarchy of menus
 			// and restore focus to place it was when menu was opened
@@ -5742,36 +6382,67 @@ dojo.declare("dijit._MenuBase",
 
 		this._stopPopupTimer();
 		var from_item = this.focusedChild;
+		if(!from_item){ return; } // the focused child lost focus since the timer was started
 		var popup = from_item.popup;
-
 		if(popup.isShowingNow){ return; }
+		if(this.currentPopup){
+			this._stopPendingCloseTimer(this.currentPopup);
+			dijit.popup.close(this.currentPopup);
+		}
 		popup.parentMenu = this;
+		popup.from_item = from_item; // helps finding the parent item that should be focused for this popup
 		var self = this;
 		dijit.popup.open({
 			parent: this,
 			popup: popup,
 			around: from_item.domNode,
-			orient: this._orient || (this.isLeftToRight() ? {'TR': 'TL', 'TL': 'TR'} : {'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;
+			orient: this._orient || (this.isLeftToRight() ?
+									{'TR': 'TL', 'TL': 'TR', 'BR': 'BL', 'BL': 'BR'} :
+									{'TL': 'TR', 'TR': 'TL', 'BL': 'BR', 'BR': 'BL'}),
+			onCancel: function(){ // called when the child menu is canceled
+				// set isActive=false (_closeChild vs _cleanUp) so that subsequent hovering will NOT open child menus
+				// which seems aligned with the UX of most applications (e.g. notepad, wordpad, paint shop pro)
+				self.focusChild(from_item);	// put focus back on my node
+				self._cleanUp();			// close the submenu (be sure this is done _after_ focus is moved)
+				from_item._setSelected(true); // oops, _cleanUp() deselected the item
+				self.focusedChild = from_item;	// and unset focusedChild
 			},
-			onExecute: dojo.hitch(this, "_onDescendantExecute")
+			onExecute: dojo.hitch(this, "_cleanUp")
 		});
 
 		this.currentPopup = popup;
+		// detect mouseovers to handle lazy mouse movements that temporarily focus other menu items
+		popup.connect(popup.domNode, "onmouseenter", dojo.hitch(self, "_onPopupHover")); // cleaned up when the popped-up widget is destroyed on close
 
 		if(popup.focus){
 			// If user is opening the popup via keyboard (right arrow, or down arrow for MenuBar),
 			// if the cursor happens to collide with the popup, it will generate an onmouseover event
 			// even though the mouse wasn't moved.   Use a setTimeout() to call popup.focus so that
 			// our focus() call overrides the onmouseover event, rather than vice-versa.  (#8742)
-			setTimeout(dojo.hitch(popup, "focus"), 0);
+			popup._focus_timer = setTimeout(dojo.hitch(popup, function(){
+				this._focus_timer = null;
+				this.focus();
+			}), 0);
 		}
 	},
 
+	_markActive: function(){
+		// summary:
+		//              Mark this menu's state as active.
+		//		Called when this Menu gets focus from:
+		//			1) clicking it (mouse or via space/arrow key)
+		//			2) being opened by a parent menu.
+		//		This is not called just from mouse hover.
+		//		Focusing a menu via TAB does NOT automatically set isActive
+		//		since TAB is a navigation operation and not a selection one.
+		//		For Windows apps, pressing the ALT key focuses the menubar
+		//		menus (similar to TAB navigation) but the menu is not active
+		//		(ie no dropdown) until an item is clicked.
+		this.isActive = true;
+		dojo.addClass(this.domNode, "dijitMenuActive");
+		dojo.removeClass(this.domNode, "dijitMenuPassive");
+	},
+
 	onOpen: function(/*Event*/ e){
 		// summary:
 		//		Callback when this menu is opened.
@@ -5781,6 +6452,15 @@ dojo.declare("dijit._MenuBase",
 		//		private
 
 		this.isShowingNow = true;
+		this._markActive();
+	},
+
+	_markInactive: function(){
+		// summary:
+		//		Mark this menu's state as inactive.
+		this.isActive = false; // don't do this in _onBlur since the state is pending-close until we get here
+		dojo.removeClass(this.domNode, "dijitMenuActive");
+		dojo.addClass(this.domNode, "dijitMenuPassive");
 	},
 
 	onClose: function(){
@@ -5791,52 +6471,61 @@ dojo.declare("dijit._MenuBase",
 		// tags:
 		//		private
 
-		this._stopPopupTimer();
-		this.parentMenu = null;
+		this._stopFocusTimer();
+		this._markInactive();
 		this.isShowingNow = false;
-		this.currentPopup = null;
-		if(this.focusedChild){
-			this._onChildBlur(this.focusedChild);
+		this.parentMenu = null;
+	},
+
+	_closeChild: function(){
+		// summary:
+		//		Called when submenu is clicked or focus is lost.  Close hierarchy of menus.
+		// tags:
+		//		private
+		this._stopPopupTimer();
+		if(this.focusedChild){ // unhighlight the focused item
+			this.focusedChild._setSelected(false);
+			this.focusedChild._onUnhover();
 			this.focusedChild = null;
 		}
+		if(this.currentPopup){
+			// Close all popups that are open and descendants of this menu
+			dijit.popup.close(this.currentPopup);
+			this.currentPopup = null;
+		}
 	},
 
-	_onFocus: function(){
+	_onItemFocus: function(/*MenuItem*/ item){
 		// summary:
-		//		Called when this Menu gets focus from:
+		//		Called when child of this Menu gets focus from:
 		//			1) clicking it
 		//			2) tabbing into it
 		//			3) being opened by a parent menu.
 		//		This is not called just from mouse hover.
-		// tags:
-		//		protected
-		this.isActive = true;
-		dojo.addClass(this.domNode, "dijitMenuActive");
-		dojo.removeClass(this.domNode, "dijitMenuPassive");
-		this.inherited(arguments);
+		if(this._hoveredChild && this._hoveredChild != item){
+			this._hoveredChild._onUnhover(); // any previous mouse movement is trumped by focus selection
+		}
 	},
-	
+
 	_onBlur: function(){
 		// summary:
 		//		Called when focus is moved away from this Menu and it's submenus.
 		// tags:
 		//		protected
-		this.isActive = false;
-		dojo.removeClass(this.domNode, "dijitMenuActive");
-		dojo.addClass(this.domNode, "dijitMenuPassive");
-
-		// If user blurs/clicks away from a MenuBar (or always visible Menu), then close all popped up submenus etc.
-		this.onClose();
-
+		this._cleanUp();
 		this.inherited(arguments);
 	},
 
-	_onDescendantExecute: function(){
+	_cleanUp: function(){
 		// summary:
-		//		Called when submenu is clicked.  Close hierarchy of menus.
+		//		Called when the user is done with this menu.  Closes hierarchy of menus.
 		// tags:
 		//		private
-		this.onClose();
+
+		this._closeChild(); // don't call this.onClose since that's incorrect for MenuBar's that never close
+		if(typeof this.isShowingNow == 'undefined'){ // non-popup menu doesn't call onClose
+			this._markInactive();
+		}
 	}
 });
 
@@ -5854,7 +6543,7 @@ dojo.declare("dijit.Menu",
 		this._bindings = [];
 	},
 
-	templateString:"<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" waiRole=\"menu\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress:_onKeyPress\">\n\t<tbody class=\"dijitReset\" dojoAttachPoint=\"containerNode\"></tbody>\n</table>\n",
+	templateString: dojo.cache("dijit", "templates/Menu.html", "<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" waiRole=\"menu\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress:_onKeyPress\">\n\t<tbody class=\"dijitReset\" dojoAttachPoint=\"containerNode\"></tbody>\n</table>\n"),
 
 	// targetNodeIds: [const] String[]
 	//		Array of dom node ids of nodes to attach to.
@@ -5869,7 +6558,11 @@ dojo.declare("dijit.Menu",
 	// leftClickToOpen: [const] Boolean
 	//		If true, menu will open on left click instead of right click, similiar to a file menu.
 	leftClickToOpen: false,
-	
+
+	// refocus: Boolean
+	// 		When this menu closes, re-focus the element which had focus before it was opened.
+	refocus: true,
+
 	// _contextMenuWithMouse: [private] Boolean
 	//		Used to record mouse and keyboard events to determine if a context
 	//		menu is being opened with the keyboard or the mouse.
@@ -5879,6 +6572,9 @@ dojo.declare("dijit.Menu",
 		if(this.contextMenuForWindow){
 			this.bindDomNode(dojo.body());
 		}else{
+			// TODO: should have _setTargetNodeIds() method to handle initialization and a possible
+			// later attr('targetNodeIds', ...) call.   There's also a problem that targetNodeIds[]
+			// gets stale after calls to bindDomNode()/unBindDomNode() as it still is just the original list (see #9610)
 			dojo.forEach(this.targetNodeIds, this.bindDomNode, this);
 		}
 		var k = dojo.keys, l = this.isLeftToRight();
@@ -5920,9 +6616,9 @@ dojo.declare("dijit.Menu",
 		//		Returns the window reference of the passed iframe
 		// tags:
 		//		private
-		var win = dijit.getDocumentWindow(dijit.Menu._iframeContentDocument(iframe_el)) ||
+		var win = dijit.getDocumentWindow(this._iframeContentDocument(iframe_el)) ||
 			// Moz. TODO: is this available when defaultView isn't?
-			dijit.Menu._iframeContentDocument(iframe_el)['__parent__'] ||
+			this._iframeContentDocument(iframe_el)['__parent__'] ||
 			(iframe_el.name && dojo.doc.frames[iframe_el.name]) || null;
 		return win;	//	Window
 	},
@@ -5944,31 +6640,99 @@ dojo.declare("dijit.Menu",
 		//		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);
+		var cn;	// Connect node
+
+		// Support context menus on iframes.   Rather than binding to the iframe itself we need
+		// to bind to the <body> node inside the iframe.
+		if(node.tagName.toLowerCase() == "iframe"){
+			var iframe = node,
+				win = this._iframeContentWindow(iframe);
+			cn = dojo.withGlobal(win, dojo.body);
+		}else{
+			
+			// To capture these events at the top level, attach to <html>, not <body>.
+			// Otherwise right-click context menu just doesn't work.
+			cn = (node == dojo.body() ? dojo.doc.documentElement : node);
 		}
 
-		// 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")
-		]);
+		// "binding" is the object to track our connection to the node (ie, the parameter to bindDomNode())
+		var binding = {
+			node: node,
+			iframe: iframe
+		};
+
+		// Save info about binding in _bindings[], and make node itself record index(+1) into
+		// _bindings[] array.   Prefix w/_dijitMenu to avoid setting an attribute that may
+		// start with a number, which fails on FF/safari.
+		dojo.attr(node, "_dijitMenu" + this.id, this._bindings.push(binding));
+
+		// Setup the connections to monitor click etc., unless we are connecting to an iframe which hasn't finished
+		// loading yet, in which case we need to wait for the onload event first, and then connect
+		var doConnects = dojo.hitch(this, function(cn){
+			return [
+				dojo.connect(cn, (this.leftClickToOpen)?"onclick":"oncontextmenu", this, function(evt){
+					this._openMyself(evt, cn, iframe);
+				}),
+				dojo.connect(cn, "onkeydown", this, "_contextKey"),
+				dojo.connect(cn, "onmousedown", this, "_contextMouse")
+			];
+		});
+		binding.connects = cn ? doConnects(cn) : [];
+
+		if(iframe){
+			// Setup handler to [re]bind to the iframe when the contents are initially loaded,
+			// and every time the contents change.
+			// Need to do this b/c we are actually binding to the iframe's <body> node.
+			// Note: can't use dojo.connect(), see #9609.
+
+			binding.onloadHandler = dojo.hitch(this, function(){
+				// want to remove old connections, but IE throws exceptions when trying to
+				// access the <body> node because it's already gone, or at least in a state of limbo
+
+				var win = this._iframeContentWindow(iframe);
+					cn = dojo.withGlobal(win, dojo.body);
+				binding.connects = doConnects(cn);
+			});
+			if(iframe.addEventListener){
+				iframe.addEventListener("load", binding.onloadHandler, false);
+			}else{
+				iframe.attachEvent("onload", binding.onloadHandler);
+			}
+		}
 	},
 
 	unBindDomNode: function(/*String|DomNode*/ nodeName){
 		// summary:
 		//		Detach menu from given node
-		var node = dojo.byId(nodeName);
-		if(node){
-			var bid = node[this.id]-1, b = this._bindings[bid];
-			dojo.forEach(b, dojo.disconnect);
+
+		var node;
+		try{
+			node = dojo.byId(nodeName);
+		}catch(e){
+			// On IE the dojo.byId() call will get an exception if the attach point was
+			// the <body> node of an <iframe> that has since been reloaded (and thus the
+			// <body> node is in a limbo state of destruction.
+			return;
+		}
+
+		// node["_dijitMenu" + this.id] contains index(+1) into my _bindings[] array
+		var attrName = "_dijitMenu" + this.id;
+		if(node && dojo.hasAttr(node, attrName)){
+			var bid = dojo.attr(node, attrName)-1, b = this._bindings[bid];
+			dojo.forEach(b.connects, dojo.disconnect);
+
+			// Remove listener for iframe onload events
+			var iframe = b.iframe;
+			if(iframe){
+				if(iframe.removeEventListener){
+					iframe.removeEventListener("load", b.onloadHandler, false);
+				}else{
+					iframe.detachEvent("onload", b.onloadHandler);
+				}
+			}
+
+			dojo.removeAttr(node, attrName);
 			delete this._bindings[bid];
 		}
 	},
@@ -5981,7 +6745,7 @@ dojo.declare("dijit.Menu",
 		this._contextMenuWithMouse = false;
 		if(e.keyCode == dojo.keys.F10){
 			dojo.stopEvent(e);
-			if(e.shiftKey && e.type=="keydown"){
+			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.
@@ -6003,20 +6767,25 @@ dojo.declare("dijit.Menu",
 		this._contextMenuWithMouse = true;
 	},
 
-	_openMyself: function(/*Event*/ e){
+	_openMyself: function(/*Event*/ e, /*DomNode?*/ node, /*DomNode?*/ iframe){
 		// summary:
 		//		Internal function for opening myself when the user
-		//		does a right-click or something similar
+		//		does a right-click or something similar.
+		// node:
+		//		The node that is being clicked
+		// iframe:
+		//		If an <iframe> is being clicked, iframe points to that iframe and node
+		//		points to the iframe's body.
 		// tags:
 		//		private
 
-		if(this.leftClickToOpen&&e.button>0){
+		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
+		// 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
@@ -6025,9 +6794,25 @@ dojo.declare("dijit.Menu",
 		if(dojo.isSafari || this._contextMenuWithMouse){
 			x=e.pageX;
 			y=e.pageY;
+
+			if(iframe){
+				// Event is on <body> node of an <iframe>, convert coordinates to match main document
+				var od = e.target.ownerDocument,
+					ifc = dojo.position(iframe, true),
+					win = this._iframeContentWindow(iframe),
+					scroll = dojo.withGlobal(win, "_docScroll", dojo);
+
+				var cs = dojo.getComputedStyle(iframe),
+					tp = dojo._toPixelValue,
+					left = (dojo.isIE && dojo.isQuirks ? 0 : tp(iframe, cs.paddingLeft)) + (dojo.isIE && dojo.isQuirks ? tp(iframe, cs.borderLeftWidth) : 0),
+					top = (dojo.isIE && dojo.isQuirks ? 0 : tp(iframe, cs.paddingTop)) + (dojo.isIE && dojo.isQuirks ? tp(iframe, cs.borderTopWidth) : 0);
+
+				x += ifc.x + left - scroll.x;
+				y += ifc.y + top - scroll.y;
+			}
 		}else{
 			// otherwise open near e.target
-			var coords = dojo.coords(e.target, true);
+			var coords = dojo.position(e.target, true);
 			x = coords.x + 10;
 			y = coords.y + 10;
 		}
@@ -6036,7 +6821,9 @@ dojo.declare("dijit.Menu",
 		var savedFocus = dijit.getFocus(this);
 		function closeAndRestoreFocus(){
 			// user has clicked on a menu or popup
-			dijit.focus(savedFocus);
+			if(self.refocus){
+				dijit.focus(savedFocus);
+			}
 			dijit.popup.close(self);
 		}
 		dijit.popup.open({
@@ -6060,7 +6847,7 @@ dojo.declare("dijit.Menu",
 	},
 
 	uninitialize: function(){
- 		dojo.forEach(this.targetNodeIds, this.unBindDomNode, this);
+ 		dojo.forEach(this._bindings, function(b){ if(b){ this.unBindDomNode(b.node); } }, this);
  		this.inherited(arguments);
 	}
 }
@@ -6139,8 +6926,8 @@ dojo.provide("dojox.html.metrics");
 		if(!measuringNode){
 			m = measuringNode = dojo.doc.createElement("div");
 			m.style.position = "absolute";
-			m.style.left = "-10000px";
-			m.style.top = "0";
+			m.style.left = "0px";
+			m.style.top = "-10000px";
 			dojo.body().appendChild(m);
 		}else{
 			m = measuringNode;
@@ -6224,7 +7011,7 @@ dojo.provide("dojox.html.metrics");
 			scroll.w = n.offsetWidth - n.clientWidth;
 			scroll.h = n.offsetHeight - n.clientHeight;
 			dojo.body().removeChild(n);
-			//
+			//console.log("Scroll bar dimensions: ", scroll);
 			delete n;
 		}catch(e){}
 
@@ -6274,7 +7061,7 @@ dojo.provide("dojox.grid.util");
 		for (var i=0, l=evts.length; i<l; i++){
 			inObject.connect(inNode, 'on' + evts[i], inMethod);
 		}
-	},
+	};
 
 	dgu.removeNode = function(inNode){
 		inNode = dojo.byId(inNode);
@@ -6331,7 +7118,7 @@ dojo.provide("dojox.grid._Scroller");
 		}
 		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();
@@ -6347,7 +7134,8 @@ dojo.provide("dojox.grid._Scroller");
 	var nodeKids = function(inNode, inTag){
 		var result = [];
 		var i=0, n;
-		while((n = inNode.childNodes[i++])){
+		while((n = inNode.childNodes[i])){
+			i++;
 			if(getTagName(n) == inTag){
 				result.push(n);
 			}
@@ -6389,6 +7177,7 @@ dojo.provide("dojox.grid._Scroller");
 				case 3: this.rowsPerPage = inRowsPerPage;
 				case 2: this.keepRows = inKeepRows;
 				case 1: this.rowCount = inRowCount;
+				default: break;
 			}
 			this.defaultPageHeight = this.defaultRowHeight * this.rowsPerPage;
 			this.pageCount = this._getPageCount(this.rowCount, this.rowsPerPage);
@@ -6411,7 +7200,7 @@ dojo.provide("dojox.grid._Scroller");
 		},
 		setKeepInfo: function(inKeepRows){
 			this.keepRows = inKeepRows;
-			this.keepPages = !this.keepRows ? this.keepRows : Math.max(Math.ceil(this.keepRows / this.rowsPerPage), 2);
+			this.keepPages = !this.keepRows ? this.keepPages : Math.max(Math.ceil(this.keepRows / this.rowsPerPage), 2);
 		},
 		// nodes
 		setContentNodes: function(inNodes){
@@ -6427,10 +7216,12 @@ dojo.provide("dojox.grid._Scroller");
 		},
 		// updating
 		invalidate: function(){
+			this._invalidating = true;
 			this.invalidateNodes();
 			this.pageHeights = [];
 			this.height = (this.pageCount ? (this.pageCount - 1)* this.defaultPageHeight + this.calcLastPageHeight() : 0);
 			this.resize();
+			this._invalidating = false;
 		},
 		updateRowCount: function(inRowCount){
 			this.invalidateNodes();
@@ -6446,7 +7237,7 @@ dojo.provide("dojox.grid._Scroller");
 			if(this.pageCount < oldPageCount){
 				for(var i=oldPageCount-1; i>=this.pageCount; i--){
 					this.height -= this.getPageHeight(i);
-					delete this.pageHeights[i]
+					delete this.pageHeights[i];
 				}
 			}else if(this.pageCount > oldPageCount){
 				this.height += this.defaultPageHeight * (this.pageCount - oldPageCount - 1) + this.calcLastPageHeight();
@@ -6458,8 +7249,15 @@ dojo.provide("dojox.grid._Scroller");
 			return Boolean(this.getDefaultPageNode(inPageIndex));
 		},
 		measurePage: function(inPageIndex){
+			if(this.grid.rowHeight){
+				var height = this.grid.rowHeight + 1;
+				return ((inPageIndex + 1) * this.rowsPerPage > this.rowCount ?
+					this.rowCount - inPageIndex * this.rowsPerPage :
+					this.rowsPerPage) * height;
+					 
+			}
 			var n = this.getDefaultPageNode(inPageIndex);
-			return (n&&n.innerHTML) ? n.offsetHeight : 0;
+			return (n && n.innerHTML) ? n.offsetHeight : undefined;
 		},
 		positionPage: function(inPageIndex, inPos){
 			for(var i=0; i<this.colCount; i++){
@@ -6476,16 +7274,12 @@ dojo.provide("dojox.grid._Scroller");
 			//
 			var n = nodes[inPageIndex];
 			var y = (n ? this.getPageNodePosition(n) + this.getPageHeight(inPageIndex) : 0);
-			//
-			//
 			for(var p=inPageIndex+1; p<=last; p++){
 				n = nodes[p];
 				if(n){
-					//
 					if(this.getPageNodePosition(n) == y){
 						return;
 					}
-					//
 					this.positionPage(p, y);
 				}
 				y += this.getPageHeight(p);
@@ -6502,17 +7296,17 @@ dojo.provide("dojox.grid._Scroller");
 				var nodes = this.pageNodes[i];
 				var new_p = (p === null ? this.createPageNode() : this.invalidatePageNode(p, nodes));
 				new_p.pageIndex = inPageIndex;
-				new_p.id = (this._pageIdPrefix || "") + 'page-' + inPageIndex;
 				nodes[inPageIndex] = new_p;
 			}
 		},
 		// rendering implementation
 		renderPage: function(inPageIndex){
 			var nodes = [];
-			for(var i=0; i<this.colCount; i++){
+			var i, j;
+			for(i=0; i<this.colCount; i++){
 				nodes[i] = this.pageNodes[i][inPageIndex];
 			}
-			for(var i=0, j=inPageIndex*this.rowsPerPage; (i<this.rowsPerPage)&&(j<this.rowCount); i++, j++){
+			for(i=0, j=inPageIndex*this.rowsPerPage; (i<this.rowsPerPage)&&(j<this.rowCount); i++, j++){
 				this.renderRow(j, nodes);
 			}
 		},
@@ -6564,7 +7358,16 @@ dojo.provide("dojox.grid._Scroller");
 			}
 			
 			// Calculate the average row height and update the defaults (row and page).
-			this.needPage(this.page, this.pageTop);
+			var needPage = (!this._invalidating);
+			if(!needPage){
+				var ah = this.grid.attr("autoHeight");
+				if(typeof ah == "number" && ah <= Math.min(this.rowsPerPage, this.rowCount)){
+					needPage = true;
+				}
+			}
+			if(needPage){
+				this.needPage(this.page, this.pageTop);
+			}
 			var rowsOnPage = (this.page < this.pageCount - 1) ? this.rowsPerPage : ((this.rowCount % this.rowsPerPage) || this.rowsPerPage);
 			var pageHeight = this.getPageHeight(this.page);
 			this.averageRowHeight = (pageHeight > 0 && rowsOnPage > 0) ? (pageHeight / rowsOnPage) : 0;
@@ -6582,19 +7385,29 @@ dojo.provide("dojox.grid._Scroller");
 			this.height += inDh;
 			this.resize();
 		},
-		updatePageHeight: function(inPageIndex){
+		updatePageHeight: function(inPageIndex, fromBuild){
 			if(this.pageExists(inPageIndex)){
 				var oh = this.getPageHeight(inPageIndex);
-				var h = (this.measurePage(inPageIndex))||(oh);
+				var h = (this.measurePage(inPageIndex));
+				if(h === undefined){
+					h = oh;
+				}
 				this.pageHeights[inPageIndex] = h;
-				if((h)&&(oh != h)){
-					this.updateContentHeight(h - oh)
-					this.repositionPages(inPageIndex);
+				if(oh != h){
+					this.updateContentHeight(h - oh);
+					var ah = this.grid.attr("autoHeight");
+					if((typeof ah == "number" && ah > this.rowCount)||(ah === true && !fromBuild)){
+						this.grid.sizeChange();
+					}else{
+						this.repositionPages(inPageIndex);
+					}
 				}
+				return h;
 			}
+			return 0;
 		},
 		rowHeightChanged: function(inRowIndex){
-			this.updatePageHeight(Math.floor(inRowIndex / this.rowsPerPage));
+			this.updatePageHeight(Math.floor(inRowIndex / this.rowsPerPage), false);
 		},
 		// scroller core
 		invalidateNodes: function(){
@@ -6645,11 +7458,7 @@ dojo.provide("dojox.grid._Scroller");
 			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)
-				}
+				h = this.updatePageHeight(inPageIndex, true);
 			}else{
 				this.positionPage(inPageIndex, inPos);
 			}
@@ -6769,7 +7578,8 @@ dojo.provide("dojox.grid._Scroller");
 		findScrollTop: function(inRow){
 			var rowPage = Math.floor(inRow / this.rowsPerPage);
 			var t = 0;
-			for(var i=0; i<rowPage; i++){
+			var i, l;
+			for(i=0; i<rowPage; i++){
 				t += this.getPageHeight(i);
 			}
 			this.pageTop = t;
@@ -6778,7 +7588,7 @@ dojo.provide("dojox.grid._Scroller");
 			var nodes = this.getDefaultNodes();
 			var rows = divkids(nodes[rowPage]);
 			var r = inRow - this.rowsPerPage * rowPage;
-			for(var i=0,l=rows.length; i<l && i<r; i++){
+			for(i=0,l=rows.length; i<l && i<r; i++){
 				t += rows[i].offsetHeight;
 			}
 			return t;
@@ -6795,6 +7605,21 @@ dojo.provide("dojox.grid.cells._base");
 
 
 
+
+dojo.declare("dojox.grid._DeferredTextWidget", dijit._Widget, {
+	deferred: null,
+	_destroyOnRemove: true,
+	postCreate: function(){
+		if(this.deferred){
+			this.deferred.addBoth(dojo.hitch(this, function(text){
+				if(this.domNode){
+					this.domNode.innerHTML = text;
+				}
+			}));
+		}
+	}
+});
+
 (function(){
 	var focusSelectNode = function(inNode){
 		try{
@@ -6825,6 +7650,7 @@ dojo.provide("dojox.grid.cells._base");
 		value: null,
 		hidden: false,
 		noresize: false,
+		draggable: true,
 		//private
 		_valueProp: "value",
 		_formatPending: false,
@@ -6832,8 +7658,38 @@ dojo.provide("dojox.grid.cells._base");
 		constructor: function(inProps){
 			this._props = inProps || {};
 			dojo.mixin(this, inProps);
+			if(this.draggable === undefined){
+				this.draggable = true;
+			}
 		},
 
+		_defaultFormat: function(inValue, callArgs){
+			var s = this.grid.formatterScope || this;
+			var f = this.formatter;
+			if(f && s && typeof f == "string"){
+				f = this.formatter = s[f];
+			}
+			var v = (inValue != this.defaultValue && f) ? f.apply(s, callArgs) : inValue;
+			if(typeof v == "undefined"){
+				return this.defaultValue;
+			}
+			if(v && v.addBoth){
+				// Check if it's a deferred
+				v = new dojox.grid._DeferredTextWidget({deferred: v},
+									dojo.create("span", {innerHTML: this.defaultValue}));
+			}
+			if(v && v.declaredClass && v.startup){
+				return "<div class='dojoxGridStubNode' linkWidget='" +
+						v.id +
+						"' cellIdx='" +
+						this.index +
+						"'>" +
+						this.defaultValue +
+						"</div>";
+			}
+			return v;
+		},
+		
 		// data source
 		format: function(inRowIndex, inItem){
 			// summary:
@@ -6842,12 +7698,11 @@ dojo.provide("dojox.grid.cells._base");
 			// grid row index
 			// returns: html for a given grid cell
 			var f, i=this.grid.edit.info, d=this.get ? this.get(inRowIndex, inItem) : (this.value || this.defaultValue);
-			d = (d && d.replace) ? d.replace(/</g, '<') : d;
+			d = (d && d.replace && this.grid.escapeHTMLInData) ? d.replace(/&/g, '&').replace(/</g, '<') : d;
 			if(this.editable && (this.alwaysEditing || (i.rowIndex==inRowIndex && i.cell==this))){
 				return this.formatEditing(d, inRowIndex);
 			}else{
-				var v = (d != this.defaultValue && (f = this.formatter)) ? f.call(this, d, inRowIndex) : d;
-				return (typeof v == "undefined" ? this.defaultValue : v);
+				return this._defaultFormat(d, [d, inRowIndex, this]);
 			}
 		},
 		formatEditing: function(inDatum, inRowIndex){
@@ -6891,7 +7746,7 @@ dojo.provide("dojox.grid.cells._base");
 		},
 		_onEditBlur: function(inRowIndex){
 			if(this.grid.edit.isEditCell(inRowIndex, this.index)){
-				//
+				//console.log('editor onblur', e);
 				this.grid.edit.apply();
 			}
 		},
@@ -6961,8 +7816,8 @@ dojo.provide("dojox.grid.cells._base");
 			//	value of editor
 			var n = this.getEditNode(inRowIndex);
 			if(n){
-				n[this._valueProp] = inValue
-			};
+				n[this._valueProp] = inValue;
+			}
 		},
 		focus: function(inRowIndex, inNode){
 			// summary:
@@ -6979,7 +7834,7 @@ dojo.provide("dojox.grid.cells._base");
 			// inRowIndex: int
 			// grid row index
 			this.value = this.value || this.getValue(inRowIndex);
-			//
+			//console.log("save", this.value, inCell.index, inRowIndex);
 		},
 		restore: function(inRowIndex){
 			// summary:
@@ -6987,7 +7842,7 @@ dojo.provide("dojox.grid.cells._base");
 			// inRowIndex: int
 			// grid row index
 			this.setValue(inRowIndex, this.value);
-			//
+			//console.log("restore", this.value, inCell.index, inRowIndex);
 		},
 		//protected
 		_finish: function(inRowIndex){
@@ -7020,36 +7875,38 @@ dojo.provide("dojox.grid.cells._base");
 		var d = dojo;
 		var formatter = d.trim(d.attr(node, "formatter")||"");
 		if(formatter){
-			cellDef.formatter = dojo.getObject(formatter);
+			cellDef.formatter = dojo.getObject(formatter)||formatter;
 		}
 		var get = d.trim(d.attr(node, "get")||"");
 		if(get){
 			cellDef.get = dojo.getObject(get);
 		}
-		var getBoolAttr = function(attr){
+		var getBoolAttr = function(attr, cell, cellAttr){
 			var value = d.trim(d.attr(node, attr)||"");
-			return value ? !(value.toLowerCase()=="false") : undefined;
-		}
-		cellDef.sortDesc = getBoolAttr("sortDesc");
-		cellDef.editable = getBoolAttr("editable");
-		cellDef.alwaysEditing = getBoolAttr("alwaysEditing");
-		cellDef.noresize = getBoolAttr("noresize");
+			if(value){ cell[cellAttr||attr] = !(value.toLowerCase()=="false"); }
+		};
+		getBoolAttr("sortDesc", cellDef);
+		getBoolAttr("editable", cellDef);
+		getBoolAttr("alwaysEditing", cellDef);
+		getBoolAttr("noresize", cellDef);
+		getBoolAttr("draggable", cellDef);
 
 		var value = d.trim(d.attr(node, "loadingText")||d.attr(node, "defaultValue")||"");
 		if(value){
 			cellDef.defaultValue = value;
 		}
 
-		var getStrAttr = function(attr){
-			return d.trim(d.attr(node, attr)||"")||undefined;
+		var getStrAttr = function(attr, cell, cellAttr){
+			var value = d.trim(d.attr(node, attr)||"")||undefined;
+			if(value){ cell[cellAttr||attr] = value; }
 		};
-		cellDef.styles = getStrAttr("styles");
-		cellDef.headerStyles = getStrAttr("headerStyles");
-		cellDef.cellStyles = getStrAttr("cellStyles");
-		cellDef.classes = getStrAttr("classes");
-		cellDef.headerClasses = getStrAttr("headerClasses");
-		cellDef.cellClasses = getStrAttr("cellClasses");
-	}
+		getStrAttr("styles", cellDef);
+		getStrAttr("headerStyles", cellDef);
+		getStrAttr("cellStyles", cellDef);
+		getStrAttr("classes", cellDef);
+		getStrAttr("headerClasses", cellDef);
+		getStrAttr("cellClasses", cellDef);
+	};
 
 	dojo.declare("dojox.grid.cells.Cell", dgc._Base, {
 		// summary
@@ -7092,7 +7949,7 @@ dojo.provide("dojox.grid.cells._base");
 		if(keyFilter){
 			cellDef.keyFilter = new RegExp(keyFilter);
 		}
-	}
+	};
 
 	dojo.declare("dojox.grid.cells.RowIndex", dgc.Cell, {
 		name: 'Row',
@@ -7106,7 +7963,7 @@ dojo.provide("dojox.grid.cells._base");
 	});
 	dgc.RowIndex.markupFactory = function(node, cellDef){
 		dgc.Cell.markupFactory(node, cellDef);
-	}
+	};
 
 	dojo.declare("dojox.grid.cells.Select", dgc.Cell, {
 		// summary:
@@ -7161,7 +8018,7 @@ dojo.provide("dojox.grid.cells._base");
 				cell.values = v;
 			}
 		}
-	}
+	};
 
 	dojo.declare("dojox.grid.cells.AlwaysEdit", dgc.Cell, {
 		// summary:
@@ -7178,7 +8035,7 @@ dojo.provide("dojox.grid.cells._base");
 	});
 	dgc.AlwaysEdit.markupFactory = function(node, cell){
 		dgc.Cell.markupFactory(node, cell);
-	}
+	};
 
 	dojo.declare("dojox.grid.cells.Bool", dgc.AlwaysEdit, {
 		// summary:
@@ -7195,7 +8052,7 @@ dojo.provide("dojox.grid.cells._base");
 	});
 	dgc.Bool.markupFactory = function(node, cell){
 		dgc.AlwaysEdit.markupFactory(node, cell);
-	}
+	};
 })();
 
 }
@@ -7211,19 +8068,10 @@ if(!dojo._hasResource["dojo.dnd.common"]){ //_hasResource checks added by build.
 dojo._hasResource["dojo.dnd.common"] = true;
 dojo.provide("dojo.dnd.common");
 
-dojo.dnd._isMac = navigator.appVersion.indexOf("Macintosh") >= 0;
-dojo.dnd._copyKey = dojo.dnd._isMac ? "metaKey" : "ctrlKey";
-
-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
+	// summary:
+	//		returns a unique string for use with any DOM element
 	var id;
 	do{
 		id = dojo._scopeName + "Unique" + (++dojo.dnd._uniqueId);
@@ -7234,7 +8082,8 @@ dojo.dnd.getUniqueId = function(){
 dojo.dnd._empty = {};
 
 dojo.dnd.isFormElement = function(/*Event*/ e){
-	// summary: returns true, if user clicked on a form element
+	// summary:
+	//		returns true if user clicked on a form element
 	var t = e.target;
 	if(t.nodeType == 3 /*TEXT_NODE*/){
 		t = t.parentNode;
@@ -7242,13 +8091,6 @@ dojo.dnd.isFormElement = function(/*Event*/ e){
 	return " button textarea input select option ".indexOf(" " + t.tagName.toLowerCase() + " ") >= 0;	// Boolean
 };
 
-// doesn't take into account when multiple buttons are pressed
-dojo.dnd._lmb = dojo.isIE ? 1 : 0;	// left mouse button
-
-dojo.dnd._isLmbPressed = dojo.isIE ?
-	function(e){ return e.button & 1; } : // intentional bit-and
-	function(e){ return e.button === 0; };
-
 }
 
 if(!dojo._hasResource["dojo.dnd.autoscroll"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
@@ -7256,7 +8098,10 @@ 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)
+	// summary:
+	//		Returns a viewport size (visible part of the window)
+
+	// TODO: remove this when getViewport() moved to dojo core, see #7028
 
 	// FIXME: need more docs!!
 	var d = dojo.doc, dd = d.documentElement, w = window, b = dojo.body();
@@ -7282,7 +8127,7 @@ dojo.dnd.autoScroll = function(e){
 	// summary:
 	//		a handler for onmousemove event, which scrolls the window, if
 	//		necesary
-	// e: Event:
+	// e: Event
 	//		onmousemove event
 
 	// FIXME: needs more docs!
@@ -7307,7 +8152,7 @@ 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:
+	// e: Event
 	//		onmousemove event
 
 	// FIXME: needs more docs!
@@ -7315,14 +8160,14 @@ dojo.dnd.autoScrollNodes = function(e){
 		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);
-				//
+				var b = dojo._getContentBox(n, s), t = dojo.position(n, true);
+				//console.log(b.l, b.t, t.x, t.y, n.scrollLeft, n.scrollTop);
 				var w = Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL, b.w / 2), 
 					h = Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL, b.h / 2),
 					rx = e.pageX - t.x, ry = e.pageY - t.y, dx = 0, dy = 0;
 				if(dojo.isWebKit || dojo.isOpera){
 					// FIXME: this code should not be here, it should be taken into account 
-					// either by the event fixing code, or the dojo._abs()
+					// either by the event fixing code, or the dojo.position()
 					// FIXME: this code doesn't work on Opera 9.5 Beta
 					rx += dojo.body().scrollLeft, ry += dojo.body().scrollTop;
 				}
@@ -7333,7 +8178,7 @@ dojo.dnd.autoScrollNodes = function(e){
 						dx = w;
 					}
 				}
-				//
+				//console.log("ry =", ry, "b.h =", b.h, "h =", h);
 				if(ry > 0 && ry < b.h){
 					if(ry < h){
 						dy = -h;
@@ -7367,13 +8212,17 @@ 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)
+		// 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;
@@ -7394,15 +8243,17 @@ dojo.declare("dojo.dnd.Mover", null, {
 	},
 	// mouse event processors
 	onMouseMove: function(e){
-		// summary: event processor for onmousemove
-		// e: Event: mouse event
+		// 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});
 		dojo.stopEvent(e);
 	},
 	onMouseUp: function(e){
-		if(dojo.isWebKit && dojo.dnd._isMac && this.mouseButton == 2 ? 
+		if(dojo.isWebKit && dojo.isMac && this.mouseButton == 2 ? 
 				e.button == 0 : this.mouseButton == e.button){
 			this.destroy();
 		}
@@ -7410,8 +8261,9 @@ dojo.declare("dojo.dnd.Mover", null, {
 	},
 	// utilities
 	onFirstMove: function(){
-		// summary: makes the node absolute; it is meant to be called only once. 
-		// 	relative and absolutely positioned nodes are assumed to use pixel units
+		// summary:
+		//		makes the node absolute; it is meant to be called only once. 
+		// 		relative and absolutely positioned nodes are assumed to use pixel units
 		var s = this.node.style, l, t, h = this.host;
 		switch(s.position){
 			case "relative":
@@ -7447,7 +8299,8 @@ dojo.declare("dojo.dnd.Mover", null, {
 		dojo.disconnect(this.events.pop());
 	},
 	destroy: function(){
-		// summary: stops the move, deletes all references, so the object can be garbage-collected
+		// 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;
@@ -7467,6 +8320,27 @@ dojo.provide("dojo.dnd.Moveable");
 
 
 
+/*=====
+dojo.declare("dojo.dnd.__MoveableArgs", [], {
+	// handle: Node||String
+	//		A node (or node's id), which is used as a mouse handle.
+	//		If omitted, the node itself is used as a handle.
+	handle: null,
+
+	// delay: Number
+	//		delay move by this number of pixels
+	delay: 0,
+
+	// skip: Boolean
+	//		skip move of form elements
+	skip: false,
+
+	// mover: Object
+	//		a constructor of custom Mover
+	mover: dojo.dnd.Mover
+});
+=====*/
+
 dojo.declare("dojo.dnd.Moveable", null, {
 	// object attributes (for markup)
 	handle: "",
@@ -7474,15 +8348,12 @@ dojo.declare("dojo.dnd.Moveable", null, {
 	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
+		// summary:
+		//		an object, which makes a node moveable
+		// node: Node
+		//		a node (or node's id) to be moved
+		// params: dojo.dnd.__MoveableArgs?
+		//		optional parameters
 		this.node = dojo.byId(node);
 		if(!params){ params = {}; }
 		this.handle = params.handle ? dojo.byId(params.handle) : null;
@@ -7505,15 +8376,18 @@ dojo.declare("dojo.dnd.Moveable", null, {
 
 	// methods
 	destroy: function(){
-		// summary: stops watching for possible move, deletes all references, so the object can be garbage-collected
+		// 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
+		// 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(
@@ -7528,8 +8402,10 @@ dojo.declare("dojo.dnd.Moveable", null, {
 		dojo.stopEvent(e);
 	},
 	onMouseMove: function(e){
-		// summary: event processor for onmousemove, used only for delayed drags
-		// e: Event: mouse event
+		// summary:
+		//		event processor for onmousemove, used only for delayed drags
+		// e: Event
+		//		mouse event
 		if(Math.abs(e.pageX - this._lastX) > this.delay || Math.abs(e.pageY - this._lastY) > this.delay){
 			this.onMouseUp(e);
 			this.onDragDetected(e);
@@ -7537,16 +8413,20 @@ dojo.declare("dojo.dnd.Moveable", null, {
 		dojo.stopEvent(e);
 	},
 	onMouseUp: function(e){
-		// summary: event processor for onmouseup, used only for delayed drags
-		// e: Event: mouse event
+		// summary:
+		//		event processor for onmouseup, used only for delayed drags
+		// e: Event
+		//		mouse event
 		for(var i = 0; i < 2; ++i){
 			dojo.disconnect(this.events.pop());
 		}
 		dojo.stopEvent(e);
 	},
 	onSelectStart: function(e){
-		// summary: event processor for onselectevent and ondragevent
-		// e: Event: mouse event
+		// summary:
+		//		event processor for onselectevent and ondragevent
+		// e: Event
+		//		mouse event
 		if(!this.skip || !dojo.dnd.isFormElement(e)){
 			dojo.stopEvent(e);
 		}
@@ -7554,31 +8434,36 @@ dojo.declare("dojo.dnd.Moveable", null, {
 	
 	// local events
 	onDragDetected: function(/* Event */ e){
-		// summary: called when the drag is detected,
-		// responsible for creation of the mover
+		// summary:
+		//		called when the drag is detected;
+		//		responsible for creation of the mover
 		new this.mover(this.node, e, this);
 	},
 	onMoveStart: function(/* dojo.dnd.Mover */ mover){
-		// summary: called before every move operation
+		// 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
+		// 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.
+		// 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.
+		// 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";
@@ -7586,14 +8471,14 @@ dojo.declare("dojo.dnd.Moveable", null, {
 		this.onMoved(mover, leftTop);
 	},
 	onMoving: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
-		// summary: called before every incremental move,
-		//	can be overwritten.
+		// 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.
+		// summary:
+		//		called after every incremental move; can be overwritten.
 		
 		// default implementation does nothing
 	}
@@ -7624,12 +8509,12 @@ dojo.provide("dojox.grid._Builder");
 	};
 
 	var findTable = function(node){
-		for(var n=node; n && n.tagName!='TABLE'; n=n.parentNode);
+		for(var n=node; n && n.tagName!='TABLE'; n=n.parentNode){}
 		return n;
 	};
 	
 	var ascendDom = function(inNode, inWhile){
-		for(var n=inNode; n && inWhile(n); n=n.parentNode);
+		for(var n=inNode; n && inWhile(n); n=n.parentNode){}
 		return n;
 	};
 	
@@ -7650,7 +8535,7 @@ dojo.provide("dojox.grid._Builder");
 	},{
 		view: null,
 		// boilerplate HTML
-		_table: '<table class="dojoxGridRowTable" border="0" cellspacing="0" cellpadding="0" role="'+(dojo.isFF<3 ? "wairole:" : "")+'presentation"',
+		_table: '<table class="dojoxGridRowTable" border="0" cellspacing="0" cellpadding="0" role="presentation"',
 
 		// Returns the table variable as an array - and with the view width, if specified
 		getTableArray: function(){
@@ -7665,18 +8550,33 @@ dojo.provide("dojox.grid._Builder");
 		// generate starting tags for a cell
 		generateCellMarkup: function(inCell, inMoreStyles, inMoreClasses, isHeader){
 			var result = [], html;
-			var waiPrefix = dojo.isFF<3 ? "wairole:" : "";
 			if(isHeader){
 				var sortInfo = inCell.index != inCell.grid.getSortIndex() ? "" : inCell.grid.sortInfo > 0 ? 'aria-sort="ascending"' : 'aria-sort="descending"';
-				html = ['<th tabIndex="-1" role="', waiPrefix, 'columnheader"', sortInfo];
+				if (!inCell.id){
+					inCell.id = this.grid.id + "Hdr" + inCell.index;
+				}
+				// column headers are not editable, mark as aria-readonly=true
+				html = ['<th tabIndex="-1" aria-readonly="true" role="columnheader"', sortInfo, 'id="', inCell.id, '"'];
 			}else{
-				html = ['<td tabIndex="-1" role="', waiPrefix, 'gridcell"'];
+				// cells inherit grid aria-readonly property; default value for aria-readonly is false(grid is editable)
+				// if grid is editable (had any editable cells), mark non editable cells as aria-readonly=true
+				// if no editable cells, grid's aria-readonly value will have been set to true and cells will inherit
+				var editInfo = this.grid.editable && !inCell.editable ? 'aria-readonly="true"' : "";
+				html = ['<td tabIndex="-1" role="gridcell"', editInfo];
+			}
+			if(inCell.colSpan){
+				html.push(' colspan="', inCell.colSpan, '"');
+			}
+			if(inCell.rowSpan){
+				html.push(' rowspan="', inCell.rowSpan, '"');
 			}
-			inCell.colSpan && html.push(' colspan="', inCell.colSpan, '"');
-			inCell.rowSpan && html.push(' rowspan="', inCell.rowSpan, '"');
 			html.push(' class="dojoxGridCell ');
-			inCell.classes && html.push(inCell.classes, ' ');
-			inMoreClasses && html.push(inMoreClasses, ' ');
+			if(inCell.classes){
+				html.push(inCell.classes, ' ');
+			}
+			if(inMoreClasses){
+				html.push(inMoreClasses, ' ');
+			}
 			// result[0] => td opener, style
 			result.push(html.join(''));
 			// SLOT: result[1] => td classes 
@@ -7686,13 +8586,17 @@ dojo.provide("dojox.grid._Builder");
 				inMoreStyles += ';';
 			}
 			html.push(inCell.styles, inMoreStyles||'', inCell.hidden?'display:none;':'');
-			inCell.unitWidth && html.push('width:', inCell.unitWidth, ';');
+			if(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);
+			if(inCell.attrs){
+				html.push(" ", inCell.attrs);
+			}
 			html.push('>');
 			// result[4] => td postfix
 			result.push(html.join(''));
@@ -7713,13 +8617,14 @@ dojo.provide("dojox.grid._Builder");
 		},
 		
 		getCellNode: function(inRowNode, inCellIndex){
-			for(var i=0, row; row=getTr(inRowNode.firstChild, i); i++){
-				for(var j=0, cell; cell=row.cells[j]; j++){
+			for(var i=0, row; (row=getTr(inRowNode.firstChild, i)); i++){
+				for(var j=0, cell; (cell=row.cells[j]); j++){
 					if(this.getCellNodeIndex(cell) == inCellIndex){
 						return cell;
 					}
 				}
 			}
+			return null;
 		},
 		
 		findCellTarget: function(inSourceNode, inTopNode){
@@ -7727,7 +8632,7 @@ dojo.provide("dojox.grid._Builder");
 			while(n && (!this.isCellNode(n) || (n.offsetParent && gridViewTag in n.offsetParent.parentNode && n.offsetParent.parentNode[gridViewTag] != this.view.id)) && (n!=inTopNode)){
 				n = n.parentNode;
 			}
-			return n!=inTopNode ? n : null 
+			return n!=inTopNode ? n : null;
 		},
 		
 		// event decoration
@@ -7776,6 +8681,7 @@ dojo.provide("dojox.grid._Builder");
 			if(e.dispatch in this){
 				return this[e.dispatch](e);
 			}
+			return false;
 		},
 
 		// dispatched event handlers
@@ -7800,7 +8706,7 @@ dojo.provide("dojox.grid._Builder");
 		domousedown: function(e){
 			if (e.cellNode)
 				this.grid.onMouseDown(e);
-			this.grid.onMouseDownRow(e)
+			this.grid.onMouseDownRow(e);
 		}
 	});
 
@@ -7820,6 +8726,9 @@ dojo.provide("dojox.grid._Builder");
 				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);
+					if (!this.grid.editable && cell.editable){
+						this.grid.editable = true;
+					}
 				}
 			}
 		},
@@ -7839,7 +8748,7 @@ dojo.provide("dojox.grid._Builder");
 				}
 				html.push(!row.invisible ? '<tr>' : '<tr class="dojoxGridInvisible">');
 				for(var i=0, cell, m, cc, cs; (cell=row[i]); i++){
-					m = cell.markup, cc = cell.customClasses = [], cs = cell.customStyles = [];
+					m = cell.markup; cc = cell.customClasses = []; cs = cell.customStyles = [];
 					// content (format can fill in cc and cs as side-effects)
 					m[5] = cell.format(inRowIndex, item);
 					// classes
@@ -7857,7 +8766,7 @@ dojo.provide("dojox.grid._Builder");
 
 		decorateEvent: function(e){
 			e.rowNode = this.findRowTarget(e.target);
-			if(!e.rowNode){return false};
+			if(!e.rowNode){return false;}
 			e.rowIndex = e.rowNode[rowIndexTag];
 			this.baseDecorateEvent(e);
 			e.cell = this.grid.getCell(e.cellIndex);
@@ -7896,12 +8805,14 @@ dojo.provide("dojox.grid._Builder");
 					cell.customClasses = [];
 					cell.customStyles = [];
 					if(this.view.simpleStructure){
-						if(cell.headerClasses){
-							if(cell.headerClasses.indexOf('dojoDndItem') == -1){
-								cell.headerClasses += ' dojoDndItem';
+						if(cell.draggable){
+							if(cell.headerClasses){
+								if(cell.headerClasses.indexOf('dojoDndItem') == -1){
+									cell.headerClasses += ' dojoDndItem';
+								}
+							}else{
+								cell.headerClasses = 'dojoDndItem';
 							}
-						}else{
-							cell.headerClasses = 'dojoDndItem';
 						}
 						if(cell.attrs){
 							if(cell.attrs.indexOf("dndType='gridColumn_") == -1){
@@ -7928,16 +8839,16 @@ dojo.provide("dojox.grid._Builder");
 
 		// event helpers
 		getCellX: function(e){
-			var x = e.layerX;
+			var n, x = e.layerX;
 			if(dojo.isMoz){
-				var n = ascendDom(e.target, makeNotTagName("th"));
+				n = ascendDom(e.target, 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 = ascendDom(e.target, function(){
+			n = ascendDom(e.target, function(){
 				if(!n || n == e.cellNode){
 					return false;
 				}
@@ -7978,6 +8889,10 @@ dojo.provide("dojox.grid._Builder");
 		},
 
 		overLeftResizeArea: function(e){
+			// We are never over a resize area if we are in the process of moving
+			if(dojo.hasClass(dojo.body(), "dojoDndMove")){
+				return false;
+			}
 			//Bugfix for crazy IE problem (#8807).  IE returns position information for the icon and text arrow divs
 			//as if they were still on the left instead of returning the position they were 'float: right' to.
 			//So, the resize check ends up checking the wrong adjacent cell.  This checks to see if the hover was over 
@@ -7998,6 +8913,10 @@ dojo.provide("dojox.grid._Builder");
 		},
 
 		overRightResizeArea: function(e){
+			// We are never over a resize area if we are in the process of moving
+			if(dojo.hasClass(dojo.body(), "dojoDndMove")){
+				return false;
+			}
 			//Bugfix for crazy IE problem (#8807).  IE returns position information for the icon and text arrow divs
 			//as if they were still on the left instead of returning the position they were 'float: right' to.
 			//So, the resize check ends up checking the wrong adjacent cell.  This checks to see if the hover was over 
@@ -8017,18 +8936,17 @@ dojo.provide("dojox.grid._Builder");
 		},
 
 		domousemove: function(e){
-			//
+			//console.log(e.cellIndex, e.cellX, e.cellNode.offsetWidth);
 			if(!this.moveable){
-				var c = (this.overRightResizeArea(e) ? 'e-resize' : (this.overLeftResizeArea(e) ? 'w-resize' : ''));
+				var c = (this.overRightResizeArea(e) ? 'dojoxGridColResize' : (this.overLeftResizeArea(e) ? 'dojoxGridColResize' : ''));
 				if(c && !this.canResize(e)){
-					c = 'not-allowed';
+					c = 'dojoxGridColNoResize';
 				}
+				dojo.toggleClass(e.sourceView.headerNode, "dojoxGridColNoResize", (c == "dojoxGridColNoResize"));
+				dojo.toggleClass(e.sourceView.headerNode, "dojoxGridColResize", (c == "dojoxGridColResize"));
 				if(dojo.isIE){
 					var t = e.sourceView.headerNode.scrollLeft;
-					e.sourceView.headerNode.style.cursor = c || ''; //'default';
 					e.sourceView.headerNode.scrollLeft = t;
-				}else{
-					e.sourceView.headerNode.style.cursor = c || ''; //'default';
 				}
 				if(c){
 					dojo.stopEvent(e);
@@ -8055,26 +8973,42 @@ dojo.provide("dojox.grid._Builder");
 				dojo.stopEvent(e);
 				return true;
 			}
+			return false;
 		},
 
 		// column resizing
-		beginColumnResize: function(e){
-			this.moverDiv = document.createElement("div");
-			dojo.style(this.moverDiv,{position: "absolute", left:0}); // to make DnD work with dir=rtl
-			dojo.body().appendChild(this.moverDiv);
-			var m = this.moveable = new dojo.dnd.Moveable(this.moverDiv);
-
+		colResizeSetup: function(/*Event Object*/e, /*boolean*/ isMouse ){
+			//Set up the drag object for column resizing
+			// Called with mouse event in case of drag and drop,
+			// Also called from keyboard shift-arrow event when focus is on a header
+			var headContentBox = dojo.contentBox(e.sourceView.headerNode);
+			
+			if(isMouse){  //IE draws line even with no mouse down so separate from keyboard 
+				this.lineDiv = document.createElement('div');
+
+				// NOTE: this is for backwards compatibility with Dojo 1.3
+				var vw = (dojo.position||dojo._abs)(e.sourceView.headerNode, true);
+				var bodyContentBox = dojo.contentBox(e.sourceView.domNode);
+				dojo.style(this.lineDiv, {
+					top: vw.y + "px",
+					left: e.clientX + "px",
+					height: (bodyContentBox.h + headContentBox.h) + "px"
+				});
+				dojo.addClass(this.lineDiv, "dojoxGridResizeColLine");
+				this.lineDiv._origLeft = e.clientX;
+				dojo.body().appendChild(this.lineDiv);
+			}
 			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 view = e.sourceView;
 			var adj = dojo._isBodyLtr() ? 1 : -1;
 			var views = e.grid.views.views;
 			var followers = [];
-			for(var i=view.idx+adj, cView; (cView=views[i]); i=i+adj){
+			for(var j=view.idx+adj, cView; (cView=views[j]); j=j+adj){
 				followers.push({ node: cView.headerNode, left: window.parseInt(cView.headerNode.style.left) });
 			}
 			var table = view.headerContentNode.firstChild;
@@ -8084,12 +9018,22 @@ dojo.provide("dojox.grid._Builder");
 				node: e.cellNode,
 				index: e.cellIndex,
 				w: dojo.contentBox(e.cellNode).w,
-				vw: dojo.contentBox(view.headerNode).w,
+				vw: headContentBox.w,
 				table: table,
 				tw: dojo.contentBox(table).w,
 				spanners: spanners,
 				followers: followers
 			};
+			return drag;
+		},
+		beginColumnResize: function(e){
+			this.moverDiv = document.createElement("div");
+			dojo.style(this.moverDiv,{position: "absolute", left:0}); // to make DnD work with dir=rtl
+			dojo.body().appendChild(this.moverDiv);
+			dojo.addClass(this.grid.domNode, "dojoxGridColumnResizing");
+			var m = (this.moveable = new dojo.dnd.Moveable(this.moverDiv));
+
+			var drag = this.colResizeSetup(e,true);
 
 			m.onMove = dojo.hitch(this, "doResizeColumn", drag);
 
@@ -8101,10 +9045,9 @@ dojo.provide("dojox.grid._Builder");
 				this.moveable.destroy();
 				delete this.moveable;
 				this.moveable = null;
+				dojo.removeClass(this.grid.domNode, "dojoxGridColumnResizing");
 			}));
 
-			view.convertColPctToFixed();
-
 			if(e.cellNode.setCapture){
 				e.cellNode.setCapture();
 			}
@@ -8112,45 +9055,81 @@ dojo.provide("dojox.grid._Builder");
 		},
 
 		doResizeColumn: function(inDrag, mover, leftTop){
-			var isLtr = dojo._isBodyLtr();
-			var deltaX = isLtr ? leftTop.l : -leftTop.l;
-			var w = inDrag.w + deltaX;
-			var vw = inDrag.vw + deltaX;
-			var tw = inDrag.tw + deltaX;
-			if(w >= this.minColWidth){
-				for(var i=0, s, sw; (s=inDrag.spanners[i]); i++){
-					sw = s.width + deltaX;
-					s.node.style.width = sw + 'px';
-					inDrag.view.setColWidth(s.index, sw);
-					//
-				}
-				for(var i=0, f, fl; (f=inDrag.followers[i]); i++){
-					fl = f.left + deltaX;
-					f.node.style.left = fl + 'px';
-				}
-				inDrag.node.style.width = w + 'px';
-				inDrag.view.setColWidth(inDrag.index, w);
-				inDrag.view.headerNode.style.width = vw + 'px';
-				inDrag.view.setColumnsWidth(tw);
-				if(!isLtr){
-					inDrag.view.headerNode.scrollLeft = inDrag.scrollLeft + deltaX;
+			var changeX = leftTop.l;
+			var data = {
+				deltaX: changeX,
+				w: inDrag.w + changeX,
+				vw: inDrag.vw + changeX,
+				tw: inDrag.tw + changeX
+			};
+			
+			this.dragRecord = {inDrag: inDrag, mover: mover, leftTop:leftTop};
+			
+			if(data.w >= this.minColWidth){
+				if (!mover) { // we are using keyboard do immediate resize
+					this.doResizeNow(inDrag, data);
+				}
+				else{
+					dojo.style(this.lineDiv, "left", (this.lineDiv._origLeft + data.deltaX) + "px");
 				}
-			}
-			if(inDrag.view.flexCells && !inDrag.view.testFlexCells()){
-				var t = findTable(inDrag.node);
-				t && (t.style.width = '');
 			}
 		},
 
 		endResizeColumn: function(inDrag){
+			if(this.dragRecord){
+				var leftTop = this.dragRecord.leftTop;
+				var changeX = dojo._isBodyLtr() ? leftTop.l : -leftTop.l;
+				// Make sure we are not under our minimum
+				// http://bugs.dojotoolkit.org/ticket/9390
+				changeX += Math.max(inDrag.w + changeX, this.minColWidth) - (inDrag.w + changeX);
+				if(dojo.isWebKit && inDrag.spanners.length){
+					// Webkit needs the pad border extents back in
+					changeX += dojo._getPadBorderExtents(inDrag.spanners[0].node).w;
+				}
+				var data = {
+					deltaX: changeX,
+					w: inDrag.w + changeX,
+					vw: inDrag.vw + changeX,
+					tw: inDrag.tw + changeX
+				};
+				// Only resize the columns when the drag has finished
+				this.doResizeNow(inDrag, data);
+			}
+			
+			dojo.destroy(this.lineDiv);
+ 			dojo.destroy(this.moverDiv);
 			dojo.destroy(this.moverDiv);
 			delete this.moverDiv;
 			this._skipBogusClicks = true;
-			var conn = dojo.connect(inDrag.view, "update", this, function(){
-				dojo.disconnect(conn);
-				this._skipBogusClicks = false;
-			});
-			setTimeout(dojo.hitch(inDrag.view, "update"), 50);
+			inDrag.view.update();
+			this._skipBogusClicks = false;
+			this.grid.onResizeColumn(inDrag.index);
+		},
+		doResizeNow: function(inDrag, data){
+			inDrag.view.convertColPctToFixed();
+			if(inDrag.view.flexCells && !inDrag.view.testFlexCells()){
+				var t = findTable(inDrag.node);
+				if(t){
+					(t.style.width = '');
+				}
+			}
+			var i, s, sw, f, fl;
+			for(i=0; (s=inDrag.spanners[i]); i++){
+				sw = s.width + data.deltaX;
+				s.node.style.width = sw + 'px';
+				inDrag.view.setColWidth(s.index, sw);
+			}
+			for(i=0; (f=inDrag.followers[i]); i++){
+				fl = f.left + data.deltaX;
+				f.node.style.left = fl + 'px';
+			}
+			inDrag.node.style.width = data.w + 'px';
+			inDrag.view.setColWidth(inDrag.index, data.w);
+			inDrag.view.headerNode.style.width = data.vw + 'px';
+			inDrag.view.setColumnsWidth(data.tw);
+			if(!dojo._isBodyLtr()){
+				inDrag.view.headerNode.scrollLeft = inDrag.scrollLeft + data.deltaX;
+			}
 		}
 	});
 
@@ -8164,7 +9143,7 @@ dojo.provide("dojox.grid._Builder");
 		mapRows: function(inRows){
 			// summary: Map table topography
 
-			//
+			//console.log('mapRows');
 			// # of rows
 			var rowCount = inRows.length;
 			if(!rowCount){
@@ -8172,12 +9151,13 @@ dojo.provide("dojox.grid._Builder");
 			}
 			// map which columns and rows fill which cells
 			this.map = [];
-			for(var j=0, row; (row=inRows[j]); j++){
-				this.map[j] = [];
+			var row;
+			for(var k=0; (row=inRows[k]); k++){
+				this.map[k] = [];
 			}
-			for(var j=0, row; (row=inRows[j]); j++){
+			for(var j=0; (row=inRows[j]); j++){
 				for(var i=0, x=0, cell, colSpan, rowSpan; (cell=row[i]); i++){
-					while (this.map[j][x]){x++};
+					while(this.map[j][x]){x++;}
 					this.map[j][x] = { c: i, r: j };
 					rowSpan = cell.rowSpan || 1;
 					colSpan = cell.colSpan || 1;
@@ -8197,7 +9177,6 @@ dojo.provide("dojox.grid._Builder");
 				for(var i=0, cell; (cell=row[i]); i++){
 					h += cell.r + ',' + cell.c + '   ';
 				}
-				//
 			}
 		},
 
@@ -8208,7 +9187,7 @@ dojo.provide("dojox.grid._Builder");
 					if(cell.c==inCol && cell.r == inRow){
 						return { j: j, i: i };
 					}
-					//else{ };
+					//else{console.log(inRow, inCol, ' : ', i, j, " : ", cell.r, cell.c); };
 				}
 			}
 			return { j: -1, i: -1 };
@@ -8223,16 +9202,15 @@ dojo.provide("dojox.grid._Builder");
 		_findOverlappingNodes: function(inTable, inRow, inCol){
 			var nodes = [];
 			var m = this.getMapCoords(inRow, inCol);
-			//
-			var row = this.map[m.j];
+			//console.log("node j: %d, i: %d", m.j, m.i);
 			for(var j=0, row; (row=this.map[j]); j++){
 				if(j == m.j){ continue; }
 				var rw = row[m.i];
-				//
+				//console.log("overlaps: r: %d, c: %d", rw.r, rw.c);
 				var n = (rw?this.getNode(inTable, rw.r, rw.c):null);
 				if(n){ nodes.push(n); }
 			}
-			//
+			//console.log(nodes);
 			return nodes;
 		},
 		
@@ -8260,24 +9238,72 @@ dojo.provide("dojo.dnd.Container");
 		"Over"	- mouse over a container item
 */
 
+/*=====
+dojo.declare("dojo.dnd.__ContainerArgs", [], {
+	creator: function(){
+		// summary:
+		//		a creator function, which takes a data item, and returns an object like that:
+		//		{node: newNode, data: usedData, type: arrayOfStrings}
+	},
+
+	// skipForm: Boolean
+	//		don't start the drag operation, if clicked on form elements
+	skipForm: false,
+
+	// dropParent: Node||String
+	//		node or node's id to use as the parent node for dropped items
+	//		(must be underneath the 'node' parameter in the DOM)
+	dropParent: null,
+
+	// _skipStartup: Boolean
+	//		skip startup(), which collects children, for deferred initialization
+	//		(this is used in the markup mode)
+	_skipStartup: false
+});
+
+dojo.dnd.Item = function(){
+	// summary:
+	//		Represents (one of) the source node(s) being dragged.
+	//		Contains (at least) the "type" and "data" attributes.
+	// type: String[]
+	//		Type(s) of this item, by default this is ["text"]
+	// data: Object
+	//		Logical representation of the object being dragged.
+	//		If the drag object's type is "text" then data is a String,
+	//		if it's another type then data could be a different Object,
+	//		perhaps a name/value hash.
+	
+	this.type = type;
+	this.data = data;
+}
+=====*/
+
 dojo.declare("dojo.dnd.Container", null, {
-	// summary: a Container object, which knows when mouse hovers over it, 
-	//	and over which element it hovers
+	// summary:
+	//		a Container object, which knows when mouse hovers over it, 
+	//		and over which element it hovers
 	
 	// object attributes (for markup)
 	skipForm: false,
 	
+	/*=====
+	// current: DomNode
+	//		The DOM node the mouse is currently hovered over
+	current: null,
+	
+	// map: Hash<String, dojo.dnd.Item>
+	//		Map from an item's id (which is also the DOMNode's id) to
+	//		the dojo.dnd.Item itself.
+	map: {},
+	=====*/
+	
 	constructor: function(node, params){
-		// summary: a constructor of the Container
-		// node: Node: node or node's id to build the container on
-		// params: 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
-		//	dropParent: Node: node or node's id to use as the parent node for dropped items
-		//		(must be underneath the 'node' parameter in the DOM)
-		//	_skipStartup: Boolean: skip startup(), which collects children, for deferred initialization
-		//		(this is used in the markup mode)
+		// summary:
+		//		a constructor of the Container
+		// node: Node
+		//		node or node's id to build the container on
+		// params: dojo.dnd.__ContainerArgs
+		//		a dictionary of parameters
 		this.node = dojo.byId(node);
 		if(!params){ params = {}; }
 		this.creator = params.creator || null;
@@ -8308,24 +9334,31 @@ dojo.declare("dojo.dnd.Container", null, {
 	},
 	
 	// object attributes (for markup)
-	creator: function(){},	// creator function, dummy at the moment
+	creator: function(){
+		// summary:
+		//		creator function, dummy at the moment
+	},
 	
 	// abstract access to the map
 	getItem: function(/*String*/ key){
-		// summary: returns a data item by its key (id)
-		return this.map[key];	// Object
+		// summary:
+		//		returns a data item by its key (id)
+		return this.map[key];	// dojo.dnd.Item
 	},
-	setItem: function(/*String*/ key, /*Object*/ data){
-		// summary: associates a data item with its key (id)
+	setItem: function(/*String*/ key, /*dojo.dnd.Item*/ data){
+		// summary:
+		//		associates a data item with its key (id)
 		this.map[key] = data;
 	},
 	delItem: function(/*String*/ key){
-		// summary: removes a data item from the map by its key (id)
+		// 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).
+		// summary:
+		//		iterates over a data map skipping members that 
+		//		are present in the empty object (IE and/or 3rd-party libraries).
 		o = o || dojo.global;
 		var m = this.map, e = dojo.dnd._empty;
 		for(var i in m){
@@ -8335,17 +9368,20 @@ dojo.declare("dojo.dnd.Container", null, {
 		return o;	// Object
 	},
 	clearItems: function(){
-		// summary: removes all data items from the map
+		// summary:
+		//		removes all data items from the map
 		this.map = {};
 	},
 	
 	// methods
 	getAllNodes: function(){
-		// summary: returns a list (an array) of all valid child nodes
+		// summary:
+		//		returns a list (an array) of all valid child nodes
 		return dojo.query("> .dojoDndItem", this.parent);	// NodeList
 	},
 	sync: function(){
-		// summary: synch up the node list with the data map
+		// summary:
+		//		sync up the node list with the data map
 		var map = {};
 		this.getAllNodes().forEach(function(node){
 			if(node.id){
@@ -8368,10 +9404,14 @@ dojo.declare("dojo.dnd.Container", null, {
 		return this;	// self
 	},
 	insertNodes: function(data, before, anchor){
-		// summary: inserts an array of new nodes before/after an anchor node
-		// data: Array: a list of data items, which should be processed by the creator function
-		// before: Boolean: insert before the anchor, if true, and after the anchor otherwise
-		// anchor: Node: the anchor node to be used as a point of insertion
+		// 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){
@@ -8399,7 +9439,8 @@ dojo.declare("dojo.dnd.Container", null, {
 		return this;	// self
 	},
 	destroy: function(){
-		// summary: prepares the object to be garbage-collected
+		// summary:
+		//		prepares this object to be garbage-collected
 		dojo.forEach(this.events, dojo.disconnect);
 		this.clearItems();
 		this.node = this.parent = this.current = null;
@@ -8411,7 +9452,8 @@ dojo.declare("dojo.dnd.Container", null, {
 		return new dojo.dnd.Container(node, params);
 	},
 	startup: function(){
-		// summary: collects valid child items and populate the map
+		// summary:
+		//		collects valid child items and populate the map
 		
 		// set up the real parent node
 		if(!this.parent){
@@ -8430,8 +9472,10 @@ dojo.declare("dojo.dnd.Container", null, {
 
 	// mouse events
 	onMouseOver: function(e){
-		// summary: event processor for onmouseover
-		// e: Event: mouse event
+		// summary:
+		//		event processor for onmouseover
+		// e: Event
+		//		mouse event
 		var n = e.relatedTarget;
 		while(n){
 			if(n == this.node){ break; }
@@ -8452,8 +9496,10 @@ dojo.declare("dojo.dnd.Container", null, {
 		this.current = n;
 	},
 	onMouseOut: function(e){
-		// summary: event processor for onmouseout
-		// e: Event: mouse event
+		// summary:
+		//		event processor for onmouseout
+		// e: Event
+		//		mouse event
 		for(var n = e.relatedTarget; n;){
 			if(n == this.node){ return; }
 			try{
@@ -8470,8 +9516,10 @@ dojo.declare("dojo.dnd.Container", null, {
 		this.onOutEvent();
 	},
 	onSelectStart: function(e){
-		// summary: event processor for onselectevent and ondragevent
-		// e: Event: mouse event
+		// summary:
+		//		event processor for onselectevent and ondragevent
+		// e: Event
+		//		mouse event
 		if(!this.skipForm || !dojo.dnd.isFormElement(e)){
 			dojo.stopEvent(e);
 		}
@@ -8479,15 +9527,20 @@ dojo.declare("dojo.dnd.Container", null, {
 	
 	// utilities
 	onOverEvent: function(){
-		// summary: this function is called once, when mouse is over our container
+		// 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
+		// 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
+		// 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]);
@@ -8496,20 +9549,28 @@ dojo.declare("dojo.dnd.Container", null, {
 		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
+		// 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
+		// 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
+		// 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){
@@ -8518,8 +9579,9 @@ dojo.declare("dojo.dnd.Container", null, {
 		}
 		return null;
 	},
-	_normalizedCreator: function(item, hint){
-		// summary: adds all necessary data to the output of the user-supplied creator function
+	_normalizedCreator: function(/*dojo.dnd.Item*/ item, /*String*/ hint){
+		// summary:
+		//		adds all necessary data to the output of the user-supplied creator function
 		var t = (this.creator || this.defaultCreator).call(this, item, hint);
 		if(!dojo.isArray(t.type)){ t.type = ["text"]; }
 		if(!t.node.id){ t.node.id = dojo.dnd.getUniqueId(); }
@@ -8529,9 +9591,11 @@ dojo.declare("dojo.dnd.Container", null, {
 });
 
 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
+	// summary:
+	//		returns a function, which creates an element of given tag 
+	//		(SPAN by default) and sets its innerHTML to given text
+	// tag: String
+	//		a tag name or empty for SPAN
 	if(!tag){ return dojo.dnd._createSpan; }
 	return function(text){	// Function
 		return dojo.create(tag, {innerHTML: text});	// Node
@@ -8539,25 +9603,32 @@ dojo.dnd._createNode = function(tag){
 };
 
 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
+	// summary:
+	//		creates a TR/TD structure with given text as an innerHTML of TD
+	// text: String
+	//		a text for TD
 	var tr = dojo.create("tr");
 	dojo.create("td", {innerHTML: text}, tr);
 	return tr;	// Node
 };
 
 dojo.dnd._createSpan = function(text){
-	// summary: creates a SPAN element with given text as its innerHTML
-	// text: String: a text for SPAN
+	// summary:
+	//		creates a SPAN element with given text as its innerHTML
+	// text: String
+	//		a text for SPAN
 	return dojo.create("span", {innerHTML: text});	// Node
 };
 
-// dojo.dnd._defaultCreatorNodes: Object: a dicitionary, which maps container tag names to child tag names
+// dojo.dnd._defaultCreatorNodes: Object
+//		a dictionary that maps container tag names to child tag names
 dojo.dnd._defaultCreatorNodes = {ul: "li", ol: "li", div: "div", p: "div"};
 
 dojo.dnd._defaultCreator = function(node){
-	// summary: takes a parent node, and returns an appropriate creator function
-	// node: Node: a container node
+	// summary:
+	//		takes a parent node, and returns an appropriate creator function
+	// node: Node
+	//		a container node
 	var tag = node.tagName.toLowerCase();
 	var c = tag == "tbody" || tag == "thead" ? dojo.dnd._createTrTd :
 			dojo.dnd._createNode(dojo.dnd._defaultCreatorNodes[tag]);
@@ -8596,19 +9667,37 @@ dojo.provide("dojo.dnd.Selector");
 		"Anchor"	- an item is selected, and is an anchor for a "shift" selection
 */
 
+/*=====
+dojo.declare("dojo.dnd.__SelectorArgs", [dojo.dnd.__ContainerArgs], {
+	//	singular: Boolean
+	//		allows selection of only one element, if true
+	singular: false,
+
+	//	autoSync: Boolean
+	//		autosynchronizes the source with its list of DnD nodes,
+	autoSync: false
+});
+=====*/
+
 dojo.declare("dojo.dnd.Selector", dojo.dnd.Container, {
-	// summary: a Selector object, which knows how to select its children
+	// summary:
+	//		a Selector object, which knows how to select its children
 	
+	/*=====
+	// selection: Set<String>
+	//		The set of id's that are currently selected, such that this.selection[id] == 1
+	//		if the node w/that id is selected.  Can iterate over selected node's id's like:
+	//	|		for(var id in this.selection)
+	selection: {},
+	=====*/
+
 	constructor: function(node, params){
-		// summary: 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
-		//	autoSync: Boolean
-		//		autosynchronizes the source with its list of DnD nodes,
-		//		false by default
+		// summary:
+		//		constructor of the Selector
+		// node: Node||String
+		//		node or node's id to build the selector on
+		// params: dojo.dnd.__SelectorArgs?
+		//		a dictionary of parameters
 		if(!params){ params = {}; }
 		this.singular = params.singular;
 		this.autoSync = params.autoSync;
@@ -8627,21 +9716,24 @@ dojo.declare("dojo.dnd.Selector", dojo.dnd.Container, {
 	
 	// methods
 	getSelectedNodes: function(){
-		// summary: returns a list (an array) of selected nodes
+		// 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
+		return t;	// NodeList
 	},
 	selectNone: function(){
-		// summary: unselects all items
+		// summary:
+		//		unselects all items
 		return this._removeSelection()._removeAnchor();	// self
 	},
 	selectAll: function(){
-		// summary: selects all items
+		// summary:
+		//		selects all items
 		this.forInItems(function(data, id){
 			this._addItemClass(dojo.byId(id), "Selected");
 			this.selection[id] = 1;
@@ -8649,7 +9741,8 @@ dojo.declare("dojo.dnd.Selector", dojo.dnd.Container, {
 		return this._removeAnchor();	// self
 	},
 	deleteSelectedNodes: function(){
-		// summary: deletes all selected items
+		// summary:
+		//		deletes all selected items
 		var e = dojo.dnd._empty;
 		for(var i in this.selection){
 			if(i in e){ continue; }
@@ -8662,8 +9755,9 @@ dojo.declare("dojo.dnd.Selector", dojo.dnd.Container, {
 		return this;	// self
 	},
 	forInSelectedItems: function(/*Function*/ f, /*Object?*/ o){
-		// summary: iterates over selected items,
-		// see dojo.dnd.Container.forInItems() for details
+		// summary:
+		//		iterates over selected items;
+		//		see `dojo.dnd.Container.forInItems()` for details
 		o = o || dojo.global;
 		var s = this.selection, e = dojo.dnd._empty;
 		for(var i in s){
@@ -8672,7 +9766,8 @@ dojo.declare("dojo.dnd.Selector", dojo.dnd.Container, {
 		}
 	},
 	sync: function(){
-		// summary: synch up the node list with the data map
+		// summary:
+		//		sync up the node list with the data map
 		
 		dojo.dnd.Selector.superclass.sync.call(this);
 		
@@ -8698,11 +9793,16 @@ dojo.declare("dojo.dnd.Selector", dojo.dnd.Container, {
 		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
+		// summary:
+		//		inserts new data items (see `dojo.dnd.Container.insertNodes()` method for details)
+		// addSelected: Boolean
+		//		all new nodes will be added to selected items, if true, no selection change otherwise
+		// data: Array
+		//		a list of data items, which should be processed by the creator function
+		// before: Boolean
+		//		insert before the anchor, if true, and after the anchor otherwise
+		// anchor: Node
+		//		the anchor node to be used as a point of insertion
 		var oldCreator = this._normalizedCreator;
 		this._normalizedCreator = function(item, hint){
 			var t = oldCreator.call(this, item, hint);
@@ -8727,7 +9827,8 @@ dojo.declare("dojo.dnd.Selector", dojo.dnd.Container, {
 		return this;	// self
 	},
 	destroy: function(){
-		// summary: prepares the object to be garbage-collected
+		// summary:
+		//		prepares the object to be garbage-collected
 		dojo.dnd.Selector.superclass.destroy.call(this);
 		this.selection = this.anchor = null;
 	},
@@ -8740,13 +9841,15 @@ dojo.declare("dojo.dnd.Selector", dojo.dnd.Container, {
 
 	// mouse events
 	onMouseDown: function(e){
-		// summary: event processor for onmousedown
-		// e: Event: mouse event
+		// summary:
+		//		event processor for onmousedown
+		// e: Event
+		//		mouse event
 		if(this.autoSync){ this.sync(); }
 		if(!this.current){ return; }
-		if(!this.singular && !dojo.dnd.getCopyKeyState(e) && !e.shiftKey && (this.current.id in this.selection)){
+		if(!this.singular && !dojo.isCopyKey(e) && !e.shiftKey && (this.current.id in this.selection)){
 			this.simpleSelection = true;
-			if(e.button === dojo.dnd._lmb){
+			if(e.button === dojo.mouseButtons.LEFT){
 				// accept the left button and stop the event
 				// for IE we don't stop event when multiple buttons are pressed
 				dojo.stopEvent(e);
@@ -8754,7 +9857,7 @@ dojo.declare("dojo.dnd.Selector", dojo.dnd.Container, {
 			return;
 		}
 		if(!this.singular && e.shiftKey){
-			if(!dojo.dnd.getCopyKeyState(e)){
+			if(!dojo.isCopyKey(e)){
 				this._removeSelection();
 			}
 			var c = this.getAllNodes();
@@ -8783,7 +9886,7 @@ dojo.declare("dojo.dnd.Selector", dojo.dnd.Container, {
 		}else{
 			if(this.singular){
 				if(this.anchor == this.current){
-					if(dojo.dnd.getCopyKeyState(e)){
+					if(dojo.isCopyKey(e)){
 						this.selectNone();
 					}
 				}else{
@@ -8793,7 +9896,7 @@ dojo.declare("dojo.dnd.Selector", dojo.dnd.Container, {
 					this.selection[this.current.id] = 1;
 				}
 			}else{
-				if(dojo.dnd.getCopyKeyState(e)){
+				if(dojo.isCopyKey(e)){
 					if(this.anchor == this.current){
 						delete this.selection[this.anchor.id];
 						this._removeAnchor();
@@ -8824,8 +9927,10 @@ dojo.declare("dojo.dnd.Selector", dojo.dnd.Container, {
 		dojo.stopEvent(e);
 	},
 	onMouseUp: function(e){
-		// summary: event processor for onmouseup
-		// e: Event: mouse event
+		// summary:
+		//		event processor for onmouseup
+		// e: Event
+		//		mouse event
 		if(!this.simpleSelection){ return; }
 		this.simpleSelection = false;
 		this.selectNone();
@@ -8836,23 +9941,28 @@ dojo.declare("dojo.dnd.Selector", dojo.dnd.Container, {
 		}
 	},
 	onMouseMove: function(e){
-		// summary: event processor for onmousemove
-		// e: Event: mouse event
+		// 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
+		// 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
+		// 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
+		// summary:
+		//		unselects all items
 		var e = dojo.dnd._empty;
 		for(var i in this.selection){
 			if(i in e){ continue; }
@@ -8880,8 +9990,10 @@ dojo.provide("dojo.dnd.Avatar");
 
 
 dojo.declare("dojo.dnd.Avatar", null, {
-	// summary: an object, which represents transferred DnD items visually
-	// manager: Object: a DnD manager object
+	// summary:
+	//		Object that represents transferred DnD items visually
+	// manager: Object
+	//		a DnD manager object
 
 	constructor: function(manager){
 		this.manager = manager;
@@ -8890,8 +10002,10 @@ dojo.declare("dojo.dnd.Avatar", null, {
 
 	// methods
 	construct: function(){
-		// summary: a constructor function;
-		//	it is separate so it can be (dynamically) overwritten in case of need
+		// summary:
+		//		constructor function;
+		//		it is separate so it can be (dynamically) overwritten in case of need
+		this.isA11y = dojo.hasClass(dojo.body(),"dijit_a11y");
 		var a = dojo.create("table", {
 				"class": "dojoDndAvatar",
 				style: {
@@ -8900,13 +10014,18 @@ dojo.declare("dojo.dnd.Avatar", null, {
 					margin:   "0px"
 				}
 			}),
+			source = this.manager.source, node,
 			b = dojo.create("tbody", null, a),
 			tr = dojo.create("tr", null, b),
-			td = dojo.create("td", {
-				innerHTML: this._generateText()
-			}, tr),
-			k = Math.min(5, this.manager.nodes.length), i = 0,
-			source = this.manager.source, node;
+			td = dojo.create("td", null, tr),
+			icon = this.isA11y ? dojo.create("span", {
+						id : "a11yIcon",
+						innerHTML : this.manager.copy ? '+' : "<"
+					}, td) : null,
+			span = dojo.create("span", {
+				innerHTML: source.generateText ? this._generateText() : ""
+			}, td),
+			k = Math.min(5, this.manager.nodes.length), i = 0;
 		// we have to set the opacity on IE only after the node is live
 		dojo.attr(tr, {
 			"class": "dojoDndAvatarHeader",
@@ -8939,17 +10058,32 @@ dojo.declare("dojo.dnd.Avatar", null, {
 		this.node = a;
 	},
 	destroy: function(){
-		// summary: a desctructor for the avatar, called to remove all references so it can be garbage-collected
+		// summary:
+		//		destructor for the avatar; called to remove all references so it can be garbage-collected
 		dojo.destroy(this.node);
 		this.node = false;
 	},
 	update: function(){
-		// summary: updates the avatar to reflect the current DnD state
+		// summary:
+		//		updates the avatar to reflect the current DnD state
 		dojo[(this.manager.canDropFlag ? "add" : "remove") + "Class"](this.node, "dojoDndAvatarCanDrop");
+		if (this.isA11y){
+			var icon = dojo.byId("a11yIcon");
+			var text = '+';   // assume canDrop && copy
+			if (this.manager.canDropFlag && !this.manager.copy) {
+				text = '< '; // canDrop && move 
+			}else if (!this.manager.canDropFlag && !this.manager.copy) {
+				text = "o"; //!canDrop && move
+			}else if(!this.manager.canDropFlag){
+				text = 'x';  // !canDrop && copy
+			}
+			icon.innerHTML=text;
+		}
 		// replace text
-		dojo.query("tr.dojoDndAvatarHeader td", this.node).forEach(function(node){
-			node.innerHTML = this._generateText();
-		}, this);
+		dojo.query(("tr.dojoDndAvatarHeader td span" +(this.isA11y ? " span" : "")), this.node).forEach(
+			function(node){
+				node.innerHTML = this._generateText();
+			}, this);
 	},
 	_generateText: function(){
 		// summary: generates a proper text to reflect copying or moving of items
@@ -8968,7 +10102,8 @@ dojo.provide("dojo.dnd.Manager");
 
 
 dojo.declare("dojo.dnd.Manager", null, {
-	// summary: the manager of DnD operations (usually a singleton)
+	// summary:
+	//		the manager of DnD operations (usually a singleton)
 	constructor: function(){
 		this.avatar  = null;
 		this.source = null;
@@ -8985,8 +10120,10 @@ dojo.declare("dojo.dnd.Manager", null, {
 	
 	// methods
 	overSource: function(source){
-		// summary: called when a source detected a mouse-over conditiion
-		// source: Object: the reporter
+		// summary:
+		//		called when a source detected a mouse-over condition
+		// source: Object
+		//		the reporter
 		if(this.avatar){
 			this.target = (source && source.targetState != "Disabled") ? source : null;
 			this.canDropFlag = Boolean(this.target);
@@ -8995,8 +10132,10 @@ dojo.declare("dojo.dnd.Manager", null, {
 		dojo.publish("/dnd/source/over", [source]);
 	},
 	outSource: function(source){
-		// summary: called when a source detected a mouse-out conditiion
-		// source: Object: the reporter
+		// summary:
+		//		called when a source detected a mouse-out condition
+		// source: Object
+		//		the reporter
 		if(this.avatar){
 			if(this.target == source){
 				this.target = null;
@@ -9009,10 +10148,14 @@ dojo.declare("dojo.dnd.Manager", 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
+		// 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
@@ -9032,7 +10175,8 @@ dojo.declare("dojo.dnd.Manager", null, {
 		dojo.addClass(dojo.body(), c); 
 	},
 	canDrop: function(flag){
-		// summary: called to notify if the current target can accept items
+		// summary:
+		//		called to notify if the current target can accept items
 		var canDropFlag = Boolean(this.target && flag);
 		if(this.canDropFlag != canDropFlag){
 			this.canDropFlag = canDropFlag;
@@ -9040,7 +10184,8 @@ dojo.declare("dojo.dnd.Manager", null, {
 		}
 	},
 	stopDrag: function(){
-		// summary: stop the DnD in progress
+		// summary:
+		//		stop the DnD in progress
 		dojo.removeClass(dojo.body(), "dojoDndCopy");
 		dojo.removeClass(dojo.body(), "dojoDndMove");
 		dojo.forEach(this.events, dojo.disconnect);
@@ -9051,18 +10196,22 @@ dojo.declare("dojo.dnd.Manager", null, {
 		this.nodes = [];
 	},
 	makeAvatar: function(){
-		// summary: makes the avatar, it is separate to be overwritten dynamically, if needed
+		// 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
+		// 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
+		// summary:
+		//		event processor for onmousemove
+		// e: Event
+		//		mouse event
 		var a = this.avatar;
 		if(a){
 			dojo.dnd.autoScrollNodes(e);
@@ -9070,18 +10219,20 @@ dojo.declare("dojo.dnd.Manager", null, {
 			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)));
+			var copy = Boolean(this.source.copyState(dojo.isCopyKey(e)));
 			if(this.copy != copy){ 
 				this._setCopyStatus(copy);
 			}
 		}
 	},
 	onMouseUp: function(e){
-		// summary: event processor for onmouseup
-		// e: Event: mouse event
+		// summary:
+		//		event processor for onmouseup
+		// e: Event
+		//		mouse event
 		if(this.avatar){
 			if(this.target && this.canDropFlag){
-				var copy = Boolean(this.source.copyState(dojo.dnd.getCopyKeyState(e))),
+				var copy = Boolean(this.source.copyState(dojo.isCopyKey(e))),
 				params = [this.source, this.nodes, copy, this.target];
 				dojo.publish("/dnd/drop/before", params);
 				dojo.publish("/dnd/drop", params);
@@ -9094,9 +10245,11 @@ dojo.declare("dojo.dnd.Manager", null, {
 	
 	// 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
+		// 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:
@@ -9113,8 +10266,10 @@ dojo.declare("dojo.dnd.Manager", null, {
 		}
 	},
 	onKeyUp: function(e){
-		// summary: event processor for onkeyup, watching for CTRL for copy/move status
-		// e: Event: keyboard event
+		// 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){ 
@@ -9125,8 +10280,10 @@ dojo.declare("dojo.dnd.Manager", null, {
 	
 	// utilities
 	_setCopyStatus: function(copy){
-		// summary: changes the copy status
-		// copy: Boolean: the copy status
+		// summary:
+		//		changes the copy status
+		// copy: Boolean
+		//		the copy status
 		this.copy = copy;
 		this.source._markDndStatus(this.copy);
 		this.updateAvatar();
@@ -9135,11 +10292,13 @@ dojo.declare("dojo.dnd.Manager", null, {
 	}
 });
 
-// summary: the manager singleton variable, can be overwritten, if needed
+// dojo.dnd._manager:
+//		The manager singleton variable. Can be overwritten if needed.
 dojo.dnd._manager = null;
 
 dojo.dnd.manager = function(){
-	// summary: returns the current DnD manager, creates one if it is not created yet
+	// 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();
 	}
@@ -9199,6 +10358,8 @@ dojo.dnd.__SourceArgs = function(){
 	//		true by default, works only if copyOnly is true
 	//	withHandles: Boolean?
 	//		allows dragging only by handles, false by default
+	//  generateText: Boolean?
+	//		generate text node for drag and drop, true by default
 	this.isSource = isSource;
 	this.accept = accept;
 	this.autoSync = autoSync;
@@ -9208,11 +10369,13 @@ dojo.dnd.__SourceArgs = function(){
 	this.selfCopy = selfCopy;
 	this.selfAccept = selfAccept;
 	this.withHandles = withHandles;
+	this.generateText = true;
 }
 =====*/
 
 dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
-	// summary: a Source object, which can be used as a DnD source, or a DnD target
+	// summary:
+	//		a Source object, which can be used as a DnD source, or a DnD target
 	
 	// object attributes (for markup)
 	isSource: true,
@@ -9225,6 +10388,7 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 	autoSync: false,
 	delay: 0, // pixels
 	accept: ["text"],
+	generateText: true,
 	
 	constructor: function(/*DOMNode|String*/node, /*dojo.dnd.__SourceArgs?*/params){
 		// summary: 
@@ -9273,9 +10437,12 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 	
 	// 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
+		// summary:
+		//		checks if the target can accept nodes from this source
+		// source: Object
+		//		the source which provides items
+		// nodes: Array
+		//		the list of transferred items
 		if(this == source){
 			return !this.copyOnly || this.selfAccept;
 		}
@@ -9296,10 +10463,13 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 		return true;	// Boolean
 	},
 	copyState: function(keyPressed, self){
-		// summary: Returns true, if we need to copy items, false to move.
+		// 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
-		// self: Boolean?: optional flag, which means that we are about to drop on itself
+		// keyPressed: Boolean
+		//		the "copy" key was pressed
+		// self: Boolean?
+		//		optional flag that means that we are about to drop on itself
 		
 		if(keyPressed){ return true; }
 		if(arguments.length < 2){
@@ -9315,7 +10485,8 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 		return false;	// Boolean
 	},
 	destroy: function(){
-		// summary: prepares the object to be garbage-collected
+		// summary:
+		//		prepares the object to be garbage-collected
 		dojo.dnd.Source.superclass.destroy.call(this);
 		dojo.forEach(this.topics, dojo.unsubscribe);
 		this.targetAnchor = null;
@@ -9329,8 +10500,10 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 
 	// mouse event processors
 	onMouseMove: function(e){
-		// summary: event processor for onmousemove
-		// e: Event: mouse event
+		// 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();
@@ -9339,16 +10512,12 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 			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
-					};
+					this.targetBox = dojo.position(this.current, true);
 				}
 				if(this.horizontal){
-					before = (e.pageX - this.targetBox.xy.x) < (this.targetBox.w / 2);
+					before = (e.pageX - this.targetBox.x) < (this.targetBox.w / 2);
 				}else{
-					before = (e.pageY - this.targetBox.xy.y) < (this.targetBox.h / 2);
+					before = (e.pageY - this.targetBox.y) < (this.targetBox.h / 2);
 				}
 			}
 			if(this.current != this.targetAnchor || before != this.before){
@@ -9360,14 +10529,16 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 					(Math.abs(e.pageX - this._lastX) > this.delay || Math.abs(e.pageY - this._lastY) > this.delay)){
 				var nodes = this.getSelectedNodes();
 				if(nodes.length){
-					m.startDrag(this, nodes, this.copyState(dojo.dnd.getCopyKeyState(e), true));
+					m.startDrag(this, nodes, this.copyState(dojo.isCopyKey(e), true));
 				}
 			}
 		}
 	},
 	onMouseDown: function(e){
-		// summary: event processor for onmousedown
-		// e: Event: mouse event
+		// summary:
+		//		event processor for onmousedown
+		// e: Event
+		//		mouse event
 		if(!this.mouseDown && this._legalMouseDown(e) && (!this.skipForm || !dojo.dnd.isFormElement(e))){
 			this.mouseDown = true;
 			this._lastX = e.pageX;
@@ -9376,8 +10547,10 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 		}
 	},
 	onMouseUp: function(e){
-		// summary: event processor for onmouseup
-		// e: Event: mouse event
+		// summary:
+		//		event processor for onmouseup
+		// e: Event
+		//		mouse event
 		if(this.mouseDown){
 			this.mouseDown = false;
 			dojo.dnd.Source.superclass.onMouseUp.call(this, e);
@@ -9386,8 +10559,10 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 	
 	// 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
+		// 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){
@@ -9399,10 +10574,14 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 		}
 	},
 	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
+		// summary:
+		//		topic event processor for /dnd/start, called to initiate the DnD operation
+		// source: Object
+		//		the source which provides items
+		// nodes: Array
+		//		the list of transferred items
+		// copy: Boolean
+		//		copy items, if true, move items otherwise
 		if(this.autoSync){ this.sync(); }
 		if(this.isSource){
 			this._changeState("Source", this == source ? (copy ? "Copied" : "Moved") : "");
@@ -9415,11 +10594,16 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 		this.isDragging = true;
 	},
 	onDndDrop: function(source, nodes, copy, target){
-		// summary: topic event processor for /dnd/drop, called to finish the DnD operation
-		// source: Object: the source which provides items
-		// nodes: Array: the list of transferred items
-		// copy: Boolean: copy items, if true, move items otherwise
-		// target: Object: the target which accepts items
+		// summary:
+		//		topic event processor for /dnd/drop, called to finish the DnD operation
+		// source: Object
+		//		the source which provides items
+		// nodes: Array
+		//		the list of transferred items
+		// copy: Boolean
+		//		copy items, if true, move items otherwise
+		// target: Object
+		//		the target which accepts items
 		if(this == target){
 			// this one is for us => move nodes!
 			this.onDrop(source, nodes, copy);
@@ -9427,7 +10611,8 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 		this.onDndCancel();
 	},
 	onDndCancel: function(){
-		// summary: topic event processor for /dnd/cancel, called to cancel the DnD operation
+		// summary:
+		//		topic event processor for /dnd/cancel, called to cancel the DnD operation
 		if(this.targetAnchor){
 			this._unmarkTargetAnchor();
 			this.targetAnchor = null;
@@ -9441,10 +10626,14 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 	
 	// local events
 	onDrop: function(source, nodes, copy){
-		// summary: called only on the current target, when drop is performed
-		// source: Object: the source which provides items
-		// nodes: Array: the list of transferred items
-		// copy: Boolean: copy items, if true, move items otherwise
+		// summary:
+		//		called only on the current target, when drop is performed
+		// source: Object
+		//		the source which provides items
+		// nodes: Array
+		//		the list of transferred items
+		// copy: Boolean
+		//		copy items, if true, move items otherwise
 		
 		if(this != source){
 			this.onDropExternal(source, nodes, copy);
@@ -9453,11 +10642,15 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 		}
 	},
 	onDropExternal: function(source, nodes, copy){
-		// summary: called only on the current target, when drop is performed
-		//	from an external source
-		// source: Object: the source which provides items
-		// nodes: Array: the list of transferred items
-		// copy: Boolean: copy items, if true, move items otherwise
+		// summary:
+		//		called only on the current target, when drop is performed
+		//		from an external source
+		// source: Object
+		//		the source which provides items
+		// nodes: Array
+		//		the list of transferred items
+		// copy: Boolean
+		//		copy items, if true, move items otherwise
 		
 		var oldCreator = this._normalizedCreator;
 		// transferring nodes from the source to the target
@@ -9496,10 +10689,13 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 		this._normalizedCreator = oldCreator;
 	},
 	onDropInternal: function(nodes, copy){
-		// summary: called only on the current target, when drop is performed
-		//	from the same target/source
-		// nodes: Array: the list of transferred items
-		// copy: Boolean: copy items, if true, move items otherwise
+		// summary:
+		//		called only on the current target, when drop is performed
+		//		from the same target/source
+		// nodes: Array
+		//		the list of transferred items
+		// copy: Boolean
+		//		copy items, if true, move items otherwise
 		
 		var oldCreator = this._normalizedCreator;
 		// transferring nodes within the single source
@@ -9538,17 +10734,20 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 		this._normalizedCreator = oldCreator;
 	},
 	onDraggingOver: function(){
-		// summary: called during the active DnD operation, when items
-		// are dragged over this target, and it is not disabled
+		// summary:
+		//		called during the active DnD operation, when items
+		//		are dragged over this target, and it is not disabled
 	},
 	onDraggingOut: function(){
-		// summary: called during the active DnD operation, when items
-		// are dragged away from this target, and it is not disabled
+		// summary:
+		//		called during the active DnD operation, when items
+		//		are dragged away from this target, and it is not disabled
 	},
 	
 	// utilities
 	onOverEvent: function(){
-		// summary: this function is called once, when mouse is over our container
+		// summary:
+		//		this function is called once, when mouse is over our container
 		dojo.dnd.Source.superclass.onOverEvent.call(this);
 		dojo.dnd.manager().overSource(this);
 		if(this.isDragging && this.targetState != "Disabled"){
@@ -9556,7 +10755,8 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 		}
 	},
 	onOutEvent: function(){
-		// summary: this function is called once, when mouse is out of our container
+		// summary:
+		//		this function is called once, when mouse is out of our container
 		dojo.dnd.Source.superclass.onOutEvent.call(this);
 		dojo.dnd.manager().outSource(this);
 		if(this.isDragging && this.targetState != "Disabled"){
@@ -9564,8 +10764,10 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 		}
 	},
 	_markTargetAnchor: function(before){
-		// summary: assigns a class to the current target anchor based on "before" status
-		// before: Boolean: insert before, if true, after otherwise
+		// 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");
@@ -9578,7 +10780,8 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 		}
 	},
 	_unmarkTargetAnchor: function(){
-		// summary: removes a class of the current target anchor based on "before" status
+		// 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;
@@ -9586,22 +10789,25 @@ dojo.declare("dojo.dnd.Source", dojo.dnd.Selector, {
 		this.before = true;
 	},
 	_markDndStatus: function(copy){
-		// summary: changes source's state based on "copy" status
+		// 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
+		// summary:
+		//		checks if user clicked on "approved" items
+		// e: Event
+		//		mouse event
 		
 		// accept only the left mouse button
-		if(!dojo.dnd._isLmbPressed(e)){ return false; }
+		if(!dojo.mouseButtons.isLeft(e)){ return false; }
 		
 		if(!this.withHandles){ return true; }
 		
 		// check for handles
 		for(var node = e.target; node && node !== this.node; node = node.parentNode){
 			if(dojo.hasClass(node, "dojoDndHandle")){ return true; }
-			if(dojo.hasClass(node, "dojoDndItem")){ break; }
+			if(dojo.hasClass(node, "dojoDndItem") || dojo.hasClass(node, "dojoDndIgnore")){ break; }
 		}
 		return false;	// Boolean
 	}
@@ -9611,7 +10817,8 @@ 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
+		// summary:
+		//		a constructor of the Target --- see the `dojo.dnd.Source.constructor` for details
 		this.isSource = false;
 		dojo.removeClass(this.node, "dojoDndSource");
 	},
@@ -9624,10 +10831,12 @@ dojo.declare("dojo.dnd.Target", dojo.dnd.Source, {
 });
 
 dojo.declare("dojo.dnd.AutoSource", dojo.dnd.Source, {
-	// summary: a source, which syncs its DnD nodes by default
+	// summary:
+	//		a source that syncs its DnD nodes by default
 	
 	constructor: function(node, params){
-		// summary: a constructor of the AutoSource --- see the Source constructor for details
+		// summary:
+		//		constructor of the AutoSource --- see the Source constructor for details
 		this.autoSync = true;
 	},
 
@@ -9685,16 +10894,24 @@ dojo.provide("dojox.grid._View");
 		//		Width of the column being toggled (-1 for none)
 		_togglingColumn: -1,
 		
+		// _headerBuilderClass: Object
+		//		The class to use for our header builder
+		_headerBuilderClass: dojox.grid._HeaderBuilder,
+		
+		// _contentBuilderClass: Object
+		//		The class to use for our content builder
+		_contentBuilderClass: dojox.grid._ContentBuilder,
+		
 		postMixInProperties: function(){
-			this.rowNodes = [];
+			this.rowNodes = {};
 		},
 
 		postCreate: function(){
 			this.connect(this.scrollboxNode,"onscroll","doscroll");
 			dojox.grid.util.funnelEvents(this.contentNode, this, "doContentEvent", [ 'mouseover', 'mouseout', 'click', 'dblclick', 'contextmenu', 'mousedown' ]);
 			dojox.grid.util.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);
+			this.content = new this._contentBuilderClass(this);
+			this.header = new this._headerBuilderClass(this);
 			//BiDi: in RTL case, style width='9000em' causes scrolling problem in head node
 			if(!dojo._isBodyLtr()){
 				this.headerNodeContainer.style.width = "";
@@ -9704,8 +10921,10 @@ dojo.provide("dojox.grid._View");
 		destroy: function(){
 			dojo.destroy(this.headerNode);
 			delete this.headerNode;
-			dojo.forEach(this.rowNodes, dojo.destroy);
-			this.rowNodes = [];
+			for(var i in this.rowNodes){
+				dojo.destroy(this.rowNodes[i]);
+			}
+			this.rowNodes = {};
 			if(this.source){
 				this.source.destroy();
 			}
@@ -9714,7 +10933,7 @@ dojo.provide("dojox.grid._View");
 
 		// focus 
 		focus: function(){
-			if(dojo.isWebKit || dojo.isOpera){
+			if(dojo.isIE || dojo.isWebKit || dojo.isOpera){
 				this.hiddenFocusNode.focus();
 			}else{
 				this.scrollboxNode.focus();
@@ -9729,17 +10948,61 @@ dojo.provide("dojox.grid._View");
 			}else{
 				this.viewWidth = vs.width || (vs.noscroll ? 'auto' : this.viewWidth); //|| this.defaultWidth;
 			}
-			this.onBeforeRow = vs.onBeforeRow;
-			this.onAfterRow = vs.onAfterRow;
+			this._onBeforeRow = vs.onBeforeRow||function(){};
+			this._onAfterRow = vs.onAfterRow||function(){};
 			this.noscroll = vs.noscroll;
 			if(this.noscroll){
 				this.scrollboxNode.style.overflow = "hidden";
 			}
-			this.simpleStructure = Boolean(vs.cells.length == 1);
-			// bookkeeping
-			this.testFlexCells();
-			// accomodate new structure
-			this.updateStructure();
+			this.simpleStructure = Boolean(vs.cells.length == 1);
+			// bookkeeping
+			this.testFlexCells();
+			// accomodate new structure
+			this.updateStructure();
+		},
+		
+		_cleanupRowWidgets: function(inRowNode){
+			// Summary:
+			//		Cleans up the widgets for the given row node so that
+			//		we can reattach them if needed
+			if(inRowNode){
+				dojo.forEach(dojo.query("[widgetId]", inRowNode).map(dijit.byNode), function(w){
+					if(w._destroyOnRemove){
+						w.destroy();
+						delete w;
+					}else if(w.domNode && w.domNode.parentNode){
+						w.domNode.parentNode.removeChild(w.domNode);
+					}
+				});
+			}
+		},
+		
+		onBeforeRow: function(inRowIndex, cells){
+			this._onBeforeRow(inRowIndex, cells);
+			if(inRowIndex >= 0){
+				this._cleanupRowWidgets(this.getRowNode(inRowIndex));
+			}
+		},
+		
+		onAfterRow: function(inRowIndex, cells, inRowNode){
+			this._onAfterRow(inRowIndex, cells, inRowNode);
+			var g = this.grid;
+			dojo.forEach(dojo.query(".dojoxGridStubNode", inRowNode), function(n){
+				if(n && n.parentNode){
+					var lw = n.getAttribute("linkWidget");
+					var cellIdx = window.parseInt(dojo.attr(n, "cellIdx"), 10);
+					var cellDef = g.getCell(cellIdx);
+					var w = dijit.byId(lw);
+					if(w){
+						n.parentNode.replaceChild(w.domNode, n);
+						if(!w._started){
+							w.startup();
+						}
+					}else{
+						n.innerHTML = "";
+					}
+				}
+			}, this);
 		},
 
 		testFlexCells: function(){
@@ -9773,7 +11036,8 @@ dojo.provide("dojox.grid._View");
 		},
 
 		getColumnsWidth: function(){
-			return this.headerContentNode.firstChild.offsetWidth; // Integer
+			var h = this.headerContentNode;
+			return h && h.firstChild ? h.firstChild.offsetWidth : 0; // Integer
 		},
 
 		setColumnsWidth: function(width){
@@ -9816,10 +11080,41 @@ dojo.provide("dojox.grid._View");
 				if(this.source){
 					this.source.destroy();
 				}
+				
+				// Create the top and bottom markers
+				var bottomMarkerId = "dojoxGrid_bottomMarker";
+				var topMarkerId = "dojoxGrid_topMarker";
+				if(this.bottomMarker){
+					dojo.destroy(this.bottomMarker);
+				}
+				this.bottomMarker = dojo.byId(bottomMarkerId);
+				if(this.topMarker){
+					dojo.destroy(this.topMarker);
+				}
+				this.topMarker = dojo.byId(topMarkerId);
+				if (!this.bottomMarker) {
+					this.bottomMarker = dojo.create("div", {
+						"id": bottomMarkerId,
+						"class": "dojoxGridColPlaceBottom"
+					}, dojo.body());
+					this._hide(this.bottomMarker);
+
+					
+					this.topMarker = dojo.create("div", {
+						"id": topMarkerId,
+						"class": "dojoxGridColPlaceTop"
+					}, dojo.body());
+					this._hide(this.topMarker);
+				}
+				this.arrowDim = dojo.contentBox(this.bottomMarker);
+
+				var headerHeight = dojo.contentBox(this.headerContentNode.firstChild.rows[0]).h;
+				
 				this.source = new dojo.dnd.Source(this.headerContentNode.firstChild.rows[0], {
 					horizontal: true,
 					accept: [ "gridColumn_" + this.grid.id ],
 					viewIndex: this.index,
+					generateText: false,
 					onMouseDown: dojo.hitch(this, function(e){
 						this.header.decorateEvent(e);
 						if((this.header.overRightResizeArea(e) || this.header.overLeftResizeArea(e)) &&
@@ -9835,6 +11130,12 @@ dojo.provide("dojox.grid._View");
 							}
 						}
 					}),
+					onMouseOver: dojo.hitch(this, function(e){
+						var src = this.source;
+						if(src._getChildByEvent(e)){
+							dojo.dnd.Source.prototype.onMouseOver.apply(src, arguments);
+						}
+					}),
 					_markTargetAnchor: dojo.hitch(this, function(before){
 						var src = this.source;
 						if(src.current == src.targetAnchor && src.before == before){ return; }
@@ -9842,9 +11143,34 @@ dojo.provide("dojox.grid._View");
 							src._removeItemClass(getSibling(src.targetAnchor, src.before), src.before ? "After" : "Before");
 						}
 						dojo.dnd.Source.prototype._markTargetAnchor.call(src, before);
+						
+						var target = before ? src.targetAnchor : getSibling(src.targetAnchor, src.before);
+						var endAdd = 0;
+
+						if (!target) {
+							target = src.targetAnchor;
+							endAdd = dojo.contentBox(target).w + this.arrowDim.w/2 + 2;
+						}
+
+						// NOTE: this is for backwards compatibility with Dojo 1.3
+						var pos = (dojo.position||dojo._abs)(target, true);
+						var left = Math.floor(pos.x - this.arrowDim.w/2 + endAdd);
+
+						dojo.style(this.bottomMarker, "visibility", "visible");
+						dojo.style(this.topMarker, "visibility", "visible");
+						dojo.style(this.bottomMarker, {
+							"left": left + "px",
+							"top" : (headerHeight + pos.y) + "px"
+						});
+
+						dojo.style(this.topMarker, {
+							"left": left + "px",
+							"top" : (pos.y - this.arrowDim.h) + "px"
+						});
+
 						if(src.targetAnchor && getSibling(src.targetAnchor, src.before)){
 							src._addItemClass(getSibling(src.targetAnchor, src.before), src.before ? "After" : "Before");
-						}						
+						}
 					}),
 					_unmarkTargetAnchor: dojo.hitch(this, function(){
 						var src = this.source;
@@ -9852,19 +11178,43 @@ dojo.provide("dojox.grid._View");
 						if(src.targetAnchor && getSibling(src.targetAnchor, src.before)){
 							src._removeItemClass(getSibling(src.targetAnchor, src.before), src.before ? "After" : "Before");
 						}
+						this._hide(this.bottomMarker);
+						this._hide(this.topMarker);
 						dojo.dnd.Source.prototype._unmarkTargetAnchor.call(src);
 					}),
 					destroy: dojo.hitch(this, function(){
 						dojo.disconnect(this._source_conn);
 						dojo.unsubscribe(this._source_sub);
 						dojo.dnd.Source.prototype.destroy.call(this.source);
+						if(this.bottomMarker){
+							dojo.destroy(this.bottomMarker);
+							delete this.bottomMarker;
+						}
+						if(this.topMarker){
+							dojo.destroy(this.topMarker);
+							delete this.topMarker;
+						}
+					}),
+					onDndCancel: dojo.hitch(this, function(){
+						dojo.dnd.Source.prototype.onDndCancel.call(this.source);
+						this._hide(this.bottomMarker);
+						this._hide(this.topMarker);
 					})
 				});
+
 				this._source_conn = dojo.connect(this.source, "onDndDrop", this, "_onDndDrop");
 				this._source_sub = dojo.subscribe("/dnd/drop/before", this, "_onDndDropBefore");
 				this.source.startup();
 			}
 		},
+		
+		_hide: function(node){
+			dojo.style(node, {
+				left: "-10000px",
+				top: "-10000px",
+				"visibility": "hidden"
+			});
+		},
 
 		_onDndDropBefore: function(source, nodes, copy){
 			if(dojo.dnd.manager().target !== this.source){
@@ -9876,14 +11226,8 @@ dojo.provide("dojox.grid._View");
 			var srcView = views[source.viewIndex];
 			var tgtView = views[this.index];
 			if(tgtView != srcView){
-				var s = srcView.convertColPctToFixed();
-				var t = tgtView.convertColPctToFixed();
-				if(s || t){
-					setTimeout(function(){
-						srcView.update();
-						tgtView.update();
-					}, 50);
-				}
+				srcView.convertColPctToFixed();
+				tgtView.convertColPctToFixed();
 			}
 		},
 
@@ -9894,10 +11238,12 @@ dojo.provide("dojox.grid._View");
 				}
 				return;
 			}
+			this._hide(this.bottomMarker);
+			this._hide(this.topMarker);
 
 			var getIdx = function(n){
 				return n ? dojo.attr(n, "idx") : null;
-			}
+			};
 			var w = dojo.marginBox(nodes[0]).w;
 			if(source.viewIndex !== this.index){
 				var views = this.grid.views.views;
@@ -9917,15 +11263,12 @@ dojo.provide("dojox.grid._View");
 			delete this.source._targetNode;
 			delete this.source._beforeTarget;
 			
-			window.setTimeout(function(){
-				layout.moveColumn(
-					source.viewIndex,
-					idx,
-					getIdx(nodes[0]),
-					getIdx(stn),
-					stb
-				);
-			}, 1);
+			layout.moveColumn(
+				source.viewIndex,
+				idx,
+				getIdx(nodes[0]),
+				getIdx(stn),
+				stb);
 		},
 
 		renderHeader: function(){
@@ -9949,7 +11292,7 @@ dojo.provide("dojox.grid._View");
 							inCell.grid.sortInfo > 0 ? 'dojoxGridSortUp' : 'dojoxGridSortDown',
 							'"><div class="dojoxGridArrowButtonChar">',
 							inCell.grid.sortInfo > 0 ? '▲' : '▼',
-							'</div><div class="dojoxGridArrowButtonNode" role="'+(dojo.isFF<3 ? "wairole:" : "")+'presentation"></div>' ]);
+							'</div><div class="dojoxGridArrowButtonNode" role="presentation"></div>']);
 			}
 			ret = ret.concat([n, '</div>']);
 			return ret.join('');
@@ -9961,6 +11304,7 @@ dojo.provide("dojox.grid._View");
 		},
 
 		hasHScrollbar: function(reset){
+			var hadScroll = this._hasHScroll||false;
 			if(this._hasHScroll == undefined || reset){
 				if(this.noscroll){
 					this._hasHScroll = false;
@@ -9971,14 +11315,18 @@ dojo.provide("dojox.grid._View");
 					}else if(style == "scroll"){
 						this._hasHScroll = true;
 					}else{
-						this._hasHScroll = (this.scrollboxNode.offsetWidth < this.contentNode.offsetWidth);
+						this._hasHScroll = (this.scrollboxNode.offsetWidth - this.getScrollbarWidth() < this.contentNode.offsetWidth );
 					}
 				}
 			}
+			if(hadScroll !== this._hasHScroll){
+				this.grid.update();
+			}
 			return this._hasHScroll; // Boolean
 		},
 
 		hasVScrollbar: function(reset){
+			var hadScroll = this._hasVScroll||false;
 			if(this._hasVScroll == undefined || reset){
 				if(this.noscroll){
 					this._hasVScroll = false;
@@ -9989,16 +11337,20 @@ dojo.provide("dojox.grid._View");
 					}else if(style == "scroll"){
 						this._hasVScroll = true;
 					}else{
-						this._hasVScroll = (this.scrollboxNode.offsetHeight < this.contentNode.offsetHeight);
+						this._hasVScroll = (this.scrollboxNode.scrollHeight > this.scrollboxNode.clientHeight);
 					}
 				}
 			}
+			if(hadScroll !== this._hasVScroll){
+				this.grid.update();
+			}
 			return this._hasVScroll; // Boolean
 		},
 		
 		convertColPctToFixed: function(){
 			// Fix any percentage widths to be pixel values
 			var hasPct = false;
+			this.grid.initialWidth = "";
 			var cellNodes = dojo.query("th", this.headerContentNode);
 			var fixedWidths = dojo.map(cellNodes, function(c, vIdx){
 				var w = c.style.width;
@@ -10017,7 +11369,6 @@ dojo.provide("dojox.grid._View");
 						if(cellNode && dojo.hasAttr(cellNode, "vIdx")){
 							var vIdx = window.parseInt(dojo.attr(cellNode, "vIdx"));
 							this.setColWidth(idx, fixedWidths[vIdx]);
-							cellNodes[vIdx].style.width = cell.unitWidth;
 							dojo.removeAttr(cellNode, "vIdx");
 						}
 					}
@@ -10029,8 +11380,19 @@ dojo.provide("dojox.grid._View");
 
 		adaptHeight: function(minusScroll){
 			if(!this.grid._autoHeight){
-				var h = this.domNode.clientHeight;
-				if(minusScroll){
+				var h = (this.domNode.style.height && parseInt(this.domNode.style.height.replace(/px/,''), 10)) || this.domNode.clientHeight;
+				var self = this;
+				var checkOtherViewScrollers = function(){
+					var v;
+					for(var i in self.grid.views.views){
+						v = self.grid.views.views[i];
+						if(v !== self && v.hasHScrollbar()){
+							return true;
+						}
+					}
+					return false;
+				};
+				if(minusScroll || (this.noscroll && checkOtherViewScrollers())){
 					h -= dojox.html.metrics.getScrollbar().h;
 				}
 				dojox.grid.util.setStyleHeightPx(this.scrollboxNode, h);
@@ -10073,21 +11435,20 @@ dojo.provide("dojox.grid._View");
 			var rowNode = this.createRowNode(inRowIndex);
 			this.buildRow(inRowIndex, rowNode);
 			this.grid.edit.restore(this, inRowIndex);
-			if(this._pendingUpdate){
-				window.clearTimeout(this._pendingUpdate);
-			}
-			this._pendingUpdate = window.setTimeout(dojo.hitch(this, function(){
-				window.clearTimeout(this._pendingUpdate);
-				delete this._pendingUpdate;
-				this.grid._resize();
-			}), 50);
 			return rowNode;
 		},
 
 		createRowNode: function(inRowIndex){
 			var node = document.createElement("div");
 			node.className = this.classTag + 'Row';
-			dojo.attr(node,"role","row");
+			if (this instanceof dojox.grid._RowSelector){
+				dojo.attr(node,"role","presentation");
+			}else{
+				dojo.attr(node,"role","row");
+				if (this.grid.selectionMode != "none") {
+					dojo.attr(node, "aria-selected", "false"); //rows can be selected so add aria-selected prop
+				}
+			}
 			node[dojox.grid.util.gridViewTag] = this.id;
 			node[dojox.grid.util.rowIndexTag] = inRowIndex;
 			this.rowNodes[inRowIndex] = node;
@@ -10095,8 +11456,12 @@ dojo.provide("dojox.grid._View");
 		},
 
 		buildRow: function(inRowIndex, inRowNode){
+			
 			this.buildRowContent(inRowIndex, inRowNode);
+		  	
 			this.styleRow(inRowIndex, inRowNode);
+		  
+		 
 		},
 
 		buildRowContent: function(inRowIndex, inRowNode){
@@ -10109,6 +11474,9 @@ dojo.provide("dojox.grid._View");
 		},
 
 		rowRemoved:function(inRowIndex){
+			if(inRowIndex >= 0){
+				this._cleanupRowWidgets(this.getRowNode(inRowIndex));
+			}
 			this.grid.edit.save(this, inRowIndex);
 			delete this.rowNodes[inRowIndex];
 		},
@@ -10168,7 +11536,7 @@ dojo.provide("dojox.grid._View");
 			//var s = dojo.marginBox(this.headerContentNode.firstChild);
 			var isLtr = dojo._isBodyLtr();
 			if(this.firstScroll < 2){
-				if((!isLtr && this.firstScroll == 1) || (isLtr && this.firstScroll == 0)){
+				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';
@@ -10187,7 +11555,7 @@ dojo.provide("dojox.grid._View");
 			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){
+			if(top !== this.lastTop){
 				this.grid.scrollTo(top);
 			}
 		},
@@ -10227,6 +11595,9 @@ dojo.provide("dojox.grid._View");
 		},
 
 		update: function(){
+			if(!this.domNode){
+				return;
+			}
 			this.content.update();
 			this.grid.update();
 			//get scroll after update or scroll left setting goes wrong on IE.
@@ -10257,22 +11628,23 @@ dojo.provide("dojox.grid._View");
 			var source = this.manager.source, node;
 			if(source.creator){
 				// create an avatar representation of the node
-				node = source._normailzedCreator(source.getItem(this.manager.nodes[0].id).data, "avatar").node;
+				node = source._normalizedCreator(source.getItem(this.manager.nodes[0].id).data, "avatar").node;
 			}else{
 				// or just clone the node and hope it works
 				node = this.manager.nodes[0].cloneNode(true);
+				var table, tbody;
 				if(node.tagName.toLowerCase() == "tr"){
 					// insert extra table nodes
-					var table = dd.createElement("table"),
-						tbody = dd.createElement("tbody");
+					table = dd.createElement("table");
+					tbody = dd.createElement("tbody");
 					tbody.appendChild(node);
 					table.appendChild(tbody);
 					node = table;
 				}else if(node.tagName.toLowerCase() == "th"){
 					// insert extra table nodes
-					var table = dd.createElement("table"),
-						tbody = dd.createElement("tbody"),
-						r = dd.createElement("tr");
+					table = dd.createElement("table");
+					tbody = dd.createElement("tbody");
+					var r = dd.createElement("tr");
 					table.cellPadding = table.cellSpacing = "0";
 					r.appendChild(node);
 					tbody.appendChild(r);
@@ -10303,11 +11675,11 @@ dojo.provide("dojox.grid._View");
 	var oldMakeAvatar = dojo.dnd.manager().makeAvatar;
 	dojo.dnd.manager().makeAvatar = function(){
 		var src = this.source;
-		if(src.viewIndex !== undefined){
+		if(src.viewIndex !== undefined && !dojo.hasClass(dojo.body(),"dijit_a11y")){
 			return new dojox.grid._GridAvatar(this);
 		}
 		return oldMakeAvatar.call(dojo.dnd.manager());
-	}
+	};
 })();
 
 }
@@ -10332,19 +11704,25 @@ dojo.declare('dojox.grid._RowSelector', dojox.grid._View, {
 		return this.viewWidth || this.defaultWidth;
 	},
 	buildRowContent: function(inRowIndex, inRowNode){
-		var w = this.contentNode.offsetWidth - this.padBorderWidth 
-		inRowNode.innerHTML = '<table class="dojoxGridRowbarTable" style="width:' + w + 'px;" border="0" cellspacing="0" cellpadding="0" role="'+(dojo.isFF<3 ? "wairole:" : "")+'presentation"><tr><td class="dojoxGridRowbarInner"> </td></tr></table>';
+		var w = this.contentWidth || 0;
+		inRowNode.innerHTML = '<table class="dojoxGridRowbarTable" style="width:' + w + 'px;height:1px;" border="0" cellspacing="0" cellpadding="0" role="presentation"><tr><td class="dojoxGridRowbarInner"> </td></tr></table>';
 	},
 	renderHeader: function(){
 	},
+	updateRow: function(){
+	},
 	resize: function(){
 		this.adaptHeight();
 	},
 	adaptWidth: function(){
+		// Only calculate this here - rather than every call to buildRowContent
+		if(!("contentWidth" in this) && this.contentNode){
+			this.contentWidth = this.contentNode.offsetWidth - this.padBorderWidth;
+		}
 	},
 	// styling
 	doStyleRowNode: function(inRowIndex, inRowNode){
-		var n = [ "dojoxGridRowbar" ];
+		var n = [ "dojoxGridRowbar dojoxGridNonNormalizedCell" ];
 		if(this.grid.rows.isOver(inRowIndex)){
 			n.push("dojoxGridRowbarOver");
 		}
@@ -10420,10 +11798,11 @@ dojo.declare("dojox.grid._Layout", null, {
 		}
 
 		this.cells = [];
-		var cellIndex = 0;
-		for(var i=0, v; v=this.structure[i]; i++){
+		cellIndex = 0;
+		var v;
+		for(i=0; v=this.structure[i]; i++){
 			for(var j=0, cs; cs=v.cells[j]; j++){
-				for(var k=0, c; c=cs[k]; k++){
+				for(var k=0; c=cs[k]; k++){
 					c.index = cellIndex;
 					this.cells.push(c);
 					if("_currentlySorted" in c){
@@ -10588,7 +11967,7 @@ dojo.declare("dojox.grid._Layout", null, {
 		};
 
 		var isView = function(def){
-			return (def != null && dojo.isObject(def) &&
+			return (def !== null && dojo.isObject(def) &&
 					("cells" in def || "rows" in def || ("type" in def && !isCell(def))));
 		};
 
@@ -10603,7 +11982,7 @@ dojo.declare("dojox.grid._Layout", null, {
 			if(!hasViews){
 				s.push(this.addViewDef({ cells: inStructure }));
 			}else{
-				for(var i=0, st; (st=inStructure[i]); i++){
+				for(i=0; (st=inStructure[i]); i++){
 					if(isRowDef(st)){
 						s.push(this.addViewDef({ cells: st }));
 					}else if(isView(st)){
@@ -10698,22 +12077,35 @@ dojo.declare('dojox.grid._ViewManager', null, {
 	},
 
 	normalizeRowNodeHeights: function(inRowNodes){
-		var h = 0; 
-		for(var i=0, n, o; (n=inRowNodes[i]); i++){
-			h = Math.max(h, dojo.marginBox(n.firstChild).h);
-		}
-		h = (h >= 0 ? h : 0);
-		//
-		//
-		for(var i=0, n; (n=inRowNodes[i]); i++){
-			dojo.marginBox(n.firstChild, {h:h});
+		var h = 0;
+		var currHeights = [];
+		if(this.grid.rowHeight){
+			h = this.grid.rowHeight;
+		}else{
+			if(inRowNodes.length <= 1){ 
+				// no need to normalize if we are the only one...
+				return; 
+			}
+			for(var i=0, n; (n=inRowNodes[i]); i++){
+				// We only care about the height - so don't use marginBox.  This
+				// depends on the container not having any margin (which it shouldn't)
+				// Also - we only look up the height if the cell doesn't have the
+				// dojoxGridNonNormalizedCell class (like for row selectors)
+				if(!dojo.hasClass(n, "dojoxGridNonNormalizedCell")){
+					currHeights[i] = n.firstChild.offsetHeight;
+					h =  Math.max(h, currHeights[i]);
+				}
+			}
+			h = (h >= 0 ? h : 0);
+	
+			//Work around odd FF3 rendering bug: #8864.
+			//A one px increase fixes FireFox 3's rounding bug for fractional font sizes.
+			if(dojo.isMoz && h){h++;}
 		}
-		//
-		//
-		//
-		// querying the height here seems to help scroller measure the page on IE
-		if(inRowNodes&&inRowNodes[0]&&inRowNodes[0].parentNode){
-			inRowNodes[0].parentNode.offsetHeight;
+		for(i=0; (n=inRowNodes[i]); i++){
+			if(currHeights[i] != h){
+				n.firstChild.style.height = h + "px";
+			}
 		}
 	},
 	
@@ -10798,14 +12190,20 @@ dojo.declare('dojox.grid._ViewManager', null, {
 
 			if(!dojo._isBodyLtr()){
 				ds.right = l + 'px';
-				hs.right = l + 'px';
+				// fixed rtl, the scrollbar is on the right side in FF
+				if (dojo.isMoz) {
+					hs.right = l + v.getScrollbarWidth() + 'px';
+					hs.width = parseInt(hs.width, 10) - v.getScrollbarWidth() + 'px';
+				}else{
+					hs.right = l + 'px';					
+				}
 			}else{
 				ds.left = l + 'px';
 				hs.left = l + 'px';
 			}
 			ds.top = 0 + 'px';
 			hs.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.
@@ -10852,14 +12250,16 @@ dojo.declare('dojox.grid._ViewManager', null, {
 	},
 
 	// rendering
-	renderRow: function(inRowIndex, inNodes){
+	renderRow: function(inRowIndex, inNodes, skipRenorm){
 		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);
+		if(!skipRenorm){
+			this.normalizeRowNodeHeights(rowNodes);
+		}
 	},
 	
 	rowRemoved: function(inRowIndex){
@@ -10867,11 +12267,13 @@ dojo.declare('dojox.grid._ViewManager', null, {
 	},
 	
 	// updating
-	updateRow: function(inRowIndex){
+	updateRow: function(inRowIndex, skipRenorm){
 		for(var i=0, v; v=this.views[i]; i++){
 			v.updateRow(inRowIndex);
 		}
-		this.renormalizeRow(inRowIndex);
+		if(!skipRenorm){
+			this.renormalizeRow(inRowIndex);
+		}
 	},
 	
 	updateRowStyles: function(inRowIndex){
@@ -10900,6 +12302,7 @@ dojo.declare('dojox.grid._ViewManager', null, {
 				return v;
 			}
 		}
+		return null;
 	}
 	
 });
@@ -10932,11 +12335,11 @@ dojo.provide("dojox.grid._RowManager");
 				index: inRowIndex, 
 				node: inRowNode,
 				odd: Boolean(inRowIndex&1),
-				selected: this.grid.selection.isSelected(inRowIndex),
+				selected: !!this.grid.selection.isSelected(inRowIndex),
 				over: this.isOver(inRowIndex),
 				customStyles: "",
 				customClasses: "dojoxGridRow"
-			}
+			};
 		},
 		styleRowNode: function(inRowIndex, inRowNode){
 			var row = this.prepareStylingRow(inRowIndex, inRowNode);
@@ -10958,13 +12361,13 @@ dojo.provide("dojox.grid._RowManager");
 		setOverRow: function(inRowIndex){
 			var last = this.overRow;
 			this.overRow = inRowIndex;
-			if((last!=this.overRow)&&(last >=0)){
+			if((last!=this.overRow)&&(dojo.isString(last) || last >= 0)){
 				this.updateStyles(last);
 			}
 			this.updateStyles(this.overRow);
 		},
 		isOver: function(inRowIndex){
-			return (this.overRow == inRowIndex);
+			return (this.overRow == inRowIndex && !dojo.hasClass(this.grid.domNode, "dojoxGridColumnResizing"));
 		}
 	});
 })();
@@ -10987,8 +12390,10 @@ dojo.declare("dojox.grid._FocusManager", null, {
 		this.cell = null;
 		this.rowIndex = -1;
 		this._connects = [];
+		this.headerMenu = this.grid.headerMenu;
 		this._connects.push(dojo.connect(this.grid.domNode, "onfocus", this, "doFocus"));
 		this._connects.push(dojo.connect(this.grid.domNode, "onblur", this, "doBlur"));
+		this._connects.push(dojo.connect(this.grid.domNode, "oncontextmenu", this, "doContextMenu"));
 		this._connects.push(dojo.connect(this.grid.lastFocusNode, "onfocus", this, "doLastNodeFocus"));
 		this._connects.push(dojo.connect(this.grid.lastFocusNode, "onblur", this, "doLastNodeBlur"));
 		this._connects.push(dojo.connect(this.grid,"_onFetchComplete", this, "_delayedCellFocus"));
@@ -11001,6 +12406,7 @@ dojo.declare("dojox.grid._FocusManager", null, {
 	},
 	_colHeadNode: null,
 	_colHeadFocusIdx: null,
+	_contextMenuBindNode: null,
 	tabbingOut: false,
 	focusClass: "dojoxGridCellFocus",
 	focusView: null,
@@ -11027,7 +12433,7 @@ dojo.declare("dojox.grid._FocusManager", null, {
 	},
 	isFirstFocusCell: function(){
 		if(this.cell){
-			return (this.rowIndex == 0) && (this.cell.index == 0);
+			return (this.rowIndex === 0) && (this.cell.index === 0);
 		}
 		return false;
 	},
@@ -11068,7 +12474,7 @@ dojo.declare("dojox.grid._FocusManager", null, {
 		}
 	},
 	_delayedCellFocus: function(){
-		if(this.isNavHeader()){
+		if(this.isNavHeader()||!this.grid._focused){
 				return;
 		}
 		var n = this.cell && this.cell.getNode(this.rowIndex);
@@ -11076,6 +12482,7 @@ dojo.declare("dojox.grid._FocusManager", null, {
 			try{
 				if(!this.grid.edit.isEditing()){
 					dojo.toggleClass(n, this.focusClass, true);
+					this.blurHeader();
 					dojox.grid.util.fire(n, "focus");
 				}
 			} 
@@ -11085,11 +12492,10 @@ dojo.declare("dojox.grid._FocusManager", null, {
 	_delayedHeaderFocus: function(){
 		if(this.isNavHeader()){
 			this.focusHeader();
-			//this may need clickSelect?
+			this.grid.domNode.focus();
 		}
 	},
 	_initColumnHeaders: function(){
-		this._connects.push(dojo.connect(this.grid.viewsHeaderNode, "onblur", this, "doBlurHeader"));
 		var headers = this._findHeaderCells();
 		for(var i = 0; i < headers.length; i++){
 			this._connects.push(dojo.connect(headers[i], "onfocus", this, "doColHeaderFocus"));
@@ -11104,14 +12510,25 @@ dojo.declare("dojox.grid._FocusManager", null, {
 		var headers = [];
 		for (var i = 0; i < allHeads.length; i++){
 			var aHead = allHeads[i];
-			var hasTabIdx = dojo.hasAttr(aHead, "tabindex");
-			var tabindex = dojo.attr(aHead, "tabindex");
+			var hasTabIdx = dojo.hasAttr(aHead, "tabIndex");
+			var tabindex = dojo.attr(aHead, "tabIndex");
 			if (hasTabIdx && tabindex < 0) {
 				headers.push(aHead);
 			}
 		}
 		return headers;
 	},
+	_setActiveColHeader: function(/*Node*/colHeaderNode, /*Integer*/colFocusIdx, /*Integer*/ prevColFocusIdx){
+		//console.log("setActiveColHeader() - colHeaderNode:colFocusIdx:prevColFocusIdx = " + colHeaderNode + ":" + colFocusIdx + ":" + prevColFocusIdx);
+		dojo.attr(this.grid.domNode, "aria-activedescendant",colHeaderNode.id);
+		if (prevColFocusIdx != null && prevColFocusIdx >= 0 && prevColFocusIdx != colFocusIdx){
+			dojo.toggleClass(this._findHeaderCells()[prevColFocusIdx],this.focusClass,false);
+		}
+		dojo.toggleClass(colHeaderNode,this.focusClass, true);
+		this._colHeadNode = colHeaderNode;
+		this._colHeadFocusIdx = colFocusIdx;
+		this._scrollHeader(this._colHeadFocusIdx);
+	},
 	scrollIntoView: function(){
 		var info = (this.cell ? this._scrollInfo(this.cell) : null);
 		if(!info || !info.s){
@@ -11177,6 +12594,57 @@ dojo.declare("dojox.grid._FocusManager", null, {
 			}
 		}
 	},
+	_isHeaderHidden: function(){
+		// summary:
+		//		determine if the grid headers are hidden
+		//		relies on documented technique of setting .dojoxGridHeader { display:none; } 
+		// returns: Boolean
+		//		true if headers are hidden
+		//		false if headers are not hidden
+		
+		var curView = this.focusView;
+		if (!curView){
+			// find one so we can determine if headers are hidden
+			// there is no focusView after adding items to empty grid (test_data_grid_empty.html)
+			for (var i = 0, cView; (cView = this.grid.views.views[i]); i++) {
+				if(cView.headerNode ){
+					curView=cView;
+					break;		
+				}	
+			}
+		}
+		return (curView && dojo.getComputedStyle(curView.headerNode).display == "none");
+	},
+	colSizeAdjust: function (e, colIdx, delta){ // adjust the column specified by colIdx by the specified delta px
+		var headers = this._findHeaderCells();
+		var view = this.focusView;
+		if (!view) {
+			for (var i = 0, cView; (cView = this.grid.views.views[i]); i++) {
+				// find first view with a tableMap in order to work with empty grid
+				if(cView.header.tableMap.map ){
+					view=cView;
+					break;		
+				}
+			}
+		}
+		var curHeader = headers[colIdx];
+		if (!view || (colIdx == headers.length-1 && colIdx === 0)){
+			return; // can't adjust single col. grid
+		}	
+		view.content.baseDecorateEvent(e);
+		// need to adjust event with header cell info since focus is no longer on header cell
+		e.cellNode = curHeader; //this.findCellTarget(e.target, e.rowNode);
+		e.cellIndex = view.content.getCellNodeIndex(e.cellNode);
+		e.cell = (e.cellIndex >= 0 ? this.grid.getCell(e.cellIndex) : null);
+		if (view.header.canResize(e)){ 
+			var deltaObj = {
+				l: delta
+			};
+			var drag = view.header.colResizeSetup(e,false);
+			view.header.doResizeColumn(drag, null, deltaObj);
+			view.update();
+		}
+	},
 	styleRow: function(inRow){
 		return;
 	},
@@ -11198,6 +12666,9 @@ dojo.declare("dojox.grid._FocusManager", null, {
 		//	grid row index
 		if(inCell && !this.isFocusCell(inCell, inRowIndex)){
 			this.tabbingOut = false;
+			if (this._colHeadNode){
+				this.blurHeader();
+			}
 			this._colHeadNode = this._colHeadFocusIdx = null;
 			this.focusGridView();
 			this._focusifyCellNode(false);
@@ -11265,22 +12736,24 @@ dojo.declare("dojox.grid._FocusManager", null, {
 	},
 	move: function(inRowDelta, inColDelta) {
 		// summary:
-		//	focus grid cell or column header based on position relative to current focus
+		//	focus grid cell or  simulate focus to column header based on position relative to current focus
 		// inRowDelta: int
 		// vertical distance from current focus
 		// inColDelta: int
 		// horizontal distance from current focus
 
+		var colDir = inColDelta < 0 ? -1 : 1;
 		// Handle column headers.
 		if(this.isNavHeader()){
 			var headers = this._findHeaderCells();
-			var currentIdx = dojo.indexOf(headers, this._colHeadNode);
+			var savedIdx = currentIdx = dojo.indexOf(headers, this._colHeadNode);
 			currentIdx += inColDelta;
+			while(currentIdx >=0 && currentIdx < headers.length && headers[currentIdx].style.display == "none"){
+				// skip over hidden column headers
+				currentIdx += colDir;
+			}
 			if((currentIdx >= 0) && (currentIdx < headers.length)){
-				this._colHeadNode = headers[currentIdx];
-				this._colHeadFocusIdx = currentIdx;
-				this._scrollHeader(currentIdx);
-				this._colHeadNode.focus();
+				this._setActiveColHeader(headers[currentIdx],currentIdx, savedIdx);
 			}
 		}else{
 			if(this.cell){
@@ -11303,8 +12776,18 @@ dojo.declare("dojox.grid._FocusManager", null, {
 					}
 				}
 				var cc = this.grid.layout.cellCount-1,
-					i = this.cell.index,
-					col = Math.min(cc, Math.max(0, i+inColDelta));
+				i = this.cell.index,
+				col = Math.min(cc, Math.max(0, i+inColDelta));
+				var cell = this.grid.getCell(col);
+				while(col>=0 && col < cc && cell && cell.hidden === true){
+					// skip hidden cells
+					col += colDir;
+					cell = this.grid.getCell(col);
+				}
+				if (!cell || cell.hidden === true){
+					// don't change col if would move to hidden
+					col = i;
+				}
 				this.setFocusIndex(row, col);
 				if(inRowDelta){
 					this.grid.updateRow(r);
@@ -11316,33 +12799,30 @@ dojo.declare("dojox.grid._FocusManager", null, {
 		if(this.grid.edit.isEditing()){
 			dojo.stopEvent(e);
 			this.previous();
-		}else if(!this.isNavHeader()){
-			this.focusHeader();
+		}else if(!this.isNavHeader() && !this._isHeaderHidden()) {
+			this.grid.domNode.focus(); // will call doFocus and set focus into header.
 			dojo.stopEvent(e);
 		}else{
 			this.tabOut(this.grid.domNode);
+			if (this._colHeadFocusIdx != null) { // clear grid header focus
+				dojo.toggleClass(this._findHeaderCells()[this._colHeadFocusIdx], this.focusClass, false);
+				this._colHeadFocusIdx = null;
+			}
+			this._focusifyCellNode(false);
 		}
 	},
 	nextKey: function(e) {
-		var isEmpty = this.grid.rowCount == 0;
-		if(e.target === this.grid.domNode){
+		var isEmpty = (this.grid.rowCount === 0);
+		if(e.target === this.grid.domNode && this._colHeadFocusIdx == null){
 			this.focusHeader();
 			dojo.stopEvent(e);
 		}else if(this.isNavHeader()){
-			// if tabbing from col header, then go to grid proper. If grid is empty this.grid.rowCount == 0
-			this._colHeadNode = this._colHeadFocusIdx= null;
-			if(this.isNoFocusCell() && !isEmpty){
-				this.setFocusIndex(0, 0);
-			}else if(this.cell && !isEmpty){
-				if(this.focusView && !this.focusView.rowNodes[this.rowIndex]){
-				// if rowNode for current index is undefined (likely as a result of a sort and because of #7304) 
-				// scroll to that row
-					this.grid.scrollToRow(this.rowIndex);
-				}
-				this.focusGrid();
-			}else{
+			// if tabbing from col header, then go to grid proper. 
+			this.blurHeader();
+			if(!this.findAndFocusGridCell()){
 				this.tabOut(this.grid.lastFocusNode);
 			}
+			this._colHeadNode = this._colHeadFocusIdx= null;
 		}else if(this.grid.edit.isEditing()){
 			dojo.stopEvent(e);
 			this.next();
@@ -11361,10 +12841,46 @@ dojo.declare("dojox.grid._FocusManager", null, {
 		this.focusGridView();
 		this._focusifyCellNode(true);
 	},
+	findAndFocusGridCell: function(){
+		// summary:
+		//		find the first focusable grid cell 
+		// returns: Boolean
+		//		true if focus was set to a cell
+		//		false if no cell found to set focus onto
+		
+		var didFocus = true;
+		var isEmpty = (this.grid.rowCount === 0); // If grid is empty this.grid.rowCount == 0
+		if (this.isNoFocusCell() && !isEmpty){
+			var cellIdx = 0;
+			var cell = this.grid.getCell(cellIdx);
+			if (cell.hidden) {
+				// if first cell isn't visible, use _colHeadFocusIdx 
+				// could also use a while loop to find first visible cell - not sure that is worth it
+				cellIdx = this.isNavHeader() ? this._colHeadFocusIdx : 0;
+			}
+			this.setFocusIndex(0, cellIdx);
+		}
+		else if (this.cell && !isEmpty){
+			if (this.focusView && !this.focusView.rowNodes[this.rowIndex]){
+				// if rowNode for current index is undefined (likely as a result of a sort and because of #7304) 
+				// scroll to that row
+				this.grid.scrollToRow(this.rowIndex);
+			}
+			this.focusGrid();
+		}else {
+			didFocus = false;
+		}
+		this._colHeadNode = this._colHeadFocusIdx= null;
+		return didFocus;
+	},
 	focusHeader: function(){
 		var headerNodes = this._findHeaderCells();
-
-		if (!this._colHeadFocusIdx) {
+		var saveColHeadFocusIdx = this._colHeadFocusIdx;
+		if (this._isHeaderHidden()){
+			// grid header is hidden, focus a cell
+			this.findAndFocusGridCell();
+		}
+		else if (!this._colHeadFocusIdx) {
 			if (this.isNoFocusCell()) {
 				this._colHeadFocusIdx = 0;
 			}
@@ -11373,9 +12889,39 @@ dojo.declare("dojox.grid._FocusManager", null, {
 			}
 		}
 		this._colHeadNode = headerNodes[this._colHeadFocusIdx];
-		if(this._colHeadNode){
-			dojox.grid.util.fire(this._colHeadNode, "focus");
+		while(this._colHeadNode && this._colHeadFocusIdx >=0 && this._colHeadFocusIdx < headerNodes.length &&
+				this._colHeadNode.style.display == "none"){
+			// skip over hidden column headers
+			this._colHeadFocusIdx++;
+			this._colHeadNode = headerNodes[this._colHeadFocusIdx];
+		}
+		if(this._colHeadNode && this._colHeadNode.style.display != "none"){
+			// Column header cells know longer receive actual focus.  So, for keyboard invocation of
+			// contextMenu to work, the contextMenu must be bound to the grid.domNode rather than the viewsHeaderNode.
+			// unbind the contextmenu from the viewsHeaderNode and to the grid when header cells are active.  Reset
+			// the binding back to the viewsHeaderNode when header cells are no longer acive (in blurHeader) #10483
+			if (this.headerMenu && this._contextMenuBindNode != this.grid.domNode){
+				this.headerMenu.unBindDomNode(this.grid.viewsHeaderNode);
+				this.headerMenu.bindDomNode(this.grid.domNode);
+				this._contextMenuBindNode = this.grid.domNode;
+			}
+			this._setActiveColHeader(this._colHeadNode, this._colHeadFocusIdx, saveColHeadFocusIdx);
+			this._scrollHeader(this._colHeadFocusIdx);
 			this._focusifyCellNode(false);
+		}else {
+			// all col head nodes are hidden - focus the grid
+			this.findAndFocusGridCell();
+		}
+	},
+	blurHeader: function(){
+		dojo.removeClass(this._colHeadNode, this.focusClass);
+		dojo.removeAttr(this.grid.domNode,"aria-activedescendant");
+		// reset contextMenu onto viewsHeaderNode so right mouse on header will invoke (see focusHeader)
+		if (this.headerMenu && this._contextMenuBindNode == this.grid.domNode) {
+			var viewsHeader = this.grid.viewsHeaderNode;
+			this.headerMenu.unBindDomNode(this.grid.domNode);
+			this.headerMenu.bindDomNode(viewsHeader);
+			this._contextMenuBindNode = viewsHeader;
 		}
 	},
 	doFocus: function(e){
@@ -11394,8 +12940,11 @@ dojo.declare("dojox.grid._FocusManager", null, {
 	doBlur: function(e){
 		dojo.stopEvent(e);	// FF2
 	},
-	doBlurHeader: function(e){
-		dojo.stopEvent(e);	// FF2
+	doContextMenu: function(e){
+	//stop contextMenu event if no header Menu to prevent default/browser contextMenu
+		if (!this.headerMenu){
+			dojo.stopEvent(e); 
+		}
 	},
 	doLastNodeFocus: function(e){
 		if (this.tabbingOut){
@@ -11415,8 +12964,9 @@ dojo.declare("dojox.grid._FocusManager", null, {
 		dojo.stopEvent(e);	 // FF2
 	},
 	doColHeaderFocus: function(e){
-		dojo.toggleClass(e.target, this.focusClass, true);
+		this._setActiveColHeader(e.target,dojo.attr(e.target, "idx"),this._colHeadFocusIdx);
 		this._scrollHeader(this.getHeaderIndex());
+		dojo.stopEvent(e);
 	},
 	doColHeaderBlur: function(e){
 		dojo.toggleClass(e.target, this.focusClass, false);
@@ -11547,7 +13097,7 @@ dojo.declare("dojox.grid._EditManager", null, {
 		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();
@@ -11587,9 +13137,11 @@ dojo.declare("dojox.grid._EditManager", null, {
 	},
 
 	_editorDo: function(inMethod){
-		var c = this.info.cell
+		var c = this.info.cell;
 		//c && c.editor && c.editor[inMethod](c, this.info.rowIndex);
-		c && c.editable && c[inMethod](this.info.rowIndex);
+		if(c && c.editable){
+			c[inMethod](this.info.rowIndex);
+		}
 	},
 
 	editorApply: function(){
@@ -11768,7 +13320,7 @@ dojo.declare("dojox.grid.Selection", null, {
 	},
 
 	_beginUpdate: function(){
-		if(this.updating == 0){
+		if(this.updating === 0){
 			this.onChanging();
 		}
 		this.updating++;
@@ -11776,7 +13328,7 @@ dojo.declare("dojox.grid.Selection", null, {
 
 	_endUpdate: function(){
 		this.updating--;
-		if(this.updating == 0){
+		if(this.updating === 0){
 			this.onChanged();
 		}
 	},
@@ -11793,12 +13345,20 @@ dojo.declare("dojox.grid.Selection", null, {
 
 	addToSelection: function(inIndex){
 		if(this.mode == 'none'){ return; }
+		if(dojo.isArray(inIndex)){
+			dojo.forEach(inIndex, this.addToSelection, this);
+			return;
+		}
 		inIndex = Number(inIndex);
 		if(this.selected[inIndex]){
 			this.selectedIndex = inIndex;
 		}else{
 			if(this.onCanSelect(inIndex) !== false){
 				this.selectedIndex = inIndex;
+				var rowNode = this.grid.getRowNode(inIndex);
+				if(rowNode){
+					dojo.attr(rowNode,"aria-selected","true");
+				}
 				this._beginUpdate();
 				this.selected[inIndex] = true;
 				//this.grid.onSelected(inIndex);
@@ -11811,6 +13371,10 @@ dojo.declare("dojox.grid.Selection", null, {
 
 	deselect: function(inIndex){
 		if(this.mode == 'none'){ return; }
+		if(dojo.isArray(inIndex)){
+			dojo.forEach(inIndex, this.deselect, this);
+			return;
+		}
 		inIndex = Number(inIndex);
 		if(this.selectedIndex == inIndex){
 			this.selectedIndex = -1;
@@ -11819,6 +13383,10 @@ dojo.declare("dojox.grid.Selection", null, {
 			if(this.onCanDeselect(inIndex) === false){
 				return;
 			}
+			var rowNode = this.grid.getRowNode(inIndex);
+			if(rowNode){
+				dojo.attr(rowNode,"aria-selected","false");
+			}
 			this._beginUpdate();
 			delete this.selected[inIndex];
 			//this.grid.onDeselected(inIndex);
@@ -11833,7 +13401,11 @@ dojo.declare("dojox.grid.Selection", null, {
 	},
 
 	toggleSelect: function(inIndex){
-		this.setSelected(inIndex, !this.selected[inIndex])
+		if(dojo.isArray(inIndex)){
+			dojo.forEach(inIndex, this.toggleSelect, this);
+			return;
+		}
+		this.setSelected(inIndex, !this.selected[inIndex]);
 	},
 
 	_range: function(inFrom, inTo, func){
@@ -11892,14 +13464,14 @@ dojo.declare("dojox.grid.Selection", null, {
 			}else if(inCtrlKey){
 				this.toggleSelect(inIndex);
 			}else{
-				this.addToSelection(inIndex)
+				this.addToSelection(inIndex);
 			}
 		}
 		this._endUpdate();
 	},
 
 	clickSelectEvent: function(e){
-		this.clickSelect(e.rowIndex, dojo.dnd.getCopyKeyState(e), e.shiftKey);
+		this.clickSelect(e.rowIndex, dojo.isCopyKey(e), e.shiftKey);
 	},
 
 	clear: function(){
@@ -11965,18 +13537,19 @@ dojo.declare("dojox.grid._Events", null, {
 			return;
 		}
 		var dk = dojo.keys;
+		var colIdx;
 		switch(e.keyCode){
 			case dk.ESCAPE:
 				this.edit.cancel();
 				break;
 			case dk.ENTER:
 				if(!this.edit.isEditing()){
-					var colIdx = this.focus.getHeaderIndex();
+					colIdx = this.focus.getHeaderIndex();
 					if(colIdx >= 0) {
 						this.setSortIndex(colIdx);
 						break;
 					}else {
-						this.selection.clickSelect(this.focus.rowIndex, dojo.dnd.getCopyKeyState(e), e.shiftKey);
+						this.selection.clickSelect(this.focus.rowIndex, dojo.isCopyKey(e), e.shiftKey);
 					}
 					dojo.stopEvent(e);
 				}
@@ -11995,12 +13568,12 @@ dojo.declare("dojox.grid._Events", null, {
 				break;
 			case dk.SPACE:
 				if(!this.edit.isEditing()){
-					var colIdx = this.focus.getHeaderIndex();
+					colIdx = this.focus.getHeaderIndex();
 					if(colIdx >= 0) {
 						this.setSortIndex(colIdx);
 						break;
 					}else {
-						this.selection.clickSelect(this.focus.rowIndex, dojo.dnd.getCopyKeyState(e), e.shiftKey);
+						this.selection.clickSelect(this.focus.rowIndex, dojo.isCopyKey(e), e.shiftKey);
 					}
 					dojo.stopEvent(e);
 				}
@@ -12011,26 +13584,33 @@ dojo.declare("dojox.grid._Events", null, {
 			case dk.LEFT_ARROW:
 			case dk.RIGHT_ARROW:
 				if(!this.edit.isEditing()){
+					var keyCode = e.keyCode;  // IE seems to lose after stopEvent when modifier keys
 					dojo.stopEvent(e);
-					var offset = (e.keyCode == dk.LEFT_ARROW) ? 1 : -1;
-					if(dojo._isBodyLtr()){ offset *= -1; }
-					this.focus.move(0, offset);
+					colIdx = this.focus.getHeaderIndex();
+					if (colIdx >= 0 && (e.shiftKey && e.ctrlKey)){
+						this.focus.colSizeAdjust(e, colIdx, (keyCode == dk.LEFT_ARROW ? -1 : 1)*5);
+					}
+					else{
+						var offset = (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){
+				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.store && this.focus.rowIndex+1 != this.rowCount){
+				if(!this.edit.isEditing() && this.focus.rowIndex+1 != this.rowCount){
 					dojo.stopEvent(e);
 					this.focus.move(1, 0);
 				}
 				break;
 			case dk.PAGE_UP:
-				if(!this.edit.isEditing() && this.focus.rowIndex != 0){
+				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);
@@ -12051,6 +13631,8 @@ dojo.declare("dojox.grid._Events", null, {
 					}
 				}
 				break;
+			default:
+				break;
 		}
 	},
 	
@@ -12156,9 +13738,9 @@ dojo.declare("dojox.grid._Events", null, {
 		//		Event fired when a cell is double-clicked.
 		// e: Event
 		//		Decorated event object contains reference to grid, cell, and rowIndex
-		if(dojo.isIE){
+		if(this._click.length > 1 && dojo.isIE){
 			this.edit.setEditCell(this._click[1].cell, this._click[1].rowIndex);
-		}else if(this._click[0].rowIndex != this._click[1].rowIndex){
+		}else if(this._click.length > 1 && 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);
@@ -12674,29 +14256,10 @@ dojo.provide("dojox.grid._Grid");
 
 
 (function(){
-	var jobs = {
-		cancel: function(inHandle){
-			if(inHandle){
-				clearTimeout(inHandle);
-			}
-		},
-
-		jobs: [],
-
-		job: function(inName, inDelay, inJob){
-			jobs.cancelJob(inName);
-			var job = function(){
-				delete jobs.jobs[inName];
-				inJob();
-			}
-			jobs.jobs[inName] = setTimeout(job, inDelay);
-		},
-
-		cancelJob: function(inName){
-			jobs.cancel(jobs.jobs[inName]);
-		}
-	};
-
+	// NOTE: this is for backwards compatibility with Dojo 1.3
+	if(!dojo.isCopyKey){
+		dojo.isCopyKey = dojo.dnd.getCopyKeyState;
+	}
 	/*=====
 	dojox.grid.__CellDef = function(){
 		//	name: String?
@@ -12854,7 +14417,7 @@ dojo.provide("dojox.grid._Grid");
 		//	|		structure="structure"
 		//	|		dojoType="dojox.grid._Grid"></div>
 
-		templateString:"<div class=\"dojoxGrid\" hidefocus=\"hidefocus\" wairole=\"grid\" dojoAttachEvent=\"onmouseout:_mouseOut\">\n\t<div class=\"dojoxGridMasterHeader\" dojoAttachPoint=\"viewsHeaderNode\" tabindex=\"-1\" wairole=\"presentation\"></div>\n\t<div class=\"dojoxGridMasterView\" dojoAttachPoint=\"viewsNode\" wairole=\"presentation\"></div>\n\t<div class=\"dojoxGridMasterMessages\" style=\"display: none;\" dojoAttachPoint=\"messagesNode\"></div>\n\t<span dojoAttachPoint=\"lastFocu [...]
+		templateString:"<div class=\"dojoxGrid\" hidefocus=\"hidefocus\" wairole=\"grid\" dojoAttachEvent=\"onmouseout:_mouseOut\">\n\t<div class=\"dojoxGridMasterHeader\" dojoAttachPoint=\"viewsHeaderNode\" wairole=\"presentation\"></div>\n\t<div class=\"dojoxGridMasterView\" dojoAttachPoint=\"viewsNode\" wairole=\"presentation\"></div>\n\t<div class=\"dojoxGridMasterMessages\" style=\"display: none;\" dojoAttachPoint=\"messagesNode\"></div>\n\t<span dojoAttachPoint=\"lastFocusNode\" tabindex [...]
 
 		// classTag: String
 		// 		CSS class applied to the grid's domNode
@@ -12887,6 +14450,14 @@ dojo.provide("dojox.grid._Grid");
 		// autoWidth: Boolean
 		//		If autoWidth is true, grid width is automatically set to fit the data.
 		autoWidth: false,
+		
+		// initialWidth: String
+		//		A css string to use to set our initial width (only used if autoWidth
+		//		is true).  The first rendering of the grid will be this width, any
+		//		resizing of columns, etc will result in the grid switching to 
+		//		autoWidth mode.  Note, this width will override any styling in a
+		//		stylesheet or directly on the node.
+		initialWidth: "",
 
 		// autoHeight: Boolean|Integer
 		//		If autoHeight is true, grid height is automatically set to fit the data.
@@ -12895,6 +14466,13 @@ dojo.provide("dojox.grid._Grid");
 		//		that many rows if there are more
 		autoHeight: '',
 
+		// rowHeight: Integer
+		//		If rowHeight is set to a positive number, it will define the height of the rows
+		//		in pixels. This can provide a significant performance advantage, since it
+		//		eliminates the need to measure row sizes during rendering, which is one
+		// 		the primary bottlenecks in the DataGrid's performance. 
+		rowHeight: 0,
+		
 		// autoRender: Boolean
 		//		If autoRender is true, grid will render itself after initialization.
 		autoRender: true,
@@ -12963,12 +14541,38 @@ dojo.provide("dojox.grid._Grid");
 		//  span with class 'dojoxGridNoData' if you want it to be
 		//  styled similar to the loading and error messages
 		noDataMessage: "",
-
+		
+		// escapeHTMLInData: Boolean
+		//		This will escape HTML brackets from the data to prevent HTML from 
+		// 		user-inputted data being rendered with may contain JavaScript and result in 
+		// 		XSS attacks. This is true by default, and it is recommended that it remain 
+		// 		true. Setting this to false will allow data to be displayed in the grid without 
+		// 		filtering, and should be only used if it is known that the data won't contain 
+		// 		malicious scripts. If HTML is needed in grid cells, it is recommended that 
+		// 		you use the formatter function to generate the HTML (the output of 
+		// 		formatter functions is not filtered, even with escapeHTMLInData set to true).
+		escapeHTMLInData: true,	
+		
+		// formatterScope: Object
+		//		An object to execute format functions within.  If not set, the
+		//		format functions will execute within the scope of the cell that
+		//		has a format function.
+		formatterScope: null,
+		
+		// editable: boolean
+		// indicates if the grid contains editable cells, default is false
+		// set to true if editable cell encountered during rendering 
+		editable: false,
+		
 		// private
 		sortInfo: 0,
 		themeable: true,
 		_placeholders: null,
 
+		// _layoutClass: Object
+		//	The class to use for our layout - can be overridden by grid subclasses
+		_layoutClass: dojox.grid._Layout,
+
 		// initialization
 		buildRendering: function(){
 			this.inherited(arguments);
@@ -12993,7 +14597,9 @@ dojo.provide("dojox.grid._Grid");
 			dojox.html.metrics.initOnFontResize();
 			this.connect(dojox.html.metrics, "onFontResize", "textSizeChanged");
 			dojox.grid.util.funnelEvents(this.domNode, this, 'doKeyEvent', dojox.grid.util.keyEvents);
-			this.connect(this, "onShow", "renderOnIdle");
+			if (this.selectionMode != "none") {
+				dojo.attr(this.domNode, "aria-multiselectable", this.selectionMode == "single" ? "false" : "true");
+			}
 		},
 		
 		postMixInProperties: function(){
@@ -13006,15 +14612,22 @@ dojo.provide("dojox.grid._Grid");
 			}
 			// Call this to update our autoheight to start out
 			this._setAutoHeightAttr(this.autoHeight, true);
+			this.lastScrollTop = this.scrollTop = 0;
 		},
 		
 		postCreate: function(){
-			// replace stock styleChanged with one that triggers an update
-			this.styleChanged = this._styleChanged;
 			this._placeholders = [];
 			this._setHeaderMenuAttr(this.headerMenu);
 			this._setStructureAttr(this.structure);
 			this._click = [];
+			this.inherited(arguments);
+			if(this.domNode && this.autoWidth && this.initialWidth){
+				this.domNode.style.width = this.initialWidth;
+			}
+			if (this.domNode && !this.editable){
+				// default value for aria-readonly is false, set to true if grid is not editable
+				dojo.attr(this.domNode,"aria-readonly", "true");
+			}
 		},
 
 		destroy: function(){
@@ -13086,34 +14699,12 @@ dojo.provide("dojox.grid._Grid");
 				this.invalidated.rowCount : this.rowCount;
 		},
 		
-		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();
-			}
+			this.render();
 		},
 
 		sizeChange: function(){
-			jobs.job(this.id + 'SizeChange', 50, dojo.hitch(this, "update"));
-		},
-
-		renderOnIdle: function() {
-			setTimeout(dojo.hitch(this, "render"), 1);
+			this.update();
 		},
 
 		createManagers: function(){
@@ -13139,20 +14730,22 @@ dojo.provide("dojox.grid._Grid");
 			// summary: Creates a new virtual scroller
 			this.scroller = new dojox.grid._Scroller();
 			this.scroller.grid = this;
-			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);
+			this.layout = new this._layoutClass(this);
 			this.connect(this.layout, "moveColumn", "onMoveColumn");
 		},
 
 		onMoveColumn: function(){
 			this.render();
-			this._resize();
+		},
+		
+		onResizeColumn: function(/*int*/ cellIdx){
+			// Called when a column is resized.
 		},
 
 		// views
@@ -13226,7 +14819,7 @@ dojo.provide("dojox.grid._Grid");
 									}
 								}, this);
 							}
-							var checked = dojo.filter(self.layout.cells, function(c){
+							checked = dojo.filter(self.layout.cells, function(c){
 								if(c.menuItems.length > 1){
 									dojo.forEach(c.menuItems, "item.attr('disabled', false);");
 								}else{
@@ -13319,7 +14912,13 @@ dojo.provide("dojox.grid._Grid");
 		resize: function(changeSize, resultSize){
 			// summary:
 			//		Update the grid's rendering dimensions and resize it
-			this._resize(changeSize, resultSize);
+			
+			// Calling sizeChange calls update() which calls _resize...so let's
+			// save our input values, if any, and use them there when it gets 
+			// called.  This saves us an extra call to _resize(), which can
+			// get kind of heavy.
+			this._pendingChangeSize = changeSize;
+			this._pendingResultSize = resultSize;
 			this.sizeChange();
 		},
 
@@ -13337,23 +14936,29 @@ dojo.provide("dojox.grid._Grid");
 		},
 		
 		_resize: function(changeSize, resultSize){
+			// Restore our pending values, if any
+			changeSize = changeSize || this._pendingChangeSize;
+			resultSize = resultSize || this._pendingResultSize;
+			delete this._pendingChangeSize;
+			delete this._pendingResultSize;
 			// if we have set up everything except the DOM, we cannot resize
+			if(!this.domNode){ return; }
 			var pn = this.domNode.parentNode;
 			if(!pn || pn.nodeType != 1 || !this.hasLayout() || pn.style.visibility == "hidden" || pn.style.display == "none"){
 				return;
 			}
 			// useful measurement
 			var padBorder = this._getPadBorder();
-			var hh = 0;
+			var hh = undefined;
+			var h;
 			// grid height
 			if(this._autoHeight){
 				this.domNode.style.height = 'auto';
 				this.viewsNode.style.height = '';
 			}else if(typeof this.autoHeight == "number"){
-				var h = hh = this._getHeaderHeight();
+				h = hh = this._getHeaderHeight();
 				h += (this.scroller.averageRowHeight * this.autoHeight);
 				this.domNode.style.height = h + "px";
-			}else if(this.flex > 0){
 			}else if(this.domNode.clientHeight <= padBorder.h){
 				if(pn == document.body){
 					this.domNode.style.height = this.defaultHeight;
@@ -13372,18 +14977,24 @@ dojo.provide("dojox.grid._Grid");
 				this.height = this.domNode.style.height;
 				delete this.fitTo;
 			}else if(this.fitTo == "parent"){
-				var h = dojo._getContentBox(pn).h;
-				dojo.marginBox(this.domNode, { h: Math.max(0, h) });
+				h = this._parentContentBoxHeight = this._parentContentBoxHeight || dojo._getContentBox(pn).h;
+				this.domNode.style.height = Math.max(0, h) + "px";
 			}
+			
+			var hasFlex = dojo.some(this.views.views, function(v){ return v.flexCells; });
 
-			var h = dojo._getContentBox(this.domNode).h;
-			if(h == 0 && !this._autoHeight){
+			if(!this._autoHeight && (h || dojo._getContentBox(this.domNode).h) === 0){
 				// 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";
-				hh = this._getHeaderHeight();
+				if(!hasFlex && hh === undefined){
+					hh = this._getHeaderHeight();
+				}
+			}
+			if(hasFlex){
+				hh = undefined;
 			}
 
 			// NOTE: it is essential that width be applied before height
@@ -13399,17 +15010,19 @@ dojo.provide("dojox.grid._Grid");
 
 		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),
+			var doAutoWidth = (!this.initialWidth && this.autoWidth);
+			var w = doAutoWidth ? 0 : this.domNode.clientWidth || (this.domNode.offsetWidth - this._getPadBorder().w),
 				vw = this.views.arrange(1, w);
 			this.views.onEach("adaptWidth");
-			if (this.autoWidth)
+			if(doAutoWidth){
 				this.domNode.style.width = vw + "px";
+			}
 		},
 
 		adaptHeight: function(inHeaderHeight){
 			// private: measures and normalizes header height, then sets view heights, and then updates scroller
 			// content extent
-			var t = inHeaderHeight || this._getHeaderHeight();
+			var t = inHeaderHeight === undefined ? this._getHeaderHeight() : inHeaderHeight;
 			var h = (this._autoHeight ? -1 : Math.max(this.domNode.clientHeight - t, 0) || 0);
 			this.views.onEach('setSize', [0, h]);
 			this.views.onEach('adaptHeight');
@@ -13436,9 +15049,7 @@ dojo.provide("dojox.grid._Grid");
 		// startup
 		startup: function(){
 			if(this._started){return;}
-			
 			this.inherited(arguments);
-
 			if(this.autoRender){
 				this.render();
 			}
@@ -13488,13 +15099,14 @@ dojo.provide("dojox.grid._Grid");
 			// views are position absolute, so they do not inflate the parent
 			if(this._autoHeight){
 				var size = Math.max(this.views.measureContent()) + 'px';
+				
 				this.viewsNode.style.height = size;
 			}
 		},
 
 		renderRow: function(inRowIndex, inNodes){
 			// summary: private, used internally to render rows
-			this.views.renderRow(inRowIndex, inNodes);
+			this.views.renderRow(inRowIndex, inNodes, this._skipRowRenormalize);
 		},
 
 		rowRemoved: function(inRowIndex){
@@ -13528,7 +15140,7 @@ dojo.provide("dojox.grid._Grid");
 					this.updateRow(Number(r));
 				}
 			}
-			this.invalidated = null;
+			this.invalidated = [];
 		},
 
 		// update
@@ -13540,10 +15152,10 @@ dojo.provide("dojox.grid._Grid");
 				return;
 			}
 			//this.edit.saveState(inRowIndex);
-			var lastScrollTop = this.scrollTop;
+			this.lastScrollTop = this.scrollTop;
 			this.prerender();
 			this.scroller.invalidateNodes();
-			this.setScrollTop(lastScrollTop);
+			this.setScrollTop(this.lastScrollTop);
 			this.postrender();
 			//this.edit.restoreState(inRowIndex);
 		},
@@ -13577,13 +15189,14 @@ dojo.provide("dojox.grid._Grid");
 			//		How many rows to update.
 			startIndex = Number(startIndex);
 			howMany = Number(howMany);
+			var i;
 			if(this.updating){
-				for(var i=0; i<howMany; i++){
+				for(i=0; i<howMany; i++){
 					this.invalidated[i+startIndex]=true;
 				}
 			}else{
-				for(var i=0; i<howMany; i++){
-					this.views.updateRow(i+startIndex);
+				for(i=0; i<howMany; i++){
+					this.views.updateRow(i+startIndex, this._skipRowRenormalize);
 				}
 				this.scroller.rowHeightChanged(startIndex);
 			}
@@ -13614,7 +15227,20 @@ dojo.provide("dojox.grid._Grid");
 			//		Update the styles for a row after it's state has changed.
 			this.views.updateRowStyles(inRowIndex);
 		},
-
+		getRowNode: function(inRowIndex){
+			// summary:
+			//		find the rowNode that is not a rowSelector
+			if (this.focus.focusView && !(this.focus.focusView instanceof dojox.grid._RowSelector)){
+					return this.focus.focusView.rowNodes[inRowIndex];
+			}else{ // search through views
+				for (var i = 0, cView; (cView = this.views.views[i]); i++) {
+					if (!(cView instanceof dojox.grid._RowSelector)) {
+						return cView.rowNodes[inRowIndex];
+					}
+				}
+			}
+			return null;
+		},
 		rowHeightChanged: function(inRowIndex){
 			// summary:
 			//		Update grid when the height of a row has changed. Row height is handled automatically as rows
@@ -13653,7 +15279,14 @@ dojo.provide("dojox.grid._Grid");
 				this.delayScroll = true;
 				this.scrollTop = inTop;
 				this.views.setScrollTop(inTop);
-				jobs.job('dojoxGridScroll', 200, dojo.hitch(this, "finishScrollJob"));
+				if(this._pendingScroll){
+					window.clearTimeout(this._pendingScroll);
+				}
+				var _this = this;
+				this._pendingScroll = window.setTimeout(function(){
+					delete _this._pendingScroll;
+					_this.finishScrollJob();
+				}, 200);
 			}else{
 				this.setScrollTop(inTop);
 			}
@@ -13699,7 +15332,7 @@ dojo.provide("dojox.grid._Grid");
 			return this.layout.cells[inIndex];
 		},
 
-		setCellWidth: function(inIndex, inUnitWidth) {
+		setCellWidth: function(inIndex, inUnitWidth){
 			this.getCell(inIndex).unitWidth = inUnitWidth;
 		},
 
@@ -13772,6 +15405,7 @@ dojo.provide("dojox.grid._Grid");
 			if(m in this){
 				return this[m](e);
 			}
+			return false;
 		},
 
 		dispatchKeyEvent: function(e){
@@ -13865,7 +15499,11 @@ dojo.provide("dojox.grid._Grid");
 		removeSelectedRows: function(){
 			// summary:
 			//		Remove the selected rows from the grid.
-			this.updateRowCount(Math.max(0, this.attr('rowCount') - this.selection.getSelected().length));
+			if(this.allItemsSelected){
+				this.updateRowCount(0);
+			}else{
+				this.updateRowCount(Math.max(0, this.attr('rowCount') - this.selection.getSelected().length));
+			}
 			this.selection.clear();
 		}
 
@@ -13876,11 +15514,11 @@ dojo.provide("dojox.grid._Grid");
 		var widthFromAttr = function(n){
 			var w = d.attr(n, "width")||"auto";
 			if((w != "auto")&&(w.slice(-2) != "em")&&(w.slice(-1) != "%")){
-				w = parseInt(w)+"px";
+				w = parseInt(w, 10)+"px";
 			}
 			return w;
-		}
-		// if(!props.store){  }
+		};
+		// if(!props.store){ console.debug("no store!"); }
 		// if a structure isn't referenced, do we have enough
 		// data to try to build one automatically?
 		if(	!props.structure &&
@@ -13891,7 +15529,7 @@ dojo.provide("dojox.grid._Grid");
 				var sv = d.attr(cg, "span");
 				var v = {
 					noscroll: (d.attr(cg, "noscroll") == "true") ? true : false,
-					__span: (!!sv ? parseInt(sv) : 1),
+					__span: (!!sv ? parseInt(sv, 10) : 1),
 					cells: []
 				};
 				if(d.hasAttr(cg, "width")){
@@ -13938,7 +15576,8 @@ dojo.provide("dojox.grid._Grid");
 					var cell = {
 						name: d.trim(d.attr(th, "name")||th.innerHTML),
 						colSpan: parseInt(d.attr(th, "colspan")||1, 10),
-						type: d.trim(d.attr(th, "cellType")||"")
+						type: d.trim(d.attr(th, "cellType")||""),
+						id: d.trim(d.attr(th,"id")||"")
 					};
 					cellCount += cell.colSpan;
 					var rowSpan = d.attr(th, "rowspan");
@@ -13974,7 +15613,7 @@ dojo.provide("dojox.grid._Grid");
 		}
 
 		return new ctor(props, node);
-	}
+	};
 })();
 
 }
@@ -14061,6 +15700,8 @@ dojo.declare("dojox.grid.__DataCellDef", dojox.grid.__CellDef, {
 	constructor: function(){
 		//	field: String?
 		//		The attribute to read from the dojo.data item for the row.
+		//  fields: String[]?
+		//		An array of fields to grab the values of and pass as an array to the grid
 		//	get: Function?
 		//		function(rowIndex, item?){} rowIndex is of type Integer, item is of type
 		//		Object.  This function will be called when a cell requests data.  Returns
@@ -14088,6 +15729,14 @@ dojo.declare("dojox.grid.DataGrid", dojox.grid._Grid, {
 	query: null,
 	queryOptions: null,
 	fetchText: '...',
+	sortFields: null,
+	
+	// updateDelay: int
+	//		Time, in milliseconds, to delay updates automatically so that multiple
+	//		calls to onSet/onNew/onDelete don't keep rerendering the grid.  Set
+	//		to 0 to immediately cause updates.  A higher value will result in
+	//		better performance at the expense of responsiveness of the grid.
+	updateDelay: 1,
 
 /*=====
 	// structure: dojox.grid.__DataViewDef|dojox.grid.__DataViewDef[]|dojox.grid.__DataCellDef[]|Array[dojox.grid.__DataCellDef[]]
@@ -14130,26 +15779,64 @@ dojo.declare("dojox.grid.DataGrid", dojox.grid._Grid, {
 	},
 
 	get: function(inRowIndex, inItem){
-		return (!inItem ? this.defaultValue : (!this.field ? this.value : this.grid.store.getValue(inItem, this.field)));
+		if(inItem && this.field == "_item" && !this.fields){
+			return inItem;
+		}else if(inItem && this.fields){
+			var ret = [];
+			var s = this.grid.store;
+			dojo.forEach(this.fields, function(f){
+				ret = ret.concat(s.getValues(inItem, f));
+			});
+			return ret;
+		}
+		return (!inItem ? this.defaultValue : (!this.field ? this.value : (this.field == "_item" ? inItem : this.grid.store.getValue(inItem, this.field))));
 	},
 
+	_checkUpdateStatus: function(){
+		if(this.updateDelay > 0){
+			var iStarted = false;
+			if(this._endUpdateDelay){
+				clearTimeout(this._endUpdateDelay);
+				delete this._endUpdateDelay;
+				iStarted = true;
+			}
+			if(!this.updating){
+				this.beginUpdate();
+				iStarted = true;
+			}
+			if(iStarted){
+				var _this = this;
+				this._endUpdateDelay = setTimeout(function(){
+					delete _this._endUpdateDelay;
+					_this.endUpdate();
+				}, this.updateDelay);
+			}
+		}
+	},
+	
 	_onSet: function(item, attribute, oldValue, newValue){
+		this._checkUpdateStatus();
 		var idx = this.getItemIndex(item);
 		if(idx>-1){
 			this.updateRow(idx);
 		}
 	},
+	
+	_createItem: function(item, index){
+		var idty = this._hasIdentity ? this.store.getIdentity(item) : dojo.toJson(this.query) + ":idx:" + index + ":sort:" + dojo.toJson(this.getSortProps());
+		var o = this._by_idty[idty] = { idty: idty, item: item };
+		return o;
+	},
 
 	_addItem: function(item, index, noUpdate){
-		var idty = this._hasIdentity ? this.store.getIdentity(item) : dojo.toJson(this.query) + ":idx:" + index + ":sort:" + dojo.toJson(this.getSortProps());
-		var o = { idty: idty, item: item };
-		this._by_idty[idty] = this._by_idx[index] = o;
+		this._by_idx[index] = this._createItem(item, index);
 		if(!noUpdate){
 			this.updateRow(index);
 		}
 	},
 
 	_onNew: function(item, parentInfo){
+		this._checkUpdateStatus();
 		var rowCount = this.attr('rowCount');
 		this._addingItem = true;
 		this.updateRowCount(rowCount+1);
@@ -14159,9 +15846,20 @@ dojo.declare("dojox.grid.DataGrid", dojox.grid._Grid, {
 	},
 
 	_onDelete: function(item){
+		this._checkUpdateStatus();
 		var idx = this._getItemIndex(item, true);
 
 		if(idx >= 0){
+			// When a row is deleted, all rest rows are shifted down,
+			// and migrate from page to page. If some page is not 
+			// loaded yet empty rows can migrate to initialized pages
+			// without refreshing. It causes empty rows in some pages, see:
+			// http://bugs.dojotoolkit.org/ticket/6818
+			// this code fix this problem by reseting loaded page info
+			this._pages = [];
+			this._bop = -1;
+			this._eop = -1;
+
 			var o = this._by_idx[idx];
 			this._by_idx.splice(idx, 1);
 			delete this._by_idty[o.idty];
@@ -14227,25 +15925,43 @@ dojo.declare("dojox.grid.DataGrid", dojox.grid._Grid, {
 	},
 
 	_onFetchBegin: function(size, req){
+		if(!this.scroller){ return; }
 		if(this.rowCount != size){
 			if(req.isRender){
 				this.scroller.init(size, this.keepRows, this.rowsPerPage);
 				this.rowCount = size;
 				this._setAutoHeightAttr(this.autoHeight, true);
+				this._skipRowRenormalize = true;
 				this.prerender();
+				this._skipRowRenormalize = false;
 			}else{
 				this.updateRowCount(size);
 			}
 		}
+		if(!size){
+			this.views.render();
+			this._resize();
+			this.showMessage(this.noDataMessage);
+			this.focus.initFocusView();
+		}else{
+			this.showMessage();
+		}
 	},
 
 	_onFetchComplete: function(items, req){
+		if(!this.scroller){ return; }
 		if(items && items.length > 0){
-			//
+			//console.log(items);
 			dojo.forEach(items, function(item, idx){
 				this._addItem(item, req.start+idx, true);
 			}, this);
+			if(this._autoHeight){
+				this._skipRowRenormalize = true;
+			}
 			this.updateRows(req.start, items.length);
+			if(this._autoHeight){
+				this._skipRowRenormalize = false;
+			}			
 			if(req.isRender){
 				this.setScrollTop(0);
 				this.postrender();
@@ -14257,24 +15973,19 @@ dojo.declare("dojox.grid.DataGrid", dojox.grid._Grid, {
 		if(!this._isLoaded){
 			this._isLoading = false;
 			this._isLoaded = true;
-			if(!items || !items.length){
-				this.showMessage(this.noDataMessage);
-				this.focus.initFocusView();
-			}else{
-				this.showMessage();
-			}
 		}
 		this._pending_requests[req.start] = false;
 	},
 
 	_onFetchError: function(err, req){
-		
+		console.log(err);
 		delete this._lastScrollTop;
 		if(!this._isLoaded){
 			this._isLoading = false;
 			this._isLoaded = true;
 			this.showMessage(this.errorMessage);
 		}
+		this._pending_requests[req.start] = false;
 		this.onFetchError(err, req);
 	},
 
@@ -14282,19 +15993,19 @@ dojo.declare("dojox.grid.DataGrid", dojox.grid._Grid, {
 	},
 
 	_fetch: function(start, isRender){
-		var start = start || 0;
+		start = start || 0;
 		if(this.store && !this._pending_requests[start]){
 			if(!this._isLoaded && !this._isLoading){
 				this._isLoading = true;
 				this.showMessage(this.loadingMessage);
 			}
 			this._pending_requests[start] = true;
-			//
+			//console.log("fetch: ", start);
 			try{
 				if(this.items){
 					var items = this.items;
 					var store = this.store;
-					this.rowsPerPage = items.length
+					this.rowsPerPage = items.length;
 					var req = {
 						start: start,
 						count: this.rowsPerPage,
@@ -14336,7 +16047,7 @@ dojo.declare("dojox.grid.DataGrid", dojox.grid._Grid, {
 					});
 				}
 			}catch(e){
-				this._onFetchError(e);
+				this._onFetchError(e, {start: start, count: this.rowsPerPage});
 			}
 		}
 	},
@@ -14445,7 +16156,7 @@ dojo.declare("dojox.grid.DataGrid", dojox.grid._Grid, {
 
 	getCellName: function(inCell){
 		return inCell.field;
-		//
+		//console.log(inCell);
 	},
 
 	_refresh: function(isRender){
@@ -14465,6 +16176,9 @@ dojo.declare("dojox.grid.DataGrid", dojox.grid._Grid, {
 	getSortProps: function(){
 		var c = this.getCell(this.getSortIndex());
 		if(!c){
+			if(this.sortFields){
+				return this.sortFields;
+			}
 			return null;
 		}else{
 			var desc = c["sortDesc"];
@@ -14561,27 +16275,43 @@ dojo.declare("dojox.grid.DataGrid", dojox.grid._Grid, {
 		//		Remove the selected rows from the grid.
 		if(this._canEdit){
 			this.edit.apply();
-			var items = this.selection.getSelected();
-			if(items.length){
-				dojo.forEach(items, this.store.deleteItem, this.store);
-				this.selection.clear();
+			var fx = dojo.hitch(this, function(items){
+				if(items.length){
+					dojo.forEach(items, this.store.deleteItem, this.store);
+					this.selection.clear();
+				}			
+			});
+			if(this.allItemsSelected){
+				this.store.fetch({
+							query: this.query, 
+							queryOptions: this.queryOptions,
+							onComplete: fx});
+			}else{
+				fx(this.selection.getSelected());
 			}
 		}
 	}
 });
 
+dojox.grid.DataGrid.cell_markupFactory = function(cellFunc, node, cellDef){
+	var field = dojo.trim(dojo.attr(node, "field")||"");
+	if(field){
+		cellDef.field = field;
+	}
+	cellDef.field = cellDef.field||cellDef.name;
+	var fields = dojo.trim(dojo.attr(node, "fields")||"");
+	if(fields){
+		cellDef.fields = fields.split(",");
+	}
+	if(cellFunc){
+		cellFunc(node, cellDef);
+	}
+};
+
 dojox.grid.DataGrid.markupFactory = function(props, node, ctor, cellFunc){
-	return dojox.grid._Grid.markupFactory(props, node, ctor, function(node, cellDef){
-		var field = dojo.trim(dojo.attr(node, "field")||"");
-		if(field){
-			cellDef.field = field;
-		}
-		cellDef.field = cellDef.field||cellDef.name;
-		if(cellFunc){
-			cellFunc(node, cellDef);
-		}
-	});
-}
+	return dojox.grid._Grid.markupFactory(props, node, ctor, 
+					dojo.partial(dojox.grid.DataGrid.cell_markupFactory, cellFunc));
+};
 
 }
 
diff --git a/dojox/grid/DataSelection.js b/dojox/grid/DataSelection.js
index a8b8615..3da5913 100644
--- a/dojox/grid/DataSelection.js
+++ b/dojox/grid/DataSelection.js
@@ -30,7 +30,18 @@ _5.push(this.grid.getItem(i));
 }
 }
 return _5;
-},addToSelection:function(_8){
+},addToSelection:function(_6){
+if(this.mode=="none"){
+return;
+}
+var _7=null;
+if(typeof _6=="number"||typeof _6=="string"){
+_7=_6;
+}else{
+_7=this.grid.getItemIndex(_6);
+}
+dojox.grid.Selection.prototype.addToSelection.call(this,_7);
+},deselect:function(_8){
 if(this.mode=="none"){
 return;
 }
@@ -40,27 +51,16 @@ _9=_8;
 }else{
 _9=this.grid.getItemIndex(_8);
 }
-dojox.grid.Selection.prototype.addToSelection.call(this,_9);
-},deselect:function(_a){
-if(this.mode=="none"){
-return;
-}
+dojox.grid.Selection.prototype.deselect.call(this,_9);
+},deselectAll:function(_a){
 var _b=null;
+if(_a||typeof _a=="number"){
 if(typeof _a=="number"||typeof _a=="string"){
 _b=_a;
 }else{
 _b=this.grid.getItemIndex(_a);
 }
-dojox.grid.Selection.prototype.deselect.call(this,_b);
-},deselectAll:function(_c){
-var _d=null;
-if(_c||typeof _c=="number"){
-if(typeof _c=="number"||typeof _c=="string"){
-_d=_c;
-}else{
-_d=this.grid.getItemIndex(_c);
-}
-dojox.grid.Selection.prototype.deselectAll.call(this,_d);
+dojox.grid.Selection.prototype.deselectAll.call(this,_b);
 }else{
 this.inherited(arguments);
 }
diff --git a/dojox/grid/EnhancedGrid.js b/dojox/grid/EnhancedGrid.js
new file mode 100644
index 0000000..f399411
--- /dev/null
+++ b/dojox/grid/EnhancedGrid.js
@@ -0,0 +1,77 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid.EnhancedGrid"]){
+dojo._hasResource["dojox.grid.EnhancedGrid"]=true;
+dojo.provide("dojox.grid.EnhancedGrid");
+dojo.require("dojox.grid.DataGrid");
+dojo.require("dojox.grid.enhanced._Plugin");
+dojo.requireLocalization("dojox.grid.enhanced","EnhancedGrid",null,"ROOT,zh");
+dojo.experimental("dojox.grid.EnhancedGrid");
+dojo.declare("dojox.grid.EnhancedGrid",dojox.grid.DataGrid,{plugins:null,pluginMgr:null,doubleAffordance:false,postMixInProperties:function(){
+this._nls=dojo.i18n.getLocalization("dojox.grid.enhanced","EnhancedGrid",this.lang);
+this.inherited(arguments);
+},postCreate:function(){
+if(this.plugins){
+this.pluginMgr=new dojox.grid.enhanced._Plugin(this);
+this.pluginMgr.preInit();
+}
+this.inherited(arguments);
+this.pluginMgr&&this.pluginMgr.postInit();
+},_fillContent:function(){
+this.menuContainer=this.srcNodeRef;
+this.inherited(arguments);
+},startup:function(){
+this.menuContainer&&this._initMenus&&this._initMenus();
+this.inherited(arguments);
+if(this.doubleAffordance){
+dojo.addClass(this.domNode,"dojoxGridDoubleAffordance");
+}
+},textSizeChanged:function(){
+if(!dojo.isWebKit){
+this.inherited(arguments);
+}else{
+if(this.textSizeChanging){
+return;
+}
+this.textSizeChanging=true;
+this.inherited(arguments);
+this.textSizeChanging=false;
+}
+},removeSelectedRows:function(){
+if(this.indirectSelection&&this._canEdit){
+var _1=dojo.clone(this.selection.selected);
+this.inherited(arguments);
+dojo.forEach(_1,function(_2,_3){
+_2&&this.grid.rowSelectCell.toggleRow(_3,false);
+});
+}
+},doApplyCellEdit:function(_4,_5,_6){
+if(!_6){
+this.invalidated[_5]=true;
+return;
+}
+this.inherited(arguments);
+},mixin:function(_7,_8){
+var _9={};
+for(p in _8){
+if(p=="_inherited"||p=="declaredClass"||p=="constructor"){
+continue;
+}
+_9[p]=_8[p];
+}
+dojo.mixin(_7,_9);
+},_copyAttr:function(_a,_b){
+if(!_b){
+return;
+}
+return this.inherited(arguments);
+}});
+dojox.grid.EnhancedGrid.markupFactory=function(_c,_d,_e,_f){
+return dojox.grid._Grid.markupFactory(_c,_d,_e,dojo.partial(dojox.grid.DataGrid.cell_markupFactory,_f));
+};
+}
diff --git a/dojox/grid/Grid.js b/dojox/grid/Grid.js
deleted file mode 100644
index 8590e0c..0000000
--- a/dojox/grid/Grid.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.Grid"]){
-dojo._hasResource["dojox.grid.Grid"]=true;
-dojo.provide("dojox.grid.Grid");
-dojo.require("dojox.grid.compat.Grid");
-dojo.deprecated("dojox.grid.Grid");
-}
diff --git a/dojox/grid/README b/dojox/grid/README
index 14ce050..7df19b5 100644
--- a/dojox/grid/README
+++ b/dojox/grid/README
@@ -41,4 +41,8 @@ Install into the following directory structure:
 /dojox/html/
 
 ...which should be at the same level as your Dojo checkout.
+
+If you wish us use the old (compat / 1.2) grid, you can untar the
+compatGrid.tar.gz archive.  This version of the grid is no longer maintained
+or updated - but should work with any newer version of the dojo library.
 -------------------------------------------------------------------------------
diff --git a/dojox/grid/Selection.js b/dojox/grid/Selection.js
index 68f062e..a9f491e 100644
--- a/dojox/grid/Selection.js
+++ b/dojox/grid/Selection.js
@@ -44,24 +44,24 @@ return i;
 }
 }
 return -1;
-},getNextSelected:function(_a){
+},getNextSelected:function(_8){
 if(this.mode=="none"){
 return -1;
 }
-for(var i=_a+1,l=this.selected.length;i<l;i++){
+for(var i=_8+1,l=this.selected.length;i<l;i++){
 if(this.selected[i]){
 return i;
 }
 }
 return -1;
 },getSelected:function(){
-var _d=[];
+var _9=[];
 for(var i=0,l=this.selected.length;i<l;i++){
 if(this.selected[i]){
-_d.push(i);
+_9.push(i);
 }
 }
-return _d;
+return _9;
 },getSelectedCount:function(){
 var c=0;
 for(var i=0;i<this.selected.length;i++){
@@ -71,116 +71,136 @@ c++;
 }
 return c;
 },_beginUpdate:function(){
-if(this.updating==0){
+if(this.updating===0){
 this.onChanging();
 }
 this.updating++;
 },_endUpdate:function(){
 this.updating--;
-if(this.updating==0){
+if(this.updating===0){
 this.onChanged();
 }
-},select:function(_12){
+},select:function(_a){
 if(this.mode=="none"){
 return;
 }
 if(this.mode!="multiple"){
-this.deselectAll(_12);
-this.addToSelection(_12);
+this.deselectAll(_a);
+this.addToSelection(_a);
 }else{
-this.toggleSelect(_12);
+this.toggleSelect(_a);
 }
-},addToSelection:function(_13){
+},addToSelection:function(_b){
 if(this.mode=="none"){
 return;
 }
-_13=Number(_13);
-if(this.selected[_13]){
-this.selectedIndex=_13;
+if(dojo.isArray(_b)){
+dojo.forEach(_b,this.addToSelection,this);
+return;
+}
+_b=Number(_b);
+if(this.selected[_b]){
+this.selectedIndex=_b;
 }else{
-if(this.onCanSelect(_13)!==false){
-this.selectedIndex=_13;
+if(this.onCanSelect(_b)!==false){
+this.selectedIndex=_b;
+var _c=this.grid.getRowNode(_b);
+if(_c){
+dojo.attr(_c,"aria-selected","true");
+}
 this._beginUpdate();
-this.selected[_13]=true;
-this.onSelected(_13);
+this.selected[_b]=true;
+this.onSelected(_b);
 this._endUpdate();
 }
 }
-},deselect:function(_14){
+},deselect:function(_d){
 if(this.mode=="none"){
 return;
 }
-_14=Number(_14);
-if(this.selectedIndex==_14){
+if(dojo.isArray(_d)){
+dojo.forEach(_d,this.deselect,this);
+return;
+}
+_d=Number(_d);
+if(this.selectedIndex==_d){
 this.selectedIndex=-1;
 }
-if(this.selected[_14]){
-if(this.onCanDeselect(_14)===false){
+if(this.selected[_d]){
+if(this.onCanDeselect(_d)===false){
 return;
 }
+var _e=this.grid.getRowNode(_d);
+if(_e){
+dojo.attr(_e,"aria-selected","false");
+}
 this._beginUpdate();
-delete this.selected[_14];
-this.onDeselected(_14);
+delete this.selected[_d];
+this.onDeselected(_d);
 this._endUpdate();
 }
-},setSelected:function(_15,_16){
-this[(_16?"addToSelection":"deselect")](_15);
-},toggleSelect:function(_17){
-this.setSelected(_17,!this.selected[_17]);
-},_range:function(_18,_19,_1a){
-var s=(_18>=0?_18:_19),e=_19;
+},setSelected:function(_f,_10){
+this[(_10?"addToSelection":"deselect")](_f);
+},toggleSelect:function(_11){
+if(dojo.isArray(_11)){
+dojo.forEach(_11,this.toggleSelect,this);
+return;
+}
+this.setSelected(_11,!this.selected[_11]);
+},_range:function(_12,_13,_14){
+var s=(_12>=0?_12:_13),e=_13;
 if(s>e){
 e=s;
-s=_19;
+s=_13;
 }
 for(var i=s;i<=e;i++){
-_1a(i);
-}
-},selectRange:function(_1e,_1f){
-this._range(_1e,_1f,dojo.hitch(this,"addToSelection"));
-},deselectRange:function(_20,_21){
-this._range(_20,_21,dojo.hitch(this,"deselect"));
-},insert:function(_22){
-this.selected.splice(_22,0,false);
-if(this.selectedIndex>=_22){
+_14(i);
+}
+},selectRange:function(_15,_16){
+this._range(_15,_16,dojo.hitch(this,"addToSelection"));
+},deselectRange:function(_17,_18){
+this._range(_17,_18,dojo.hitch(this,"deselect"));
+},insert:function(_19){
+this.selected.splice(_19,0,false);
+if(this.selectedIndex>=_19){
 this.selectedIndex++;
 }
-},remove:function(_23){
-this.selected.splice(_23,1);
-if(this.selectedIndex>=_23){
+},remove:function(_1a){
+this.selected.splice(_1a,1);
+if(this.selectedIndex>=_1a){
 this.selectedIndex--;
 }
-},deselectAll:function(_24){
+},deselectAll:function(_1b){
 for(var i in this.selected){
-if((i!=_24)&&(this.selected[i]===true)){
+if((i!=_1b)&&(this.selected[i]===true)){
 this.deselect(i);
 }
 }
-},clickSelect:function(_26,_27,_28){
+},clickSelect:function(_1c,_1d,_1e){
 if(this.mode=="none"){
 return;
 }
 this._beginUpdate();
 if(this.mode!="extended"){
-this.select(_26);
+this.select(_1c);
 }else{
-var _29=this.selectedIndex;
-if(!_27){
-this.deselectAll(_26);
+var _1f=this.selectedIndex;
+if(!_1d){
+this.deselectAll(_1c);
 }
-if(_28){
-this.selectRange(_29,_26);
+if(_1e){
+this.selectRange(_1f,_1c);
 }else{
-if(_27){
-this.toggleSelect(_26);
+if(_1d){
+this.toggleSelect(_1c);
 }else{
-this.addToSelection(_26);
+this.addToSelection(_1c);
 }
 }
 }
 this._endUpdate();
 },clickSelectEvent:function(e){
-this.clickSelect(e.rowIndex,dojo.dnd.getCopyKeyState(e),e.shiftKey);
+this.clickSelect(e.rowIndex,dojo.isCopyKey(e),e.shiftKey);
 },clear:function(){
 this._beginUpdate();
 this.deselectAll();
diff --git a/dojox/grid/TreeGrid.js b/dojox/grid/TreeGrid.js
new file mode 100644
index 0000000..fb56efc
--- /dev/null
+++ b/dojox/grid/TreeGrid.js
@@ -0,0 +1,727 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid.TreeGrid"]){
+dojo._hasResource["dojox.grid.TreeGrid"]=true;
+dojo.experimental("dojox.grid.TreeGrid");
+dojo.provide("dojox.grid.TreeGrid");
+dojo.require("dojox.grid.DataGrid");
+dojo.require("dojox.grid._TreeView");
+dojo.require("dojox.grid.cells.tree");
+dojo.require("dojox.grid.TreeSelection");
+dojo.declare("dojox.grid._TreeAggregator",null,{cells:[],grid:null,childFields:[],constructor:function(_1){
+this.cells=_1.cells||[];
+this.childFields=_1.childFields||[];
+this.grid=_1.grid;
+this.store=this.grid.store;
+},_cacheValue:function(_2,id,_3){
+_2[id]=_3;
+return _3;
+},clearSubtotalCache:function(){
+if(this.store){
+delete this.store._cachedAggregates;
+}
+},cnt:function(_4,_5,_6){
+var _7=0;
+var _8=this.store;
+var _9=this.childFields;
+if(_9[_5]){
+var _a=_8.getValues(_6,_9[_5]);
+if(_4.index<=_5+1){
+_7=_a.length;
+}else{
+dojo.forEach(_a,function(c){
+_7+=this.getForCell(_4,_5+1,c,"cnt");
+},this);
+}
+}else{
+_7=1;
+}
+return _7;
+},sum:function(_b,_c,_d){
+var _e=0;
+var _f=this.store;
+var _10=this.childFields;
+if(_10[_c]){
+dojo.forEach(_f.getValues(_d,_10[_c]),function(c){
+_e+=this.getForCell(_b,_c+1,c,"sum");
+},this);
+}else{
+_e+=_f.getValue(_d,_b.field);
+}
+return _e;
+},value:function(_11,_12,_13){
+},getForCell:function(_14,_15,_16,_17){
+var _18=this.store;
+if(!_18||!_16||!_18.isItem(_16)){
+return "";
+}
+var _19=_18._cachedAggregates=_18._cachedAggregates||{};
+var id=_18.getIdentity(_16);
+var _1a=_19[id]=_19[id]||[];
+if(!_14.getOpenState){
+_14=this.grid.getCell(_14.layoutIndex+_15+1);
+}
+var idx=_14.index;
+var _1b=_1a[idx]=_1a[idx]||{};
+_17=(_17||(_14.parentCell?_14.parentCell.aggregate:"sum"))||"sum";
+var _1c=_14.field;
+if(_1c==_18.getLabelAttributes()[0]){
+_17="cnt";
+}
+var _1d=_1b[_17]=_1b[_17]||[];
+if(_1d[_15]!=undefined){
+return _1d[_15];
+}
+var _1e=((_14.parentCell&&_14.parentCell.itemAggregates)?_14.parentCell.itemAggregates[_14.idxInParent]:"")||"";
+if(_1e&&_18.hasAttribute(_16,_1e)){
+return this._cacheValue(_1d,_15,_18.getValue(_16,_1e));
+}else{
+if(_1e){
+return this._cacheValue(_1d,_15,0);
+}
+}
+return this._cacheValue(_1d,_15,this[_17](_14,_15,_16));
+}});
+dojo.declare("dojox.grid._TreeLayout",dojox.grid._Layout,{_isCollapsable:false,_getInternalStructure:function(_1f){
+var g=this.grid;
+var s=_1f;
+var _20=s[0].cells[0];
+var _21={type:"dojox.grid._TreeView",cells:[[]]};
+var _22=[];
+var _23=0;
+var _24=function(_25,_26){
+var _27=_25.children;
+var _28=function(_29,idx){
+var k,n={};
+for(k in _29){
+n[k]=_29[k];
+}
+n=dojo.mixin(n,{level:_26,idxInParent:_26>0?idx:-1,parentCell:_26>0?_25:null});
+return n;
+};
+var ret=[];
+dojo.forEach(_27,function(c,idx){
+if("children" in c){
+_22.push(c.field);
+var _2a=ret[ret.length-1];
+_2a.isCollapsable=true;
+c.level=_26;
+ret=ret.concat(_24(c,_26+1));
+}else{
+ret.push(_28(c,idx));
+}
+});
+_23=Math.max(_23,_26);
+return ret;
+};
+var _2b={children:_20,itemAggregates:[]};
+_21.cells[0]=_24(_2b,0);
+g.aggregator=new dojox.grid._TreeAggregator({cells:_21.cells[0],grid:g,childFields:_22});
+if(g.scroller&&g.defaultOpen){
+g.scroller.defaultRowHeight=g.scroller._origDefaultRowHeight*(2*_23+1);
+}
+return [_21];
+},setStructure:function(_2c){
+var s=_2c;
+var g=this.grid;
+if(g&&g.treeModel&&!dojo.every(s,function(i){
+return ("cells" in i);
+})){
+s=arguments[0]=[{cells:[s]}];
+}
+if(s.length==1&&s[0].cells.length==1){
+if(g&&g.treeModel){
+s[0].type="dojox.grid._TreeView";
+this._isCollapsable=true;
+s[0].cells[0][(this.grid.treeModel?this.grid.expandoCell:0)].isCollapsable=true;
+}else{
+var _2d=dojo.filter(s[0].cells[0],function(c){
+return ("children" in c);
+});
+if(_2d.length===1){
+this._isCollapsable=true;
+}
+}
+}
+if(this._isCollapsable&&(!g||!g.treeModel)){
+arguments[0]=this._getInternalStructure(s);
+}
+this.inherited(arguments);
+},addCellDef:function(_2e,_2f,_30){
+var obj=this.inherited(arguments);
+return dojo.mixin(obj,dojox.grid.cells.TreeCell);
+}});
+dojo.declare("dojox.grid.TreePath",null,{level:0,_str:"",_arr:null,grid:null,store:null,cell:null,item:null,constructor:function(_31,_32){
+if(dojo.isString(_31)){
+this._str=_31;
+this._arr=dojo.map(_31.split("/"),function(_33){
+return parseInt(_33,10);
+});
+}else{
+if(dojo.isArray(_31)){
+this._str=_31.join("/");
+this._arr=_31.slice(0);
+}else{
+if(typeof _31=="number"){
+this._str=String(_31);
+this._arr=[_31];
+}else{
+this._str=_31._str;
+this._arr=_31._arr.slice(0);
+}
+}
+}
+this.level=this._arr.length-1;
+this.grid=_32;
+this.store=this.grid.store;
+if(_32.treeModel){
+this.cell=_32.layout.cells[_32.expandoCell];
+}else{
+this.cell=_32.layout.cells[this.level];
+}
+},item:function(){
+if(!this._item){
+this._item=this.grid.getItem(this._arr);
+}
+return this._item;
+},compare:function(_34){
+if(dojo.isString(_34)||dojo.isArray(_34)){
+if(this._str==_34){
+return 0;
+}
+if(_34.join&&this._str==_34.join("/")){
+return 0;
+}
+_34=new dojox.grid.TreePath(_34,this.grid);
+}else{
+if(_34 instanceof dojox.grid.TreePath){
+if(this._str==_34._str){
+return 0;
+}
+}
+}
+for(var i=0,l=(this._arr.length<_34._arr.length?this._arr.length:_34._arr.length);i<l;i++){
+if(this._arr[i]<_34._arr[i]){
+return -1;
+}
+if(this._arr[i]>_34._arr[i]){
+return 1;
+}
+}
+if(this._arr.length<_34._arr.length){
+return -1;
+}
+if(this._arr.length>_34._arr.length){
+return 1;
+}
+return 0;
+},isOpen:function(){
+return this.cell.openStates&&this.cell.getOpenState(this.item());
+},previous:function(){
+var _35=this._arr.slice(0);
+if(this._str=="0"){
+return null;
+}
+var _36=_35.length-1;
+if(_35[_36]===0){
+_35.pop();
+return new dojox.grid.TreePath(_35,this.grid);
+}
+_35[_36]--;
+var _37=new dojox.grid.TreePath(_35,this.grid);
+return _37.lastChild(true);
+},next:function(){
+var _38=this._arr.slice(0);
+if(this.isOpen()){
+_38.push(0);
+}else{
+_38[_38.length-1]++;
+for(var i=this.level;i>=0;i--){
+var _39=this.grid.getItem(_38.slice(0,i+1));
+if(i>0){
+if(!_39){
+_38.pop();
+_38[i-1]++;
+}
+}else{
+if(!_39){
+return null;
+}
+}
+}
+}
+return new dojox.grid.TreePath(_38,this.grid);
+},children:function(_3a){
+if(!this.isOpen()&&!_3a){
+return null;
+}
+var _3b=[];
+var _3c=this.grid.treeModel;
+if(_3c){
+var _3d=this.item();
+var _3e=_3c.store;
+if(!_3c.mayHaveChildren(_3d)){
+return null;
+}
+dojo.forEach(_3c.childrenAttrs,function(_3f){
+_3b=_3b.concat(_3e.getValues(_3d,_3f));
+});
+}else{
+_3b=this.store.getValues(this.item(),this.grid.layout.cells[this.cell.level+1].parentCell.field);
+if(_3b.length>1&&this.grid.sortChildItems){
+var _40=this.grid.getSortProps();
+if(_40&&_40.length){
+var _41=_40[0].attribute,_42=this.grid;
+if(_41&&_3b[0][_41]){
+var _43=!!_40[0].descending;
+_3b=_3b.slice(0);
+_3b.sort(function(a,b){
+return _42._childItemSorter(a,b,_41,_43);
+});
+}
+}
+}
+}
+return _3b;
+},childPaths:function(){
+var _44=this.children();
+if(!_44){
+return [];
+}
+return dojo.map(_44,function(_45,_46){
+return new dojox.grid.TreePath(this._str+"/"+_46,this.grid);
+},this);
+},parent:function(){
+if(this.level===0){
+return null;
+}
+return new dojox.grid.TreePath(this._arr.slice(0,this.level),this.grid);
+},lastChild:function(_47){
+var _48=this.children();
+if(!_48||!_48.length){
+return this;
+}
+var _49=new dojox.grid.TreePath(this._str+"/"+String(_48.length-1),this.grid);
+if(!_47){
+return _49;
+}
+return _49.lastChild(true);
+},toString:function(){
+return this._str;
+}});
+dojo.declare("dojox.grid._TreeFocusManager",dojox.grid._FocusManager,{setFocusCell:function(_4a,_4b){
+if(_4a&&_4a.getNode(_4b)){
+this.inherited(arguments);
+}
+},isLastFocusCell:function(){
+if(this.cell&&this.cell.index==this.grid.layout.cellCount-1){
+var _4c=new dojox.grid.TreePath(this.grid.rowCount-1,this.grid);
+_4c=_4c.lastChild(true);
+return this.rowIndex==_4c._str;
+}
+return false;
+},next:function(){
+if(this.cell){
+var row=this.rowIndex,col=this.cell.index+1,cc=this.grid.layout.cellCount-1;
+var _4d=new dojox.grid.TreePath(this.rowIndex,this.grid);
+if(col>cc){
+var _4e=_4d.next();
+if(!_4e){
+col--;
+}else{
+col=0;
+_4d=_4e;
+}
+}
+if(this.grid.edit.isEditing()){
+var _4f=this.grid.getCell(col);
+if(!this.isLastFocusCell()&&!_4f.editable){
+this._focusifyCellNode(false);
+this.cell=_4f;
+this.rowIndex=_4d._str;
+this.next();
+return;
+}
+}
+this.setFocusIndex(_4d._str,col);
+}
+},previous:function(){
+if(this.cell){
+var row=(this.rowIndex||0),col=(this.cell.index||0)-1;
+var _50=new dojox.grid.TreePath(row,this.grid);
+if(col<0){
+var _51=_50.previous();
+if(!_51){
+col=0;
+}else{
+col=this.grid.layout.cellCount-1;
+_50=_51;
+}
+}
+if(this.grid.edit.isEditing()){
+var _52=this.grid.getCell(col);
+if(!this.isFirstFocusCell()&&!_52.editable){
+this._focusifyCellNode(false);
+this.cell=_52;
+this.rowIndex=_50._str;
+this.previous();
+return;
+}
+}
+this.setFocusIndex(_50._str,col);
+}
+},move:function(_53,_54){
+if(this.isNavHeader()){
+this.inherited(arguments);
+return;
+}
+if(!this.cell){
+return;
+}
+var sc=this.grid.scroller,r=this.rowIndex,rc=this.grid.rowCount-1,_55=new dojox.grid.TreePath(this.rowIndex,this.grid);
+if(_53){
+var row;
+if(_53>0){
+_55=_55.next();
+row=_55._arr[0];
+if(row>sc.getLastPageRow(sc.page)){
+this.grid.setScrollTop(this.grid.scrollTop+sc.findScrollTop(row)-sc.findScrollTop(r));
+}
+}else{
+if(_53<0){
+_55=_55.previous();
+row=_55._arr[0];
+if(row<=sc.getPageRow(sc.page)){
+this.grid.setScrollTop(this.grid.scrollTop-sc.findScrollTop(r)-sc.findScrollTop(row));
+}
+}
+}
+}
+var cc=this.grid.layout.cellCount-1,i=this.cell.index,col=Math.min(cc,Math.max(0,i+_54));
+var _56=this.grid.getCell(col);
+var _57=_54<0?-1:1;
+while(col>=0&&col<cc&&_56&&_56.hidden===true){
+col+=_57;
+_56=this.grid.getCell(col);
+}
+if(!_56||_56.hidden===true){
+col=i;
+}
+if(_53){
+this.grid.updateRow(r);
+}
+this.setFocusIndex(_55._str,col);
+}});
+dojo.declare("dojox.grid.TreeGrid",dojox.grid.DataGrid,{defaultOpen:true,sortChildItems:false,openAtLevels:[],treeModel:null,expandoCell:0,aggregator:null,_layoutClass:dojox.grid._TreeLayout,createSelection:function(){
+this.selection=new dojox.grid.TreeSelection(this);
+},_childItemSorter:function(a,b,_58,_59){
+var av=this.store.getValue(a,_58);
+var bv=this.store.getValue(b,_58);
+if(av!=bv){
+return av<bv==_59?1:-1;
+}
+return 0;
+},_onNew:function(_5a,_5b){
+if(!_5b||!_5b.item){
+this.inherited(arguments);
+}else{
+var idx=this.getItemIndex(_5b.item);
+if(typeof idx=="string"){
+this.updateRow(idx.split("/")[0]);
+}else{
+if(idx>-1){
+this.updateRow(idx);
+}
+}
+}
+},_onSet:function(_5c,_5d,_5e,_5f){
+this._checkUpdateStatus();
+if(this.aggregator){
+this.aggregator.clearSubtotalCache();
+}
+var idx=this.getItemIndex(_5c);
+if(typeof idx=="string"){
+this.updateRow(idx.split("/")[0]);
+}else{
+if(idx>-1){
+this.updateRow(idx);
+}
+}
+},_onDelete:function(_60){
+this._cleanupExpandoCache(this._getItemIndex(_60,true),this.store.getIdentity(_60),_60);
+this.inherited(arguments);
+},_cleanupExpandoCache:function(_61,_62,_63){
+},_addItem:function(_64,_65,_66,_67){
+if(!_67&&this.model&&dojo.indexOf(this.model.root.children,_64)==-1){
+this.model.root.children[_65]=_64;
+}
+this.inherited(arguments);
+},getItem:function(idx){
+var _68=dojo.isArray(idx);
+if(dojo.isString(idx)&&idx.indexOf("/")){
+idx=idx.split("/");
+_68=true;
+}
+if(_68&&idx.length==1){
+idx=idx[0];
+_68=false;
+}
+if(!_68){
+return dojox.grid.DataGrid.prototype.getItem.call(this,idx);
+}
+var s=this.store;
+var itm=dojox.grid.DataGrid.prototype.getItem.call(this,idx[0]);
+var cf;
+if(this.aggregator){
+cf=this.aggregator.childFields||[];
+}else{
+if(this.treeModel){
+cf=this.treeModel.childrenAttrs||[];
+}
+}
+if(cf){
+for(var i=0;i<idx.length-1&&itm;i++){
+if(cf[i]){
+itm=(s.getValues(itm,cf[i])||[])[idx[i+1]];
+}else{
+itm=null;
+}
+}
+}
+return itm||null;
+},_getItemIndex:function(_69,_6a){
+if(!_6a&&!this.store.isItem(_69)){
+return -1;
+}
+var idx=this.inherited(arguments);
+if(idx==-1){
+var _6b=this.store.getIdentity(_69);
+return this._by_idty_paths[_6b]||-1;
+}
+return idx;
+},postMixInProperties:function(){
+if(this.treeModel&&!("defaultOpen" in this.params)){
+this.defaultOpen=false;
+}
+var def=this.defaultOpen;
+this.openAtLevels=dojo.map(this.openAtLevels,function(l){
+if(typeof l=="string"){
+switch(l.toLowerCase()){
+case "true":
+return true;
+break;
+case "false":
+return false;
+break;
+default:
+var r=parseInt(l,10);
+if(isNaN(r)){
+return def;
+}
+return r;
+break;
+}
+}
+return l;
+});
+this._by_idty_paths={};
+this.inherited(arguments);
+},postCreate:function(){
+this.inherited(arguments);
+if(this.treeModel){
+this._setModel(this.treeModel);
+}
+},setModel:function(_6c){
+this._setModel(_6c);
+this._refresh(true);
+},_setModel:function(_6d){
+if(_6d&&(!dijit.tree.ForestStoreModel||!(_6d instanceof dijit.tree.ForestStoreModel))){
+throw new Error("dojox.grid.TreeGrid: treeModel must be an instance of dijit.tree.ForestStoreModel");
+}
+this.treeModel=_6d;
+dojo.toggleClass(this.domNode,"dojoxGridTreeModel",this.treeModel?true:false);
+this._setQuery(_6d?_6d.query:null);
+this._setStore(_6d?_6d.store:null);
+},createScroller:function(){
+this.inherited(arguments);
+this.scroller._origDefaultRowHeight=this.scroller.defaultRowHeight;
+},createManagers:function(){
+this.rows=new dojox.grid._RowManager(this);
+this.focus=new dojox.grid._TreeFocusManager(this);
+this.edit=new dojox.grid._EditManager(this);
+},_setStore:function(_6e){
+this.inherited(arguments);
+if(this.treeModel&&!this.treeModel.root.children){
+this.treeModel.root.children=[];
+}
+if(this.aggregator){
+this.aggregator.store=_6e;
+}
+},getDefaultOpenState:function(_6f,_70){
+var cf;
+var _71=this.store;
+if(this.treeModel){
+return this.defaultOpen;
+}
+if(!_6f||!_71||!_71.isItem(_70)||!(cf=this.aggregator.childFields[_6f.level])){
+return this.defaultOpen;
+}
+if(this.openAtLevels.length>_6f.level){
+var _72=this.openAtLevels[_6f.level];
+if(typeof _72=="boolean"){
+return _72;
+}else{
+if(typeof _72=="number"){
+return (_71.getValues(_70,cf).length<=_72);
+}
+}
+}
+return this.defaultOpen;
+},onStyleRow:function(row){
+if(!this.layout._isCollapsable){
+this.inherited(arguments);
+return;
+}
+var _73=dojo.attr(row.node,"dojoxTreeGridBaseClasses");
+if(_73){
+row.customClasses=_73;
+}
+var i=row;
+var _74=i.node.tagName.toLowerCase();
+i.customClasses+=(i.odd?" dojoxGridRowOdd":"")+(i.selected&&_74=="tr"?" dojoxGridRowSelected":"")+(i.over&&_74=="tr"?" dojoxGridRowOver":"");
+this.focus.styleRow(i);
+this.edit.styleRow(i);
+},styleRowNode:function(_75,_76){
+if(_76){
+if(_76.tagName.toLowerCase()=="div"&&this.aggregator){
+dojo.query("tr[dojoxTreeGridPath]",_76).forEach(function(_77){
+this.rows.styleRowNode(dojo.attr(_77,"dojoxTreeGridPath"),_77);
+},this);
+}
+this.rows.styleRowNode(_75,_76);
+}
+},onCanSelect:function(_78){
+var _79=dojo.query("tr[dojoxTreeGridPath='"+_78+"']",this.domNode);
+if(_79.length){
+if(dojo.hasClass(_79[0],"dojoxGridSummaryRow")){
+return false;
+}
+}
+return this.inherited(arguments);
+},onKeyDown:function(e){
+if(e.altKey||e.metaKey){
+return;
+}
+var dk=dojo.keys;
+switch(e.keyCode){
+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:
+var _7a=new dojox.grid.TreePath(this.focus.rowIndex,this);
+var _7b=new dojox.grid.TreePath(this.rowCount-1,this);
+_7b=_7b.lastChild(true);
+if(!this.edit.isEditing()&&_7a.toString()!=_7b.toString()){
+dojo.stopEvent(e);
+this.focus.move(1,0);
+}
+break;
+default:
+this.inherited(arguments);
+break;
+}
+},canEdit:function(_7c,_7d){
+var _7e=_7c.getNode(_7d);
+return _7e&&this._canEdit;
+},doApplyCellEdit:function(_7f,_80,_81){
+var _82=this.getItem(_80);
+var _83=this.store.getValue(_82,_81);
+if(typeof _83=="number"){
+_7f=isNaN(_7f)?_7f:parseFloat(_7f);
+}else{
+if(typeof _83=="boolean"){
+_7f=_7f=="true"?true:_7f=="false"?false:_7f;
+}else{
+if(_83 instanceof Date){
+var _84=new Date(_7f);
+_7f=isNaN(_84.getTime())?_7f:_84;
+}
+}
+}
+this.store.setValue(_82,_81,_7f);
+this.onApplyCellEdit(_7f,_80,_81);
+}});
+dojox.grid.TreeGrid.markupFactory=function(_85,_86,_87,_88){
+var d=dojo;
+var _89=function(n){
+var w=d.attr(n,"width")||"auto";
+if((w!="auto")&&(w.slice(-2)!="em")&&(w.slice(-1)!="%")){
+w=parseInt(w,10)+"px";
+}
+return w;
+};
+var _8a=function(_8b){
+var _8c;
+if(_8b.nodeName.toLowerCase()=="table"&&d.query("> colgroup",_8b).length===0&&(_8c=d.query("> thead > tr",_8b)).length==1){
+var tr=_8c[0];
+return d.query("> th",_8c[0]).map(function(th){
+var _8d={type:d.trim(d.attr(th,"cellType")||""),field:d.trim(d.attr(th,"field")||"")};
+if(_8d.type){
+_8d.type=d.getObject(_8d.type);
+}
+var _8e=d.query("> table",th)[0];
+if(_8e){
+_8d.name="";
+_8d.children=_8a(_8e);
+if(d.hasAttr(th,"itemAggregates")){
+_8d.itemAggregates=d.map(d.attr(th,"itemAggregates").split(","),function(v){
+return d.trim(v);
+});
+}else{
+_8d.itemAggregates=[];
+}
+if(d.hasAttr(th,"aggregate")){
+_8d.aggregate=d.attr(th,"aggregate");
+}
+_8d.type=_8d.type||dojox.grid.cells.SubtableCell;
+}else{
+_8d.name=d.trim(d.attr(th,"name")||th.innerHTML);
+if(d.hasAttr(th,"width")){
+_8d.width=_89(th);
+}
+if(d.hasAttr(th,"relWidth")){
+_8d.relWidth=window.parseInt(d.attr(th,"relWidth"),10);
+}
+if(d.hasAttr(th,"hidden")){
+_8d.hidden=d.attr(th,"hidden")=="true";
+}
+_8d.field=_8d.field||_8d.name;
+dojox.grid.DataGrid.cell_markupFactory(_88,th,_8d);
+_8d.type=_8d.type||dojox.grid.cells.Cell;
+}
+if(_8d.type&&_8d.type.markupFactory){
+_8d.type.markupFactory(th,_8d);
+}
+return _8d;
+});
+}
+return [];
+};
+var _8f;
+if(!_85.structure){
+var row=_8a(_86);
+if(row.length){
+_85.structure=[{__span:Infinity,cells:[row]}];
+}
+}
+return dojox.grid.DataGrid.markupFactory(_85,_86,_87,_88);
+};
+}
diff --git a/dojox/grid/TreeSelection.js b/dojox/grid/TreeSelection.js
new file mode 100644
index 0000000..829a887
--- /dev/null
+++ b/dojox/grid/TreeSelection.js
@@ -0,0 +1,214 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid.TreeSelection"]){
+dojo._hasResource["dojox.grid.TreeSelection"]=true;
+dojo.provide("dojox.grid.TreeSelection");
+dojo.require("dojox.grid.DataSelection");
+dojo.declare("dojox.grid.TreeSelection",dojox.grid.DataSelection,{setMode:function(_1){
+this.selected={};
+this.sorted_sel=[];
+this.sorted_ltos={};
+this.sorted_stol={};
+dojox.grid.DataSelection.prototype.setMode.call(this,_1);
+},addToSelection:function(_2){
+if(this.mode=="none"){
+return;
+}
+var _3=null;
+if(typeof _2=="number"||typeof _2=="string"){
+_3=_2;
+}else{
+_3=this.grid.getItemIndex(_2);
+}
+if(this.selected[_3]){
+this.selectedIndex=_3;
+}else{
+if(this.onCanSelect(_3)!==false){
+this.selectedIndex=_3;
+var _4=dojo.query("tr[dojoxTreeGridPath='"+_3+"']",this.grid.domNode);
+if(_4.length){
+dojo.attr(_4[0],"aria-selected","true");
+}
+this._beginUpdate();
+this.selected[_3]=true;
+this._insertSortedSelection(_3);
+this.onSelected(_3);
+this._endUpdate();
+}
+}
+},deselect:function(_5){
+if(this.mode=="none"){
+return;
+}
+var _6=null;
+if(typeof _5=="number"||typeof _5=="string"){
+_6=_5;
+}else{
+_6=this.grid.getItemIndex(_5);
+}
+if(this.selectedIndex==_6){
+this.selectedIndex=-1;
+}
+if(this.selected[_6]){
+if(this.onCanDeselect(_6)===false){
+return;
+}
+var _7=dojo.query("tr[dojoxTreeGridPath='"+_6+"']",this.grid.domNode);
+if(_7.length){
+dojo.attr(_7[0],"aria-selected","false");
+}
+this._beginUpdate();
+delete this.selected[_6];
+this._removeSortedSelection(_6);
+this.onDeselected(_6);
+this._endUpdate();
+}
+},getSelected:function(){
+var _8=[];
+for(var i in this.selected){
+if(this.selected[i]){
+_8.push(this.grid.getItem(i));
+}
+}
+return _8;
+},getSelectedCount:function(){
+var c=0;
+for(var i in this.selected){
+if(this.selected[i]){
+c++;
+}
+}
+return c;
+},_bsearch:function(v){
+var o=this.sorted_sel;
+var h=o.length-1,l=0,m;
+while(l<=h){
+var _9=this._comparePaths(o[m=(l+h)>>1],v);
+if(_9<0){
+l=m+1;
+continue;
+}
+if(_9>0){
+h=m-1;
+continue;
+}
+return m;
+}
+return _9<0?m-_9:m;
+},_comparePaths:function(a,b){
+for(var i=0,l=(a.length<b.length?a.length:b.length);i<l;i++){
+if(a[i]<b[i]){
+return -1;
+}
+if(a[i]>b[i]){
+return 1;
+}
+}
+if(a.length<b.length){
+return -1;
+}
+if(a.length>b.length){
+return 1;
+}
+return 0;
+},_insertSortedSelection:function(_a){
+_a=String(_a);
+var s=this.sorted_sel;
+var sl=this.sorted_ltos;
+var ss=this.sorted_stol;
+var _b=_a.split("/");
+_b=dojo.map(_b,function(_c){
+return parseInt(_c,10);
+});
+sl[_b]=_a;
+ss[_a]=_b;
+if(s.length===0){
+s.push(_b);
+return;
+}
+if(s.length==1){
+var _d=this._comparePaths(s[0],_b);
+if(_d==1){
+s.unshift(_b);
+}else{
+s.push(_b);
+}
+return;
+}
+var _e=this._bsearch(_b);
+this.sorted_sel.splice(_e,0,_b);
+},_removeSortedSelection:function(_f){
+_f=String(_f);
+var s=this.sorted_sel;
+var sl=this.sorted_ltos;
+var ss=this.sorted_stol;
+if(s.length===0){
+return;
+}
+var _10=ss[_f];
+if(!_10){
+return;
+}
+var idx=this._bsearch(_10);
+if(idx>-1){
+delete sl[_10];
+delete ss[_f];
+s.splice(idx,1);
+}
+},getFirstSelected:function(){
+if(!this.sorted_sel.length||this.mode=="none"){
+return -1;
+}
+var _11=this.sorted_sel[0];
+if(!_11){
+return -1;
+}
+_11=this.sorted_ltos[_11];
+if(!_11){
+return -1;
+}
+return _11;
+},getNextSelected:function(_12){
+if(!this.sorted_sel.length||this.mode=="none"){
+return -1;
+}
+_12=String(_12);
+var _13=this.sorted_stol[_12];
+if(!_13){
+return -1;
+}
+var idx=this._bsearch(_13);
+var _14=this.sorted_sel[idx+1];
+if(!_14){
+return -1;
+}
+return this.sorted_ltos[_14];
+},_range:function(_15,_16,_17){
+if(!dojo.isString(_15)&&_15<0){
+_15=_16;
+}
+var _18=this.grid.layout.cells,_19=this.grid.store,_1a=this.grid;
+_15=new dojox.grid.TreePath(String(_15),_1a);
+_16=new dojox.grid.TreePath(String(_16),_1a);
+if(_15.compare(_16)>0){
+var tmp=_15;
+_15=_16;
+_16=tmp;
+}
+var _1b=_15._str,_1c=_16._str;
+_17(_1b);
+var p=_15;
+while((p=p.next())){
+if(p._str==_1c){
+break;
+}
+_17(p._str);
+}
+_17(_1c);
+}});
+}
diff --git a/dojox/grid/VirtualGrid.js b/dojox/grid/VirtualGrid.js
deleted file mode 100644
index 4793a3e..0000000
--- a/dojox/grid/VirtualGrid.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.VirtualGrid"]){
-dojo._hasResource["dojox.grid.VirtualGrid"]=true;
-dojo.provide("dojox.grid.VirtualGrid");
-dojo.require("dojox.grid.compat.VirtualGrid");
-dojo.deprecated("dojox.grid.VirtualGrid");
-}
diff --git a/dojox/grid/_Builder.js b/dojox/grid/_Builder.js
index 65df126..61f78be 100644
--- a/dojox/grid/_Builder.js
+++ b/dojox/grid/_Builder.js
@@ -12,94 +12,110 @@ dojo.require("dojox.grid.util");
 dojo.require("dojo.dnd.Moveable");
 (function(){
 var dg=dojox.grid;
-var _2=function(td){
+var _1=function(td){
 return td.cellIndex>=0?td.cellIndex:dojo.indexOf(td.parentNode.cells,td);
 };
-var _4=function(tr){
+var _2=function(tr){
 return tr.rowIndex>=0?tr.rowIndex:dojo.indexOf(tr.parentNode.childNodes,tr);
 };
-var _6=function(_7,_8){
-return _7&&((_7.rows||0)[_8]||_7.childNodes[_8]);
+var _3=function(_4,_5){
+return _4&&((_4.rows||0)[_5]||_4.childNodes[_5]);
 };
-var _9=function(_a){
-for(var n=_a;n&&n.tagName!="TABLE";n=n.parentNode){
+var _6=function(_7){
+for(var n=_7;n&&n.tagName!="TABLE";n=n.parentNode){
 }
 return n;
 };
-var _c=function(_d,_e){
-for(var n=_d;n&&_e(n);n=n.parentNode){
+var _8=function(_9,_a){
+for(var n=_9;n&&_a(n);n=n.parentNode){
 }
 return n;
 };
-var _10=function(_11){
-var _12=_11.toUpperCase();
-return function(_13){
-return _13.tagName!=_12;
+var _b=function(_c){
+var _d=_c.toUpperCase();
+return function(_e){
+return _e.tagName!=_d;
 };
 };
-var _14=dojox.grid.util.rowIndexTag;
-var _15=dojox.grid.util.gridViewTag;
-dg._Builder=dojo.extend(function(_16){
-if(_16){
-this.view=_16;
-this.grid=_16.grid;
-}
-},{view:null,_table:"<table class=\"dojoxGridRowTable\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" role=\""+(dojo.isFF<3?"wairole:":"")+"presentation\"",getTableArray:function(){
-var _17=[this._table];
+var _f=dojox.grid.util.rowIndexTag;
+var _10=dojox.grid.util.gridViewTag;
+dg._Builder=dojo.extend(function(_11){
+if(_11){
+this.view=_11;
+this.grid=_11.grid;
+}
+},{view:null,_table:"<table class=\"dojoxGridRowTable\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" role=\"presentation\"",getTableArray:function(){
+var _12=[this._table];
 if(this.view.viewWidth){
-_17.push([" style=\"width:",this.view.viewWidth,";\""].join(""));
+_12.push([" style=\"width:",this.view.viewWidth,";\""].join(""));
 }
-_17.push(">");
-return _17;
-},generateCellMarkup:function(_18,_19,_1a,_1b){
-var _1c=[],_1d;
-var _1e=dojo.isFF<3?"wairole:":"";
-if(_1b){
-var _1f=_18.index!=_18.grid.getSortIndex()?"":_18.grid.sortInfo>0?"aria-sort=\"ascending\"":"aria-sort=\"descending\"";
-_1d=["<th tabIndex=\"-1\" role=\"",_1e,"columnheader\"",_1f];
+_12.push(">");
+return _12;
+},generateCellMarkup:function(_13,_14,_15,_16){
+var _17=[],_18;
+if(_16){
+var _19=_13.index!=_13.grid.getSortIndex()?"":_13.grid.sortInfo>0?"aria-sort=\"ascending\"":"aria-sort=\"descending\"";
+if(!_13.id){
+_13.id=this.grid.id+"Hdr"+_13.index;
+}
+_18=["<th tabIndex=\"-1\" aria-readonly=\"true\" role=\"columnheader\"",_19,"id=\"",_13.id,"\""];
 }else{
-_1d=["<td tabIndex=\"-1\" role=\"",_1e,"gridcell\""];
-}
-_18.colSpan&&_1d.push(" colspan=\"",_18.colSpan,"\"");
-_18.rowSpan&&_1d.push(" rowspan=\"",_18.rowSpan,"\"");
-_1d.push(" class=\"dojoxGridCell ");
-_18.classes&&_1d.push(_18.classes," ");
-_1a&&_1d.push(_1a," ");
-_1c.push(_1d.join(""));
-_1c.push("");
-_1d=["\" idx=\"",_18.index,"\" style=\""];
-if(_19&&_19[_19.length-1]!=";"){
-_19+=";";
-}
-_1d.push(_18.styles,_19||"",_18.hidden?"display:none;":"");
-_18.unitWidth&&_1d.push("width:",_18.unitWidth,";");
-_1c.push(_1d.join(""));
-_1c.push("");
-_1d=["\""];
-_18.attrs&&_1d.push(" ",_18.attrs);
-_1d.push(">");
-_1c.push(_1d.join(""));
-_1c.push("");
-_1c.push(_1b?"</th>":"</td>");
-return _1c;
-},isCellNode:function(_20){
-return Boolean(_20&&_20!=dojo.doc&&dojo.attr(_20,"idx"));
-},getCellNodeIndex:function(_21){
-return _21?Number(dojo.attr(_21,"idx")):-1;
-},getCellNode:function(_22,_23){
-for(var i=0,row;row=_6(_22.firstChild,i);i++){
-for(var j=0,_27;_27=row.cells[j];j++){
-if(this.getCellNodeIndex(_27)==_23){
-return _27;
-}
-}
-}
-},findCellTarget:function(_28,_29){
-var n=_28;
-while(n&&(!this.isCellNode(n)||(n.offsetParent&&_15 in n.offsetParent.parentNode&&n.offsetParent.parentNode[_15]!=this.view.id))&&(n!=_29)){
+var _1a=this.grid.editable&&!_13.editable?"aria-readonly=\"true\"":"";
+_18=["<td tabIndex=\"-1\" role=\"gridcell\"",_1a];
+}
+if(_13.colSpan){
+_18.push(" colspan=\"",_13.colSpan,"\"");
+}
+if(_13.rowSpan){
+_18.push(" rowspan=\"",_13.rowSpan,"\"");
+}
+_18.push(" class=\"dojoxGridCell ");
+if(_13.classes){
+_18.push(_13.classes," ");
+}
+if(_15){
+_18.push(_15," ");
+}
+_17.push(_18.join(""));
+_17.push("");
+_18=["\" idx=\"",_13.index,"\" style=\""];
+if(_14&&_14[_14.length-1]!=";"){
+_14+=";";
+}
+_18.push(_13.styles,_14||"",_13.hidden?"display:none;":"");
+if(_13.unitWidth){
+_18.push("width:",_13.unitWidth,";");
+}
+_17.push(_18.join(""));
+_17.push("");
+_18=["\""];
+if(_13.attrs){
+_18.push(" ",_13.attrs);
+}
+_18.push(">");
+_17.push(_18.join(""));
+_17.push("");
+_17.push(_16?"</th>":"</td>");
+return _17;
+},isCellNode:function(_1b){
+return Boolean(_1b&&_1b!=dojo.doc&&dojo.attr(_1b,"idx"));
+},getCellNodeIndex:function(_1c){
+return _1c?Number(dojo.attr(_1c,"idx")):-1;
+},getCellNode:function(_1d,_1e){
+for(var i=0,row;(row=_3(_1d.firstChild,i));i++){
+for(var j=0,_1f;(_1f=row.cells[j]);j++){
+if(this.getCellNodeIndex(_1f)==_1e){
+return _1f;
+}
+}
+}
+return null;
+},findCellTarget:function(_20,_21){
+var n=_20;
+while(n&&(!this.isCellNode(n)||(n.offsetParent&&_10 in n.offsetParent.parentNode&&n.offsetParent.parentNode[_10]!=this.view.id))&&(n!=_21)){
 n=n.parentNode;
 }
-return n!=_29?n:null;
+return n!=_21?n:null;
 },baseDecorateEvent:function(e){
 e.dispatch="do"+e.type;
 e.grid=this.grid;
@@ -107,14 +123,14 @@ 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);
-},findTarget:function(_2c,_2d){
-var n=_2c;
-while(n&&(n!=this.domNode)&&(!(_2d in n)||(_15 in n&&n[_15]!=this.view.id))){
+},findTarget:function(_22,_23){
+var n=_22;
+while(n&&(n!=this.domNode)&&(!(_23 in n)||(_10 in n&&n[_10]!=this.view.id))){
 n=n.parentNode;
 }
 return (n!=this.domNode)?n:null;
-},findRowTarget:function(_2f){
-return this.findTarget(_2f,_14);
+},findRowTarget:function(_24){
+return this.findTarget(_24,_f);
 },isIntraNodeEvent:function(e){
 try{
 return (e.cellNode&&e.relatedTarget&&dojo.isDescendant(e.relatedTarget,e.cellNode));
@@ -134,6 +150,7 @@ return false;
 if(e.dispatch in this){
 return this[e.dispatch](e);
 }
+return false;
 },domouseover:function(e){
 if(e.cellNode&&(e.cellNode!=this.lastOverCellNode)){
 this.lastOverCellNode=e.cellNode;
@@ -154,104 +171,111 @@ this.grid.onMouseDown(e);
 }
 this.grid.onMouseDownRow(e);
 }});
-dg._ContentBuilder=dojo.extend(function(_37){
-dg._Builder.call(this,_37);
+dg._ContentBuilder=dojo.extend(function(_25){
+dg._Builder.call(this,_25);
 },dg._Builder.prototype,{update:function(){
 this.prepareHtml();
 },prepareHtml:function(){
-var _38=this.grid.get,_39=this.view.structure.cells;
-for(var j=0,row;(row=_39[j]);j++){
-for(var i=0,_3d;(_3d=row[i]);i++){
-_3d.get=_3d.get||(_3d.value==undefined)&&_38;
-_3d.markup=this.generateCellMarkup(_3d,_3d.cellStyles,_3d.cellClasses,false);
+var _26=this.grid.get,_27=this.view.structure.cells;
+for(var j=0,row;(row=_27[j]);j++){
+for(var i=0,_28;(_28=row[i]);i++){
+_28.get=_28.get||(_28.value==undefined)&&_26;
+_28.markup=this.generateCellMarkup(_28,_28.cellStyles,_28.cellClasses,false);
+if(!this.grid.editable&&_28.editable){
+this.grid.editable=true;
+}
 }
 }
-},generateHtml:function(_3e,_3f){
-var _40=this.getTableArray(),v=this.view,_42=v.structure.cells,_43=this.grid.getItem(_3f);
-dojox.grid.util.fire(this.view,"onBeforeRow",[_3f,_42]);
-for(var j=0,row;(row=_42[j]);j++){
+},generateHtml:function(_29,_2a){
+var _2b=this.getTableArray(),v=this.view,_2c=v.structure.cells,_2d=this.grid.getItem(_2a);
+dojox.grid.util.fire(this.view,"onBeforeRow",[_2a,_2c]);
+for(var j=0,row;(row=_2c[j]);j++){
 if(row.hidden||row.header){
 continue;
 }
-_40.push(!row.invisible?"<tr>":"<tr class=\"dojoxGridInvisible\">");
-for(var i=0,_47,m,cc,cs;(_47=row[i]);i++){
-m=_47.markup,cc=_47.customClasses=[],cs=_47.customStyles=[];
-m[5]=_47.format(_3f,_43);
+_2b.push(!row.invisible?"<tr>":"<tr class=\"dojoxGridInvisible\">");
+for(var i=0,_2e,m,cc,cs;(_2e=row[i]);i++){
+m=_2e.markup;
+cc=_2e.customClasses=[];
+cs=_2e.customStyles=[];
+m[5]=_2e.format(_2a,_2d);
 m[1]=cc.join(" ");
 m[3]=cs.join(";");
-_40.push.apply(_40,m);
+_2b.push.apply(_2b,m);
 }
-_40.push("</tr>");
+_2b.push("</tr>");
 }
-_40.push("</table>");
-return _40.join("");
+_2b.push("</table>");
+return _2b.join("");
 },decorateEvent:function(e){
 e.rowNode=this.findRowTarget(e.target);
 if(!e.rowNode){
 return false;
 }
-e.rowIndex=e.rowNode[_14];
+e.rowIndex=e.rowNode[_f];
 this.baseDecorateEvent(e);
 e.cell=this.grid.getCell(e.cellIndex);
 return true;
 }});
-dg._HeaderBuilder=dojo.extend(function(_4c){
+dg._HeaderBuilder=dojo.extend(function(_2f){
 this.moveable=null;
-dg._Builder.call(this,_4c);
+dg._Builder.call(this,_2f);
 },dg._Builder.prototype,{_skipBogusClicks:false,overResizeWidth:4,minColWidth:1,update:function(){
 if(this.tableMap){
 this.tableMap.mapRows(this.view.structure.cells);
 }else{
 this.tableMap=new dg._TableMap(this.view.structure.cells);
 }
-},generateHtml:function(_4d,_4e){
-var _4f=this.getTableArray(),_50=this.view.structure.cells;
-dojox.grid.util.fire(this.view,"onBeforeRow",[-1,_50]);
-for(var j=0,row;(row=_50[j]);j++){
+},generateHtml:function(_30,_31){
+var _32=this.getTableArray(),_33=this.view.structure.cells;
+dojox.grid.util.fire(this.view,"onBeforeRow",[-1,_33]);
+for(var j=0,row;(row=_33[j]);j++){
 if(row.hidden){
 continue;
 }
-_4f.push(!row.invisible?"<tr>":"<tr class=\"dojoxGridInvisible\">");
-for(var i=0,_54,_55;(_54=row[i]);i++){
-_54.customClasses=[];
-_54.customStyles=[];
+_32.push(!row.invisible?"<tr>":"<tr class=\"dojoxGridInvisible\">");
+for(var i=0,_34,_35;(_34=row[i]);i++){
+_34.customClasses=[];
+_34.customStyles=[];
 if(this.view.simpleStructure){
-if(_54.headerClasses){
-if(_54.headerClasses.indexOf("dojoDndItem")==-1){
-_54.headerClasses+=" dojoDndItem";
+if(_34.draggable){
+if(_34.headerClasses){
+if(_34.headerClasses.indexOf("dojoDndItem")==-1){
+_34.headerClasses+=" dojoDndItem";
 }
 }else{
-_54.headerClasses="dojoDndItem";
+_34.headerClasses="dojoDndItem";
 }
-if(_54.attrs){
-if(_54.attrs.indexOf("dndType='gridColumn_")==-1){
-_54.attrs+=" dndType='gridColumn_"+this.grid.id+"'";
+}
+if(_34.attrs){
+if(_34.attrs.indexOf("dndType='gridColumn_")==-1){
+_34.attrs+=" dndType='gridColumn_"+this.grid.id+"'";
 }
 }else{
-_54.attrs="dndType='gridColumn_"+this.grid.id+"'";
+_34.attrs="dndType='gridColumn_"+this.grid.id+"'";
 }
 }
-_55=this.generateCellMarkup(_54,_54.headerStyles,_54.headerClasses,true);
-_55[5]=(_4e!=undefined?_4e:_4d(_54));
-_55[3]=_54.customStyles.join(";");
-_55[1]=_54.customClasses.join(" ");
-_4f.push(_55.join(""));
+_35=this.generateCellMarkup(_34,_34.headerStyles,_34.headerClasses,true);
+_35[5]=(_31!=undefined?_31:_30(_34));
+_35[3]=_34.customStyles.join(";");
+_35[1]=_34.customClasses.join(" ");
+_32.push(_35.join(""));
 }
-_4f.push("</tr>");
+_32.push("</tr>");
 }
-_4f.push("</table>");
-return _4f.join("");
+_32.push("</table>");
+return _32.join("");
 },getCellX:function(e){
-var x=e.layerX;
+var n,x=e.layerX;
 if(dojo.isMoz){
-var n=_c(e.target,_10("th"));
+n=_8(e.target,_b("th"));
 x-=(n&&n.offsetLeft)||0;
 var t=e.sourceView.getScrollbarWidth();
 if(!dojo._isBodyLtr()&&e.sourceView.headerNode.scrollLeft<t){
 x-=t;
 }
 }
-var n=_c(e.target,function(){
+n=_8(e.target,function(){
 if(!n||n==e.cellNode){
 return false;
 }
@@ -266,7 +290,7 @@ e.cellX=this.getCellX(e);
 return true;
 },prepareResize:function(e,mod){
 do{
-var i=_2(e.cellNode);
+var i=_1(e.cellNode);
 e.cellNode=(i?e.cellNode.parentNode.cells[i+mod]:null);
 e.cellIndex=(e.cellNode?this.getCellNodeIndex(e.cellNode):-1);
 }while(e.cellNode&&e.cellNode.style.display=="none");
@@ -275,9 +299,12 @@ return Boolean(e.cellNode);
 if(!e.cellNode||e.cellNode.colSpan>1){
 return false;
 }
-var _5f=this.grid.getCell(e.cellIndex);
-return !_5f.noresize&&_5f.canResize();
+var _36=this.grid.getCell(e.cellIndex);
+return !_36.noresize&&_36.canResize();
 },overLeftResizeArea:function(e){
+if(dojo.hasClass(dojo.body(),"dojoDndMove")){
+return false;
+}
 if(dojo.isIE){
 var tN=e.target;
 if(dojo.hasClass(tN,"dojoxGridArrowButtonNode")||dojo.hasClass(tN,"dojoxGridArrowButtonChar")){
@@ -290,6 +317,9 @@ return (e.cellIndex>0)&&(e.cellX<this.overResizeWidth)&&this.prepareResize(e,-1)
 var t=e.cellNode&&(e.cellX<this.overResizeWidth);
 return t;
 },overRightResizeArea:function(e){
+if(dojo.hasClass(dojo.body(),"dojoDndMove")){
+return false;
+}
 if(dojo.isIE){
 var tN=e.target;
 if(dojo.hasClass(tN,"dojoxGridArrowButtonNode")||dojo.hasClass(tN,"dojoxGridArrowButtonChar")){
@@ -302,16 +332,15 @@ 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){
 if(!this.moveable){
-var c=(this.overRightResizeArea(e)?"e-resize":(this.overLeftResizeArea(e)?"w-resize":""));
+var c=(this.overRightResizeArea(e)?"dojoxGridColResize":(this.overLeftResizeArea(e)?"dojoxGridColResize":""));
 if(c&&!this.canResize(e)){
-c="not-allowed";
+c="dojoxGridColNoResize";
 }
+dojo.toggleClass(e.sourceView.headerNode,"dojoxGridColNoResize",(c=="dojoxGridColNoResize"));
+dojo.toggleClass(e.sourceView.headerNode,"dojoxGridColResize",(c=="dojoxGridColResize"));
 if(dojo.isIE){
 var t=e.sourceView.headerNode.scrollLeft;
-e.sourceView.headerNode.style.cursor=c||"";
 e.sourceView.headerNode.scrollLeft=t;
-}else{
-e.sourceView.headerNode.style.cursor=c||"";
 }
 if(c){
 dojo.stopEvent(e);
@@ -331,139 +360,172 @@ if(this._skipBogusClicks){
 dojo.stopEvent(e);
 return true;
 }
+return false;
+},colResizeSetup:function(e,_37){
+var _38=dojo.contentBox(e.sourceView.headerNode);
+if(_37){
+this.lineDiv=document.createElement("div");
+var vw=(dojo.position||dojo._abs)(e.sourceView.headerNode,true);
+var _39=dojo.contentBox(e.sourceView.domNode);
+dojo.style(this.lineDiv,{top:vw.y+"px",left:e.clientX+"px",height:(_39.h+_38.h)+"px"});
+dojo.addClass(this.lineDiv,"dojoxGridResizeColLine");
+this.lineDiv._origLeft=e.clientX;
+dojo.body().appendChild(this.lineDiv);
+}
+var _3a=[],_3b=this.tableMap.findOverlappingNodes(e.cellNode);
+for(var i=0,_3c;(_3c=_3b[i]);i++){
+_3a.push({node:_3c,index:this.getCellNodeIndex(_3c),width:_3c.offsetWidth});
+}
+var _3d=e.sourceView;
+var adj=dojo._isBodyLtr()?1:-1;
+var _3e=e.grid.views.views;
+var _3f=[];
+for(var j=_3d.idx+adj,_40;(_40=_3e[j]);j=j+adj){
+_3f.push({node:_40.headerNode,left:window.parseInt(_40.headerNode.style.left)});
+}
+var _41=_3d.headerContentNode.firstChild;
+var _42={scrollLeft:e.sourceView.headerNode.scrollLeft,view:_3d,node:e.cellNode,index:e.cellIndex,w:dojo.contentBox(e.cellNode).w,vw:_38.w,table:_41,tw:dojo.contentBox(_41).w,spanners:_3a,followers:_3f};
+return _42;
 },beginColumnResize:function(e){
 this.moverDiv=document.createElement("div");
 dojo.style(this.moverDiv,{position:"absolute",left:0});
 dojo.body().appendChild(this.moverDiv);
-var m=this.moveable=new dojo.dnd.Moveable(this.moverDiv);
-var _6c=[],_6d=this.tableMap.findOverlappingNodes(e.cellNode);
-for(var i=0,_6f;(_6f=_6d[i]);i++){
-_6c.push({node:_6f,index:this.getCellNodeIndex(_6f),width:_6f.offsetWidth});
-}
-var _70=e.sourceView;
-var adj=dojo._isBodyLtr()?1:-1;
-var _72=e.grid.views.views;
-var _73=[];
-for(var i=_70.idx+adj,_74;(_74=_72[i]);i=i+adj){
-_73.push({node:_74.headerNode,left:window.parseInt(_74.headerNode.style.left)});
-}
-var _75=_70.headerContentNode.firstChild;
-var _76={scrollLeft:e.sourceView.headerNode.scrollLeft,view:_70,node:e.cellNode,index:e.cellIndex,w:dojo.contentBox(e.cellNode).w,vw:dojo.contentBox(_70.headerNode).w,table:_75,tw:dojo.contentBox(_75).w,spanners:_6c,followers:_73};
-m.onMove=dojo.hitch(this,"doResizeColumn",_76);
+dojo.addClass(this.grid.domNode,"dojoxGridColumnResizing");
+var m=(this.moveable=new dojo.dnd.Moveable(this.moverDiv));
+var _43=this.colResizeSetup(e,true);
+m.onMove=dojo.hitch(this,"doResizeColumn",_43);
 dojo.connect(m,"onMoveStop",dojo.hitch(this,function(){
-this.endResizeColumn(_76);
-if(_76.node.releaseCapture){
-_76.node.releaseCapture();
+this.endResizeColumn(_43);
+if(_43.node.releaseCapture){
+_43.node.releaseCapture();
 }
 this.moveable.destroy();
 delete this.moveable;
 this.moveable=null;
+dojo.removeClass(this.grid.domNode,"dojoxGridColumnResizing");
 }));
-_70.convertColPctToFixed();
 if(e.cellNode.setCapture){
 e.cellNode.setCapture();
 }
 m.onMouseDown(e);
-},doResizeColumn:function(_77,_78,_79){
-var _7a=dojo._isBodyLtr();
-var _7b=_7a?_79.l:-_79.l;
-var w=_77.w+_7b;
-var vw=_77.vw+_7b;
-var tw=_77.tw+_7b;
-if(w>=this.minColWidth){
-for(var i=0,s,sw;(s=_77.spanners[i]);i++){
-sw=s.width+_7b;
-s.node.style.width=sw+"px";
-_77.view.setColWidth(s.index,sw);
-}
-for(var i=0,f,fl;(f=_77.followers[i]);i++){
-fl=f.left+_7b;
-f.node.style.left=fl+"px";
+},doResizeColumn:function(_44,_45,_46){
+var _47=_46.l;
+var _48={deltaX:_47,w:_44.w+_47,vw:_44.vw+_47,tw:_44.tw+_47};
+this.dragRecord={inDrag:_44,mover:_45,leftTop:_46};
+if(_48.w>=this.minColWidth){
+if(!_45){
+this.doResizeNow(_44,_48);
+}else{
+dojo.style(this.lineDiv,"left",(this.lineDiv._origLeft+_48.deltaX)+"px");
 }
-_77.node.style.width=w+"px";
-_77.view.setColWidth(_77.index,w);
-_77.view.headerNode.style.width=vw+"px";
-_77.view.setColumnsWidth(tw);
-if(!_7a){
-_77.view.headerNode.scrollLeft=_77.scrollLeft+_7b;
 }
+},endResizeColumn:function(_49){
+if(this.dragRecord){
+var _4a=this.dragRecord.leftTop;
+var _4b=dojo._isBodyLtr()?_4a.l:-_4a.l;
+_4b+=Math.max(_49.w+_4b,this.minColWidth)-(_49.w+_4b);
+if(dojo.isWebKit&&_49.spanners.length){
+_4b+=dojo._getPadBorderExtents(_49.spanners[0].node).w;
 }
-if(_77.view.flexCells&&!_77.view.testFlexCells()){
-var t=_9(_77.node);
-t&&(t.style.width="");
+var _4c={deltaX:_4b,w:_49.w+_4b,vw:_49.vw+_4b,tw:_49.tw+_4b};
+this.doResizeNow(_49,_4c);
 }
-},endResizeColumn:function(_85){
+dojo.destroy(this.lineDiv);
+dojo.destroy(this.moverDiv);
 dojo.destroy(this.moverDiv);
 delete this.moverDiv;
 this._skipBogusClicks=true;
-var _86=dojo.connect(_85.view,"update",this,function(){
-dojo.disconnect(_86);
+_49.view.update();
 this._skipBogusClicks=false;
-});
-setTimeout(dojo.hitch(_85.view,"update"),50);
+this.grid.onResizeColumn(_49.index);
+},doResizeNow:function(_4d,_4e){
+_4d.view.convertColPctToFixed();
+if(_4d.view.flexCells&&!_4d.view.testFlexCells()){
+var t=_6(_4d.node);
+if(t){
+(t.style.width="");
+}
+}
+var i,s,sw,f,fl;
+for(i=0;(s=_4d.spanners[i]);i++){
+sw=s.width+_4e.deltaX;
+s.node.style.width=sw+"px";
+_4d.view.setColWidth(s.index,sw);
+}
+for(i=0;(f=_4d.followers[i]);i++){
+fl=f.left+_4e.deltaX;
+f.node.style.left=fl+"px";
+}
+_4d.node.style.width=_4e.w+"px";
+_4d.view.setColWidth(_4d.index,_4e.w);
+_4d.view.headerNode.style.width=_4e.vw+"px";
+_4d.view.setColumnsWidth(_4e.tw);
+if(!dojo._isBodyLtr()){
+_4d.view.headerNode.scrollLeft=_4d.scrollLeft+_4e.deltaX;
+}
 }});
-dg._TableMap=dojo.extend(function(_87){
-this.mapRows(_87);
-},{map:null,mapRows:function(_88){
-var _89=_88.length;
-if(!_89){
+dg._TableMap=dojo.extend(function(_4f){
+this.mapRows(_4f);
+},{map:null,mapRows:function(_50){
+var _51=_50.length;
+if(!_51){
 return;
 }
 this.map=[];
-for(var j=0,row;(row=_88[j]);j++){
-this.map[j]=[];
+var row;
+for(var k=0;(row=_50[k]);k++){
+this.map[k]=[];
 }
-for(var j=0,row;(row=_88[j]);j++){
-for(var i=0,x=0,_8e,_8f,_90;(_8e=row[i]);i++){
+for(var j=0;(row=_50[j]);j++){
+for(var i=0,x=0,_52,_53,_54;(_52=row[i]);i++){
 while(this.map[j][x]){
 x++;
 }
 this.map[j][x]={c:i,r:j};
-_90=_8e.rowSpan||1;
-_8f=_8e.colSpan||1;
-for(var y=0;y<_90;y++){
-for(var s=0;s<_8f;s++){
+_54=_52.rowSpan||1;
+_53=_52.colSpan||1;
+for(var y=0;y<_54;y++){
+for(var s=0;s<_53;s++){
 this.map[j+y][x+s]=this.map[j][x];
 }
 }
-x+=_8f;
+x+=_53;
 }
 }
 },dumpMap:function(){
 for(var j=0,row,h="";(row=this.map[j]);j++,h=""){
-for(var i=0,_97;(_97=row[i]);i++){
-h+=_97.r+","+_97.c+"   ";
+for(var i=0,_55;(_55=row[i]);i++){
+h+=_55.r+","+_55.c+"   ";
 }
 }
-},getMapCoords:function(_98,_99){
+},getMapCoords:function(_56,_57){
 for(var j=0,row;(row=this.map[j]);j++){
-for(var i=0,_9d;(_9d=row[i]);i++){
-if(_9d.c==_99&&_9d.r==_98){
+for(var i=0,_58;(_58=row[i]);i++){
+if(_58.c==_57&&_58.r==_56){
 return {j:j,i:i};
 }
 }
 }
 return {j:-1,i:-1};
-},getNode:function(_9e,_9f,_a0){
-var row=_9e&&_9e.rows[_9f];
-return row&&row.cells[_a0];
-},_findOverlappingNodes:function(_a2,_a3,_a4){
-var _a5=[];
-var m=this.getMapCoords(_a3,_a4);
-var row=this.map[m.j];
+},getNode:function(_59,_5a,_5b){
+var row=_59&&_59.rows[_5a];
+return row&&row.cells[_5b];
+},_findOverlappingNodes:function(_5c,_5d,_5e){
+var _5f=[];
+var m=this.getMapCoords(_5d,_5e);
 for(var j=0,row;(row=this.map[j]);j++){
 if(j==m.j){
 continue;
 }
 var rw=row[m.i];
-var n=(rw?this.getNode(_a2,rw.r,rw.c):null);
+var n=(rw?this.getNode(_5c,rw.r,rw.c):null);
 if(n){
-_a5.push(n);
+_5f.push(n);
 }
 }
-return _a5;
-},findOverlappingNodes:function(_ab){
-return this._findOverlappingNodes(_9(_ab),_4(_ab.parentNode),_2(_ab));
+return _5f;
+},findOverlappingNodes:function(_60){
+return this._findOverlappingNodes(_6(_60),_2(_60.parentNode),_1(_60));
 }});
 })();
 }
diff --git a/dojox/grid/_CheckBoxSelector.js b/dojox/grid/_CheckBoxSelector.js
new file mode 100644
index 0000000..d37e6ae
--- /dev/null
+++ b/dojox/grid/_CheckBoxSelector.js
@@ -0,0 +1,12 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid._CheckBoxSelector"]){
+dojo._hasResource["dojox.grid._CheckBoxSelector"]=true;
+dojo.provide("dojox.grid._CheckBoxSelector");
+dojo.require("dojox.grid._Selector");
+}
diff --git a/dojox/grid/_EditManager.js b/dojox/grid/_EditManager.js
index 632bcda..356b2fc 100644
--- a/dojox/grid/_EditManager.js
+++ b/dojox/grid/_EditManager.js
@@ -30,25 +30,25 @@ this._focusEditor(_2,_3);
 if(this.isEditing()&&!this.isEditRow(e.rowIndex)){
 this.apply();
 }
-},styleRow:function(_5){
-if(_5.index==this.info.rowIndex){
-_5.customClasses+=" dojoxGridRowEditing";
+},styleRow:function(_4){
+if(_4.index==this.info.rowIndex){
+_4.customClasses+=" dojoxGridRowEditing";
 }
 },dispatchEvent:function(e){
 var c=e.cell,ed=(c&&c["editable"])?c:0;
 return ed&&ed.dispatchEvent(e.dispatch,e);
 },isEditing:function(){
 return this.info.rowIndex!==undefined;
-},isEditCell:function(_9,_a){
-return (this.info.rowIndex===_9)&&(this.info.cell.index==_a);
-},isEditRow:function(_b){
-return this.info.rowIndex===_b;
-},setEditCell:function(_c,_d){
-if(!this.isEditCell(_d,_c.index)&&this.grid.canEdit&&this.grid.canEdit(_c,_d)){
-this.start(_c,_d,this.isEditRow(_d)||_c.editable);
-}
-},_focusEditor:function(_e,_f){
-dojox.grid.util.fire(_e,"focus",[_f]);
+},isEditCell:function(_5,_6){
+return (this.info.rowIndex===_5)&&(this.info.cell.index==_6);
+},isEditRow:function(_7){
+return this.info.rowIndex===_7;
+},setEditCell:function(_8,_9){
+if(!this.isEditCell(_9,_8.index)&&this.grid.canEdit&&this.grid.canEdit(_8,_9)){
+this.start(_8,_9,this.isEditRow(_9)||_8.editable);
+}
+},_focusEditor:function(_a,_b){
+dojox.grid.util.fire(_a,"focus",[_b]);
 },focusEditor:function(){
 if(this.isEditing()){
 this._focusEditor(this.info.cell,this.info.rowIndex);
@@ -65,34 +65,36 @@ this._catchBoomerang=0;
 if(dojo.isIE){
 this._catchBoomerang=new Date().getTime()+this._boomerangWindow;
 }
-},start:function(_10,_11,_12){
+},start:function(_c,_d,_e){
 this.grid.beginUpdate();
 this.editorApply();
-if(this.isEditing()&&!this.isEditRow(_11)){
+if(this.isEditing()&&!this.isEditRow(_d)){
 this.applyRowEdit();
-this.grid.updateRow(_11);
+this.grid.updateRow(_d);
 }
-if(_12){
-this.info={cell:_10,rowIndex:_11};
-this.grid.doStartEdit(_10,_11);
-this.grid.updateRow(_11);
+if(_e){
+this.info={cell:_c,rowIndex:_d};
+this.grid.doStartEdit(_c,_d);
+this.grid.updateRow(_d);
 }else{
 this.info={};
 }
 this.grid.endUpdate();
 this.grid.focus.focusGrid();
-this._focusEditor(_10,_11);
+this._focusEditor(_c,_d);
 this._doCatchBoomerang();
-},_editorDo:function(_13){
+},_editorDo:function(_f){
 var c=this.info.cell;
-c&&c.editable&&c[_13](this.info.rowIndex);
+if(c&&c.editable){
+c[_f](this.info.rowIndex);
+}
 },editorApply:function(){
 this._editorDo("apply");
 },editorCancel:function(){
 this._editorDo("cancel");
-},applyCellEdit:function(_15,_16,_17){
-if(this.grid.canEdit(_16,_17)){
-this.grid.doApplyCellEdit(_15,_17,_16.field);
+},applyCellEdit:function(_10,_11,_12){
+if(this.grid.canEdit(_11,_12)){
+this.grid.doApplyCellEdit(_10,_12,_11.field);
 }
 },applyRowEdit:function(){
 this.grid.doApplyEdit(this.info.rowIndex,this.info.cell.field);
@@ -115,14 +117,14 @@ this.grid.endUpdate();
 this.grid.focus.focusGrid();
 this._doCatchBoomerang();
 }
-},save:function(_18,_19){
+},save:function(_13,_14){
 var c=this.info.cell;
-if(this.isEditRow(_18)&&(!_19||c.view==_19)&&c.editable){
+if(this.isEditRow(_13)&&(!_14||c.view==_14)&&c.editable){
 c.save(c,this.info.rowIndex);
 }
-},restore:function(_1b,_1c){
+},restore:function(_15,_16){
 var c=this.info.cell;
-if(this.isEditRow(_1c)&&c.view==_1b&&c.editable){
+if(this.isEditRow(_16)&&c.view==_15&&c.editable){
 c.restore(c,this.info.rowIndex);
 }
 }});
diff --git a/dojox/grid/_Events.js b/dojox/grid/_Events.js
index ea2c26d..b6cdf4f 100644
--- a/dojox/grid/_Events.js
+++ b/dojox/grid/_Events.js
@@ -14,52 +14,53 @@ this.dispatchKeyEvent(e);
 this.dispatchContentEvent(e);
 },onHeaderEvent:function(e){
 this.dispatchHeaderEvent(e);
-},onStyleRow:function(_4){
-var i=_4;
+},onStyleRow:function(_1){
+var i=_1;
 i.customClasses+=(i.odd?" dojoxGridRowOdd":"")+(i.selected?" dojoxGridRowSelected":"")+(i.over?" dojoxGridRowOver":"");
-this.focus.styleRow(_4);
-this.edit.styleRow(_4);
+this.focus.styleRow(_1);
+this.edit.styleRow(_1);
 },onKeyDown:function(e){
 if(e.altKey||e.metaKey){
 return;
 }
 var dk=dojo.keys;
+var _2;
 switch(e.keyCode){
 case dk.ESCAPE:
 this.edit.cancel();
 break;
 case dk.ENTER:
 if(!this.edit.isEditing()){
-var _8=this.focus.getHeaderIndex();
-if(_8>=0){
-this.setSortIndex(_8);
+_2=this.focus.getHeaderIndex();
+if(_2>=0){
+this.setSortIndex(_2);
 break;
 }else{
-this.selection.clickSelect(this.focus.rowIndex,dojo.dnd.getCopyKeyState(e),e.shiftKey);
+this.selection.clickSelect(this.focus.rowIndex,dojo.isCopyKey(e),e.shiftKey);
 }
 dojo.stopEvent(e);
 }
 if(!e.shiftKey){
-var _9=this.edit.isEditing();
+var _3=this.edit.isEditing();
 this.edit.apply();
-if(!_9){
+if(!_3){
 this.edit.setEditCell(this.focus.cell,this.focus.rowIndex);
 }
 }
 if(!this.edit.isEditing()){
-var _a=this.focus.focusView||this.views.views[0];
-_a.content.decorateEvent(e);
+var _4=this.focus.focusView||this.views.views[0];
+_4.content.decorateEvent(e);
 this.onRowClick(e);
 }
 break;
 case dk.SPACE:
 if(!this.edit.isEditing()){
-var _8=this.focus.getHeaderIndex();
-if(_8>=0){
-this.setSortIndex(_8);
+_2=this.focus.getHeaderIndex();
+if(_2>=0){
+this.setSortIndex(_2);
 break;
 }else{
-this.selection.clickSelect(this.focus.rowIndex,dojo.dnd.getCopyKeyState(e),e.shiftKey);
+this.selection.clickSelect(this.focus.rowIndex,dojo.isCopyKey(e),e.shiftKey);
 }
 dojo.stopEvent(e);
 }
@@ -70,28 +71,34 @@ break;
 case dk.LEFT_ARROW:
 case dk.RIGHT_ARROW:
 if(!this.edit.isEditing()){
+var _5=e.keyCode;
 dojo.stopEvent(e);
-var _b=(e.keyCode==dk.LEFT_ARROW)?1:-1;
+_2=this.focus.getHeaderIndex();
+if(_2>=0&&(e.shiftKey&&e.ctrlKey)){
+this.focus.colSizeAdjust(e,_2,(_5==dk.LEFT_ARROW?-1:1)*5);
+}else{
+var _6=(_5==dk.LEFT_ARROW)?1:-1;
 if(dojo._isBodyLtr()){
-_b*=-1;
+_6*=-1;
+}
+this.focus.move(0,_6);
 }
-this.focus.move(0,_b);
 }
 break;
 case dk.UP_ARROW:
-if(!this.edit.isEditing()&&this.focus.rowIndex!=0){
+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.store&&this.focus.rowIndex+1!=this.rowCount){
+if(!this.edit.isEditing()&&this.focus.rowIndex+1!=this.rowCount){
 dojo.stopEvent(e);
 this.focus.move(1,0);
 }
 break;
 case dk.PAGE_UP:
-if(!this.edit.isEditing()&&this.focus.rowIndex!=0){
+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);
@@ -112,6 +119,8 @@ this.focus.move(this.scroller.lastVisibleRow-this.scroller.firstVisibleRow-1,0);
 }
 }
 break;
+default:
+break;
 }
 },onMouseOver:function(e){
 e.rowIndex==-1?this.onHeaderCellMouseOver(e):this.onCellMouseOver(e);
@@ -154,10 +163,10 @@ this.focus.setFocusCell(e.cell,e.rowIndex);
 }
 this.onRowClick(e);
 },onCellDblClick:function(e){
-if(dojo.isIE){
+if(this._click.length>1&&dojo.isIE){
 this.edit.setEditCell(this._click[1].cell,this._click[1].rowIndex);
 }else{
-if(this._click[0].rowIndex!=this._click[1].rowIndex){
+if(this._click.length>1&&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);
@@ -166,8 +175,8 @@ this.edit.setEditCell(e.cell,e.rowIndex);
 this.onRowDblClick(e);
 },onCellContextMenu:function(e){
 this.onRowContextMenu(e);
-},onCellFocus:function(_18,_19){
-this.edit.cellFocus(_18,_19);
+},onCellFocus:function(_7,_8){
+this.edit.cellFocus(_7,_8);
 },onRowClick:function(e){
 this.edit.rowClick(e);
 this.selection.clickSelectEvent(e);
@@ -201,18 +210,18 @@ this.onHeaderContextMenu(e);
 if(!this.headerMenu){
 dojo.stopEvent(e);
 }
-},onStartEdit:function(_2b,_2c){
-},onApplyCellEdit:function(_2d,_2e,_2f){
-},onCancelEdit:function(_30){
-},onApplyEdit:function(_31){
-},onCanSelect:function(_32){
+},onStartEdit:function(_9,_a){
+},onApplyCellEdit:function(_b,_c,_d){
+},onCancelEdit:function(_e){
+},onApplyEdit:function(_f){
+},onCanSelect:function(_10){
 return true;
-},onCanDeselect:function(_33){
+},onCanDeselect:function(_11){
 return true;
-},onSelected:function(_34){
-this.updateRowStyles(_34);
-},onDeselected:function(_35){
-this.updateRowStyles(_35);
+},onSelected:function(_12){
+this.updateRowStyles(_12);
+},onDeselected:function(_13){
+this.updateRowStyles(_13);
 },onSelectionChanged:function(){
 }});
 }
diff --git a/dojox/grid/_FocusManager.js b/dojox/grid/_FocusManager.js
index c5922b1..9a41204 100644
--- a/dojox/grid/_FocusManager.js
+++ b/dojox/grid/_FocusManager.js
@@ -14,8 +14,10 @@ this.grid=_1;
 this.cell=null;
 this.rowIndex=-1;
 this._connects=[];
+this.headerMenu=this.grid.headerMenu;
 this._connects.push(dojo.connect(this.grid.domNode,"onfocus",this,"doFocus"));
 this._connects.push(dojo.connect(this.grid.domNode,"onblur",this,"doBlur"));
+this._connects.push(dojo.connect(this.grid.domNode,"oncontextmenu",this,"doContextMenu"));
 this._connects.push(dojo.connect(this.grid.lastFocusNode,"onfocus",this,"doLastNodeFocus"));
 this._connects.push(dojo.connect(this.grid.lastFocusNode,"onblur",this,"doLastNodeBlur"));
 this._connects.push(dojo.connect(this.grid,"_onFetchComplete",this,"_delayedCellFocus"));
@@ -24,7 +26,7 @@ this._connects.push(dojo.connect(this.grid,"postrender",this,"_delayedHeaderFocu
 dojo.forEach(this._connects,dojo.disconnect);
 delete this.grid;
 delete this.cell;
-},_colHeadNode:null,_colHeadFocusIdx:null,tabbingOut:false,focusClass:"dojoxGridCellFocus",focusView:null,initFocusView:function(){
+},_colHeadNode:null,_colHeadFocusIdx:null,_contextMenuBindNode:null,tabbingOut:false,focusClass:"dojoxGridCellFocus",focusView:null,initFocusView:function(){
 this.focusView=this.grid.views.getFirstScrollingView()||this.focusView;
 this._initColumnHeaders();
 },isFocusCell:function(_2,_3){
@@ -36,7 +38,7 @@ return (this.rowIndex==this.grid.rowCount-1)&&(this.cell.index==this.grid.layout
 return false;
 },isFirstFocusCell:function(){
 if(this.cell){
-return (this.rowIndex==0)&&(this.cell.index==0);
+return (this.rowIndex===0)&&(this.cell.index===0);
 }
 return false;
 },isNoFocusCell:function(){
@@ -68,7 +70,7 @@ catch(e){
 }
 }
 },_delayedCellFocus:function(){
-if(this.isNavHeader()){
+if(this.isNavHeader()||!this.grid._focused){
 return;
 }
 var n=this.cell&&this.cell.getNode(this.rowIndex);
@@ -76,6 +78,7 @@ if(n){
 try{
 if(!this.grid.edit.isEditing()){
 dojo.toggleClass(n,this.focusClass,true);
+this.blurHeader();
 dojox.grid.util.fire(n,"focus");
 }
 }
@@ -85,89 +88,137 @@ catch(e){
 },_delayedHeaderFocus:function(){
 if(this.isNavHeader()){
 this.focusHeader();
+this.grid.domNode.focus();
 }
 },_initColumnHeaders:function(){
-this._connects.push(dojo.connect(this.grid.viewsHeaderNode,"onblur",this,"doBlurHeader"));
-var _8=this._findHeaderCells();
-for(var i=0;i<_8.length;i++){
-this._connects.push(dojo.connect(_8[i],"onfocus",this,"doColHeaderFocus"));
-this._connects.push(dojo.connect(_8[i],"onblur",this,"doColHeaderBlur"));
+var _5=this._findHeaderCells();
+for(var i=0;i<_5.length;i++){
+this._connects.push(dojo.connect(_5[i],"onfocus",this,"doColHeaderFocus"));
+this._connects.push(dojo.connect(_5[i],"onblur",this,"doColHeaderBlur"));
 }
 },_findHeaderCells:function(){
-var _a=dojo.query("th",this.grid.viewsHeaderNode);
-var _b=[];
-for(var i=0;i<_a.length;i++){
-var _d=_a[i];
-var _e=dojo.hasAttr(_d,"tabindex");
-var _f=dojo.attr(_d,"tabindex");
-if(_e&&_f<0){
-_b.push(_d);
-}
-}
-return _b;
+var _6=dojo.query("th",this.grid.viewsHeaderNode);
+var _7=[];
+for(var i=0;i<_6.length;i++){
+var _8=_6[i];
+var _9=dojo.hasAttr(_8,"tabIndex");
+var _a=dojo.attr(_8,"tabIndex");
+if(_9&&_a<0){
+_7.push(_8);
+}
+}
+return _7;
+},_setActiveColHeader:function(_b,_c,_d){
+dojo.attr(this.grid.domNode,"aria-activedescendant",_b.id);
+if(_d!=null&&_d>=0&&_d!=_c){
+dojo.toggleClass(this._findHeaderCells()[_d],this.focusClass,false);
+}
+dojo.toggleClass(_b,this.focusClass,true);
+this._colHeadNode=_b;
+this._colHeadFocusIdx=_c;
+this._scrollHeader(this._colHeadFocusIdx);
 },scrollIntoView:function(){
-var _10=(this.cell?this._scrollInfo(this.cell):null);
-if(!_10||!_10.s){
+var _e=(this.cell?this._scrollInfo(this.cell):null);
+if(!_e||!_e.s){
 return null;
 }
 var rt=this.grid.scroller.findScrollTop(this.rowIndex);
-if(_10.n&&_10.sr){
-if(_10.n.offsetLeft+_10.n.offsetWidth>_10.sr.l+_10.sr.w){
-_10.s.scrollLeft=_10.n.offsetLeft+_10.n.offsetWidth-_10.sr.w;
+if(_e.n&&_e.sr){
+if(_e.n.offsetLeft+_e.n.offsetWidth>_e.sr.l+_e.sr.w){
+_e.s.scrollLeft=_e.n.offsetLeft+_e.n.offsetWidth-_e.sr.w;
 }else{
-if(_10.n.offsetLeft<_10.sr.l){
-_10.s.scrollLeft=_10.n.offsetLeft;
+if(_e.n.offsetLeft<_e.sr.l){
+_e.s.scrollLeft=_e.n.offsetLeft;
 }
 }
 }
-if(_10.r&&_10.sr){
-if(rt+_10.r.offsetHeight>_10.sr.t+_10.sr.h){
-this.grid.setScrollTop(rt+_10.r.offsetHeight-_10.sr.h);
+if(_e.r&&_e.sr){
+if(rt+_e.r.offsetHeight>_e.sr.t+_e.sr.h){
+this.grid.setScrollTop(rt+_e.r.offsetHeight-_e.sr.h);
 }else{
-if(rt<_10.sr.t){
+if(rt<_e.sr.t){
 this.grid.setScrollTop(rt);
 }
 }
 }
-return _10.s.scrollLeft;
-},_scrollInfo:function(_12,_13){
-if(_12){
-var cl=_12,sbn=cl.view.scrollboxNode,_16={w:sbn.clientWidth,l:sbn.scrollLeft,t:sbn.scrollTop,h:sbn.clientHeight},rn=cl.view.getRowNode(this.rowIndex);
-return {c:cl,s:sbn,sr:_16,n:(_13?_13:_12.getNode(this.rowIndex)),r:rn};
+return _e.s.scrollLeft;
+},_scrollInfo:function(_f,_10){
+if(_f){
+var cl=_f,sbn=cl.view.scrollboxNode,_11={w:sbn.clientWidth,l:sbn.scrollLeft,t:sbn.scrollTop,h:sbn.clientHeight},rn=cl.view.getRowNode(this.rowIndex);
+return {c:cl,s:sbn,sr:_11,n:(_10?_10:_f.getNode(this.rowIndex)),r:rn};
 }
 return null;
-},_scrollHeader:function(_18){
-var _19=null;
+},_scrollHeader:function(_12){
+var _13=null;
 if(this._colHeadNode){
-var _1a=this.grid.getCell(_18);
-_19=this._scrollInfo(_1a,_1a.getNode(0));
+var _14=this.grid.getCell(_12);
+_13=this._scrollInfo(_14,_14.getNode(0));
 }
-if(_19&&_19.s&&_19.sr&&_19.n){
-var _1b=_19.sr.l+_19.sr.w;
-if(_19.n.offsetLeft+_19.n.offsetWidth>_1b){
-_19.s.scrollLeft=_19.n.offsetLeft+_19.n.offsetWidth-_19.sr.w;
+if(_13&&_13.s&&_13.sr&&_13.n){
+var _15=_13.sr.l+_13.sr.w;
+if(_13.n.offsetLeft+_13.n.offsetWidth>_15){
+_13.s.scrollLeft=_13.n.offsetLeft+_13.n.offsetWidth-_13.sr.w;
 }else{
-if(_19.n.offsetLeft<_19.sr.l){
-_19.s.scrollLeft=_19.n.offsetLeft;
+if(_13.n.offsetLeft<_13.sr.l){
+_13.s.scrollLeft=_13.n.offsetLeft;
 }else{
-if(dojo.isIE<=7&&_1a&&_1a.view.headerNode){
-_1a.view.headerNode.scrollLeft=_19.s.scrollLeft;
+if(dojo.isIE<=7&&_14&&_14.view.headerNode){
+_14.view.headerNode.scrollLeft=_13.s.scrollLeft;
+}
+}
+}
 }
+},_isHeaderHidden:function(){
+var _16=this.focusView;
+if(!_16){
+for(var i=0,_17;(_17=this.grid.views.views[i]);i++){
+if(_17.headerNode){
+_16=_17;
+break;
 }
 }
 }
-},styleRow:function(_1c){
+return (_16&&dojo.getComputedStyle(_16.headerNode).display=="none");
+},colSizeAdjust:function(e,_18,_19){
+var _1a=this._findHeaderCells();
+var _1b=this.focusView;
+if(!_1b){
+for(var i=0,_1c;(_1c=this.grid.views.views[i]);i++){
+if(_1c.header.tableMap.map){
+_1b=_1c;
+break;
+}
+}
+}
+var _1d=_1a[_18];
+if(!_1b||(_18==_1a.length-1&&_18===0)){
 return;
-},setFocusIndex:function(_1d,_1e){
-this.setFocusCell(this.grid.getCell(_1e),_1d);
-},setFocusCell:function(_1f,_20){
-if(_1f&&!this.isFocusCell(_1f,_20)){
+}
+_1b.content.baseDecorateEvent(e);
+e.cellNode=_1d;
+e.cellIndex=_1b.content.getCellNodeIndex(e.cellNode);
+e.cell=(e.cellIndex>=0?this.grid.getCell(e.cellIndex):null);
+if(_1b.header.canResize(e)){
+var _1e={l:_19};
+var _1f=_1b.header.colResizeSetup(e,false);
+_1b.header.doResizeColumn(_1f,null,_1e);
+_1b.update();
+}
+},styleRow:function(_20){
+return;
+},setFocusIndex:function(_21,_22){
+this.setFocusCell(this.grid.getCell(_22),_21);
+},setFocusCell:function(_23,_24){
+if(_23&&!this.isFocusCell(_23,_24)){
 this.tabbingOut=false;
+if(this._colHeadNode){
+this.blurHeader();
+}
 this._colHeadNode=this._colHeadFocusIdx=null;
 this.focusGridView();
 this._focusifyCellNode(false);
-this.cell=_1f;
-this.rowIndex=_20;
+this.cell=_23;
+this.rowIndex=_24;
 this._focusifyCellNode(true);
 }
 if(dojo.isOpera){
@@ -209,9 +260,9 @@ row=0;
 col=0;
 }
 if(this.grid.edit.isEditing()){
-var _28=this.grid.getCell(col);
-if(!this.isFirstFocusCell()&&!_28.editable){
-this.cell=_28;
+var _26=this.grid.getCell(col);
+if(!this.isFirstFocusCell()&&!_26.editable){
+this.cell=_26;
 this.rowIndex=row;
 this.previous();
 return;
@@ -219,36 +270,45 @@ return;
 }
 this.setFocusIndex(row,col);
 }
-},move:function(_29,_2a){
+},move:function(_27,_28){
+var _29=_28<0?-1:1;
 if(this.isNavHeader()){
-var _2b=this._findHeaderCells();
-var _2c=dojo.indexOf(_2b,this._colHeadNode);
-_2c+=_2a;
-if((_2c>=0)&&(_2c<_2b.length)){
-this._colHeadNode=_2b[_2c];
-this._colHeadFocusIdx=_2c;
-this._scrollHeader(_2c);
-this._colHeadNode.focus();
+var _2a=this._findHeaderCells();
+var _2b=currentIdx=dojo.indexOf(_2a,this._colHeadNode);
+currentIdx+=_28;
+while(currentIdx>=0&&currentIdx<_2a.length&&_2a[currentIdx].style.display=="none"){
+currentIdx+=_29;
+}
+if((currentIdx>=0)&&(currentIdx<_2a.length)){
+this._setActiveColHeader(_2a[currentIdx],currentIdx,_2b);
 }
 }else{
 if(this.cell){
-var sc=this.grid.scroller,r=this.rowIndex,rc=this.grid.rowCount-1,row=Math.min(rc,Math.max(0,r+_29));
-if(_29){
-if(_29>0){
+var sc=this.grid.scroller,r=this.rowIndex,rc=this.grid.rowCount-1,row=Math.min(rc,Math.max(0,r+_27));
+if(_27){
+if(_27>0){
 if(row>sc.getLastPageRow(sc.page)){
 this.grid.setScrollTop(this.grid.scrollTop+sc.findScrollTop(row)-sc.findScrollTop(r));
 }
 }else{
-if(_29<0){
+if(_27<0){
 if(row<=sc.getPageRow(sc.page)){
 this.grid.setScrollTop(this.grid.scrollTop-sc.findScrollTop(r)-sc.findScrollTop(row));
 }
 }
 }
 }
-var cc=this.grid.layout.cellCount-1,i=this.cell.index,col=Math.min(cc,Math.max(0,i+_2a));
+var cc=this.grid.layout.cellCount-1,i=this.cell.index,col=Math.min(cc,Math.max(0,i+_28));
+var _2c=this.grid.getCell(col);
+while(col>=0&&col<cc&&_2c&&_2c.hidden===true){
+col+=_29;
+_2c=this.grid.getCell(col);
+}
+if(!_2c||_2c.hidden===true){
+col=i;
+}
 this.setFocusIndex(row,col);
-if(_29){
+if(_27){
 this.grid.updateRow(r);
 }
 }
@@ -258,33 +318,30 @@ if(this.grid.edit.isEditing()){
 dojo.stopEvent(e);
 this.previous();
 }else{
-if(!this.isNavHeader()){
-this.focusHeader();
+if(!this.isNavHeader()&&!this._isHeaderHidden()){
+this.grid.domNode.focus();
 dojo.stopEvent(e);
 }else{
 this.tabOut(this.grid.domNode);
+if(this._colHeadFocusIdx!=null){
+dojo.toggleClass(this._findHeaderCells()[this._colHeadFocusIdx],this.focusClass,false);
+this._colHeadFocusIdx=null;
+}
+this._focusifyCellNode(false);
 }
 }
 },nextKey:function(e){
-var _36=this.grid.rowCount==0;
-if(e.target===this.grid.domNode){
+var _2d=(this.grid.rowCount===0);
+if(e.target===this.grid.domNode&&this._colHeadFocusIdx==null){
 this.focusHeader();
 dojo.stopEvent(e);
 }else{
 if(this.isNavHeader()){
-this._colHeadNode=this._colHeadFocusIdx=null;
-if(this.isNoFocusCell()&&!_36){
-this.setFocusIndex(0,0);
-}else{
-if(this.cell&&!_36){
-if(this.focusView&&!this.focusView.rowNodes[this.rowIndex]){
-this.grid.scrollToRow(this.rowIndex);
-}
-this.focusGrid();
-}else{
+this.blurHeader();
+if(!this.findAndFocusGridCell()){
 this.tabOut(this.grid.lastFocusNode);
 }
-}
+this._colHeadNode=this._colHeadFocusIdx=null;
 }else{
 if(this.grid.edit.isEditing()){
 dojo.stopEvent(e);
@@ -294,16 +351,42 @@ this.tabOut(this.grid.lastFocusNode);
 }
 }
 }
-},tabOut:function(_37){
+},tabOut:function(_2e){
 this.tabbingOut=true;
-_37.focus();
+_2e.focus();
 },focusGridView:function(){
 dojox.grid.util.fire(this.focusView,"focus");
-},focusGrid:function(_38){
+},focusGrid:function(_2f){
 this.focusGridView();
 this._focusifyCellNode(true);
+},findAndFocusGridCell:function(){
+var _30=true;
+var _31=(this.grid.rowCount===0);
+if(this.isNoFocusCell()&&!_31){
+var _32=0;
+var _33=this.grid.getCell(_32);
+if(_33.hidden){
+_32=this.isNavHeader()?this._colHeadFocusIdx:0;
+}
+this.setFocusIndex(0,_32);
+}else{
+if(this.cell&&!_31){
+if(this.focusView&&!this.focusView.rowNodes[this.rowIndex]){
+this.grid.scrollToRow(this.rowIndex);
+}
+this.focusGrid();
+}else{
+_30=false;
+}
+}
+this._colHeadNode=this._colHeadFocusIdx=null;
+return _30;
 },focusHeader:function(){
-var _39=this._findHeaderCells();
+var _34=this._findHeaderCells();
+var _35=this._colHeadFocusIdx;
+if(this._isHeaderHidden()){
+this.findAndFocusGridCell();
+}else{
 if(!this._colHeadFocusIdx){
 if(this.isNoFocusCell()){
 this._colHeadFocusIdx=0;
@@ -311,10 +394,32 @@ this._colHeadFocusIdx=0;
 this._colHeadFocusIdx=this.cell.index;
 }
 }
-this._colHeadNode=_39[this._colHeadFocusIdx];
-if(this._colHeadNode){
-dojox.grid.util.fire(this._colHeadNode,"focus");
+}
+this._colHeadNode=_34[this._colHeadFocusIdx];
+while(this._colHeadNode&&this._colHeadFocusIdx>=0&&this._colHeadFocusIdx<_34.length&&this._colHeadNode.style.display=="none"){
+this._colHeadFocusIdx++;
+this._colHeadNode=_34[this._colHeadFocusIdx];
+}
+if(this._colHeadNode&&this._colHeadNode.style.display!="none"){
+if(this.headerMenu&&this._contextMenuBindNode!=this.grid.domNode){
+this.headerMenu.unBindDomNode(this.grid.viewsHeaderNode);
+this.headerMenu.bindDomNode(this.grid.domNode);
+this._contextMenuBindNode=this.grid.domNode;
+}
+this._setActiveColHeader(this._colHeadNode,this._colHeadFocusIdx,_35);
+this._scrollHeader(this._colHeadFocusIdx);
 this._focusifyCellNode(false);
+}else{
+this.findAndFocusGridCell();
+}
+},blurHeader:function(){
+dojo.removeClass(this._colHeadNode,this.focusClass);
+dojo.removeAttr(this.grid.domNode,"aria-activedescendant");
+if(this.headerMenu&&this._contextMenuBindNode==this.grid.domNode){
+var _36=this.grid.viewsHeaderNode;
+this.headerMenu.unBindDomNode(this.grid.domNode);
+this.headerMenu.bindDomNode(_36);
+this._contextMenuBindNode=_36;
 }
 },doFocus:function(e){
 if(e&&e.target!=e.currentTarget){
@@ -328,8 +433,10 @@ this.tabbingOut=false;
 dojo.stopEvent(e);
 },doBlur:function(e){
 dojo.stopEvent(e);
-},doBlurHeader:function(e){
+},doContextMenu:function(e){
+if(!this.headerMenu){
 dojo.stopEvent(e);
+}
 },doLastNodeFocus:function(e){
 if(this.tabbingOut){
 this._focusifyCellNode(false);
@@ -348,8 +455,9 @@ dojo.stopEvent(e);
 },doLastNodeBlur:function(e){
 dojo.stopEvent(e);
 },doColHeaderFocus:function(e){
-dojo.toggleClass(e.target,this.focusClass,true);
+this._setActiveColHeader(e.target,dojo.attr(e.target,"idx"),this._colHeadFocusIdx);
 this._scrollHeader(this.getHeaderIndex());
+dojo.stopEvent(e);
 },doColHeaderBlur:function(e){
 dojo.toggleClass(e.target,this.focusClass,false);
 }});
diff --git a/dojox/grid/_Grid.js b/dojox/grid/_Grid.js
index 8cbde88..ba7cd93 100644
--- a/dojox/grid/_Grid.js
+++ b/dojox/grid/_Grid.js
@@ -24,22 +24,11 @@ dojo.require("dojox.grid._RowSelector");
 dojo.require("dojox.grid._Events");
 dojo.requireLocalization("dijit","loading",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
 (function(){
-var _1={cancel:function(_2){
-if(_2){
-clearTimeout(_2);
-}
-},jobs:[],job:function(_3,_4,_5){
-_1.cancelJob(_3);
-var _6=function(){
-delete _1.jobs[_3];
-_5();
-};
-_1.jobs[_3]=setTimeout(_6,_4);
-},cancelJob:function(_7){
-_1.cancel(_1.jobs[_7]);
-}};
-dojo.declare("dojox.grid._Grid",[dijit._Widget,dijit._Templated,dojox.grid._Events],{templateString:"<div class=\"dojoxGrid\" hidefocus=\"hidefocus\" wairole=\"grid\" dojoAttachEvent=\"onmouseout:_mouseOut\">\n\t<div class=\"dojoxGridMasterHeader\" dojoAttachPoint=\"viewsHeaderNode\" tabindex=\"-1\" wairole=\"presentation\"></div>\n\t<div class=\"dojoxGridMasterView\" dojoAttachPoint=\"viewsNode\" wairole=\"presentation\"></div>\n\t<div class=\"dojoxGridMasterMessages\" style=\"display:  [...]
-},rowCount:5,keepRows:75,rowsPerPage:25,autoWidth:false,autoHeight:"",autoRender:true,defaultHeight:"15em",height:"",structure:null,elasticView:-1,singleClickEdit:false,selectionMode:"extended",rowSelector:"",columnReordering:false,headerMenu:null,placeholderLabel:"GridColumns",selectable:false,_click:null,loadingMessage:"<span class='dojoxGridLoading'>${loadingState}</span>",errorMessage:"<span class='dojoxGridError'>${errorState}</span>",noDataMessage:"",sortInfo:0,themeable:true,_plac [...]
+if(!dojo.isCopyKey){
+dojo.isCopyKey=dojo.dnd.getCopyKeyState;
+}
+dojo.declare("dojox.grid._Grid",[dijit._Widget,dijit._Templated,dojox.grid._Events],{templateString:"<div class=\"dojoxGrid\" hidefocus=\"hidefocus\" wairole=\"grid\" dojoAttachEvent=\"onmouseout:_mouseOut\">\n\t<div class=\"dojoxGridMasterHeader\" dojoAttachPoint=\"viewsHeaderNode\" wairole=\"presentation\"></div>\n\t<div class=\"dojoxGridMasterView\" dojoAttachPoint=\"viewsNode\" wairole=\"presentation\"></div>\n\t<div class=\"dojoxGridMasterMessages\" style=\"display: none;\" dojoAtta [...]
+},rowCount:5,keepRows:75,rowsPerPage:25,autoWidth:false,initialWidth:"",autoHeight:"",rowHeight:0,autoRender:true,defaultHeight:"15em",height:"",structure:null,elasticView:-1,singleClickEdit:false,selectionMode:"extended",rowSelector:"",columnReordering:false,headerMenu:null,placeholderLabel:"GridColumns",selectable:false,_click:null,loadingMessage:"<span class='dojoxGridLoading'>${loadingState}</span>",errorMessage:"<span class='dojoxGridError'>${errorState}</span>",noDataMessage:"",esc [...]
 this.inherited(arguments);
 if(this.get==dojox.grid._Grid.prototype.get){
 this.get=null;
@@ -58,22 +47,31 @@ this.connect(this.selection,"onChanged","onSelectionChanged");
 dojox.html.metrics.initOnFontResize();
 this.connect(dojox.html.metrics,"onFontResize","textSizeChanged");
 dojox.grid.util.funnelEvents(this.domNode,this,"doKeyEvent",dojox.grid.util.keyEvents);
-this.connect(this,"onShow","renderOnIdle");
+if(this.selectionMode!="none"){
+dojo.attr(this.domNode,"aria-multiselectable",this.selectionMode=="single"?"false":"true");
+}
 },postMixInProperties:function(){
 this.inherited(arguments);
-var _9=dojo.i18n.getLocalization("dijit","loading",this.lang);
-this.loadingMessage=dojo.string.substitute(this.loadingMessage,_9);
-this.errorMessage=dojo.string.substitute(this.errorMessage,_9);
+var _2=dojo.i18n.getLocalization("dijit","loading",this.lang);
+this.loadingMessage=dojo.string.substitute(this.loadingMessage,_2);
+this.errorMessage=dojo.string.substitute(this.errorMessage,_2);
 if(this.srcNodeRef&&this.srcNodeRef.style.height){
 this.height=this.srcNodeRef.style.height;
 }
 this._setAutoHeightAttr(this.autoHeight,true);
+this.lastScrollTop=this.scrollTop=0;
 },postCreate:function(){
-this.styleChanged=this._styleChanged;
 this._placeholders=[];
 this._setHeaderMenuAttr(this.headerMenu);
 this._setStructureAttr(this.structure);
 this._click=[];
+this.inherited(arguments);
+if(this.domNode&&this.autoWidth&&this.initialWidth){
+this.domNode.style.width=this.initialWidth;
+}
+if(this.domNode&&!this.editable){
+dojo.attr(this.domNode,"aria-readonly","true");
+}
 },destroy:function(){
 this.domNode.onReveal=null;
 this.domNode.onSizeChange=null;
@@ -96,7 +94,7 @@ p.unReplace(true);
 this.headerMenu.unBindDomNode(this.viewsHeaderNode);
 }
 this.inherited(arguments);
-},_setAutoHeightAttr:function(ah,_c){
+},_setAutoHeightAttr:function(ah,_3){
 if(typeof ah=="string"){
 if(!ah||ah=="false"){
 ah=false;
@@ -130,29 +128,15 @@ this._autoHeight=(ah>=this.attr("rowCount"));
 this._autoHeight=false;
 }
 }
-if(this._started&&!_c){
+if(this._started&&!_3){
 this.render();
 }
 },_getRowCountAttr:function(){
 return this.updating&&this.invalidated&&this.invalidated.rowCount!=undefined?this.invalidated.rowCount:this.rowCount;
-},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(){
-_1.job(this.id+"SizeChange",50,dojo.hitch(this,"update"));
-},renderOnIdle:function(){
-setTimeout(dojo.hitch(this,"render"),1);
+this.update();
 },createManagers:function(){
 this.rows=new dojox.grid._RowManager(this);
 this.focus=new dojox.grid._FocusManager(this);
@@ -162,32 +146,31 @@ this.selection=new dojox.grid.Selection(this);
 },createScroller:function(){
 this.scroller=new dojox.grid._Scroller();
 this.scroller.grid=this;
-this.scroller._pageIdPrefix=this.id+"-";
 this.scroller.renderRow=dojo.hitch(this,"renderRow");
 this.scroller.removeRow=dojo.hitch(this,"rowRemoved");
 },createLayout:function(){
-this.layout=new dojox.grid._Layout(this);
+this.layout=new this._layoutClass(this);
 this.connect(this.layout,"moveColumn","onMoveColumn");
 },onMoveColumn:function(){
 this.render();
-this._resize();
+},onResizeColumn:function(_4){
 },createViews:function(){
 this.views=new dojox.grid._ViewManager(this);
 this.views.createView=dojo.hitch(this,"createView");
-},createView:function(_e,_f){
-var c=dojo.getObject(_e);
-var _11=new c({grid:this,index:_f});
-this.viewsNode.appendChild(_11.domNode);
-this.viewsHeaderNode.appendChild(_11.headerNode);
-this.views.addView(_11);
-return _11;
+},createView:function(_5,_6){
+var c=dojo.getObject(_5);
+var _7=new c({grid:this,index:_6});
+this.viewsNode.appendChild(_7.domNode);
+this.viewsHeaderNode.appendChild(_7.headerNode);
+this.views.addView(_7);
+return _7;
 },buildViews:function(){
 for(var i=0,vs;(vs=this.layout.structure[i]);i++){
 this.createView(vs.type||dojox._scopeName+".grid._View",i).setStructure(vs);
 }
 this.scroller.setContentNodes(this.views.getContentNodes());
-},_setStructureAttr:function(_14){
-var s=_14;
+},_setStructureAttr:function(_8){
+var s=_8;
 if(s&&dojo.isString(s)){
 dojo.deprecated("dojox.grid._Grid.attr('structure', 'objVar')","use dojox.grid._Grid.attr('structure', objVar) instead","2.0");
 s=dojo.getObject(s);
@@ -205,26 +188,26 @@ if(s!==this.layout.structure){
 this.layout.setStructure(s);
 }
 this._structureChanged();
-},setStructure:function(_16){
+},setStructure:function(_9){
 dojo.deprecated("dojox.grid._Grid.setStructure(obj)","use dojox.grid._Grid.attr('structure', obj) instead.","2.0");
-this._setStructureAttr(_16);
+this._setStructureAttr(_9);
 },getColumnTogglingItems:function(){
-return dojo.map(this.layout.cells,function(_17){
-if(!_17.menuItems){
-_17.menuItems=[];
-}
-var _18=this;
-var _19=new dijit.CheckedMenuItem({label:_17.name,checked:!_17.hidden,_gridCell:_17,onChange:function(_1a){
-if(_18.layout.setColumnVisibility(this._gridCell.index,_1a)){
-var _1b=this._gridCell.menuItems;
-if(_1b.length>1){
-dojo.forEach(_1b,function(_1c){
-if(_1c!==this){
-_1c.setAttribute("checked",_1a);
+return dojo.map(this.layout.cells,function(_a){
+if(!_a.menuItems){
+_a.menuItems=[];
+}
+var _b=this;
+var _c=new dijit.CheckedMenuItem({label:_a.name,checked:!_a.hidden,_gridCell:_a,onChange:function(_d){
+if(_b.layout.setColumnVisibility(this._gridCell.index,_d)){
+var _e=this._gridCell.menuItems;
+if(_e.length>1){
+dojo.forEach(_e,function(_f){
+if(_f!==this){
+_f.setAttribute("checked",_d);
 }
 },this);
 }
-var _1a=dojo.filter(_18.layout.cells,function(c){
+_d=dojo.filter(_b.layout.cells,function(c){
 if(c.menuItems.length>1){
 dojo.forEach(c.menuItems,"item.attr('disabled', false);");
 }else{
@@ -232,20 +215,20 @@ c.menuItems[0].attr("disabled",false);
 }
 return !c.hidden;
 });
-if(_1a.length==1){
-dojo.forEach(_1a[0].menuItems,"item.attr('disabled', true);");
+if(_d.length==1){
+dojo.forEach(_d[0].menuItems,"item.attr('disabled', true);");
 }
 }
 },destroy:function(){
-var _1e=dojo.indexOf(this._gridCell.menuItems,this);
-this._gridCell.menuItems.splice(_1e,1);
+var _10=dojo.indexOf(this._gridCell.menuItems,this);
+this._gridCell.menuItems.splice(_10,1);
 delete this._gridCell;
 dijit.CheckedMenuItem.prototype.destroy.apply(this,arguments);
 }});
-_17.menuItems.push(_19);
-return _19;
+_a.menuItems.push(_c);
+return _c;
 },this);
-},_setHeaderMenuAttr:function(_1f){
+},_setHeaderMenuAttr:function(_11){
 if(this._placeholders&&this._placeholders.length){
 dojo.forEach(this._placeholders,function(p){
 p.unReplace(true);
@@ -255,17 +238,17 @@ this._placeholders=[];
 if(this.headerMenu){
 this.headerMenu.unBindDomNode(this.viewsHeaderNode);
 }
-this.headerMenu=_1f;
-if(!_1f){
+this.headerMenu=_11;
+if(!_11){
 return;
 }
 this.headerMenu.bindDomNode(this.viewsHeaderNode);
 if(this.headerMenu.getPlaceholders){
 this._placeholders=this.headerMenu.getPlaceholders(this.placeholderLabel);
 }
-},setHeaderMenu:function(_21){
+},setHeaderMenu:function(_12){
 dojo.deprecated("dojox.grid._Grid.setHeaderMenu(obj)","use dojox.grid._Grid.attr('headerMenu', obj) instead.","2.0");
-this._setHeaderMenuAttr(_21);
+this._setHeaderMenuAttr(_12);
 },setupHeaderMenu:function(){
 if(this._placeholders&&this._placeholders.length){
 dojo.forEach(this._placeholders,function(p){
@@ -275,13 +258,13 @@ p.unReplace(true);
 p.replace(this.getColumnTogglingItems());
 },this);
 }
-},_fetch:function(_23){
+},_fetch:function(_13){
 this.setScrollTop(0);
-},getItem:function(_24){
+},getItem:function(_14){
 return null;
-},showMessage:function(_25){
-if(_25){
-this.messagesNode.innerHTML=_25;
+},showMessage:function(_15){
+if(_15){
+this.messagesNode.innerHTML=_15;
 this.messagesNode.style.display="";
 }else{
 this.messagesNode.innerHTML="";
@@ -294,8 +277,9 @@ this.render();
 }
 },hasLayout:function(){
 return this.layout.cells.length;
-},resize:function(_26,_27){
-this._resize(_26,_27);
+},resize:function(_16,_17){
+this._pendingChangeSize=_16;
+this._pendingResultSize=_17;
 this.sizeChange();
 },_getPadBorder:function(){
 this._padBorder=this._padBorder||dojo._getPadBorderExtents(this.domNode);
@@ -305,25 +289,31 @@ var vns=this.viewsHeaderNode.style,t=vns.display=="none"?0:this.views.measureHea
 vns.height=t+"px";
 this.views.normalizeHeaderNodeHeight();
 return t;
-},_resize:function(_2a,_2b){
+},_resize:function(_18,_19){
+_18=_18||this._pendingChangeSize;
+_19=_19||this._pendingResultSize;
+delete this._pendingChangeSize;
+delete this._pendingResultSize;
+if(!this.domNode){
+return;
+}
 var pn=this.domNode.parentNode;
 if(!pn||pn.nodeType!=1||!this.hasLayout()||pn.style.visibility=="hidden"||pn.style.display=="none"){
 return;
 }
-var _2d=this._getPadBorder();
-var hh=0;
+var _1a=this._getPadBorder();
+var hh=undefined;
+var h;
 if(this._autoHeight){
 this.domNode.style.height="auto";
 this.viewsNode.style.height="";
 }else{
 if(typeof this.autoHeight=="number"){
-var h=hh=this._getHeaderHeight();
+h=hh=this._getHeaderHeight();
 h+=(this.scroller.averageRowHeight*this.autoHeight);
 this.domNode.style.height=h+"px";
 }else{
-if(this.flex>0){
-}else{
-if(this.domNode.clientHeight<=_2d.h){
+if(this.domNode.clientHeight<=_1a.h){
 if(pn==document.body){
 this.domNode.style.height=this.defaultHeight;
 }else{
@@ -336,54 +326,61 @@ this.fitTo="parent";
 }
 }
 }
+if(_19){
+_18=_19;
 }
-if(_2b){
-_2a=_2b;
-}
-if(_2a){
-dojo.marginBox(this.domNode,_2a);
+if(_18){
+dojo.marginBox(this.domNode,_18);
 this.height=this.domNode.style.height;
 delete this.fitTo;
 }else{
 if(this.fitTo=="parent"){
-var h=dojo._getContentBox(pn).h;
-dojo.marginBox(this.domNode,{h:Math.max(0,h)});
+h=this._parentContentBoxHeight=this._parentContentBoxHeight||dojo._getContentBox(pn).h;
+this.domNode.style.height=Math.max(0,h)+"px";
 }
 }
-var h=dojo._getContentBox(this.domNode).h;
-if(h==0&&!this._autoHeight){
+var _1b=dojo.some(this.views.views,function(v){
+return v.flexCells;
+});
+if(!this._autoHeight&&(h||dojo._getContentBox(this.domNode).h)===0){
 this.viewsHeaderNode.style.display="none";
 }else{
 this.viewsHeaderNode.style.display="block";
+if(!_1b&&hh===undefined){
 hh=this._getHeaderHeight();
 }
+}
+if(_1b){
+hh=undefined;
+}
 this.adaptWidth();
 this.adaptHeight(hh);
 this.postresize();
 },adaptWidth:function(){
-var w=this.autoWidth?0:this.domNode.clientWidth||(this.domNode.offsetWidth-this._getPadBorder().w),vw=this.views.arrange(1,w);
+var _1c=(!this.initialWidth&&this.autoWidth);
+var w=_1c?0:this.domNode.clientWidth||(this.domNode.offsetWidth-this._getPadBorder().w),vw=this.views.arrange(1,w);
 this.views.onEach("adaptWidth");
-if(this.autoWidth){
+if(_1c){
 this.domNode.style.width=vw+"px";
 }
-},adaptHeight:function(_32){
-var t=_32||this._getHeaderHeight();
+},adaptHeight:function(_1d){
+var t=_1d===undefined?this._getHeaderHeight():_1d;
 var h=(this._autoHeight?-1:Math.max(this.domNode.clientHeight-t,0)||0);
 this.views.onEach("setSize",[0,h]);
 this.views.onEach("adaptHeight");
 if(!this._autoHeight){
-var _35=0,_36=0;
-var _37=dojo.filter(this.views.views,function(v){
+var _1e=0,_1f=0;
+var _20=dojo.filter(this.views.views,function(v){
 var has=v.hasHScrollbar();
 if(has){
-_35++;
+_1e++;
 }else{
-_36++;
+_1f++;
 }
 return (!has);
 });
-if(_35>0&&_36>0){
-dojo.forEach(_37,function(v){
+if(_1e>0&&_1f>0){
+dojo.forEach(_20,function(v){
 v.adaptHeight(true);
 });
 }
@@ -430,13 +427,13 @@ this.focus.initFocusView();
 dojo.setSelectable(this.domNode,this.selectable);
 },postresize:function(){
 if(this._autoHeight){
-var _3b=Math.max(this.views.measureContent())+"px";
-this.viewsNode.style.height=_3b;
+var _21=Math.max(this.views.measureContent())+"px";
+this.viewsNode.style.height=_21;
 }
-},renderRow:function(_3c,_3d){
-this.views.renderRow(_3c,_3d);
-},rowRemoved:function(_3e){
-this.views.rowRemoved(_3e);
+},renderRow:function(_22,_23){
+this.views.renderRow(_22,_23,this._skipRowRenormalize);
+},rowRemoved:function(_24){
+this.views.rowRemoved(_24);
 },invalidated:null,updating:false,beginUpdate:function(){
 this.invalidated=[];
 this.updating=true;
@@ -454,7 +451,7 @@ this.updateRow(Number(r));
 }
 }
 }
-this.invalidated=null;
+this.invalidated=[];
 },defaultUpdate:function(){
 if(!this.domNode){
 return;
@@ -463,108 +460,127 @@ if(this.updating){
 this.invalidated.all=true;
 return;
 }
-var _41=this.scrollTop;
+this.lastScrollTop=this.scrollTop;
 this.prerender();
 this.scroller.invalidateNodes();
-this.setScrollTop(_41);
+this.setScrollTop(this.lastScrollTop);
 this.postrender();
 },update:function(){
 this.render();
-},updateRow:function(_42){
-_42=Number(_42);
+},updateRow:function(_25){
+_25=Number(_25);
 if(this.updating){
-this.invalidated[_42]=true;
+this.invalidated[_25]=true;
 }else{
-this.views.updateRow(_42);
-this.scroller.rowHeightChanged(_42);
+this.views.updateRow(_25);
+this.scroller.rowHeightChanged(_25);
 }
-},updateRows:function(_43,_44){
-_43=Number(_43);
-_44=Number(_44);
+},updateRows:function(_26,_27){
+_26=Number(_26);
+_27=Number(_27);
+var i;
 if(this.updating){
-for(var i=0;i<_44;i++){
-this.invalidated[i+_43]=true;
+for(i=0;i<_27;i++){
+this.invalidated[i+_26]=true;
 }
 }else{
-for(var i=0;i<_44;i++){
-this.views.updateRow(i+_43);
+for(i=0;i<_27;i++){
+this.views.updateRow(i+_26,this._skipRowRenormalize);
 }
-this.scroller.rowHeightChanged(_43);
+this.scroller.rowHeightChanged(_26);
 }
-},updateRowCount:function(_46){
+},updateRowCount:function(_28){
 if(this.updating){
-this.invalidated.rowCount=_46;
+this.invalidated.rowCount=_28;
 }else{
-this.rowCount=_46;
+this.rowCount=_28;
 this._setAutoHeightAttr(this.autoHeight,true);
 if(this.layout.cells.length){
-this.scroller.updateRowCount(_46);
+this.scroller.updateRowCount(_28);
 }
 this._resize();
 if(this.layout.cells.length){
 this.setScrollTop(this.scrollTop);
 }
 }
-},updateRowStyles:function(_47){
-this.views.updateRowStyles(_47);
-},rowHeightChanged:function(_48){
-this.views.renormalizeRow(_48);
-this.scroller.rowHeightChanged(_48);
-},fastScroll:true,delayScroll:false,scrollRedrawThreshold:(dojo.isIE?100:50),scrollTo:function(_49){
+},updateRowStyles:function(_29){
+this.views.updateRowStyles(_29);
+},getRowNode:function(_2a){
+if(this.focus.focusView&&!(this.focus.focusView instanceof dojox.grid._RowSelector)){
+return this.focus.focusView.rowNodes[_2a];
+}else{
+for(var i=0,_2b;(_2b=this.views.views[i]);i++){
+if(!(_2b instanceof dojox.grid._RowSelector)){
+return _2b.rowNodes[_2a];
+}
+}
+}
+return null;
+},rowHeightChanged:function(_2c){
+this.views.renormalizeRow(_2c);
+this.scroller.rowHeightChanged(_2c);
+},fastScroll:true,delayScroll:false,scrollRedrawThreshold:(dojo.isIE?100:50),scrollTo:function(_2d){
 if(!this.fastScroll){
-this.setScrollTop(_49);
+this.setScrollTop(_2d);
 return;
 }
-var _4a=Math.abs(this.lastScrollTop-_49);
-this.lastScrollTop=_49;
-if(_4a>this.scrollRedrawThreshold||this.delayScroll){
+var _2e=Math.abs(this.lastScrollTop-_2d);
+this.lastScrollTop=_2d;
+if(_2e>this.scrollRedrawThreshold||this.delayScroll){
 this.delayScroll=true;
-this.scrollTop=_49;
-this.views.setScrollTop(_49);
-_1.job("dojoxGridScroll",200,dojo.hitch(this,"finishScrollJob"));
+this.scrollTop=_2d;
+this.views.setScrollTop(_2d);
+if(this._pendingScroll){
+window.clearTimeout(this._pendingScroll);
+}
+var _2f=this;
+this._pendingScroll=window.setTimeout(function(){
+delete _2f._pendingScroll;
+_2f.finishScrollJob();
+},200);
 }else{
-this.setScrollTop(_49);
+this.setScrollTop(_2d);
 }
 },finishScrollJob:function(){
 this.delayScroll=false;
 this.setScrollTop(this.scrollTop);
-},setScrollTop:function(_4b){
-this.scroller.scroll(this.views.setScrollTop(_4b));
-},scrollToRow:function(_4c){
-this.setScrollTop(this.scroller.findScrollTop(_4c)+1);
-},styleRowNode:function(_4d,_4e){
-if(_4e){
-this.rows.styleRowNode(_4d,_4e);
+},setScrollTop:function(_30){
+this.scroller.scroll(this.views.setScrollTop(_30));
+},scrollToRow:function(_31){
+this.setScrollTop(this.scroller.findScrollTop(_31)+1);
+},styleRowNode:function(_32,_33){
+if(_33){
+this.rows.styleRowNode(_32,_33);
 }
 },_mouseOut:function(e){
 this.rows.setOverRow(-2);
-},getCell:function(_50){
-return this.layout.cells[_50];
-},setCellWidth:function(_51,_52){
-this.getCell(_51).unitWidth=_52;
-},getCellName:function(_53){
-return "Cell "+_53.index;
-},canSort:function(_54){
+},getCell:function(_34){
+return this.layout.cells[_34];
+},setCellWidth:function(_35,_36){
+this.getCell(_35).unitWidth=_36;
+},getCellName:function(_37){
+return "Cell "+_37.index;
+},canSort:function(_38){
 },sort:function(){
-},getSortAsc:function(_55){
-_55=_55==undefined?this.sortInfo:_55;
-return Boolean(_55>0);
-},getSortIndex:function(_56){
-_56=_56==undefined?this.sortInfo:_56;
-return Math.abs(_56)-1;
-},setSortIndex:function(_57,_58){
-var si=_57+1;
-if(_58!=undefined){
-si*=(_58?1:-1);
-}else{
-if(this.getSortIndex()==_57){
+},getSortAsc:function(_39){
+_39=_39==undefined?this.sortInfo:_39;
+return Boolean(_39>0);
+},getSortIndex:function(_3a){
+_3a=_3a==undefined?this.sortInfo:_3a;
+return Math.abs(_3a)-1;
+},setSortIndex:function(_3b,_3c){
+var si=_3b+1;
+if(_3c!=undefined){
+si*=(_3c?1:-1);
+}else{
+if(this.getSortIndex()==_3b){
 si=-this.sortInfo;
 }
 }
 this.setSortInfo(si);
-},setSortInfo:function(_5a){
-if(this.canSort(_5a)){
-this.sortInfo=_5a;
+},setSortInfo:function(_3d){
+if(this.canSort(_3d)){
+this.sortInfo=_3d;
 this.sort();
 this.update();
 }
@@ -575,6 +591,7 @@ this.onKeyEvent(e);
 if(m in this){
 return this[m](e);
 }
+return false;
 },dispatchKeyEvent:function(e){
 this._dispatch(e.dispatch,e);
 },dispatchContentEvent:function(e){
@@ -619,88 +636,92 @@ this.onHeaderCellContextMenu(e);
 }else{
 this.onHeaderContextMenu(e);
 }
-},doStartEdit:function(_68,_69){
-this.onStartEdit(_68,_69);
-},doApplyCellEdit:function(_6a,_6b,_6c){
-this.onApplyCellEdit(_6a,_6b,_6c);
-},doCancelEdit:function(_6d){
-this.onCancelEdit(_6d);
-},doApplyEdit:function(_6e){
-this.onApplyEdit(_6e);
+},doStartEdit:function(_3e,_3f){
+this.onStartEdit(_3e,_3f);
+},doApplyCellEdit:function(_40,_41,_42){
+this.onApplyCellEdit(_40,_41,_42);
+},doCancelEdit:function(_43){
+this.onCancelEdit(_43);
+},doApplyEdit:function(_44){
+this.onApplyEdit(_44);
 },addRow:function(){
 this.updateRowCount(this.attr("rowCount")+1);
 },removeSelectedRows:function(){
+if(this.allItemsSelected){
+this.updateRowCount(0);
+}else{
 this.updateRowCount(Math.max(0,this.attr("rowCount")-this.selection.getSelected().length));
+}
 this.selection.clear();
 }});
-dojox.grid._Grid.markupFactory=function(_6f,_70,_71,_72){
+dojox.grid._Grid.markupFactory=function(_45,_46,_47,_48){
 var d=dojo;
-var _74=function(n){
+var _49=function(n){
 var w=d.attr(n,"width")||"auto";
 if((w!="auto")&&(w.slice(-2)!="em")&&(w.slice(-1)!="%")){
-w=parseInt(w)+"px";
+w=parseInt(w,10)+"px";
 }
 return w;
 };
-if(!_6f.structure&&_70.nodeName.toLowerCase()=="table"){
-_6f.structure=d.query("> colgroup",_70).map(function(cg){
+if(!_45.structure&&_46.nodeName.toLowerCase()=="table"){
+_45.structure=d.query("> colgroup",_46).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:[]};
+var v={noscroll:(d.attr(cg,"noscroll")=="true")?true:false,__span:(!!sv?parseInt(sv,10):1),cells:[]};
 if(d.hasAttr(cg,"width")){
-v.width=_74(cg);
+v.width=_49(cg);
 }
 return v;
 });
-if(!_6f.structure.length){
-_6f.structure.push({__span:Infinity,cells:[]});
-}
-d.query("thead > tr",_70).forEach(function(tr,_7b){
-var _7c=0;
-var _7d=0;
-var _7e;
-var _7f=null;
+if(!_45.structure.length){
+_45.structure.push({__span:Infinity,cells:[]});
+}
+d.query("thead > tr",_46).forEach(function(tr,_4a){
+var _4b=0;
+var _4c=0;
+var _4d;
+var _4e=null;
 d.query("> th",tr).map(function(th){
-if(!_7f){
-_7e=0;
-_7f=_6f.structure[0];
+if(!_4e){
+_4d=0;
+_4e=_45.structure[0];
 }else{
-if(_7c>=(_7e+_7f.__span)){
-_7d++;
-_7e+=_7f.__span;
-var _81=_7f;
-_7f=_6f.structure[_7d];
+if(_4b>=(_4d+_4e.__span)){
+_4c++;
+_4d+=_4e.__span;
+var _4f=_4e;
+_4e=_45.structure[_4c];
 }
 }
-var _82={name:d.trim(d.attr(th,"name")||th.innerHTML),colSpan:parseInt(d.attr(th,"colspan")||1,10),type:d.trim(d.attr(th,"cellType")||"")};
-_7c+=_82.colSpan;
-var _83=d.attr(th,"rowspan");
-if(_83){
-_82.rowSpan=_83;
+var _50={name:d.trim(d.attr(th,"name")||th.innerHTML),colSpan:parseInt(d.attr(th,"colspan")||1,10),type:d.trim(d.attr(th,"cellType")||""),id:d.trim(d.attr(th,"id")||"")};
+_4b+=_50.colSpan;
+var _51=d.attr(th,"rowspan");
+if(_51){
+_50.rowSpan=_51;
 }
 if(d.hasAttr(th,"width")){
-_82.width=_74(th);
+_50.width=_49(th);
 }
 if(d.hasAttr(th,"relWidth")){
-_82.relWidth=window.parseInt(dojo.attr(th,"relWidth"),10);
+_50.relWidth=window.parseInt(dojo.attr(th,"relWidth"),10);
 }
 if(d.hasAttr(th,"hidden")){
-_82.hidden=d.attr(th,"hidden")=="true";
+_50.hidden=d.attr(th,"hidden")=="true";
 }
-if(_72){
-_72(th,_82);
+if(_48){
+_48(th,_50);
 }
-_82.type=_82.type?dojo.getObject(_82.type):dojox.grid.cells.Cell;
-if(_82.type&&_82.type.markupFactory){
-_82.type.markupFactory(th,_82);
+_50.type=_50.type?dojo.getObject(_50.type):dojox.grid.cells.Cell;
+if(_50.type&&_50.type.markupFactory){
+_50.type.markupFactory(th,_50);
 }
-if(!_7f.cells[_7b]){
-_7f.cells[_7b]=[];
+if(!_4e.cells[_4a]){
+_4e.cells[_4a]=[];
 }
-_7f.cells[_7b].push(_82);
+_4e.cells[_4a].push(_50);
 });
 });
 }
-return new _71(_6f,_70);
+return new _47(_45,_46);
 };
 })();
 }
diff --git a/dojox/grid/_Layout.js b/dojox/grid/_Layout.js
index 2cb31db..7fc0c31 100644
--- a/dojox/grid/_Layout.js
+++ b/dojox/grid/_Layout.js
@@ -36,15 +36,16 @@ if(!_6){
 _b+=1;
 }
 _8.splice(_b,0,_9);
-var _e=this.grid.getCell(this.grid.getSortIndex());
-if(_e){
-_e._currentlySorted=this.grid.getSortAsc();
+var _c=this.grid.getCell(this.grid.getSortIndex());
+if(_c){
+_c._currentlySorted=this.grid.getSortAsc();
 }
 this.cells=[];
-var _4=0;
-for(var i=0,v;v=this.structure[i];i++){
+_4=0;
+var v;
+for(i=0;v=this.structure[i];i++){
 for(var j=0,cs;cs=v.cells[j];j++){
-for(var k=0,c;c=cs[k];k++){
+for(var k=0;c=cs[k];k++){
 c.index=_4;
 this.cells.push(c);
 if("_currentlySorted" in c){
@@ -58,104 +59,104 @@ _4++;
 }
 }
 this.grid.setupHeaderMenu();
-},setColumnVisibility:function(_14,_15){
-var _16=this.cells[_14];
-if(_16.hidden==_15){
-_16.hidden=!_15;
-var v=_16.view,w=v.viewWidth;
+},setColumnVisibility:function(_d,_e){
+var _f=this.cells[_d];
+if(_f.hidden==_e){
+_f.hidden=!_e;
+var v=_f.view,w=v.viewWidth;
 if(w&&w!="auto"){
-v._togglingColumn=dojo.marginBox(_16.getHeaderNode()).w||0;
+v._togglingColumn=dojo.marginBox(_f.getHeaderNode()).w||0;
 }
 v.update();
 return true;
 }else{
 return false;
 }
-},addCellDef:function(_19,_1a,_1b){
-var _1c=this;
-var _1d=function(_1e){
+},addCellDef:function(_10,_11,_12){
+var _13=this;
+var _14=function(_15){
 var w=0;
-if(_1e.colSpan>1){
+if(_15.colSpan>1){
 w=0;
 }else{
-w=_1e.width||_1c._defaultCellProps.width||_1c.defaultWidth;
+w=_15.width||_13._defaultCellProps.width||_13.defaultWidth;
 if(!isNaN(w)){
 w=w+"em";
 }
 }
 return w;
 };
-var _20={grid:this.grid,subrow:_19,layoutIndex:_1a,index:this.cells.length};
-if(_1b&&_1b instanceof dojox.grid.cells._Base){
-var _21=dojo.clone(_1b);
-_20.unitWidth=_1d(_21._props);
-_21=dojo.mixin(_21,this._defaultCellProps,_1b._props,_20);
-return _21;
-}
-var _22=_1b.type||this._defaultCellProps.type||dojox.grid.cells.Cell;
-_20.unitWidth=_1d(_1b);
-return new _22(dojo.mixin({},this._defaultCellProps,_1b,_20));
-},addRowDef:function(_23,_24){
-var _25=[];
-var _26=0,_27=0,_28=true;
-for(var i=0,def,_2b;(def=_24[i]);i++){
-_2b=this.addCellDef(_23,i,def);
-_25.push(_2b);
-this.cells.push(_2b);
-if(_28&&_2b.relWidth){
-_26+=_2b.relWidth;
+var _16={grid:this.grid,subrow:_10,layoutIndex:_11,index:this.cells.length};
+if(_12&&_12 instanceof dojox.grid.cells._Base){
+var _17=dojo.clone(_12);
+_16.unitWidth=_14(_17._props);
+_17=dojo.mixin(_17,this._defaultCellProps,_12._props,_16);
+return _17;
+}
+var _18=_12.type||this._defaultCellProps.type||dojox.grid.cells.Cell;
+_16.unitWidth=_14(_12);
+return new _18(dojo.mixin({},this._defaultCellProps,_12,_16));
+},addRowDef:function(_19,_1a){
+var _1b=[];
+var _1c=0,_1d=0,_1e=true;
+for(var i=0,def,_1f;(def=_1a[i]);i++){
+_1f=this.addCellDef(_19,i,def);
+_1b.push(_1f);
+this.cells.push(_1f);
+if(_1e&&_1f.relWidth){
+_1c+=_1f.relWidth;
 }else{
-if(_2b.width){
-var w=_2b.width;
+if(_1f.width){
+var w=_1f.width;
 if(typeof w=="string"&&w.slice(-1)=="%"){
-_27+=window.parseInt(w,10);
+_1d+=window.parseInt(w,10);
 }else{
 if(w=="auto"){
-_28=false;
+_1e=false;
 }
 }
 }
 }
 }
-if(_26&&_28){
-dojo.forEach(_25,function(_2d){
-if(_2d.relWidth){
-_2d.width=_2d.unitWidth=((_2d.relWidth/_26)*(100-_27))+"%";
+if(_1c&&_1e){
+dojo.forEach(_1b,function(_20){
+if(_20.relWidth){
+_20.width=_20.unitWidth=((_20.relWidth/_1c)*(100-_1d))+"%";
 }
 });
 }
-return _25;
-},addRowsDef:function(_2e){
-var _2f=[];
-if(dojo.isArray(_2e)){
-if(dojo.isArray(_2e[0])){
-for(var i=0,row;_2e&&(row=_2e[i]);i++){
-_2f.push(this.addRowDef(i,row));
+return _1b;
+},addRowsDef:function(_21){
+var _22=[];
+if(dojo.isArray(_21)){
+if(dojo.isArray(_21[0])){
+for(var i=0,row;_21&&(row=_21[i]);i++){
+_22.push(this.addRowDef(i,row));
 }
 }else{
-_2f.push(this.addRowDef(0,_2e));
+_22.push(this.addRowDef(0,_21));
 }
 }
-return _2f;
-},addViewDef:function(_32){
-this._defaultCellProps=_32.defaultCell||{};
-if(_32.width&&_32.width=="auto"){
-delete _32.width;
+return _22;
+},addViewDef:function(_23){
+this._defaultCellProps=_23.defaultCell||{};
+if(_23.width&&_23.width=="auto"){
+delete _23.width;
 }
-return dojo.mixin({},_32,{cells:this.addRowsDef(_32.rows||_32.cells)});
-},setStructure:function(_33){
+return dojo.mixin({},_23,{cells:this.addRowsDef(_23.rows||_23.cells)});
+},setStructure:function(_24){
 this.fieldIndex=0;
 this.cells=[];
 var s=this.structure=[];
 if(this.grid.rowSelector){
 var sel={type:dojox._scopeName+".grid._RowSelector"};
 if(dojo.isString(this.grid.rowSelector)){
-var _36=this.grid.rowSelector;
-if(_36=="false"){
+var _25=this.grid.rowSelector;
+if(_25=="false"){
 sel=null;
 }else{
-if(_36!="true"){
-sel["width"]=_36;
+if(_25!="true"){
+sel["width"]=_25;
 }
 }
 }else{
@@ -167,44 +168,44 @@ if(sel){
 s.push(this.addViewDef(sel));
 }
 }
-var _37=function(def){
+var _26=function(def){
 return ("name" in def||"field" in def||"get" in def);
 };
-var _39=function(def){
+var _27=function(def){
 if(dojo.isArray(def)){
-if(dojo.isArray(def[0])||_37(def[0])){
+if(dojo.isArray(def[0])||_26(def[0])){
 return true;
 }
 }
 return false;
 };
-var _3b=function(def){
-return (def!=null&&dojo.isObject(def)&&("cells" in def||"rows" in def||("type" in def&&!_37(def))));
+var _28=function(def){
+return (def!==null&&dojo.isObject(def)&&("cells" in def||"rows" in def||("type" in def&&!_26(def))));
 };
-if(dojo.isArray(_33)){
-var _3d=false;
-for(var i=0,st;(st=_33[i]);i++){
-if(_3b(st)){
-_3d=true;
+if(dojo.isArray(_24)){
+var _29=false;
+for(var i=0,st;(st=_24[i]);i++){
+if(_28(st)){
+_29=true;
 break;
 }
 }
-if(!_3d){
-s.push(this.addViewDef({cells:_33}));
+if(!_29){
+s.push(this.addViewDef({cells:_24}));
 }else{
-for(var i=0,st;(st=_33[i]);i++){
-if(_39(st)){
+for(i=0;(st=_24[i]);i++){
+if(_27(st)){
 s.push(this.addViewDef({cells:st}));
 }else{
-if(_3b(st)){
+if(_28(st)){
 s.push(this.addViewDef(st));
 }
 }
 }
 }
 }else{
-if(_3b(_33)){
-s.push(this.addViewDef(_33));
+if(_28(_24)){
+s.push(this.addViewDef(_24));
 }
 }
 this.cellCount=this.cells.length;
diff --git a/dojox/grid/_RadioSelector.js b/dojox/grid/_RadioSelector.js
new file mode 100644
index 0000000..235e401
--- /dev/null
+++ b/dojox/grid/_RadioSelector.js
@@ -0,0 +1,12 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid._RadioSelector"]){
+dojo._hasResource["dojox.grid._RadioSelector"]=true;
+dojo.provide("dojox.grid._RadioSelector");
+dojo.require("dojox.grid._Selector");
+}
diff --git a/dojox/grid/_RowManager.js b/dojox/grid/_RowManager.js
index 3521b8d..1ad2191 100644
--- a/dojox/grid/_RowManager.js
+++ b/dojox/grid/_RowManager.js
@@ -19,7 +19,7 @@ _2.style.cssText=_3;
 dojo.declare("dojox.grid._RowManager",null,{constructor:function(_4){
 this.grid=_4;
 },linesToEms:2,overRow:-2,prepareStylingRow:function(_5,_6){
-return {index:_5,node:_6,odd:Boolean(_5&1),selected:this.grid.selection.isSelected(_5),over:this.isOver(_5),customStyles:"",customClasses:"dojoxGridRow"};
+return {index:_5,node:_6,odd:Boolean(_5&1),selected:!!this.grid.selection.isSelected(_5),over:this.isOver(_5),customStyles:"",customClasses:"dojoxGridRow"};
 },styleRowNode:function(_7,_8){
 var _9=this.prepareStylingRow(_7,_8);
 this.grid.onStyleRow(_9);
@@ -30,17 +30,17 @@ i.node.className=i.customClasses;
 var h=i.node.style.height;
 _1(i.node,i.customStyles+";"+(i.node._style||""));
 i.node.style.height=h;
-},updateStyles:function(_d){
-this.grid.updateRowStyles(_d);
-},setOverRow:function(_e){
-var _f=this.overRow;
-this.overRow=_e;
-if((_f!=this.overRow)&&(_f>=0)){
-this.updateStyles(_f);
+},updateStyles:function(_b){
+this.grid.updateRowStyles(_b);
+},setOverRow:function(_c){
+var _d=this.overRow;
+this.overRow=_c;
+if((_d!=this.overRow)&&(dojo.isString(_d)||_d>=0)){
+this.updateStyles(_d);
 }
 this.updateStyles(this.overRow);
-},isOver:function(_10){
-return (this.overRow==_10);
+},isOver:function(_e){
+return (this.overRow==_e&&!dojo.hasClass(this.grid.domNode,"dojoxGridColumnResizing"));
 }});
 })();
 }
diff --git a/dojox/grid/_RowSelector.js b/dojox/grid/_RowSelector.js
index 060d225..561d856 100644
--- a/dojox/grid/_RowSelector.js
+++ b/dojox/grid/_RowSelector.js
@@ -16,21 +16,25 @@ this.headerNode.style.visibility="hidden";
 },getWidth:function(){
 return this.viewWidth||this.defaultWidth;
 },buildRowContent:function(_1,_2){
-var w=this.contentNode.offsetWidth-this.padBorderWidth;
-_2.innerHTML="<table class=\"dojoxGridRowbarTable\" style=\"width:"+w+"px;\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" role=\""+(dojo.isFF<3?"wairole:":"")+"presentation\"><tr><td class=\"dojoxGridRowbarInner\"> </td></tr></table>";
+var w=this.contentWidth||0;
+_2.innerHTML="<table class=\"dojoxGridRowbarTable\" style=\"width:"+w+"px;height:1px;\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" role=\"presentation\"><tr><td class=\"dojoxGridRowbarInner\"> </td></tr></table>";
 },renderHeader:function(){
+},updateRow:function(){
 },resize:function(){
 this.adaptHeight();
 },adaptWidth:function(){
-},doStyleRowNode:function(_4,_5){
-var n=["dojoxGridRowbar"];
-if(this.grid.rows.isOver(_4)){
+if(!("contentWidth" in this)&&this.contentNode){
+this.contentWidth=this.contentNode.offsetWidth-this.padBorderWidth;
+}
+},doStyleRowNode:function(_3,_4){
+var n=["dojoxGridRowbar dojoxGridNonNormalizedCell"];
+if(this.grid.rows.isOver(_3)){
 n.push("dojoxGridRowbarOver");
 }
-if(this.grid.selection.isSelected(_4)){
+if(this.grid.selection.isSelected(_3)){
 n.push("dojoxGridRowbarSelected");
 }
-_5.className=n.join(" ");
+_4.className=n.join(" ");
 },domouseover:function(e){
 this.grid.onMouseOverRow(e);
 },domouseout:function(e){
diff --git a/dojox/grid/_Scroller.js b/dojox/grid/_Scroller.js
index 0c88b42..10ffb60 100644
--- a/dojox/grid/_Scroller.js
+++ b/dojox/grid/_Scroller.js
@@ -18,49 +18,52 @@ return i-1;
 }
 return -1;
 };
-var _6=function(_7){
-if(!_7){
+var _3=function(_4){
+if(!_4){
 return;
 }
-var _8=function(_9){
-return _9.domNode&&dojo.isDescendant(_9.domNode,_7,true);
+var _5=function(_6){
+return _6.domNode&&dojo.isDescendant(_6.domNode,_4,true);
 };
-var ws=dijit.registry.filter(_8);
+var ws=dijit.registry.filter(_5);
 for(var i=0,w;(w=ws[i]);i++){
 w.destroy();
 }
 delete ws;
 };
-var _d=function(_e){
-var _f=dojo.byId(_e);
-return (_f&&_f.tagName?_f.tagName.toLowerCase():"");
+var _7=function(_8){
+var _9=dojo.byId(_8);
+return (_9&&_9.tagName?_9.tagName.toLowerCase():"");
 };
-var _10=function(_11,_12){
-var _13=[];
+var _a=function(_b,_c){
+var _d=[];
 var i=0,n;
-while((n=_11.childNodes[i++])){
-if(_d(n)==_12){
-_13.push(n);
+while((n=_b.childNodes[i])){
+i++;
+if(_7(n)==_c){
+_d.push(n);
 }
 }
-return _13;
+return _d;
 };
-var _16=function(_17){
-return _10(_17,"div");
+var _e=function(_f){
+return _a(_f,"div");
 };
-dojo.declare("dojox.grid._Scroller",null,{constructor:function(_18){
-this.setContentNodes(_18);
+dojo.declare("dojox.grid._Scroller",null,{constructor:function(_10){
+this.setContentNodes(_10);
 this.pageHeights=[];
 this.pageNodes=[];
 this.stack=[];
-},rowCount:0,defaultRowHeight:32,keepRows:100,contentNode:null,scrollboxNode:null,defaultPageHeight:0,keepPages:10,pageCount:0,windowHeight:0,firstVisibleRow:0,lastVisibleRow:0,averageRowHeight:0,page:0,pageTop:0,init:function(_19,_1a,_1b){
+},rowCount:0,defaultRowHeight:32,keepRows:100,contentNode:null,scrollboxNode:null,defaultPageHeight:0,keepPages:10,pageCount:0,windowHeight:0,firstVisibleRow:0,lastVisibleRow:0,averageRowHeight:0,page:0,pageTop:0,init:function(_11,_12,_13){
 switch(arguments.length){
 case 3:
-this.rowsPerPage=_1b;
+this.rowsPerPage=_13;
 case 2:
-this.keepRows=_1a;
+this.keepRows=_12;
 case 1:
-this.rowCount=_19;
+this.rowCount=_11;
+default:
+break;
 }
 this.defaultPageHeight=this.defaultRowHeight*this.rowsPerPage;
 this.pageCount=this._getPageCount(this.rowCount,this.rowsPerPage);
@@ -71,18 +74,18 @@ this.scrollboxNode.scrollTop=0;
 this.scroll(0);
 this.scrollboxNode.onscroll=dojo.hitch(this,"onscroll");
 }
-},_getPageCount:function(_1c,_1d){
-return _1c?(Math.ceil(_1c/_1d)||1):0;
+},_getPageCount:function(_14,_15){
+return _14?(Math.ceil(_14/_15)||1):0;
 },destroy:function(){
 this.invalidateNodes();
 delete this.contentNodes;
 delete this.contentNode;
 delete this.scrollboxNode;
-},setKeepInfo:function(_1e){
-this.keepRows=_1e;
-this.keepPages=!this.keepRows?this.keepRows:Math.max(Math.ceil(this.keepRows/this.rowsPerPage),2);
-},setContentNodes:function(_1f){
-this.contentNodes=_1f;
+},setKeepInfo:function(_16){
+this.keepRows=_16;
+this.keepPages=!this.keepRows?this.keepPages:Math.max(Math.ceil(this.keepRows/this.rowsPerPage),2);
+},setContentNodes:function(_17){
+this.contentNodes=_17;
 this.colCount=(this.contentNodes?this.contentNodes.length:0);
 this.pageNodes=[];
 for(var i=0;i<this.colCount;i++){
@@ -91,48 +94,54 @@ this.pageNodes[i]=[];
 },getDefaultNodes:function(){
 return this.pageNodes[0]||[];
 },invalidate:function(){
+this._invalidating=true;
 this.invalidateNodes();
 this.pageHeights=[];
 this.height=(this.pageCount?(this.pageCount-1)*this.defaultPageHeight+this.calcLastPageHeight():0);
 this.resize();
-},updateRowCount:function(_21){
+this._invalidating=false;
+},updateRowCount:function(_18){
 this.invalidateNodes();
-this.rowCount=_21;
-var _22=this.pageCount;
-if(_22===0){
+this.rowCount=_18;
+var _19=this.pageCount;
+if(_19===0){
 this.height=1;
 }
 this.pageCount=this._getPageCount(this.rowCount,this.rowsPerPage);
-if(this.pageCount<_22){
-for(var i=_22-1;i>=this.pageCount;i--){
+if(this.pageCount<_19){
+for(var i=_19-1;i>=this.pageCount;i--){
 this.height-=this.getPageHeight(i);
 delete this.pageHeights[i];
 }
 }else{
-if(this.pageCount>_22){
-this.height+=this.defaultPageHeight*(this.pageCount-_22-1)+this.calcLastPageHeight();
+if(this.pageCount>_19){
+this.height+=this.defaultPageHeight*(this.pageCount-_19-1)+this.calcLastPageHeight();
 }
 }
 this.resize();
-},pageExists:function(_24){
-return Boolean(this.getDefaultPageNode(_24));
-},measurePage:function(_25){
-var n=this.getDefaultPageNode(_25);
-return (n&&n.innerHTML)?n.offsetHeight:0;
-},positionPage:function(_27,_28){
+},pageExists:function(_1a){
+return Boolean(this.getDefaultPageNode(_1a));
+},measurePage:function(_1b){
+if(this.grid.rowHeight){
+var _1c=this.grid.rowHeight+1;
+return ((_1b+1)*this.rowsPerPage>this.rowCount?this.rowCount-_1b*this.rowsPerPage:this.rowsPerPage)*_1c;
+}
+var n=this.getDefaultPageNode(_1b);
+return (n&&n.innerHTML)?n.offsetHeight:undefined;
+},positionPage:function(_1d,_1e){
 for(var i=0;i<this.colCount;i++){
-this.pageNodes[i][_27].style.top=_28+"px";
+this.pageNodes[i][_1d].style.top=_1e+"px";
 }
-},repositionPages:function(_2a){
-var _2b=this.getDefaultNodes();
-var _2c=0;
+},repositionPages:function(_1f){
+var _20=this.getDefaultNodes();
+var _21=0;
 for(var i=0;i<this.stack.length;i++){
-_2c=Math.max(this.stack[i],_2c);
+_21=Math.max(this.stack[i],_21);
 }
-var n=_2b[_2a];
-var y=(n?this.getPageNodePosition(n)+this.getPageHeight(_2a):0);
-for(var p=_2a+1;p<=_2c;p++){
-n=_2b[p];
+var n=_20[_1f];
+var y=(n?this.getPageNodePosition(n)+this.getPageHeight(_1f):0);
+for(var p=_1f+1;p<=_21;p++){
+n=_20[p];
 if(n){
 if(this.getPageNodePosition(n)==y){
 return;
@@ -141,51 +150,51 @@ this.positionPage(p,y);
 }
 y+=this.getPageHeight(p);
 }
-},installPage:function(_31){
+},installPage:function(_22){
 for(var i=0;i<this.colCount;i++){
-this.contentNodes[i].appendChild(this.pageNodes[i][_31]);
+this.contentNodes[i].appendChild(this.pageNodes[i][_22]);
 }
-},preparePage:function(_33,_34){
-var p=(_34?this.popPage():null);
-for(var i=0;i<this.colCount;i++){
-var _37=this.pageNodes[i];
-var _38=(p===null?this.createPageNode():this.invalidatePageNode(p,_37));
-_38.pageIndex=_33;
-_38.id=(this._pageIdPrefix||"")+"page-"+_33;
-_37[_33]=_38;
-}
-},renderPage:function(_39){
-var _3a=[];
+},preparePage:function(_23,_24){
+var p=(_24?this.popPage():null);
 for(var i=0;i<this.colCount;i++){
-_3a[i]=this.pageNodes[i][_39];
-}
-for(var i=0,j=_39*this.rowsPerPage;(i<this.rowsPerPage)&&(j<this.rowCount);i++,j++){
-this.renderRow(j,_3a);
-}
-},removePage:function(_3d){
-for(var i=0,j=_3d*this.rowsPerPage;i<this.rowsPerPage;i++,j++){
+var _25=this.pageNodes[i];
+var _26=(p===null?this.createPageNode():this.invalidatePageNode(p,_25));
+_26.pageIndex=_23;
+_25[_23]=_26;
+}
+},renderPage:function(_27){
+var _28=[];
+var i,j;
+for(i=0;i<this.colCount;i++){
+_28[i]=this.pageNodes[i][_27];
+}
+for(i=0,j=_27*this.rowsPerPage;(i<this.rowsPerPage)&&(j<this.rowCount);i++,j++){
+this.renderRow(j,_28);
+}
+},removePage:function(_29){
+for(var i=0,j=_29*this.rowsPerPage;i<this.rowsPerPage;i++,j++){
 this.removeRow(j);
 }
-},destroyPage:function(_40){
+},destroyPage:function(_2a){
 for(var i=0;i<this.colCount;i++){
-var n=this.invalidatePageNode(_40,this.pageNodes[i]);
+var n=this.invalidatePageNode(_2a,this.pageNodes[i]);
 if(n){
 dojo.destroy(n);
 }
 }
-},pacify:function(_43){
-},pacifying:false,pacifyTicks:200,setPacifying:function(_44){
-if(this.pacifying!=_44){
-this.pacifying=_44;
+},pacify:function(_2b){
+},pacifying:false,pacifyTicks:200,setPacifying:function(_2c){
+if(this.pacifying!=_2c){
+this.pacifying=_2c;
 this.pacify(this.pacifying);
 }
 },startPacify:function(){
 this.startPacifyTicks=new Date().getTime();
 },doPacify:function(){
-var _45=(new Date().getTime()-this.startPacifyTicks)>this.pacifyTicks;
+var _2d=(new Date().getTime()-this.startPacifyTicks)>this.pacifyTicks;
 this.setPacifying(true);
 this.startPacify();
-return _45;
+return _2d;
 },endPacify:function(){
 this.setPacifying(false);
 },resize:function(){
@@ -195,33 +204,52 @@ this.windowHeight=this.scrollboxNode.clientHeight;
 for(var i=0;i<this.colCount;i++){
 dojox.grid.util.setStyleHeightPx(this.contentNodes[i],Math.max(1,this.height));
 }
+var _2e=(!this._invalidating);
+if(!_2e){
+var ah=this.grid.attr("autoHeight");
+if(typeof ah=="number"&&ah<=Math.min(this.rowsPerPage,this.rowCount)){
+_2e=true;
+}
+}
+if(_2e){
 this.needPage(this.page,this.pageTop);
-var _47=(this.page<this.pageCount-1)?this.rowsPerPage:((this.rowCount%this.rowsPerPage)||this.rowsPerPage);
-var _48=this.getPageHeight(this.page);
-this.averageRowHeight=(_48>0&&_47>0)?(_48/_47):0;
+}
+var _2f=(this.page<this.pageCount-1)?this.rowsPerPage:((this.rowCount%this.rowsPerPage)||this.rowsPerPage);
+var _30=this.getPageHeight(this.page);
+this.averageRowHeight=(_30>0&&_2f>0)?(_30/_2f):0;
 },calcLastPageHeight:function(){
 if(!this.pageCount){
 return 0;
 }
-var _49=this.pageCount-1;
-var _4a=((this.rowCount%this.rowsPerPage)||(this.rowsPerPage))*this.defaultRowHeight;
-this.pageHeights[_49]=_4a;
-return _4a;
-},updateContentHeight:function(_4b){
-this.height+=_4b;
+var _31=this.pageCount-1;
+var _32=((this.rowCount%this.rowsPerPage)||(this.rowsPerPage))*this.defaultRowHeight;
+this.pageHeights[_31]=_32;
+return _32;
+},updateContentHeight:function(_33){
+this.height+=_33;
 this.resize();
-},updatePageHeight:function(_4c){
-if(this.pageExists(_4c)){
-var oh=this.getPageHeight(_4c);
-var h=(this.measurePage(_4c))||(oh);
-this.pageHeights[_4c]=h;
-if((h)&&(oh!=h)){
+},updatePageHeight:function(_34,_35){
+if(this.pageExists(_34)){
+var oh=this.getPageHeight(_34);
+var h=(this.measurePage(_34));
+if(h===undefined){
+h=oh;
+}
+this.pageHeights[_34]=h;
+if(oh!=h){
 this.updateContentHeight(h-oh);
-this.repositionPages(_4c);
+var ah=this.grid.attr("autoHeight");
+if((typeof ah=="number"&&ah>this.rowCount)||(ah===true&&!_35)){
+this.grid.sizeChange();
+}else{
+this.repositionPages(_34);
+}
 }
+return h;
 }
-},rowHeightChanged:function(_4f){
-this.updatePageHeight(Math.floor(_4f/this.rowsPerPage));
+return 0;
+},rowHeightChanged:function(_36){
+this.updatePageHeight(Math.floor(_36/this.rowsPerPage),false);
 },invalidateNodes:function(){
 while(this.stack.length){
 this.destroyPage(this.popPage());
@@ -232,145 +260,142 @@ dojo.attr(p,"role","presentation");
 p.style.position="absolute";
 p.style[dojo._isBodyLtr()?"left":"right"]="0";
 return p;
-},getPageHeight:function(_51){
-var ph=this.pageHeights[_51];
+},getPageHeight:function(_37){
+var ph=this.pageHeights[_37];
 return (ph!==undefined?ph:this.defaultPageHeight);
-},pushPage:function(_53){
-return this.stack.push(_53);
+},pushPage:function(_38){
+return this.stack.push(_38);
 },popPage:function(){
 return this.stack.shift();
-},findPage:function(_54){
+},findPage:function(_39){
 var i=0,h=0;
 for(var ph=0;i<this.pageCount;i++,h+=ph){
 ph=this.getPageHeight(i);
-if(h+ph>=_54){
+if(h+ph>=_39){
 break;
 }
 }
 this.page=i;
 this.pageTop=h;
-},buildPage:function(_58,_59,_5a){
-this.preparePage(_58,_59);
-this.positionPage(_58,_5a);
-this.installPage(_58);
-this.renderPage(_58);
-this.pushPage(_58);
-},needPage:function(_5b,_5c){
-var h=this.getPageHeight(_5b),oh=h;
-if(!this.pageExists(_5b)){
-this.buildPage(_5b,this.keepPages&&(this.stack.length>=this.keepPages),_5c);
-h=this.measurePage(_5b)||h;
-this.pageHeights[_5b]=h;
-if(h&&(oh!=h)){
-this.updateContentHeight(h-oh);
-}
+},buildPage:function(_3a,_3b,_3c){
+this.preparePage(_3a,_3b);
+this.positionPage(_3a,_3c);
+this.installPage(_3a);
+this.renderPage(_3a);
+this.pushPage(_3a);
+},needPage:function(_3d,_3e){
+var h=this.getPageHeight(_3d),oh=h;
+if(!this.pageExists(_3d)){
+this.buildPage(_3d,this.keepPages&&(this.stack.length>=this.keepPages),_3e);
+h=this.updatePageHeight(_3d,true);
 }else{
-this.positionPage(_5b,_5c);
+this.positionPage(_3d,_3e);
 }
 return h;
 },onscroll:function(){
 this.scroll(this.scrollboxNode.scrollTop);
-},scroll:function(_5f){
-this.grid.scrollTop=_5f;
+},scroll:function(_3f){
+this.grid.scrollTop=_3f;
 if(this.colCount){
 this.startPacify();
-this.findPage(_5f);
+this.findPage(_3f);
 var h=this.height;
-var b=this.getScrollBottom(_5f);
+var b=this.getScrollBottom(_3f);
 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,_5f);
+this.firstVisibleRow=this.getFirstVisibleRow(this.page,this.pageTop,_3f);
 this.lastVisibleRow=this.getLastVisibleRow(p-1,y,b);
 if(h!=this.height){
 this.repositionPages(p-1);
 }
 this.endPacify();
 }
-},getScrollBottom:function(_64){
-return (this.windowHeight>=0?_64+this.windowHeight:-1);
-},processNodeEvent:function(e,_66){
+},getScrollBottom:function(_40){
+return (this.windowHeight>=0?_40+this.windowHeight:-1);
+},processNodeEvent:function(e,_41){
 var t=e.target;
-while(t&&(t!=_66)&&t.parentNode&&(t.parentNode.parentNode!=_66)){
+while(t&&(t!=_41)&&t.parentNode&&(t.parentNode.parentNode!=_41)){
 t=t.parentNode;
 }
-if(!t||!t.parentNode||(t.parentNode.parentNode!=_66)){
+if(!t||!t.parentNode||(t.parentNode.parentNode!=_41)){
 return false;
 }
-var _68=t.parentNode;
-e.topRowIndex=_68.pageIndex*this.rowsPerPage;
+var _42=t.parentNode;
+e.topRowIndex=_42.pageIndex*this.rowsPerPage;
 e.rowIndex=e.topRowIndex+_1(t);
 e.rowTarget=t;
 return true;
 },processEvent:function(e){
 return this.processNodeEvent(e,this.contentNode);
-},renderRow:function(_6a,_6b){
-},removeRow:function(_6c){
-},getDefaultPageNode:function(_6d){
-return this.getDefaultNodes()[_6d];
-},positionPageNode:function(_6e,_6f){
-},getPageNodePosition:function(_70){
-return _70.offsetTop;
-},invalidatePageNode:function(_71,_72){
-var p=_72[_71];
+},renderRow:function(_43,_44){
+},removeRow:function(_45){
+},getDefaultPageNode:function(_46){
+return this.getDefaultNodes()[_46];
+},positionPageNode:function(_47,_48){
+},getPageNodePosition:function(_49){
+return _49.offsetTop;
+},invalidatePageNode:function(_4a,_4b){
+var p=_4b[_4a];
 if(p){
-delete _72[_71];
-this.removePage(_71,p);
-_6(p);
+delete _4b[_4a];
+this.removePage(_4a,p);
+_3(p);
 p.innerHTML="";
 }
 return p;
-},getPageRow:function(_74){
-return _74*this.rowsPerPage;
-},getLastPageRow:function(_75){
-return Math.min(this.rowCount,this.getPageRow(_75+1))-1;
-},getFirstVisibleRow:function(_76,_77,_78){
-if(!this.pageExists(_76)){
+},getPageRow:function(_4c){
+return _4c*this.rowsPerPage;
+},getLastPageRow:function(_4d){
+return Math.min(this.rowCount,this.getPageRow(_4d+1))-1;
+},getFirstVisibleRow:function(_4e,_4f,_50){
+if(!this.pageExists(_4e)){
 return 0;
 }
-var row=this.getPageRow(_76);
-var _7a=this.getDefaultNodes();
-var _7b=_16(_7a[_76]);
-for(var i=0,l=_7b.length;i<l&&_77<_78;i++,row++){
-_77+=_7b[i].offsetHeight;
+var row=this.getPageRow(_4e);
+var _51=this.getDefaultNodes();
+var _52=_e(_51[_4e]);
+for(var i=0,l=_52.length;i<l&&_4f<_50;i++,row++){
+_4f+=_52[i].offsetHeight;
 }
 return (row?row-1:row);
-},getLastVisibleRow:function(_7e,_7f,_80){
-if(!this.pageExists(_7e)){
+},getLastVisibleRow:function(_53,_54,_55){
+if(!this.pageExists(_53)){
 return 0;
 }
-var _81=this.getDefaultNodes();
-var row=this.getLastPageRow(_7e);
-var _83=_16(_81[_7e]);
-for(var i=_83.length-1;i>=0&&_7f>_80;i--,row--){
-_7f-=_83[i].offsetHeight;
+var _56=this.getDefaultNodes();
+var row=this.getLastPageRow(_53);
+var _57=_e(_56[_53]);
+for(var i=_57.length-1;i>=0&&_54>_55;i--,row--){
+_54-=_57[i].offsetHeight;
 }
 return row+1;
-},findTopRow:function(_85){
-var _86=this.getDefaultNodes();
-var _87=_16(_86[this.page]);
-for(var i=0,l=_87.length,t=this.pageTop,h;i<l;i++){
-h=_87[i].offsetHeight;
+},findTopRow:function(_58){
+var _59=this.getDefaultNodes();
+var _5a=_e(_59[this.page]);
+for(var i=0,l=_5a.length,t=this.pageTop,h;i<l;i++){
+h=_5a[i].offsetHeight;
 t+=h;
-if(t>=_85){
-this.offset=h-(t-_85);
+if(t>=_58){
+this.offset=h-(t-_58);
 return i+this.page*this.rowsPerPage;
 }
 }
 return -1;
-},findScrollTop:function(_8c){
-var _8d=Math.floor(_8c/this.rowsPerPage);
+},findScrollTop:function(_5b){
+var _5c=Math.floor(_5b/this.rowsPerPage);
 var t=0;
-for(var i=0;i<_8d;i++){
+var i,l;
+for(i=0;i<_5c;i++){
 t+=this.getPageHeight(i);
 }
 this.pageTop=t;
-this.needPage(_8d,this.pageTop);
-var _90=this.getDefaultNodes();
-var _91=_16(_90[_8d]);
-var r=_8c-this.rowsPerPage*_8d;
-for(var i=0,l=_91.length;i<l&&i<r;i++){
-t+=_91[i].offsetHeight;
+this.needPage(_5c,this.pageTop);
+var _5d=this.getDefaultNodes();
+var _5e=_e(_5d[_5c]);
+var r=_5b-this.rowsPerPage*_5c;
+for(i=0,l=_5e.length;i<l&&i<r;i++){
+t+=_5e[i].offsetHeight;
 }
 return t;
 },dummy:0});
diff --git a/dojox/grid/_Selector.js b/dojox/grid/_Selector.js
new file mode 100644
index 0000000..24ae190
--- /dev/null
+++ b/dojox/grid/_Selector.js
@@ -0,0 +1,160 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid._Selector"]){
+dojo._hasResource["dojox.grid._Selector"]=true;
+dojo.provide("dojox.grid._Selector");
+dojo.require("dojox.grid.Selection");
+dojo.require("dojox.grid._View");
+dojo.require("dojox.grid._Builder");
+(function(){
+dojox.grid._InputSelectorHeaderBuilder=dojo.extend(function(_1){
+dojox.grid._HeaderBuilder.call(this,_1);
+},dojox.grid._HeaderBuilder.prototype,{generateHtml:function(){
+var w=this.view.contentWidth||0;
+var _2=this.view.grid.selection.getSelectedCount();
+var _3=(_2&&_2==this.view.grid.rowCount)?" dijitCheckBoxChecked dijitChecked":"";
+return "<table style=\"width:"+w+"px;\" "+"border=\"0\" cellspacing=\"0\" cellpadding=\"0\" "+"role=\"presentation\"><tr><th style=\"text-align: center;\">"+"<div class=\"dojoxGridCheckSelector dijitReset dijitInline dijitCheckBox"+_3+"\"></div></th></tr></table>";
+},doclick:function(e){
+var _4=this.view.grid.selection.getSelectedCount();
+this.view._selectionChanging=true;
+if(_4==this.view.grid.rowCount){
+this.view.grid.selection.deselectAll();
+}else{
+this.view.grid.selection.selectRange(0,this.view.grid.rowCount-1);
+}
+this.view._selectionChanging=false;
+this.view.onSelectionChanged();
+return true;
+}});
+dojox.grid._SelectorContentBuilder=dojo.extend(function(_5){
+dojox.grid._ContentBuilder.call(this,_5);
+},dojox.grid._ContentBuilder.prototype,{generateHtml:function(_6,_7){
+var w=this.view.contentWidth||0;
+return "<table class=\"dojoxGridRowbarTable\" style=\"width:"+w+"px;\" border=\"0\" "+"cellspacing=\"0\" cellpadding=\"0\" role=\"presentation\"><tr>"+"<td  style=\"text-align: center;\" class=\"dojoxGridRowbarInner\">"+this.getCellContent(_7)+"</td></tr></table>";
+},getCellContent:function(_8){
+return " ";
+},findTarget:function(){
+var t=dojox.grid._ContentBuilder.prototype.findTarget.apply(this,arguments);
+return t;
+},domouseover:function(e){
+this.view.grid.onMouseOverRow(e);
+},domouseout:function(e){
+if(!this.isIntraRowEvent(e)){
+this.view.grid.onMouseOutRow(e);
+}
+},doclick:function(e){
+var _9=e.rowIndex;
+var _a=this.view.grid.selection.isSelected(_9);
+var _b=this.view.grid.selection.mode;
+if(!_a){
+if(_b=="single"){
+this.view.grid.selection.select(_9);
+}else{
+if(_b!="none"){
+this.view.grid.selection.addToSelection(_9);
+}
+}
+}else{
+this.view.grid.selection.deselect(_9);
+}
+return true;
+}});
+dojox.grid._InputSelectorContentBuilder=dojo.extend(function(_c){
+dojox.grid._SelectorContentBuilder.call(this,_c);
+},dojox.grid._SelectorContentBuilder.prototype,{getCellContent:function(_d){
+var v=this.view;
+var _e=v.inputType=="checkbox"?"CheckBox":"Radio";
+var _f=!!v.grid.selection.isSelected(_d)?" dijit"+_e+"Checked dijitChecked":"";
+return "<div class=\"dojoxGridCheckSelector dijitReset dijitInline dijit"+_e+_f+"\"></div>";
+}});
+dojo.declare("dojox.grid._Selector",dojox.grid._View,{inputType:"",selectionMode:"",defaultWidth:"2em",noscroll:true,padBorderWidth:2,_contentBuilderClass:dojox.grid._SelectorContentBuilder,postCreate:function(){
+this.inherited(arguments);
+if(this.selectionMode){
+this.grid.selection.mode=this.selectionMode;
+}
+this.connect(this.grid.selection,"onSelected","onSelected");
+this.connect(this.grid.selection,"onDeselected","onDeselected");
+},buildRendering:function(){
+this.inherited(arguments);
+this.scrollboxNode.style.overflow="hidden";
+},getWidth:function(){
+return this.viewWidth||this.defaultWidth;
+},resize:function(){
+this.adaptHeight();
+},setStructure:function(s){
+this.inherited(arguments);
+if(s.defaultWidth){
+this.defaultWidth=s.defaultWidth;
+}
+},adaptWidth:function(){
+if(!("contentWidth" in this)&&this.contentNode){
+this.contentWidth=this.contentNode.offsetWidth-this.padBorderWidth;
+}
+},doStyleRowNode:function(_10,_11){
+var n=["dojoxGridRowbar dojoxGridNonNormalizedCell"];
+if(this.grid.rows.isOver(_10)){
+n.push("dojoxGridRowbarOver");
+}
+if(this.grid.selection.isSelected(_10)){
+n.push("dojoxGridRowbarSelected");
+}
+_11.className=n.join(" ");
+},onSelected:function(_12){
+this.grid.updateRow(_12);
+},onDeselected:function(_13){
+this.grid.updateRow(_13);
+}});
+if(!dojox.grid._View.prototype._headerBuilderClass&&!dojox.grid._View.prototype._contentBuilderClass){
+dojox.grid._Selector.prototype.postCreate=function(){
+this.connect(this.scrollboxNode,"onscroll","doscroll");
+dojox.grid.util.funnelEvents(this.contentNode,this,"doContentEvent",["mouseover","mouseout","click","dblclick","contextmenu","mousedown"]);
+dojox.grid.util.funnelEvents(this.headerNode,this,"doHeaderEvent",["dblclick","mouseover","mouseout","mousemove","mousedown","click","contextmenu"]);
+if(this._contentBuilderClass){
+this.content=new this._contentBuilderClass(this);
+}else{
+this.content=new dojox.grid._ContentBuilder(this);
+}
+if(this._headerBuilderClass){
+this.header=new this._headerBuilderClass(this);
+}else{
+this.header=new dojox.grid._HeaderBuilder(this);
+}
+if(!dojo._isBodyLtr()){
+this.headerNodeContainer.style.width="";
+}
+this.connect(this.grid.selection,"onSelected","onSelected");
+this.connect(this.grid.selection,"onDeselected","onDeselected");
+};
+}
+dojo.declare("dojox.grid._RadioSelector",dojox.grid._Selector,{inputType:"radio",selectionMode:"single",_contentBuilderClass:dojox.grid._InputSelectorContentBuilder,buildRendering:function(){
+this.inherited(arguments);
+this.headerNode.style.visibility="hidden";
+},renderHeader:function(){
+}});
+dojo.declare("dojox.grid._CheckBoxSelector",dojox.grid._Selector,{inputType:"checkbox",_headerBuilderClass:dojox.grid._InputSelectorHeaderBuilder,_contentBuilderClass:dojox.grid._InputSelectorContentBuilder,postCreate:function(){
+this.inherited(arguments);
+this.connect(this.grid,"onSelectionChanged","onSelectionChanged");
+this.connect(this.grid,"updateRowCount","_updateVisibility");
+},renderHeader:function(){
+this.inherited(arguments);
+this._updateVisibility(this.grid.rowCount);
+},_updateVisibility:function(_14){
+this.headerNode.style.visibility=_14?"":"hidden";
+},onSelectionChanged:function(){
+if(this._selectionChanging){
+return;
+}
+var _15=dojo.query(".dojoxGridCheckSelector",this.headerNode)[0];
+var g=this.grid;
+var s=(g.rowCount&&g.rowCount==g.selection.getSelectedCount());
+g.allItemsSelected=s||false;
+dojo.toggleClass(_15,"dijitChecked",g.allItemsSelected);
+dojo.toggleClass(_15,"dijitCheckBoxChecked",g.allItemsSelected);
+}});
+})();
+}
diff --git a/dojox/grid/_TreeView.js b/dojox/grid/_TreeView.js
new file mode 100644
index 0000000..35bb571
--- /dev/null
+++ b/dojox/grid/_TreeView.js
@@ -0,0 +1,408 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid._TreeView"]){
+dojo._hasResource["dojox.grid._TreeView"]=true;
+dojo.provide("dojox.grid._TreeView");
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+dojo.require("dojox.grid._View");
+dojo.declare("dojox.grid._Expando",[dijit._Widget,dijit._Templated],{open:false,toggleClass:"",itemId:"",cellIdx:-1,view:null,rowNode:null,rowIdx:-1,expandoCell:null,level:0,templateString:"<div class=\"dojoxGridExpando\"\n\t><div class=\"dojoxGridExpandoNode\" dojoAttachEvent=\"onclick:onToggle\"\n\t\t><div class=\"dojoxGridExpandoNodeInner\" dojoAttachPoint=\"expandoInner\"></div\n\t></div\n></div>\n",_toggleRows:function(_1,_2){
+if(!_1||!this.rowNode){
+return;
+}
+if(dojo.query("table.dojoxGridRowTableNeedsRowUpdate").length){
+if(this._initialized){
+this.view.grid.updateRow(this.rowIdx);
+}
+return;
+}
+var _3=this;
+var g=this.view.grid;
+if(g.treeModel){
+var p=this._tableRow?dojo.attr(this._tableRow,"dojoxTreeGridPath"):"";
+if(p){
+dojo.query("tr[dojoxTreeGridPath^=\""+p+"/\"]",this.rowNode).forEach(function(n){
+var en=dojo.query(".dojoxGridExpando",n)[0];
+if(en&&en.parentNode&&en.parentNode.parentNode&&!dojo.hasClass(en.parentNode.parentNode,"dojoxGridNoChildren")){
+var ew=dijit.byNode(en);
+if(ew){
+ew._toggleRows(_1,ew.open&&_2);
+}
+}
+n.style.display=_2?"":"none";
+});
+}
+}else{
+dojo.query("tr."+_1,this.rowNode).forEach(function(n){
+if(dojo.hasClass(n,"dojoxGridExpandoRow")){
+var en=dojo.query(".dojoxGridExpando",n)[0];
+if(en){
+var ew=dijit.byNode(en);
+var _4=ew?ew.toggleClass:en.getAttribute("toggleClass");
+var _5=ew?ew.open:_3.expandoCell.getOpenState(en.getAttribute("itemId"));
+_3._toggleRows(_4,_5&&_2);
+}
+}
+n.style.display=_2?"":"none";
+});
+}
+},setOpen:function(_6){
+if(_6&&dojo.hasClass(this.domNode,"dojoxGridExpandoLoading")){
+_6=false;
+}
+var _7=this.view;
+var _8=_7.grid;
+var _9=_8.store;
+var _a=_8.treeModel;
+var d=this;
+var _b=this.rowIdx;
+var me=_8._by_idx[_b];
+if(!me){
+return;
+}
+if(_a&&!this._loadedChildren){
+if(_6){
+var _c=_8.getItem(dojo.attr(this._tableRow,"dojoxTreeGridPath"));
+if(_c){
+this.expandoInner.innerHTML="o";
+dojo.addClass(this.domNode,"dojoxGridExpandoLoading");
+_a.getChildren(_c,function(_d){
+d._loadedChildren=true;
+d._setOpen(_6);
+});
+}else{
+this._setOpen(_6);
+}
+}else{
+this._setOpen(_6);
+}
+}else{
+if(!_a&&_9){
+if(_6){
+var _e=_8._by_idx[this.rowIdx];
+if(_e&&!_9.isItemLoaded(_e.item)){
+this.expandoInner.innerHTML="o";
+dojo.addClass(this.domNode,"dojoxGridExpandoLoading");
+_9.loadItem({item:_e.item,onItem:dojo.hitch(this,function(i){
+var _f=_9.getIdentity(i);
+_8._by_idty[_f]=_8._by_idx[this.rowIdx]={idty:_f,item:i};
+this._setOpen(_6);
+})});
+}else{
+this._setOpen(_6);
+}
+}else{
+this._setOpen(_6);
+}
+}else{
+this._setOpen(_6);
+}
+}
+},_setOpen:function(_10){
+if(_10&&this._tableRow&&dojo.hasClass(this._tableRow,"dojoxGridNoChildren")){
+this._setOpen(false);
+return;
+}
+this.expandoInner.innerHTML=_10?"-":"+";
+dojo.removeClass(this.domNode,"dojoxGridExpandoLoading");
+dojo.toggleClass(this.domNode,"dojoxGridExpandoOpened",_10);
+if(this._tableRow){
+dojo.toggleClass(this._tableRow,"dojoxGridRowCollapsed",!_10);
+var _11=dojo.attr(this._tableRow,"dojoxTreeGridBaseClasses");
+var _12="";
+if(_10){
+_12=dojo.trim((" "+_11+" ").replace(" dojoxGridRowCollapsed "," "));
+}else{
+if((" "+_11+" ").indexOf(" dojoxGridRowCollapsed ")<0){
+_12=_11+(_11?" ":"")+"dojoxGridRowCollapsed";
+}else{
+_12=_11;
+}
+}
+dojo.attr(this._tableRow,"dojoxTreeGridBaseClasses",_12);
+}
+var _13=(this.open!==_10);
+this.open=_10;
+if(this.expandoCell&&this.itemId){
+this.expandoCell.openStates[this.itemId]=_10;
+}
+var v=this.view;
+var g=v.grid;
+if(this.toggleClass&&_13){
+if(!this._tableRow||!this._tableRow.style.display){
+this._toggleRows(this.toggleClass,_10);
+}
+}
+if(v&&this._initialized&&this.rowIdx>=0){
+g.rowHeightChanged(this.rowIdx);
+g.postresize();
+v.hasVScrollbar(true);
+}
+this._initialized=true;
+},onToggle:function(e){
+this.setOpen(!this.open);
+dojo.stopEvent(e);
+},setRowNode:function(_14,_15,_16){
+if(this.cellIdx<0||!this.itemId){
+return false;
+}
+this._initialized=false;
+this.view=_16;
+this.rowNode=_15;
+this.rowIdx=_14;
+this.expandoCell=_16.structure.cells[0][this.cellIdx];
+var d=this.domNode;
+if(d&&d.parentNode&&d.parentNode.parentNode){
+this._tableRow=d.parentNode.parentNode;
+}
+this.open=this.expandoCell.getOpenState(this.itemId);
+if(_16.grid.treeModel){
+dojo.style(this.domNode,"marginLeft",(this.level*18)+"px");
+if(this.domNode.parentNode){
+dojo.style(this.domNode.parentNode,"backgroundPosition",((this.level*18)+(3))+"px");
+}
+}
+this.setOpen(this.open);
+return true;
+}});
+dojo.declare("dojox.grid._TreeContentBuilder",dojox.grid._ContentBuilder,{generateHtml:function(_17,_18){
+var _19=this.getTableArray(),v=this.view,row=v.structure.cells[0],_1a=this.grid.getItem(_18),_1b=this.grid,_1c=this.grid.store;
+dojox.grid.util.fire(this.view,"onBeforeRow",[_18,[row]]);
+var _1d=function(_1e,_1f,_20,_21,_22,_23){
+if(!_23){
+if(_19[0].indexOf("dojoxGridRowTableNeedsRowUpdate")==-1){
+_19[0]=_19[0].replace("dojoxGridRowTable","dojoxGridRowTable dojoxGridRowTableNeedsRowUpdate");
+}
+return;
+}
+var _24=_19.length;
+_21=_21||[];
+var _25=_21.join("|");
+var _26=_21[_21.length-1];
+var _27=_26+(_20?" dojoxGridSummaryRow":"");
+var _28="";
+if(_1b.treeModel&&_1f&&!_1b.treeModel.mayHaveChildren(_1f)){
+_27+=" dojoxGridNoChildren";
+}
+_19.push("<tr style=\""+_28+"\" class=\""+_27+"\" dojoxTreeGridPath=\""+_22.join("/")+"\" dojoxTreeGridBaseClasses=\""+_27+"\">");
+var _29=_1e+1;
+var _2a=null;
+for(var i=0,_2b;(_2b=row[i]);i++){
+var m=_2b.markup,cc=_2b.customClasses=[],cs=_2b.customStyles=[];
+m[5]=_2b.formatAtLevel(_22,_1f,_1e,_20,_26,cc);
+m[1]=cc.join(" ");
+m[3]=cs.join(";");
+_19.push.apply(_19,m);
+if(!_2a&&_2b.level===_29&&_2b.parentCell){
+_2a=_2b.parentCell;
+}
+}
+_19.push("</tr>");
+if(_1f&&_1c&&_1c.isItem(_1f)){
+var _2c=_1c.getIdentity(_1f);
+if(typeof _1b._by_idty_paths[_2c]=="undefined"){
+_1b._by_idty_paths[_2c]=_22.join("/");
+}
+}
+var _2d;
+var _2e;
+var _2f;
+var _30;
+var _31=_22.concat([]);
+if(_1b.treeModel&&_1f){
+if(_1b.treeModel.mayHaveChildren(_1f)){
+_2d=v.structure.cells[0][_1b.expandoCell||0];
+_2e=_2d.getOpenState(_1f)&&_23;
+_2f=new dojox.grid.TreePath(_22.join("/"),_1b);
+_30=_2f.children(true)||[];
+dojo.forEach(_30,function(_32,idx){
+var _33=_25.split("|");
+_33.push(_33[_33.length-1]+"-"+idx);
+_31.push(idx);
+_1d(_29,_32,false,_33,_31,_2e);
+_31.pop();
+});
+}
+}else{
+if(_1f&&_2a&&!_20){
+_2d=v.structure.cells[0][_2a.level];
+_2e=_2d.getOpenState(_1f)&&_23;
+if(_1c.hasAttribute(_1f,_2a.field)){
+var _34=_25.split("|");
+_34.pop();
+_2f=new dojox.grid.TreePath(_22.join("/"),_1b);
+_30=_2f.children(true)||[];
+if(_30.length){
+_19[_24]="<tr class=\""+_34.join(" ")+" dojoxGridExpandoRow\" dojoxTreeGridPath=\""+_22.join("/")+"\">";
+dojo.forEach(_30,function(_35,idx){
+var _36=_25.split("|");
+_36.push(_36[_36.length-1]+"-"+idx);
+_31.push(idx);
+_1d(_29,_35,false,_36,_31,_2e);
+_31.pop();
+});
+_31.push(_30.length);
+_1d(_1e,_1f,true,_21,_31,_2e);
+}else{
+_19[_24]="<tr class=\""+_26+" dojoxGridNoChildren\" dojoxTreeGridPath=\""+_22.join("/")+"\">";
+}
+}else{
+if(!_1c.isItemLoaded(_1f)){
+_19[0]=_19[0].replace("dojoxGridRowTable","dojoxGridRowTable dojoxGridRowTableNeedsRowUpdate");
+}else{
+_19[_24]="<tr class=\""+_26+" dojoxGridNoChildren\" dojoxTreeGridPath=\""+_22.join("/")+"\">";
+}
+}
+}else{
+if(_1f&&!_20&&_21.length>1){
+_19[_24]="<tr class=\""+_21[_21.length-2]+"\" dojoxTreeGridPath=\""+_22.join("/")+"\">";
+}
+}
+}
+};
+_1d(0,_1a,false,["dojoxGridRowToggle-"+_18],[_18],true);
+_19.push("</table>");
+return _19.join("");
+},findTarget:function(_37,_38){
+var n=_37;
+while(n&&(n!=this.domNode)){
+if(n.tagName&&n.tagName.toLowerCase()=="tr"){
+break;
+}
+n=n.parentNode;
+}
+return (n!=this.domNode)?n:null;
+},getCellNode:function(_39,_3a){
+var _3b=dojo.query("td[idx='"+_3a+"']",_39)[0];
+if(_3b&&_3b.parentNode&&!dojo.hasClass(_3b.parentNode,"dojoxGridSummaryRow")){
+return _3b;
+}
+},decorateEvent:function(e){
+e.rowNode=this.findRowTarget(e.target);
+if(!e.rowNode){
+return false;
+}
+e.rowIndex=dojo.attr(e.rowNode,"dojoxTreeGridPath");
+this.baseDecorateEvent(e);
+e.cell=this.grid.getCell(e.cellIndex);
+return true;
+}});
+dojo.declare("dojox.grid._TreeView",[dojox.grid._View],{_contentBuilderClass:dojox.grid._TreeContentBuilder,_onDndDrop:function(_3c,_3d,_3e){
+if(this.grid&&this.grid.aggregator){
+this.grid.aggregator.clearSubtotalCache();
+}
+this.inherited(arguments);
+},postCreate:function(){
+this.inherited(arguments);
+this.connect(this.grid,"_cleanupExpandoCache","_cleanupExpandoCache");
+},_cleanupExpandoCache:function(_3f,_40,_41){
+if(_3f==-1){
+return;
+}
+dojo.forEach(this.grid.layout.cells,function(_42){
+if(typeof _42["openStates"]!="undefined"){
+if(_40 in _42.openStates){
+delete _42.openStates[_40];
+}
+}
+});
+if(typeof _3f=="string"&&_3f.indexOf("/")>-1){
+var _43=new dojox.grid.TreePath(_3f,this.grid);
+var _44=_43.parent();
+while(_44){
+_43=_44;
+_44=_43.parent();
+}
+var _45=_43.item();
+if(!_45){
+return;
+}
+var _46=this.grid.store.getIdentity(_45);
+if(typeof this._expandos[_46]!="undefined"){
+for(var i in this._expandos[_46]){
+var exp=this._expandos[_46][i];
+if(exp){
+exp.destroy();
+}
+delete this._expandos[_46][i];
+}
+delete this._expandos[_46];
+}
+}else{
+for(var i in this._expandos){
+if(typeof this._expandos[i]!="undefined"){
+for(var j in this._expandos[i]){
+var exp=this._expandos[i][j];
+if(exp){
+exp.destroy();
+}
+}
+}
+}
+this._expandos={};
+}
+},postMixInProperties:function(){
+this.inherited(arguments);
+this._expandos={};
+},onBeforeRow:function(_47,_48){
+var g=this.grid;
+if(g._by_idx&&g._by_idx[_47]&&g._by_idx[_47].idty){
+var _49=g._by_idx[_47].idty;
+this._expandos[_49]=this._expandos[_49]||{};
+}
+this.inherited(arguments);
+},onAfterRow:function(_4a,_4b,_4c){
+dojo.forEach(dojo.query("span.dojoxGridExpando",_4c),function(n){
+if(n&&n.parentNode){
+var tc=n.getAttribute("toggleClass");
+var _4d;
+var _4e;
+var g=this.grid;
+if(g._by_idx&&g._by_idx[_4a]&&g._by_idx[_4a].idty){
+_4d=g._by_idx[_4a].idty;
+_4e=this._expandos[_4d][tc];
+}
+if(_4e){
+dojo.place(_4e.domNode,n,"replace");
+_4e.itemId=n.getAttribute("itemId");
+_4e.cellIdx=parseInt(n.getAttribute("cellIdx"),10);
+if(isNaN(_4e.cellIdx)){
+_4e.cellIdx=-1;
+}
+}else{
+_4e=dojo.parser.parse(n.parentNode)[0];
+if(_4d){
+this._expandos[_4d][tc]=_4e;
+}
+}
+if(!_4e.setRowNode(_4a,_4c,this)){
+_4e.domNode.parentNode.removeChild(_4e.domNode);
+}
+}
+},this);
+var alt=false;
+var _4f=this;
+dojo.query("tr[dojoxTreeGridPath]",_4c).forEach(function(n){
+dojo.toggleClass(n,"dojoxGridSubRowAlt",alt);
+dojo.attr(n,"dojoxTreeGridBaseClasses",n.className);
+alt=!alt;
+_4f.grid.rows.styleRowNode(dojo.attr(n,"dojoxTreeGridPath"),n);
+});
+this.inherited(arguments);
+},updateRowStyles:function(_50){
+var _51=dojo.query("tr[dojoxTreeGridPath='"+_50+"']",this.domNode);
+if(_51.length){
+this.styleRowNode(_50,_51[0]);
+}
+},getCellNode:function(_52,_53){
+var row=dojo.query("tr[dojoxTreeGridPath='"+_52+"']",this.domNode)[0];
+if(row){
+return this.content.getCellNode(row,_53);
+}
+}});
+}
diff --git a/dojox/grid/_View.js b/dojox/grid/_View.js
index dc11594..83f1c81 100644
--- a/dojox/grid/_View.js
+++ b/dojox/grid/_View.js
@@ -19,28 +19,30 @@ dojo.require("dojo.dnd.Manager");
 var _1=function(_2,_3){
 return _2.style.cssText==undefined?_2.getAttribute("style"):_2.style.cssText;
 };
-dojo.declare("dojox.grid._View",[dijit._Widget,dijit._Templated],{defaultWidth:"18em",viewWidth:"",templateString:"<div class=\"dojoxGridView\" wairole=\"presentation\">\n\t<div class=\"dojoxGridHeader\" dojoAttachPoint=\"headerNode\" wairole=\"presentation\">\n\t\t<div dojoAttachPoint=\"headerNodeContainer\" style=\"width:9000em\" wairole=\"presentation\">\n\t\t\t<div dojoAttachPoint=\"headerContentNode\" wairole=\"row\"></div>\n\t\t</div>\n\t</div>\n\t<input type=\"checkbox\" class=\"d [...]
-this.rowNodes=[];
+dojo.declare("dojox.grid._View",[dijit._Widget,dijit._Templated],{defaultWidth:"18em",viewWidth:"",templateString:"<div class=\"dojoxGridView\" wairole=\"presentation\">\n\t<div class=\"dojoxGridHeader\" dojoAttachPoint=\"headerNode\" wairole=\"presentation\">\n\t\t<div dojoAttachPoint=\"headerNodeContainer\" style=\"width:9000em\" wairole=\"presentation\">\n\t\t\t<div dojoAttachPoint=\"headerContentNode\" wairole=\"row\"></div>\n\t\t</div>\n\t</div>\n\t<input type=\"checkbox\" class=\"d [...]
+this.rowNodes={};
 },postCreate:function(){
 this.connect(this.scrollboxNode,"onscroll","doscroll");
 dojox.grid.util.funnelEvents(this.contentNode,this,"doContentEvent",["mouseover","mouseout","click","dblclick","contextmenu","mousedown"]);
 dojox.grid.util.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);
+this.content=new this._contentBuilderClass(this);
+this.header=new this._headerBuilderClass(this);
 if(!dojo._isBodyLtr()){
 this.headerNodeContainer.style.width="";
 }
 },destroy:function(){
 dojo.destroy(this.headerNode);
 delete this.headerNode;
-dojo.forEach(this.rowNodes,dojo.destroy);
-this.rowNodes=[];
+for(var i in this.rowNodes){
+dojo.destroy(this.rowNodes[i]);
+}
+this.rowNodes={};
 if(this.source){
 this.source.destroy();
 }
 this.inherited(arguments);
 },focus:function(){
-if(dojo.isWebKit||dojo.isOpera){
+if(dojo.isIE||dojo.isWebKit||dojo.isOpera){
 this.hiddenFocusNode.focus();
 }else{
 this.scrollboxNode.focus();
@@ -52,8 +54,10 @@ this.viewWidth=vs.width+"em";
 }else{
 this.viewWidth=vs.width||(vs.noscroll?"auto":this.viewWidth);
 }
-this.onBeforeRow=vs.onBeforeRow;
-this.onAfterRow=vs.onAfterRow;
+this._onBeforeRow=vs.onBeforeRow||function(){
+};
+this._onAfterRow=vs.onAfterRow||function(){
+};
 this.noscroll=vs.noscroll;
 if(this.noscroll){
 this.scrollboxNode.style.overflow="hidden";
@@ -61,12 +65,49 @@ this.scrollboxNode.style.overflow="hidden";
 this.simpleStructure=Boolean(vs.cells.length==1);
 this.testFlexCells();
 this.updateStructure();
+},_cleanupRowWidgets:function(_5){
+if(_5){
+dojo.forEach(dojo.query("[widgetId]",_5).map(dijit.byNode),function(w){
+if(w._destroyOnRemove){
+w.destroy();
+delete w;
+}else{
+if(w.domNode&&w.domNode.parentNode){
+w.domNode.parentNode.removeChild(w.domNode);
+}
+}
+});
+}
+},onBeforeRow:function(_6,_7){
+this._onBeforeRow(_6,_7);
+if(_6>=0){
+this._cleanupRowWidgets(this.getRowNode(_6));
+}
+},onAfterRow:function(_8,_9,_a){
+this._onAfterRow(_8,_9,_a);
+var g=this.grid;
+dojo.forEach(dojo.query(".dojoxGridStubNode",_a),function(n){
+if(n&&n.parentNode){
+var lw=n.getAttribute("linkWidget");
+var _b=window.parseInt(dojo.attr(n,"cellIdx"),10);
+var _c=g.getCell(_b);
+var w=dijit.byId(lw);
+if(w){
+n.parentNode.replaceChild(w.domNode,n);
+if(!w._started){
+w.startup();
+}
+}else{
+n.innerHTML="";
+}
+}
+},this);
 },testFlexCells:function(){
 this.flexCells=false;
-for(var j=0,_7;(_7=this.structure.cells[j]);j++){
-for(var i=0,_9;(_9=_7[i]);i++){
-_9.view=this;
-this.flexCells=this.flexCells||_9.isFlex();
+for(var j=0,_d;(_d=this.structure.cells[j]);j++){
+for(var i=0,_e;(_e=_d[i]);i++){
+_e.view=this;
+this.flexCells=this.flexCells||_e.isFlex();
 }
 }
 return this.flexCells;
@@ -74,22 +115,23 @@ return this.flexCells;
 this.header.update();
 this.content.update();
 },getScrollbarWidth:function(){
-var _a=this.hasVScrollbar();
-var _b=dojo.style(this.scrollboxNode,"overflow");
-if(this.noscroll||!_b||_b=="hidden"){
-_a=false;
+var _f=this.hasVScrollbar();
+var _10=dojo.style(this.scrollboxNode,"overflow");
+if(this.noscroll||!_10||_10=="hidden"){
+_f=false;
 }else{
-if(_b=="scroll"){
-_a=true;
+if(_10=="scroll"){
+_f=true;
 }
 }
-return (_a?dojox.html.metrics.getScrollbar().w:0);
+return (_f?dojox.html.metrics.getScrollbar().w:0);
 },getColumnsWidth:function(){
-return this.headerContentNode.firstChild.offsetWidth;
-},setColumnsWidth:function(_c){
-this.headerContentNode.firstChild.style.width=_c+"px";
+var h=this.headerContentNode;
+return h&&h.firstChild?h.firstChild.offsetWidth:0;
+},setColumnsWidth:function(_11){
+this.headerContentNode.firstChild.style.width=_11+"px";
 if(this.viewWidth){
-this.viewWidth=_c+"px";
+this.viewWidth=_11+"px";
 }
 },getWidth:function(){
 return this.viewWidth||(this.getColumnsWidth()+this.getScrollbarWidth())+"px";
@@ -102,17 +144,17 @@ if(this._togglingColumn>=0){
 this.setColumnsWidth(this.getColumnsWidth()-this._togglingColumn);
 this._togglingColumn=-1;
 }
-var _d=this.grid.layout.cells;
-var _e=dojo.hitch(this,function(_f,_10){
-var inc=_10?-1:1;
-var idx=this.header.getCellNodeIndex(_f)+inc;
-var _13=_d[idx];
-while(_13&&_13.getHeaderNode()&&_13.getHeaderNode().style.display=="none"){
+var _12=this.grid.layout.cells;
+var _13=dojo.hitch(this,function(_14,_15){
+var inc=_15?-1:1;
+var idx=this.header.getCellNodeIndex(_14)+inc;
+var _16=_12[idx];
+while(_16&&_16.getHeaderNode()&&_16.getHeaderNode().style.display=="none"){
 idx+=inc;
-_13=_d[idx];
+_16=_12[idx];
 }
-if(_13){
-return _13.getHeaderNode();
+if(_16){
+return _16.getHeaderNode();
 }
 return null;
 });
@@ -120,7 +162,25 @@ if(this.grid.columnReordering&&this.simpleStructure){
 if(this.source){
 this.source.destroy();
 }
-this.source=new dojo.dnd.Source(this.headerContentNode.firstChild.rows[0],{horizontal:true,accept:["gridColumn_"+this.grid.id],viewIndex:this.index,onMouseDown:dojo.hitch(this,function(e){
+var _17="dojoxGrid_bottomMarker";
+var _18="dojoxGrid_topMarker";
+if(this.bottomMarker){
+dojo.destroy(this.bottomMarker);
+}
+this.bottomMarker=dojo.byId(_17);
+if(this.topMarker){
+dojo.destroy(this.topMarker);
+}
+this.topMarker=dojo.byId(_18);
+if(!this.bottomMarker){
+this.bottomMarker=dojo.create("div",{"id":_17,"class":"dojoxGridColPlaceBottom"},dojo.body());
+this._hide(this.bottomMarker);
+this.topMarker=dojo.create("div",{"id":_18,"class":"dojoxGridColPlaceTop"},dojo.body());
+this._hide(this.topMarker);
+}
+this.arrowDim=dojo.contentBox(this.bottomMarker);
+var _19=dojo.contentBox(this.headerContentNode.firstChild.rows[0]).h;
+this.source=new dojo.dnd.Source(this.headerContentNode.firstChild.rows[0],{horizontal:true,accept:["gridColumn_"+this.grid.id],viewIndex:this.index,generateText:false,onMouseDown:dojo.hitch(this,function(e){
 this.header.decorateEvent(e);
 if((this.header.overRightResizeArea(e)||this.header.overLeftResizeArea(e))&&this.header.canResize(e)&&!this.header.moveable){
 this.header.beginColumnResize(e);
@@ -132,86 +192,113 @@ if(e.button===(dojo.isIE?1:0)){
 dojo.dnd.Source.prototype.onMouseDown.call(this.source,e);
 }
 }
-}),_markTargetAnchor:dojo.hitch(this,function(_15){
+}),onMouseOver:dojo.hitch(this,function(e){
 var src=this.source;
-if(src.current==src.targetAnchor&&src.before==_15){
-return;
+if(src._getChildByEvent(e)){
+dojo.dnd.Source.prototype.onMouseOver.apply(src,arguments);
 }
-if(src.targetAnchor&&_e(src.targetAnchor,src.before)){
-src._removeItemClass(_e(src.targetAnchor,src.before),src.before?"After":"Before");
+}),_markTargetAnchor:dojo.hitch(this,function(_1a){
+var src=this.source;
+if(src.current==src.targetAnchor&&src.before==_1a){
+return;
 }
-dojo.dnd.Source.prototype._markTargetAnchor.call(src,_15);
-if(src.targetAnchor&&_e(src.targetAnchor,src.before)){
-src._addItemClass(_e(src.targetAnchor,src.before),src.before?"After":"Before");
+if(src.targetAnchor&&_13(src.targetAnchor,src.before)){
+src._removeItemClass(_13(src.targetAnchor,src.before),src.before?"After":"Before");
+}
+dojo.dnd.Source.prototype._markTargetAnchor.call(src,_1a);
+var _1b=_1a?src.targetAnchor:_13(src.targetAnchor,src.before);
+var _1c=0;
+if(!_1b){
+_1b=src.targetAnchor;
+_1c=dojo.contentBox(_1b).w+this.arrowDim.w/2+2;
+}
+var pos=(dojo.position||dojo._abs)(_1b,true);
+var _1d=Math.floor(pos.x-this.arrowDim.w/2+_1c);
+dojo.style(this.bottomMarker,"visibility","visible");
+dojo.style(this.topMarker,"visibility","visible");
+dojo.style(this.bottomMarker,{"left":_1d+"px","top":(_19+pos.y)+"px"});
+dojo.style(this.topMarker,{"left":_1d+"px","top":(pos.y-this.arrowDim.h)+"px"});
+if(src.targetAnchor&&_13(src.targetAnchor,src.before)){
+src._addItemClass(_13(src.targetAnchor,src.before),src.before?"After":"Before");
 }
 }),_unmarkTargetAnchor:dojo.hitch(this,function(){
 var src=this.source;
 if(!src.targetAnchor){
 return;
 }
-if(src.targetAnchor&&_e(src.targetAnchor,src.before)){
-src._removeItemClass(_e(src.targetAnchor,src.before),src.before?"After":"Before");
+if(src.targetAnchor&&_13(src.targetAnchor,src.before)){
+src._removeItemClass(_13(src.targetAnchor,src.before),src.before?"After":"Before");
 }
+this._hide(this.bottomMarker);
+this._hide(this.topMarker);
 dojo.dnd.Source.prototype._unmarkTargetAnchor.call(src);
 }),destroy:dojo.hitch(this,function(){
 dojo.disconnect(this._source_conn);
 dojo.unsubscribe(this._source_sub);
 dojo.dnd.Source.prototype.destroy.call(this.source);
+if(this.bottomMarker){
+dojo.destroy(this.bottomMarker);
+delete this.bottomMarker;
+}
+if(this.topMarker){
+dojo.destroy(this.topMarker);
+delete this.topMarker;
+}
+}),onDndCancel:dojo.hitch(this,function(){
+dojo.dnd.Source.prototype.onDndCancel.call(this.source);
+this._hide(this.bottomMarker);
+this._hide(this.topMarker);
 })});
 this._source_conn=dojo.connect(this.source,"onDndDrop",this,"_onDndDrop");
 this._source_sub=dojo.subscribe("/dnd/drop/before",this,"_onDndDropBefore");
 this.source.startup();
 }
-},_onDndDropBefore:function(_18,_19,_1a){
+},_hide:function(_1e){
+dojo.style(_1e,{left:"-10000px",top:"-10000px","visibility":"hidden"});
+},_onDndDropBefore:function(_1f,_20,_21){
 if(dojo.dnd.manager().target!==this.source){
 return;
 }
 this.source._targetNode=this.source.targetAnchor;
 this.source._beforeTarget=this.source.before;
-var _1b=this.grid.views.views;
-var _1c=_1b[_18.viewIndex];
-var _1d=_1b[this.index];
-if(_1d!=_1c){
-var s=_1c.convertColPctToFixed();
-var t=_1d.convertColPctToFixed();
-if(s||t){
-setTimeout(function(){
-_1c.update();
-_1d.update();
-},50);
-}
-}
-},_onDndDrop:function(_20,_21,_22){
+var _22=this.grid.views.views;
+var _23=_22[_1f.viewIndex];
+var _24=_22[this.index];
+if(_24!=_23){
+_23.convertColPctToFixed();
+_24.convertColPctToFixed();
+}
+},_onDndDrop:function(_25,_26,_27){
 if(dojo.dnd.manager().target!==this.source){
 if(dojo.dnd.manager().source===this.source){
 this._removingColumn=true;
 }
 return;
 }
-var _23=function(n){
+this._hide(this.bottomMarker);
+this._hide(this.topMarker);
+var _28=function(n){
 return n?dojo.attr(n,"idx"):null;
 };
-var w=dojo.marginBox(_21[0]).w;
-if(_20.viewIndex!==this.index){
-var _26=this.grid.views.views;
-var _27=_26[_20.viewIndex];
-var _28=_26[this.index];
-if(_27.viewWidth&&_27.viewWidth!="auto"){
-_27.setColumnsWidth(_27.getColumnsWidth()-w);
+var w=dojo.marginBox(_26[0]).w;
+if(_25.viewIndex!==this.index){
+var _29=this.grid.views.views;
+var _2a=_29[_25.viewIndex];
+var _2b=_29[this.index];
+if(_2a.viewWidth&&_2a.viewWidth!="auto"){
+_2a.setColumnsWidth(_2a.getColumnsWidth()-w);
 }
-if(_28.viewWidth&&_28.viewWidth!="auto"){
-_28.setColumnsWidth(_28.getColumnsWidth());
+if(_2b.viewWidth&&_2b.viewWidth!="auto"){
+_2b.setColumnsWidth(_2b.getColumnsWidth());
 }
 }
 var stn=this.source._targetNode;
 var stb=this.source._beforeTarget;
-var _2b=this.grid.layout;
+var _2c=this.grid.layout;
 var idx=this.index;
 delete this.source._targetNode;
 delete this.source._beforeTarget;
-window.setTimeout(function(){
-_2b.moveColumn(_20.viewIndex,idx,_23(_21[0]),_23(stn),stb);
-},1);
+_2c.moveColumn(_25.viewIndex,idx,_28(_26[0]),_28(stn),stb);
 },renderHeader:function(){
 this.headerContentNode.innerHTML=this.header.generateHtml(this._getHeaderContent);
 if(this.flexCells){
@@ -225,33 +312,38 @@ var ret=["<div class=\"dojoxGridSortNode"];
 if(_2d.index!=_2d.grid.getSortIndex()){
 ret.push("\">");
 }else{
-ret=ret.concat([" ",_2d.grid.sortInfo>0?"dojoxGridSortUp":"dojoxGridSortDown","\"><div class=\"dojoxGridArrowButtonChar\">",_2d.grid.sortInfo>0?"▲":"▼","</div><div class=\"dojoxGridArrowButtonNode\" role=\""+(dojo.isFF<3?"wairole:":"")+"presentation\"></div>"]);
+ret=ret.concat([" ",_2d.grid.sortInfo>0?"dojoxGridSortUp":"dojoxGridSortDown","\"><div class=\"dojoxGridArrowButtonChar\">",_2d.grid.sortInfo>0?"▲":"▼","</div><div class=\"dojoxGridArrowButtonNode\" role=\"presentation\"></div>"]);
 }
 ret=ret.concat([n,"</div>"]);
 return ret.join("");
 },resize:function(){
 this.adaptHeight();
 this.adaptWidth();
-},hasHScrollbar:function(_30){
-if(this._hasHScroll==undefined||_30){
+},hasHScrollbar:function(_2e){
+var _2f=this._hasHScroll||false;
+if(this._hasHScroll==undefined||_2e){
 if(this.noscroll){
 this._hasHScroll=false;
 }else{
-var _31=dojo.style(this.scrollboxNode,"overflow");
-if(_31=="hidden"){
+var _30=dojo.style(this.scrollboxNode,"overflow");
+if(_30=="hidden"){
 this._hasHScroll=false;
 }else{
-if(_31=="scroll"){
+if(_30=="scroll"){
 this._hasHScroll=true;
 }else{
-this._hasHScroll=(this.scrollboxNode.offsetWidth<this.contentNode.offsetWidth);
+this._hasHScroll=(this.scrollboxNode.offsetWidth-this.getScrollbarWidth()<this.contentNode.offsetWidth);
 }
 }
 }
 }
+if(_2f!==this._hasHScroll){
+this.grid.update();
+}
 return this._hasHScroll;
-},hasVScrollbar:function(_32){
-if(this._hasVScroll==undefined||_32){
+},hasVScrollbar:function(_31){
+var _32=this._hasVScroll||false;
+if(this._hasVScroll==undefined||_31){
 if(this.noscroll){
 this._hasVScroll=false;
 }else{
@@ -262,18 +354,22 @@ this._hasVScroll=false;
 if(_33=="scroll"){
 this._hasVScroll=true;
 }else{
-this._hasVScroll=(this.scrollboxNode.offsetHeight<this.contentNode.offsetHeight);
+this._hasVScroll=(this.scrollboxNode.scrollHeight>this.scrollboxNode.clientHeight);
 }
 }
 }
 }
+if(_32!==this._hasVScroll){
+this.grid.update();
+}
 return this._hasVScroll;
 },convertColPctToFixed:function(){
 var _34=false;
+this.grid.initialWidth="";
 var _35=dojo.query("th",this.headerContentNode);
-var _36=dojo.map(_35,function(c,_38){
+var _36=dojo.map(_35,function(c,_37){
 var w=c.style.width;
-dojo.attr(c,"vIdx",_38);
+dojo.attr(c,"vIdx",_37);
 if(w&&w.slice(-1)=="%"){
 _34=true;
 }else{
@@ -284,24 +380,34 @@ return window.parseInt(w,10);
 return dojo.contentBox(c).w;
 });
 if(_34){
-dojo.forEach(this.grid.layout.cells,function(_3a,idx){
-if(_3a.view==this){
-var _3c=_3a.view.getHeaderCellNode(_3a.index);
-if(_3c&&dojo.hasAttr(_3c,"vIdx")){
-var _3d=window.parseInt(dojo.attr(_3c,"vIdx"));
-this.setColWidth(idx,_36[_3d]);
-_35[_3d].style.width=_3a.unitWidth;
-dojo.removeAttr(_3c,"vIdx");
+dojo.forEach(this.grid.layout.cells,function(_38,idx){
+if(_38.view==this){
+var _39=_38.view.getHeaderCellNode(_38.index);
+if(_39&&dojo.hasAttr(_39,"vIdx")){
+var _3a=window.parseInt(dojo.attr(_39,"vIdx"));
+this.setColWidth(idx,_36[_3a]);
+dojo.removeAttr(_39,"vIdx");
 }
 }
 },this);
 return true;
 }
 return false;
-},adaptHeight:function(_3e){
+},adaptHeight:function(_3b){
 if(!this.grid._autoHeight){
-var h=this.domNode.clientHeight;
-if(_3e){
+var h=(this.domNode.style.height&&parseInt(this.domNode.style.height.replace(/px/,""),10))||this.domNode.clientHeight;
+var _3c=this;
+var _3d=function(){
+var v;
+for(var i in _3c.grid.views.views){
+v=_3c.grid.views.views[i];
+if(v!==_3c&&v.hasHScrollbar()){
+return true;
+}
+}
+return false;
+};
+if(_3b||(this.noscroll&&_3d())){
 h-=dojox.html.metrics.getScrollbar().h;
 }
 dojox.grid.util.setStyleHeightPx(this.scrollboxNode,h);
@@ -330,79 +436,81 @@ ds.width=w;
 hs.width=w;
 }
 ds.height=(h>=0?h+"px":"");
-},renderRow:function(_46){
-var _47=this.createRowNode(_46);
-this.buildRow(_46,_47);
-this.grid.edit.restore(this,_46);
-if(this._pendingUpdate){
-window.clearTimeout(this._pendingUpdate);
-}
-this._pendingUpdate=window.setTimeout(dojo.hitch(this,function(){
-window.clearTimeout(this._pendingUpdate);
-delete this._pendingUpdate;
-this.grid._resize();
-}),50);
-return _47;
-},createRowNode:function(_48){
-var _49=document.createElement("div");
-_49.className=this.classTag+"Row";
-dojo.attr(_49,"role","row");
-_49[dojox.grid.util.gridViewTag]=this.id;
-_49[dojox.grid.util.rowIndexTag]=_48;
-this.rowNodes[_48]=_49;
-return _49;
-},buildRow:function(_4a,_4b){
-this.buildRowContent(_4a,_4b);
-this.styleRow(_4a,_4b);
-},buildRowContent:function(_4c,_4d){
-_4d.innerHTML=this.content.generateHtml(_4c,_4c);
+},renderRow:function(_3e){
+var _3f=this.createRowNode(_3e);
+this.buildRow(_3e,_3f);
+this.grid.edit.restore(this,_3e);
+return _3f;
+},createRowNode:function(_40){
+var _41=document.createElement("div");
+_41.className=this.classTag+"Row";
+if(this instanceof dojox.grid._RowSelector){
+dojo.attr(_41,"role","presentation");
+}else{
+dojo.attr(_41,"role","row");
+if(this.grid.selectionMode!="none"){
+dojo.attr(_41,"aria-selected","false");
+}
+}
+_41[dojox.grid.util.gridViewTag]=this.id;
+_41[dojox.grid.util.rowIndexTag]=_40;
+this.rowNodes[_40]=_41;
+return _41;
+},buildRow:function(_42,_43){
+this.buildRowContent(_42,_43);
+this.styleRow(_42,_43);
+},buildRowContent:function(_44,_45){
+_45.innerHTML=this.content.generateHtml(_44,_44);
 if(this.flexCells&&this.contentWidth){
-_4d.firstChild.style.width=this.contentWidth;
-}
-dojox.grid.util.fire(this,"onAfterRow",[_4c,this.structure.cells,_4d]);
-},rowRemoved:function(_4e){
-this.grid.edit.save(this,_4e);
-delete this.rowNodes[_4e];
-},getRowNode:function(_4f){
-return this.rowNodes[_4f];
-},getCellNode:function(_50,_51){
-var row=this.getRowNode(_50);
+_45.firstChild.style.width=this.contentWidth;
+}
+dojox.grid.util.fire(this,"onAfterRow",[_44,this.structure.cells,_45]);
+},rowRemoved:function(_46){
+if(_46>=0){
+this._cleanupRowWidgets(this.getRowNode(_46));
+}
+this.grid.edit.save(this,_46);
+delete this.rowNodes[_46];
+},getRowNode:function(_47){
+return this.rowNodes[_47];
+},getCellNode:function(_48,_49){
+var row=this.getRowNode(_48);
 if(row){
-return this.content.getCellNode(row,_51);
+return this.content.getCellNode(row,_49);
 }
-},getHeaderCellNode:function(_53){
+},getHeaderCellNode:function(_4a){
 if(this.headerContentNode){
-return this.header.getCellNode(this.headerContentNode,_53);
-}
-},styleRow:function(_54,_55){
-_55._style=_1(_55);
-this.styleRowNode(_54,_55);
-},styleRowNode:function(_56,_57){
-if(_57){
-this.doStyleRowNode(_56,_57);
-}
-},doStyleRowNode:function(_58,_59){
-this.grid.styleRowNode(_58,_59);
-},updateRow:function(_5a){
-var _5b=this.getRowNode(_5a);
-if(_5b){
-_5b.style.height="";
-this.buildRow(_5a,_5b);
-}
-return _5b;
-},updateRowStyles:function(_5c){
-this.styleRowNode(_5c,this.getRowNode(_5c));
-},lastTop:0,firstScroll:0,doscroll:function(_5d){
-var _5e=dojo._isBodyLtr();
+return this.header.getCellNode(this.headerContentNode,_4a);
+}
+},styleRow:function(_4b,_4c){
+_4c._style=_1(_4c);
+this.styleRowNode(_4b,_4c);
+},styleRowNode:function(_4d,_4e){
+if(_4e){
+this.doStyleRowNode(_4d,_4e);
+}
+},doStyleRowNode:function(_4f,_50){
+this.grid.styleRowNode(_4f,_50);
+},updateRow:function(_51){
+var _52=this.getRowNode(_51);
+if(_52){
+_52.style.height="";
+this.buildRow(_51,_52);
+}
+return _52;
+},updateRowStyles:function(_53){
+this.styleRowNode(_53,this.getRowNode(_53));
+},lastTop:0,firstScroll:0,doscroll:function(_54){
+var _55=dojo._isBodyLtr();
 if(this.firstScroll<2){
-if((!_5e&&this.firstScroll==1)||(_5e&&this.firstScroll==0)){
+if((!_55&&this.firstScroll==1)||(_55&&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){
 this.headerNodeContainer.style.width=s.w-this.getScrollbarWidth()+"px";
-this.scrollboxNode.scrollLeft=_5e?this.scrollboxNode.clientWidth-this.scrollboxNode.scrollWidth:this.scrollboxNode.scrollWidth-this.scrollboxNode.clientWidth;
+this.scrollboxNode.scrollLeft=_55?this.scrollboxNode.clientWidth-this.scrollboxNode.scrollWidth:this.scrollboxNode.scrollWidth-this.scrollboxNode.clientWidth;
 }
 }
 }
@@ -410,12 +518,12 @@ this.firstScroll++;
 }
 this.headerNode.scrollLeft=this.scrollboxNode.scrollLeft;
 var top=this.scrollboxNode.scrollTop;
-if(top!=this.lastTop){
+if(top!==this.lastTop){
 this.grid.scrollTo(top);
 }
-},setScrollTop:function(_61){
-this.lastTop=_61;
-this.scrollboxNode.scrollTop=_61;
+},setScrollTop:function(_56){
+this.lastTop=_56;
+this.scrollboxNode.scrollTop=_56;
 return this.scrollboxNode.scrollTop;
 },doContentEvent:function(e){
 if(this.content.decorateEvent(e)){
@@ -429,14 +537,17 @@ this.grid.onHeaderEvent(e);
 return this.content.dispatchEvent(e);
 },dispatchHeaderEvent:function(e){
 return this.header.dispatchEvent(e);
-},setColWidth:function(_66,_67){
-this.grid.setCellWidth(_66,_67+"px");
+},setColWidth:function(_57,_58){
+this.grid.setCellWidth(_57,_58+"px");
 },update:function(){
+if(!this.domNode){
+return;
+}
 this.content.update();
 this.grid.update();
-var _68=this.scrollboxNode.scrollLeft;
-this.scrollboxNode.scrollLeft=_68;
-this.headerNode.scrollLeft=_68;
+var _59=this.scrollboxNode.scrollLeft;
+this.scrollboxNode.scrollLeft=_59;
+this.headerNode.scrollLeft=_59;
 }});
 dojo.declare("dojox.grid._GridAvatar",dojo.dnd.Avatar,{construct:function(){
 var dd=dojo.doc;
@@ -453,29 +564,33 @@ var img=dd.createElement("td");
 tr.className="dojoxGridDndAvatarItem";
 img.className="dojoxGridDndAvatarItemImage";
 img.style.width="16px";
-var _6f=this.manager.source,_70;
-if(_6f.creator){
-_70=_6f._normailzedCreator(_6f.getItem(this.manager.nodes[0].id).data,"avatar").node;
+var _5a=this.manager.source,_5b;
+if(_5a.creator){
+_5b=_5a._normalizedCreator(_5a.getItem(this.manager.nodes[0].id).data,"avatar").node;
 }else{
-_70=this.manager.nodes[0].cloneNode(true);
-if(_70.tagName.toLowerCase()=="tr"){
-var _71=dd.createElement("table"),_72=dd.createElement("tbody");
-_72.appendChild(_70);
-_71.appendChild(_72);
-_70=_71;
+_5b=this.manager.nodes[0].cloneNode(true);
+var _5c,_5d;
+if(_5b.tagName.toLowerCase()=="tr"){
+_5c=dd.createElement("table");
+_5d=dd.createElement("tbody");
+_5d.appendChild(_5b);
+_5c.appendChild(_5d);
+_5b=_5c;
 }else{
-if(_70.tagName.toLowerCase()=="th"){
-var _71=dd.createElement("table"),_72=dd.createElement("tbody"),r=dd.createElement("tr");
-_71.cellPadding=_71.cellSpacing="0";
-r.appendChild(_70);
-_72.appendChild(r);
-_71.appendChild(_72);
-_70=_71;
+if(_5b.tagName.toLowerCase()=="th"){
+_5c=dd.createElement("table");
+_5d=dd.createElement("tbody");
+var r=dd.createElement("tr");
+_5c.cellPadding=_5c.cellSpacing="0";
+r.appendChild(_5b);
+_5d.appendChild(r);
+_5c.appendChild(_5d);
+_5b=_5c;
 }
 }
 }
-_70.id="";
-td.appendChild(_70);
+_5b.id="";
+td.appendChild(_5b);
 tr.appendChild(img);
 tr.appendChild(td);
 dojo.style(tr,"opacity",0.9);
@@ -489,13 +604,13 @@ m.OFFSET_Y=1;
 dojo.dnd.manager().OFFSET_Y=this.oldOffsetY;
 this.inherited(arguments);
 }});
-var _75=dojo.dnd.manager().makeAvatar;
+var _5e=dojo.dnd.manager().makeAvatar;
 dojo.dnd.manager().makeAvatar=function(){
 var src=this.source;
-if(src.viewIndex!==undefined){
+if(src.viewIndex!==undefined&&!dojo.hasClass(dojo.body(),"dijit_a11y")){
 return new dojox.grid._GridAvatar(this);
 }
-return _75.call(dojo.dnd.manager());
+return _5e.call(dojo.dnd.manager());
 };
 })();
 }
diff --git a/dojox/grid/_ViewManager.js b/dojox/grid/_ViewManager.js
index ad50a43..f55d7b5 100644
--- a/dojox/grid/_ViewManager.js
+++ b/dojox/grid/_ViewManager.js
@@ -23,41 +23,54 @@ v.destroy();
 }
 this.views=[];
 },getContentNodes:function(){
-var _5=[];
+var _3=[];
 for(var i=0,v;v=this.views[i];i++){
-_5.push(v.contentNode);
+_3.push(v.contentNode);
 }
-return _5;
-},forEach:function(_8){
+return _3;
+},forEach:function(_4){
 for(var i=0,v;v=this.views[i];i++){
-_8(v,i);
+_4(v,i);
 }
-},onEach:function(_b,_c){
-_c=_c||[];
+},onEach:function(_5,_6){
+_6=_6||[];
 for(var i=0,v;v=this.views[i];i++){
-if(_b in v){
-v[_b].apply(v,_c);
+if(_5 in v){
+v[_5].apply(v,_6);
 }
 }
 },normalizeHeaderNodeHeight:function(){
-var _f=[];
+var _7=[];
 for(var i=0,v;(v=this.views[i]);i++){
 if(v.headerContentNode.firstChild){
-_f.push(v.headerContentNode);
+_7.push(v.headerContentNode);
 }
 }
-this.normalizeRowNodeHeights(_f);
-},normalizeRowNodeHeights:function(_12){
+this.normalizeRowNodeHeights(_7);
+},normalizeRowNodeHeights:function(_8){
 var h=0;
-for(var i=0,n,o;(n=_12[i]);i++){
-h=Math.max(h,dojo.marginBox(n.firstChild).h);
+var _9=[];
+if(this.grid.rowHeight){
+h=this.grid.rowHeight;
+}else{
+if(_8.length<=1){
+return;
+}
+for(var i=0,n;(n=_8[i]);i++){
+if(!dojo.hasClass(n,"dojoxGridNonNormalizedCell")){
+_9[i]=n.firstChild.offsetHeight;
+h=Math.max(h,_9[i]);
+}
 }
 h=(h>=0?h:0);
-for(var i=0,n;(n=_12[i]);i++){
-dojo.marginBox(n.firstChild,{h:h});
+if(dojo.isMoz&&h){
+h++;
+}
+}
+for(i=0;(n=_8[i]);i++){
+if(_9[i]!=h){
+n.firstChild.style.height=h+"px";
 }
-if(_12&&_12[0]&&_12[0].parentNode){
-_12[0].parentNode.offsetHeight;
 }
 },resetHeaderNodeHeight:function(){
 for(var i=0,v,n;(v=this.views[i]);i++){
@@ -66,32 +79,32 @@ if(n){
 n.style.height="";
 }
 }
-},renormalizeRow:function(_1a){
-var _1b=[];
-for(var i=0,v,n;(v=this.views[i])&&(n=v.getRowNode(_1a));i++){
+},renormalizeRow:function(_a){
+var _b=[];
+for(var i=0,v,n;(v=this.views[i])&&(n=v.getRowNode(_a));i++){
 n.firstChild.style.height="";
-_1b.push(n);
+_b.push(n);
 }
-this.normalizeRowNodeHeights(_1b);
-},getViewWidth:function(_1f){
-return this.views[_1f].getWidth()||this.defaultWidth;
+this.normalizeRowNodeHeights(_b);
+},getViewWidth:function(_c){
+return this.views[_c].getWidth()||this.defaultWidth;
 },measureHeader:function(){
 this.resetHeaderNodeHeight();
-this.forEach(function(_20){
-_20.headerContentNode.style.height="";
+this.forEach(function(_d){
+_d.headerContentNode.style.height="";
 });
 var h=0;
-this.forEach(function(_22){
-h=Math.max(_22.headerNode.offsetHeight,h);
+this.forEach(function(_e){
+h=Math.max(_e.headerNode.offsetHeight,h);
 });
 return h;
 },measureContent:function(){
 var h=0;
-this.forEach(function(_24){
-h=Math.max(_24.domNode.offsetHeight,h);
+this.forEach(function(_f){
+h=Math.max(_f.domNode.offsetHeight,h);
 });
 return h;
-},findClient:function(_25){
+},findClient:function(_10){
 var c=this.grid.elasticView||-1;
 if(c<0){
 for(var i=1,v;(v=this.views[i]);i++){
@@ -113,12 +126,17 @@ return c;
 },arrange:function(l,w){
 var i,v,vw,len=this.views.length;
 var c=(w<=0?len:this.findClient());
-var _30=function(v,l){
+var _11=function(v,l){
 var ds=v.domNode.style;
 var hs=v.headerNode.style;
 if(!dojo._isBodyLtr()){
 ds.right=l+"px";
+if(dojo.isMoz){
+hs.right=l+v.getScrollbarWidth()+"px";
+hs.width=parseInt(hs.width,10)-v.getScrollbarWidth()+"px";
+}else{
 hs.right=l+"px";
+}
 }else{
 ds.left=l+"px";
 hs.left=l+"px";
@@ -129,7 +147,7 @@ hs.top=0;
 for(i=0;(v=this.views[i])&&(i<c);i++){
 vw=this.getViewWidth(i);
 v.setSize(vw,0);
-_30(v,l);
+_11(v,l);
 if(v.headerContentNode&&v.headerContentNode.firstChild){
 vw=v.getColumnsWidth()+v.getScrollbarWidth();
 }else{
@@ -144,36 +162,40 @@ vw=this.getViewWidth(j);
 v.setSize(vw,0);
 vw=v.domNode.offsetWidth;
 r-=vw;
-_30(v,r);
+_11(v,r);
 }
 if(c<len){
 v=this.views[c];
 vw=Math.max(1,r-l);
 v.setSize(vw+"px",0);
-_30(v,l);
+_11(v,l);
 }
 return l;
-},renderRow:function(_37,_38){
-var _39=[];
-for(var i=0,v,n,_3d;(v=this.views[i])&&(n=_38[i]);i++){
-_3d=v.renderRow(_37);
-n.appendChild(_3d);
-_39.push(_3d);
-}
-this.normalizeRowNodeHeights(_39);
-},rowRemoved:function(_3e){
-this.onEach("rowRemoved",[_3e]);
-},updateRow:function(_3f){
+},renderRow:function(_12,_13,_14){
+var _15=[];
+for(var i=0,v,n,_16;(v=this.views[i])&&(n=_13[i]);i++){
+_16=v.renderRow(_12);
+n.appendChild(_16);
+_15.push(_16);
+}
+if(!_14){
+this.normalizeRowNodeHeights(_15);
+}
+},rowRemoved:function(_17){
+this.onEach("rowRemoved",[_17]);
+},updateRow:function(_18,_19){
 for(var i=0,v;v=this.views[i];i++){
-v.updateRow(_3f);
+v.updateRow(_18);
+}
+if(!_19){
+this.renormalizeRow(_18);
 }
-this.renormalizeRow(_3f);
-},updateRowStyles:function(_42){
-this.onEach("updateRowStyles",[_42]);
-},setScrollTop:function(_43){
-var top=_43;
+},updateRowStyles:function(_1a){
+this.onEach("updateRowStyles",[_1a]);
+},setScrollTop:function(_1b){
+var top=_1b;
 for(var i=0,v;v=this.views[i];i++){
-top=v.setScrollTop(_43);
+top=v.setScrollTop(_1b);
 if(dojo.isIE&&v.headerNode&&v.scrollboxNode){
 v.headerNode.scrollLeft=v.scrollboxNode.scrollLeft;
 }
@@ -185,5 +207,6 @@ if(v.hasHScrollbar()||v.hasVScrollbar()){
 return v;
 }
 }
+return null;
 }});
 }
diff --git a/dojox/grid/_grid/Grid.css b/dojox/grid/_grid/Grid.css
deleted file mode 100644
index 123de2b..0000000
--- a/dojox/grid/_grid/Grid.css
+++ /dev/null
@@ -1,201 +0,0 @@
-.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(../compat/_grid/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(../compat/_grid/images/grid_sort_down.gif) left no-repeat; 
-	padding-left:16px;
-	margin-left:4px;
-}
-.dojoxGrid-sort-up {
-	background: url(../compat/_grid/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(../compat/_grid/images/grid_dx_gradient.gif) #E8E1CF top repeat-x;
-}
-.dojoxGrid-rowbar-inner {
-	border-top: 1px solid #F6F4EB;
-}
-.dojoxGrid-rowbar-over {
-	background-image: none;
-	background-color: white;
-	border-top-color: #FEBE47;
-	border-bottom-color: #FEBE47;
-}
-.dojoxGrid-rowbar-selected {
-	background-color: #D9E8F9;
-	background-image: none;
-	
-	background-position: center;
-	background-repeat: no-repeat;
-}
-.dojoxGrid-row {
-	position: relative;
-	width: 9000em;
-}
-.dojoxGrid-row {
-	
-	border: 1px solid #E8E4D8;
-	border-color: #F8F7F1;
-	
-	border-left: none;
-	border-right: none;
-	background-color: white;
-	border-top: none;
-}
-.dojoxGrid-row-over {
-	border-top-color: #FEBE47;
-	border-bottom-color: #FEBE47;
-	
-	
-	
-}
-.dojoxGrid-row-odd {
-	background-color: #FFFDF3;
-	
-}
-.dojoxGrid-row-selected {
-	background-color: #D9E8F9;
-}
-.dojoxGrid-row-table {
-	table-layout: fixed;
-	width: 0;
-}
-.dojoxGrid-invisible {
-	visibility: hidden;
-}		
-.Xdojo-ie .dojoxGrid-invisible {
-	display: none;
-}		
-.dojoxGrid-invisible td, .dojoxGrid-header .dojoxGrid-invisible td {
-	border-top-width: 0;
-	border-bottom-width: 0;
-	padding-top: 0;
-	padding-bottom: 0;
-	height: 0;
-	overflow: hidden;
-}
-.dojoxGrid-cell {
-	border: 1px solid;
-	border-color: #EBEADB;
-	border-right-color: #D5CDB5;
-	padding: 3px 3px 3px 3px;
-	text-align: left;
-	overflow: hidden;
-}
-.dojoxGrid-cell-focus {
-	border: 1px dashed blue;
-}
-.dojoxGrid-cell-over {
-	border: 1px dotted #FEBE47;
-}
-.dojoxGrid-cell-focus.dojoxGrid-cell-over {
-	border: 1px dotted green;
-}
-.dojoxGrid-cell-clip {
-	width: 100%;
-	overflow: hidden;
-	white-space:nowrap;
-	text-overflow: ellipsis;
-}
-.dojoxGrid-row-editing td {
-	background-color: #F4FFF4;
-}
-.dojoxGrid-row-inserting td {
-	background-color: #F4FFF4;
-}
-.dojoxGrid-row-inflight td {
-	background-color: #F2F7B7;
-}
-.dojoxGrid-row-error td {
-	background-color: #F8B8B6;
-}
-.dojoxGrid-input, .dojoxGrid-select, .dojoxGrid-textarea {
-	margin: 0;
-	padding: 0;
-	border-style: none;
-	width: 100%;
-	font-size: 100%;
-	font-family: inherit;
-}
-.dojoxGrid-hidden-focus {
-	position: absolute;
-	left: -1000px;
-	top: -1000px;
-	height: 0px, width: 0px;
-}
-.gridArrowButtonChar {
-	display:none !important;
-}
-.dijit_a11y .gridArrowButtonChar {
-	display:inline !important;
-}
-.dijit_a11y .dojoxGrid-sort-down, .dijit_a11y .dojoxGrid-sort-up {
-	margin-left: 0;
-	padding-left: 0;
-}
diff --git a/dojox/grid/_grid/Grid_rtl.css b/dojox/grid/_grid/Grid_rtl.css
deleted file mode 100644
index 88ab215..0000000
--- a/dojox/grid/_grid/Grid_rtl.css
+++ /dev/null
@@ -1,8 +0,0 @@
-.dijitRtl .dojoxGrid-header table {
-}
-.dj_ie .dijitRtl .dojoxGrid-header table {
-	float:none;
-}
-.dijitRtl .dojoxGrid-content {
-	float:left;
-}
diff --git a/dojox/grid/_grid/nihiloGrid.css b/dojox/grid/_grid/nihiloGrid.css
deleted file mode 100644
index 6d57d61..0000000
--- a/dojox/grid/_grid/nihiloGrid.css
+++ /dev/null
@@ -1,211 +0,0 @@
-.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(../compat/../../../dijit/themes/nihilo/images/titleBar.png) #e9e9e9 repeat-x top;
-	padding-bottom: 2px;
-	color: #000 !important;
-}
-.nihilo .dojoxGrid-header .dojoxGrid-cell-over {
-	background: url(../compat/../../../dijit/themes/nihilo/images/titleBarActive.png) #e9e9e9 repeat-x top;
-}
-.nihilo .dojoxGrid-sort-down {
-	background: url(../compat/_grid/images/grid_sort_down.gif) right no-repeat;
-	padding-left: 0px;
-	margin-left: 0px;
-}
-.nihilo .dojoxGrid-sort-up {
-	background: url(../compat/_grid/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(../compat/_grid/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(../compat/_grid/images/titleBarActive.png) #e9e9e9 repeat-y right;
-}
-.nihilo .dojoxGrid-rowbar-selected {
-	background-color: #D9E8F9;
-	background-image: none;
-	background: url(../compat/../../../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;
-}
diff --git a/dojox/grid/_grid/soriaGrid.css b/dojox/grid/_grid/soriaGrid.css
deleted file mode 100644
index 89dc956..0000000
--- a/dojox/grid/_grid/soriaGrid.css
+++ /dev/null
@@ -1,212 +0,0 @@
-.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(../compat/../../../dijit/themes/soria/images/titleBar.png) #e9e9e9 repeat-x top;
-	padding-bottom: 2px;
-	color: #000 !important;
-}
-.soria .dojoxGrid-header .dojoxGrid-cell-over {
-	background: url(../compat/../../../dijit/themes/soria/images/titleBarActive.png) #e9e9e9 repeat-x top;
-}
-.soria .dojoxGrid-sort-down {
-	background: url(../compat/_grid/images/grid_sort_down.gif) right no-repeat;
-	padding-left: 0px;
-	margin-left: 0px;
-}
-.soria .dojoxGrid-sort-up {
-	background: url(../compat/_grid/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(../compat/_grid/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(../compat/_grid/images/titleBarActive.png) #e9e9e9 repeat-y right;
-}
-.soria .dojoxGrid-rowbar-selected {
-	background-color: #D9E8F9;
-	background-image: none;
-	background: url(../compat/../../../dijit/themes/soria/images/titleBar.png) #dddddd repeat-x top;
-	border-right: 1px solid #cccccc;
-	background-position: center;
-	background-repeat: no-repeat;
-}
-.soria .dojoxGrid-row {
-	position: relative;
-	width: 9000em;
-}
-.soria .dojoxGrid-row {
-	border: none;
-	border-left: none;
-	border-right: none;
-	background-color: white;
-	border-top: none;
-}
-.soria .dojoxGrid-row-over {
-	border-top-color: #cccccc;
-	border-bottom-color: #cccccc;
-}
-.soria .dojoxGrid-row-over .dojoxGrid-cell {
-	background-color: #60a1ea; 
-	color:#fff;
-}
-.soria .dojoxGrid-row-odd {
-	background-color: #f2f5f9;
-	
-}
-.soria .dojoxGrid-row-selected {
-	background-color: #aec7e3;
-}
-.soria .dojoxGrid-row-table {
-	table-layout: fixed;
-	width: 0;
-	border-collapse: collapse;
-}
-.soria .dojoxGrid-invisible {
-	visibility: hidden;
-}		
-.soria .Xdojo-ie .dojoxGrid-invisible {
-	display: none;
-}		
-.soria .dojoxGrid-invisible td, .dojoxGrid-header .dojoxGrid-invisible td {
-	border-top-width: 0;
-	border-bottom-width: 0;
-	padding-top: 0;
-	padding-bottom: 0;
-	height: 0;
-	overflow: hidden;
-}
-.soria .dojoxGrid-cell {
-	border: 1px dotted #D5CDB5;
-	padding: 3px 3px 3px 3px;
-	text-align: left;
-	overflow: hidden;
-}
-.dj_ie6 .soria .dojoxGrid-cell {
-	border: 1px solid white;
-	border-right: 1px solid #D5CDB5;
-}
-.soria .dojoxGrid-cell-focus {
-	border: 1px dotted #a6a6a6;
-}
-.soria .dojoxGrid-cell-over {
-	border: 1px dotted #a6a6a6;
-}
-.soria .dojoxGrid-cell-focus.dojoxGrid-cell-over {
-	border: 1px dotted #595959;
-}
-.soria .dojoxGrid-cell-clip {
-	width: 100%;
-	overflow: hidden;
-	white-space:nowrap;
-	text-overflow: ellipsis;
-}
-.soria .dojoxGrid-row-editing td {
-	
-	background-color: #60a1ea; 
-	
-}
-.soria .dojoxGrid-row-inserting td {
-	background-color: #F4FFF4;
-}
-.soria .dojoxGrid-row-inflight td {
-	background-color: #F2F7B7;
-}
-.soria .dojoxGrid-row-error td {
-	background-color: #F8B8B6;
-}
-.soria .dojoxGrid-input,
-.soria .dojoxGrid-select,
-.soria .dojoxGrid-textarea {
-	margin: 0;
-	padding: 0px;
-	border-style: none;
-	width: 100%;
-	font-size: 100%;
-	font-family: inherit;
-}
-.dojoxGrid-hidden-focus {
-	position: absolute;
-	left: -1000px;
-	top: -1000px;
-	height: 0px, width: 0px;
-}
-.dijit_a11y .dojoxGrid-rowbar-selected { 
-	border-top: 1px solid white;
-	border-bottom: 1px dashed black;
-	border-top: 0;
-	background: none;
-}
-.dijit_a11y .dojoxGrid-rowbar-selected .dojoxGrid-rowbar-inner {
-	border: 0;
-	border-top: 1px solid white;
-}
-.dijit_a11y .dojoxGrid-row-selected {
-	border-bottom: 1px dashed black;
-}
diff --git a/dojox/grid/_grid/tundraGrid.css b/dojox/grid/_grid/tundraGrid.css
deleted file mode 100644
index 3bed74b..0000000
--- a/dojox/grid/_grid/tundraGrid.css
+++ /dev/null
@@ -1,215 +0,0 @@
-.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(../compat/../../../dijit/themes/tundra/images/tabEnabled.png) #e9e9e9 repeat-x top;
-	padding-bottom: 2px;
-	color: #000 !important;
-}
-.tundra .dojoxGrid-header .dojoxGrid-cell-over {
-	background: url(../compat/../../../dijit/themes/tundra/images/tabHover.png) #e9e9e9 repeat-x top;
-	color: #000 !important;
-}
-.tundra .dojoxGrid-sort-down {
-	background: url(../compat/../../../dijit/themes/tundra/images/smallArrowDown.png) right no-repeat;
-	padding-left: 0px;
-	margin-left: 0px;
-}
-.tundra .dojoxGrid-sort-up {
-	background: url(../compat/../../../dijit/themes/tundra/images/smallArrowUp.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(../compat/_grid/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(../compat/_grid/images/tabHover_rotated.png) #e9e9e9 repeat-y right;
-}
-.tundra .dojoxGrid-rowbar-selected {
-	background-color: #D9E8F9;
-	background-image: none;
-	background: url(../compat/../../../dijit/themes/tundra/images/tabDisabled.png) #dddddd repeat-x top;
-	border-right: 1px solid #cccccc;
-	background-position: center;
-	background-repeat: no-repeat;
-}
-.tundra .dojoxGrid-row {
-	position: relative;
-	width: 9000em;
-}
-.tundra .dojoxGrid-row {
-	border: none;
-	border-left: none;
-	border-right: none;
-	background-color: white;
-	border-top: none;
-}
-.tundra .dojoxGrid-row-over {
-	border-top-color: #cccccc;
-	border-bottom-color: #cccccc;
-}
-.tundra .dojoxGrid-row-over .dojoxGrid-cell {
-	background-color: #60a1ea; 
-	color:#fff;
-	
-}
-.tundra .dojoxGrid-row-odd {
-	background-color: #f2f5f9;
-	
-}
-.tundra .dojoxGrid-row-selected {
-	background-color: #aec7e3;
-	
-}
-.tundra .dojoxGrid-row-table {
-	table-layout: fixed;
-	width: 0;
-	border-collapse: collapse;
-}
-.tundra .dojoxGrid-invisible {
-	visibility: hidden;
-}		
-.tundra .Xdojo-ie .dojoxGrid-invisible {
-	display: none;
-}		
-.tundra .dojoxGrid-invisible td, .dojoxGrid-header .dojoxGrid-invisible td {
-	border-top-width: 0;
-	border-bottom-width: 0;
-	padding-top: 0;
-	padding-bottom: 0;
-	height: 0;
-	overflow: hidden;
-}
-.tundra .dojoxGrid-cell {
-	border: 1px dotted #D5CDB5;
-	padding: 3px 3px 3px 3px;
-	text-align: left;
-	overflow: hidden;
-}
-.dj_ie6 .tundra .dojoxGrid-cell {
-	border: 1px solid white;
-	border-right: 1px solid #D5CDB5;
-}
-.tundra .dojoxGrid-cell-focus {
-	border: 1px dotted #a6a6a6;
-}
-.tundra .dojoxGrid-cell-over {
-	border: 1px dotted #a6a6a6;
-}
-.tundra .dojoxGrid-cell-focus.dojoxGrid-cell-over {
-	border: 1px dotted #595959;
-}
-.tundra .dojoxGrid-cell-clip {
-	width: 100%;
-	overflow: hidden;
-	white-space:nowrap;
-	text-overflow: ellipsis;
-}
-.tundra .dojoxGrid-row-editing td {
-	
-	background-color: #60a1ea; 
-	
-}
-.tundra .dojoxGrid-row-inserting td {
-	background-color: #F4FFF4;
-}
-.tundra .dojoxGrid-row-inflight td {
-	background-color: #F2F7B7;
-}
-.tundra .dojoxGrid-row-error td {
-	background-color: #F8B8B6;
-}
-.tundra .dojoxGrid-input,
-.tundra .dojoxGrid-select,
-.tundra .dojoxGrid-textarea {
-	margin: 0;
-	padding: 0px;
-	border-style: none;
-	width: 100%;
-	font-size: 100%;
-	font-family: inherit;
-}
-.dojoxGrid-hidden-focus {
-	position: absolute;
-	left: -1000px;
-	top: -1000px;
-	height: 0px, width: 0px;
-}
-.dijit_a11y .dojoxGrid-rowbar-selected { 
-	border-top: 1px solid white;
-	border-bottom: 1px dashed black;
-	border-top: 0;
-	background: none;
-}
-.dijit_a11y .dojoxGrid-rowbar-selected .dojoxGrid-rowbar-inner {
-	border: 0;
-	border-top: 1px solid white;
-}
-.dijit_a11y .dojoxGrid-row-selected {
-	border-bottom: 1px dashed black;
-}
diff --git a/dojox/grid/cells/_base.js b/dojox/grid/cells/_base.js
index 558390d..c3b1a21 100644
--- a/dojox/grid/cells/_base.js
+++ b/dojox/grid/cells/_base.js
@@ -9,142 +9,177 @@ if(!dojo._hasResource["dojox.grid.cells._base"]){
 dojo._hasResource["dojox.grid.cells._base"]=true;
 dojo.provide("dojox.grid.cells._base");
 dojo.require("dojox.grid.util");
+dojo.require("dijit._Widget");
+dojo.declare("dojox.grid._DeferredTextWidget",dijit._Widget,{deferred:null,_destroyOnRemove:true,postCreate:function(){
+if(this.deferred){
+this.deferred.addBoth(dojo.hitch(this,function(_1){
+if(this.domNode){
+this.domNode.innerHTML=_1;
+}
+}));
+}
+}});
 (function(){
-var _1=function(_2){
+var _2=function(_3){
 try{
-dojox.grid.util.fire(_2,"focus");
-dojox.grid.util.fire(_2,"select");
+dojox.grid.util.fire(_3,"focus");
+dojox.grid.util.fire(_3,"select");
 }
 catch(e){
 }
 };
-var _3=function(){
+var _4=function(){
 setTimeout(dojo.hitch.apply(dojo,arguments),0);
 };
-var _4=dojox.grid.cells;
-dojo.declare("dojox.grid.cells._Base",null,{styles:"",classes:"",editable:false,alwaysEditing:false,formatter:null,defaultValue:"...",value:null,hidden:false,noresize:false,_valueProp:"value",_formatPending:false,constructor:function(_5){
-this._props=_5||{};
-dojo.mixin(this,_5);
-},format:function(_6,_7){
-var f,i=this.grid.edit.info,d=this.get?this.get(_6,_7):(this.value||this.defaultValue);
-d=(d&&d.replace)?d.replace(/</g,"<"):d;
-if(this.editable&&(this.alwaysEditing||(i.rowIndex==_6&&i.cell==this))){
-return this.formatEditing(d,_6);
+var _5=dojox.grid.cells;
+dojo.declare("dojox.grid.cells._Base",null,{styles:"",classes:"",editable:false,alwaysEditing:false,formatter:null,defaultValue:"...",value:null,hidden:false,noresize:false,draggable:true,_valueProp:"value",_formatPending:false,constructor:function(_6){
+this._props=_6||{};
+dojo.mixin(this,_6);
+if(this.draggable===undefined){
+this.draggable=true;
+}
+},_defaultFormat:function(_7,_8){
+var s=this.grid.formatterScope||this;
+var f=this.formatter;
+if(f&&s&&typeof f=="string"){
+f=this.formatter=s[f];
+}
+var v=(_7!=this.defaultValue&&f)?f.apply(s,_8):_7;
+if(typeof v=="undefined"){
+return this.defaultValue;
+}
+if(v&&v.addBoth){
+v=new dojox.grid._DeferredTextWidget({deferred:v},dojo.create("span",{innerHTML:this.defaultValue}));
+}
+if(v&&v.declaredClass&&v.startup){
+return "<div class='dojoxGridStubNode' linkWidget='"+v.id+"' cellIdx='"+this.index+"'>"+this.defaultValue+"</div>";
+}
+return v;
+},format:function(_9,_a){
+var f,i=this.grid.edit.info,d=this.get?this.get(_9,_a):(this.value||this.defaultValue);
+d=(d&&d.replace&&this.grid.escapeHTMLInData)?d.replace(/&/g,"&").replace(/</g,"<"):d;
+if(this.editable&&(this.alwaysEditing||(i.rowIndex==_9&&i.cell==this))){
+return this.formatEditing(d,_9);
 }else{
-var v=(d!=this.defaultValue&&(f=this.formatter))?f.call(this,d,_6):d;
-return (typeof v=="undefined"?this.defaultValue:v);
+return this._defaultFormat(d,[d,_9,this]);
 }
-},formatEditing:function(_c,_d){
-},getNode:function(_e){
-return this.view.getCellNode(_e,this.index);
+},formatEditing:function(_b,_c){
+},getNode:function(_d){
+return this.view.getCellNode(_d,this.index);
 },getHeaderNode:function(){
 return this.view.getHeaderCellNode(this.index);
-},getEditNode:function(_f){
-return (this.getNode(_f)||0).firstChild||0;
+},getEditNode:function(_e){
+return (this.getNode(_e)||0).firstChild||0;
 },canResize:function(){
 var uw=this.unitWidth;
 return uw&&(uw!=="auto");
 },isFlex:function(){
 var uw=this.unitWidth;
 return uw&&dojo.isString(uw)&&(uw=="auto"||uw.slice(-1)=="%");
-},applyEdit:function(_12,_13){
-this.grid.edit.applyCellEdit(_12,this,_13);
-},cancelEdit:function(_14){
-this.grid.doCancelEdit(_14);
-},_onEditBlur:function(_15){
-if(this.grid.edit.isEditCell(_15,this.index)){
+},applyEdit:function(_f,_10){
+this.grid.edit.applyCellEdit(_f,this,_10);
+},cancelEdit:function(_11){
+this.grid.doCancelEdit(_11);
+},_onEditBlur:function(_12){
+if(this.grid.edit.isEditCell(_12,this.index)){
 this.grid.edit.apply();
 }
-},registerOnBlur:function(_16,_17){
+},registerOnBlur:function(_13,_14){
 if(this.commitOnBlur){
-dojo.connect(_16,"onblur",function(e){
-setTimeout(dojo.hitch(this,"_onEditBlur",_17),250);
+dojo.connect(_13,"onblur",function(e){
+setTimeout(dojo.hitch(this,"_onEditBlur",_14),250);
 });
 }
-},needFormatNode:function(_19,_1a){
+},needFormatNode:function(_15,_16){
 this._formatPending=true;
-_3(this,"_formatNode",_19,_1a);
+_4(this,"_formatNode",_15,_16);
 },cancelFormatNode:function(){
 this._formatPending=false;
-},_formatNode:function(_1b,_1c){
+},_formatNode:function(_17,_18){
 if(this._formatPending){
 this._formatPending=false;
 dojo.setSelectable(this.grid.domNode,true);
-this.formatNode(this.getEditNode(_1c),_1b,_1c);
+this.formatNode(this.getEditNode(_18),_17,_18);
 }
-},formatNode:function(_1d,_1e,_1f){
+},formatNode:function(_19,_1a,_1b){
 if(dojo.isIE){
-_3(this,"focus",_1f,_1d);
+_4(this,"focus",_1b,_19);
 }else{
-this.focus(_1f,_1d);
+this.focus(_1b,_19);
 }
 },dispatchEvent:function(m,e){
 if(m in this){
 return this[m](e);
 }
-},getValue:function(_22){
-return this.getEditNode(_22)[this._valueProp];
-},setValue:function(_23,_24){
-var n=this.getEditNode(_23);
+},getValue:function(_1c){
+return this.getEditNode(_1c)[this._valueProp];
+},setValue:function(_1d,_1e){
+var n=this.getEditNode(_1d);
 if(n){
-n[this._valueProp]=_24;
-}
-},focus:function(_26,_27){
-_1(_27||this.getEditNode(_26));
-},save:function(_28){
-this.value=this.value||this.getValue(_28);
-},restore:function(_29){
-this.setValue(_29,this.value);
-},_finish:function(_2a){
+n[this._valueProp]=_1e;
+}
+},focus:function(_1f,_20){
+_2(_20||this.getEditNode(_1f));
+},save:function(_21){
+this.value=this.value||this.getValue(_21);
+},restore:function(_22){
+this.setValue(_22,this.value);
+},_finish:function(_23){
 dojo.setSelectable(this.grid.domNode,false);
 this.cancelFormatNode();
-},apply:function(_2b){
-this.applyEdit(this.getValue(_2b),_2b);
-this._finish(_2b);
-},cancel:function(_2c){
-this.cancelEdit(_2c);
-this._finish(_2c);
+},apply:function(_24){
+this.applyEdit(this.getValue(_24),_24);
+this._finish(_24);
+},cancel:function(_25){
+this.cancelEdit(_25);
+this._finish(_25);
 }});
-_4._Base.markupFactory=function(_2d,_2e){
+_5._Base.markupFactory=function(_26,_27){
 var d=dojo;
-var _30=d.trim(d.attr(_2d,"formatter")||"");
-if(_30){
-_2e.formatter=dojo.getObject(_30);
+var _28=d.trim(d.attr(_26,"formatter")||"");
+if(_28){
+_27.formatter=dojo.getObject(_28)||_28;
 }
-var get=d.trim(d.attr(_2d,"get")||"");
+var get=d.trim(d.attr(_26,"get")||"");
 if(get){
-_2e.get=dojo.getObject(get);
+_27.get=dojo.getObject(get);
+}
+var _29=function(_2a,_2b,_2c){
+var _2d=d.trim(d.attr(_26,_2a)||"");
+if(_2d){
+_2b[_2c||_2a]=!(_2d.toLowerCase()=="false");
 }
-var _32=function(_33){
-var _34=d.trim(d.attr(_2d,_33)||"");
-return _34?!(_34.toLowerCase()=="false"):undefined;
 };
-_2e.sortDesc=_32("sortDesc");
-_2e.editable=_32("editable");
-_2e.alwaysEditing=_32("alwaysEditing");
-_2e.noresize=_32("noresize");
-var _35=d.trim(d.attr(_2d,"loadingText")||d.attr(_2d,"defaultValue")||"");
-if(_35){
-_2e.defaultValue=_35;
-}
-var _36=function(_37){
-return d.trim(d.attr(_2d,_37)||"")||undefined;
+_29("sortDesc",_27);
+_29("editable",_27);
+_29("alwaysEditing",_27);
+_29("noresize",_27);
+_29("draggable",_27);
+var _2e=d.trim(d.attr(_26,"loadingText")||d.attr(_26,"defaultValue")||"");
+if(_2e){
+_27.defaultValue=_2e;
+}
+var _2f=function(_30,_31,_32){
+var _33=d.trim(d.attr(_26,_30)||"")||undefined;
+if(_33){
+_31[_32||_30]=_33;
+}
 };
-_2e.styles=_36("styles");
-_2e.headerStyles=_36("headerStyles");
-_2e.cellStyles=_36("cellStyles");
-_2e.classes=_36("classes");
-_2e.headerClasses=_36("headerClasses");
-_2e.cellClasses=_36("cellClasses");
+_2f("styles",_27);
+_2f("headerStyles",_27);
+_2f("cellStyles",_27);
+_2f("classes",_27);
+_2f("headerClasses",_27);
+_2f("cellClasses",_27);
 };
-dojo.declare("dojox.grid.cells.Cell",_4._Base,{constructor:function(){
+dojo.declare("dojox.grid.cells.Cell",_5._Base,{constructor:function(){
 this.keyFilter=this.keyFilter;
-},keyFilter:null,formatEditing:function(_38,_39){
-this.needFormatNode(_38,_39);
-return "<input class=\"dojoxGridInput\" type=\"text\" value=\""+_38+"\">";
-},formatNode:function(_3a,_3b,_3c){
+},keyFilter:null,formatEditing:function(_34,_35){
+this.needFormatNode(_34,_35);
+return "<input class=\"dojoxGridInput\" type=\"text\" value=\""+_34+"\">";
+},formatNode:function(_36,_37,_38){
 this.inherited(arguments);
-this.registerOnBlur(_3a,_3c);
+this.registerOnBlur(_36,_38);
 },doKey:function(e){
 if(this.keyFilter){
 var key=String.fromCharCode(e.charCode);
@@ -152,85 +187,85 @@ if(key.search(this.keyFilter)==-1){
 dojo.stopEvent(e);
 }
 }
-},_finish:function(_3f){
+},_finish:function(_39){
 this.inherited(arguments);
-var n=this.getEditNode(_3f);
+var n=this.getEditNode(_39);
 try{
 dojox.grid.util.fire(n,"blur");
 }
 catch(e){
 }
 }});
-_4.Cell.markupFactory=function(_41,_42){
-_4._Base.markupFactory(_41,_42);
+_5.Cell.markupFactory=function(_3a,_3b){
+_5._Base.markupFactory(_3a,_3b);
 var d=dojo;
-var _44=d.trim(d.attr(_41,"keyFilter")||"");
-if(_44){
-_42.keyFilter=new RegExp(_44);
+var _3c=d.trim(d.attr(_3a,"keyFilter")||"");
+if(_3c){
+_3b.keyFilter=new RegExp(_3c);
 }
 };
-dojo.declare("dojox.grid.cells.RowIndex",_4.Cell,{name:"Row",postscript:function(){
+dojo.declare("dojox.grid.cells.RowIndex",_5.Cell,{name:"Row",postscript:function(){
 this.editable=false;
-},get:function(_45){
-return _45+1;
+},get:function(_3d){
+return _3d+1;
 }});
-_4.RowIndex.markupFactory=function(_46,_47){
-_4.Cell.markupFactory(_46,_47);
+_5.RowIndex.markupFactory=function(_3e,_3f){
+_5.Cell.markupFactory(_3e,_3f);
 };
-dojo.declare("dojox.grid.cells.Select",_4.Cell,{options:null,values:null,returnIndex:-1,constructor:function(_48){
+dojo.declare("dojox.grid.cells.Select",_5.Cell,{options:null,values:null,returnIndex:-1,constructor:function(_40){
 this.values=this.values||this.options;
-},formatEditing:function(_49,_4a){
-this.needFormatNode(_49,_4a);
+},formatEditing:function(_41,_42){
+this.needFormatNode(_41,_42);
 var h=["<select class=\"dojoxGridSelect\">"];
 for(var i=0,o,v;((o=this.options[i])!==undefined)&&((v=this.values[i])!==undefined);i++){
-h.push("<option",(_49==v?" selected":"")," value=\""+v+"\"",">",o,"</option>");
+h.push("<option",(_41==v?" selected":"")," value=\""+v+"\"",">",o,"</option>");
 }
 h.push("</select>");
 return h.join("");
-},getValue:function(_4f){
-var n=this.getEditNode(_4f);
+},getValue:function(_43){
+var n=this.getEditNode(_43);
 if(n){
 var i=n.selectedIndex,o=n.options[i];
 return this.returnIndex>-1?i:o.value||o.innerHTML;
 }
 }});
-_4.Select.markupFactory=function(_53,_54){
-_4.Cell.markupFactory(_53,_54);
+_5.Select.markupFactory=function(_44,_45){
+_5.Cell.markupFactory(_44,_45);
 var d=dojo;
-var _56=d.trim(d.attr(_53,"options")||"");
-if(_56){
-var o=_56.split(",");
-if(o[0]!=_56){
-_54.options=o;
+var _46=d.trim(d.attr(_44,"options")||"");
+if(_46){
+var o=_46.split(",");
+if(o[0]!=_46){
+_45.options=o;
 }
 }
-var _58=d.trim(d.attr(_53,"values")||"");
-if(_58){
-var v=_58.split(",");
-if(v[0]!=_58){
-_54.values=v;
+var _47=d.trim(d.attr(_44,"values")||"");
+if(_47){
+var v=_47.split(",");
+if(v[0]!=_47){
+_45.values=v;
 }
 }
 };
-dojo.declare("dojox.grid.cells.AlwaysEdit",_4.Cell,{alwaysEditing:true,_formatNode:function(_5a,_5b){
-this.formatNode(this.getEditNode(_5b),_5a,_5b);
-},applyStaticValue:function(_5c){
+dojo.declare("dojox.grid.cells.AlwaysEdit",_5.Cell,{alwaysEditing:true,_formatNode:function(_48,_49){
+this.formatNode(this.getEditNode(_49),_48,_49);
+},applyStaticValue:function(_4a){
 var e=this.grid.edit;
-e.applyCellEdit(this.getValue(_5c),this,_5c);
-e.start(this,_5c,true);
+e.applyCellEdit(this.getValue(_4a),this,_4a);
+e.start(this,_4a,true);
 }});
-_4.AlwaysEdit.markupFactory=function(_5e,_5f){
-_4.Cell.markupFactory(_5e,_5f);
+_5.AlwaysEdit.markupFactory=function(_4b,_4c){
+_5.Cell.markupFactory(_4b,_4c);
 };
-dojo.declare("dojox.grid.cells.Bool",_4.AlwaysEdit,{_valueProp:"checked",formatEditing:function(_60,_61){
-return "<input class=\"dojoxGridInput\" type=\"checkbox\""+(_60?" checked=\"checked\"":"")+" style=\"width: auto\" />";
+dojo.declare("dojox.grid.cells.Bool",_5.AlwaysEdit,{_valueProp:"checked",formatEditing:function(_4d,_4e){
+return "<input class=\"dojoxGridInput\" type=\"checkbox\""+(_4d?" checked=\"checked\"":"")+" style=\"width: auto\" />";
 },doclick:function(e){
 if(e.target.tagName=="INPUT"){
 this.applyStaticValue(e.rowIndex);
 }
 }});
-_4.Bool.markupFactory=function(_63,_64){
-_4.AlwaysEdit.markupFactory(_63,_64);
+_5.Bool.markupFactory=function(_4f,_50){
+_5.AlwaysEdit.markupFactory(_4f,_50);
 };
 })();
 }
diff --git a/dojox/grid/cells/dijit.js b/dojox/grid/cells/dijit.js
index 442b294..15f18fb 100644
--- a/dojox/grid/cells/dijit.js
+++ b/dojox/grid/cells/dijit.js
@@ -38,7 +38,7 @@ if(this.widget&&this.widget.attr){
 if(this.widget.onLoadDeferred){
 var _8=this;
 this.widget.onLoadDeferred.addCallback(function(){
-_8.widget.attr("value",_7==null?"":_7);
+_8.widget.attr("value",_7===null?"":_7);
 });
 }else{
 this.widget.attr("value",_7);
@@ -65,92 +65,93 @@ this.attachWidget.apply(this,arguments);
 this.sizeWidget.apply(this,arguments);
 this.grid.rowHeightChanged(_12);
 this.focus();
+return undefined;
 },sizeWidget:function(_13,_14,_15){
 var p=this.getNode(_15),box=dojo.contentBox(p);
 dojo.marginBox(this.widget.domNode,{w:box.w});
-},focus:function(_18,_19){
+},focus:function(_16,_17){
 if(this.widget){
 setTimeout(dojo.hitch(this.widget,function(){
 dojox.grid.util.fire(this,"focus");
 }),0);
 }
-},_finish:function(_1a){
+},_finish:function(_18){
 this.inherited(arguments);
 dojox.grid.util.removeNode(this.widget.domNode);
 }});
-_1._Widget.markupFactory=function(_1b,_1c){
-_1._Base.markupFactory(_1b,_1c);
+_1._Widget.markupFactory=function(_19,_1a){
+_1._Base.markupFactory(_19,_1a);
 var d=dojo;
-var _1e=d.trim(d.attr(_1b,"widgetProps")||"");
-var _1f=d.trim(d.attr(_1b,"constraint")||"");
-var _20=d.trim(d.attr(_1b,"widgetClass")||"");
-if(_1e){
-_1c.widgetProps=d.fromJson(_1e);
+var _1b=d.trim(d.attr(_19,"widgetProps")||"");
+var _1c=d.trim(d.attr(_19,"constraint")||"");
+var _1d=d.trim(d.attr(_19,"widgetClass")||"");
+if(_1b){
+_1a.widgetProps=d.fromJson(_1b);
 }
-if(_1f){
-_1c.constraint=d.fromJson(_1f);
+if(_1c){
+_1a.constraint=d.fromJson(_1c);
 }
-if(_20){
-_1c.widgetClass=d.getObject(_20);
+if(_1d){
+_1a.widgetClass=d.getObject(_1d);
 }
 };
-dojo.declare("dojox.grid.cells.ComboBox",_1._Widget,{widgetClass:dijit.form.ComboBox,getWidgetProps:function(_21){
-var _22=[];
+dojo.declare("dojox.grid.cells.ComboBox",_1._Widget,{widgetClass:dijit.form.ComboBox,getWidgetProps:function(_1e){
+var _1f=[];
 dojo.forEach(this.options,function(o){
-_22.push({name:o,value:o});
+_1f.push({name:o,value:o});
 });
-var _24=new dojo.data.ItemFileReadStore({data:{identifier:"name",items:_22}});
-return dojo.mixin({},this.widgetProps||{},{value:_21,store:_24});
+var _20=new dojo.data.ItemFileReadStore({data:{identifier:"name",items:_1f}});
+return dojo.mixin({},this.widgetProps||{},{value:_1e,store:_20});
 },getValue:function(){
 var e=this.widget;
 e.attr("displayedValue",e.attr("displayedValue"));
 return e.attr("value");
 }});
-_1.ComboBox.markupFactory=function(_26,_27){
-_1._Widget.markupFactory(_26,_27);
+_1.ComboBox.markupFactory=function(_21,_22){
+_1._Widget.markupFactory(_21,_22);
 var d=dojo;
-var _29=d.trim(d.attr(_26,"options")||"");
-if(_29){
-var o=_29.split(",");
-if(o[0]!=_29){
-_27.options=o;
+var _23=d.trim(d.attr(_21,"options")||"");
+if(_23){
+var o=_23.split(",");
+if(o[0]!=_23){
+_22.options=o;
 }
 }
 };
-dojo.declare("dojox.grid.cells.DateTextBox",_1._Widget,{widgetClass:dijit.form.DateTextBox,setValue:function(_2b,_2c){
+dojo.declare("dojox.grid.cells.DateTextBox",_1._Widget,{widgetClass:dijit.form.DateTextBox,setValue:function(_24,_25){
 if(this.widget){
-this.widget.attr("value",new Date(_2c));
+this.widget.attr("value",new Date(_25));
 }else{
 this.inherited(arguments);
 }
-},getWidgetProps:function(_2d){
-return dojo.mixin(this.inherited(arguments),{value:new Date(_2d)});
+},getWidgetProps:function(_26){
+return dojo.mixin(this.inherited(arguments),{value:new Date(_26)});
 }});
-_1.DateTextBox.markupFactory=function(_2e,_2f){
-_1._Widget.markupFactory(_2e,_2f);
+_1.DateTextBox.markupFactory=function(_27,_28){
+_1._Widget.markupFactory(_27,_28);
 };
 dojo.declare("dojox.grid.cells.CheckBox",_1._Widget,{widgetClass:dijit.form.CheckBox,getValue:function(){
 return this.widget.checked;
-},setValue:function(_30,_31){
+},setValue:function(_29,_2a){
 if(this.widget&&this.widget.attributeMap.checked){
-this.widget.attr("checked",_31);
+this.widget.attr("checked",_2a);
 }else{
 this.inherited(arguments);
 }
-},sizeWidget:function(_32,_33,_34){
+},sizeWidget:function(_2b,_2c,_2d){
 return;
 }});
-_1.CheckBox.markupFactory=function(_35,_36){
-_1._Widget.markupFactory(_35,_36);
+_1.CheckBox.markupFactory=function(_2e,_2f){
+_1._Widget.markupFactory(_2e,_2f);
 };
-dojo.declare("dojox.grid.cells.Editor",_1._Widget,{widgetClass:dijit.Editor,getWidgetProps:function(_37){
+dojo.declare("dojox.grid.cells.Editor",_1._Widget,{widgetClass:dijit.Editor,getWidgetProps:function(_30){
 return dojo.mixin({},this.widgetProps||{},{height:this.widgetHeight||"100px"});
-},createWidget:function(_38,_39,_3a){
-var _3b=new this.widgetClass(this.getWidgetProps(_39),_38);
-dojo.connect(_3b,"onLoad",dojo.hitch(this,"populateEditor"));
-return _3b;
-},formatNode:function(_3c,_3d,_3e){
-this.content=_3d;
+},createWidget:function(_31,_32,_33){
+var _34=new this.widgetClass(this.getWidgetProps(_32),_31);
+dojo.connect(_34,"onLoad",dojo.hitch(this,"populateEditor"));
+return _34;
+},formatNode:function(_35,_36,_37){
+this.content=_36;
 this.inherited(arguments);
 if(dojo.isMoz){
 var e=this.widget;
@@ -163,15 +164,15 @@ dojo.place(e.toolbar.domNode,e.editingArea,"before");
 this.widget.attr("value",this.content);
 this.widget.placeCursorAtEnd();
 }});
-_1.Editor.markupFactory=function(_40,_41){
-_1._Widget.markupFactory(_40,_41);
+_1.Editor.markupFactory=function(_38,_39){
+_1._Widget.markupFactory(_38,_39);
 var d=dojo;
-var h=dojo.trim(dojo.attr(_40,"widgetHeight")||"");
+var h=dojo.trim(dojo.attr(_38,"widgetHeight")||"");
 if(h){
 if((h!="auto")&&(h.substr(-2)!="em")){
-h=parseInt(h)+"px";
+h=parseInt(h,10)+"px";
 }
-_41.widgetHeight=h;
+_39.widgetHeight=h;
 }
 };
 })();
diff --git a/dojox/grid/cells/tree.js b/dojox/grid/cells/tree.js
new file mode 100644
index 0000000..c5d1f84
--- /dev/null
+++ b/dojox/grid/cells/tree.js
@@ -0,0 +1,68 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid.cells.tree"]){
+dojo._hasResource["dojox.grid.cells.tree"]=true;
+dojo.provide("dojox.grid.cells.tree");
+dojo.require("dojox.grid.cells");
+dojox.grid.cells.TreeCell={formatAggregate:function(_1,_2,_3){
+var f,g=this.grid,i=g.edit.info,d=g.aggregator?g.aggregator.getForCell(this,_2,_1,_2===this.level?"cnt":this.parentCell.aggregate):(this.value||this.defaultValue);
+return this._defaultFormat(d,[d,_2-this.level,_3,this]);
+},formatIndexes:function(_4,_5){
+var f,g=this.grid,i=g.edit.info,d=this.get?this.get(_4[0],_5,_4):(this.value||this.defaultValue);
+if(this.editable&&(this.alwaysEditing||(i.rowIndex==_4[0]&&i.cell==this))){
+return this.formatEditing(d,_4[0],_4);
+}else{
+return this._defaultFormat(d,[d,_4[0],_4,this]);
+}
+},getOpenState:function(_6){
+var _7=this.grid,_8=_7.store,_9=null;
+if(_8.isItem(_6)){
+_9=_6;
+_6=_8.getIdentity(_6);
+}
+if(!this.openStates){
+this.openStates={};
+}
+if(typeof _6!="string"||!(_6 in this.openStates)){
+this.openStates[_6]=_7.getDefaultOpenState(this,_9);
+}
+return this.openStates[_6];
+},formatAtLevel:function(_a,_b,_c,_d,_e,_f){
+if(!dojo.isArray(_a)){
+_a=[_a];
+}
+var _10="";
+if(_c>this.level||(_c===this.level&&_d)){
+_f.push("dojoxGridSpacerCell");
+if(_c===this.level){
+_f.push("dojoxGridTotalCell");
+}
+_10="<span></span>";
+}else{
+if(_c<this.level){
+_f.push("dojoxGridSummaryCell");
+_10="<span class=\"dojoxGridSummarySpan\">"+this.formatAggregate(_b,_c,_a)+"</span>";
+}else{
+var ret="";
+if(this.isCollapsable){
+var _11=this.grid.store,id="";
+if(_11.isItem(_b)){
+id=_11.getIdentity(_b);
+}
+_f.push("dojoxGridExpandoCell");
+ret="<span dojoType=\"dojox.grid._Expando\" level=\""+_c+"\" class=\"dojoxGridExpando\""+"\" toggleClass=\""+_e+"\" itemId=\""+id+"\" cellIdx=\""+this.index+"\"></span>";
+}
+_10=ret+this.formatIndexes(_a,_b);
+}
+}
+if(this.grid.focus.cell&&this.index==this.grid.focus.cell.index&&_a.join("/")==this.grid.focus.rowIndex){
+_f.push(this.grid.focus.focusClass);
+}
+return _10;
+}};
+}
diff --git a/dojox/grid/compat/Grid.js b/dojox/grid/compat/Grid.js
deleted file mode 100644
index 575fcd6..0000000
--- a/dojox/grid/compat/Grid.js
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat.Grid"]){
-dojo._hasResource["dojox.grid.compat.Grid"]=true;
-dojo.provide("dojox.grid.compat.Grid");
-dojo.require("dojox.grid.compat.VirtualGrid");
-dojo.require("dojox.grid.compat._data.model");
-dojo.require("dojox.grid.compat._data.editors");
-dojo.require("dojox.grid.compat._data.dijitEditors");
-dojo.declare("dojox.Grid",dojox.VirtualGrid,{model:"dojox.grid.data.Table",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);
-},_structureChanged:function(){
-this.indexCellFields();
-this.inherited(arguments);
-},_setModel:function(_2){
-this.model=_2;
-if(this.model){
-this.model.observer(this);
-this.model.measure();
-this.indexCellFields();
-}
-},setModel:function(_3){
-if(this.model){
-this.model.notObserver(this);
-}
-this._setModel(_3);
-},get:function(_4){
-return this.grid.model.getDatum(_4,this.fieldIndex);
-},modelAllChange:function(){
-this.rowCount=(this.model?this.model.getRowCount():0);
-this.updateRowCount(this.rowCount);
-},modelBeginUpdate:function(){
-this.beginUpdate();
-},modelEndUpdate:function(){
-this.endUpdate();
-},modelRowChange:function(_5,_6){
-this.updateRow(_6);
-},modelDatumChange:function(_7,_8,_9){
-this.updateRow(_8);
-},modelFieldsChange:function(){
-this.indexCellFields();
-this.render();
-},modelInsertion:function(_a){
-this.updateRowCount(this.model.getRowCount());
-},modelRemoval:function(_b){
-this.updateRowCount(this.model.getRowCount());
-},getCellName:function(_c){
-var v=this.model.fields.values,i=_c.fieldIndex;
-return i>=0&&i<v.length&&v[i].name||this.inherited(arguments);
-},indexCellFields:function(){
-var _f=this.layout.cells;
-for(var i=0,c;_f&&(c=_f[i]);i++){
-if(dojo.isString(c.field)){
-c.fieldIndex=this.model.fields.indexOf(c.field);
-}
-}
-},refresh:function(){
-this.edit.cancel();
-this.model.measure();
-},canSort:function(_12){
-var f=this.getSortField(_12);
-return f&&this.model.canSort(f);
-},getSortField:function(_14){
-var c=this.getCell(this.getSortIndex(_14));
-return (c.fieldIndex+1)*(this.sortInfo>0?1:-1);
-},sort:function(){
-this.edit.apply();
-this.model.sort(this.getSortField());
-},addRow:function(_16,_17){
-this.edit.apply();
-var i=_17||-1;
-if(i<0){
-i=this.selection.getFirstSelected()||0;
-}
-if(i<0){
-i=0;
-}
-this.model.insert(_16,i);
-this.model.beginModifyRow(i);
-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();
-}
-},canEdit:function(_1c,_1d){
-return (this.model.canModify?this.model.canModify(_1d):true);
-},doStartEdit:function(_1e,_1f){
-this.model.beginModifyRow(_1f);
-this.onStartEdit(_1e,_1f);
-},doApplyCellEdit:function(_20,_21,_22){
-this.model.setDatum(_20,_21,_22);
-this.onApplyCellEdit(_20,_21,_22);
-},doCancelEdit:function(_23){
-this.model.cancelModifyRow(_23);
-this.onCancelEdit.apply(this,arguments);
-},doApplyEdit:function(_24){
-this.model.endModifyRow(_24);
-this.onApplyEdit(_24);
-},styleRowState:function(_25){
-if(this.model.getState){
-var _26=this.model.getState(_25.index),c="";
-for(var i=0,ss=["inflight","error","inserting"],s;s=ss[i];i++){
-if(_26[s]){
-c=" dojoxGrid-row-"+s;
-break;
-}
-}
-_25.customClasses+=c;
-}
-},onStyleRow:function(_2b){
-this.styleRowState(_2b);
-this.inherited(arguments);
-}});
-dojox.Grid.markupFactory=function(_2c,_2d,_2e){
-var d=dojo;
-var _30=function(n){
-var w=d.attr(n,"width")||"auto";
-if((w!="auto")&&(w.substr(-2)!="em")){
-w=parseInt(w)+"px";
-}
-return w;
-};
-if(!_2c.model&&d.hasAttr(_2d,"store")){
-var _33=_2d.cloneNode(false);
-d.attr(_33,{"jsId":null,"dojoType":d.attr(_2d,"dataModelClass")||"dojox.grid.data.DojoData"});
-_2c.model=d.parser.instantiate([_33])[0];
-}
-if(!_2c.structure&&_2d.nodeName.toLowerCase()=="table"){
-_2c.structure=d.query("> colgroup",_2d).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=_30(cg);
-}
-return v;
-});
-if(!_2c.structure.length){
-_2c.structure.push({__span:Infinity,cells:[]});
-}
-d.query("thead > tr",_2d).forEach(function(tr,_38){
-var _39=0;
-var _3a=0;
-var _3b;
-var _3c=null;
-d.query("> th",tr).map(function(th){
-if(!_3c){
-_3b=0;
-_3c=_2c.structure[0];
-}else{
-if(_39>=(_3b+_3c.__span)){
-_3a++;
-_3b+=_3c.__span;
-var _3e=_3c;
-_3c=_2c.structure[_3a];
-}
-}
-var _3f={name:d.trim(d.attr(th,"name")||th.innerHTML),field:d.trim(d.attr(th,"field")||""),colSpan:parseInt(d.attr(th,"colspan")||1)};
-_39+=_3f.colSpan;
-_3f.field=_3f.field||_3f.name;
-_3f.width=_30(th);
-if(!_3c.cells[_38]){
-_3c.cells[_38]=[];
-}
-_3c.cells[_38].push(_3f);
-});
-});
-}
-return new dojox.Grid(_2c,_2d);
-};
-dojox.grid.Grid=dojox.Grid;
-}
diff --git a/dojox/grid/compat/README b/dojox/grid/compat/README
deleted file mode 100644
index f9dade3..0000000
--- a/dojox/grid/compat/README
+++ /dev/null
@@ -1,39 +0,0 @@
--------------------------------------------------------------------------------
-dojox.grid
--------------------------------------------------------------------------------
-Version 1.00
-Release date: 10/04/2007
--------------------------------------------------------------------------------
-Project state:
-beta
--------------------------------------------------------------------------------
-Credits
-	Scott J. Miles (sjmiles at activegrid.com)
-	Steve Orvell (sorvell at activegrid.com)
--------------------------------------------------------------------------------
-Project description
-
-TurboGrid has been made available in Dojo and is now the dojox.grid!
-
--------------------------------------------------------------------------------
-Dependencies:
-
-Dojo Core
-Dijit Templated Widget
--------------------------------------------------------------------------------
-Documentation
-
-None available for this version yet.
-
-See http://www.turboajax.com/products/turbogrid/ for legacy documentation.
--------------------------------------------------------------------------------
-Installation instructions
-
-Grab the following from the Dojo SVN Repository:
-http://svn.dojotoolkit.org/var/src/dojo/dojox/trunk/grid/*
-
-Install into the following directory structure:
-/dojox/grid/
-
-...which should be at the same level as your Dojo checkout.
--------------------------------------------------------------------------------
diff --git a/dojox/grid/compat/VirtualGrid.js b/dojox/grid/compat/VirtualGrid.js
deleted file mode 100644
index 47daf47..0000000
--- a/dojox/grid/compat/VirtualGrid.js
+++ /dev/null
@@ -1,408 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat.VirtualGrid"]){
-dojo._hasResource["dojox.grid.compat.VirtualGrid"]=true;
-dojo.provide("dojox.grid.compat.VirtualGrid");
-dojo.require("dojox.grid.compat._grid.lib");
-dojo.require("dojox.grid.compat._grid.scroller");
-dojo.require("dojox.grid.compat._grid.view");
-dojo.require("dojox.grid.compat._grid.views");
-dojo.require("dojox.grid.compat._grid.layout");
-dojo.require("dojox.grid.compat._grid.rows");
-dojo.require("dojox.grid.compat._grid.focus");
-dojo.require("dojox.grid.compat._grid.selection");
-dojo.require("dojox.grid.compat._grid.edit");
-dojo.require("dojox.grid.compat._grid.rowbar");
-dojo.require("dojox.grid.compat._grid.publicEvents");
-dojo.declare("dojox.VirtualGrid",[dijit._Widget,dijit._Templated],{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:"dojoxGrid",get:function(_1){
-},rowCount:5,keepRows:75,rowsPerPage:25,autoWidth:false,autoHeight:false,autoRender:true,defaultHeight:"15em",structure:"",elasticView:-1,singleClickEdit:false,_click:null,sortInfo:0,themeable:true,buildRendering:function(){
-this.inherited(arguments);
-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(){
-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(){
-this.rows=new dojox.grid.rows(this);
-this.focus=new dojox.grid.focus(this);
-this.selection=new dojox.grid.selection(this);
-this.edit=new dojox.grid.edit(this);
-},createScroller:function(){
-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(){
-this.layout=new dojox.grid.layout(this);
-},createViews:function(){
-this.views=new dojox.grid.views(this);
-this.views.createView=dojo.hitch(this,"createView");
-},createView:function(_3){
-if(dojo.isAIR){
-var _4=window;
-var _5=_3.split(".");
-for(var i=0;i<_5.length;i++){
-if(typeof _4[_5[i]]=="undefined"){
-var _7=_5[0];
-for(var j=1;j<=i;j++){
-_7+="."+_5[j];
-}
-throw new Error(_7+" is undefined");
-}
-_4=_4[_5[i]];
-}
-var c=_4;
-}else{
-var c=eval(_3);
-}
-var _a=new c({grid:this});
-this.viewsNode.appendChild(_a.domNode);
-this.viewsHeaderNode.appendChild(_a.headerNode);
-this.views.addView(_a);
-return _a;
-},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(_d){
-this.views.destroyViews();
-this.structure=_d;
-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;
-},resize:function(_e){
-this._sizeBox=_e;
-this._resize();
-this.sizeChange();
-},_getPadBorder:function(){
-this._padBorder=this._padBorder||dojo._getPadBorderExtents(this.domNode);
-return this._padBorder;
-},_resize:function(){
-if(!this.domNode.parentNode||this.domNode.parentNode.nodeType!=1||!this.hasLayout()){
-return;
-}
-var _f=this._getPadBorder();
-if(this.autoHeight){
-this.domNode.style.height="auto";
-this.viewsNode.style.height="";
-}else{
-if(this.flex>0){
-}else{
-if(this.domNode.clientHeight<=_f.h){
-if(this.domNode.parentNode==document.body){
-this.domNode.style.height=this.defaultHeight;
-}else{
-this.fitTo="parent";
-}
-}
-}
-}
-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){
-this.viewsHeaderNode.style.display="none";
-}else{
-this.viewsHeaderNode.style.display="block";
-}
-this.adaptWidth();
-this.adaptHeight();
-this.scroller.defaultRowHeight=this.rows.getDefaultHeightPx()+1;
-this.postresize();
-},adaptWidth:function(){
-var w=this.autoWidth?0:this.domNode.clientWidth||(this.domNode.offsetWidth-this._getPadBorder().w);
-var vw=this.views.arrange(1,w);
-this.views.onEach("adaptWidth");
-if(this.autoWidth){
-this.domNode.style.width=vw+"px";
-}
-},adaptHeight:function(){
-var vns=this.viewsHeaderNode.style,t=vns.display=="none"?0:this.views.measureHeader();
-vns.height=t+"px";
-this.views.normalizeHeaderNodeHeight();
-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:function(){
-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(){
-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();
-dojo.setSelectable(this.domNode,false);
-},postresize:function(){
-if(this.autoHeight){
-this.viewsNode.style.height=this.views.measureContent()+"px";
-}
-},renderRow:function(_16,_17){
-this.views.renderRow(_16,_17);
-},rowRemoved:function(_18){
-this.views.rowRemoved(_18);
-},invalidated:null,updating:false,beginUpdate:function(){
-if(this.invalidated==null){
-this.invalidated={rows:[],count:1,all:false,rowCount:undefined};
-}else{
-this.invalidated.count++;
-}
-this.updating=true;
-},endUpdate:function(){
-var i=this.invalidated;
-if(--i.count===0){
-this.updating=false;
-if(i.rows.length>0){
-for(var r in i.rows){
-this.updateRow(Number(r));
-}
-this.invalidated.rows=[];
-}
-if(i.rowCount!=undefined){
-this.updateRowCount(i.rowCount);
-i.rowCount=undefined;
-}
-if(i.all){
-this.update();
-i.all=false;
-}
-}
-},defaultUpdate:function(){
-if(!this.domNode){
-return;
-}
-if(this.updating){
-this.invalidated.all=true;
-return;
-}
-this.prerender();
-this.scroller.invalidateNodes();
-this.setScrollTop(this.scrollTop);
-this.postrender();
-},update:function(){
-this.render();
-},updateRow:function(_1b){
-_1b=Number(_1b);
-if(this.updating){
-this.invalidated.rows[_1b]=true;
-}else{
-this.views.updateRow(_1b,this.rows.getHeight(_1b));
-this.scroller.rowHeightChanged(_1b);
-}
-},updateRowCount:function(_1c){
-if(this.updating){
-this.invalidated.rowCount=_1c;
-}else{
-this.rowCount=_1c;
-if(this.layout.cells.length){
-this.scroller.updateRowCount(_1c);
-this.setScrollTop(this.scrollTop);
-}
-this._resize();
-}
-},updateRowStyles:function(_1d){
-this.views.updateRowStyles(_1d);
-},rowHeightChanged:function(_1e){
-this.views.renormalizeRow(_1e);
-this.scroller.rowHeightChanged(_1e);
-},fastScroll:true,delayScroll:false,scrollRedrawThreshold:(dojo.isIE?100:50),scrollTo:function(_1f){
-if(!this.fastScroll){
-this.setScrollTop(_1f);
-return;
-}
-var _20=Math.abs(this.lastScrollTop-_1f);
-this.lastScrollTop=_1f;
-if(_20>this.scrollRedrawThreshold||this.delayScroll){
-this.delayScroll=true;
-this.scrollTop=_1f;
-this.views.setScrollTop(_1f);
-dojox.grid.jobs.job("dojoxGrid-scroll",200,dojo.hitch(this,"finishScrollJob"));
-}else{
-this.setScrollTop(_1f);
-}
-},finishScrollJob:function(){
-this.delayScroll=false;
-this.setScrollTop(this.scrollTop);
-},setScrollTop:function(_21){
-this.scrollTop=this.views.setScrollTop(_21);
-this.scroller.scroll(this.scrollTop);
-},scrollToRow:function(_22){
-this.setScrollTop(this.scroller.findScrollTop(_22)+1);
-},styleRowNode:function(_23,_24){
-if(_24){
-this.rows.styleRowNode(_23,_24);
-}
-},getCell:function(_25){
-return this.layout.cells[_25];
-},setCellWidth:function(_26,_27){
-this.getCell(_26).unitWidth=_27;
-},getCellName:function(_28){
-return "Cell "+_28.index;
-},canSort:function(_29){
-},sort:function(){
-},getSortAsc:function(_2a){
-_2a=_2a==undefined?this.sortInfo:_2a;
-return Boolean(_2a>0);
-},getSortIndex:function(_2b){
-_2b=_2b==undefined?this.sortInfo:_2b;
-return Math.abs(_2b)-1;
-},setSortIndex:function(_2c,_2d){
-var si=_2c+1;
-if(_2d!=undefined){
-si*=(_2d?1:-1);
-}else{
-if(this.getSortIndex()==_2c){
-si=-this.sortInfo;
-}
-}
-this.setSortInfo(si);
-},setSortInfo:function(_2f){
-if(this.canSort(_2f)){
-this.sortInfo=_2f;
-this.sort();
-this.update();
-}
-},doKeyEvent:function(e){
-e.dispatch="do"+e.type;
-this.onKeyEvent(e);
-},_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);
-}
-},doStartEdit:function(_3d,_3e){
-this.onStartEdit(_3d,_3e);
-},doApplyCellEdit:function(_3f,_40,_41){
-this.onApplyCellEdit(_3f,_40,_41);
-},doCancelEdit:function(_42){
-this.onCancelEdit(_42);
-},doApplyEdit:function(_43){
-this.onApplyEdit(_43);
-},addRow:function(){
-this.updateRowCount(this.rowCount+1);
-},removeSelectedRows:function(){
-this.updateRowCount(Math.max(0,this.rowCount-this.selection.getSelected().length));
-this.selection.clear();
-}});
-dojo.mixin(dojox.VirtualGrid.prototype,dojox.grid.publicEvents);
-}
diff --git a/dojox/grid/compat/_data/dijitEditors.js b/dojox/grid/compat/_data/dijitEditors.js
deleted file mode 100644
index e209114..0000000
--- a/dojox/grid/compat/_data/dijitEditors.js
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat._data.dijitEditors"]){
-dojo._hasResource["dojox.grid.compat._data.dijitEditors"]=true;
-dojo.provide("dojox.grid.compat._data.dijitEditors");
-dojo.require("dojox.grid.compat._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(_1){
-this.editor=null;
-this.editorClass=dojo.getObject(this.cell.editorClass||this.editorClass);
-},format:function(_2,_3){
-this.needFormatNode(_2,_3);
-return "<div></div>";
-},getValue:function(_4){
-return this.editor.getValue();
-},setValue:function(_5,_6){
-if(this.editor&&this.editor.setValue){
-if(this.editor.onLoadDeferred){
-var _7=this;
-this.editor.onLoadDeferred.addCallback(function(){
-_7.editor.setValue(_6==null?"":_6);
-});
-}else{
-this.editor.setValue(_6);
-}
-}else{
-this.inherited(arguments);
-}
-},getEditorProps:function(_8){
-return dojo.mixin({},this.cell.editorProps||{},{constraints:dojo.mixin({},this.cell.constraint)||{},value:_8});
-},createEditor:function(_9,_a,_b){
-return new this.editorClass(this.getEditorProps(_a),_9);
-},attachEditor:function(_c,_d,_e){
-_c.appendChild(this.editor.domNode);
-this.setValue(_e,_d);
-},formatNode:function(_f,_10,_11){
-if(!this.editorClass){
-return _10;
-}
-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(_11);
-this.focus();
-},sizeEditor:function(_12,_13,_14){
-var p=this.cell.getNode(_14),box=dojo.contentBox(p);
-dojo.marginBox(this.editor.domNode,{w:box.w});
-},focus:function(_17,_18){
-if(this.editor){
-setTimeout(dojo.hitch(this.editor,function(){
-dojox.grid.fire(this,"focus");
-}),0);
-}
-},_finish:function(_19){
-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(_1a){
-var _1b=[];
-dojo.forEach(this.cell.options,function(o){
-_1b.push({name:o,value:o});
-});
-var _1d=new dojo.data.ItemFileReadStore({data:{identifier:"name",items:_1b}});
-return dojo.mixin({},this.cell.editorProps||{},{value:_1a,store:_1d});
-},getValue:function(){
-var e=this.editor;
-e.setDisplayedValue(e.getDisplayedValue());
-return e.getValue();
-}});
-dojo.declare("dojox.grid.editors.DateTextBox",dojox.grid.editors.Dijit,{editorClass:"dijit.form.DateTextBox",setValue:function(_1f,_20){
-if(this.editor){
-this.editor.setValue(new Date(_20));
-}else{
-this.inherited(arguments);
-}
-},getEditorProps:function(_21){
-return dojo.mixin(this.inherited(arguments),{value:new Date(_21)});
-}});
-dojo.declare("dojox.grid.editors.CheckBox",dojox.grid.editors.Dijit,{editorClass:"dijit.form.CheckBox",getValue:function(){
-return this.editor.checked;
-},setValue:function(_22,_23){
-if(this.editor&&this.editor.setAttribute){
-this.editor.setAttribute("checked",_23);
-}else{
-this.inherited(arguments);
-}
-},sizeEditor:function(_24,_25,_26){
-return;
-}});
-dojo.declare("dojox.grid.editors.Editor",dojox.grid.editors.Dijit,{editorClass:"dijit.Editor",getEditorProps:function(_27){
-return dojo.mixin({},this.cell.editorProps||{},{height:this.cell.editorHeight||"100px"});
-},createEditor:function(_28,_29,_2a){
-var _2b=new this.editorClass(this.getEditorProps(_29),_28);
-dojo.connect(_2b,"onLoad",dojo.hitch(this,"populateEditor"));
-return _2b;
-},formatNode:function(_2c,_2d,_2e){
-this.content=_2d;
-this.inherited(arguments);
-if(dojo.isMoz){
-var e=this.editor;
-e.open();
-if(this.cell.editorToolbar){
-dojo.place(e.toolbar.domNode,e.editingArea,"before");
-}
-}
-},populateEditor:function(){
-this.editor.setValue(this.content);
-this.editor.placeCursorAtEnd();
-}});
-}
diff --git a/dojox/grid/compat/_data/editors.js b/dojox/grid/compat/_data/editors.js
deleted file mode 100644
index 8ebe268..0000000
--- a/dojox/grid/compat/_data/editors.js
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat._data.editors"]){
-dojo._hasResource["dojox.grid.compat._data.editors"]=true;
-dojo.provide("dojox.grid.compat._data.editors");
-dojo.provide("dojox.grid.compat.editors");
-dojo.declare("dojox.grid.editors.Base",null,{constructor:function(_1){
-this.cell=_1;
-},_valueProp:"value",_formatPending:false,format:function(_2,_3){
-},needFormatNode:function(_4,_5){
-this._formatPending=true;
-dojox.grid.whenIdle(this,"_formatNode",_4,_5);
-},cancelFormatNode:function(){
-this._formatPending=false;
-},_formatNode:function(_6,_7){
-if(this._formatPending){
-this._formatPending=false;
-dojo.setSelectable(this.cell.grid.domNode,true);
-this.formatNode(this.getNode(_7),_6,_7);
-}
-},getNode:function(_8){
-return (this.cell.getNode(_8)||0).firstChild||0;
-},formatNode:function(_9,_a,_b){
-if(dojo.isIE){
-dojox.grid.whenIdle(this,"focus",_b,_9);
-}else{
-this.focus(_b,_9);
-}
-},dispatchEvent:function(m,e){
-if(m in this){
-return this[m](e);
-}
-},getValue:function(_e){
-return this.getNode(_e)[this._valueProp];
-},setValue:function(_f,_10){
-var n=this.getNode(_f);
-if(n){
-n[this._valueProp]=_10;
-}
-},focus:function(_12,_13){
-dojox.grid.focusSelectNode(_13||this.getNode(_12));
-},save:function(_14){
-this.value=this.value||this.getValue(_14);
-},restore:function(_15){
-this.setValue(_15,this.value);
-},_finish:function(_16){
-dojo.setSelectable(this.cell.grid.domNode,false);
-this.cancelFormatNode(this.cell);
-},apply:function(_17){
-this.cell.applyEdit(this.getValue(_17),_17);
-this._finish(_17);
-},cancel:function(_18){
-this.cell.cancelEdit(_18);
-this._finish(_18);
-}});
-dojox.grid.editors.base=dojox.grid.editors.Base;
-dojo.declare("dojox.grid.editors.Input",dojox.grid.editors.Base,{constructor:function(_19){
-this.keyFilter=this.keyFilter||this.cell.keyFilter;
-},keyFilter:null,format:function(_1a,_1b){
-this.needFormatNode(_1a,_1b);
-return "<input class=\"dojoxGrid-input\" type=\"text\" value=\""+_1a+"\">";
-},formatNode:function(_1c,_1d,_1e){
-this.inherited(arguments);
-this.cell.registerOnBlur(_1c,_1e);
-},doKey:function(e){
-if(this.keyFilter){
-var key=String.fromCharCode(e.charCode);
-if(key.search(this.keyFilter)==-1){
-dojo.stopEvent(e);
-}
-}
-},_finish:function(_21){
-this.inherited(arguments);
-var n=this.getNode(_21);
-try{
-dojox.grid.fire(n,"blur");
-}
-catch(e){
-}
-}});
-dojox.grid.editors.input=dojox.grid.editors.Input;
-dojo.declare("dojox.grid.editors.Select",dojox.grid.editors.Input,{constructor:function(_23){
-this.options=this.options||this.cell.options;
-this.values=this.values||this.cell.values||this.options;
-},format:function(_24,_25){
-this.needFormatNode(_24,_25);
-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",(_24==v?" selected":"")," value=\""+v+"\"",">",o,"</option>");
-}
-h.push("</select>");
-return h.join("");
-},getValue:function(_2a){
-var n=this.getNode(_2a);
-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;
-dojo.declare("dojox.grid.editors.AlwaysOn",dojox.grid.editors.Input,{alwaysOn:true,_formatNode:function(_2e,_2f){
-this.formatNode(this.getNode(_2f),_2e,_2f);
-},applyStaticValue:function(_30){
-var e=this.cell.grid.edit;
-e.applyCellEdit(this.getValue(_30),this.cell,_30);
-e.start(this.cell,_30,true);
-}});
-dojox.grid.editors.alwaysOn=dojox.grid.editors.AlwaysOn;
-dojo.declare("dojox.grid.editors.Bool",dojox.grid.editors.AlwaysOn,{_valueProp:"checked",format:function(_32,_33){
-return "<input class=\"dojoxGrid-input\" type=\"checkbox\""+(_32?" 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;
-}
diff --git a/dojox/grid/compat/_data/fields.js b/dojox/grid/compat/_data/fields.js
deleted file mode 100644
index cc17b26..0000000
--- a/dojox/grid/compat/_data/fields.js
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat._data.fields"]){
-dojo._hasResource["dojox.grid.compat._data.fields"]=true;
-dojo.provide("dojox.grid.compat._data.fields");
-dojo.declare("dojox.grid.data.Mixer",null,{constructor:function(){
-this.defaultValue={};
-this.values=[];
-},count:function(){
-return this.values.length;
-},clear:function(){
-this.values=[];
-},build:function(_1){
-var _2=dojo.mixin({owner:this},this.defaultValue);
-_2.key=_1;
-this.values[_1]=_2;
-return _2;
-},getDefault:function(){
-return this.defaultValue;
-},setDefault:function(_3){
-for(var i=0,a;(a=arguments[i]);i++){
-dojo.mixin(this.defaultValue,a);
-}
-},get:function(_6){
-return this.values[_6]||this.build(_6);
-},_set:function(_7,_8){
-var v=this.get(_7);
-for(var i=1;i<arguments.length;i++){
-dojo.mixin(v,arguments[i]);
-}
-this.values[_7]=v;
-},set:function(){
-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(_e,_f){
-if(_e>=this.values.length){
-this.values[_e]=_f;
-}else{
-this.values.splice(_e,0,_f);
-}
-},remove:function(_10){
-this.values.splice(_10,1);
-},swap:function(_11,_12){
-dojox.grid.arraySwap(this.values,_11,_12);
-},move:function(_13,_14){
-dojox.grid.arrayMove(this.values,_13,_14);
-}});
-dojox.grid.data.compare=function(a,b){
-return (a>b?1:(a==b?0:-1));
-};
-dojo.declare("dojox.grid.data.Field",null,{constructor:function(_17){
-this.name=_17;
-this.compare=dojox.grid.data.compare;
-},na:dojox.grid.na});
-dojo.declare("dojox.grid.data.Fields",dojox.grid.data.Mixer,{constructor:function(_18){
-var _19=_18?_18:dojox.grid.data.Field;
-this.defaultValue=new _19();
-},indexOf:function(_1a){
-for(var i=0;i<this.values.length;i++){
-var v=this.values[i];
-if(v&&v.key==_1a){
-return i;
-}
-}
-return -1;
-}});
-}
diff --git a/dojox/grid/compat/_data/model.js b/dojox/grid/compat/_data/model.js
deleted file mode 100644
index 88217c1..0000000
--- a/dojox/grid/compat/_data/model.js
+++ /dev/null
@@ -1,490 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat._data.model"]){
-dojo._hasResource["dojox.grid.compat._data.model"]=true;
-dojo.provide("dojox.grid.compat._data.model");
-dojo.require("dojox.grid.compat._data.fields");
-dojo.declare("dojox.grid.data.Model",null,{constructor:function(_1,_2){
-this.observers=[];
-this.fields=new dojox.grid.data.Fields();
-if(_1){
-this.fields.set(_1);
-}
-this.setData(_2);
-},count:0,updating:0,observer:function(_3,_4){
-this.observers.push({o:_3,p:_4||"model"});
-},notObserver:function(_5){
-for(var i=0,m,o;(o=this.observers[i]);i++){
-if(o.o==_5){
-this.observers.splice(i,1);
-return;
-}
-}
-},notify:function(_9,_a){
-var a=_a||[];
-for(var i=0,m,o;(o=this.observers[i]);i++){
-m=o.p+_9;
-o=o.o;
-(m in o)&&(o[m].apply(o,a));
-}
-},clear:function(){
-this.fields.clear();
-this.clearData();
-},beginUpdate:function(){
-this.notify("BeginUpdate",arguments);
-},endUpdate:function(){
-this.notify("EndUpdate",arguments);
-},clearData:function(){
-this.setData(null);
-},change:function(){
-this.notify("Change",arguments);
-},insertion:function(){
-this.notify("Insertion",arguments);
-this.notify("Change",arguments);
-},removal:function(){
-this.notify("Removal",arguments);
-this.notify("Change",arguments);
-},insert:function(_f){
-if(!this._insert.apply(this,arguments)){
-return false;
-}
-this.insertion.apply(this,dojo._toArray(arguments,1));
-return true;
-},remove:function(_10){
-if(!this._remove.apply(this,arguments)){
-return false;
-}
-this.removal.apply(this,arguments);
-return true;
-},canSort:function(){
-return this.sort!=null;
-},generateComparator:function(_11,_12,_13,_14){
-return function(a,b){
-var _17=_11(a[_12],b[_12]);
-return _17?(_13?_17:-_17):_14&&_14(a,b);
-};
-},makeComparator:function(_18){
-var idx,col,_1b,_1c=null;
-for(var i=_18.length-1;i>=0;i--){
-idx=_18[i];
-col=Math.abs(idx)-1;
-if(col>=0){
-_1b=this.fields.get(col);
-_1c=this.generateComparator(_1b.compare,_1b.key,idx>0,_1c);
-}
-}
-return _1c;
-},sort:null,dummy:0});
-dojo.declare("dojox.grid.data.Rows",dojox.grid.data.Model,{allChange:function(){
-this.notify("AllChange",arguments);
-this.notify("Change",arguments);
-},rowChange:function(){
-this.notify("RowChange",arguments);
-},datumChange:function(){
-this.notify("DatumChange",arguments);
-},beginModifyRow:function(_1e){
-if(!this.cache[_1e]){
-this.cache[_1e]=this.copyRow(_1e);
-}
-},endModifyRow:function(_1f){
-var _20=this.cache[_1f];
-if(_20){
-var _21=this.getRow(_1f);
-if(!dojox.grid.arrayCompare(_20,_21)){
-this.update(_20,_21,_1f);
-}
-delete this.cache[_1f];
-}
-},cancelModifyRow:function(_22){
-var _23=this.cache[_22];
-if(_23){
-this.setRow(_23,_22);
-delete this.cache[_22];
-}
-}});
-dojo.declare("dojox.grid.data.Table",dojox.grid.data.Rows,{constructor:function(){
-this.cache=[];
-},colCount:0,data:null,cache:null,measure:function(){
-this.count=this.getRowCount();
-this.colCount=this.getColCount();
-this.allChange();
-},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(_24,_25){
-console.error("dojox.grid.data.Table: badIndex");
-},isGoodIndex:function(_26,_27){
-return (_26>=0&&_26<this.count&&(arguments.length<2||(_27>=0&&_27<this.colCount)));
-},getRow:function(_28){
-return this.data[_28];
-},copyRow:function(_29){
-return this.getRow(_29).slice(0);
-},getDatum:function(_2a,_2b){
-return this.data[_2a][_2b];
-},get:function(){
-throw ("Plain \"get\" no longer supported. Use \"getRow\" or \"getDatum\".");
-},setData:function(_2c){
-this.data=(_2c||[]);
-this.allChange();
-},setRow:function(_2d,_2e){
-this.data[_2e]=_2d;
-this.rowChange(_2d,_2e);
-this.change();
-},setDatum:function(_2f,_30,_31){
-this.data[_30][_31]=_2f;
-this.datumChange(_2f,_30,_31);
-},set:function(){
-throw ("Plain \"set\" no longer supported. Use \"setData\", \"setRow\", or \"setDatum\".");
-},setRows:function(_32,_33){
-for(var i=0,l=_32.length,r=_33;i<l;i++,r++){
-this.setRow(_32[i],r);
-}
-},update:function(_37,_38,_39){
-return true;
-},_insert:function(_3a,_3b){
-dojox.grid.arrayInsert(this.data,_3b,_3a);
-this.count++;
-return true;
-},_remove:function(_3c){
-for(var i=_3c.length-1;i>=0;i--){
-dojox.grid.arrayRemove(this.data,_3c[i]);
-}
-this.count-=_3c.length;
-return true;
-},sort:function(){
-this.data.sort(this.makeComparator(arguments));
-},swap:function(_3e,_3f){
-dojox.grid.arraySwap(this.data,_3e,_3f);
-this.rowChange(this.getRow(_3e),_3e);
-this.rowChange(this.getRow(_3f),_3f);
-this.change();
-},dummy:0});
-dojo.declare("dojox.grid.data.Objects",dojox.grid.data.Table,{constructor:function(_40,_41,_42){
-if(!_40){
-this.autoAssignFields();
-}
-},allChange:function(){
-this.notify("FieldsChange");
-this.inherited(arguments);
-},autoAssignFields:function(){
-var d=this.data[0],i=0,_45;
-for(var f in d){
-_45=this.fields.get(i++);
-if(!dojo.isString(_45.key)){
-_45.key=f;
-}
-}
-},setData:function(_47){
-this.data=(_47||[]);
-this.autoAssignFields();
-this.allChange();
-},getDatum:function(_48,_49){
-return this.data[_48][this.fields.get(_49).key];
-}});
-dojo.declare("dojox.grid.data.Dynamic",dojox.grid.data.Table,{constructor:function(){
-this.page=[];
-this.pages=[];
-},page:null,pages:null,rowsPerPage:100,requests:0,bop:-1,eop:-1,clearData:function(){
-this.pages=[];
-this.bop=this.eop=-1;
-this.setData([]);
-},getRowCount:function(){
-return this.count;
-},getColCount:function(){
-return this.fields.count();
-},setRowCount:function(_4a){
-this.count=_4a;
-this.change();
-},requestsPending:function(_4b){
-},rowToPage:function(_4c){
-return (this.rowsPerPage?Math.floor(_4c/this.rowsPerPage):_4c);
-},pageToRow:function(_4d){
-return (this.rowsPerPage?this.rowsPerPage*_4d:_4d);
-},requestRows:function(_4e,_4f){
-},rowsProvided:function(_50,_51){
-this.requests--;
-if(this.requests==0){
-this.requestsPending(false);
-}
-},requestPage:function(_52){
-var row=this.pageToRow(_52);
-var _54=Math.min(this.rowsPerPage,this.count-row);
-if(_54>0){
-this.requests++;
-this.requestsPending(true);
-setTimeout(dojo.hitch(this,"requestRows",row,_54),1);
-}
-},needPage:function(_55){
-if(!this.pages[_55]){
-this.pages[_55]=true;
-this.requestPage(_55);
-}
-},preparePage:function(_56,_57){
-if(_56<this.bop||_56>=this.eop){
-var _58=this.rowToPage(_56);
-this.needPage(_58);
-this.bop=_58*this.rowsPerPage;
-this.eop=this.bop+(this.rowsPerPage||this.count);
-}
-},isRowLoaded:function(_59){
-return Boolean(this.data[_59]);
-},removePages:function(_5a){
-for(var i=0,r;((r=_5a[i])!=undefined);i++){
-this.pages[this.rowToPage(r)]=false;
-}
-this.bop=this.eop=-1;
-},remove:function(_5d){
-this.removePages(_5d);
-dojox.grid.data.Table.prototype.remove.apply(this,arguments);
-},getRow:function(_5e){
-var row=this.data[_5e];
-if(!row){
-this.preparePage(_5e);
-}
-return row;
-},getDatum:function(_60,_61){
-var row=this.getRow(_60);
-return (row?row[_61]:this.fields.get(_61).na);
-},setDatum:function(_63,_64,_65){
-var row=this.getRow(_64);
-if(row){
-row[_65]=_63;
-this.datumChange(_63,_64,_65);
-}else{
-console.error("["+this.declaredClass+"] dojox.grid.data.dynamic.set: cannot set data on a non-loaded row");
-}
-},canSort:function(){
-return false;
-}});
-dojox.grid.data.table=dojox.grid.data.Table;
-dojox.grid.data.dynamic=dojox.grid.data.Dynamic;
-dojo.declare("dojox.grid.data.DojoData",dojox.grid.data.Dynamic,{constructor:function(_67,_68,_69){
-this.count=1;
-this._rowIdentities={};
-this._currentlyProcessing=[];
-if(_69){
-dojo.mixin(this,_69);
-}
-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(_6b,_6c){
-return new dojox.grid.data.DojoData(null,null,_6b);
-},query:{name:"*"},store:null,_currentlyProcessing:null,_canNotify:false,_canWrite:false,_canIdentify:false,_rowIdentities:{},clientSort:false,sortFields:null,queryOptions:null,setData:function(_6d){
-this.store=_6d;
-this.data=[];
-this.allChange();
-},setRowCount:function(_6e){
-this.count=_6e;
-this.allChange();
-},beginReturn:function(_6f){
-if(this.count!=_6f){
-this.setRowCount(_6f);
-}
-},_setupFields:function(_70){
-if(this.fields._nameMaps){
-return;
-}
-var m={};
-var _72=dojo.map(this.store.getAttributes(_70),function(_73,idx){
-m[_73]=idx;
-m[idx+".idx"]=_73;
-return {name:_73,key:_73};
-},this);
-this.fields._nameMaps=m;
-this.fields.set(_72);
-this.notify("FieldsChange");
-},_getRowFromItem:function(_75){
-},_createRow:function(_76){
-var row={};
-row.__dojo_data_item=_76;
-dojo.forEach(this.fields.values,function(a){
-var _79=this.store.getValue(_76,a.name);
-row[a.name]=(_79===undefined||_79===null)?"":_79;
-},this);
-return row;
-},processRows:function(_7a,_7b){
-if(!_7a||_7a.length==0){
-return;
-}
-this._setupFields(_7a[0]);
-dojo.forEach(_7a,function(_7c,idx){
-var row=this._createRow(_7c);
-this._setRowId(_7c,_7b.start,idx);
-this.setRow(row,_7b.start+idx);
-},this);
-this.endUpdate();
-},requestRows:function(_7f,_80){
-this.beginUpdate();
-var row=_7f||0;
-var _82={start:row,count:this.rowsPerPage,query:this.query,sort:this.sortFields,queryOptions:this.queryOptions,onBegin:dojo.hitch(this,"beginReturn"),onComplete:dojo.hitch(this,"processRows"),onError:dojo.hitch(this,"processError")};
-this.store.fetch(_82);
-},getDatum:function(_83,_84){
-var row=this.getRow(_83);
-var _86=this.fields.values[_84];
-return row&&_86?row[_86.name]:_86?_86.na:"?";
-},setDatum:function(_87,_88,_89){
-var n=this.fields._nameMaps[_89+".idx"];
-if(n){
-this.data[_88][n]=_87;
-this.datumChange(_87,_88,_89);
-}
-},copyRow:function(_8b){
-var row={};
-var _8d={};
-var src=this.getRow(_8b);
-for(var x in src){
-if(src[x]!=_8d[x]){
-row[x]=src[x];
-}
-}
-return row;
-},_attrCompare:function(_90,_91){
-dojo.forEach(this.fields.values,function(a){
-if(_90[a.name]!=_91[a.name]){
-return false;
-}
-},this);
-return true;
-},endModifyRow:function(_93){
-var _94=this.cache[_93];
-if(_94){
-var _95=this.getRow(_93);
-if(!this._attrCompare(_94,_95)){
-this.update(_94,_95,_93);
-}
-delete this.cache[_93];
-}
-},cancelModifyRow:function(_96){
-var _97=this.cache[_96];
-if(_97){
-this.setRow(_97,_96);
-delete this.cache[_96];
-}
-},_setRowId:function(_98,_99,idx){
-if(this._canIdentify){
-this._rowIdentities[this.store.getIdentity(_98)]={rowId:_99+idx,item:_98};
-}else{
-var _9b=dojo.toJson(this.query)+":start:"+_99+":idx:"+idx+":sort:"+dojo.toJson(this.sortFields);
-this._rowIdentities[_9b]={rowId:_99+idx,item:_98};
-}
-},_getRowId:function(_9c,_9d){
-var _9e=null;
-if(this._canIdentify&&!_9d){
-var _9f=this._rowIdentities[this.store.getIdentity(_9c)];
-if(_9f){
-_9e=_9f.rowId;
-}
-}else{
-var id;
-for(id in this._rowIdentities){
-if(this._rowIdentities[id].item===_9c){
-_9e=this._rowIdentities[id].rowId;
-break;
-}
-}
-}
-return _9e;
-},_storeDatumChange:function(_a1,_a2,_a3,_a4){
-var _a5=this._getRowId(_a1);
-var row=this.getRow(_a5);
-if(row){
-row[_a2]=_a4;
-var _a7=this.fields._nameMaps[_a2];
-this.notify("DatumChange",[_a4,_a5,_a7]);
-}
-},_storeDatumDelete:function(_a8){
-if(dojo.indexOf(this._currentlyProcessing,_a8)!=-1){
-return;
-}
-var _a9=this._getRowId(_a8,true);
-if(_a9!=null){
-this._removeItems([_a9]);
-}
-},_storeDatumNew:function(_aa){
-if(this._disableNew){
-return;
-}
-this._insertItem(_aa,this.data.length);
-},insert:function(_ab,_ac){
-this._disableNew=true;
-var i=this.store.newItem(_ab);
-this._disableNew=false;
-this._insertItem(i,_ac);
-},_insertItem:function(_ae,_af){
-if(!this.fields._nameMaps){
-this._setupFields(_ae);
-}
-var row=this._createRow(_ae);
-for(var i in this._rowIdentities){
-var _b2=this._rowIdentities[i];
-if(_b2.rowId>=_af){
-_b2.rowId++;
-}
-}
-this._setRowId(_ae,0,_af);
-dojox.grid.data.Dynamic.prototype.insert.apply(this,[row,_af]);
-},datumChange:function(_b3,_b4,_b5){
-if(this._canWrite){
-var row=this.getRow(_b4);
-var _b7=this.fields._nameMaps[_b5+".idx"];
-this.store.setValue(row.__dojo_data_item,_b7,_b3);
-}else{
-this.notify("DatumChange",arguments);
-}
-},insertion:function(){
-this.notify("Insertion",arguments);
-this.notify("Change",arguments);
-},removal:function(){
-this.notify("Removal",arguments);
-this.notify("Change",arguments);
-},remove:function(_b8){
-for(var i=_b8.length-1;i>=0;i--){
-var _ba=this.data[_b8[i]].__dojo_data_item;
-this._currentlyProcessing.push(_ba);
-this.store.deleteItem(_ba);
-}
-this._removeItems(_b8);
-this._currentlyProcessing=[];
-},_removeItems:function(_bb){
-dojox.grid.data.Dynamic.prototype.remove.apply(this,arguments);
-this._rowIdentities={};
-for(var i=0;i<this.data.length;i++){
-this._setRowId(this.data[i].__dojo_data_item,0,i);
-}
-},canSort:function(){
-return true;
-},sort:function(_bd){
-var col=Math.abs(_bd)-1;
-this.sortFields=[{"attribute":this.fields.values[col].name,"descending":(_bd>0)}];
-this.refresh();
-},refresh:function(){
-this.clearData(true);
-this.requestRows();
-},clearData:function(_bf){
-this._rowIdentities={};
-this.pages=[];
-this.bop=this.eop=-1;
-this.count=0;
-this.setData((_bf?this.store:[]));
-},processError:function(_c0,_c1){
-
-}});
-}
diff --git a/dojox/grid/compat/_grid/Grid.css b/dojox/grid/compat/_grid/Grid.css
deleted file mode 100644
index 655be54..0000000
--- a/dojox/grid/compat/_grid/Grid.css
+++ /dev/null
@@ -1,201 +0,0 @@
-.dojoxGrid {
-	position: relative;
-	background-color: #EBEADB;
-	font-family: Geneva, Arial, Helvetica, sans-serif;
-	-moz-outline-style: none;
-	outline: none;
-	overflow: hidden;
-	height: 0;
-}
-.dojoxGrid table {
-	padding: 0;
-}
-.dojoxGrid td {
-	-moz-outline: none;
-}
-.dojoxGrid-master-header {
-	position: relative;
-}
-.dojoxGrid-master-view  {
-	position: relative;
-}
-.dojoxGrid-view {
-	position: absolute;
-	overflow: hidden;
-}
-.dojoxGrid-header {
-	position: absolute;
-	overflow: hidden;
-}
-.dojoxGrid-header {
-	background-color: #E8E1CF;
-}
-.dojoxGrid-header table {
-	text-align: center;
-}
-.dojoxGrid-header .dojoxGrid-cell-content {
-	text-align: center;
-}
-.dojoxGrid-header .dojoxGrid-cell { 
-	border: 1px solid;
-	border-color: #F6F4EB #ACA899 #ACA899 #F6F4EB;
-	background: url(images/grid_dx_gradient.gif) #E8E1CF top repeat-x;
-	padding-bottom: 2px;
-}
-.dojoxGrid-header .dojoxGrid-cell-over {
-	background-image: none;
-	background-color: white;
-	border-bottom-color: #FEBE47;
-	margin-bottom: 0;
-	padding-bottom: 0;
-	border-bottom-width: 3px;
-}
-.dojoxGrid-sort-down {
-	background: url(images/grid_sort_down.gif) left no-repeat; 
-	padding-left:16px;
-	margin-left:4px;
-}
-.dojoxGrid-sort-up {
-	background: url(images/grid_sort_up.gif) left no-repeat; 
-	padding-left:16px;
-	margin-left:4px;
-}
-.dojoxGrid-scrollbox {
-	position: relative;
-	overflow: scroll;
-	background-color: white;
-	width: 100%;
-}
-.dojoxGrid-content {
-	position: relative;
-	overflow: hidden;
-	 -moz-outline-style: none;
-	outline: none;
-}
-.dojoxGrid-rowbar { 
-	border: 1px solid;
-	border-color: #F6F4EB #ACA899 #ACA899 #F6F4EB;
-	border-top: none;
-	background: url(images/grid_dx_gradient.gif) #E8E1CF top repeat-x;
-}
-.dojoxGrid-rowbar-inner {
-	border-top: 1px solid #F6F4EB;
-}
-.dojoxGrid-rowbar-over {
-	background-image: none;
-	background-color: white;
-	border-top-color: #FEBE47;
-	border-bottom-color: #FEBE47;
-}
-.dojoxGrid-rowbar-selected {
-	background-color: #D9E8F9;
-	background-image: none;
-	
-	background-position: center;
-	background-repeat: no-repeat;
-}
-.dojoxGrid-row {
-	position: relative;
-	width: 9000em;
-}
-.dojoxGrid-row {
-	
-	border: 1px solid #E8E4D8;
-	border-color: #F8F7F1;
-	
-	border-left: none;
-	border-right: none;
-	background-color: white;
-	border-top: none;
-}
-.dojoxGrid-row-over {
-	border-top-color: #FEBE47;
-	border-bottom-color: #FEBE47;
-	
-	
-	
-}
-.dojoxGrid-row-odd {
-	background-color: #FFFDF3;
-	
-}
-.dojoxGrid-row-selected {
-	background-color: #D9E8F9;
-}
-.dojoxGrid-row-table {
-	table-layout: fixed;
-	width: 0;
-}
-.dojoxGrid-invisible {
-	visibility: hidden;
-}		
-.Xdojo-ie .dojoxGrid-invisible {
-	display: none;
-}		
-.dojoxGrid-invisible td, .dojoxGrid-header .dojoxGrid-invisible td {
-	border-top-width: 0;
-	border-bottom-width: 0;
-	padding-top: 0;
-	padding-bottom: 0;
-	height: 0;
-	overflow: hidden;
-}
-.dojoxGrid-cell {
-	border: 1px solid;
-	border-color: #EBEADB;
-	border-right-color: #D5CDB5;
-	padding: 3px 3px 3px 3px;
-	text-align: left;
-	overflow: hidden;
-}
-.dojoxGrid-cell-focus {
-	border: 1px dashed blue;
-}
-.dojoxGrid-cell-over {
-	border: 1px dotted #FEBE47;
-}
-.dojoxGrid-cell-focus.dojoxGrid-cell-over {
-	border: 1px dotted green;
-}
-.dojoxGrid-cell-clip {
-	width: 100%;
-	overflow: hidden;
-	white-space:nowrap;
-	text-overflow: ellipsis;
-}
-.dojoxGrid-row-editing td {
-	background-color: #F4FFF4;
-}
-.dojoxGrid-row-inserting td {
-	background-color: #F4FFF4;
-}
-.dojoxGrid-row-inflight td {
-	background-color: #F2F7B7;
-}
-.dojoxGrid-row-error td {
-	background-color: #F8B8B6;
-}
-.dojoxGrid-input, .dojoxGrid-select, .dojoxGrid-textarea {
-	margin: 0;
-	padding: 0;
-	border-style: none;
-	width: 100%;
-	font-size: 100%;
-	font-family: inherit;
-}
-.dojoxGrid-hidden-focus {
-	position: absolute;
-	left: -1000px;
-	top: -1000px;
-	height: 0px, width: 0px;
-}
-.gridArrowButtonChar {
-	display:none !important;
-}
-.dijit_a11y .gridArrowButtonChar {
-	display:inline !important;
-}
-.dijit_a11y .dojoxGrid-sort-down, .dijit_a11y .dojoxGrid-sort-up {
-	margin-left: 0;
-	padding-left: 0;
-}
diff --git a/dojox/grid/compat/_grid/Grid_rtl.css b/dojox/grid/compat/_grid/Grid_rtl.css
deleted file mode 100644
index 88ab215..0000000
--- a/dojox/grid/compat/_grid/Grid_rtl.css
+++ /dev/null
@@ -1,8 +0,0 @@
-.dijitRtl .dojoxGrid-header table {
-}
-.dj_ie .dijitRtl .dojoxGrid-header table {
-	float:none;
-}
-.dijitRtl .dojoxGrid-content {
-	float:left;
-}
diff --git a/dojox/grid/compat/_grid/builder.js b/dojox/grid/compat/_grid/builder.js
deleted file mode 100644
index 411e575..0000000
--- a/dojox/grid/compat/_grid/builder.js
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat._grid.builder"]){
-dojo._hasResource["dojox.grid.compat._grid.builder"]=true;
-dojo.provide("dojox.grid.compat._grid.builder");
-dojo.require("dojox.grid.compat._grid.drag");
-dojo.declare("dojox.grid.Builder",null,{constructor:function(_1){
-this.view=_1;
-this.grid=_1.grid;
-},view:null,_table:"<table class=\"dojoxGrid-row-table\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" role=\"wairole:presentation\">",generateCellMarkup:function(_2,_3,_4,_5){
-var _6=[],_7;
-if(_5){
-_7=["<th tabIndex=\"-1\" role=\"wairole:columnheader\""];
-}else{
-_7=["<td tabIndex=\"-1\" role=\"wairole:gridcell\""];
-}
-_2.colSpan&&_7.push(" colspan=\"",_2.colSpan,"\"");
-_2.rowSpan&&_7.push(" rowspan=\"",_2.rowSpan,"\"");
-_7.push(" class=\"dojoxGrid-cell ");
-_2.classes&&_7.push(_2.classes," ");
-_4&&_7.push(_4," ");
-_6.push(_7.join(""));
-_6.push("");
-_7=["\" idx=\"",_2.index,"\" style=\""];
-_7.push(_2.styles,_3||"");
-_2.unitWidth&&_7.push("width:",_2.unitWidth,";");
-_6.push(_7.join(""));
-_6.push("");
-_7=["\""];
-_2.attrs&&_7.push(" ",_2.attrs);
-_7.push(">");
-_6.push(_7.join(""));
-_6.push("");
-_6.push("</td>");
-return _6;
-},isCellNode:function(_8){
-return Boolean(_8&&_8.getAttribute&&_8.getAttribute("idx"));
-},getCellNodeIndex:function(_9){
-return _9?Number(_9.getAttribute("idx")):-1;
-},getCellNode:function(_a,_b){
-for(var i=0,_d;_d=dojox.grid.getTr(_a.firstChild,i);i++){
-for(var j=0,_f;_f=_d.cells[j];j++){
-if(this.getCellNodeIndex(_f)==_b){
-return _f;
-}
-}
-}
-},findCellTarget:function(_10,_11){
-var n=_10;
-while(n&&(!this.isCellNode(n)||(dojox.grid.gridViewTag in n.offsetParent.parentNode&&n.offsetParent.parentNode[dojox.grid.gridViewTag]!=this.view.id))&&(n!=_11)){
-n=n.parentNode;
-}
-return n!=_11?n:null;
-},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);
-},findTarget:function(_14,_15){
-var n=_14;
-while(n&&(n!=this.domNode)&&(!(_15 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(_17){
-return this.findTarget(_17,dojox.grid.rowIndexTag);
-},isIntraNodeEvent:function(e){
-try{
-return (e.cellNode&&e.relatedTarget&&dojo.isDescendant(e.relatedTarget,e.cellNode));
-}
-catch(x){
-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){
-return false;
-}
-},dispatchEvent:function(e){
-if(e.dispatch in this){
-return this[e.dispatch](e);
-}
-},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,{update:function(){
-this.prepareHtml();
-},prepareHtml:function(){
-var _1f=this.grid.get,_20=this.view.structure.rows;
-for(var j=0,row;(row=_20[j]);j++){
-for(var i=0,_24;(_24=row[i]);i++){
-_24.get=_24.get||(_24.value==undefined)&&_1f;
-_24.markup=this.generateCellMarkup(_24,_24.cellStyles,_24.cellClasses,false);
-}
-}
-},generateHtml:function(_25,_26){
-var _27=[this._table],v=this.view,obr=v.onBeforeRow,_2a=v.structure.rows;
-obr&&obr(_26,_2a);
-for(var j=0,row;(row=_2a[j]);j++){
-if(row.hidden||row.header){
-continue;
-}
-_27.push(!row.invisible?"<tr>":"<tr class=\"dojoxGrid-invisible\">");
-for(var i=0,_2e,m,cc,cs;(_2e=row[i]);i++){
-m=_2e.markup,cc=_2e.customClasses=[],cs=_2e.customStyles=[];
-m[5]=_2e.format(_25);
-m[1]=cc.join(" ");
-m[3]=cs.join(";");
-_27.push.apply(_27,m);
-}
-_27.push("</tr>");
-}
-_27.push("</table>");
-return _27.join("");
-},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;
-}});
-dojo.declare("dojox.grid.headerBuilder",dojox.grid.Builder,{bogusClickTime:0,overResizeWidth:4,minColWidth:1,_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(_33,_34){
-var _35=[this._table],_36=this.view.structure.rows;
-if(this.view.viewWidth){
-_35.push([" style=\"width:",this.view.viewWidth,";\""].join(""));
-}
-_35.push(">");
-dojox.grid.fire(this.view,"onBeforeRow",[-1,_36]);
-for(var j=0,row;(row=_36[j]);j++){
-if(row.hidden){
-continue;
-}
-_35.push(!row.invisible?"<tr>":"<tr class=\"dojoxGrid-invisible\">");
-for(var i=0,_3a,_3b;(_3a=row[i]);i++){
-_3a.customClasses=[];
-_3a.customStyles=[];
-_3b=this.generateCellMarkup(_3a,_3a.headerStyles,_3a.headerClasses,true);
-_3b[5]=(_34!=undefined?_34:_33(_3a));
-_3b[3]=_3a.customStyles.join(";");
-_3b[1]=_3a.customClasses.join(" ");
-_35.push(_3b.join(""));
-}
-_35.push("</tr>");
-}
-_35.push("</table>");
-return _35.join("");
-},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;
-}
-}
-var n=dojox.grid.ascendDom(e.target,function(){
-if(!n||n==e.cellNode){
-return false;
-}
-x+=(n.offsetLeft<0?0:n.offsetLeft);
-return true;
-});
-return x;
-},decorateEvent:function(e){
-this.baseDecorateEvent(e);
-e.rowIndex=-1;
-e.cellX=this.getCellX(e);
-return true;
-},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 _45=this.grid.getCell(e.cellIndex);
-return !_45.noresize&&!_45.isFlex();
-},overLeftResizeArea:function(e){
-if(dojo._isBodyLtr()){
-return (e.cellIndex>0)&&(e.cellX<this.overResizeWidth)&&this.prepareResize(e,-1);
-}
-var t=e.cellNode&&(e.cellX<this.overResizeWidth);
-return;
-},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){
-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||"";
-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);
-}
-}
-},doclick:function(e){
-if(new Date().getTime()<this.bogusClickTime){
-dojo.stopEvent(e);
-return true;
-}
-},beginColumnResize:function(e){
-dojo.stopEvent(e);
-var _4e=[],_4f=this.tableMap.findOverlappingNodes(e.cellNode);
-for(var i=0,_51;(_51=_4f[i]);i++){
-_4e.push({node:_51,index:this.getCellNodeIndex(_51),width:_51.offsetWidth});
-}
-var _52={scrollLeft:e.sourceView.headerNode.scrollLeft,view:e.sourceView,node:e.cellNode,index:e.cellIndex,w:e.cellNode.clientWidth,spanners:_4e};
-dojox.grid.drag.start(e.cellNode,dojo.hitch(this,"doResizeColumn",_52),dojo.hitch(this,"endResizeColumn",_52),e);
-},doResizeColumn:function(_53,_54){
-var _55=dojo._isBodyLtr();
-if(_55){
-var w=_53.w+_54.deltaX;
-}else{
-var w=_53.w-_54.deltaX;
-}
-if(w>=this.minColWidth){
-for(var i=0,s,sw;(s=_53.spanners[i]);i++){
-if(_55){
-sw=s.width+_54.deltaX;
-}else{
-sw=s.width-_54.deltaX;
-}
-s.node.style.width=sw+"px";
-_53.view.setColWidth(s.index,sw);
-}
-_53.node.style.width=w+"px";
-_53.view.setColWidth(_53.index,w);
-if(!_55){
-_53.view.headerNode.scrollLeft=(_53.scrollLeft-_54.deltaX);
-}
-}
-if(_53.view.flexCells&&!_53.view.testFlexCells()){
-var t=dojox.grid.findTable(_53.node);
-t&&(t.style.width="");
-}
-},endResizeColumn:function(_5b){
-this.bogusClickTime=new Date().getTime()+30;
-setTimeout(dojo.hitch(_5b.view,"update"),50);
-}});
-dojo.declare("dojox.grid.tableMap",null,{constructor:function(_5c){
-this.mapRows(_5c);
-},map:null,mapRows:function(_5d){
-var _5e=_5d.length;
-if(!_5e){
-return;
-}
-this.map=[];
-for(var j=0,row;(row=_5d[j]);j++){
-this.map[j]=[];
-}
-for(var j=0,row;(row=_5d[j]);j++){
-for(var i=0,x=0,_63,_64,_65;(_63=row[i]);i++){
-while(this.map[j][x]){
-x++;
-}
-this.map[j][x]={c:i,r:j};
-_65=_63.rowSpan||1;
-_64=_63.colSpan||1;
-for(var y=0;y<_65;y++){
-for(var s=0;s<_64;s++){
-this.map[j+y][x+s]=this.map[j][x];
-}
-}
-x+=_64;
-}
-}
-},dumpMap:function(){
-for(var j=0,row,h="";(row=this.map[j]);j++,h=""){
-for(var i=0,_6c;(_6c=row[i]);i++){
-h+=_6c.r+","+_6c.c+"   ";
-}
-
-}
-},getMapCoords:function(_6d,_6e){
-for(var j=0,row;(row=this.map[j]);j++){
-for(var i=0,_72;(_72=row[i]);i++){
-if(_72.c==_6e&&_72.r==_6d){
-return {j:j,i:i};
-}
-}
-}
-return {j:-1,i:-1};
-},getNode:function(_73,_74,_75){
-var row=_73&&_73.rows[_74];
-return row&&row.cells[_75];
-},_findOverlappingNodes:function(_77,_78,_79){
-var _7a=[];
-var m=this.getMapCoords(_78,_79);
-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]){
-var n=this.getNode(_77,r,c);
-if(n){
-_7a.push(n);
-}
-}
-}
-return _7a;
-},findOverlappingNodes:function(_7f){
-return this._findOverlappingNodes(dojox.grid.findTable(_7f),dojox.grid.getTrIndex(_7f.parentNode),dojox.grid.getTdIndex(_7f));
-}});
-dojox.grid.rowIndexTag="gridRowIndex";
-dojox.grid.gridViewTag="gridView";
-}
diff --git a/dojox/grid/compat/_grid/cell.js b/dojox/grid/compat/_grid/cell.js
deleted file mode 100644
index e5e9faf..0000000
--- a/dojox/grid/compat/_grid/cell.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat._grid.cell"]){
-dojo._hasResource["dojox.grid.compat._grid.cell"]=true;
-dojo.provide("dojox.grid.compat._grid.cell");
-dojo.declare("dojox.grid.cell",null,{styles:"",constructor:function(_1){
-dojo.mixin(this,_1);
-if(this.editor){
-this.editor=new this.editor(this);
-}
-},format:function(_2){
-var f,i=this.grid.edit.info,d=this.get?this.get(_2):this.value;
-d=(d&&d.replace)?d.replace(/</g,"<"):d;
-if(this.editor&&(this.editor.alwaysOn||(i.rowIndex==_2&&i.cell==this))){
-return this.editor.format(d,_2);
-}else{
-return (f=this.formatter)?f.call(this,d,_2):d;
-}
-},getNode:function(_6){
-return this.view.getCellNode(_6,this.index);
-},isFlex:function(){
-var uw=this.unitWidth;
-return uw&&(uw=="auto"||uw.slice(-1)=="%");
-},applyEdit:function(_8,_9){
-this.grid.edit.applyCellEdit(_8,this,_9);
-},cancelEdit:function(_a){
-this.grid.doCancelEdit(_a);
-},_onEditBlur:function(_b){
-if(this.grid.edit.isEditCell(_b,this.index)){
-this.grid.edit.apply();
-}
-},registerOnBlur:function(_c,_d){
-if(this.commitOnBlur){
-dojo.connect(_c,"onblur",function(e){
-setTimeout(dojo.hitch(this,"_onEditBlur",_d),250);
-});
-}
-}});
-}
diff --git a/dojox/grid/compat/_grid/drag.js b/dojox/grid/compat/_grid/drag.js
deleted file mode 100644
index ab33cd7..0000000
--- a/dojox/grid/compat/_grid/drag.js
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat._grid.drag"]){
-dojo._hasResource["dojox.grid.compat._grid.drag"]=true;
-dojo.provide("dojox.grid.compat._grid.drag");
-(function(){
-var _1=dojox.grid.drag={};
-_1.dragging=false;
-_1.hysteresis=2;
-_1.capture=function(_2){
-if(_2.setCapture){
-_2.setCapture();
-}else{
-document.addEventListener("mousemove",_2.onmousemove,true);
-document.addEventListener("mouseup",_2.onmouseup,true);
-document.addEventListener("click",_2.onclick,true);
-}
-};
-_1.release=function(_3){
-if(_3.releaseCapture){
-_3.releaseCapture();
-}else{
-document.removeEventListener("click",_3.onclick,true);
-document.removeEventListener("mouseup",_3.onmouseup,true);
-document.removeEventListener("mousemove",_3.onmousemove,true);
-}
-};
-_1.start=function(_4,_5,_6,_7,_8){
-if(!_4||_1.dragging){
-
-return;
-}
-_1.dragging=true;
-_1.elt=_4;
-_1.events={drag:_5||dojox.grid.nop,end:_6||dojox.grid.nop,start:_8||dojox.grid.nop,oldmove:_4.onmousemove,oldup:_4.onmouseup,oldclick:_4.onclick};
-_1.positionX=(_7&&("screenX" in _7)?_7.screenX:false);
-_1.positionY=(_7&&("screenY" in _7)?_7.screenY:false);
-_1.started=(_1.position===false);
-_4.onmousemove=_1.mousemove;
-_4.onmouseup=_1.mouseup;
-_4.onclick=_1.click;
-_1.capture(_1.elt);
-};
-_1.end=function(){
-_1.release(_1.elt);
-_1.elt.onmousemove=_1.events.oldmove;
-_1.elt.onmouseup=_1.events.oldup;
-_1.elt.onclick=_1.events.oldclick;
-_1.elt=null;
-try{
-if(_1.started){
-_1.events.end();
-}
-}
-finally{
-_1.dragging=false;
-}
-};
-_1.calcDelta=function(_9){
-_9.deltaX=_9.screenX-_1.positionX;
-_9.deltaY=_9.screenY-_1.positionY;
-};
-_1.hasMoved=function(_a){
-return Math.abs(_a.deltaX)+Math.abs(_a.deltaY)>_1.hysteresis;
-};
-_1.mousemove=function(_b){
-_b=dojo.fixEvent(_b);
-dojo.stopEvent(_b);
-_1.calcDelta(_b);
-if((!_1.started)&&(_1.hasMoved(_b))){
-_1.events.start(_b);
-_1.started=true;
-}
-if(_1.started){
-_1.events.drag(_b);
-}
-};
-_1.mouseup=function(_c){
-dojo.stopEvent(dojo.fixEvent(_c));
-_1.end();
-};
-_1.click=function(_d){
-dojo.stopEvent(dojo.fixEvent(_d));
-};
-})();
-}
diff --git a/dojox/grid/compat/_grid/edit.js b/dojox/grid/compat/_grid/edit.js
deleted file mode 100644
index 8ad756d..0000000
--- a/dojox/grid/compat/_grid/edit.js
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat._grid.edit"]){
-dojo._hasResource["dojox.grid.compat._grid.edit"]=true;
-dojo.provide("dojox.grid.compat._grid.edit");
-dojo.declare("dojox.grid.edit",null,{constructor:function(_1){
-this.grid=_1;
-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(_2,_3){
-if(this.grid.singleClickEdit||this.isEditRow(_3)){
-this.setEditCell(_2,_3);
-}else{
-this.apply();
-}
-if(this.isEditing()||(_2&&(_2.editor||0).alwaysOn)){
-this._focusEditor(_2,_3);
-}
-},rowClick:function(e){
-if(this.isEditing()&&!this.isEditRow(e.rowIndex)){
-this.apply();
-}
-},styleRow:function(_5){
-if(_5.index==this.info.rowIndex){
-_5.customClasses+=" dojoxGrid-row-editing";
-}
-},dispatchEvent:function(e){
-var c=e.cell,ed=c&&c.editor;
-return ed&&ed.dispatchEvent(e.dispatch,e);
-},isEditing:function(){
-return this.info.rowIndex!==undefined;
-},isEditCell:function(_9,_a){
-return (this.info.rowIndex===_9)&&(this.info.cell.index==_a);
-},isEditRow:function(_b){
-return this.info.rowIndex===_b;
-},setEditCell:function(_c,_d){
-if(!this.isEditCell(_d,_c.index)&&this.grid.canEdit(_c,_d)){
-this.start(_c,_d,this.isEditRow(_d)||_c.editor);
-}
-},_focusEditor:function(_e,_f){
-dojox.grid.fire(_e.editor,"focus",[_f]);
-},focusEditor:function(){
-if(this.isEditing()){
-this._focusEditor(this.info.cell,this.info.rowIndex);
-}
-},_boomerangWindow:500,_shouldCatchBoomerang:function(){
-return this._catchBoomerang>new Date().getTime();
-},_boomerangFocus:function(){
-if(this._shouldCatchBoomerang()){
-this.grid.focus.focusGrid();
-this.focusEditor();
-this._catchBoomerang=0;
-}
-},_doCatchBoomerang:function(){
-if(dojo.isIE){
-this._catchBoomerang=new Date().getTime()+this._boomerangWindow;
-}
-},start:function(_10,_11,_12){
-this.grid.beginUpdate();
-this.editorApply();
-if(this.isEditing()&&!this.isEditRow(_11)){
-this.applyRowEdit();
-this.grid.updateRow(_11);
-}
-if(_12){
-this.info={cell:_10,rowIndex:_11};
-this.grid.doStartEdit(_10,_11);
-this.grid.updateRow(_11);
-}else{
-this.info={};
-}
-this.grid.endUpdate();
-this.grid.focus.focusGrid();
-this._focusEditor(_10,_11);
-this._doCatchBoomerang();
-},_editorDo:function(_13){
-var c=this.info.cell;
-c&&c.editor&&c.editor[_13](this.info.rowIndex);
-},editorApply:function(){
-this._editorDo("apply");
-},editorCancel:function(){
-this._editorDo("cancel");
-},applyCellEdit:function(_15,_16,_17){
-if(this.grid.canEdit(_16,_17)){
-this.grid.doApplyCellEdit(_15,_17,_16.fieldIndex);
-}
-},applyRowEdit:function(){
-this.grid.doApplyEdit(this.info.rowIndex);
-},apply:function(){
-if(this.isEditing()){
-this.grid.beginUpdate();
-this.editorApply();
-this.applyRowEdit();
-this.info={};
-this.grid.endUpdate();
-this.grid.focus.focusGrid();
-this._doCatchBoomerang();
-}
-},cancel:function(){
-if(this.isEditing()){
-this.grid.beginUpdate();
-this.editorCancel();
-this.info={};
-this.grid.endUpdate();
-this.grid.focus.focusGrid();
-this._doCatchBoomerang();
-}
-},save:function(_18,_19){
-var c=this.info.cell;
-if(this.isEditRow(_18)&&(!_19||c.view==_19)&&c.editor){
-c.editor.save(c,this.info.rowIndex);
-}
-},restore:function(_1b,_1c){
-var c=this.info.cell;
-if(this.isEditRow(_1c)&&c.view==_1b&&c.editor){
-c.editor.restore(c,this.info.rowIndex);
-}
-}});
-}
diff --git a/dojox/grid/compat/_grid/focus.js b/dojox/grid/compat/_grid/focus.js
deleted file mode 100644
index ceac6ec..0000000
--- a/dojox/grid/compat/_grid/focus.js
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat._grid.focus"]){
-dojo._hasResource["dojox.grid.compat._grid.focus"]=true;
-dojo.provide("dojox.grid.compat._grid.focus");
-dojo.declare("dojox.grid.focus",null,{constructor:function(_1){
-this.grid=_1;
-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(_2,_3){
-return (this.cell==_2)&&(this.rowIndex==_3);
-},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(_4){
-var n=this.cell&&this.cell.getNode(this.rowIndex);
-if(n){
-dojo.toggleClass(n,this.focusClass,_4);
-if(_4){
-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);
-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;
-}
-}
-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(_c){
-return;
-},setFocusIndex:function(_d,_e){
-this.setFocusCell(this.grid.getCell(_e),_d);
-},setFocusCell:function(_f,_10){
-if(_f&&!this.isFocusCell(_f,_10)){
-this.tabbingOut=false;
-this.focusGridView();
-this._focusifyCellNode(false);
-this.cell=_f;
-this.rowIndex=_10;
-this._focusifyCellNode(true);
-}
-if(dojo.isOpera){
-setTimeout(dojo.hitch(this.grid,"onCellFocus",this.cell,this.rowIndex),1);
-}else{
-this.grid.onCellFocus(this.cell,this.rowIndex);
-}
-},next:function(){
-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(){
-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(_17,_18){
-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+_17)),col=Math.min(cc,Math.max(0,i+_18));
-this.setFocusIndex(row,col);
-if(_17){
-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(_21){
-this.tabbingOut=true;
-_21.focus();
-},focusGridView:function(){
-dojox.grid.fire(this.focusView,"focus");
-},focusGrid:function(_22){
-this.focusGridView();
-this._focusifyCellNode(true);
-},doFocus:function(e){
-if(e&&e.target!=e.currentTarget){
-return;
-}
-if(!this.tabbingOut&&this.isNoFocusCell()){
-this.setFocusIndex(0,0);
-}
-this.tabbingOut=false;
-}});
-}
diff --git a/dojox/grid/compat/_grid/images/grid_dx_gradient.gif b/dojox/grid/compat/_grid/images/grid_dx_gradient.gif
deleted file mode 100644
index 57f67ba..0000000
Binary files a/dojox/grid/compat/_grid/images/grid_dx_gradient.gif and /dev/null differ
diff --git a/dojox/grid/compat/_grid/images/grid_sort_down.gif b/dojox/grid/compat/_grid/images/grid_sort_down.gif
deleted file mode 100644
index 7a73f82..0000000
Binary files a/dojox/grid/compat/_grid/images/grid_sort_down.gif and /dev/null differ
diff --git a/dojox/grid/compat/_grid/images/grid_sort_up.gif b/dojox/grid/compat/_grid/images/grid_sort_up.gif
deleted file mode 100644
index 9452da0..0000000
Binary files a/dojox/grid/compat/_grid/images/grid_sort_up.gif and /dev/null differ
diff --git a/dojox/grid/compat/_grid/images/tabEnabled_rotated.png b/dojox/grid/compat/_grid/images/tabEnabled_rotated.png
deleted file mode 100644
index e326abd..0000000
Binary files a/dojox/grid/compat/_grid/images/tabEnabled_rotated.png and /dev/null differ
diff --git a/dojox/grid/compat/_grid/images/tabHover_rotated.png b/dojox/grid/compat/_grid/images/tabHover_rotated.png
deleted file mode 100644
index 1a30e10..0000000
Binary files a/dojox/grid/compat/_grid/images/tabHover_rotated.png and /dev/null differ
diff --git a/dojox/grid/compat/_grid/layout.js b/dojox/grid/compat/_grid/layout.js
deleted file mode 100644
index 61f99b9..0000000
--- a/dojox/grid/compat/_grid/layout.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat._grid.layout"]){
-dojo._hasResource["dojox.grid.compat._grid.layout"]=true;
-dojo.provide("dojox.grid.compat._grid.layout");
-dojo.require("dojox.grid.compat._grid.cell");
-dojo.declare("dojox.grid.layout",null,{constructor:function(_1){
-this.grid=_1;
-},cells:[],structure:null,defaultWidth:"6em",setStructure:function(_2){
-this.fieldIndex=0;
-this.cells=[];
-var s=this.structure=[];
-for(var i=0,_5,_6;(_5=_2[i]);i++){
-s.push(this.addViewDef(_5));
-}
-this.cellCount=this.cells.length;
-},addViewDef:function(_7){
-this._defaultCellProps=_7.defaultCell||{};
-return dojo.mixin({},_7,{rows:this.addRowsDef(_7.rows||_7.cells)});
-},addRowsDef:function(_8){
-var _9=[];
-for(var i=0,_b;_8&&(_b=_8[i]);i++){
-_9.push(this.addRowDef(i,_b));
-}
-return _9;
-},addRowDef:function(_c,_d){
-var _e=[];
-for(var i=0,def,_11;(def=_d[i]);i++){
-_11=this.addCellDef(_c,i,def);
-_e.push(_11);
-this.cells.push(_11);
-}
-return _e;
-},addCellDef:function(_12,_13,_14){
-var w=0;
-if(_14.colSpan>1){
-w=0;
-}else{
-if(!isNaN(_14.width)){
-w=_14.width+"em";
-}else{
-w=_14.width||this.defaultWidth;
-}
-}
-var _16=_14.field!=undefined?_14.field:(_14.get?-1:this.fieldIndex);
-if((_14.field!=undefined)||!_14.get){
-this.fieldIndex=(_14.field>-1?_14.field:this.fieldIndex)+1;
-}
-return new dojox.grid.cell(dojo.mixin({},this._defaultCellProps,_14,{grid:this.grid,subrow:_12,layoutIndex:_13,index:this.cells.length,fieldIndex:_16,unitWidth:w}));
-}});
-}
diff --git a/dojox/grid/compat/_grid/lib.js b/dojox/grid/compat/_grid/lib.js
deleted file mode 100644
index b7be80c..0000000
--- a/dojox/grid/compat/_grid/lib.js
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat._grid.lib"]){
-dojo._hasResource["dojox.grid.compat._grid.lib"]=true;
-dojo.provide("dojox.grid.compat._grid.lib");
-dojo.mixin(dojox.grid,{na:"...",nop: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(_3,_4){
-return _3&&((_3.rows||0)[_4]||_3.childNodes[_4]);
-},getTd:function(_5,_6,_7){
-return (dojox.grid.getTr(_5,_6)||0)[_7];
-},findTable:function(_8){
-for(var n=_8;n&&n.tagName!="TABLE";n=n.parentNode){
-}
-return n;
-},ascendDom:function(_a,_b){
-for(var n=_a;n&&_b(n);n=n.parentNode){
-}
-return n;
-},makeNotTagName:function(_d){
-var _e=_d.toUpperCase();
-return function(_f){
-return _f.tagName!=_e;
-};
-},fire:function(ob,ev,_12){
-var fn=ob&&ev&&ob[ev];
-return fn&&(_12?fn.apply(ob,_12):ob[ev]());
-},setStyleText:function(_14,_15){
-if(_14.style.cssText==undefined){
-_14.setAttribute("style",_15);
-}else{
-_14.style.cssText=_15;
-}
-},getStyleText:function(_16,_17){
-return (_16.style.cssText==undefined?_16.getAttribute("style"):_16.style.cssText);
-},setStyle:function(_18,_19,_1a){
-if(_18&&_18.style[_19]!=_1a){
-_18.style[_19]=_1a;
-}
-},setStyleHeightPx:function(_1b,_1c){
-if(_1c>=0){
-dojox.grid.setStyle(_1b,"height",_1c+"px");
-}
-},mouseEvents:["mouseover","mouseout","mousedown","mouseup","click","dblclick","contextmenu"],keyEvents:["keyup","keydown","keypress"],funnelEvents:function(_1d,_1e,_1f,_20){
-var _21=(_20?_20:dojox.grid.mouseEvents.concat(dojox.grid.keyEvents));
-for(var i=0,l=_21.length;i<l;i++){
-dojo.connect(_1d,"on"+_21[i],_1e,_1f);
-}
-},removeNode:function(_24){
-_24=dojo.byId(_24);
-_24&&_24.parentNode&&_24.parentNode.removeChild(_24);
-return _24;
-},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;
-},getRef:function(_26,_27,_28){
-var obj=_28||dojo.global,_2a=_26.split("."),_2b=_2a.pop();
-for(var i=0,p;obj&&(p=_2a[i]);i++){
-obj=(p in obj?obj[p]:(_27?obj[p]={}:undefined));
-}
-return {obj:obj,prop:_2b};
-},getProp:function(_2e,_2f,_30){
-with(dojox.grid.getRef(_2e,_2f,_30)){
-return (obj)&&(prop)&&(prop in obj?obj[prop]:(_2f?obj[prop]={}:undefined));
-}
-},indexInParent:function(_31){
-var i=0,n,p=_31.parentNode;
-while((n=p.childNodes[i++])){
-if(n==_31){
-return i-1;
-}
-}
-return -1;
-},cleanNode:function(_35){
-if(!_35){
-return;
-}
-var _36=function(inW){
-return inW.domNode&&dojo.isDescendant(inW.domNode,_35,true);
-};
-var ws=dijit.registry.filter(_36);
-for(var i=0,w;(w=ws[i]);i++){
-w.destroy();
-}
-delete ws;
-},getTagName:function(_3b){
-var _3c=dojo.byId(_3b);
-return (_3c&&_3c.tagName?_3c.tagName.toLowerCase():"");
-},nodeKids:function(_3d,_3e){
-var _3f=[];
-var i=0,n;
-while((n=_3d.childNodes[i++])){
-if(dojox.grid.getTagName(n)==_3e){
-_3f.push(n);
-}
-}
-return _3f;
-},divkids:function(_42){
-return dojox.grid.nodeKids(_42,"div");
-},focusSelectNode:function(_43){
-try{
-dojox.grid.fire(_43,"focus");
-dojox.grid.fire(_43,"select");
-}
-catch(e){
-}
-},whenIdle:function(){
-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(_48,_49,_4a){
-if(_48.length<=_49){
-_48[_49]=_4a;
-}else{
-_48.splice(_49,0,_4a);
-}
-},arrayRemove:function(_4b,_4c){
-_4b.splice(_4c,1);
-},arraySwap:function(_4d,inI,inJ){
-var _50=_4d[inI];
-_4d[inI]=_4d[inJ];
-_4d[inJ]=_50;
-},initTextSizePoll:function(_51){
-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,_51||200);
-dojox.grid.initTextSizePoll=dojox.grid.nop;
-},textSizeChanged:function(){
-}});
-dojox.grid.jobs={cancel:function(_55){
-if(_55){
-window.clearTimeout(_55);
-}
-},jobs:[],job:function(_56,_57,_58){
-dojox.grid.jobs.cancelJob(_56);
-var job=function(){
-delete dojox.grid.jobs.jobs[_56];
-_58();
-};
-dojox.grid.jobs.jobs[_56]=setTimeout(job,_57);
-},cancelJob:function(_5a){
-dojox.grid.jobs.cancel(dojox.grid.jobs.jobs[_5a]);
-}};
-}
diff --git a/dojox/grid/compat/_grid/nihiloGrid.css b/dojox/grid/compat/_grid/nihiloGrid.css
deleted file mode 100644
index b96f410..0000000
--- a/dojox/grid/compat/_grid/nihiloGrid.css
+++ /dev/null
@@ -1,211 +0,0 @@
-.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;
-}
diff --git a/dojox/grid/compat/_grid/publicEvents.js b/dojox/grid/compat/_grid/publicEvents.js
deleted file mode 100644
index 945ba02..0000000
--- a/dojox/grid/compat/_grid/publicEvents.js
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat._grid.publicEvents"]){
-dojo._hasResource["dojox.grid.compat._grid.publicEvents"]=true;
-dojo.provide("dojox.grid.compat._grid.publicEvents");
-dojox.grid.publicEvents={cellOverClass:"dojoxGrid-cell-over",onKeyEvent:function(e){
-this.dispatchKeyEvent(e);
-},onContentEvent:function(e){
-this.dispatchContentEvent(e);
-},onHeaderEvent:function(e){
-this.dispatchHeaderEvent(e);
-},onStyleRow:function(_4){
-with(_4){
-customClasses+=(odd?" dojoxGrid-row-odd":"")+(selected?" dojoxGrid-row-selected":"")+(over?" dojoxGrid-row-over":"");
-}
-this.focus.styleRow(_4);
-this.edit.styleRow(_4);
-},onKeyDown:function(e){
-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 _7=this.edit.isEditing();
-this.edit.apply();
-if(!_7){
-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 _8=(e.keyCode==dk.LEFT_ARROW)?1:-1;
-if(dojo._isBodyLtr()){
-_8*=-1;
-}
-this.focus.move(0,_8);
-}
-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){
-e.rowIndex==-1?this.onHeaderCellMouseOver(e):this.onCellMouseOver(e);
-},onMouseOut:function(e){
-e.rowIndex==-1?this.onHeaderCellMouseOut(e):this.onCellMouseOut(e);
-},onMouseDown:function(e){
-e.rowIndex==-1?this.onHeaderCellMouseDown(e):this.onCellMouseDown(e);
-},onMouseOverRow:function(e){
-if(!this.rows.isOver(e.rowIndex)){
-this.rows.setOverRow(e.rowIndex);
-e.rowIndex==-1?this.onHeaderMouseOver(e):this.onRowMouseOver(e);
-}
-},onMouseOutRow:function(e){
-if(this.rows.isOver(-1)){
-this.onHeaderMouseOut(e);
-}else{
-if(!this.rows.isOver(-2)){
-this.rows.setOverRow(-2);
-this.onRowMouseOut(e);
-}
-}
-},onMouseDownRow:function(e){
-if(e.rowIndex!=-1){
-this.onRowMouseDown(e);
-}
-},onCellMouseOver:function(e){
-dojo.addClass(e.cellNode,this.cellOverClass);
-},onCellMouseOut:function(e){
-dojo.removeClass(e.cellNode,this.cellOverClass);
-},onCellMouseDown:function(e){
-},onCellClick:function(e){
-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){
-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){
-this.onRowContextMenu(e);
-},onCellFocus:function(_15,_16){
-this.edit.cellFocus(_15,_16);
-},onRowClick:function(e){
-this.edit.rowClick(e);
-this.selection.clickSelectEvent(e);
-},onRowDblClick:function(e){
-},onRowMouseOver:function(e){
-},onRowMouseOut:function(e){
-},onRowMouseDown:function(e){
-},onRowContextMenu:function(e){
-dojo.stopEvent(e);
-},onHeaderMouseOver:function(e){
-},onHeaderMouseOut:function(e){
-},onHeaderCellMouseOver:function(e){
-dojo.addClass(e.cellNode,this.cellOverClass);
-},onHeaderCellMouseOut:function(e){
-dojo.removeClass(e.cellNode,this.cellOverClass);
-},onHeaderCellMouseDown:function(e){
-},onHeaderClick:function(e){
-},onHeaderCellClick:function(e){
-this.setSortIndex(e.cell.index);
-this.onHeaderClick(e);
-},onHeaderDblClick:function(e){
-},onHeaderCellDblClick:function(e){
-this.onHeaderDblClick(e);
-},onHeaderCellContextMenu:function(e){
-this.onHeaderContextMenu(e);
-},onHeaderContextMenu:function(e){
-dojo.stopEvent(e);
-},onStartEdit:function(_28,_29){
-},onApplyCellEdit:function(_2a,_2b,_2c){
-},onCancelEdit:function(_2d){
-},onApplyEdit:function(_2e){
-},onCanSelect:function(_2f){
-return true;
-},onCanDeselect:function(_30){
-return true;
-},onSelected:function(_31){
-this.updateRowStyles(_31);
-},onDeselected:function(_32){
-this.updateRowStyles(_32);
-},onSelectionChanged:function(){
-}};
-}
diff --git a/dojox/grid/compat/_grid/rowbar.js b/dojox/grid/compat/_grid/rowbar.js
deleted file mode 100644
index d7e7c73..0000000
--- a/dojox/grid/compat/_grid/rowbar.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat._grid.rowbar"]){
-dojo._hasResource["dojox.grid.compat._grid.rowbar"]=true;
-dojo.provide("dojox.grid.compat._grid.rowbar");
-dojo.require("dojox.grid.compat._grid.view");
-dojo.declare("dojox.GridRowView",dojox.GridView,{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(_1,_2){
-var w=this.contentNode.offsetWidth-this.padBorderWidth;
-_2.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(){
-},doStyleRowNode:function(_4,_5){
-var n=["dojoxGrid-rowbar"];
-if(this.grid.rows.isOver(_4)){
-n.push("dojoxGrid-rowbar-over");
-}
-if(this.grid.selection.isSelected(_4)){
-n.push("dojoxGrid-rowbar-selected");
-}
-_5.className=n.join(" ");
-},domouseover:function(e){
-this.grid.onMouseOverRow(e);
-},domouseout:function(e){
-if(!this.isIntraRowEvent(e)){
-this.grid.onMouseOutRow(e);
-}
-}});
-}
diff --git a/dojox/grid/compat/_grid/rows.js b/dojox/grid/compat/_grid/rows.js
deleted file mode 100644
index fc36372..0000000
--- a/dojox/grid/compat/_grid/rows.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat._grid.rows"]){
-dojo._hasResource["dojox.grid.compat._grid.rows"]=true;
-dojo.provide("dojox.grid.compat._grid.rows");
-dojo.declare("dojox.grid.rows",null,{constructor:function(_1){
-this.grid=_1;
-},linesToEms:2,defaultRowHeight:1,overRow:-2,getHeight:function(_2){
-return "";
-},getDefaultHeightPx:function(){
-return 32;
-},prepareStylingRow:function(_3,_4){
-return {index:_3,node:_4,odd:Boolean(_3&1),selected:this.grid.selection.isSelected(_3),over:this.isOver(_3),customStyles:"",customClasses:"dojoxGrid-row"};
-},styleRowNode:function(_5,_6){
-var _7=this.prepareStylingRow(_5,_6);
-this.grid.onStyleRow(_7);
-this.applyStyles(_7);
-},applyStyles:function(_8){
-with(_8){
-node.className=customClasses;
-var h=node.style.height;
-dojox.grid.setStyleText(node,customStyles+";"+(node._style||""));
-node.style.height=h;
-}
-},updateStyles:function(_a){
-this.grid.updateRowStyles(_a);
-},setOverRow:function(_b){
-var _c=this.overRow;
-this.overRow=_b;
-if((_c!=this.overRow)&&(_c>=0)){
-this.updateStyles(_c);
-}
-this.updateStyles(this.overRow);
-},isOver:function(_d){
-return (this.overRow==_d);
-}});
-}
diff --git a/dojox/grid/compat/_grid/scroller.js b/dojox/grid/compat/_grid/scroller.js
deleted file mode 100644
index 7ed90fe..0000000
--- a/dojox/grid/compat/_grid/scroller.js
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat._grid.scroller"]){
-dojo._hasResource["dojox.grid.compat._grid.scroller"]=true;
-dojo.provide("dojox.grid.compat._grid.scroller");
-dojo.declare("dojox.grid.scroller.base",null,{constructor:function(){
-this.pageHeights=[];
-this.stack=[];
-},rowCount:0,defaultRowHeight:10,keepRows:100,contentNode:null,scrollboxNode:null,defaultPageHeight:0,keepPages:10,pageCount:0,windowHeight:0,firstVisibleRow:0,lastVisibleRow:0,page:0,pageTop:0,init:function(_1,_2,_3){
-switch(arguments.length){
-case 3:
-this.rowsPerPage=_3;
-case 2:
-this.keepRows=_2;
-case 1:
-this.rowCount=_1;
-}
-this.defaultPageHeight=this.defaultRowHeight*this.rowsPerPage;
-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(_4){
-this.keepRows=_4;
-this.keepPages=!this.keepRows?this.keepRows:Math.max(Math.ceil(this.keepRows/this.rowsPerPage),2);
-},invalidate:function(){
-this.invalidateNodes();
-this.pageHeights=[];
-this.height=(this.pageCount?(this.pageCount-1)*this.defaultPageHeight+this.calcLastPageHeight():0);
-this.resize();
-},updateRowCount:function(_5){
-this.invalidateNodes();
-this.rowCount=_5;
-var _6=this.pageCount;
-this.pageCount=Math.ceil(this.rowCount/this.rowsPerPage);
-if(this.pageCount<_6){
-for(var i=_6-1;i>=this.pageCount;i--){
-this.height-=this.getPageHeight(i);
-delete this.pageHeights[i];
-}
-}else{
-if(this.pageCount>_6){
-this.height+=this.defaultPageHeight*(this.pageCount-_6-1)+this.calcLastPageHeight();
-}
-}
-this.resize();
-},pageExists:function(_8){
-},measurePage:function(_9){
-},positionPage:function(_a,_b){
-},repositionPages:function(_c){
-},installPage:function(_d){
-},preparePage:function(_e,_f,_10){
-},renderPage:function(_11){
-},removePage:function(_12){
-},pacify:function(_13){
-},pacifying:false,pacifyTicks:200,setPacifying:function(_14){
-if(this.pacifying!=_14){
-this.pacifying=_14;
-this.pacify(this.pacifying);
-}
-},startPacify:function(){
-this.startPacifyTicks=new Date().getTime();
-},doPacify:function(){
-var _15=(new Date().getTime()-this.startPacifyTicks)>this.pacifyTicks;
-this.setPacifying(true);
-this.startPacify();
-return _15;
-},endPacify:function(){
-this.setPacifying(false);
-},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 _16=this.pageCount-1;
-var _17=((this.rowCount%this.rowsPerPage)||(this.rowsPerPage))*this.defaultRowHeight;
-this.pageHeights[_16]=_17;
-return _17;
-},updateContentHeight:function(_18){
-this.height+=_18;
-this.resize();
-},updatePageHeight:function(_19){
-if(this.pageExists(_19)){
-var oh=this.getPageHeight(_19);
-var h=(this.measurePage(_19))||(oh);
-this.pageHeights[_19]=h;
-if((h)&&(oh!=h)){
-this.updateContentHeight(h-oh);
-this.repositionPages(_19);
-}
-}
-},rowHeightChanged:function(_1c){
-this.updatePageHeight(Math.floor(_1c/this.rowsPerPage));
-},invalidateNodes:function(){
-while(this.stack.length){
-this.destroyPage(this.popPage());
-}
-},createPageNode:function(){
-var p=document.createElement("div");
-p.style.position="absolute";
-p.style[dojo._isBodyLtr()?"left":"right"]="0";
-return p;
-},getPageHeight:function(_1e){
-var ph=this.pageHeights[_1e];
-return (ph!==undefined?ph:this.defaultPageHeight);
-},pushPage:function(_20){
-return this.stack.push(_20);
-},popPage:function(){
-return this.stack.shift();
-},findPage:function(_21){
-var i=0,h=0;
-for(var ph=0;i<this.pageCount;i++,h+=ph){
-ph=this.getPageHeight(i);
-if(h+ph>=_21){
-break;
-}
-}
-this.page=i;
-this.pageTop=h;
-},buildPage:function(_25,_26,_27){
-this.preparePage(_25,_26);
-this.positionPage(_25,_27);
-this.installPage(_25);
-this.renderPage(_25);
-this.pushPage(_25);
-},needPage:function(_28,_29){
-var h=this.getPageHeight(_28),oh=h;
-if(!this.pageExists(_28)){
-this.buildPage(_28,this.keepPages&&(this.stack.length>=this.keepPages),_29);
-h=this.measurePage(_28)||h;
-this.pageHeights[_28]=h;
-if(h&&(oh!=h)){
-this.updateContentHeight(h-oh);
-}
-}else{
-this.positionPage(_28,_29);
-}
-return h;
-},onscroll:function(){
-this.scroll(this.scrollboxNode.scrollTop);
-},scroll:function(_2c){
-this.startPacify();
-this.findPage(_2c);
-var h=this.height;
-var b=this.getScrollBottom(_2c);
-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,_2c);
-this.lastVisibleRow=this.getLastVisibleRow(p-1,y,b);
-if(h!=this.height){
-this.repositionPages(p-1);
-}
-this.endPacify();
-},getScrollBottom:function(_31){
-return (this.windowHeight>=0?_31+this.windowHeight:-1);
-},processNodeEvent:function(e,_33){
-var t=e.target;
-while(t&&(t!=_33)&&t.parentNode&&(t.parentNode.parentNode!=_33)){
-t=t.parentNode;
-}
-if(!t||!t.parentNode||(t.parentNode.parentNode!=_33)){
-return false;
-}
-var _35=t.parentNode;
-e.topRowIndex=_35.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,{constructor:function(){
-this.pageNodes=[];
-},renderRow:function(_37,_38){
-},removeRow:function(_39){
-},getDefaultNodes:function(){
-return this.pageNodes;
-},getDefaultPageNode:function(_3a){
-return this.getDefaultNodes()[_3a];
-},positionPageNode:function(_3b,_3c){
-_3b.style.top=_3c+"px";
-},getPageNodePosition:function(_3d){
-return _3d.offsetTop;
-},repositionPageNodes:function(_3e,_3f){
-var _40=0;
-for(var i=0;i<this.stack.length;i++){
-_40=Math.max(this.stack[i],_40);
-}
-var n=_3f[_3e];
-var y=(n?this.getPageNodePosition(n)+this.getPageHeight(_3e):0);
-for(var p=_3e+1;p<=_40;p++){
-n=_3f[p];
-if(n){
-if(this.getPageNodePosition(n)==y){
-return;
-}
-this.positionPage(p,y);
-}
-y+=this.getPageHeight(p);
-}
-},invalidatePageNode:function(_45,_46){
-var p=_46[_45];
-if(p){
-delete _46[_45];
-this.removePage(_45,p);
-dojox.grid.cleanNode(p);
-p.innerHTML="";
-}
-return p;
-},preparePageNode:function(_48,_49,_4a){
-var p=(_49===null?this.createPageNode():this.invalidatePageNode(_49,_4a));
-p.pageIndex=_48;
-p.id=(this._pageIdPrefix||"")+"page-"+_48;
-_4a[_48]=p;
-},pageExists:function(_4c){
-return Boolean(this.getDefaultPageNode(_4c));
-},measurePage:function(_4d){
-var p=this.getDefaultPageNode(_4d);
-var h=p.offsetHeight;
-if(!this._defaultRowHeight){
-if(p){
-this._defaultRowHeight=8;
-var fr=p.firstChild;
-if(fr){
-var _51=dojo.doc.createTextNode("T");
-fr.appendChild(_51);
-this._defaultRowHeight=fr.offsetHeight;
-fr.removeChild(_51);
-}
-}
-}
-return (this.rowsPerPage==h)?(h*this._defaultRowHeight):h;
-},positionPage:function(_52,_53){
-this.positionPageNode(this.getDefaultPageNode(_52),_53);
-},repositionPages:function(_54){
-this.repositionPageNodes(_54,this.getDefaultNodes());
-},preparePage:function(_55,_56){
-this.preparePageNode(_55,(_56?this.popPage():null),this.getDefaultNodes());
-},installPage:function(_57){
-this.contentNode.appendChild(this.getDefaultPageNode(_57));
-},destroyPage:function(_58){
-var p=this.invalidatePageNode(_58,this.getDefaultNodes());
-dojox.grid.removeNode(p);
-},renderPage:function(_5a){
-var _5b=this.pageNodes[_5a];
-for(var i=0,j=_5a*this.rowsPerPage;(i<this.rowsPerPage)&&(j<this.rowCount);i++,j++){
-this.renderRow(j,_5b);
-}
-},removePage:function(_5e){
-for(var i=0,j=_5e*this.rowsPerPage;i<this.rowsPerPage;i++,j++){
-this.removeRow(j);
-}
-},getPageRow:function(_61){
-return _61*this.rowsPerPage;
-},getLastPageRow:function(_62){
-return Math.min(this.rowCount,this.getPageRow(_62+1))-1;
-},getFirstVisibleRowNodes:function(_63,_64,_65,_66){
-var row=this.getPageRow(_63);
-var _68=dojox.grid.divkids(_66[_63]);
-for(var i=0,l=_68.length;i<l&&_64<_65;i++,row++){
-_64+=_68[i].offsetHeight;
-}
-return (row?row-1:row);
-},getFirstVisibleRow:function(_6b,_6c,_6d){
-if(!this.pageExists(_6b)){
-return 0;
-}
-return this.getFirstVisibleRowNodes(_6b,_6c,_6d,this.getDefaultNodes());
-},getLastVisibleRowNodes:function(_6e,_6f,_70,_71){
-var row=this.getLastPageRow(_6e);
-var _73=dojox.grid.divkids(_71[_6e]);
-for(var i=_73.length-1;i>=0&&_6f>_70;i--,row--){
-_6f-=_73[i].offsetHeight;
-}
-return row+1;
-},getLastVisibleRow:function(_75,_76,_77){
-if(!this.pageExists(_75)){
-return 0;
-}
-return this.getLastVisibleRowNodes(_75,_76,_77,this.getDefaultNodes());
-},findTopRowForNodes:function(_78,_79){
-var _7a=dojox.grid.divkids(_79[this.page]);
-for(var i=0,l=_7a.length,t=this.pageTop,h;i<l;i++){
-h=_7a[i].offsetHeight;
-t+=h;
-if(t>=_78){
-this.offset=h-(t-_78);
-return i+this.page*this.rowsPerPage;
-}
-}
-return -1;
-},findScrollTopForNodes:function(_7f,_80){
-var _81=Math.floor(_7f/this.rowsPerPage);
-var t=0;
-for(var i=0;i<_81;i++){
-t+=this.getPageHeight(i);
-}
-this.pageTop=t;
-this.needPage(_81,this.pageTop);
-var _84=dojox.grid.divkids(_80[_81]);
-var r=_7f-this.rowsPerPage*_81;
-for(var i=0,l=_84.length;i<l&&i<r;i++){
-t+=_84[i].offsetHeight;
-}
-return t;
-},findTopRow:function(_87){
-return this.findTopRowForNodes(_87,this.getDefaultNodes());
-},findScrollTop:function(_88){
-return this.findScrollTopForNodes(_88,this.getDefaultNodes());
-},dummy:0});
-dojo.declare("dojox.grid.scroller.columns",dojox.grid.scroller,{constructor:function(_89){
-this.setContentNodes(_89);
-},setContentNodes:function(_8a){
-this.contentNodes=_8a;
-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(_8c){
-if(this.colCount){
-dojox.grid.scroller.prototype.scroll.call(this,_8c);
-}
-},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);
-}
-},positionPage:function(_8e,_8f){
-for(var i=0;i<this.colCount;i++){
-this.positionPageNode(this.pageNodes[i][_8e],_8f);
-}
-},preparePage:function(_91,_92){
-var p=(_92?this.popPage():null);
-for(var i=0;i<this.colCount;i++){
-this.preparePageNode(_91,p,this.pageNodes[i]);
-}
-},installPage:function(_95){
-for(var i=0;i<this.colCount;i++){
-this.contentNodes[i].appendChild(this.pageNodes[i][_95]);
-}
-},destroyPage:function(_97){
-for(var i=0;i<this.colCount;i++){
-dojox.grid.removeNode(this.invalidatePageNode(_97,this.pageNodes[i]));
-}
-},renderPage:function(_99){
-var _9a=[];
-for(var i=0;i<this.colCount;i++){
-_9a[i]=this.pageNodes[i][_99];
-}
-for(var i=0,j=_99*this.rowsPerPage;(i<this.rowsPerPage)&&(j<this.rowCount);i++,j++){
-this.renderRow(j,_9a);
-}
-}});
-}
diff --git a/dojox/grid/compat/_grid/selection.js b/dojox/grid/compat/_grid/selection.js
deleted file mode 100644
index fa636ca..0000000
--- a/dojox/grid/compat/_grid/selection.js
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat._grid.selection"]){
-dojo._hasResource["dojox.grid.compat._grid.selection"]=true;
-dojo.provide("dojox.grid.compat._grid.selection");
-dojo.declare("dojox.grid.selection",null,{constructor:function(_1){
-this.grid=_1;
-this.selected=[];
-},multiSelect:true,selected:null,updating:0,selectedIndex:-1,onCanSelect:function(_2){
-return this.grid.onCanSelect(_2);
-},onCanDeselect:function(_3){
-return this.grid.onCanDeselect(_3);
-},onSelected:function(_4){
-return this.grid.onSelected(_4);
-},onDeselected:function(_5){
-return this.grid.onDeselected(_5);
-},onChanging:function(){
-},onChanged:function(){
-return this.grid.onSelectionChanged();
-},isSelected:function(_6){
-return this.selected[_6];
-},getFirstSelected:function(){
-for(var i=0,l=this.selected.length;i<l;i++){
-if(this.selected[i]){
-return i;
-}
-}
-return -1;
-},getNextSelected:function(_9){
-for(var i=_9+1,l=this.selected.length;i<l;i++){
-if(this.selected[i]){
-return i;
-}
-}
-return -1;
-},getSelected:function(){
-var _c=[];
-for(var i=0,l=this.selected.length;i<l;i++){
-if(this.selected[i]){
-_c.push(i);
-}
-}
-return _c;
-},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(_11){
-this.unselectAll(_11);
-this.addToSelection(_11);
-},addToSelection:function(_12){
-_12=Number(_12);
-if(this.selected[_12]){
-this.selectedIndex=_12;
-}else{
-if(this.onCanSelect(_12)!==false){
-this.selectedIndex=_12;
-this.beginUpdate();
-this.selected[_12]=true;
-this.grid.onSelected(_12);
-this.endUpdate();
-}
-}
-},deselect:function(_13){
-_13=Number(_13);
-if(this.selectedIndex==_13){
-this.selectedIndex=-1;
-}
-if(this.selected[_13]){
-if(this.onCanDeselect(_13)===false){
-return;
-}
-this.beginUpdate();
-delete this.selected[_13];
-this.grid.onDeselected(_13);
-this.endUpdate();
-}
-},setSelected:function(_14,_15){
-this[(_15?"addToSelection":"deselect")](_14);
-},toggleSelect:function(_16){
-this.setSelected(_16,!this.selected[_16]);
-},insert:function(_17){
-this.selected.splice(_17,0,false);
-if(this.selectedIndex>=_17){
-this.selectedIndex++;
-}
-},remove:function(_18){
-this.selected.splice(_18,1);
-if(this.selectedIndex>=_18){
-this.selectedIndex--;
-}
-},unselectAll:function(_19){
-for(var i in this.selected){
-if((i!=_19)&&(this.selected[i]===true)){
-this.deselect(i);
-}
-}
-},shiftSelect:function(_1b,_1c){
-var s=(_1b>=0?_1b:_1c),e=_1c;
-if(s>e){
-e=s;
-s=_1c;
-}
-for(var i=s;i<=e;i++){
-this.addToSelection(i);
-}
-},clickSelect:function(_20,_21,_22){
-this.beginUpdate();
-if(!this.multiSelect){
-this.select(_20);
-}else{
-var _23=this.selectedIndex;
-if(!_21){
-this.unselectAll(_20);
-}
-if(_22){
-this.shiftSelect(_23,_20);
-}else{
-if(_21){
-this.toggleSelect(_20);
-}else{
-this.addToSelection(_20);
-}
-}
-}
-this.endUpdate();
-},clickSelectEvent:function(e){
-this.clickSelect(e.rowIndex,dojo.dnd.getCopyKeyState(e),e.shiftKey);
-},clear:function(){
-this.beginUpdate();
-this.unselectAll();
-this.endUpdate();
-}});
-}
diff --git a/dojox/grid/compat/_grid/soriaGrid.css b/dojox/grid/compat/_grid/soriaGrid.css
deleted file mode 100644
index 96e80d2..0000000
--- a/dojox/grid/compat/_grid/soriaGrid.css
+++ /dev/null
@@ -1,212 +0,0 @@
-.soria .dojoxGrid {
-	position: relative;
-	background-color: #e9e9e9;
-	font-size: 0.85em; 
-	-moz-outline-style: none;
-	outline: none;
-	overflow: hidden;
-	height: 0;
-}
-.soria .dojoxGrid table {
-	padding: 0;
-}
-.soria .dojoxGrid td {
-	-moz-outline: none;
-}
-.soria .dojoxGrid-master-header {
-	position: relative;
-}
-.soria .dojoxGrid-master-view  {
-	position: relative;
-}
-.soria .dojoxGrid-view {
-	position: absolute;
-	overflow: hidden;
-}
-.soria .dojoxGrid-header {
-	position: absolute;
-	overflow: hidden;
-}
-.soria .dojoxGrid-header {
-	background-color:  #e9e9e9;
-}
-.soria .dojoxGrid-header table {
-	text-align: center;
-}
-.soria .dojoxGrid-header .dojoxGrid-cell-content {
-	text-align: center;
-}
-.soria .dojoxGrid-header .dojoxGrid-cell { 
-	border: 1px solid transparent;
-	
-	border-color: white #ACA899 #919191 white;
-	background: url(../../../../dijit/themes/soria/images/titleBar.png) #e9e9e9 repeat-x top;
-	padding-bottom: 2px;
-	color: #000 !important;
-}
-.soria .dojoxGrid-header .dojoxGrid-cell-over {
-	background: url(../../../../dijit/themes/soria/images/titleBarActive.png) #e9e9e9 repeat-x top;
-}
-.soria .dojoxGrid-sort-down {
-	background: url(images/grid_sort_down.gif) right no-repeat;
-	padding-left: 0px;
-	margin-left: 0px;
-}
-.soria .dojoxGrid-sort-up {
-	background: url(images/grid_sort_up.gif) right no-repeat;
-	padding-left: 0px;
-	margin-left: 0px;
-}
-.soria .gridArrowButtonChar {
-	display:none !important;
-}
-.dijit_a11y .gridArrowButtonChar {
-	display:inline !important;
-}
-.soria .dojoxGrid-scrollbox {
-	position: relative;
-	overflow: scroll;
-	background-color: #fefefe;
-	width: 100%;
-}
-.soria .dojoxGrid-content {
-	position: relative;
-	overflow: hidden;
-	 -moz-outline-style: none;
-	outline: none;
-}
-.soria .dojoxGrid-rowbar { 
-	border: none;
-	
-	background: url(images/titleBar.png) #e9e9e9 repeat-y right;
-	border-right: 1px solid #cccccc;
-	padding: 0px;
-}
-.soria .dojoxGrid-rowbar-inner {
-	border: none;
-	border-bottom: 1px solid #cccccc;
-}
-.soria .dojoxGrid-rowbar-over {
-	background: url(images/titleBarActive.png) #e9e9e9 repeat-y right;
-}
-.soria .dojoxGrid-rowbar-selected {
-	background-color: #D9E8F9;
-	background-image: none;
-	background: url(../../../../dijit/themes/soria/images/titleBar.png) #dddddd repeat-x top;
-	border-right: 1px solid #cccccc;
-	background-position: center;
-	background-repeat: no-repeat;
-}
-.soria .dojoxGrid-row {
-	position: relative;
-	width: 9000em;
-}
-.soria .dojoxGrid-row {
-	border: none;
-	border-left: none;
-	border-right: none;
-	background-color: white;
-	border-top: none;
-}
-.soria .dojoxGrid-row-over {
-	border-top-color: #cccccc;
-	border-bottom-color: #cccccc;
-}
-.soria .dojoxGrid-row-over .dojoxGrid-cell {
-	background-color: #60a1ea; 
-	color:#fff;
-}
-.soria .dojoxGrid-row-odd {
-	background-color: #f2f5f9;
-	
-}
-.soria .dojoxGrid-row-selected {
-	background-color: #aec7e3;
-}
-.soria .dojoxGrid-row-table {
-	table-layout: fixed;
-	width: 0;
-	border-collapse: collapse;
-}
-.soria .dojoxGrid-invisible {
-	visibility: hidden;
-}		
-.soria .Xdojo-ie .dojoxGrid-invisible {
-	display: none;
-}		
-.soria .dojoxGrid-invisible td, .dojoxGrid-header .dojoxGrid-invisible td {
-	border-top-width: 0;
-	border-bottom-width: 0;
-	padding-top: 0;
-	padding-bottom: 0;
-	height: 0;
-	overflow: hidden;
-}
-.soria .dojoxGrid-cell {
-	border: 1px dotted #D5CDB5;
-	padding: 3px 3px 3px 3px;
-	text-align: left;
-	overflow: hidden;
-}
-.dj_ie6 .soria .dojoxGrid-cell {
-	border: 1px solid white;
-	border-right: 1px solid #D5CDB5;
-}
-.soria .dojoxGrid-cell-focus {
-	border: 1px dotted #a6a6a6;
-}
-.soria .dojoxGrid-cell-over {
-	border: 1px dotted #a6a6a6;
-}
-.soria .dojoxGrid-cell-focus.dojoxGrid-cell-over {
-	border: 1px dotted #595959;
-}
-.soria .dojoxGrid-cell-clip {
-	width: 100%;
-	overflow: hidden;
-	white-space:nowrap;
-	text-overflow: ellipsis;
-}
-.soria .dojoxGrid-row-editing td {
-	
-	background-color: #60a1ea; 
-	
-}
-.soria .dojoxGrid-row-inserting td {
-	background-color: #F4FFF4;
-}
-.soria .dojoxGrid-row-inflight td {
-	background-color: #F2F7B7;
-}
-.soria .dojoxGrid-row-error td {
-	background-color: #F8B8B6;
-}
-.soria .dojoxGrid-input,
-.soria .dojoxGrid-select,
-.soria .dojoxGrid-textarea {
-	margin: 0;
-	padding: 0px;
-	border-style: none;
-	width: 100%;
-	font-size: 100%;
-	font-family: inherit;
-}
-.dojoxGrid-hidden-focus {
-	position: absolute;
-	left: -1000px;
-	top: -1000px;
-	height: 0px, width: 0px;
-}
-.dijit_a11y .dojoxGrid-rowbar-selected { 
-	border-top: 1px solid white;
-	border-bottom: 1px dashed black;
-	border-top: 0;
-	background: none;
-}
-.dijit_a11y .dojoxGrid-rowbar-selected .dojoxGrid-rowbar-inner {
-	border: 0;
-	border-top: 1px solid white;
-}
-.dijit_a11y .dojoxGrid-row-selected {
-	border-bottom: 1px dashed black;
-}
diff --git a/dojox/grid/compat/_grid/tundraGrid.css b/dojox/grid/compat/_grid/tundraGrid.css
deleted file mode 100644
index 6314778..0000000
--- a/dojox/grid/compat/_grid/tundraGrid.css
+++ /dev/null
@@ -1,215 +0,0 @@
-.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/smallArrowDown.png) right no-repeat;
-	padding-left: 0px;
-	margin-left: 0px;
-}
-.tundra .dojoxGrid-sort-up {
-	background: url(../../../../dijit/themes/tundra/images/smallArrowUp.png) right no-repeat;
-	padding-left: 0px;
-	margin-left: 0px;
-}
-.tundra .gridArrowButtonChar {
-	display:none !important;
-}
-.dijit_a11y .gridArrowButtonChar {
-	display:inline !important;
-}
-.tundra .dojoxGrid-scrollbox {
-	position: relative;
-	overflow: scroll;
-	background-color: #fefefe;
-	width: 100%;
-}
-.tundra .dojoxGrid-content {
-	position: relative;
-	overflow: hidden;
-	 -moz-outline-style: none;
-	outline: none;
-}
-.tundra .dojoxGrid-rowbar { 
-	border: none;
-	
-	background: url(images/tabEnabled_rotated.png) #e9e9e9 repeat-y right;
-	border-right: 1px solid #cccccc;
-	padding: 0px;
-}
-.tundra .dojoxGrid-rowbar-inner {
-	border: none;
-	border-bottom: 1px solid #cccccc;
-}
-.tundra .dojoxGrid-rowbar-over {
-	background: url(images/tabHover_rotated.png) #e9e9e9 repeat-y right;
-}
-.tundra .dojoxGrid-rowbar-selected {
-	background-color: #D9E8F9;
-	background-image: none;
-	background: url(../../../../dijit/themes/tundra/images/tabDisabled.png) #dddddd repeat-x top;
-	border-right: 1px solid #cccccc;
-	background-position: center;
-	background-repeat: no-repeat;
-}
-.tundra .dojoxGrid-row {
-	position: relative;
-	width: 9000em;
-}
-.tundra .dojoxGrid-row {
-	border: none;
-	border-left: none;
-	border-right: none;
-	background-color: white;
-	border-top: none;
-}
-.tundra .dojoxGrid-row-over {
-	border-top-color: #cccccc;
-	border-bottom-color: #cccccc;
-}
-.tundra .dojoxGrid-row-over .dojoxGrid-cell {
-	background-color: #60a1ea; 
-	color:#fff;
-	
-}
-.tundra .dojoxGrid-row-odd {
-	background-color: #f2f5f9;
-	
-}
-.tundra .dojoxGrid-row-selected {
-	background-color: #aec7e3;
-	
-}
-.tundra .dojoxGrid-row-table {
-	table-layout: fixed;
-	width: 0;
-	border-collapse: collapse;
-}
-.tundra .dojoxGrid-invisible {
-	visibility: hidden;
-}		
-.tundra .Xdojo-ie .dojoxGrid-invisible {
-	display: none;
-}		
-.tundra .dojoxGrid-invisible td, .dojoxGrid-header .dojoxGrid-invisible td {
-	border-top-width: 0;
-	border-bottom-width: 0;
-	padding-top: 0;
-	padding-bottom: 0;
-	height: 0;
-	overflow: hidden;
-}
-.tundra .dojoxGrid-cell {
-	border: 1px dotted #D5CDB5;
-	padding: 3px 3px 3px 3px;
-	text-align: left;
-	overflow: hidden;
-}
-.dj_ie6 .tundra .dojoxGrid-cell {
-	border: 1px solid white;
-	border-right: 1px solid #D5CDB5;
-}
-.tundra .dojoxGrid-cell-focus {
-	border: 1px dotted #a6a6a6;
-}
-.tundra .dojoxGrid-cell-over {
-	border: 1px dotted #a6a6a6;
-}
-.tundra .dojoxGrid-cell-focus.dojoxGrid-cell-over {
-	border: 1px dotted #595959;
-}
-.tundra .dojoxGrid-cell-clip {
-	width: 100%;
-	overflow: hidden;
-	white-space:nowrap;
-	text-overflow: ellipsis;
-}
-.tundra .dojoxGrid-row-editing td {
-	
-	background-color: #60a1ea; 
-	
-}
-.tundra .dojoxGrid-row-inserting td {
-	background-color: #F4FFF4;
-}
-.tundra .dojoxGrid-row-inflight td {
-	background-color: #F2F7B7;
-}
-.tundra .dojoxGrid-row-error td {
-	background-color: #F8B8B6;
-}
-.tundra .dojoxGrid-input,
-.tundra .dojoxGrid-select,
-.tundra .dojoxGrid-textarea {
-	margin: 0;
-	padding: 0px;
-	border-style: none;
-	width: 100%;
-	font-size: 100%;
-	font-family: inherit;
-}
-.dojoxGrid-hidden-focus {
-	position: absolute;
-	left: -1000px;
-	top: -1000px;
-	height: 0px, width: 0px;
-}
-.dijit_a11y .dojoxGrid-rowbar-selected { 
-	border-top: 1px solid white;
-	border-bottom: 1px dashed black;
-	border-top: 0;
-	background: none;
-}
-.dijit_a11y .dojoxGrid-rowbar-selected .dojoxGrid-rowbar-inner {
-	border: 0;
-	border-top: 1px solid white;
-}
-.dijit_a11y .dojoxGrid-row-selected {
-	border-bottom: 1px dashed black;
-}
diff --git a/dojox/grid/compat/_grid/view.js b/dojox/grid/compat/_grid/view.js
deleted file mode 100644
index 6e60837..0000000
--- a/dojox/grid/compat/_grid/view.js
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat._grid.view"]){
-dojo._hasResource["dojox.grid.compat._grid.view"]=true;
-dojo.provide("dojox.grid.compat._grid.view");
-dojo.require("dijit._Widget");
-dojo.require("dijit._Templated");
-dojo.require("dojox.grid.compat._grid.builder");
-dojo.declare("dojox.GridView",[dijit._Widget,dijit._Templated],{defaultWidth:"18em",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\"  [...]
-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);
-if(!dojo._isBodyLtr()){
-this.headerNodeContainer.style.width="";
-}
-},destroy:function(){
-dojox.grid.removeNode(this.headerNode);
-this.inherited("destroy",arguments);
-},focus:function(){
-if(dojo.isWebKit||dojo.isOpera){
-this.hiddenFocusNode.focus();
-}else{
-this.scrollboxNode.focus();
-}
-},setStructure:function(_1){
-var vs=(this.structure=_1);
-if(vs.width&&!isNaN(vs.width)){
-this.viewWidth=vs.width+"em";
-}else{
-this.viewWidth=vs.width||this.viewWidth;
-}
-this.onBeforeRow=vs.onBeforeRow;
-this.noscroll=vs.noscroll;
-if(this.noscroll){
-this.scrollboxNode.style.overflow="hidden";
-}
-this.testFlexCells();
-this.updateStructure();
-},testFlexCells:function(){
-this.flexCells=false;
-for(var j=0,_4;(_4=this.structure.rows[j]);j++){
-for(var i=0,_6;(_6=_4[i]);i++){
-_6.view=this;
-this.flexCells=this.flexCells||_6.isFlex();
-}
-}
-return this.flexCells;
-},updateStructure:function(){
-this.header.update();
-this.content.update();
-},getScrollbarWidth:function(){
-return (this.noscroll?0:dojox.grid.getScrollbarWidth());
-},getColumnsWidth:function(){
-return this.headerContentNode.firstChild.offsetWidth;
-},getWidth:function(){
-return this.viewWidth||(this.getColumnsWidth()+this.getScrollbarWidth())+"px";
-},getContentWidth:function(){
-return Math.max(0,dojo._getContentBox(this.domNode).w-this.getScrollbarWidth())+"px";
-},render:function(){
-this.scrollboxNode.style.height="";
-this.renderHeader();
-},renderHeader:function(){
-this.headerContentNode.innerHTML=this.header.generateHtml(this._getHeaderContent);
-},_getHeaderContent:function(_7){
-var n=_7.name||_7.grid.getCellName(_7);
-if(_7.index!=_7.grid.getSortIndex()){
-return n;
-}
-return ["<div class=\"",_7.grid.sortInfo>0?"dojoxGrid-sort-down":"dojoxGrid-sort-up","\"><div class=\"gridArrowButtonChar\">",_7.grid.sortInfo>0?"▼":"▲","</div>",n,"</div>"].join("");
-},resize:function(){
-this.adaptHeight();
-this.adaptWidth();
-},hasScrollbar:function(){
-return (this.scrollboxNode.clientHeight!=this.scrollboxNode.offsetHeight);
-},adaptHeight:function(){
-if(!this.grid.autoHeight){
-var h=this.domNode.clientHeight;
-if(!this.hasScrollbar()){
-h-=dojox.grid.getScrollbarWidth();
-}
-dojox.grid.setStyleHeightPx(this.scrollboxNode,h);
-}
-},adaptWidth:function(){
-if(this.flexCells){
-this.contentWidth=this.getContentWidth();
-this.headerContentNode.firstChild.style.width=this.contentWidth;
-}
-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(_d,_e){
-var _f=this.createRowNode(_d);
-this.buildRow(_d,_f,_e);
-this.grid.edit.restore(this,_d);
-return _f;
-},createRowNode:function(_10){
-var _11=document.createElement("div");
-_11.className=this.classTag+"-row";
-_11[dojox.grid.gridViewTag]=this.id;
-_11[dojox.grid.rowIndexTag]=_10;
-this.rowNodes[_10]=_11;
-return _11;
-},buildRow:function(_12,_13){
-this.buildRowContent(_12,_13);
-this.styleRow(_12,_13);
-},buildRowContent:function(_14,_15){
-_15.innerHTML=this.content.generateHtml(_14,_14);
-if(this.flexCells){
-_15.firstChild.style.width=this.contentWidth;
-}
-},rowRemoved:function(_16){
-this.grid.edit.save(this,_16);
-delete this.rowNodes[_16];
-},getRowNode:function(_17){
-return this.rowNodes[_17];
-},getCellNode:function(_18,_19){
-var row=this.getRowNode(_18);
-if(row){
-return this.content.getCellNode(row,_19);
-}
-},styleRow:function(_1b,_1c){
-_1c._style=dojox.grid.getStyleText(_1c);
-this.styleRowNode(_1b,_1c);
-},styleRowNode:function(_1d,_1e){
-if(_1e){
-this.doStyleRowNode(_1d,_1e);
-}
-},doStyleRowNode:function(_1f,_20){
-this.grid.styleRowNode(_1f,_20);
-},updateRow:function(_21,_22,_23){
-var _24=this.getRowNode(_21);
-if(_24){
-_24.style.height="";
-this.buildRow(_21,_24);
-}
-return _24;
-},updateRowStyles:function(_25){
-this.styleRowNode(_25,this.getRowNode(_25));
-},lastTop:0,firstScroll:0,doscroll:function(_26){
-var _27=dojo._isBodyLtr();
-if(this.firstScroll<2){
-if((!_27&&this.firstScroll==1)||(_27&&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){
-this.headerNodeContainer.style.width=s.w-this.getScrollbarWidth()+"px";
-if(_27){
-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;
-var top=this.scrollboxNode.scrollTop;
-if(top!=this.lastTop){
-this.grid.scrollTo(top);
-}
-},setScrollTop:function(_2a){
-this.lastTop=_2a;
-this.scrollboxNode.scrollTop=_2a;
-return this.scrollboxNode.scrollTop;
-},doContentEvent:function(e){
-if(this.content.decorateEvent(e)){
-this.grid.onContentEvent(e);
-}
-},doHeaderEvent:function(e){
-if(this.header.decorateEvent(e)){
-this.grid.onHeaderEvent(e);
-}
-},dispatchContentEvent:function(e){
-return this.content.dispatchEvent(e);
-},dispatchHeaderEvent:function(e){
-return this.header.dispatchEvent(e);
-},setColWidth:function(_2f,_30){
-this.grid.setCellWidth(_2f,_30+"px");
-},update:function(){
-var _31=this.scrollboxNode.scrollLeft;
-this.content.update();
-this.grid.update();
-this.scrollboxNode.scrollLeft=_31;
-this.headerNode.scrollLeft=_31;
-}});
-}
diff --git a/dojox/grid/compat/_grid/views.js b/dojox/grid/compat/_grid/views.js
deleted file mode 100644
index 0049187..0000000
--- a/dojox/grid/compat/_grid/views.js
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.grid.compat._grid.views"]){
-dojo._hasResource["dojox.grid.compat._grid.views"]=true;
-dojo.provide("dojox.grid.compat._grid.views");
-dojo.declare("dojox.grid.views",null,{constructor:function(_1){
-this.grid=_1;
-},defaultWidth:200,views:[],resize:function(){
-this.onEach("resize");
-},render:function(){
-this.onEach("render");
-},addView:function(_2){
-_2.idx=this.views.length;
-this.views.push(_2);
-},destroyViews:function(){
-for(var i=0,v;v=this.views[i];i++){
-v.destroy();
-}
-this.views=[];
-},getContentNodes:function(){
-var _5=[];
-for(var i=0,v;v=this.views[i];i++){
-_5.push(v.contentNode);
-}
-return _5;
-},forEach:function(_8){
-for(var i=0,v;v=this.views[i];i++){
-_8(v,i);
-}
-},onEach:function(_b,_c){
-_c=_c||[];
-for(var i=0,v;v=this.views[i];i++){
-if(_b in v){
-v[_b].apply(v,_c);
-}
-}
-},normalizeHeaderNodeHeight:function(){
-var _f=[];
-for(var i=0,v;(v=this.views[i]);i++){
-if(v.headerContentNode.firstChild){
-_f.push(v.headerContentNode);
-}
-}
-this.normalizeRowNodeHeights(_f);
-},normalizeRowNodeHeights:function(_12){
-var h=0;
-for(var i=0,n,o;(n=_12[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=_12[i]);i++){
-if(n.firstChild.clientHeight!=h){
-n.firstChild.style.height=hpx;
-}
-}
-if(_12&&_12[0]){
-_12[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(_1b){
-var _1c=[];
-for(var i=0,v,n;(v=this.views[i])&&(n=v.getRowNode(_1b));i++){
-n.firstChild.style.height="";
-_1c.push(n);
-}
-this.normalizeRowNodeHeights(_1c);
-},getViewWidth:function(_20){
-return this.views[_20].getWidth()||this.defaultWidth;
-},measureHeader:function(){
-this.resetHeaderNodeHeight();
-this.forEach(function(_21){
-_21.headerContentNode.style.height="";
-});
-var h=0;
-this.forEach(function(_23){
-h=Math.max(_23.headerNode.offsetHeight,h);
-});
-return h;
-},measureContent:function(){
-var h=0;
-this.forEach(function(_25){
-h=Math.max(_25.domNode.offsetHeight,h);
-});
-return h;
-},findClient:function(_26){
-var c=this.grid.elasticView||-1;
-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;
-}
-}
-}
-if(c<0){
-c=Math.floor(this.views.length/2);
-}
-return c;
-},arrange:function(l,w){
-var i,v,vw,len=this.views.length;
-var c=(w<=0?len:this.findClient());
-var _31=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(i=0;(v=this.views[i])&&(i<c);i++){
-vw=this.getViewWidth(i);
-v.setSize(vw,0);
-_31(v,l);
-vw=v.domNode.offsetWidth;
-l+=vw;
-}
-i++;
-var r=w;
-for(var j=len-1;(v=this.views[j])&&(i<=j);j--){
-vw=this.getViewWidth(j);
-v.setSize(vw,0);
-vw=v.domNode.offsetWidth;
-r-=vw;
-_31(v,r);
-}
-if(c<len){
-v=this.views[c];
-vw=Math.max(1,r-l);
-v.setSize(vw+"px",0);
-_31(v,l);
-}
-return l;
-},renderRow:function(_36,_37){
-var _38=[];
-for(var i=0,v,n,_3c;(v=this.views[i])&&(n=_37[i]);i++){
-_3c=v.renderRow(_36);
-n.appendChild(_3c);
-_38.push(_3c);
-}
-this.normalizeRowNodeHeights(_38);
-},rowRemoved:function(_3d){
-this.onEach("rowRemoved",[_3d]);
-},updateRow:function(_3e,_3f){
-for(var i=0,v;v=this.views[i];i++){
-v.updateRow(_3e,_3f);
-}
-this.renormalizeRow(_3e);
-},updateRowStyles:function(_42){
-this.onEach("updateRowStyles",[_42]);
-},setScrollTop:function(_43){
-var top=_43;
-for(var i=0,v;v=this.views[i];i++){
-top=v.setScrollTop(_43);
-}
-return top;
-},getFirstScrollingView:function(){
-for(var i=0,v;(v=this.views[i]);i++){
-if(v.hasScrollbar()){
-return v;
-}
-}
-}});
-}
diff --git a/dojox/grid/compat/resources/GridView.html b/dojox/grid/compat/resources/GridView.html
deleted file mode 100644
index d86782d..0000000
--- a/dojox/grid/compat/resources/GridView.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<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
diff --git a/dojox/grid/compat/resources/VirtualGrid.html b/dojox/grid/compat/resources/VirtualGrid.html
deleted file mode 100644
index 7253108..0000000
--- a/dojox/grid/compat/resources/VirtualGrid.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<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>
diff --git a/dojox/grid/compat/tests/databaseModel.js b/dojox/grid/compat/tests/databaseModel.js
deleted file mode 100644
index 6f92b52..0000000
--- a/dojox/grid/compat/tests/databaseModel.js
+++ /dev/null
@@ -1,337 +0,0 @@
-if(!dojo._hasResource["dojox.grid.compat.tests.databaseModel"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojox.grid.compat.tests.databaseModel"] = true;
-dojo.provide("dojox.grid.compat.tests.databaseModel");
-dojo.require("dojox.grid.compat._data.model");
-
-// Provides a sparse array that is also traversable inorder 
-// with basic Array:
-//   - iterating by index is slow for large sparse arrays
-//   - for...in iteration is in order of element creation 
-// maintains a secondary index for interating
-// over sparse elements inorder
-dojo.declare("dojox.grid.Sparse", null, {
-	constructor: function() {
-		this.clear();
-	},
-	clear: function() {
-		this.indices = [];
-		this.values = [];
-	},
-	length: function() {
-		return this.indices.length;
-	},
-	set: function(inIndex, inValue) {
-		for (var i=0,l=this.indices.length; i<l; i++) {
-			if (this.indices[i] >= inIndex) 
-				break;
-		}
-		if (this.indices[i] != inIndex) 
-			this.indices.splice(i, 0, inIndex);
-		this.values[inIndex] = inValue;
-	},
-	get: function(inIndex) {
-		return this.values[inIndex];
-	},
-	remove: function(inIndex) {
-		for (var i=0,l=this.indices.length; i<l; i++) 
-			if (this.indices[i] == inIndex) {
-				this.indices.splice(i, 1);
-				break;
-			}
-		delete this.values[inIndex];
-	},
-	inorder: function(inFor) {
-		for (var i=0,l=this.indices.length, ix; i<l; i++) {
-			ix = this.indices[i];
-			if (inFor(this.values[ix], ix) === false)
-				break;
-		}
-	}
-});
-
-// sample custom model implementation that works with mysql server.
-dojo.declare("dojox.grid.data.DbTable", dojox.grid.data.Dynamic, {
-	delayedInsertCommit: true,
-	constructor: function(inFields, inData, inServer, inDatabase, inTable) {
-		this.server = inServer;
-		this.database = inDatabase;
-		this.table = inTable;
-		this.stateNames = ['inflight', 'inserting', 'removing', 'error'];
-		this.clearStates();
-		this.clearSort();
-	},
-	clearData: function() {
-		this.cache = [ ];
-		this.clearStates();
-		this.inherited(arguments);
-	},
-	clearStates: function() {
-		this.states = {};
-		for (var i=0, s; (s=this.stateNames[i]); i++) {
-			delete this.states[s];
-			this.states[s] = new dojox.grid.Sparse();
-		}
-	},
-	// row state information
-	getState: function(inRowIndex) {
-		for (var i=0, r={}, s; (s=this.stateNames[i]); i++)
-			r[s] = this.states[s].get(inRowIndex);
-		return r;
-	},
-	setState: function(inRowIndex, inState, inValue) {
-		this.states[inState].set(inRowIndex, inValue||true);
-	},
-	clearState: function(inRowIndex, inState) {
-		if (arguments.length == 1) {
-			for (var i=0, s; (s=this.stateNames[i]); i++)
-				this.states[s].remove(inRowIndex);
-		}	else {
-			for (var i=1, l=arguments.length, arg; (i<l) &&((arg=arguments[i])!=undefined); i++)
-				this.states[arg].remove(inRowIndex);
-		}
-	},
-	setStateForIndexes: function(inRowIndexes, inState, inValue) {
-		for (var i=inRowIndexes.length-1, k; (i>=0) && ((k=inRowIndexes[i])!=undefined); i--)
-			this.setState(k, inState, inValue);
-	},
-	clearStateForIndexes: function(inRowIndexes, inState) {
-		for (var i=inRowIndexes.length-1, k; (i>=0) && ((k=inRowIndexes[i])!=undefined); i--)
-			this.clearState(k, inState);
-	},
-	//$ Return boolean stating whether or not an operation is in progress that may change row indexing.
-	isAddRemoving: function() {
-		return Boolean(this.states['inserting'].length() || this.states['removing'].length());
-	},
-	isInflight: function() {
-		return Boolean(this.states['inflight'].length());
-	},
-	//$ Return boolean stating if the model is currently undergoing any type of edit.
-	isEditing: function() {
-		for (var i=0, r={}, s; (s=this.stateNames[i]); i++)
-			if (this.states[s].length())
-				return true;
-	},
-	//$ Return true if ok to modify the given row. Override as needed, using model editing state information.
-	canModify: function(inRowIndex) {
-		return !this.getState(inRowIndex).inflight && !(this.isInflight() && this.isAddRemoving());
-	},
-	// server send / receive
-	getSendParams: function(inParams) {
-		var p = {
-			database: this.database || '',
-			table: this.table || ''
-		}
-		return dojo.mixin(p, inParams || {});
-	},
-	send: function(inAsync, inParams, inCallbacks) {
-		//console.log('send', inParams.command);
-		var p = this.getSendParams(inParams);
-		var d = dojo.xhrPost({
-			url: this.server,
-			content: p,
-			handleAs: 'json-comment-filtered',
-			contentType: "application/x-www-form-urlencoded; charset=utf-8",
-			sync: !inAsync
-		});
-		d.addCallbacks(dojo.hitch(this, "receive", inCallbacks), dojo.hitch(this, "receiveError", inCallbacks));
-		return d;
-	},
-	_callback: function(cb, eb, data) {
-		try{ cb && cb(data); } 
-		catch(e){ eb && eb(data, e); }
-	},
-	receive: function(inCallbacks, inData) {
-		inCallbacks && this._callback(inCallbacks.callback, inCallbacks.errback, inData);
-	},
-	receiveError: function(inCallbacks, inErr) {
-		this._callback(inCallbacks.errback, null, inErr)
-	},
-	encodeRow: function(inParams, inRow, inPrefix) {
-		for (var i=0, l=inRow.length; i < l; i++)
-			inParams['_' + (inPrefix ? inPrefix : '') + i] = (inRow[i] ? inRow[i] : '');
-	},
-	measure: function() {
-		this.send(true, { command: 'info' }, { callback: dojo.hitch(this, this.callbacks.info) });
-	},
-	fetchRowCount: function(inCallbacks) {
-		this.send(true, { command: 'count' }, inCallbacks);
-	},
-	// server commits
-	commitEdit: function(inOldData, inNewData, inRowIndex, inCallbacks) {
-		this.setState(inRowIndex, "inflight", true);
-		var params = {command: 'update'};
-		this.encodeRow(params, inOldData, 'o');
-		this.encodeRow(params, inNewData);
-		this.send(true, params, inCallbacks);
-	},
-	commitInsert: function(inRowIndex, inNewData, inCallbacks) {
-		this.setState(inRowIndex, "inflight", true);
-		var params = {command: 'insert'};
-		this.encodeRow(params, inNewData);
-		this.send(true, params, inCallbacks);
-	},
-	// NOTE: supported only in tables with pk
-	commitDelete: function(inRows, inCallbacks) {
-		var params = { 
-			command: 'delete',
-			count: inRows.length
-		}	
-		var pk = this.getPkIndex();
-		if (pk < 0)
-			return;
-		for (var i=0; i < inRows.length; i++)	{
-			params['_' + i] = inRows[i][pk];
-		}	
-		this.send(true, params, inCallbacks);
-	},
-	getUpdateCallbacks: function(inRowIndex) {
-		return {
-			callback: dojo.hitch(this, this.callbacks.update, inRowIndex), 
-			errback: dojo.hitch(this, this.callbacks.updateError, inRowIndex)
-		};
-	},
-	// primary key from fields
-	getPkIndex: function() {
-		for (var i=0, l=this.fields.count(), f; (i<l) && (f=this.fields.get(i)); i++)
-			if (f.Key = 'PRI')
-				return i;
-		return -1;		
-	},
-	// model implementations
-	update: function(inOldData, inNewData, inRowIndex) {
-		var cbs = this.getUpdateCallbacks(inRowIndex);
-		if (this.getState(inRowIndex).inserting)
-			this.commitInsert(inRowIndex, inNewData, cbs);
-		else
-			this.commitEdit(this.cache[inRowIndex] || inOldData, inNewData, inRowIndex, cbs);
-		// set push data immediately to model	so reflectd while committing
-		this.setRow(inNewData, inRowIndex);
-	},
-	insert: function(inData, inRowIndex) {
-		this.setState(inRowIndex, 'inserting', true);
-		if (!this.delayedInsertCommit)
-			this.commitInsert(inRowIndex, inData, this.getUpdateCallbacks(inRowIndex));
-		return this.inherited(arguments);
-	},
-	remove: function(inRowIndexes) {
-		var rows = [];
-		for (var i=0, r=0, indexes=[]; (r=inRowIndexes[i]) !== undefined; i++)
-			if (!this.getState(r).inserting) {
-				rows.push(this.getRow(r));
-				indexes.push(r);
-				this.setState(r, 'removing');
-			}
-		var cbs = {
-			callback: dojo.hitch(this, this.callbacks.remove, indexes),
-			errback: dojo.hitch(this, this.callbacks.removeError, indexes)
-		};
-		this.commitDelete(rows, cbs);
-		dojox.grid.data.Dynamic.prototype.remove.apply(this, arguments);
-	},
-	cancelModifyRow: function(inRowIndex) {
-		if (this.isDelayedInsert(inRowIndex)) {
-			this.removeInsert(inRowIndex);
-		} else
-			this.finishUpdate(inRowIndex);
-	},	
-	finishUpdate: function(inRowIndex, inData) {
-		this.clearState(inRowIndex);
-		var d = (inData&&inData[0]) || this.cache[inRowIndex];
-		if (d)
-			this.setRow(d, inRowIndex);
-		delete this.cache[inRowIndex];
-	},
-	isDelayedInsert: function(inRowIndex) {
-		return (this.delayedInsertCommit && this.getState(inRowIndex).inserting);
-	},
-	removeInsert: function(inRowIndex) {
-		this.clearState(inRowIndex);
-		dojox.grid.data.Dynamic.prototype.remove.call(this, [inRowIndex]);
-	},
-	// request data 
-	requestRows: function(inRowIndex, inCount)	{
-		var params = { 
-			command: 'select',
-			orderby: this.sortField, 
-			desc: (this.sortDesc ? "true" : ''),
-			offset: inRowIndex, 
-			limit: inCount
-		}
-		this.send(true, params, {callback: dojo.hitch(this, this.callbacks.rows, inRowIndex)});
-	},
-	// sorting
-	canSort: function () { 
-		return true; 
-	},
-	setSort: function(inSortIndex) {
-		this.sortField = this.fields.get(Math.abs(inSortIndex) - 1).name || inSortIndex;
-		this.sortDesc = (inSortIndex < 0);
-	},
-	sort: function(inSortIndex) {
-		this.setSort(inSortIndex);
-		this.clearData();
-	},
-	clearSort: function(){
-		this.sortField = '';
-		this.sortDesc = false;
-	},
-	endModifyRow: function(inRowIndex){
-		var cache = this.cache[inRowIndex];
-		var m = false;
-		if(cache){
-			var data = this.getRow(inRowIndex);
-			if(!dojox.grid.arrayCompare(cache, data)){
-				m = true;
-				this.update(cache, data, inRowIndex);
-			}	
-		}
-		if (!m)
-			this.cancelModifyRow(inRowIndex);
-	},
-	// server callbacks (called with this == model)
-	callbacks: {
-		update: function(inRowIndex, inData) {
-			console.log('received update', arguments);
-			if (inData.error)
-				this.updateError(inData)
-			else
-				this.finishUpdate(inRowIndex, inData);
-		},
-		updateError: function(inRowIndex) {
-			this.clearState(inRowIndex, 'inflight');
-			this.setState(inRowIndex, "error", "update failed: " + inRowIndex);
-			this.rowChange(this.getRow(inRowIndex), inRowIndex);
-		},
-		remove: function(inRowIndexes) {
-			this.clearStateForIndexes(inRowIndexes);
-		},
-		removeError: function(inRowIndexes) {
-			this.clearStateForIndexes(inRowIndexes);
-			alert('Removal error. Please refresh.');
-		},
-		rows: function(inRowIndex, inData) {
-			//this.beginUpdate();
-			for (var i=0, l=inData.length; i<l; i++)
-				this.setRow(inData[i], inRowIndex + i);
-			//this.endUpdate();
-			//this.allChange();
-		},
-		count: function(inRowCount) {
-			this.count = Number(inRowCount);
-			this.clearData();
-		},
-		info: function(inInfo) {
-			this.fields.clear();
-			for (var i=0, c; (c=inInfo.columns[i]); i++) {
-				c.name = c.Field;
-				this.fields.set(i, c);
-			}
-			this.table = inInfo.table;
-			this.database = inInfo.database;
-			this.notify("MetaData", arguments);
-			this.callbacks.count.call(this, inInfo.count);
-		}
-	}
-});
-
-}
diff --git a/dojox/grid/compat/tests/images/closed.gif b/dojox/grid/compat/tests/images/closed.gif
deleted file mode 100644
index 7d3afa4..0000000
Binary files a/dojox/grid/compat/tests/images/closed.gif and /dev/null differ
diff --git a/dojox/grid/compat/tests/images/flatScreen.gif b/dojox/grid/compat/tests/images/flatScreen.gif
deleted file mode 100644
index 05edd72..0000000
Binary files a/dojox/grid/compat/tests/images/flatScreen.gif and /dev/null differ
diff --git a/dojox/grid/compat/tests/images/open.gif b/dojox/grid/compat/tests/images/open.gif
deleted file mode 100644
index 37efd2c..0000000
Binary files a/dojox/grid/compat/tests/images/open.gif and /dev/null differ
diff --git a/dojox/grid/compat/tests/support/books.xml b/dojox/grid/compat/tests/support/books.xml
deleted file mode 100644
index 4c330e6..0000000
--- a/dojox/grid/compat/tests/support/books.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<books>
-	<book>
-		<isbn>1</isbn>
-		<title>Title of 1</title>
-		<author>Author of 1</author>
-	</book>
-	<book>
-		<isbn>2</isbn>
-		<title>Title of 2</title>
-		<author>Author of 2</author>
-	</book>
-	<book>
-		<isbn>3</isbn>
-		<title>Title of 3</title>
-		<author>Author of 3</author>
-	</book>
-	<book>
-		<isbn>4</isbn>
-		<title>Title of 4</title>
-		<author>Author of 4</author>
-	</book>
-	<book>
-		<isbn>5</isbn>
-		<title>Title of 5</title>
-		<author>Author of 5</author>
-	</book>
-	<book>
-		<isbn>6</isbn>
-		<title>Title of 6</title>
-		<author>Author of 6</author>
-	</book>
-	<book>
-		<isbn>7</isbn>
-		<title>Title of 7</title>
-		<author>Author of 7</author>
-	</book>
-	<book>
-		<isbn>8</isbn>
-		<title>Title of 8</title>
-		<author>Author of 8</author>
-	</book>
-	<book>
-		<isbn>9</isbn>
-		<title>Title of 9</title>
-		<author>Author of 9</author>
-	</book>
-	<book>
-		<isbn>10</isbn>
-		<title>Title of 10</title>
-		<author>Author of 10</author>
-	</book>
-	<book>
-		<isbn>11</isbn>
-		<title>Title of 11</title>
-		<author>Author of 11</author>
-	</book>
-	<book>
-		<isbn>12</isbn>
-		<title>Title of 12</title>
-		<author>Author of 12</author>
-	</book>
-	<book>
-		<isbn>13</isbn>
-		<title>Title of 13</title>
-		<author>Author of 13</author>
-	</book>
-	<book>
-		<isbn>14</isbn>
-		<title>Title of 14</title>
-		<author>Author of 14</author>
-	</book>
-	<book>
-		<isbn>15</isbn>
-		<title>Title of 15</title>
-		<author>Author of 15</author>
-	</book>
-	<book>
-		<isbn>16</isbn>
-		<title>Title of 16</title>
-		<author>Author of 16</author>
-	</book>
-	<book>
-		<isbn>17</isbn>
-		<title>Title of 17</title>
-		<author>Author of 17</author>
-	</book>
-	<book>
-		<isbn>18</isbn>
-		<title>Title of 18</title>
-		<author>Author of 18</author>
-	</book>
-	<book>
-		<isbn>19</isbn>
-		<title>Title of 19</title>
-		<author>Author of 19</author>
-	</book>
-	<book>
-		<isbn>20</isbn>
-		<title>Title of 20</title>
-		<author>Author of 20</author>
-	</book>
-</books>
diff --git a/dojox/grid/compat/tests/support/data.php b/dojox/grid/compat/tests/support/data.php
deleted file mode 100644
index 1beb6f0..0000000
--- a/dojox/grid/compat/tests/support/data.php
+++ /dev/null
@@ -1,379 +0,0 @@
-<?php
-	// db settings
-	$dbserver = 'localhost';
-	$dbuser = 'root';
-	$dbpassword = 'root';
-	
-	error_reporting(E_ALL);
-	
-	/*
-		Simple protocol:
-			- Inputs via POST variables. 
-			- Output is a string that can be evaluated into a JSON
-			  First element of the array contains return status.
-				
-		This simplified tutorial code should not be deployed without a security review.
-	*/
-	
-	@include "json.php";
-	
-	// set up response encoding 
-	header("Content-Type: text/html; charset=utf-8");
-
-	// util
-	function getPostString($inName) {
-		// make sure input strings are 'clean'
-		return mysql_real_escape_string(@$_POST[$inName]);
-	}
-		
-	// used for json encoding
-	$json = new Services_JSON();
-	
-	function echoJson($inData) {
-		global $json;
-		// delay in ms
-		$delay = getPostString('delay');
-		if (!empty($delay))
-			usleep($delay * 1000);
-		echo '/* ' . $json->encode($inData) . ' */';
-	}
-	
-	function error($inMessage) {
-		$inMessage = str_replace('"', '\\"', $inMessage);
-		error_log($inMessage);
-		//echo '/* ({error: true, message: "' . $inMessage . '"}) */';
-		echoJson(array('error' => true, 'message' => $inMessage));
-		exit;
-	}
-
-
-	function getArray($inResult, $inArray="true") {
-		$o = Array();
-		while ($row = ($inArray ? mysql_fetch_row($inResult) : mysql_fetch_object($inResult)))
-			$o[] = $row;
-		return $o;	
-	}
-	
-	// connect to DB
-	mysql_connect($dbserver, $dbuser, $dbpassword);
-
-	// select DB
-	$database = getPostString("database");
-	$database = ($database ? $database : $db);
-	if (!mysql_select_db($database))
-		error('failed to select db: ' . mysql_error());
-
-	// select table
-	$table = getPostString("table");
-	$table = ($table ? $table : $dbtable);
-
-	// cache
-	$colCache = NULL;
-	$pkCache = NULL;
-
-	// set UTF8 output (MySql > 4.0)
-	mysql_query("SET NAMES UTF8");
-	
-	// server, database, table meta data
-	function getDatabases() {
-		$result = mysql_query("SHOW DATABASES");
-		$output = Array();
-		while ($row = mysql_fetch_row($result)) {
-			$r = strtolower($row[0]);
-			if ($r != 'mysql' && $r != 'information_schema')
-				$output[] = $row[0];
-		}	
-		return $output;	
-	}
-	
-	function getTables() {
-		global $database;
-		$result = mysql_query("SHOW TABLES FROM $database");
-		$output = Array();
-		while ($row = mysql_fetch_row($result))
-			$output[] = $row[0];
-		return $output;	
-	}
-	
-	function getColumns() {
-		global $table, $colCache;
-		if (!$colCache) {
-			$result = mysql_query("SHOW COLUMNS FROM `$table`");
-			return getArray($result, false);
-			$colCache = getArray($result, false);
-		}
-		return $colCache;	
-	}
-	
-	// returns object: $this->name, $this->index
-	function getPk() {
-		global $pkCache;
-		if (!$pkCache) {
-			$k = '';
-			$columns = getColumns();
-			for ($i=0; $i < count($columns); $i++) {
-				$c = $columns[$i];
-				if ($c->Key == 'PRI') {
-					$k = $c->Field;
-					break;
-				}	
-			}
-			$pkCache->index = $i;
-			$pkCache->name = $k;
-		}	
-		return $pkCache;
-	}
-	
-	function getTableInfo() {
-		global $table, $database;
-		$c = getColumns();
-		$r = rowcount();
-		return array("count" => $r, "columns" => $c, "database" => $database, "table" => $table);
-	}
-	
-	function getOldPostPkValue() {
-		$pk = getPk();
-		return getPostString('_o' . $pk->index);
-	}
-	
-	function getNewPostPkValue() {
-		$pk = getPk();
-		return getPostString('_' . $pk->index);
-	}
-	
-	function getPostColumns() {
-		$columns = getColumns();
-		for ($i=0, $a=array(), $p; (($p=getPostString("_".$i)) != ''); $i++) {
-			$r = new stdClass();
-			$r->name = $columns[$i]->Field;
-			$r->value = $p;
-			$a[] = $r;
-		}	
-		return $a;
-	}
-	
-	function getOrderBy() {
-		$ob = getPostString("orderby");
-		if (is_numeric($ob)) {
-			$columns = getColumns();
-			$ob = $columns[intval($ob)-1]->Field;
-		}
-		return $ob;
-	}
-	
-	function getWhere() {
-		$w = getPostString("where");
-		return ($w ? " WHERE $w" : "");
-	}
-	
-	// basic operations
-	function rowcount()	{
-		global $table;
-		$query = "SELECT COUNT(*) FROM `$table`" . getWhere();
-		$result = mysql_query($query);
-		if (!$result)
-			error("failed to perform query: $query. " . mysql_error());
-		if ($row = mysql_fetch_row($result))
-			return $row[0];
-		else
-			return 0;
-	}
-	
-	function select($inQuery = '') {
-		global $table;
-		// built limit clause
-		$lim = (int)getPostString("limit");
-		$off = (int)getPostString("offset");
-		$limit = ($lim || $off ? " LIMIT $off, $lim" : "");
-		// build order by clause
-		$desc = (boolean)getPostString("desc");
-		$ob = getOrderBy();
-		$orderby = ($ob ? " ORDER BY `" . $ob . "`" . ($desc ? " DESC" : "") : "");
-		// build query
-		$query = ($inQuery ? $inQuery : "SELECT * FROM `$table`" . getWhere() . $orderby . $limit);
-		// execute query
-		if (!$result = mysql_query($query))
-			error("failed to perform query: $query. " . mysql_error());
-		// fetch each result row 
-		return getArray($result);
-	}
-
-	function reflectRow() {
-		global $table;
-		$pk = getPk();
-		$key = getNewPostPkValue();			
-		$where = "`$pk->name`=\"$key\"";
-		return select("SELECT * FROM `$table` WHERE $where LIMIT 1");
-	}
-	
-	function update() {
-		// build set clause
-		for ($i=0, $set = array(), $cols = getPostColumns(), $v; ($v=$cols[$i]); $i++)
-			$set[] = "`$v->name` = '$v->value'";
-		$set = implode(', ', $set);
-		// our table
-		global $table;
-		// build query
-		$pk = getPk();
-		$pkValue = getOldPostPkValue();
-		$query = "UPDATE `$table` SET $set WHERE `$pk->name` = '$pkValue' LIMIT 1";
-		// execute query
-		if (!mysql_query($query))
-			error("failed to perform query: [$query]. " .
-					"MySql says: [" . mysql_error() ."]");
-		else {
-			return reflectRow();
-		}	
-	}
-	
-	function insert() {
-		global $table;
-		// build values clause
-		for ($i=0, $values = array(), $cols = getPostColumns(), $v; ($v=$cols[$i]); $i++)
-			$values[] = $v->value;
-		$values = '"' . implode('", "', $values) . '"';			
-		// build query
-		$query = "INSERT INTO `$table` VALUES($values)";
-		// execute query
-		if (!mysql_query($query))
-			error("failed to perform query: [$query]. " .
-					"MySql says: [" . mysql_error() ."]");
-		else {
-			return reflectRow();
-		}
-	}
-	
-	function delete() {
-		global $table;
-		// build query
-		$n = getPostString("count");
-		$pk = getPk();
-		for ($i = 0, $deleted=array(); $i < $n; $i++) {
-			$key = getPostString("_$i");
-			array_push($deleted, $key);
-			$query = "DELETE FROM `$table` WHERE `$pk->name`=\"$key\" LIMIT 1";
-			// execute query
-			if (!mysql_query($query) || mysql_affected_rows() != 1)
-				error("failed to perform query: [$query]. " .
-					"Affected rows: " . mysql_affected_rows() .". " . 
-					"MySql says: [" . mysql_error() ."]");
-		}	
-		return $deleted;			
-	}
-	
-	// find (full text search)
-	function findData($inFindCol, $inFind, $inOrderBy, $inFullText) {
-		global $table;
-		$where = ($inFullText ? "WHERE MATCH(`$inFindCol`) AGAINST ('$inFind')" : "WHERE $inFindCol LIKE '$inFind'");
-		$query = "SELECT * FROM $table $where $inOrderBy";
-		$result = mysql_query($query);
-		// return rows
-		return getArray($result);
-	}
-	
-	// binary search through sorted data, supports start point ($inFindFrom) and direction ($inFindForward)
-	function findRow($inData, $inFindFrom=-1, $inFindForward) {
-		$b = -1;
-		$l = count($inData);
-		if (!$inData)
-			return $b;
-		if (!$inFindFrom==-1 || $l < 2)
-			$b = 0;
-		else {
-			// binary search
-			$t = $l-1;
-			$b = 0;
-			while ($b <= $t) {
-				$p = floor(($b+$t)/2);
-				$d = $inData[$p][0];
-				if ($d < $inFindFrom)
-					$b = $p + 1;
-				else if ($d > $inFindFrom)
-					$t = $p - 1;
-				else {
-					$b = $p;
-					break;
-				}	
-			}	
-			if ($inFindFrom == $inData[$b][0]) {
-				// add or subtract 1
-				$b = ($inFindForward ? ($b+1 > $l-1 ? 0 : $b+1) : ($b-1 < 0 ? $l-1 : $b-1) );
-			}	
-			else if (!$inFindForward)
-				// subtract 1
-				$b = ($b-1 < 0 ? $l-1 : $b-1);
-		}	
-		return $inData[$b][0];
-	}
-	
-	function buildFindWhere($inFindData, $inKey, $inCol) {
-		$o = Array();
-		foreach($inFindData as $row)
-			$o[] = $inCol . "='" . $row[$inKey] . "'";
-		return (count($o) ? ' WHERE ' . implode(' OR ', $o) : '');
-	}
-		
-	function find($inFindCol, $inFind='', $inOb='', $inFindFrom=0, $inFindForward=true, $inFullText=true) {
-		global $table;
-		// build order by clause
-		$desc = (boolean)getPostString("desc");
-		if (!$inOb)
-			$inOb = getOrderBy();
-		if ($inOb)
-			$inOb = "`" . $inOb . "`"	;
-		$orderby = ($inOb ? " ORDER BY $inOb " . ($desc ? " DESC" : "") : "");
-		// update inputs from post
-		if (!$inFind)
-			$inFind = getPostString('findText');
-		if (!$inFindCol)
-			$inFindCol = getPostString('findCol');	
-		if (empty($inFindFrom))
-			$inFindFrom = getPostString('findFrom');
-		$ff = getPostString('findForward');
-		if ($ff)
-			$inFindForward = (strtolower($ff) == 'true' ? true : false);
-		$ft = getPostString('findFullText');
-		if ($ft)
-			$inFullText = (strtolower($ft) == 'true' ? true : false);	
-		
-		// get find data
-		$f = findData($inFindCol, $inFind, $orderby,  $inFullText);
-		$pk = getPk();
-
-		// execute query
-		$where = buildFindWhere($f, $pk->index, 'f');
-		$query = "SELECT Row, f FROM (SELECT @row := @row + 1 AS Row, $pk->name as f FROM `$table` $orderby) AS tempTable $where";
-		mysql_query('SET @row = -1;');
-		if (!$result = mysql_query($query))
-			error("failed to perform query: $query. " . mysql_error());
-		
-		// return row number 
-		return findRow(getArray($result), $inFindFrom, $inFindForward);
-	}
-	
-	// our command list
-	$cmds = array( 
-		"count" => "rowcount", 
-		"select" => "select",
-		"update" => "update",
-		"insert" => "insert",
-		"delete" => "delete",
-		"find" => "find",
-		"databases" => "getDatabases",
-		"tables" => "getTables",
-		"columns" => "getColumns",
-		"info" => "getTableInfo"
-	);
-		
-	// process input params
-	$cmd = @$_POST["command"];
-	
-	//$cmd="select";
-	
-	// dispatch command
-	$func = @$cmds[$cmd];
-	if (function_exists($func)) 
-		echoJson(call_user_func($func));
-	else
-		error("bad command");
-?>
diff --git a/dojox/grid/compat/tests/support/geography.xml b/dojox/grid/compat/tests/support/geography.xml
deleted file mode 100644
index 070a8c1..0000000
--- a/dojox/grid/compat/tests/support/geography.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?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>
diff --git a/dojox/grid/compat/tests/support/json.php b/dojox/grid/compat/tests/support/json.php
deleted file mode 100644
index 84e3dfa..0000000
--- a/dojox/grid/compat/tests/support/json.php
+++ /dev/null
@@ -1,794 +0,0 @@
-<?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 at teczno.com>
-* @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);
-
-/**
-* Encodings
-*/
-define('SERVICES_JSON_ISO_8859_1', 'iso-8859-1');
-define('SERVICES_JSON_UTF_8', 'utf-8');
-
-/** 
-* Converts to and from JSON format.
-*
-* Brief example of use:
-*
-* <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
-    *
-		//>> SJM2005
-    * @param    string  $encoding 	Strings are input/output in this encoding
-    * @param    int    $encode 	Encode input is expected in this character encoding
-		//<< SJM2005
-		*
-    * @param    int     $use    object behavior: when encoding or decoding,
-    *                           be loose or strict about object/array usage
-    *
-    *                           possible values:
-    *                           - SERVICES_JSON_STRICT_TYPE: strict typing, default.
-    *                                                        "{...}" syntax creates objects in decode().
-    *                           - SERVICES_JSON_LOOSE_TYPE:  loose typing.
-    *                                                        "{...}" syntax creates associative arrays in decode().
-    */
-    function Services_JSON($encoding = SERVICES_JSON_UTF_8, $use = SERVICES_JSON_STRICT_TYPE)
-    {
-			//>> SJM2005
-			$this->encoding = $encoding;
-			//<< SJM2005
-			
-			$this->use = $use;
-    }
-
-   /**
-    * convert a string from one UTF-16 char to one UTF-8 char
-    *
-    * Normally should be handled by mb_convert_encoding, but
-    * provides a slower PHP-only method for installations
-    * that lack the multibye string extension.
-    *
-    * @param    string  $utf16  UTF-16 character
-    * @return   string  UTF-8 character
-    * @access   private
-    */
-    function utf162utf8($utf16)
-    {
-        // oh please oh please oh please oh please oh please
-        if(function_exists('mb_convert_encoding'))
-            return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
-        
-        $bytes = (ord($utf16{0}) << 8) | ord($utf16{1});
-
-        switch(true) {
-            case ((0x7F & $bytes) == $bytes):
-                // this case should never be reached, because we are in ASCII range
-                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                return chr(0x7F & $bytes);
-
-            case (0x07FF & $bytes) == $bytes:
-                // return a 2-byte UTF-8 character
-                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                return chr(0xC0 | (($bytes >> 6) & 0x1F))
-                     . chr(0x80 | ($bytes & 0x3F));
-
-            case (0xFFFF & $bytes) == $bytes:
-                // return a 3-byte UTF-8 character
-                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                return chr(0xE0 | (($bytes >> 12) & 0x0F))
-                     . chr(0x80 | (($bytes >> 6) & 0x3F))
-                     . chr(0x80 | ($bytes & 0x3F));
-        }
-
-        // ignoring UTF-32 for now, sorry
-        return '';
-    }        
-
-   /**
-    * convert a string from one UTF-8 char to one UTF-16 char
-    *
-    * Normally should be handled by mb_convert_encoding, but
-    * provides a slower PHP-only method for installations
-    * that lack the multibye string extension.
-    *
-    * @param    string  $utf8   UTF-8 character
-    * @return   string  UTF-16 character
-    * @access   private
-    */
-    function utf82utf16($utf8)
-    {
-        // oh please oh please oh please oh please oh please
-        if(function_exists('mb_convert_encoding'))
-            return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
-        
-        switch(strlen($utf8)) {
-            case 1:
-                // this case should never be reached, because we are in ASCII range
-                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                return $utf8;
-
-            case 2:
-                // return a UTF-16 character from a 2-byte UTF-8 char
-                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                return chr(0x07 & (ord($utf8{0}) >> 2))
-                     . chr((0xC0 & (ord($utf8{0}) << 6))
-                         | (0x3F & ord($utf8{1})));
-                
-            case 3:
-                // return a UTF-16 character from a 3-byte UTF-8 char
-                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                return chr((0xF0 & (ord($utf8{0}) << 4))
-                         | (0x0F & (ord($utf8{1}) >> 2)))
-                     . chr((0xC0 & (ord($utf8{1}) << 6))
-                         | (0x7F & ord($utf8{2})));
-        }
-
-        // ignoring UTF-32 for now, sorry
-        return '';
-    }        
-
-   /**
-    * encodes an arbitrary variable into JSON format
-    *
-    * @param    mixed   $var    any number, boolean, string, array, or object to be encoded.
-    *                           see argument 1 to Services_JSON() above for array-parsing behavior.
-    *                           if var is a strng, note that encode() always expects it
-    *                           to be in ASCII or UTF-8 format!
-    *
-    * @return   string  JSON string representation of input var
-    * @access   public
-    */
-    function encode($var)
-    {
-        switch (gettype($var)) {
-            case 'boolean':
-                return $var ? 'true' : 'false';
-            
-            case 'NULL':
-                return 'null';
-            
-            case 'integer':
-                return (int) $var;
-                
-            case 'double':
-            case 'float':
-                return (float) $var;
-                
-            case 'string':
-								//>> SJM2005
-								if ($this->encoding == SERVICES_JSON_UTF_8)
-									;
-								else if ($this->encoding == SERVICES_JSON_ISO_8859_1)
-									$var = utf8_encode($var); 
-								else if (!function_exists('mb_convert_encoding'))
-									die('Requested encoding requires mb_strings extension.');
-								else 
-									$var = mb_convert_encoding($var, "utf-8", $this->encoding);
-								//<< SJM2005
-											
-                // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
-                $ascii = '';
-                $strlen_var = strlen($var);
-
-               /*
-                * Iterate over every character in the string,
-                * escaping with a slash or encoding to UTF-8 where necessary
-                */
-                for ($c = 0; $c < $strlen_var; ++$c) {
-                    
-                    $ord_var_c = ord($var{$c});
-                    
-                    switch (true) {
-                        case $ord_var_c == 0x08:
-                            $ascii .= '\b';
-                            break;
-                        case $ord_var_c == 0x09:
-                            $ascii .= '\t';
-                            break;
-                        case $ord_var_c == 0x0A:
-                            $ascii .= '\n';
-                            break;
-                        case $ord_var_c == 0x0C:
-                            $ascii .= '\f';
-                            break;
-                        case $ord_var_c == 0x0D:
-                            $ascii .= '\r';
-                            break;
-
-                        case $ord_var_c == 0x22:
-                        case $ord_var_c == 0x2F:
-                        case $ord_var_c == 0x5C:
-                            // double quote, slash, slosh
-                            $ascii .= '\\'.$var{$c};
-                            break;
-                         
-                        case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
-                            // characters U-00000000 - U-0000007F (same as ASCII)
-                            $ascii .= $var{$c};
-                            break;
-                        
-                        case (($ord_var_c & 0xE0) == 0xC0):
-                            // characters U-00000080 - U-000007FF, mask 110XXXXX
-                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                            $char = pack('C*', $ord_var_c, ord($var{$c + 1}));
-                            $c += 1;
-                            $utf16 = $this->utf82utf16($char);
-                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
-                            break;
-    
-                        case (($ord_var_c & 0xF0) == 0xE0):
-                            // characters U-00000800 - U-0000FFFF, mask 1110XXXX
-                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                            $char = pack('C*', $ord_var_c,
-                                         ord($var{$c + 1}),
-                                         ord($var{$c + 2}));
-                            $c += 2;
-                            $utf16 = $this->utf82utf16($char);
-                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
-                            break;
-    
-                        case (($ord_var_c & 0xF8) == 0xF0):
-                            // characters U-00010000 - U-001FFFFF, mask 11110XXX
-                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                            $char = pack('C*', $ord_var_c,
-                                         ord($var{$c + 1}),
-                                         ord($var{$c + 2}),
-                                         ord($var{$c + 3}));
-                            $c += 3;
-                            $utf16 = $this->utf82utf16($char);
-                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
-                            break;
-    
-                        case (($ord_var_c & 0xFC) == 0xF8):
-                            // characters U-00200000 - U-03FFFFFF, mask 111110XX
-                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                            $char = pack('C*', $ord_var_c,
-                                         ord($var{$c + 1}),
-                                         ord($var{$c + 2}),
-                                         ord($var{$c + 3}),
-                                         ord($var{$c + 4}));
-                            $c += 4;
-                            $utf16 = $this->utf82utf16($char);
-                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
-                            break;
-    
-                        case (($ord_var_c & 0xFE) == 0xFC):
-                            // characters U-04000000 - U-7FFFFFFF, mask 1111110X
-                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                            $char = pack('C*', $ord_var_c,
-                                         ord($var{$c + 1}),
-                                         ord($var{$c + 2}),
-                                         ord($var{$c + 3}),
-                                         ord($var{$c + 4}),
-                                         ord($var{$c + 5}));
-                            $c += 5;
-                            $utf16 = $this->utf82utf16($char);
-                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
-                            break;
-                    }
-                }
-                
-                return '"'.$ascii.'"';
-                
-            case 'array':
-               /*
-                * As per JSON spec if any array key is not an integer
-                * we must treat the the whole array as an object. We
-                * also try to catch a sparsely populated associative
-                * array with numeric keys here because some JS engines
-                * will create an array with empty indexes up to
-                * max_index which can cause memory issues and because
-                * the keys, which may be relevant, will be remapped
-                * otherwise.
-                * 
-                * As per the ECMA and JSON specification an object may
-                * have any string as a property. Unfortunately due to
-                * a hole in the ECMA specification if the key is a
-                * ECMA reserved word or starts with a digit the
-                * parameter is only accessible using ECMAScript's
-                * bracket notation.
-                */
-                
-                // treat as a JSON object  
-                if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
-                    return '{' .
-                           join(',', array_map(array($this, 'name_value'),
-                                               array_keys($var),
-                                               array_values($var)))
-                           . '}';
-                }
-
-                // treat it like a regular array
-                return '[' . join(',', array_map(array($this, 'encode'), $var)) . ']';
-                
-            case 'object':
-                $vars = get_object_vars($var);
-                return '{' .
-                       join(',', array_map(array($this, 'name_value'),
-                                           array_keys($vars),
-                                           array_values($vars)))
-                       . '}';
-
-            default:
-                return '';
-        }
-    }
-    
-   /**
-    * array-walking function for use in generating JSON-formatted name-value pairs
-    *
-    * @param    string  $name   name of key to use
-    * @param    mixed   $value  reference to an array element to be encoded
-    *
-    * @return   string  JSON-formatted name-value pair, like '"name":value'
-    * @access   private
-    */
-    function name_value($name, $value)
-    {
-        return $this->encode(strval($name)) . ':' . $this->encode($value);
-    }        
-
-   /**
-    * reduce a string by removing leading and trailing comments and whitespace
-    *
-    * @param    $str    string      string value to strip of comments and whitespace
-    *
-    * @return   string  string value stripped of comments and whitespace
-    * @access   private
-    */
-    function reduce_string($str)
-    {
-        $str = preg_replace(array(
-        
-                // eliminate single line comments in '// ...' form
-                '#^\s*//(.+)$#m',
-    
-                // eliminate multi-line comments in '/* ... */' form, at start of string
-                '#^\s*/\*(.+)\*/#Us',
-    
-                // eliminate multi-line comments in '/* ... */' form, at end of string
-                '#/\*(.+)\*/\s*$#Us'
-    
-            ), '', $str);
-        
-        // eliminate extraneous space
-        return trim($str);
-    }
-
-   /**
-    * decodes a JSON string into appropriate variable
-    *
-    * @param    string  $str    JSON-formatted string
-    *
-    * @return   mixed   number, boolean, string, array, or object
-    *                   corresponding to given JSON input string.
-    *                   See argument 1 to Services_JSON() above for object-output behavior.
-    *                   Note that decode() always returns strings
-    *                   in ASCII or UTF-8 format!
-    * @access   public
-    */
-    function decode($str)
-    {
-				$str = $this->reduce_string($str);
-   			
-        switch (strtolower($str)) {
-            case 'true':
-                return true;
-
-            case 'false':
-                return false;
-            
-            case 'null':
-                return null;
-            
-            default:
-                if (is_numeric($str)) {
-                    // Lookie-loo, it's a number
-
-                    // This would work on its own, but I'm trying to be
-                    // good about returning integers where appropriate:
-                    // return (float)$str;
-
-                    // Return float or int, as appropriate
-                    return ((float)$str == (integer)$str)
-                        ? (integer)$str
-                        : (float)$str;
-                    
-                } elseif (preg_match('/^("|\').+(\1)$/s', $str, $m) && $m[1] == $m[2]) {
-                    // STRINGS RETURNED IN UTF-8 FORMAT
-                    $delim = substr($str, 0, 1);
-                    $chrs = substr($str, 1, -1);
-                    $utf8 = '';
-                    $strlen_chrs = strlen($chrs);
-                    
-                    for ($c = 0; $c < $strlen_chrs; ++$c) {
-                    
-                        $substr_chrs_c_2 = substr($chrs, $c, 2);
-                        $ord_chrs_c = ord($chrs{$c});
-                        
-                        switch (true) {
-                            case $substr_chrs_c_2 == '\b':
-                                $utf8 .= chr(0x08);
-                                ++$c;
-                                break;
-                            case $substr_chrs_c_2 == '\t':
-                                $utf8 .= chr(0x09);
-                                ++$c;
-                                break;
-                            case $substr_chrs_c_2 == '\n':
-                                $utf8 .= chr(0x0A);
-                                ++$c;
-                                break;
-                            case $substr_chrs_c_2 == '\f':
-                                $utf8 .= chr(0x0C);
-                                ++$c;
-                                break;
-                            case $substr_chrs_c_2 == '\r':
-                                $utf8 .= chr(0x0D);
-                                ++$c;
-                                break;
-
-                            case $substr_chrs_c_2 == '\\"':
-                            case $substr_chrs_c_2 == '\\\'':
-                            case $substr_chrs_c_2 == '\\\\':
-                            case $substr_chrs_c_2 == '\\/':
-                                if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
-                                   ($delim == "'" && $substr_chrs_c_2 != '\\"')) {
-                                    $utf8 .= $chrs{++$c};
-                                }
-                                break;
-                                
-                            case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)):
-																//echo ' matching single escaped unicode character from ' . substr($chrs, $c, 6);
-                                // single, escaped unicode character
-                                $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))
-                                       . chr(hexdec(substr($chrs, ($c + 4), 2)));
-                                $utf8 .= $this->utf162utf8($utf16);
-                                $c += 5;
-                                break;
-        
-                            case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):
-                                $utf8 .= $chrs{$c};
-                                break;
-        
-                            case ($ord_chrs_c & 0xE0) == 0xC0:
-                                // characters U-00000080 - U-000007FF, mask 110XXXXX
-                                //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                $utf8 .= substr($chrs, $c, 2);
-                                ++$c;
-                                break;
-    
-                            case ($ord_chrs_c & 0xF0) == 0xE0:
-                                // characters U-00000800 - U-0000FFFF, mask 1110XXXX
-                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                $utf8 .= substr($chrs, $c, 3);
-                                $c += 2;
-                                break;
-    
-                            case ($ord_chrs_c & 0xF8) == 0xF0:
-                                // characters U-00010000 - U-001FFFFF, mask 11110XXX
-                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                $utf8 .= substr($chrs, $c, 4);
-                                $c += 3;
-                                break;
-    
-                            case ($ord_chrs_c & 0xFC) == 0xF8:
-                                // characters U-00200000 - U-03FFFFFF, mask 111110XX
-                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                $utf8 .= substr($chrs, $c, 5);
-                                $c += 4;
-                                break;
-    
-                            case ($ord_chrs_c & 0xFE) == 0xFC:
-                                // characters U-04000000 - U-7FFFFFFF, mask 1111110X
-                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                $utf8 .= substr($chrs, $c, 6);
-                                $c += 5;
-                                break;
-
-                        }
-
-                    }
-                    
-										//>> SJM2005
-										if ($this->encoding == SERVICES_JSON_UTF_8)
-	                    return $utf8;
-										if ($this->encoding == SERVICES_JSON_ISO_8859_1)
-											return utf8_decode($utf8);
-										else if (!function_exists('mb_convert_encoding'))
-											die('Requested encoding requires mb_strings extension.');
-										else 
-											return mb_convert_encoding($utf8, $this->encoding, SERVICES_JSON_UTF_8);
-										//<< SJM2005
-										
-                    return $utf8;
-                
-                } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
-                    // array, or object notation
-                    if ($str{0} == '[') {
-                        $stk = array(SERVICES_JSON_IN_ARR);
-                        $arr = array();
-                    } else {
-                        if ($this->use == SERVICES_JSON_LOOSE_TYPE) {
-                            $stk = array(SERVICES_JSON_IN_OBJ);
-                            $obj = array();
-                        } else {
-                            $stk = array(SERVICES_JSON_IN_OBJ);
-                            $obj = new stdClass();
-                        }
-                    }
-                    
-                    array_push($stk, array('what'  => SERVICES_JSON_SLICE,
-                                           'where' => 0,
-                                           'delim' => false));
-
-                    $chrs = substr($str, 1, -1);
-                    $chrs = $this->reduce_string($chrs);
-                    
-                    if ($chrs == '') {
-                        if (reset($stk) == SERVICES_JSON_IN_ARR) {
-                            return $arr;
-
-                        } else {
-                            return $obj;
-
-                        }
-                    }
-
-                    //print("\nparsing {$chrs}\n");
-                    
-                    $strlen_chrs = strlen($chrs);
-                    for ($c = 0; $c <= $strlen_chrs; ++$c) {
-                    
-                        $top = end($stk);
-                        $substr_chrs_c_2 = substr($chrs, $c, 2);
-                    
-                        if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) {
-                            // found a comma that is not inside a string, array, etc.,
-                            // OR we've reached the end of the character list
-                            $slice = substr($chrs, $top['where'], ($c - $top['where']));
-                            array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false));
-                            //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-                            if (reset($stk) == SERVICES_JSON_IN_ARR) {
-                                // we are in an array, so just push an element onto the stack
-                                array_push($arr, $this->decode($slice));
-
-                            } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
-                                // we are in an object, so figure
-                                // out the property name and set an
-                                // element in an associative array,
-                                // for now
-                                if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
-                                    // "name":value pair
-                                    $key = $this->decode($parts[1]);
-                                    $val = $this->decode($parts[2]);
-
-                                    if ($this->use == SERVICES_JSON_LOOSE_TYPE) {
-                                        $obj[$key] = $val;
-                                    } else {
-                                        $obj->$key = $val;
-                                    }
-                                } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
-                                    // name:value pair, where name is unquoted
-                                    $key = $parts[1];
-                                    $val = $this->decode($parts[2]);
-
-                                    if ($this->use == SERVICES_JSON_LOOSE_TYPE) {
-                                        $obj[$key] = $val;
-                                    } else {
-                                        $obj->$key = $val;
-                                    }
-                                }
-
-                            }
-
-                        } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) {
-                            // found a quote, and we are not inside a string
-                            array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c}));
-                            //print("Found start of string at {$c}\n");
-
-												//>> SAO2006				 
-                        /*} elseif (($chrs{$c} == $top['delim']) &&
-                                 ($top['what'] == SERVICES_JSON_IN_STR) &&
-                                 (($chrs{$c - 1} != '\\')  ||
-																 ($chrs{$c - 1} == '\\' && $chrs{$c - 2} == '\\'))) {*/
-												} elseif ($chrs{$c} == $top['delim'] &&
-                          		$top['what'] == SERVICES_JSON_IN_STR) {			 
-														//print("Found potential end of string at {$c}\n");
-														// verify quote is not escaped: it has no or an even number of \\ before it.
-														for ($i=0; ($chrs{$c - ($i+1)} == '\\'); $i++);
-														/*$i = 0;		
-														while (	$chrs{$c - ($i+1)} == '\\')
-															$i++;*/
-														//print("Found {$i} \ before delim\n");
-														if ($i % 2 != 0)
-														{	
-															//print("delim escaped, not end of string\n");
-															continue;	 
-														} 
-												//>> SAO2006		
-                            // found a quote, we're in a string, and it's not escaped
-                            array_pop($stk);
-                            //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");
-
-                        } elseif (($chrs{$c} == '[') &&
-                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
-                            // found a left-bracket, and we are in an array, object, or slice
-                            array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false));
-                            //print("Found start of array at {$c}\n");
-
-                        } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) {
-                            // found a right-bracket, and we're in an array
-                            array_pop($stk);
-                            //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-                        } elseif (($chrs{$c} == '{') &&
-                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
-                            // found a left-brace, and we are in an array, object, or slice
-                            array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false));
-                            //print("Found start of object at {$c}\n");
-
-                        } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) {
-                            // found a right-brace, and we're in an object
-                            array_pop($stk);
-                            //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-                        } elseif (($substr_chrs_c_2 == '/*') &&
-                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
-                            // found a comment start, and we are in an array, object, or slice
-                            array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false));
-                            $c++;
-                            //print("Found start of comment at {$c}\n");
-
-                        } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) {
-                            // found a comment end, and we're in one now
-                            array_pop($stk);
-                            $c++;
-                            
-                            for ($i = $top['where']; $i <= $c; ++$i)
-                                $chrs = substr_replace($chrs, ' ', $i, 1);
-                            
-                            //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-                        }
-                    
-                    }
-                    
-                    if (reset($stk) == SERVICES_JSON_IN_ARR) {
-                        return $arr;
-
-                    } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
-                        return $obj;
-
-                    }
-                
-                }
-        }
-    }
-    
-}
-
-	/*function hex($s)
-	{
-		$l = strlen($s);
-		for ($i=0; $i < $l; $i++)
-			//echo '['.(ord($s{$i})).']';
-			echo '['.bin2hex($s{$i}).']';
-	}
- 
-	//$d = '["hello world\\""]';
-	$d = '["\\\\\\"hello world,\\\\\\""]';
-	//$d = '["\\\\", "\\\\"]';
-	hex($d);
-	$test = new Services_JSON();
-	echo('<pre>');
-	print_r($d . "\n");
-	print_r($test->decode($d));
-	echo('</pre>');
-	*/	
-?>
\ No newline at end of file
diff --git a/dojox/grid/compat/tests/support/movies.csv b/dojox/grid/compat/tests/support/movies.csv
deleted file mode 100644
index baf71eb..0000000
--- a/dojox/grid/compat/tests/support/movies.csv
+++ /dev/null
@@ -1,9 +0,0 @@
-Title, Year, Producer
-City of God, 2002, Katia Lund
-Rain,, Christine Jeffs
-2001: A Space Odyssey, , Stanley Kubrick
-"This is a ""fake"" movie title", 1957, Sidney Lumet
-Alien, 1979   , Ridley Scott
-"The Sequel to ""Dances With Wolves.""", 1982, Ridley Scott
-"Caine Mutiny, The", 1954, "Dymtryk ""the King"", Edward"
-
diff --git a/dojox/grid/compat/tests/support/test_data.js b/dojox/grid/compat/tests/support/test_data.js
deleted file mode 100644
index 4707380..0000000
--- a/dojox/grid/compat/tests/support/test_data.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// example sample data and code
-(function(){
-	// some sample data
-	// global var "data"
-	data = [ 
-		[ "normal", false, "new", 'But are not followed by two hexadecimal', 29.91, 10, false ],
-		[ "important", false, "new", 'Because a % sign always indicates', 9.33, -5, false ],
-		[ "important", false, "read", 'Signs can be selectively', 19.34, 0, true ],
-		[ "note", false, "read", 'However the reserved characters', 15.63, 0, true ],
-		[ "normal", false, "replied", 'It is therefore necessary', 24.22, 5.50, true ],
-		[ "important", false, "replied", 'To problems of corruption by', 9.12, -3, true ],
-		[ "note", false, "replied", 'Which would simply be awkward in', 12.15, -4, false ]
-	];
-	var rows = 100;
-	for(var i=0, l=data.length; i<rows-l; i++){
-		data.push(data[i%l].slice(0));
-	}
-
-	// global var "model"
-	model = new dojox.grid.data.Table(null, data);
-
-	// simple display of row info; based on model observation
-	// global var "modelChange"
-	modelChange = function(){
-		var n = dojo.byId('rowCount');
-		if(n){
-			n.innerHTML = Number(model.getRowCount()) + ' row(s)';
-		}
-	}
-})();
diff --git a/dojox/grid/compat/tests/support/test_data_objects.js b/dojox/grid/compat/tests/support/test_data_objects.js
deleted file mode 100644
index 3d6e43a..0000000
--- a/dojox/grid/compat/tests/support/test_data_objects.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// example sample data and code
-(function(){
-	// some sample data
-	// global var "data"
-	data = [ 
-		{ col1: "normal", col2: false, col3: "new", col4: 'But are not followed by two hexadecimal', col5: 29.91, col6: 10, col7: false },
-		{ col1: "important", col2: false, col3: "new", col4: 'Because a % sign always indicates', col5: 9.33, col6: -5, col7: false },
-		{ col1: "important", col2: false, col3: "read", col4: 'Signs can be selectively', col5: 19.34, col6: 0, col7: true },
-		{ col1: "note", col2: false, col3: "read", col4: 'However the reserved characters', col5: 15.63, col6: 0, col7: true },
-		{ col1: "normal", col2: false, col3: "replied", col4: 'It is therefore necessary', col5: 24.22, col6: 5.50, col7: true },
-		{ col1: "important", col2: false, col3: "replied", col4: 'To problems of corruption by', col5: 9.12, col6: -3, col7: true },
-		{ col1: "note", col2: false, col3: "replied", col4: 'Which would simply be awkward in', col5: 12.15, col6: -4, col7: false }
-	];
-	var rows = 100;
-	for(var i=0, l=data.length; i<rows-l; i++){
-		data.push(dojo.mixin({}, data[i%l]));
-	}
-
-	// global var "model"
-	model = new dojox.grid.data.Objects(null, [ { col1: "fake" } ]);
-	model2 = new dojox.grid.data.Objects(null, [ { col1: "fake" } ]);
-
-	// simple display of row info; based on model observation
-	// global var "modelChange"
-	modelChange = function(){
-		var n = dojo.byId('rowCount');
-		if(n){
-			n.innerHTML = Number(model.getRowCount()) + ' row(s)';
-		}
-	}
-})();
diff --git a/dojox/grid/compat/tests/support/testtbl.sql b/dojox/grid/compat/tests/support/testtbl.sql
deleted file mode 100644
index ffe2af3..0000000
--- a/dojox/grid/compat/tests/support/testtbl.sql
+++ /dev/null
@@ -1,944 +0,0 @@
-/*
-MySQL Data Transfer
-Source Host: localhost
-Source Database: test
-Target Host: localhost
-Target Database: test
-Date: 12/14/2006 12:13:30 PM
-*/
-
-SET FOREIGN_KEY_CHECKS=0;
--- ----------------------------
--- Table structure for testtbl
--- ----------------------------
-CREATE TABLE `testtbl` (
-  `Id` int(10) unsigned NOT NULL,
-  `Name` varchar(45) NOT NULL default '',
-  `Message` varchar(255) default NULL,
-  `Date` date default '2005-01-01',
-  PRIMARY KEY  (`Id`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='InnoDB free: 4096 kB; InnoDB free: 4096 kB; InnoDB free: 409';
-
--- ----------------------------
--- Records 
--- ----------------------------
-INSERT INTO `testtbl` VALUES ('363', ' Lopez, Felipe', ' 0.26', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('364', ' Lopez, Javy', ' 0.267', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('365', ' Lopez, L', ' 0.27', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('366', ' Lopez, Luis', ' 0.244', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('367', ' Lopez, Mendy', ' 0.241', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('368', ' Loretta, Mark', ' 0.289', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('369', ' Lowell, Mike', ' 0.283', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('370', ' Lugo, Julio', ' 0.263', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('371', ' Lunar, Fernando', ' 0.246', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('372', ' Mabry, John', ' 0.208', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('373', ' Machado, Robert', ' 0.222', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('374', ' Macias, Jose', ' 0.268', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('375', ' Mackowiak, Rob', ' 0.266', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('376', ' Magadan, Dave', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('377', ' Magee, Wendell', ' 0.213', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('378', ' Magruder, Chris', ' 0.172', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('379', ' Marrero, Eli', ' 0.266', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('380', ' Martin, Al', ' 0.24', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('381', ' Martinez, Dave', ' 0.287', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('382', ' Martinez, Edgar', ' 0.306', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('383', ' Martinez, Felix', ' 0.247', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('384', ' Martinez, Ramon', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('385', ' Martinez, Ramone', ' 0.253', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('386', ' Martinez, Sandy', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('387', ' Martinez, Tino', ' 0.28', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('388', ' Mateo, Henry', ' 0.333', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('389', ' Mateo, Ruben', ' 0.248', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('390', ' Matheny, Mike', ' 0.218', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('391', ' Matos, Luis', ' 0.214', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('392', ' Mattess, Troy', ' 0.467', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('393', ' Matthews, Gary', ' 0.227', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('394', ' Maurer, Dave', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('395', ' Maxwell, Jason', ' 0.191', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('396', ' Mayne, Brent', ' 0.285', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('397', ' McCarty, David', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('398', ' McCracken, Quinton', ' 0.219', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('399', ' McDonald, Donzell', ' 0.333', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('400', ' McDonald, John', ' 0.091', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('401', ' McDonald, Keith', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('402', ' McEwing, Joe', ' 0.283', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('403', ' McGriff, Fred', ' 0.306', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('404', ' McGuire, Ryan', ' 0.185', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('405', ' McGwire, Mark', ' 0.187', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('406', ' McLemore, Mark', ' 0.286', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('407', ' McMillon, Billy', ' 0.217', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('408', ' McRae, Scott', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('409', ' Meares, Pat', ' 0.211', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('410', ' Melhuse, Adam', ' 0.183', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('411', ' Mendez, Donaldo', ' 0.153', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('412', ' Menechino, Frank', ' 0.242', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('413', ' Merced, Orlando', ' 0.263', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('414', ' Merloni, Lou', ' 0.267', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('415', ' Meyers, Chad', ' 0.118', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('416', ' Michaels, Jason', ' 0.167', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('417', ' Mientkiewicz, Doug', ' 0.306', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('418', ' Millar, Kevin', ' 0.314', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('419', ' Miller, Corky', ' 0.184', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('420', ' Miller, Damian', ' 0.271', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('421', ' Minor, Damion', ' 0.156', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('422', ' Minor, Ryan', ' 0.158', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('423', ' Mirabelli, Doug', ' 0.226', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('424', ' Moeller, Chad', ' 0.232', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('425', ' Mohr, Dustan', ' 0.235', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('426', ' Molina, Ben', ' 0.262', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('427', ' Molina, Jose', ' 0.27', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('428', ' Mondesi, Raul', ' 0.252', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('429', ' Monroe, Craig', ' 0.212', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('430', ' Mora, Melvin', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('431', ' Mordecai, Mike', ' 0.28', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('432', ' Morris, Warren', ' 0.204', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('433', ' Mottola, Chad', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('434', ' Mouton, James', ' 0.246', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('435', ' Mouton, Lyle', ' 0.059', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('436', ' Mueller, Bill', ' 0.295', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('437', ' Munson, Eric', ' 0.152', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('438', ' Murray, Calvin', ' 0.245', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('439', ' Myers, Greg', ' 0.224', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('440', ' Nevin, Phil', ' 0.306', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('441', ' Newhan, David', ' 0.333', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('442', ' Nieves, Jose', ' 0.245', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('443', ' Nixon, Trot', ' 0.28', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('444', ' Norton, Greg', ' 0.267', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('445', ' Nunez, Abraham', ' 0.262', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('446', ' Ochoa, Alex', ' 0.276', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('447', ' Offerman, Jose', ' 0.267', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('448', ' Ojeda, Augie', ' 0.201', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('449', ' O\\\'Leary, Troy', ' 0.24', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('450', ' Olerud, John', ' 0.302', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('451', ' Oliver, Joe', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('452', ' O\\\'Neill, Paul', ' 0.267', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('453', ' Ordaz, Luis', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('454', ' Ordonez, Magglio', ' 0.305', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('455', ' Ordonez, Rey', ' 0.247', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('456', ' Ortega, Bill', ' 0.2', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('457', ' Ortiz, David', ' 0.234', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('458', ' Ortiz, Hector', ' 0.247', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('459', ' Ortiz, Jose', ' 0.24', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('460', ' Osik, Keith', ' 0.208', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('461', ' Overbay, Lyle', ' 0.5', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('462', ' Owens, Eric', ' 0.253', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('463', ' Palmeiro, Orlando', ' 0.243', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('464', ' Palmeiro, Rafael', ' 0.273', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('465', ' Palmer, Dean', ' 0.222', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('466', ' Paquette, Craig', ' 0.282', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('467', ' Patterson, Corey', ' 0.221', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('468', ' Patterson, Jarrod', ' 0.268', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('469', ' Paul, Josh', ' 0.266', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('470', ' Payton, Jay', ' 0.255', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('471', ' Pena, Angel', ' 0.204', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('472', ' Pena, Carlos', ' 0.258', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('473', ' Pena, Elvis', ' 0.225', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('474', ' Perez, Eddie', ' 0.3', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('475', ' Perez, Neifi', ' 0.279', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('476', ' Perez, Robert', ' 0.2', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('477', ' Perez, Santiago', ' 0.198', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('478', ' Perez, Thomas', ' 0.304', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('479', ' Perez, Timoniel', ' 0.247', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('480', ' Perry, Herbert', ' 0.256', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('481', ' Peters, Chris', ' 0.091', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('482', ' Petrick, Ben', ' 0.238', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('483', ' Phelps, Josh', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('484', ' Phillips, Jason', ' 0.143', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('485', ' Piatt, Adam', ' 0.211', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('486', ' Piazza, Mike', ' 0.3', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('487', ' Pickering, Calvin', ' 0.278', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('488', ' Pierre, Juan', ' 0.327', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('489', ' Pierzynski, A.J.', ' 0.289', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('490', ' Podsednik, Scott', ' 0.167', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('491', ' Polanco, Placido', ' 0.307', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('492', ' Porter, Bo', ' 0.23', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('493', ' Posada, Jorge', ' 0.277', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('494', ' Powell, Dante', ' 0.333', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('495', ' Pratt, Todd', ' 0.185', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('496', ' Pride, Curtis', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('497', ' Prince, Tom', ' 0.219', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('498', ' Pujols, Albert', ' 0.329', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('499', ' Punto, Nick', ' 0.4', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('500', ' Quevado, Ruben', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('501', ' Quinn, Mark', ' 0.269', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('502', ' Raines, Tim', ' 0.174', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('503', ' Raines, Tim', ' 0.303', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('504', ' Ramirez, Aramis', ' 0.3', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('505', ' Ramirez, Julio', ' 0.081', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('506', ' Ramirez, Manny', ' 0.306', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('507', ' Randa, Joe', ' 0.253', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('508', ' Ransom, Cody', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('509', ' Reboulet, Jeff', ' 0.266', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('510', ' Redman, Tim', ' 0.224', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('511', ' Redmond, Mike', ' 0.312', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('512', ' Reese, Pokey', ' 0.224', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('513', ' Relaford, Desi', ' 0.302', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('514', ' Renteria, Edgar', ' 0.26', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('515', ' Richard, Chris', ' 0.265', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('516', ' Riggs, Adam', ' 0.194', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('517', ' Rios, Armando', ' 0.26', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('518', ' Ripken, Cal', ' 0.239', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('519', ' Rivas, Luis', ' 0.266', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('520', ' Rivera, Juan', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('521', ' Rivera, Mike', ' 0.333', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('522', ' Rivera, Ruben', ' 0.255', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('523', ' Roberts, Brian', ' 0.253', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('524', ' Roberts, Dave', ' 0.333', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('525', ' Robinson, Kerry', ' 0.285', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('526', ' Rodriguez, Alex', ' 0.318', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('527', ' Rodriguez, Henry', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('528', ' Rodriguez, Ivan', ' 0.308', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('529', ' Rolen, Scott', ' 0.289', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('530', ' Rollins, Jimmy', ' 0.274', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('531', ' Rolls, Damian', ' 0.262', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('532', ' Rowand, Aaron', ' 0.293', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('533', ' Ruffin, Johnny', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('534', ' Ryan, Rob', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('535', ' Sadler, Donnie', ' 0.162', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('536', ' Saenz, Olmedo', ' 0.22', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('537', ' Salmon, Tim', ' 0.227', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('538', ' Sanchez, Alex', ' 0.206', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('539', ' Sanchez, Rey', ' 0.281', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('540', ' Sandberg, Jared', ' 0.206', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('541', ' Sanders, Anthony', ' 0.176', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('542', ' Sanders, Deion', ' 0.173', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('543', ' Sanders, Reggie', ' 0.263', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('544', ' Santana, Pedro', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('545', ' Santangelo, F.P.', ' 0.197', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('546', ' Santiago, Benito', ' 0.262', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('547', ' Santos, Angel', ' 0.125', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('548', ' Saturria, Luis', ' 0.2', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('549', ' Schneider, Brian', ' 0.317', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('550', ' Schourek, Pete', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('551', ' Seabol, Scott', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('552', ' Sefcik, Kevin', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('553', ' Segui, David', ' 0.301', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('554', ' Seguignol, Fernando', ' 0.14', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('555', ' Selby, Bill', ' 0.228', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('556', ' Servais, Scott', ' 0.375', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('557', ' Sexson, Richie', ' 0.271', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('558', ' Sheets, Andy', ' 0.196', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('559', ' Sheffield, Gary', ' 0.311', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('560', ' Sheldon, Scott', ' 0.2', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('561', ' Shinjo, Tsuyoshi', ' 0.268', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('562', ' Shumpert, Terry', ' 0.289', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('563', ' Sierra, Ruben', ' 0.291', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('564', ' Simmons, Brian', ' 0.178', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('565', ' Simon, Randall', ' 0.305', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('566', ' Singleton, Chris', ' 0.298', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('567', ' Smith, Bobby', ' 0.105', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('568', ' Smith, Jason', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('569', ' Smith, Mark', ' 0.242', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('570', ' Snow, J.T.', ' 0.246', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('571', ' Sojo, Luis', ' 0.165', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('572', ' Soriano, Alfonso', ' 0.268', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('573', ' Sosa, Juan', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('574', ' Sosa, Sammy', ' 0.328', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('575', ' Spencer, Shane', ' 0.258', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('576', ' Spiers, Bill', ' 0.333', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('577', ' Spiezio, Scott', ' 0.271', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('578', ' Spivey, Junior', ' 0.258', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('579', ' Sprague, Ed', ' 0.298', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('580', ' Stairs, Matt', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('581', ' Stevens, Lee', ' 0.245', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('582', ' Stewart, Shannon', ' 0.316', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('583', ' Stinnett, Kelly', ' 0.257', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('584', ' Stynes, Chris', ' 0.28', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('585', ' Surhoff, B.J.', ' 0.271', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('586', ' Sutton, Larry', ' 0.119', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('587', ' Suzuki, Ichiro', ' 0.35', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('588', ' Sweeney, Mark', ' 0.258', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('589', ' Sweeney, Mike', ' 0.304', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('590', ' Tapani, Kevin', ' 0.24', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('591', ' Tatis, Fernando', ' 0.255', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('592', ' Taubensee, Eddie', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('593', ' Taylor, Reggie', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('594', ' Tejada, Miguel', ' 0.267', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('595', ' Thomas, Frank', ' 0.221', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('596', ' Thome, Jim', ' 0.291', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('597', ' Thompson, Ryan', ' 0.29', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('598', ' Toca, Jorge', ' 0.176', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('599', ' Torrealba, Steve', ' 0.5', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('600', ' Torrealba, Yorvit', ' 0.5', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('601', ' Tracy, Andy', ' 0.109', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('602', ' Trammell, Bubba', ' 0.261', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('603', ' Truby, Chris', ' 0.206', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('604', ' Tucker, Michael', ' 0.252', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('605', ' Tyner, Jason', ' 0.28', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('606', ' Uribe, Juan', ' 0.3', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('607', ' Valdez, Mario', ' 0.278', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('608', ' Valent, Eric', ' 0.098', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('609', ' Valentin, John', ' 0.2', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('610', ' Valentin, Jose', ' 0.258', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('611', ' VanderWal, John', ' 0.27', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('612', ' Varitek, Jason', ' 0.293', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('613', ' Vaughn, Greg', ' 0.233', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('614', ' Vazquez, Ramon', ' 0.229', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('615', ' Velandia, Jorge', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('616', ' Velarde, Randy', ' 0.278', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('617', ' Ventura, Robin', ' 0.237', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('618', ' Veras, Quilvio', ' 0.252', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('619', ' Vidro, Jose', ' 0.319', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('620', ' Vina, Fernando', ' 0.303', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('621', ' Vizcaino, Jose', ' 0.277', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('622', ' Vizquel, Omar', ' 0.255', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('623', ' Wakeland, Chris', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('624', ' Walbeck, Matt', ' 1', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('625', ' Walker, Larry', ' 0.35', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('626', ' Walker, Todd', ' 0.296', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('627', ' Ward, Daryle', ' 0.263', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('628', ' Ward, Turner', ' 0.267', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('629', ' Wehner, John', ' 0.196', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('630', ' Wells, Vernon', ' 0.313', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('631', ' White, Devon', ' 0.277', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('632', ' White, Rondell', ' 0.307', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('633', ' Whiteside, Matt', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('634', ' Wilkerson, Brad', ' 0.205', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('635', ' Wilkins, Rick', ' 0.182', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('636', ' Williams, Bernie', ' 0.307', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('637', ' Williams, Gerald', ' 0.201', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('638', ' Williams, Matt', ' 0.275', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('639', ' Wilson, Craig', ' 0.31', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('640', ' Wilson, Dan', ' 0.265', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('641', ' Wilson, Enrique', ' 0.211', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('642', ' Wilson, Jack', ' 0.223', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('643', ' Wilson, Preston', ' 0.274', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('644', ' Wilson, Tom', ' 0.19', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('645', ' Wilson, Vance', ' 0.298', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('646', ' Winn, Randy', ' 0.273', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('647', ' Witt, Kevin', ' 0.185', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('648', ' Womack, Tony', ' 0.266', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('649', ' Woodward, Chris', ' 0.19', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('650', ' Wooten, Shawn', ' 0.312', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('651', ' Young, Dmitri', ' 0.302', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('652', ' Young, Eric', ' 0.279', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('653', ' Young, Kevin', ' 0.232', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('654', ' Young, Mike', ' 0.249', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('655', ' Zaun, Greg', ' 0.32', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('656', ' Zeile, Todd', ' 0.266', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('657', ' Zuleta, Julio', ' 0.217', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('658', ' Abernathy, Brent', ' 0.242', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('659', ' Abreu, Bob', ' 0.308', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('660', ' Agbayani, Benny', ' 0.227', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('661', ' Alcantara, Israel', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('662', ' Aldridge, Cory', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('663', ' Alfonzo, Edgardo', ' 0.308', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('664', ' Alicea, Luis', ' 0.228', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('665', ' Allen, Chad', ' 0.1', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('666', ' Allen, Luke', ' 0.143', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('667', ' Alomar, Roberto', ' 0.266', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('668', ' Alomar, Sandy', ' 0.279', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('669', ' Alou, Moises', ' 0.275', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('670', ' Alvarez, Tony', ' 0.308', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('671', ' Amezaga, Alfredo', ' 0.538', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('672', ' Anderson, Brady', ' 0.163', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('673', ' Anderson, Garret', ' 0.306', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('674', ' Anderson, Marlon', ' 0.258', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('675', ' Andrews, Shane', ' 0.077', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('676', ' Arias, Alex', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('677', ' Aurilia, Rich', ' 0.257', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('678', ' Ausmus, Brad', ' 0.257', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('679', ' Aven, Bruce', ' 0.118', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('680', ' Baerga, Carlos', ' 0.286', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('681', ' Bagwell, Jeff', ' 0.291', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('682', ' Bako, Paul', ' 0.235', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('683', ' Banks, Brian', ' 0.321', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('684', ' Barajas, Rod', ' 0.234', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('685', ' Bard, Josh', ' 0.222', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('686', ' Barker, Kevin', ' 0.158', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('687', ' Barrett, Michael', ' 0.263', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('688', ' Batista, Tony', ' 0.244', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('689', ' Bautista, Danny', ' 0.325', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('690', ' Bell, David', ' 0.261', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('691', ' Bell, Jay', ' 0.163', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('692', ' Belle, Albert', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('693', ' Bellhorn, Mark', ' 0.258', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('694', ' Belliard, Ron', ' 0.211', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('695', ' Bellinger, Clay', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('696', ' Beltran, Carlos', ' 0.273', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('697', ' Beltre, Adrian', ' 0.257', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('698', ' Benard, Marvin', ' 0.276', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('699', ' Benjamin, Mike', ' 0.15', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('700', ' Bennett, Gary', ' 0.265', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('701', ' Berg, David', ' 0.27', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('702', ' Berger, Brandon', ' 0.201', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('703', ' Bergeron, Peter', ' 0.187', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('704', ' Berkman, Lance', ' 0.292', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('705', ' Berroa, Angel', ' 0.227', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('706', ' Bigbie, Larry', ' 0.176', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('707', ' Biggio, Craig', ' 0.253', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('708', ' Blake, Casey', ' 0.2', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('709', ' Blalock, Hank', ' 0.211', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('710', ' Blanco, Henry', ' 0.204', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('711', ' Bloomquist, Willie', ' 0.455', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('712', ' Blum, Geoff', ' 0.283', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('713', ' Bocachica, Hiram', ' 0.22', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('714', ' Bonds, Barry', ' 0.37', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('715', ' Boone, Aaron', ' 0.241', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('716', ' Boone, Bret', ' 0.278', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('717', ' Borchard, Joe', ' 0.222', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('718', ' Borders, Pat', ' 0.5', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('719', ' Bordick, Mike', ' 0.232', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('720', ' Bradley, Milton', ' 0.249', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('721', ' Bragg, Darren', ' 0.269', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('722', ' Branyan, Russell', ' 0.228', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('723', ' Brito, Juan', ' 0.304', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('724', ' Broussard, Ben', ' 0.241', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('725', ' Brown, Adrian', ' 0.216', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('726', ' Brown, Dermal', ' 0.235', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('727', ' Brown, Kevin', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('728', ' Brown, Roosevelt', ' 0.211', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('729', ' Buchanan, Brian', ' 0.269', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('730', ' Burks, Ellis', ' 0.301', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('731', ' Burnitz, Jeromy', ' 0.215', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('732', ' Burrell, Pat', ' 0.282', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('733', ' Burroughs, Sean', ' 0.271', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('734', ' Bush, Homer', ' 0.227', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('735', ' Butler, Brent', ' 0.259', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('736', ' Byrd, Marlon', ' 0.229', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('737', ' Byrnes, Eric', ' 0.245', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('738', ' Cabrera, Jolbert', ' 0.143', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('739', ' Cabrera, Orlando', ' 0.263', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('740', ' Cairo, Miguel', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('741', ' Cameron, Mike', ' 0.239', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('742', ' Canizaro, Jay', ' 0.214', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('743', ' Cardona, Javier', ' 0.103', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('744', ' Carroll, Jamey', ' 0.31', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('745', ' Caruso, Mike', ' 0.1', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('746', ' Casanova, Raul', ' 0.182', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('747', ' Casey, Sean', ' 0.261', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('748', ' Cash, Kevin', ' 0.143', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('749', ' Castilla, Vinny', ' 0.232', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('750', ' Castillo, Alberto', ' 0.135', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('751', ' Castillo, Luis', ' 0.305', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('752', ' Castro, Juan', ' 0.22', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('753', ' Castro, Ramon', ' 0.238', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('754', ' Catalanotto, Frank', ' 0.269', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('755', ' Cedeno, Roger', ' 0.26', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('756', ' Cepicky, Matt', ' 0.216', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('757', ' Chavez, Endy', ' 0.296', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('758', ' Chavez, Eric', ' 0.275', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('759', ' Chavez, Raul', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('760', ' Chen, Chin-Feng', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('761', ' Choi, Hee Seop', ' 0.18', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('762', ' Christensen, McKay', ' 0.333', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('763', ' Christenson, Ryan', ' 0.155', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('764', ' Cintron, Alex', ' 0.213', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('765', ' Cirillo, Jeff', ' 0.249', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('766', ' Clark, Brady', ' 0.192', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('767', ' Clark, Howie', ' 0.302', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('768', ' Clark, Tony', ' 0.207', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('769', ' Clayton, Royce', ' 0.251', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('770', ' Colangelo, Mike', ' 0.174', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('771', ' Colbrunn, Greg', ' 0.333', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('772', ' Coleman, Michael', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('773', ' Collier, Lou', ' 0.091', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('774', ' Conine, Jeff', ' 0.273', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('775', ' Conti, Jason', ' 0.257', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('776', ' Coolbaugh, Mike', ' 0.083', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('777', ' Coomer, Ron', ' 0.264', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('778', ' Cora, Alex', ' 0.291', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('779', ' Cordero, Wil', ' 0.267', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('780', ' Cordova, Marty', ' 0.253', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('781', ' Cota, Humberto', ' 0.294', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('782', ' Counsell, Craig', ' 0.282', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('783', ' Cox, Steve', ' 0.254', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('784', ' Crawford, Carl', ' 0.259', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('785', ' Crede, Joe', ' 0.285', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('786', ' Crespo, Cesar', ' 0.172', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('787', ' Crisp, Covelli', ' 0.26', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('788', ' Cruz, Deivi', ' 0.263', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('789', ' Cruz, Ivan', ' 0.357', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('790', ' Cruz, Jacob', ' 0.273', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('791', ' Cruz, Jose', ' 0.245', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('792', ' Cuddyer, Michael', ' 0.259', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('793', ' Cust, Jack', ' 0.169', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('794', ' Damon, Johnny', ' 0.286', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('795', ' Daubach, Brian', ' 0.266', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('796', ' DaVanon, Jeff', ' 0.167', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('797', ' Davis, Ben', ' 0.259', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('798', ' Davis, J.J.', ' 0.1', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('799', ' Dawkins, Travis', ' 0.125', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('800', ' DeHaan, Kory', ' 0.091', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('801', ' Delgado, Carlos', ' 0.277', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('802', ' Delgado, Wilson', ' 0.2', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('803', ' Dellucci, David', ' 0.245', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('804', ' DeRosa, Mark', ' 0.297', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('805', ' DeShields, Delino', ' 0.192', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('806', ' Diaz, Einar', ' 0.206', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('807', ' Diaz, Juan Carlos', ' 0.286', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('808', ' DiFelice, Mike', ' 0.23', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('809', ' Donnels, Chris', ' 0.238', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('810', ' Drew, J.D.', ' 0.252', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('811', ' Dunn, Adam', ' 0.249', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('812', ' Dunston, Shawon', ' 0.231', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('813', ' Dunwoody, Todd', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('814', ' Durazo, Erubiel', ' 0.261', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('815', ' Durham, Ray', ' 0.289', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('816', ' Dye, Jermaine', ' 0.252', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('817', ' Easley, Damion', ' 0.224', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('818', ' Echevarria, Angel', ' 0.306', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('819', ' Eckstein, David', ' 0.293', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('820', ' Edmonds, Jim', ' 0.311', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('821', ' Ellis, Mark', ' 0.272', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('822', ' Encarnacion, Juan', ' 0.271', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('823', ' Encarnacion, Mario', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('824', ' Ensberg, Morgan', ' 0.242', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('825', ' Erstad, Darin', ' 0.283', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('826', ' Escalona, Felix', ' 0.217', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('827', ' Escobar, Alex', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('828', ' Estalella, Bobby', ' 0.205', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('829', ' Estrada, Johnny', ' 0.118', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('830', ' Everett, Adam', ' 0.193', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('831', ' Everett, Carl', ' 0.267', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('832', ' Fabregas, Jorge', ' 0.181', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('833', ' Fasano, Sal', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('834', ' Febles, Carlos', ' 0.245', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('835', ' Feliz, Pedro', ' 0.253', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('836', ' Fick, Robert', ' 0.27', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('837', ' Figgins, Chone', ' 0.167', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('838', ' Finley, Steve', ' 0.287', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('839', ' Flaherty, John', ' 0.26', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('840', ' Fletcher, Darrin', ' 0.22', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('841', ' Flores, Jose', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('842', ' Floyd, Cliff', ' 0.288', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('843', ' Fordyce, Brook', ' 0.231', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('844', ' Fox, Andy', ' 0.251', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('845', ' Franco, Julio', ' 0.284', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('846', ' Franco, Matt', ' 0.317', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('847', ' Fryman, Travis', ' 0.217', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('848', ' Fullmer, Brad', ' 0.289', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('849', ' Furcal, Rafael', ' 0.275', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('850', ' Galarraga, Andres', ' 0.26', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('851', ' Gant, Ron', ' 0.262', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('852', ' Garcia, Jesse', ' 0.197', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('853', ' Garcia, Karim', ' 0.297', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('854', ' Garcia, Luis', ' 0.333', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('855', ' Garciaparra, Nomar', ' 0.31', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('856', ' German, Esteban', ' 0.2', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('857', ' Giambi, Jason', ' 0.314', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('858', ' Giambi, Jeremy', ' 0.259', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('859', ' Gibbons, Jay', ' 0.247', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('860', ' Gil, Benji', ' 0.285', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('861', ' Gil, Geronimo', ' 0.232', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('862', ' Giles, Brian', ' 0.298', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('863', ' Giles, Marcus', ' 0.23', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('864', ' Ginter, Keith', ' 0.235', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('865', ' Gipson, Charles', ' 0.236', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('866', ' Girardi, Joe', ' 0.226', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('867', ' Glanville, Doug', ' 0.249', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('868', ' Glaus, Troy', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('869', ' Gload, Ross', ' 0.258', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('870', ' Gomez, Alexis', ' 0.2', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('871', ' Gomez, Chris', ' 0.265', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('872', ' Gonzalez, Alex', ' 0.225', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('873', ' Gonzalez, Alex', ' 0.248', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('874', ' Gonzalez, Juan', ' 0.282', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('875', ' Gonzalez, Luis', ' 0.288', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('876', ' Gonzalez, Raul', ' 0.26', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('877', ' Gonzalez, Wiki', ' 0.22', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('878', ' Goodwin, Tom', ' 0.26', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('879', ' Grabowski, Jason', ' 0.375', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('880', ' Grace, Mark', ' 0.252', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('881', ' Graffanino, Tony', ' 0.262', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('882', ' Green, Nick', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('883', ' Green, Shawn', ' 0.285', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('884', ' Greene, Todd', ' 0.268', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('885', ' Greer, Rusty', ' 0.296', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('886', ' Grieve, Ben', ' 0.251', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('887', ' Griffey, Ken', ' 0.264', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('888', ' Grissom, Marquis', ' 0.277', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('889', ' Grudzielanek, Mark', ' 0.271', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('890', ' Guerrero, Vladimir', ' 0.336', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('891', ' Guerrero, Wilton', ' 0.221', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('892', ' Guiel, Aaron', ' 0.233', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('893', ' Guillen, Carlos', ' 0.261', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('894', ' Guillen, Jose', ' 0.238', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('895', ' Gutierrez, Ricky', ' 0.275', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('896', ' Guzman, Christian', ' 0.273', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('897', ' Hafner, Travis', ' 0.242', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('898', ' Hairston, Jerry', ' 0.268', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('899', ' Hall, Bill', ' 0.194', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('900', ' Hall, Toby', ' 0.258', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('901', ' Halter, Shane', ' 0.239', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('902', ' Hammonds, Jeffrey', ' 0.257', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('903', ' Hansen, Dave', ' 0.292', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('904', ' Harris, Lenny', ' 0.305', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('905', ' Harris, Willie', ' 0.233', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('906', ' Hart, Jason', ' 0.267', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('907', ' Haselman, Bill', ' 0.246', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('908', ' Hatteberg, Scott', ' 0.28', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('909', ' Helms, Wes', ' 0.243', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('910', ' Helton, Todd', ' 0.329', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('911', ' Henderson, Rickey', ' 0.223', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('912', ' Henson, Drew', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('913', ' Hermansen, Chad', ' 0.207', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('914', ' Hernandez, Jose', ' 0.288', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('915', ' Hernandez, Ramon', ' 0.233', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('916', ' Hidalgo, Richard', ' 0.235', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('917', ' Higginson, Bobby', ' 0.282', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('918', ' Hill, Bobby', ' 0.253', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('919', ' Hillenbrand, Shea', ' 0.293', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('920', ' Hinch, A.J.', ' 0.249', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('921', ' Hinske, Eric', ' 0.279', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('922', ' Hocking, Denny', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('923', ' Hollandsworth, Todd', ' 0.284', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('924', ' Hollins, Dave', ' 0.118', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('925', ' Hoover, Paul', ' 0.176', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('926', ' Houston, Tyler', ' 0.281', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('927', ' Hubbard, Trenidad', ' 0.209', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('928', ' Huckaby, Ken', ' 0.245', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('929', ' Hudson, Orlando', ' 0.276', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('930', ' Huff, Aubrey', ' 0.313', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('931', ' Hundley, Todd', ' 0.211', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('932', ' Hunter, Brian L.', ' 0.269', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('933', ' Hunter, Torii', ' 0.289', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('934', ' Hyzdu, Adam', ' 0.232', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('935', ' Ibanez, Raul', ' 0.294', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('936', ' Infante, Omar', ' 0.333', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('937', ' Inge, Brandon', ' 0.202', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('938', ' Izturis, Cesar', ' 0.232', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('939', ' Jackson, Damian', ' 0.257', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('940', ' Jackson, Ryan', ' 0.333', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('941', ' Jenkins, Geoff', ' 0.243', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('942', ' Jensen, Marcus', ' 0.114', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('943', ' Jeter, Derek', ' 0.297', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('944', ' Jimenez, D\\\'Angelo', ' 0.252', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('945', ' Johnson, Charles', ' 0.217', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('946', ' Johnson, Mark', ' 0.209', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('947', ' Johnson, Mark P.', ' 0.137', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('948', ' Johnson, Nick', ' 0.243', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('949', ' Johnson, Russ', ' 0.216', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('950', ' Jones, Andruw', ' 0.264', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('951', ' Jones, Chipper', ' 0.327', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('952', ' Jones, Jacque', ' 0.3', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('953', ' Jordan, Brian', ' 0.285', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('954', ' Jose, Felix', ' 0.263', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('955', ' Justice, David', ' 0.266', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('956', ' Kapler, Gabe', ' 0.279', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('957', ' Karros, Eric', ' 0.271', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('958', ' Kearns, Austin', ' 0.315', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('959', ' Kelly, Kenny', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('960', ' Kendall, Jason', ' 0.283', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('961', ' Kennedy, Adam', ' 0.312', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('962', ' Kent, Jeff', ' 0.313', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('963', ' Kielty, Bobby', ' 0.291', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('964', ' Kingsale, Eugene', ' 0.283', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('965', ' Kinkade, Mike', ' 0.38', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('966', ' Klassen, Danny', ' 0.333', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('967', ' Klesko, Ryan', ' 0.3', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('968', ' Knoblauch, Chuck', ' 0.21', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('969', ' Konerko, Paul', ' 0.304', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('970', ' Koskie, Corey', ' 0.267', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('971', ' Kotsay, Mark', ' 0.292', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('972', ' Kreuter, Chad', ' 0.263', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('973', ' Lamb, David', ' 0.1', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('974', ' Lamb, Mike', ' 0.283', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('975', ' Lampkin, Tom', ' 0.217', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('976', ' Lane, Jason', ' 0.29', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('977', ' Langerhans, Ryan', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('978', ' Lankford, Ray', ' 0.224', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('979', ' Larkin, Barry', ' 0.245', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('980', ' LaRocca, Greg', ' 0.269', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('981', ' Larson, Brandon', ' 0.275', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('982', ' LaRue, Jason', ' 0.249', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('983', ' Lawrence, Joe', ' 0.18', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('984', ' Lawton, Matt', ' 0.236', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('985', ' LeCroy, Matt', ' 0.26', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('986', ' Ledee, Ricky', ' 0.227', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('987', ' Lee, Carlos', ' 0.264', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('988', ' Lee, Derrek', ' 0.27', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('989', ' Lee, Travis', ' 0.265', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('990', ' Leon, Jose', ' 0.247', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('991', ' Lesher, Brian', ' 0.132', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('992', ' Lewis, Darren', ' 0.241', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('993', ' Lieberthal, Mike', ' 0.279', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('994', ' Liefer, Jeff', ' 0.23', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('995', ' Little, Mark', ' 0.208', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('996', ' Lo Duca, Paul', ' 0.281', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('997', ' Lockhart, Keith', ' 0.216', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('998', ' Lofton, Kenny', ' 0.261', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('999', ' Lombard, George', ' 0.241', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1000', ' Long, Terrence', ' 0.24', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1001', ' Lopez, Felipe', ' 0.227', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1002', ' Lopez, Javy', ' 0.233', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1003', ' Lopez, Luis', ' 0.197', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1004', ' Lopez, Mendy', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1005', ' Loretta, Mark', ' 0.304', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1006', ' Lowell, Mike', ' 0.276', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1007', ' Ludwick, Ryan', ' 0.235', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1008', ' Lugo, Julio', ' 0.261', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1009', ' Lunar, Fernando', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1010', ' Lunsford, Trey', ' 0.667', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1011', ' Mabry, John', ' 0.276', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1012', ' Machado, Robert', ' 0.261', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1013', ' Macias, Jose', ' 0.249', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1014', ' Mackowiak, Rob', ' 0.244', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1015', ' Magee, Wendell', ' 0.271', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1016', ' Magruder, Chris', ' 0.217', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1017', ' Mahoney, Mike', ' 0.207', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1018', ' Malloy, Marty', ' 0.12', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1019', ' Marrero, Eli', ' 0.262', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1020', ' Martinez, Dave', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1021', ' Martinez, Edgar', ' 0.277', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1022', ' Martinez, Ramon', ' 0.271', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1023', ' Martinez, Tino', ' 0.262', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1024', ' Martinez, Victor', ' 0.281', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1025', ' Mateo, Henry', ' 0.174', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1026', ' Mateo, Ruben', ' 0.256', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1027', ' Matheny, Mike', ' 0.244', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1028', ' Matos, Julios', ' 0.238', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1029', ' Matos, Luis', ' 0.129', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1030', ' Matthews, Gary', ' 0.275', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1031', ' Mayne, Brent', ' 0.236', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1032', ' McCarty, David', ' 0.136', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1033', ' McCracken, Quinton', ' 0.309', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1034', ' McDonald, Donzell', ' 0.182', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1035', ' McDonald, John', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1036', ' McEwing, Joe', ' 0.199', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1037', ' McGriff, Fred', ' 0.273', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1038', ' McGuire, Ryan', ' 0.077', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1039', ' McKay, Cody', ' 0.667', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1040', ' McKeel, Walt', ' 0.308', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1041', ' McLemore, Mark', ' 0.27', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1042', ' Meares, Pat', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1043', ' Meluskey, Mitch', ' 0.222', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1044', ' Mench, Kevin', ' 0.26', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1045', ' Menechino, Frank', ' 0.205', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1046', ' Merced, Orlando', ' 0.287', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1047', ' Merloni, Lou', ' 0.247', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1048', ' Michaels, Jason', ' 0.267', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1049', ' Mientkiewicz, Doug', ' 0.261', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1050', ' Millar, Kevin', ' 0.306', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1051', ' Miller, Corky', ' 0.254', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1052', ' Miller, Damian', ' 0.249', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1053', ' Minor, Damon', ' 0.237', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1054', ' Mirabelli, Doug', ' 0.225', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1055', ' Moeller, Chad', ' 0.286', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1056', ' Mohr, Dustan', ' 0.269', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1057', ' Molina, Ben', ' 0.245', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1058', ' Molina, Izzy', ' 0.333', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1059', ' Molina, Jose', ' 0.271', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1060', ' Mondesi, Raul', ' 0.232', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1061', ' Monroe, Craig', ' 0.12', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1062', ' Mora, Melvin', ' 0.233', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1063', ' Mordecai, Mike', ' 0.245', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1064', ' Moriarty, Mike', ' 0.188', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1065', ' Morris, Warren', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1066', ' Mueller, Bill', ' 0.262', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1067', ' Munson, Eric', ' 0.186', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1068', ' Murray, Calvin', ' 0.146', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1069', ' Myers, Greg', ' 0.222', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1070', ' Nelson, Bryant', ' 0.265', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1071', ' Nevin, Phil', ' 0.285', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1072', ' Nieves, Jose', ' 0.289', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1073', ' Nieves, Wil', ' 0.181', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1074', ' Nixon, Trot', ' 0.256', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1075', ' Norton, Greg', ' 0.22', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1076', ' Nunez, Abraham', ' 0.233', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1077', ' Nunez, Abraham', ' 0.118', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1078', ' O\\\'Leary, Troy', ' 0.286', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1079', ' Ochoa, Alex', ' 0.261', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1080', ' Offerman, Jose', ' 0.232', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1081', ' Ojeda, Augie', ' 0.186', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1082', ' Olerud, John', ' 0.3', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1083', ' Olivo, Miguel', ' 0.211', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1084', ' Ordaz, Luis', ' 0.223', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1085', ' Ordonez, Magglio', ' 0.32', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1086', ' Ordonez, Rey', ' 0.254', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1087', ' Orie, Kevin', ' 0.281', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1088', ' Ortiz, David', ' 0.272', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1089', ' Ortiz, Hector', ' 0.214', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1090', ' Ortiz, Jose', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1091', ' Osik, Keith', ' 0.16', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1092', ' Overbay, Lyle', ' 0.1', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1093', ' Owens, Eric', ' 0.27', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1094', ' Ozuna, Pablo', ' 0.277', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1095', ' Palmeiro, Orlando', ' 0.3', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1096', ' Palmeiro, Rafael', ' 0.273', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1097', ' Palmer, Dean', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1098', ' Paquette, Craig', ' 0.194', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1099', ' Patterson, Corey', ' 0.253', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1100', ' Paul, Josh', ' 0.24', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1101', ' Payton, Jay', ' 0.303', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1102', ' Pelaez, Alex', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1103', ' Pellow, Kip', ' 0.238', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1104', ' Pena, Carlos', ' 0.242', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1105', ' Pena, Wily Mo', ' 0.222', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1106', ' Perez, Eddie', ' 0.214', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1107', ' Perez, Eduardo', ' 0.201', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1108', ' Perez, Neifi', ' 0.236', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1109', ' Perez, Timoniel', ' 0.295', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1110', ' Perez, Tomas', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1111', ' Perry, Chan', ' 0.091', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1112', ' Perry, Herbert', ' 0.276', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1113', ' Petrick, Ben', ' 0.211', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1114', ' Phelps, Josh', ' 0.309', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1115', ' Phillips, Brandon', ' 0.258', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1116', ' Phillips, Jason', ' 0.368', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1117', ' Piatt, Adam', ' 0.234', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1118', ' Piazza, Mike', ' 0.28', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1119', ' Pickering, Calvin', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1120', ' Pierre, Juan', ' 0.287', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1121', ' Pierzynski, A.J.', ' 0.3', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1122', ' Podsednik, Scott', ' 0.2', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1123', ' Polanco, Placido', ' 0.288', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1124', ' Posada, Jorge', ' 0.268', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1125', ' Pratt, Todd', ' 0.311', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1126', ' Prince, Tom', ' 0.224', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1127', ' Pujols, Albert', ' 0.314', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1128', ' Punto, Nick', ' 0.167', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1129', ' Quinn, Mark', ' 0.237', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1130', ' Raines, Tim', ' 0.191', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1131', ' Ramirez, Aramis', ' 0.234', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1132', ' Ramirez, Julio', ' 0.281', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1133', ' Ramirez, Manny', ' 0.349', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1134', ' Randa, Joe', ' 0.282', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1135', ' Ransom, Cody', ' 0.667', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1136', ' Reboulet, Jeff', ' 0.208', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1137', ' Redmond, Mike', ' 0.305', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1138', ' Reese, Pokey', ' 0.264', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1139', ' Relaford, Desi', ' 0.267', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1140', ' Renteria, Edgar', ' 0.305', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1141', ' Restovich, Mike', ' 0.308', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1142', ' Richard, Chris', ' 0.232', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1143', ' Rios, Armando', ' 0.264', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1144', ' Rivas, Luis', ' 0.256', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1145', ' Rivera, Juan', ' 0.265', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1146', ' Rivera, Mike', ' 0.227', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1147', ' Rivera, Ruben', ' 0.209', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1148', ' Roberts, Brian', ' 0.227', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1149', ' Roberts, Dave', ' 0.277', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1150', ' Robinson, Kerry', ' 0.26', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1151', ' Rodriguez, Alex', ' 0.3', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1152', ' Rodriguez, Henry', ' 0.05', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1153', ' Rodriguez, Ivan', ' 0.314', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1154', ' Rogers, Ed', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1155', ' Rolen, Scott', ' 0.266', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1156', ' Rollins, Jimmy', ' 0.245', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1157', ' Rolls, Damian', ' 0.292', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1158', ' Romano, Jason', ' 0.253', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1159', ' Ross, David', ' 0.2', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1160', ' Rowand, Aaron', ' 0.258', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1161', ' Ruan, Wilken', ' 0.273', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1162', ' Rushford, Jim', ' 0.143', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1163', ' Ryan, Mike', ' 0.091', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1164', ' Sadler, Donnie', ' 0.163', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1165', ' Saenz, Olmedo', ' 0.276', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1166', ' Salazar, Oscar', ' 0.19', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1167', ' Salmon, Tim', ' 0.286', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1168', ' Sanchez, Alex', ' 0.289', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1169', ' Sanchez, Freddy', ' 0.188', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1170', ' Sanchez, Rey', ' 0.286', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1171', ' Sandberg, Jared', ' 0.229', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1172', ' Sanders, Reggie', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1173', ' Santiago, Benito', ' 0.278', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1174', ' Santiago, Ramon', ' 0.243', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1175', ' Schneider, Brian', ' 0.275', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1176', ' Scutaro, Marcos', ' 0.222', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1177', ' Sears, Todd', ' 0.333', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1178', ' Segui, David', ' 0.263', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1179', ' Selby, Bill', ' 0.214', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1180', ' Sexson, Richie', ' 0.279', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1181', ' Sheets, Andy', ' 0.248', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1182', ' Sheffield, Gary', ' 0.307', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1183', ' Shinjo, Tsuyoshi', ' 0.238', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1184', ' Shumpert, Terry', ' 0.235', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1185', ' Sierra, Ruben', ' 0.27', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1186', ' Simon, Randall', ' 0.301', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1187', ' Singleton, Chris', ' 0.262', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1188', ' Smith, Bobby', ' 0.175', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1189', ' Smith, Jason', ' 0.2', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1190', ' Snead, Esix', ' 0.308', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1191', ' Snelling, Chris', ' 0.148', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1192', ' Snow, J.T.', ' 0.246', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1193', ' Snyder, Earl', ' 0.2', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1194', ' Soriano, Alfonso', ' 0.3', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1195', ' Sosa, Sammy', ' 0.288', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1196', ' Spencer, Shane', ' 0.247', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1197', ' Spiezio, Scott', ' 0.285', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1198', ' Spivey, Junior', ' 0.301', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1199', ' Stairs, Matt', ' 0.244', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1200', ' Stevens, Lee', ' 0.204', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1201', ' Stewart, Shannon', ' 0.303', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1202', ' Stinnett, Kelly', ' 0.226', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1203', ' Stynes, Chris', ' 0.241', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1204', ' Surhoff, B.J.', ' 0.293', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1205', ' Sutton, Larry', ' 0.105', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1206', ' Suzuki, Ichiro', ' 0.321', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1207', ' Swann, Pedro', ' 0.083', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1208', ' Sweeney, Mark', ' 0.169', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1209', ' Sweeney, Mike', ' 0.34', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1210', ' Taguchi, So', ' 0.4', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1211', ' Tarasco, Tony', ' 0.25', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1212', ' Tatis, Fernando', ' 0.228', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1213', ' Taubensee, Eddie', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1214', ' Taylor, Reggie', ' 0.254', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1215', ' Tejada, Miguel', ' 0.308', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1216', ' Thames, Marcus', ' 0.231', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1217', ' Thomas, Frank', ' 0.252', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1218', ' Thome, Jim', ' 0.304', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1219', ' Thompson, Ryan', ' 0.248', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1220', ' Thurston, Joe', ' 0.462', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1221', ' Toca, Jorge', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1222', ' Torcato, Tony', ' 0.273', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1223', ' Torrealba, Steve', ' 0.059', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1224', ' Torrealba, Yorvit', ' 0.279', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1225', ' Torres, Andres', ' 0.2', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1226', ' Trammell, Bubba', ' 0.243', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1227', ' Truby, Chris', ' 0.215', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1228', ' Tucker, Michael', ' 0.248', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1229', ' Tyner, Jason', ' 0.214', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1230', ' Ugueto, Luis', ' 0.217', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1231', ' Uribe, Juan', ' 0.24', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1232', ' Valdez, Mario', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1233', ' Valent, Eric', ' 0.2', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1234', ' Valentin, Javier', ' 0.5', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1235', ' Valentin, John', ' 0.24', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1236', ' Valentin, Jose', ' 0.249', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1237', ' Vander Wal, John', ' 0.26', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1238', ' Varitek, Jason', ' 0.266', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1239', ' Vaughn, Greg', ' 0.163', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1240', ' Vaughn, Mo', ' 0.259', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1241', ' Vazquez, Ramon', ' 0.274', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1242', ' Velarde, Randy', ' 0.226', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1243', ' Ventura, Robin', ' 0.247', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1244', ' Vidro, Jose', ' 0.315', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1245', ' Vina, Fernando', ' 0.27', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1246', ' Vizcaino, Jose', ' 0.303', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1247', ' Vizquel, Omar', ' 0.275', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1248', ' Walbeck, Matt', ' 0.235', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1249', ' Walker, Larry', ' 0.338', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1250', ' Walker, Todd', ' 0.299', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1251', ' Ward, Daryle', ' 0.276', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1252', ' Wathan, Dusty', ' 0.6', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1253', ' Wells, Vernon', ' 0.275', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1254', ' Werth, Jayson', ' 0.261', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1255', ' Wesson, Barry', ' 0.2', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1256', ' White, Rondell', ' 0.24', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1257', ' Widger, Chris', ' 0.297', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1258', ' Wigginton, Ty', ' 0.302', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1259', ' Wilkerson, Brad', ' 0.266', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1260', ' Williams, Bernie', ' 0.333', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1261', ' Williams, Gerald', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1262', ' Williams, Matt', ' 0.26', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1263', ' Wilson, Craig', ' 0.264', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1264', ' Wilson, Dan', ' 0.295', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1265', ' Wilson, Enrique', ' 0.181', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1266', ' Wilson, Jack', ' 0.252', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1267', ' Wilson, Preston', ' 0.243', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1268', ' Wilson, Tom', ' 0.257', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1269', ' Wilson, Vance', ' 0.245', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1270', ' Winn, Randy', ' 0.298', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1271', ' Wise, DeWayne', ' 0.179', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1272', ' Womack, Tony', ' 0.271', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1273', ' Woodward, Chris', ' 0.276', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1274', ' Wooten, Shawn', ' 0.292', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1275', ' Wright, Ron', ' 0', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1276', ' Young, Dmitri', ' 0.284', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1277', ' Young, Eric', ' 0.28', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1278', ' Young, Kevin', ' 0.246', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1279', ' Young, Michael', ' 0.262', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1280', ' Zaun, Greg', ' 0.222', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1281', ' Zeile, Todd', ' 0.273', '2005-01-01');
-INSERT INTO `testtbl` VALUES ('1282', ' Zinter, Alan', ' 0.136', '2005-01-01');
diff --git a/dojox/grid/compat/tests/support/yahoo_search.js b/dojox/grid/compat/tests/support/yahoo_search.js
deleted file mode 100644
index a013b5d..0000000
--- a/dojox/grid/compat/tests/support/yahoo_search.js
+++ /dev/null
@@ -1,131 +0,0 @@
-// model that works with Yahoo Search API
-dojo.declare("dojox.grid.data.yahooSearch", dojox.grid.data.dynamic, 
-	function(inFields, inData) {
-		this.rowsPerPage = 20;
-		this.fieldNames = [];
-		for (var i=0, f; (f=inFields[i]); i++)
-			this.fieldNames.push(f.name);
-	}, {
-	clearData: function() {
-		turbo.widgets.TurboGrid.data.dynamic.prototype.clearData.apply(this, arguments);
-	},
-	// server send / receive
-	encodeParam: function(inName, inValue) {
-		return turbo.printf('&%s=%s', inName, inValue);
-	},
-	getParams: function(inParams) {
-		var url = this.url;
-		url += '?appid=turboajax';
-		inParams = inParams || {};
-		inParams.output = 'json';
-		inParams.results = this.rowsPerPage;
-		inParams.query = turbo.$('searchInput').value.replace(/ /g, '+');
-		for (var i in inParams)
-			if (inParams[i] != undefined)
-				url += this.encodeParam(i, inParams[i]);
-		return url;
-	},
-	send: function(inAsync, inParams, inOnReceive, inOnError) {
-		var p = this.getParams(inParams);
-		dojo.io.bind({
-			url: "support/proxy.php",
-			method: "post",
-			content: {url: p },
-			contentType: "application/x-www-form-urlencoded; charset=utf-8",
-			mimetype: 'text/json',
-			sync: !inAsync,
-			load: turbo.bindArgs(this, "receive", inOnReceive, inOnError),
-			error: turbo.bindArgs(this, "error", inOnError) 
-		});
-		this.onSend(inParams);
-	},
-	receive: function(inOnReceive, inOnError, inEvt, inData) {
-		try {
-			inData = inData.ResultSet;
-			inOnReceive(inData);
-			this.onReceive(inData);					
-		} catch(e) {
-			if (inOnError)
-				inOnError(inData);
-		}
-	},
-	error: function(inOnError, inTyp, inErr) {
-		var m = 'io error: ' + inErr.message;
-		alert(m);
-		if (inOnError)
-			inOnError(m);
-	},
-	fetchRowCount: function(inCallback) {
-		this.send(true, inCallback );
-	},
-	// request data 
-	requestRows: function(inRowIndex, inCount)	{
-		inRowIndex = (inRowIndex == undefined ? 0 : inRowIndex);
-		var params = { 
-			start: inRowIndex + 1
-		}
-		this.send(true, params, turbo.bindArgs(this, this.processRows));
-	},
-	// server callbacks
-	processRows: function(inData) {
-		for (var i=0, l=inData.totalResultsReturned, s=inData.firstResultPosition; i<l; i++) {
-			this.setRow(inData.Result[i], s - 1 + i);
-		}
-		// yahoo says 1000 is max results to return
-		var c = Math.min(1000, inData.totalResultsAvailable);
-		if (this.count != c) {
-			this.setRowCount(c);
-			this.allChange();
-			this.onInitializeData(inData);
-		}
-	},
-	getDatum: function(inRowIndex, inColIndex) {
-		var row = this.getRow(inRowIndex);
-		var field = this.fields.get(inColIndex);
-		return (inColIndex == undefined ? row : (row ? row[field.name] : field.na));
-	},
-	// events
-	onInitializeData: turbo.nop,
-	onSend: turbo.nop,
-	onReceive: turbo.nop
-});
-
-// report
-modelChange = function() {
-	var n = turbo.$('rowCount');
-	if (n)
-		n.innerHTML = turbo.printf('about %s row(s)', model.count);
-}
-
-
-// some data formatters
-formatLink = function(inData, inRowIndex) {
-	if (!inData[0] || !inData[1])
-		return ' ';
-	return turbo.supplant('<a target="_blank" href="{href}">{text}</a>', {href: inData[0], text: inData[1] });
-};
-
-formatImage = function(inData, inRowIndex) {
-	if (!inData[0] || !inData[1])
-		return ' ';
-	var o = {
-		href: inData[0], 
-		src: inData[1].Url,
-		width: inData[1].Width,
-		height: inData[1].Height
-	}	
-	return turbo.supplant('<a href="{href}" target="_blank"><img border=0 src="{src}" width="{width}" height="{height}"></a>', o);
-};
-
-formatDate = function(inDatum, inRowIndex) {
-	if (inDatum == '')
-		return ' ';
-	var d = new Date(inDatum * 1000);
-	return turbo.printf('%s/%s/%s', d.getMonth(), d.getDate(), d.getFullYear());
-};
-
-formatDimensions = function(inData, inRowIndex) {
-	if (!inData[0] || !inData[1])
-		return ' ';
-	return inData[0] + ' x ' + inData[1];
-}
diff --git a/dojox/grid/compat/tests/test_change_structure.html b/dojox/grid/compat/tests/test_change_structure.html
deleted file mode 100644
index ddb45fd..0000000
--- a/dojox/grid/compat/tests/test_change_structure.html
+++ /dev/null
@@ -1,124 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>dojox.Grid Change Structure Example</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../_grid/Grid.css";
-		body {
-			font-size: 0.9em;
-			font-family: Geneva, Arial, Helvetica, sans-serif;
-		}
-		.heading {
-			font-weight: bold;
-			padding-bottom: 0.25em;
-		}
-				
-		#grid { 
-			border: 1px solid #333;
-			width: 48em;
-			height: 30em;
-		}
-		
-		#grid .dojoxGrid-cell {
-			text-align: center;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug:false, parseOnLoad: true"></script>
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");
-	</script>
-	<script type="text/javascript">
-
-		// get can return data for a cell of the grid
-		function get(inRowIndex) {
-			return [this.index, inRowIndex].join(', ');
-		}
-
-		// grid structure
-		// a grid view is a group of columns
-		
-		// a special view providing selection feedback
-		var rowBar = {type: 'dojox.GridRowView', width: '20px' };
-		
-		// a view without scrollbars
-		var view0 = {
-			noscroll: true,
-			cells: [[
-				{name: 'Alpha', value: '<input name="" type="checkbox" value="0">'},
-				{name: 'Beta', get: get, width: 4.5}
-		]]};
-		
-		var view1 = {
-			cells: [[
-				{name: 'Apple', value: '<button>Apple</button>'},
-				{name: 'Banana', get: get},
-				{name: 'Beans', value: 'Happy to be grid!'},
-				{name: 'Kiwi', get: get},
-				{name: 'Orange', value: '<img src="images/flatScreen.gif" height="48" width="48">'},
-				{name: 'Pear', get: get},
-				{name: 'Tomato', width: 20, value: '<input name="" type="file">'}
-		]]};
-		
-		var view2 = {
-			noscroll: true,
-			cells: [
-				[
-					{name: 'Alpha', value: '<input name="" type="checkbox" value="0">', rowSpan: 2},
-					{name: 'Beta', get: get, width: 4.5}
-				], [
-					{name: 'Gamma', get: get}
-				],
-				[
-					{name: 'Epsilon', value: '<button>Epsilon</button>', colSpan: 2}
-				]
-			]	
-		}
-		
-		var view3 = {
-			cells: [
-				[	
-					{name: 'Apple', value: '<button>Apple</button>', rowSpan: 3},
-					{name: 'Banana', get: get, width: 20},
-					{name: 'Kiwi', get: get, width: 20},
-					{name: 'Pear', get: get, width: 20}
-				],
-				[
-					{name: 'Beans', value: 'Happy to be grid!'},
-					{name: 'Orange', value: '<img src="images/flatScreen.gif" height="48" width="48">'},
-					{name: 'Tomato', value: '<input name="" type="file">'}
-				], [
-					{name: 'Zuchini', value: '<span style="letter-spacing: 10em;">wide</span>', colSpan: 3}
-				]
-			]};
-		
-		
-		// a grid structure is an array of views.
-		// By default the middle view will be 'elastic', sized to fit the remaining space left by other views
-		// grid.elasticView can also be manually set
-		var structure = [ rowBar, view0, view1 ];
-		var structure2 = [ rowBar, view2, view3 ];
-		
-		
-		var l2 = false;
-		toggleStructure = function() {
-			l2 = !l2;
-			grid.scrollToRow(0);
-			grid.setStructure(l2 ? structure2 : structure);
-		}
-		
-		dojo.addOnLoad(function() {
-			window["grid"] = dijit.byId("grid");
-		});
-</script>
-</head>
-<body>
-<div class="heading">dojox.VirtualGrid Change Structure Example</div>
-<p>
-	<button onclick="toggleStructure()">Change Structure</button>
-</p>	
-<div id="grid" dojoType="dojox.VirtualGrid" structure="structure" rowCount="100000" elasticView="2"></div>
-
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_custom_sort.html b/dojox/grid/compat/tests/test_custom_sort.html
deleted file mode 100644
index f09c936..0000000
--- a/dojox/grid/compat/tests/test_custom_sort.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>Custom Sort Test - dojox.Grid</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../_grid/Grid.css";
-		body {
-			font-size: 0.9em;
-			font-family: Geneva, Arial, Helvetica, sans-serif;
-		}
-		.heading {
-			font-weight: bold;
-			padding-bottom: 0.25em;
-		}
-				
-		#grid {
-			border: 1px solid #333;
-			width: 35em;
-			height: 30em;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug:false, parseOnLoad: true"></script>
-	<!--<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");
-	</script>-->
-	<!-- Debugging -->
-	<script type="text/javascript" src="../_grid/lib.js"></script>
-	<script type="text/javascript" src="../_grid/drag.js"></script>
-	<script type="text/javascript" src="../_grid/scroller.js"></script>
-	<script type="text/javascript" src="../_grid/builder.js"></script>
-	<script type="text/javascript" src="../_grid/cell.js"></script>
-	<script type="text/javascript" src="../_grid/layout.js"></script>
-	<script type="text/javascript" src="../_grid/rows.js"></script>
-	<script type="text/javascript" src="../_grid/focus.js"></script>
-	<script type="text/javascript" src="../_grid/selection.js"></script>
-	<script type="text/javascript" src="../_grid/edit.js"></script>
-	<script type="text/javascript" src="../_grid/view.js"></script>
-	<script type="text/javascript" src="../_grid/views.js"></script>
-	<script type="text/javascript" src="../_grid/rowbar.js"></script>
-	<script type="text/javascript" src="../_grid/publicEvents.js"></script>
-	<script type="text/javascript" src="../VirtualGrid.js"></script>
-	<script type="text/javascript" src="../_data/fields.js"></script>
-	<script type="text/javascript" src="../_data/model.js"></script>
-	<script type="text/javascript" src="../_data/editors.js"></script>
-	<script type="text/javascript" src="../Grid.js"></script>
-	<script type="text/javascript" src="support/test_data.js"></script>
-	<script type="text/javascript">
-		// here is a custom compare function that can drive the sorting engine
-		// of course, this is only valid for client-side data sets
-		compare2ndLetter = function(inA, inB) {
-			// sort on the second letter
-			// return <0, 0, >0
-			return inA.charCodeAt(1) - inB.charCodeAt(1);
-		}
-		
-		// custom compare functions for sorting belong to the data model
-		// data model keeps this kind of metadata in a object called 'fields'
-		
-		// you can install the custom compare function directly into fields
-		// model.fields.get(3).compare = compare2ndLetter;
-		
-		// or you could setup fields when instantiating the model
-		model = new dojox.grid.data.Table([{}, {}, {}, {compare: compare2ndLetter}], data);
-		
-		// a grid view is a group of columns
-		var view1 = {
-			cells: [[
-				{name: 'Column 0'}, {name: 'Column 1'}, {name: 'Column 2'}, {name: 'Column 3', width: "auto"}, {name: 'Column 4'}
-			],[
-				{name: 'Column 5'}, {name: 'Column 6'}, {name: 'Column 7'}, {name: 'Column 8', field: 3, colSpan: 2}
-			]]
-		};
-		// a grid layout is an array of views.
-		var layout = [ view1 ];
-</script>
-</head>
-<body>
-<div class="heading">dojox.Grid Custom Sort Test</div>
-<br />
-<b>Column 3</b>'s data field has a custom sorter that sorts by the 2nd letter in the string.
-<br /><br />
-<div id="grid" dojoType="dojox.Grid" model="model" structure="layout"></div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_dojo_data_edit.html b/dojox/grid/compat/tests/test_dojo_data_edit.html
deleted file mode 100644
index 176d3c2..0000000
--- a/dojox/grid/compat/tests/test_dojo_data_edit.html
+++ /dev/null
@@ -1,124 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>Test dojox.Grid Editing with DojoData model</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-<style>
-	@import "../../_grid/Grid.css";
-	body {
-		font-family: Tahoma, Arial, Helvetica, sans-serif;
-		font-size: 11px;
-	}
-	.dojoxGrid-row-editing td {
-		background-color: #F4FFF4;
-	}
-	.dojoxGrid input, .dojoxGrid select, .dojoxGrid textarea {
-		margin: 0;
-		padding: 0;
-		border-style: none;
-		width: 100%;
-		font-size: 100%;
-		font-family: inherit;
-	}
-	.dojoxGrid input {
-	}
-	.dojoxGrid select {
-	}
-	.dojoxGrid textarea {
-	}
-	#controls {
-		padding: 6px 0;
-	}
-	#grid {
-		width: 850px;
-		height: 350px;
-		border: 1px solid silver;
-	}
-</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" 
-		djConfig="isDebug: true, debugAtAllCosts: false, parseOnLoad: true"></script>
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.data.ItemFileWriteStore");
-		dojo.require("dojo.parser");
-	</script>
-
-	<script type="text/javascript">
-		function getRow(inRowIndex){
-			return ' ' + inRowIndex;
-		}
-		
-		var layoutCountries = [
-			// view 0
-			{ type: 'dojox.GridRowView', width: '20px' },
-			// view 1
-			{ cells: [[{ name: "Row", get: getRow, width: 5}]], noscroll: true},
-			// view 2
-			{ cells: [[
-				{ field: 0, width: 'auto' },
-				{ width: 8 }
-			]]}
-		];
-		
-		removeItem = function() {
-			// Removes the first item in the model from the store
-			// Grid should reflect removal of the first item and items should be re-indexed
-			jsonStore.deleteItem(dataModel.data[0].__dojo_data_item);
-		}
-		
-		var i = 0;
-		addItem = function() {
-			grid.addRow({name: "country"+(i++), type: "country"});
-		}
-		addItemToStore = function() {
-			// Adds a new item to the store
-			// Grid should reflect the new item.
-			jsonStore.newItem({name: "country"+(i++), type: "country"});
-		}
-	</script>
-</head>
-<body class="tundra">
-<h2>
-	dojox.Grid Basic Editing test
-</h2>
-<div id="controls">
-	<button onclick="grid.refresh()">Refresh</button>   
-	<button onclick="dataModel.clearData(true)">Clear Data (Model)</button>   
-	<button onclick="dataModel.refresh()">Refresh (Model)</button>   
-	<button onclick="grid.edit.focusEditor()">Focus Editor</button>
-	<button onclick="grid.focus.next()">Next Focus</button>   
-	<button onclick="addItem()">Add</button>
-	<button onclick="grid.removeSelectedRows()">Remove</button>   
-	<button onclick="jsonStore.revert()">Revert (Store)</button>
-	<button onclick="removeItem()">Remove (Store)</button>
-	<button onclick="addItemToStore()">Add (Store)</button>   
-	<button onclick="grid.edit.apply()">Apply</button>
-	<button onclick="grid.edit.cancel()">Cancel</button>   
-	<button onclick="grid.singleClickEdit = !grid.singleClickEdit">Toggle singleClickEdit</button> 
-</div>
-<span dojoType="dojo.data.ItemFileWriteStore" 
-	 jsId="jsonStore" url="../../../../dijit/tests/_data/countries.json">
-</span>
-<span dojoType="dojox.grid.data.DojoData" 
-	  jsId="dataModel" 
-	  rowsPerPage="20"
-	  store="jsonStore" 
-	  query="{ name : '*' }">
-</span>
-<div id="grid" jsId="grid" dojoType="dojox.Grid" elasticView="2" 
-	 model="dataModel" structure="layoutCountries">
-</div>
-<span dojoType="dojox.grid.data.DojoData" 
-	  jsId="dataModel2" 
-	  rowsPerPage="20"
-	  store="jsonStore" 
-	  query="{ name : '*' }">
-</span>
-<div id="grid2" dojoType="dojox.Grid" elasticView="2" 
-	 model="dataModel2" structure="layoutCountries">
-</div>
-</body>
-</html>
-
-
-
diff --git a/dojox/grid/compat/tests/test_dojo_data_empty.html b/dojox/grid/compat/tests/test_dojo_data_empty.html
deleted file mode 100644
index 4f9c1e2..0000000
--- a/dojox/grid/compat/tests/test_dojo_data_empty.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
-<html> 
-<head> 
-<title>dojox.Grid with Dojo.Data via binding</title> 
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta> 
-	<style type="text/css"> 
-		@import "../../../../dojo/resources/dojo.css"; 
-		@import "../../_grid/Grid.css"; 
-		#grid { 
-			width: 65em; 
-			height: 25em; 
-		}
-	</style> 
-	<script type="text/javascript" src="../../../../dojo/dojo.js"  
-					djConfig="isDebug: true, debugAtAllCosts: false, parseOnLoad: true"></script> 
-	<script type="text/javascript"> 
-					dojo.require("dojox.grid.Grid"); 
-					dojo.require("dojo.data.ItemFileWriteStore"); 
-					dojo.require("dojo.parser"); 
-					dojo.require("dijit.form.Button"); 
-	</script> 
-	<script type="text/javascript"> 
-		function getRow(inRowIndex){ 
-						return ' ' + inRowIndex; 
-		}
-
-		var layoutCountries = [ 
-						// view 0 
-						{ type: 'dojox.GridRowView', width: '20px' }, 
-						// view 1 
-						{ cells: [[{ name: "Row", get: getRow, width: 5}]], noscroll: true}, 
-						// view 2 
-						{ cells: [[ 
-										{ name: "field 0", field: 0, width: 8 }, 
-										{ name: "field 1", width: 8 } 
-						]]} 
-		];
-		
-		var emptyData = { identifier: 'name', label: 'name', items: []}; 
-		var jsonStore = new dojo.data.ItemFileWriteStore({data: emptyData}); 
-		var numItems = 0; 
-	</script> 
-</head> 
-<body class="tundra"> 
-				<h5>dojox.Grid using initially-empty Dojo.Data write stores and then adding an item.  Item should show up correctly (no "?"s) when added.</h5> 
-		<br> 
-				<span dojoType="dojox.grid.data.DojoData"  
-								jsId="dataModel"  
-								rowsPerPage="20" 
-								store="jsonStore" count="0"> 
-				</span> 
-				<div id="grid" dojoType="dojox.Grid" elasticView="2"  
-								model="dataModel" structure="layoutCountries"> 
-				</div> 
-				<button dojoType="dijit.form.Button"> 
-								<script type="dojo/method" event="onClick"> 
-												numItems++; 
-												jsonStore.newItem({name: numItems + "-person Land", type: "city", population: numItems}); 
-								</script> 
-								Add Item 
-				</button> 
-</body> 
-</html> 
\ No newline at end of file
diff --git a/dojox/grid/compat/tests/test_dojo_data_model.html b/dojox/grid/compat/tests/test_dojo_data_model.html
deleted file mode 100644
index 94447b1..0000000
--- a/dojox/grid/compat/tests/test_dojo_data_model.html
+++ /dev/null
@@ -1,84 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>dojox.Grid with Dojo.Data via binding</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../../../dojo/resources/dojo.css";
-		@import "../../_grid/tundraGrid.css";
-		
-		#grid, #grid2 {
-			width: 65em;
-			height: 25em;
-			padding: 1px;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" 
-		djConfig="isDebug: true, debugAtAllCosts: false, parseOnLoad: true"></script>
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.data.ItemFileReadStore");
-		dojo.require("dojox.data.CsvStore");
-		dojo.require("dojo.parser");
-	</script>
-	<script type="text/javascript">
-		function getRow(inRowIndex){
-			return ' ' + inRowIndex;
-		}
-		
-		var layoutMovies = [
-			// view 0
-			{ type: 'dojox.GridRowView', width: '20px' },
-			// view 1
-			{ cells: [[{ name: "Row", get: getRow, width: 5}]], noscroll: true},
-			// view 2
-			{ cells: [[
-				{ field: "Title", width: 'auto' },
-				{ field: "Year", width: 5 },
-				{ field: "Producer", width: 20 }
-			]]}
-		];
-		
-		var layoutCountries = [
-			// view 0
-			{ type: 'dojox.GridRowView', width: '20px' },
-			// view 1
-			{ cells: [[{ name: "Row", get: getRow, width: 5}]], noscroll: true},
-			// view 2
-			{ cells: [[
-				{ field: 0, width: 'auto' },
-				{ width: 8 }
-			]]}
-		];
-	</script>
-</head>
-<body class="tundra">
-	<h5>dojox.Grid using Dojo.Data stores via simple binding</h5>
-	<span dojoType="dojox.data.CsvStore" 
-		jsId="csvStore" url="support/movies.csv">
-	</span>
-	<span dojoType="dojox.grid.data.DojoData" 
-		jsId="dataModel"
-		store="csvStore"
-		rowsPerPage="5"
-		query="{ Title: '*' }"
-		clientSort="true">
-	</span>
-	<div id="grid" dojoType="dojox.Grid" elasticView="2" 
-		model="dataModel" structure="layoutMovies">
-	</div>
-
-	<span dojoType="dojo.data.ItemFileReadStore" 
-		jsId="jsonStore" url="../../../../dijit/tests/_data/countries.json">
-	</span>
-	<span dojoType="dojox.grid.data.DojoData" 
-		jsId="dataModel2" 
-		rowsPerPage="20"
-		store="jsonStore" 
-		query="{ name : '*' }">
-	</span>
-	<div id="grid2" dojoType="dojox.Grid" elasticView="2" 
-		model="dataModel2" structure="layoutCountries">
-	</div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_dojo_data_model_EmptyResultSet.html b/dojox/grid/compat/tests/test_dojo_data_model_EmptyResultSet.html
deleted file mode 100644
index 7739acf..0000000
--- a/dojox/grid/compat/tests/test_dojo_data_model_EmptyResultSet.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>dojox.Grid with Dojo.Data via binding</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../../../dojo/resources/dojo.css";
-		@import "../../_grid/tundraGrid.css";
-		
-		#grid {
-			width: 65em;
-			height: 25em;
-			padding: 1px;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" 
-		djConfig="isDebug: true, debugAtAllCosts: false, parseOnLoad: true"></script>
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.data.ItemFileReadStore");
-		dojo.require("dojo.parser");
-	</script>
-	<script type="text/javascript">
-		function getRow(inRowIndex){
-			return ' ' + inRowIndex;
-		}
-    
-		var layoutCountries = [
-			// view 0
-			{ type: 'dojox.GridRowView', width: '20px' },
-			// view 1
-			{ cells: [[{ name: "Row", get: getRow, width: 5}]], noscroll: true},
-			// view 2
-			{ cells: [[
-				{ name: "field 0", field: 0, width: 8 },
-				{ name: "field 1", width: 8 }
-			]]}
-		];
-	</script>
-</head>
-<body class="tundra">
-	<h5>dojox.Grid using Dojo.Data stores where a query returns no results.  No errors should be reported in Firebug and the grid should be empty</h5>
-    <br>
-	<span dojoType="dojo.data.ItemFileReadStore" 
-		jsId="jsonStore" url="../../../../dijit/tests/_data/countries.json">
-	</span>
-	<span dojoType="dojox.grid.data.DojoData" 
-		jsId="dataModel" 
-		rowsPerPage="20"
-		store="jsonStore" 
-		query="{ noSuchAttr : '*' }">
-	</span>
-	<div id="grid" dojoType="dojox.Grid" elasticView="2" 
-		model="dataModel" structure="layoutCountries">
-	</div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_dojo_data_model_multiStores.html b/dojox/grid/compat/tests/test_dojo_data_model_multiStores.html
deleted file mode 100644
index 2c69233..0000000
--- a/dojox/grid/compat/tests/test_dojo_data_model_multiStores.html
+++ /dev/null
@@ -1,291 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>dojox.Grid with Dojo.Data via binding.  Multiple Store implementations.</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../../../dijit/themes/tundra/tundra.css";
-		@import "../../../../dojo/resources/dojo.css";
-		@import "../../../../dijit/tests/css/dijitTests.css";
-		@import "../../_grid/tundraGrid.css";
-		
-		#grid, #grid2, #grid3, #grid4, #grid5, #grid6{
-			width: 65em;
-			height: 25em;
-			padding: 1px;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" 
-		djConfig="isDebug: true, debugAtAllCosts: false, parseOnLoad: true"></script>
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.data.ItemFileReadStore");
-		dojo.require("dojox.data.CsvStore");
-		dojo.require("dojox.data.XmlStore");
-		dojo.require("dojox.data.FlickrStore");
-		dojo.require("dojox.data.OpmlStore");
-		dojo.require("dojox.data.HtmlStore");
-		dojo.require("dojo.parser");
-	</script>
-
-	<script type="text/javascript">
-		function getRow(inRowIndex){
-			return ' ' + inRowIndex;
-		}
-		
-		var formatHref = function(attribute, rowIndex) {
-			model = dataModel4;
-			if(!model)
-				return "?";
-			var value = model.getRow(rowIndex);
-			if(value && value[attribute])
-				return "<a href=\"" + value[attribute] + "\" target=\"_blank\">Image Link</a>";
-			return "";
-		}
-
-		var layoutMovies = [
-			// view 0
-			{ type: 'dojox.GridRowView', width: '20px' },
-			// view 1
-			{ cells: [[{ name: "Row", get: getRow, width: 5}]], noscroll: true},
-			// view 2
-			{ cells: [[
-				{ field: "Title", width: 'auto' },
-				{ field: "Year", width: 5 },
-				{ field: "Producer", width: 20 }
-			]]}
-		];
-		
-		var layoutCountries = [
-			// view 0
-			{ type: 'dojox.GridRowView', width: '20px' },
-			// view 1
-			{ cells: [[{ name: "Row", get: getRow, width: 5}]], noscroll: true},
-			// view 2
-			{ cells: [[
-				{ field: 0, width: 'auto' },
-				{ width: 8 }
-			]]}
-		];
-
-		var layoutBooks = [
-			// view 0
-			{ type: 'dojox.GridRowView', width: '20px' },
-			// view 1
-			{ cells: [[{ name: "Row", get: getRow, width: 5}]], noscroll: true},
-			// view 2
-			{ cells: [[
-				{ field: "title", width: 'auto' },
-				{ field: "isbn", width: '8' }
-			]]}
-		];
-
-		//Lay out the Flickr data so one column is a URL.  This makes use of the
-		//get function of a cell.
-		var layoutFlickrData = [
-			// view 0
-			{ type: 'dojox.GridRowView', width: '20px' },
-			// view 1
-			{ cells: [[{ name: "Row", get: getRow, width: 5}]], noscroll: true},
-			// view 2
-			{ cells: [[
-				{ name: "Title", field: "title", width: 'auto' },
-				{ name: "Image URL", field: "imageUrl", width: '15', get: dojo.partial(formatHref, "imageUrl")}
-			]]}
-		];
-
-		var layoutOpmlData = [
-			// view 0
-			{ type: 'dojox.GridRowView', width: '20px' },
-			// view 1
-			{ cells: [[{ name: "Row", get: getRow, width: 5}]], noscroll: true},
-			// view 2
-			{ cells: [[
-				{ name: 'Name', field: 'text', width: 'auto'},
-				{ name: 'Type', field: 'type', width: '8' }
-			]]}
-		];
-
-		var layoutHtmlTable = [
-			// view 0
-			{ type: 'dojox.GridRowView', width: '20px' },
-			// view 1
-			{ cells: [[{ name: "Row", get: getRow, width: 5}]], noscroll: true},
-			// view 2
-			{ cells: [[
-				{ name: 'Column 1', field: 'Column 1', width: 'auto'},
-				{ name: 'Column 2', field: 'Column 2', width: 'auto'},
-				{ name: 'Column 3', field: 'Column 3', width: 'auto'},
-				{ name: 'Column 4', field: 'Column 4', width: 'auto'}
-			]]}
-		];
-	</script>
-</head>
-<body class="tundra">
-	<h1>dojox.Grid using Dojo.Data stores via simple binding with multiple store implementations.</h1>
-	<p>
-		This page demonstrates the Grid can display data accessed by dojo.data implementing Datastores.  
-		Each of the datastores used stores data in a different format, and as this test and demonstration
-		page shows, the logic for rendering the data is virtually identical.  You define your source store,
-		you define the model for accessing the data, which is ij this case the dojox.grid.data.DojoData model
-		and then you define the layout, which maps the data attribute names to columns in the grid.  You can 
-		even perform cusomization of what is displayed, as demonstrated in the dojox.data.FlickrStore layout.  
-		The image url is displayed as a clickable link that opens a new page.
-	</p>
-	<p>
-		The choice of stores used were ones that did not require back end services to function for sake of 
-		simplicity.  There is no reason that dojox.data.QueryReadStore could not be used with grid as well,
-		it just requires a back end service to send it the query results.
-	</p>
-	<p><b>Stores used:</b></p>
-	<ul>
-		<li>dojo.data.ItemFileReadStore</li>
-		<li>dojox.data.CvsStore</li>
-		<li>dojox.data.XmlStore</li>
-		<li>dojox.data.FlickrStore</li>
-		<li>dojox.data.OpmlStore</li>
-		<li>dojox.data.HtmlTableStore</li>
-	</ul>
-
-	<h2>dojo.data.ItemFileReadStore:</h2>
-	<i>Displays a list of countries through ItemFileReadStore format.</i>
-	<span dojoType="dojo.data.ItemFileReadStore" 
-		jsId="jsonStore" url="../../../../dijit/tests/_data/countries.json">
-	</span>
-	<span dojoType="dojox.grid.data.DojoData" 
-		jsId="dataModel" 
-		rowsPerPage="20"
-		store="jsonStore" 
-		query="{ name : '*' }">
-	</span>
-	<div id="grid" dojoType="dojox.Grid" elasticView="2" 
-		model="dataModel" structure="layoutCountries">
-	</div>
-
-
-	<h2>dojox.data.CsvStore:</h2>
-	<i>Displays a list of movies that were stored in CSV format.</i>
-	<span dojoType="dojox.data.CsvStore" 
-		jsId="csvStore" url="support/movies.csv">
-	</span>
-	<span dojoType="dojox.grid.data.DojoData" 
-		jsId="dataModel2"
-		store="csvStore"
-		rowsPerPage="5"
-		query="{ Title: '*' }"
-		clientSort="true">
-	</span>
-	<div id="grid2" dojoType="dojox.Grid" elasticView="2" 
-		model="dataModel2" structure="layoutMovies">
-
-	</div>
-
-	<h2>dojox.data.XmlStore:</h2>
-	<i>Displays a list of books that were stored in XML format.</i>
-	<span dojoType="dojox.data.XmlStore" 
-		jsId="xmlStore" url="support/books.xml">
-	</span>
-	<span dojoType="dojox.grid.data.DojoData" 
-		jsId="dataModel3" 
-		rowsPerPage="5"
-		store="xmlStore" 
-		query="{ title : '*' }">
-	</span>
-	<div id="grid3" dojoType="dojox.Grid" elasticView="2" 
-		model="dataModel3" structure="layoutBooks">
-	</div>
-
-
-	<h2>dojox.data.FlickrStore:</h2>
-	<i>Displays Flickr imformation on 3DNY (Dojo Developer Days, New York) from the flickr public photo feed, accessed via the FlickrStore dojo.data implementation.</i>
-	<span dojoType="dojox.data.FlickrStore" 
-		jsId="flickrStore">
-	</span>
-	<span dojoType="dojox.grid.data.DojoData" 
-		jsId="dataModel4" 
-		rowsPerPage="5"
-		store="flickrStore" 
-		query="{ tags : '3dny' }">
-	</span>
-	<div id="grid4" dojoType="dojox.Grid" elasticView="2" 
-		model="dataModel4" structure="layoutFlickrData">
-	</div>
-
-
-	<h2>dojox.data.OpmlStore:</h2>
-	<i>Scans an Opml based document for all items of type 'country'</i> 
-	<span dojoType="dojox.data.OpmlStore" 
-		jsId="opmlStore" url="support/geography.xml">
-	</span>
-	<span dojoType="dojox.grid.data.DojoData" 
-		jsId="dataModel5" 
-		rowsPerPage="5"
-		store="opmlStore" 
-		query="{ type : 'country' }"
-		queryOptions="{deep: true}"
-		sortFields="[ { attribute : 'text' } ]">
-	</span>
-	<div id="grid5" dojoType="dojox.Grid" elasticView="2" 
-		model="dataModel5" structure="layoutOpmlData">
-	</div>
-
-
-	<h2>dojox.data.HtmlStore:</h2>
-	<i>Loads the grid from an HTML Table.</i> 
-	<span dojoType="dojox.data.HtmlStore" 
-		jsId="htmlStore" dataId="tableExample">
-	</span>
-	<span dojoType="dojox.grid.data.DojoData" 
-		jsId="dataModel6" 
-		rowsPerPage="5"
-		store="htmlStore" 
-		query="{}">
-	</span>
-	<div id="grid6" dojoType="dojox.Grid" elasticView="2" 
-		model="dataModel6" structure="layoutHtmlTable">
-	</div>
-
-	<!-- 
-		Inline data table to be displayed bu the grid! 
-		This is accessed via the dojox.data.HtmlTableStore
-	-->
-	<table id="tableExample" style="display: none;">
-		<thead>
-			<tr>
-				<th>Column 1</th>
-				<th>Column 2</th>
-				<th>Column 3</th>
-				<th>Column 4</th>
-			</tr>
-		</thead>
-		<tbody>
-			<tr>
-				<td>This</td>
-				<td>is</td>
-				<td></td>
-				<td>empty in column 3</td>
-			</tr>
-			<tr>
-				<td>This</td>
-				<td>is</td>
-				<td>a</td>
-				<td>value</td>
-			</tr>
-			<tr>
-				<td>Who?</td>
-				<td>What?</td>
-				<td>When?</td>
-				<td>Where?</td>
-			</tr>
-			<tr>
-				<td>She</td>
-				<td>sells</td>
-				<td>sea</td>
-				<td>shells</td>
-			</tr>
-		</tbody>
-	</table>
-</body>
-</html>
-
-
diff --git a/dojox/grid/compat/tests/test_dojo_data_model_processError.html b/dojox/grid/compat/tests/test_dojo_data_model_processError.html
deleted file mode 100644
index 68f3710..0000000
--- a/dojox/grid/compat/tests/test_dojo_data_model_processError.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>dojox.Grid with Dojo.Data model with trapping of data store errors.</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../../../dijit/themes/tundra/tundra.css";
-		@import "../../../../dojo/resources/dojo.css";
-		@import "../../../../dijit/tests/css/dijitTests.css";
-		@import "../../_grid/tundraGrid.css";
-		
-		#grid{
-			width: 65em;
-			height: 25em;
-			padding: 1px;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" 
-		djConfig="isDebug: true, debugAtAllCosts: false, parseOnLoad: true"></script>
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojox.data.CsvStore");
-		dojo.require("dojo.parser");
-	</script>
-
-	<script type="text/javascript">
-		var layoutMovies = [
-			{ cells: [[
-				{ name: "Title", field: "Title", width: 'auto' },
-				{ name: "Year", field: "Year", width: 5 },
-				{ name: "Producer", field: "Producer", width: 20 }
-			]]}
-		];
-		
-	</script>
-</head>
-<body class="tundra">
-	<h1>dojox.Grid using Dojo.Data stores via simple binding</h1>
-
-	<h2>dojox.data.CsvStore:</h2>.
-	<i>This grid does not load data.  The data store references a non-existent URL on purpose.  It should trigger a failure that we catch and display in an alert</i>
-	<span dojoType="dojox.data.CsvStore" 
-		jsId="csvStore" url="support/NoSuchMovieFile.csv">
-	</span>
-	<span dojoType="dojox.grid.data.DojoData" 
-		jsId="dataModel"
-		store="csvStore"
-		rowsPerPage="5"
-		query="{ Title: '*' }"
-		clientSort="true">
-		<!-- 
-			This uses the dojo/connect API to link to the processError handler of the model. 
-			It allows a declarative way to hook to the handler on the model.
-		-->
-		<script type="dojo/connect" event="processError" args="error, request">
-			alert("Error was encountered when store was queried: " + dojo.toJson(error, true));
-		</script>
-	</span>
-	<div id="grid" dojoType="dojox.Grid" elasticView="2" 
-		model="dataModel" structure="layoutMovies">
-	</div>
-</body>
-</html>
-
-
diff --git a/dojox/grid/compat/tests/test_dojo_data_notification.html b/dojox/grid/compat/tests/test_dojo_data_notification.html
deleted file mode 100644
index 5ed8c29..0000000
--- a/dojox/grid/compat/tests/test_dojo_data_notification.html
+++ /dev/null
@@ -1,114 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
-	"http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>dojox.Grid with Dojo.Data via binding</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../_grid/tundraGrid.css";
-		@import "../../../../dojo/resources/dojo.css";
-		@import "../../../../dijit/themes/tundra/tundra.css";
-		@import "../../../../dijit/tests/css/dijitTests.css";
-		
-		#grid, #grid2, #grid3 {
-			width: 65em;
-			height: 25em;
-			padding: 1px;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" 
-		djConfig="isDebug: true, debugAtAllCosts: false, parseOnLoad: true"></script>
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojox.data.CsvStore");
-		dojo.require("dojo.data.ItemFileWriteStore");
-		dojo.require("dojo.parser");
-	</script>
-	<script type="text/javascript">
-		function getRow(inRowIndex){
-			return ' ' + inRowIndex;
-		}
-
-		var iEditor = dojox.grid.editors.Input;
-		var layoutMovies = [
-			// view 0
-			{ type: 'dojox.GridRowView', width: '20px' },
-			// view 1
-			{ cells: [[{ name: "Row", get: getRow, width: 5}]], noscroll: true},
-			// view 2
-			{ cells: [[
-				{ field: "Title", editor: iEditor, width: 'auto' },
-				{ field: "Year",  editor: iEditor, width: 5 },
-				{ field: "Producer", editor: iEditor, width: 20 }
-			]]}
-		];
-
-		var layoutCountries = [
-			// view 0
-			{ type: 'dojox.GridRowView', width: '20px' },
-			// view 1
-			{ cells: [[{ name: "Row", get: getRow, width: 5}]], noscroll: true},
-			// view 2
-			{ cells: [[
-				{ field: "name", name: "Name", width: 'auto' },
-				{ field: "type", name: "Type", editor: iEditor, width: 'auto' }
-			]]}
-		];
-	</script>
-</head>
-<body class="tundra">
-	<h1>dojox.Grid using Dojo.Data stores via simple binding</h1>
-	<!--
-	<br>
-	<span dojoType="dojox.data.CsvStore" 
-		jsId="csvStore" url="support/movies.csv">
-	</span>
-	<span dojoType="dojox.grid.data.DojoData" 
-		jsId="dataModel"
-		store="csvStore"
-		rowsPerPage="5"
-		query="{ Title: '*' }"
-		clientSort="true">
-	</span>
-	<div id="grid" dojoType="dojox.Grid" elasticView="2" 
-		model="dataModel" structure="layoutMovies">
-	</div>
-	-->
-	<br>
-	<h3>Update some of the types</h3>
-	<button onclick="updateCountryTypes();">Go!</button>
-	<script>
-		function updateCountryTypes(){
-			// get everything starting with "A"
-			jsonStore.fetch({
-				query: { name: "A*" },
-				onComplete: function(items, result){
-					// change 'em!
-					dojo.forEach(items, function(item){
-						jsonStore.setValue(item, "type", "thinger");
-						// console.debug(item);
-					});
-				}
-			});
-		}
-	</script>
-
-	<span dojoType="dojo.data.ItemFileWriteStore" 
-		jsId="jsonStore" url="../../../../dijit/tests/_data/countries.json">
-	</span>
-	<span dojoType="dojox.grid.data.DojoData" 
-		jsId="dataModel2" 
-		rowsPerPage="20"
-		store="jsonStore" 
-		clientSort="true"
-		query="{ name : '*' }">
-	</span>
-	<div id="grid2" dojoType="dojox.Grid" elasticView="2" 
-		model="dataModel2" structure="layoutCountries">
-	</div>
-
-	<div id="grid3" dojoType="dojox.Grid" elasticView="2" 
-		model="dataModel2" structure="layoutCountries">
-	</div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_edit.html b/dojox/grid/compat/tests/test_edit.html
deleted file mode 100644
index 016433a..0000000
--- a/dojox/grid/compat/tests/test_edit.html
+++ /dev/null
@@ -1,149 +0,0 @@
-<!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">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-<title>Test dojox.Grid Editing</title>
-<style>
-	@import "../../_grid/Grid.css";
-	body {
-		font-family: Tahoma, Arial, Helvetica, sans-serif;
-		font-size: 11px;
-	}
-	.dojoxGrid-row-editing td {
-		background-color: #F4FFF4;
-	}
-	.dojoxGrid input, .dojoxGrid select, .dojoxGrid textarea {
-		margin: 0;
-		padding: 0;
-		border-style: none;
-		width: 100%;
-		font-size: 100%;
-		font-family: inherit;
-	}
-	.dojoxGrid input {
-	}
-	.dojoxGrid select {
-	}
-	.dojoxGrid textarea {
-	}
-	#controls {
-		padding: 6px 0;
-	}
-	#grid {
-		width: 850px;
-		height: 350px;
-		border: 1px solid silver;
-	}
-</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug:false, parseOnLoad: true"></script>
-	<!--<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");
-	</script>-->
-	<!-- Debugging -->
-	<script type="text/javascript" src="../_grid/lib.js"></script>
-	<script type="text/javascript" src="../_grid/drag.js"></script>
-	<script type="text/javascript" src="../_grid/scroller.js"></script>
-	<script type="text/javascript" src="../_grid/builder.js"></script>
-	<script type="text/javascript" src="../_grid/cell.js"></script>
-	<script type="text/javascript" src="../_grid/layout.js"></script>
-	<script type="text/javascript" src="../_grid/rows.js"></script>
-	<script type="text/javascript" src="../_grid/focus.js"></script>
-	<script type="text/javascript" src="../_grid/selection.js"></script>
-	<script type="text/javascript" src="../_grid/edit.js"></script>
-	<script type="text/javascript" src="../_grid/view.js"></script>
-	<script type="text/javascript" src="../_grid/views.js"></script>
-	<script type="text/javascript" src="../_grid/rowbar.js"></script>
-	<script type="text/javascript" src="../_grid/publicEvents.js"></script>
-	<script type="text/javascript" src="../VirtualGrid.js"></script>
-	<script type="text/javascript" src="../_data/fields.js"></script>
-	<script type="text/javascript" src="../_data/model.js"></script>
-	<script type="text/javascript" src="../_data/editors.js"></script>
-	<script type="text/javascript" src="../Grid.js"></script>
-	<script type="text/javascript">
-	// ==========================================================================
-	// Create a data model
-	// ==========================================================================
-	data = [ 
-		[ 0, false, "new", 'But are not followed by two hexadecimal', 29.91, 10, false ],
-		[ 1, false, "new", 'Because a % sign always indicates', 9.33, -5, false ],
-		[ 1, false, "read", 'Signs can be selectively', 19.34, 0, true ],
-		[ 2, false, "read", 'However the reserved characters', 15.63, 0, true ],
-		[ 0, false, "replied", 'It is therefore necessary', 24.22, 5.50, true ],
-		[ 1, false, "replied", 'To problems of corruption by', 9.12, -3, true ],
-		[ 2, false, "replied", 'Which would simply be awkward in', 12.15, -4, false ]
-	];
-	var rows = 10000;
-	for(var i=0, l=data.length; i<rows-l; i++){
-		data.push(data[i%l].slice(0));
-	}
-	model = new dojox.grid.data.Table(null, data);
-	// ==========================================================================
-	// Tie some UI to the data model
-	// ==========================================================================
-	model.observer(this);
-	modelChange = function() {
-		dojo.byId("rowCount").innerHTML = 'Row count: ' + model.count; 
-	}
-	// ==========================================================================
-	// Custom formatter
-	// ==========================================================================
-	formatMoney = function(inDatum) {
-		return isNaN(inDatum) ? '...' : '$' + parseFloat(inDatum).toFixed(2);
-	}
-	// ==========================================================================
-	// Grid structure
-	// ==========================================================================
-	statusCell = { field: 2, name: 'Status', styles: 'text-align: center;', editor: dojox.grid.editors.Select, options: [ "new", "read", "replied" ] };
-	gridLayout = [{
-		type: 'dojox.GridRowView', width: '20px'
-	},{
-		defaultCell: { width: 8, editor: dojox.grid.editors.Input, styles: 'text-align: right;'  },
-		rows: [[
-			{ name: 'Id', width: 3, get: function(inRowIndex) { return inRowIndex+1;} },
-			{ name: 'Priority', styles: 'text-align: center;', editor: dojox.grid.editors.Select, options: ["normal", "note", "important"], values: [0, 1, 2], formatter: function(inDatum) { return this.options[inDatum]}},
-			{ name: 'Mark', width: 3, styles: 'text-align: center;', editor: dojox.grid.editors.Bool },
-			statusCell,
-			{ name: 'Message', styles: '', width: '100%' },
-			{ name: 'Amount', formatter: formatMoney },
-			{ name: 'Amount', field: 4, formatter: formatMoney }
-		]]
-	},{
-		defaultCell: { width: 4, editor: dojox.grid.editors.Input, styles: 'text-align: right;' },
-		rows: [[
-			{ name: 'Mark', width: 3, field: 1, styles: 'text-align: center;', editor: dojox.grid.editors.Bool}, 
-			statusCell,
-			{ name: 'Amount', field: 4, formatter: formatMoney},
-			{ name: 'Detail', value: 'Detail'}
-		]]
-	}];
-	// ==========================================================================
-	// UI Action
-	// ==========================================================================
-	addRow = function(){
-		grid.addRow([ "normal", false, "new", 'Now is the time for all good men to come to the aid of their party.', 99.99, 9.99, false ]);
-	}
-</script>
-</head>
-<body>
-<h2>
-	dojox.Grid Basic Editing test
-</h2>
-<div id="controls">
-	<button onclick="grid.refresh()">Refresh</button>   
-	<button onclick="grid.edit.focusEditor()">Focus Editor</button>
-	<button onclick="grid.focus.next()">Next Focus</button>   
-	<button onclick="addRow()">Add Row</button>
-	<button onclick="grid.removeSelectedRows()">Remove</button>   
-	<button onclick="grid.edit.apply()">Apply</button>
-	<button onclick="grid.edit.cancel()">Cancel</button>   
-	<button onclick="grid.singleClickEdit = !grid.singleClickEdit">Toggle singleClickEdit</button> 
-</div>
-<br />
-<div id="grid" dojoType="dojox.Grid" 
-	jsId="grid"
-	model="model" structure="gridLayout"></div>
-<br />
-<div id="rowCount"></div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_edit_canEdit.html b/dojox/grid/compat/tests/test_edit_canEdit.html
deleted file mode 100644
index 84b71a8..0000000
--- a/dojox/grid/compat/tests/test_edit_canEdit.html
+++ /dev/null
@@ -1,156 +0,0 @@
-<!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">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-<title>Test dojox.Grid Editing</title>
-<style>
-	@import "../../_grid/Grid.css";
-	body {
-		font-family: Tahoma, Arial, Helvetica, sans-serif;
-		font-size: 11px;
-	}
-	.dojoxGrid-row-editing td {
-		background-color: #F4FFF4;
-	}
-	.dojoxGrid input, .dojoxGrid select, .dojoxGrid textarea {
-		margin: 0;
-		padding: 0;
-		border-style: none;
-		width: 100%;
-		font-size: 100%;
-		font-family: inherit;
-	}
-	.dojoxGrid input {
-	}
-	.dojoxGrid select {
-	}
-	.dojoxGrid textarea {
-	}
-	#controls {
-		padding: 6px 0;
-	}
-	#grid {
-		width: 850px;
-		height: 350px;
-		border: 1px solid silver;
-	}
-</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug:false, parseOnLoad: true"></script>
-	<!--<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");
-	</script>-->
-	<!-- Debugging -->
-	<script type="text/javascript" src="../_grid/lib.js"></script>
-	<script type="text/javascript" src="../_grid/drag.js"></script>
-	<script type="text/javascript" src="../_grid/scroller.js"></script>
-	<script type="text/javascript" src="../_grid/builder.js"></script>
-	<script type="text/javascript" src="../_grid/cell.js"></script>
-	<script type="text/javascript" src="../_grid/layout.js"></script>
-	<script type="text/javascript" src="../_grid/rows.js"></script>
-	<script type="text/javascript" src="../_grid/focus.js"></script>
-	<script type="text/javascript" src="../_grid/selection.js"></script>
-	<script type="text/javascript" src="../_grid/edit.js"></script>
-	<script type="text/javascript" src="../_grid/view.js"></script>
-	<script type="text/javascript" src="../_grid/views.js"></script>
-	<script type="text/javascript" src="../_grid/rowbar.js"></script>
-	<script type="text/javascript" src="../_grid/publicEvents.js"></script>
-	<script type="text/javascript" src="../VirtualGrid.js"></script>
-	<script type="text/javascript" src="../_data/fields.js"></script>
-	<script type="text/javascript" src="../_data/model.js"></script>
-	<script type="text/javascript" src="../_data/editors.js"></script>
-	<script type="text/javascript" src="../Grid.js"></script>
-	<script type="text/javascript">
-	// ==========================================================================
-	// Create a data model
-	// ==========================================================================
-	data = [ 
-		[ "normal", false, "new", 'But are not followed by two hexadecimal', 29.91, 10, false ],
-		[ "important", false, "new", 'Because a % sign always indicates', 9.33, -5, false ],
-		[ "important", false, "read", 'Signs can be selectively', 19.34, 0, true ],
-		[ "note", false, "read", 'However the reserved characters', 15.63, 0, true ],
-		[ "normal", false, "replied", 'It is therefore necessary', 24.22, 5.50, true ],
-		[ "important", false, "replied", 'To problems of corruption by', 9.12, -3, true ],
-		[ "note", false, "replied", 'Which would simply be awkward in', 12.15, -4, false ]
-	];
-	var rows = 10000;
-	for(var i=0, l=data.length; i<rows-l; i++){
-		data.push(data[i%l].slice(0));
-	}
-	model = new dojox.grid.data.Table(null, data);
-	// ==========================================================================
-	// Tie some UI to the data model
-	// ==========================================================================
-	model.observer(this);
-	modelChange = function() {
-		dojo.byId("rowCount").innerHTML = 'Row count: ' + model.count; 
-	}
-	// ==========================================================================
-	// Custom formatter
-	// ==========================================================================
-	formatMoney = function(inDatum) {
-		return isNaN(inDatum) ? '...' : '$' + parseFloat(inDatum).toFixed(2);
-	}
-	// ==========================================================================
-	// Grid structure
-	// ==========================================================================
-	statusCell = { field: 2, name: 'Status', styles: 'text-align: center;', editor: dojox.grid.editors.Select, options: [ "new", "read", "replied" ] };
-	gridLayout = [{
-		type: 'dojox.GridRowView', width: '20px'
-	},{
-		defaultCell: { width: 8, editor: dojox.grid.editors.Input, styles: 'text-align: right;'  },
-		rows: [[
-			{ name: 'Id', width: 3, get: function(inRowIndex) { return inRowIndex+1;} },
-			{ name: 'Priority', styles: 'text-align: center;', editor: dojox.grid.editors.Select, options: ["normal", "note", "important"]},
-			{ name: 'Mark', width: 3, styles: 'text-align: center;', editor: dojox.grid.editors.Bool },
-			statusCell,
-			{ name: 'Message', styles: '', width: '100%' },
-			{ name: 'Amount', formatter: formatMoney },
-			{ name: 'Amount', field: 4, formatter: formatMoney }
-		]]
-	},{
-		defaultCell: { width: 4, editor: dojox.grid.editors.Input, styles: 'text-align: right;' },
-		rows: [[
-			{ name: 'Mark', width: 3, field: 1, styles: 'text-align: center;', editor: dojox.grid.editors.Bool}, 
-			statusCell,
-			{ name: 'Amount', field: 4, formatter: formatMoney},
-			{ name: 'Detail', value: 'Detail'}
-		]]
-	}];
-	// ==========================================================================
-	// UI Action
-	// ==========================================================================
-	addRow = function(){
-		grid.addRow([ "normal", false, "new", 'Now is the time for all good men to come to the aid of their party.', 99.99, 9.99, false ]);
-	}
-	
-	dojo.addOnLoad(function() {
-		// simple canEdit logic
-		grid.canEdit = function(inCell, inRowIndex) {
-			return !(inCell.index > 1 && inCell.index < 5)
-		}
-	});
-</script>
-</head>
-<body>
-<h2>
-	dojox.Grid Basic Editing test
-</h2>
-<div id="controls">
-	<button onclick="grid.refresh()">Refresh</button>   
-	<button onclick="grid.edit.focusEditor()">Focus Editor</button>
-	<button onclick="grid.focus.next()">Next Focus</button>   
-	<button onclick="addRow()">Add Row</button>
-	<button onclick="grid.removeSelectedRows()">Remove</button>   
-	<button onclick="grid.edit.apply()">Apply</button>
-	<button onclick="grid.edit.cancel()">Cancel</button>   
-	<button onclick="grid.singleClickEdit = !grid.singleClickEdit">Toggle singleClickEdit</button> 
-</div>
-<br />
-<div id="grid" dojoType="dojox.Grid" 
-	jsId="grid"
-	model="model" structure="gridLayout"></div>
-<br />
-<div id="rowCount"></div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_edit_dijit.html b/dojox/grid/compat/tests/test_edit_dijit.html
deleted file mode 100644
index f4769e4..0000000
--- a/dojox/grid/compat/tests/test_edit_dijit.html
+++ /dev/null
@@ -1,137 +0,0 @@
-<!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">
-<head>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-	<title>Test dojox.Grid Editing</title>
-	<style type="text/css">
-		@import "../../_grid/tundraGrid.css";
-		@import "../../../../dojo/resources/dojo.css";
-		@import "../../../../dijit/themes/tundra/tundra.css";
-		@import "../../../../dijit/themes/tundra/tundra_rtl.css";
-		@import "../../../../dijit/tests/css/dijitTests.css";
-		#controls button {
-			margin-left: 10px;
-		}
-		#grid {
-			width: 850px;
-			height: 350px;
-			border: 1px solid silver;
-		}
-		</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" 
-		djConfig="isDebug: true, parseOnLoad: true"></script>
-	<script type="text/javascript" src="../../../../dijit/tests/_testCommon.js"></script>
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");
-
-		// ==========================================================================
-		// Create a data model
-		// ==========================================================================
-		
-		s = (new Date()).getTime();
-		
-		data = [ 
-			[ "normal", false, "new", 'But are not followed by two hexadecimal', 29.91, 10, false, s],
-			[ "important", false, "new", 'Because a % sign always indicates', 9.33, -5, false, s ],
-			[ "important", false, "read", 'Signs can be selectively', 19.34, 0, true, s ],
-			[ "note", false, "read", 'However the reserved characters', 15.63, 0, true, s ],
-			[ "normal", false, "replied", 'It is therefore necessary', 24.22, 5.50, true, s ],
-			[ "important", false, "replied", 'To problems of corruption by', 9.12, -3, true, s ],
-			[ "note", false, "replied", 'Which would simply be awkward in', 12.15, -4, false, s ]
-		];
-		var rows = 100;
-		for(var i=0, l=data.length; i<rows; i++){
-			data.push(data[i%l].slice(0));
-		}
-		model = new dojox.grid.data.Table(null, data);
-		// ==========================================================================
-		// Tie some UI to the data model
-		// ==========================================================================
-		model.observer(this);
-		modelChange = function(){
-			dojo.byId("rowCount").innerHTML = 'Row count: ' + model.count; 
-		}
-		/*
-		modelInsertion = modelDatumChange = function(a1, a2, a3){
-			console.debug(a1, a2, a3);
-		}
-		*/
-		// ==========================================================================
-		// Custom formatters
-		// ==========================================================================
-		formatCurrency = function(inDatum){
-			return isNaN(inDatum) ? '...' : dojo.currency.format(inDatum, this.constraint);
-		}
-		formatDate = function(inDatum){
-			return dojo.date.locale.format(new Date(inDatum), this.constraint);
-		}
-		// ==========================================================================
-		// Grid structure
-		// ==========================================================================
-		statusCell = {
-			field: 2, name: 'Status', 
-			styles: 'text-align: center;', 
-			editor: dojox.grid.editors.Select, 
-			options: [ "new", "read", "replied" ]
-		};
-
-		gridLayout = [{
-			type: 'dojox.GridRowView', width: '20px'
-		},{
-			defaultCell: { width: 8, editor: dojox.grid.editors.Input, styles: 'text-align: right;'  },
-			rows: [[
-				{ name: 'Id', 
-					get: function(inRowIndex) { return inRowIndex+1;}, 
-					editor: dojox.grid.editors.Dijit,
-					editorClass: "dijit.form.NumberSpinner" },
-				{ name: 'Date', width: 10, field: 7, 
-					editor: dojox.grid.editors.DateTextBox, 
-					formatter: formatDate, 
-					constraint: {formatLength: 'long', selector: "date"}},
-				{ name: 'Priority', styles: 'text-align: center;', field: 0, 
-					editor: dojox.grid.editors.ComboBox, 
-					options: ["normal", "note", "important"], width: 10},
-				{ name: 'Mark', width: 3, styles: 'text-align: center;', 
-					editor: dojox.grid.editors.CheckBox},
-				statusCell,
-				{ name: 'Message', styles: '', width: '100%', 
-					editor: dojox.grid.editors.Editor, editorToolbar: true },
-				{ name: 'Amount', formatter: formatCurrency, constraint: {currency: 'EUR'}, 
-					editor: dojox.grid.editors.Dijit, editorClass: "dijit.form.CurrencyTextBox" },
-				{ name: 'Amount', field: 4, formatter: formatCurrency, constraint: {currency: 'EUR'}, 
-					editor: dojox.grid.editors.Dijit, editorClass: "dijit.form.HorizontalSlider", width: 10}
-			]]
-		}];
-		// ==========================================================================
-		// UI Action
-		// ==========================================================================
-		addRow = function(){
-			grid.addRow([
-				"normal", false, "new", 
-				'Now is the time for all good men to come to the aid of their party.', 
-				99.99, 9.99, false 
-			]);
-		}
-	</script>
-</head>
-<body class="tundra">
-	<h1>dojox.Grid Basic Editing test</h1>
-	<br />
-	<div id="controls">
-		<button onclick="grid.refresh()">Refresh</button>
-		<button onclick="grid.edit.focusEditor()">Focus Editor</button>
-		<button onclick="grid.focus.next()">Next Focus</button>
-		<button onclick="addRow()">Add Row</button>
-		<button onclick="grid.removeSelectedRows()">Remove</button>
-		<button onclick="grid.edit.apply()">Apply</button>
-		<button onclick="grid.edit.cancel()">Cancel</button>
-		<button onclick="grid.singleClickEdit = !grid.singleClickEdit">Toggle singleClickEdit</button>
-	</div>
-	<br />
-	<div id="grid" jsId="grid" dojoType="dojox.Grid" model="model" structure="gridLayout"></div>
-	<br />
-	<div id="rowCount"></div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_events.html b/dojox/grid/compat/tests/test_events.html
deleted file mode 100644
index 46afe9f..0000000
--- a/dojox/grid/compat/tests/test_events.html
+++ /dev/null
@@ -1,174 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>Test dojox.Grid Events</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../_grid/Grid.css";
-		body,td,th {
-			font-family: Geneva, Arial, Helvetica, sans-serif;
-		}	
-		#grid { 
-			border: 1px solid;
-			border-top-color: #F6F4EB;
-			border-right-color: #ACA899;
-			border-bottom-color: #ACA899;
-			border-left-color: #F6F4EB;
-		}
-		#grid {
-			width: 50em;
-			height: 20em;
-			padding: 1px;
-			overflow: hidden;
-			font-size: small;
-		}
-		h3 {
-			margin: 10px 0 2px 0;
-		}
-		.fade {
-			/*background-image:url(images/fade.gif);*/
-		}
-		.no-fade {
-			/*background-image: none;*/
-		}
-		#eventGrid {
-			float: right;
-			font-size: small;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug:false, parseOnLoad: true"></script>
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");
-	</script>
-	<script type="text/javascript">
-		// events to track
-		var eventRows = [
-			{ name: 'onCellClick' },
-			{ name: 'onRowClick', properties: ['rowIndex'] },
-			{ name: 'onCellDblClick' },
-			{ name: 'onRowDblClick', properties: ['rowIndex'] },
-			{ name: 'onCellMouseOver' },
-			{ name: 'onCellMouseOut' },
-			{ name: 'onCellMouseDown' },
-			{ name: 'onRowMouseOver' },
-			{ name: 'onRowMouseOut' },
-			{ name: 'onRowMouseDown' },
-			{ name: 'onHeaderCellClick' },
-			{ name: 'onHeaderClick', properties: ['rowIndex'] },
-			{ name: 'onHeaderCellDblClick' },
-			{ name: 'onHeaderDblClick', properties: ['rowIndex'] },
-			{ name: 'onHeaderCellMouseOver' },
-			{ name: 'onHeaderCellMouseOut' },
-			{ name: 'onHeaderCellMouseDown' },
-			{ name: 'onHeaderMouseOver' },
-			{ name: 'onHeaderMouseOut' },
-			{ name: 'onKeyDown', properties: ['keyCode'] },
-			{ name: 'onCellContextMenu' },
-			{ name: 'onRowContextMenu', properties: ['rowIndex'] },
-			{ name: 'onHeaderCellContextMenu' },
-			{ name: 'onHeaderContextMenu', properties: ['rowIndex'] }
-		];	
-		
-		getEventName = function(inRowIndex) {
-			return eventRows[inRowIndex].name;
-		};
-		
-		getEventData = function(inRowIndex) {
-			var d = eventRows[inRowIndex].data;
-			var r = [];
-			if (d)
-				for (var i in d)
-					r.push(d[i]);
-			else
-				r.push('na')
-			return r.join(', ');
-		}
-		
-		// grid structure for event tracking grid.
-		var eventView = {
-			noscroll: true,
-			cells: [[
-				{ name: 'Event', get: getEventName, width: 12 },
-				{ name: 'Data', get: getEventData, width: 10 }
-			]]
-		}
-		var eventLayout = [	eventView	];
-		
-		var fade = function(inNode) {
-			if (!inNode || !inNode.style) return;
-			var c = 150, step = 5, delay = 20;
-			var animate = function() {
-				c = Math.min(c + step, 255);
-				inNode.style.backgroundColor = "rgb(" + c + ", " + c + ", 255)";
-				if (c < 255) window.setTimeout(animate, delay);
-			}
-			animate();
-		}
-		
-		// setup a fade on a row. Must do this way to avoid caching of fade gif
-		updateRowFade = function(inRowIndex) {
-			var n = eventGrid.views.views[0].getRowNode(inRowIndex);
-			fade(n);
-		}
-		
-		// store data about event. By default track event.rowIndex and event.cell.index, but eventRows can specify params, which are event properties to track.
-		setEventData = function(inIndex, inEvent) {
-			var eRow = eventRows[inIndex];
-			eRow.data = {};
-			var properties = eRow.properties;
-			if (properties)
-				for (var i=0, l=properties.length, p; (p=properties[i] || i < l); i++)
-					eRow.data[p] = inEvent[p];
-			else
-				eRow.data =  {
-					row: (inEvent.rowIndex != undefined ? Number(inEvent.rowIndex) : 'na'), 
-					cell: (inEvent.cell && inEvent.cell.index != undefined ? inEvent.cell.index : 'na')
-				}	
-			eventGrid.updateRow(inIndex);
-			updateRowFade(inIndex);
-		}
-		
-		// setup grid events for all events being tracked.
-		setGridEvents = function() {
-			var makeEvent = function(inIndex, inName) {
-				return function(e) {
-					setEventData(inIndex, e);
-					dojox.VirtualGrid.prototype[inName].apply(this, arguments);
-				}
-			}
-			for (var i=0, e; (e=eventRows[i]); i++)
-				grid[e.name] = makeEvent(i, e.name);
-		}
-				
-		// Grid structure
-		var layout = [// array of view objects
-			{ type: 'dojox.GridRowView', width: '20px' },
-			{ noscroll: true, cells: [// array of rows, a row is an array of cells
-					[{ name: "Alpha", value: '<input type="checkbox"></input>', rowSpan: 2, width: 6, styles: 'text-align:center;' }, { name: "Alpha2", value: "Alpha2" }], 
-					[{ name: "Alpha3", value: "Alpha3" }]
-			]},
-			{ cells: [
-					[{ name: "Beta", value: 'simple'}, { name: "Beta2", value: "Beta2" }, { name: "Beta3", value: "Beta3" }, { name: "Beta4", value: "Beta4" }, { name: "Beta5", value: "Beta5" }], 
-				 	[{ name: "Summary", colSpan: 5, value: 'Summary' }]
-			]},
-			{	noscroll: true, cells: [
-					[{ name: "Gamma", value: "Gamma" }, { name: "Gamma2", value: "<button>Radiate</button>", styles: 'text-align:center;' }]]
-			}];
-		
-		dojo.addOnLoad(function() {
-			window["grid"] = dijit.byId("grid");
-			window["eventGrid"] = dijit.byId("eventGrid");
-			grid.rows.defaultRowHeight = 4;
-			setGridEvents(); 
-			eventGrid.updateRowCount(eventRows.length);
-			dojo.debug = console.log;
-		});	
-	</script>
-</head>
-<body>
-<h3>dojox.Grid Event Tracking</h3>
-<div id="eventGrid" autoWidth="true" autoHeight="true" structure="eventLayout" dojoType="dojox.VirtualGrid"></div>
-<div id="grid" rowCount="100" dojoType="dojox.VirtualGrid"></div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_expand.html b/dojox/grid/compat/tests/test_expand.html
deleted file mode 100644
index cd538e9..0000000
--- a/dojox/grid/compat/tests/test_expand.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>Test dojox.Grid Expand Rows</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../_grid/Grid.css";
-		body {
-			font-size: 0.9em;
-			font-family: Geneva, Arial, Helvetica, sans-serif;
-		}
-		.heading {
-			font-weight: bold;
-			padding-bottom: 0.25em;
-		}
-		
-		.bigHello {
-			height: 110px;
-			line-height: 110px;
-			text-align: center;
-			font-weight: bold;
-			font-size: 30px;
-		}	
-				
-		#grid { 
-			border: 1px solid #333;
-			height: 30em;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug:false, parseOnLoad: true"></script>
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");
-	</script>
-	<script type="text/javascript">
-		// grid structure
-		// a grid view is a group of columns
-		
-		// a special view providing selection feedback
-		var rowBar = {type: 'dojox.GridRowView', width: '20px' };
-		
-		// inRow is an array of subRows. we hide the summary subRow except for every nth row
-		function onBeforeRow(inDataIndex, inRow) {
-			inRow[1].hidden = (!this.grid || !this.grid.expandedRows || !this.grid.expandedRows[inDataIndex]);
-		}
-		
-		var view = {
-			onBeforeRow: onBeforeRow,
-			cells: [
-				[
-					{ name: 'Whatever', width: 4.5, get: getCheck, styles: 'text-align: center;' },
-					{name: 'Column 0'},
-					{name: 'Column 1'},
-					{name: 'Column 2'},
-					{name: 'Column 3'},
-					{name: 'Column 4'}
-				],
-				[ { name: 'Detail', colSpan: 6, get: getDetail } ]
-			]
-		};
-		
-		// a grid structure is an array of views.
-		var structure = [ rowBar, view ];
-		
-		// get can return data for each cell of the grid
-		function get(inRowIndex) {
-			return [this.index, inRowIndex].join(', ');
-		}
-		
-		function getDetail(inRowIndex) {
-			if (this.grid.expandedRows[inRowIndex]) {
-				var n = (inRowIndex % 2);
-				switch (n) {
-					case 0:
-						return 'Hello World!';
-					default:
-						return '<div class="bigHello">Hello World!</div>';
-				}
-			} else
-				return '';
-		}
-		
-		function toggle(inIndex, inShow) {
-			grid.expandedRows[inIndex] = inShow;
-			grid.updateRow(inIndex);
-		}
-		
-		function getCheck(inRowIndex) {
-			if (!this.grid.expandedRows)
-				this.grid.expandedRows = [ ];
-			var image = (this.grid.expandedRows[inRowIndex] ? 'open.gif' : 'closed.gif');
-			var show = (this.grid.expandedRows[inRowIndex] ? 'false' : 'true')
-			return '<img src="images/' + image + '" onclick="toggle(' + inRowIndex + ', ' + show + ')" height="11" width="11">';
-		}
-
-	dojo.addOnLoad(function() {
-		window["grid"] = dijit.byId("grid");
-	});
-</script>
-</head>
-<body>
-<div class="heading">dojox.Grid Expand Row Example</div>
-
-<div id="grid" dojoType="dojox.VirtualGrid" get="get" structure="structure" rowCount="100000" autoWidth="true"></div>
-
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_grid.html b/dojox/grid/compat/tests/test_grid.html
deleted file mode 100644
index b185776..0000000
--- a/dojox/grid/compat/tests/test_grid.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>Test dojox.Grid Basic</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../_grid/Grid.css";
-		@import "../../_grid/tundraGrid.css";
-		@import "../../../../dojo/resources/dojo.css";
-		@import "../../../../dijit/themes/tundra/tundra.css";
-		body {
-			font-size: 0.9em;
-			font-family: Geneva, Arial, Helvetica, sans-serif;
-		}
-		.heading {
-			font-weight: bold;
-			padding-bottom: 0.25em;
-		}
-				
-		#grid {
-			border: 1px solid #333;
-			width: 35em;
-			height: 30em;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug:false, parseOnLoad: true"></script>
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");
-	</script>
-	<script type="text/javascript" src="support/test_data.js"></script>
-	<script type="text/javascript">
-		// a grid view is a group of columns
-		var view1 = {
-			cells: [[
-				{name: 'Column 0'}, {name: 'Column 1'}, {name: 'Column 2'}, {name: 'Column 3', width: "150px"}, {name: 'Column 4'}
-			],[
-				{name: 'Column 5'}, {name: 'Column 6'}, {name: 'Column 7'}, {name: 'Column 8', field: 3, colSpan: 2}
-			]]
-		};
-		// a grid layout is an array of views.
-		var layout = [ view1 ];
-</script>
-</head>
-<body>
-<div class="heading">dojox.Grid Basic Test</div>
-<div jsid="grid" id="grid" dojoType="dojox.Grid" model="model" structure="layout"></div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_grid_dlg.html b/dojox/grid/compat/tests/test_grid_dlg.html
deleted file mode 100644
index 17470e7..0000000
--- a/dojox/grid/compat/tests/test_grid_dlg.html
+++ /dev/null
@@ -1,88 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>Test dojox.Grid Basic</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-    <script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug:true, parseOnLoad: true"></script>
-    <script type="text/javascript" src="../../../../dijit/tests/_testCommon.js"></script>
-
-    
-    <style type="text/css">
-		@import "../../_grid/Grid.css";
-        @import "../../../../dojo/resources/dojo.css";
-        @import "../../../../dijit/tests/css/dijitTests.css";
-		table { border: none; }
-        
-        body {
-			font-size: 0.9em;
-			font-family: Geneva, Arial, Helvetica, sans-serif;
-		}
-		.heading {
-			font-weight: bold;
-			padding-bottom: 0.25em;
-		}
-				
-		#grid { 
-			border: 1px solid #333;
-			width: 400px;
-			height: 500px;
-		}
-	</style>
-	<!--<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");
-	</script>-->
-	<!-- Debugging -->
-	<script type="text/javascript" src="../_grid/lib.js"></script>
-	<script type="text/javascript" src="../_grid/drag.js"></script>
-	<script type="text/javascript" src="../_grid/scroller.js"></script>
-	<script type="text/javascript" src="../_grid/builder.js"></script>
-	<script type="text/javascript" src="../_grid/cell.js"></script>
-	<script type="text/javascript" src="../_grid/layout.js"></script>
-	<script type="text/javascript" src="../_grid/rows.js"></script>
-	<script type="text/javascript" src="../_grid/focus.js"></script>
-	<script type="text/javascript" src="../_grid/selection.js"></script>
-	<script type="text/javascript" src="../_grid/edit.js"></script>
-	<script type="text/javascript" src="../_grid/view.js"></script>
-	<script type="text/javascript" src="../_grid/views.js"></script>
-	<script type="text/javascript" src="../_grid/rowbar.js"></script>
-	<script type="text/javascript" src="../_grid/publicEvents.js"></script>
-	<script type="text/javascript" src="../VirtualGrid.js"></script>
-	<script type="text/javascript" src="../_data/fields.js"></script>
-	<script type="text/javascript" src="../_data/model.js"></script>
-	<script type="text/javascript" src="../_data/editors.js"></script>
-	<script type="text/javascript" src="../Grid.js"></script>
-	<script type="text/javascript" src="support/test_data.js"></script>
-	<script type="text/javascript">
-		// a grid view is a group of columns
-		var view1 = {
-			cells: [[
-				{name: 'Column 0'}, {name: 'Column 1'}, {name: 'Column 2'}, {name: 'Column 3', width: "150px"}, {name: 'Column 4'}
-			],[
-				{name: 'Column 5'}, {name: 'Column 6'}, {name: 'Column 7'}, {name: 'Column 8', field: 3, colSpan: 2}
-			]]
-		};
-		// a grid layout is an array of views.
-		var layout = [ view1 ];
-        dojo.require("dijit.Dialog");
-        dojo.require("dijit.form.Button");
-        dojo.require("dojo.parser");	// scan page for widgets and instantiate them
-                
-        function openDialog() {
-            var dialog = dijit.byId('dialog');
-            dialog.show();
-        }
-</script>
-</head>
-<body>
-<div class="heading">dojox.Grid Basic Test</div>
-<button onclick="openDialog()">open</button>
-<div id="dialog" dojoType="dijit.Dialog" title="First Dialog">
-    <table>
-        <tr><td><div id="grid" dojoType="dojox.Grid" model="model" structure="layout"></div></td></tr>
-        <tr><td><button dojoType="dijit.form.Button" type="submit">close</button></td></tr>
-    </table>
-</div>
-
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_grid_headerHeight.html b/dojox/grid/compat/tests/test_grid_headerHeight.html
deleted file mode 100644
index 589b8a7..0000000
--- a/dojox/grid/compat/tests/test_grid_headerHeight.html
+++ /dev/null
@@ -1,84 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>Test dojox.Grid Basic</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../_grid/Grid.css";
-		@import "../../_grid/tundraGrid.css";
-		@import "../../../../dojo/resources/dojo.css";
-		@import "../../../../dijit/themes/tundra/tundra.css";
-		body {
-			font-size: 0.9em;
-			font-family: Geneva, Arial, Helvetica, sans-serif;
-		}
-		.heading {
-			font-weight: bold;
-			padding-bottom: 0.25em;
-		}
-				
-		#grid {
-			border: 1px solid #333;
-			width: 65em;
-			height: 30em;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug:false, parseOnLoad: true"></script>
-	<!--<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");
-	</script>-->
-	<!-- Debugging -->
-	<script type="text/javascript" src="../_grid/lib.js"></script>
-	<script type="text/javascript" src="../_grid/drag.js"></script>
-	<script type="text/javascript" src="../_grid/scroller.js"></script>
-	<script type="text/javascript" src="../_grid/builder.js"></script>
-	<script type="text/javascript" src="../_grid/cell.js"></script>
-	<script type="text/javascript" src="../_grid/layout.js"></script>
-	<script type="text/javascript" src="../_grid/rows.js"></script>
-	<script type="text/javascript" src="../_grid/focus.js"></script>
-	<script type="text/javascript" src="../_grid/selection.js"></script>
-	<script type="text/javascript" src="../_grid/edit.js"></script>
-	<script type="text/javascript" src="../_grid/view.js"></script>
-	<script type="text/javascript" src="../_grid/views.js"></script>
-	<script type="text/javascript" src="../_grid/rowbar.js"></script>
-	<script type="text/javascript" src="../_grid/publicEvents.js"></script>
-	<script type="text/javascript" src="../VirtualGrid.js"></script>
-	<script type="text/javascript" src="../_data/fields.js"></script>
-	<script type="text/javascript" src="../_data/model.js"></script>
-	<script type="text/javascript" src="../_data/editors.js"></script>
-	<script type="text/javascript" src="../Grid.js"></script>
-	<script type="text/javascript" src="support/test_data.js"></script>
-	<script type="text/javascript">
-		// a grid view is a group of columns
-		var view1 = {
-			cells: [[
-				{name: 'Column 0'}, {name: 'Column 1', width: "10em"}, {name: 'Column 2', width:"100px"}, {name: 'Column 3 is 25%', width: "25%"}, {name: 'Column 4 is 75% of the remaining space', width: "75%"}
-			]]
-		};
-		// a grid layout is an array of views.
-		var layout = [ view1 ];
-		
-		
-		var layout2 = [// array of view objects
-			{ type: 'dojox.GridRowView', width: '20px' },
-			{ noscroll: true, cells: [// array of rows, a row is an array of cells
-					[{ name: "Alpha", value: '<input type="checkbox"></input>', rowSpan: 2, width: 6, styles: 'text-align:center;' }, { name: "Alpha 2", value: "Alpha2" }], 
-					[{ name: "Alpha 3", value: "Alpha3" }]
-			]},
-			{ cells: [
-					[{ name: "Beta", value: 'simple'}, { name: "Beta 2", value: "Beta 2" }, { name: "Beta 3", value: "Beta 3" }, { name: "Beta 4", value: "Beta 4", width: "auto" }, { name: "Beta 5 is good", value: "Beta 5", width: "auto" }], 
-				 	[{ name: "Summary", colSpan: 5, value: 'Summary' }]
-			]},
-			{	noscroll: true, cells: [
-					[{ name: "Gamma", value: "Gamma" }, { name: "Gamma2", value: "<button>Radiate</button>", styles: 'text-align:center;' }]]
-			}];
-</script>
-</head>
-<body>
-<div class="heading">dojox.Grid Basic Test</div>
-<div jsid="grid" id="grid" dojoType="dojox.Grid" model="model" structure="layout"></div>
-<br /><br />
-<div jsid="grid2" id="grid2" dojoType="dojox.VirtualGrid" model="model" structure="layout2" rowCount="50"></div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_grid_layout.html b/dojox/grid/compat/tests/test_grid_layout.html
deleted file mode 100644
index 26be43e..0000000
--- a/dojox/grid/compat/tests/test_grid_layout.html
+++ /dev/null
@@ -1,112 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
-	"http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
-	<title>dojox.Grid in Layout Demo</title>
-	<style type="text/css">
-		@import "../../_grid/Grid.css";
-		@import "../../_grid/tundraGrid.css";
-		@import "../../../../dojo/resources/dojo.css";
-		@import "../../../../dijit/themes/tundra/tundra.css";
-		@import "../../../../dijit/tests/css/dijitTests.css";
-
-		html, body{	
-			width: 100%;	/* make the body expand to fill the visible window */
-			height: 100%;
-			padding: 0 0 0 0;
-			margin: 0 0 0 0;
-			overflow: hidden;
-		}
-		.dijitSplitPane{
-			margin: 5px;
-		}
-		
-		/* make grid containers overflow hidden */
-		body .dijitContentPane {
-			overflow: hidden;
-		}
-		#rightPane {
-			margin: 0;
-		}
-	</style>
-
-	<script type="text/javascript" src="../../../../dojo/dojo.js"
-		djConfig="parseOnLoad: true, isDebug: false"></script>
-	<script type="text/javascript" src="../../../../dijit/tests/_testCommon.js"></script>
-
-	<script type="text/javascript">
-		dojo.require("dijit.layout.LayoutContainer");
-		dojo.require("dijit.layout.ContentPane");
-		dojo.require("dijit.layout.LinkPane");
-		dojo.require("dijit.layout.SplitContainer");
-		dojo.require("dijit.layout.TabContainer");
-		
-		dojo.require("dojox.grid.Grid");
-		
-		dojo.require("dojo.parser");	// scan page for widgets and instantiate them
-	</script>
-	<script type="text/javascript" src="support/test_data.js"></script>
-	<script type="text/javascript">
-			// a grid view is a group of columns
-			var view1 = {
-				cells: [[
-					{name: 'Column 0'}, {name: 'Column 1'}, {name: 'Column 2'}, {name: 'Column 3', width: "150px"}, {name: 'Column 4'}
-				],[
-					{name: 'Column 5'}, {name: 'Column 6'}, {name: 'Column 7'}, {name: 'Column 8', field: 3, colSpan: 2}
-				]]
-			};
-			// a grid layout is an array of views.
-			var layout = [ view1 ];
-			var layout2 = [ {
-				cells: [[
-					{name: 'Alpha'}, {name: 'Beta'}, {name: 'Gamma'}, {name: 'Delta', width: "150px"}, {name: 'Epsilon'}, {name: 'Nexilon'}, {name: 'Zeta'}, {name: 'Eta', field: 0}, {name: 'Omega' }
-				]]
-			} 
-		];
-		//
-		dojo.addOnLoad(function(){
-			dijit.byId("grid3").update();
-		});
-	</script>
-</head>
-<body class="tundra">
-	<div id="outer" dojoType="dijit.layout.LayoutContainer"
-		style="width: 100%; height: 100%;">
-		<div id="topBar" dojoType="dijit.layout.ContentPane" layoutAlign="top"
-			style="background-color: #274383; color: white;">
-			top bar
-		</div>
-		<div id="bottomBar" dojoType="dijit.layout.ContentPane" layoutAlign="bottom"
-			style="background-color: #274383; color: white;">
-			bottom bar
-		</div>
-		<div id="horizontalSplit" dojoType="dijit.layout.SplitContainer"
-			orientation="horizontal"
-			sizerWidth="5"
-			activeSizing="0"
-			layoutAlign="client"
-		>
-			<div id="leftPane" dojoType="dijit.layout.ContentPane"
-				 sizeMin="20" sizeShare="20">
-				Left side
-			</div>
-
-			<div id="rightPane"
-				dojoType="dijit.layout.SplitContainer"
-				orientation="vertical"
-				sizerWidth="5"
-				activeSizing="0"
-				sizeMin="50" sizeShare="80"
-			>
-				<div id="mainTabContainer" dojoType="dijit.layout.TabContainer" sizeMin="20" sizeShare="70">
-					<div id="grid1" dojoType="dojox.Grid" model="model" title="Tab 1"></div>
-					<div id="grid2" dojoType="dojox.Grid" model="model" structure="layout2" title="Tab 2"></div>
-				</div>
-				<div id="bottomRight" dojoType="dijit.layout.ContentPane" sizeMin="20" sizeShare="30">
-					<div id="grid3" dojoType="dojox.Grid" model="model" structure="layout2"></div>
-				</div>
-			</div>
-		</div>
-	</div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_grid_layout_LayoutContainer.html b/dojox/grid/compat/tests/test_grid_layout_LayoutContainer.html
deleted file mode 100644
index a51d1c7..0000000
--- a/dojox/grid/compat/tests/test_grid_layout_LayoutContainer.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
-	"http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
-	<title>dojox.Grid in Layout Demo</title>
-	<style type="text/css">
-		@import "../../_grid/Grid.css";
-		@import "../../_grid/tundraGrid.css";
-		@import "../../../../dojo/resources/dojo.css";
-		@import "../../../../dijit/themes/tundra/tundra.css";
-		@import "../../../../dijit/tests/css/dijitTests.css";
-
-		html, body{	
-			width: 100%;	/* make the body expand to fill the visible window */
-			height: 100%;
-			padding: 0 0 0 0;
-			margin: 0 0 0 0;
-			overflow: hidden;
-		}
-		.dijitSplitPane{
-			margin: 5px;
-		}
-		
-		/* make grid containers overflow hidden */
-		body .dijitContentPane {
-			overflow: hidden;
-		}
-		#rightPane {
-			margin: 0;
-		}
-	</style>
-
-	<script type="text/javascript" src="../../../../dojo/dojo.js"
-		djConfig="parseOnLoad: true, isDebug: false"></script>
-	<script type="text/javascript" src="../../../../dijit/tests/_testCommon.js"></script>
-
-	<script type="text/javascript">
-		dojo.require("dijit.layout.LayoutContainer");
-		dojo.require("dijit.layout.ContentPane");
-		dojo.require("dijit.layout.LinkPane");
-		dojo.require("dijit.layout.SplitContainer");
-		dojo.require("dijit.layout.TabContainer");
-		
-		dojo.require("dojox.grid.Grid");
-		
-		dojo.require("dojo.parser");	// scan page for widgets and instantiate them
-	</script>
-	<script type="text/javascript" src="support/test_data.js"></script>
-	<script type="text/javascript">
-			// a grid view is a group of columns
-			var view1 = {
-				cells: [[
-					{name: 'Column 0'}, {name: 'Column 1'}, {name: 'Column 2'}, {name: 'Column 3', width: "150px"}, {name: 'Column 4'}
-				],[
-					{name: 'Column 5'}, {name: 'Column 6'}, {name: 'Column 7'}, {name: 'Column 8', field: 3, colSpan: 2}
-				]]
-			};
-			// a grid layout is an array of views.
-			var layout = [ view1 ];
-			var layout2 = [ {
-				cells: [[
-					{name: 'Alpha'}, {name: 'Beta'}, {name: 'Gamma'}, {name: 'Delta', width: "150px"}, {name: 'Epsilon'}, {name: 'Nexilon'}, {name: 'Zeta'}, {name: 'Eta', field: 0}, {name: 'Omega' }
-				]]
-			} 
-		];
-		//
-	</script>
-</head>
-<body class="tundra">
-	<div id="outer" dojoType="dijit.layout.LayoutContainer"
-		style="width: 100%; height: 100%;">
-		
-		<div id="topBar" dojoType="dijit.layout.ContentPane" layoutAlign="top"
-			style="background-color: #274383; color: white; height:100px">
-			top bar
-		</div>
-		<div id="bottomBar" dojoType="dijit.layout.ContentPane" layoutAlign="bottom"
-			style="background-color: #274383; color: white;">
-			bottom bar
-		</div>
-
-		<div id="grid1" dojoType="dojox.Grid" model="model" layoutAlign="client"></div>
-				
-		
-	</div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_grid_layout_borderContainer.html b/dojox/grid/compat/tests/test_grid_layout_borderContainer.html
deleted file mode 100644
index 81fef77..0000000
--- a/dojox/grid/compat/tests/test_grid_layout_borderContainer.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!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">
-	<head>
-		<title>Test dojox.Grid Editing</title>
-		<style>
-			@import "../../_grid/tundraGrid.css";
-			@import "../../../../dojo/resources/dojo.css";
-			@import "../../../../dijit/themes/tundra/tundra.css";
-			@import "../../../../dijit/tests/css/dijitTests.css";
-
-			html, body {
-				width: 100%;	/* make the body expand to fill the visible window */
-				height: 100%;
-				overflow: hidden;	/* erase window level scrollbars */
-				padding: 0 0 0 0;
-				margin: 0 0 0 0;
-			}
-		</style>
-		<script type="text/javascript" src="../../../../dojo/dojo.js"
-			djConfig="isDebug:false, parseOnLoad: true"></script>
-
-		<script type="text/javascript">
-			dojo.require("dojox.grid.Grid");
-			dojo.require("dijit.layout.BorderContainer");
-			dojo.require("dijit.layout.ContentPane");
-			dojo.require("dojo.parser");
-		</script>
-
-		<script type="text/javascript">
-			// ==========================================================================
-			// Create a data model
-			// ==========================================================================
-			data = [ 
-				[ "normal", false, "new", 'But are not followed by two hexadecimal', 29.91, 10, false ],
-				[ "important", false, "new", 'Because a % sign always indicates', 9.33, -5, false ],
-				[ "important", false, "read", 'Signs can be selectively', 19.34, 0, true ],
-				[ "note", false, "read", 'However the reserved characters', 15.63, 0, true ],
-				[ "normal", false, "replied", 'It is therefore necessary', 24.22, 5.50, true ],
-				[ "important", false, "replied", 'To problems of corruption by', 9.12, -3, true ],
-				[ "note", false, "replied", 'Which would simply be awkward in', 12.15, -4, false ]
-			];
-			var rows = 10000;
-			for(var i=0, l=data.length; i<rows-l; i++){
-				data.push(data[i%l].slice(0));
-			}
-			model = new dojox.grid.data.Table(null, data);
-
-			// ==========================================================================
-			// Grid structure
-			// ==========================================================================
-			gridLayout = [
-				{
-					type: 'dojox.GridRowView', width: '20px'
-				},
-				{
-					defaultCell: { width: 8, editor: dojox.grid.editors.Input, styles: 'text-align: right;'  },
-					rows: [
-						[
-							{ name: 'Id', width: 3, get: function(inRowIndex){ return inRowIndex+1;} },
-							{ name: 'Priority', styles: 'text-align: center;', editor: dojox.grid.editors.Select, options: ["normal", "note", "important"]},
-							{ name: 'Mark', width: 3, styles: 'text-align: center;', editor: dojox.grid.editors.Bool },
-							{ name: 'Status', field: 2, styles: 'text-align: center;', editor: dojox.grid.editors.Select, options: [ "new", "read", "replied" ]},
-							{ name: 'Message', styles: '', width: '100%' },
-							{ name: 'Amount'}
-						]
-					]
-				}
-			];
-		</script>
-	</head>
-	<body class="tundra">
-<div dojoType="dijit.layout.BorderContainer"  liveSplitters="false" persist="true"
-          id="verticalSplitParam" design="headline" style="width: 100%; height: 100%;">
-
-  <div dojoType="dijit.layout.ContentPane" id="mybuttons" region="top" 
-            splitter="true"  style="width: 100%; height: 10%;">  
-
-	    <div id="controls">
-		     <button onclick="grid.refresh()">Refresh</button>
-		     <button onclick="grid.edit.focusEditor()">Focus Editor</button>
-		     <button onclick="grid.focus.next()">Next Focus</button>
-		     <button onclick="addRow()">Add Row</button>
-		     <button onclick="grid.removeSelectedRows()">Remove</button>
-		     <button onclick="grid.edit.apply()">Apply</button>
-		     <button onclick="grid.edit.cancel()">Cancel</button>
-		     <button onclick="grid.singleClickEdit = !grid.singleClickEdit">Toggle singleClickEdit</button>
-	    </div>
-  </div>
-
-  <div dojoType="dijit.layout.ContentPane" id="gridContainer1" region="center" splitter="true" style="background: red;" > 
-	    <div jsId="grid" class="myGrid" 		dojoType="dojox.Grid" model="model" 	structure="gridLayout"></div>
-  </div>
-
-</div>
-
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_grid_object_model_change.html b/dojox/grid/compat/tests/test_grid_object_model_change.html
deleted file mode 100644
index bb8c5f3..0000000
--- a/dojox/grid/compat/tests/test_grid_object_model_change.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>Test dojox.grid.data.Objects model change</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../_grid/Grid.css";
-		body {
-			font-size: 0.9em;
-			font-family: Geneva, Arial, Helvetica, sans-serif;
-		}
-		.heading {
-			font-weight: bold;
-			padding-bottom: 0.25em;
-		}
-				
-		#grid {
-			border: 1px solid #333;
-			width: 35em;
-			height: 30em;
-		}
-		#grid2 {
-			border: 1px solid #333;
-			width: 35em;
-			height: 30em;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug:false, parseOnLoad: true"></script>
-	<!--<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");
-	</script>-->
-	<!-- Debugging -->
-	<script type="text/javascript" src="../_grid/lib.js"></script>
-	<script type="text/javascript" src="../_grid/drag.js"></script>
-	<script type="text/javascript" src="../_grid/scroller.js"></script>
-	<script type="text/javascript" src="../_grid/builder.js"></script>
-	<script type="text/javascript" src="../_grid/cell.js"></script>
-	<script type="text/javascript" src="../_grid/layout.js"></script>
-	<script type="text/javascript" src="../_grid/rows.js"></script>
-	<script type="text/javascript" src="../_grid/focus.js"></script>
-	<script type="text/javascript" src="../_grid/selection.js"></script>
-	<script type="text/javascript" src="../_grid/edit.js"></script>
-	<script type="text/javascript" src="../_grid/view.js"></script>
-	<script type="text/javascript" src="../_grid/views.js"></script>
-	<script type="text/javascript" src="../_grid/rowbar.js"></script>
-	<script type="text/javascript" src="../_grid/publicEvents.js"></script>
-	<script type="text/javascript" src="../VirtualGrid.js"></script>
-	<script type="text/javascript" src="../_data/fields.js"></script>
-	<script type="text/javascript" src="../_data/model.js"></script>
-	<script type="text/javascript" src="../_data/editors.js"></script>
-	<script type="text/javascript" src="../Grid.js"></script>
-	<script type="text/javascript" src="support/test_data_objects.js"></script>
-	<script type="text/javascript">
-		// a grid view is a group of columns
-		var view1 = {
-			cells: [[
-				{name: 'Column 0', field: 'col1'},
-				{name: 'Column 1', field: 'col2'},
-				{name: 'Column 2', field: 'col3'},
-				{name: 'Column 3', field: 'col4', width: "150px"},
-				{name: 'Column 4', field: 'col5'}
-			],[
-				{name: 'Column 5', field: 'col6'},
-				{name: 'Column 6', field: 'col7'},
-				{name: 'Column 7'},
-				{name: 'Column 8', field: 'col4', colSpan: 2}
-			]]
-		};
-		// a grid layout is an array of views.
-		var layout = [ view1 ];
-
-		dojo.addOnLoad(function(){
-			model.setData(data);
-
-			var newModel = new dojox.grid.data.Objects(null, data);
-			dijit.byId("grid2").setModel(newModel);
-		});
-</script>
-</head>
-<body>
-<div class="heading">dojox.grid.data.Objects model change</div>
-<div id="grid" dojoType="dojox.Grid" model="model" structure="layout"></div>
-<div id="grid2" dojoType="dojox.Grid" model="model2" structure="layout"></div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_grid_programmatic.html b/dojox/grid/compat/tests/test_grid_programmatic.html
deleted file mode 100644
index 79c32ab..0000000
--- a/dojox/grid/compat/tests/test_grid_programmatic.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
-	"http://www.w3.org/TR/html4/loose.dtd">
-<html>
-	<head>
-		<title>Test dojox.Grid Programmatic Instantiation</title>
-		<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-		<style type="text/css">
-			@import "../../../../dojo/resources/dojo.css";
-			@import "../../_grid/tundraGrid.css";
-			.heading {
-				font-weight: bold;
-				padding-bottom: 0.25em;
-			}
-					
-			#grid { 
-				border: 1px solid #333;
-				width: 50em;
-				height: 30em;
-			}
-		</style>
-		<script type="text/javascript" src="../../../../dojo/dojo.js" 
-			djConfig="isDebug:false, debugAtAllCosts: false, parseOnLoad: true"></script>
-		<script type="text/javascript">
-			dojo.require("dojox.grid.Grid");
-			dojo.require("dojo.parser");
-		</script>
-		<script type="text/javascript" src="support/test_data.js"></script>
-		<script type="text/javascript">
-			dojo.addOnLoad(function(){
-				// a grid view is a group of columns
-				var view1 = {
-					cells: [
-						[
-							{name: 'Column 0'}, 
-							{name: 'Column 1'}, 
-							{name: 'Column 2'}, 
-							{name: 'Column 3', width: "150px"}, 
-							{name: 'Column 4'}
-						],
-						[
-							{name: 'Column 5'}, 
-							{name: 'Column 6'}, 
-							{name: 'Column 7'}, 
-							{name: 'Column 8', field: 3, colSpan: 2}
-						]
-					]
-				};
-				// a grid layout is an array of views.
-				var layout = [ view1 ];
-
-				var grid = new dojox.Grid({
-					"id": "grid",
-					"model": model,
-					"structure": layout
-				});
-				dojo.byId("gridContainer").appendChild(grid.domNode);
-				grid.render();
-			});
-		</script>
-	</head>
-	<body class="tundra">
-		<div class="heading">dojox.Grid Programmatic Instantiation Test</div>
-		<div id="gridContainer"></div>
-	</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_grid_programmatic_layout.html b/dojox/grid/compat/tests/test_grid_programmatic_layout.html
deleted file mode 100644
index e30614c..0000000
--- a/dojox/grid/compat/tests/test_grid_programmatic_layout.html
+++ /dev/null
@@ -1,74 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
-	"http://www.w3.org/TR/html4/loose.dtd">
-<html>
-	<head>
-		<title>Test dojox.Grid Programmatic Instantiation</title>
-		<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-		<style type="text/css">
-			@import "../../_grid/tundraGrid.css";
-			@import "../../../../dojo/resources/dojo.css";
-			@import "../../../../dijit/themes/tundra/tundra.css";
-			@import "../../../../dijit/tests/css/dijitTests.css";
-			.heading {
-				font-weight: bold;
-				padding-bottom: 0.25em;
-			}
-					
-			#grid { 
-				width: 100%;
-				height: 100%;
-			}
-		</style>
-		<script type="text/javascript" src="../../../../dojo/dojo.js" 
-			djConfig="isDebug:false, debugAtAllCosts: false, parseOnLoad: true"></script>
-		<script type="text/javascript">
-			dojo.require("dijit.layout.TabContainer");
-			dojo.require("dijit.layout.ContentPane");
-			dojo.require("dojox.grid.Grid");
-			dojo.require("dojo.parser");
-		</script>
-		<script type="text/javascript" src="support/test_data.js"></script>
-		<script type="text/javascript">
-			dojo.addOnLoad(function(){
-				// a grid view is a group of columns
-				var view1 = {
-					cells: [
-						[
-							{name: 'Column 0'}, 
-							{name: 'Column 1'}, 
-							{name: 'Column 2'}, 
-							{name: 'Column 3', width: "150px"}, 
-							{name: 'Column 4'}
-						],
-						[
-							{name: 'Column 5'}, 
-							{name: 'Column 6'}, 
-							{name: 'Column 7'}, 
-							{name: 'Column 8', field: 3, colSpan: 2}
-						]
-					]
-				};
-				// a grid layout is an array of views.
-				var layout = [ view1 ];
-
-				var grid = new dojox.Grid({
-					title: "tab 1",
-					id: "grid",
-					model: model,
-					structure: layout
-				});
-				dijit.byId("mainTabContainer").addChild(grid, 0);
-				grid.render();
-			});
-		</script>
-	</head>
-	<body class="tundra">
-		<div class="heading">dojox.Grid Programmatic Instantiation Test</div>
-		<div id="mainTabContainer" dojoType="dijit.layout.TabContainer"
-			style="height: 300px; width: 100%;">
-			<div dojoType="dijit.layout.ContentPane" title="Tab 2">
-				... stuff ...
-			</div>
-		</div>
-	</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_grid_rtl.html b/dojox/grid/compat/tests/test_grid_rtl.html
deleted file mode 100644
index 056a8b2..0000000
--- a/dojox/grid/compat/tests/test_grid_rtl.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>Test dojox.Grid Basic</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../_grid/Grid.css";
-		@import "../../_grid/Grid_rtl.css";
-		@import "../../_grid/tundraGrid.css";
-		@import "../../../../dojo/resources/dojo.css";
-		@import "../../../../dijit/themes/tundra/tundra.css";
-		@import "../../../../dijit/themes/tundra/tundra_rtl.css";
-		body {
-			font-size: 0.9em;
-			font-family: Geneva, Arial, Helvetica, sans-serif;
-		}
-		.heading {
-			font-weight: bold;
-			padding-bottom: 0.25em;
-		}
-				
-		#grid {
-			border: 1px solid #333;
-			width: 35em;
-			height: 30em;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug:true, parseOnLoad: true"></script>
-	<!--<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");
-	</script>-->
-	<!-- Debugging -->
-	<script type="text/javascript" src="../_grid/lib.js"></script>
-	<script type="text/javascript" src="../_grid/drag.js"></script>
-	<script type="text/javascript" src="../_grid/scroller.js"></script>
-	<script type="text/javascript" src="../_grid/builder.js"></script>
-	<script type="text/javascript" src="../_grid/cell.js"></script>
-	<script type="text/javascript" src="../_grid/layout.js"></script>
-	<script type="text/javascript" src="../_grid/rows.js"></script>
-	<script type="text/javascript" src="../_grid/focus.js"></script>
-	<script type="text/javascript" src="../_grid/selection.js"></script>
-	<script type="text/javascript" src="../_grid/edit.js"></script>
-	<script type="text/javascript" src="../_grid/view.js"></script>
-	<script type="text/javascript" src="../_grid/views.js"></script>
-	<script type="text/javascript" src="../_grid/rowbar.js"></script>
-	<script type="text/javascript" src="../_grid/publicEvents.js"></script>
-	<script type="text/javascript" src="../VirtualGrid.js"></script>
-	<script type="text/javascript" src="../_data/fields.js"></script>
-	<script type="text/javascript" src="../_data/model.js"></script>
-	<script type="text/javascript" src="../_data/editors.js"></script>
-	<script type="text/javascript" src="../Grid.js"></script>
-	<script type="text/javascript" src="support/test_data.js"></script>
-	<script type="text/javascript">
-		// a grid view is a group of columns
-		var view1 = {
-			cells: [[
-				{name: 'Column 0'}, {name: 'Column 1'}, {name: 'Column 2'}, {name: 'Column 3', width: "150px"}, {name: 'Column 4'}
-			],[
-				{name: 'Column 5'}, {name: 'Column 6'}, {name: 'Column 7'}, {name: 'Column 8', field: 3, colSpan: 2}
-			]]
-		};
-		// a grid layout is an array of views.
-		var layout = [ view1 ];
-</script>
-</head>
-<body dir="rtl">
-<div class="heading">dojox.Grid Basic Test</div>
-<div id="grid" dojoType="dojox.Grid" model="model" structure="layout"></div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_grid_themes.html b/dojox/grid/compat/tests/test_grid_themes.html
deleted file mode 100644
index e96edc1..0000000
--- a/dojox/grid/compat/tests/test_grid_themes.html
+++ /dev/null
@@ -1,118 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>dojox.Grid themes</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../../../dojo/resources/dojo.css";
-		@import "../../_grid/tundraGrid.css";
-		@import "../../_grid/soriaGrid.css";
-		@import "../../_grid/nihiloGrid.css";
-		
-		#grid, #grid2 {
-			width: 65em;
-			height: 25em;
-			padding: 1px;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" 
-		djConfig="isDebug: true, debugAtAllCosts: false, parseOnLoad: true"></script>
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.data.ItemFileReadStore");
-		dojo.require("dojox.data.CsvStore");
-		dojo.require("dojo.parser");
-	</script>
-
-</head>
-<body>
-	<h5>dojox.grid.Grid structure from markup (tundra theme)</h5>
-	<span dojoType="dojox.data.CsvStore" 
-		jsId="csvStore" url="support/movies.csv">
-	</span>
-
-	<table class="tundra" dojoType="dojox.grid.Grid"
-		store="csvStore"
-		query="{ Title: '*' }"
-		clientSort="true"
-		style="width: 800px; height: 300px;">
-		<thead>
-			<tr>
-				<th width="300px" field="Title">Title of Movie</th>
-
-				<th width="5em">Year</th>
-			</tr>
-			<tr>
-				<th colspan="2">Producer</th>
-			</tr>
-		</thead>
-	</table>
-
-	<span dojoType="dojo.data.ItemFileReadStore" 
-		jsId="jsonStore" url="../../../../dijit/tests/_data/countries.json">
-	</span>
-	<h5>Locked views specified with tables and colgroups (soria theme)</h5>
-
-	<table class="soria" dojoType="dojox.grid.Grid"
-		store="jsonStore"
-		rowsPerPage="20"
-		query="{ name: '*' }"
-		style="width: 600px; height: 300px;">
-		<colgroup span="1" noscroll="true" width="300px"></colgroup>
-		<colgroup span="4"></colgroup>
-		<thead>
-
-			<tr>
-				<th field="name">Country/Continent Name</th>
-				<th width="100px" field="population">Population</th>
-				<th width="100px" field="area">Land Mass</th>
-				<th width="100px" field="timezone">Time Zone</th>
-				<th width="5em" field="type">Type</th>
-
-			</tr>
-		</thead>
-	</table>
-
-	<h5>A "regular" Grid from markup (no table defintion, nihilo theme)</h5>
-	<script type="text/javascript">
-		// helper functions and structure definitions for the old markup construction syntax
-		function getRow(inRowIndex){
-			return ' ' + inRowIndex;
-		}
-		
-		var layoutCountries = [
-			// view 0
-			{ type: 'dojox.GridRowView', width: '20px' },
-			// view 1
-			{
-				cells: [
-					[
-						{ name: "Row", get: getRow, width: 5}
-					]
-				],
-				noscroll: true
-			},
-			// view 2
-			{
-				cells: [
-					[
-						{ field: 0, width: 'auto' },
-						{ width: 8 }
-					]
-				]
-			}
-		];
-	</script>
-	<span dojoType="dojox.grid.data.DojoData" 
-		jsId="dataModel2" 
-		rowsPerPage="20"
-		store="jsonStore" 
-		query="{ name : '*' }">
-	</span>
-
-	<div class="nihilo" id="grid2" dojoType="dojox.grid.Grid" elasticView="2" 
-		model="dataModel2" structure="layoutCountries">
-	</div>
-
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_grid_tooltip_menu.html b/dojox/grid/compat/tests/test_grid_tooltip_menu.html
deleted file mode 100644
index a7df88d..0000000
--- a/dojox/grid/compat/tests/test_grid_tooltip_menu.html
+++ /dev/null
@@ -1,162 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>Test dojox.Grid Basic</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../_grid/Grid.css";
-		@import "../../../../dojo/resources/dojo.css";
-		@import "../../../../dijit/themes/dijit.css";
-		@import "../../../../dijit/tests/css/dijitTests.css";
-		body {
-			font-size: 0.9em;
-			font-family: Geneva, Arial, Helvetica, sans-serif;
-		}
-		.heading {
-			font-weight: bold;
-			padding-bottom: 0.25em;
-		}
-				
-		#grid { 
-			border: 1px solid #333;
-			width: 35em;
-			height: 30em;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug:false, parseOnLoad: true"></script>
-	<script type="text/javascript" src="../../../../dijit/tests/_testCommon.js"></script>
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dijit.Tooltip");
-		dojo.require("dijit.Menu");
-		dojo.require("dijit.ColorPalette");
-		dojo.require("dojo.parser");
-	</script>
-	<script type="text/javascript" src="support/test_data.js"></script>
-	<script type="text/javascript">
-		// a grid view is a group of columns
-		var view1 = {
-			cells: [[
-				{name: 'Column 0'}, {name: 'Column 1'}, {name: 'Column 2'}, {name: 'Column 3', width: "150px"}, {name: 'Column 4'}
-			],[
-				{name: 'Column 5'}, {name: 'Column 6'}, {name: 'Column 7'}, {name: 'Column 8', field: 3, colSpan: 2}
-			]]
-		};
-		// a grid layout is an array of views.
-		var layout = [ view1 ];
-		
-		dojo.addOnLoad(function() {
-			window["grid"] = dijit.byId("grid");
-			var 
-				showTooltip = function(e) {
-					if(gridTooltipEnabled){
-						var msg = "This is cell " + e.rowIndex + ", " + e.cellIndex;
-						dijit.showTooltip(msg, e.cellNode);
-					}
-				},
-				hideTooltip = function(e) {
-					dijit.hideTooltip(e.cellNode);
-					// FIXME: make sure that pesky tooltip doesn't reappear!
-					// would be nice if there were a way to hide tooltip without regard to aroundNode.
-					dijit._masterTT._onDeck=null;
-				}
-			
-			// cell tooltip
-			dojo.connect(grid, "onCellMouseOver", showTooltip);
-			dojo.connect(grid, "onCellMouseOut", hideTooltip);
-			// header cell tooltip
-			dojo.connect(grid, "onHeaderCellMouseOver", showTooltip);
-			dojo.connect(grid, "onHeaderCellMouseOut", hideTooltip);
-
-			// grid menu
-			window["gridMenu"] = dijit.byId("gridMenu");
-			gridMenu.bindDomNode(grid.domNode);
-			// prevent grid methods from killing the context menu event by implementing our own handler
-			grid.onCellContextMenu = function(e) {
-				cellNode = e.cellNode;
-			};
-			grid.onHeaderContextMenu = function(e) {
-				cellNode = e.cellNode;
-			};
-		});
-		
-		function reportCell() {
-			if(cellNode){
-				alert("Cell contents:  " + cellNode.innerHTML);
-				cellNode = null;
-			}
-		}
-		
-		gridTooltipEnabled = true;
-		function toggleTooltip(button){
-			gridTooltipEnabled = !gridTooltipEnabled;
-			button.value = gridTooltipEnabled ? "Disable Grid Tooltip" : "Enable Grid Tooltip";
-		}
-		
-		gridMenuEnabled = true;
-		function toggleMenu(button){
-			gridMenuEnabled = !gridMenuEnabled;
-			button.value = gridMenuEnabled ? "Disable Grid Menu" : "Enable Grid Menu";
-			gridMenu[gridMenuEnabled ? "bindDomNode" : "unBindDomNode"](grid.domNode);
-		}
-</script>
-</head>
-<body>
-<div dojoType="dijit.Menu" id="gridMenu"  style="display: none;">
-	<div dojoType="dijit.MenuItem" onClick="reportCell">See cell text...</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>
-<div dojoType="dijit.Menu" id="submenu1" contextMenuForWindow="true" style="display: none;">
-	<div dojoType="dijit.MenuItem" onClick="alert('Hello world');">Enabled Item</div>
-	<div dojoType="dijit.MenuItem" disabled="true">Disabled Item</div>
-	<div dojoType="dijit.MenuSeparator"></div>
-	<div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCut"
-		onClick="alert('not actually cutting anything, just a test!')">Cut</div>
-	<div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconCopy"
-		onClick="alert('not actually copying anything, just a test!')">Copy</div>
-	<div dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconPaste"
-		onClick="alert('not actually pasting anything, just a test!')">Paste</div>
-	<div dojoType="dijit.MenuSeparator"></div>
-	<div dojoType="dijit.PopupMenuItem">
-		<span>Enabled Submenu</span>
-		<div dojoType="dijit.Menu" id="submenu2">
-			<div dojoType="dijit.MenuItem" onClick="alert('Submenu 1!')">Submenu Item One</div>
-			<div dojoType="dijit.MenuItem" onClick="alert('Submenu 2!')">Submenu Item Two</div>
-			<div dojoType="dijit.PopupMenuItem">
-				<span>Deeper Submenu</span>
-				<div dojoType="dijit.Menu" id="submenu4">
-					<div dojoType="dijit.MenuItem" onClick="alert('Sub-submenu 1!')">Sub-sub-menu Item One</div>
-					<div dojoType="dijit.MenuItem" onClick="alert('Sub-submenu 2!')">Sub-sub-menu Item Two</div>
-				</div>
-			</div>
-		</div>
-	</div>
-	<div dojoType="dijit.PopupMenuItem" disabled="true">
-		<span>Disabled Submenu</span>
-		<div dojoType="dijit.Menu" id="submenu3" style="display: none;">
-			<div dojoType="dijit.MenuItem" onClick="alert('Submenu 1!')">Submenu Item One</div>
-			<div dojoType="dijit.MenuItem" onClick="alert('Submenu 2!')">Submenu Item Two</div>
-		</div>
-	</div>
-	<div dojoType="dijit.PopupMenuItem">
-		<span>Different popup</span>
-		<div dojoType="dijit.ColorPalette"></div>
-	</div>
-</div>
-<div class="heading">dojox.Grid Basic Test</div>
-<p>
-	<input type="button" onclick="toggleTooltip(this)" value="Disable Grid Tooltip">  
-	<input type="button" onclick="toggleMenu(this)" value="Disable Grid Menu">  <br />
-	Note: when the grid menu is disabled, the document's dijit context menu should be shown over the grid.
-</p>
-<div id="grid" dojoType="dojox.Grid" model="model" structure="layout"></div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_keyboard.html b/dojox/grid/compat/tests/test_keyboard.html
deleted file mode 100644
index 9927e4d..0000000
--- a/dojox/grid/compat/tests/test_keyboard.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>Test dojox.Grid Basic</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../_grid/Grid.css";
-		body {
-			font-size: 0.9em;
-			font-family: Geneva, Arial, Helvetica, sans-serif;
-		}
-		.heading {
-			font-weight: bold;
-			padding-bottom: 0.25em;
-		}
-				
-		#grid { 
-			border: 1px solid #333;
-			width: 35em;
-			height: 30em;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug:true, parseOnLoad: true"></script>
-	<!--<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");
-	</script>-->
-	<!-- Debugging -->
-	<script type="text/javascript" src="../_grid/lib.js"></script>
-	<script type="text/javascript" src="../_grid/drag.js"></script>
-	<script type="text/javascript" src="../_grid/scroller.js"></script>
-	<script type="text/javascript" src="../_grid/builder.js"></script>
-	<script type="text/javascript" src="../_grid/cell.js"></script>
-	<script type="text/javascript" src="../_grid/layout.js"></script>
-	<script type="text/javascript" src="../_grid/rows.js"></script>
-	<script type="text/javascript" src="../_grid/focus.js"></script>
-	<script type="text/javascript" src="../_grid/selection.js"></script>
-	<script type="text/javascript" src="../_grid/edit.js"></script>
-	<script type="text/javascript" src="../_grid/view.js"></script>
-	<script type="text/javascript" src="../_grid/views.js"></script>
-	<script type="text/javascript" src="../_grid/rowbar.js"></script>
-	<script type="text/javascript" src="../_grid/publicEvents.js"></script>
-	<script type="text/javascript" src="../VirtualGrid.js"></script>
-	<script type="text/javascript" src="../_data/fields.js"></script>
-	<script type="text/javascript" src="../_data/model.js"></script>
-	<script type="text/javascript" src="../_data/editors.js"></script>
-	<script type="text/javascript" src="../Grid.js"></script>
-	<script type="text/javascript" src="support/test_data.js"></script>
-	<script type="text/javascript">
-		// a grid view is a group of columns
-		var view1 = {
-			cells: [[
-				{name: 'Column 0'}, {name: 'Column 1'}, {name: 'Column 2'}, {name: 'Column 3', width: "150px"}, {name: 'Column 4'},
-				{name: 'Column 5'}, {name: 'Column 6'}, {name: 'Column 7', field: 0}, {name: 'Column 8'},
-				{name: 'Column 9'}, {name: 'Column 10'}, {name: 'Column 11', field: 0}, {name: 'Column 12', width: "150px"}, {name: 'Column 13'},
-				{name: 'Column 14'}, {name: 'Column 15'}, {name: 'Column 16', field: 0}, {name: 'Column 17'}
-			]]
-		};
-		// a grid layout is an array of views.
-		var layout = [ view1 ];
-		
-		
-		function keyDown(e) {
-			switch(e.keyCode){
-				case dojo.keys.LEFT_ARROW:
-					console.log('left arrow!');
-					break;
-				case dojo.keys.RIGHT_ARROW:
-					console.log('right arrow!');
-					break;
-				case dojo.keys.ENTER:
-					console.log('enter!');
-					break;
-			}
-			
-			
-		}
-		
-		dojo.addOnLoad(function() {
-			window["grid"] = dijit.byId("grid");
-			dojo.connect(grid, "onKeyDown", keyDown);
-		});
-		
-</script>
-</head>
-<body>
-<div class="heading">dojox.Grid Basic Test</div>
-<div id="grid" dojoType="dojox.Grid" model="model" structure="layout"></div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_markup.html b/dojox/grid/compat/tests/test_markup.html
deleted file mode 100644
index 84acb82..0000000
--- a/dojox/grid/compat/tests/test_markup.html
+++ /dev/null
@@ -1,112 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>dojox.Grid with Dojo.Data via binding</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../../../dojo/resources/dojo.css";
-		@import "../../_grid/tundraGrid.css";
-		
-		#grid, #grid2 {
-			width: 65em;
-			height: 25em;
-			padding: 1px;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" 
-		djConfig="isDebug: true, debugAtAllCosts: false, parseOnLoad: true"></script>
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.data.ItemFileReadStore");
-		dojo.require("dojox.data.CsvStore");
-		dojo.require("dojo.parser");
-	</script>
-</head>
-<body class="tundra">
-	<h5>dojox.grid.Grid structure from markup</h5>
-	<span dojoType="dojox.data.CsvStore" 
-		jsId="csvStore" url="support/movies.csv">
-	</span>
-
-	<table dojoType="dojox.grid.Grid"
-		store="csvStore"
-		query="{ Title: '*' }"
-		clientSort="true"
-		style="width: 800px; height: 300px;">
-		<thead>
-			<tr>
-				<th width="300px" field="Title">Title of Movie</th>
-				<th width="5em">Year</th>
-			</tr>
-			<tr>
-				<th colspan="2">Producer</th>
-			</tr>
-		</thead>
-	</table>
-
-
-	<span dojoType="dojo.data.ItemFileReadStore" 
-		jsId="jsonStore" url="../../../../dijit/tests/_data/countries.json">
-	</span>
-	<h5>Locked views specified with tables and colgroups</h5>
-
-	<table dojoType="dojox.grid.Grid"
-		store="jsonStore"
-		rowsPerPage="20"
-		query="{ name: '*' }"
-		style="width: 600px; height: 300px;">
-		<colgroup span="1" noscroll="true" width="300px"></colgroup>
-		<colgroup span="4"></colgroup>
-		<thead>
-			<tr>
-				<th field="name">Country/Continent Name</th>
-				<th width="100px" field="population">Population</th>
-				<th width="100px" field="area">Land Mass</th>
-				<th width="100px" field="timezone">Time Zone</th>
-				<th width="5em" field="type">Type</th>
-			</tr>
-		</thead>
-	</table>
-
-	<h5>A "regular" Grid from markup (no table defintion)</h5>
-	<script type="text/javascript">
-		// helper functions and structure definitions for the old markup construction syntax
-		function getRow(inRowIndex){
-			return ' ' + inRowIndex;
-		}
-		
-		var layoutCountries = [
-			// view 0
-			{ type: 'dojox.GridRowView', width: '20px' },
-			// view 1
-			{
-				cells: [
-					[
-						{ name: "Row", get: getRow, width: 5}
-					]
-				],
-				noscroll: true
-			},
-			// view 2
-			{
-				cells: [
-					[
-						{ field: 0, width: 'auto' },
-						{ width: 8 }
-					]
-				]
-			}
-		];
-	</script>
-	<span dojoType="dojox.grid.data.DojoData" 
-		jsId="dataModel2" 
-		rowsPerPage="20"
-		store="jsonStore" 
-		query="{ name : '*' }">
-	</span>
-	<div id="grid2" dojoType="dojox.grid.Grid" elasticView="2" 
-		model="dataModel2" structure="layoutCountries">
-	</div>
-
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_mysql_edit.html b/dojox/grid/compat/tests/test_mysql_edit.html
deleted file mode 100644
index e2617c0..0000000
--- a/dojox/grid/compat/tests/test_mysql_edit.html
+++ /dev/null
@@ -1,155 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html debug="true">
-<head>
-	<title>dojox.Grid Test: Mysql Table Editing</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style>
-		@import "../../_grid/tundraGrid.css";
-		@import "../../../../dojo/resources/dojo.css";
-		@import "../../../../dijit/themes/tundra/tundra.css";
-		@import "../../../../dijit/tests/css/dijitTests.css";
-
-		.grid {
-			height: 30em;
-		}
-	</style>
-
-	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug:true, parseOnLoad: true"></script>
-	<script type="text/javascript" src="../../../../dijit/tests/_testCommon.js"></script>
-	<!--<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojox.grid.tests.databaseModel");
-		dojo.require("dojo.parser");
-	</script>-->
-	<!-- Debugging -->
-	<script type="text/javascript" src="../_grid/lib.js"></script>
-	<script type="text/javascript" src="../_grid/drag.js"></script>
-	<script type="text/javascript" src="../_grid/scroller.js"></script>
-	<script type="text/javascript" src="../_grid/builder.js"></script>
-	<script type="text/javascript" src="../_grid/cell.js"></script>
-	<script type="text/javascript" src="../_grid/layout.js"></script>
-	<script type="text/javascript" src="../_grid/rows.js"></script>
-	<script type="text/javascript" src="../_grid/focus.js"></script>
-	<script type="text/javascript" src="../_grid/selection.js"></script>
-	<script type="text/javascript" src="../_grid/edit.js"></script>
-	<script type="text/javascript" src="../_grid/view.js"></script>
-	<script type="text/javascript" src="../_grid/views.js"></script>
-	<script type="text/javascript" src="../_grid/rowbar.js"></script>
-	<script type="text/javascript" src="../_grid/publicEvents.js"></script>
-	<script type="text/javascript" src="../VirtualGrid.js"></script>
-	<script type="text/javascript" src="../_data/fields.js"></script>
-	<script type="text/javascript" src="../_data/model.js"></script>
-	<script type="text/javascript" src="../_data/editors.js"></script>
-	<script type="text/javascript" src="../_data/dijitEditors.js"></script>
-	<script type="text/javascript" src="../Grid.js"></script>
-	<script type="text/javascript" src="databaseModel.js"></script>
-	<script type="text/javascript">
-		var model = new dojox.grid.data.DbTable(null, null, 'support/data.php', "test", "testtbl");
-		// simple display of row info; based on model observing.
-		modelChange = function() {
-			dojo.byId('rowCount').innerHTML = model.count + ' row(s)';
-		}
-		model.observer(this);
-		
-		// yay, let's deal with MySql date types, at least a little bit...
-		// NOTE: supports only default date formatting YYYY-MM-DD HH:MM:SS or YY-MM-DD HH:MM:SS
-		mysqlDateToJsDate = function(inMysqlDateTime, inDateDelim, inTimeDelim) {
-			var dt = inMysqlDateTime.split(' '), d = dt[0], t = dt[1], r;
-			d = d&&d.split(inDateDelim||'-');
-			t = t&&t.split(inTimeDelim||':');
-			if (d && d.length == 3) {
-				r = new Date();
-				r.setYear(d[0]);
-				r.setMonth(parseInt(d[1])-1);
-				r.setDate(d[2]);
-			}
-			if (t && t.length == 3) {
-				r = r || new Date();
-				r.setHours(t[0]);
-				r.setMinutes(t[1]);
-				r.setSeconds(t[2]);
-			}
-			return r || new Date(inMysqlDateTime);
-		}
-		
-		jsDateToMySqlDate = function(inDate) {
-			var
-				d = new Date(inDate),
-				y = d.getFullYear(),
-				m = dojo.string.pad(d.getMonth() + 1),
-				dd = dojo.string.pad(d.getDate())
-			return dojo.string.substitute("${0}-${1}-${2}",[y, m, dd]);
-		};
-		
-		// custom simple MySql date formatter
-		formatMySqlDate = function(inDatum) {
-			return inDatum != dojox.grid.na ? dojo.date.locale.format(mysqlDateToJsDate(inDatum), this.constraint) : dojox.grid.na;
-		}
-		
-		// custom simple MySql date editor
-		dojo.declare("mySqlDateEditor", dojox.grid.editors.DateTextBox, {
-			format: function(inDatum, inRowIndex){
-				inDatum = mysqlDateToJsDate(inDatum);
-				return this.inherited(arguments, [inDatum, inRowIndex]);
-			},
-			getValue: function(inRowIndex){
-				var v = this.editor.getValue(), fv = jsDateToMySqlDate(v);
-				return fv;
-			}
-		});
-		
-		var gridLayout = [ 
-			{ type: "dojox.GridRowView", width: "20px" },
-			{
-			defaultCell: { width: 6, editor: dojox.grid.editors.Dijit }, 
-			cells: [[
-				{ name: 'Id', styles: 'text-align: right;', editorClass: "dijit.form.NumberTextBox" }, 
-				{ name: 'Name', width: 20},
-				{ name: 'Message', styles: 'text-align: right;'},
-				{ name: 'Date', 
-					editor: mySqlDateEditor, 
-					formatter: formatMySqlDate, 
-					constraint: {selector: "date"}, 
-					width: 10, 
-					styles: 'text-align:right;'}
-			]]}
-		];
-
-		function waitMessage() {
-			alert('Edit in progress, please wait.');
-		}
-		
-		function getDefaultRow() {
-			return ['', '', '', jsDateToMySqlDate(new Date())];
-		}
-		function addRow() {
-			if(model.canModify()){
-				grid.addRow(getDefaultRow());
-			}else{
-				waitMessage();
-			}
-		}
-		
-		function removeSelected(){
-			if(model.canModify()){
-				grid.removeSelectedRows();
-			}else{
-				waitMessage();
-			}
-		}
-	</script>
-</head>
-<body class="tundra">
-	<h1>dojox.Grid Test: Mysql Table Editing</h1>
-	<br>
-	<button onclick="addRow()">Add Row</button>  
-	<button onclick="removeSelected()">Remove Selected</button>  
-	<button onclick="grid.edit.apply()">Apply Edit</button>  
-	<button onclick="grid.edit.cancel()">Cancel Edit</button>  
-	<button onclick="grid.refresh()">Refresh</button>
-	<br><br>
-	<div jsId="grid" class="grid" structure="gridLayout" dojoType="dojox.Grid" model="model" singleClickEdit="true" autoWidth="true"></div>
-	<div id="rowCount"></div>
-	<p>Note: This test requires MySql and PHP and works with the database table available in support/testtbl.sql.</p>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_sizing.html b/dojox/grid/compat/tests/test_sizing.html
deleted file mode 100644
index e25b0d7..0000000
--- a/dojox/grid/compat/tests/test_sizing.html
+++ /dev/null
@@ -1,175 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>dojox.Grid Sizing Example</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../../../dojo/resources/dojo.css";
-		@import "../../_grid/tundraGrid.css";
-		
-		.heading {
-			font-weight: bold;
-			padding-bottom: 0.25em;
-		}
-		
-		#container {
-			width: 400px;
-			height: 200px;
-			border: 4px double #333; 
-		}
-				
-		#grid { 
-			border: 1px solid #333;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" 
-		djConfig="isDebug: true, parseOnLoad: true"></script>
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");
-	</script>
-	<!-- Debugging -->
-	<script type="text/javascript" src="../_grid/lib.js"></script>
-	<script type="text/javascript" src="../_grid/drag.js"></script>
-	<script type="text/javascript" src="../_grid/scroller.js"></script>
-	<script type="text/javascript" src="../_grid/builder.js"></script>
-	<script type="text/javascript" src="../_grid/cell.js"></script>
-	<script type="text/javascript" src="../_grid/layout.js"></script>
-	<script type="text/javascript" src="../_grid/rows.js"></script>
-	<script type="text/javascript" src="../_grid/focus.js"></script>
-	<script type="text/javascript" src="../_grid/selection.js"></script>
-	<script type="text/javascript" src="../_grid/edit.js"></script>
-	<script type="text/javascript" src="../_grid/view.js"></script>
-	<script type="text/javascript" src="../_grid/views.js"></script>
-	<script type="text/javascript" src="../_grid/rowbar.js"></script>
-	<script type="text/javascript" src="../_grid/publicEvents.js"></script>
-	<script type="text/javascript" src="../VirtualGrid.js"></script>
-	<script type="text/javascript" src="../_data/fields.js"></script>
-	<script type="text/javascript" src="../_data/model.js"></script>
-	<script type="text/javascript" src="../_data/editors.js"></script>
-	<script type="text/javascript" src="../Grid.js"></script>
-	<script type="text/javascript" src="support/test_data.js"></script>
-	<script type="text/javascript">
-		data = [ 
-			[ "normal", false, "new", 'But are not followed by two hexadecimal', 29.91, 10, false ],
-			[ "important", false, "new", 'Because a % sign always indicates', 9.33, -5, false ],
-			[ "important", false, "read", 'Signs can be selectively', 19.34, 0, true ],
-			[ "note", false, "read", 'However the reserved characters', 15.63, 0, true ],
-			[ "normal", false, "replied", 'It is therefore necessary', 24.22, 5.50, true ],
-			[ "important", false, "replied", 'To problems of corruption by', 9.12, -3, true ],
-			[ "note", false, "replied", 'Which would simply be awkward in', 12.15, -4, false ]
-		];
-		model = new dojox.grid.data.table(null, data);
-		
-		// grid structure
-		// a grid view is a group of columns
-		// a special view providing selection feedback
-		var rowBar = {type: 'dojox.GridRowView', width: '20px'};
-		
-		// a view without scrollbars
-		var leftView = {
-			noscroll: true,
-			cells: [[
-				{name: 'Column 0'},
-				{name: 'Column 1'}
-		]]};
-		
-		var middleView = {
-			cells: [[
-				{name: 'Column 2'},
-				{name: 'Column 3'},
-				{name: 'Column 4'},
-				{name: 'Column 5'},
-				{name: 'Column 6'}
-		]]};
-		
-		// a grid structure is an array of views.
-		var structure = [ rowBar, leftView, middleView];
-		
-		// get can return data for each cell of the grid
-		function get(inRowIndex) {
-			return [this.index, inRowIndex].join(', ');
-		}
-		
-		function resizeInfo() {
-			setTimeout(function() {
-				dojo.byId('gridWidth').value = grid.domNode.clientWidth;
-				dojo.byId('gridHeight').value = grid.domNode.clientHeight;
-			}, 1);
-		}
-		
-		function resizeGrid() {
-			grid.autoHeight = false;
-			grid.autoWidth = false;
-			var
-				w = Number(dojo.byId('gridWidth').value),
-				h = Number(dojo.byId('gridHeight').value);
-			
-			dojo.contentBox(grid.domNode, {w: w, h: h});
-			grid.update();
-		}
-		
-		function fitWidth() {
-			grid.autoWidth = true;
-			grid.autoHeight = false;
-			grid.update();
-		}
-		
-		function fitHeight() {
-			grid.autoWidth = false;
-			grid.autoHeight = true;
-			grid.update();
-		}
-		
-		function fitBoth() {
-			grid.autoWidth = true;
-			grid.autoHeight = true;
-			grid.update();
-		}
-		
-		function sizeDefault() {
-			grid.autoWidth = false;
-			grid.autoHeight = false;
-			grid.domNode.style.width = '';
-			grid.domNode.style.height = 0;
-			grid.update();
-		}
-		
-		dojo.addOnLoad(function() {
-			window["grid"] = dijit.byId("grid");
-			dojo.byId('gridWidth').value = 500;
-			dojo.byId('gridHeight').value = 200;
-			dojo.connect(grid, 'update', resizeInfo);
-			resizeGrid();
-			window["grid1"] = dijit.byId("grid1");
-		});
-		
-	
-</script>
-</head>
-<body class="tundra">
-<div class="heading">dojox.Grid Sizing Test</div>
-	Grid width: <input id="gridWidth" type="text">  
-	and height: <input id="gridHeight" type="text"> 
-	<button onclick="resizeGrid()">Resize Grid</button><br><br>
-	<button onclick="fitWidth()">Fit Data Width</button> 
-	<button onclick="fitHeight()">Fit Data Height</button> 
-	<button onclick="fitBoth()">Fit Data Width & Height</button>
-	<button onclick="sizeDefault()">DefaultSize</button><br><br>
-	<div id="grid" dojoType="dojox.Grid" autoWidth="true" autoHeight="true" model="model" structure="structure" elasticView="2"></div>
-	
-	<p>Grid fits to a sized container by default:</p>
-	<div id="container">
-		<div id="grid1" dojoType="dojox.VirtualGrid" get="get" structure="structure" rowCount="10" elasticView="2"></div>
-	</div>
-
-	<p> Grid is essentially hidden (height of zero) when parent container is unsized 
-		(nothing, including the header, should be displayed):</p>
-	<div id="unsizedContainer">
-		<div id="grid2" dojoType="dojox.VirtualGrid" get="get" structure="structure" rowCount="10" elasticView="2"></div>
-	</div>
-
-	<p> Grid is autoHeight and autoWidth via markup</p>
-		<div id="grid3" dojoType="dojox.VirtualGrid" autoWidth="true" autoHeight="true" get="get" structure="structure" rowCount="10" elasticView="2"></div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_sizing_100rows.html b/dojox/grid/compat/tests/test_sizing_100rows.html
deleted file mode 100644
index ca13426..0000000
--- a/dojox/grid/compat/tests/test_sizing_100rows.html
+++ /dev/null
@@ -1,168 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>dojox.Grid Sizing Example</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../../../dojo/resources/dojo.css";
-		@import "../../_grid/tundraGrid.css";
-		
-		body {
-			font-size: 0.9em;
-			font-family: Geneva, Arial, Helvetica, sans-serif;
-		}
-		.heading {
-			font-weight: bold;
-			padding-bottom: 0.25em;
-		}
-		
-		#container {
-			width: 400px;
-			height: 200px;
-			border: 4px double #333; 
-		}
-				
-		#grid { 
-			border: 1px solid #333;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" 
-		djConfig="isDebug: true, parseOnLoad: true"></script>
-	<script type="text/javascript">
-		/*dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");*/
-	</script>
-	<!-- Debugging -->
-	<script type="text/javascript" src="../_grid/lib.js"></script>
-	<script type="text/javascript" src="../_grid/drag.js"></script>
-	<script type="text/javascript" src="../_grid/scroller.js"></script>
-	<script type="text/javascript" src="../_grid/builder.js"></script>
-	<script type="text/javascript" src="../_grid/cell.js"></script>
-	<script type="text/javascript" src="../_grid/layout.js"></script>
-	<script type="text/javascript" src="../_grid/rows.js"></script>
-	<script type="text/javascript" src="../_grid/focus.js"></script>
-	<script type="text/javascript" src="../_grid/selection.js"></script>
-	<script type="text/javascript" src="../_grid/edit.js"></script>
-	<script type="text/javascript" src="../_grid/view.js"></script>
-	<script type="text/javascript" src="../_grid/views.js"></script>
-	<script type="text/javascript" src="../_grid/rowbar.js"></script>
-	<script type="text/javascript" src="../_grid/publicEvents.js"></script>
-	<script type="text/javascript" src="../VirtualGrid.js"></script>
-	<script type="text/javascript" src="../_data/fields.js"></script>
-	<script type="text/javascript" src="../_data/model.js"></script>
-	<script type="text/javascript" src="../_data/editors.js"></script>
-	<script type="text/javascript" src="../Grid.js"></script>
-	<script type="text/javascript" src="support/test_data.js"></script>
-	<script type="text/javascript">
-		// grid structure
-		// a grid view is a group of columns
-		// a special view providing selection feedback
-		var rowBar = {type: 'dojox.GridRowView', width: '20px'};
-		
-		// a view without scrollbars
-		var leftView = {
-			noscroll: true,
-			cells: [[
-				{name: 'Column 0'},
-				{name: 'Column 1'}
-		]]};
-		
-		var middleView = {
-			cells: [[
-				{name: 'Column 2'},
-				{name: 'Column 3'},
-				{name: 'Column 4'},
-				{name: 'Column 5'},
-				{name: 'Column 6'}
-		]]};
-		
-		// a grid structure is an array of views.
-		var structure = [ rowBar, leftView, middleView];
-		
-		// get can return data for each cell of the grid
-		function get(inRowIndex) {
-			return [this.index, inRowIndex].join(', ');
-		}
-		
-		function resizeInfo() {
-			setTimeout(function() {
-				dojo.byId('gridWidth').value = grid.domNode.clientWidth;
-				dojo.byId('gridHeight').value = grid.domNode.clientHeight;
-			}, 1);
-		}
-		
-		function resizeGrid() {
-			grid.autoHeight = false;
-			grid.autoWidth = false;
-			var
-				w = Number(dojo.byId('gridWidth').value),
-				h = Number(dojo.byId('gridHeight').value);
-			
-			dojo.contentBox(grid.domNode, {w: w, h: h});
-			grid.update();
-		}
-		
-		function fitWidth() {
-			grid.autoWidth = true;
-			grid.autoHeight = false;
-			grid.update();
-		}
-		
-		function fitHeight() {
-			grid.autoWidth = false;
-			grid.autoHeight = true;
-			grid.update();
-		}
-		
-		function fitBoth() {
-			grid.autoWidth = true;
-			grid.autoHeight = true;
-			grid.update();
-		}
-		
-		function sizeDefault() {
-			grid.autoWidth = false;
-			grid.autoHeight = false;
-			grid.domNode.style.width = '';
-			grid.domNode.style.height = 0;
-			grid.update();
-		}
-		
-		dojo.addOnLoad(function() {
-			window["grid"] = dijit.byId("grid");
-			dojo.byId('gridWidth').value = 500;
-			dojo.byId('gridHeight').value = 200;
-			dojo.connect(grid, 'update', resizeInfo);
-			resizeGrid();
-			window["grid1"] = dijit.byId("grid1");
-		});
-		
-	
-</script>
-</head>
-<body class="tundra">
-<div class="heading">dojox.Grid Sizing Test</div>
-	Grid width: <input id="gridWidth" type="text">  
-	and height: <input id="gridHeight" type="text"> 
-	<button onclick="resizeGrid()">Resize Grid</button><br><br>
-	<button onclick="fitWidth()">Fit Data Width</button> 
-	<button onclick="fitHeight()">Fit Data Height</button> 
-	<button onclick="fitBoth()">Fit Data Width & Height</button>
-	<button onclick="sizeDefault()">DefaultSize</button><br><br>
-	<div id="grid" dojoType="dojox.Grid" autoWidth="true" autoHeight="true" model="model" structure="structure" elasticView="2"></div>
-	
-	<p>Grid fits to a sized container by default:</p>
-	<div id="container">
-		<div id="grid1" dojoType="dojox.VirtualGrid" get="get" structure="structure" rowCount="10" elasticView="2"></div>
-	</div>
-
-	<p> Grid is essentially hidden (height of zero) when parent container is unsized 
-		(nothing, including the header, should be displayed):</p>
-	<div id="unsizedContainer">
-		<div id="grid2" dojoType="dojox.VirtualGrid" get="get" structure="structure" rowCount="10" elasticView="2"></div>
-	</div>
-
-	<p> Grid is autoHeight and autoWidth via markup</p>
-		<div id="grid3" dojoType="dojox.VirtualGrid" autoWidth="true" autoHeight="true" get="get" structure="structure" rowCount="100" elasticView="2"></div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_sizing_ResizeHandle.html b/dojox/grid/compat/tests/test_sizing_ResizeHandle.html
deleted file mode 100644
index 10cdb08..0000000
--- a/dojox/grid/compat/tests/test_sizing_ResizeHandle.html
+++ /dev/null
@@ -1,113 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>dojox.Grid Sizing Example</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../../../dojo/resources/dojo.css";
-		@import "../../../../dijit/tests/css/dijitTests.css";
-		@import "../../_grid/tundraGrid.css";
-		@import "../../../layout/resources/ResizeHandle.css";
-
-		.heading {
-			font-weight: bold;
-			padding-bottom: 0.25em;
-		}
-		
-		#bar, #container {
-			width: 400px;
-			height: 200px;
-			border: 4px double #333; 
-		}
-				
-		#grid { 
-			border: 1px solid #333;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" 
-		djConfig="isDebug:true, parseOnLoad: true"></script>
-
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");
-		dojo.require("dojox.layout.ResizeHandle");
-	</script>
-	<script type="text/javascript">
-		data = [ 
-			[ "normal", false, "new", 'But are not followed by two hexadecimal', 29.91, 10, false ],
-			[ "important", false, "new", 'Because a % sign always indicates', 9.33, -5, false ],
-			[ "important", false, "read", 'Signs can be selectively', 19.34, 0, true ],
-			[ "note", false, "read", 'However the reserved characters', 15.63, 0, true ],
-			[ "normal", false, "replied", 'It is therefore necessary', 24.22, 5.50, true ],
-			[ "important", false, "replied", 'To problems of corruption by', 9.12, -3, true ],
-			[ "note", false, "replied", 'Which would simply be awkward in', 12.15, -4, false ]
-		];
-		model = new dojox.grid.data.table(null, data);
-		
-		// grid structure
-		// a grid view is a group of columns
-		// a special view providing selection feedback
-		var rowBar = {type: 'dojox.GridRowView', width: '20px'};
-		
-		// a view without scrollbars
-		var leftView = {
-			noscroll: false,
-			cells: [[
-				{name: 'Column 0'},
-				{name: 'Column 1'}
-		]]};
-		
-		var middleView = {
-			cells: [[
-				{name: 'Column 2'},
-				{name: 'Column 3'},
-				{name: 'Column 4'},
-				{name: 'Column 5'},
-				{name: 'Column 6'}
-		]]};
-		
-		// a grid structure is an array of views.
-		var structure = [ rowBar, leftView, middleView];
-		
-		// get can return data for each cell of the grid
-		function get(inRowIndex) {
-			return [this.index, inRowIndex].join(', ');
-		}
-
-		dojo.addOnLoad(function(){
-			var hand = new dojox.layout.ResizeHandle({
-				targetContainer: dojo.byId("bar"),
-				animateSizing: false,
-				onResize: function(e){
-					setTimeout(dojo.hitch(aGrid,"resize",e),25);
-				}
-			},"hand0");
-		});
-		
-	
-</script>
-</head>
-<body class="tundra">
-<div class="heading">dojox.Grid Sizing Test w/ the experimental dojox.layout.ResizeHandle</div>
-	
-	<p>While this test should work, dojox.layout.ResizeHandle is experimental.</p>
-	
-	<div id="bar" style="position:relative">
-		<div jsId="aGrid" id="grid" dojoType="dojox.Grid" model="model" structure="structure" elasticView="2"></div>
-		<div id="hand0"></div>
-	</div>
-	
-	<p>Grid fits to a sized container by default:</p>
-	<div id="container" style="position:relative">
-		<div jsId="theGrid" id="grid1" dojoType="dojox.VirtualGrid" get="get" structure="structure" rowCount="75" elasticView="2"></div>
-		<div id="hand1" dojoType="dojox.layout.ResizeHandle" targetId="container" onResize="setTimeout(dojo.hitch(theGrid,'update'),50)" animateSizing="false"></div>
-	</div>
-	
-	<p>I am here to take up</p>
-
-	<p>space</p>
-
-	<p>as much as needed.</p>
-		
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_styling.html b/dojox/grid/compat/tests/test_styling.html
deleted file mode 100644
index b78904a..0000000
--- a/dojox/grid/compat/tests/test_styling.html
+++ /dev/null
@@ -1,131 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>dojox.Grid Styling Test</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style type="text/css">
-		@import "../../_grid/Grid.css";
-		body {
-			font-size: 0.9em;
-			font-family: Geneva, Arial, Helvetica, sans-serif;
-		}
-		.heading {
-			font-weight: bold;
-			padding-bottom: 0.25em;
-		}
-				
-		#grid { 
-			border: 1px solid #333;
-			width: 45em;
-			height: 30em;
-		}
-		
-		#grid .dojoxGrid-row {
-			border: none;
-		}
-		
-		#grid .dojoxGrid-row-table {
-			border-collapse: collapse;
-		}
-		
-		#grid .dojoxGrid-cell {
-			border: none;
-			padding: 10px;
-		}
-		
-		.selectedRow .dojoxGrid-cell {
-			background-color: #003366;
-			color: white;
-		}
-		
-		.specialRow .dojoxGrid-cell {
-			background-color: dimgray;
-		}
-		
-		.selectedRow.specialRow .dojoxGrid-cell {
-			text-decoration: line-through;
-			/* duplicate selection background-color so has precendence over specialRow background-color */
-			background-color: #003366;
-		}
-		
-		/* in the yellow column, assign specific decoration for special rows that are selected */
-		.selectedRow.specialRow .yellowColumnData {
-			text-decoration: line-through underline;
-		}
-		
-		.yellowColumn {
-			color: #006666;
-		}
-			
-		.overRow .dojoxGrid-cell {
-			text-decoration: underline;
-		}
-		
-		.greenColumn {
-			color: yellow;
-			background-color: #006666;
-			font-style: italic;
-		}	
-		.yellowColumnData {
-			background-color: yellow;
-			text-decoration: underline;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug:false, parseOnLoad: true"></script>
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");
-	</script>
-	<script type="text/javascript" src="support/test_data.js"></script>
-	<script type="text/javascript">
-		// grid structure
-		// a grid view is a group of columns
-		
-		// a view without scrollbars
-		var leftView = {
-			noscroll: true,
-			cells: [[
-				{name: 'Column 0', width: 5, headerStyles: 'padding-bottom: 2px;', styles: 'border-bottom: 1px dashed #333; border-right: 1px dashed #333; padding: 6px;'},
-				{name: 'Column 1', width: 5, headerStyles: 'padding-bottom: 2px;', styles: 'text-align: right; border-bottom: 1px dashed #333; border-right: 1px dashed #333; padding: 6px;'}
-		]]};
-		
-		var middleView = {
-			cells: [[
-				{name: 'Column 2'},
-				{name: 'Column 3', headerStyles: 'background-image: none; background-color: #003333;', classes: 'greenColumn'},
-				{name: 'Column 4', cellClasses: 'yellowColumnData', classes: 'yellowColumn', styles: 'text-align: center;' },
-				{name: 'Column 5', headerStyles: 'background-image: none; background-color: #003333;', classes: 'greenColumn'},
-				{name: 'Column 6'},
-				{name: 'Column 7'}
-		]]};
-		
-		// a grid structure is an array of views.
-		var structure = [ leftView, middleView ];
-		
-		function onStyleRow(inRow) {
-			with (inRow) {
-				var i = index % 10;
-				var special = (i > 2 && i < 6);
-				if (odd)
-					customStyles += ' color: orange;';
-				if (selected)	
-					customClasses += ' selectedRow';
-				if (special)	
-					customClasses += ' specialRow';
-				if (over)	
-					customClasses += ' overRow';
-				if (!over && !selected)
-					dojox.Grid.prototype.onStyleRow.apply(this, arguments);
-			}	
-		}
-		
-		dojo.addOnLoad(function() {
-			window["grid"] = dijit.byId('grid');
-		});
-</script>
-</head>
-<body>
-<div class="heading">dojox.Grid Styling Example</div>
-<div id="grid" dojoType="dojox.Grid" onStyleRow="onStyleRow" model="model" structure="structure"></div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_subgrid.html b/dojox/grid/compat/tests/test_subgrid.html
deleted file mode 100644
index 601933f..0000000
--- a/dojox/grid/compat/tests/test_subgrid.html
+++ /dev/null
@@ -1,179 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-<title>dojox.Grid Subgrid Test</title>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-</meta>
-<style>
-		@import "../../../../dojo/resources/dojo.css";
-		@import "../../_grid/tundraGrid.css";
-		
-		body { font-size: 1.0em; }
-		#grid {
-			height: 400px;
-			border: 1px solid silver;
-		}
-		.text-oneline {
-			white-space: nowrap;
-			overflow: hidden;
-			text-overflow: ellipsis;
-		}
-		.text-scrolling {
-			height: 4em;
-			overflow: auto;
-		}
-		.text-scrolling {
-			width: 21.5em;
-		}
-	</style>
-	
-	<script type="text/javascript" src="../../../../dojo/dojo.js" 
-		djConfig="isDebug:true, debugAtAllCosts: false, parseOnLoad: true"></script>
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");
-	</script>
-	<script type="text/javascript">
-		data = [ 
-			[ '3 stars', 'Averagia', 'Averagia', 8.99, 'An authentic experience defined by the intense layer of frothy, real facts. This combination package includes special T DISCS that work with your system to produce a perfectly serene experience. $8.99 per package. Please choose Regular (#NS1) or Decaffeinated (#NS4).' ],
-		 	[ '2 stars', 'Cheapy', 'Cheapy', 6.29, 'Power and subtlety intersect for an experience with real character. Imported from Europe just for you. 16 T DISCS per package. $6.29 per package. #NJ4.' ],
-		 	[ '4 stars', 'Luxuria', 'Luxuria', 6.49, 'A bold statement from the respected European brand Luxuria, topped with delicate zanthum. Imported exclusively for you. 18 T DISCS per package. $6.49 per package. #N42.</div>' ],
-		 	[ '5 stars', 'Ultimo', 'Ultimo', 4.59, "A rich sensation of delicious experience, brought to you by one of Europe's oldest brands. A pure indulgence. 8 T DISCS per package. $4.59 per package. #NJ0." ]
-		];		 
-
-		getDetailData = function(inRowIndex) {
-			var row = data[this.grid.dataRow % data.length];
-			switch (this.index) {
-				case 0:
-					return row[0]; //'<img src="images/sample/' + row[0] + '" width="109" height="75">';
-				case 1:
-					return (100000000 + this.grid.dataRow).toString().slice(1);
-				case 2:
-					return row[3];
-				case 3:
-					return row[1];
-				case 4:
-					return row[2];
-				case 5:
-					return row[4];
-				default: 
-					return row[this.index];
-			}
-		}		 
-		
-		getName = function(inRowIndex) {
-			var row = data[inRowIndex % data.length];
-			return row[2];
-		}		 
-		
-		// Main grid structure 
-		var gridCells = [
-			{ type: 'dojox.GridRowView', width: '20px' }, 
-			{ 
-				onBeforeRow: function(inDataIndex, inSubRows) {
-					inSubRows[1].hidden = !detailRows[inDataIndex];
-				},
-				cells: [[
-					{ name: '', width: 3, get: getCheck, styles: 'text-align: center;' }, { name: 'Name', get: getName, width: 40 }
-				], [
-					{ name: '', get: getDetail, colSpan: 2, styles: 'padding: 0; margin: 0;'}
-				]]
-			}
-		];
-		
-		// html for the +/- cell
-		function getCheck(inRowIndex) { 
-			var image = (detailRows[inRowIndex] ? 'open.gif' : 'closed.gif');
-			var show = (detailRows[inRowIndex] ? 'false' : 'true')
-			return '<img height="11" width="11" src="images/' + image + '" onclick="toggleDetail(' + inRowIndex + ', ' + show + ')">';
-		}
-		
-		// provide html for the Detail cell in the master grid		
-		function getDetail(inRowIndex) {
-			var cell = this;
-			// we can affect styles and content here, but we have to wait to access actual nodes
-			setTimeout(function() { buildSubgrid(inRowIndex, cell); }, 1);
-			// look for a subgrid
-			var subGrid = dijit.byId(makeSubgridId(inRowIndex));
-			var h = (subGrid ? subGrid.cacheHeight : "120") + "px";
-			// insert a placeholder
-			return '<div style="height: ' + h + '; background-color: white;"></div>';
-		}
-		
-		// the Detail cell contains a subgrid which we set up below
-		
-			var subGridCells = [{
-				noscroll: true,
-				cells: [
-					[{ name: "Rating", rowSpan: 2, width: 10, noresize: true, styles: 'text-align:center;' }, 
-							{ name: "Sku" }, 
-							{ name: "Price" }, 
-							{ name: "Vendor" }, 
-							{ name: "Name", width: "auto" }], 
-					[{ name: "Description", colSpan: 4 }]
-				]}];
-
-			var subGridProps = {
-				structure: subGridCells, 
-				rowCount: 1, 
-				autoHeight: true, 
-				autoRender: false,
-				"get": getDetailData
-			};
-	
-			// identify subgrids by their row indices
-			function makeSubgridId(inRowIndex) {
-				return grid.widgetId + "_subGrid_" + inRowIndex;
-			}
-	
-			// if a subgrid exists at inRowIndex, detach it from the DOM
-			function detachSubgrid(inRowIndex) {
-				var subGrid = dijit.byId(makeSubgridId(inRowIndex));
-				if (subGrid)
-					dojox.grid.removeNode(subGrid.domNode);
-			}
-			
-			// render a subgrid into inCell at inRowIndex
-			function buildSubgrid(inRowIndex, inCell) {
-				var n = inCell.getNode(inRowIndex).firstChild;
-				var id = makeSubgridId(inRowIndex);
-				var subGrid = dijit.byId(id);
-				if (subGrid) {
-					n.appendChild(subGrid.domNode);
-				} else {
-					subGridProps.dataRow = inRowIndex;
-					subGridProps.widgetId = id;
-					subGrid = new dojox.VirtualGrid(subGridProps, n);
-				}
-				if (subGrid) {
-					subGrid.render();
-					subGrid.cacheHeight = subGrid.domNode.offsetHeight;
-					inCell.grid.rowHeightChanged(inRowIndex);
-				}	
-			}
-					
-			// destroy subgrid at inRowIndex
-			function destroySubgrid(inRowIndex) {
-				var subGrid = dijit.byId(makeSubgridId(inRowIndex));
-				if (subGrid) subGrid.destroy();
-			}
-		
-		// when user clicks the +/-
-		detailRows = [];
-		function toggleDetail(inIndex, inShow) {
-			if (!inShow) detachSubgrid(inIndex);
-			detailRows[inIndex] = inShow;
-			grid.updateRow(inIndex);
-		}
-		
-		dojo.addOnLoad(function() {
-			window["grid"] = dijit.byId("grid");
-			dojo.connect(grid, 'rowRemoved', destroySubgrid);
-		});
-	</script>
-</head>
-<body class="tundra">
-	<div style="font-weight: bold; padding-bottom: 0.25em;">dojox.Grid showing sub-grid.</div>
-	<div id="grid" dojoType="dojox.VirtualGrid" structure="gridCells" rowCount="100000" autoWidth="true"></div>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_tundra_edit.html b/dojox/grid/compat/tests/test_tundra_edit.html
deleted file mode 100644
index f7fb39c..0000000
--- a/dojox/grid/compat/tests/test_tundra_edit.html
+++ /dev/null
@@ -1,139 +0,0 @@
-<!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">
-	<head>
-		<title>Test dojox.Grid Editing</title>
-		<style>
-			@import "../../_grid/tundraGrid.css";
-			@import "../../../../dojo/resources/dojo.css";
-			@import "../../../../dijit/themes/tundra/tundra.css";
-			@import "../../../../dijit/tests/css/dijitTests.css";
-
-			.dojoxGrid-row-editing td {
-				background-color: #F4FFF4;
-			}
-			.dojoxGrid input, .dojoxGrid select, .dojoxGrid textarea {
-				margin: 0;
-				padding: 0;
-				border-style: none;
-				width: 100%;
-				font-size: 100%;
-				font-family: inherit;
-			}
-			.dojoxGrid input {
-			}
-			.dojoxGrid select {
-			}
-			.dojoxGrid textarea {
-			}
-
-			#controls {
-				padding: 6px 0;
-			}
-			#controls button {
-				margin-left: 10px;
-			}
-			.myGrid {
-				width: 850px;
-				height: 350px;
-				border: 1px solid silver;
-			}
-		</style>
-		<script type="text/javascript" src="../../../../dojo/dojo.js"
-			djConfig="isDebug:false, parseOnLoad: true"></script>
-		<script type="text/javascript">
-			dojo.require("dojox.grid.Grid");
-			dojo.require("dojo.parser");
-		</script>
-		<script type="text/javascript">
-			// ==========================================================================
-			// Create a data model
-			// ==========================================================================
-			data = [ 
-				[ "normal", false, "new", 'But are not followed by two hexadecimal', 29.91, 10, false ],
-				[ "important", false, "new", 'Because a % sign always indicates', 9.33, -5, false ],
-				[ "important", false, "read", 'Signs can be selectively', 19.34, 0, true ],
-				[ "note", false, "read", 'However the reserved characters', 15.63, 0, true ],
-				[ "normal", false, "replied", 'It is therefore necessary', 24.22, 5.50, true ],
-				[ "important", false, "replied", 'To problems of corruption by', 9.12, -3, true ],
-				[ "note", false, "replied", 'Which would simply be awkward in', 12.15, -4, false ]
-			];
-			var rows = 10000;
-			for(var i=0, l=data.length; i<rows-l; i++){
-				data.push(data[i%l].slice(0));
-			}
-			model = new dojox.grid.data.Table(null, data);
-
-			// ==========================================================================
-			// Tie some UI to the data model
-			// ==========================================================================
-			model.observer(this);
-			modelChange = function(){
-				dojo.byId("rowCount").innerHTML = 'Row count: ' + model.count; 
-			}
-
-			// ==========================================================================
-			// Custom formatter
-			// ==========================================================================
-			formatMoney = function(inDatum){
-				return isNaN(inDatum) ? '...' : '$' + parseFloat(inDatum).toFixed(2);
-			}
-
-			// ==========================================================================
-			// Grid structure
-			// ==========================================================================
-			statusCell = { 
-				field: 2,
-				name: 'Status',
-				styles: 'text-align: center;',
-				editor: dojox.grid.editors.Select,
-				options: [ "new", "read", "replied" ]
-			};
-
-			gridLayout = [
-				{
-					type: 'dojox.GridRowView', width: '20px'
-				},
-				{
-					defaultCell: { width: 8, editor: dojox.grid.editors.Input, styles: 'text-align: right;'  },
-					rows: [
-						[
-							{ name: 'Id', width: 3, get: function(inRowIndex){ return inRowIndex+1;} },
-							{ name: 'Priority', styles: 'text-align: center;', editor: dojox.grid.editors.Select, options: ["normal", "note", "important"]},
-							{ name: 'Mark', width: 3, styles: 'text-align: center;', editor: dojox.grid.editors.Bool },
-							statusCell,
-							{ name: 'Message', styles: '', width: '100%' },
-							{ name: 'Amount', formatter: formatMoney }
-						]
-					]
-				}
-			];
-			// ==========================================================================
-			// UI Action
-			// ==========================================================================
-			addRow = function() {
-				grid.addRow([ "normal", false, "new", 'Now is the time for all good men to come to the aid of their party.', 99.99, 9.99, false ]);
-			}
-		</script>
-	</head>
-	<body class="tundra">
-	<h1>dojox.Grid Basic Editing test</h1>
-	<br />
-	<div id="controls">
-		<button onclick="grid.refresh()">Refresh</button>
-		<button onclick="grid.edit.focusEditor()">Focus Editor</button>
-		<button onclick="grid.focus.next()">Next Focus</button>
-		<button onclick="addRow()">Add Row</button>
-		<button onclick="grid.removeSelectedRows()">Remove</button>
-		<button onclick="grid.edit.apply()">Apply</button>
-		<button onclick="grid.edit.cancel()">Cancel</button>
-		<button onclick="grid.singleClickEdit = !grid.singleClickEdit">Toggle singleClickEdit</button>
-	</div>
-	<br />
-	<div jsId="grid" class="myGrid" 
-		dojoType="dojox.Grid" model="model" 
-		structure="gridLayout"></div>
-	<br />
-	<div id="rowCount"></div>
-	</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_yahoo_images.html b/dojox/grid/compat/tests/test_yahoo_images.html
deleted file mode 100644
index fc91ff2..0000000
--- a/dojox/grid/compat/tests/test_yahoo_images.html
+++ /dev/null
@@ -1,148 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>dojox.Grid - Image Search Test</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style>
-		@import "../../_grid/Grid.css";
-		body {
-			font-size: 0.9em;
-			font-family: Geneva, Arial, Helvetica, sans-serif;
-		}
-		.grid {
-			height: 30em;
-			width: 51em;
-			border: 1px solid silver;
-		}
-		#info { width: 700px; }
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" 
-		djConfig="debugAtAllCosts: false, isDebug:false, parseOnLoad: true">
-	</script>
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");
-	</script>
-	<script type="text/javascript" src="yahooSearch.js"></script>	
-	<script type="text/javascript">
-		// model fields
-		imageFields = [
-			{ name: 'Title', na: '' }, 
-			{ name: 'Thumbnail', na: ''},
-			{ name: 'Summary', na: '' },
-			{ name: 'Url', na: '' },
-			{ name: 'FileSize', na: ''},
-			{ name: 'Height', na: ''},
-			{ name: 'Width', na: ''}
-		];
-		// create data model
-		var model = new dojox.grid.data.yahooSearch(imageFields, null, "searchInput");
-		model.url = 'http://search.yahooapis.com/ImageSearchService/V1/imageSearch';
-		model.observer(this);
-		
-		// report some model send/receive status
-		model.onSend = function(inParams){
-			dojo.byId('sendInfo').innerHTML = dojo.string.substitute(
-				'Request rows ${0} to ${1}.&nbsp ',
-				[inParams.start, inParams.start + inParams.results -1]
-			);
-		}
-		model.onReceive = function(inData) {
-			dojo.byId('receiveInfo').innerHTML = dojo.string.substitute(
-				'Receive rows ${0} to ${1}.&nbsp ', 
-				[
-					inData.firstResultPosition, 
-					inData.firstResultPosition + inData.totalResultsReturned-1
-				]
-			);
-		}
-
-
-		// Define grid structure
-		// remove the height from the header image cell / row cells have a default height so there's less adjustment when thumb comes in.
-		beforeImageRow = function(inRowIndex, inSubRows){
-			inSubRows[0].hidden = (inRowIndex == -1);
-		}
-		
-		var imageLayout = [ 
-			{ onBeforeRow: beforeImageRow,
-				cells: [
-					[	{ name: 'Image', cellStyles: "height: 100px;", styles: "text-align: center;", width: 12, field: 3, extraField: 1, formatter: formatImage },
-						{ name: 'Image', cellStyles: "height: 100px;", styles: "text-align: center;", width: 12, field: 3, extraField: 1, formatter: formatImage },
-						{ name: 'Image', cellStyles: "height: 100px;", styles: "text-align: center;", width: 12, field: 3, extraField: 1, formatter: formatImage },
-						{ name: 'Image', cellStyles: "height: 100px;", styles: "text-align: center;", width: 12, field: 3, extraField: 1, formatter: formatImage }
-					]
-			]}
-		];
-		
-		// Create grid subclass to function as we need to display images only.
-		// adds indirection between model row and grid row.
-		dojo.declare("dojox.ImageGrid", dojox.Grid, {
-			postCreate: function() {
-				this.inherited(arguments);
-				this.modelDatumChange = this.modelRowChange;
-				this.colCount = this.layout.cells.length;
-			},
-			getDataRowIndex: function(inCell, inRowIndex) {
-				var r = inCell.index + Math.floor(inRowIndex * this.colCount);
-				return r;
-			},
-			// called in cell context
-			get: function(inRowIndex) {
-				var r = this.grid.getDataRowIndex(this, inRowIndex);
-				return dojox.Grid.prototype.get.call(this, r);
-			},
-			modelAllChange: function(){
-				this.rowCount = Math.ceil(this.model.getRowCount() / this.colCount);
-				this.updateRowCount(this.rowCount);
-			},
-			modelRowChange: function(inData, inRowIndex) {
-				if(
-					(inRowIndex % this.colCount == this.colCount - 1)||
-					(inRowIndex == this.model.count - 1)
-				){
-					this.updateRow(Math.floor(inRowIndex / this.colCount));
-				}
-			}
-		});
-		
-		getCellData = function(inCell, inRowIndex, inField) {
-			var m = inCell.grid.model, r = inCell.grid.getDataRowIndex(inCell, inRowIndex);
-			return m.getDatum(r, inField);
-		}
-		
-		// execute search
-		doSearch = function(){
-			model.clearData();
-			model.setRowCount(0);
-			grid.render();
-			grid.resize();
-			model.requestRows();
-		}
-		
-		dojo.addOnLoad(function(){
-			dojo.query("#searchInput").onkeypress(function(e){
-				if(e.keyCode == dojo.keys.ENTER){ doSearch(); }
-			});
-			doSearch();
-		});
-		
-	</script>
-</head>
-<body>
-	<div style="font-weight: bold; padding-bottom: 0.25em;">dojox.Grid - Image Search Test</div>
-	<input id="searchInput" type="text" value="apple">
-	<button onclick="doSearch()" style="clear: both;">Search</button>
-	<div jsId="grid" class="grid" structure="imageLayout" dojoType="dojox.ImageGrid" model="model"></div>
-	<br>
-	<div id="info">
-		<div id="rowCount" style="float: left"></div>
-		<div style="float: right">
-			<div id="sendInfo" style="text-align: right"></div>
-			<div id="receiveInfo" style="text-align: right"></div>
-		</div>
-	</div>
-	<br /><br />
-	<p>Note: requires PHP for proxy.</p>
-	</body>
-</html>
diff --git a/dojox/grid/compat/tests/test_yahoo_search.html b/dojox/grid/compat/tests/test_yahoo_search.html
deleted file mode 100644
index 502a1ca..0000000
--- a/dojox/grid/compat/tests/test_yahoo_search.html
+++ /dev/null
@@ -1,141 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-	<title>dojox.Grid - Yahoo Search Test</title>
-	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
-	<style>
-		@import "../../_grid/Grid.css";
-		body {
-			font-size: 0.9em;
-			font-family: Geneva, Arial, Helvetica, sans-serif;
-		}
-		.grid {
-			height: 30em;
-		}
-		
-		#info {
-			width: 700px;
-		}
-	</style>
-	<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug:false, parseOnLoad: true"></script>
-	<script type="text/javascript">
-		dojo.require("dojox.grid.Grid");
-		dojo.require("dojo.parser");
-	</script>
-	<script type="text/javascript" src="yahooSearch.js"></script>
-	<script type="text/javascript">
-		webFields = [
-			{ name: 'Title', na: '' }, 
-			{ name: 'ModificationDate', na: ''},
-			{ name: 'Summary', na: ' ' },
-			{ name: 'Url', na: '' },
-			{ name: 'MimeType', na: ' '},
-			{ name: 'DisplayUrl', na: ' '}
-		];
-		
-		imageFields = [		
-			{ name: 'Title', na: '' }, 
-			{ name: 'Thumbnail', na: ''},
-			{ name: 'Summary', na: '' },
-			{ name: 'Url', na: '' },
-			{ name: 'FileSize', na: ''},
-			{ name: 'Height', na: ''},
-			{ name: 'Width', na: ''}
-		];
-
-		var model = new dojox.grid.data.yahooSearch(imageFields, null, "searchInput");
-		model.observer(this);
-		// report some model send/receive status
-		model.onSend = function(inParams) {
-			dojo.byId('sendInfo').innerHTML = dojo.string.substitute('Request rows ${0} to ${1}.&nbsp ', [inParams.start, inParams.start + inParams.results -1] );
-		}
-		model.onReceive = function(inData) {
-			dojo.byId('receiveInfo').innerHTML = dojo.string.substitute('Receive rows ${0} to ${1}.&nbsp ', [inData.firstResultPosition, inData.firstResultPosition + inData.totalResultsReturned-1]);
-		}
-
-		
-		var webLayout = [ 
-			{ type: 'dojox.GridRowView', width: '20px' },
-			{ noscroll: true,
-				cells: [
-					[ { name: 'Row', width: 3, styles: 'text-align: center;', get: function(inRowIndex) { return inRowIndex + 1 } }]
-				]
-			},
-			{ cells: [
-					[	{ name: 'Site', width: 30, field: 3, extraField: 0, formatter: formatLink }, { name: 'Date', width: 10, field: 1, formatter: formatDate} ],
-					[	{ name: 'Display Url', width: 30, field: 5, styles: 'color: green; size: small;' }, { name: 'Type', width: 10, field: 4, styles: ' font-style: italic; color: gray; size: small;'} ],
-					[ { name: 'Summary',  width: 40, colSpan: 2, field: 2 } ]
-			]}
-		];
-		
-		// remove the height from the header image cell / row cells have a default height so there's less adjustment when thumb comes in.
-		beforeImageRow = function(inRowIndex, inSubRow) {
-			inSubRow[0][0].cellStyles = (inRowIndex == -1 ? '' : 'height: 100px;');
-			inSubRow[1][0].cellStyles = (inRowIndex == -1 ? '' : 'vertical-align: top; height: 75px;');
-		}
-		
-		var imageLayout = [ 
-			{ type: 'dojox.GridRowView', width: '20px' },
-			{ noscroll: true,
-				cells: [
-					[ { name: 'Row', width: 3, styles: 'text-align: center;', get: function(inRowIndex) { return inRowIndex + 1 } }]
-				]
-			},
-			{ onBeforeRow: beforeImageRow,
-				cells: [
-					[	{ name: 'Image', cellStyles: "height: 100px;", styles: "text-align: center;", width: 13, rowSpan: 2, field: 3, extraField: 1, formatter: formatImage },
-						{ name: 'Title', cellStyles: "height: 10px;", width: 14, field: 3, extraField: 0, formatter: formatLink }, 
-						{ name: 'Size', width: 8, field: 4, styles: "font-style: italic; text-align: center;" },
-						{ name: 'Dimensions', width: 8, field: 6, extraField: 5, styles: "text-align: center;", formatter: formatDimensions }
-					],
-					[ { name: 'Summary',  cellStyles: "vertical-align: top; height: 75px;", colSpan: 3, field: 2 } ]
-			]}
-		];
-		
-		// execute search
-		doSearch = function() {
-			var web = dojo.byId('webRb').checked;
-			model.setRowCount(0);
-			model.clear();
-			model.fields.set(web ? webFields : imageFields);
-			model.url = 'http://search.yahooapis.com/' + (web ? 'WebSearchService/V1/webSearch' : 'ImageSearchService/V1/imageSearch');
-			grid.scrollToRow(0);
-			grid.setStructure(web ? webLayout : imageLayout);
-			model.requestRows();
-		}
-		
-		// do search on enter...
-		keypress = function(e) {
-			if (e.keyCode == dojo.keys.ENTER)
-				doSearch();
-		}
-
-		dojo.addOnLoad(function() {
-			dojo.byId('webRb').checked = "checked";
-			dojo.connect(dojo.byId("searchInput"), "keypress", keypress);
-			doSearch();
-		});
-
-	</script>
-</head>
-<body>
-<div style="font-weight: bold; padding-bottom: 0.25em;">dojox.Grid - Yahoo Search Test</div>
-<div style="padding-bottom: 3px;">
-	<label><input id="webRb" type="radio" name="searchType" checked>Web</label>  
-	<label><input id="imageRb" type="radio" name="searchType">Images</label>
-</div>	
-<input id="searchInput" type="text" value="apple">  
-<button onclick="doSearch()">Search</button><br><br>
-<div jsId="grid" class="grid" autoWidth="true" structure="webLayout" dojoType="dojox.Grid" model="model" elasticView="1"></div>
-<br>
-<div id="info">
-	<div id="rowCount" style="float: left"></div>
-	<div style="float: right">
-		<div id="sendInfo" style="text-align: right"></div>
-		<div id="receiveInfo" style="text-align: right"></div>
-	</div>
-</div>
-<br /><br />
-<p>Note: requires PHP for proxy.</p>
-</body>
-</html>
diff --git a/dojox/grid/compat/tests/yahooSearch.js b/dojox/grid/compat/tests/yahooSearch.js
deleted file mode 100644
index 1d57a8e..0000000
--- a/dojox/grid/compat/tests/yahooSearch.js
+++ /dev/null
@@ -1,137 +0,0 @@
-dojo.require("dojo.io.script")
-dojo.require("dojox.rpc.Service");
-
-// model that works with Yahoo Search API
-dojo.declare("dojox.grid.data.yahooSearch", dojox.grid.data.Dynamic, {
-	constructor: function(inFields, inData, inSearchNode){
-		this.rowsPerPage = 20;
-		this.searchNode = inSearchNode;
-		this.fieldNames = dojo.map(inFields, "return item.name;");
-		this.yahoo = new dojox.rpc.Service(
-			dojo.moduleUrl("dojox.rpc.SMDLibrary", "yahoo.smd")
-		);
-	},
-	// server send / receive
-	send: function(inAsync, inParams, inOnReceive, inOnError){
-		var d = this.yahoo.imageSearch(
-			dojo.mixin({ 
-				results: this.rowsPerPage,
-				query: this.getQuery()
-			}, inParams)
-		);
-		d.addCallbacks(
-			dojo.hitch(this, "receive", inOnReceive, inOnError), 
-			dojo.hitch(this, "error", inOnError)
-		);
-		this.onSend(inParams);
-		return d;
-	},
-	receive: function(inOnReceive, inOnError, inData){
-		try{
-			inData = inData.ResultSet;
-			inOnReceive(inData);
-			this.onReceive(inData);
-		}catch(e){
-			if(inOnError){
-				inOnError(inData);
-			}
-		}
-	},
-	error: function(inOnError, inErr) {
-		var m = 'io error: ' + inErr.message;
-		alert(m);
-		if (inOnError)
-			inOnError(m);
-	},
-	encodeParam: function(inName, inValue) {
-		return dojo.string.substitute('&${0}=${1}', [inName, inValue]);
-	},
-	getQuery: function(){
-		return dojo.byId(this.searchNode).value.replace(/ /g, '+');
-	},
-	fetchRowCount: function(inCallback){
-		this.send(true, inCallback);
-	},
-	// request data 
-	requestRows: function(inRowIndex, inCount){
-		inRowIndex = (inRowIndex == undefined ? 0 : inRowIndex);
-		var params = { 
-			start: inRowIndex + 1
-		}
-		this.send(true, params, dojo.hitch(this, this.processRows));
-	},
-	// server callbacks
-	processRows: function(inData){
-		for(var i=0, l=inData.totalResultsReturned, s=inData.firstResultPosition; i<l; i++){
-			this.setRow(inData.Result[i], s - 1 + i);
-		}
-		// yahoo says 1000 is max results to return
-		var c = Math.min(1000, inData.totalResultsAvailable);
-		if(this.count != c){
-			this.setRowCount(c);
-			this.allChange();
-			this.onInitializeData(inData);
-		}
-	},
-	getDatum: function(inRowIndex, inColIndex){
-		var row = this.getRow(inRowIndex);
-		var field = this.fields.get(inColIndex);
-		return (inColIndex == undefined ? row : (row ? row[field.name] : field.na));
-	},
-	// events
-	onInitializeData: function(){ },
-	onSend: function(){ },
-	onReceive: function(){ }
-});
-
-// report
-modelChange = function(){
-	var n = dojo.byId('rowCount');
-	if(n){
-		n.innerHTML = dojo.string.substitute('about ${0} row(s)', [model.count]);
-	}
-}
-
-
-// some data formatters
-getCellData = function(inCell, inRowIndex, inField){
-	var m = inCell.grid.model;
-	return m.getDatum(inRowIndex, inField);
-}
-
-formatLink = function(inData, inRowIndex){
-	if(!inData){ return ' '; }
-	var text = getCellData(this, inRowIndex, this.extraField);
-	return dojo.string.substitute(
-		'<a target="_blank" href="${href}">${text}</a>', 
-		{ href: inData, text: text }
-	);
-};
-
-formatImage = function(inData, inRowIndex){
-	if(!inData){ return ' '; }
-	var info = getCellData(this, inRowIndex, this.extraField);
-	var o = {
-		href: inData, 
-		src: info.Url,
-		width: info.Width,
-		height: info.Height
-	}
-	return dojo.string.substitute(
-		'<a href="${href}" target="_blank"><img border=0 src="${src}" width="${width}" height="${height}"></a>', o);
-};
-
-formatDate = function(inDatum, inRowIndex){
-	if(!inDatum){ return ' '; }
-	var d = new Date(inDatum * 1000);
-	return dojo.string.substitute(
-		"${0}/${1}/${2}",
-		[ d.getMonth()+1, d.getDate(), d.getFullYear() ]
-	);
-};
-
-formatDimensions = function(inData, inRowIndex){
-	if(!inData){ return ' '; }
-	var w = inData, h = getCellData(this, inRowIndex, this.extraField);
-	return w + ' x ' + h;
-}
diff --git a/dojox/grid/compatGrid.tar.gz b/dojox/grid/compatGrid.tar.gz
new file mode 100644
index 0000000..87c39c8
Binary files /dev/null and b/dojox/grid/compatGrid.tar.gz differ
diff --git a/dojox/grid/enhanced/_Builder.js b/dojox/grid/enhanced/_Builder.js
new file mode 100644
index 0000000..f2d6964
--- /dev/null
+++ b/dojox/grid/enhanced/_Builder.js
@@ -0,0 +1,81 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid.enhanced._Builder"]){
+dojo._hasResource["dojox.grid.enhanced._Builder"]=true;
+dojo.provide("dojox.grid.enhanced._Builder");
+dojo.require("dojox.grid._Builder");
+dojo.declare("dojox.grid.enhanced._BuilderMixin",null,{generateCellMarkup:function(_1,_2,_3,_4){
+var _5=this.inherited(arguments);
+if(!_4){
+_5[4]+="<div class=\"dojoxGridCellContent\">";
+_5[6]="</div></td>";
+}
+return _5;
+},domouseup:function(e){
+if(e.cellNode){
+this.grid.onMouseUp(e);
+}
+}});
+dojo.declare("dojox.grid.enhanced._HeaderBuilder",[dojox.grid._HeaderBuilder,dojox.grid.enhanced._BuilderMixin],{getCellX:function(e){
+if(this.grid.nestedSorting){
+var _6=function(_7,_8){
+for(var n=_7;n&&_8(n);n=n.parentNode){
+}
+return n;
+};
+var _9=function(_a){
+var _b=_a.toUpperCase();
+return function(_c){
+return _c.tagName!=_b;
+};
+};
+var no=_6(e.target,_9("th"));
+var x=no?e.pageX-dojo.coords(no,true).x:-1;
+if(dojo.isIE){
+var _d=dojo.body().getBoundingClientRect();
+var _e=(_d.right-_d.left)/document.body.clientWidth;
+return parseInt(x/_e);
+}
+return x;
+}
+return this.inherited(arguments);
+},decorateEvent:function(e){
+var _f=this.inherited(arguments);
+if(this.grid.nestedSorting){
+var _10=this.grid._getSortEventInfo(e);
+e.unarySortChoice=_10.unarySortChoice;
+e.nestedSortChoice=_10.nestedSortChoice;
+e.selectChoice=_10.selectChoice;
+}
+return _f;
+},doclick:function(e){
+if((this._skipBogusClicks&&!this.grid.nestedSorting)||(this.grid.nestedSorting&&this.grid.ignoreEvent(e))){
+dojo.stopEvent(e);
+return true;
+}
+},colResizeSetup:function(e,_11){
+var _12=this.minColWidth;
+if(e.sourceView.grid.nestedSorting&&!this.grid.pluginMgr.isFixedCell(e.cell)){
+this.minColWidth=this.grid.getMinColWidth();
+var _13=dojo.connect(this,"endResizeColumn",dojo.hitch(this,function(){
+this.minColWidth=_12;
+dojo.disconnect(_13);
+}));
+}
+var _14=this.inherited(arguments);
+if(!dojo._isBodyLtr()&&dojo.isIE&&_14.followers){
+dojo.forEach(_14.followers,function(_15){
+if(!_15.left){
+_15.left=dojo.position(_15.node).x;
+}
+});
+}
+return _14;
+}});
+dojo.declare("dojox.grid.enhanced._ContentBuilder",[dojox.grid._ContentBuilder,dojox.grid.enhanced._BuilderMixin],{});
+}
diff --git a/dojox/grid/enhanced/_Events.js b/dojox/grid/enhanced/_Events.js
new file mode 100644
index 0000000..5cb37a5
--- /dev/null
+++ b/dojox/grid/enhanced/_Events.js
@@ -0,0 +1,370 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid.enhanced._Events"]){
+dojo._hasResource["dojox.grid.enhanced._Events"]=true;
+dojo.provide("dojox.grid.enhanced._Events");
+dojo.declare("dojox.grid.enhanced._Events",null,{_events:null,headerCellActiveClass:"dojoxGridHeaderActive",cellActiveClass:"dojoxGridCellActive",rowActiveClass:"dojoxGridRowActive",selectRegionHoverClass:"dojoxGridSelectRegionHover",constructor:function(_1){
+this._events=new dojox.grid._Events();
+for(p in this._events){
+if(!this[p]){
+this.p=this._events.p;
+}
+}
+_1.mixin(_1,this);
+},onStyleRow:function(_2){
+var i=_2;
+i.customClasses+=(i.odd?" dojoxGridRowOdd":"")+(i.selected?" dojoxGridRowSelected":"")+(i.over&&!this.isDndSelectEnable?" dojoxGridRowOver":"");
+this.focus.styleRow(_2);
+this.edit.styleRow(_2);
+},dokeyup:function(e){
+this.indirectSelection&&!this.pluginMgr.inSingleSelection()&&this.indirectSelector.dokeyup(e);
+},onKeyDown:function(e){
+if(e.altKey||e.metaKey){
+return;
+}
+if(e.ctrlKey&&!e.shiftKey){
+dojo.publish("CTRL_KEY_DOWN",[this,e]);
+}
+var _3=false;
+if(this.isDndSelectEnable&&!e.ctrlKey){
+this.select.keepState=false;
+}
+if(this.isDndSelectEnable&&!e.shiftKey){
+this.select.extendSelect=false;
+}
+var dk=dojo.keys;
+switch(e.keyCode){
+case dk.ENTER:
+_3=true;
+if(!this.edit.isEditing()){
+var _4=this.focus.getHeaderIndex();
+if(_4>=0){
+this.nestedSorting&&this.focus.focusView.header.decorateEvent(e);
+var _5=e.cell&&this.pluginMgr.isFixedCell(e.cell);
+!e.selectChoice&&!_5&&this.setSortIndex(_4,null,e);
+break;
+}else{
+!this.indirectSelection&&this.selection.clickSelect(this.focus.rowIndex,dojo.isCopyKey(e),e.shiftKey);
+}
+dojo.stopEvent(e);
+}
+if(!e.shiftKey){
+var _6=this.edit.isEditing();
+this.edit.apply();
+if(!_6&&!this.pluginMgr.isFixedCell(this.focus.cell)){
+this.edit.setEditCell(this.focus.cell,this.focus.rowIndex);
+}
+}
+if(!this.edit.isEditing()){
+var _7=this.focus.focusView||this.views.views[0];
+_7.content.decorateEvent(e);
+this.onRowClick(e);
+}
+break;
+case dk.SPACE:
+_3=true;
+if(!this.edit.isEditing()){
+var _4=this.focus.getHeaderIndex();
+if(_4>=0){
+this.focus.focusView.header.decorateEvent(e);
+if(this.indirectSelection&&e.cell&&e.cell.isRowSelector){
+return;
+}
+if(this.isDndSelectEnable&&(!this.nestedSorting&&!this.canSort()||this.nestedSorting&&e.selectChoice)){
+this.inDNDKeySelectingColumnMode=true;
+this.select.keepState=e.ctrlKey;
+this.select.extendSelect=e.shiftKey;
+if(!this.select.extendSelect){
+this.select.drugSelectionStart.colIndex=_4;
+}
+this.select.drugSelectColumn(_4);
+}else{
+var _5=e.cell&&this.pluginMgr.isFixedCell(e.cell);
+!_5&&e.rowIndex==-1&&e.cell&&this.setSortIndex(_4,null,e);
+}
+break;
+}else{
+if(this.isDndSelectEnable&&this.focus.isRowBar()){
+this.inDNDKeySelectingRowMode=true;
+this.select.keepState=e.ctrlKey;
+this.select.extendSelect=e.shiftKey;
+if(!this.select.extendSelect||this.pluginMgr.inSingleSelection()){
+this.select.drugSelectionStart.rowIndex=this.focus.getFocusedRowIndex();
+}
+this.select.drugSelectRow(this.focus.getFocusedRowIndex());
+}else{
+!this.indirectSelection&&this.selection.clickSelect(this.focus.rowIndex,dojo.isCopyKey(e),e.shiftKey);
+}
+}
+dojo.stopEvent(e);
+}
+break;
+case dk.LEFT_ARROW:
+case dk.RIGHT_ARROW:
+_3=true;
+this.nestedSorting&&this.focus.focusView.header.decorateEvent(e);
+var _8=this.isDndSelectEnable&&e.shiftKey;
+var _5=e.cell&&this.pluginMgr.isFixedCell(e.cell);
+if(this.nestedSorting&&this.focus.isNavHeader()&&!_8&&!_5){
+this.focus.navHeader(e);
+return;
+}
+if(!this.edit.isEditing()){
+var _9=e.keyCode;
+dojo.stopEvent(e);
+var _a=this.focus.getHeaderIndex();
+if(_a>=0&&(e.shiftKey&&e.ctrlKey)){
+this.focus.colSizeAdjust(e,_a,(_9==dk.LEFT_ARROW?-1:1)*5);
+return;
+}
+var _b=(_9==dk.LEFT_ARROW)?1:-1;
+if(dojo._isBodyLtr()){
+_b*=-1;
+}
+if(this.nestedSorting&&this.focus.isNavHeader()&&(_8||_5)){
+this.focus.navHeaderNode(_b,true);
+}else{
+if(!(this.isDndSelectEnable&&this.focus.isRowBar())){
+this.focus.move(0,_b);
+}
+}
+if(_8){
+var _4=this.focus.getHeaderIndex();
+if(!this.select.isColSelected(_a)){
+this.inDNDKeySelectingColumnMode=true;
+this.select.drugSelectionStart.colIndex=_a;
+}else{
+if(this.select.drugSelectionStart.colIndex==-1){
+this.select.restorLastDragPoint();
+}
+}
+if(e.ctrlKey){
+this.select.drugSelectColumnToMax(e.keyCode==dk.LEFT_ARROW?"left":"right");
+}else{
+this.select.drugSelectColumn(_4);
+}
+}
+}
+break;
+case dk.UP_ARROW:
+case dk.DOWN_ARROW:
+_3=true;
+if(this.nestedSorting&&this.focus.isNavHeader()){
+return;
+}
+var _c=e.keyCode==dk.UP_ARROW?-1:1;
+if(this.isDndSelectEnable){
+var _d=this.focus.getFocusedRowIndex();
+}
+if(this.isDndSelectEnable&&this.focus.isRowBar()){
+this.focus[e.keyCode==dk.UP_ARROW?"focusPrevRowBar":"focusNextRowBar"]();
+dojo.stopEvent(e);
+}else{
+if(!this.edit.isEditing()&&this.store&&0<=(this.focus.rowIndex+_c)&&(this.focus.rowIndex+_c)<this.rowCount){
+dojo.stopEvent(e);
+this.focus.move(_c,0);
+this.indirectSelection&&this.focus.cell&&this.focus.cell.focus(this.focus.rowIndex);
+!this.indirectSelection&&this.selection.clickSelect(this.focus.rowIndex,dojo.isCopyKey(e),e.shiftKey);
+}
+}
+if(this.isDndSelectEnable&&this.focus.isRowBar()&&e.shiftKey&&!this.pluginMgr.inSingleSelection()){
+if(!this.select.isRowSelected(_d)){
+this.inDNDKeySelectingRowMode=true;
+this.select.drugSelectionStart.rowIndex=_d;
+}else{
+if(this.select.drugSelectionStart.rowIndex==-1){
+this.select.restorLastDragPoint();
+}
+}
+if(e.ctrlKey){
+this.select.drugSelectRowToMax(e.keyCode==dk.UP_ARROW?"up":"down");
+}else{
+var _e=this.focus.getFocusedRowIndex();
+this.select.drugSelectRow(_e);
+}
+}else{
+if(this.indirectSelection&&e.shiftKey&&!this.pluginMgr.inSingleSelection()&&this.focus.rowIndex>=0){
+this.focus.focusView.content.decorateEvent(e);
+if(e.cellIndex!=0||e.rowIndex==0&&_c==-1){
+return;
+}
+this.indirectSelector.swipeSelectionByKey(e,_c);
+}
+}
+break;
+case dk.ESCAPE:
+try{
+this.select.cancelDND();
+}
+catch(e){
+}
+break;
+}
+!_3&&(dojo.hitch(this,this._events.onKeyDown)(e));
+},onMouseDown:function(e){
+dojo.hitch(this,this._events.onMouseDown)(e);
+if(this.isDndSelectEnable&&!e.shiftKey){
+this.select.setDrugStartPoint(e.cellIndex,e.rowIndex);
+}
+},onMouseUp:function(e){
+e.rowIndex==-1?this.onHeaderCellMouseUp(e):this.onCellMouseUp(e);
+},onMouseOutRow:function(e){
+if(this.isDndSelectEnable){
+return;
+}
+dojo.hitch(this,this._events.onMouseOutRow)(e);
+},onMouseDownRow:function(e){
+if(this.isDndSelectEnable){
+return;
+}
+dojo.hitch(this,this._events.onMouseDownRow)(e);
+},onCellMouseOver:function(e){
+dojo.hitch(this,this._events.onCellMouseOver)(e);
+var _f=this.pluginMgr.isFixedCell(e.cell)||this.rowSelectCell&&this.rowSelectCell.inIndirectSelectionMode();
+if(this.isDndSelectEnable&&!_f){
+if(this.select.isInSelectingMode("col")){
+this.select.drugSelectColumn(e.cell.index);
+}else{
+if(this.select.isInSelectingMode("cell")){
+this.select.drugSelectCell(e.cellIndex,e.rowIndex);
+}else{
+this.select.setDrugCoverDivs(e.cellIndex,e.rowIndex);
+}
+}
+}
+},onCellMouseOut:function(e){
+dojo.hitch(this,this._events.onCellMouseOut)(e);
+this.doubleAffordance&&e.cellNode&&dojo.removeClass(e.cellNode,this.cellActiveClass);
+},onCellMouseDown:function(e){
+dojo.addClass(e.cellNode,this.cellActiveClass);
+dojo.addClass(e.rowNode,this.rowActiveClass);
+if(this.isDndSelectEnable){
+this.focus._blurRowBar();
+if(e.cellIndex>this.select.exceptColumnsTo){
+this.select.setInSelectingMode("cell",true);
+}
+}
+},onCellMouseUp:function(e){
+dojo.removeClass(e.cellNode,this.cellActiveClass);
+dojo.removeClass(e.rowNode,this.rowActiveClass);
+},onCellClick:function(e){
+if(this.isDndSelectEnable){
+this.focus._blurRowBar();
+this._click[0]=this._click[1];
+this._click[1]=e;
+this.select.cellClick(e.cellIndex,e.rowIndex);
+!this.edit.isEditCell(e.rowIndex,e.cellIndex)&&!this.edit.isEditing()&&this.select.cleanAll();
+this.focus.setFocusCell(e.cell,e.rowIndex);
+}else{
+dojo.hitch(this,this._events.onCellClick)(e);
+}
+},onCellDblClick:function(e){
+if(this.pluginMgr.isFixedCell(e.cell)){
+return;
+}
+this._click.length>1&&(!this._click[0]||!this._click[1])&&(this._click[0]=this._click[1]=e);
+dojo.hitch(this,this._events.onCellDblClick)(e);
+},onRowClick:function(e){
+this.edit.rowClick(e);
+!this.indirectSelection&&this.selection.clickSelectEvent(e);
+},onRowMouseOver:function(e){
+if(this.isDndSelectEnable&&!this.pluginMgr.inSingleSelection()){
+if(this.select.isInSelectingMode("row")){
+this.select.drugSelectRow(e.rowIndex);
+}else{
+}
+}
+if(!e.cell&&e.cellIndex<0||e.cell&&(e.cell!=this.rowSelectCell)&&this.indirectSelection){
+var _10=this.rowSelectCell;
+_10&&_10.onRowMouseOver&&_10.onRowMouseOver(e);
+}
+},onRowMouseOut:function(e){
+if(this.isDndSelectEnable){
+if(this.select.isInSelectingMode("row")){
+this.select.drugSelectRow(e.rowIndex);
+}
+}
+},onRowContextMenu:function(e){
+!this.edit.isEditing()&&this.menus&&this.showRowCellMenu(e);
+},onSelectedRegionContextMenu:function(e){
+if(this.selectedRegionMenu){
+this.selectedRegionMenu._openMyself(e);
+dojo.stopEvent(e);
+}
+},onHeaderCellMouseOver:function(e){
+if(e.cellNode){
+dojo.addClass(e.cellNode,this.cellOverClass);
+if(this.nestedSorting&&!this._inResize(e.sourceView)&&!this.pluginMgr.isFixedCell(e.cell)&&!(this.isDndSelectEnable&&this.select.isInSelectingMode("col"))){
+this.addHoverSortTip(e);
+}
+if(this.isDndSelectEnable){
+if(this.select.isInSelectingMode("col")){
+this.select.drugSelectColumn(e.cell.index);
+}else{
+this.select.clearDrugDivs();
+}
+}
+}
+},onHeaderCellMouseOut:function(e){
+if(e.cellNode){
+dojo.removeClass(e.cellNode,this.cellOverClass);
+dojo.removeClass(e.cellNode,this.headerCellActiveClass);
+if(this.nestedSorting&&!this.pluginMgr.isFixedCell(e.cell)){
+if(this.focus.headerCellInFocus(e.cellIndex)){
+this._toggleHighlight(e.sourceView,e,true);
+}else{
+this.removeHoverSortTip(e);
+}
+}
+}
+},onHeaderCellMouseDown:function(e){
+var _11=!this.nestedSorting?e.cellNode:this._getChoiceRegion(e.cellNode,e);
+_11&&dojo.addClass(_11,this.headerCellActiveClass);
+if(this.nestedSorting&&!e.selectChoice){
+return;
+}
+if(this.isDndSelectEnable){
+this.focus._blurRowBar();
+try{
+this.focus.focusHeaderNode(e.cellIndex,false,true);
+}
+catch(e){
+}
+if(e.button==2){
+return;
+}
+if(e.cellNode){
+this.select.setInSelectingMode("col",true);
+this.select.keepState=e.ctrlKey;
+this.select.extendSelect=e.shiftKey;
+if(this.select.extendSelect){
+this.select.restorLastDragPoint();
+}else{
+this.select.drugSelectionStart.colIndex=e.cellIndex;
+}
+this.select.drugSelectColumn(e.cellIndex);
+}
+}
+},onHeaderCellMouseUp:function(e){
+var _12=!this.nestedSorting?e.cellNode:this._getChoiceRegion(e.cellNode,e);
+if(_12){
+dojo.removeClass(_12,this.headerCellActiveClass);
+e.selectChoice&&dojo.addClass(_12,this.selectRegionHoverClass);
+}
+},onHeaderCellClick:function(e){
+if(this.indirectSelection&&e.cell&&e.cell.isRowSelector){
+return;
+}
+dojo.hitch(this,this._events.onHeaderCellClick)(e);
+},onHeaderContextMenu:function(e){
+if(this.nestedSorting&&this.headerMenu){
+this._toggleHighlight(e.sourceView,e,true);
+}
+dojo.hitch(this,this._events.onHeaderContextMenu)(e);
+}});
+}
diff --git a/dojox/grid/enhanced/_Plugin.js b/dojox/grid/enhanced/_Plugin.js
new file mode 100644
index 0000000..24a7fe8
--- /dev/null
+++ b/dojox/grid/enhanced/_Plugin.js
@@ -0,0 +1,191 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid.enhanced._Plugin"]){
+dojo._hasResource["dojox.grid.enhanced._Plugin"]=true;
+dojo.provide("dojox.grid.enhanced._Plugin");
+dojo.require("dojox.grid.enhanced._Builder");
+dojo.require("dojox.grid.enhanced._Events");
+dojo.declare("dojox.grid.enhanced._Plugin",null,{fixedCellNum:-1,funcMap:{},rowSelectionChangedTopic:"ROW_SELECTION_CHANGED",sortRowSelectionChangedTopic:"SORT_ROW_SELECTION_CHANGED",rowMovedTopic:"ROW_MOVED",constructor:function(_1){
+this.grid=_1;
+this._parseProps(this.grid);
+},_parseProps:function(_2){
+_2.plugins&&dojo.mixin(_2,_2.plugins);
+_2.rowSelectionChangedTopic=this.rowSelectionChangedTopic;
+_2.sortRowSelectionChangedTopic=this.sortRowSelectionChangedTopic;
+_2.rowSelectCell=null;
+_2.dnd&&(_2.nestedSorting=true);
+(_2.dnd||_2.indirectSelection)&&(_2.columnReordering=false);
+},preInit:function(){
+var _3=this.grid;
+_3.indirectSelection&&(new (this.getPluginClazz("dojox.grid.enhanced.plugins.IndirectSelection"))(_3));
+if(_3.dnd&&(!_3.rowSelector||_3.rowSelector=="false")){
+_3.rowSelector="20px";
+}
+if(_3.nestedSorting){
+dojox.grid._View.prototype._headerBuilderClass=dojox.grid.enhanced._HeaderBuilder;
+}
+dojox.grid._View.prototype._contentBuilderClass=dojox.grid.enhanced._ContentBuilder;
+},postInit:function(){
+var _4=this.grid;
+new dojox.grid.enhanced._Events(_4);
+_4.menus&&(new (this.getPluginClazz("dojox.grid.enhanced.plugins.Menu"))(_4));
+_4.nestedSorting&&(new (this.getPluginClazz("dojox.grid.enhanced.plugins.NestedSorting"))(_4));
+if(_4.dnd){
+_4.isDndSelectEnable=_4.dnd;
+_4.dndDisabledTypes=["cell"];
+new (this.getPluginClazz("dojox.grid.enhanced.plugins.DnD"))(_4);
+}
+dojo.isChrome<3&&(_4.constructor.prototype.startup=_4.startup);
+this.fixedCellNum=this.getFixedCellNumber();
+this._bindFuncs();
+},getPluginClazz:function(_5){
+var _6=dojo.getObject(_5);
+if(_6){
+return _6;
+}
+throw new Error("Please make sure class \""+_5+"\" is required.");
+},isFixedCell:function(_7){
+return _7&&(_7.isRowSelector||_7.positionFixed);
+},getFixedCellNumber:function(){
+if(this.fixedCellNum>=0){
+return this.fixedCellNum;
+}
+var i=0;
+dojo.forEach(this.grid.layout.cells,dojo.hitch(this,function(_8){
+this.isFixedCell(_8)&&(i++);
+}));
+return i;
+},inSingleSelection:function(){
+return this.grid.selectionMode&&this.grid.selectionMode=="single";
+},needUpdateRow:function(){
+return ((this.grid.indirectSelection||this.grid.isDndSelectEnable)?this.grid.edit.isEditing():true);
+},_bindFuncs:function(){
+dojo.forEach(this.grid.views.views,dojo.hitch(this,function(_9){
+dojox.grid.util.funnelEvents(_9.contentNode,_9,"doContentEvent",["mouseup","mousemove"]);
+dojox.grid.util.funnelEvents(_9.headerNode,_9,"doHeaderEvent",["mouseup"]);
+this.funcMap[_9.id+"-"+"setColumnsWidth"]=_9.setColumnsWidth;
+_9.setColumnsWidth=this.setColumnsWidth;
+this.grid.nestedSorting&&(_9._getHeaderContent=this.grid._getNestedSortHeaderContent);
+this.grid.dnd&&(_9.setScrollTop=this.setScrollTop);
+}));
+this.funcMap["nextKey"]=this.grid.focus.nextKey;
+this.grid.focus.nextKey=this.nextKey;
+this.funcMap["previousKey"]=this.grid.focus.previousKey;
+this.grid.focus.previousKey=this.previousKey;
+if(this.grid.indirectSelection){
+this.funcMap["renderPage"]=this.grid.scroller.renderPage;
+this.grid.scroller.renderPage=this.renderPage;
+}
+this.funcMap["updateRow"]=this.grid.updateRow;
+this.grid.updateRow=this.updateRow;
+if(this.grid.nestedSorting){
+dojox.grid.cells._Base.prototype.getEditNode=this.getEditNode;
+dojox.grid.cells._Widget.prototype.sizeWidget=this.sizeWidget;
+}
+dojox.grid._EditManager.prototype.styleRow=function(_a){
+};
+},setColumnsWidth:function(_b){
+if(dojo.isIE&&!dojo._isBodyLtr()){
+this.headerContentNode.style.width=_b+"px";
+this.headerContentNode.parentNode.style.width=_b+"px";
+}
+dojo.hitch(this,this.grid.pluginMgr.funcMap[this.id+"-"+"setColumnsWidth"])(_b);
+},previousKey:function(e){
+var _c=this.grid.edit.isEditing();
+if(!_c&&!this.isNavHeader()&&!this._isHeaderHidden()){
+if(!this.grid.isDndSelectEnable){
+this.focusHeader();
+}else{
+if(!this.isRowBar()){
+this.focusRowBar();
+}else{
+this._blurRowBar();
+this.focusHeader();
+}
+}
+dojo.stopEvent(e);
+return;
+}
+dojo.hitch(this,this.grid.pluginMgr.funcMap["previousKey"])(e);
+},nextKey:function(e){
+var _d=this.grid.rowCount==0;
+var _e=(e.target===this.grid.domNode);
+if(!_e&&this.grid.isDndSelectEnable&&this.isNavHeader()){
+this._colHeadNode=this._colHeadFocusIdx=null;
+this.focusRowBar();
+return;
+}else{
+if(!_e&&(!this.grid.isDndSelectEnable&&this.isNavHeader())||(this.grid.isDndSelectEnable&&this.isRowBar())){
+this._colHeadNode=this._colHeadFocusIdx=null;
+if(this.grid.isDndSelectEnable){
+this._blurRowBar();
+}
+if(this.isNoFocusCell()&&!_d){
+this.setFocusIndex(0,0);
+}else{
+if(this.cell&&!_d){
+if(this.focusView&&!this.focusView.rowNodes[this.rowIndex]){
+this.grid.scrollToRow(this.rowIndex);
+}
+this.focusGrid();
+}else{
+if(!this.findAndFocusGridCell()){
+this.tabOut(this.grid.lastFocusNode);
+}
+}
+}
+return;
+}
+}
+dojo.hitch(this,this.grid.pluginMgr.funcMap["nextKey"])(e);
+},renderPage:function(_f){
+for(var i=0,j=_f*this.rowsPerPage;(i<this.rowsPerPage)&&(j<this.rowCount);i++,j++){
+}
+this.grid.lastRenderingRowIdx=--j;
+dojo.addClass(this.grid.domNode,"dojoxGridSortInProgress");
+dojo.hitch(this,this.grid.pluginMgr.funcMap["renderPage"])(_f);
+},updateRow:function(_10){
+var _11=arguments.callee.caller;
+if(_11.nom=="move"&&!this.pluginMgr.needUpdateRow()){
+return;
+}
+dojo.hitch(this,this.pluginMgr.funcMap["updateRow"])(_10);
+},getEditNode:function(_12){
+return ((this.getNode(_12)||0).firstChild||0).firstChild||0;
+},sizeWidget:function(_13,_14,_15){
+var p=this.getNode(_15).firstChild,box=dojo.contentBox(p);
+dojo.marginBox(this.widget.domNode,{w:box.w});
+},setScrollTop:function(_16){
+this.lastTop=_16;
+this.scrollboxNode.scrollTop=_16;
+return this.scrollboxNode.scrollTop;
+},getViewByCellIdx:function(_17){
+var _18=function(_19){
+var j=0,_1a=false;
+for(;j<_19.length;j++){
+if(dojo.isArray(_19[j])){
+if(_18(_19[j])){
+return true;
+}
+}else{
+if(_19[j].index==_17){
+return true;
+}
+}
+}
+};
+var i=0,_1b=this.grid.views.views;
+for(;i<_1b.length;i++){
+cells=_1b[i].structure.cells;
+if(_18(cells)){
+return _1b[i];
+}
+}
+return null;
+}});
+}
diff --git a/dojox/grid/enhanced/dnd/_DndBuilder.js b/dojox/grid/enhanced/dnd/_DndBuilder.js
new file mode 100644
index 0000000..149cfb3
--- /dev/null
+++ b/dojox/grid/enhanced/dnd/_DndBuilder.js
@@ -0,0 +1,26 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid.enhanced.dnd._DndBuilder"]){
+dojo._hasResource["dojox.grid.enhanced.dnd._DndBuilder"]=true;
+dojo.provide("dojox.grid.enhanced.dnd._DndBuilder");
+dojo.declare("dojox.grid.enhanced.dnd._DndBuilder",null,{domouseup:function(e){
+if(this.grid.select.isInSelectingMode("col")){
+this.grid.nestedSorting?this.grid.focus.focusSelectColEndingHeader(e):this.grid.focus.focusHeaderNode(e.cellIndex);
+}
+if(e.cellNode){
+this.grid.onMouseUp(e);
+}
+this.grid.onMouseUpRow(e);
+}});
+dojo.declare("dojox.grid.enhanced.dnd._DndHeaderBuilder",null,{domouseup:function(e){
+if(this.grid.select.isInSelectingMode("col")){
+this.grid.nestedSorting?this.grid.focus.focusSelectColEndingHeader(e):this.grid.focus.focusHeaderNode(e.cellIndex);
+}
+this.grid.onMouseUp(e);
+}});
+}
diff --git a/dojox/grid/enhanced/dnd/_DndEvents.js b/dojox/grid/enhanced/dnd/_DndEvents.js
new file mode 100644
index 0000000..b66d512
--- /dev/null
+++ b/dojox/grid/enhanced/dnd/_DndEvents.js
@@ -0,0 +1,47 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid.enhanced.dnd._DndEvents"]){
+dojo._hasResource["dojox.grid.enhanced.dnd._DndEvents"]=true;
+dojo.provide("dojox.grid.enhanced.dnd._DndEvents");
+dojo.declare("dojox.grid.enhanced.dnd._DndEvents",null,{onMouseUp:function(e){
+e.rowIndex==-1?this.onHeaderCellMouseUp(e):this.onCellMouseUp(e);
+this.select.resetStartPoint();
+this.select.clearInSelectingMode();
+!isNaN(e.rowIndex)&&e.cellIndex==-1&&this.focus.focusRowBarNode(e.rowIndex);
+},onMouseUpRow:function(e){
+if(this.dndSelectable){
+}else{
+if(e.rowIndex!=-1){
+this.onRowMouseUp(e);
+}
+}
+},onCellMouseUp:function(e){
+if(e.cellIndex>this.select.exceptColumnsTo){
+this.select.setInSelectingMode("cell",true);
+}
+},onRowHeaderMouseDown:function(e){
+this.focus._colHeadNode=this.focus._colHeadFocusIdx=null;
+this.focus.focusRowBarNode(e.rowIndex);
+if(e.button==2){
+return;
+}
+this.select.setInSelectingMode("row",true);
+this.select.keepState=e.ctrlKey&&!this.pluginMgr.inSingleSelection();
+this.select.extendSelect=e.shiftKey;
+this.select.setDrugStartPoint(-1,e.rowIndex);
+if(this.select.extendSelect&&!this.pluginMgr.inSingleSelection()){
+this.select.restorLastDragPoint();
+}
+this.select.drugSelectRow(e.rowIndex);
+dojo.stopEvent(e);
+},onRowHeaderMouseUp:function(e){
+this.onMouseUp(e);
+},onRowMouseUp:function(e){
+this.select.setInSelectingMode("row",false);
+}});
+}
diff --git a/dojox/grid/enhanced/dnd/_DndFocusManager.js b/dojox/grid/enhanced/dnd/_DndFocusManager.js
new file mode 100644
index 0000000..95db2f5
--- /dev/null
+++ b/dojox/grid/enhanced/dnd/_DndFocusManager.js
@@ -0,0 +1,69 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid.enhanced.dnd._DndFocusManager"]){
+dojo._hasResource["dojox.grid.enhanced.dnd._DndFocusManager"]=true;
+dojo.provide("dojox.grid.enhanced.dnd._DndFocusManager");
+dojo.declare("dojox.grid.enhanced.dnd._DndFocusManager",null,{_rowBarNode:null,_rowBarFocusIdy:null,isRowBar:function(){
+return (!!this._rowBarNode);
+},getRowBarNode:function(_1){
+return this.grid.views.views[0].getCellNode(_1,0);
+},focusRowBar:function(){
+this.focusRowBarNode(0);
+this._focusifyCellNode(false);
+},focusRowBarNode:function(_2){
+this._blurRowBar();
+this._focusifyCellNode(false);
+var _3=this.getRowBarNode(_2);
+if(!_3){
+return;
+}
+this._rowBarNode=_3;
+this._rowBarFocusIdy=_2;
+this._rowBarNode.tabIndex=-1;
+dojox.grid.util.fire(this._rowBarNode,"focus");
+dojo.toggleClass(this._rowBarNode,this.focusClass,true);
+},_blurRowBar:function(){
+if(this._rowBarNode){
+dojo.toggleClass(this._rowBarNode,this.focusClass,false);
+this._rowBarNode=this._rowBarFocusIdy=null;
+}
+},focusNextRowBar:function(){
+var sc=this.grid.scroller,r=this._rowBarFocusIdy,rc=this.grid.rowCount-1,_4=Math.min(rc,Math.max(0,r+1));
+var _5=this._rowBarFocusIdy+1;
+if(_4>sc.getLastPageRow(sc.page)){
+this.grid.setScrollTop(this.grid.scrollTop+sc.findScrollTop(_4)-sc.findScrollTop(r));
+}
+this.focusRowBarNode(_5);
+this.scrollRowBarIntoView();
+},focusPrevRowBar:function(){
+var sc=this.grid.scroller,r=this._rowBarFocusIdy,rc=this.grid.rowCount-1,_6=Math.min(rc,Math.max(0,r-1));
+var _7=this._rowBarFocusIdy-1;
+if(_7<0){
+return;
+}
+if(_7<=sc.getPageRow(sc.page)){
+this.grid.setScrollTop(this.grid.scrollTop-sc.findScrollTop(r)-sc.findScrollTop(_6));
+}
+this.focusRowBarNode(_7);
+this.scrollRowBarIntoView();
+},getFocusedRowIndex:function(){
+return this._rowBarFocusIdy;
+},scrollRowBarIntoView:function(){
+this.cell=this._rowBarNode;
+this.cell.view=this.grid.views.views[0];
+this.cell.getNode=function(_8){
+return this.cell;
+};
+this.rowIndex=this._rowBarFocusIdy;
+this.scrollIntoView();
+this.cell=null;
+},focusHeaderNode:function(_9){
+this._colHeadFocusIdx=_9;
+this.focusHeader.apply(this,arguments);
+}});
+}
diff --git a/dojox/grid/enhanced/dnd/_DndGrid.js b/dojox/grid/enhanced/dnd/_DndGrid.js
new file mode 100644
index 0000000..6d82991
--- /dev/null
+++ b/dojox/grid/enhanced/dnd/_DndGrid.js
@@ -0,0 +1,23 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid.enhanced.dnd._DndGrid"]){
+dojo._hasResource["dojox.grid.enhanced.dnd._DndGrid"]=true;
+dojo.provide("dojox.grid.enhanced.dnd._DndGrid");
+dojo.require("dojox.grid.enhanced.dnd._DndEvents");
+dojo.declare("dojox.grid.enhanced.dnd._DndGrid",dojox.grid.enhanced.dnd._DndEvents,{select:null,dndSelectable:true,constructor:function(_1){
+this.select=_1;
+},domousedown:function(e){
+if(!e.cellNode){
+this.onRowHeaderMouseDown(e);
+}
+},domouseup:function(e){
+if(!e.cellNode){
+this.onRowHeaderMouseUp(e);
+}
+}});
+}
diff --git a/dojox/grid/enhanced/dnd/_DndMover.js b/dojox/grid/enhanced/dnd/_DndMover.js
new file mode 100644
index 0000000..77a437c
--- /dev/null
+++ b/dojox/grid/enhanced/dnd/_DndMover.js
@@ -0,0 +1,36 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid.enhanced.dnd._DndMover"]){
+dojo._hasResource["dojox.grid.enhanced.dnd._DndMover"]=true;
+dojo.provide("dojox.grid.enhanced.dnd._DndMover");
+dojo.require("dojo.dnd.move");
+dojo.declare("dojox.grid.enhanced.dnd._DndMover",dojo.dnd.Mover,{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},{x:e.pageX,y:e.pageY});
+dojo.stopEvent(e);
+}});
+dojo.declare("dojox.grid.enhanced.dnd._DndBoxConstrainedMoveable",dojo.dnd.move.boxConstrainedMoveable,{movingType:"row",constructor:function(_1,_2){
+if(!_2||!_2.movingType){
+return;
+}
+this.movingType=_2.movingType;
+},onFirstMove:function(_3){
+this.inherited(arguments);
+if(this.within){
+var c=this.constraintBox,mb=dojo.marginBox(_3.node);
+if(this.movingType=="row"){
+c.r+=mb.w;
+}else{
+if(this.movingType=="col"){
+c.b+=mb.h;
+}
+}
+}
+}});
+}
diff --git a/dojox/grid/enhanced/dnd/_DndMovingManager.js b/dojox/grid/enhanced/dnd/_DndMovingManager.js
new file mode 100644
index 0000000..5b2e80f
--- /dev/null
+++ b/dojox/grid/enhanced/dnd/_DndMovingManager.js
@@ -0,0 +1,691 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid.enhanced.dnd._DndMovingManager"]){
+dojo._hasResource["dojox.grid.enhanced.dnd._DndMovingManager"]=true;
+dojo.provide("dojox.grid.enhanced.dnd._DndMovingManager");
+dojo.require("dojox.grid.enhanced.dnd._DndSelectingManager");
+dojo.require("dojox.grid.enhanced.dnd._DndMover");
+dojo.require("dojo.dnd.move");
+dojo.declare("dojox.grid.enhanced.dnd._DndMovingManager",dojox.grid.enhanced.dnd._DndSelectingManager,{exceptRowsTo:-1,exceptColumnsTo:-1,coverDIVs:[],movers:[],constructor:function(_1){
+if(this.grid.indirectSelection){
+this.exceptColumnsTo=this.grid.pluginMgr.getFixedCellNumber()-1;
+}
+this.coverDIVs=this.movers=[];
+dojo.subscribe("CTRL_KEY_DOWN",dojo.hitch(this,function(_2,_3){
+if(_2==this.grid&&_2!=this){
+this.keyboardMove(_3);
+}
+}));
+dojo.forEach(this.grid.views.views,function(_4){
+dojo.connect(_4.scrollboxNode,"onscroll",dojo.hitch(this,function(){
+this.clearDrugDivs();
+}));
+},this);
+},getGridWidth:function(){
+return dojo.contentBox(this.grid.domNode).w-this.grid.views.views[0].getWidth().replace("px","");
+},isColSelected:function(_5){
+return this.selectedColumns[_5]&&_5>this.exceptColumnsTo;
+},getHScrollBarHeight:function(){
+this.scrollbarHeight=0;
+dojo.forEach(this.grid.views.views,function(_6,_7){
+if(_6.scrollboxNode){
+var _8=_6.scrollboxNode.offsetHeight-_6.scrollboxNode.clientHeight;
+this.scrollbarHeight=_8>this.scrollbarHeight?_8:this.scrollbarHeight;
+}
+},this);
+return this.scrollbarHeight;
+},getExceptionalColOffsetWidth:function(){
+if(!this.grid.indirectSelection||!this.grid.rowSelectCell){
+return 0;
+}
+var _9=(normalizedOffsetWidth=0),_a=this.grid.rowSelectCell.view.scrollboxNode;
+dojo.forEach(this.getHeaderNodes(),function(_b,_c){
+if(_c<=this.exceptColumnsTo){
+var _d=dojo.coords(_b);
+_9+=_d.w;
+}
+},this);
+normalizedOffsetWidth=_9-_a.scrollLeft*(dojo._isBodyLtr()?1:(dojo.isMoz?-1:1));
+return normalizedOffsetWidth>0?normalizedOffsetWidth:0;
+},getGridCoords:function(_e){
+if(!this.gridCoords||_e){
+this.gridCoords=new Object();
+if(!this.headerHeight){
+this.headerHeight=dojo.coords(this.getHeaderNodes()[0]).h;
+}
+var _f=dojo.coords(this.grid.views.views[0].domNode);
+var _10=dojo.coords(this.grid.domNode);
+var _11=dojo.contentBox(this.grid.domNode);
+this.gridCoords.h=_11.h-this.headerHeight-this.getHScrollBarHeight();
+this.gridCoords.t=_10.y;
+this.gridCoords.l=dojo._isBodyLtr()?(_10.x+_f.w):_10.x;
+this.gridCoords.w=_11.w-_f.w;
+}
+return this.gridCoords;
+},createAvatar:function(_12,_13,_14,top,_15){
+this.gridCoords=null;
+var _16=this.getGridCoords();
+var _17=dojo.doc.createElement("DIV");
+_17.className="dojoxGridSelectedDIV";
+_17.id="grid_dnd_cover_div_"+_14+"_"+top;
+_17.style.width=_12+"px";
+var _18=dojo._docScroll();
+var _19=top<_16.t+this.headerHeight?_16.t+this.headerHeight-top:0;
+var _1a=_16.t+_16.h+this.headerHeight;
+var _1b=0;
+if(top<_16.t+this.headerHeight){
+_1b=(_16.t+this.headerHeight);
+}else{
+if(top>_1a){
+_1b=10000;
+}else{
+_1b=top;
+}
+}
+_17.style.top=_1b+_18.y+"px";
+_17.style.left=(_14+_18.x)+"px";
+var _1c=_1b+_13-_19;
+if(_1c>_1a+(_15?this.scrollbarHeight:0)){
+_1c=_1a;
+}
+_17.style.height=((_1c-_1b)>=0?(_1c-_1b):0)+"px";
+dojo.doc.body.appendChild(_17);
+_17.connections=[];
+_17.connections.push(dojo.connect(_17,"onmouseout",this,function(){
+this.clearDrugDivs();
+}));
+_17.connections.push(dojo.connect(_17,"onclick",this,"avataDivClick"));
+_17.connections.push(dojo.connect(_17,"keydown",this,function(e){
+this.handleESC(e,this);
+}));
+this.coverDIVs.push(_17);
+return _17;
+},handleESC:function(e,_1d){
+var dk=dojo.keys;
+switch(e.keyCode){
+case dk.ESCAPE:
+try{
+this.cancelDND();
+}
+catch(e){
+}
+break;
+}
+},cancelDND:function(){
+this.cleanAll();
+this.clearDrugDivs();
+if(this.mover){
+this.mover.destroy();
+}
+this.cleanAll();
+},createCoverMover:function(_1e,_1f,_20,top,_21){
+var _22=this.getGridCoords(),_23=(_21=="col"?true:false);
+var _24={box:{l:(_21=="row"?_20:_22.l)+dojo._docScroll().x,t:(_21=="col"?top:_22.t+this.headerHeight)+dojo._docScroll().y,w:_21=="row"?1:_22.w,h:_21=="col"?1:_22.h},within:true,movingType:_21,mover:dojox.grid.enhanced.dnd._DndMover};
+return new dojox.grid.enhanced.dnd._DndBoxConstrainedMoveable(this.createAvatar(_1e,_1f,_20,top,_23),_24);
+},getBorderDiv:function(){
+var _25=dojo.byId("borderDIV"+this.grid.id);
+if(_25==null){
+_25=dojo.doc.createElement("DIV");
+_25.id="borderDIV"+this.grid.id;
+_25.className="dojoxGridBorderDIV";
+dojo.doc.body.appendChild(_25);
+}
+return _25;
+},setBorderDiv:function(_26,_27,_28,top){
+var _29=this.getBorderDiv();
+dojo.style(_29,{"height":_27+"px","top":top+"px","width":_26+"px","left":_28+"px"});
+return _29;
+},removeOtherMovers:function(id){
+if(!this.coverDIVs.hasRemovedOtherMovers){
+var _2a;
+dojo.forEach(this.coverDIVs,function(div){
+if(div.id!=id){
+dojo.doc.body.removeChild(div);
+}else{
+_2a=div;
+}
+},this);
+this.coverDIVs=[_2a];
+this.coverDIVs.hasRemovedOtherMovers=true;
+}
+},addColMovers:function(){
+var _2b=-1;
+dojo.forEach(this.selectedColumns,function(col,_2c){
+if(this.isColSelected(_2c)){
+if(_2b==-1){
+_2b=_2c;
+}
+if(this.selectedColumns[_2c+1]==null){
+this.addColMover(_2b,_2c);
+_2b=-1;
+}
+}
+},this);
+},addColMover:function(_2d,_2e){
+if(this.lock){
+return;
+}
+var _2f=(_30=0);
+var top=null,_31=null;
+if(dojo._isBodyLtr()){
+dojo.forEach(this.getHeaderNodes(),function(_32,_33){
+var _34=dojo.coords(_32);
+if(_33==_2d){
+_2f=_34.x;
+top=_34.y+_34.h;
+_31=_34.h;
+}
+if(_33==_2e){
+_30=_34.x+_34.w;
+}
+});
+}else{
+dojo.forEach(this.getHeaderNodes(),function(_35,_36){
+var _37=dojo.coords(_35);
+if(_36==_2d){
+_30=_37.x+_37.w;
+_31=_37.h;
+}
+if(_36==_2e){
+_2f=_37.x;
+top=_37.y+_37.h;
+}
+});
+}
+var _38=this.normalizeColMoverCoords(_2f,_30,_2d,_2e);
+var _39=_38.h,_3a=_38.w,_2f=_38.l,_30=_38.r;
+var _3b=this.createCoverMover(_3a,_39,_2f,top,"col");
+this.movers.push(_3b);
+var _3c=this.setBorderDiv(3,_39,-1000,top+dojo._docScroll().y);
+dojo.attr(_3c,"colH",_38.colH);
+dojo.connect(_3b,"onMoveStart",dojo.hitch(this,function(_3d,_3e){
+this.mover=_3d;
+this.removeOtherMovers(_3d.node.id);
+}));
+dojo.connect(_3b,"onMove",dojo.hitch(this,function(_3f,_40,_41){
+if(_3f.node==null||_3f.node.parentNode==null){
+return;
+}
+this.isMoving=true;
+this.moveColBorder(_3f,_41,_3c);
+}));
+dojo.connect(_3b,"onMoveStop",dojo.hitch(this,function(_42){
+if(this.drugDestIndex==null||this.isContinuousSelection(this.selectedColumns)&&(this.drugDestIndex==_2d||this.drugDestIndex==_2e||this.drugDestIndex==(_2e+1)&&this.drugBefore)){
+this.movingIgnored=true;
+if(this.isMoving){
+this.isMoving=false;
+this.clearDrugDivs();
+}
+return;
+}
+this.isMoving=false;
+this.mover=null;
+this.startMoveCols();
+this.drugDestIndex=null;
+}));
+},normalizeColMoverCoords:function(_43,_44,_45,_46){
+var _47=_44-_43,_48=this.grid.views.views,_49=this.grid.pluginMgr;
+var _4a={"w":_47,"h":0,"l":_43,"r":_44,"colH":0};
+var _4b=this.getGridWidth()-_48[_48.length-1].getScrollbarWidth();
+var rtl=!dojo._isBodyLtr();
+var _4c=_49.getViewByCellIdx(!rtl?_45:_46);
+var _4d=_49.getViewByCellIdx(!rtl?_46:_45);
+var _4e=(_4c==_4d);
+if(!_4c||!_4d){
+return _4a;
+}
+var _4f=dojo.coords(_4c.scrollboxNode).x+(rtl&&dojo.isIE?_4c.getScrollbarWidth():0);
+var _50=dojo.coords(_4d.scrollboxNode);
+var _51=_50.x+_50.w-((!rtl||!dojo.isIE)?_4d.getScrollbarWidth():0);
+if(_4a.l<_4f){
+_4a.w=_4a.r-_4f;
+_4a.l=_4f;
+}
+if(_4a.r>_51){
+_4a.w=_51-_4a.l;
+}
+var i,_52=this.grid.views.views[0],_53=dojo.coords(_52.contentNode).h;
+var _54=_4d,_55=_50.h;
+_4a.colH=_53;
+_55=!_4e?_55:(_55-(_54.scrollboxNode.offsetHeight-_54.scrollboxNode.clientHeight));
+_4a.h=_53<_55?_53:_55;
+return _4a;
+},moveColBorder:function(_56,_57,_58){
+var _59=dojo._docScroll(),rtl=!dojo._isBodyLtr();
+_57.x-=_59.x;
+var _5a=this.grid.views.views,_5b=this.getGridCoords();
+var _5c=_5a[!rtl?1:_5a.length-1].scrollboxNode;
+var _5d=_5a[!rtl?_5a.length-1:1].scrollboxNode;
+var _5e=(!rtl||!dojo.isIE)?_5b.l:(_5b.l+_5c.offsetWidth-_5c.clientWidth);
+var _5f=(!rtl||dojo.isMoz)?(_5b.l+_5b.w-(_5d.offsetWidth-_5d.clientWidth)):(_5b.l+_5b.w);
+dojo.forEach(this.getHeaderNodes(),dojo.hitch(this,function(_60,_61){
+if(_61>this.exceptColumnsTo){
+var x,_62=dojo.coords(_60);
+if(_57.x>=_62.x&&_57.x<=_62.x+_62.w){
+if(!this.selectedColumns[_61]||!this.selectedColumns[_61-1]){
+x=_62.x+_59.x+(rtl?_62.w:0);
+if(_57.x<_5e||_57.x>_5f||x<_5e||x>_5f){
+return;
+}
+dojo.style(_58,"left",x+"px");
+this.drugDestIndex=_61;
+this.drugBefore=true;
+!dojo.isIE&&this.normalizeColBorderHeight(_58,_61);
+}
+}else{
+if(this.getHeaderNodes()[_61+1]==null&&(!rtl?(_57.x>_62.x+_62.w):(_57.x<_62.x))){
+x=_57.x<_5e?_5e:(_57.x>_5f?_5f:(_62.x+_59.x+(rtl?0:_62.w)));
+dojo.style(_58,"left",x+"px");
+this.drugDestIndex=_61;
+this.drugBefore=false;
+!dojo.isIE&&this.normalizeColBorderHeight(_58,_61);
+}
+}
+}
+}));
+},normalizeColBorderHeight:function(_63,_64){
+var _65=this.grid.pluginMgr.getViewByCellIdx(_64);
+if(!_65){
+return;
+}
+var _66=_65.scrollboxNode,_67=dojo.attr(_63,"colH");
+var _68=dojo.coords(_66).h-(_66.offsetHeight-_66.clientHeight);
+_68=_67>0&&_67<_68?_67:_68;
+dojo.style(_63,"height",_68+"px");
+},avataDivClick:function(e){
+if(this.movingIgnored){
+this.movingIgnored=false;
+return;
+}
+this.cleanAll();
+this.clearDrugDivs();
+},startMoveCols:function(){
+this.changeCursorState("wait");
+this.srcIndexdelta=0;
+deltaColAmount=0;
+dojo.forEach(this.selectedColumns,dojo.hitch(this,function(col,_69){
+if(this.isColSelected(_69)){
+if(this.drugDestIndex>_69){
+_69-=deltaColAmount;
+}
+deltaColAmount+=1;
+var _6a=this.grid.layout.cells[_69].view.idx;
+var _6b=this.grid.layout.cells[this.drugDestIndex].view.idx;
+if(_69!=this.drugDestIndex){
+this.grid.layout.moveColumn(_6a,_6b,_69,this.drugDestIndex,this.drugBefore);
+}
+if(this.drugDestIndex<=_69&&this.drugDestIndex+1<this.grid.layout.cells.length){
+this.drugDestIndex+=1;
+}
+}
+}));
+var _6c=this.drugDestIndex+(this.drugBefore?0:1);
+this.clearDrugDivs();
+this.cleanAll();
+this.resetCellIdx();
+this.drugSelectionStart.colIndex=_6c-deltaColAmount;
+this.drugSelectColumn(this.drugSelectionStart.colIndex+deltaColAmount-1);
+},changeCursorState:function(_6d){
+dojo.forEach(this.coverDIVs,function(div){
+div.style.cursor="wait";
+});
+},addRowMovers:function(){
+var _6e=-1;
+dojo.forEach(this.grid.selection.selected,function(row,_6f){
+var _70=this.grid.views.views[0];
+if(row&&_70.rowNodes[_6f]){
+if(_6e==-1){
+_6e=_6f;
+}
+if(this.grid.selection.selected[_6f+1]==null||!_70.rowNodes[_6f+1]){
+this.addRowMover(_6e,_6f);
+_6e=-1;
+}
+}
+},this);
+},addRowMover:function(_71,to){
+var _72=0,_73=this.grid.views.views;
+dojo.forEach(_73,function(_74,_75){
+_72+=_74.getScrollbarWidth();
+});
+var _76=_73[_73.length-1].getScrollbarWidth();
+var _77=!dojo._isBodyLtr()?(dojo.isIE?_72-_76:_72):0;
+var _78=this.getGridWidth()-_76;
+var _79=this.grid.views.views[0];
+var _7a=_79.rowNodes[_71],_7b=_79.rowNodes[to];
+if(!_7a||!_7b){
+return;
+}
+var _7c=dojo.coords(_7a),_7d=dojo.coords(_7b);
+var _7e=this.getExceptionalColOffsetWidth();
+var _7f=this.createCoverMover(_78-_7e,(_7d.y-_7c.y+_7d.h),dojo._isBodyLtr()?(_7c.x+_7c.w+_7e):(_7c.x-_78-_77),_7c.y,"row");
+var _80=this.setBorderDiv(_78,3,(dojo._isBodyLtr()?(_7d.x+_7d.w):(_7d.x-_78-_77))+dojo._docScroll().x,-100);
+var _81=dojo.connect(_7f,"onMoveStart",dojo.hitch(this,function(_82,_83){
+this.mover=_82;
+this.removeOtherMovers(_82.node.id);
+}));
+var _84=dojo.connect(_7f,"onMove",dojo.hitch(this,function(_85,_86,_87){
+if(_85.node==null||_85.node.parentNode==null){
+return;
+}
+this.isMoving=true;
+this.moveRowBorder(_85,_86,_80,_87);
+}));
+var _88=dojo.connect(_7f,"onMoveStop",dojo.hitch(this,function(_89){
+if(this.avaOnRowIndex==null||this.isContinuousSelection(this.grid.selection.selected)&&(this.avaOnRowIndex==_71||this.avaOnRowIndex==(to+1))){
+this.movingIgnored=true;
+if(this.isMoving){
+this.isMoving=false;
+this.clearDrugDivs();
+}
+return;
+}
+this.isMoving=false;
+this.mover=null;
+this.grid.select.outRangeY=false;
+this.grid.select.moveOutTop=false;
+this.grid.scroller.findScrollTop(this.grid.scroller.page*this.grid.scroller.rowsPerPage);
+this.startMoveRows();
+this.avaOnRowIndex=null;
+delete _7f;
+}));
+},moveRowBorder:function(_8a,_8b,_8c,_8d){
+var _8e=this.getGridCoords(true),_8f=dojo._docScroll();
+var _90=_8e.t+this.headerHeight+_8e.h;
+_8b.t-=_8f.y,_8d.y-=_8f.y;
+if(_8d.y>=_90){
+this.grid.select.outRangeY=true;
+this.autoMoveToNextRow();
+}else{
+if(_8d.y<=_8e.t+this.headerHeight){
+this.grid.select.moveOutTop=true;
+this.autoMoveToPreRow();
+}else{
+this.grid.select.outRangeY=this.grid.select.moveOutTop=false;
+var _91=this.grid.views.views[0],_92=_91.rowNodes;
+var _93=dojo.coords(_91.contentNode).h;
+var _94=0,_95=-1;
+for(i in _92){
+++_94;
+if(i>_95){
+_95=i;
+}
+}
+var _96=dojo.coords(_92[_95]);
+if(_93<_8e.h&&_8d.y>(_96.y+_96.h)){
+this.avaOnRowIndex=_94;
+dojo.style(_8c,{"top":_96.y+_96.h+_8f.y+"px"});
+return;
+}
+var _97,_98,_99;
+for(var _9a in _92){
+_9a=parseInt(_9a);
+if(isNaN(_9a)){
+continue;
+}
+_98=_92[_9a];
+if(!_98){
+continue;
+}
+_97=dojo.coords(_98),_99=(_97.y<=_90);
+if(_99&&_8d.y>_97.y&&_8d.y<_97.y+_97.h){
+if(!this.grid.selection.selected[_9a]||!this.grid.selection.selected[_9a-1]){
+this.avaOnRowIndex=_9a;
+dojo.style(_8c,{"top":_97.y+_8f.y+"px"});
+}
+}
+}
+}
+}
+},autoMoveToPreRow:function(){
+if(this.grid.select.moveOutTop){
+if(this.grid.scroller.firstVisibleRow>0){
+this.grid.scrollToRow(this.grid.scroller.firstVisibleRow-1);
+this.autoMoveBorderDivPre();
+setTimeout(dojo.hitch(this,"autoMoveToPreRow"),this.autoScrollRate);
+}
+}
+},autoMoveBorderDivPre:function(){
+var _9b=dojo._docScroll(),_9c=this.getGridCoords();
+var _9d=_9c.t+this.headerHeight+_9b.y;
+var _9e,_9f=this.getBorderDiv();
+if(this.avaOnRowIndex-1<=0){
+this.avaOnRowIndex=0;
+_9e=_9d;
+}else{
+this.avaOnRowIndex--;
+_9e=dojo.coords(this.grid.views.views[0].rowNodes[this.avaOnRowIndex]).y+_9b.y;
+}
+_9f.style.top=(_9e<_9d?_9d:_9e)+"px";
+},autoMoveToNextRow:function(){
+if(this.grid.select.outRangeY){
+if(this.avaOnRowIndex+1<=this.grid.scroller.rowCount){
+this.grid.scrollToRow(this.grid.scroller.firstVisibleRow+1);
+this.autoMoveBorderDiv();
+setTimeout(dojo.hitch(this,"autoMoveToNextRow"),this.autoScrollRate);
+}
+}
+},autoMoveBorderDiv:function(){
+var _a0=dojo._docScroll(),_a1=this.getGridCoords();
+var _a2=_a1.t+this.headerHeight+_a1.h+_a0.y;
+var _a3,_a4=this.getBorderDiv();
+if(this.avaOnRowIndex+1>=this.grid.scroller.rowCount){
+this.avaOnRowIndex=this.grid.scroller.rowCount;
+_a3=_a2;
+}else{
+this.avaOnRowIndex++;
+_a3=dojo.coords(this.grid.views.views[0].rowNodes[this.avaOnRowIndex]).y+_a0.y;
+}
+_a4.style.top=(_a3>_a2?_a2:_a3)+"px";
+},startMoveRows:function(){
+var _a5=Math.min(this.avaOnRowIndex,this.getFirstSelected());
+var end=Math.max(this.avaOnRowIndex-1,this.getLastSelected());
+this.moveRows(_a5,end,this.getPageInfo());
+},moveRows:function(_a6,end,_a7){
+var i,_a8=false,_a9=(selectedRowsAboveBorderDIV=0),_aa=[];
+var _ab=this.grid.scroller,_ac=_ab.rowsPerPage;
+var _ad=_a7.topPage*_ac,_ae=(_a7.bottomPage+1)*_ac-1;
+var _af=dojo.hitch(this,function(_b0,to){
+for(i=_b0;i<to;i++){
+if(!this.grid.selection.selected[i]||!this.grid._by_idx[i]){
+_aa.push(this.grid._by_idx[i]);
+}
+}
+});
+_af(_a6,this.avaOnRowIndex);
+for(i=_a6;i<=end;i++){
+if(this.grid.selection.selected[i]&&this.grid._by_idx[i]){
+_aa.push(this.grid._by_idx[i]);
+_a9++;
+if(this.avaOnRowIndex>i){
+selectedRowsAboveBorderDIV++;
+}
+}
+}
+_af(this.avaOnRowIndex,end+1);
+for(i=_a6,j=0;i<=end;i++){
+this.grid._by_idx[i]=_aa[j++];
+if(i>=_ad&&i<=_ae){
+this.grid.updateRow(i);
+_a8=true;
+}
+}
+this.avaOnRowIndex+=_a9-selectedRowsAboveBorderDIV;
+try{
+this.clearDrugDivs();
+this.cleanAll();
+this.drugSelectionStart.rowIndex=this.avaOnRowIndex-_a9;
+this.drugSelectRow(this.drugSelectionStart.rowIndex+_a9-1);
+if(_a8){
+var _b1=_ab.stack;
+dojo.forEach(_a7.invalidPages,function(_b2){
+_ab.destroyPage(_b2);
+i=dojo.indexOf(_b1,_b2);
+if(i>=0){
+_b1.splice(i,1);
+}
+});
+}
+this.publishRowMove();
+}
+catch(e){
+}
+},clearDrugDivs:function(){
+if(!this.isMoving){
+var _b3=this.getBorderDiv();
+_b3.style.top=-100+"px";
+_b3.style.height="0px";
+_b3.style.left=-100+"px";
+dojo.forEach(this.coverDIVs,function(div){
+dojo.forEach(div.connections,function(_b4){
+dojo.disconnect(_b4);
+});
+dojo.doc.body.removeChild(div);
+delete div;
+},this);
+this.coverDIVs=[];
+}
+},setDrugCoverDivs:function(_b5,_b6){
+if(!this.isMoving){
+if(this.isColSelected(_b5)){
+this.addColMovers();
+}else{
+if(this.grid.selection.selected[_b6]){
+this.addRowMovers();
+}else{
+this.clearDrugDivs();
+}
+}
+}
+},getPageInfo:function(){
+var _b7=this.grid.scroller,_b8=(bottomPage=_b7.page);
+var _b9=_b7.firstVisibleRow,_ba=_b7.lastVisibleRow;
+var _bb=_b7.rowsPerPage,_bc=_b7.pageNodes[0];
+var _bd,_be,_bf=[],_c0;
+dojo.forEach(_bc,function(_c1,_c2){
+if(!_c1){
+return;
+}
+_c0=false;
+_bd=_c2*_bb;
+_be=(_c2+1)*_bb-1;
+if(_b9>=_bd&&_b9<=_be){
+_b8=_c2;
+_c0=true;
+}
+if(_ba>=_bd&&_ba<=_be){
+bottomPage=_c2;
+_c0=true;
+}
+if(!_c0&&(_bd>_ba||_be<_b9)){
+_bf.push(_c2);
+}
+});
+return {topPage:_b8,bottomPage:bottomPage,invalidPages:_bf};
+},resetCellIdx:function(){
+var _c3=0;
+var _c4=-1;
+dojo.forEach(this.grid.views.views,function(_c5,_c6){
+if(_c6==0){
+return;
+}
+if(_c5.structure.cells&&_c5.structure.cells[0]){
+dojo.forEach(_c5.structure.cells[0],function(_c7,_c8){
+var _c9=_c7.markup[2].split(" ");
+var idx=_c3+_c8;
+_c9[1]="idx=\""+idx+"\"";
+_c7.markup[2]=_c9.join(" ");
+});
+}
+for(i in _c5.rowNodes){
+if(!_c5.rowNodes[i]){
+return;
+}
+dojo.forEach(_c5.rowNodes[i].firstChild.rows[0].cells,function(_ca,_cb){
+if(_ca&&_ca.attributes){
+if(_cb+_c3>_c4){
+_c4=_cb+_c3;
+}
+var idx=document.createAttribute("idx");
+idx.value=_cb+_c3;
+_ca.attributes.setNamedItem(idx);
+}
+});
+}
+_c3=_c4+1;
+});
+},publishRowMove:function(){
+dojo.publish(this.grid.rowMovedTopic,[this]);
+},keyboardMove:function(_cc){
+var _cd=this.selectedColumns.length>0;
+var _ce=dojo.hitch(this.grid.selection,dojox.grid.Selection.prototype["getFirstSelected"])()>=0;
+var i,_cf,dk=dojo.keys,_d0=_cc.keyCode;
+if(!dojo._isBodyLtr()){
+_d0=(_cc.keyCode==dk.LEFT_ARROW)?dk.RIGHT_ARROW:(_cc.keyCode==dk.RIGHT_ARROW?dk.LEFT_ARROW:_d0);
+}
+switch(_d0){
+case dk.LEFT_ARROW:
+if(!_cd){
+return;
+}
+_cf=this.getHeaderNodes().length;
+for(i=0;i<_cf;i++){
+if(this.isColSelected(i)){
+this.drugDestIndex=i-1;
+this.drugBefore=true;
+break;
+}
+}
+var _d1=this.grid.indirectSelection?1:0;
+(this.drugDestIndex>=_d1)?this.startMoveCols():(this.drugDestIndex=_d1);
+break;
+case dk.RIGHT_ARROW:
+if(!_cd){
+return;
+}
+_cf=this.getHeaderNodes().length;
+this.drugBefore=true;
+for(i=0;i<_cf;i++){
+if(this.isColSelected(i)&&!this.isColSelected(i+1)){
+this.drugDestIndex=i+2;
+if(this.drugDestIndex==_cf){
+this.drugDestIndex--;
+this.drugBefore=false;
+}
+break;
+}
+}
+if(this.drugDestIndex<_cf){
+this.startMoveCols();
+}
+break;
+case dk.UP_ARROW:
+if(!_ce){
+return;
+}
+this.avaOnRowIndex=dojo.hitch(this.grid.selection,dojox.grid.Selection.prototype["getFirstSelected"])()-1;
+if(this.avaOnRowIndex>-1){
+this.startMoveRows();
+}
+break;
+case dk.DOWN_ARROW:
+if(!_ce){
+return;
+}
+for(i=0;i<this.grid.rowCount;i++){
+if(this.grid.selection.selected[i]&&!this.grid.selection.selected[i+1]){
+this.avaOnRowIndex=i+2;
+break;
+}
+}
+if(this.avaOnRowIndex<=this.grid.rowCount){
+this.startMoveRows();
+}
+}
+}});
+}
diff --git a/dojox/grid/enhanced/dnd/_DndRowSelector.js b/dojox/grid/enhanced/dnd/_DndRowSelector.js
new file mode 100644
index 0000000..7966977
--- /dev/null
+++ b/dojox/grid/enhanced/dnd/_DndRowSelector.js
@@ -0,0 +1,18 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid.enhanced.dnd._DndRowSelector"]){
+dojo._hasResource["dojox.grid.enhanced.dnd._DndRowSelector"]=true;
+dojo.provide("dojox.grid.enhanced.dnd._DndRowSelector");
+dojo.declare("dojox.grid.enhanced.dnd._DndRowSelector",null,{domousedown:function(e){
+this.grid.onMouseDown(e);
+},domouseup:function(e){
+this.grid.onMouseUp(e);
+},dofocus:function(e){
+e.cellNode.style.border="solid 1px";
+}});
+}
diff --git a/dojox/grid/enhanced/dnd/_DndSelectingManager.js b/dojox/grid/enhanced/dnd/_DndSelectingManager.js
new file mode 100644
index 0000000..18a72cf
--- /dev/null
+++ b/dojox/grid/enhanced/dnd/_DndSelectingManager.js
@@ -0,0 +1,371 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid.enhanced.dnd._DndSelectingManager"]){
+dojo._hasResource["dojox.grid.enhanced.dnd._DndSelectingManager"]=true;
+dojo.provide("dojox.grid.enhanced.dnd._DndSelectingManager");
+dojo.require("dojox.grid.util");
+dojo.require("dojox.grid._Builder");
+dojo.require("dojox.grid.enhanced.dnd._DndGrid");
+dojo.require("dojox.grid.enhanced.dnd._DndBuilder");
+dojo.require("dojox.grid.enhanced.dnd._DndRowSelector");
+dojo.require("dojox.grid.enhanced.dnd._DndFocusManager");
+dojo.declare("dojox.grid.enhanced.dnd._DndSelectingManager",null,{typeSelectingMode:[],selectingDisabledTypes:[],drugSelectionStart:null,drugCurrentPoint:null,drugMode:null,keepState:false,extendSelect:false,headerNodes:null,selectedCells:null,selectedColumns:[],selectedClass:"dojoxGridRowSelected",autoScrollRate:1000,constructor:function(_1){
+this.grid=_1;
+this.typeSelectingMode=[];
+this.selectingDisabledTypes=[];
+this.selectedColumns=[];
+this.drugSelectionStart=new Object();
+this.drugCurrentPoint=new Object();
+this.resetStartPoint();
+this.extendGridForDnd(_1);
+this.selectedCells=[];
+dojo.connect(this.grid,"_onFetchComplete",dojo.hitch(this,"refreshColumnSelection"));
+dojo.connect(this.grid.scroller,"scroll",dojo.hitch(this,"refreshColumnSelection"));
+dojo.subscribe(this.grid.rowSelectionChangedTopic,dojo.hitch(this,function(_2){
+try{
+if(_2.grid==this.grid&&_2!=this){
+this.cleanCellSelection();
+}
+}
+catch(e){
+}
+}));
+},extendGridForDnd:function(_3){
+var _4=_3.constructor;
+_3.mixin(_3,dojo.hitch(new dojox.grid.enhanced.dnd._DndGrid(this)));
+_3.constructor=_4;
+_3.mixin(_3.focus,new dojox.grid.enhanced.dnd._DndFocusManager());
+_3.mixin(_3.selection,{clickSelect:function(){
+}});
+dojo.forEach(_3.views.views,function(_5){
+_3.mixin(_5.content,new dojox.grid.enhanced.dnd._DndBuilder());
+_3.mixin(_5.header,new dojox.grid.enhanced.dnd._DndHeaderBuilder());
+if(_5.declaredClass=="dojox.grid._RowSelector"){
+_3.mixin(_5,new dojox.grid.enhanced.dnd._DndRowSelector());
+}
+dojox.grid.util.funnelEvents(_5.contentNode,_5,"doContentEvent",["mouseup"]);
+dojox.grid.util.funnelEvents(_5.headerNode,_5,"doHeaderEvent",["mouseup"]);
+});
+dojo.forEach(this.grid.dndDisabledTypes,function(_6){
+this.disableSelecting(_6);
+},this);
+this.disableFeatures();
+},disableFeatures:function(){
+if(this.selectingDisabledTypes["cell"]){
+this.cellClick=function(){
+};
+this.drugSelectCell=function(){
+};
+}
+if(this.selectingDisabledTypes["row"]){
+this.drugSelectRow=function(){
+};
+}
+if(this.selectingDisabledTypes["col"]){
+this.selectColumn=function(){
+};
+this.drugSelectColumn=function(){
+};
+}
+},disableSelecting:function(_7){
+this.selectingDisabledTypes[_7]=true;
+},isInSelectingMode:function(_8){
+return !!this.typeSelectingMode[_8];
+},setInSelectingMode:function(_9,_a){
+this.typeSelectingMode[_9]=_a;
+},getSelectedRegionInfo:function(){
+var _b=[],_c="";
+if(this.selectedColumns.length>0){
+_c="col";
+dojo.forEach(this.selectedColumns,function(_d,_e){
+!!_d&&_b.push(_e);
+});
+}else{
+if(this.grid.selection.getSelectedCount()>0){
+_c="row";
+_b=dojox.grid.Selection.prototype.getSelected.call(this.grid.selection);
+}
+}
+return {"selectionType":_c,"selectedIdx":_b};
+},clearInSelectingMode:function(){
+this.typeSelectingMode=[];
+},getHeaderNodes:function(){
+return this.headerNodes==null?dojo.query("[role*='columnheader']",this.grid.viewsHeaderNode):this.headerNode;
+},_range:function(_f,_10,_11){
+var s=(_f>=0?_f:_10),e=_10;
+if(s>e){
+e=s;
+s=_10;
+}
+for(var i=s;i<=e;i++){
+_11(i);
+}
+},cellClick:function(_12,_13){
+if(_12>this.exceptColumnsTo){
+this.grid.selection.clear();
+this.publishRowChange();
+var _14=this.getCellNode(_12,_13);
+this.cleanAll();
+this.addCellToSelection(_14);
+}
+},setDrugStartPoint:function(_15,_16){
+this.drugSelectionStart.colIndex=_15;
+this.drugSelectionStart.rowIndex=_16;
+this.drugCurrentPoint.colIndex=_15;
+this.firstOut=true;
+var _17=dojo.connect(dojo.doc,"onmousemove",dojo.hitch(this,function(e){
+this.outRangeValue=e.clientY-dojo.coords(this.grid.domNode).y-this.grid.domNode.offsetHeight;
+if(this.outRangeValue>0){
+if(this.drugSelectionStart.colIndex==-1){
+if(!this.outRangeY){
+this.autoRowScrollDrug(e);
+}
+}else{
+if(this.drugSelectionStart.rowIndex==-1){
+}else{
+this.autoCellScrollDrug(e);
+}
+}
+}else{
+this.firstOut=true;
+this.outRangeY=false;
+}
+}));
+var _18=dojo.connect(dojo.doc,"onmouseup",dojo.hitch(this,function(e){
+this.outRangeY=false;
+dojo.disconnect(_18);
+dojo.disconnect(_17);
+this.grid.onMouseUp(e);
+}));
+},autoRowScrollDrug:function(e){
+this.outRangeY=true;
+this.autoSelectNextRow();
+},autoSelectNextRow:function(){
+if(this.grid.select.outRangeY){
+this.grid.scrollToRow(this.grid.scroller.firstVisibleRow+1);
+this.drugSelectRow(this.drugCurrentPoint.rowIndex+1);
+setTimeout(dojo.hitch(this,"autoSelectNextRow",this.drugCurrentPoint.rowIndex+1),this.getAutoScrollRate());
+}
+},autoCellScrollDrug:function(e){
+var _19=null;
+dojo.forEach(this.getHeaderNodes(),function(_1a){
+var _1b=dojo.coords(_1a);
+if(e.clientX>=_1b.x&&e.clientX<=_1b.x+_1b.w){
+_19=Number(_1a.attributes.getNamedItem("idx").value);
+}
+});
+if(_19!=this.drugCurrentPoint.colIndex||this.firstOut){
+if(!this.firstOut){
+this.colChanged=true;
+this.drugCurrentPoint.colIndex=_19;
+}
+this.firstOut=false;
+this.outRangeY=true;
+dojo.hitch(this,"autoSelectCellInNextRow")();
+}
+},autoSelectCellInNextRow:function(){
+if(this.grid.select.outRangeY){
+this.grid.scrollToRow(this.grid.scroller.firstVisibleRow+1);
+this.drugSelectCell(this.drugCurrentPoint.colIndex,this.drugCurrentPoint.rowIndex+1);
+if(this.grid.select.colChanged){
+this.grid.select.colChanged=false;
+}else{
+setTimeout(dojo.hitch(this,"autoSelectCellInNextRow",this.drugCurrentPoint.rowIndex+1),this.getAutoScrollRate());
+}
+}
+},getAutoScrollRate:function(){
+return this.autoScrollRate;
+},resetStartPoint:function(){
+if(this.drugSelectionStart.colIndex==-1&&this.drugSelectionStart.rowIndex==-1){
+return;
+}
+this.lastDrugSelectionStart=dojo.clone(this.drugSelectionStart);
+this.drugSelectionStart.colIndex=-1;
+this.drugSelectionStart.rowIndex=-1;
+},restorLastDragPoint:function(){
+this.drugSelectionStart=dojo.clone(this.lastDrugSelectionStart);
+},drugSelectCell:function(_1c,_1d){
+this.cleanAll();
+this.drugCurrentPoint.columnIndex=_1c;
+this.drugCurrentPoint.rowIndex=_1d;
+var _1e,_1f,_20,_21;
+if(_1d<this.drugSelectionStart.rowIndex){
+_1e=_1d;
+_1f=this.drugSelectionStart.rowIndex;
+}else{
+_1e=this.drugSelectionStart.rowIndex;
+_1f=_1d;
+}
+if(_1c<this.drugSelectionStart.colIndex){
+_20=_1c;
+_21=this.drugSelectionStart.colIndex;
+}else{
+_20=this.drugSelectionStart.colIndex;
+_21=_1c;
+}
+for(var i=_20;i<=_21;i++){
+this.addColumnRangeToSelection(i,_1e,_1f);
+}
+},selectColumn:function(_22){
+this.addColumnToSelection(_22);
+},drugSelectColumn:function(_23){
+this.selectColumnRange(this.drugSelectionStart.colIndex,_23);
+},drugSelectColumnToMax:function(dir){
+if(dir=="left"){
+this.selectColumnRange(this.drugSelectionStart.colIndex,0);
+}else{
+this.selectColumnRange(this.drugSelectionStart.colIndex,this.getHeaderNodes().length-1);
+}
+},selectColumnRange:function(_24,_25){
+if(!this.keepState){
+this.cleanAll();
+}
+this._range(_24,_25,dojo.hitch(this,"addColumnToSelection"));
+},addColumnToSelection:function(_26){
+this.selectedColumns[_26]=true;
+dojo.toggleClass(this.getHeaderNodes()[_26],"dojoxGridHeaderSelected",true);
+this._rangCellsInColumn(_26,-1,Number.POSITIVE_INFINITY,this.addCellToSelection);
+},addColumnRangeToSelection:function(_27,_28,to){
+var _29=this.grid.views;
+var _2a=[];
+var _2b=this;
+dojo.forEach(_29.views,function(_2c){
+dojo.forEach(this.getViewRowNodes(_2c.rowNodes),function(_2d,_2e){
+if(!_2d){
+return;
+}
+if(_2e>=_28&&_2e<=to){
+dojo.forEach(_2d.firstChild.rows[0].cells,function(_2f){
+if(_2f&&_2f.attributes&&(idx=_2f.attributes.getNamedItem("idx"))&&Number(idx.value)==_27){
+_2b.addCellToSelection(_2f);
+}
+});
+}
+},this);
+},this);
+},_rangCellsInColumn:function(_30,_31,to,_32){
+var _33=this.grid.views;
+var _34=[];
+var _35=this;
+dojo.forEach(_33.views,function(_36){
+dojo.forEach(this.getViewRowNodes(_36.rowNodes),function(_37,_38){
+if(!_37){
+return;
+}
+if(_38>=_31&&_38<=to){
+dojo.forEach(_37.firstChild.rows[0].cells,function(_39){
+if(_39&&_39.attributes&&(idx=_39.attributes.getNamedItem("idx"))&&Number(idx.value)==_30){
+_32(_39,_35);
+}
+});
+}
+},this);
+},this);
+},drugSelectRow:function(_3a){
+this.drugCurrentPoint.rowIndex=_3a;
+this.cleanCellSelection();
+this.clearDrugDivs();
+var _3b=this.grid.selection;
+_3b._beginUpdate();
+if(!this.keepState){
+_3b.deselectAll();
+}
+_3b.selectRange(this.drugSelectionStart.rowIndex,_3a);
+_3b._endUpdate();
+this.publishRowChange();
+},drugSelectRowToMax:function(dir){
+if(dir=="up"){
+this.drugSelectRow(0);
+}else{
+this.drugSelectRow(this.grid.rowCount);
+}
+},getCellNode:function(_3c,_3d){
+var _3e=[],_3f=null;
+var _40=this.grid.views;
+for(var i=0,v,n;(v=_40.views[i])&&(n=v.getRowNode(_3d));i++){
+_3e.push(n);
+}
+dojo.forEach(_3e,dojo.hitch(function(_41,_42){
+if(_3f){
+return;
+}
+var _43=dojo.query("[idx='"+_3c+"']",_41);
+if(_43&&_43[0]){
+_3f=_43[0];
+}
+}));
+return _3f;
+},addCellToSelection:function(_44,_45){
+if(!_45){
+_45=this;
+}
+_45.selectedCells[_45.selectedCells.length]=_44;
+dojo.toggleClass(_44,_45.selectedClass,true);
+},isColSelected:function(_46){
+return this.selectedColumns[_46];
+},isRowSelected:function(_47){
+return this.grid.selection.selected[_47];
+},isContinuousSelection:function(_48){
+var _49=-1;
+for(var i=0;i<_48.length;i++){
+if(!_48[i]){
+continue;
+}
+if(_49<0||i-_49==1){
+_49=i;
+}else{
+if(i-_49>=2){
+return false;
+}
+}
+}
+return _49>=0?true:false;
+},cleanCellSelection:function(){
+dojo.forEach(this.selectedCells,dojo.hitch(this,"removeCellSelectedState"));
+this.selectedCells=[];
+dojo.forEach(this.selectedColumns,function(_4a,_4b){
+if(_4a){
+dojo.toggleClass(this.getHeaderNodes()[_4b],"dojoxGridHeaderSelected",false);
+}
+},this);
+this.selectedColumns=[];
+this.grid.edit.isEditing()&&this.grid.edit.apply();
+},removeCellSelectedState:function(_4c){
+dojo.toggleClass(_4c,this.selectedClass,false);
+},cleanAll:function(){
+this.cleanCellSelection();
+this.grid.selection.clear();
+this.publishRowChange();
+},refreshColumnSelection:function(){
+dojo.forEach(this.selectedColumns,dojo.hitch(this,function(_4d,_4e){
+if(_4d){
+this.grid.select.addColumnToSelection(_4e);
+}
+}));
+},inSelectedArea:function(_4f,_50){
+return this.selectedColumns[_4f]||this.gird.selection.selecteded[_50];
+},publishRowChange:function(){
+dojo.publish(this.grid.rowSelectionChangedTopic,[this]);
+},getViewRowNodes:function(_51){
+var _52=[];
+for(i in _51){
+_52.push(_51[i]);
+}
+return _52;
+},getFirstSelected:function(){
+return dojo.hitch(this.grid.selection,dojox.grid.Selection.prototype.getFirstSelected)();
+},getLastSelected:function(){
+var _53=this.grid.selection.selected;
+for(var i=_53.length-1;i>=0;i--){
+if(_53[i]){
+return i;
+}
+}
+return -1;
+}});
+}
diff --git a/dojox/grid/enhanced/nls/EnhancedGrid.js b/dojox/grid/enhanced/nls/EnhancedGrid.js
new file mode 100644
index 0000000..ddcfe7a
--- /dev/null
+++ b/dojox/grid/enhanced/nls/EnhancedGrid.js
@@ -0,0 +1 @@
+({"descending":"Descending","sortingState":"${0} - ${1}","ascending":"Ascending","nestedSort":"Nested Sort","unsorted":"Do not sort this column","singleSort":"Single Sort"})
\ No newline at end of file
diff --git a/dojox/grid/enhanced/nls/zh/EnhancedGrid.js b/dojox/grid/enhanced/nls/zh/EnhancedGrid.js
new file mode 100644
index 0000000..a0eec70
--- /dev/null
+++ b/dojox/grid/enhanced/nls/zh/EnhancedGrid.js
@@ -0,0 +1 @@
+({"descending":"降序","ascending":"升序","nestedSort":"嵌套排序","unsorted":"取消排序","singleSort":"简单排序","sortingState":"${0} - ${1}"})
\ No newline at end of file
diff --git a/dojox/grid/enhanced/plugins/DnD.js b/dojox/grid/enhanced/plugins/DnD.js
new file mode 100644
index 0000000..232b6e6
--- /dev/null
+++ b/dojox/grid/enhanced/plugins/DnD.js
@@ -0,0 +1,13 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid.enhanced.plugins.DnD"]){
+dojo._hasResource["dojox.grid.enhanced.plugins.DnD"]=true;
+dojo.provide("dojox.grid.enhanced.plugins.DnD");
+dojo.require("dojox.grid.enhanced.dnd._DndMovingManager");
+dojo.declare("dojox.grid.enhanced.plugins.DnD",dojox.grid.enhanced.dnd._DndMovingManager,{});
+}
diff --git a/dojox/grid/enhanced/plugins/IndirectSelection.js b/dojox/grid/enhanced/plugins/IndirectSelection.js
new file mode 100644
index 0000000..c29b753
--- /dev/null
+++ b/dojox/grid/enhanced/plugins/IndirectSelection.js
@@ -0,0 +1,291 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid.enhanced.plugins.IndirectSelection"]){
+dojo._hasResource["dojox.grid.enhanced.plugins.IndirectSelection"]=true;
+dojo.provide("dojox.grid.enhanced.plugins.IndirectSelection");
+dojo.require("dojox.grid.cells.dijit");
+dojo.require("dojox.grid.cells._base");
+dojo.declare("dojox.grid.enhanced.plugins.IndirectSelection",null,{constructor:function(_1){
+this.grid=_1;
+dojo.connect(_1.layout,"setStructure",dojo.hitch(_1.layout,this.addRowSelectCell));
+},addRowSelectCell:function(){
+if(!this.grid.indirectSelection||this.grid.selectionMode=="none"){
+return;
+}
+var _2=false,_3=["get","formatter","field","fields"],_4={type:dojox.grid.cells.DijitMultipleRowSelector,name:"",editable:true,width:"30px",styles:"text-align: center;"};
+dojo.forEach(this.structure,dojo.hitch(this,function(_5){
+var _6=_5.cells;
+if(_6&&_6.length>0&&!_2){
+var _7=_6[0];
+if(_7[0]&&_7[0]["isRowSelector"]){
+_2=true;
+return;
+}
+var _8,_9=this.grid.selectionMode=="single"?dojox.grid.cells.DijitSingleRowSelector:dojox.grid.cells.DijitMultipleRowSelector;
+if(!dojo.isObject(this.grid.indirectSelection)){
+_8=dojo.mixin(_4,{type:_9});
+}else{
+_8=dojo.mixin(_4,this.grid.indirectSelection,{type:_9,editable:true});
+dojo.forEach(_3,function(_a){
+if(_a in _8){
+delete _8[_a];
+}
+});
+}
+_6.length>1&&(_8["rowSpan"]=_6.length);
+dojo.forEach(this.cells,function(_b,i){
+if(_b.index>=0){
+_b.index+=1;
+}else{
+}
+});
+var _c=this.addCellDef(0,0,_8);
+_c.index=0;
+_7.unshift(_c);
+this.cells.unshift(_c);
+this.grid.rowSelectCell=_c;
+_2=true;
+}
+}));
+this.cellCount=this.cells.length;
+}});
+dojo.declare("dojox.grid.cells._SingleRowSelectorMixin",null,{alwaysEditing:true,widgetMap:{},widget:null,isRowSelector:true,defaultValue:false,formatEditing:function(_d,_e){
+this.needFormatNode(_d,_e);
+},_formatNode:function(_f,_10){
+this.formatNode(_f,_10);
+},setValue:function(_11,_12){
+return;
+},get:function(_13){
+var _14=this.widgetMap[this.view.id]?this.widgetMap[this.view.id][_13]:null;
+var _15=_14?_14.attr("checked"):"";
+return _15;
+},_fireSelectionChanged:function(){
+dojo.publish(this.grid.rowSelectionChangedTopic,[this]);
+},_selectionChanged:function(obj){
+if(obj==this){
+return;
+}
+for(var i in this.widgetMap[this.view.id]){
+var idx=new Number(i);
+var _16=this.widgetMap[this.view.id][idx];
+var _17=!!this.grid.selection.selected[idx];
+_16.attr("checked",_17);
+}
+this.defaultValue=false;
+this.grid.edit.isEditing()&&this.grid.edit.apply();
+},_toggleSingleRow:function(idx,_18){
+var _19;
+dojo.hitch(this.grid.selection,dojox.grid.Selection.prototype[_18?"addToSelection":"deselect"])(idx);
+if(this.widgetMap[this.view.id]&&(_19=this.widgetMap[this.view.id][idx])){
+_19.attr("checked",_18);
+}
+this._fireSelectionChanged();
+},inIndirectSelectionMode:function(){
+},toggleAllSelection:function(){
+}});
+dojo.declare("dojox.grid.cells._MultipleRowSelectorMixin",null,{swipeStartRowIndex:-1,swipeMinRowIndex:-1,swipeMaxRowIndex:-1,toSelect:false,lastClickRowIdx:-1,toggleAllTrigerred:false,_inDndSelection:false,domousedown:function(e){
+if(e.target.tagName=="INPUT"){
+this._startSelection(e.rowIndex);
+}
+dojo.stopEvent(e);
+},domousemove:function(e){
+this._updateSelection(e,0);
+},onRowMouseOver:function(e){
+this._updateSelection(e,0);
+if(this.grid.dnd){
+this._inDndSelection=this.grid.select.isInSelectingMode("row");
+}
+},domouseup:function(e){
+dojo.isIE&&this.view.content.decorateEvent(e);
+var _1a=e.cellIndex>=0&&(this.inIndirectSelectionMode()||this._inDndSelection)&&!this.grid.edit.isEditRow(e.rowIndex);
+_1a&&this._focusEndingCell(e.rowIndex,e.cellIndex);
+this._finisheSelect();
+},dokeyup:function(e){
+if(!e.shiftKey){
+this._finisheSelect();
+}
+},_startSelection:function(_1b){
+this.swipeStartRowIndex=this.swipeMinRowIndex=this.swipeMaxRowIndex=_1b;
+this.toSelect=!this.widgetMap[this.view.id][_1b].attr("checked");
+},_updateSelection:function(e,_1c){
+if(this.swipeStartRowIndex<0){
+return;
+}
+var _1d=_1c!=0;
+var _1e=e.rowIndex-this.swipeStartRowIndex+_1c;
+_1e>0&&(this.swipeMaxRowIndex<e.rowIndex+_1c)&&(this.swipeMaxRowIndex=e.rowIndex+_1c);
+_1e<0&&(this.swipeMinRowIndex>e.rowIndex+_1c)&&(this.swipeMinRowIndex=e.rowIndex+_1c);
+if(this.swipeMinRowIndex!=this.swipeMaxRowIndex){
+for(var i in this.widgetMap[this.view.id]){
+var idx=new Number(i);
+var _1f=(idx>=(_1e>0?this.swipeStartRowIndex:e.rowIndex+_1c)&&idx<=(_1e>0?e.rowIndex+_1c:this.swipeStartRowIndex));
+var _20=(idx>=this.swipeMinRowIndex&&idx<=this.swipeMaxRowIndex);
+if(_1f&&!(_1e==0&&!this.toSelect)){
+(this.widgetMap[this.view.id][idx]).attr("checked",this.toSelect);
+dojo.hitch(this.grid.selection,dojox.grid.Selection.prototype[this.toSelect?"addToSelection":"deselect"])(idx);
+}else{
+if(_20&&!_1d){
+(this.widgetMap[this.view.id][idx]).attr("checked",!this.toSelect);
+dojo.hitch(this.grid.selection,dojox.grid.Selection.prototype[!this.toSelect?"addToSelection":"deselect"])(idx);
+}
+}
+}
+}
+this._fireSelectionChanged();
+},swipeSelectionByKey:function(e,_21){
+if(this.swipeStartRowIndex<0){
+this.swipeStartRowIndex=e.rowIndex;
+if(_21>0){
+this.swipeMaxRowIndex=e.rowIndex+_21;
+this.swipeMinRowIndex=e.rowIndex;
+}else{
+this.swipeMinRowIndex=e.rowIndex+_21;
+this.swipeMaxRowIndex=e.rowIndex;
+}
+this.toSelect=this.widgetMap[this.view.id][e.rowIndex].attr("checked");
+}
+this._updateSelection(e,_21);
+},_finisheSelect:function(){
+this.swipeStartRowIndex=-1;
+this.swipeMinRowIndex=-1;
+this.swipeMaxRowIndex=-1;
+this.toSelect=false;
+},inIndirectSelectionMode:function(){
+return this.swipeStartRowIndex>=0;
+},toggleAllSelection:function(_22){
+for(var i in this.widgetMap[this.view.id]){
+var idx=new Number(i);
+var _23=this.widgetMap[this.view.id][idx];
+_23.attr("checked",_22);
+dojo.hitch(this.grid.selection,dojox.grid.Selection.prototype[_22?"addToSelection":"deselect"])(idx);
+}
+!_22&&this.grid.selection.deselectAll();
+this.defaultValue=_22;
+this.toggleAllTrigerred=true;
+this._fireSelectionChanged();
+}});
+dojo.declare("dojox.grid.cells.DijitSingleRowSelector",[dojox.grid.cells._Widget,dojox.grid.cells._SingleRowSelectorMixin],{widgetClass:dijit.form.RadioButton,constructor:function(){
+dojo.subscribe(this.grid.rowSelectionChangedTopic,this,this._selectionChanged);
+dojo.subscribe(this.grid.sortRowSelectionChangedTopic,this,this._selectionChanged);
+this.grid.indirectSelector=this;
+},formatNode:function(_24,_25){
+if(!this.widgetClass){
+return _24;
+}
+!this.widgetMap[this.view.id]&&(this.widgetMap[this.view.id]={});
+var _26=this.widgetMap[this.view.id][_25];
+var _27=this.getNode(_25);
+if(!_27){
+return;
+}
+var _28=!_27.firstChild||(_26&&_26.domNode!=_27.firstChild);
+var _29=_28&&!_27.firstChild?_27.appendChild(dojo.create("div")):_27.firstChild;
+if(!_26||dojo.isIE){
+!this.widgetProps&&(this.widgetProps={});
+this.widgetProps.name="select_"+this.view.id;
+var _2a=this.getDefaultValue(_26,_25);
+this.widget=_26=this.createWidget(_29,_24,_25);
+this.widgetMap[this.view.id][_25]=_26;
+this.widget.attr("checked",_2a);
+dojo.connect(_26,"_onClick",dojo.hitch(this,function(e){
+this._selectRow(e,_25);
+}));
+dojo.connect(_26.domNode,"onkeyup",dojo.hitch(this,function(e){
+e.keyCode==dojo.keys.SPACE&&this._selectRow(e,_25,true);
+}));
+dojo.hitch(this.grid.selection,dojox.grid.Selection.prototype[_2a?"addToSelection":"deselect"])(_25);
+}else{
+this.widget=_26;
+dojo.addClass(this.widget.domNode,"dojoxGridWidgetHidden");
+_28&&this.attachWidget(_29,_24,_25);
+}
+this.grid.rowHeightChanged(_25);
+dojo.removeClass(this.widget.domNode,"dojoxGridWidgetHidden");
+(_25==this.grid.lastRenderingRowIdx)&&dojo.removeClass(this.grid.domNode,"dojoxGridSortInProgress");
+},getDefaultValue:function(_2b,_2c){
+var _2d=_2b?_2b.attr("checked"):this.defaultValue;
+if(!_2b){
+if(this.grid.nestedSorting){
+_2d=_2d||this.grid.getStoreSelectedValue(_2c);
+}
+_2d=this.grid.selection.isSelected(_2c)?true:_2d;
+}
+return _2d;
+},focus:function(_2e){
+var _2f=this.widgetMap[this.view.id][_2e];
+if(_2f){
+setTimeout(dojo.hitch(_2f,function(){
+dojox.grid.util.fire(this,"focus");
+}),0);
+}
+},_focusEndingCell:function(_30,_31){
+var _32=this.grid.getCell(_31);
+this.grid.focus.setFocusCell(_32,_30);
+this.grid.isDndSelectEnable&&this.grid.focus._blurRowBar();
+},_selectRow:function(e,_33,_34){
+if(dojo.isMoz&&_34){
+return;
+}
+dojo.stopEvent(e);
+this._focusEndingCell(_33,0);
+var _35=!this.grid.selection.selected[_33];
+this.grid.selection.deselectAll();
+this.grid.selection.addToSelection(_33);
+if(!dojo.isMoz){
+var _36=this.widgetMap[this.view.id][_33];
+_36.attr("checked",true);
+}
+this._fireSelectionChanged();
+},toggleRow:function(idx,_37){
+var _38=dojo.hitch(this.grid.selection,dojox.grid.Selection.prototype.getFirstSelected)();
+if(idx!=_38&&!_37||idx==_38&&_37){
+return;
+}
+var _39;
+if(idx!=_38&&_37&&this.widgetMap[this.view.id]&&(_39=this.widgetMap[this.view.id][_38])){
+_39.attr("checked",false);
+}
+this.grid.selection.deselectAll();
+this._toggleSingleRow(idx,_37);
+},setDisabled:function(idx,_3a){
+if(this.widgetMap[this.view.id]){
+var _3b=this.widgetMap[this.view.id][idx];
+_3b&&_3b.attr("disabled",_3a);
+}
+}});
+dojo.declare("dojox.grid.cells.DijitMultipleRowSelector",[dojox.grid.cells.DijitSingleRowSelector,dojox.grid.cells._MultipleRowSelectorMixin],{widgetClass:dijit.form.CheckBox,constructor:function(){
+dojo.connect(dojo.doc,"onmouseup",this,"domouseup");
+this.grid.indirectSelector=this;
+},_selectRow:function(e,_3c,_3d){
+dojo.stopEvent(e);
+this._focusEndingCell(_3c,0);
+var _3e=_3c-this.lastClickRowIdx;
+if(this.lastClickRowIdx>=0&&!e.ctrlKey&&!e.altKey&&e.shiftKey){
+var _3f=this.widgetMap[this.view.id][_3c].attr("checked");
+_3f=_3d?!_3f:_3f;
+for(var i in this.widgetMap[this.view.id]){
+var idx=new Number(i);
+var _40=(idx>=(_3e>0?this.lastClickRowIdx:_3c)&&idx<=(_3e>0?_3c:this.lastClickRowIdx));
+if(_40){
+var _41=this.widgetMap[this.view.id][idx];
+_41.attr("checked",_3f);
+dojo.hitch(this.grid.selection,dojox.grid.Selection.prototype[_3f?"addToSelection":"deselect"])(idx);
+}
+}
+}else{
+var _42=!this.grid.selection.selected[_3c];
+var _41=this.widgetMap[this.view.id][_3c];
+_41.attr("checked",_42);
+dojo.hitch(this.grid.selection,dojox.grid.Selection.prototype[_42?"addToSelection":"deselect"])(_3c);
+}
+this.lastClickRowIdx=_3c;
+this._fireSelectionChanged();
+},toggleRow:function(idx,_43){
+this._toggleSingleRow(idx,_43);
+}});
+}
diff --git a/dojox/grid/enhanced/plugins/Menu.js b/dojox/grid/enhanced/plugins/Menu.js
new file mode 100644
index 0000000..4b6c903
--- /dev/null
+++ b/dojox/grid/enhanced/plugins/Menu.js
@@ -0,0 +1,70 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid.enhanced.plugins.Menu"]){
+dojo._hasResource["dojox.grid.enhanced.plugins.Menu"]=true;
+dojo.provide("dojox.grid.enhanced.plugins.Menu");
+dojo.declare("dojox.grid.enhanced.plugins.Menu",null,{constructor:function(_1){
+_1.mixin(_1,this);
+},_initMenus:function(){
+var _2=this.menuContainer;
+!this.headerMenu&&(this.headerMenu=this._getMenuWidget(this.menus["headerMenu"]));
+!this.rowMenu&&(this.rowMenu=this._getMenuWidget(this.menus["rowMenu"]));
+!this.cellMenu&&(this.cellMenu=this._getMenuWidget(this.menus["cellMenu"]));
+!this.selectedRegionMenu&&(this.selectedRegionMenu=this._getMenuWidget(this.menus["selectedRegionMenu"]));
+this.headerMenu&&this.attr("headerMenu",this.headerMenu)&&this.setupHeaderMenu();
+this.rowMenu&&this.attr("rowMenu",this.rowMenu);
+this.cellMenu&&this.attr("cellMenu",this.cellMenu);
+this.isDndSelectEnable&&this.selectedRegionMenu&&dojo.connect(this.select,"setDrugCoverDivs",dojo.hitch(this,this._bindDnDSelectEvent));
+},_getMenuWidget:function(_3){
+if(!_3){
+return;
+}
+var _4=dijit.byId(_3);
+if(!_4){
+throw new Error("Menu '"+_3+"' not existed");
+}
+return _4;
+},_bindDnDSelectEvent:function(){
+dojo.forEach(this.select.coverDIVs,dojo.hitch(this,function(_5){
+this.selectedRegionMenu.bindDomNode(_5);
+dojo.connect(_5,"contextmenu",dojo.hitch(this,function(e){
+dojo.mixin(e,this.select.getSelectedRegionInfo());
+this.onSelectedRegionContextMenu(e);
+}));
+}));
+},_setRowMenuAttr:function(_6){
+this._setRowCellMenuAttr(_6,"rowMenu");
+},_setCellMenuAttr:function(_7){
+this._setRowCellMenuAttr(_7,"cellMenu");
+},_setRowCellMenuAttr:function(_8,_9){
+if(!_8){
+return;
+}
+if(this[_9]){
+this[_9].unBindDomNode(this.domNode);
+}
+this[_9]=_8;
+this[_9].bindDomNode(this.domNode);
+},showRowCellMenu:function(e){
+var _a=e.sourceView.declaredClass=="dojox.grid._RowSelector";
+if(this.rowMenu&&(!e.cell||this.selection.isSelected(e.rowIndex))){
+this.rowMenu._openMyself(e);
+dojo.stopEvent(e);
+return;
+}
+if(_a||e.cell&&e.cell.isRowSelector){
+dojo.stopEvent(e);
+return;
+}
+if(this.isDndSelectEnable){
+this.select.cellClick(e.cellIndex,e.rowIndex);
+this.focus.setFocusCell(e.cell,e.rowIndex);
+}
+this.cellMenu&&this.cellMenu._openMyself(e);
+}});
+}
diff --git a/dojox/grid/enhanced/plugins/NestedSorting.js b/dojox/grid/enhanced/plugins/NestedSorting.js
new file mode 100644
index 0000000..87036da
--- /dev/null
+++ b/dojox/grid/enhanced/plugins/NestedSorting.js
@@ -0,0 +1,730 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.grid.enhanced.plugins.NestedSorting"]){
+dojo._hasResource["dojox.grid.enhanced.plugins.NestedSorting"]=true;
+dojo.provide("dojox.grid.enhanced.plugins.NestedSorting");
+dojo.declare("dojox.grid.enhanced.plugins.NestedSorting",null,{sortAttrs:[],_unarySortCell:{},_minColWidth:63,_widthDelta:23,_minColWidthUpdated:false,_sortTipMap:{},_overResizeWidth:3,storeItemSelected:"storeItemSelectedAttr",exceptionalSelectedItems:[],_a11yText:{"dojoxGridDescending":"▾","dojoxGridAscending":"▴","dojoxGridAscendingTip":"۸","dojoxGridDescendingTip":"۷","dojoxGridUnsortedTip":"x"},constructor:function(_1){
+_1.mixin(_1,this);
+dojo.forEach(_1.views.views,function(_2){
+dojo.connect(_2,"renderHeader",dojo.hitch(_2,_1._initSelectCols));
+dojo.connect(_2.header,"domousemove",_2.grid,"_sychronizeResize");
+});
+_1.getSortProps=_1._getDsSortAttrs;
+dojo.connect(_1,"_onFetchComplete",_1,"updateNewRowSelection");
+if(_1.indirectSelection&&_1.rowSelectCell.toggleAllSelection){
+dojo.connect(_1.rowSelectCell,"toggleAllSelection",_1,"allSelectionToggled");
+}
+dojo.subscribe(_1.rowSelectionChangedTopic,_1,_1._selectionChanged);
+_1.focus.destroy();
+_1.focus=new dojox.grid.enhanced.plugins._NestedSortingFocusManager(_1);
+dojo.connect(_1.views,"render",_1,"initAriaInfo");
+},setSortIndex:function(_3,_4,e){
+if(!this.nestedSorting){
+this.inherited(arguments);
+}else{
+if(this.dnd&&!this.dndRowConn){
+this.dndRowConn=dojo.connect(this.select,"startMoveRows",dojo.hitch(this,this.clearSort));
+}
+this.retainLastRowSelection();
+this.inSorting=true;
+this._toggleProgressTip(true,e);
+this._updateSortAttrs(e,_4);
+this.focus.addSortFocus(e);
+if(this.canSort()){
+this.sort();
+this.edit.info={};
+this.update();
+}
+this._toggleProgressTip(false,e);
+this.inSorting=false;
+}
+},_updateSortAttrs:function(e,_5){
+var _6=false;
+var _7=!!e.unarySortChoice;
+if(_7){
+var _8=this.getCellSortInfo(e.cell);
+var _9=(this.sortAttrs.length>0&&_8["sortPos"]!=1)?_8["unarySortAsc"]:this._getNewSortState(_8["unarySortAsc"]);
+if(_9&&_9!=0){
+this.sortAttrs=[{attr:e.cell.field,asc:_9,cell:e.cell,cellNode:e.cellNode}];
+this._unarySortCell={cell:e.cell,node:e.cellNode};
+}else{
+this.sortAttrs=[];
+this._unarySortCell=null;
+}
+}else{
+this.setCellSortInfo(e,_5);
+}
+},getCellSortInfo:function(_a){
+if(!_a){
+return false;
+}
+var _b=null;
+var _c=this.sortAttrs;
+dojo.forEach(_c,function(_d,_e,_f){
+if(_d&&_d["attr"]==_a.field&&_d["cell"]==_a){
+_b={unarySortAsc:_f[0]?_f[0]["asc"]:undefined,nestedSortAsc:_d["asc"],sortPos:_e+1};
+}
+});
+return _b?_b:{unarySortAsc:_c&&_c[0]?_c[0]["asc"]:undefined,nestedSortAsc:undefined,sortPos:-1};
+},setCellSortInfo:function(e,_10){
+var _11=e.cell;
+var _12=false;
+var _13=[];
+var _14=this.sortAttrs;
+dojo.forEach(_14,dojo.hitch(this,function(_15,_16){
+if(_15&&_15["attr"]==_11.field){
+var si=_10?_10:this._getNewSortState(_15["asc"]);
+if(si==1||si==-1){
+_15["asc"]=si;
+}else{
+if(si==0){
+_13.push(_16);
+}else{
+throw new Exception("Illegal nested sorting status - "+si);
+}
+}
+_12=true;
+}
+}));
+var _17=0;
+dojo.forEach(_13,function(_18){
+_14.splice((_18-_17++),1);
+});
+if(!_12){
+var si=_10?_10:1;
+if(si!=0){
+_14.push({attr:_11.field,asc:si,cell:e.cell,cellNode:e.cellNode});
+}
+}
+if(_13.length>0){
+this._unarySortCell={cell:_14[0]["cell"],node:_14[0]["cellNode"]};
+}
+},_getDsSortAttrs:function(){
+var _19=[];
+var si=null;
+dojo.forEach(this.sortAttrs,function(_1a){
+if(_1a&&(_1a["asc"]==1||_1a["asc"]==-1)){
+_19.push({attribute:_1a["attr"],descending:(_1a["asc"]==-1)});
+}
+});
+return _19.length>0?_19:null;
+},_getNewSortState:function(si){
+return si?(si==1?-1:(si==-1?0:1)):1;
+},sortStateInt2Str:function(si){
+if(!si){
+return "Unsorted";
+}
+switch(si){
+case 1:
+return "Ascending";
+case -1:
+return "Descending";
+default:
+return "Unsorted";
+}
+},clearSort:function(){
+dojo.query("[id*='Sort']",this.viewsHeaderNode).forEach(function(_1b){
+dojo.addClass(_1b,"dojoxGridUnsorted");
+});
+this.sortAttrs=[];
+this.focus.clearHeaderFocus();
+},_getNestedSortHeaderContent:function(_1c){
+var n=_1c.name||_1c.grid.getCellName(_1c);
+if(_1c.grid.pluginMgr.isFixedCell(_1c)){
+return ["<div class=\"dojoxGridCellContent\">",n,"</div>"].join("");
+}
+var _1d=_1c.grid.getCellSortInfo(_1c);
+var _1e=_1c.grid.sortAttrs;
+var _1f=(_1e&&_1e.length>1&&_1d["sortPos"]>=1);
+var _20=(_1e&&_1e.length==1&&_1d["sortPos"]==1);
+var _21=_1c.grid;
+var ret=["<div class=\"dojoxGridSortRoot\">","<div class=\"dojoxGridSortWrapper\">","<span id=\"selectSortSeparator"+_1c.index+"\" class=\"dojoxGridSortSeparatorOff\"></span>","<span class=\"dojoxGridNestedSortWrapper\" tabindex=\"-1\">","<span id=\""+_1c.view.id+"SortPos"+_1c.index+"\" class=\"dojoxGridSortPos "+(_1f?"":"dojoxGridSortPosOff")+"\">"+(_1f?_1d["sortPos"]:"")+"</span>","<span id=\"nestedSortCol"+_1c.index+"\" class=\"dojoxGridSort dojoxGridNestedSort "+(_1f?("dojoxGrid"+_21 [...]
+return ret.join("");
+},addHoverSortTip:function(e){
+this._sortTipMap[e.cellIndex]=true;
+var _22=this.getCellSortInfo(e.cell);
+if(!_22){
+return;
+}
+var _23=this._getCellElements(e.cellNode);
+if(!_23){
+return;
+}
+var _24=this.sortAttrs;
+var _25=!_24||_24.length<1;
+var _26=(_24&&_24.length==1&&_22["sortPos"]==1);
+dojo.addClass(_23["selectSortSeparator"],"dojoxGridSortSeparatorOn");
+if(_25||_26){
+this._addHoverUnarySortTip(_23,_22,e);
+}else{
+this._addHoverNestedSortTip(_23,_22,e);
+this.updateMinColWidth(_23["nestedSortPos"]);
+}
+var _27=_23["selectRegion"];
+this._fixSelectRegion(_27);
+if(!dijit.hasWaiRole(_27)){
+dijit.setWaiState(_27,"label","Column "+(e.cellIndex+1)+" "+e.cell.field);
+}
+this._toggleHighlight(e.sourceView,e);
+this.focus._updateFocusBorder();
+},_addHoverUnarySortTip:function(_28,_29,e){
+dojo.addClass(_28["nestedSortWrapper"],"dojoxGridUnsorted");
+var _2a=this.sortStateInt2Str(this._getNewSortState(_29["unarySortAsc"]));
+dijit.setWaiState(_28["unarySortWrapper"],"label","Column "+(e.cellIndex+1)+" "+e.cell.field+" - Choose "+_2a.toLowerCase()+" single sort");
+var _2b="dojoxGrid"+_2a+"Tip";
+dojo.addClass(_28["unarySortChoice"],_2b);
+_28["unarySortChoice"].innerHTML=this._a11yText[_2b];
+this._addTipInfo(_28["unarySortWrapper"],this._composeSortTip(_2a,"singleSort"));
+},_addHoverNestedSortTip:function(_2c,_2d,e){
+var _2e=_2c["nestedSortPos"];
+var _2f=_2c["unarySortWrapper"];
+var _30=_2c["nestedSortWrapper"];
+var _31=this.sortAttrs;
+dojo.removeClass(_30,"dojoxGridUnsorted");
+var _32=this.sortStateInt2Str(this._getNewSortState(_2d["nestedSortAsc"]));
+dijit.setWaiState(_30,"label","Column "+(e.cellIndex+1)+" "+e.cell.field+" - Choose "+_32.toLowerCase()+" nested sort");
+var _33="dojoxGrid"+_32+"Tip";
+this._addA11yInfo(_2c["nestedSortChoice"],_33);
+this._addTipInfo(_30,this._composeSortTip(_32,"nestedSort"));
+_32=this.sortStateInt2Str(_2d["unarySortAsc"]);
+dijit.setWaiState(_2f,"label","Column "+(e.cellIndex+1)+" "+e.cell.field+" - Choose "+_32.toLowerCase()+" single sort");
+_33="dojoxGrid"+_32+"Tip";
+this._addA11yInfo(_2c["unarySortChoice"],_33);
+this._addTipInfo(_2f,this._composeSortTip(_32,"singleSort"));
+dojo.addClass(_2c["sortSeparator"],"dojoxGridSortSeparatorOn");
+dojo.removeClass(_2e,"dojoxGridSortPosOff");
+if(_2d["sortPos"]<1){
+_2e.innerHTML=(_31?_31.length:0)+1;
+if(!this._unarySortInFocus()&&_31&&_31.length==1){
+var _34=this._getUnaryNode();
+_34.innerHTML="1";
+dojo.removeClass(_34,"dojoxGridSortPosOff");
+dojo.removeClass(_34.parentNode,"dojoxGridUnsorted");
+this._fixSelectRegion(this._getCellElements(_34)["selectRegion"]);
+}
+}
+},_unarySortInFocus:function(){
+return this._unarySortCell.cell&&this.focus.headerCellInFocus(this._unarySortCell.cell.index);
+},_composeSortTip:function(_35,_36){
+_35=_35.toLowerCase();
+if(_35=="unsorted"){
+return this._nls[_35];
+}else{
+var tip=dojo.string.substitute(this._nls["sortingState"],[this._nls[_36],this._nls[_35]]);
+return tip;
+}
+},_addTipInfo:function(_37,_38){
+dojo.attr(_37,"title",_38);
+dojo.query("span",_37).forEach(function(n){
+dojo.attr(n,"title",_38);
+});
+},_addA11yInfo:function(_39,_3a){
+dojo.addClass(_39,_3a);
+_39.innerHTML=this._a11yText[_3a];
+},removeHoverSortTip:function(e){
+if(!this._sortTipMap[e.cellIndex]){
+return;
+}
+var _3b=this.getCellSortInfo(e.cell);
+if(!_3b){
+return;
+}
+var _3c=this._getCellElements(e.cellNode);
+if(!_3c){
+return;
+}
+var _3d=_3c.nestedSortChoice;
+var _3e=_3c.unarySortChoice;
+var _3f=_3c.unarySortWrapper;
+var _40=_3c.nestedSortWrapper;
+this._toggleHighlight(e.sourceView,e,true);
+function _41(_42){
+dojo.forEach(_42,function(_43){
+var _44=dojo.trim((" "+_43["className"]+" ").replace(/\sdojoxGrid\w+Tip\s/g," "));
+if(_43["className"]!=_44){
+_43["className"]=_44;
+}
+});
+};
+_41([_3d,_3e]);
+_3e.innerHTML=this._a11yText["dojoxGrid"+this.sortStateInt2Str(_3b["unarySortAsc"])]||".";
+_3d.innerHTML=this._a11yText["dojoxGrid"+this.sortStateInt2Str(_3b["nestedSortAsc"])]||".";
+dojo.removeClass(_3c["selectSortSeparator"],"dojoxGridSortSeparatorOn");
+dojo.removeClass(_3c["sortSeparator"],"dojoxGridSortSeparatorOn");
+if(_3b["sortPos"]==1&&this.focus.isNavHeader()&&!this.focus.headerCellInFocus(e.cellIndex)){
+dojo.removeClass(_3c["nestedSortWrapper"],"dojoxGridUnsorted");
+}
+var _45=this.sortAttrs;
+if(!isNaN(_3b["sortPos"])&&_3b["sortPos"]<1){
+_3c["nestedSortPos"].innerHTML="";
+dojo.addClass(_40,"dojoxGridUnsorted");
+if(!this.focus._focusBorderBox&&_45&&_45.length==1){
+var _46=this._getUnaryNode();
+_46.innerHTML="";
+dojo.addClass(_46,"dojoxGridSortPosOff");
+this._fixSelectRegion(this._getCellElements(_46)["selectRegion"]);
+}
+}
+this._fixSelectRegion(_3c["selectRegion"]);
+dijit.removeWaiState(_40,"label");
+dijit.removeWaiState(_3f,"label");
+if(_3b["sortPos"]>=0){
+var _47=(_45.length==1);
+var _48=_47?_3f:_40;
+this._setSortRegionWaiState(_47,e.cellIndex,e.cell.field,_3b["sortPos"],_48);
+}
+this.focus._updateFocusBorder();
+this._sortTipMap[e.cellIndex]=false;
+},_getUnaryNode:function(){
+for(var i=0;i<this.views.views.length;i++){
+var n=dojo.byId(this.views.views[i].id+"SortPos"+this._unarySortCell.cell.index);
+if(n){
+return n;
+}
+}
+},_fixSelectRegion:function(_49){
+var _4a=_49.previousSibling;
+var _4b=dojo.contentBox(_49.parentNode);
+var _4c=dojo.marginBox(_49);
+var _4d=dojo.marginBox(_4a);
+if(dojo.isIE&&!dojo._isBodyLtr()){
+var w=0;
+dojo.forEach(_4a.childNodes,function(_4e){
+w+=dojo.marginBox(_4e).w;
+});
+_4d.w=w;
+_4d.l=(_4d.t=0);
+dojo.marginBox(_4a,_4d);
+}
+if(_4c.w!=(_4b.w-_4d.w)){
+_4c.w=_4b.w-_4d.w;
+if(!dojo.isWebKit){
+dojo.marginBox(_49,_4c);
+}else{
+_4c.h=dojo.contentBox(_4b).h;
+dojo.style(_49,"width",(_4c.w-4)+"px");
+}
+}
+},updateMinColWidth:function(_4f){
+if(this._minColWidthUpdated){
+return;
+}
+var _50=_4f.innerHTML;
+_4f.innerHTML=dojo.query(".dojoxGridSortWrapper",this.viewsHeaderNode).length;
+var _51=_4f.parentNode.parentNode;
+this._minColWidth=dojo.marginBox(_51).w+this._widthDelta;
+_4f.innerHTML=_50;
+this._minColWidthUpdated=true;
+},getMinColWidth:function(){
+return this._minColWidth;
+},_initSelectCols:function(){
+var _52=dojo.query(".dojoxGridHeaderCellSelectRegion",this.headerContentNode);
+var _53=dojo.query(".dojoxGridUnarySortWrapper",this.headerContentNode);
+var _54=dojo.query(".dojoxGridNestedSortWrapper",this.headerContentNode);
+_52.concat(_53).concat(_54).forEach(function(_55){
+dojo.connect(_55,"onmousemove",dojo.hitch(this.grid,this.grid._toggleHighlight,this));
+dojo.connect(_55,"onmouseout",dojo.hitch(this.grid,this.grid._removeActiveState));
+},this);
+this.grid._fixHeaderCellStyle(_52,this);
+if(dojo.isIE&&!dojo._isBodyLtr()){
+this.grid._fixAllSelectRegion();
+}
+},_fixHeaderCellStyle:function(_56,_57){
+dojo.forEach(_56,dojo.hitch(this,function(_58){
+var _59=dojo.marginBox(_58),_5a=this._getCellElements(_58),_5b=_5a.sortWrapper;
+_5b.style.height=_59.h+"px";
+_5b.style.lineHeight=_59.h+"px";
+var _5c=_5a["selectSortSeparator"],_5d=_5a["sortSeparator"];
+_5d.style.height=_5c.style.height=_59.h*3/5+"px";
+_5d.style.marginTop=_5c.style.marginTop=_59.h*1/5+"px";
+_57.header.overResizeWidth=this._overResizeWidth;
+}));
+},_fixAllSelectRegion:function(){
+var _5e=dojo.query(".dojoxGridHeaderCellSelectRegion",this.viewsHeaderNode);
+dojo.forEach(_5e,dojo.hitch(this,function(_5f){
+this._fixSelectRegion(_5f);
+}));
+},_toggleHighlight:function(_60,e,_61){
+if(!e.target||!e.type||!e.type.match(/mouse|contextmenu/)){
+return;
+}
+var _62=this._getCellElements(e.target);
+if(!_62){
+return;
+}
+var _63=_62["selectRegion"];
+var _64=_62["nestedSortWrapper"];
+var _65=_62["unarySortWrapper"];
+dojo.removeClass(_63,"dojoxGridSelectRegionHover");
+dojo.removeClass(_64,"dojoxGridSortHover");
+dojo.removeClass(_65,"dojoxGridSortHover");
+if(!_61&&!_60.grid._inResize(_60)){
+var _66=this._getSortEventInfo(e);
+if(_66.selectChoice){
+dojo.addClass(_63,"dojoxGridSelectRegionHover");
+}else{
+if(_66.nestedSortChoice){
+dojo.addClass(_64,"dojoxGridSortHover");
+}else{
+if(_66.unarySortChoice){
+dojo.addClass(_65,"dojoxGridSortHover");
+}
+}
+}
+}
+},_removeActiveState:function(e){
+if(!e.target||!e.type||!e.type.match(/mouse|contextmenu/)){
+return;
+}
+var _67=this._getChoiceRegion(e.target,this._getSortEventInfo(e));
+_67&&dojo.removeClass(_67,this.headerCellActiveClass);
+},_toggleProgressTip:function(on,e){
+var _68=[this.domNode,e?e.cellNode:null];
+setTimeout(function(){
+dojo.forEach(_68,function(_69){
+if(_69){
+if(on&&!dojo.hasClass(_69,"dojoxGridSortInProgress")){
+dojo.addClass(_69,"dojoxGridSortInProgress");
+}else{
+if(!on&&dojo.hasClass(_69,"dojoxGridSortInProgress")){
+dojo.removeClass(_69,"dojoxGridSortInProgress");
+}
+}
+}
+});
+},0.1);
+},_getSortEventInfo:function(e){
+var _6a=function(_6b,css){
+return dojo.hasClass(_6b,css)||(_6b.parentNode&&dojo.hasClass(_6b.parentNode,css));
+};
+return {selectChoice:_6a(e.target,"dojoxGridHeaderCellSelectRegion"),unarySortChoice:_6a(e.target,"dojoxGridUnarySortWrapper"),nestedSortChoice:_6a(e.target,"dojoxGridNestedSortWrapper")};
+},ignoreEvent:function(e){
+return !(e.nestedSortChoice||e.unarySortChoice||e.selectChoice);
+},doheaderclick:function(e){
+if(this.nestedSorting){
+if(e.selectChoice){
+this.onHeaderCellSelectClick(e);
+}else{
+if((e.unarySortChoice||e.nestedSortChoice)&&!this._inResize(e.sourceView)){
+this.onHeaderCellSortClick(e);
+}
+}
+return;
+}
+this.inherited(arguments);
+},onHeaderCellSelectClick:function(e){
+},onHeaderCellSortClick:function(e){
+this.setSortIndex(e.cell.index,null,e);
+},_sychronizeResize:function(e){
+if(!e.cell||e.cell.isRowSelector||this.focus.headerCellInFocus(e.cellIndex)){
+return;
+}
+if(!this._inResize(e.sourceView)){
+this.addHoverSortTip(e);
+}else{
+var idx=e.cellIndex;
+if(!this._sortTipMap[e.cellIndex]){
+e.cellIndex=this._sortTipMap[idx+1]?(idx+1):(this._sortTipMap[idx-1]?(idx-1):idx);
+e.cellNode=e.cellNode.parentNode.childNodes[e.cellIndex];
+}
+this.removeHoverSortTip(e);
+}
+},_getCellElements:function(_6c){
+try{
+while(_6c&&_6c.nodeName.toLowerCase()!="th"){
+_6c=_6c.parentNode;
+}
+if(!_6c){
+return null;
+}
+var ns=dojo.query(".dojoxGridSortRoot",_6c);
+if(ns.length!=1){
+return null;
+}
+var n=ns[0];
+return {"selectSortSeparator":dojo.query("[id^='selectSortSeparator']",n)[0],"nestedSortPos":dojo.query(".dojoxGridSortPos",n)[0],"nestedSortChoice":dojo.query("[id^='nestedSortCol']",n)[0],"sortSeparator":dojo.query("[id^='SortSeparator']",n)[0],"unarySortChoice":dojo.query("[id^='unarySortCol']",n)[0],"selectRegion":dojo.query(".dojoxGridHeaderCellSelectRegion",n)[0],"sortWrapper":dojo.query(".dojoxGridSortWrapper",n)[0],"unarySortWrapper":dojo.query(".dojoxGridUnarySortWrapper",n)[0], [...]
+}
+catch(e){
+}
+return null;
+},_getChoiceRegion:function(_6d,_6e){
+var _6f,_70=this._getCellElements(_6d);
+if(!_70){
+return;
+}
+_6e.unarySortChoice&&(_6f=_70["unarySortWrapper"]);
+_6e.nestedSortChoice&&(_6f=_70["nestedSortWrapper"]);
+_6e.selectChoice&&(_6f=_70["selectRegion"]);
+return _6f;
+},_inResize:function(_71){
+return _71.header.moverDiv||dojo.hasClass(_71.headerNode,"dojoxGridColResize")||dojo.hasClass(_71.headerNode,"dojoxGridColNoResize");
+},retainLastRowSelection:function(){
+dojo.forEach(this._by_idx,function(o,idx){
+if(!o||!o.item){
+return;
+}
+var _72=!!this.selection.isSelected(idx);
+o.item[this.storeItemSelected]=[_72];
+if(this.indirectSelection&&this.rowSelectCell.toggleAllTrigerred&&_72!=this.toggleAllValue){
+this.exceptionalSelectedItems.push(o.item);
+}
+},this);
+this.selection.clear();
+dojo.publish(this.sortRowSelectionChangedTopic,[this]);
+},updateNewRowSelection:function(_73,req){
+dojo.forEach(_73,function(_74,idx){
+if(this.indirectSelection&&this.rowSelectCell.toggleAllTrigerred){
+if(dojo.indexOf(this.exceptionalSelectedItems,_74)<0){
+_74[this.storeItemSelected]=[this.toggleAllValue];
+}
+}
+_74[this.storeItemSelected]&&_74[this.storeItemSelected][0]&&this.selection.addToSelection(req.start+idx);
+},this);
+dojo.publish(this.sortRowSelectionChangedTopic,[this]);
+if(dojo.isMoz&&this._by_idx.length==0){
+this.update();
+}
+},allSelectionToggled:function(_75){
+this.exceptionalSelectedItems=[];
+this.toggleAllValue=this.rowSelectCell.defaultValue;
+},_selectionChanged:function(obj){
+obj==this.select&&(this.toggleAllValue=false);
+},getStoreSelectedValue:function(_76){
+var _77=this._by_idx[_76];
+return _77&&_77.item&&!!(_77.item[this.storeItemSelected]&&_77.item[this.storeItemSelected][0]);
+},initAriaInfo:function(){
+var _78=this.sortAttrs;
+dojo.forEach(_78,dojo.hitch(this,function(_79,_7a){
+var _7b=_79.cell.getHeaderNode();
+var _7c=this._getCellElements(_7b);
+if(!_7c){
+return;
+}
+var _7d=_7c["selectRegion"];
+dijit.setWaiState(_7d,"label","Column "+(_79.cell.index+1)+" "+_79.attr);
+var _7e=(_78.length==1);
+var _7f=this.sortStateInt2Str(_79.asc).toLowerCase();
+var _80=_7e?_7c["unarySortWrapper"]:_7c["nestedSortWrapper"];
+dijit.setWaiState(_80,"sort",_7f);
+this._setSortRegionWaiState(_7e,_79.cell.index,_79.attr,_7a+1,_80);
+}));
+},_setSortRegionWaiState:function(_81,_82,_83,_84,_85){
+if(_84<0){
+return;
+}
+var _86=_81?"single sort":"nested sort";
+var _87="Column "+(_82+1)+" "+_83+" "+_86+" "+(!_81?(" sort position "+_84):"");
+dijit.setWaiState(_85,"label",_87);
+},_inPage:function(_88){
+return _88<this._bop||_88>=this._eop;
+}});
+dojo.declare("dojox.grid.enhanced.plugins._NestedSortingFocusManager",dojox.grid._FocusManager,{lastHeaderFocus:{cellNode:null,regionIdx:-1},currentHeaderFocusEvt:null,cssMarkers:["dojoxGridHeaderCellSelectRegion","dojoxGridNestedSortWrapper","dojoxGridUnarySortWrapper"],_focusBorderBox:null,_initColumnHeaders:function(){
+var _89=this._findHeaderCells();
+dojo.forEach(_89,dojo.hitch(this,function(_8a){
+var _8b=dojo.query(".dojoxGridHeaderCellSelectRegion",_8a);
+var _8c=dojo.query("[class*='SortWrapper']",_8a);
+_8b=_8b.concat(_8c);
+_8b.length==0&&(_8b=[_8a]);
+dojo.forEach(_8b,dojo.hitch(this,function(_8d){
+this._connects.push(dojo.connect(_8d,"onfocus",this,"doColHeaderFocus"));
+this._connects.push(dojo.connect(_8d,"onblur",this,"doColHeaderBlur"));
+}));
+}));
+},focusHeader:function(_8e,_8f,_90){
+if(!this.isNavHeader()){
+this.inherited(arguments);
+}else{
+var _91=this._findHeaderCells();
+this._colHeadNode=_91[this._colHeadFocusIdx];
+_8f&&(this.lastHeaderFocus.cellNode=this._colHeadNode);
+}
+if(!this._colHeadNode){
+return;
+}
+if(this.grid.indirectSelection&&this._colHeadFocusIdx==0){
+this._colHeadNode=this._findHeaderCells()[++this._colHeadFocusIdx];
+}
+var _92=_90?0:(this.lastHeaderFocus.regionIdx>=0?this.lastHeaderFocus.regionIdx:(_8e?2:0));
+var _93=dojo.query("."+this.cssMarkers[_92],this._colHeadNode)[0]||this._colHeadNode;
+this.grid.addHoverSortTip(this.currentHeaderFocusEvt=this._mockEvt(_93));
+this.lastHeaderFocus.regionIdx=_92;
+_93&&dojox.grid.util.fire(_93,"focus");
+},focusSelectColEndingHeader:function(e){
+if(!e||!e.cellNode){
+return;
+}
+this._colHeadFocusIdx=e.cellIndex;
+this.focusHeader(null,false,true);
+},_delayedHeaderFocus:function(){
+this.isNavHeader()&&this.focusHeader(null,true);
+},_setActiveColHeader:function(_94,_95,_96){
+dojo.attr(this.grid.domNode,"aria-activedescendant",_94.id);
+this._colHeadNode=_94;
+this._colHeadFocusIdx=_95;
+},doColHeaderFocus:function(e){
+this.lastHeaderFocus.cellNode=this._colHeadNode;
+if(e.target==this._colHeadNode){
+this._scrollHeader(this.getHeaderIndex());
+}else{
+var _97=this.getFocusView(e);
+if(!_97){
+return;
+}
+_97.header.baseDecorateEvent(e);
+this._addFocusBorder(e.target);
+this._colHeadFocusIdx=e.cellIndex;
+this._colHeadNode=this._findHeaderCells()[this._colHeadFocusIdx];
+this._colHeadNode&&this.getHeaderIndex()!=-1&&this._scrollHeader(this._colHeadFocusIdx);
+}
+this._focusifyCellNode(false);
+this.grid.isDndSelectEnable&&this.grid.focus._blurRowBar();
+this.grid.addHoverSortTip(this.currentHeaderFocusEvt=this._mockEvt(e.target));
+if(dojo.isIE&&!dojo._isBodyLtr()){
+this.grid._fixAllSelectRegion();
+}
+},doColHeaderBlur:function(e){
+this.inherited(arguments);
+this._removeFocusBorder();
+if(!this.isNavCellRegion){
+var _98=this.getFocusView(e);
+if(!_98){
+return;
+}
+_98.header.baseDecorateEvent(e);
+this.grid.removeHoverSortTip(e);
+this.lastHeaderFocus.cellNode=this._colHeadNode;
+}
+},getFocusView:function(e){
+var _99;
+dojo.forEach(this.grid.views.views,function(_9a){
+if(!_99){
+var _9b=dojo.coords(_9a.domNode),_9c=dojo.coords(e.target);
+var _9d=_9c.x>=_9b.x&&_9c.x<=(_9b.x+_9b.w);
+_9d&&(_99=_9a);
+}
+});
+return (this.focusView=_99);
+},_mockEvt:function(_9e){
+var _9f=this.grid.getCell(this._colHeadFocusIdx);
+return {target:_9e,cellIndex:this._colHeadFocusIdx,cell:_9f,cellNode:this._colHeadNode,clientX:-1,sourceView:_9f.view};
+},navHeader:function(e){
+var _a0=e.ctrlKey?0:(e.keyCode==dojo.keys.LEFT_ARROW)?-1:1;
+!dojo._isBodyLtr()&&(_a0*=-1);
+this.focusView.header.baseDecorateEvent(e);
+dojo.forEach(this.cssMarkers,dojo.hitch(this,function(css,_a1){
+if(dojo.hasClass(e.target,css)){
+var _a2=_a1+_a0,_a3,_a4;
+do{
+_a3=dojo.query("."+this.cssMarkers[_a2],e.cellNode)[0];
+if(_a3&&dojo.style(_a3.lastChild||_a3.firstChild,"display")!="none"){
+_a4=_a3;
+break;
+}
+_a2+=_a0;
+}while(_a2>=0&&_a2<this.cssMarkers.length);
+if(_a4&&_a2>=0&&_a2<this.cssMarkers.length){
+if(e.ctrlKey){
+return;
+}
+dojo.isIE&&(this.grid._sortTipMap[e.cellIndex]=false);
+this.navCellRegion(_a4,_a2);
+return;
+}
+var _a5=_a2<0?-1:(_a2>=this.cssMarkers.length?1:0);
+this.navHeaderNode(_a5);
+}
+}));
+},navHeaderNode:function(_a6,_a7){
+var _a8=this._colHeadFocusIdx+_a6;
+var _a9=this._findHeaderCells();
+while(_a8>=0&&_a8<_a9.length&&_a9[_a8].style.display=="none"){
+_a8+=_a6;
+}
+if(this.grid.indirectSelection&&_a8==0){
+return;
+}
+if(_a6!=0&&_a8>=0&&_a8<this.grid.layout.cells.length){
+this.lastHeaderFocus.cellNode=this._colHeadNode;
+this.lastHeaderFocus.regionIdx=-1;
+this._colHeadFocusIdx=_a8;
+this.focusHeader(_a6<0?true:false,false,_a7);
+}
+},navCellRegion:function(_aa,_ab){
+this.isNavCellRegion=true;
+dojox.grid.util.fire(_aa,"focus");
+this.currentHeaderFocusEvt.target=_aa;
+this.lastHeaderFocus.regionIdx=_ab;
+var _ac=_ab==0?_aa:_aa.parentNode.nextSibling;
+_ac&&this.grid._fixSelectRegion(_ac);
+this.isNavCellRegion=false;
+},headerCellInFocus:function(_ad){
+return (this._colHeadFocusIdx==_ad)&&this._focusBorderBox;
+},clearHeaderFocus:function(){
+this._colHeadNode=this._colHeadFocusIdx=null;
+this.lastHeaderFocus={cellNode:null,regionIdx:-1};
+},addSortFocus:function(e){
+var _ae=this.grid.getCellSortInfo(e.cell);
+if(!_ae){
+return;
+}
+var _af=this.grid.sortAttrs;
+var _b0=!_af||_af.length<1;
+var _b1=(_af&&_af.length==1&&_ae["sortPos"]==1);
+this._colHeadFocusIdx=e.cellIndex;
+this._colHeadNode=e.cellNode;
+this.currentHeaderFocusEvt={};
+this.lastHeaderFocus.regionIdx=(_b0||_b1)?2:(e.nestedSortChoice?1:0);
+},_addFocusBorder:function(_b2){
+if(!_b2){
+return;
+}
+this._removeFocusBorder();
+this._focusBorderBox=dojo.create("div");
+this._focusBorderBox.className="dojoxGridFocusBorderBox";
+dojo.toggleClass(_b2,"dojoxGridSelectRegionFocus",true);
+dojo.toggleClass(_b2,"dojoxGridSelectRegionHover",false);
+var _b3=_b2.offsetHeight;
+if(_b2.hasChildNodes()){
+_b2.insertBefore(this._focusBorderBox,_b2.firstChild);
+}else{
+_b2.appendChild(this._focusBorderBox);
+}
+var _b4={"l":0,"t":0,"r":0,"b":0};
+for(var i in _b4){
+_b4[i]=dojo.create("div");
+}
+var pos={x:dojo.coords(_b2).x-dojo.coords(this._focusBorderBox).x,y:dojo.coords(_b2).y-dojo.coords(this._focusBorderBox).y,w:_b2.offsetWidth,h:_b3};
+for(var i in _b4){
+var n=_b4[i];
+dojo.addClass(n,"dojoxGridFocusBorder");
+dojo.style(n,"top",pos.y+"px");
+dojo.style(n,"left",pos.x+"px");
+this._focusBorderBox.appendChild(n);
+}
+var _b5=function(val){
+return val>0?val:0;
+};
+dojo.style(_b4.r,"left",_b5(pos.x+pos.w-1)+"px");
+dojo.style(_b4.b,"top",_b5(pos.y+pos.h-1)+"px");
+dojo.style(_b4.l,"height",_b5(pos.h-1)+"px");
+dojo.style(_b4.r,"height",_b5(pos.h-1)+"px");
+dojo.style(_b4.t,"width",_b5(pos.w-1)+"px");
+dojo.style(_b4.b,"width",_b5(pos.w-1)+"px");
+},_updateFocusBorder:function(){
+if(this._focusBorderBox==null){
+return;
+}
+this._addFocusBorder(this._focusBorderBox.parentNode);
+},_removeFocusBorder:function(){
+if(this._focusBorderBox&&this._focusBorderBox.parentNode){
+dojo.toggleClass(this._focusBorderBox.parentNode,"dojoxGridSelectRegionFocus",false);
+this._focusBorderBox.parentNode.removeChild(this._focusBorderBox);
+}
+this._focusBorderBox=null;
+}});
+}
diff --git a/dojox/grid/enhanced/resources/EnhancedGrid.css b/dojox/grid/enhanced/resources/EnhancedGrid.css
new file mode 100644
index 0000000..81acd6d
--- /dev/null
+++ b/dojox/grid/enhanced/resources/EnhancedGrid.css
@@ -0,0 +1,156 @@
+.dojoxGridCellContent{
+	padding:3px;
+}
+.dojoxGridHeader .dojoxGridCell .dojoxGridSortNode{
+	padding:3px;
+}
+.dojoxGridCell .dojoxGridSortRoot{
+	position: relative; 
+	width: 100%;
+	text-align:left; 
+}
+.dojoxGridCell .dojoxGridHeaderCellSelectRegion{
+	text-align: left;
+	padding:3px;
+	
+	overflow: hidden;
+	white-space:nowrap;
+}
+.dj_ie .dojoxGridCell .dojoxGridHeaderCellSelectRegion{
+	padding-left:4px;
+}
+.dojoxGridSortWrapper{
+	
+	position:absolute;
+	right:0px;
+	
+	z-index: 1;
+}
+.dojoxGridNestedSortWrapper{
+	float:left;
+}
+.dojoxGridSortPos{
+	float:left;
+	margin-left:3px;
+}
+.dj_ff2 .dojoxGridSortPos{
+	padding: 3px 0;
+	line-height: normal;
+}
+.dojoxGridSortPosOff{
+	display:none;
+}
+.dojoxGridNestedSort{
+	text-indent: -5000em;
+}
+.dojoxGridUnarySortWrapper{
+	float:left;
+}
+.dojoxGridSort{
+	display: block;
+	float: left;
+	background:url("images/nestedSortArrows.png") no-repeat left center;
+	width: 8px;
+	margin-right:3px;
+	margin-left:3px;
+	text-align:center;
+}
+.dojoxGridUnarySort{
+	text-indent: -5000em;
+	margin-left:4px;
+}
+.dojoxGridAscending{
+	background-position: -9px;
+}
+.dojoxGridUnsorted{
+	display:none;
+}
+.dojoxGridAscendingTip{
+	background:url("images/nestedSortArrows.png") no-repeat left center;
+	background-position: -30px;
+	display:block;
+	cursor:pointer;
+}
+.dojoxGridDescendingTip{
+	background:url("images/nestedSortArrows.png") no-repeat left center;
+	background-position: -20px;
+	display:block;
+	cursor:pointer;
+}
+.dojoxGridUnsortedTip{
+	background:url("images/nestedSortArrows.png") no-repeat left center;
+	background-position: -39.5px;
+	display:block;
+	cursor:pointer;
+}
+.dojoxGridSortHiddenTip{
+	display:none;
+}
+.dojoxGridSortSeparatorOff{
+	width: 0px;
+	border-right-color: #999999;
+	border-right-style:solid;
+	border-right-width:1px;
+	display: none;
+}
+.dojoxGridSortSeparatorOn{
+	display: block;
+	float: left;
+}
+.dojoxGridSortInProgress{
+	cursor:progress;
+}
+.dojoxGridWidgetHidden{
+	visibility:hidden;
+}
+.dijit_a11y .dojoxGridNestedSort, .dijit_a11y .dojoxGridUnarySort {
+	text-indent: 0;
+	font-size: 14px;
+	
+}
+.dojoxGridFocusBorderBox {
+	position: relative;
+	top: 0;
+	left: 0;
+	width: 0;
+	height: 0;
+}
+.dojoxGridFocusBorder {
+	width: 0px;
+	height: 0px;
+	overflow: hidden;
+	position: absolute;
+	z-index: 999;
+	top: 0;
+	left: 0;
+}
+.dojoxGridSelectedDIV{
+	background-color: #3366CC;
+	position:absolute;
+	opacity:0.2;
+	cursor:move;
+	z-index:999;
+}
+.dj_ie .dojoxGridSelectedDIV{
+	filter: alpha(opacity = 30);
+}
+.dojoxGridBorderDIV{
+	width:3px;
+	background-color: gray;
+	font-size:0em;
+	position:absolute;
+	z-index:9999;
+}
+.dojoxGrid{
+	border:1px solid #DBDBDB;
+}
+.dijit_a11y .dojoxGridRowSelected{
+	opacity:0.4 !important;
+}
+.dijit_a11y .dojoxGridSelectedDIV{
+	opacity:0.4 !important;
+	border:3px solid #000 !important;
+}
+.dijit_a11y .dojoxGridBorderDIV{
+	border:2px solid #000 !important;
+}
diff --git a/dojox/grid/enhanced/resources/EnhancedGrid_rtl.css b/dojox/grid/enhanced/resources/EnhancedGrid_rtl.css
new file mode 100644
index 0000000..fb28690
--- /dev/null
+++ b/dojox/grid/enhanced/resources/EnhancedGrid_rtl.css
@@ -0,0 +1,23 @@
+.dj_ie .dijitRtl .dojoxGridHeader table {
+	float:none;
+}
+.dijitRtl .dojoxGridCell {
+	text-align:right;
+}
+.dijitRtl .dojoxGridNestedSort, 
+.dijitRtl .dojoxGridUnarySort {
+	text-align: right;
+}
+.dijitRtl .dojoxGridSortWrapper {
+	left: 0;
+	right: auto;
+}
+.dijitRtl .dojoxGridCell .dojoxGridHeaderCellSelectRegion {
+	float: right;
+	text-align: right;
+}
+.dijitRtl .dojoxGridSortSeparatorOn,
+.dijitRtl .dojoxGridNestedSortWrapper,
+.dijitRtl .dojoxGridUnarySortWrapper {
+	float: right;
+}
diff --git a/dojox/grid/enhanced/resources/images/nestedSortArrows.png b/dojox/grid/enhanced/resources/images/nestedSortArrows.png
new file mode 100644
index 0000000..96fa7e4
Binary files /dev/null and b/dojox/grid/enhanced/resources/images/nestedSortArrows.png differ
diff --git a/dojox/grid/enhanced/resources/tundraEnhancedGrid.css b/dojox/grid/enhanced/resources/tundraEnhancedGrid.css
new file mode 100644
index 0000000..2f3fd60
--- /dev/null
+++ b/dojox/grid/enhanced/resources/tundraEnhancedGrid.css
@@ -0,0 +1,789 @@
+.dojoxGridCellContent{
+	padding:3px;
+}
+.dojoxGridHeader .dojoxGridCell .dojoxGridSortNode{
+	padding:3px;
+}
+.dojoxGridCell .dojoxGridSortRoot{
+	position: relative; 
+	width: 100%;
+	text-align:left; 
+}
+.dojoxGridCell .dojoxGridHeaderCellSelectRegion{
+	text-align: left;
+	padding:3px;
+	
+	overflow: hidden;
+	white-space:nowrap;
+}
+.dj_ie .dojoxGridCell .dojoxGridHeaderCellSelectRegion{
+	padding-left:4px;
+}
+.dojoxGridSortWrapper{
+	
+	position:absolute;
+	right:0px;
+	
+	z-index: 1;
+}
+.dojoxGridNestedSortWrapper{
+	float:left;
+}
+.dojoxGridSortPos{
+	float:left;
+	margin-left:3px;
+}
+.dj_ff2 .dojoxGridSortPos{
+	padding: 3px 0;
+	line-height: normal;
+}
+.dojoxGridSortPosOff{
+	display:none;
+}
+.dojoxGridNestedSort{
+	text-indent: -5000em;
+}
+.dojoxGridUnarySortWrapper{
+	float:left;
+}
+.dojoxGridSort{
+	display: block;
+	float: left;
+	background:url(images/nestedSortArrows.png) no-repeat left center;
+	width: 8px;
+	margin-right:3px;
+	margin-left:3px;
+	text-align:center;
+}
+.dojoxGridUnarySort{
+	text-indent: -5000em;
+	margin-left:4px;
+}
+.dojoxGridAscending{
+	background-position: -9px;
+}
+.dojoxGridUnsorted{
+	display:none;
+}
+.dojoxGridAscendingTip{
+	background:url(images/nestedSortArrows.png) no-repeat left center;
+	background-position: -30px;
+	display:block;
+	cursor:pointer;
+}
+.dojoxGridDescendingTip{
+	background:url(images/nestedSortArrows.png) no-repeat left center;
+	background-position: -20px;
+	display:block;
+	cursor:pointer;
+}
+.dojoxGridUnsortedTip{
+	background:url(images/nestedSortArrows.png) no-repeat left center;
+	background-position: -39.5px;
+	display:block;
+	cursor:pointer;
+}
+.dojoxGridSortHiddenTip{
+	display:none;
+}
+.dojoxGridSortSeparatorOff{
+	width: 0px;
+	border-right-color: #999999;
+	border-right-style:solid;
+	border-right-width:1px;
+	display: none;
+}
+.dojoxGridSortSeparatorOn{
+	display: block;
+	float: left;
+}
+.dojoxGridSortInProgress{
+	cursor:progress;
+}
+.dojoxGridWidgetHidden{
+	visibility:hidden;
+}
+.dijit_a11y .dojoxGridNestedSort, .dijit_a11y .dojoxGridUnarySort {
+	text-indent: 0;
+	font-size: 14px;
+	
+}
+.dojoxGridFocusBorderBox {
+	position: relative;
+	top: 0;
+	left: 0;
+	width: 0;
+	height: 0;
+}
+.dojoxGridFocusBorder {
+	width: 0px;
+	height: 0px;
+	overflow: hidden;
+	position: absolute;
+	z-index: 999;
+	top: 0;
+	left: 0;
+}
+.dojoxGridSelectedDIV{
+	background-color: #3366CC;
+	position:absolute;
+	opacity:0.2;
+	cursor:move;
+	z-index:999;
+}
+.dj_ie .dojoxGridSelectedDIV{
+	filter: alpha(opacity = 30);
+}
+.dojoxGridBorderDIV{
+	width:3px;
+	background-color: gray;
+	font-size:0em;
+	position:absolute;
+	z-index:9999;
+}
+.dojoxGrid{
+	border:1px solid #DBDBDB;
+}
+.dijit_a11y .dojoxGridRowSelected{
+	opacity:0.4 !important;
+}
+.dijit_a11y .dojoxGridSelectedDIV{
+	opacity:0.4 !important;
+	border:3px solid #000 !important;
+}
+.dijit_a11y .dojoxGridBorderDIV{
+	border:2px solid #000 !important;
+}
+.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;
+}
+.dojoxGridMasterHeader {
+	position: relative;
+}
+.dojoxGridMasterView  {
+	position: relative;
+}
+.dojoxGridMasterMessages {
+	position: relative;
+	padding: 1em;
+	text-align: center;
+	background-color: white;
+}
+.dojoxGridView {
+	position: absolute;
+	overflow: hidden;
+}
+.dojoxGridHeader {
+	position: absolute;
+	overflow: hidden;
+	cursor: default;
+}
+.dojoxGridHeader {
+	background-color: #E8E1CF;
+}
+.dojoxGridHeader table {
+	text-align: center;
+}
+.dojoxGridHeader .dojoxGridCell { 
+	border: 1px solid;
+	border-color: #F6F4EB #ACA899 #ACA899 #F6F4EB;
+	background: url(../../resources/images/grid_dx_gradient.gif) #E8E1CF top repeat-x;
+	padding-bottom: 2px;
+}
+.dojoxGridHeader .dojoxGridCellOver {
+	background-image: none;
+	background-color: white;
+	border-bottom-color: #FEBE47;
+	margin-bottom: 0;
+	padding-bottom: 0;
+	border-bottom-width: 3px;
+}
+.dojoxGridHeader .dojoxGridCellFocus {
+	border: 1px dashed blue;
+}
+.dojoxGridHeader.dojoxGridCellFocus.dojoxGridCellOver {
+	background-image: none;
+	background-color: white;
+	border-bottom-color: #FEBE47;
+	margin-bottom: 0;
+	padding-bottom: 0;
+	border-bottom-width: 3px;
+}
+.dojoxGridArrowButtonNode {
+	display: none;
+	padding-left: 16px;
+}
+.dojoxGridArrowButtonChar {
+	display:inline;
+}
+ 
+.dojoxGridArrowButtonNode:hover {
+        cursor: default;
+}
+.dojoxGridArrowButtonChar:hover {
+        cursor: default;
+}
+.dojoxGridSortUp:hover {
+        cursor: default;
+}
+.dojoxGridSortDown:hover {
+        cursor: default;
+}
+.dijit_a11y .dojoxGridArrowButtonChar {
+	display:inline !important;
+}
+.dojoxGridScrollbox {
+	position: relative;
+	overflow: auto;
+	background-color: white;
+	width: 100%;
+}
+.dojoxGridContent {
+	position: relative;
+	overflow: hidden;
+	 -moz-outline-style: none;
+	outline: none;
+}
+.dojoxGridRowbar { 
+	border: 1px solid;
+	border-color: #F6F4EB #ACA899 #ACA899 #F6F4EB;
+	border-top: none;
+	background: url(../../resources/images/grid_dx_gradient.gif) #E8E1CF top repeat-x;
+}
+.dojoxGridRowbarInner {
+	border-top: 1px solid #F6F4EB;
+}
+.dojoxGridRowbarOver {
+	background-image: none;
+	background-color: white;
+	border-top-color: #FEBE47;
+	border-bottom-color: #FEBE47;
+}
+.dojoxGridRowbarSelected {
+	background-color: #D9E8F9;
+}
+.dojoxGridRow {
+	position: relative;
+	width: 9000em;
+}
+.dojoxGridRow {
+	
+	border: 1px solid #E8E4D8;
+	border-color: #F8F7F1;
+	
+	border-left: none;
+	border-right: none;
+	background-color: white;
+	border-top: none;
+}
+.dojoxGridRowOver {
+	border-top-color: #FEBE47;
+	border-bottom-color: #FEBE47;
+	
+	
+	
+}
+.dojoxGridRowOdd {
+	background-color: #FFFDF3;
+	
+}
+.dojoxGridRowSelected {
+	background-color: #D9E8F9;
+}
+.dojoxGridRowTable {
+	table-layout: fixed;
+	width: 0;
+	empty-cells: show;
+}
+.dj_ie .dojoxGridRowTable {
+	border-collapse: collapse;
+}
+.dojoxGridInvisible {
+	visibility: hidden;
+}		
+.Xdojo-ie .dojoxGridInvisible {
+	display: none;
+}		
+.dojoxGridInvisible td, .dojoxGridHeader .dojoxGridInvisible td {
+	border-top-width: 0;
+	border-bottom-width: 0;
+	padding-top: 0;
+	padding-bottom: 0;
+	height: 0;
+	overflow: hidden;
+}
+.dojoxGridCell {
+	border: 1px solid;
+	border-color: #EBEADB;
+	border-right-color: #D5CDB5;
+	padding: 3px 3px 3px 3px;
+	text-align: left;
+	overflow: hidden;
+}
+.dojoxGridCellFocus {
+	border: 1px dashed blue;
+}
+.dojoxGridCellOver {
+	border: 1px dotted #FEBE47;
+}
+.dojoxGridCellFocus.dojoxGridCellOver {
+	border: 1px dashed green;
+}
+.dojoxGridRowEditing td {
+	background-color: #F4FFF4;
+}
+.dojoxGridRow-inserting td {
+	background-color: #F4FFF4;
+}
+.dojoxGridRow-inflight td {
+	background-color: #F2F7B7;
+}
+.dojoxGridRow-error td {
+	background-color: #F8B8B6;
+}
+.dojoxGridInput, .dojoxGridSelect, .dojoxGridTextarea {
+	margin: 0;
+	padding: 0;
+	border-style: none;
+	width: 100%;
+	font-size: 100%;
+	font-family: inherit;
+}
+.dojoxGridHiddenFocus {
+	position: absolute;
+	top: -1000px;
+	height: 0;
+	width: 0;
+}
+.dijit_a11y .dojoxGridRowbarSelected { 
+	border-top: 1px solid white;
+	border-bottom: 1px dashed black;
+	border-top: 0;
+	background: none;
+}
+.dijit_a11y .dojoxGridRowbarSelected .dojoxGridRowbarInner {
+	border: 0;
+	border-top: 1px solid white;
+}
+.dijit_a11y .dojoxGridRowSelected {
+	border: 1px solid black !important;
+}
+.dojoxGridDndAvatar {
+	font-size: 100%;
+}
+.dojoxGrid .dojoDndItemBefore {
+	border-left-color: red;
+}
+.dojoxGrid .dojoDndItemAfter {
+	border-right-color: red;
+}
+.dijit_a11y .dojoDndItemBefore {
+	border-left: double;
+}
+.dijit_a11y .dojoDndItemAfter {
+	border-right: double;
+}
+.dojoxGridDndAvatarItem	td {
+	border: 1px solid;
+	border-color: #F6F4EB #ACA899 #ACA899 #F6F4EB;
+	background: url(../../resources/images/grid_dx_gradient.gif) #E8E1CF top repeat-x;
+	padding: 0pt;
+	margin: 0pt;
+}
+.dojoxGridDndAvatarItem	td.dojoxGridDndAvatarItemImage {
+	border: 0;
+	border-color: #F6F4EB #ACA899 #ACA899 #F6F4EB;
+	background-color: transparent;
+	padding: 3px;
+	padding-bottom: 2px;
+	margin: 0;
+}
+.dojoDndMove .dojoxGridDndAvatarItem .dojoxGridDndAvatarItemImage {
+	background-image: url(../../../../dojo/resources/images/dndNoMove.png);
+	background-repeat: no-repeat;
+	background-position: center center;
+}
+.dojoDndCopy .dojoxGridDndAvatarItem .dojoxGridDndAvatarItemImage {
+	background-image: url(../../../../dojo/resources/images/dndNoCopy.png);
+	background-repeat: no-repeat;
+	background-position: center center;
+}
+.dojoDndMove .dojoDndAvatarCanDrop .dojoxGridDndAvatarItem .dojoxGridDndAvatarItemImage {
+	background-image: url(../../../../dojo/resources/images/dndMove.png);
+	background-repeat: no-repeat;
+	background-position: center center;
+}
+.dojoDndCopy .dojoDndAvatarCanDrop .dojoxGridDndAvatarItem .dojoxGridDndAvatarItemImage {
+	background-image: url(../../../../dojo/resources/images/dndCopy.png);
+	background-repeat: no-repeat;
+	background-position: center center;
+}
+.dojoxGridColPlaceBottom {
+	background: transparent url(../../resources/images/grid_sort_up.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop {
+	background: transparent url(../../resources/images/grid_sort_down.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop, .dojoxGridColPlaceBottom {
+	font-size:1px;
+	height:6px;
+	z-index:10000;
+	top:0;
+	overflow:hidden;
+	position:absolute;
+	line-height:1px;
+	width:8px;
+}
+.dojoxGridResizeColLine {
+	width: 1px;
+	background-color: #777;
+	position: absolute;
+	cursor: col-resize;
+	z-index:10000;
+}
+.dojoxGridColNoResize, 
+.dojoxGridColNoResize .dojoDndItemOver {
+	cursor: not-allowed !important;
+}
+.dojoxGridColResize, 
+.dojoxGridColResize .dojoDndItemOver,
+.dojoxGridColumnResizing,
+.dojoxGridColumnResizing .dojoDndItemOver,
+.dojoxGridColumnResizing .dojoxGridHeader {
+	cursor: col-resize !important;
+}
+.dojoxGridColPlaceBottom {
+	background: transparent url(../../resources/images/grid_sort_up.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop {
+	background: transparent url(../../resources/images/grid_sort_down.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop, .dojoxGridColPlaceBottom {
+	font-size:1px;
+	height:6px;
+	z-index:10000;
+	top:0;
+	overflow:hidden;
+	position:absolute;
+	line-height:1px;
+	width:8px;
+}
+.dojoxGridResizeColLine {
+	width: 1px;
+	background-color: #777;
+	position: absolute;
+}
+.dojoxGridExpandoCell {
+	vertical-align: top;
+}
+.dojoxGridSummarySpan {
+	visibility: hidden;
+}
+.dojoxGridSummaryRow .dojoxGridSummarySpan,
+.dojoxGridRowCollapsed .dojoxGridSummarySpan {
+	visibility: visible;
+}
+.dojoxGridNoChildren .dojoxGridExpando {
+	visibility: hidden !important;
+	width: 0px !important;
+}
+.tundra .dojoxGrid {
+	background-color: #e9e9e9;
+	font-size: 0.85em; 
+}
+.tundra .dojoxGridMasterMessages {
+	background-color: #fefefe;
+}
+.tundra .dojoxGridLoading, 
+.tundra .dojoxGridError {
+	background-position:left center;
+	background-repeat: no-repeat;
+	padding-left:25px;
+}
+.dijitRtl .tundra .dojoxGridLoading, 
+.dijitRtl .tundra .dojoxGridError,
+.dijitRtl .tundra .dojoxGridNoData {
+	background-position:right;
+	padding-right:25px;
+	padding-left:0px;
+}
+.tundra .dojoxGridLoading {
+	background-image: url(../../../../dijit/themes/tundra/images/loading.gif);
+}
+.tundra .dojoxGridError {
+	background-image: url(../../../../dijit/themes/tundra/images/warning.png);
+}
+.tundra .dojoxGridHeader {
+	background-color:  #e9e9e9;
+}
+.tundra .dojoxGridHeader .dojoxGridCell { 
+	border-width: 1px;
+	padding-bottom: 0px;
+	border-color: transparent #ACA899 #919191 transparent;
+	background: url(../../../../dijit/themes/tundra/images/tabEnabled.png) #e9e9e9 repeat-x top;
+	color: #000 !important;
+}
+.tundra .dojoxGridHeader .dojoxGridCellOver {
+	background: url(../../../../dijit/themes/tundra/images/tabHover.png) #e9e9e9 repeat-x top;
+	color: #000 !important;
+}
+.tundra .dojoxGridHeader .dojoxGridCellFocus {
+	border-color: #ACA899 #919191;
+	border-style: dashed;
+}
+.tundra .dojoxGridArrowButtonChar {
+	float: right;
+	display: none;
+}
+.tundra .dojoxGridArrowButtonNode {
+	display: block !important;
+	padding-left: 0px;
+	float: right;
+	background:url(../../../../dijit/themes/tundra/images/spriteArrows.png) no-repeat left center;
+	width: 7px;
+	height: 1em;
+	margin: 2px 4px 0px 5px;
+}
+.dj_ie6 .tundra .dojoxGridArrowButtonNode {
+	background-image:url(../../../../dijit/themes/tundra/images/spriteArrows.gif);
+	margin-left: 0px;
+}
+.tundra .dojoxGridSortUp .dojoxGridArrowButtonNode {
+	background-position: -21px;
+}
+.dijit_a11y .tundra .dojoxGridArrowButtonNode {
+	display: none !important;
+}
+.tundra .dojoxGridScrollbox {
+	background-color: #fefefe;
+}
+.tundra .dojoxGridRowbar { 
+	border: none;
+	background: url(../../resources/images/tabEnabled_rotated.png) #e9e9e9 repeat-y right;
+	border-right: 1px solid #ccc;
+	padding: 0px;
+}
+.tundra .dojoxGridRowbarInner {
+	border: none;
+	border-bottom: 1px solid #ccc;
+}
+.tundra .dojoxGridRowbarOver {
+	background: url(../../resources/images/tabHover_rotated.png) #e9e9e9 repeat-y right;
+}
+.tundra .dojoxGridRowbarSelected {
+	background: url(../../../../dijit/themes/tundra/images/tabDisabled.png) #D8E8F9 no-repeat center;
+	border-right: 1px solid #ccc;
+}
+.tundra .dojoxGridRow {
+	border: none;
+	background-color: white;
+}
+.tundra .dojoxGridRowOver {
+	border-top-color: #ccc;
+	border-bottom-color: #ccc;
+}
+.tundra .dojoxGridRowOver .dojoxGridCell {
+	background-color: #60a1ea; 
+	color:#fff;
+}
+.tundra .dojoxGridRowOver .dojoxGridCell .dijit {
+	color: #000;
+}
+.tundra .dojoxGridRowOver .dojoxGridCell .dijitDisabled {
+	color: gray;
+}
+.tundra .dojoxGridRowOdd {
+	background-color: #f2f5f9;
+}
+.tundra .dojoxGridRowSelected {
+	background-color: #aec7e3 !important;
+}
+.dijit_a11y .tundra .dojoxGridRowSelected { 
+    background-color: #aec7e3;     
+    border-style: solid;     
+}   
+.tundra .dojoxGridCell {
+	border: 1px dotted #D5CDB5;
+	border-left-color: transparent;
+	border-top-color: transparent;
+}
+.dj_ff2 .tundra .dojoxGridCell {
+	border-left-width: 0px;
+	border-top-width: 0px;
+}
+.dj_ie6 .tundra .dojoxGridCell {
+	border: 1px solid white;
+	border-right: 1px solid #D5CDB5;
+}
+.tundra .dojoxGridCellFocus {
+	border: 1px dashed darkblue !important;
+}
+.tundra .dojoxGridCellOver {
+	border: 1px dotted #a6a6a6;
+}
+.tundra .dojoxGridCellFocus .dojoxGridCellOver {
+	border: 1px dashed darkblue !important;
+}
+.tundra .dojoxGridRowEditing td {
+	
+	background-color: #60a1ea; 
+	
+}
+.tundra .dojoxGridRow-inserting td {
+	background-color: #F4FFF4;
+}
+.tundra .dojoxGridRow-inflight td {
+	background-color: #F2F7B7;
+}
+.tundra .dojoxGridRow-error td {
+	background-color: #F8B8B6;
+}
+.tundra .dojoxGrid .dojoDndItemBefore {
+	border-left-color: #3559ac;
+}
+.tundra .dojoxGrid .dojoDndItemAfter {
+	border-right-color: #3559ac;
+}
+.tundra .dojoxGridExpando {
+	float: left;
+	height: 18px;
+	width: 18px;
+	text-align: center;
+	margin-top: -3px;
+}
+.dijitRtl .tundra .dojoxGridExpando {
+	float: right;
+}
+.tundra .dojoxGridExpandoCell {
+	padding-top: 5px;
+}
+.tundra .dojoxGridExpandoNode {
+	height: 18px;
+	background-image: url(../../../../dijit/themes/tundra/images/treeExpand_plus.gif);
+}
+.tundra .dojoxGridExpandoOpened .dojoxGridExpandoNode {
+	background-image: url(../../../../dijit/themes/tundra/images/treeExpand_minus.gif);		
+}
+.tundra .dojoxGridExpandoLoading .dojoxGridExpandoNode {
+	background-image: url(../../../../dijit/themes/tundra/images/treeExpand_loading.gif);		
+}
+.tundra .dojoxGridTreeModel .dojoxGridNoChildren .dojoxGridExpando {
+	visibility: visible !important;
+	width: 18px !important;
+}
+.tundra .dojoxGridTreeModel .dojoxGridNoChildren .dojoxGridExpandoNode {
+	background-image: url(../../../../dijit/themes/tundra/images/treeExpand_leaf.gif);
+	background-position: -3px;
+}
+.tundra .dojoxGridExpandoNodeInner {
+	visibility: hidden;
+}
+.dijit_a11y .dojoxGridExpandoNodeInner {
+	visibility: visible;
+}
+		
+.tundra .dojoxGridSummaryRow .dojoxGridCell {
+	border-top-color: #999;
+	border-top-style: solid;
+}
+.tundra .dojoxGridSpacerCell,
+.tundra .dojoxGridExpandoCell,
+.tundra .dojoxGridSummaryRow .dojoxGridSpacerCell {
+	border-color: transparent;
+	border-right-color: #D5CDB5;
+}
+.tundra .dojoxGridSummaryRow .dojoxGridTotalCell,
+.tundra .dojoxGridRowCollapsed .dojoxGridExpandoCell,
+.tundra .dojoxGridTreeModel .dojoxGridExpandoCell {
+	border-bottom-color: #D5CDB5;
+}
+.tundra .dojoxGridSubRowAlt {
+	background-color: #F8F8F8;
+}
+.tundra .dojoxGridRowOdd .dojoxGridSubRowAlt {
+	background-color: #EDEFF3;
+}
+.tundra .dojoxGridHeader .dojoxGridCell{
+	background: #fafafa url(../../../../dijit/themes/tundra/images/titleBar.png) repeat-x bottom left;
+	border-top: 1px solid #bfbfbf;
+	
+}
+.tundra .dojoxGridHeader .dojoxGridCell,
+.tundra .dojoxGridCell{
+	padding:0px;
+	
+	
+	
+}
+.dj_ie6 .tundra .dojoxGridMasterView .dojoxGridCellOver{
+	border: 1px dashed #e9e9e9;
+	background:none;
+}
+.dj_ie6 .tundra .dojoxGridHeader .dojoxGridCellOver{
+	border-bottom: none !important;
+	border-right: 1px solid #D5CDB5 !important;
+	border-top: 1px solid #D5CDB5 !important;
+}
+.tundra .dojoxGridRowbarInner {
+	width:20px;
+}
+.tundra .dojoxGridHeader .dojoxGridCellOver .dojoxGridSortNode{
+	cursor:pointer;
+	background: #f8fafd url("../../../../dijit/themes/tundra/images/accordionItemHover.gif") bottom repeat-x;
+}
+.tundra .dojoxGridCell .dojoxGridSelectRegionHover{
+	border-color:		#a5beda; 
+	border-bottom-color:#5c7590; 
+	cursor:pointer;
+	color:#243C5F;
+	background: #f8fafd url("../../../../dijit/themes/tundra/images/accordionItemHover.gif") bottom repeat-x;
+}
+.tundra .dojoxGridCell .dojoxGridSortHover{
+	border-color:		#a5beda; 
+	border-bottom-color:#5c7590; 
+	color:#243C5F;
+	background: #f8fafd url("../../../../dijit/themes/tundra/images/accordionItemHover.gif") bottom repeat-x;
+	cursor:pointer;
+}
+.tundra .dojoxGridSortWrapper{
+	background: #fafafa url(../../../../dijit/themes/tundra/images/titleBar.png) repeat-x bottom left;
+}
+.dj_webkit .tundra .dojoxGridCell,
+.dj_webkit .tundra .dojoxGridCellFocus,
+.dj_webkit .tundra .dojoxGridHeader .dojoxGridCell .dojoxGridHeaderCellSelectRegion,
+.dj_webkit .tundra .dojoxGridHeader .dojoxGridCell .dojoxGridUnarySortWrapper,
+.dj_webkit .tundra .dojoxGridHeader .dojoxGridCell .dojoxGridNestedSortWrapper,
+.dj_webkit .tundra .dojoxGridHeader .dojoxGridCell .dojoxGridSortRoot{
+	outline: none;
+}
+.tundra .dojoxGridHeader .dojoxGridRowTable .dojoxGridCellFocus
+ {
+	border-color: darkblue !important;
+	border-style: dashed !important;
+	border-width: 1px !important;
+}
+.tundra .dojoxGridFocusBorder {
+	border-top: 1px dashed darkblue;
+	border-left: 1px dashed darkblue;
+}
+.tundra .dojoxGridSelectedDIV{
+	background-color: #3366CC;
+}
+.dj_ie .tundra .dojoxGridSelectedDIV{
+	filter: alpha(opacity = 30);
+}
+.tundra .dojoxGridBorderDIV{
+	background-color: gray;
+}
diff --git a/dojox/grid/resources/Expando.html b/dojox/grid/resources/Expando.html
new file mode 100644
index 0000000..c7e7c22
--- /dev/null
+++ b/dojox/grid/resources/Expando.html
@@ -0,0 +1,5 @@
+<div class="dojoxGridExpando"
+	><div class="dojoxGridExpandoNode" dojoAttachEvent="onclick:onToggle"
+		><div class="dojoxGridExpandoNodeInner" dojoAttachPoint="expandoInner"></div
+	></div
+></div>
diff --git a/dojox/grid/resources/Grid.css b/dojox/grid/resources/Grid.css
index 058edf9..d419139 100644
--- a/dojox/grid/resources/Grid.css
+++ b/dojox/grid/resources/Grid.css
@@ -32,6 +32,7 @@
 .dojoxGridHeader {
 	position: absolute;
 	overflow: hidden;
+	cursor: default;
 }
 .dojoxGridHeader {
 	background-color: #E8E1CF;
@@ -232,6 +233,12 @@
 .dojoxGrid .dojoDndItemAfter {
 	border-right-color: red;
 }
+.dijit_a11y .dojoDndItemBefore {
+	border-left: double;
+}
+.dijit_a11y .dojoDndItemAfter {
+	border-right: double;
+}
 .dojoxGridDndAvatarItem	td {
 	border: 1px solid;
 	border-color: #F6F4EB #ACA899 #ACA899 #F6F4EB;
@@ -267,3 +274,72 @@
 	background-repeat: no-repeat;
 	background-position: center center;
 }
+.dojoxGridColPlaceBottom {
+	background: transparent url(images/grid_sort_up.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop {
+	background: transparent url(images/grid_sort_down.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop, .dojoxGridColPlaceBottom {
+	font-size:1px;
+	height:6px;
+	z-index:10000;
+	top:0;
+	overflow:hidden;
+	position:absolute;
+	line-height:1px;
+	width:8px;
+}
+.dojoxGridResizeColLine {
+	width: 1px;
+	background-color: #777;
+	position: absolute;
+	cursor: col-resize;
+	z-index:10000;
+}
+.dojoxGridColNoResize, 
+.dojoxGridColNoResize .dojoDndItemOver {
+	cursor: not-allowed !important;
+}
+.dojoxGridColResize, 
+.dojoxGridColResize .dojoDndItemOver,
+.dojoxGridColumnResizing,
+.dojoxGridColumnResizing .dojoDndItemOver,
+.dojoxGridColumnResizing .dojoxGridHeader {
+	cursor: col-resize !important;
+}
+.dojoxGridColPlaceBottom {
+	background: transparent url(images/grid_sort_up.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop {
+	background: transparent url(images/grid_sort_down.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop, .dojoxGridColPlaceBottom {
+	font-size:1px;
+	height:6px;
+	z-index:10000;
+	top:0;
+	overflow:hidden;
+	position:absolute;
+	line-height:1px;
+	width:8px;
+}
+.dojoxGridResizeColLine {
+	width: 1px;
+	background-color: #777;
+	position: absolute;
+}
+.dojoxGridExpandoCell {
+	vertical-align: top;
+}
+.dojoxGridSummarySpan {
+	visibility: hidden;
+}
+.dojoxGridSummaryRow .dojoxGridSummarySpan,
+.dojoxGridRowCollapsed .dojoxGridSummarySpan {
+	visibility: visible;
+}
+.dojoxGridNoChildren .dojoxGridExpando {
+	visibility: hidden !important;
+	width: 0px !important;
+}
diff --git a/dojox/grid/resources/Grid_rtl.css b/dojox/grid/resources/Grid_rtl.css
index d73877b..fb8cbea 100644
--- a/dojox/grid/resources/Grid_rtl.css
+++ b/dojox/grid/resources/Grid_rtl.css
@@ -1,11 +1,6 @@
-.dijitRtl .dojoxGridHeader table {
-}
 .dj_ie .dijitRtl .dojoxGridHeader table {
 	float:none;
 }
-.dijitRtl .dojoxGridContent {
-	float:left;
-}
 .dijitRtl .dojoxGridCell {
 	text-align:right;
 }
diff --git a/dojox/grid/resources/_Grid.html b/dojox/grid/resources/_Grid.html
index ac655f1..911862b 100644
--- a/dojox/grid/resources/_Grid.html
+++ b/dojox/grid/resources/_Grid.html
@@ -1,5 +1,5 @@
 <div class="dojoxGrid" hidefocus="hidefocus" wairole="grid" dojoAttachEvent="onmouseout:_mouseOut">
-	<div class="dojoxGridMasterHeader" dojoAttachPoint="viewsHeaderNode" tabindex="-1" wairole="presentation"></div>
+	<div class="dojoxGridMasterHeader" dojoAttachPoint="viewsHeaderNode" wairole="presentation"></div>
 	<div class="dojoxGridMasterView" dojoAttachPoint="viewsNode" wairole="presentation"></div>
 	<div class="dojoxGridMasterMessages" style="display: none;" dojoAttachPoint="messagesNode"></div>
 	<span dojoAttachPoint="lastFocusNode" tabindex="0"></span>
diff --git a/dojox/grid/resources/nihiloGrid.css b/dojox/grid/resources/nihiloGrid.css
index b5da8d9..7b60316 100644
--- a/dojox/grid/resources/nihiloGrid.css
+++ b/dojox/grid/resources/nihiloGrid.css
@@ -32,6 +32,7 @@
 .dojoxGridHeader {
 	position: absolute;
 	overflow: hidden;
+	cursor: default;
 }
 .dojoxGridHeader {
 	background-color: #E8E1CF;
@@ -232,6 +233,12 @@
 .dojoxGrid .dojoDndItemAfter {
 	border-right-color: red;
 }
+.dijit_a11y .dojoDndItemBefore {
+	border-left: double;
+}
+.dijit_a11y .dojoDndItemAfter {
+	border-right: double;
+}
 .dojoxGridDndAvatarItem	td {
 	border: 1px solid;
 	border-color: #F6F4EB #ACA899 #ACA899 #F6F4EB;
@@ -267,6 +274,75 @@
 	background-repeat: no-repeat;
 	background-position: center center;
 }
+.dojoxGridColPlaceBottom {
+	background: transparent url(images/grid_sort_up.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop {
+	background: transparent url(images/grid_sort_down.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop, .dojoxGridColPlaceBottom {
+	font-size:1px;
+	height:6px;
+	z-index:10000;
+	top:0;
+	overflow:hidden;
+	position:absolute;
+	line-height:1px;
+	width:8px;
+}
+.dojoxGridResizeColLine {
+	width: 1px;
+	background-color: #777;
+	position: absolute;
+	cursor: col-resize;
+	z-index:10000;
+}
+.dojoxGridColNoResize, 
+.dojoxGridColNoResize .dojoDndItemOver {
+	cursor: not-allowed !important;
+}
+.dojoxGridColResize, 
+.dojoxGridColResize .dojoDndItemOver,
+.dojoxGridColumnResizing,
+.dojoxGridColumnResizing .dojoDndItemOver,
+.dojoxGridColumnResizing .dojoxGridHeader {
+	cursor: col-resize !important;
+}
+.dojoxGridColPlaceBottom {
+	background: transparent url(images/grid_sort_up.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop {
+	background: transparent url(images/grid_sort_down.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop, .dojoxGridColPlaceBottom {
+	font-size:1px;
+	height:6px;
+	z-index:10000;
+	top:0;
+	overflow:hidden;
+	position:absolute;
+	line-height:1px;
+	width:8px;
+}
+.dojoxGridResizeColLine {
+	width: 1px;
+	background-color: #777;
+	position: absolute;
+}
+.dojoxGridExpandoCell {
+	vertical-align: top;
+}
+.dojoxGridSummarySpan {
+	visibility: hidden;
+}
+.dojoxGridSummaryRow .dojoxGridSummarySpan,
+.dojoxGridRowCollapsed .dojoxGridSummarySpan {
+	visibility: visible;
+}
+.dojoxGridNoChildren .dojoxGridExpando {
+	visibility: hidden !important;
+	width: 0px !important;
+}
 .nihilo .dojoxGrid {
 	background-color: #e9e9e9;
 	font-size: 0.85em; 
@@ -331,7 +407,7 @@
 	background: url(../../../dijit/themes/nihilo/images/titleBarActive.png) #e9e9e9 repeat-y right;
 }
 .nihilo .dojoxGridRowbarSelected {
-	background: #D9E8F9 url(../../../dijit/themes/nihilo/images/titleBar.png) #ddd no-repeat center;
+	background: url(../../../dijit/themes/nihilo/images/titleBar.png) #D9E8F9 no-repeat center;
 	border-right: 1px solid #ccc;
 }
 .nihilo .dojoxGridRow {
@@ -397,3 +473,61 @@
 .nihilo .dojoxGrid .dojoDndItemAfter {
 	border-right-color: #ffe284;
 }
+.nihilo .dojoxGridExpando {
+	float: left;
+	height: 18px;
+	width: 18px;
+	text-align: center;
+	margin-top: -3px;
+}
+.dijitRtl .nihilo .dojoxGridExpando {
+	float: right;
+}
+.nihilo .dojoxGridExpandoCell {
+	padding-top: 5px;
+}
+.nihilo .dojoxGridExpandoNode {
+	height: 18px;
+	background-image: url('../../../dijit/themes/nihilo/images/spriteTree.gif');
+}
+.nihilo .dojoxGridExpandoOpened .dojoxGridExpandoNode {
+	background: url('../../../dijit/themes/nihilo/images/spriteTree.gif') no-repeat -18px top;
+}
+.nihilo .dojoxGridExpandoLoading .dojoxGridExpandoNode {
+	background: url('../../../dijit/themes/nihilo/images/treeExpand_loading.gif');
+}
+.nihilo .dojoxGridTreeModel .dojoxGridNoChildren .dojoxGridExpando {
+	visibility: visible !important;
+	width: 18px !important;
+}
+.nihilo .dojoxGridTreeModel .dojoxGridNoChildren .dojoxGridExpandoNode {
+	background: url('../../../dijit/themes/nihilo/images/spriteTree.gif') no-repeat -36px top;
+}
+.nihilo .dojoxGridExpandoNodeInner {
+	visibility: hidden;
+}
+.dijit_a11y .dojoxGridExpandoNodeInner {
+	visibility: visible;
+}
+		
+.nihilo .dojoxGridSummaryRow .dojoxGridCell {
+	border-top-color: #999;
+	border-top-style: solid;
+}
+.nihilo .dojoxGridSpacerCell,
+.nihilo .dojoxGridExpandoCell,
+.nihilo .dojoxGridSummaryRow .dojoxGridSpacerCell {
+	border-color: transparent;
+	border-right-color: #D5CDB5;
+}
+.nihilo .dojoxGridSummaryRow .dojoxGridTotalCell,
+.nihilo .dojoxGridRowCollapsed .dojoxGridExpandoCell,
+.nihilo .dojoxGridTreeModel .dojoxGridExpandoCell {
+	border-bottom-color: #D5CDB5;
+}
+.nihilo .dojoxGridSubRowAlt {
+	background-color: #F8F8F8;
+}
+.nihilo .dojoxGridRowOdd .dojoxGridSubRowAlt {
+	background-color: #EDEFF3;
+}
diff --git a/dojox/grid/resources/soriaGrid.css b/dojox/grid/resources/soriaGrid.css
index 48ff246..10159c9 100644
--- a/dojox/grid/resources/soriaGrid.css
+++ b/dojox/grid/resources/soriaGrid.css
@@ -32,6 +32,7 @@
 .dojoxGridHeader {
 	position: absolute;
 	overflow: hidden;
+	cursor: default;
 }
 .dojoxGridHeader {
 	background-color: #E8E1CF;
@@ -232,6 +233,12 @@
 .dojoxGrid .dojoDndItemAfter {
 	border-right-color: red;
 }
+.dijit_a11y .dojoDndItemBefore {
+	border-left: double;
+}
+.dijit_a11y .dojoDndItemAfter {
+	border-right: double;
+}
 .dojoxGridDndAvatarItem	td {
 	border: 1px solid;
 	border-color: #F6F4EB #ACA899 #ACA899 #F6F4EB;
@@ -267,6 +274,75 @@
 	background-repeat: no-repeat;
 	background-position: center center;
 }
+.dojoxGridColPlaceBottom {
+	background: transparent url(images/grid_sort_up.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop {
+	background: transparent url(images/grid_sort_down.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop, .dojoxGridColPlaceBottom {
+	font-size:1px;
+	height:6px;
+	z-index:10000;
+	top:0;
+	overflow:hidden;
+	position:absolute;
+	line-height:1px;
+	width:8px;
+}
+.dojoxGridResizeColLine {
+	width: 1px;
+	background-color: #777;
+	position: absolute;
+	cursor: col-resize;
+	z-index:10000;
+}
+.dojoxGridColNoResize, 
+.dojoxGridColNoResize .dojoDndItemOver {
+	cursor: not-allowed !important;
+}
+.dojoxGridColResize, 
+.dojoxGridColResize .dojoDndItemOver,
+.dojoxGridColumnResizing,
+.dojoxGridColumnResizing .dojoDndItemOver,
+.dojoxGridColumnResizing .dojoxGridHeader {
+	cursor: col-resize !important;
+}
+.dojoxGridColPlaceBottom {
+	background: transparent url(images/grid_sort_up.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop {
+	background: transparent url(images/grid_sort_down.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop, .dojoxGridColPlaceBottom {
+	font-size:1px;
+	height:6px;
+	z-index:10000;
+	top:0;
+	overflow:hidden;
+	position:absolute;
+	line-height:1px;
+	width:8px;
+}
+.dojoxGridResizeColLine {
+	width: 1px;
+	background-color: #777;
+	position: absolute;
+}
+.dojoxGridExpandoCell {
+	vertical-align: top;
+}
+.dojoxGridSummarySpan {
+	visibility: hidden;
+}
+.dojoxGridSummaryRow .dojoxGridSummarySpan,
+.dojoxGridRowCollapsed .dojoxGridSummarySpan {
+	visibility: visible;
+}
+.dojoxGridNoChildren .dojoxGridExpando {
+	visibility: hidden !important;
+	width: 0px !important;
+}
 .soria .dojoxGrid {
 	background-color: #e9e9e9;
 	font-size: 0.85em; 
@@ -331,7 +407,7 @@
 	background: url(../../../dijit/themes/soria/images/titleBarActive.png) #e9e9e9 repeat-y right;
 }
 .soria .dojoxGridRowbarSelected {
-	background: #D9E8F9 url(../../../dijit/themes/soria/images/titleBar.png) #ddd no-repeat center;
+	background: url(../../../dijit/themes/soria/images/titleBar.png) #D9E8F9 no-repeat center;
 	border-right: 1px solid #ccc;
 }
 .soria .dojoxGridRow {
@@ -398,3 +474,61 @@
 .soria .dojoxGrid .dojoDndItemAfter {
 	border-right-color: #4B5AAA;
 }
+.soria .dojoxGridExpando {
+	float: left;
+	height: 18px;
+	width: 18px;
+	text-align: center;
+	margin-top: -3px;
+}
+.dijitRtl .soria .dojoxGridExpando {
+	float: right;
+}
+.soria .dojoxGridExpandoCell {
+	padding-top: 5px;
+}
+.soria .dojoxGridExpandoNode {
+	height: 18px;
+	background-image: url('../../../dijit/themes/soria/images/spriteTree.gif');
+}
+.soria .dojoxGridExpandoOpened .dojoxGridExpandoNode {
+	background: url('../../../dijit/themes/soria/images/spriteTree.gif') no-repeat -18px top;
+}
+.soria .dojoxGridExpandoLoading .dojoxGridExpandoNode {
+	background: url('../../../dijit/themes/soria/images/treeExpand_loading.gif');	
+}
+.soria .dojoxGridTreeModel .dojoxGridNoChildren .dojoxGridExpando {
+	visibility: visible !important;
+	width: 18px !important;
+}
+.soria .dojoxGridTreeModel .dojoxGridNoChildren .dojoxGridExpandoNode {
+	background: url('../../../dijit/themes/soria/images/spriteTree.gif') no-repeat -36px top;
+}
+.soria .dojoxGridExpandoNodeInner {
+	visibility: hidden;
+}
+.dijit_a11y .dojoxGridExpandoNodeInner {
+	visibility: visible;
+}
+		
+.soria .dojoxGridSummaryRow .dojoxGridCell {
+	border-top-color: #999;
+	border-top-style: solid;
+}
+.soria .dojoxGridSpacerCell,
+.soria .dojoxGridExpandoCell,
+.soria .dojoxGridSummaryRow .dojoxGridSpacerCell {
+	border-color: transparent;
+	border-right-color: #D5CDB5;
+}
+.soria .dojoxGridSummaryRow .dojoxGridTotalCell,
+.soria .dojoxGridRowCollapsed .dojoxGridExpandoCell,
+.soria .dojoxGridTreeModel .dojoxGridExpandoCell {
+	border-bottom-color: #D5CDB5;
+}
+.soria .dojoxGridSubRowAlt {
+	background-color: #F8F8F8;
+}
+.soria .dojoxGridRowOdd .dojoxGridSubRowAlt {
+	background-color: #EDEFF3;
+}
diff --git a/dojox/grid/resources/tundraGrid.css b/dojox/grid/resources/tundraGrid.css
index 6812416..0b42e69 100644
--- a/dojox/grid/resources/tundraGrid.css
+++ b/dojox/grid/resources/tundraGrid.css
@@ -32,6 +32,7 @@
 .dojoxGridHeader {
 	position: absolute;
 	overflow: hidden;
+	cursor: default;
 }
 .dojoxGridHeader {
 	background-color: #E8E1CF;
@@ -232,6 +233,12 @@
 .dojoxGrid .dojoDndItemAfter {
 	border-right-color: red;
 }
+.dijit_a11y .dojoDndItemBefore {
+	border-left: double;
+}
+.dijit_a11y .dojoDndItemAfter {
+	border-right: double;
+}
 .dojoxGridDndAvatarItem	td {
 	border: 1px solid;
 	border-color: #F6F4EB #ACA899 #ACA899 #F6F4EB;
@@ -267,6 +274,75 @@
 	background-repeat: no-repeat;
 	background-position: center center;
 }
+.dojoxGridColPlaceBottom {
+	background: transparent url(images/grid_sort_up.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop {
+	background: transparent url(images/grid_sort_down.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop, .dojoxGridColPlaceBottom {
+	font-size:1px;
+	height:6px;
+	z-index:10000;
+	top:0;
+	overflow:hidden;
+	position:absolute;
+	line-height:1px;
+	width:8px;
+}
+.dojoxGridResizeColLine {
+	width: 1px;
+	background-color: #777;
+	position: absolute;
+	cursor: col-resize;
+	z-index:10000;
+}
+.dojoxGridColNoResize, 
+.dojoxGridColNoResize .dojoDndItemOver {
+	cursor: not-allowed !important;
+}
+.dojoxGridColResize, 
+.dojoxGridColResize .dojoDndItemOver,
+.dojoxGridColumnResizing,
+.dojoxGridColumnResizing .dojoDndItemOver,
+.dojoxGridColumnResizing .dojoxGridHeader {
+	cursor: col-resize !important;
+}
+.dojoxGridColPlaceBottom {
+	background: transparent url(images/grid_sort_up.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop {
+	background: transparent url(images/grid_sort_down.gif) no-repeat scroll left top;
+}
+.dojoxGridColPlaceTop, .dojoxGridColPlaceBottom {
+	font-size:1px;
+	height:6px;
+	z-index:10000;
+	top:0;
+	overflow:hidden;
+	position:absolute;
+	line-height:1px;
+	width:8px;
+}
+.dojoxGridResizeColLine {
+	width: 1px;
+	background-color: #777;
+	position: absolute;
+}
+.dojoxGridExpandoCell {
+	vertical-align: top;
+}
+.dojoxGridSummarySpan {
+	visibility: hidden;
+}
+.dojoxGridSummaryRow .dojoxGridSummarySpan,
+.dojoxGridRowCollapsed .dojoxGridSummarySpan {
+	visibility: visible;
+}
+.dojoxGridNoChildren .dojoxGridExpando {
+	visibility: hidden !important;
+	width: 0px !important;
+}
 .tundra .dojoxGrid {
 	background-color: #e9e9e9;
 	font-size: 0.85em; 
@@ -309,7 +385,7 @@
 }
 .tundra .dojoxGridHeader .dojoxGridCellFocus {
 	border-color: #ACA899 #919191;
-	border-style: dashed;	
+	border-style: dashed;
 }
 .tundra .dojoxGridArrowButtonChar {
 	float: right;
@@ -351,7 +427,7 @@
 	background: url(images/tabHover_rotated.png) #e9e9e9 repeat-y right;
 }
 .tundra .dojoxGridRowbarSelected {
-	background: #D8E8F9 url(../../../dijit/themes/tundra/images/tabDisabled.png) #ddd no-repeat center;
+	background: url(../../../dijit/themes/tundra/images/tabDisabled.png) #D8E8F9 no-repeat center;
 	border-right: 1px solid #ccc;
 }
 .tundra .dojoxGridRow {
@@ -369,11 +445,14 @@
 .tundra .dojoxGridRowOver .dojoxGridCell .dijit {
 	color: #000;
 }
+.tundra .dojoxGridRowOver .dojoxGridCell .dijitDisabled {
+	color: gray;
+}
 .tundra .dojoxGridRowOdd {
 	background-color: #f2f5f9;
 }
 .tundra .dojoxGridRowSelected {
-	background-color: #aec7e3;
+	background-color: #aec7e3 !important;
 }
 .dijit_a11y .tundra .dojoxGridRowSelected { 
     background-color: #aec7e3;     
@@ -393,13 +472,13 @@
 	border-right: 1px solid #D5CDB5;
 }
 .tundra .dojoxGridCellFocus {
-	border: 1px dashed darkblue;
+	border: 1px dashed darkblue !important;
 }
 .tundra .dojoxGridCellOver {
 	border: 1px dotted #a6a6a6;
 }
-.tundra .dojoxGridCellFocus.dojoxGridCellOver {
-	border: 1px dashed darkblue;
+.tundra .dojoxGridCellFocus .dojoxGridCellOver {
+	border: 1px dashed darkblue !important;
 }
 .tundra .dojoxGridRowEditing td {
 	
@@ -421,3 +500,62 @@
 .tundra .dojoxGrid .dojoDndItemAfter {
 	border-right-color: #3559ac;
 }
+.tundra .dojoxGridExpando {
+	float: left;
+	height: 18px;
+	width: 18px;
+	text-align: center;
+	margin-top: -3px;
+}
+.dijitRtl .tundra .dojoxGridExpando {
+	float: right;
+}
+.tundra .dojoxGridExpandoCell {
+	padding-top: 5px;
+}
+.tundra .dojoxGridExpandoNode {
+	height: 18px;
+	background-image: url('../../../dijit/themes/tundra/images/treeExpand_plus.gif');
+}
+.tundra .dojoxGridExpandoOpened .dojoxGridExpandoNode {
+	background-image: url('../../../dijit/themes/tundra/images/treeExpand_minus.gif');		
+}
+.tundra .dojoxGridExpandoLoading .dojoxGridExpandoNode {
+	background-image: url('../../../dijit/themes/tundra/images/treeExpand_loading.gif');		
+}
+.tundra .dojoxGridTreeModel .dojoxGridNoChildren .dojoxGridExpando {
+	visibility: visible !important;
+	width: 18px !important;
+}
+.tundra .dojoxGridTreeModel .dojoxGridNoChildren .dojoxGridExpandoNode {
+	background-image: url('../../../dijit/themes/tundra/images/treeExpand_leaf.gif');
+	background-position: -3px;
+}
+.tundra .dojoxGridExpandoNodeInner {
+	visibility: hidden;
+}
+.dijit_a11y .dojoxGridExpandoNodeInner {
+	visibility: visible;
+}
+		
+.tundra .dojoxGridSummaryRow .dojoxGridCell {
+	border-top-color: #999;
+	border-top-style: solid;
+}
+.tundra .dojoxGridSpacerCell,
+.tundra .dojoxGridExpandoCell,
+.tundra .dojoxGridSummaryRow .dojoxGridSpacerCell {
+	border-color: transparent;
+	border-right-color: #D5CDB5;
+}
+.tundra .dojoxGridSummaryRow .dojoxGridTotalCell,
+.tundra .dojoxGridRowCollapsed .dojoxGridExpandoCell,
+.tundra .dojoxGridTreeModel .dojoxGridExpandoCell {
+	border-bottom-color: #D5CDB5;
+}
+.tundra .dojoxGridSubRowAlt {
+	background-color: #F8F8F8;
+}
+.tundra .dojoxGridRowOdd .dojoxGridSubRowAlt {
+	background-color: #EDEFF3;
+}
diff --git a/dojox/grid/util.js b/dojox/grid/util.js
index 449d943..bbf9527 100644
--- a/dojox/grid/util.js
+++ b/dojox/grid/util.js
@@ -13,53 +13,54 @@ var _1=dojox.grid.util;
 _1.na="...";
 _1.rowIndexTag="gridRowIndex";
 _1.gridViewTag="gridView";
-_1.fire=function(ob,ev,_4){
+_1.fire=function(ob,ev,_2){
 var fn=ob&&ev&&ob[ev];
-return fn&&(_4?fn.apply(ob,_4):ob[ev]());
+return fn&&(_2?fn.apply(ob,_2):ob[ev]());
 };
-_1.setStyleHeightPx=function(_6,_7){
-if(_7>=0){
-var s=_6.style;
-var v=_7+"px";
-if(_6&&s["height"]!=v){
+_1.setStyleHeightPx=function(_3,_4){
+if(_4>=0){
+var s=_3.style;
+var v=_4+"px";
+if(_3&&s["height"]!=v){
 s["height"]=v;
 }
 }
 };
 _1.mouseEvents=["mouseover","mouseout","mousedown","mouseup","click","dblclick","contextmenu"];
 _1.keyEvents=["keyup","keydown","keypress"];
-_1.funnelEvents=function(_a,_b,_c,_d){
-var _e=(_d?_d:_1.mouseEvents.concat(_1.keyEvents));
-for(var i=0,l=_e.length;i<l;i++){
-_b.connect(_a,"on"+_e[i],_c);
+_1.funnelEvents=function(_5,_6,_7,_8){
+var _9=(_8?_8:_1.mouseEvents.concat(_1.keyEvents));
+for(var i=0,l=_9.length;i<l;i++){
+_6.connect(_5,"on"+_9[i],_7);
 }
-},_1.removeNode=function(_11){
-_11=dojo.byId(_11);
-_11&&_11.parentNode&&_11.parentNode.removeChild(_11);
-return _11;
 };
-_1.arrayCompare=function(inA,inB){
-for(var i=0,l=inA.length;i<l;i++){
-if(inA[i]!=inB[i]){
+_1.removeNode=function(_a){
+_a=dojo.byId(_a);
+_a&&_a.parentNode&&_a.parentNode.removeChild(_a);
+return _a;
+};
+_1.arrayCompare=function(_b,_c){
+for(var i=0,l=_b.length;i<l;i++){
+if(_b[i]!=_c[i]){
 return false;
 }
 }
-return (inA.length==inB.length);
+return (_b.length==_c.length);
 };
-_1.arrayInsert=function(_16,_17,_18){
-if(_16.length<=_17){
-_16[_17]=_18;
+_1.arrayInsert=function(_d,_e,_f){
+if(_d.length<=_e){
+_d[_e]=_f;
 }else{
-_16.splice(_17,0,_18);
+_d.splice(_e,0,_f);
 }
 };
-_1.arrayRemove=function(_19,_1a){
-_19.splice(_1a,1);
+_1.arrayRemove=function(_10,_11){
+_10.splice(_11,1);
 };
-_1.arraySwap=function(_1b,inI,inJ){
-var _1e=_1b[inI];
-_1b[inI]=_1b[inJ];
-_1b[inJ]=_1e;
+_1.arraySwap=function(_12,inI,inJ){
+var _13=_12[inI];
+_12[inI]=_12[inJ];
+_12[inJ]=_13;
 };
 })();
 }
diff --git a/dojox/help/_base.js b/dojox/help/_base.js
index 3fb4c4f..c4a97a5 100644
--- a/dojox/help/_base.js
+++ b/dojox/help/_base.js
@@ -21,21 +21,21 @@ if(_2){
 if(!dojo.isArray(_2)){
 _2=[_2];
 }
-for(var i=0,_8;_8=_2[i];i++){
-_6=_8;
-if(dojo.isString(_8)){
-_8=dojo.getObject(_8);
-if(!_8){
+for(var i=0,_7;_7=_2[i];i++){
+_6=_7;
+if(dojo.isString(_7)){
+_7=dojo.getObject(_7);
+if(!_7){
 continue;
 }
 }else{
-if(dojo.isObject(_8)){
-_6=_8.__name__;
+if(dojo.isObject(_7)){
+_6=_7.__name__;
 }else{
 continue;
 }
 }
-_4.push(_8);
+_4.push(_7);
 if(_6){
 _6=_6.split(".")[0];
 if(!_5[_6]&&dojo.indexOf(dojox.help._namespaces,_6)==-1){
@@ -47,40 +47,40 @@ _5[_6]=true;
 }
 if(!_4.length){
 _4.push({__name__:"window"});
-dojo.forEach(dojox.help._namespaces,function(_9){
-_5[_9]=true;
+dojo.forEach(dojox.help._namespaces,function(_8){
+_5[_8]=true;
 });
 }
-var _a=_1.toLowerCase();
-var _b=[];
+var _9=_1.toLowerCase();
+var _a=[];
 out:
-for(var i=0,_8;_8=_4[i];i++){
-var _c=_8.__name__||"";
-var _d=dojo.some(_4,function(_e){
-_e=_e.__name__||"";
-return (_c.indexOf(_e+".")==0);
+for(var i=0,_7;_7=_4[i];i++){
+var _b=_7.__name__||"";
+var _c=dojo.some(_4,function(_d){
+_d=_d.__name__||"";
+return (_b.indexOf(_d+".")==0);
 });
-if(_c&&!_d){
-_6=_c.split(".")[0];
-var _f=[];
-if(_c=="window"){
+if(_b&&!_c){
+_6=_b.split(".")[0];
+var _e=[];
+if(_b=="window"){
 for(_6 in dojox.help._names){
 if(dojo.isArray(dojox.help._names[_6])){
-_f=_f.concat(dojox.help._names[_6]);
+_e=_e.concat(dojox.help._names[_6]);
 }
 }
 }else{
-_f=dojox.help._names[_6];
+_e=dojox.help._names[_6];
 }
-for(var j=0,_11;_11=_f[j];j++){
-if((_c=="window"||_11.indexOf(_c+".")==0)&&_11.toLowerCase().indexOf(_a)!=-1){
-if(_11.slice(-10)==".prototype"){
+for(var j=0,_f;_f=_e[j];j++){
+if((_b=="window"||_f.indexOf(_b+".")==0)&&_f.toLowerCase().indexOf(_9)!=-1){
+if(_f.slice(-10)==".prototype"){
 continue;
 }
-var obj=dojo.getObject(_11);
+var obj=dojo.getObject(_f);
 if(obj){
-_b.push([_11,obj]);
-if(_b.length==_3){
+_a.push([_f,obj]);
+if(_a.length==_3){
 break out;
 }
 }
@@ -88,36 +88,36 @@ break out;
 }
 }
 }
-dojox.help._displayLocated(_b);
-if(!+dojo.isFF){
+dojox.help._displayLocated(_a);
+if(!dojo.isMoz){
 return "";
 }
-},refresh:function(_13,_14){
+},refresh:function(_10,_11){
 if(arguments.length<2){
-_14=true;
+_11=true;
 }
-dojox.help._recurse(_13,_14);
-},noConflict:function(_15){
+dojox.help._recurse(_10,_11);
+},noConflict:function(_12){
 if(arguments.length){
-return dojox.help._noConflict(_15);
+return dojox.help._noConflict(_12);
 }else{
 while(dojox.help._overrides.length){
-var _16=dojox.help._overrides.pop();
-var _17=_16[0];
-var key=_16[1];
-var _19=_17[key];
-_17[key]=dojox.help._noConflict(_19);
+var _13=dojox.help._overrides.pop();
+var _14=_13[0];
+var key=_13[1];
+var _15=_14[key];
+_14[key]=dojox.help._noConflict(_15);
 }
 }
-},init:function(_1a,_1b){
-if(_1a){
-dojox.help._namespaces.concat(_1a);
+},init:function(_16,_17){
+if(_16){
+dojox.help._namespaces.concat(_16);
 }
 dojo.addOnLoad(function(){
-dojo.require=(function(_1c){
+dojo.require=(function(_18){
 return function(){
 dojox.help.noConflict();
-_1c.apply(dojo,arguments);
+_18.apply(dojo,arguments);
 if(dojox.help._timer){
 clearTimeout(dojox.help._timer);
 }
@@ -131,78 +131,78 @@ dojox.help._timer=false;
 })(dojo.require);
 dojox.help._recurse();
 });
-},_noConflict:function(_1d){
-if(_1d instanceof String){
-return _1d.toString();
+},_noConflict:function(_19){
+if(_19 instanceof String){
+return _19.toString();
 }else{
-if(_1d instanceof Number){
-return +_1d;
+if(_19 instanceof Number){
+return +_19;
 }else{
-if(_1d instanceof Boolean){
-return (_1d==true);
+if(_19 instanceof Boolean){
+return (_19==true);
 }else{
-if(dojo.isObject(_1d)){
-delete _1d.__name__;
-delete _1d.help;
+if(dojo.isObject(_19)){
+delete _19.__name__;
+delete _19.help;
 }
 }
 }
 }
-return _1d;
-},_namespaces:["dojo","dojox","dijit","djConfig"],_rpc:new dojox.rpc.Service(dojo.moduleUrl("dojox.rpc.SMDLibrary","dojo-api.smd")),_attributes:["summary","type","returns","parameters"],_clean:function(_1e){
+return _19;
+},_namespaces:["dojo","dojox","dijit","djConfig"],_rpc:new dojox.rpc.Service(dojo.moduleUrl("dojox.rpc.SMDLibrary","dojo-api.smd")),_attributes:["summary","type","returns","parameters"],_clean:function(_1a){
 var obj={};
-for(var i=0,_21;_21=dojox.help._attributes[i];i++){
-var _22=_1e["__"+_21+"__"];
-if(_22){
-obj[_21]=_22;
+for(var i=0,_1b;_1b=dojox.help._attributes[i];i++){
+var _1c=_1a["__"+_1b+"__"];
+if(_1c){
+obj[_1b]=_1c;
 }
 }
 return obj;
-},_displayLocated:function(_23){
+},_displayLocated:function(_1d){
 throw new Error("_displayLocated should be overridden in one of the dojox.help packages");
-},_displayHelp:function(_24,obj){
+},_displayHelp:function(_1e,obj){
 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 _27=obj.name.split(".");
-if(_27[0]=="dojo"||_27[0]=="dijit"||_27[0]=="dojox"){
-obj.project=_27[0];
+var _1f=obj.name.split(".");
+if(_1f[0]=="dojo"||_1f[0]=="dijit"||_1f[0]=="dojox"){
+obj.project=_1f[0];
 }
 }
 return obj;
-},_stripPrototype:function(_28){
-var _29=_28.replace(/\.prototype(\.|$)/g,".");
-var _2a=_29;
-if(_29.slice(-1)=="."){
-_2a=_29=_29.slice(0,-1);
+},_stripPrototype:function(_20){
+var _21=_20.replace(/\.prototype(\.|$)/g,".");
+var _22=_21;
+if(_21.slice(-1)=="."){
+_22=_21=_21.slice(0,-1);
 }else{
-_29=_28;
+_21=_20;
 }
-return [_2a,_29];
+return [_22,_21];
 },_help:function(){
-var _2b=this.__name__;
-var _2c=dojox.help._stripPrototype(_2b)[0];
-var _2d=[];
-for(var i=0,_2f;_2f=dojox.help._attributes[i];i++){
-if(!this["__"+_2f+"__"]){
-_2d.push(_2f);
+var _23=this.__name__;
+var _24=dojox.help._stripPrototype(_23)[0];
+var _25=[];
+for(var i=0,_26;_26=dojox.help._attributes[i];i++){
+if(!this["__"+_26+"__"]){
+_25.push(_26);
 }
 }
 dojox.help._displayHelp(true,{name:this.__name__});
-if(!_2d.length||this.__searched__){
+if(!_25.length||this.__searched__){
 dojox.help._displayHelp(false,dojox.help._clean(this));
 }else{
 this.__searched__=true;
-dojox.help._rpc.get(dojox.help._addVersion({name:_2c,exact:true,attributes:_2d})).addCallback(this,function(_30){
+dojox.help._rpc.get(dojox.help._addVersion({name:_24,exact:true,attributes:_25})).addCallback(this,function(_27){
 if(this.toString===dojox.help._toString){
-this.toString(_30);
+this.toString(_27);
 }
-if(_30&&_30.length){
-_30=_30[0];
-for(var i=0,_2f;_2f=dojox.help._attributes[i];i++){
-if(_30[_2f]){
-this["__"+_2f+"__"]=_30[_2f];
+if(_27&&_27.length){
+_27=_27[0];
+for(var i=0,_26;_26=dojox.help._attributes[i];i++){
+if(_27[_26]){
+this["__"+_26+"__"]=_27[_26];
 }
 }
 dojox.help._displayHelp(false,dojox.help._clean(this));
@@ -211,58 +211,57 @@ dojox.help._displayHelp(false,false);
 }
 });
 }
-if(!+dojo.isFF){
+if(!dojo.isMoz){
 return "";
 }
-},_parse:function(_32){
+},_parse:function(_28){
 delete this.__searching__;
-if(_32&&_32.length){
-var _33=_32[0].parameters;
-if(_33){
-var _34=["function ",this.__name__,"("];
-this.__parameters__=_33;
-for(var i=0,_36;_36=_33[i];i++){
+if(_28&&_28.length){
+var _29=_28[0].parameters;
+if(_29){
+var _2a=["function ",this.__name__,"("];
+this.__parameters__=_29;
+for(var i=0,_2b;_2b=_29[i];i++){
 if(i){
-_34.push(", ");
+_2a.push(", ");
 }
-_34.push(_36.name);
-if(_36.types){
-var _37=[];
-for(var j=0,_39;_39=_36.types[j];j++){
-_37.push(_39.title);
+_2a.push(_2b.name);
+if(_2b.types){
+var _2c=[];
+for(var j=0,_2d;_2d=_2b.types[j];j++){
+_2c.push(_2d.title);
 }
-if(_37.length){
-_34.push(": ");
-_34.push(_37.join("|"));
+if(_2c.length){
+_2a.push(": ");
+_2a.push(_2c.join("|"));
 }
 }
-if(_36.repeating){
-_34.push("...");
+if(_2b.repeating){
+_2a.push("...");
 }
-if(_36.optional){
-_34.push("?");
+if(_2b.optional){
+_2a.push("?");
 }
 }
-_34.push(")");
-this.__source__=this.__source__.replace(/function[^\(]*\([^\)]*\)/,_34.join(""));
+_2a.push(")");
+this.__source__=this.__source__.replace(/function[^\(]*\([^\)]*\)/,_2a.join(""));
 }
 if(this.__output__){
 delete this.__output__;
-
 }
 }else{
 dojox.help._displayHelp(false,false);
 }
-},_toStrings:{},_toString:function(_3a){
+},_toStrings:{},_toString:function(_2e){
 if(!this.__source__){
 return this.__name__;
 }
-var _3b=(!this.__parameters__);
+var _2f=(!this.__parameters__);
 this.__parameters__=[];
-if(_3a){
-dojox.help._parse.call(this,_3a);
+if(_2e){
+dojox.help._parse.call(this,_2e);
 }else{
-if(_3b){
+if(_2f){
 this.__searching__=true;
 dojox.help._toStrings[dojox.help._stripPrototype(this.__name__)[0]]=this;
 if(dojox.help._toStringTimer){
@@ -273,45 +272,45 @@ dojox.help.__toString();
 },50);
 }
 }
-if(!_3b||!this.__searching__){
+if(!_2f||!this.__searching__){
 return this.__source__;
 }
-var _3c="function Loading info for "+this.__name__+"... (watch console for result) {}";
-if(!+dojo.isFF){
+var _30="function Loading info for "+this.__name__+"... (watch console for result) {}";
+if(!dojo.isMoz){
 this.__output__=true;
-return _3c;
+return _30;
 }
 return {toString:dojo.hitch(this,function(){
 this.__output__=true;
-return _3c;
+return _30;
 })};
 },__toString:function(){
 if(dojox.help._toStringTimer){
 clearTimeout(dojox.help._toStringTimer);
 }
-var _3d=[];
+var _31=[];
 dojox.help.noConflict(dojox.help._toStrings);
-for(var _3e in dojox.help._toStrings){
-_3d.push(_3e);
+for(var _32 in dojox.help._toStrings){
+_31.push(_32);
 }
-while(_3d.length){
-dojox.help._rpc.batch(dojox.help._addVersion({names:_3d.splice(-50,50),exact:true,attributes:["parameters"]})).addCallback(this,function(_3f){
-for(var i=0,_41;_41=_3f[i];i++){
-var fn=dojox.help._toStrings[_41.name];
+while(_31.length){
+dojox.help._rpc.batch(dojox.help._addVersion({names:_31.splice(-50,50),exact:true,attributes:["parameters"]})).addCallback(this,function(_33){
+for(var i=0,_34;_34=_33[i];i++){
+var fn=dojox.help._toStrings[_34.name];
 if(fn){
-dojox.help._parse.call(fn,[_41]);
-delete dojox.help._toStrings[_41.name];
+dojox.help._parse.call(fn,[_34]);
+delete dojox.help._toStrings[_34.name];
 }
 }
 });
 }
-},_overrides:[],_recursions:[],_names:{},_recurse:function(_43,_44){
+},_overrides:[],_recursions:[],_names:{},_recurse:function(_35,_36){
 if(arguments.length<2){
-_44=true;
+_36=true;
 }
-var _45=[];
-if(_43&&dojo.isString(_43)){
-dojox.help.__recurse(dojo.getObject(_43),_43,_43,_45,_44);
+var _37=[];
+if(_35&&dojo.isString(_35)){
+dojox.help.__recurse(dojo.getObject(_35),_35,_35,_37,_36);
 }else{
 for(var i=0,ns;ns=dojox.help._namespaces[i];i++){
 if(window[ns]){
@@ -324,64 +323,64 @@ window[ns].help=dojox.help._help;
 }
 }
 while(dojox.help._recursions.length){
-var _48=dojox.help._recursions.shift();
-dojox.help.__recurse(_48[0],_48[1],_48[2],_45,_44);
+var _38=dojox.help._recursions.shift();
+dojox.help.__recurse(_38[0],_38[1],_38[2],_37,_36);
 }
-for(var i=0,_49;_49=_45[i];i++){
-delete _49.__seen__;
+for(var i=0,_39;_39=_37[i];i++){
+delete _39.__seen__;
 }
-},__recurse:function(_4a,_4b,_4c,_4d,_4e){
-for(var key in _4a){
+},__recurse:function(_3a,_3b,_3c,_3d,_3e){
+for(var key in _3a){
 if(key.match(/([^\w_.$]|__[\w_.$]+__)/)){
 continue;
 }
-var _50=_4a[key];
-if(typeof _50=="undefined"||_50===document||_50===window||_50===dojox.help._toString||_50===dojox.help._help||_50===null||(+dojo.isIE&&_50.tagName)||_50.__seen__){
+var _3f=_3a[key];
+if(typeof _3f=="undefined"||_3f===document||_3f===window||_3f===dojox.help._toString||_3f===dojox.help._help||_3f===null||(+dojo.isIE&&_3f.tagName)||_3f.__seen__){
 continue;
 }
-var _51=dojo.isFunction(_50);
-var _52=dojo.isObject(_50)&&!dojo.isArray(_50)&&!_50.nodeType;
-var _53=(_4c)?(_4c+"."+key):key;
-if(_53=="dojo._blockAsync"){
+var _40=dojo.isFunction(_3f);
+var _41=dojo.isObject(_3f)&&!dojo.isArray(_3f)&&!_3f.nodeType;
+var _42=(_3c)?(_3c+"."+key):key;
+if(_42=="dojo._blockAsync"){
 continue;
 }
-if(!_50.__name__){
-var _54=null;
-if(dojo.isString(_50)){
-_54=String;
+if(!_3f.__name__){
+var _43=null;
+if(dojo.isString(_3f)){
+_43=String;
 }else{
-if(typeof _50=="number"){
-_54=Number;
+if(typeof _3f=="number"){
+_43=Number;
 }else{
-if(typeof _50=="boolean"){
-_54=Boolean;
+if(typeof _3f=="boolean"){
+_43=Boolean;
 }
 }
 }
-if(_54){
-_50=_4a[key]=new _54(_50);
+if(_43){
+_3f=_3a[key]=new _43(_3f);
 }
 }
-_50.__seen__=true;
-_50.__name__=_53;
-(dojox.help._names[_4b]=dojox.help._names[_4b]||[]).push(_53);
-_4d.push(_50);
-if(!_51){
-dojox.help._overrides.push([_4a,key]);
+_3f.__seen__=true;
+_3f.__name__=_42;
+(dojox.help._names[_3b]=dojox.help._names[_3b]||[]).push(_42);
+_3d.push(_3f);
+if(!_40){
+dojox.help._overrides.push([_3a,key]);
 }
-if((_51||_52)&&_4e){
-dojox.help._recursions.push([_50,_4b,_53]);
+if((_40||_41)&&_3e){
+dojox.help._recursions.push([_3f,_3b,_42]);
 }
-if(_51){
-if(!_50.__source__){
-_50.__source__=_50.toString().replace(/^function\b ?/,"function "+_53);
+if(_40){
+if(!_3f.__source__){
+_3f.__source__=_3f.toString().replace(/^function\b ?/,"function "+_42);
 }
-if(_50.toString===Function.prototype.toString){
-_50.toString=dojox.help._toString;
+if(_3f.toString===Function.prototype.toString){
+_3f.toString=dojox.help._toString;
 }
 }
-if(!_50.help){
-_50.help=dojox.help._help;
+if(!_3f.help){
+_3f.help=dojox.help._help;
 }
 }
 }};
diff --git a/dojox/help/console.js b/dojox/help/console.js
index f4db2ea..fa3dd28 100644
--- a/dojox/help/console.js
+++ b/dojox/help/console.js
@@ -14,72 +14,62 @@ return _1.replace(/(<[^>]*>|&[^;]{2,6};)/g,"");
 },_displayLocated:function(_2){
 var _3={};
 dojo.forEach(_2,function(_4){
-_3[_4[0]]=(+dojo.isFF)?{toString:function(){
+_3[_4[0]]=dojo.isMoz?{toString:function(){
 return "Click to view";
 },item:_4[1]}:_4[1];
 });
-
 },_displayHelp:function(_5,_6){
 if(_5){
 var _7="Help for: "+_6.name;
-
 var _8="";
 for(var i=0;i<_7.length;i++){
 _8+="=";
 }
-
 }else{
 if(!_6){
-
 }else{
-var _a=false;
-for(var _b in _6){
-var _c=_6[_b];
-if(_b=="returns"&&_6.type!="Function"&&_6.type!="Constructor"){
+var _9=false;
+for(var _a in _6){
+var _b=_6[_a];
+if(_a=="returns"&&_6.type!="Function"&&_6.type!="Constructor"){
 continue;
 }
-if(_c&&(!dojo.isArray(_c)||_c.length)){
-_a=true;
-
-_c=dojo.isString(_c)?dojox.help._plainText(_c):_c;
-if(_b=="returns"){
-var _d=dojo.map(_c.types||[],"return item.title;").join("|");
-if(_c.summary){
-if(_d){
-_d+=": ";
+if(_b&&(!dojo.isArray(_b)||_b.length)){
+_9=true;
+_b=dojo.isString(_b)?dojox.help._plainText(_b):_b;
+if(_a=="returns"){
+var _c=dojo.map(_b.types||[],"return item.title;").join("|");
+if(_b.summary){
+if(_c){
+_c+=": ";
 }
-_d+=dojox.help._plainText(_c.summary);
+_c+=dojox.help._plainText(_b.summary);
 }
-
 }else{
-if(_b=="parameters"){
-for(var j=0,_f;_f=_c[j];j++){
-var _10=dojo.map(_f.types,"return item.title").join("|");
-
-var _11="";
-if(_f.optional){
-_11+="Optional. ";
+if(_a=="parameters"){
+for(var j=0,_d;_d=_b[j];j++){
+var _e=dojo.map(_d.types,"return item.title").join("|");
+var _f="";
+if(_d.optional){
+_f+="Optional. ";
 }
-if(_f.repating){
-_11+="Repeating. ";
+if(_d.repating){
+_f+="Repeating. ";
 }
-_11+=dojox.help._plainText(_f.summary);
-if(_11){
-_11="  - "+_11;
-for(var k=0;k<_f.name.length;k++){
-_11=" "+_11;
+_f+=dojox.help._plainText(_d.summary);
+if(_f){
+_f="  - "+_f;
+for(var k=0;k<_d.name.length;k++){
+_f=" "+_f;
 }
-
 }
 }
 }else{
-
 }
 }
 }
 }
-if(!_a){
-
+if(!_9){
 }
 }
 }
diff --git a/dojox/highlight/_base.js b/dojox/highlight/_base.js
index 661dc25..77db294 100644
--- a/dojox/highlight/_base.js
+++ b/dojox/highlight/_base.js
@@ -9,63 +9,63 @@ if(!dojo._hasResource["dojox.highlight._base"]){
 dojo._hasResource["dojox.highlight._base"]=true;
 dojo.provide("dojox.highlight._base");
 (function(){
-var dh=dojox.highlight,_2="\\b(0x[A-Za-z0-9]+|\\d+(\\.\\d+)?)";
-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:_2,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_B [...]
-function _3(_4){
-return _4.replace(/&/gm,"&").replace(/</gm,"<").replace(/>/gm,">");
+var dh=dojox.highlight,_1="\\b(0x[A-Za-z0-9]+|\\d+(\\.\\d+)?)";
+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:_1,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_B [...]
+function _2(_3){
+return _3.replace(/&/gm,"&").replace(/</gm,"<").replace(/>/gm,">");
 };
-function _5(_6){
-return dojo.every(_6.childNodes,function(_7){
-return _7.nodeType==3||String(_7.nodeName).toLowerCase()=="br";
+function _4(_5){
+return dojo.every(_5.childNodes,function(_6){
+return _6.nodeType==3||String(_6.nodeName).toLowerCase()=="br";
 });
 };
-function _8(_9){
-var _a=[];
-dojo.forEach(_9.childNodes,function(_b){
-if(_b.nodeType==3){
-_a.push(_b.nodeValue);
+function _7(_8){
+var _9=[];
+dojo.forEach(_8.childNodes,function(_a){
+if(_a.nodeType==3){
+_9.push(_a.nodeValue);
 }else{
-if(String(_b.nodeName).toLowerCase()=="br"){
-_a.push("\n");
+if(String(_a.nodeName).toLowerCase()=="br"){
+_9.push("\n");
 }else{
 throw "Complex markup";
 }
 }
 });
-return _a.join("");
+return _9.join("");
 };
-function _c(_d){
-if(!_d.keywordGroups){
-for(var _e in _d.keywords){
-var kw=_d.keywords[_e];
+function _b(_c){
+if(!_c.keywordGroups){
+for(var _d in _c.keywords){
+var kw=_c.keywords[_d];
 if(kw instanceof Object){
-_d.keywordGroups=_d.keywords;
+_c.keywordGroups=_c.keywords;
 }else{
-_d.keywordGroups={keyword:_d.keywords};
+_c.keywordGroups={keyword:_c.keywords};
 }
 break;
 }
 }
 };
-function _10(_11){
-if(_11.defaultMode&&_11.modes){
-_c(_11.defaultMode);
-dojo.forEach(_11.modes,_c);
+function _e(_f){
+if(_f.defaultMode&&_f.modes){
+_b(_f.defaultMode);
+dojo.forEach(_f.modes,_b);
 }
 };
-var _12=function(_13,_14){
-this.langName=_13;
-this.lang=dh.languages[_13];
+var _10=function(_11,_12){
+this.langName=_11;
+this.lang=dh.languages[_11];
 this.modes=[this.lang.defaultMode];
 this.relevance=0;
 this.keywordCount=0;
 this.result=[];
 if(!this.lang.defaultMode.illegalRe){
 this.buildRes();
-_10(this.lang);
+_e(this.lang);
 }
 try{
-this.highlight(_14);
+this.highlight(_12);
 this.result=this.result.join("");
 }
 catch(e){
@@ -73,251 +73,251 @@ if(e=="Illegal"){
 this.relevance=0;
 this.keywordCount=0;
 this.partialResult=this.result.join("");
-this.result=_3(_14);
+this.result=_2(_12);
 }else{
 throw e;
 }
 }
 };
-dojo.extend(_12,{buildRes:function(){
-dojo.forEach(this.lang.modes,function(_15){
-if(_15.begin){
-_15.beginRe=this.langRe("^"+_15.begin);
+dojo.extend(_10,{buildRes:function(){
+dojo.forEach(this.lang.modes,function(_13){
+if(_13.begin){
+_13.beginRe=this.langRe("^"+_13.begin);
 }
-if(_15.end){
-_15.endRe=this.langRe("^"+_15.end);
+if(_13.end){
+_13.endRe=this.langRe("^"+_13.end);
 }
-if(_15.illegal){
-_15.illegalRe=this.langRe("^(?:"+_15.illegal+")");
+if(_13.illegal){
+_13.illegalRe=this.langRe("^(?:"+_13.illegal+")");
 }
 },this);
 this.lang.defaultMode.illegalRe=this.langRe("^(?:"+this.lang.defaultMode.illegal+")");
-},subMode:function(_16){
-var _17=this.modes[this.modes.length-1].contains;
-if(_17){
-var _18=this.lang.modes;
-for(var i=0;i<_17.length;++i){
-var _1a=_17[i];
-for(var j=0;j<_18.length;++j){
-var _1c=_18[j];
-if(_1c.className==_1a&&_1c.beginRe.test(_16)){
-return _1c;
+},subMode:function(_14){
+var _15=this.modes[this.modes.length-1].contains;
+if(_15){
+var _16=this.lang.modes;
+for(var i=0;i<_15.length;++i){
+var _17=_15[i];
+for(var j=0;j<_16.length;++j){
+var _18=_16[j];
+if(_18.className==_17&&_18.beginRe.test(_14)){
+return _18;
 }
 }
 }
 }
 return null;
-},endOfMode:function(_1d){
+},endOfMode:function(_19){
 for(var i=this.modes.length-1;i>=0;--i){
-var _1f=this.modes[i];
-if(_1f.end&&_1f.endRe.test(_1d)){
+var _1a=this.modes[i];
+if(_1a.end&&_1a.endRe.test(_19)){
 return this.modes.length-i;
 }
-if(!_1f.endsWithParent){
+if(!_1a.endsWithParent){
 break;
 }
 }
 return 0;
-},isIllegal:function(_20){
-var _21=this.modes[this.modes.length-1].illegalRe;
-return _21&&_21.test(_20);
-},langRe:function(_22,_23){
-var _24="m"+(this.lang.case_insensitive?"i":"")+(_23?"g":"");
-return new RegExp(_22,_24);
+},isIllegal:function(_1b){
+var _1c=this.modes[this.modes.length-1].illegalRe;
+return _1c&&_1c.test(_1b);
+},langRe:function(_1d,_1e){
+var _1f="m"+(this.lang.case_insensitive?"i":"")+(_1e?"g":"");
+return new RegExp(_1d,_1f);
 },buildTerminators:function(){
-var _25=this.modes[this.modes.length-1],_26={};
-if(_25.contains){
-dojo.forEach(this.lang.modes,function(_27){
-if(dojo.indexOf(_25.contains,_27.className)>=0){
-_26[_27.begin]=1;
+var _20=this.modes[this.modes.length-1],_21={};
+if(_20.contains){
+dojo.forEach(this.lang.modes,function(_22){
+if(dojo.indexOf(_20.contains,_22.className)>=0){
+_21[_22.begin]=1;
 }
 });
 }
 for(var i=this.modes.length-1;i>=0;--i){
 var m=this.modes[i];
 if(m.end){
-_26[m.end]=1;
+_21[m.end]=1;
 }
 if(!m.endsWithParent){
 break;
 }
 }
-if(_25.illegal){
-_26[_25.illegal]=1;
+if(_20.illegal){
+_21[_20.illegal]=1;
 }
 var t=[];
-for(i in _26){
+for(i in _21){
 t.push(i);
 }
-_25.terminatorsRe=this.langRe("("+t.join("|")+")");
-},eatModeChunk:function(_2b,_2c){
-var _2d=this.modes[this.modes.length-1];
-if(!_2d.terminatorsRe){
+_20.terminatorsRe=this.langRe("("+t.join("|")+")");
+},eatModeChunk:function(_23,_24){
+var _25=this.modes[this.modes.length-1];
+if(!_25.terminatorsRe){
 this.buildTerminators();
 }
-_2b=_2b.substr(_2c);
-var _2e=_2d.terminatorsRe.exec(_2b);
-if(!_2e){
-return {buffer:_2b,lexeme:"",end:true};
+_23=_23.substr(_24);
+var _26=_25.terminatorsRe.exec(_23);
+if(!_26){
+return {buffer:_23,lexeme:"",end:true};
 }
-return {buffer:_2e.index?_2b.substr(0,_2e.index):"",lexeme:_2e[0],end:false};
-},keywordMatch:function(_2f,_30){
-var _31=_30[0];
+return {buffer:_26.index?_23.substr(0,_26.index):"",lexeme:_26[0],end:false};
+},keywordMatch:function(_27,_28){
+var _29=_28[0];
 if(this.lang.case_insensitive){
-_31=_31.toLowerCase();
+_29=_29.toLowerCase();
 }
-for(var _32 in _2f.keywordGroups){
-if(_31 in _2f.keywordGroups[_32]){
-return _32;
+for(var _2a in _27.keywordGroups){
+if(_29 in _27.keywordGroups[_2a]){
+return _2a;
 }
 }
 return "";
-},buildLexemes:function(_33){
-var _34={};
-dojo.forEach(_33.lexems,function(_35){
-_34[_35]=1;
+},buildLexemes:function(_2b){
+var _2c={};
+dojo.forEach(_2b.lexems,function(_2d){
+_2c[_2d]=1;
 });
 var t=[];
-for(var i in _34){
+for(var i in _2c){
 t.push(i);
 }
-_33.lexemsRe=this.langRe("("+t.join("|")+")",true);
-},processKeywords:function(_38){
-var _39=this.modes[this.modes.length-1];
-if(!_39.keywords||!_39.lexems){
-return _3(_38);
-}
-if(!_39.lexemsRe){
-this.buildLexemes(_39);
-}
-_39.lexemsRe.lastIndex=0;
-var _3a=[],_3b=0,_3c=_39.lexemsRe.exec(_38);
-while(_3c){
-_3a.push(_3(_38.substr(_3b,_3c.index-_3b)));
-var _3d=this.keywordMatch(_39,_3c);
-if(_3d){
+_2b.lexemsRe=this.langRe("("+t.join("|")+")",true);
+},processKeywords:function(_2e){
+var _2f=this.modes[this.modes.length-1];
+if(!_2f.keywords||!_2f.lexems){
+return _2(_2e);
+}
+if(!_2f.lexemsRe){
+this.buildLexemes(_2f);
+}
+_2f.lexemsRe.lastIndex=0;
+var _30=[],_31=0,_32=_2f.lexemsRe.exec(_2e);
+while(_32){
+_30.push(_2(_2e.substr(_31,_32.index-_31)));
+var _33=this.keywordMatch(_2f,_32);
+if(_33){
 ++this.keywordCount;
-_3a.push("<span class=\""+_3d+"\">"+_3(_3c[0])+"</span>");
+_30.push("<span class=\""+_33+"\">"+_2(_32[0])+"</span>");
 }else{
-_3a.push(_3(_3c[0]));
+_30.push(_2(_32[0]));
 }
-_3b=_39.lexemsRe.lastIndex;
-_3c=_39.lexemsRe.exec(_38);
+_31=_2f.lexemsRe.lastIndex;
+_32=_2f.lexemsRe.exec(_2e);
 }
-_3a.push(_3(_38.substr(_3b,_38.length-_3b)));
-return _3a.join("");
-},processModeInfo:function(_3e,_3f,end){
-var _41=this.modes[this.modes.length-1];
+_30.push(_2(_2e.substr(_31,_2e.length-_31)));
+return _30.join("");
+},processModeInfo:function(_34,_35,end){
+var _36=this.modes[this.modes.length-1];
 if(end){
-this.result.push(this.processKeywords(_41.buffer+_3e));
+this.result.push(this.processKeywords(_36.buffer+_34));
 return;
 }
-if(this.isIllegal(_3f)){
+if(this.isIllegal(_35)){
 throw "Illegal";
 }
-var _42=this.subMode(_3f);
-if(_42){
-_41.buffer+=_3e;
-this.result.push(this.processKeywords(_41.buffer));
-if(_42.excludeBegin){
-this.result.push(_3f+"<span class=\""+_42.className+"\">");
-_42.buffer="";
+var _37=this.subMode(_35);
+if(_37){
+_36.buffer+=_34;
+this.result.push(this.processKeywords(_36.buffer));
+if(_37.excludeBegin){
+this.result.push(_35+"<span class=\""+_37.className+"\">");
+_37.buffer="";
 }else{
-this.result.push("<span class=\""+_42.className+"\">");
-_42.buffer=_3f;
+this.result.push("<span class=\""+_37.className+"\">");
+_37.buffer=_35;
 }
-this.modes.push(_42);
-this.relevance+=typeof _42.relevance=="number"?_42.relevance:1;
+this.modes.push(_37);
+this.relevance+=typeof _37.relevance=="number"?_37.relevance:1;
 return;
 }
-var _43=this.endOfMode(_3f);
-if(_43){
-_41.buffer+=_3e;
-if(_41.excludeEnd){
-this.result.push(this.processKeywords(_41.buffer)+"</span>"+_3f);
+var _38=this.endOfMode(_35);
+if(_38){
+_36.buffer+=_34;
+if(_36.excludeEnd){
+this.result.push(this.processKeywords(_36.buffer)+"</span>"+_35);
 }else{
-this.result.push(this.processKeywords(_41.buffer+_3f)+"</span>");
+this.result.push(this.processKeywords(_36.buffer+_35)+"</span>");
 }
-while(_43>1){
+while(_38>1){
 this.result.push("</span>");
---_43;
+--_38;
 this.modes.pop();
 }
 this.modes.pop();
 this.modes[this.modes.length-1].buffer="";
 return;
 }
-},highlight:function(_44){
-var _45=0;
+},highlight:function(_39){
+var _3a=0;
 this.lang.defaultMode.buffer="";
 do{
-var _46=this.eatModeChunk(_44,_45);
-this.processModeInfo(_46.buffer,_46.lexeme,_46.end);
-_45+=_46.buffer.length+_46.lexeme.length;
-}while(!_46.end);
+var _3b=this.eatModeChunk(_39,_3a);
+this.processModeInfo(_3b.buffer,_3b.lexeme,_3b.end);
+_3a+=_3b.buffer.length+_3b.lexeme.length;
+}while(!_3b.end);
 if(this.modes.length>1){
 throw "Illegal";
 }
 }});
-function _47(_48,_49,_4a){
-if(String(_48.tagName).toLowerCase()=="code"&&String(_48.parentNode.tagName).toLowerCase()=="pre"){
-var _4b=document.createElement("div"),_4c=_48.parentNode.parentNode;
-_4b.innerHTML="<pre><code class=\""+_49+"\">"+_4a+"</code></pre>";
-_4c.replaceChild(_4b.firstChild,_48.parentNode);
+function _3c(_3d,_3e,_3f){
+if(String(_3d.tagName).toLowerCase()=="code"&&String(_3d.parentNode.tagName).toLowerCase()=="pre"){
+var _40=document.createElement("div"),_41=_3d.parentNode.parentNode;
+_40.innerHTML="<pre><code class=\""+_3e+"\">"+_3f+"</code></pre>";
+_41.replaceChild(_40.firstChild,_3d.parentNode);
 }else{
-_48.className=_49;
-_48.innerHTML=_4a;
+_3d.className=_3e;
+_3d.innerHTML=_3f;
 }
 };
-function _4d(_4e,str){
-var _50=new _12(_4e,str);
-return {result:_50.result,langName:_4e,partialResult:_50.partialResult};
+function _42(_43,str){
+var _44=new _10(_43,str);
+return {result:_44.result,langName:_43,partialResult:_44.partialResult};
 };
-function _51(_52,_53){
-var _54=_4d(_53,_8(_52));
-_47(_52,_52.className,_54.result);
+function _45(_46,_47){
+var _48=_42(_47,_7(_46));
+_3c(_46,_46.className,_48.result);
 };
-function _55(str){
-var _57="",_58="",_59=2,_5a=str;
+function _49(str){
+var _4a="",_4b="",_4c=2,_4d=str;
 for(var key in dh.languages){
 if(!dh.languages[key].defaultMode){
 continue;
 }
-var _5c=new _12(key,_5a),_5d=_5c.keywordCount+_5c.relevance,_5e=0;
-if(!_57||_5d>_5e){
-_5e=_5d;
-_57=_5c.result;
-_58=_5c.langName;
+var _4e=new _10(key,_4d),_4f=_4e.keywordCount+_4e.relevance,_50=0;
+if(!_4a||_4f>_50){
+_50=_4f;
+_4a=_4e.result;
+_4b=_4e.langName;
 }
 }
-return {result:_57,langName:_58};
+return {result:_4a,langName:_4b};
 };
-function _5f(_60){
-var _61=_55(_8(_60));
-if(_61.result){
-_47(_60,_61.langName,_61.result);
+function _51(_52){
+var _53=_49(_7(_52));
+if(_53.result){
+_3c(_52,_53.langName,_53.result);
 }
 };
-dojox.highlight.processString=function(str,_63){
-return _63?_4d(_63,str):_55(str);
+dojox.highlight.processString=function(str,_54){
+return _54?_42(_54,str):_49(str);
 };
-dojox.highlight.init=function(_64){
-_64=dojo.byId(_64);
-if(dojo.hasClass(_64,"no-highlight")){
+dojox.highlight.init=function(_55){
+_55=dojo.byId(_55);
+if(dojo.hasClass(_55,"no-highlight")){
 return;
 }
-if(!_5(_64)){
+if(!_4(_55)){
 return;
 }
-var _65=_64.className.split(/\s+/),_66=dojo.some(_65,function(_67){
-if(_67.charAt(0)!="_"&&dh.languages[_67]){
-_51(_64,_67);
+var _56=_55.className.split(/\s+/),_57=dojo.some(_56,function(_58){
+if(_58.charAt(0)!="_"&&dh.languages[_58]){
+_45(_55,_58);
 return true;
 }
 return false;
 });
-if(!_66){
-_5f(_64);
+if(!_57){
+_51(_55);
 }
 };
 dh.Code=function(p,n){
diff --git a/dojox/highlight/languages/cpp.js b/dojox/highlight/languages/cpp.js
index a5e2cd7..e82ff57 100644
--- a/dojox/highlight/languages/cpp.js
+++ b/dojox/highlight/languages/cpp.js
@@ -10,7 +10,7 @@ dojo._hasResource["dojox.highlight.languages.cpp"]=true;
 dojo.provide("dojox.highlight.languages.cpp");
 dojo.require("dojox.highlight._base");
 (function(){
-var dh=dojox.highlight,_2=dh.constants;
-dh.languages.cpp={defaultMode:{lexems:[_2.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," [...]
+var dh=dojox.highlight,_1=dh.constants;
+dh.languages.cpp={defaultMode:{lexems:[_1.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," [...]
 })();
 }
diff --git a/dojox/highlight/languages/css.js b/dojox/highlight/languages/css.js
index 3d0a02a..7c011cd 100644
--- a/dojox/highlight/languages/css.js
+++ b/dojox/highlight/languages/css.js
@@ -11,7 +11,7 @@ dojo.provide("dojox.highlight.languages.css");
 dojo.require("dojox.highlight._base");
 dojo.require("dojox.highlight.languages.html");
 (function(){
-var dh=dojox.highlight,_2=dh.constants,_3=dh.languages;
-_3.css={defaultMode:{contains:["id","class","attr_selector","rules","comment"],keywords:_3.html.HTML_TAGS,lexems:[_2.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,"quo [...]
+var dh=dojox.highlight,_1=dh.constants,_2=dh.languages;
+_2.css={defaultMode:{contains:["id","class","attr_selector","rules","comment"],keywords:_2.html.HTML_TAGS,lexems:[_1.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,"quo [...]
 })();
 }
diff --git a/dojox/highlight/languages/delphi.js b/dojox/highlight/languages/delphi.js
index 6b91028..8775821 100644
--- a/dojox/highlight/languages/delphi.js
+++ b/dojox/highlight/languages/delphi.js
@@ -12,7 +12,7 @@ dojo.require("dojox.highlight._base");
 (function(){
 var _1={"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," [...]
 var _2={"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, [...]
-var dh=dojox.highlight,_4=dh.constants;
-dh.languages.delphi={defaultMode:{lexems:[_4.IDENT_RE],illegal:"(\"|\\$[G-Zg-z]|\\/\\*|</)",contains:["comment","string","number","function","class"],keywords:_1},case_insensitive:true,modes:[{className:"comment",begin:"{",end:"}"},{className:"comment",begin:"\\(\\*",end:"\\*\\)",relevance:10},_4.C_LINE_COMMENT_MODE,{className:"number",begin:_4.NUMBER_RE,end:"^",relevance:0},{className:"string",begin:"'",end:"'",contains:["quote"],relevance:0},{className:"string",begin:"(#\\d+)+",end:"^" [...]
+var dh=dojox.highlight,_3=dh.constants;
+dh.languages.delphi={defaultMode:{lexems:[_3.IDENT_RE],illegal:"(\"|\\$[G-Zg-z]|\\/\\*|</)",contains:["comment","string","number","function","class"],keywords:_1},case_insensitive:true,modes:[{className:"comment",begin:"{",end:"}"},{className:"comment",begin:"\\(\\*",end:"\\*\\)",relevance:10},_3.C_LINE_COMMENT_MODE,{className:"number",begin:_3.NUMBER_RE,end:"^",relevance:0},{className:"string",begin:"'",end:"'",contains:["quote"],relevance:0},{className:"string",begin:"(#\\d+)+",end:"^" [...]
 })();
 }
diff --git a/dojox/highlight/languages/django.js b/dojox/highlight/languages/django.js
index a86cdf9..3e233ef 100644
--- a/dojox/highlight/languages/django.js
+++ b/dojox/highlight/languages/django.js
@@ -12,7 +12,7 @@ dojo.require("dojox.highlight._base");
 dojo.require("dojox.highlight.languages.xml");
 dojo.require("dojox.highlight.languages.html");
 (function(){
-var dh=dojox.highlight,_2=dh.constants,_3=dh.languages,x=_3.xml,h=_3.html;
-_3.django={defaultMode:{contains:["tag","comment","doctype","template_comment","template_tag","variable"]},case_insensitive:true,modes:[x.XML_COMMENT,h.HTML_DOCTYPE,{className:"tag",lexems:[_2.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:"\\{ [...]
+var dh=dojox.highlight,_1=dh.constants,_2=dh.languages,x=_2.xml,h=_2.html;
+_2.django={defaultMode:{contains:["tag","comment","doctype","template_comment","template_tag","variable"]},case_insensitive:true,modes:[x.XML_COMMENT,h.HTML_DOCTYPE,{className:"tag",lexems:[_1.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:"\\{ [...]
 })();
 }
diff --git a/dojox/highlight/languages/html.js b/dojox/highlight/languages/html.js
index 8b6116c..d78f683 100644
--- a/dojox/highlight/languages/html.js
+++ b/dojox/highlight/languages/html.js
@@ -15,7 +15,7 @@ var _1={"code":1,"kbd":1,"font":1,"noscript":1,"style":1,"img":1,"title":1,"menu
 var _2={className:"doctype",begin:"<!DOCTYPE",end:">",relevance:10};
 var _3={className:"attribute",begin:" [a-zA-Z]+",end:"^"};
 var _4={className:"value",begin:"[a-zA-Z0-9]+",end:"^"};
-var dh=dojox.highlight,_6=dh.constants,_7=dh.languages,x=_7.xml;
-_7.html={defaultMode:{contains:["tag","comment","doctype"]},case_insensitive:true,modes:[x.XML_COMMENT,_2,{className:"tag",lexems:[_6.IDENT_RE],keywords:_1,begin:"<[A-Za-z/]",end:">",contains:["attribute"],illegal:"[\\+\\.]"},x.XML_ATTR,_3,x.XML_VALUE,_4],HTML_TAGS:_1,HTML_DOCTYPE:_2,HTML_ATTR:_3,HTML_VALUE:_4};
+var dh=dojox.highlight,_5=dh.constants,_6=dh.languages,x=_6.xml;
+_6.html={defaultMode:{contains:["tag","comment","doctype"]},case_insensitive:true,modes:[x.XML_COMMENT,_2,{className:"tag",lexems:[_5.IDENT_RE],keywords:_1,begin:"<[A-Za-z/]",end:">",contains:["attribute"],illegal:"[\\+\\.]"},x.XML_ATTR,_3,x.XML_VALUE,_4],HTML_TAGS:_1,HTML_DOCTYPE:_2,HTML_ATTR:_3,HTML_VALUE:_4};
 })();
 }
diff --git a/dojox/highlight/languages/javascript.js b/dojox/highlight/languages/javascript.js
index c44ef18..59f0f45 100644
--- a/dojox/highlight/languages/javascript.js
+++ b/dojox/highlight/languages/javascript.js
@@ -10,7 +10,7 @@ dojo._hasResource["dojox.highlight.languages.javascript"]=true;
 dojo.provide("dojox.highlight.languages.javascript");
 dojo.require("dojox.highlight._base");
 (function(){
-var dh=dojox.highlight,_2=dh.constants;
-dh.languages.javascript={defaultMode:{lexems:[_2.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:[_2.C_LINE_COMMENT_MODE,_2.C_BLOCK_COMMENT_MOD [...]
+var dh=dojox.highlight,_1=dh.constants;
+dh.languages.javascript={defaultMode:{lexems:[_1.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:[_1.C_LINE_COMMENT_MODE,_1.C_BLOCK_COMMENT_MOD [...]
 })();
 }
diff --git a/dojox/highlight/languages/pygments/css.js b/dojox/highlight/languages/pygments/css.js
index de9871c..ffdd8c6 100644
--- a/dojox/highlight/languages/pygments/css.js
+++ b/dojox/highlight/languages/pygments/css.js
@@ -11,7 +11,7 @@ dojo.provide("dojox.highlight.languages.pygments.css");
 dojo.require("dojox.highlight._base");
 dojo.require("dojox.highlight.languages.pygments._html");
 (function(){
-var dh=dojox.highlight,_2=dh.languages;
-_2.css={defaultMode:{lexems:["\\b[a-zA-Z0-9]+\\b","\\b at media\b"],keywords:{"keyword":{"@media":1},"name tag":_2.pygments._html.tags},contains:["comment","string single","string double","punctuation","name decorator","name class","name function","_content"]},modes:[{className:"comment",begin:"/\\*",end:"\\*/",relevance:0},{className:"comment preproc",begin:"@[a-z][a-zA-Z]*",end:"^"},{className:"comment preproc",begin:"\\!important\\b",end:"^"},{className:"number",begin:"\\#[a-fA-F0-9]{3}\ [...]
+var dh=dojox.highlight,_1=dh.languages;
+_1.css={defaultMode:{lexems:["\\b[a-zA-Z0-9]+\\b","\\b at media\b"],keywords:{"keyword":{"@media":1},"name tag":_1.pygments._html.tags},contains:["comment","string single","string double","punctuation","name decorator","name class","name function","_content"]},modes:[{className:"comment",begin:"/\\*",end:"\\*/",relevance:0},{className:"comment preproc",begin:"@[a-z][a-zA-Z]*",end:"^"},{className:"comment preproc",begin:"\\!important\\b",end:"^"},{className:"number",begin:"\\#[a-fA-F0-9]{3}\ [...]
 })();
 }
diff --git a/dojox/highlight/languages/pygments/html.js b/dojox/highlight/languages/pygments/html.js
index 2c769b1..2f86574 100644
--- a/dojox/highlight/languages/pygments/html.js
+++ b/dojox/highlight/languages/pygments/html.js
@@ -11,11 +11,11 @@ dojo.provide("dojox.highlight.languages.pygments.html");
 dojo.require("dojox.highlight._base");
 dojo.require("dojox.highlight.languages.pygments._html");
 (function(){
-var dh=dojox.highlight,_2=dh.languages,_3=[],ht=_2.pygments._html.tags;
-for(var _5 in ht){
-_3.push(_5);
+var dh=dojox.highlight,_1=dh.languages,_2=[],ht=_1.pygments._html.tags;
+for(var _3 in ht){
+_2.push(_3);
 }
-_3="\\b("+_3.join("|")+")\\b";
-_2.html={case_insensitive:true,defaultMode:{contains:["name entity","comment","comment preproc","_script","_style","_tag"]},modes:[{className:"comment",begin:"<!--",end:"-->"},{className:"comment preproc",begin:"\\<\\!\\[CDATA\\[",end:"\\]\\]\\>"},{className:"comment preproc",begin:"\\<\\!",end:"\\>"},{className:"string",begin:"'",end:"'",illegal:"\\n",relevance:0},{className:"string",begin:"\"",end:"\"",illegal:"\\n",relevance:0},{className:"name entity",begin:"\\&[a-z]+;",end:"^"},{cla [...]
+_2="\\b("+_2.join("|")+")\\b";
+_1.html={case_insensitive:true,defaultMode:{contains:["name entity","comment","comment preproc","_script","_style","_tag"]},modes:[{className:"comment",begin:"<!--",end:"-->"},{className:"comment preproc",begin:"\\<\\!\\[CDATA\\[",end:"\\]\\]\\>"},{className:"comment preproc",begin:"\\<\\!",end:"\\>"},{className:"string",begin:"'",end:"'",illegal:"\\n",relevance:0},{className:"string",begin:"\"",end:"\"",illegal:"\\n",relevance:0},{className:"name entity",begin:"\\&[a-z]+;",end:"^"},{cla [...]
 })();
 }
diff --git a/dojox/highlight/languages/pygments/javascript.js b/dojox/highlight/languages/pygments/javascript.js
index e378d64..4db65f0 100644
--- a/dojox/highlight/languages/pygments/javascript.js
+++ b/dojox/highlight/languages/pygments/javascript.js
@@ -10,7 +10,7 @@ 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,_2=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,"Re [...]
+var dh=dojox.highlight,_1=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,"Re [...]
 })();
 }
diff --git a/dojox/highlight/languages/python.js b/dojox/highlight/languages/python.js
index 9266354..cb02ff3 100644
--- a/dojox/highlight/languages/python.js
+++ b/dojox/highlight/languages/python.js
@@ -10,7 +10,7 @@ dojo._hasResource["dojox.highlight.languages.python"]=true;
 dojo.provide("dojox.highlight.languages.python");
 dojo.require("dojox.highlight._base");
 (function(){
-var dh=dojox.highlight,_2=dh.constants;
-dh.languages.python={defaultMode:{lexems:[_2.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", [...]
+var dh=dojox.highlight,_1=dh.constants;
+dh.languages.python={defaultMode:{lexems:[_1.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", [...]
 })();
 }
diff --git a/dojox/highlight/languages/sql.js b/dojox/highlight/languages/sql.js
index 2ea4060..e9f0f6e 100644
--- a/dojox/highlight/languages/sql.js
+++ b/dojox/highlight/languages/sql.js
@@ -11,7 +11,7 @@ dojo.provide("dojox.highlight.languages.sql");
 dojo.require("dojox.highlight._base");
 (function(){
 var _1={"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": [...]
-var dh=dojox.highlight,_3=dh.constants;
-dh.languages.sql={case_insensitive:true,defaultMode:{lexems:[_3.IDENT_RE],contains:["string","number","comment"],keywords:{"keyword":_1,"aggregate":{"count":1,"sum":1,"min":1,"max":1,"avg":1}}},modes:[_3.C_NUMBER_MODE,_3.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},{classN [...]
+var dh=dojox.highlight,_2=dh.constants;
+dh.languages.sql={case_insensitive:true,defaultMode:{lexems:[_2.IDENT_RE],contains:["string","number","comment"],keywords:{"keyword":_1,"aggregate":{"count":1,"sum":1,"min":1,"max":1,"avg":1}}},modes:[_2.C_NUMBER_MODE,_2.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},{classN [...]
 })();
 }
diff --git a/dojox/highlight/languages/xml.js b/dojox/highlight/languages/xml.js
index daa2fa0..68ed50a 100644
--- a/dojox/highlight/languages/xml.js
+++ b/dojox/highlight/languages/xml.js
@@ -13,7 +13,7 @@ dojo.require("dojox.highlight._base");
 var _1={className:"comment",begin:"<!--",end:"-->"};
 var _2={className:"attribute",begin:" [a-zA-Z-]+=",end:"^",contains:["value"]};
 var _3={className:"value",begin:"\"",end:"\""};
-var dh=dojox.highlight,_5=dh.constants;
+var dh=dojox.highlight,_4=dh.constants;
 dh.languages.xml={defaultMode:{contains:["pi","comment","cdata","tag"]},case_insensitive:true,modes:[{className:"pi",begin:"<\\?",end:"\\?>",relevance:10},_1,{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:"[\\+\\.]"},_2 [...]
 })();
 }
diff --git a/dojox/html/README b/dojox/html/README
index ef38d50..1bb77d6 100644
--- a/dojox/html/README
+++ b/dojox/html/README
@@ -13,7 +13,9 @@ Credits
 	Steve Orvell (sorvell AT activegrid.com)
 	Tom Trenka (ttrenka AT gmail.com)
 	Bryan Forbes (bryan AT reigndropsfall.net)
-    Mike Wilcox - dojox.html.styles (anm8tr AT yahoo.com)
+	Mike Wilcox - dojox.html.styles (anm8tr AT yahoo.com)
+	Nathan Toone - dojox.html.ellipsis (toonetown AT dojotoolkit.org)
+	Jared Jurkiewicz - dojox.html.entites, dojox.html.format (jared.jurkiewicz AT gmail.com)
 -------------------------------------------------------------------------------
 Project description
 
@@ -23,6 +25,8 @@ measurement routines aren't used by the majority of developers, but are complex
 enough to not be duplicated.
 Styles adds the ability to create and remove dynamic cssRules, as well as 
 manipulate document style sheets.
+Ellipsis adds some css definitions and dojo.behavior rules (for FF) to support
+text-overflow: ellipsis
 -------------------------------------------------------------------------------
 Dependencies:
 
diff --git a/dojox/html/_base.js b/dojox/html/_base.js
index 51347a3..a7f7e6c 100644
--- a/dojox/html/_base.js
+++ b/dojox/html/_base.js
@@ -34,75 +34,90 @@ return "url("+(new dojo._Url(_4,"./"+_f).toString())+")"+_10;
 var _11=/(<[a-z][a-z0-9]*\s[^>]*)(?:(href|src)=(['"]?)([^>]*?)\3|style=(['"]?)([^>]*?)\5)([^>]*>)/gi;
 var _12=dojox.html._adjustHtmlPaths=function(_13,_14){
 var url=_13||"./";
-return _14.replace(_11,function(tag,_17,_18,_19,_1a,_1b,_1c,end){
-return _17+(_18?(_18+"="+_19+(new dojo._Url(url,_1a).toString())+_19):("style="+_1b+_3(url,_1c)+_1b))+end;
+return _14.replace(_11,function(tag,_15,_16,_17,_18,_19,_1a,end){
+return _15+(_16?(_16+"="+_17+(new dojo._Url(url,_18).toString())+_17):("style="+_19+_3(url,_1a)+_19))+end;
 });
 };
-var _1e=dojox.html._snarfStyles=function(_1f,_20,_21){
-_21.attributes=[];
-return _20.replace(/(?:<style([^>]*)>([\s\S]*?)<\/style>|<link\s+(?=[^>]*rel=['"]?stylesheet)([^>]*?href=(['"])([^>]*?)\4[^>\/]*)\/?>)/gi,function(_22,_23,_24,_25,_26,_27){
-var i,_29=(_23||_25||"").replace(/^\s*([\s\S]*?)\s*$/i,"$1");
-if(_24){
-i=_21.push(_1f?_3(_1f,_24):_24);
+var _1b=dojox.html._snarfStyles=function(_1c,_1d,_1e){
+_1e.attributes=[];
+return _1d.replace(/(?:<style([^>]*)>([\s\S]*?)<\/style>|<link\s+(?=[^>]*rel=['"]?stylesheet)([^>]*?href=(['"])([^>]*?)\4[^>\/]*)\/?>)/gi,function(_1f,_20,_21,_22,_23,_24){
+var i,_25=(_20||_22||"").replace(/^\s*([\s\S]*?)\s*$/i,"$1");
+if(_21){
+i=_1e.push(_1c?_3(_1c,_21):_21);
 }else{
-i=_21.push("@import \""+_27+"\";");
-_29=_29.replace(/\s*(?:rel|href)=(['"])?[^\s]*\1\s*/gi,"");
+i=_1e.push("@import \""+_24+"\";");
+_25=_25.replace(/\s*(?:rel|href)=(['"])?[^\s]*\1\s*/gi,"");
 }
-if(_29){
-_29=_29.split(/\s+/);
-var _2a={},tmp;
-for(var j=0,e=_29.length;j<e;j++){
-tmp=_29[j].split("=");
-_2a[tmp[0]]=tmp[1].replace(/^\s*['"]?([\s\S]*?)['"]?\s*$/,"$1");
+if(_25){
+_25=_25.split(/\s+/);
+var _26={},tmp;
+for(var j=0,e=_25.length;j<e;j++){
+tmp=_25[j].split("=");
+_26[tmp[0]]=tmp[1].replace(/^\s*['"]?([\s\S]*?)['"]?\s*$/,"$1");
 }
-_21.attributes[i-1]=_2a;
+_1e.attributes[i-1]=_26;
 }
 return "";
 });
 };
-var _2e=dojox.html._snarfScripts=function(_2f,_30){
-_30.code="";
-function _31(src){
-if(_30.downloadRemote){
-dojo.xhrGet({url:src,sync:true,load:function(_33){
-_30.code+=_33+";";
-},error:_30.errBack});
+var _27=dojox.html._snarfScripts=function(_28,_29){
+_29.code="";
+_28=_28.replace(/<[!][-][-](.|\s){5,}?[-][-]>/g,function(_2a){
+return _2a.replace(/<(\/?)script\b/ig,"<$1Script");
+});
+function _2b(src){
+if(_29.downloadRemote){
+src=src.replace(/&([a-z0-9#]+);/g,function(m,_2c){
+switch(_2c){
+case "amp":
+return "&";
+case "gt":
+return ">";
+case "lt":
+return "<";
+default:
+return _2c.charAt(0)=="#"?String.fromCharCode(_2c.substring(1)):"&"+_2c+";";
+}
+});
+dojo.xhrGet({url:src,sync:true,load:function(_2d){
+_29.code+=_2d+";";
+},error:_29.errBack});
 }
 };
-return _2f.replace(/<script\s*(?![^>]*type=['"]?dojo)(?:[^>]*?(?:src=(['"]?)([^>]*?)\1[^>]*)?)*>([\s\S]*?)<\/script>/gi,function(_34,_35,src,_37){
+return _28.replace(/<script\s*(?![^>]*type=['"]?(?:dojo\/|text\/html\b))(?:[^>]*?(?:src=(['"]?)([^>]*?)\1[^>]*)?)*>([\s\S]*?)<\/script>/gi,function(_2e,_2f,src,_30){
 if(src){
-_31(src);
+_2b(src);
 }else{
-_30.code+=_37;
+_29.code+=_30;
 }
 return "";
 });
 };
-var _38=dojox.html.evalInGlobal=function(_39,_3a){
-_3a=_3a||dojo.doc.body;
-var n=_3a.ownerDocument.createElement("script");
+var _31=dojox.html.evalInGlobal=function(_32,_33){
+_33=_33||dojo.doc.body;
+var n=_33.ownerDocument.createElement("script");
 n.type="text/javascript";
-_3a.appendChild(n);
-n.text=_39;
+_33.appendChild(n);
+n.text=_32;
 };
-dojo.declare("dojox.html._ContentSetter",[dojo.html._ContentSetter],{adjustPaths:false,referencePath:".",renderStyles:false,executeScripts:false,scriptHasHooks:false,scriptHookReplacement:null,_renderStyles:function(_3c){
+dojo.declare("dojox.html._ContentSetter",[dojo.html._ContentSetter],{adjustPaths:false,referencePath:".",renderStyles:false,executeScripts:false,scriptHasHooks:false,scriptHookReplacement:null,_renderStyles:function(_34){
 this._styleNodes=[];
-var st,att,_3f,doc=this.node.ownerDocument;
-var _41=doc.getElementsByTagName("head")[0];
-for(var i=0,e=_3c.length;i<e;i++){
-_3f=_3c[i];
-att=_3c.attributes[i];
+var st,att,_35,doc=this.node.ownerDocument;
+var _36=doc.getElementsByTagName("head")[0];
+for(var i=0,e=_34.length;i<e;i++){
+_35=_34[i];
+att=_34.attributes[i];
 st=doc.createElement("style");
 st.setAttribute("type","text/css");
 for(var x in att){
 st.setAttribute(x,att[x]);
 }
 this._styleNodes.push(st);
-_41.appendChild(st);
+_36.appendChild(st);
 if(st.styleSheet){
-st.styleSheet.cssText=_3f;
+st.styleSheet.cssText=_35;
 }else{
-st.appendChild(doc.createTextNode(_3f));
+st.appendChild(doc.createTextNode(_35));
 }
 }
 },empty:function(){
@@ -110,44 +125,44 @@ this.inherited("empty",arguments);
 this._styles=[];
 },onBegin:function(){
 this.inherited("onBegin",arguments);
-var _45=this.content,_46=this.node;
-var _47=this._styles;
-if(dojo.isString(_45)){
+var _37=this.content,_38=this.node;
+var _39=this._styles;
+if(dojo.isString(_37)){
 if(this.adjustPaths&&this.referencePath){
-_45=_12(this.referencePath,_45);
+_37=_12(this.referencePath,_37);
 }
 if(this.renderStyles||this.cleanContent){
-_45=_1e(this.referencePath,_45,_47);
+_37=_1b(this.referencePath,_37,_39);
 }
 if(this.executeScripts){
-var _t=this;
-var _49={downloadRemote:true,errBack:function(e){
-_t._onError.call(_t,"Exec","Error downloading remote script in \""+_t.id+"\"",e);
+var _3a=this;
+var _3b={downloadRemote:true,errBack:function(e){
+_3a._onError.call(_3a,"Exec","Error downloading remote script in \""+_3a.id+"\"",e);
 }};
-_45=_2e(_45,_49);
-this._code=_49.code;
+_37=_27(_37,_3b);
+this._code=_3b.code;
 }
 }
-this.content=_45;
+this.content=_37;
 },onEnd:function(){
-var _4b=this._code,_4c=this._styles;
+var _3c=this._code,_3d=this._styles;
 if(this._styleNodes&&this._styleNodes.length){
 while(this._styleNodes.length){
 dojo.destroy(this._styleNodes.pop());
 }
 }
-if(this.renderStyles&&_4c&&_4c.length){
-this._renderStyles(_4c);
+if(this.renderStyles&&_3d&&_3d.length){
+this._renderStyles(_3d);
 }
-if(this.executeScripts&&_4b){
+if(this.executeScripts&&_3c){
 if(this.cleanContent){
-_4b=_4b.replace(/(<!--|(?:\/\/)?-->|<!\[CDATA\[|\]\]>)/g,"");
+_3c=_3c.replace(/(<!--|(?:\/\/)?-->|<!\[CDATA\[|\]\]>)/g,"");
 }
 if(this.scriptHasHooks){
-_4b=_4b.replace(/_container_(?!\s*=[^=])/g,this.scriptHookReplacement);
+_3c=_3c.replace(/_container_(?!\s*=[^=])/g,this.scriptHookReplacement);
 }
 try{
-_38(_4b,this.node);
+_31(_3c,this.node);
 }
 catch(e){
 this._onError("Exec","Error eval script in "+this.id+", "+e.message,e);
@@ -165,11 +180,11 @@ dojo.destroy(this._styleNodes.pop());
 delete this._styleNodes;
 dojo.mixin(this,dojo.getObject(this.declaredClass).prototype);
 }});
-dojox.html.set=function(_4d,_4e,_4f){
-if(!_4f){
-return dojo.html._setNodeContent(_4d,_4e,true);
+dojox.html.set=function(_3e,_3f,_40){
+if(!_40){
+return dojo.html._setNodeContent(_3e,_3f,true);
 }else{
-var op=new dojox.html._ContentSetter(dojo.mixin(_4f,{content:_4e,node:_4d}));
+var op=new dojox.html._ContentSetter(dojo.mixin(_40,{content:_3f,node:_3e}));
 return op.set();
 }
 };
diff --git a/dojox/html/ellipsis.js b/dojox/html/ellipsis.js
new file mode 100644
index 0000000..695fc12
--- /dev/null
+++ b/dojox/html/ellipsis.js
@@ -0,0 +1,168 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.html.ellipsis"]){
+dojo._hasResource["dojox.html.ellipsis"]=true;
+dojo.provide("dojox.html.ellipsis");
+(function(d){
+if(d.isMoz){
+var _1=1;
+if("dojoxFFEllipsisDelay" in d.config){
+_1=Number(d.config.dojoxFFEllipsisDelay);
+if(isNaN(_1)){
+_1=1;
+}
+}
+var _2="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
+var _3=document.createElementNS(_2,"window");
+var _4=document.createElementNS(_2,"description");
+_4.setAttribute("crop","end");
+_3.appendChild(_4);
+var _5=function(n){
+var x=_3.cloneNode(true);
+x.firstChild.setAttribute("value",n.textContent);
+n.innerHTML="";
+n.appendChild(x);
+};
+var _6=d.create;
+var dd=d.doc;
+var dp=d.place;
+var _7=_6("iframe",{className:"dojoxEllipsisIFrame",src:"javascript:'<html><head><script>if(\"loadFirebugConsole\" in window){window.loadFirebugConsole();}</script></head><body></body></html>'"});
+var _8=function(r,_9){
+if(r.collapsed){
+return;
+}
+if(_9>0){
+do{
+_8(r);
+_9--;
+}while(_9);
+return;
+}
+if(r.endContainer.nodeType==3&&r.endOffset>0){
+r.setEnd(r.endContainer,r.endOffset-1);
+}else{
+if(r.endContainer.nodeType==3){
+r.setEndBefore(r.endContainer);
+_8(r);
+return;
+}else{
+if(r.endOffset&&r.endContainer.childNodes.length>=r.endOffset){
+var _a=r.endContainer.childNodes[r.endOffset-1];
+if(_a.nodeType==3){
+r.setEnd(_a,_a.length-1);
+}else{
+if(_a.childNodes.length){
+r.setEnd(_a,_a.childNodes.length);
+_8(r);
+return;
+}else{
+r.setEndBefore(_a);
+_8(r);
+return;
+}
+}
+}else{
+r.setEndBefore(r.endContainer);
+_8(r);
+return;
+}
+}
+}
+};
+var _b=function(n){
+var c=_6("div",{className:"dojoxEllipsisContainer"});
+var e=_6("div",{className:"dojoxEllipsisShown",style:{display:"none"}});
+n.parentNode.replaceChild(c,n);
+c.appendChild(n);
+c.appendChild(e);
+var i=_7.cloneNode(true);
+var ns=n.style;
+var es=e.style;
+var _c;
+var _d=function(){
+ns.display="";
+es.display="none";
+if(n.scrollWidth<=n.offsetWidth){
+return;
+}
+var r=dd.createRange();
+r.selectNodeContents(n);
+ns.display="none";
+es.display="";
+var _e=false;
+do{
+var _f=1;
+dp(r.cloneContents(),e,"only");
+var sw=e.scrollWidth,ow=e.offsetWidth;
+_e=(sw<=ow);
+var pct=(1-((ow*1)/sw));
+if(pct>0){
+_f=Math.max(Math.round(e.textContent.length*pct)-1,1);
+}
+_8(r,_f);
+}while(!r.collapsed&&!_e);
+};
+i.onload=function(){
+i.contentWindow.onresize=_d;
+_d();
+};
+c.appendChild(i);
+};
+var hc=d.hasClass;
+var doc=d.doc;
+var s,fn,opt;
+if(doc.querySelectorAll){
+s=doc;
+fn="querySelectorAll";
+opt=".dojoxEllipsis";
+}else{
+if(doc.getElementsByClassName){
+s=doc;
+fn="getElementsByClassName";
+opt="dojoxEllipsis";
+}else{
+s=d;
+fn="query";
+opt=".dojoxEllipsis";
+}
+}
+fx=function(){
+d.forEach(s[fn].apply(s,[opt]),function(n){
+if(!n||n._djx_ellipsis_done){
+return;
+}
+n._djx_ellipsis_done=true;
+if(n.textContent==n.innerHTML&&!hc(n,"dojoxEllipsisSelectable")){
+_5(n);
+}else{
+_b(n);
+}
+});
+};
+d.addOnLoad(function(){
+var t=null;
+var c=null;
+var _10=function(){
+if(c){
+d.disconnect(c);
+c=null;
+}
+if(t){
+clearTimeout(t);
+}
+t=setTimeout(function(){
+t=null;
+fx();
+c=d.connect(d.body(),"DOMSubtreeModified",_10);
+},_1);
+};
+_10();
+});
+}
+})(dojo);
+}
diff --git a/dojox/html/entities.js b/dojox/html/entities.js
new file mode 100644
index 0000000..ab3e8fd
--- /dev/null
+++ b/dojox/html/entities.js
@@ -0,0 +1,85 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.html.entities"]){
+dojo._hasResource["dojox.html.entities"]=true;
+dojo.provide("dojox.html.entities");
+(function(){
+var _1=function(_2,_3){
+var _4,_5;
+if(_3._encCache&&_3._encCache.regexp&&_3._encCache.mapper&&_3.length==_3._encCache.length){
+_4=_3._encCache.mapper;
+_5=_3._encCache.regexp;
+}else{
+_4={};
+_5=["["];
+var i;
+for(i=0;i<_3.length;i++){
+_4[_3[i][0]]="&"+_3[i][1]+";";
+_5.push(_3[i][0]);
+}
+_5.push("]");
+_5=new RegExp(_5.join(""),"g");
+_3._encCache={mapper:_4,regexp:_5,length:_3.length};
+}
+_2=_2.replace(_5,function(c){
+return _4[c];
+});
+return _2;
+};
+var _6=function(_7,_8){
+var _9,_a;
+if(_8._decCache&&_8._decCache.regexp&&_8._decCache.mapper&&_8.length==_8._decCache.length){
+_9=_8._decCache.mapper;
+_a=_8._decCache.regexp;
+}else{
+_9={};
+_a=["("];
+var i;
+for(i=0;i<_8.length;i++){
+var e="&"+_8[i][1]+";";
+if(i){
+_a.push("|");
+}
+_9[e]=_8[i][0];
+_a.push(e);
+}
+_a.push(")");
+_a=new RegExp(_a.join(""),"g");
+_8._decCache={mapper:_9,regexp:_a,length:_8.length};
+}
+_7=_7.replace(_a,function(c){
+return _9[c];
+});
+return _7;
+};
+dojox.html.entities.html=[["&","amp"],["\"","quot"],["<","lt"],[">","gt"],[" ","nbsp"]];
+dojox.html.entities.latin=[["¡","iexcl"],["¢","cent"],["£","pound"],["€","euro"],["¤","curren"],["¥","yen"],["¦","brvbar"],["§","sect"],["¨","uml"],["©","copy"],["ª","ordf"],["«","laquo"],["¬","not"],["­","shy"],["®","reg"],["¯","macr"],["°","deg"],["±","plusmn"],["²","sup2"],["³","sup3"],["´","acute"],["µ","micro"],["¶","para"],["·","middot"],["¸","cedil"],["¹","sup1"],["º","ordm"],["»","raquo"],["¼","frac14"],["½","frac12"],["¾","frac34"],["¿","iquest"],["À","Agrave"],["Á","Aacute"],[" [...]
+dojox.html.entities.encode=function(_b,m){
+if(_b){
+if(!m){
+_b=_1(_b,dojox.html.entities.html);
+_b=_1(_b,dojox.html.entities.latin);
+}else{
+_b=_1(_b,m);
+}
+}
+return _b;
+};
+dojox.html.entities.decode=function(_c,m){
+if(_c){
+if(!m){
+_c=_6(_c,dojox.html.entities.html);
+_c=_6(_c,dojox.html.entities.latin);
+}else{
+_c=_6(_c,m);
+}
+}
+return _c;
+};
+})();
+}
diff --git a/dojox/html/format.js b/dojox/html/format.js
new file mode 100644
index 0000000..d766e46
--- /dev/null
+++ b/dojox/html/format.js
@@ -0,0 +1,340 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.html.format"]){
+dojo._hasResource["dojox.html.format"]=true;
+dojo.provide("dojox.html.format");
+dojo.require("dojox.html.entities");
+(function(){
+dojox.html.format.prettyPrint=function(_1,_2,_3,_4,_5){
+var _6=[];
+var _7=0;
+var _8=[];
+var _9="\t";
+var _a="";
+var _b=[];
+var i;
+var _c=/[=]([^"']+?)(\s|>)/g;
+var _d=/style=("[^"]*"|'[^']*'|\S*)/gi;
+var _e=/\s\w+=("[^"]*"|'[^']*'|\S*)/gi;
+if(_2&&_2>0&&_2<10){
+_9="";
+for(i=0;i<_2;i++){
+_9+=" ";
+}
+}
+var _f=dojo.doc.createElement("div");
+_f.innerHTML=_1;
+var _10=dojox.html.entities.encode;
+var _11=dojox.html.entities.decode;
+var _12=function(tag){
+switch(tag){
+case "a":
+case "b":
+case "strong":
+case "s":
+case "strike":
+case "i":
+case "u":
+case "em":
+case "sup":
+case "sub":
+case "span":
+case "font":
+case "big":
+case "cite":
+case "q":
+case "small":
+return true;
+default:
+return false;
+}
+};
+var div=_f.ownerDocument.createElement("div");
+var _13=function(_14){
+var _15=_14.cloneNode(false);
+div.appendChild(_15);
+var _16=div.innerHTML;
+div.innerHTML="";
+return _16;
+};
+var _17=function(){
+var i,txt="";
+for(i=0;i<_7;i++){
+txt+=_9;
+}
+return txt.length;
+};
+var _18=function(){
+var i;
+for(i=0;i<_7;i++){
+_6.push(_9);
+}
+};
+var _19=function(){
+_6.push("\n");
+};
+var _1a=function(n){
+_a+=_10(n.nodeValue,_4);
+};
+var _1b=function(txt){
+var i;
+var _1c;
+var _1d=txt.split("\n");
+for(i=0;i<_1d.length;i++){
+_1d[i]=dojo.trim(_1d[i]);
+}
+txt=_1d.join(" ");
+txt=dojo.trim(txt);
+if(txt!==""){
+var _1e=[];
+if(_3&&_3>0){
+var _1f=_17();
+var _20=_3;
+if(_3>_1f){
+_20-=_1f;
+}
+while(txt){
+if(txt.length>_3){
+for(i=_20;(i>0&&txt.charAt(i)!==" ");i--){
+}
+if(!i){
+for(i=_20;(i<txt.length&&txt.charAt(i)!==" ");i++){
+}
+}
+var _21=txt.substring(0,i);
+_21=dojo.trim(_21);
+txt=dojo.trim(txt.substring((i==txt.length)?txt.length:i+1,txt.length));
+if(_21){
+_1c="";
+for(i=0;i<_7;i++){
+_1c+=_9;
+}
+_21=_1c+_21+"\n";
+}
+_1e.push(_21);
+}else{
+_1c="";
+for(i=0;i<_7;i++){
+_1c+=_9;
+}
+txt=_1c+txt+"\n";
+_1e.push(txt);
+txt=null;
+}
+}
+return _1e.join("");
+}else{
+_1c="";
+for(i=0;i<_7;i++){
+_1c+=_9;
+}
+txt=_1c+txt+"\n";
+return txt;
+}
+}else{
+return "";
+}
+};
+var _22=function(txt){
+if(txt){
+txt=txt.replace(/"/gi,"\"");
+txt=txt.replace(/>/gi,">");
+txt=txt.replace(/</gi,"<");
+txt=txt.replace(/&/gi,"&");
+}
+return txt;
+};
+var _23=function(txt){
+if(txt){
+txt=_22(txt);
+var i,t,c,_24;
+var _25=0;
+var _26=txt.split("\n");
+var _27=[];
+for(i=0;i<_26.length;i++){
+var _28=_26[i];
+var _29=(_28.indexOf("\n")>-1);
+_28=dojo.trim(_28);
+if(_28){
+var _2a=_25;
+for(c=0;c<_28.length;c++){
+var ch=_28.charAt(c);
+if(ch==="{"){
+_25++;
+}else{
+if(ch==="}"){
+_25--;
+_2a=_25;
+}
+}
+}
+_24="";
+for(t=0;t<_7+_2a;t++){
+_24+=_9;
+}
+_27.push(_24+_28+"\n");
+}else{
+if(_29&&i===0){
+_27.push("\n");
+}
+}
+}
+txt=_27.join("");
+}
+return txt;
+};
+var _2b=function(_2c){
+var _2d=_2c.nodeName.toLowerCase();
+var _2e=dojo.trim(_13(_2c));
+var tag=_2e.substring(0,_2e.indexOf(">")+1);
+tag=tag.replace(_c,"=\"$1\"$2");
+tag=tag.replace(_d,function(_2f){
+var sL=_2f.substring(0,6);
+var _30=_2f.substring(6,_2f.length);
+var _31=_30.charAt(0);
+_30=dojo.trim(_30.substring(1,_30.length-1));
+_30=_30.split(";");
+var _32=[];
+dojo.forEach(_30,function(s){
+s=dojo.trim(s);
+if(s){
+s=s.substring(0,s.indexOf(":")).toLowerCase()+s.substring(s.indexOf(":"),s.length);
+_32.push(s);
+}
+});
+_32=_32.sort();
+_30=_32.join("; ");
+var ts=dojo.trim(_30);
+if(!ts||ts===";"){
+return "";
+}else{
+_30+=";";
+return sL+_31+_30+_31;
+}
+});
+var _33=[];
+tag=tag.replace(_e,function(_34){
+_33.push(dojo.trim(_34));
+return "";
+});
+_33=_33.sort();
+tag="<"+_2d;
+if(_33.length){
+tag+=" "+_33.join(" ");
+}
+if(_2e.indexOf("</")!=-1){
+_8.push(_2d);
+tag+=">";
+}else{
+if(_5){
+tag+=" />";
+}else{
+tag+=">";
+}
+_8.push(false);
+}
+var _35=_12(_2d);
+_b.push(_35);
+if(_a&&!_35){
+_6.push(_1b(_a));
+_a="";
+}
+if(!_35){
+_18();
+_6.push(tag);
+_19();
+_7++;
+}else{
+_a+=tag;
+}
+};
+var _36=function(){
+var _37=_b.pop();
+if(_a&&!_37){
+_6.push(_1b(_a));
+_a="";
+}
+var ct=_8.pop();
+if(ct){
+ct="</"+ct+">";
+if(!_37){
+_7--;
+_18();
+_6.push(ct);
+_19();
+}else{
+_a+=ct;
+}
+}else{
+_7--;
+}
+};
+var _38=function(n){
+var _39=_11(n.nodeValue,_4);
+_18();
+_6.push("<!--");
+_19();
+_7++;
+_6.push(_1b(_39));
+_7--;
+_18();
+_6.push("-->");
+_19();
+};
+var _3a=function(_3b){
+var _3c=_3b.childNodes;
+if(_3c){
+var i;
+for(i=0;i<_3c.length;i++){
+var n=_3c[i];
+if(n.nodeType===1){
+var tg=dojo.trim(n.tagName.toLowerCase());
+if(dojo.isIE&&n.parentNode!=_3b){
+continue;
+}
+if(tg&&tg.charAt(0)==="/"){
+continue;
+}else{
+_2b(n);
+if(tg==="script"){
+_6.push(_23(n.innerHTML));
+}else{
+if(tg==="pre"){
+var _3d=n.innerHTML;
+if(dojo.isMoz){
+_3d=_3d.replace("<br>","\n");
+_3d=_3d.replace("<pre>","");
+_3d=_3d.replace("</pre>","");
+}
+if(_3d.charAt(_3d.length-1)!=="\n"){
+_3d+="\n";
+}
+_6.push(_3d);
+}else{
+_3a(n);
+}
+}
+_36();
+}
+}else{
+if(n.nodeType===3||n.nodeType===4){
+_1a(n);
+}else{
+if(n.nodeType===8){
+_38(n);
+}
+}
+}
+}
+}
+};
+_3a(_f);
+return _6.join("");
+};
+})();
+}
diff --git a/dojox/html/metrics.js b/dojox/html/metrics.js
index 20dbd1e..b4804f6 100644
--- a/dojox/html/metrics.js
+++ b/dojox/html/metrics.js
@@ -37,50 +37,50 @@ dojo.body().removeChild(_3);
 _3=null;
 return _2;
 };
-var _6=null;
-_1.getCachedFontMeasurements=function(_7){
-if(_7||!_6){
-_6=_1.getFontMeasurements();
+var _4=null;
+_1.getCachedFontMeasurements=function(_5){
+if(_5||!_4){
+_4=_1.getFontMeasurements();
 }
-return _6;
+return _4;
 };
-var _8=null,_9={};
-_1.getTextBox=function(_a,_b,_c){
+var _6=null,_7={};
+_1.getTextBox=function(_8,_9,_a){
 var m;
-if(!_8){
-m=_8=dojo.doc.createElement("div");
+if(!_6){
+m=_6=dojo.doc.createElement("div");
 m.style.position="absolute";
-m.style.left="-10000px";
-m.style.top="0";
+m.style.left="0px";
+m.style.top="-10000px";
 dojo.body().appendChild(m);
 }else{
-m=_8;
+m=_6;
 }
 m.className="";
 m.style.border="0";
 m.style.margin="0";
 m.style.padding="0";
 m.style.outline="0";
-if(arguments.length>1&&_b){
-for(var i in _b){
-if(i in _9){
+if(arguments.length>1&&_9){
+for(var i in _9){
+if(i in _7){
 continue;
 }
-m.style[i]=_b[i];
+m.style[i]=_9[i];
 }
 }
-if(arguments.length>2&&_c){
-m.className=_c;
+if(arguments.length>2&&_a){
+m.className=_a;
 }
-m.innerHTML=_a;
+m.innerHTML=_8;
 return dojo.marginBox(m);
 };
-var _f={w:16,h:16};
+var _b={w:16,h:16};
 _1.getScrollbar=function(){
-return {w:_f.w,h:_f.h};
+return {w:_b.w,h:_b.h};
 };
 _1._fontResizeNode=null;
-_1.initOnFontResize=function(_10){
+_1.initOnFontResize=function(_c){
 var f=_1._fontResizeNode=dojo.doc.createElement("iframe");
 var fs=f.style;
 fs.position="absolute";
@@ -126,8 +126,8 @@ try{
 var n=dojo.doc.createElement("div");
 n.style.cssText="top:0;left:0;width:100px;height:100px;overflow:scroll;position:absolute;visibility:hidden;";
 dojo.body().appendChild(n);
-_f.w=n.offsetWidth-n.clientWidth;
-_f.h=n.offsetHeight-n.clientHeight;
+_b.w=n.offsetWidth-n.clientWidth;
+_b.h=n.offsetHeight-n.clientHeight;
 dojo.body().removeChild(n);
 delete n;
 }
diff --git a/dojox/html/resources/ellipsis.css b/dojox/html/resources/ellipsis.css
new file mode 100644
index 0000000..9922486
--- /dev/null
+++ b/dojox/html/resources/ellipsis.css
@@ -0,0 +1,33 @@
+.dojoxEllipsis,
+.dojoxEllipsisShown {
+	white-space: nowrap;
+	width: 100%;
+	overflow: hidden;
+	text-overflow: ellipsis;
+	-o-text-overflow: ellipsis;
+	-webkit-text-overflow: ellipsis;
+}
+.dojoxEllipsis window {
+    width:100%;
+    -moz-user-focus:normal;
+    -moz-user-select:text;
+}
+.dojoxEllipsis description{
+    -moz-user-focus:normal;
+    -moz-user-select:text;
+}
+.dojoxEllipsisIFrame{
+	white-space: normal;
+	border: none;
+	width: 100%;
+	display: block;
+	height: 1px;
+	margin-top: -1px;
+	clear: both;
+}
+.dojoxEllipsisContainer{
+	width: 100%;
+}
+.dojoxEllipsisShown:after{
+	content: "\2026"
+}
diff --git a/dojox/html/styles.js b/dojox/html/styles.js
index 71078d9..4229ad9 100644
--- a/dojox/html/styles.js
+++ b/dojox/html/styles.js
@@ -15,99 +15,93 @@ var _3=[];
 var _4=[];
 dojox.html.insertCssRule=function(_5,_6,_7){
 var ss=dojox.html.getDynamicStyleSheet(_7);
-var _9=_5+" {"+_6+"}";
-
+var _8=_5+" {"+_6+"}";
 if(dojo.isIE){
-ss.cssText+=_9;
-
+ss.cssText+=_8;
 }else{
 if(ss.sheet){
-ss.sheet.insertRule(_9,ss._indicies.length);
+ss.sheet.insertRule(_8,ss._indicies.length);
 }else{
-ss.appendChild(dojo.doc.createTextNode(_9));
+ss.appendChild(dojo.doc.createTextNode(_8));
 }
 }
 ss._indicies.push(_5+" "+_6);
 return _5;
 };
-dojox.html.removeCssRule=function(_a,_b,_c){
+dojox.html.removeCssRule=function(_9,_a,_b){
 var ss;
-var _e=-1;
+var _c=-1;
 for(var nm in _1){
-if(_c&&_c!=nm){
+if(_b&&_b!=nm){
 continue;
 }
 ss=_1[nm];
 for(var i=0;i<ss._indicies.length;i++){
-if(_a+" "+_b==ss._indicies[i]){
-_e=i;
+if(_9+" "+_a==ss._indicies[i]){
+_c=i;
 break;
 }
 }
-if(_e>-1){
+if(_c>-1){
 break;
 }
 }
 if(!ss){
-
 return false;
 }
-if(_e==-1){
-
+if(_c==-1){
 return false;
 }
-ss._indicies.splice(_e,1);
+ss._indicies.splice(_c,1);
 if(dojo.isIE){
-ss.removeRule(_e);
+ss.removeRule(_c);
 }else{
 if(ss.sheet){
-ss.sheet.deleteRule(_e);
+ss.sheet.deleteRule(_c);
 }else{
 if(document.styleSheets[0]){
-
 }
 }
 }
 return true;
 };
-dojox.html.getStyleSheet=function(_11){
-if(_1[_11||"default"]){
-return _1[_11||"default"];
+dojox.html.getStyleSheet=function(_d){
+if(_1[_d||"default"]){
+return _1[_d||"default"];
 }
-if(!_11){
+if(!_d){
 return false;
 }
-var _12=dojox.html.getStyleSheets();
-if(_12[_11]){
-return dojox.html.getStyleSheets()[_11];
+var _e=dojox.html.getStyleSheets();
+if(_e[_d]){
+return dojox.html.getStyleSheets()[_d];
 }
-for(var nm in _12){
-if(_12[nm].href&&_12[nm].href.indexOf(_11)>-1){
-return _12[nm];
+for(var nm in _e){
+if(_e[nm].href&&_e[nm].href.indexOf(_d)>-1){
+return _e[nm];
 }
 }
 return false;
 };
-dojox.html.getDynamicStyleSheet=function(_14){
-if(!_14){
-_14="default";
+dojox.html.getDynamicStyleSheet=function(_f){
+if(!_f){
+_f="default";
 }
-if(!_1[_14]){
+if(!_1[_f]){
 if(dojo.doc.createStyleSheet){
-_1[_14]=dojo.doc.createStyleSheet();
-_1[_14].title=_14;
+_1[_f]=dojo.doc.createStyleSheet();
+_1[_f].title=_f;
 }else{
-_1[_14]=dojo.doc.createElement("style");
-_1[_14].setAttribute("type","text/css");
-dojo.doc.getElementsByTagName("head")[0].appendChild(_1[_14]);
-
+_1[_f]=dojo.doc.createElement("style");
+_1[_f].setAttribute("type","text/css");
+dojo.doc.getElementsByTagName("head")[0].appendChild(_1[_f]);
 }
-_1[_14]._indicies=[];
+_1[_f]._indicies=[];
 }
-return _1[_14];
+return _1[_f];
 };
-dojox.html.enableStyleSheet=function(_15){
-var ss=dojox.html.getStyleSheet(_15);
+dojox.html.enableStyleSheet=function(_10){
+var ss=dojox.html.getStyleSheet(_10);
 if(ss){
 if(ss.sheet){
 ss.sheet.disabled=false;
@@ -116,8 +110,8 @@ ss.disabled=false;
 }
 }
 };
-dojox.html.disableStyleSheet=function(_17){
-var ss=dojox.html.getStyleSheet(_17);
+dojox.html.disableStyleSheet=function(_11){
+var ss=dojox.html.getStyleSheet(_11);
 if(ss){
 if(ss.sheet){
 ss.sheet.disabled=true;
@@ -126,16 +120,16 @@ ss.disabled=true;
 }
 }
 };
-dojox.html.activeStyleSheet=function(_19){
-var _1a=dojox.html.getToggledStyleSheets();
+dojox.html.activeStyleSheet=function(_12){
+var _13=dojox.html.getToggledStyleSheets();
 if(arguments.length==1){
-dojo.forEach(_1a,function(s){
-s.disabled=(s.title==_19)?false:true;
+dojo.forEach(_13,function(s){
+s.disabled=(s.title==_12)?false:true;
 });
 }else{
-for(var i=0;i<_1a.length;i++){
-if(_1a[i].disabled==false){
-return _1a[i];
+for(var i=0;i<_13.length;i++){
+if(_13[i].disabled==false){
+return _13[i];
 }
 }
 }
@@ -145,10 +139,10 @@ dojox.html.getPreferredStyleSheet=function(){
 };
 dojox.html.getToggledStyleSheets=function(){
 if(!_3.length){
-var _1d=dojox.html.getStyleSheets();
-for(var nm in _1d){
-if(_1d[nm].title){
-_3.push(_1d[nm]);
+var _14=dojox.html.getStyleSheets();
+for(var nm in _14){
+if(_14[nm].title){
+_3.push(_14[nm]);
 }
 }
 }
@@ -158,27 +152,27 @@ dojox.html.getStyleSheets=function(){
 if(_2.collected){
 return _2;
 }
-var _1f=dojo.doc.styleSheets;
-dojo.forEach(_1f,function(n){
+var _15=dojo.doc.styleSheets;
+dojo.forEach(_15,function(n){
 var s=(n.sheet)?n.sheet:n;
-var _22=s.title||s.href;
+var _16=s.title||s.href;
 if(dojo.isIE){
 if(s.cssText.indexOf("#default#VML")==-1){
 if(s.href){
-_2[_22]=s;
+_2[_16]=s;
 }else{
 if(s.imports.length){
 dojo.forEach(s.imports,function(si){
 _2[si.title||si.href]=si;
 });
 }else{
-_2[_22]=s;
+_2[_16]=s;
 }
 }
 }
 }else{
-_2[_22]=s;
-_2[_22].id=s.ownerNode.id;
+_2[_16]=s;
+_2[_16].id=s.ownerNode.id;
 dojo.forEach(s.cssRules,function(r){
 if(r.href){
 _2[r.href]=r.styleSheet;
diff --git a/dojox/image/Badge.js b/dojox/image/Badge.js
index 5ca3839..fab89f1 100644
--- a/dojox/image/Badge.js
+++ b/dojox/image/Badge.js
@@ -12,7 +12,7 @@ dojo.experimental("dojox.image.Badge");
 dojo.require("dijit._Widget");
 dojo.require("dijit._Templated");
 dojo.require("dojo.fx.easing");
-dojo.declare("dojox.image.Badge",[dijit._Widget,dijit._Templated],{baseClass:"dojoxBadge",templateString:"<div class=\"dojoxBadge\" dojoAttachPoint=\"containerNode\"></div>",children:"div.dojoxBadgeImage",rows:4,cols:5,cellSize:50,delay:2000,threads:1,easing:"dojo.fx.easing.backOut",startup:function(){
+dojo.declare("dojox.image.Badge",[dijit._Widget,dijit._Templated],{baseClass:"dojoxBadge",templateString:"<div class=\"dojoxBadge\" dojoAttachPoint=\"containerNode\"></div>",children:"div.dojoxBadgeImage",rows:4,cols:5,cellSize:50,cellMargin:1,delay:2000,threads:1,easing:"dojo.fx.easing.backOut",startup:function(){
 if(this._started){
 return;
 }
@@ -22,12 +22,12 @@ this.easing=dojo.getObject(this.easing);
 this.inherited(arguments);
 this._init();
 },_init:function(){
-var _1=0,_w=this.cellSize;
-dojo.style(this.domNode,{width:_w*this.cols+"px",height:_w*this.rows+"px"});
-this._nl=dojo.query(this.children,this.containerNode).forEach(function(n,_4){
-var _5=_4%this.cols,t=_1*_w,l=_5*_w;
-dojo.style(n,{top:t+"px",left:l+"px",width:_w-2+"px",height:_w-2+"px"});
-if(_5==this.cols-1){
+var _1=0,_2=this.cellSize;
+dojo.style(this.domNode,{width:_2*this.cols+"px",height:_2*this.rows+"px"});
+this._nl=dojo.query(this.children,this.containerNode).forEach(function(n,_3){
+var _4=_3%this.cols,t=_1*_2,l=_4*_2,m=this.cellMargin*2;
+dojo.style(n,{top:t+"px",left:l+"px",width:_2-m+"px",height:_2-m+"px"});
+if(_4==this.cols-1){
 _1++;
 }
 dojo.addClass(n,this.baseClass+"Image");
@@ -38,41 +38,40 @@ var s=Math.floor(Math.random()*l);
 setTimeout(dojo.hitch(this,"_enbiggen",{target:this._nl[s]}),this.delay*this.threads);
 }
 },_getCell:function(n){
-var _b=this._nl.indexOf(n);
-if(_b>=0){
-var _c=_b%this.cols;
-var _d=Math.floor(_b/this.cols);
-return {x:_c,y:_d,n:this._nl[_b],io:_b};
+var _5=this._nl.indexOf(n);
+if(_5>=0){
+var _6=_5%this.cols;
+var _7=Math.floor(_5/this.cols);
+return {x:_6,y:_7,n:this._nl[_5],io:_5};
 }else{
 return undefined;
 }
 },_getImage:function(){
 return "url('')";
 },_enbiggen:function(e){
-var _f=this._getCell(e.target||e);
-if(_f){
-var _cc=(this.cellSize*2)-2;
-var _11={height:_cc,width:_cc};
-var _12=function(){
+var _8=this._getCell(e.target||e);
+if(_8){
+var m=this.cellMargin,_9=(this.cellSize*2)-(m*2),_a={height:_9,width:_9};
+var _b=function(){
 return Math.round(Math.random());
 };
-if(_f.x==this.cols-1||(_f.x>0&&_12())){
-_11.left=this.cellSize*(_f.x-1);
+if(_8.x==this.cols-1||(_8.x>0&&_b())){
+_a.left=this.cellSize*(_8.x-m);
 }
-if(_f.y==this.rows-1||(_f.y>0&&_12())){
-_11.top=this.cellSize*(_f.y-1);
+if(_8.y==this.rows-1||(_8.y>0&&_b())){
+_a.top=this.cellSize*(_8.y-m);
 }
 var bc=this.baseClass;
-dojo.addClass(_f.n,bc+"Top");
-dojo.addClass(_f.n,bc+"Seen");
-dojo.animateProperty({node:_f.n,properties:_11,onEnd:dojo.hitch(this,"_loadUnder",_f,_11),easing:this.easing}).play();
+dojo.addClass(_8.n,bc+"Top");
+dojo.addClass(_8.n,bc+"Seen");
+dojo.animateProperty({node:_8.n,properties:_a,onEnd:dojo.hitch(this,"_loadUnder",_8,_a),easing:this.easing}).play();
 }
-},_loadUnder:function(_14,_15){
-var idx=_14.io;
-var _17=[];
-var _18=(_15.left>=0);
-var _19=(_15.top>=0);
-var c=this.cols,e=idx+(_18?-1:1),f=idx+(_19?-c:c),g=(_19?(_18?e-c:f+1):(_18?f-1:e+c)),bc=this.baseClass;
+},_loadUnder:function(_c,_d){
+var _e=_c.io;
+var _f=[];
+var _10=(_d.left>=0);
+var _11=(_d.top>=0);
+var c=this.cols,e=_e+(_10?-1:1),f=_e+(_11?-c:c),g=(_11?(_10?e-c:f+1):(_10?f-1:e+c)),bc=this.baseClass;
 dojo.forEach([e,f,g],function(x){
 var n=this._nl[x];
 if(n){
@@ -81,19 +80,19 @@ dojo.removeClass(n,bc+"Seen");
 }
 }
 },this);
-setTimeout(dojo.hitch(this,"_disenbiggen",_14,_15),this.delay*1.25);
-},_disenbiggen:function(_21,_22){
-if(_22.top>=0){
-_22.top+=this.cellSize;
+setTimeout(dojo.hitch(this,"_disenbiggen",_c,_d),this.delay*1.25);
+},_disenbiggen:function(_12,_13){
+if(_13.top>=0){
+_13.top+=this.cellSize;
 }
-if(_22.left>=0){
-_22.left+=this.cellSize;
+if(_13.left>=0){
+_13.left+=this.cellSize;
 }
-var _cc=this.cellSize-2;
-dojo.animateProperty({node:_21.n,properties:dojo.mixin(_22,{width:_cc,height:_cc}),onEnd:dojo.hitch(this,"_cycle",_21,_22)}).play(5);
-},_cycle:function(_24,_25){
+var _14=this.cellSize-(this.cellMargin*2);
+dojo.animateProperty({node:_12.n,properties:dojo.mixin(_13,{width:_14,height:_14}),onEnd:dojo.hitch(this,"_cycle",_12,_13)}).play(5);
+},_cycle:function(_15,_16){
 var bc=this.baseClass;
-dojo.removeClass(_24.n,bc+"Top");
+dojo.removeClass(_15.n,bc+"Top");
 var ns=this._nl.filter(function(n){
 return !dojo.hasClass(n,bc+"Seen");
 });
diff --git a/dojox/image/FlickrBadge.js b/dojox/image/FlickrBadge.js
index d5da30d..57775ed 100644
--- a/dojox/image/FlickrBadge.js
+++ b/dojox/image/FlickrBadge.js
@@ -47,10 +47,10 @@ a.href=this._store.getValue(_6,"link");
 if(this.target){
 a.target=this.target;
 }
-var _8=dojo.doc.createElement("img");
-_8.src=this._store.getValue(_6,"imageUrlThumb");
-dojo.style(_8,{width:"100%",height:"100%"});
-a.appendChild(_8);
+var _7=dojo.doc.createElement("img");
+_7.src=this._store.getValue(_6,"imageUrlThumb");
+dojo.style(_7,{width:"100%",height:"100%"});
+a.appendChild(_7);
 this.domNode.appendChild(a);
 },this);
 dojox.image.Badge.prototype.startup.call(this,_4);
diff --git a/dojox/image/Gallery.js b/dojox/image/Gallery.js
index 4b324ea..a7c6007 100644
--- a/dojox/image/Gallery.js
+++ b/dojox/image/Gallery.js
@@ -14,7 +14,7 @@ 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],{imageHeight:375,imageWidth:500,pageSize:dojox.image.SlideShow.prototype.pageSize,autoLoad:true,linkAttr:"link",imageThumbAttr:"imageUrlThumb",imageLargeAttr:"imageUrl",titleAttr:"title",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(){
+dojo.declare("dojox.image.Gallery",[dijit._Widget,dijit._Templated],{imageHeight:375,imageWidth:500,pageSize:dojox.image.SlideShow.prototype.pageSize,autoLoad:true,linkAttr:"link",imageThumbAttr:"imageUrlThumb",imageLargeAttr:"imageUrl",titleAttr:"title",slideshowInterval:3,templateString:dojo.cache("dojox.image","resources/Gallery.html","<div dojoAttachPoint=\"outerNode\" class=\"imageGalleryWrapper\">\n\t<div dojoAttachPoint=\"thumbPickerNode\"></div>\n\t<div dojoAttachPoint=\"slideSho [...]
 this.widgetid=this.id;
 this.inherited(arguments);
 this.thumbPicker=new dojox.image.ThumbnailPicker({linkAttr:this.linkAttr,imageLargeAttr:this.imageLargeAttr,imageThumbAttr:this.imageThumbAttr,titleAttr:this.titleAttr,useLoadNotifier:true,size:this.imageWidth},this.thumbPickerNode);
@@ -42,18 +42,23 @@ this.thumbPicker.reset();
 },showNextImage:function(_9){
 this.slideShow.showNextImage();
 },toggleSlideshow:function(){
-this.slideShow.toggleSlideshow();
+dojo.deprecated("dojox.widget.Gallery.toggleSlideshow is deprecated.  Use toggleSlideShow instead.","","2.0");
+this.toggleSlideShow();
+},toggleSlideShow:function(){
+this.slideShow.toggleSlideShow();
 },showImage:function(_a,_b){
 this.slideShow.showImage(_a,_b);
+},resize:function(_c){
+this.thumbPicker.resize(_c);
 },_centerChildren:function(){
-var _c=dojo.marginBox(this.thumbPicker.outerNode);
-var _d=dojo.marginBox(this.slideShow.outerNode);
-var _e=(_c.w-_d.w)/2;
-if(_e>0){
-dojo.style(this.slideShow.outerNode,"marginLeft",_e+"px");
+var _d=dojo.marginBox(this.thumbPicker.outerNode);
+var _e=dojo.marginBox(this.slideShow.outerNode);
+var _f=(_d.w-_e.w)/2;
+if(_f>0){
+dojo.style(this.slideShow.outerNode,"marginLeft",_f+"px");
 }else{
-if(_e<0){
-dojo.style(this.thumbPicker.outerNode,"marginLeft",(_e*-1)+"px");
+if(_f<0){
+dojo.style(this.thumbPicker.outerNode,"marginLeft",(_f*-1)+"px");
 }
 }
 }});
diff --git a/dojox/image/Lightbox.js b/dojox/image/Lightbox.js
index e57065b..bd03195 100644
--- a/dojox/image/Lightbox.js
+++ b/dojox/image/Lightbox.js
@@ -43,7 +43,7 @@ this._allowPassthru=true;
 this._allowPassthru=false;
 },onClick:function(){
 }});
-dojo.declare("dojox.image.LightboxDialog",dijit.Dialog,{title:"",inGroup:null,imgUrl:dijit._Widget.prototype._blankGif,errorMessage:"Image not found.",adjust:true,modal:false,_groups:{XnoGroupX:[]},errorImg:dojo.moduleUrl("dojox.image","resources/images/warning.png"),_fixSizes:false,templateString:"<div class=\"dojoxLightbox\" dojoAttachPoint=\"containerNode\">\n\t<div style=\"position:relative\">\n\t\t<div dojoAttachPoint=\"imageContainer\" class=\"dojoxLightboxContainer\" dojoAttachEve [...]
+dojo.declare("dojox.image.LightboxDialog",dijit.Dialog,{title:"",inGroup:null,imgUrl:dijit._Widget.prototype._blankGif,errorMessage:"Image not found.",adjust:true,modal:false,_groups:{XnoGroupX:[]},errorImg:dojo.moduleUrl("dojox.image","resources/images/warning.png"),templateString:dojo.cache("dojox.image","resources/Lightbox.html","<div class=\"dojoxLightbox\" dojoAttachPoint=\"containerNode\">\n\t<div style=\"position:relative\">\n\t\t<div dojoAttachPoint=\"imageContainer\" class=\"doj [...]
 this.inherited(arguments);
 this._animConnects=[];
 this.connect(this.nextNode,"onclick","_nextImage");
@@ -52,65 +52,65 @@ this.connect(this.closeNode,"onclick","hide");
 this._makeAnims();
 this._vp=dijit.getViewport();
 return this;
-},show:function(_3){
-var _t=this;
-this._lastGroup=_3;
-if(!_t.open){
-_t.inherited(arguments);
+},show:function(_2){
+var _3=this;
+this._lastGroup=_2;
+if(!_3.open){
+_3.inherited(arguments);
 this._modalconnects.push(dojo.connect(dojo.global,"onscroll",this,"_position"),dojo.connect(dojo.global,"onresize",this,"_position"),dojo.connect(dojo.body(),"onkeypress",this,"_handleKey"));
-if(!_3.modal){
+if(!_2.modal){
 this._modalconnects.push(dojo.connect(dijit._underlay.domNode,"onclick",this,"onCancel"));
 }
 }
 if(this._wasStyled){
-dojo.destroy(_t.imgNode);
-_t.imgNode=dojo.create("img",null,_t.imageContainer,"first");
-_t._makeAnims();
-_t._wasStyled=false;
-}
-dojo.style(_t.imgNode,"opacity","0");
-dojo.style(_t.titleNode,"opacity","0");
-var _5=_3.href;
-if((_3.group&&_3!=="XnoGroupX")||_t.inGroup){
-if(!_t.inGroup){
-_t.inGroup=_t._groups[(_3.group)];
-dojo.forEach(_t.inGroup,function(g,i){
-if(g.href==_3.href){
-_t._index=i;
-}
-},_t);
-}
-if(!_t._index){
-_t._index=0;
-_5=_t.inGroup[_t._index].href;
-}
-_t.groupCount.innerHTML=" ("+(_t._index+1)+" of "+_t.inGroup.length+")";
-_t.prevNode.style.visibility="visible";
-_t.nextNode.style.visibility="visible";
+dojo.destroy(_3.imgNode);
+_3.imgNode=dojo.create("img",null,_3.imageContainer,"first");
+_3._makeAnims();
+_3._wasStyled=false;
+}
+dojo.style(_3.imgNode,"opacity","0");
+dojo.style(_3.titleNode,"opacity","0");
+var _4=_2.href;
+if((_2.group&&_2!=="XnoGroupX")||_3.inGroup){
+if(!_3.inGroup){
+_3.inGroup=_3._groups[(_2.group)];
+dojo.forEach(_3.inGroup,function(g,i){
+if(g.href==_2.href){
+_3._index=i;
+}
+},_3);
+}
+if(!_3._index){
+_3._index=0;
+_4=_3.inGroup[_3._index].href;
+}
+_3.groupCount.innerHTML=" ("+(_3._index+1)+" of "+_3.inGroup.length+")";
+_3.prevNode.style.visibility="visible";
+_3.nextNode.style.visibility="visible";
 }else{
-_t.groupCount.innerHTML="";
-_t.prevNode.style.visibility="hidden";
-_t.nextNode.style.visibility="hidden";
-}
-if(!_3.leaveTitle){
-_t.textNode.innerHTML=_3.title;
-}
-_t._ready(_5);
-},_ready:function(_8){
-var _t=this;
-_t._imgError=dojo.connect(_t.imgNode,"error",_t,function(){
-dojo.disconnect(_t._imgError);
-_t.imgNode.src=_t.errorImg;
-_t.textNode.innerHTML=_t.errorMessage;
+_3.groupCount.innerHTML="";
+_3.prevNode.style.visibility="hidden";
+_3.nextNode.style.visibility="hidden";
+}
+if(!_2.leaveTitle){
+_3.textNode.innerHTML=_2.title;
+}
+_3._ready(_4);
+},_ready:function(_5){
+var _6=this;
+_6._imgError=dojo.connect(_6.imgNode,"error",_6,function(){
+dojo.disconnect(_6._imgError);
+_6.imgNode.src=_6.errorImg;
+_6.textNode.innerHTML=_6.errorMessage;
 });
-_t._imgConnect=dojo.connect(_t.imgNode,"load",_t,function(e){
-_t.resizeTo({w:_t.imgNode.width,h:_t.imgNode.height,duration:_t.duration});
-dojo.disconnect(_t._imgConnect);
-if(_t._imgError){
-dojo.disconnect(_t._imgError);
+_6._imgConnect=dojo.connect(_6.imgNode,"load",_6,function(e){
+_6.resizeTo({w:_6.imgNode.width,h:_6.imgNode.height,duration:_6.duration});
+dojo.disconnect(_6._imgConnect);
+if(_6._imgError){
+dojo.disconnect(_6._imgError);
 }
 });
-_t.imgNode.src=_8;
+_6.imgNode.src=_5;
 },_nextImage:function(){
 if(!this.inGroup){
 return;
@@ -135,34 +135,34 @@ this._loadingAnim.play(1);
 },_prepNodes:function(){
 this._imageReady=false;
 this.show({href:this.inGroup[this._index].href,title:this.inGroup[this._index].title});
-},resizeTo:function(_b,_c){
-var _d=dojo.boxModel=="border-box"?dojo._getBorderExtents(this.domNode).w:0,_e=_c||{h:30};
-this._lastTitleSize=_e;
-if(this.adjust&&(_b.h+_e.h+_d+80>this._vp.h||_b.w+_d+60>this._vp.w)){
-this._lastSize=_b;
-_b=this._scaleToFit(_b);
-}
-this._currentSize=_b;
-var _f=dojox.fx.sizeTo({node:this.containerNode,duration:_b.duration||this.duration,width:_b.w+_d,height:_b.h+_e.h+_d});
-this.connect(_f,"onEnd","_showImage");
-_f.play(15);
-},_scaleToFit:function(_10){
+},resizeTo:function(_7,_8){
+var _9=dojo.boxModel=="border-box"?dojo._getBorderExtents(this.domNode).w:0,_a=_8||{h:30};
+this._lastTitleSize=_a;
+if(this.adjust&&(_7.h+_a.h+_9+80>this._vp.h||_7.w+_9+60>this._vp.w)){
+this._lastSize=_7;
+_7=this._scaleToFit(_7);
+}
+this._currentSize=_7;
+var _b=dojox.fx.sizeTo({node:this.containerNode,duration:_7.duration||this.duration,width:_7.w+_9,height:_7.h+_a.h+_9});
+this.connect(_b,"onEnd","_showImage");
+_b.play(15);
+},_scaleToFit:function(_c){
 var ns={};
 if(this._vp.h>this._vp.w){
 ns.w=this._vp.w-80;
-ns.h=ns.w*(_10.h/_10.w);
+ns.h=ns.w*(_c.h/_c.w);
 }else{
 ns.h=this._vp.h-60-this._lastTitleSize.h;
-ns.w=ns.h*(_10.w/_10.h);
+ns.w=ns.h*(_c.w/_c.h);
 }
 this._wasStyled=true;
 this._setImageSize(ns);
-ns.duration=_10.duration;
+ns.duration=_c.duration;
 return ns;
-},_setImageSize:function(_12){
+},_setImageSize:function(_d){
 var s=this.imgNode;
-s.height=_12.h;
-s.width=_12.w;
+s.height=_d.h;
+s.width=_d.w;
 },_size:function(){
 },_position:function(e){
 this._vp=dijit.getViewport();
@@ -180,9 +180,9 @@ this.resizeTo({w:this.imgNode.width,h:this.imgNode.height});
 },_showImage:function(){
 this._showImageAnim.play(1);
 },_showNav:function(){
-var _15=dojo.marginBox(this.titleNode);
-if(_15.h>this._lastTitleSize.h){
-this.resizeTo(this._wasStyled?this._lastSize:this._currentSize,_15);
+var _e=dojo.marginBox(this.titleNode);
+if(_e.h>this._lastTitleSize.h){
+this.resizeTo(this._wasStyled?this._lastSize:this._currentSize,_e);
 }else{
 this._showNavAnim.play(1);
 }
@@ -193,18 +193,18 @@ this.imgNode.src=this._blankGif;
 this.inherited(arguments);
 this.inGroup=null;
 this._index=null;
-},addImage:function(_16,_17){
-var g=_17;
-if(!_16.href){
+},addImage:function(_f,_10){
+var g=_10;
+if(!_f.href){
 return;
 }
 if(g){
 if(!this._groups[g]){
 this._groups[g]=[];
 }
-this._groups[g].push(_16);
+this._groups[g].push(_f);
 }else{
-this._groups["XnoGroupX"].push(_16);
+this._groups["XnoGroupX"].push(_f);
 }
 },_handleKey:function(e){
 if(!this.open){
@@ -234,7 +234,7 @@ 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});
-},onClick:function(_1b){
+},onClick:function(_11){
 },_onImageClick:function(e){
 if(e&&e.target==this.imgNode){
 this.onClick(this._lastGroup);
diff --git a/dojox/image/LightboxNano.js b/dojox/image/LightboxNano.js
index 0e05c88..67b14ac 100644
--- a/dojox/image/LightboxNano.js
+++ b/dojox/image/LightboxNano.js
@@ -10,53 +10,56 @@ dojo._hasResource["dojox.image.LightboxNano"]=true;
 dojo.provide("dojox.image.LightboxNano");
 dojo.require("dojo.fx");
 (function(d){
-var _2=function(){
-var _3=(d.doc.compatMode=="BackCompat")?d.body():d.doc.documentElement,_4=dojo._docScroll();
-return {w:_3.clientWidth,h:_3.clientHeight,l:_4.x,t:_4.y};
-},_5="absolute";
+var _1="absolute",_2="visibility",_3=function(){
+var _4=(d.doc.compatMode=="BackCompat")?d.body():d.doc.documentElement,_5=dojo._docScroll();
+return {w:_4.clientWidth,h:_4.clientHeight,l:_5.x,t:_5.y};
+};
 d.declare("dojox.image.LightboxNano",null,{href:"",duration:500,preloadDelay:5000,constructor:function(p,n){
-var _8=this;
-d.mixin(_8,p);
-n=dojo.byId(n);
+var _6=this;
+d.mixin(_6,p);
+n=_6._node=dojo.byId(n);
+if(n){
 if(!/a/i.test(n.tagName)){
-var a=d.create("a",{href:_8.href,"class":n.className},n,"after");
+var a=d.create("a",{href:_6.href,"class":n.className},n,"after");
 n.className="";
 a.appendChild(n);
 n=a;
 }
-d.style(n,{display:"block",position:"relative"});
-_8._createDiv("dojoxEnlarge",n);
-_8._node=n;
+d.style(n,"position","relative");
+_6._createDiv("dojoxEnlarge",n);
 d.setSelectable(n,false);
-_8._onClickEvt=d.connect(n,"onclick",_8,"_load");
+_6._onClickEvt=d.connect(n,"onclick",_6,"_load");
+}
+if(_6.href){
 setTimeout(function(){
-(new Image()).src=_8.href;
-_8._hideLoading();
-},_8.preloadDelay);
+(new Image()).src=_6.href;
+_6._hideLoading();
+},_6.preloadDelay);
+}
 },destroy:function(){
 var a=this._connects||[];
 a.push(this._onClickEvt);
 d.forEach(a,d.disconnect);
 d.destroy(this._node);
-},_createDiv:function(_b,_c,_d){
-return d.create("div",{"class":_b,style:{position:_5,display:_d?"":"none"}},_c);
+},_createDiv:function(_7,_8,_9){
+return d.create("div",{"class":_7,style:{position:_1,display:_9?"":"none"}},_8);
 },_load:function(e){
-var _f=this;
-d.stopEvent(e);
-if(!_f._loading){
-_f._loading=true;
-_f._reset();
-var n=d.query("img",_f._node)[0],a=d._abs(n,true),c=d.contentBox(n),b=d._getBorderExtents(n),i=_f._img=d.create("img",{style:{visibility:"hidden",cursor:"pointer",position:_5,top:0,left:0,zIndex:9999999}},d.body()),ln=_f._loadingNode;
+var _a=this;
+e&&d.stopEvent(e);
+if(!_a._loading){
+_a._loading=true;
+_a._reset();
+var i=_a._img=d.create("img",{style:{visibility:"hidden",cursor:"pointer",position:_1,top:0,left:0,zIndex:9999999}},d.body()),ln=_a._loadingNode,n=d.query("img",_a._node)[0]||_a._node,a=d.position(n,true),c=d.contentBox(n),b=d._getBorderExtents(n);
 if(ln==null){
-_f._loadingNode=ln=_f._createDiv("dojoxLoading",_f._node,true);
+_a._loadingNode=ln=_a._createDiv("dojoxLoading",_a._node,true);
 var l=d.marginBox(ln);
 d.style(ln,{left:parseInt((c.w-l.w)/2)+"px",top:parseInt((c.h-l.h)/2)+"px"});
 }
 c.x=a.x-10+b.l;
 c.y=a.y-10+b.t;
-_f._start=c;
-_f._connects=[d.connect(i,"onload",_f,"_show")];
-i.src=_f.href;
+_a._start=c;
+_a._connects=[d.connect(i,"onload",_a,"_show")];
+i.src=_a.href;
 }
 },_hideLoading:function(){
 if(this._loadingNode){
@@ -64,25 +67,25 @@ d.style(this._loadingNode,"display","none");
 }
 this._loadingNode=false;
 },_show:function(){
-var _17=this,vp=_2(),w=_17._img.width,h=_17._img.height,vpw=parseInt((vp.w-20)*0.9),vph=parseInt((vp.h-20)*0.9),dd=d.doc,bg=_17._bg=d.create("div",{style:{backgroundColor:"#000",opacity:0,position:_5,zIndex:9999998}},d.body()),ln=_17._loadingNode;
-if(_17._loadingNode){
-_17._hideLoading();
+var _b=this,vp=_3(),w=_b._img.width,h=_b._img.height,_c=parseInt((vp.w-20)*0.9),_d=parseInt((vp.h-20)*0.9),dd=d.doc,bg=_b._bg=d.create("div",{style:{backgroundColor:"#000",opacity:0,position:_1,zIndex:9999998}},d.body()),ln=_b._loadingNode;
+if(_b._loadingNode){
+_b._hideLoading();
 }
-d.style(_17._img,{border:"10px solid #fff",visibility:"visible"});
-d.style(_17._node,"visibility","hidden");
-_17._loading=false;
-_17._connects=_17._connects.concat([d.connect(dd,"onmousedown",_17,"_hide"),d.connect(dd,"onkeypress",_17,"_key"),d.connect(window,"onresize",_17,"_sizeBg")]);
-if(w>vpw){
-h=h*vpw/w;
-w=vpw;
+d.style(_b._img,{border:"10px solid #fff",visibility:"visible"});
+d.style(_b._node,_2,"hidden");
+_b._loading=false;
+_b._connects=_b._connects.concat([d.connect(dd,"onmousedown",_b,"_hide"),d.connect(dd,"onkeypress",_b,"_key"),d.connect(window,"onresize",_b,"_sizeBg")]);
+if(w>_c){
+h=h*_c/w;
+w=_c;
 }
-if(h>vph){
-w=w*vph/h;
-h=vph;
+if(h>_d){
+w=w*_d/h;
+h=_d;
 }
-_17._end={x:(vp.w-20-w)/2+vp.l,y:(vp.h-20-h)/2+vp.t,w:w,h:h};
-_17._sizeBg();
-d.fx.combine([_17._anim(_17._img,_17._coords(_17._start,_17._end)),_17._anim(bg,{opacity:0.5})]).play();
+_b._end={x:(vp.w-20-w)/2+vp.l,y:(vp.h-20-h)/2+vp.t,w:w,h:h};
+_b._sizeBg();
+d.fx.combine([_b._anim(_b._img,_b._coords(_b._start,_b._end)),_b._anim(bg,{opacity:0.5})]).play();
 },_sizeBg:function(){
 var dd=d.doc.documentElement;
 d.style(this._bg,{top:0,left:0,width:dd.scrollWidth+"px",height:dd.scrollHeight+"px"});
@@ -92,19 +95,28 @@ this._hide();
 },_coords:function(s,e){
 return {left:{start:s.x,end:e.x},top:{start:s.y,end:e.y},width:{start:s.w,end:e.w},height:{start:s.h,end:e.h}};
 },_hide:function(){
-var _24=this;
-d.forEach(_24._connects,d.disconnect);
-_24._connects=[];
-d.fx.combine([_24._anim(_24._img,_24._coords(_24._end,_24._start),"_reset"),_24._anim(_24._bg,{opacity:0})]).play();
+var _e=this;
+d.forEach(_e._connects,d.disconnect);
+_e._connects=[];
+d.fx.combine([_e._anim(_e._img,_e._coords(_e._end,_e._start),"_reset"),_e._anim(_e._bg,{opacity:0})]).play();
 },_reset:function(){
-d.style(this._node,"visibility","visible");
+d.style(this._node,_2,"visible");
 d.forEach([this._img,this._bg],function(n){
 d.destroy(n);
 n=null;
 });
 this._node.focus();
-},_anim:function(_26,_27,_28){
-return d.animateProperty({node:_26,duration:this.duration,properties:_27,onEnd:_28?d.hitch(this,_28):null});
+},_anim:function(_f,_10,_11){
+return d.animateProperty({node:_f,duration:this.duration,properties:_10,onEnd:_11?d.hitch(this,_11):null});
+},show:function(_12){
+_12=_12||{};
+this.href=_12.href||this.href;
+var n=d.byId(_12.origin),vp=_3();
+this._node=n||d.create("div",{style:{position:_1,width:0,hieght:0,left:(vp.l+(vp.w/2))+"px",top:(vp.t+(vp.h/2))+"px"}},d.body());
+this._load();
+if(!n){
+d.destroy(this._node);
+}
 }});
 })(dojo);
 }
diff --git a/dojox/image/Magnifier.js b/dojox/image/Magnifier.js
index f4681d2..d4d8e9e 100644
--- a/dojox/image/Magnifier.js
+++ b/dojox/image/Magnifier.js
@@ -10,32 +10,20 @@ 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],{_createGlass:function(){
-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";
-}
+dojo.declare("dojox.image.Magnifier",dojox.image.MagnifierLite,{_createGlass:function(){
+this.glassNode=dojo.create("div",{style:{height:this.glassSize+"px",width:this.glassSize+"px"},"className":"glassNode"},dojo.body());
+this.surfaceNode=dojo.create("div",null,this.glassNode);
 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){
-var x=e.pageX-2;
-var y=e.pageY-2;
-var _4=this.offset.x+this.offset.w+2;
-var _5=this.offset.y+this.offset.h+2;
-if(x<this.offset.x||y<this.offset.y||x>_4||y>_5){
+var x=e.pageX-2,y=e.pageY-2,_1=this.offset.x+this.offset.w+2,_2=this.offset.y+this.offset.h+2;
+if(x<this.offset.x||y<this.offset.y||x>_1||y>_2){
 this._hideGlass();
 }else{
 this.inherited(arguments);
 }
 },_setImage:function(e){
-var _7=(e.pageX-this.offset.l)/this.offset.w;
-var _8=(e.pageY-this.offset.t)/this.offset.h;
-var x=(this._zoomSize.w*_7*-1)+(this.glassSize*_7);
-var y=(this._zoomSize.h*_8*-1)+(this.glassSize*_8);
+var _3=(e.pageX-this.offset.l)/this.offset.w,_4=(e.pageY-this.offset.t)/this.offset.h,x=(this._zoomSize.w*_3*-1)+(this.glassSize*_3),y=(this._zoomSize.h*_4*-1)+(this.glassSize*_4);
 this.img.setShape({x:x,y:y});
 }});
 }
diff --git a/dojox/image/MagnifierLite.js b/dojox/image/MagnifierLite.js
index ded4761..e866a87 100644
--- a/dojox/image/MagnifierLite.js
+++ b/dojox/image/MagnifierLite.js
@@ -19,13 +19,9 @@ this.connect(this.glassNode,"onmousemove","_placeGlass");
 this.connect(this.img,"onmouseout","_hideGlass");
 this.connect(window,"onresize","_adjustScale");
 },_createGlass:function(){
-var _1=this.glassNode=dojo.doc.createElement("div");
-this.surfaceNode=_1.appendChild(dojo.doc.createElement("div"));
-dojo.addClass(_1,"glassNode");
-dojo.body().appendChild(_1);
-dojo.style(_1,{height:this.glassSize+"px",width:this.glassSize+"px"});
-this.img=dojo.clone(this.domNode);
-_1.appendChild(this.img);
+var _1=this.glassNode=dojo.create("div",{style:{height:this.glassSize+"px",width:this.glassSize+"px"},className:"glassNode"},dojo.body());
+this.surfaceNode=_1.appendChild(dojo.create("div"));
+this.img=dojo.place(dojo.clone(this.domNode),_1);
 dojo.style(this.img,{position:"relative",top:0,left:0,width:this._zoomSize.w+"px",height:this._zoomSize.h+"px"});
 },_adjustScale:function(){
 this.offset=dojo.coords(this.domNode,true);
@@ -38,15 +34,12 @@ dojo.style(this.glassNode,{visibility:"visible",display:""});
 dojo.style(this.glassNode,{visibility:"hidden",display:"none"});
 },_placeGlass:function(e){
 this._setImage(e);
-var _5=Math.floor(this.glassSize/2);
-dojo.style(this.glassNode,{top:Math.floor(e.pageY-_5)+"px",left:Math.floor(e.pageX-_5)+"px"});
+var _2=Math.floor(this.glassSize/2);
+dojo.style(this.glassNode,{top:Math.floor(e.pageY-_2)+"px",left:Math.floor(e.pageX-_2)+"px"});
 },_setImage:function(e){
-var _7=(e.pageX-this.offset.l)/this.offset.w;
-var _8=(e.pageY-this.offset.t)/this.offset.h;
-var x=(this._zoomSize.w*_7*-1)+(this.glassSize*_7);
-var y=(this._zoomSize.h*_8*-1)+(this.glassSize*_8);
+var _3=(e.pageX-this.offset.l)/this.offset.w,_4=(e.pageY-this.offset.t)/this.offset.h,x=(this._zoomSize.w*_3*-1)+(this.glassSize*_3),y=(this._zoomSize.h*_4*-1)+(this.glassSize*_4);
 dojo.style(this.img,{top:y+"px",left:x+"px"});
-},destroy:function(_b){
+},destroy:function(_5){
 dojo.destroy(this.glassNode);
 this.inherited(arguments);
 }});
diff --git a/dojox/image/SlideShow.js b/dojox/image/SlideShow.js
index d60ec3f..b95b23b 100644
--- a/dojox/image/SlideShow.js
+++ b/dojox/image/SlideShow.js
@@ -12,7 +12,7 @@ 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],{imageHeight:375,imageWidth:500,title:"",titleTemplate:"${title} <span class=\"slideShowCounterText\">(${current} of ${total})</span>",noLink:false,loop:true,hasNav:true,images:[],pageSize:20,autoLoad:true,autoStart:false,fixedHeight:false,imageStore:null,linkAttr:"link",imageLargeAttr:"imageUrl",titleAttr:"title",slideshowInterval:3,templateString:"<div dojoAttachPoint=\"outerNode\" class=\"slideShowWrapper\">\n\t<div [...]
+dojo.declare("dojox.image.SlideShow",[dijit._Widget,dijit._Templated],{imageHeight:375,imageWidth:500,title:"",titleTemplate:"${title} <span class=\"slideShowCounterText\">(${current} of ${total})</span>",noLink:false,loop:true,hasNav:true,images:[],pageSize:20,autoLoad:true,autoStart:false,fixedHeight:false,imageStore:null,linkAttr:"link",imageLargeAttr:"imageUrl",titleAttr:"title",slideshowInterval:3,templateString:dojo.cache("dojox.image","resources/SlideShow.html","<div dojoAttachPoi [...]
 this.inherited(arguments);
 var _1=document.createElement("img");
 _1.setAttribute("width",this.imageWidth);
@@ -59,10 +59,12 @@ this[_b]=_7[_b];
 }
 var _c=function(_d){
 _8.maxPhotos=_d.length;
-_8.showImage(0);
 _8._request.onComplete=null;
 if(_8.autoStart){
+_8.imageIndex=-1;
 _8.toggleSlideShow();
+}else{
+_8.showImage(0);
 }
 };
 this.imageStore=_5;
@@ -70,13 +72,9 @@ this._request.onComplete=_c;
 this._request.start=0;
 this.imageStore.fetch(this._request);
 },reset:function(){
-while(this.largeNode.firstChild){
-this.largeNode.removeChild(this.largeNode.firstChild);
-}
+dojo.query("> *",this.largeNode).orphan();
 this.largeNode.appendChild(this._tmpImage);
-while(this.hiddenNode.firstChild){
-this.hiddenNode.removeChild(this.hiddenNode.firstChild);
-}
+dojo.query("> *",this.hiddenNode).orphan();
 dojo.forEach(this.images,function(_e){
 if(_e&&_e.parentNode){
 _e.parentNode.removeChild(_e);
@@ -120,21 +118,21 @@ this._stop();
 }else{
 dojo.toggleClass(this.domNode,"slideShowPaused");
 this._timerCancelled=false;
-if(this.images[this.imageIndex]&&this.images[this.imageIndex]._img.complete){
+var idx=this.imageIndex;
+if(idx<0||(this.images[idx]&&this.images[idx]._img.complete)){
 var _13=this.showNextImage(true,true);
 if(!_13){
 this._stop();
 }
 }else{
-var idx=this.imageIndex;
-var _15=dojo.subscribe(this.getShowTopicName(),dojo.hitch(this,function(_16){
+var _14=dojo.subscribe(this.getShowTopicName(),dojo.hitch(this,function(_15){
 setTimeout(dojo.hitch(this,function(){
-if(_16.index==idx){
-var _17=this.showNextImage(true,true);
-if(!_17){
+if(_15.index==idx){
+var _16=this.showNextImage(true,true);
+if(!_16){
 this._stop();
 }
-dojo.unsubscribe(_15);
+dojo.unsubscribe(_14);
 }
 }),this.slideshowInterval*1000);
 }));
@@ -145,57 +143,56 @@ dojo.publish(this.getShowTopicName(),[{index:idx,title:"",url:""}]);
 return (this.widgetId||this.id)+"/imageShow";
 },getLoadTopicName:function(){
 return (this.widgetId?this.widgetId:this.id)+"/imageLoad";
-},showImage:function(_18,_19){
-if(!_19&&this._slideId){
+},showImage:function(_17,_18){
+if(!_18&&this._slideId){
 this.toggleSlideShow();
 }
-var _1a=this;
-var _1b=this.largeNode.getElementsByTagName("div");
-this.imageIndex=_18;
-var _1c=function(){
-if(_1a.images[_18]){
-while(_1a.largeNode.firstChild){
-_1a.largeNode.removeChild(_1a.largeNode.firstChild);
-}
-dojo.style(_1a.images[_18],"opacity",0);
-_1a.largeNode.appendChild(_1a.images[_18]);
-_1a._currentImage=_1a.images[_18]._img;
-_1a._fitSize();
-var _1d=function(a,b,c){
-var img=_1a.images[_18].firstChild;
+var _19=this;
+var _1a=this.largeNode.getElementsByTagName("div");
+this.imageIndex=_17;
+var _1b=function(){
+if(_19.images[_17]){
+while(_19.largeNode.firstChild){
+_19.largeNode.removeChild(_19.largeNode.firstChild);
+}
+dojo.style(_19.images[_17],"opacity",0);
+_19.largeNode.appendChild(_19.images[_17]);
+_19._currentImage=_19.images[_17]._img;
+_19._fitSize();
+var _1c=function(a,b,c){
+var img=_19.images[_17].firstChild;
 if(img.tagName.toLowerCase()!="img"){
 img=img.firstChild;
 }
-var _22=img.getAttribute("title")||"";
-if(_1a._navShowing){
-_1a._showNav(true);
+var _1d=img.getAttribute("title")||"";
+if(_19._navShowing){
+_19._showNav(true);
 }
-dojo.publish(_1a.getShowTopicName(),[{index:_18,title:_22,url:img.getAttribute("src")}]);
-if(_19){
-_19(a,b,c);
+dojo.publish(_19.getShowTopicName(),[{index:_17,title:_1d,url:img.getAttribute("src")}]);
+if(_18){
+_18(a,b,c);
 }
-_1a._setTitle(_22);
+_19._setTitle(_1d);
 };
-dojo.fadeIn({node:_1a.images[_18],duration:300,onEnd:_1d}).play();
+dojo.fadeIn({node:_19.images[_17],duration:300,onEnd:_1c}).play();
 }else{
-_1a._loadImage(_18,function(){
-dojo.publish(_1a.getLoadTopicName(),[_18]);
-_1a.showImage(_18,_19);
+_19._loadImage(_17,function(){
+_19.showImage(_17,_18);
 });
 }
 };
-if(_1b&&_1b.length>0){
-dojo.fadeOut({node:_1b[0],duration:300,onEnd:function(){
-_1a.hiddenNode.appendChild(_1b[0]);
-_1c();
+if(_1a&&_1a.length>0){
+dojo.fadeOut({node:_1a[0],duration:300,onEnd:function(){
+_19.hiddenNode.appendChild(_1a[0]);
+_1b();
 }}).play();
 }else{
-_1c();
+_1b();
 }
-},_fitSize:function(_23){
-if(!this.fixedHeight||_23){
-var _24=(this._currentImage.height+(this.hasNav?20:0));
-dojo.style(this.innerWrapper,"height",_24+"px");
+},_fitSize:function(_1e){
+if(!this.fixedHeight||_1e){
+var _1f=(this._currentImage.height+(this.hasNav?20:0));
+dojo.style(this.innerWrapper,"height",_1f+"px");
 return;
 }
 dojo.style(this.largeNode,"paddingTop",this._getTopPadding()+"px");
@@ -212,55 +209,54 @@ while(this.images.length>=this._imageCounter&&this.images[this._imageCounter]){
 this._imageCounter++;
 }
 this._loadImage(this._imageCounter);
-},_loadImage:function(_25,_26){
-if(this.images[_25]||!this._request){
+},_loadImage:function(_20,_21){
+if(this.images[_20]||!this._request){
 return;
 }
-var _27=_25-(_25%this.pageSize);
-this._request.start=_27;
-this._request.onComplete=function(_28){
-var _29=_25-_27;
-if(_28&&_28.length>_29){
-_2a(_28[_29]);
+var _22=_20-(_20%(this._request.count||this.pageSize));
+this._request.start=_22;
+this._request.onComplete=function(_23){
+var _24=_20-_22;
+if(_23&&_23.length>_24){
+_25(_23[_24]);
 }else{
 }
 };
-var _2b=this;
-var _2a=function(_2c){
-var url=_2b.imageStore.getValue(_2c,_2b.imageLargeAttr);
+var _26=this;
+var _27=this.imageStore;
+var _25=function(_28){
+var url=_26.imageStore.getValue(_28,_26.imageLargeAttr);
 var img=new Image();
-var div=document.createElement("div");
+var div=dojo.create("div",{id:_26.id+"_imageDiv"+_20});
 div._img=img;
-var _30=_2b.imageStore.getValue(_2c,_2b.linkAttr);
-if(!_30||_2b.noLink){
+var _29=_26.imageStore.getValue(_28,_26.linkAttr);
+if(!_29||_26.noLink){
 div.appendChild(img);
 }else{
-var a=document.createElement("a");
-a.setAttribute("href",_30);
-a.setAttribute("target","_blank");
-div.appendChild(a);
+var a=dojo.create("a",{"href":_29,"target":"_blank"},div);
 a.appendChild(img);
 }
-div.setAttribute("id",_2b.id+"_imageDiv"+_25);
 dojo.connect(img,"onload",function(){
-_2b._fitImage(img);
-div.setAttribute("width",_2b.imageWidth);
-div.setAttribute("height",_2b.imageHeight);
-dojo.publish(_2b.getLoadTopicName(),[_25]);
-setTimeout(_2b._loadNextImage,1);
-if(_26){
-_26();
+if(_27!=_26.imageStore){
+return;
+}
+_26._fitImage(img);
+dojo.attr(div,{"width":_26.imageWidth,"height":_26.imageHeight});
+dojo.publish(_26.getLoadTopicName(),[_20]);
+setTimeout(function(){
+_26._loadNextImage();
+},1);
+if(_21){
+_21();
 }
 });
-_2b.hiddenNode.appendChild(div);
-var _32=document.createElement("div");
-dojo.addClass(_32,"slideShowTitle");
-div.appendChild(_32);
-_2b.images[_25]=div;
-img.setAttribute("src",url);
-var _33=_2b.imageStore.getValue(_2c,_2b.titleAttr);
-if(_33){
-img.setAttribute("title",_33);
+_26.hiddenNode.appendChild(div);
+var _2a=dojo.create("div",{className:"slideShowTitle"},div);
+_26.images[_20]=div;
+dojo.attr(img,"src",url);
+var _2b=_26.imageStore.getValue(_28,_26.titleAttr);
+if(_2b){
+dojo.attr(img,"title",_2b);
 }
 };
 this.imageStore.fetch(this._request);
@@ -291,22 +287,21 @@ 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(_35){
-this.titleNode.innerHTML=dojo.string.substitute(this.titleTemplate,{title:_35,current:1+this.imageIndex,total:this.maxPhotos||""});
+dojo.style(this.navNode,{"position":"",top:""});
+},_setTitle:function(_2c){
+this.titleNode.innerHTML=dojo.string.substitute(this.titleTemplate,{title:_2c,current:1+this.imageIndex,total:this.maxPhotos||""});
 },_fitImage:function(img){
-var _37=img.width;
-var _38=img.height;
-if(_37>this.imageWidth){
-_38=Math.floor(_38*(this.imageWidth/_37));
-img.height=_38;
-img.width=_37=this.imageWidth;
-}
-if(_38>this.imageHeight){
-_37=Math.floor(_37*(this.imageHeight/_38));
+var _2d=img.width;
+var _2e=img.height;
+if(_2d>this.imageWidth){
+_2e=Math.floor(_2e*(this.imageWidth/_2d));
+img.height=_2e;
+img.width=_2d=this.imageWidth;
+}
+if(_2e>this.imageHeight){
+_2d=Math.floor(_2d*(this.imageHeight/_2e));
 img.height=this.imageHeight;
-img.width=_37;
+img.width=_2d;
 }
 },_handleClick:function(e){
 switch(e.target){
@@ -320,20 +315,21 @@ case this.navPlay:
 this.toggleSlideShow();
 break;
 }
-},_showNav:function(_3a){
-if(this._navShowing&&!_3a){
+},_showNav:function(_2f){
+if(this._navShowing&&!_2f){
 return;
 }
 dojo.style(this.navNode,"marginTop","0px");
-dojo.style(this.navPlay,"marginLeft","0px");
-var _3b=dojo.marginBox(this.outerNode);
-var _3c=this._currentImage.height-this.navPlay._size.h-10+this._getTopPadding();
-if(_3c>this._currentImage.height){
-_3c+=10;
+var _30=dojo.style(this.navNode,"width")/2-this.navPlay._size.w/2-this.navPrev._size.w;
+dojo.style(this.navPlay,"marginLeft",_30+"px");
+var _31=dojo.marginBox(this.outerNode);
+var _32=this._currentImage.height-this.navPlay._size.h-10+this._getTopPadding();
+if(_32>this._currentImage.height){
+_32+=10;
 }
 dojo[this.imageIndex<1?"addClass":"removeClass"](this.navPrev,"slideShowCtrlHide");
 dojo[this.imageIndex+1>=this.maxPhotos?"addClass":"removeClass"](this.navNext,"slideShowCtrlHide");
-var _3d=this;
+var _33=this;
 if(this._navAnim){
 this._navAnim.stop();
 }
@@ -341,31 +337,31 @@ if(this._navShowing){
 return;
 }
 this._navAnim=dojo.fadeIn({node:this.navNode,duration:300,onEnd:function(){
-_3d._navAnim=null;
+_33._navAnim=null;
 }});
 this._navAnim.play();
 this._navShowing=true;
 },_hideNav:function(e){
 if(!e||!this._overElement(this.outerNode,e)){
-var _3f=this;
+var _34=this;
 if(this._navAnim){
 this._navAnim.stop();
 }
 this._navAnim=dojo.fadeOut({node:this.navNode,duration:300,onEnd:function(){
-_3f._navAnim=null;
+_34._navAnim=null;
 }});
 this._navAnim.play();
 this._navShowing=false;
 }
-},_overElement:function(_40,e){
+},_overElement:function(_35,e){
 if(typeof (dojo)=="undefined"){
 return false;
 }
-_40=dojo.byId(_40);
+_35=dojo.byId(_35);
 var m={x:e.pageX,y:e.pageY};
-var bb=dojo._getBorderBox(_40);
-var _44=dojo.coords(_40,true);
-var _45=_44.x;
-return (m.x>=_45&&m.x<=(_45+bb.w)&&m.y>=_44.y&&m.y<=(top+bb.h));
+var bb=dojo._getBorderBox(_35);
+var _36=dojo.coords(_35,true);
+var _37=_36.x;
+return (m.x>=_37&&m.x<=(_37+bb.w)&&m.y>=_36.y&&m.y<=(top+bb.h));
 }});
 }
diff --git a/dojox/image/ThumbnailPicker.js b/dojox/image/ThumbnailPicker.js
index 5ebaedc..949bfe7 100644
--- a/dojox/image/ThumbnailPicker.js
+++ b/dojox/image/ThumbnailPicker.js
@@ -14,7 +14,7 @@ dojo.require("dojo.fx.easing");
 dojo.require("dojo.fx");
 dojo.require("dijit._Widget");
 dojo.require("dijit._Templated");
-dojo.declare("dojox.image.ThumbnailPicker",[dijit._Widget,dijit._Templated],{imageStore:null,request:null,size:500,thumbHeight:75,thumbWidth:100,useLoadNotifier:false,useHyperlink:false,hyperlinkTarget:"new",isClickable:true,isScrollable:true,isHorizontal:true,autoLoad:true,linkAttr:"link",imageThumbAttr:"imageUrlThumb",imageLargeAttr:"imageUrl",pageSize:20,titleAttr:"title",templateString:"<div dojoAttachPoint=\"outerNode\" class=\"thumbOuter\">\n\t<div dojoAttachPoint=\"navPrev\" class [...]
+dojo.declare("dojox.image.ThumbnailPicker",[dijit._Widget,dijit._Templated],{imageStore:null,request:null,size:500,thumbHeight:75,thumbWidth:100,useLoadNotifier:false,useHyperlink:false,hyperlinkTarget:"new",isClickable:true,isScrollable:true,isHorizontal:true,autoLoad:true,linkAttr:"link",imageThumbAttr:"imageUrlThumb",imageLargeAttr:"imageUrl",pageSize:20,titleAttr:"title",templateString:dojo.cache("dojox.image","resources/ThumbnailPicker.html","<div dojoAttachPoint=\"outerNode\" class [...]
 this.widgetid=this.id;
 this.inherited(arguments);
 this.pageSize=Number(this.pageSize);
@@ -51,8 +51,8 @@ dojo.addClass(this.navPrev,"prev"+_5);
 dojo.addClass(this.navNext,"next"+_5);
 dojo.addClass(this.thumbsNode,"thumb"+_5);
 dojo.addClass(this.outerNode,"thumb"+_5);
-this.navNextImg.setAttribute("src",this._blankGif);
-this.navPrevImg.setAttribute("src",this._blankGif);
+dojo.attr(this.navNextImg,"src",this._blankGif);
+dojo.attr(this.navPrevImg,"src",this._blankGif);
 this.connect(this.navPrev,"onclick","_prev");
 this.connect(this.navNext,"onclick","_next");
 this.isInitialized=true;
@@ -92,16 +92,15 @@ this[_a]=_8[_a];
 this.request.start=0;
 this.request.count=this.pageSize;
 this.imageStore=_6;
+this._loadInProgress=false;
 if(!this.init()){
 this._loadNextPage();
 }
 },reset:function(){
 this._loadedImages={};
 dojo.forEach(this._thumbs,function(_b){
-if(_b){
-if(_b.parentNode){
-_b.parentNode.removeChild(_b);
-}
+if(_b&&_b.parentNode){
+dojo.destroy(_b);
 }
 });
 this._thumbs=[];
@@ -117,16 +116,33 @@ var _f=this.isHorizontal?"offsetWidth":"offsetHeight";
 var _10=this.isHorizontal?"scrollLeft":"scrollTop";
 var _11=_d[_e]-this.thumbsNode[_e];
 return (_11>=this.thumbScroller[_10]&&_11+_d[_f]<=this.thumbScroller[_10]+this._scrollerSize);
+},resize:function(dim){
+var _12=this.isHorizontal?"w":"h";
+var _13=0;
+if(this._thumbs.length>0&&dojo.marginBox(this._thumbs[0]).w==0){
+return;
+}
+dojo.forEach(this._thumbs,dojo.hitch(this,function(_14){
+var mb=dojo.marginBox(_14.firstChild);
+var _15=mb[_12];
+_13+=(Number(_15)+10);
+if(this.useLoadNotifier&&mb.w>0){
+dojo.style(_14.lastChild,"width",(mb.w-4)+"px");
+}
+dojo.style(_14,"width",mb.w+"px");
+}));
+dojo.style(this.thumbsNode,this._sizeProperty,_13+"px");
+this._updateNavControls();
 },_next:function(){
 var pos=this.isHorizontal?"offsetLeft":"offsetTop";
-var _13=this.isHorizontal?"offsetWidth":"offsetHeight";
-var _14=this.thumbsNode[pos];
-var _15=this._thumbs[this._thumbIndex];
-var _16=_15[pos]-_14;
-var _17=-1,img;
+var _16=this.isHorizontal?"offsetWidth":"offsetHeight";
+var _17=this.thumbsNode[pos];
+var _18=this._thumbs[this._thumbIndex];
+var _19=_18[pos]-_17;
+var _1a=-1,img;
 for(var i=this._thumbIndex+1;i<this._thumbs.length;i++){
 img=this._thumbs[i];
-if(img[pos]-_14+img[_13]-_16>this._scrollerSize){
+if(img[pos]-_17+img[_16]-_19>this._scrollerSize){
 this._showThumbs(i);
 return;
 }
@@ -148,153 +164,150 @@ return;
 }
 }
 this._showThumbs(0);
-},_checkLoad:function(img,_22){
-dojo.publish(this.getShowTopicName(),[{index:_22}]);
+},_checkLoad:function(img,_1f){
+dojo.publish(this.getShowTopicName(),[{index:_1f}]);
 this._updateNavControls();
 this._loadingImages={};
-this._thumbIndex=_22;
+this._thumbIndex=_1f;
 if(this.thumbsNode.offsetWidth-img.offsetLeft<(this._scrollerSize*2)){
 this._loadNextPage();
 }
-},_showThumbs:function(_23){
-_23=Math.min(Math.max(_23,0),this._maxPhotos);
-if(_23>=this._maxPhotos){
+},_showThumbs:function(_20){
+_20=Math.min(Math.max(_20,0),this._maxPhotos);
+if(_20>=this._maxPhotos){
 return;
 }
-var img=this._thumbs[_23];
+var img=this._thumbs[_20];
 if(!img){
 return;
 }
-var _25=img.offsetLeft-this.thumbsNode.offsetLeft;
+var _21=img.offsetLeft-this.thumbsNode.offsetLeft;
 var top=img.offsetTop-this.thumbsNode.offsetTop;
-var _27=this.isHorizontal?_25:top;
-if((_27>=this.thumbScroller[this._scrollAttr])&&(_27+img[this._sizeAttr]<=this.thumbScroller[this._scrollAttr]+this._scrollerSize)){
+var _22=this.isHorizontal?_21:top;
+if((_22>=this.thumbScroller[this._scrollAttr])&&(_22+img[this._sizeAttr]<=this.thumbScroller[this._scrollAttr]+this._scrollerSize)){
 return;
 }
 if(this.isScrollable){
-var _28=this.isHorizontal?{x:_25,y:0}:{x:0,y:top};
-dojox.fx.smoothScroll({target:_28,win:this.thumbScroller,duration:300,easing:dojo.fx.easing.easeOut,onEnd:dojo.hitch(this,"_checkLoad",img,_23)}).play(10);
+var _23=this.isHorizontal?{x:_21,y:0}:{x:0,y:top};
+dojox.fx.smoothScroll({target:_23,win:this.thumbScroller,duration:300,easing:dojo.fx.easing.easeOut,onEnd:dojo.hitch(this,"_checkLoad",img,_20)}).play(10);
 }else{
 if(this.isHorizontal){
-this.thumbScroller.scrollLeft=_25;
+this.thumbScroller.scrollLeft=_21;
 }else{
 this.thumbScroller.scrollTop=top;
 }
-this._checkLoad(img,_23);
+this._checkLoad(img,_20);
 }
-},markImageLoaded:function(_29){
-var _2a=dojo.byId("loadingDiv_"+this.widgetid+"_"+_29);
-if(_2a){
-this._setThumbClass(_2a,"thumbLoaded");
+},markImageLoaded:function(_24){
+var _25=dojo.byId("loadingDiv_"+this.widgetid+"_"+_24);
+if(_25){
+this._setThumbClass(_25,"thumbLoaded");
 }
-this._loadedImages[_29]=true;
-},_setThumbClass:function(_2b,_2c){
+this._loadedImages[_24]=true;
+},_setThumbClass:function(_26,_27){
 if(!this.autoLoad){
 return;
 }
-dojo.addClass(_2b,_2c);
+dojo.addClass(_26,_27);
 },_loadNextPage:function(){
 if(this._loadInProgress){
 return;
 }
 this._loadInProgress=true;
-var _2d=this.request.start+(this._noImages?0:this.pageSize);
-var pos=_2d;
+var _28=this.request.start+(this._noImages?0:this.pageSize);
+var pos=_28;
 while(pos<this._thumbs.length&&this._thumbs[pos]){
 pos++;
 }
-var _2f=function(_30,_31){
-if(_30&&_30.length){
-var _32=0;
-var _33=dojo.hitch(this,function(){
-if(_32>=_30.length){
+var _29=this.imageStore;
+var _2a=function(_2b,_2c){
+if(_29!=this.imageStore){
+return;
+}
+if(_2b&&_2b.length){
+var _2d=0;
+var _2e=dojo.hitch(this,function(){
+if(_2d>=_2b.length){
 this._loadInProgress=false;
 return;
 }
-var _34=_32++;
-this._loadImage(_30[_34],pos+_34,_33);
+var _2f=_2d++;
+this._loadImage(_2b[_2f],pos+_2f,_2e);
 });
-_33();
+_2e();
 this._updateNavControls();
 }else{
 this._loadInProgress=false;
 }
 };
-var _35=function(){
+var _30=function(){
 this._loadInProgress=false;
-
 };
-this.request.onComplete=dojo.hitch(this,_2f);
-this.request.onError=dojo.hitch(this,_35);
-this.request.start=_2d;
+this.request.onComplete=dojo.hitch(this,_2a);
+this.request.onError=dojo.hitch(this,_30);
+this.request.start=_28;
 this._noImages=false;
 this.imageStore.fetch(this.request);
-},_loadImage:function(_36,_37,_38){
-var url=this.imageStore.getValue(_36,this.imageThumbAttr);
-var img=document.createElement("img");
-var _3b=document.createElement("div");
-_3b.setAttribute("id","img_"+this.widgetid+"_"+_37);
-_3b.appendChild(img);
-img._index=_37;
-img._data=_36;
-this._thumbs[_37]=_3b;
-var _3c;
+},_loadImage:function(_31,_32,_33){
+var _34=this.imageStore;
+var url=_34.getValue(_31,this.imageThumbAttr);
+var _35=dojo.create("div",{id:"img_"+this.widgetid+"_"+_32});
+var img=dojo.create("img",{},_35);
+img._index=_32;
+img._data=_31;
+this._thumbs[_32]=_35;
+var _36;
 if(this.useLoadNotifier){
-_3c=document.createElement("div");
-_3c.setAttribute("id","loadingDiv_"+this.widgetid+"_"+_37);
-this._setThumbClass(_3c,this._loadedImages[_37]?"thumbLoaded":"thumbNotifier");
-_3b.appendChild(_3c);
-}
-var _3d=dojo.marginBox(this.thumbsNode);
-var _3e;
-var _3f;
+_36=dojo.create("div",{id:"loadingDiv_"+this.widgetid+"_"+_32},_35);
+this._setThumbClass(_36,this._loadedImages[_32]?"thumbLoaded":"thumbNotifier");
+}
+var _37=dojo.marginBox(this.thumbsNode);
+var _38;
+var _39;
 if(this.isHorizontal){
-_3e=this.thumbWidth;
-_3f="w";
+_38=this.thumbWidth;
+_39="w";
 }else{
-_3e=this.thumbHeight;
-_3f="h";
+_38=this.thumbHeight;
+_39="h";
 }
-_3d=_3d[_3f];
+_37=_37[_39];
 var sl=this.thumbScroller.scrollLeft,st=this.thumbScroller.scrollTop;
-dojo.style(this.thumbsNode,this._sizeProperty,(_3d+_3e+20)+"px");
+dojo.style(this.thumbsNode,this._sizeProperty,(_37+_38+20)+"px");
 this.thumbScroller.scrollLeft=sl;
 this.thumbScroller.scrollTop=st;
-this.thumbsNode.appendChild(_3b);
-dojo.connect(img,"onload",this,function(){
-var _42=dojo.marginBox(img)[_3f];
-this._totalSize+=(Number(_42)+4);
-dojo.style(this.thumbsNode,this._sizeProperty,this._totalSize+"px");
-if(this.useLoadNotifier){
-dojo.style(_3c,"width",(img.width-4)+"px");
+this.thumbsNode.appendChild(_35);
+dojo.connect(img,"onload",this,dojo.hitch(this,function(){
+if(_34!=this.imageStore){
+return false;
 }
-dojo.style(_3b,"width",img.width+"px");
-_38();
+this.resize();
+setTimeout(_33,0);
 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(_36,this.imageLargeAttr),title:this.imageStore.getValue(_36,this.titleAttr),link:this.imageStore.getValue(_36,this.linkAttr)}]);
+dojo.publish(this.getClickTopicName(),[{index:evt.target._index,data:evt.target._data,url:img.getAttribute("src"),largeUrl:this.imageStore.getValue(_31,this.imageLargeAttr),title:this.imageStore.getValue(_31,this.titleAttr),link:this.imageStore.getValue(_31,this.linkAttr)}]);
 return false;
 });
 dojo.addClass(img,"imageGalleryThumb");
 img.setAttribute("src",url);
-var _44=this.imageStore.getValue(_36,this.titleAttr);
-if(_44){
-img.setAttribute("title",_44);
+var _3a=this.imageStore.getValue(_31,this.titleAttr);
+if(_3a){
+img.setAttribute("title",_3a);
 }
 this._updateNavControls();
 },_updateNavControls:function(){
-var _45=[];
-var _46=function(_47,add){
+var _3b=[];
+var _3c=function(_3d,add){
 var fn=add?"addClass":"removeClass";
-dojo[fn](_47,"enabled");
-dojo[fn](_47,"thumbClickable");
+dojo[fn](_3d,"enabled");
+dojo[fn](_3d,"thumbClickable");
 };
 var pos=this.isHorizontal?"scrollLeft":"scrollTop";
-var _4b=this.isHorizontal?"offsetWidth":"offsetHeight";
-_46(this.navPrev,(this.thumbScroller[pos]>0));
-var _4c=this._thumbs[this._thumbs.length-1];
-var _4d=(this.thumbScroller[pos]+this._scrollerSize<this.thumbsNode[_4b]);
-_46(this.navNext,_4d);
+var _3e=this.isHorizontal?"offsetWidth":"offsetHeight";
+_3c(this.navPrev,(this.thumbScroller[pos]>0));
+var _3f=this._thumbs[this._thumbs.length-1];
+var _40=(this.thumbScroller[pos]+this._scrollerSize<this.thumbsNode[_3e]);
+_3c(this.navNext,_40);
 }});
 }
diff --git a/dojox/image/_base.js b/dojox/image/_base.js
index eba106f..de20b50 100644
--- a/dojox/image/_base.js
+++ b/dojox/image/_base.js
@@ -9,13 +9,13 @@ if(!dojo._hasResource["dojox.image._base"]){
 dojo._hasResource["dojox.image._base"]=true;
 dojo.provide("dojox.image._base");
 (function(d){
-var _2;
-dojox.image.preload=function(_3){
-if(!_2){
-_2=d.create("div",{style:{position:"absolute",top:"-9999px",display:"none"}},d.body());
+var _1;
+dojox.image.preload=function(_2){
+if(!_1){
+_1=d.create("div",{style:{position:"absolute",top:"-9999px",height:"1px",overflow:"hidden"}},d.body());
 }
-d.forEach(_3,function(_4){
-d.create("img",{src:_4},_2);
+return d.map(_2,function(_3){
+return d.create("img",{src:_3},_1);
 });
 };
 if(d.config.preloadImages){
diff --git a/dojox/image/resources/SlideShow.css b/dojox/image/resources/SlideShow.css
index a5684fc..a9ab15d 100644
--- a/dojox/image/resources/SlideShow.css
+++ b/dojox/image/resources/SlideShow.css
@@ -6,7 +6,6 @@
 	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; 
diff --git a/dojox/image/resources/ThumbnailPicker.css b/dojox/image/resources/ThumbnailPicker.css
index 28803b0..4356886 100644
--- a/dojox/image/resources/ThumbnailPicker.css
+++ b/dojox/image/resources/ThumbnailPicker.css
@@ -73,7 +73,6 @@
 .thumbScroller {
 	overflow-x: hidden;
 	overflow-y: hidden;
-	white-space: nowrap;
 	text-align: center;
 }
 .thumbHoriz .thumbScroller {
diff --git a/dojox/image/resources/image.css b/dojox/image/resources/image.css
index 2c6c868..0e3411d 100644
--- a/dojox/image/resources/image.css
+++ b/dojox/image/resources/image.css
@@ -87,7 +87,6 @@
 	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; 
@@ -257,7 +256,6 @@
 .thumbScroller {
 	overflow-x: hidden;
 	overflow-y: hidden;
-	white-space: nowrap;
 	text-align: center;
 }
 .thumbHoriz .thumbScroller {
diff --git a/dojox/io/OAuth.js b/dojox/io/OAuth.js
index e174de5..e93456a 100644
--- a/dojox/io/OAuth.js
+++ b/dojox/io/OAuth.js
@@ -16,115 +16,115 @@ return "";
 }
 return encodeURIComponent(s).replace(/\!/g,"%21").replace(/\*/g,"%2A").replace(/\'/g,"%27").replace(/\(/g,"%28").replace(/\)/g,"%29");
 };
-var _3=this.decode=function(_4){
-var a=[],_6=_4.split("&");
-for(var i=0,l=_6.length;i<l;i++){
-var _9=_6[i];
-if(_6[i]==""){
+var _2=this.decode=function(_3){
+var a=[],_4=_3.split("&");
+for(var i=0,l=_4.length;i<l;i++){
+var _5=_4[i];
+if(_4[i]==""){
 continue;
 }
-if(_6[i].indexOf("=")>-1){
-var _a=_6[i].split("=");
-a.push([decodeURIComponent(_a[0]),decodeURIComponent(_a[1])]);
+if(_4[i].indexOf("=")>-1){
+var _6=_4[i].split("=");
+a.push([decodeURIComponent(_6[0]),decodeURIComponent(_6[1])]);
 }else{
-a.push([decodeURIComponent(_6[i]),null]);
+a.push([decodeURIComponent(_4[i]),null]);
 }
 }
 return a;
 };
-function _b(_c){
-var _d=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],_e=/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,_f=_e.exec(_c),map={},i=_d.length;
+function _7(_8){
+var _9=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],_a=/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,_b=_a.exec(_8),_c={},i=_9.length;
 while(i--){
-map[_d[i]]=_f[i]||"";
+_c[_9[i]]=_b[i]||"";
 }
-var p=map.protocol.toLowerCase(),a=map.authority.toLowerCase(),b=(p=="http"&&map.port==80)||(p=="https"&&map.port==443);
+var p=_c.protocol.toLowerCase(),a=_c.authority.toLowerCase(),b=(p=="http"&&_c.port==80)||(p=="https"&&_c.port==443);
 if(b){
 if(a.lastIndexOf(":")>-1){
 a=a.substring(0,a.lastIndexOf(":"));
 }
 }
-var _15=map.path||"/";
-map.url=p+"://"+a+_15;
-return map;
+var _d=_c.path||"/";
+_c.url=p+"://"+a+_d;
+return _c;
 };
-var tab="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
-function _17(_18){
-var s="",tl=tab.length;
-for(var i=0;i<_18;i++){
-s+=tab.charAt(Math.floor(Math.random()*tl));
+var _e="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
+function _f(_10){
+var s="",tl=_e.length;
+for(var i=0;i<_10;i++){
+s+=_e.charAt(Math.floor(Math.random()*tl));
 }
 return s;
 };
-function _1c(){
+function _11(){
 return Math.floor(new Date().valueOf()/1000)-2;
 };
-function _1d(_1e,key,_20){
-if(_20&&_20!="PLAINTEXT"&&_20!="HMAC-SHA1"){
+function _12(_13,key,_14){
+if(_14&&_14!="PLAINTEXT"&&_14!="HMAC-SHA1"){
 throw new Error("dojox.io.OAuth: the only supported signature encodings are PLAINTEXT and HMAC-SHA1.");
 }
-if(_20=="PLAINTEXT"){
+if(_14=="PLAINTEXT"){
 return key;
 }else{
-return dojox.encoding.digests.SHA1._hmac(_1e,key);
+return dojox.encoding.digests.SHA1._hmac(_13,key);
 }
 };
-function key(_22){
-return _1(_22.consumer.secret)+"&"+(_22.token&&_22.token.secret?_1(_22.token.secret):"");
+function key(_15){
+return _1(_15.consumer.secret)+"&"+(_15.token&&_15.token.secret?_1(_15.token.secret):"");
 };
-function _23(_24,oaa){
-var o={oauth_consumer_key:oaa.consumer.key,oauth_nonce:_17(16),oauth_signature_method:oaa.sig_method||"HMAC-SHA1",oauth_timestamp:_1c(),oauth_version:"1.0"};
+function _16(_17,oaa){
+var o={oauth_consumer_key:oaa.consumer.key,oauth_nonce:_f(16),oauth_signature_method:oaa.sig_method||"HMAC-SHA1",oauth_timestamp:_11(),oauth_version:"1.0"};
 if(oaa.token){
 o.oauth_token=oaa.token.key;
 }
-_24.content=dojo.mixin(_24.content||{},o);
+_17.content=dojo.mixin(_17.content||{},o);
 };
-function _27(_28){
-var _29=[{}],_2a;
-if(_28.form){
-if(!_28.content){
-_28.content={};
+function _18(_19){
+var _1a=[{}],_1b;
+if(_19.form){
+if(!_19.content){
+_19.content={};
 }
-var _2b=dojo.byId(_28.form);
-var _2c=_2b.getAttributeNode("action");
-_28.url=_28.url||(_2c?_2c.value:null);
-_2a=dojo.formToObject(_2b);
-delete _28.form;
+var _1c=dojo.byId(_19.form);
+var _1d=_1c.getAttributeNode("action");
+_19.url=_19.url||(_1d?_1d.value:null);
+_1b=dojo.formToObject(_1c);
+delete _19.form;
 }
-if(_2a){
-_29.push(_2a);
+if(_1b){
+_1a.push(_1b);
 }
-if(_28.content){
-_29.push(_28.content);
+if(_19.content){
+_1a.push(_19.content);
 }
-var map=_b(_28.url);
+var map=_7(_19.url);
 if(map.query){
 var tmp=dojo.queryToObject(map.query);
 for(var p in tmp){
 tmp[p]=encodeURIComponent(tmp[p]);
 }
-_29.push(tmp);
+_1a.push(tmp);
 }
-_28._url=map.url;
+_19._url=map.url;
 var a=[];
-for(var i=0,l=_29.length;i<l;i++){
-var _33=_29[i];
-for(var p in _33){
-if(dojo.isArray(_33[p])){
-for(var j=0,jl=_33.length;j<jl;j++){
-a.push([p,_33[j]]);
+for(var i=0,l=_1a.length;i<l;i++){
+var _1e=_1a[i];
+for(var p in _1e){
+if(dojo.isArray(_1e[p])){
+for(var j=0,jl=_1e.length;j<jl;j++){
+a.push([p,_1e[j]]);
 }
 }else{
-a.push([p,_33[p]]);
+a.push([p,_1e[p]]);
 }
 }
 }
-_28._parameters=a;
-return _28;
+_19._parameters=a;
+return _19;
 };
-function _36(_37,_38,oaa){
-_23(_38,oaa);
-_27(_38);
-var a=_38._parameters;
+function _1f(_20,_21,oaa){
+_16(_21,oaa);
+_18(_21);
+var a=_21._parameters;
 a.sort(function(a,b){
 if(a[0]>b[0]){
 return 1;
@@ -140,35 +140,35 @@ return -1;
 }
 return 0;
 });
-var s=dojo.map(a,function(_3e){
-return _1(_3e[0])+"%3D"+_1(_3e[1]||"");
-}).join("%26");
-var _3f=_37.toUpperCase()+"&"+_1(_38._url)+"&"+s;
-return _3f;
+var s=dojo.map(a,function(_22){
+return _1(_22[0])+"="+_1(_22[1]||"");
+}).join("&");
+var _23=_20.toUpperCase()+"&"+_1(_21._url)+"&"+_1(s);
+return _23;
 };
-function _40(_41,_42,oaa){
-var k=key(oaa),_45=_36(_41,_42,oaa),s=_1d(_45,k,oaa.sig_method||"HMAC-SHA1");
-_42.content["oauth_signature"]=s;
-return _42;
+function _24(_25,_26,oaa){
+var k=key(oaa),_27=_1f(_25,_26,oaa),s=_12(_27,k,oaa.sig_method||"HMAC-SHA1");
+_26.content["oauth_signature"]=s;
+return _26;
 };
-this.sign=function(_47,_48,oaa){
-return _40(_47,_48,oaa);
+this.sign=function(_28,_29,oaa){
+return _24(_28,_29,oaa);
 };
-this.xhr=function(_4a,_4b,oaa,_4d){
-_40(_4a,_4b,oaa);
-return dojo.xhr(_4a,_4b,_4d);
+this.xhr=function(_2a,_2b,oaa,_2c){
+_24(_2a,_2b,oaa);
+return dojo.xhr(_2a,_2b,_2c);
 };
-this.xhrGet=function(_4e,oaa){
-return this.xhr("GET",_4e,oaa);
+this.xhrGet=function(_2d,oaa){
+return this.xhr("GET",_2d,oaa);
 };
-this.xhrPost=this.xhrRawPost=function(_50,oaa){
-return this.xhr("POST",_50,oaa,true);
+this.xhrPost=this.xhrRawPost=function(_2e,oaa){
+return this.xhr("POST",_2e,oaa,true);
 };
-this.xhrPut=this.xhrRawPut=function(_52,oaa){
-return this.xhr("PUT",_52,oaa,true);
+this.xhrPut=this.xhrRawPut=function(_2f,oaa){
+return this.xhr("PUT",_2f,oaa,true);
 };
-this.xhrDelete=function(_54,oaa){
-return this.xhr("DELETE",_54,oaa);
+this.xhrDelete=function(_30,oaa){
+return this.xhr("DELETE",_30,oaa);
 };
 })();
 }
diff --git a/dojox/io/httpParse.js b/dojox/io/httpParse.js
index 4c2d578..37d110b 100644
--- a/dojox/io/httpParse.js
+++ b/dojox/io/httpParse.js
@@ -27,39 +27,39 @@ _8=(_2||"")+_8;
 var _a=_8;
 _8=_8.match(/[^:\n]+:[^\n]+\n/g);
 for(var j=0;j<_8.length;j++){
-var _c=_8[j].indexOf(":");
-_6[_8[j].substring(0,_c)]=_8[j].substring(_c+1).replace(/(^[ \r\n]*)|([ \r\n]*)$/g,"");
+var _b=_8[j].indexOf(":");
+_6[_8[j].substring(0,_b)]=_8[j].substring(_b+1).replace(/(^[ \r\n]*)|([ \r\n]*)$/g,"");
 }
 _7=_7.split(" ");
-var _d={status:parseInt(_7[1],10),statusText:_7[2],readyState:3,getAllResponseHeaders:function(){
+var _c={status:parseInt(_7[1],10),statusText:_7[2],readyState:3,getAllResponseHeaders:function(){
 return _a;
-},getResponseHeader:function(_e){
-return _6[_e];
+},getResponseHeader:function(_d){
+return _6[_d];
 }};
-var _f=_6["Content-Length"];
-var _10;
-if(_f){
-if(_f<=_1.length){
-_10=_1.substring(0,_f);
+var _e=_6["Content-Length"];
+var _f;
+if(_e){
+if(_e<=_1.length){
+_f=_1.substring(0,_e);
 }else{
 return _4;
 }
 }else{
-if((_10=_1.match(/(.*)HTTP\/\d\.\d \d\d\d[\w\s]*\n/))){
-_10=_10[0];
+if((_f=_1.match(/(.*)HTTP\/\d\.\d \d\d\d[\w\s]*\n/))){
+_f=_f[0];
 }else{
 if(!_3||_9=="\n"){
-_10=_1;
+_f=_1;
 }else{
 return _4;
 }
 }
 }
-_4.push(_d);
-_1=_1.substring(_10.length);
-_d.responseText=_10;
-_d.readyState=4;
-_d._lastIndex=_5-_1.length;
+_4.push(_c);
+_1=_1.substring(_f.length);
+_c.responseText=_f;
+_c.readyState=4;
+_c._lastIndex=_5-_1.length;
 }while(_1);
 return _4;
 };
diff --git a/dojox/io/proxy/xip.js b/dojox/io/proxy/xip.js
index 568113b..79b7e3f 100644
--- a/dojox/io/proxy/xip.js
+++ b/dojox/io/proxy/xip.js
@@ -42,57 +42,57 @@ var _b={};
 var _c=_a.split("&");
 for(var i=0;i<_c.length;i++){
 if(_c[i]){
-var _e=_c[i].split("=");
-_b[decodeURIComponent(_e[0])]=decodeURIComponent(_e[1]);
+var _d=_c[i].split("=");
+_b[decodeURIComponent(_d[0])]=decodeURIComponent(_d[1]);
 }
 }
-var _f=this._state[_9];
-var _10=_f.facade;
-_10._setResponseHeaders(_b.responseHeaders);
+var _e=this._state[_9];
+var _f=_e.facade;
+_f._setResponseHeaders(_b.responseHeaders);
 if(_b.status==0||_b.status){
-_10.status=parseInt(_b.status,10);
+_f.status=parseInt(_b.status,10);
 }
 if(_b.statusText){
-_10.statusText=_b.statusText;
+_f.statusText=_b.statusText;
 }
 if(_b.responseText){
-_10.responseText=_b.responseText;
-var _11=_10.getResponseHeader("Content-Type");
-if(_11){
-var _12=_11.split(";")[0];
-if(_12.indexOf("application/xml")==0||_12.indexOf("text/xml")==0){
-_10.responseXML=dojox.data.dom.createDocument(_b.responseText,_11);
+_f.responseText=_b.responseText;
+var _10=_f.getResponseHeader("Content-Type");
+if(_10){
+var _11=_10.split(";")[0];
+if(_11.indexOf("application/xml")==0||_11.indexOf("text/xml")==0){
+_f.responseXML=dojox.data.dom.createDocument(_b.responseText,_10);
 }
 }
 }
-_10.readyState=4;
+_f.readyState=4;
 this.destroyState(_9);
-},frameLoaded:function(_13){
-var _14=this._state[_13];
-var _15=_14.facade;
-var _16=[];
-for(var _17 in _15._requestHeaders){
-_16.push(_17+": "+_15._requestHeaders[_17]);
-}
-var _18={uri:_15._uri};
-if(_16.length>0){
-_18.requestHeaders=_16.join("\r\n");
-}
-if(_15._method){
-_18.method=_15._method;
-}
-if(_15._bodyData){
-_18.data=_15._bodyData;
-}
-this.sendRequest(_13,dojo.objectToQuery(_18));
-},destroyState:function(_19){
-var _1a=this._state[_19];
-if(_1a){
-delete this._state[_19];
-var _1b=_1a.clientFrame.parentNode;
-_1b.removeChild(_1a.clientFrame);
-_1a.clientFrame=null;
-_1a=null;
+},frameLoaded:function(_12){
+var _13=this._state[_12];
+var _14=_13.facade;
+var _15=[];
+for(var _16 in _14._requestHeaders){
+_15.push(_16+": "+_14._requestHeaders[_16]);
+}
+var _17={uri:_14._uri};
+if(_15.length>0){
+_17.requestHeaders=_15.join("\r\n");
+}
+if(_14._method){
+_17.method=_14._method;
+}
+if(_14._bodyData){
+_17.data=_14._bodyData;
+}
+this.sendRequest(_12,dojo.objectToQuery(_17));
+},destroyState:function(_18){
+var _19=this._state[_18];
+if(_19){
+delete this._state[_18];
+var _1a=_19.clientFrame.parentNode;
+_1a.removeChild(_19.clientFrame);
+_19.clientFrame=null;
+_19=null;
 }
 },createFacade:function(){
 if(arguments&&arguments[0]&&arguments[0].iframeProxyUrl){
@@ -100,120 +100,120 @@ return new dojox.io.proxy.xip.XhrIframeFacade(arguments[0].iframeProxyUrl);
 }else{
 return dojox.io.proxy.xip._xhrObjOld.apply(dojo,arguments);
 }
-},sendRequest:function(_1c,_1d){
-var _1e=this._state[_1c];
-if(!_1e.isSending){
-_1e.isSending=true;
-_1e.requestData=_1d||"";
-_1e.serverWindow=frames[_1e.stateId];
-if(!_1e.serverWindow){
-_1e.serverWindow=document.getElementById(_1e.stateId).contentWindow;
+},sendRequest:function(_1b,_1c){
+var _1d=this._state[_1b];
+if(!_1d.isSending){
+_1d.isSending=true;
+_1d.requestData=_1c||"";
+_1d.serverWindow=frames[_1d.stateId];
+if(!_1d.serverWindow){
+_1d.serverWindow=document.getElementById(_1d.stateId).contentWindow;
 }
 if(typeof document.postMessage=="undefined"){
-if(_1e.serverWindow.contentWindow){
-_1e.serverWindow=_1e.serverWindow.contentWindow;
-}
-}
-this.sendRequestStart(_1c);
-}
-},sendRequestStart:function(_1f){
-var _20=this._state[_1f];
-_20.requestParts=[];
-var _21=_20.requestData;
-var _22=_20.serverUrl.length;
-var _23=this.urlLimit-_22;
-var _24=0;
-while((_21.length-_24)+_22>this.urlLimit){
-var _25=_21.substring(_24,_24+_23);
-var _26=_25.lastIndexOf("%");
-if(_26==_25.length-1||_26==_25.length-2){
-_25=_25.substring(0,_26);
-}
-_20.requestParts.push(_25);
-_24+=_25.length;
-}
-_20.requestParts.push(_21.substring(_24,_21.length));
-_20.partIndex=0;
-this.sendRequestPart(_1f);
-},sendRequestPart:function(_27){
-var _28=this._state[_27];
-if(_28.partIndex<_28.requestParts.length){
-var _29=_28.requestParts[_28.partIndex];
+if(_1d.serverWindow.contentWindow){
+_1d.serverWindow=_1d.serverWindow.contentWindow;
+}
+}
+this.sendRequestStart(_1b);
+}
+},sendRequestStart:function(_1e){
+var _1f=this._state[_1e];
+_1f.requestParts=[];
+var _20=_1f.requestData;
+var _21=_1f.serverUrl.length;
+var _22=this.urlLimit-_21;
+var _23=0;
+while((_20.length-_23)+_21>this.urlLimit){
+var _24=_20.substring(_23,_23+_22);
+var _25=_24.lastIndexOf("%");
+if(_25==_24.length-1||_25==_24.length-2){
+_24=_24.substring(0,_25);
+}
+_1f.requestParts.push(_24);
+_23+=_24.length;
+}
+_1f.requestParts.push(_20.substring(_23,_20.length));
+_1f.partIndex=0;
+this.sendRequestPart(_1e);
+},sendRequestPart:function(_26){
+var _27=this._state[_26];
+if(_27.partIndex<_27.requestParts.length){
+var _28=_27.requestParts[_27.partIndex];
 var cmd="part";
-if(_28.partIndex+1==_28.requestParts.length){
+if(_27.partIndex+1==_27.requestParts.length){
 cmd="end";
 }else{
-if(_28.partIndex==0){
+if(_27.partIndex==0){
 cmd="start";
 }
 }
-this.setServerUrl(_27,cmd,_29);
-_28.partIndex++;
+this.setServerUrl(_26,cmd,_28);
+_27.partIndex++;
 }
-},setServerUrl:function(_2b,cmd,_2d){
-var _2e=this.makeServerUrl(_2b,cmd,_2d);
-var _2f=this._state[_2b];
+},setServerUrl:function(_29,cmd,_2a){
+var _2b=this.makeServerUrl(_29,cmd,_2a);
+var _2c=this._state[_29];
 if(this._isWebKit){
-_2f.serverWindow.location=_2e;
+_2c.serverWindow.location=_2b;
 }else{
-_2f.serverWindow.location.replace(_2e);
+_2c.serverWindow.location.replace(_2b);
 }
-},makeServerUrl:function(_30,cmd,_32){
-var _33=this._state[_30];
-var _34=_33.serverUrl+"#"+(_33.idCounter++)+":"+cmd;
-if(_32){
-_34+=":"+_32;
+},makeServerUrl:function(_2d,cmd,_2e){
+var _2f=this._state[_2d];
+var _30=_2f.serverUrl+"#"+(_2f.idCounter++)+":"+cmd;
+if(_2e){
+_30+=":"+_2e;
 }
-return _34;
+return _30;
 },fragmentReceivedEvent:function(evt){
 if(evt.uri.split("#")[0]==this.fullXipClientUrl){
 this.fragmentReceived(evt.data);
 }
-},fragmentReceived:function(_36){
-var _37=_36.indexOf("#");
-var _38=_36.substring(0,_37);
-var _39=_36.substring(_37+1,_36.length);
-var msg=this.unpackMessage(_39);
-var _3b=this._state[_38];
+},fragmentReceived:function(_31){
+var _32=_31.indexOf("#");
+var _33=_31.substring(0,_32);
+var _34=_31.substring(_32+1,_31.length);
+var msg=this.unpackMessage(_34);
+var _35=this._state[_33];
 switch(msg.command){
 case "loaded":
-this.frameLoaded(_38);
+this.frameLoaded(_33);
 break;
 case "ok":
-this.sendRequestPart(_38);
+this.sendRequestPart(_33);
 break;
 case "start":
-_3b.responseMessage=""+msg.message;
-this.setServerUrl(_38,"ok");
+_35.responseMessage=""+msg.message;
+this.setServerUrl(_33,"ok");
 break;
 case "part":
-_3b.responseMessage+=msg.message;
-this.setServerUrl(_38,"ok");
+_35.responseMessage+=msg.message;
+this.setServerUrl(_33,"ok");
 break;
 case "end":
-this.setServerUrl(_38,"ok");
-_3b.responseMessage+=msg.message;
-this.receive(_38,_3b.responseMessage);
+this.setServerUrl(_33,"ok");
+_35.responseMessage+=msg.message;
+this.receive(_33,_35.responseMessage);
 break;
 }
-},unpackMessage:function(_3c){
-var _3d=_3c.split(":");
-var _3e=_3d[1];
-_3c=_3d[2]||"";
-var _3f=null;
-if(_3e=="init"){
-var _40=_3c.split("&");
-_3f={};
-for(var i=0;i<_40.length;i++){
-var _42=_40[i].split("=");
-_3f[decodeURIComponent(_42[0])]=decodeURIComponent(_42[1]);
+},unpackMessage:function(_36){
+var _37=_36.split(":");
+var _38=_37[1];
+_36=_37[2]||"";
+var _39=null;
+if(_38=="init"){
+var _3a=_36.split("&");
+_39={};
+for(var i=0;i<_3a.length;i++){
+var _3b=_3a[i].split("=");
+_39[decodeURIComponent(_3b[0])]=decodeURIComponent(_3b[1]);
 }
 }
-return {command:_3e,message:_3c,config:_3f};
+return {command:_38,message:_36,config:_39};
 }};
 dojox.io.proxy.xip._xhrObjOld=dojo._xhrObj;
 dojo._xhrObj=dojox.io.proxy.xip.createFacade;
-dojox.io.proxy.xip.XhrIframeFacade=function(_43){
+dojox.io.proxy.xip.XhrIframeFacade=function(_3c){
 this._requestHeaders={};
 this._allResponseHeaders=null;
 this._responseHeaders={};
@@ -225,34 +225,34 @@ this.responseXML=null;
 this.status=null;
 this.statusText=null;
 this.readyState=0;
-this._ifpServerUrl=_43;
+this._ifpServerUrl=_3c;
 this._stateId=null;
 };
-dojo.extend(dojox.io.proxy.xip.XhrIframeFacade,{open:function(_44,uri){
-this._method=_44;
+dojo.extend(dojox.io.proxy.xip.XhrIframeFacade,{open:function(_3d,uri){
+this._method=_3d;
 this._uri=uri;
 this.readyState=1;
-},setRequestHeader:function(_46,_47){
-this._requestHeaders[_46]=_47;
-},send:function(_48){
-this._bodyData=_48;
+},setRequestHeader:function(_3e,_3f){
+this._requestHeaders[_3e]=_3f;
+},send:function(_40){
+this._bodyData=_40;
 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;
-},getResponseHeader:function(_49){
-return this._responseHeaders[_49];
-},_setResponseHeaders:function(_4a){
-if(_4a){
-this._allResponseHeaders=_4a;
-_4a=_4a.replace(/\r/g,"");
-var _4b=_4a.split("\n");
-for(var i=0;i<_4b.length;i++){
-if(_4b[i]){
-var _4d=_4b[i].split(": ");
-this._responseHeaders[_4d[0]]=_4d[1];
+},getResponseHeader:function(_41){
+return this._responseHeaders[_41];
+},_setResponseHeaders:function(_42){
+if(_42){
+this._allResponseHeaders=_42;
+_42=_42.replace(/\r/g,"");
+var _43=_42.split("\n");
+for(var i=0;i<_43.length;i++){
+if(_43[i]){
+var _44=_43[i].split(": ");
+this._responseHeaders[_44[0]]=_44[1];
 }
 }
 }
diff --git a/dojox/io/scriptFrame.js b/dojox/io/scriptFrame.js
index 68387b1..7281466 100644
--- a/dojox/io/scriptFrame.js
+++ b/dojox/io/scriptFrame.js
@@ -20,32 +20,32 @@ var _5=this._getWaiters(_4);
 this._loadedIds[_4]=true;
 this._waiters[_4]=null;
 for(var i=0;i<_5.length;i++){
-var _7=_5[i];
-_7.frameDoc=dojo.io.iframe.doc(dojo.byId(_4));
-_1.attach(_7.id,_7.url,_7.frameDoc);
+var _6=_5[i];
+_6.frameDoc=dojo.io.iframe.doc(dojo.byId(_4));
+_1.attach(_6.id,_6.url,_6.frameDoc);
 }
 }};
-var _8=_1._canAttach;
-var _9=dojox.io.scriptFrame;
-_1._canAttach=function(_a){
-var _b=_a.args.frameDoc;
-if(_b&&dojo.isString(_b)){
-var _c=dojo.byId(_b);
-var _d=_9._getWaiters(_b);
-if(!_c){
-_d.push(_a);
-dojo.io.iframe.create(_b,dojox._scopeName+".io.scriptFrame._loaded('"+_b+"');");
+var _7=_1._canAttach;
+var _8=dojox.io.scriptFrame;
+_1._canAttach=function(_9){
+var _a=_9.args.frameDoc;
+if(_a&&dojo.isString(_a)){
+var _b=dojo.byId(_a);
+var _c=_8._getWaiters(_a);
+if(!_b){
+_c.push(_9);
+dojo.io.iframe.create(_a,dojox._scopeName+".io.scriptFrame._loaded('"+_a+"');");
 }else{
-if(_9._loadedIds[_b]){
-_a.frameDoc=dojo.io.iframe.doc(_c);
-this.attach(_a.id,_a.url,_a.frameDoc);
+if(_8._loadedIds[_a]){
+_9.frameDoc=dojo.io.iframe.doc(_b);
+this.attach(_9.id,_9.url,_9.frameDoc);
 }else{
-_d.push(_a);
+_c.push(_9);
 }
 }
 return false;
 }else{
-return _8.apply(this,arguments);
+return _7.apply(this,arguments);
 }
 };
 })();
diff --git a/dojox/io/windowName.js b/dojox/io/windowName.js
index 7566ca8..52bb90d 100644
--- a/dojox/io/windowName.js
+++ b/dojox/io/windowName.js
@@ -42,115 +42,115 @@ return _7;
 },_send:function(_9,_a,_b,_c){
 var _d=_9.ioArgs;
 var _e=dojox.io.windowName._frameNum++;
-var _f=(dojo.config["dojoCallbackUrl"]||dojo.moduleUrl("dojo","resources/blank.html"))+"#"+_e;
+var _f=(dojo.config.dojoBlankHtmlUrl||dojo.config.dojoCallbackUrl||dojo.moduleUrl("dojo","resources/blank.html"))+"#"+_e;
 var _10=new dojo._Url(window.location,_f);
 var doc=dojo.doc;
-var _12=_b||dojo.body();
-function _13(_14){
-_14.style.width="100%";
-_14.style.height="100%";
-_14.style.border="0px";
+var _11=_b||dojo.body();
+function _12(_13){
+_13.style.width="100%";
+_13.style.height="100%";
+_13.style.border="0px";
 };
 if(dojo.isMoz&&![].reduce){
-var _15=doc.createElement("iframe");
-_13(_15);
+var _14=doc.createElement("iframe");
+_12(_14);
 if(!_b){
-_15.style.display="none";
+_14.style.display="none";
 }
-_12.appendChild(_15);
-var _16=_15.contentWindow;
-doc=_16.document;
+_11.appendChild(_14);
+var _15=_14.contentWindow;
+doc=_15.document;
 doc.write("<html><body margin='0px'><iframe style='width:100%;height:100%;border:0px' name='protectedFrame'></iframe></body></html>");
 doc.close();
-var _17=_16[0];
-_16.__defineGetter__(0,function(){
+var _16=_15[0];
+_15.__defineGetter__(0,function(){
 });
-_16.__defineGetter__("protectedFrame",function(){
+_15.__defineGetter__("protectedFrame",function(){
 });
-doc=_17.document;
+doc=_16.document;
 doc.write("<html><body margin='0px'></body></html>");
 doc.close();
-_12=doc.body;
+_11=doc.body;
 }
-var _18=_d.frame=_18=doc.createElement(dojo.isIE?"<iframe name=\""+_10+"\" onload=\"dojox.io.windowName["+_e+"]()\">":"iframe");
-_13(_18);
-_d.outerFrame=_15=_15||_18;
+var _17=_d.frame=_17=doc.createElement(dojo.isIE?"<iframe name=\""+_10+"\" onload=\"dojox.io.windowName["+_e+"]()\">":"iframe");
+_12(_17);
+_d.outerFrame=_14=_14||_17;
 if(!_b){
-_15.style.display="none";
+_14.style.display="none";
 }
-var _19=0;
-function _1a(){
-var _1b=_18.contentWindow.name;
-if(typeof _1b=="string"){
-if(_1b!=_10){
-_19=2;
-_9.ioArgs.hash=_18.contentWindow.location.hash;
-_9.callback(_1b);
+var _18=0;
+function _19(){
+var _1a=_17.contentWindow.name;
+if(typeof _1a=="string"){
+if(_1a!=_10){
+_18=2;
+_9.ioArgs.hash=_17.contentWindow.location.hash;
+_9.callback(_1a);
 }
 }
 };
-dojox.io.windowName[_e]=_18.onload=function(){
+dojox.io.windowName[_e]=_17.onload=function(){
 try{
-if(!dojo.isMoz&&_18.contentWindow.location=="about:blank"){
+if(!dojo.isMoz&&_17.contentWindow.location=="about:blank"){
 return;
 }
 }
 catch(e){
 }
-if(!_19){
-_19=1;
+if(!_18){
+_18=1;
 if(_b){
 if(_c){
 _c();
 }
 }else{
-_18.contentWindow.location=_f;
+_17.contentWindow.location=_f;
 }
 }
 try{
-if(_19<2){
-_1a();
+if(_18<2){
+_19();
 }
 }
 catch(e){
 }
 };
-_18.name=_10;
+_17.name=_10;
 if(_a.match(/GET/i)){
 dojo._ioAddQueryToUrl(_d);
-_18.src=_d.url;
-_12.appendChild(_18);
-if(_18.contentWindow){
-_18.contentWindow.location.replace(_d.url);
+_17.src=_d.url;
+_11.appendChild(_17);
+if(_17.contentWindow){
+_17.contentWindow.location.replace(_d.url);
 }
 }else{
 if(_a.match(/POST/i)){
-_12.appendChild(_18);
-var _1c=dojo.doc.createElement("form");
-dojo.body().appendChild(_1c);
-var _1d=dojo.queryToObject(_d.query);
-for(var i in _1d){
-var _1f=_1d[i];
-_1f=_1f instanceof Array?_1f:[_1f];
-for(var j=0;j<_1f.length;j++){
-var _21=doc.createElement("input");
-_21.type="hidden";
-_21.name=i;
-_21.value=_1f[j];
-_1c.appendChild(_21);
-}
-}
-_1c.method="POST";
-_1c.action=_d.url;
-_1c.target=_10;
-_1c.submit();
-_1c.parentNode.removeChild(_1c);
+_11.appendChild(_17);
+var _1b=dojo.doc.createElement("form");
+dojo.body().appendChild(_1b);
+var _1c=dojo.queryToObject(_d.query);
+for(var i in _1c){
+var _1d=_1c[i];
+_1d=_1d instanceof Array?_1d:[_1d];
+for(var j=0;j<_1d.length;j++){
+var _1e=doc.createElement("input");
+_1e.type="hidden";
+_1e.name=i;
+_1e.value=_1d[j];
+_1b.appendChild(_1e);
+}
+}
+_1b.method="POST";
+_1b.action=_d.url;
+_1b.target=_10;
+_1b.submit();
+_1b.parentNode.removeChild(_1b);
 }else{
 throw new Error("Method "+_a+" not supported with the windowName transport");
 }
 }
-if(_18.contentWindow){
-_18.contentWindow.name=_10;
+if(_17.contentWindow){
+_17.contentWindow.name=_10;
 }
 },_frameNum:0};
 }
diff --git a/dojox/io/xhrMultiPart.js b/dojox/io/xhrMultiPart.js
index 2702614..21db1ce 100644
--- a/dojox/io/xhrMultiPart.js
+++ b/dojox/io/xhrMultiPart.js
@@ -29,43 +29,42 @@ _4.push("Content-Transfer-Encoding: "+_2.contentTransferEncoding);
 _4.push("",_2.content);
 return _4;
 };
-function _6(_7,_8){
-var o=dojo.formToObject(_7),_a=[];
+function _5(_6,_7){
+var o=dojo.formToObject(_6),_8=[];
 for(var p in o){
 if(dojo.isArray(o[p])){
-dojo.forEach(o[p],function(_c){
-_a=_a.concat(_1({name:p,content:_c},_8));
+dojo.forEach(o[p],function(_9){
+_8=_8.concat(_1({name:p,content:_9},_7));
 });
 }else{
-_a=_a.concat(_1({name:p,content:o[p]},_8));
+_8=_8.concat(_1({name:p,content:o[p]},_7));
 }
 }
-return _a;
+return _8;
 };
-dojox.io.xhrMultiPart=function(_d){
-if(!_d["file"]&&!_d["content"]&&!_d["form"]){
+dojox.io.xhrMultiPart=function(_a){
+if(!_a["file"]&&!_a["content"]&&!_a["form"]){
 throw new Error("content, file or form must be provided to dojox.io.xhrMultiPart's arguments");
 }
-var _e=dojox.uuid.generateRandomUuid(),_f=[],out="";
-if(_d["file"]||_d["content"]){
-var v=_d["file"]||_d["content"];
-dojo.forEach((dojo.isArray(v)?v:[v]),function(_12){
-_f=_f.concat(_1(_12,_e));
+var _b=dojox.uuid.generateRandomUuid(),_c=[],_d="";
+if(_a["file"]||_a["content"]){
+var v=_a["file"]||_a["content"];
+dojo.forEach((dojo.isArray(v)?v:[v]),function(_e){
+_c=_c.concat(_1(_e,_b));
 });
 }else{
-if(_d["form"]){
-if(dojo.query("input[type=file]",_d["form"]).length){
+if(_a["form"]){
+if(dojo.query("input[type=file]",_a["form"]).length){
 throw new Error("dojox.io.xhrMultiPart cannot post files that are values of an INPUT TYPE=FILE.  Use dojo.io.iframe.send() instead.");
 }
-_f=_6(_d["form"],_e);
+_c=_5(_a["form"],_b);
 }
 }
-if(_f.length){
-_f.push("--"+_e+"--","");
-out=_f.join("\r\n");
+if(_c.length){
+_c.push("--"+_b+"--","");
+_d=_c.join("\r\n");
 }
-
-return dojo.rawXhrPost(dojo.mixin(_d,{contentType:"multipart/form-data; boundary="+_e,postData:out}));
+return dojo.rawXhrPost(dojo.mixin(_a,{contentType:"multipart/form-data; boundary="+_b,postData:_d}));
 };
 })();
 }
diff --git a/dojox/io/xhrPlugins.js b/dojox/io/xhrPlugins.js
index c86c1d6..315d907 100644
--- a/dojox/io/xhrPlugins.js
+++ b/dojox/io/xhrPlugins.js
@@ -13,68 +13,74 @@ dojo.require("dojo._base.xhr");
 (function(){
 var _1;
 var _2;
+function _3(){
+return _2=dojox.io.xhrPlugins.plainXhr=_2||dojo._defaultXhr||dojo.xhr;
+};
 dojox.io.xhrPlugins.register=function(){
+var _4=_3();
 if(!_1){
 _1=new dojo.AdapterRegistry();
-_2=dojox.io.xhrPlugins.plainXhr=dojo._defaultXhr||dojo.xhr;
-dojo[dojo._defaultXhr?"_defaultXhr":"xhr"]=function(_3,_4,_5){
+dojo[dojo._defaultXhr?"_defaultXhr":"xhr"]=function(_5,_6,_7){
 return _1.match.apply(_1,arguments);
 };
-_1.register("xhr",function(_6,_7){
-if(!_7.url.match(/^\w*:\/\//)){
+_1.register("xhr",function(_8,_9){
+if(!_9.url.match(/^\w*:\/\//)){
 return true;
 }
-var _8=window.location.href.match(/^.*?\/\/.*?\//)[0];
-return _7.url.substring(0,_8.length)==_8;
-},_2);
+var _a=window.location.href.match(/^.*?\/\/.*?\//)[0];
+return _9.url.substring(0,_a.length)==_a;
+},_4);
 }
 return _1.register.apply(_1,arguments);
 };
-dojox.io.xhrPlugins.addProxy=function(_9){
-dojox.io.xhrPlugins.register("proxy",function(_a,_b){
+dojox.io.xhrPlugins.addProxy=function(_b){
+var _c=_3();
+dojox.io.xhrPlugins.register("proxy",function(_d,_e){
 return true;
-},function(_c,_d,_e){
-_d.url=_9+encodeURIComponent(_d.url);
-return _2.call(dojo,_c,_d,_e);
+},function(_f,_10,_11){
+_10.url=_b+encodeURIComponent(_10.url);
+return _c.call(dojo,_f,_10,_11);
 });
 };
-var _f;
-dojox.io.xhrPlugins.addCrossSiteXhr=function(url,_11){
-if(_f===undefined&&window.XMLHttpRequest){
+var _12;
+dojox.io.xhrPlugins.addCrossSiteXhr=function(url,_13){
+var _14=_3();
+if(_12===undefined&&window.XMLHttpRequest){
 try{
 var xhr=new XMLHttpRequest();
-xhr.open("GET","http://fnadkfna.com",true);
-_f=true;
+xhr.open("GET","http://testing-cross-domain-capability.com",true);
+_12=true;
+dojo.config.noRequestedWithHeaders=true;
 }
 catch(e){
-_f=false;
+_12=false;
 }
 }
-dojox.io.xhrPlugins.register("cs-xhr",function(_13,_14){
-return (_f||(window.XDomainRequest&&_14.sync!==true&&(_13=="GET"||_13=="POST"||_11)))&&(_14.url.substring(0,url.length)==url);
-},_f?_2:function(){
-var _15=dojo._xhrObj;
+dojox.io.xhrPlugins.register("cs-xhr",function(_15,_16){
+return (_12||(window.XDomainRequest&&_16.sync!==true&&(_15=="GET"||_15=="POST"||_13)))&&(_16.url.substring(0,url.length)==url);
+},_12?_14:function(){
+var _17=dojo._xhrObj;
 dojo._xhrObj=function(){
 var xdr=new XDomainRequest();
 xdr.readyState=1;
 xdr.setRequestHeader=function(){
 };
-xdr.getResponseHeader=function(_17){
-return _17=="Content-Type"?xdr.contentType:null;
+xdr.getResponseHeader=function(_18){
+return _18=="Content-Type"?xdr.contentType:null;
 };
-function _18(_19,_1a){
+function _19(_1a,_1b){
 return function(){
-xdr.readyState=_1a;
-xdr.status=_19;
+xdr.readyState=_1b;
+xdr.status=_1a;
 };
 };
-xdr.onload=_18(200,4);
-xdr.onprogress=_18(200,3);
-xdr.onerror=_18(404,4);
+xdr.onload=_19(200,4);
+xdr.onprogress=_19(200,3);
+xdr.onerror=_19(404,4);
 return xdr;
 };
-var dfd=(_11?_11(_2):_2).apply(dojo,arguments);
-dojo._xhrObj=_15;
+var dfd=(_13?_13(_3()):_3()).apply(dojo,arguments);
+dojo._xhrObj=_17;
 return dfd;
 });
 };
@@ -97,8 +103,8 @@ _20=false;
 _1e="POST";
 }
 for(var i in _1f.headers){
-var _24=i.match(/^X-/)?i.substring(2).replace(/-/g,"_").toLowerCase():("http-"+i);
-_22[_24]=_1f.headers[i];
+var _23=i.match(/^X-/)?i.substring(2).replace(/-/g,"_").toLowerCase():("http-"+i);
+_22[_23]=_1f.headers[i];
 }
 _1f.query=dojo.objectToQuery(_22);
 dojo._ioAddQueryToUrl(_1f);
diff --git a/dojox/io/xhrWindowNamePlugin.js b/dojox/io/xhrWindowNamePlugin.js
index e4974b3..863d04f 100644
--- a/dojox/io/xhrWindowNamePlugin.js
+++ b/dojox/io/xhrWindowNamePlugin.js
@@ -17,21 +17,27 @@ dojox.io.xhrPlugins.register("windowName",function(_4,_5){
 return _5.sync!==true&&(_4=="GET"||_4=="POST"||_2)&&(_5.url.substring(0,_1.length)==_1);
 },function(_6,_7,_8){
 var _9=dojox.io.windowName.send;
-var _a=(_2?_2(_9,true):_9)(_6,_7,_8);
-_a.addCallback(function(_b){
-var _c=_a.ioArgs;
-_c.xhr={getResponseHeader:function(_d){
-return dojo.queryToObject(_c.hash.match(/[^#]*$/)[0])[_d];
+var _a=_7.load;
+_7.load=undefined;
+var _b=(_2?_2(_9,true):_9)(_6,_7,_8);
+_b.addCallback(function(_c){
+var _d=_b.ioArgs;
+_d.xhr={getResponseHeader:function(_e){
+return dojo.queryToObject(_d.hash.match(/[^#]*$/)[0])[_e];
 }};
-if(_c.handleAs=="json"){
+if(_d.handleAs=="json"){
 if(!_3){
-dojox.secure.capability.validate(_b,["Date"],{});
+dojox.secure.capability.validate(_c,["Date"],{});
 }
-return dojo.fromJson(_b);
+return dojo.fromJson(_c);
 }
-return dojo._contentHandlers[_c.handleAs||"text"]({responseText:_b});
+return dojo._contentHandlers[_d.handleAs||"text"]({responseText:_c});
 });
-return _a;
+_7.load=_a;
+if(_a){
+_b.addCallback(_a);
+}
+return _b;
 });
 };
 }
diff --git a/dojox/jq.js b/dojox/jq.js
new file mode 100644
index 0000000..e6e85d4
--- /dev/null
+++ b/dojox/jq.js
@@ -0,0 +1,1296 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.jq"]){
+dojo._hasResource["dojox.jq"]=true;
+dojo.provide("dojox.jq");
+dojo.require("dojo.NodeList-traverse");
+dojo.require("dojo.NodeList-manipulate");
+dojo.require("dojo.io.script");
+(function(){
+dojo.config.ioPublish=true;
+var _1="|img|meta|hr|br|input|";
+function _2(_3,_4){
+_3+="";
+_3=_3.replace(/<\s*(\w+)([^\/\>]*)\/\s*>/g,function(_5,_6,_7){
+if(_1.indexOf("|"+_6+"|")==-1){
+return "<"+_6+_7+"></"+_6+">";
+}else{
+return _5;
+}
+});
+return dojo._toDom(_3,_4);
+};
+function _8(_9){
+var _a=_9.indexOf("-");
+if(_a!=-1){
+if(_a==0){
+_9=_9.substring(1);
+}
+_9=_9.replace(/-(\w)/g,function(_b,_c){
+return _c.toUpperCase();
+});
+}
+return _9;
+};
+var _d=dojo.global.$;
+var _e=dojo.global.jQuery;
+var $=dojo.global.$=dojo.global.jQuery=function(){
+var _f=arguments[0];
+if(!_f){
+return $._wrap([],null,$);
+}else{
+if(dojo.isString(_f)){
+if(_f.charAt(0)=="<"){
+_f=_2(_f);
+if(_f.nodeType==11){
+_f=_f.childNodes;
+}else{
+return $._wrap([_f],null,$);
+}
+}else{
+var _10=dojo._NodeListCtor;
+dojo._NodeListCtor=$;
+var _11=arguments[1];
+if(_11&&_11._is$){
+_11=_11[0];
+}else{
+if(dojo.isString(_11)){
+_11=dojo.query(_11)[0];
+}
+}
+var nl=dojo.query.call(this,_f,_11);
+dojo._NodeListCtor=_10;
+return nl;
+}
+}else{
+if(dojo.isFunction(_f)){
+$.ready(_f);
+return $;
+}else{
+if(_f==document||_f==window){
+return $._wrap([_f],null,$);
+}else{
+if(dojo.isArray(_f)){
+var ary=[];
+for(var i=0;i<_f.length;i++){
+if(dojo.indexOf(ary,_f[i])==-1){
+ary.push(_f[i]);
+}
+}
+return $._wrap(_f,null,$);
+}else{
+if("nodeType" in _f){
+return $._wrap([_f],null,$);
+}
+}
+}
+}
+}
+}
+return $._wrap(dojo._toArray(_f),null,$);
+};
+var _12=dojo.NodeList.prototype;
+var f=$.fn=$.prototype=dojo.delegate(_12);
+$._wrap=dojo.NodeList._wrap;
+var _13=/^H\d/i;
+var _14=dojo.query.pseudos;
+dojo.mixin(_14,{has:function(_15,_16){
+return function(_17){
+return $(_16,_17).length;
+};
+},visible:function(_18,_19){
+return function(_1a){
+return dojo.style(_1a,"visible")!="hidden"&&dojo.style(_1a,"display")!="none";
+};
+},hidden:function(_1b,_1c){
+return function(_1d){
+return _1d.type=="hidden"||dojo.style(_1d,"visible")=="hidden"||dojo.style(_1d,"display")=="none";
+};
+},selected:function(_1e,_1f){
+return function(_20){
+return _20.selected;
+};
+},checked:function(_21,_22){
+return function(_23){
+return _23.nodeName.toUpperCase()=="INPUT"&&_23.checked;
+};
+},disabled:function(_24,_25){
+return function(_26){
+return _26.getAttribute("disabled");
+};
+},enabled:function(_27,_28){
+return function(_29){
+return !_29.getAttribute("disabled");
+};
+},input:function(_2a,_2b){
+return function(_2c){
+var n=_2c.nodeName.toUpperCase();
+return n=="INPUT"||n=="SELECT"||n=="TEXTAREA"||n=="BUTTON";
+};
+},button:function(_2d,_2e){
+return function(_2f){
+return (_2f.nodeName.toUpperCase()=="INPUT"&&_2f.type=="button")||_2f.nodeName.toUpperCase()=="BUTTON";
+};
+},header:function(_30,_31){
+return function(_32){
+return _32.nodeName.match(_13);
+};
+}});
+var _33={};
+dojo.forEach(["text","password","radio","checkbox","submit","image","reset","file"],function(_34){
+_33[_34]=function(_35,_36){
+return function(_37){
+return _37.nodeName.toUpperCase()=="INPUT"&&_37.type==_34;
+};
+};
+});
+dojo.mixin(_14,_33);
+$.browser={mozilla:dojo.isMoz,msie:dojo.isIE,opera:dojo.isOpera,safari:dojo.isSafari};
+$.browser.version=dojo.isIE||dojo.isMoz||dojo.isOpera||dojo.isSafari||dojo.isWebKit;
+$.ready=$.fn.ready=function(_38){
+dojo.addOnLoad(dojo.hitch(null,_38,$));
+return this;
+};
+f._is$=true;
+f.size=function(){
+return this.length;
+};
+$.prop=function(_39,_3a){
+if(dojo.isFunction(_3a)){
+return _3a.call(_39);
+}else{
+return _3a;
+}
+};
+$.className={add:dojo.addClass,remove:dojo.removeClass,has:dojo.hasClass};
+$.makeArray=function(_3b){
+if(typeof _3b=="undefined"){
+return [];
+}else{
+if(_3b.length&&!dojo.isString(_3b)&&!("location" in _3b)){
+return dojo._toArray(_3b);
+}else{
+return [_3b];
+}
+}
+};
+$.merge=function(_3c,_3d){
+var _3e=[_3c.length,0];
+_3e=_3e.concat(_3d);
+_3c.splice.apply(_3c,_3e);
+return _3c;
+};
+$.each=function(_3f,cb){
+if(dojo.isArrayLike(_3f)){
+for(var i=0;i<_3f.length;i++){
+if(cb.call(_3f[i],i,_3f[i])===false){
+break;
+}
+}
+}else{
+if(dojo.isObject(_3f)){
+for(var _40 in _3f){
+if(cb.call(_3f[_40],_40,_3f[_40])===false){
+break;
+}
+}
+}
+}
+return this;
+};
+f.each=function(cb){
+return $.each.call(this,this,cb);
+};
+f.eq=function(){
+var nl=$();
+dojo.forEach(arguments,function(i){
+if(this[i]){
+nl.push(this[i]);
+}
+},this);
+return nl;
+};
+f.get=function(_41){
+if(_41||_41==0){
+return this[_41];
+}
+return this;
+};
+f.index=function(arg){
+if(arg._is$){
+arg=arg[0];
+}
+return this.indexOf(arg);
+};
+var _42=[];
+var _43=0;
+var _44=dojo._scopeName+"DataId";
+var _45=function(_46){
+var id=_46.getAttribute(_44);
+if(!id){
+id=_43++;
+_46.setAttribute(_44,id);
+}
+};
+var _47=function(_48){
+var _49={};
+if(_48.nodeType==1){
+var id=_45(_48);
+_49=_42[id];
+if(!_49){
+_49=_42[id]={};
+}
+}
+return _49;
+};
+$.data=function(_4a,_4b,_4c){
+var _4d=null;
+if(_4b=="events"){
+_4d=_4e[_4a.getAttribute(_4f)];
+var _50=true;
+if(_4d){
+for(var _51 in _4d){
+_50=false;
+break;
+}
+}
+return _50?null:_4d;
+}
+var _52=_47(_4a);
+if(typeof _4c!="undefined"){
+_52[_4b]=_4c;
+}else{
+_4d=_52[_4b];
+}
+return _4c?this:_4d;
+};
+$.removeData=function(_53,_54){
+var _55=_47(_53);
+delete _55[_54];
+if(_53.nodeType==1){
+var _56=true;
+for(var _57 in _55){
+_56=false;
+break;
+}
+if(_56){
+_53.removeAttribute(_44);
+}
+}
+return this;
+};
+f.data=function(_58,_59){
+var _5a=null;
+this.forEach(function(_5b){
+_5a=$.data(_5b,_58,_59);
+});
+return _59?this:_5a;
+};
+f.removeData=function(_5c){
+this.forEach(function(_5d){
+$.removeData(_5d,_5c);
+});
+return this;
+};
+function _5e(obj,_5f){
+if(obj==_5f){
+return obj;
+}
+var _60={};
+for(var x in _5f){
+if((_60[x]===undefined||_60[x]!=_5f[x])&&_5f[x]!==undefined&&obj!=_5f[x]){
+if(dojo.isObject(obj[x])&&dojo.isObject(_5f[x])){
+if(dojo.isArray(_5f[x])){
+obj[x]=_5f[x];
+}else{
+obj[x]=_5e(obj[x],_5f[x]);
+}
+}else{
+obj[x]=_5f[x];
+}
+}
+}
+if(dojo.isIE&&_5f){
+var p=_5f.toString;
+if(typeof p=="function"&&p!=obj.toString&&p!=_60.toString&&p!="\nfunction toString() {\n    [native code]\n}\n"){
+obj.toString=_5f.toString;
+}
+}
+return obj;
+};
+f.extend=function(){
+var _61=[this];
+_61=_61.concat(arguments);
+return $.extend.apply($,_61);
+};
+$.extend=function(){
+var _62=arguments,_63;
+for(var i=0;i<_62.length;i++){
+var obj=_62[i];
+if(obj&&dojo.isObject(obj)){
+if(!_63){
+_63=obj;
+}else{
+_5e(_63,obj);
+}
+}
+}
+return _63;
+};
+$.noConflict=function(_64){
+var me=$;
+dojo.global.$=_d;
+if(_64){
+dojo.global.jQuery=_e;
+}
+return me;
+};
+f.attr=function(_65,_66){
+if(arguments.length==1&&dojo.isString(arguments[0])){
+var _67=this[0];
+if(!_67){
+return null;
+}
+var arg=arguments[0];
+var _68=dojo.attr(_67,arg);
+var _69=_67[arg];
+if((arg in _67)&&!dojo.isObject(_69)&&_65!="href"){
+return _69;
+}else{
+return _68||_69;
+}
+}else{
+if(dojo.isObject(_65)){
+for(var _6a in _65){
+this.attr(_6a,_65[_6a]);
+}
+return this;
+}else{
+var _6b=dojo.isFunction(_66);
+this.forEach(function(_6c,_6d){
+var _6e=_6c[_65];
+if((_65 in _6c)&&!dojo.isObject(_6e)&&_65!="href"){
+_6c[_65]=(_6b?_66.call(_6c,_6d):_66);
+}else{
+if(_6c.nodeType==1){
+dojo.attr(_6c,_65,(_6b?_66.call(_6c,_6d):_66));
+}
+}
+});
+return this;
+}
+}
+};
+f.removeAttr=function(_6f){
+this.forEach(function(_70,_71){
+var _72=_70[_6f];
+if((_6f in _70)&&!dojo.isObject(_72)&&_6f!="href"){
+delete _70[_6f];
+}else{
+if(_70.nodeType==1){
+if(_6f=="class"){
+_70.removeAttribute(_6f);
+}else{
+dojo.removeAttr(_70,_6f);
+}
+}
+}
+});
+return this;
+};
+f.toggleClass=function(_73,_74){
+var _75=arguments.length>1;
+this.forEach(function(_76){
+dojo.toggleClass(_76,_73,_75?_74:!dojo.hasClass(_76,_73));
+});
+return this;
+};
+f.toggle=function(){
+var _77=arguments;
+if(arguments.length>1&&dojo.isFunction(arguments[0])){
+var _78=0;
+var _79=function(){
+var _7a=_77[_78].apply(this,arguments);
+_78+=1;
+if(_78>_77.length-1){
+_78=0;
+}
+};
+return this.bind("click",_79);
+}else{
+var _7b=arguments.length==1?arguments[0]:undefined;
+this.forEach(function(_7c){
+var _7d=typeof _7b=="undefined"?dojo.style(_7c,"display")=="none":_7b;
+var _7e=(_7d?"show":"hide");
+var nl=$(_7c);
+nl[_7e].apply(nl,_77);
+});
+return this;
+}
+};
+f.hasClass=function(_7f){
+return this.some(function(_80){
+return dojo.hasClass(_80,_7f);
+});
+};
+f.html=f.innerHTML;
+dojo.forEach(["filter","slice"],function(_81){
+f[_81]=function(){
+var nl;
+if(dojo.isFunction(arguments[0])){
+var _82=arguments[0];
+arguments[0]=function(_83,_84){
+return _82.call(_83,_83,_84);
+};
+}
+if(_81=="filter"&&dojo.isString(arguments[0])){
+var nl=this._filterQueryResult(this,arguments[0]);
+}else{
+var _85=dojo._NodeListCtor;
+dojo._NodeListCtor=f;
+nl=$(_12[_81].apply(this,arguments));
+dojo._NodeListCtor=_85;
+}
+return nl._stash(this);
+};
+});
+f.map=function(_86){
+return this._buildArrayFromCallback(_86);
+};
+$.map=function(ary,_87){
+return f._buildArrayFromCallback.call(ary,_87);
+};
+$.inArray=function(_88,ary){
+return dojo.indexOf(ary,_88);
+};
+f.is=function(_89){
+return (_89?!!this.filter(_89).length:false);
+};
+f.not=function(){
+var _8a=$.apply($,arguments);
+var nl=$(_12.filter.call(this,function(_8b){
+return _8a.indexOf(_8b)==-1;
+}));
+return nl._stash(this);
+};
+f.add=function(){
+return this.concat.apply(this,arguments);
+};
+function _8c(_8d){
+var doc=_8d.contentDocument||(((_8d.name)&&(_8d.document)&&(document.getElementsByTagName("iframe")[_8d.name].contentWindow)&&(document.getElementsByTagName("iframe")[_8d.name].contentWindow.document)))||((_8d.name)&&(document.frames[_8d.name])&&(document.frames[_8d.name].document))||null;
+return doc;
+};
+f.contents=function(){
+var ary=[];
+this.forEach(function(_8e){
+if(_8e.nodeName.toUpperCase()=="IFRAME"){
+var doc=_8c(_8e);
+if(doc){
+ary.push(doc);
+}
+}else{
+var _8f=_8e.childNodes;
+for(var i=0;i<_8f.length;i++){
+ary.push(_8f[i]);
+}
+}
+});
+return this._wrap(ary)._stash(this);
+};
+f.find=function(_90){
+var ary=[];
+this.forEach(function(_91){
+if(_91.nodeType==1){
+ary=ary.concat(dojo._toArray($(_90,_91)));
+}
+});
+return this._getUniqueAsNodeList(ary)._stash(this);
+};
+f.andSelf=function(){
+return this.add(this._parent);
+};
+f.remove=function(_92){
+var nl=(_92?this._filterQueryResult(this,_92):this);
+nl.removeData();
+nl.forEach(function(_93){
+_93.parentNode.removeChild(_93);
+});
+return this;
+};
+$.css=function(_94,_95,_96){
+_95=_8(_95);
+var _97=(_96?dojo.style(_94,_95,_96):dojo.style(_94,_95));
+return _97;
+};
+f.css=function(_98,_99){
+if(dojo.isString(_98)){
+_98=_8(_98);
+if(arguments.length==2){
+if(!dojo.isString(_99)&&_98!="zIndex"){
+_99=_99+"px";
+}
+this.forEach(function(_9a){
+if(_9a.nodeType==1){
+dojo.style(_9a,_98,_99);
+}
+});
+return this;
+}else{
+_99=dojo.style(this[0],_98);
+if(!dojo.isString(_99)&&_98!="zIndex"){
+_99=_99+"px";
+}
+return _99;
+}
+}else{
+for(var _9b in _98){
+this.css(_9b,_98[_9b]);
+}
+return this;
+}
+};
+function _9c(nl,_9d,_9e,_9f){
+if(_9f){
+var mod={};
+mod[_9e]=_9f;
+nl.forEach(function(_a0){
+dojo[_9d](_a0,mod);
+});
+return nl;
+}else{
+return Math.abs(Math.round(dojo[_9d](nl[0])[_9e]));
+}
+};
+f.height=function(_a1){
+return _9c(this,"contentBox","h",_a1);
+};
+f.width=function(_a2){
+return _9c(this,"contentBox","w",_a2);
+};
+function _a3(_a4,_a5,_a6,_a7,_a8){
+var _a9=false;
+if((_a9=_a4.style.display=="none")){
+_a4.style.display="block";
+}
+var cs=dojo.getComputedStyle(_a4);
+var _aa=Math.abs(Math.round(dojo._getContentBox(_a4,cs)[_a5]));
+var pad=_a6?Math.abs(Math.round(dojo._getPadExtents(_a4,cs)[_a5])):0;
+var _ab=_a7?Math.abs(Math.round(dojo._getBorderExtents(_a4,cs)[_a5])):0;
+var _ac=_a8?Math.abs(Math.round(dojo._getMarginExtents(_a4,cs)[_a5])):0;
+if(_a9){
+_a4.style.display="none";
+}
+return pad+_aa+_ab+_ac;
+};
+f.innerHeight=function(){
+return _a3(this[0],"h",true);
+};
+f.innerWidth=function(){
+return _a3(this[0],"w",true);
+};
+f.outerHeight=function(_ad){
+return _a3(this[0],"h",true,true,_ad);
+};
+f.outerWidth=function(_ae){
+return _a3(this[0],"w",true,true,_ae);
+};
+var _4e=[];
+var _af=1;
+var _4f=dojo._scopeName+"eventid";
+var _b0;
+function _b1(_b2){
+_b2=_b2.split("$$")[0];
+var _b3=_b2.indexOf(".");
+if(_b3!=-1){
+_b2=_b2.substring(0,_b3);
+}
+return _b2;
+};
+function _b4(_b5,_b6){
+if(_b6.indexOf("ajax")==0){
+return dojo.subscribe(_b7[_b6],function(dfd,res){
+var _b8=new $.Event(_b6);
+if("ajaxComplete|ajaxSend|ajaxSuccess".indexOf(_b6)!=-1){
+_b9(_b5,[_b8,dfd.ioArgs.xhr,dfd.ioArgs.args]);
+}else{
+if(_b6=="ajaxError"){
+_b9(_b5,[_b8,dfd.ioArgs.xhr,dfd.ioArgs.args,res]);
+}else{
+_b9(_b5,[_b8]);
+}
+}
+});
+}else{
+return dojo.connect(_b5,"on"+_b6,function(e){
+_b9(_b5,arguments);
+});
+}
+};
+$.Event=function(_ba){
+if(this==$){
+return new $.Event(_ba);
+}
+if(typeof _ba=="string"){
+this.type=_ba.replace(/!/,"");
+}else{
+dojo.mixin(this,_ba);
+}
+this.timeStamp=(new Date()).getTime();
+this._isFake=true;
+this._isStrict=(this.type.indexOf("!")!=-1);
+};
+var ep=$.Event.prototype={preventDefault:function(){
+this.isDefaultPrevented=this._true;
+},stopPropagation:function(){
+this.isPropagationStopped=this._true;
+},stopImmediatePropagation:function(){
+this.isPropagationStopped=this._true;
+this.isImmediatePropagationStopped=this._true;
+},_true:function(){
+return true;
+},_false:function(){
+return false;
+}};
+dojo.mixin(ep,{isPropagationStopped:ep._false,isImmediatePropagationStopped:ep._false,isDefaultPrevented:ep._false});
+function _bb(_bc,_bd){
+_bc=_bc||[];
+_bc=[].concat(_bc);
+var evt=_bc[0];
+if(!evt||!evt.preventDefault){
+evt=_bd&&_bd.preventDefault?_bd:new $.Event(_bd);
+_bc.unshift(evt);
+}
+return _bc;
+};
+var _be=false;
+function _b9(_bf,_c0,_c1){
+_be=true;
+_c0=_c0||_b0;
+_c1=_c1;
+if(_bf.nodeType==9){
+_bf=_bf.documentElement;
+}
+var _c2=_bf.getAttribute(_4f);
+if(!_c2){
+return;
+}
+var evt=_c0[0];
+var _c3=evt.type;
+var _c4=_b1(_c3);
+var cbs=_4e[_c2][_c4];
+var _c5;
+if(_c1){
+_c5=_c1.apply(_bf,_c0);
+}
+if(_c5!==false){
+for(var _c6 in cbs){
+if(_c6!="_connectId"&&(!evt._isStrict&&(_c6.indexOf(_c3)==0)||(evt._isStrict&&_c6==_c3))){
+evt[dojo._scopeName+"callbackId"]=_c6;
+var cb=cbs[_c6];
+if(typeof cb.data!="undefined"){
+evt.data=cb.data;
+}else{
+evt.data=null;
+}
+if((_c5=cb.fn.apply(evt.target,_c0))===false&&!evt._isFake){
+dojo.stopEvent(evt);
+}
+evt.result=_c5;
+}
+}
+}
+return _c5;
+};
+f.triggerHandler=function(_c7,_c8,_c9){
+var _ca=this[0];
+if(_ca&&_ca.nodeType!=3&&_ca.nodeType!=8){
+_c8=_bb(_c8,_c7);
+return _b9(_ca,_c8,_c9);
+}else{
+return undefined;
+}
+};
+f.trigger=function(_cb,_cc,_cd){
+_cc=_bb(_cc,_cb);
+var evt=_cc[0];
+var _cb=_b1(evt.type);
+_b0=_cc;
+currentExtraFunc=_cd;
+var _ce=null;
+var _cf=!evt.target;
+this.forEach(function(_d0){
+if(_d0.nodeType!=3&&_d0.nodeType!=8){
+if(_d0.nodeType==9){
+_d0=_d0.documentElement;
+}
+if(evt._isFake){
+evt.currentTarget=_d0;
+if(_cf){
+evt.target=_d0;
+}
+}
+if(_cd){
+var _d1=_cc.slice(1);
+_ce=_cd.apply(_d0,(_ce=null?_d1:_d1.concat(_ce)));
+}
+if(_ce!==false){
+_be=false;
+if(_d0[_cb]){
+try{
+_ce=_d0[_cb]();
+}
+catch(e){
+}
+}else{
+if(_d0["on"+_cb]){
+try{
+_ce=_d0["on"+_cb]();
+}
+catch(e){
+}
+}
+}
+if(!_be){
+_ce=_b9(_d0,_cc);
+}
+var _d2=_d0.parentNode;
+if(_ce!==false&&!evt.isImmediatePropagationStopped()&&!evt.isPropagationStopped()&&_d2&&_d2.nodeType==1){
+$(_d2).trigger(_cb,_cc,_cd);
+}
+}
+}
+});
+_b0=null;
+currentExtraFunc=null;
+return this;
+};
+var _d3=0;
+f.bind=function(_d4,_d5,fn){
+_d4=_d4.split(" ");
+if(!fn){
+fn=_d5;
+_d5=null;
+}
+this.forEach(function(_d6){
+if(_d6.nodeType!=3&&_d6.nodeType!=8){
+if(_d6.nodeType==9){
+_d6=_d6.documentElement;
+}
+var _d7=_d6.getAttribute(_4f);
+if(!_d7){
+_d7=_af++;
+_d6.setAttribute(_4f,_d7);
+_4e[_d7]={};
+}
+for(var i=0;i<_d4.length;i++){
+var _d8=_d4[i];
+var _d9=_b1(_d8);
+if(_d9==_d8){
+_d8=_d9+"$$"+(_d3++);
+}
+var lls=_4e[_d7];
+if(!lls[_d9]){
+lls[_d9]={_connectId:_b4(_d6,_d9)};
+}
+lls[_d9][_d8]={fn:fn,data:_d5};
+}
+}
+});
+return this;
+};
+function _da(src,_db){
+var _dc=_db.getAttribute(_4f);
+var sls=_4e[_dc];
+if(!sls){
+return;
+}
+var _dd=_dd=_af++;
+_db.setAttribute(_4f,_dd);
+var tls=_4e[_dd]={};
+var _de={};
+for(var _df in sls){
+var _e0=tls[_df]={_connectId:_b4(_db,_df)};
+var _e1=sls[_df];
+for(var _e2 in _e1){
+_e0[_e2]={fn:_e1[_e2].fn,data:_e1[_e2].data,};
+}
+}
+};
+function _e3(lls,_e4,_e5,_e6,fn){
+var _e7=lls[_e4];
+if(_e7){
+var _e8=_e5.indexOf(".")!=-1;
+var _e9=false;
+if(_e6){
+delete _e7[_e6];
+}else{
+if(!_e8&&!fn){
+_e9=true;
+}else{
+if(_e8){
+if(_e5.charAt(0)=="."){
+for(var _ea in _e7){
+if(_ea.indexOf(_e5)==_ea.length-_e5.length){
+delete _e7[_ea];
+}
+}
+}else{
+delete _e7[_e5];
+}
+}else{
+for(var _ea in _e7){
+if(_ea.indexOf("$$")!=-1&&_e7[_ea].fn==fn){
+delete _e7[_ea];
+break;
+}
+}
+}
+}
+}
+var _eb=true;
+for(var _ea in _e7){
+if(_ea!="_connectId"){
+_eb=false;
+break;
+}
+}
+if(_e9||_eb){
+if(_e4.indexOf("ajax")!=-1){
+dojo.unsubscribe(_e7._connectId);
+}else{
+dojo.disconnect(_e7._connectId);
+}
+delete lls[_e4];
+}
+}
+};
+f.unbind=function(_ec,fn){
+var _ed=_ec?_ec[dojo._scopeName+"callbackId"]:null;
+_ec=_ec&&_ec.type?_ec.type:_ec;
+_ec=_ec?_ec.split(" "):_ec;
+this.forEach(function(_ee){
+if(_ee.nodeType!=3&&_ee.nodeType!=8){
+if(_ee.nodeType==9){
+_ee=_ee.documentElement;
+}
+var _ef=_ee.getAttribute(_4f);
+if(_ef){
+var lls=_4e[_ef];
+if(lls){
+var _f0=_ec;
+if(!_f0){
+_f0=[];
+for(var _f1 in lls){
+_f0.push(_f1);
+}
+}
+for(var i=0;i<_f0.length;i++){
+var _f2=_f0[i];
+var _f3=_b1(_f2);
+if(_f2.charAt(0)=="."){
+for(var _f1 in lls){
+_e3(lls,_f1,_f2,_ed,fn);
+}
+}else{
+_e3(lls,_f3,_f2,_ed,fn);
+}
+}
+}
+}
+}
+});
+return this;
+};
+f.one=function(_f4,_f5){
+var _f6=function(){
+$(this).unbind(_f4,arguments.callee);
+return _f5.apply(this,arguments);
+};
+return this.bind(_f4,_f6);
+};
+f._cloneNode=function(src){
+var _f7=src.cloneNode(true);
+if(src.nodeType==1){
+var _f8=dojo.query("["+_4f+"]",_f7);
+for(var i=0,_f9;_f9=_f8[i];i++){
+var _fa=dojo.query("["+_4f+"=\""+_f9.getAttribute(_4f)+"\"]",src)[0];
+if(_fa){
+_da(_fa,_f9);
+}
+}
+}
+return _f7;
+};
+dojo.getObject("$.event.global",true);
+dojo.forEach(["blur","focus","dblclick","click","error","keydown","keypress","keyup","load","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","submit","ajaxStart","ajaxSend","ajaxSuccess","ajaxError","ajaxComplete","ajaxStop"],function(evt){
+f[evt]=function(_fb){
+if(_fb){
+this.bind(evt,_fb);
+}else{
+this.trigger(evt);
+}
+return this;
+};
+});
+function _fc(_fd){
+if(dojo.isString(_fd)){
+if(_fd=="slow"){
+_fd=700;
+}else{
+if(_fd="fast"){
+_fd=300;
+}else{
+_fd=500;
+}
+}
+}
+return _fd;
+};
+f.hide=function(_fe,_ff){
+_fe=_fc(_fe);
+this.forEach(function(node){
+var _100=node.style;
+var cs=dojo.getComputedStyle(node);
+if(cs.display=="none"){
+return;
+}
+_100.overflow="hidden";
+_100.display="block";
+if(_fe){
+dojo.anim(node,{width:0,height:0,opacity:0},_fe,null,function(){
+_100.width="";
+_100.height="";
+_100.display="none";
+return _ff&&_ff.call(node);
+});
+}else{
+dojo.style(node,"display","none");
+if(_ff){
+_ff.call(node);
+}
+}
+});
+return this;
+};
+f.show=function(_101,_102){
+_101=_fc(_101);
+this.forEach(function(node){
+var _103=node.style;
+var cs=dojo.getComputedStyle(node);
+if(cs.display!="none"){
+return;
+}
+if(_101){
+var _104=parseFloat(_103.width);
+var _105=parseFloat(_103.height);
+if(!_104||!_105){
+_103.display="block";
+var box=dojo.marginBox(node);
+_104=box.w;
+_105=box.h;
+}
+_103.width=0;
+_103.height=0;
+_103.overflow="hidden";
+dojo.attr(node,"opacity",0);
+_103.display="block";
+dojo.anim(node,{width:_104,height:_105,opacity:1},_101,null,_102?dojo.hitch(node,_102):undefined);
+}else{
+dojo.style(node,"display","block");
+if(_102){
+_102.call(node);
+}
+}
+});
+return this;
+};
+$.ajaxSettings={};
+$.ajaxSetup=function(args){
+dojo.mixin($.ajaxSettings,args);
+};
+var _b7={"ajaxStart":"/dojo/io/start","ajaxSend":"/dojo/io/send","ajaxSuccess":"/dojo/io/load","ajaxError":"/dojo/io/error","ajaxComplete":"/dojo/io/done","ajaxStop":"/dojo/io/stop"};
+for(var _106 in _b7){
+if(_106.indexOf("ajax")==0){
+(function(_107){
+f[_107]=function(_108){
+this.forEach(function(node){
+dojo.subscribe(_b7[_107],function(){
+var _109=new $.Event(_107);
+var _10a=arguments[0]&&arguments[0].ioArgs;
+var xhr=_10a&&_10a.xhr;
+var args=_10a&&_10a.args;
+var res=arguments[1];
+if("ajaxComplete|ajaxSend|ajaxSuccess".indexOf(_107)!=-1){
+return _108.call(node,_109,xhr,args);
+}else{
+if(_107=="ajaxError"){
+return _108.call(node,_109,xhr,args,res);
+}else{
+return _108.call(node,_109);
+}
+}
+});
+});
+return this;
+};
+})(_106);
+}
+}
+var _10b=dojo._xhrObj;
+dojo._xhrObj=function(args){
+var xhr=_10b.apply(dojo,arguments);
+if(args&&args.beforeSend){
+if(args.beforeSend(xhr)===false){
+return false;
+}
+}
+return xhr;
+};
+$.ajax=function(args){
+var temp=dojo.delegate($.ajaxSettings);
+for(var _10c in args){
+if(_10c=="data"&&dojo.isObject(args[_10c])&&dojo.isObject(temp.data)){
+for(var prop in args[_10c]){
+temp.data[prop]=args[_10c][prop];
+}
+}else{
+temp[_10c]=args[_10c];
+}
+}
+args=temp;
+var url=args.url;
+if("async" in args){
+args.sync=!args.async;
+}
+if(args.global===false){
+args.ioPublish=false;
+}
+if(args.data){
+var data=args.data;
+if(dojo.isString(data)){
+args.content=dojo.queryToObject(data);
+}else{
+for(var _10c in data){
+if(dojo.isFunction(data[_10c])){
+data[_10c]=data[_10c]();
+}
+}
+args.content=data;
+}
+}
+var _10d=args.dataType;
+if("dataType" in args){
+if(_10d=="script"){
+_10d="javascript";
+}else{
+if(_10d=="html"){
+_10d="text";
+}
+}
+args.handleAs=_10d;
+}else{
+_10d=args.handleAs="text";
+args.guessedType=true;
+}
+if("cache" in args){
+args.preventCache=!args.cache;
+}else{
+if(args.dataType=="script"||args.dataType=="jsonp"){
+args.preventCache=true;
+}
+}
+if(args.error){
+args._jqueryError=args.error;
+delete args.error;
+}
+args.handle=function(_10e,_10f){
+var _110="success";
+if(_10e instanceof Error){
+_110=(_10e.dojoType=="timeout"?"timeout":"error");
+if(args._jqueryError){
+args._jqueryError(_10f.xhr,_110,_10e);
+}
+}else{
+var xml=(_10f.args.guessedType&&_10f.xhr&&_10f.xhr.responseXML);
+if(xml){
+_10e=xml;
+}
+if(args.success){
+args.success(_10e,_110,_10f.xhr);
+}
+}
+if(args.complete){
+args.complete(_10e,_110,_10f.xhr);
+}
+return _10e;
+};
+var _111=(_10d=="jsonp");
+if(_10d=="javascript"){
+var _112=url.indexOf(":");
+var _113=url.indexOf("/");
+if(_112>0&&_112<_113){
+var _114=url.indexOf("/",_113+2);
+if(_114==-1){
+_114=url.length;
+}
+if(location.protocol!=url.substring(0,_112+1)||location.hostname!=url.substring(_113+2,_114)){
+_111=true;
+}
+}
+}
+if(_111){
+if(_10d=="jsonp"){
+var cb=args.jsonp;
+if(!cb){
+var _115=args.url.split("?")[1];
+if(_115&&(_115=dojo.queryToObject(_115))){
+cb=_116(_115);
+if(cb){
+var _117=new RegExp("([&\\?])?"+cb+"=?");
+args.url=args.url.replace(_117+"=?");
+}
+}
+if(!cb){
+cb=_116(args.content);
+if(cb){
+delete args.content[cb];
+}
+}
+}
+args.jsonp=cb||"callback";
+}
+var dfd=dojo.io.script.get(args);
+return dfd;
+}else{
+var dfd=dojo.xhr(args.type||"GET",args);
+return dfd.ioArgs.xhr===false?false:dfd.ioArgs.xhr;
+}
+};
+function _116(obj){
+for(var prop in obj){
+if(prop.indexOf("callback")==prop.length-8){
+return prop;
+}
+}
+return null;
+};
+$.getpost=function(_118,url,data,_119,_11a){
+var args={url:url,type:_118};
+if(data){
+if(dojo.isFunction(data)&&!_119){
+args.complete=data;
+}else{
+args.data=data;
+}
+}
+if(_119){
+if(dojo.isString(_119)&&!_11a){
+_11a=_119;
+}else{
+args.complete=_119;
+}
+}
+if(_11a){
+args.dataType=_11a;
+}
+return $.ajax(args);
+};
+$.get=dojo.hitch($,"getpost","GET");
+$.post=dojo.hitch($,"getpost","POST");
+$.getJSON=function(url,data,_11b){
+return $.getpost("GET",url,data,_11b,"json");
+};
+$.getScript=function(url,_11c){
+return $.ajax({url:url,success:_11c,dataType:"script"});
+};
+f.load=function(url,data,_11d){
+var node=this[0];
+if(!node||!node.nodeType||node.nodeType==9){
+dojo.addOnLoad(url);
+return this;
+}
+var _11e=url.split(/\s+/);
+url=_11e[0];
+var _11f=_11e[1];
+var _120=_11d||data;
+var cb=dojo.hitch(this,function(_121,_122,xhr){
+var _123=_121.match(/\<\s*body[^>]+>.*<\/body\s*>/i);
+if(_123){
+_121=_123;
+}
+var _124=dojo._toDom(_121);
+if(_11f){
+var temp=$(dojo.create("div"));
+temp.append(_124);
+_124=temp.find(_11f);
+}else{
+_124=$(_124.nodeType==11?_124.childNodes:_124);
+}
+this.html(_124);
+if(_120){
+setTimeout(dojo.hitch(this,function(){
+this.forEach(function(node){
+_120.call(node,_121,_122,xhr);
+});
+}),10);
+}
+});
+if(!_11d){
+data=cb;
+}else{
+_11d=cb;
+}
+var _125="GET";
+if(data&&dojo.isObject(data)){
+_125="POST";
+}
+$.getpost(_125,url,data,_11d,"html");
+return this;
+};
+var _126="file|submit|image|reset|button|";
+f.serialize=function(){
+var ret="";
+var strs=this.map(function(node){
+if(node.nodeName.toUpperCase()=="FORM"){
+return dojo.formToQuery(node);
+}else{
+var type=(node.type||"").toLowerCase();
+if(_126.indexOf(type)==-1){
+var val=dojo.fieldToObject(node);
+if(node.name&&val!=null){
+var q={};
+q[node.name]=val;
+return dojo.objectToQuery(q);
+}
+}
+}
+});
+return ret+strs.join("&");
+};
+$.param=function(obj){
+if(obj._is$&&obj.serialize){
+return obj.serialize();
+}else{
+if(dojo.isArray(obj)){
+return dojo.map(obj,function(item){
+return $.param(item);
+}).join("&");
+}else{
+return dojo.objectToQuery(obj);
+}
+}
+};
+$.isFunction=function(){
+var _127=dojo.isFunction.apply(dojo,arguments);
+if(_127){
+_127=(typeof (arguments[0])!="object");
+}
+return _127;
+};
+})();
+}
diff --git a/dojox/jq/README b/dojox/jq/README
new file mode 100644
index 0000000..e684f52
--- /dev/null
+++ b/dojox/jq/README
@@ -0,0 +1,103 @@
+-------------------------------------------------------------------------------
+DojoX jq
+-------------------------------------------------------------------------------
+Version 0.0.1
+Release date: 8/9/2009
+-------------------------------------------------------------------------------
+Project state:
+experimental
+-------------------------------------------------------------------------------
+Credits
+	James Burke
+-------------------------------------------------------------------------------
+Project description
+
+DojoX jq is a compatibility layer that tries to match the jquery 1.3.2 API.
+-------------------------------------------------------------------------------
+Dependencies:
+
+- Dojo Core.
+-------------------------------------------------------------------------------
+Documentation
+
+IF YOU WISH TO WORK ON THIS MODULE, PLEASE DO NOT LOOK AT THE JQUERY SOURCE.
+
+We want CLA-clean code to be put in the Dojo repos. Just refer to the jquery API
+documentation and unit tests. As we get bug reports, we can build up our own test
+suite, and then hopefully contribute those tests back to jquery if their tests
+do not adequately cover an API call.
+
+This module needs a lot of work, it is in the very initial, rough stages. Some
+(all?) of the code is ugly. It is missing some APIs, notably queue/dequeue,
+the FX methods and live/die.
+
+There are also some incompatibilities with how acme and sizzle operate at the moment,
+mentioned in the comments in jq.js
+
+The tests for this module so far have been the jquery 1.3.2 tests. Since those
+tests are not CLA-clean, you will need to download them from here:
+
+http://www.tagneto.org/dojo/jquery132.zip
+
+Place the zip file in the dojox/jq/tests directory and unzip it. Then you can
+run the jquery132/test/index.html file inside there to start the tests.
+
+The tests were changed in a couple ways. For the tests I modified,
+you can look for //JRB changed: to find the original test construction.
+Things that were changed:
+
+1) acme requires spaces between CSS3 selectors, where sizzle does
+not ("div>span" fails in acme, but works in sizzle). There is a
+dtk.org bug on it, and it is allowed by the CSS3 spec to not have
+spaces so hopefully that incompatibility can go away after a while.
+
+2) sizzle supports some psuedos like :last, :first: :odd, :even that
+work on the list of matched elements, not just individual elements or
+their children. This is a more fundamental change to acme, but it is probably
+doable.
+
+3) The XML tests and ajax tests that call out to files fail because of
+some weird timing interaction between the jquery unit test thing and
+our XHR code. I believe since our code has a timer where we check the
+status of the XHR calls instead of using load callbacks directly on
+the XHR callbacks, something is confused in jquery -- the failure case
+is fired before our callbacks work. If only they used deferreds. ;)
+To get those tests to sort of work, I modified qunit/testrunner.js's process()
+method to be like so:
+
+function process() {
+	if(config.queue.length && !config.blocking){
+		setTimeout(function(){
+		if(config.queue.length && !config.blocking){
+			config.queue.shift()();
+			process();
+		}
+		}, 100);
+	}
+}
+
+Change 100 above to tune it depending on your patience and how much
+you want to make sure the tests have enough time to run. With 100, you
+can see some of the ajax tests passing.
+
+From some previous notes (I have not checked more recently), it looks
+like the compat layer fires "ajaxStop" more than jquery, I think due
+to how we do our async in-flight testing, so that messes up some of
+the testing in the ajax calls, but I think that is a detail that is
+fine to go with. I just have to make sure that is really the cause of
+a test failure and not something else. So I will probably need to
+modify the tests more.
+
+
+-------------------------------------------------------------------------------
+Installation instructions
+
+Grab the following from the Dojo SVN Repository:
+http://svn.dojotoolkit.org/src/dojox/trunk/jq.js
+http://svn.dojotoolkit.org/src/dojox/trunk/jq/*
+
+Install into the following directory structure:
+/dojox/jq.js
+
+...which should be at the same level as your Dojo checkout.
+-------------------------------------------------------------------------------
diff --git a/dojox/json/query.js b/dojox/json/query.js
index 2a8efd3..966a4c0 100644
--- a/dojox/json/query.js
+++ b/dojox/json/query.js
@@ -9,134 +9,134 @@ if(!dojo._hasResource["dojox.json.query"]){
 dojo._hasResource["dojox.json.query"]=true;
 dojo.provide("dojox.json.query");
 (function(){
-function _1(_2,_3,_4,_5){
-var _6=_2.length,_7=[];
-_4=_4||_6;
-_3=(_3<0)?Math.max(0,_3+_6):Math.min(_6,_3);
-_4=(_4<0)?Math.max(0,_4+_6):Math.min(_6,_4);
-for(var i=_3;i<_4;i+=_5){
-_7.push(_2[i]);
-}
-return _7;
+function s(_1,_2,_3,_4){
+var _5=_1.length,_6=[];
+_3=_3||_5;
+_2=(_2<0)?Math.max(0,_2+_5):Math.min(_5,_2);
+_3=(_3<0)?Math.max(0,_3+_5):Math.min(_5,_3);
+for(var i=_2;i<_3;i+=_4){
+_6.push(_1[i]);
+}
+return _6;
 };
-function _9(_a,_b){
-var _c=[];
-function _d(_e){
-if(_b){
-if(_b===true&&!(_e instanceof Array)){
-_c.push(_e);
+function e(_7,_8){
+var _9=[];
+function _a(_b){
+if(_8){
+if(_8===true&&!(_b instanceof Array)){
+_9.push(_b);
 }else{
-if(_e[_b]){
-_c.push(_e[_b]);
+if(_b[_8]){
+_9.push(_b[_8]);
 }
 }
 }
-for(var i in _e){
-var val=_e[i];
-if(!_b){
-_c.push(val);
+for(var i in _b){
+var _c=_b[i];
+if(!_8){
+_9.push(_c);
 }else{
-if(val&&typeof val=="object"){
-_d(val);
+if(_c&&typeof _c=="object"){
+_a(_c);
 }
 }
 }
 };
-if(_b instanceof Array){
-if(_b.length==1){
-return _a[_b[0]];
+if(_8 instanceof Array){
+if(_8.length==1){
+return _7[_8[0]];
 }
-for(var i=0;i<_b.length;i++){
-_c.push(_a[_b[i]]);
+for(var i=0;i<_8.length;i++){
+_9.push(_7[_8[i]]);
 }
 }else{
-_d(_a);
+_a(_7);
 }
-return _c;
+return _9;
 };
-function _12(_13,_14){
-var _15=[];
-var _16={};
-for(var i=0,l=_13.length;i<l;++i){
-var _19=_13[i];
-if(_14(_19,i,_13)){
-if((typeof _19=="object")&&_19){
-if(!_19.__included){
-_19.__included=true;
-_15.push(_19);
+function _d(_e,_f){
+var _10=[];
+var _11={};
+for(var i=0,l=_e.length;i<l;++i){
+var _12=_e[i];
+if(_f(_12,i,_e)){
+if((typeof _12=="object")&&_12){
+if(!_12.__included){
+_12.__included=true;
+_10.push(_12);
 }
 }else{
-if(!_16[_19+typeof _19]){
-_16[_19+typeof _19]=true;
-_15.push(_19);
+if(!_11[_12+typeof _12]){
+_11[_12+typeof _12]=true;
+_10.push(_12);
 }
 }
 }
 }
-for(i=0,l=_15.length;i<l;++i){
-if(_15[i]){
-delete _15[i].__included;
+for(i=0,l=_10.length;i<l;++i){
+if(_10[i]){
+delete _10[i].__included;
 }
 }
-return _15;
+return _10;
 };
-dojox.json.query=function(_1a,obj){
-var _1c=0;
+dojox.json.query=function(_13,obj){
+var _14=0;
 var str=[];
-_1a=_1a.replace(/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'|[\[\]]/g,function(t){
-_1c+=t=="["?1:t=="]"?-1:0;
-return (t=="]"&&_1c>0)?"`]":(t.charAt(0)=="\""||t.charAt(0)=="'")?"`"+(str.push(t)-1):t;
+_13=_13.replace(/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'|[\[\]]/g,function(t){
+_14+=t=="["?1:t=="]"?-1:0;
+return (t=="]"&&_14>0)?"`]":(t.charAt(0)=="\""||t.charAt(0)=="'")?"`"+(str.push(t)-1):t;
 });
-var _1f="";
-function _20(_21){
-_1f=_21+"("+_1f;
+var _15="";
+function _16(_17){
+_15=_17+"("+_15;
 };
-function _22(t,a,b,c,d,e,f,g){
+function _18(t,a,b,c,d,e,f,g){
 return str[g].match(/[\*\?]/)||f=="~"?"/^"+str[g].substring(1,str[g].length-1).replace(/\\([btnfr\\"'])|([^\w\*\?])/g,"\\$1$2").replace(/([\*\?])/g,"[\\w\\W]$1")+(f=="~"?"$/i":"$/")+".test("+a+")":t;
 };
-_1a.replace(/(\]|\)|push|pop|shift|splice|sort|reverse)\s*\(/,function(){
+_13.replace(/(\]|\)|push|pop|shift|splice|sort|reverse)\s*\(/,function(){
 throw new Error("Unsafe function call");
 });
-_1a=_1a.replace(/([^=]=)([^=])/g,"$1=$2").replace(/@|(\.\s*)?[a-zA-Z\$_]+(\s*:)?/g,function(t){
+_13=_13.replace(/([^=]=)([^=])/g,"$1=$2").replace(/@|(\.\s*)?[a-zA-Z\$_]+(\s*:)?/g,function(t){
 return t.charAt(0)=="."?t:t=="@"?"$obj":(t.match(/:|^(\$|Math|true|false|null)$/)?"":"$obj.")+t;
 }).replace(/\.?\.?\[(`\]|[^\]])*\]|\?.*|\.\.([\w\$_]+)|\.\*/g,function(t,a,b){
-var _2f=t.match(/^\.?\.?(\[\s*\^?\?|\^?\?|\[\s*==)(.*?)\]?$/);
-if(_2f){
-var _30="";
+var _19=t.match(/^\.?\.?(\[\s*\^?\?|\^?\?|\[\s*==)(.*?)\]?$/);
+if(_19){
+var _1a="";
 if(t.match(/^\./)){
-_20("expand");
-_30=",true)";
+_16("e");
+_1a=",true)";
 }
-_20(_2f[1].match(/\=/)?"dojo.map":_2f[1].match(/\^/)?"distinctFilter":"dojo.filter");
-return _30+",function($obj){return "+_2f[2]+"})";
+_16(_19[1].match(/\=/)?"dojo.map":_19[1].match(/\^/)?"distinctFilter":"dojo.filter");
+return _1a+",function($obj){return "+_19[2]+"})";
 }
-_2f=t.match(/^\[\s*([\/\\].*)\]/);
-if(_2f){
-return ".concat().sort(function(a,b){"+_2f[1].replace(/\s*,?\s*([\/\\])\s*([^,\\\/]+)/g,function(t,a,b){
+_19=t.match(/^\[\s*([\/\\].*)\]/);
+if(_19){
+return ".concat().sort(function(a,b){"+_19[1].replace(/\s*,?\s*([\/\\])\s*([^,\\\/]+)/g,function(t,a,b){
 return "var av= "+b.replace(/\$obj/,"a")+",bv= "+b.replace(/\$obj/,"b")+";if(av>bv||bv==null){return "+(a=="/"?1:-1)+";}\n"+"if(bv>av||av==null){return "+(a=="/"?-1:1)+";}\n";
 })+"return 0;})";
 }
-_2f=t.match(/^\[(-?[0-9]*):(-?[0-9]*):?(-?[0-9]*)\]/);
-if(_2f){
-_20("slice");
-return ","+(_2f[1]||0)+","+(_2f[2]||0)+","+(_2f[3]||1)+")";
+_19=t.match(/^\[(-?[0-9]*):(-?[0-9]*):?(-?[0-9]*)\]/);
+if(_19){
+_16("s");
+return ","+(_19[1]||0)+","+(_19[2]||0)+","+(_19[3]||1)+")";
 }
 if(t.match(/^\.\.|\.\*|\[\s*\*\s*\]|,/)){
-_20("expand");
+_16("e");
 return (t.charAt(1)=="."?",'"+b+"'":t.match(/,/)?","+t:"")+")";
 }
 return t;
-}).replace(/(\$obj\s*((\.\s*[\w_$]+\s*)|(\[\s*`([0-9]+)\s*`\]))*)(==|~)\s*`([0-9]+)/g,_22).replace(/`([0-9]+)\s*(==|~)\s*(\$obj\s*((\.\s*[\w_$]+)|(\[\s*`([0-9]+)\s*`\]))*)/g,function(t,a,b,c,d,e,f,g){
-return _22(t,c,d,e,f,g,b,a);
+}).replace(/(\$obj\s*((\.\s*[\w_$]+\s*)|(\[\s*`([0-9]+)\s*`\]))*)(==|~)\s*`([0-9]+)/g,_18).replace(/`([0-9]+)\s*(==|~)\s*(\$obj\s*((\.\s*[\w_$]+)|(\[\s*`([0-9]+)\s*`\]))*)/g,function(t,a,b,c,d,e,f,g){
+return _18(t,c,d,e,f,g,b,a);
 });
-_1a=_1f+(_1a.charAt(0)=="$"?"":"$")+_1a.replace(/`([0-9]+|\])/g,function(t,a){
+_13=_15+(_13.charAt(0)=="$"?"":"$")+_13.replace(/`([0-9]+|\])/g,function(t,a){
 return a=="]"?"]":str[a];
 });
-var _3e=eval("1&&function($,$1,$2,$3,$4,$5,$6,$7,$8,$9){var $obj=$;return "+_1a+"}");
+var _1b=eval("1&&function($,$1,$2,$3,$4,$5,$6,$7,$8,$9){var $obj=$;return "+_13+"}");
 for(var i=0;i<arguments.length-1;i++){
 arguments[i]=arguments[i+1];
 }
-return obj?_3e.apply(this,arguments):_3e;
+return obj?_1b.apply(this,arguments):_1b;
 };
 })();
 }
diff --git a/dojox/json/ref.js b/dojox/json/ref.js
index 0766fc4..2a2d5d9 100644
--- a/dojox/json/ref.js
+++ b/dojox/json/ref.js
@@ -12,207 +12,223 @@ dojo.require("dojo.date.stamp");
 dojox.json.ref={resolveJson:function(_1,_2){
 _2=_2||{};
 var _3=_2.idAttribute||"id";
-var _4=_2.idPrefix||"";
-var _5=_2.assignAbsoluteIds;
-var _6=_2.index||{};
-var _7=_2.timeStamps;
-var _8,_9=[];
-var _a=/^(.*\/)?(\w+:\/\/)|[^\/\.]+\/\.\.\/|^.*\/(\/)/;
-var _b=this._addProp;
+var _4=this.refAttribute;
+var _5=_2.idAsRef;
+var _6=_2.idPrefix||"";
+var _7=_2.assignAbsoluteIds;
+var _8=_2.index||{};
+var _9=_2.timeStamps;
+var _a,_b=[];
+var _c=/^(.*\/)?(\w+:\/\/)|[^\/\.]+\/\.\.\/|^.*\/(\/)/;
+var _d=this._addProp;
 var F=function(){
 };
-function _d(it,_f,_10,_11,_12){
-var _13,val,id=_3 in it?it[_3]:_10;
-if(id!==undefined){
-id=(_4+id).replace(_a,"$2$3");
+function _e(it,_f,_10,_11,_12,_13){
+var i,_14,val,id=_3 in it?it[_3]:_10;
+if(_3 in it||((id!==undefined)&&_11)){
+id=(_6+id).replace(_c,"$2$3");
 }
-var _16=_12||it;
+var _15=_13||it;
 if(id!==undefined){
-if(_5){
+if(_7){
 it.__id=id;
 }
 if(_2.schemas&&(!(it instanceof Array))&&(val=id.match(/^(.+\/)[^\.\[]*$/))){
-_11=_2.schemas[val[1]];
+_12=_2.schemas[val[1]];
 }
-if(_6[id]&&((it instanceof Array)==(_6[id] instanceof Array))){
-_16=_6[id];
-delete _16.$ref;
-_13=true;
+if(_8[id]&&((it instanceof Array)==(_8[id] instanceof Array))){
+_15=_8[id];
+delete _15.$ref;
+delete _15._loadObject;
+_14=true;
 }else{
-var _17=_11&&_11.prototype;
+var _16=_12&&_12.prototype;
+if(_16){
+F.prototype=_16;
+_15=new F();
+}
+}
+_8[id]=_15;
+if(_9){
+_9[id]=_2.time;
+}
+}
+while(_12){
+var _17=_12.properties;
 if(_17){
-F.prototype=_17;
-_16=new F();
+for(i in it){
+var _18=_17[i];
+if(_18&&_18.format=="date-time"&&typeof it[i]=="string"){
+it[i]=dojo.date.stamp.fromISOString(it[i]);
 }
 }
-_6[id]=_16;
-if(_7){
-_7[id]=_2.time;
 }
+_12=_12["extends"];
 }
-var _18=_11&&_11.properties;
 var _19=it.length;
-for(var i in it){
+for(i in it){
 if(i==_19){
 break;
 }
 if(it.hasOwnProperty(i)){
 val=it[i];
-var _1b=_18&&_18[i];
-if(_1b&&_1b.format=="date-time"&&typeof val=="string"){
-val=dojo.date.stamp.fromISOString(val);
-}else{
-if((typeof val=="object")&&val&&!(val instanceof Date)){
-_8=val.$ref;
-if(_8){
+if((typeof val=="object")&&val&&!(val instanceof Date)&&i!="__parent"){
+_a=val[_4]||(_5&&val[_3]);
+if(!_a||!val.__parent){
+val.__parent=it;
+}
+if(_a){
 delete it[i];
-var _1c=_8.replace(/(#)([^\.\[])/,"$1.$2").match(/(^([^\[]*\/)?[^#\.\[]*)#?([\.\[].*)?/);
-if((_8=(_1c[1]=="$"||_1c[1]=="this"||_1c[1]=="")?_1:_6[(_4+_1c[1]).replace(_a,"$2$3")])){
-if(_1c[3]){
-_1c[3].replace(/(\[([^\]]+)\])|(\.?([^\.\[]+))/g,function(t,a,b,c,d){
-_8=_8&&_8[b?b.replace(/[\"\'\\]/,""):d];
+var _1a=_a.toString().replace(/(#)([^\.\[])/,"$1.$2").match(/(^([^\[]*\/)?[^#\.\[]*)#?([\.\[].*)?/);
+if((_a=(_1a[1]=="$"||_1a[1]=="this"||_1a[1]=="")?_1:_8[(_6+_1a[1]).replace(_c,"$2$3")])){
+if(_1a[3]){
+_1a[3].replace(/(\[([^\]]+)\])|(\.?([^\.\[]+))/g,function(t,a,b,c,d){
+_a=_a&&_a[b?b.replace(/[\"\'\\]/,""):d];
 });
 }
 }
-if(_8){
-val=_8;
+if(_a){
+val=_a;
 }else{
 if(!_f){
-var _22;
-if(!_22){
-_9.push(_16);
+var _1b;
+if(!_1b){
+_b.push(_15);
 }
-_22=true;
-}else{
-val=_d(val,false,val.$ref,_1b);
+_1b=true;
+val=_e(val,false,val[_4],true,_18);
 val._loadObject=_2.loader;
 }
 }
 }else{
 if(!_f){
-val=_d(val,_9==it,id&&_b(id,i),_1b,_16!=it&&typeof _16[i]=="object"&&_16[i]);
-}
+val=_e(val,_b==it,id===undefined?undefined:_d(id,i),false,_18,_15!=it&&typeof _15[i]=="object"&&_15[i]);
 }
 }
 }
 it[i]=val;
-if(_16!=it&&!_16.__isDirty){
-var old=_16[i];
-_16[i]=val;
-if(_13&&val!==old&&!_16._loadObject&&!(val instanceof Date&&old instanceof Date&&val.getTime()==old.getTime())&&!(typeof val=="function"&&typeof old=="function"&&val.toString()==old.toString())&&_6.onUpdate){
-_6.onUpdate(_16,i,old,val);
+if(_15!=it&&!_15.__isDirty){
+var old=_15[i];
+_15[i]=val;
+if(_14&&val!==old&&!_15._loadObject&&!(i.charAt(0)=="_"&&i.charAt(1)=="_")&&i!="$ref"&&!(val instanceof Date&&old instanceof Date&&val.getTime()==old.getTime())&&!(typeof val=="function"&&typeof old=="function"&&val.toString()==old.toString())&&_8.onUpdate){
+_8.onUpdate(_15,i,old,val);
 }
 }
 }
 }
-if(_13){
-for(i in _16){
-if(!_16.__isDirty&&_16.hasOwnProperty(i)&&!it.hasOwnProperty(i)&&i!="__id"&&i!="__clientId"&&!(_16 instanceof Array&&isNaN(i))){
-if(_6.onUpdate&&i!="_loadObject"&&i!="_idAttr"){
-_6.onUpdate(_16,i,_16[i],undefined);
+if(_14&&(_3 in it)){
+for(i in _15){
+if(!_15.__isDirty&&_15.hasOwnProperty(i)&&!it.hasOwnProperty(i)&&!(i.charAt(0)=="_"&&i.charAt(1)=="_")&&!(_15 instanceof Array&&isNaN(i))){
+if(_8.onUpdate&&i!="_loadObject"&&i!="_idAttr"){
+_8.onUpdate(_15,i,_15[i],undefined);
 }
-delete _16[i];
-while(_16 instanceof Array&&_16.length&&_16[_16.length-1]===undefined){
-_16.length--;
+delete _15[i];
+while(_15 instanceof Array&&_15.length&&_15[_15.length-1]===undefined){
+_15.length--;
 }
 }
 }
 }else{
-if(_6.onLoad){
-_6.onLoad(_16);
+if(_8.onLoad){
+_8.onLoad(_15);
 }
 }
-return _16;
+return _15;
 };
 if(_1&&typeof _1=="object"){
-_1=_d(_1,false,_2.defaultId);
-_d(_9,false);
+_1=_e(_1,false,_2.defaultId,true);
+_e(_b,false);
 }
 return _1;
-},fromJson:function(str,_25){
-function ref(_27){
-return {$ref:_27};
+},fromJson:function(str,_1c){
+function ref(_1d){
+var _1e={};
+_1e[this.refAttribute]=_1d;
+return _1e;
 };
 try{
-var _28=eval("("+str+")");
+var _1f=eval("("+str+")");
 }
 catch(e){
 throw new SyntaxError("Invalid JSON string: "+e.message+" parsing: "+str);
 }
-if(_28){
-return this.resolveJson(_28,_25);
-}
-return _28;
-},toJson:function(it,_2a,_2b,_2c){
-var _2d=this._useRefs;
-var _2e=this._addProp;
-_2b=_2b||"";
-var _2f={};
-var _30={};
-function _31(it,_33,_34){
+if(_1f){
+return this.resolveJson(_1f,_1c);
+}
+return _1f;
+},toJson:function(it,_20,_21,_22){
+var _23=this._useRefs;
+var _24=this._addProp;
+var _25=this.refAttribute;
+_21=_21||"";
+var _26={};
+var _27={};
+function _28(it,_29,_2a){
 if(typeof it=="object"&&it){
-var _35;
+var _2b;
 if(it instanceof Date){
 return "\""+dojo.date.stamp.toISOString(it,{zulu:true})+"\"";
 }
 var id=it.__id;
 if(id){
-if(_33!="#"&&((_2d&&!id.match(/#/))||_2f[id])){
+if(_29!="#"&&((_23&&!id.match(/#/))||_26[id])){
 var ref=id;
 if(id.charAt(0)!="#"){
 if(it.__clientId==id){
 ref="cid:"+id;
 }else{
-if(id.substring(0,_2b.length)==_2b){
-ref=id.substring(_2b.length);
+if(id.substring(0,_21.length)==_21){
+ref=id.substring(_21.length);
 }else{
 ref=id;
 }
 }
 }
-return _31({$ref:ref},"#");
+var _2c={};
+_2c[_25]=ref;
+return _28(_2c,"#");
 }
-_33=id;
+_29=id;
 }else{
-it.__id=_33;
-_30[_33]=it;
-}
-_2f[_33]=it;
-_34=_34||"";
-var _38=_2a?_34+dojo.toJsonIndentStr:"";
-var _39=_2a?"\n":"";
-var sep=_2a?" ":"";
+it.__id=_29;
+_27[_29]=it;
+}
+_26[_29]=it;
+_2a=_2a||"";
+var _2d=_20?_2a+dojo.toJsonIndentStr:"";
+var _2e=_20?"\n":"";
+var sep=_20?" ":"";
 if(it instanceof Array){
 var res=dojo.map(it,function(obj,i){
-var val=_31(obj,_2e(_33,i),_38);
+var val=_28(obj,_24(_29,i),_2d);
 if(typeof val!="string"){
 val="undefined";
 }
-return _39+_38+val;
+return _2e+_2d+val;
 });
-return "["+res.join(","+sep)+_39+_34+"]";
+return "["+res.join(","+sep)+_2e+_2a+"]";
 }
-var _3f=[];
+var _2f=[];
 for(var i in it){
 if(it.hasOwnProperty(i)){
-var _41;
+var _30;
 if(typeof i=="number"){
-_41="\""+i+"\"";
+_30="\""+i+"\"";
 }else{
 if(typeof i=="string"&&(i.charAt(0)!="_"||i.charAt(1)!="_")){
-_41=dojo._escapeString(i);
+_30=dojo._escapeString(i);
 }else{
 continue;
 }
 }
-var val=_31(it[i],_2e(_33,i),_38);
+var val=_28(it[i],_24(_29,i),_2d);
 if(typeof val!="string"){
 continue;
 }
-_3f.push(_39+_38+_41+":"+sep+val);
+_2f.push(_2e+_2d+_30+":"+sep+val);
 }
 }
-return "{"+_3f.join(","+sep)+_39+_34+"}";
+return "{"+_2f.join(","+sep)+_2e+_2a+"}";
 }else{
 if(typeof it=="function"&&dojox.json.ref.serializeFunctions){
 return it.toString();
@@ -220,14 +236,14 @@ return it.toString();
 }
 return dojo.toJson(it);
 };
-var _43=_31(it,"#","");
-if(!_2c){
-for(var i in _30){
-delete _30[i].__id;
+var _31=_28(it,"#","");
+if(!_22){
+for(var i in _27){
+delete _27[i].__id;
 }
 }
-return _43;
-},_addProp:function(id,_46){
-return id+(id.match(/#/)?id.length==1?"":".":"#")+_46;
-},_useRefs:false,serializeFunctions:false};
+return _31;
+},_addProp:function(id,_32){
+return id+(id.match(/#/)?id.length==1?"":".":"#")+_32;
+},refAttribute:"$ref",_useRefs:false,serializeFunctions:false};
 }
diff --git a/dojox/json/schema.js b/dojox/json/schema.js
index 0a797d7..9a94f79 100644
--- a/dojox/json/schema.js
+++ b/dojox/json/schema.js
@@ -11,45 +11,46 @@ dojo.provide("dojox.json.schema");
 dojox.json.schema.validate=function(_1,_2){
 return this._validate(_1,_2,false);
 };
-dojox.json.schema.checkPropertyChange=function(_3,_4){
-return this._validate(_3,_4,true);
+dojox.json.schema.checkPropertyChange=function(_3,_4,_5){
+return this._validate(_3,_4,_5||"property");
 };
-dojox.json.schema.mustBeValid=function(_5){
-if(!_5.valid){
-throw new Error(dojo.map(_5.errors,function(_6){
-return _6.property+" "+_6.message;
-}).join(","));
+dojox.json.schema.mustBeValid=function(_6){
+if(!_6.valid){
+throw new TypeError(dojo.map(_6.errors,function(_7){
+return "for property "+_7.property+": "+_7.message;
+}).join(", "));
 }
 };
-dojox.json.schema._validate=function(_7,_8,_9){
-var _a=[];
-function _b(_c,_d,_e,i){
-if(typeof _d!="object"){
-return null;
-}
-_e+=_e?typeof i=="number"?"["+i+"]":typeof i=="undefined"?"":"."+i:i;
+dojox.json.schema._validate=function(_8,_9,_a){
+var _b=[];
+function _c(_d,_e,_f,i){
+var l;
+_f+=_f?typeof i=="number"?"["+i+"]":typeof i=="undefined"?"":"."+i:i;
 function _10(_11){
-_a.push({property:_e,message:_11});
+_b.push({property:_f,message:_11});
 };
-if(_9&&_d.readonly){
-_10("is a readonly field, it can not be changed");
+if((typeof _e!="object"||_e instanceof Array)&&(_f||typeof _e!="function")){
+if(typeof _e=="function"){
+if(!(Object(_d) instanceof _e)){
+_10("is not an instance of the class/constructor "+_e.name);
+}
+}else{
+if(_e){
+_10("Invalid schema/property definition "+_e);
 }
-if(_d instanceof Array){
-if(!(_c instanceof Array)){
-return [{property:_e,message:"An array tuple is required"}];
 }
-for(i=0;i<_d.length;i++){
-_a.concat(_b(_c[i],_d[i],_e,i));
+return null;
 }
-return _a;
+if(_a&&_e.readonly){
+_10("is a readonly field, it can not be changed");
 }
-if(_d["extends"]){
-_b(_c,_d["extends"],_e,i);
+if(_e["extends"]){
+_c(_d,_e["extends"],_f,i);
 }
 function _12(_13,_14){
 if(_13){
 if(typeof _13=="string"&&_13!="any"&&(_13=="null"?_14!==null:typeof _14!=_13)&&!(_14 instanceof Array&&_13=="array")&&!(_13=="integer"&&_14%1===0)){
-return [{property:_e,message:(typeof _14)+" value found, but a "+_13+" is required"}];
+return [{property:_f,message:(typeof _14)+" value found, but a "+_13+" is required"}];
 }
 if(_13 instanceof Array){
 var _15=[];
@@ -63,112 +64,123 @@ return _15;
 }
 }else{
 if(typeof _13=="object"){
-_b(_14,_13,_e);
+var _16=_b;
+_b=[];
+_c(_14,_13,_f);
+var _17=_b;
+_b=_16;
+return _17;
 }
 }
 }
 return [];
 };
-if(_c!==null){
-if(_c===undefined){
-if(!_d.optional){
+if(_d===undefined){
+if(!_e.optional){
 _10("is missing and it is not optional");
 }
 }else{
-_a=_a.concat(_12(_d.type,_c));
-if(_d.disallow&&!_12(_d.disallow,_c).length){
+_b=_b.concat(_12(_e.type,_d));
+if(_e.disallow&&!_12(_e.disallow,_d).length){
 _10(" disallowed value was matched");
 }
-if(_c instanceof Array){
-if(_d.items){
-for(i=0,l=_c.length;i<l;i++){
-_a.concat(_b(_c[i],_d.items,_e,i));
+if(_d!==null){
+if(_d instanceof Array){
+if(_e.items){
+if(_e.items instanceof Array){
+for(i=0,l=_d.length;i<l;i++){
+_b.concat(_c(_d[i],_e.items[i],_f,i));
+}
+}else{
+for(i=0,l=_d.length;i<l;i++){
+_b.concat(_c(_d[i],_e.items,_f,i));
+}
 }
 }
-if(_d.minItems&&_c.length<_d.minItems){
-_10("There must be a minimum of "+_d.minItems+" in the array");
+if(_e.minItems&&_d.length<_e.minItems){
+_10("There must be a minimum of "+_e.minItems+" in the array");
 }
-if(_d.maxItems&&_c.length>_d.maxItems){
-_10("There must be a maximum of "+_d.maxItems+" in the array");
+if(_e.maxItems&&_d.length>_e.maxItems){
+_10("There must be a maximum of "+_e.maxItems+" in the array");
 }
 }else{
-if(_d.properties&&typeof _c=="object"){
-_a.concat(_17(_c,_d.properties,_e,_d.additionalProperties));
+if(_e.properties){
+_b.concat(_18(_d,_e.properties,_f,_e.additionalProperties));
 }
 }
-if(_d.pattern&&typeof _c=="string"&&!_c.match(_d.pattern)){
-_10("does not match the regex pattern "+_d.pattern);
+if(_e.pattern&&typeof _d=="string"&&!_d.match(_e.pattern)){
+_10("does not match the regex pattern "+_e.pattern);
 }
-if(_d.maxLength&&typeof _c=="string"&&_c.length>_d.maxLength){
-_10("may only be "+_d.maxLength+" characters long");
+if(_e.maxLength&&typeof _d=="string"&&_d.length>_e.maxLength){
+_10("may only be "+_e.maxLength+" characters long");
 }
-if(_d.minLength&&typeof _c=="string"&&_c.length<_d.minLength){
-_10("must be at least "+_d.minLength+" characters long");
+if(_e.minLength&&typeof _d=="string"&&_d.length<_e.minLength){
+_10("must be at least "+_e.minLength+" characters long");
 }
-if(typeof _d.minimum!==undefined&&typeof _c==typeof _d.minimum&&_d.minimum>_c){
-_10("must have a minimum value of "+_d.minimum);
+if(typeof _e.minimum!==undefined&&typeof _d==typeof _e.minimum&&_e.minimum>_d){
+_10("must have a minimum value of "+_e.minimum);
 }
-if(typeof _d.maximum!==undefined&&typeof _c==typeof _d.maximum&&_d.maximum<_c){
-_10("must have a maximum value of "+_d.maximum);
+if(typeof _e.maximum!==undefined&&typeof _d==typeof _e.maximum&&_e.maximum<_d){
+_10("must have a maximum value of "+_e.maximum);
 }
-if(_d["enum"]){
-var _18=_d["enum"];
-l=_18.length;
-var _19;
+if(_e["enum"]){
+var _19=_e["enum"];
+l=_19.length;
+var _1a;
 for(var j=0;j<l;j++){
-if(_18[j]===_c){
-_19=1;
+if(_19[j]===_d){
+_1a=1;
 break;
 }
 }
-if(!_19){
-_10("does not have a value in the enumeration "+_18.join(", "));
+if(!_1a){
+_10("does not have a value in the enumeration "+_19.join(", "));
 }
 }
-if(typeof _d.maxDecimal=="number"&&(_c*10^_d.maxDecimal)%1){
-_10("may only have "+_d.maxDecimal+" digits of decimal places");
+if(typeof _e.maxDecimal=="number"&&(_d.toString().match(new RegExp("\\.[0-9]{"+(_e.maxDecimal+1)+",}")))){
+_10("may only have "+_e.maxDecimal+" digits of decimal places");
 }
 }
 }
 return null;
 };
-function _17(_1b,_1c,_1d,_1e){
+function _18(_1b,_1c,_1d,_1e){
 if(typeof _1c=="object"){
 if(typeof _1b!="object"||_1b instanceof Array){
-_a.push({property:_1d,message:"an object is required"});
+_b.push({property:_1d,message:"an object is required"});
 }
 for(var i in _1c){
-if(_1c.hasOwnProperty(i)){
-var _20=_1b[i];
-var _21=_1c[i];
-_b(_20,_21,_1d,i);
+if(_1c.hasOwnProperty(i)&&!(i.charAt(0)=="_"&&i.charAt(1)=="_")){
+var _1f=_1b[i];
+var _20=_1c[i];
+_c(_1f,_20,_1d,i);
 }
 }
 }
 for(i in _1b){
-if(_1b.hasOwnProperty(i)&&(i.charAt(0)!="_"||i.charAt(0)!="_")&&_1c&&!_1c[i]&&_1e===false){
-_a.push({property:_1d,message:(typeof _20)+"The property "+i+" is not defined in the schema and the schema does not allow additional properties"});
+if(_1b.hasOwnProperty(i)&&!(i.charAt(0)=="_"&&i.charAt(1)=="_")&&_1c&&!_1c[i]&&_1e===false){
+_b.push({property:_1d,message:(typeof _1f)+"The property "+i+" is not defined in the schema and the schema does not allow additional properties"});
 }
-var _22=_1c&&_1c[i]&&_1c[i].requires;
-if(_22&&!(_22 in _1b)){
-_a.push({property:_1d,message:"the presence of the property "+i+" requires that "+_22+" also be present"});
+var _21=_1c&&_1c[i]&&_1c[i].requires;
+if(_21&&!(_21 in _1b)){
+_b.push({property:_1d,message:"the presence of the property "+i+" requires that "+_21+" also be present"});
 }
-_20=_1b[i];
+_1f=_1b[i];
 if(_1c&&typeof _1c=="object"&&!(i in _1c)){
-_b(_20,_1e,_1d,i);
+_c(_1f,_1e,_1d,i);
 }
-if(!_9&&_20&&_20.$schema){
-_a=_a.concat(_b(_20,_20.$schema,_1d,i));
+if(!_a&&_1f&&_1f.$schema){
+_b=_b.concat(_c(_1f,_1f.$schema,_1d,i));
 }
 }
-return _a;
+return _b;
 };
-if(_8){
-_b(_7,_8,"","");
+if(_9){
+_c(_8,_9,"",_a||"");
 }
-if(!_9&&_7.$schema){
-_b(_7,_7.$schema,"","");
+if(!_a&&_8&&_8.$schema){
+_c(_8,_8.$schema,"","");
 }
-return {valid:!_a.length,errors:_a};
+return {valid:!_b.length,errors:_b};
 };
 }
diff --git a/dojox/jsonPath/query.js b/dojox/jsonPath/query.js
index 1e68046..4b7a5fa 100644
--- a/dojox/jsonPath/query.js
+++ b/dojox/jsonPath/query.js
@@ -13,130 +13,130 @@ var re=dojox.jsonPath._regularExpressions;
 if(!_3){
 _3={};
 }
-var _5=[];
-function _6(i){
-return _5[i];
+var _4=[];
+function _5(i){
+return _4[i];
 };
-var _8;
+var _6;
 if(_3.resultType=="PATH"&&_3.evalType=="RESULT"){
 throw Error("RESULT based evaluation not supported with PATH based results");
 }
-var P={resultType:_3.resultType||"VALUE",normalize:function(_a){
-var _b=[];
-_a=_a.replace(/'([^']|'')*'/g,function(t){
-return "_str("+(_5.push(eval(t))-1)+")";
+var P={resultType:_3.resultType||"VALUE",normalize:function(_7){
+var _8=[];
+_7=_7.replace(/'([^']|'')*'/g,function(t){
+return "_str("+(_4.push(eval(t))-1)+")";
 });
 var ll=-1;
-while(ll!=_b.length){
-ll=_b.length;
-_a=_a.replace(/(\??\([^\(\)]*\))/g,function($0){
-return "#"+(_b.push($0)-1);
+while(ll!=_8.length){
+ll=_8.length;
+_7=_7.replace(/(\??\([^\(\)]*\))/g,function($0){
+return "#"+(_8.push($0)-1);
 });
 }
-_a=_a.replace(/[\['](#[0-9]+)[\]']/g,"[$1]").replace(/'?\.'?|\['?/g,";").replace(/;;;|;;/g,";..;").replace(/;$|'?\]|'$/g,"");
+_7=_7.replace(/[\['](#[0-9]+)[\]']/g,"[$1]").replace(/'?\.'?|\['?/g,";").replace(/;;;|;;/g,";..;").replace(/;$|'?\]|'$/g,"");
 ll=-1;
-while(ll!=_a){
-ll=_a;
-_a=_a.replace(/#([0-9]+)/g,function($0,$1){
-return _b[$1];
+while(ll!=_7){
+ll=_7;
+_7=_7.replace(/#([0-9]+)/g,function($0,$1){
+return _8[$1];
 });
 }
-return _a.split(";");
-},asPaths:function(_11){
-for(var j=0;j<_11.length;j++){
+return _7.split(";");
+},asPaths:function(_9){
+for(var j=0;j<_9.length;j++){
 var p="$";
-var x=_11[j];
+var x=_9[j];
 for(var i=1,n=x.length;i<n;i++){
 p+=/^[0-9*]+$/.test(x[i])?("["+x[i]+"]"):("['"+x[i]+"']");
 }
-_11[j]=p;
+_9[j]=p;
 }
-return _11;
-},exec:function(_17,val,rb){
-var _1a=["$"];
-var _1b=rb?val:[val];
-var _1c=[_1a];
-function add(v,p,def){
+return _9;
+},exec:function(_a,_b,rb){
+var _c=["$"];
+var _d=rb?_b:[_b];
+var _e=[_c];
+function _f(v,p,def){
 if(v&&v.hasOwnProperty(p)&&P.resultType!="VALUE"){
-_1c.push(_1a.concat([p]));
+_e.push(_c.concat([p]));
 }
 if(def){
-_1b=v[p];
+_d=v[p];
 }else{
 if(v&&v.hasOwnProperty(p)){
-_1b.push(v[p]);
+_d.push(v[p]);
 }
 }
 };
-function _21(v){
-_1b.push(v);
-_1c.push(_1a);
+function _10(v){
+_d.push(v);
+_e.push(_c);
 P.walk(v,function(i){
 if(typeof v[i]==="object"){
-var _24=_1a;
-_1a=_1a.concat(i);
-_21(v[i]);
-_1a=_24;
+var _11=_c;
+_c=_c.concat(i);
+_10(v[i]);
+_c=_11;
 }
 });
 };
-function _25(loc,val){
+function _12(loc,val){
 if(val instanceof Array){
-var len=val.length,_29=0,end=len,_2b=1;
+var len=val.length,_13=0,end=len,_14=1;
 loc.replace(/^(-?[0-9]*):(-?[0-9]*):?(-?[0-9]*)$/g,function($0,$1,$2,$3){
-_29=parseInt($1||_29);
+_13=parseInt($1||_13);
 end=parseInt($2||end);
-_2b=parseInt($3||_2b);
+_14=parseInt($3||_14);
 });
-_29=(_29<0)?Math.max(0,_29+len):Math.min(len,_29);
+_13=(_13<0)?Math.max(0,_13+len):Math.min(len,_13);
 end=(end<0)?Math.max(0,end+len):Math.min(len,end);
-for(var i=_29;i<end;i+=_2b){
-add(val,i);
+for(var i=_13;i<end;i+=_14){
+_f(val,i);
 }
 }
 };
-function _31(str){
+function _15(str){
 var i=loc.match(/^_str\(([0-9]+)\)$/);
-return i?_5[i[1]]:str;
+return i?_4[i[1]]:str;
 };
-function _35(val){
+function _16(val){
 if(/^\(.*?\)$/.test(loc)){
-add(val,P.eval(loc,val),rb);
+_f(val,P.eval(loc,val),rb);
 }else{
 if(loc==="*"){
 P.walk(val,rb&&val instanceof Array?function(i){
 P.walk(val[i],function(j){
-add(val[i],j);
+_f(val[i],j);
 });
 }:function(i){
-add(val,i);
+_f(val,i);
 });
 }else{
 if(loc===".."){
-_21(val);
+_10(val);
 }else{
 if(/,/.test(loc)){
 for(var s=loc.split(/'?,'?/),i=0,n=s.length;i<n;i++){
-add(val,_31(s[i]));
+_f(val,_15(s[i]));
 }
 }else{
 if(/^\?\(.*?\)$/.test(loc)){
 P.walk(val,function(i){
 if(P.eval(loc.replace(/^\?\((.*?)\)$/,"$1"),val[i])){
-add(val,i);
+_f(val,i);
 }
 });
 }else{
 if(/^(-?[0-9]*):(-?[0-9]*):?([0-9]*)$/.test(loc)){
-_25(loc,val);
+_12(loc,val);
 }else{
-loc=_31(loc);
+loc=_15(loc);
 if(rb&&val instanceof Array&&!/^[0-9*]+$/.test(loc)){
 P.walk(val,function(i){
-add(val[i],loc);
+_f(val[i],loc);
 });
 }else{
-add(val,loc,rb);
+_f(val,loc,rb);
 }
 }
 }
@@ -145,32 +145,32 @@ add(val,loc,rb);
 }
 }
 };
-while(_17.length){
-var loc=_17.shift();
-if((val=_1b)===null||val===undefined){
-return val;
-}
-_1b=[];
-var _3f=_1c;
-_1c=[];
+while(_a.length){
+var loc=_a.shift();
+if((_b=_d)===null||_b===undefined){
+return _b;
+}
+_d=[];
+var _17=_e;
+_e=[];
 if(rb){
-_35(val);
+_16(_b);
 }else{
-P.walk(val,function(i){
-_1a=_3f[i]||_1a;
-_35(val[i]);
+P.walk(_b,function(i){
+_c=_17[i]||_c;
+_16(_b[i]);
 });
 }
 }
 if(P.resultType=="BOTH"){
-_1c=P.asPaths(_1c);
-var _41=[];
-for(var i=0;i<_1c.length;i++){
-_41.push({path:_1c[i],value:_1b[i]});
+_e=P.asPaths(_e);
+var _18=[];
+for(var i=0;i<_e.length;i++){
+_18.push({path:_e[i],value:_d[i]});
 }
-return _41;
+return _18;
 }
-return P.resultType=="PATH"?P.asPaths(_1c):_1b;
+return P.resultType=="PATH"?P.asPaths(_e):_d;
 },walk:function(val,f){
 if(val instanceof Array){
 for(var i=0,n=val.length;i<n;i++){
@@ -187,9 +187,9 @@ f(m);
 }
 }
 }
-},eval:function(x,_v){
+},eval:function(x,_19){
 try{
-return $&&_v&&eval(x.replace(/@/g,"_v"));
+return $&&_19&&eval(x.replace(/@/g,"_v"));
 }
 catch(e){
 throw new SyntaxError("jsonPath: "+e.message+": "+x.replace(/@/g,"_v").replace(/\^/g,"_a"));
diff --git a/dojox/lang/README b/dojox/lang/README
index 8a08bbb..a52cd4d 100644
--- a/dojox/lang/README
+++ b/dojox/lang/README
@@ -19,6 +19,16 @@ helpers. Later we can add other JS language-related helpers.
 dojox.lang.observable - Provides construction of objects that such that 
 property access and modification can be controlled, i.e. provides a form of
 getters/setters.
+
+dojox.lang.typed - Provides type checking for JavaScript classes, enforcing 
+types on properties and method parameters using JSON Schema definitions.
+
+dojox.lang.docs - Provides schemas on Dojo's classes from the API 
+documentation. This can used for runtime access to class metadata information
+such as descriptions and type information. This can be used in conjunction with
+dojox.lang.typed to enforce typing on Dojo's classes using the API information.
+
+
 -------------------------------------------------------------------------------
 Dependencies:
 
diff --git a/dojox/lang/aspect.js b/dojox/lang/aspect.js
index 57f853c..4c3f601 100644
--- a/dojox/lang/aspect.js
+++ b/dojox/lang/aspect.js
@@ -9,52 +9,52 @@ if(!dojo._hasResource["dojox.lang.aspect"]){
 dojo._hasResource["dojox.lang.aspect"]=true;
 dojo.provide("dojox.lang.aspect");
 (function(){
-var d=dojo,_2=dojox.lang.aspect,ap=Array.prototype,_4=[],_5;
-var _6=function(){
+var d=dojo,_1=dojox.lang.aspect,ap=Array.prototype,_2=[],_3;
+var _4=function(){
 this.next_before=this.prev_before=this.next_around=this.prev_around=this.next_afterReturning=this.prev_afterReturning=this.next_afterThrowing=this.prev_afterThrowing=this;
 this.counter=0;
 };
-d.extend(_6,{add:function(_7){
-var _8=d.isFunction(_7),_9={advice:_7,dynamic:_8};
-this._add(_9,"before","",_8,_7);
-this._add(_9,"around","",_8,_7);
-this._add(_9,"after","Returning",_8,_7);
-this._add(_9,"after","Throwing",_8,_7);
+d.extend(_4,{add:function(_5){
+var _6=d.isFunction(_5),_7={advice:_5,dynamic:_6};
+this._add(_7,"before","",_6,_5);
+this._add(_7,"around","",_6,_5);
+this._add(_7,"after","Returning",_6,_5);
+this._add(_7,"after","Throwing",_6,_5);
 ++this.counter;
-return _9;
-},_add:function(_a,_b,_c,_d,_e){
-var _f=_b+_c;
-if(_d||_e[_b]||(_c&&_e[_f])){
-var _10="next_"+_f,_11="prev_"+_f;
-(_a[_11]=this[_11])[_10]=_a;
-(_a[_10]=this)[_11]=_a;
-}
-},remove:function(_12){
-this._remove(_12,"before");
-this._remove(_12,"around");
-this._remove(_12,"afterReturning");
-this._remove(_12,"afterThrowing");
+return _7;
+},_add:function(_8,_9,_a,_b,_c){
+var _d=_9+_a;
+if(_b||_c[_9]||(_a&&_c[_d])){
+var _e="next_"+_d,_f="prev_"+_d;
+(_8[_f]=this[_f])[_e]=_8;
+(_8[_e]=this)[_f]=_8;
+}
+},remove:function(_10){
+this._remove(_10,"before");
+this._remove(_10,"around");
+this._remove(_10,"afterReturning");
+this._remove(_10,"afterThrowing");
 --this.counter;
-},_remove:function(_13,_14){
-var _15="next_"+_14,_16="prev_"+_14;
-if(_13[_15]){
-_13[_15][_16]=_13[_16];
-_13[_16][_15]=_13[_15];
+},_remove:function(_11,_12){
+var _13="next_"+_12,_14="prev_"+_12;
+if(_11[_13]){
+_11[_13][_14]=_11[_14];
+_11[_14][_13]=_11[_13];
 }
 },isEmpty:function(){
 return !this.counter;
 }});
-var _17=function(){
+var _15=function(){
 return function(){
-var _18=arguments.callee,_19=_18.advices,ret,i,a,e,t;
-if(_5){
-_4.push(_5);
+var _16=arguments.callee,_17=_16.advices,ret,i,a,e,t;
+if(_3){
+_2.push(_3);
 }
-_5={instance:this,joinPoint:_18,depth:_4.length,around:_19.prev_around,dynAdvices:[],dynIndex:0};
+_3={instance:this,joinPoint:_16,depth:_2.length,around:_17.prev_around,dynAdvices:[],dynIndex:0};
 try{
-for(i=_19.prev_before;i!=_19;i=i.prev_before){
+for(i=_17.prev_before;i!=_17;i=i.prev_before){
 if(i.dynamic){
-_5.dynAdvices.push(a=new i.advice(_5));
+_3.dynAdvices.push(a=new i.advice(_3));
 if(t=a.before){
 t.apply(a,arguments);
 }
@@ -64,12 +64,12 @@ t.before.apply(t,arguments);
 }
 }
 try{
-ret=(_19.prev_around==_19?_18.target:_2.proceed).apply(this,arguments);
+ret=(_17.prev_around==_17?_16.target:_1.proceed).apply(this,arguments);
 }
 catch(e){
-_5.dynIndex=_5.dynAdvices.length;
-for(i=_19.next_afterThrowing;i!=_19;i=i.next_afterThrowing){
-a=i.dynamic?_5.dynAdvices[--_5.dynIndex]:i.advice;
+_3.dynIndex=_3.dynAdvices.length;
+for(i=_17.next_afterThrowing;i!=_17;i=i.next_afterThrowing){
+a=i.dynamic?_3.dynAdvices[--_3.dynIndex]:i.advice;
 if(t=a.afterThrowing){
 t.call(a,e);
 }
@@ -79,9 +79,9 @@ t.call(a);
 }
 throw e;
 }
-_5.dynIndex=_5.dynAdvices.length;
-for(i=_19.next_afterReturning;i!=_19;i=i.next_afterReturning){
-a=i.dynamic?_5.dynAdvices[--_5.dynIndex]:i.advice;
+_3.dynIndex=_3.dynAdvices.length;
+for(i=_17.next_afterReturning;i!=_17;i=i.next_afterReturning){
+a=i.dynamic?_3.dynAdvices[--_3.dynIndex]:i.advice;
 if(t=a.afterReturning){
 t.call(a,ret);
 }
@@ -89,7 +89,7 @@ if(t=a.after){
 t.call(a);
 }
 }
-var ls=_18._listeners;
+var ls=_16._listeners;
 for(i in ls){
 if(!(i in ap)){
 ls[i].apply(this,arguments);
@@ -97,108 +97,108 @@ ls[i].apply(this,arguments);
 }
 }
 finally{
-for(i=0;i<_5.dynAdvices.length;++i){
-a=_5.dynAdvices[i];
+for(i=0;i<_3.dynAdvices.length;++i){
+a=_3.dynAdvices[i];
 if(a.destroy){
 a.destroy();
 }
 }
-_5=_4.length?_4.pop():null;
+_3=_2.length?_2.pop():null;
 }
 return ret;
 };
 };
-_2.advise=function(obj,_21,_22){
+_1.advise=function(obj,_18,_19){
 if(typeof obj!="object"){
 obj=obj.prototype;
 }
-var _23=[];
-if(!(_21 instanceof Array)){
-_21=[_21];
+var _1a=[];
+if(!(_18 instanceof Array)){
+_18=[_18];
 }
-for(var j=0;j<_21.length;++j){
-var t=_21[j];
+for(var j=0;j<_18.length;++j){
+var t=_18[j];
 if(t instanceof RegExp){
 for(var i in obj){
 if(d.isFunction(obj[i])&&t.test(i)){
-_23.push(i);
+_1a.push(i);
 }
 }
 }else{
 if(d.isFunction(obj[t])){
-_23.push(t);
+_1a.push(t);
 }
 }
 }
-if(!d.isArray(_22)){
-_22=[_22];
+if(!d.isArray(_19)){
+_19=[_19];
 }
-return _2.adviseRaw(obj,_23,_22);
+return _1.adviseRaw(obj,_1a,_19);
 };
-_2.adviseRaw=function(obj,_28,_29){
-if(!_28.length||!_29.length){
+_1.adviseRaw=function(obj,_1b,_1c){
+if(!_1b.length||!_1c.length){
 return null;
 }
-var m={},al=_29.length;
-for(var i=_28.length-1;i>=0;--i){
-var _2d=_28[i],o=obj[_2d],ao=new Array(al),t=o.advices;
+var m={},al=_1c.length;
+for(var i=_1b.length-1;i>=0;--i){
+var _1d=_1b[i],o=obj[_1d],ao=new Array(al),t=o.advices;
 if(!t){
-var x=obj[_2d]=_17();
+var x=obj[_1d]=_15();
 x.target=o.target||o;
-x.targetName=_2d;
+x.targetName=_1d;
 x._listeners=o._listeners||[];
-x.advices=new _6;
+x.advices=new _4;
 t=x.advices;
 }
 for(var j=0;j<al;++j){
-ao[j]=t.add(_29[j]);
+ao[j]=t.add(_1c[j]);
 }
-m[_2d]=ao;
+m[_1d]=ao;
 }
 return [obj,m];
 };
-_2.unadvise=function(_33){
-if(!_33){
+_1.unadvise=function(_1e){
+if(!_1e){
 return;
 }
-var obj=_33[0],_35=_33[1];
-for(var _36 in _35){
-var o=obj[_36],t=o.advices,ao=_35[_36];
+var obj=_1e[0],_1f=_1e[1];
+for(var _20 in _1f){
+var o=obj[_20],t=o.advices,ao=_1f[_20];
 for(var i=ao.length-1;i>=0;--i){
 t.remove(ao[i]);
 }
 if(t.isEmpty()){
-var _3b=true,ls=o._listeners;
+var _21=true,ls=o._listeners;
 if(ls.length){
 for(i in ls){
 if(!(i in ap)){
-_3b=false;
+_21=false;
 break;
 }
 }
 }
-if(_3b){
-obj[_36]=o.target;
+if(_21){
+obj[_20]=o.target;
 }else{
-var x=obj[_36]=d._listener.getDispatcher();
+var x=obj[_20]=d._listener.getDispatcher();
 x.target=o.target;
 x._listeners=ls;
 }
 }
 }
 };
-_2.getContext=function(){
-return _5;
+_1.getContext=function(){
+return _3;
 };
-_2.getContextStack=function(){
-return _4;
+_1.getContextStack=function(){
+return _2;
 };
-_2.proceed=function(){
-var _3e=_5.joinPoint,_3f=_3e.advices;
-for(var c=_5.around;c!=_3f;c=_5.around){
-_5.around=c.prev_around;
+_1.proceed=function(){
+var _22=_3.joinPoint,_23=_22.advices;
+for(var c=_3.around;c!=_23;c=_3.around){
+_3.around=c.prev_around;
 if(c.dynamic){
-var a=_5.dynAdvices[_5.dynIndex++],t=a.around;
+var a=_3.dynAdvices[_3.dynIndex++],t=a.around;
 if(t){
 return t.apply(a,arguments);
 }
@@ -206,7 +206,7 @@ return t.apply(a,arguments);
 return c.advice.around.apply(c.advice,arguments);
 }
 }
-return _3e.target.apply(_5.instance,arguments);
+return _22.target.apply(_3.instance,arguments);
 };
 })();
 }
diff --git a/dojox/lang/aspect/memoizer.js b/dojox/lang/aspect/memoizer.js
index ed4443e..3fc72c1 100644
--- a/dojox/lang/aspect/memoizer.js
+++ b/dojox/lang/aspect/memoizer.js
@@ -11,37 +11,37 @@ dojo.provide("dojox.lang.aspect.memoizer");
 (function(){
 var _1=dojox.lang.aspect;
 var _2={around:function(_3){
-var _4=_1.getContext(),_5=_4.joinPoint,_6=_4.instance,t,u,_9;
+var _4=_1.getContext(),_5=_4.joinPoint,_6=_4.instance,t,u,_7;
 if((t=_6.__memoizerCache)&&(t=t[_5.targetName])&&(_3 in t)){
 return t[_3];
 }
-var _9=_1.proceed.apply(null,arguments);
+var _7=_1.proceed.apply(null,arguments);
 if(!(t=_6.__memoizerCache)){
 t=_6.__memoizerCache={};
 }
 if(!(u=t[_5.targetName])){
 u=t[_5.targetName]={};
 }
-return u[_3]=_9;
+return u[_3]=_7;
 }};
-var _a=function(_b){
+var _8=function(_9){
 return {around:function(){
-var _c=_1.getContext(),_d=_c.joinPoint,_e=_c.instance,t,u,ret,key=_b.apply(_e,arguments);
-if((t=_e.__memoizerCache)&&(t=t[_d.targetName])&&(key in t)){
-return t[key];
+var _a=_1.getContext(),_b=_a.joinPoint,_c=_a.instance,t,u,_d,_e=_9.apply(_c,arguments);
+if((t=_c.__memoizerCache)&&(t=t[_b.targetName])&&(_e in t)){
+return t[_e];
 }
-var ret=_1.proceed.apply(null,arguments);
-if(!(t=_e.__memoizerCache)){
-t=_e.__memoizerCache={};
+var _d=_1.proceed.apply(null,arguments);
+if(!(t=_c.__memoizerCache)){
+t=_c.__memoizerCache={};
 }
-if(!(u=t[_d.targetName])){
-u=t[_d.targetName]={};
+if(!(u=t[_b.targetName])){
+u=t[_b.targetName]={};
 }
-return u[key]=ret;
+return u[_e]=_d;
 }};
 };
-_1.memoizer=function(_13){
-return arguments.length==0?_2:_a(_13);
+_1.memoizer=function(_f){
+return arguments.length==0?_2:_8(_f);
 };
 })();
 }
diff --git a/dojox/lang/aspect/memoizerGuard.js b/dojox/lang/aspect/memoizerGuard.js
index 8dfce11..5cededc 100644
--- a/dojox/lang/aspect/memoizerGuard.js
+++ b/dojox/lang/aspect/memoizerGuard.js
@@ -26,9 +26,9 @@ delete t[_3];
 }
 }
 };
-_1.memoizerGuard=function(_7){
+_1.memoizerGuard=function(_5){
 return {after:function(){
-_2(_7);
+_2(_5);
 }};
 };
 })();
diff --git a/dojox/lang/aspect/profiler.js b/dojox/lang/aspect/profiler.js
index 33005d7..11f68bf 100644
--- a/dojox/lang/aspect/profiler.js
+++ b/dojox/lang/aspect/profiler.js
@@ -20,7 +20,6 @@ console.profile.apply(console,this.args);
 }
 },after:function(){
 if(!--this.inCall){
-
 }
 }});
 _1.profiler=function(_5){
diff --git a/dojox/lang/aspect/timer.js b/dojox/lang/aspect/timer.js
index 71f888e..52e6bc3 100644
--- a/dojox/lang/aspect/timer.js
+++ b/dojox/lang/aspect/timer.js
@@ -16,11 +16,9 @@ this.inCall=0;
 };
 dojo.extend(_3,{before:function(){
 if(!(this.inCall++)){
-
 }
 },after:function(){
 if(!--this.inCall){
-
 }
 }});
 _1.timer=function(_5){
diff --git a/dojox/lang/aspect/tracer.js b/dojox/lang/aspect/tracer.js
index 9aa5335..00e8aa6 100644
--- a/dojox/lang/aspect/tracer.js
+++ b/dojox/lang/aspect/tracer.js
@@ -22,14 +22,10 @@ console[this.method](_4.instance,"=>",_5.targetName+"("+_6+")");
 },afterReturning:function(_7){
 var _8=_1.getContext().joinPoint;
 if(typeof _7!="undefined"){
-
 }else{
-
 }
 },afterThrowing:function(_9){
-
 },_after:function(_a){
-
 }});
 _1.tracer=function(_b){
 return new _2(_b);
diff --git a/dojox/lang/docs.js b/dojox/lang/docs.js
new file mode 100644
index 0000000..3229e5c
--- /dev/null
+++ b/dojox/lang/docs.js
@@ -0,0 +1,192 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.lang.docs"]){
+dojo._hasResource["dojox.lang.docs"]=true;
+dojo.provide("dojox.lang.docs");
+(function(){
+function _1(_2){
+};
+var _3={};
+var _4=[];
+var _5=dojox.lang.docs._loadedDocs={};
+var _6=function(_7,_8){
+_3[_8]=_7;
+};
+var _9=function(_a){
+var _b=_a.type||"";
+var _c,_d=false,_e=false,_f;
+_b=_b.replace(/\?/,function(){
+_d=true;
+return "";
+});
+_b=_b.replace(/\[\]/,function(){
+_e=true;
+return "";
+});
+if(_b.match(/HTML/)){
+_b="string";
+}else{
+if(_b=="String"||_b=="Number"||_b=="Boolean"||_b=="Object"||_b=="Array"||_b=="Integer"||_b=="Function"){
+_b=_b.toLowerCase();
+}else{
+if(_b=="bool"){
+_b="boolean";
+}else{
+if(_b){
+_c=dojo.getObject(_b)||{};
+_f=true;
+}else{
+_c={};
+}
+}
+}
+}
+_c=_c||{type:_b};
+if(_e){
+_c={items:_c,type:"array"};
+_f=false;
+}
+if(!_f){
+if(_d){
+_c.optional=true;
+}
+if(/const/.test(_a.tags)){
+_c.readonly=true;
+}
+}
+return _c;
+};
+var _10=function(_11,_12){
+var _13=_5[_12];
+if(_13){
+_11.description=_13.description;
+_11.properties={};
+_11.methods={};
+if(_13.properties){
+var _14=_13.properties;
+for(var i=0,l=_14.length;i<l;i++){
+if(_14[i].scope=="prototype"){
+var _15=_11.properties[_14[i].name]=_9(_14[i]);
+_15.description=_14[i].summary;
+}
+}
+}
+if(_13.methods){
+var _16=_13.methods;
+for(i=0,l=_16.length;i<l;i++){
+_12=_16[i].name;
+if(_12&&_16[i].scope=="prototype"){
+var _17=_11.methods[_12]={};
+_17.description=_16[i].summary;
+var _18=_16[i].parameters;
+if(_18){
+_17.parameters=[];
+for(var j=0,k=_18.length;j<k;j++){
+var _19=_18[j];
+var _1a=_17.parameters[j]=_9(_19);
+_1a.name=_19.name;
+_1a.optional="optional"==_19.usage;
+}
+}
+var ret=_16[i]["return-types"];
+if(ret&&ret[0]){
+var _1b=_9(ret[0]);
+if(_1b.type){
+_17.returns=_1b;
+}
+}
+}
+}
+}
+var _1c=_13.superclass;
+if(_1c){
+_11["extends"]=dojo.getObject(_1c);
+}
+}
+};
+var _1d=function(_1e){
+_4.push(_1e);
+};
+var _1f=dojo.declare;
+dojo.declare=function(_20){
+var _21=_1f.apply(this,arguments);
+_6(_21,_20);
+return _21;
+};
+dojo.mixin(dojo.declare,_1f);
+var _22;
+var _23=dojo.require;
+dojo.require=function(_24){
+_1d(_24);
+var _25=_23.apply(this,arguments);
+return _25;
+};
+dojox.lang.docs.init=function(_26){
+function _27(){
+dojo.require=_23;
+_4=null;
+try{
+dojo.xhrGet({sync:!_26,url:dojo.baseUrl+"../util/docscripts/api.json",handleAs:"text"}).addCallbacks(function(obj){
+_5=(new Function("return "+obj))();
+obj=null;
+_6=_10;
+for(var i in _3){
+_6(_3[i],i);
+}
+_3=null;
+},_1);
+}
+catch(e){
+_1(e);
+}
+};
+if(_22){
+return null;
+}
+_22=true;
+var _28=function(_29,_2a){
+return dojo.xhrGet({sync:_2a||!_26,url:dojo.baseUrl+"../util/docscripts/api/"+_29+".json",handleAs:"text"}).addCallback(function(obj){
+obj=(new Function("return "+obj))();
+for(var _2b in obj){
+if(!_5[_2b]){
+_5[_2b]=obj[_2b];
+}
+}
+});
+};
+try{
+var _2c=_4.shift();
+_28(_2c,true).addCallbacks(function(){
+_1d=function(_2d){
+if(!_5[_2d]){
+try{
+_28(_2d);
+}
+catch(e){
+_5[_2d]={};
+}
+}
+};
+dojo.forEach(_4,function(mod){
+_1d(mod);
+});
+_4=null;
+_6=_10;
+for(i in _3){
+_6(_3[i],i);
+}
+_3=null;
+},_27);
+}
+catch(e){
+_27();
+}
+return null;
+};
+})();
+}
diff --git a/dojox/lang/functional/array.js b/dojox/lang/functional/array.js
index 9b964cc..36fdadd 100644
--- a/dojox/lang/functional/array.js
+++ b/dojox/lang/functional/array.js
@@ -10,7 +10,7 @@ dojo._hasResource["dojox.lang.functional.array"]=true;
 dojo.provide("dojox.lang.functional.array");
 dojo.require("dojox.lang.functional.lambda");
 (function(){
-var d=dojo,df=dojox.lang.functional,_3={};
+var d=dojo,df=dojox.lang.functional,_1={};
 d.mixin(df,{filter:function(a,f,o){
 if(typeof a=="string"){
 a=a.split("");
@@ -35,7 +35,7 @@ t.push(v);
 }
 }else{
 for(i in a){
-if(!(i in _3)){
+if(!(i in _1)){
 v=a[i];
 if(f.call(o,v,i,a)){
 t.push(v);
@@ -61,7 +61,7 @@ for(i=0;a.hasNext();f.call(o,a.next(),i++,a)){
 }
 }else{
 for(i in a){
-if(!(i in _3)){
+if(!(i in _1)){
 f.call(o,a[i],i,a);
 }
 }
@@ -87,7 +87,7 @@ for(i=0;a.hasNext();t.push(f.call(o,a.next(),i++,a))){
 }else{
 t=[];
 for(i in a){
-if(!(i in _3)){
+if(!(i in _1)){
 t.push(f.call(o,a[i],i,a));
 }
 }
@@ -116,7 +116,7 @@ return false;
 }
 }else{
 for(i in a){
-if(!(i in _3)){
+if(!(i in _1)){
 if(!f.call(o,a[i],i,a)){
 return false;
 }
@@ -147,7 +147,7 @@ return true;
 }
 }else{
 for(i in a){
-if(!(i in _3)){
+if(!(i in _1)){
 if(f.call(o,a[i],i,a)){
 return true;
 }
diff --git a/dojox/lang/functional/binrec.js b/dojox/lang/functional/binrec.js
index 8d48b8a..49ca84e 100644
--- a/dojox/lang/functional/binrec.js
+++ b/dojox/lang/functional/binrec.js
@@ -11,39 +11,39 @@ dojo.provide("dojox.lang.functional.binrec");
 dojo.require("dojox.lang.functional.lambda");
 dojo.require("dojox.lang.functional.util");
 (function(){
-var df=dojox.lang.functional,_2=df.inlineLambda,_x="_x",_4=["_z.r","_r","_z.a"];
-df.binrec=function(_5,_6,_7,_8){
-var c,t,b,a,cs,ts,bs,as,_11={},_12={},_13=function(x){
-_11[x]=1;
+var df=dojox.lang.functional,_1=df.inlineLambda,_2="_x",_3=["_z.r","_r","_z.a"];
+df.binrec=function(_4,_5,_6,_7){
+var c,t,b,a,cs,ts,bs,as,_8={},_9={},_a=function(x){
+_8[x]=1;
 };
-if(typeof _5=="string"){
-cs=_2(_5,_x,_13);
+if(typeof _4=="string"){
+cs=_1(_4,_2,_a);
 }else{
-c=df.lambda(_5);
+c=df.lambda(_4);
 cs="_c.apply(this, _x)";
-_12["_c=_t.c"]=1;
+_9["_c=_t.c"]=1;
 }
-if(typeof _6=="string"){
-ts=_2(_6,_x,_13);
+if(typeof _5=="string"){
+ts=_1(_5,_2,_a);
 }else{
-t=df.lambda(_6);
+t=df.lambda(_5);
 ts="_t.apply(this, _x)";
 }
-if(typeof _7=="string"){
-bs=_2(_7,_x,_13);
+if(typeof _6=="string"){
+bs=_1(_6,_2,_a);
 }else{
-b=df.lambda(_7);
+b=df.lambda(_6);
 bs="_b.apply(this, _x)";
-_12["_b=_t.b"]=1;
+_9["_b=_t.b"]=1;
 }
-if(typeof _8=="string"){
-as=_2(_8,_4,_13);
+if(typeof _7=="string"){
+as=_1(_7,_3,_a);
 }else{
-a=df.lambda(_8);
+a=df.lambda(_7);
 as="_a.call(this, _z.r, _r, _z.a)";
-_12["_a=_t.a"]=1;
+_9["_a=_t.a"]=1;
 }
-var _15=df.keys(_11),_16=df.keys(_12),f=new Function([],"var _x=arguments,_y,_z,_r".concat(_15.length?","+_15.join(","):"",_16.length?",_t=_x.callee,"+_16.join(","):"",t?(_16.length?",_t=_t.t":"_t=_x.callee.t"):"",";while(!",cs,"){_r=",bs,";_y={p:_y,a:_r[1]};_z={p:_z,a:_x};_x=_r[0]}for(;;){do{_r=",ts,";if(!_z)return _r;while(\"r\" in _z){_r=",as,";if(!(_z=_z.p))return _r}_z.r=_r;_x=_y.a;_y=_y.p}while(",cs,");do{_r=",bs,";_y={p:_y,a:_r[1]};_z={p:_z,a:_x};_x=_r[0]}while(!",cs,")}"));
+var _b=df.keys(_8),_c=df.keys(_9),f=new Function([],"var _x=arguments,_y,_z,_r".concat(_b.length?","+_b.join(","):"",_c.length?",_t=_x.callee,"+_c.join(","):"",t?(_c.length?",_t=_t.t":"_t=_x.callee.t"):"",";while(!",cs,"){_r=",bs,";_y={p:_y,a:_r[1]};_z={p:_z,a:_x};_x=_r[0]}for(;;){do{_r=",ts,";if(!_z)return _r;while(\"r\" in _z){_r=",as,";if(!(_z=_z.p))return _r}_z.r=_r;_x=_y.a;_y=_y.p}while(",cs,");do{_r=",bs,";_y={p:_y,a:_r[1]};_z={p:_z,a:_x};_x=_r[0]}while(!",cs,")}"));
 if(c){
 f.c=c;
 }
diff --git a/dojox/lang/functional/curry.js b/dojox/lang/functional/curry.js
index e547fa1..8ba5326 100644
--- a/dojox/lang/functional/curry.js
+++ b/dojox/lang/functional/curry.js
@@ -11,42 +11,42 @@ dojo.provide("dojox.lang.functional.curry");
 dojo.require("dojox.lang.functional.lambda");
 (function(){
 var df=dojox.lang.functional,ap=Array.prototype;
-var _3=function(_4){
+var _1=function(_2){
 return function(){
-var _5=_4.args.concat(ap.slice.call(arguments,0));
-if(arguments.length+_4.args.length<_4.arity){
-return _3({func:_4.func,arity:_4.arity,args:_5});
+var _3=_2.args.concat(ap.slice.call(arguments,0));
+if(arguments.length+_2.args.length<_2.arity){
+return _1({func:_2.func,arity:_2.arity,args:_3});
 }
-return _4.func.apply(this,_5);
+return _2.func.apply(this,_3);
 };
 };
-dojo.mixin(df,{curry:function(f,_7){
+dojo.mixin(df,{curry:function(f,_4){
 f=df.lambda(f);
-_7=typeof _7=="number"?_7:f.length;
-return _3({func:f,arity:_7,args:[]});
+_4=typeof _4=="number"?_4:f.length;
+return _1({func:f,arity:_4,args:[]});
 },arg:{},partial:function(f){
-var a=arguments,l=a.length,_b=new Array(l-1),p=[],i=1,t;
+var a=arguments,l=a.length,_5=new Array(l-1),p=[],i=1,t;
 f=df.lambda(f);
 for(;i<l;++i){
 t=a[i];
-_b[i-1]=t;
+_5[i-1]=t;
 if(t===df.arg){
 p.push(i-1);
 }
 }
 return function(){
-var t=ap.slice.call(_b,0),i=0,l=p.length;
+var t=ap.slice.call(_5,0),i=0,l=p.length;
 for(;i<l;++i){
 t[p[i]]=arguments[i];
 }
 return f.apply(this,t);
 };
-},mixer:function(f,mix){
+},mixer:function(f,_6){
 f=df.lambda(f);
 return function(){
-var t=new Array(mix.length),i=0,l=mix.length;
+var t=new Array(_6.length),i=0,l=_6.length;
 for(;i<l;++i){
-t[i]=arguments[mix[i]];
+t[i]=arguments[_6[i]];
 }
 return f.apply(this,t);
 };
diff --git a/dojox/lang/functional/fold.js b/dojox/lang/functional/fold.js
index 03fad93..628cd30 100644
--- a/dojox/lang/functional/fold.js
+++ b/dojox/lang/functional/fold.js
@@ -10,7 +10,7 @@ dojo._hasResource["dojox.lang.functional.fold"]=true;
 dojo.provide("dojox.lang.functional.fold");
 dojo.require("dojox.lang.functional.lambda");
 (function(){
-var d=dojo,df=dojox.lang.functional,_3={};
+var d=dojo,df=dojox.lang.functional,_1={};
 d.mixin(df,{foldl:function(a,f,z,o){
 if(typeof a=="string"){
 a=a.split("");
@@ -27,7 +27,7 @@ for(i=0;a.hasNext();z=f.call(o,z,a.next(),i++,a)){
 }
 }else{
 for(i in a){
-if(!(i in _3)){
+if(!(i in _1)){
 z=f.call(o,z,a[i],i,a);
 }
 }
@@ -53,12 +53,12 @@ for(i=1;a.hasNext();z=f.call(o,z,a.next(),i++,a)){
 }
 }
 }else{
-var _10=true;
+var _2=true;
 for(i in a){
-if(!(i in _3)){
-if(_10){
+if(!(i in _1)){
+if(_2){
 z=a[i];
-_10=false;
+_2=false;
 }else{
 z=f.call(o,z,a[i],i,a);
 }
diff --git a/dojox/lang/functional/lambda.js b/dojox/lang/functional/lambda.js
index a9d5221..9234e1c 100644
--- a/dojox/lang/functional/lambda.js
+++ b/dojox/lang/functional/lambda.js
@@ -9,52 +9,52 @@ if(!dojo._hasResource["dojox.lang.functional.lambda"]){
 dojo._hasResource["dojox.lang.functional.lambda"]=true;
 dojo.provide("dojox.lang.functional.lambda");
 (function(){
-var df=dojox.lang.functional,_2={};
-var _3="ab".split(/a*/).length>1?String.prototype.split:function(_4){
-var r=this.split.call(this,_4),m=_4.exec(this);
+var df=dojox.lang.functional,_1={};
+var _2="ab".split(/a*/).length>1?String.prototype.split:function(_3){
+var r=this.split.call(this,_3),m=_3.exec(this);
 if(m&&m.index==0){
 r.unshift("");
 }
 return r;
 };
-var _7=function(s){
-var _9=[],_a=_3.call(s,/\s*->\s*/m);
-if(_a.length>1){
-while(_a.length){
-s=_a.pop();
-_9=_a.pop().split(/\s*,\s*|\s+/m);
-if(_a.length){
-_a.push("(function("+_9+"){return ("+s+")})");
+var _4=function(s){
+var _5=[],_6=_2.call(s,/\s*->\s*/m);
+if(_6.length>1){
+while(_6.length){
+s=_6.pop();
+_5=_6.pop().split(/\s*,\s*|\s+/m);
+if(_6.length){
+_6.push("(function("+_5+"){return ("+s+")})");
 }
 }
 }else{
 if(s.match(/\b_\b/)){
-_9=["_"];
+_5=["_"];
 }else{
 var l=s.match(/^\s*(?:[+*\/%&|\^\.=<>]|!=)/m),r=s.match(/[+\-*\/%&|\^\.=<>!]\s*$/m);
 if(l||r){
 if(l){
-_9.push("$1");
+_5.push("$1");
 s="$1"+s;
 }
 if(r){
-_9.push("$2");
+_5.push("$2");
 s=s+"$2";
 }
 }else{
-var _d=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)||[],t={};
-dojo.forEach(_d,function(v){
+var _7=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)||[],t={};
+dojo.forEach(_7,function(v){
 if(!(v in t)){
-_9.push(v);
+_5.push(v);
 t[v]=1;
 }
 });
 }
 }
 }
-return {args:_9,body:s};
+return {args:_5,body:s};
 };
-var _10=function(a){
+var _8=function(a){
 return a.length?function(){
 var i=a.length-1,x=df.lambda(a[i]).apply(this,arguments);
 for(--i;i>=0;--i){
@@ -66,24 +66,24 @@ return x;
 };
 };
 dojo.mixin(df,{rawLambda:function(s){
-return _7(s);
+return _4(s);
 },buildLambda:function(s){
-s=_7(s);
+s=_4(s);
 return "function("+s.args.join(",")+"){return ("+s.body+");}";
 },lambda:function(s){
 if(typeof s=="function"){
 return s;
 }
 if(s instanceof Array){
-return _10(s);
+return _8(s);
 }
-if(s in _2){
-return _2[s];
+if(s in _1){
+return _1[s];
 }
-s=_7(s);
-return _2[s]=new Function(s.args,"return ("+s.body+");");
+s=_4(s);
+return _1[s]=new Function(s.args,"return ("+s.body+");");
 },clearLambdaCache:function(){
-_2={};
+_1={};
 }});
 })();
 }
diff --git a/dojox/lang/functional/linrec.js b/dojox/lang/functional/linrec.js
index 2a8f042..cb9e855 100644
--- a/dojox/lang/functional/linrec.js
+++ b/dojox/lang/functional/linrec.js
@@ -11,39 +11,39 @@ dojo.provide("dojox.lang.functional.linrec");
 dojo.require("dojox.lang.functional.lambda");
 dojo.require("dojox.lang.functional.util");
 (function(){
-var df=dojox.lang.functional,_2=df.inlineLambda,_x="_x",_4=["_r","_y.a"];
-df.linrec=function(_5,_6,_7,_8){
-var c,t,b,a,cs,ts,bs,as,_11={},_12={},_13=function(x){
-_11[x]=1;
+var df=dojox.lang.functional,_1=df.inlineLambda,_2="_x",_3=["_r","_y.a"];
+df.linrec=function(_4,_5,_6,_7){
+var c,t,b,a,cs,ts,bs,as,_8={},_9={},_a=function(x){
+_8[x]=1;
 };
-if(typeof _5=="string"){
-cs=_2(_5,_x,_13);
+if(typeof _4=="string"){
+cs=_1(_4,_2,_a);
 }else{
-c=df.lambda(_5);
+c=df.lambda(_4);
 cs="_c.apply(this, _x)";
-_12["_c=_t.c"]=1;
+_9["_c=_t.c"]=1;
 }
-if(typeof _6=="string"){
-ts=_2(_6,_x,_13);
+if(typeof _5=="string"){
+ts=_1(_5,_2,_a);
 }else{
-t=df.lambda(_6);
+t=df.lambda(_5);
 ts="_t.t.apply(this, _x)";
 }
-if(typeof _7=="string"){
-bs=_2(_7,_x,_13);
+if(typeof _6=="string"){
+bs=_1(_6,_2,_a);
 }else{
-b=df.lambda(_7);
+b=df.lambda(_6);
 bs="_b.apply(this, _x)";
-_12["_b=_t.b"]=1;
+_9["_b=_t.b"]=1;
 }
-if(typeof _8=="string"){
-as=_2(_8,_4,_13);
+if(typeof _7=="string"){
+as=_1(_7,_3,_a);
 }else{
-a=df.lambda(_8);
+a=df.lambda(_7);
 as="_a.call(this, _r, _y.a)";
-_12["_a=_t.a"]=1;
+_9["_a=_t.a"]=1;
 }
-var _15=df.keys(_11),_16=df.keys(_12),f=new Function([],"var _x=arguments,_y,_r".concat(_15.length?","+_15.join(","):"",_16.length?",_t=_x.callee,"+_16.join(","):t?",_t=_x.callee":"",";for(;!",cs,";_x=",bs,"){_y={p:_y,a:_x}}_r=",ts,";for(;_y;_y=_y.p){_r=",as,"}return _r"));
+var _b=df.keys(_8),_c=df.keys(_9),f=new Function([],"var _x=arguments,_y,_r".concat(_b.length?","+_b.join(","):"",_c.length?",_t=_x.callee,"+_c.join(","):t?",_t=_x.callee":"",";for(;!",cs,";_x=",bs,"){_y={p:_y,a:_x}}_r=",ts,";for(;_y;_y=_y.p){_r=",as,"}return _r"));
 if(c){
 f.c=c;
 }
diff --git a/dojox/lang/functional/listcomp.js b/dojox/lang/functional/listcomp.js
index fa60f34..112032b 100644
--- a/dojox/lang/functional/listcomp.js
+++ b/dojox/lang/functional/listcomp.js
@@ -11,16 +11,16 @@ dojo.provide("dojox.lang.functional.listcomp");
 (function(){
 var _1=/\bfor\b|\bif\b/gm;
 var _2=function(s){
-var _4=s.split(_1),_5=s.match(_1),_6=["var r = [];"],_7=[],i=0,l=_5.length;
+var _3=s.split(_1),_4=s.match(_1),_5=["var r = [];"],_6=[],i=0,l=_4.length;
 while(i<l){
-var a=_5[i],f=_4[++i];
+var a=_4[i],f=_3[++i];
 if(a=="for"&&!/^\s*\(\s*(;|var)/.test(f)){
 f=f.replace(/^\s*\(/,"(var ");
 }
-_6.push(a,f,"{");
-_7.push("}");
+_5.push(a,f,"{");
+_6.push("}");
 }
-return _6.join("")+"r.push("+_4[0]+");"+_7.join("")+"return r;";
+return _5.join("")+"r.push("+_3[0]+");"+_6.join("")+"return r;";
 };
 dojo.mixin(dojox.lang.functional,{buildListcomp:function(s){
 return "function(){"+_2(s)+"}";
diff --git a/dojox/lang/functional/multirec.js b/dojox/lang/functional/multirec.js
index 4eb5a50..f28a807 100644
--- a/dojox/lang/functional/multirec.js
+++ b/dojox/lang/functional/multirec.js
@@ -11,39 +11,39 @@ dojo.provide("dojox.lang.functional.multirec");
 dojo.require("dojox.lang.functional.lambda");
 dojo.require("dojox.lang.functional.util");
 (function(){
-var df=dojox.lang.functional,_2=df.inlineLambda,_x="_x",_4=["_y.r","_y.o"];
-df.multirec=function(_5,_6,_7,_8){
-var c,t,b,a,cs,ts,bs,as,_11={},_12={},_13=function(x){
-_11[x]=1;
+var df=dojox.lang.functional,_1=df.inlineLambda,_2="_x",_3=["_y.r","_y.o"];
+df.multirec=function(_4,_5,_6,_7){
+var c,t,b,a,cs,ts,bs,as,_8={},_9={},_a=function(x){
+_8[x]=1;
 };
-if(typeof _5=="string"){
-cs=_2(_5,_x,_13);
+if(typeof _4=="string"){
+cs=_1(_4,_2,_a);
 }else{
-c=df.lambda(_5);
+c=df.lambda(_4);
 cs="_c.apply(this, _x)";
-_12["_c=_t.c"]=1;
+_9["_c=_t.c"]=1;
 }
-if(typeof _6=="string"){
-ts=_2(_6,_x,_13);
+if(typeof _5=="string"){
+ts=_1(_5,_2,_a);
 }else{
-t=df.lambda(_6);
+t=df.lambda(_5);
 ts="_t.apply(this, _x)";
 }
-if(typeof _7=="string"){
-bs=_2(_7,_x,_13);
+if(typeof _6=="string"){
+bs=_1(_6,_2,_a);
 }else{
-b=df.lambda(_7);
+b=df.lambda(_6);
 bs="_b.apply(this, _x)";
-_12["_b=_t.b"]=1;
+_9["_b=_t.b"]=1;
 }
-if(typeof _8=="string"){
-as=_2(_8,_4,_13);
+if(typeof _7=="string"){
+as=_1(_7,_3,_a);
 }else{
-a=df.lambda(_8);
+a=df.lambda(_7);
 as="_a.call(this, _y.r, _y.o)";
-_12["_a=_t.a"]=1;
+_9["_a=_t.a"]=1;
 }
-var _15=df.keys(_11),_16=df.keys(_12),f=new Function([],"var _y={a:arguments},_x,_r,_z,_i".concat(_15.length?","+_15.join(","):"",_16.length?",_t=arguments.callee,"+_16.join(","):"",t?(_16.length?",_t=_t.t":"_t=arguments.callee.t"):"",";for(;;){for(;;){if(_y.o){_r=",as,";break}_x=_y.a;if(",cs,"){_r=",ts,";break}_y.o=_x;_x=",bs,";_y.r=[];_z=_y;for(_i=_x.length-1;_i>=0;--_i){_y={p:_y,a:_x[_i],z:_z}}}if(!(_z=_y.z)){return _r}_z.r.push(_r);_y=_y.p}"));
+var _b=df.keys(_8),_c=df.keys(_9),f=new Function([],"var _y={a:arguments},_x,_r,_z,_i".concat(_b.length?","+_b.join(","):"",_c.length?",_t=arguments.callee,"+_c.join(","):"",t?(_c.length?",_t=_t.t":"_t=arguments.callee.t"):"",";for(;;){for(;;){if(_y.o){_r=",as,";break}_x=_y.a;if(",cs,"){_r=",ts,";break}_y.o=_x;_x=",bs,";_y.r=[];_z=_y;for(_i=_x.length-1;_i>=0;--_i){_y={p:_y,a:_x[_i],z:_z}}}if(!(_z=_y.z)){return _r}_z.r.push(_r);_y=_y.p}"));
 if(c){
 f.c=c;
 }
diff --git a/dojox/lang/functional/numrec.js b/dojox/lang/functional/numrec.js
index ebc6a32..434caf8 100644
--- a/dojox/lang/functional/numrec.js
+++ b/dojox/lang/functional/numrec.js
@@ -11,19 +11,19 @@ dojo.provide("dojox.lang.functional.numrec");
 dojo.require("dojox.lang.functional.lambda");
 dojo.require("dojox.lang.functional.util");
 (function(){
-var df=dojox.lang.functional,_2=df.inlineLambda,_3=["_r","_i"];
-df.numrec=function(_4,_5){
-var a,as,_8={},_9=function(x){
-_8[x]=1;
+var df=dojox.lang.functional,_1=df.inlineLambda,_2=["_r","_i"];
+df.numrec=function(_3,_4){
+var a,as,_5={},_6=function(x){
+_5[x]=1;
 };
-if(typeof _5=="string"){
-as=_2(_5,_3,_9);
+if(typeof _4=="string"){
+as=_1(_4,_2,_6);
 }else{
-a=df.lambda(_5);
+a=df.lambda(_4);
 as="_a.call(this, _r, _i)";
 }
-var _b=df.keys(_8),f=new Function(["_x"],"var _t=arguments.callee,_r=_t.t,_i".concat(_b.length?","+_b.join(","):"",a?",_a=_t.a":"",";for(_i=1;_i<=_x;++_i){_r=",as,"}return _r"));
-f.t=_4;
+var _7=df.keys(_5),f=new Function(["_x"],"var _t=arguments.callee,_r=_t.t,_i".concat(_7.length?","+_7.join(","):"",a?",_a=_t.a":"",";for(_i=1;_i<=_x;++_i){_r=",as,"}return _r"));
+f.t=_3;
 if(a){
 f.a=a;
 }
diff --git a/dojox/lang/functional/object.js b/dojox/lang/functional/object.js
index 9b493c3..0146e79 100644
--- a/dojox/lang/functional/object.js
+++ b/dojox/lang/functional/object.js
@@ -10,52 +10,52 @@ dojo._hasResource["dojox.lang.functional.object"]=true;
 dojo.provide("dojox.lang.functional.object");
 dojo.require("dojox.lang.functional.lambda");
 (function(){
-var d=dojo,df=dojox.lang.functional,_3={};
-d.mixin(df,{keys:function(_4){
+var d=dojo,df=dojox.lang.functional,_1={};
+d.mixin(df,{keys:function(_2){
 var t=[];
-for(var i in _4){
-if(!(i in _3)){
+for(var i in _2){
+if(!(i in _1)){
 t.push(i);
 }
 }
 return t;
-},values:function(_7){
+},values:function(_3){
 var t=[];
-for(var i in _7){
-if(!(i in _3)){
-t.push(_7[i]);
+for(var i in _3){
+if(!(i in _1)){
+t.push(_3[i]);
 }
 }
 return t;
-},filterIn:function(_a,f,o){
+},filterIn:function(_4,f,o){
 o=o||d.global;
 f=df.lambda(f);
 var t={},v,i;
-for(i in _a){
-if(!(i in _3)){
-v=_a[i];
-if(f.call(o,v,i,_a)){
+for(i in _4){
+if(!(i in _1)){
+v=_4[i];
+if(f.call(o,v,i,_4)){
 t[i]=v;
 }
 }
 }
 return t;
-},forIn:function(obj,f,o){
+},forIn:function(_5,f,o){
 o=o||d.global;
 f=df.lambda(f);
-for(var i in obj){
-if(!(i in _3)){
-f.call(o,obj[i],i,obj);
+for(var i in _5){
+if(!(i in _1)){
+f.call(o,_5[i],i,_5);
 }
 }
 return o;
-},mapIn:function(obj,f,o){
+},mapIn:function(_6,f,o){
 o=o||d.global;
 f=df.lambda(f);
 var t={},i;
-for(i in obj){
-if(!(i in _3)){
-t[i]=f.call(o,obj[i],i,obj);
+for(i in _6){
+if(!(i in _1)){
+t[i]=f.call(o,_6[i],i,_6);
 }
 }
 return t;
diff --git a/dojox/lang/functional/scan.js b/dojox/lang/functional/scan.js
index aa1e738..c46eec2 100644
--- a/dojox/lang/functional/scan.js
+++ b/dojox/lang/functional/scan.js
@@ -10,7 +10,7 @@ dojo._hasResource["dojox.lang.functional.scan"]=true;
 dojo.provide("dojox.lang.functional.scan");
 dojo.require("dojox.lang.functional.lambda");
 (function(){
-var d=dojo,df=dojox.lang.functional,_3={};
+var d=dojo,df=dojox.lang.functional,_1={};
 d.mixin(df,{scanl:function(a,f,z,o){
 if(typeof a=="string"){
 a=a.split("");
@@ -31,7 +31,7 @@ for(i=0;a.hasNext();t.push(z=f.call(o,z,a.next(),i++,a))){
 }else{
 t=[z];
 for(i in a){
-if(!(i in _3)){
+if(!(i in _1)){
 t.push(z=f.call(o,z,a[i],i,a));
 }
 }
@@ -44,7 +44,7 @@ a=a.split("");
 }
 o=o||d.global;
 f=df.lambda(f);
-var t,n,z,_11=true;
+var t,n,z,_2=true;
 if(d.isArray(a)){
 t=new Array(n=a.length);
 t[0]=z=a[0];
@@ -59,10 +59,10 @@ for(var i=1;a.hasNext();t.push(z=f.call(o,z,a.next(),i++,a))){
 }
 }else{
 for(var i in a){
-if(!(i in _3)){
-if(_11){
+if(!(i in _1)){
+if(_2){
 t=[z=a[i]];
-_11=false;
+_2=false;
 }else{
 t.push(z=f.call(o,z,a[i],i,a));
 }
diff --git a/dojox/lang/functional/tailrec.js b/dojox/lang/functional/tailrec.js
index 942dc34..7d064e1 100644
--- a/dojox/lang/functional/tailrec.js
+++ b/dojox/lang/functional/tailrec.js
@@ -11,32 +11,32 @@ dojo.provide("dojox.lang.functional.tailrec");
 dojo.require("dojox.lang.functional.lambda");
 dojo.require("dojox.lang.functional.util");
 (function(){
-var df=dojox.lang.functional,_2=df.inlineLambda,_x="_x";
-df.tailrec=function(_4,_5,_6){
-var c,t,b,cs,ts,bs,_d={},_e={},_f=function(x){
-_d[x]=1;
+var df=dojox.lang.functional,_1=df.inlineLambda,_2="_x";
+df.tailrec=function(_3,_4,_5){
+var c,t,b,cs,ts,bs,_6={},_7={},_8=function(x){
+_6[x]=1;
 };
-if(typeof _4=="string"){
-cs=_2(_4,_x,_f);
+if(typeof _3=="string"){
+cs=_1(_3,_2,_8);
 }else{
-c=df.lambda(_4);
+c=df.lambda(_3);
 cs="_c.apply(this, _x)";
-_e["_c=_t.c"]=1;
+_7["_c=_t.c"]=1;
 }
-if(typeof _5=="string"){
-ts=_2(_5,_x,_f);
+if(typeof _4=="string"){
+ts=_1(_4,_2,_8);
 }else{
-t=df.lambda(_5);
+t=df.lambda(_4);
 ts="_t.t.apply(this, _x)";
 }
-if(typeof _6=="string"){
-bs=_2(_6,_x,_f);
+if(typeof _5=="string"){
+bs=_1(_5,_2,_8);
 }else{
-b=df.lambda(_6);
+b=df.lambda(_5);
 bs="_b.apply(this, _x)";
-_e["_b=_t.b"]=1;
+_7["_b=_t.b"]=1;
 }
-var _11=df.keys(_d),_12=df.keys(_e),f=new Function([],"var _x=arguments,_t=_x.callee,_c=_t.c,_b=_t.b".concat(_11.length?","+_11.join(","):"",_12.length?",_t=_x.callee,"+_12.join(","):t?",_t=_x.callee":"",";for(;!",cs,";_x=",bs,");return ",ts));
+var _9=df.keys(_6),_a=df.keys(_7),f=new Function([],"var _x=arguments,_t=_x.callee,_c=_t.c,_b=_t.b".concat(_9.length?","+_9.join(","):"",_a.length?",_t=_x.callee,"+_a.join(","):t?",_t=_x.callee":"",";for(;!",cs,";_x=",bs,");return ",ts));
 if(c){
 f.c=c;
 }
diff --git a/dojox/lang/functional/util.js b/dojox/lang/functional/util.js
index f30237d..4002040 100644
--- a/dojox/lang/functional/util.js
+++ b/dojox/lang/functional/util.js
@@ -11,16 +11,16 @@ dojo.provide("dojox.lang.functional.util");
 dojo.require("dojox.lang.functional.lambda");
 (function(){
 var df=dojox.lang.functional;
-dojo.mixin(df,{inlineLambda:function(_2,_3,_4){
-var s=df.rawLambda(_2);
-if(_4){
-df.forEach(s.args,_4);
+dojo.mixin(df,{inlineLambda:function(_1,_2,_3){
+var s=df.rawLambda(_1);
+if(_3){
+df.forEach(s.args,_3);
 }
-var ap=typeof _3=="string",n=ap?s.args.length:Math.min(s.args.length,_3.length),a=new Array(4*n+4),i,j=1;
+var ap=typeof _2=="string",n=ap?s.args.length:Math.min(s.args.length,_2.length),a=new Array(4*n+4),i,j=1;
 for(i=0;i<n;++i){
 a[j++]=s.args[i];
 a[j++]="=";
-a[j++]=ap?_3+"["+i+"]":_3[i];
+a[j++]=ap?_2+"["+i+"]":_2[i];
 a[j++]=",";
 }
 a[0]="(";
diff --git a/dojox/lang/observable.js b/dojox/lang/observable.js
index 3a6600a..db75804 100644
--- a/dojox/lang/observable.js
+++ b/dojox/lang/observable.js
@@ -23,96 +23,93 @@ return _7(_e,_f,i,arguments);
 };
 };
 if(dojox.lang.lettableWin){
-var _11=dojox.lang.makeObservable;
-_11.inc=(_11.inc||0)+1;
-var _12="gettable_"+_11.inc;
-dojox.lang.lettableWin[_12]=_5;
-var _13="settable_"+_11.inc;
-dojox.lang.lettableWin[_13]=_6;
-var _14={};
-return function(_15){
-if(_15.__observable){
-return _15.__observable;
-}
-if(_15.data__){
+var _10=dojox.lang.makeObservable;
+_10.inc=(_10.inc||0)+1;
+var _11="gettable_"+_10.inc;
+dojox.lang.lettableWin[_11]=_5;
+var _12="settable_"+_10.inc;
+dojox.lang.lettableWin[_12]=_6;
+var _13={};
+return function(_14){
+if(_14.__observable){
+return _14.__observable;
+}
+if(_14.data__){
 throw new Error("Can wrap an object that is already wrapped");
 }
-var _16=[],i,l;
+var _15=[],i,l;
 for(i in _8){
-_16.push(i);
-}
-var _19={type:1,event:1};
-for(i in _15){
-if(i.match(/^[a-zA-Z][\w\$_]*$/)&&!(i in _8)&&!(i in _19)){
-_16.push(i);
-}
-}
-var _1a=_16.join(",");
-var _1b,_1c=_14[_1a];
-if(!_1c){
-var _1d="dj_lettable_"+(_11.inc++);
-var _1e=_1d+"_dj_getter";
-var _1f=["Class "+_1d,"\tPublic data__"];
-for(i=0,l=_16.length;i<l;i++){
-_1b=_16[i];
-var _20=typeof _15[_1b];
-if(_20=="function"||_8[_1b]){
-_1f.push("  Public "+_1b);
+_15.push(i);
+}
+var _16={type:1,event:1};
+for(i in _14){
+if(i.match(/^[a-zA-Z][\w\$_]*$/)&&!(i in _8)&&!(i in _16)){
+_15.push(i);
+}
+}
+var _17=_15.join(",");
+var _18,_19=_13[_17];
+if(!_19){
+var _1a="dj_lettable_"+(_10.inc++);
+var _1b=_1a+"_dj_getter";
+var _1c=["Class "+_1a,"\tPublic data__"];
+for(i=0,l=_15.length;i<l;i++){
+_18=_15[i];
+var _1d=typeof _14[_18];
+if(_1d=="function"||_8[_18]){
+_1c.push("  Public "+_18);
 }else{
-if(_20!="object"){
-_1f.push("\tPublic Property Let "+_1b+"(val)","\t\tCall "+_13+"(me.data__,\""+_1b+"\",val)","\tEnd Property","\tPublic Property Get "+_1b,"\t\t"+_1b+" = "+_12+"(me.data__,\""+_1b+"\")","\tEnd Property");
+if(_1d!="object"){
+_1c.push("\tPublic Property Let "+_18+"(val)","\t\tCall "+_12+"(me.data__,\""+_18+"\",val)","\tEnd Property","\tPublic Property Get "+_18,"\t\t"+_18+" = "+_11+"(me.data__,\""+_18+"\")","\tEnd Property");
 }
 }
 }
-_1f.push("End Class");
-_1f.push("Function "+_1e+"()","\tDim tmp","\tSet tmp = New "+_1d,"\tSet "+_1e+" = tmp","End Function");
-dojox.lang.lettableWin.vbEval(_1f.join("\n"));
-_14[_1a]=_1c=function(){
-return dojox.lang.lettableWin.construct(_1e);
+_1c.push("End Class");
+_1c.push("Function "+_1b+"()","\tDim tmp","\tSet tmp = New "+_1a,"\tSet "+_1b+" = tmp","End Function");
+dojox.lang.lettableWin.vbEval(_1c.join("\n"));
+_13[_17]=_19=function(){
+return dojox.lang.lettableWin.construct(_1b);
 };
 }
-
-var _21=_1c();
-_21.data__=_15;
-
+var _1e=_19();
+_1e.data__=_14;
 try{
-_15.__observable=_21;
+_14.__observable=_1e;
 }
 catch(e){
 }
-for(i=0,l=_16.length;i<l;i++){
-_1b=_16[i];
+for(i=0,l=_15.length;i<l;i++){
+_18=_15[i];
 try{
-var val=_15[_1b];
+var val=_14[_18];
 }
 catch(e){
-
 }
-if(typeof val=="function"||_8[_1b]){
-_21[_1b]=_d(_21,_15,_1b);
+if(typeof val=="function"||_8[_18]){
+_1e[_18]=_d(_1e,_14,_18);
 }
 }
-return _21;
+return _1e;
 };
 }else{
-return function(_23){
-if(_23.__observable){
-return _23.__observable;
+return function(_1f){
+if(_1f.__observable){
+return _1f.__observable;
 }
-var _24=_23 instanceof Array?[]:{};
-_24.data__=_23;
-for(var i in _23){
+var _20=_1f instanceof Array?[]:{};
+_20.data__=_1f;
+for(var i in _1f){
 if(i.charAt(0)!="_"){
-if(typeof _23[i]=="function"){
-_24[i]=_d(_24,_23,i);
+if(typeof _1f[i]=="function"){
+_20[i]=_d(_20,_1f,i);
 }else{
-if(typeof _23[i]!="object"){
+if(typeof _1f[i]!="object"){
 (function(i){
-_24.__defineGetter__(i,function(){
-return _5(_23,i);
+_20.__defineGetter__(i,function(){
+return _5(_1f,i);
 });
-_24.__defineSetter__(i,function(_27){
-return _6(_23,i,_27);
+_20.__defineSetter__(i,function(_21){
+return _6(_1f,i,_21);
 });
 })(i);
 }
@@ -120,10 +117,10 @@ return _6(_23,i,_27);
 }
 }
 for(i in _8){
-_24[i]=_d(_24,_23,i);
+_20[i]=_d(_20,_1f,i);
 }
-_23.__observable=_24;
-return _24;
+_1f.__observable=_20;
+return _20;
 };
 }
 };
@@ -148,6 +145,6 @@ throw new Error("This browser does not support getters and setters");
 }
 dojox.lang.ReadOnlyProxy=dojox.lang.makeObservable(function(obj,i){
 return obj[i];
-},function(obj,i,_2c){
+},function(obj,i,_22){
 });
 }
diff --git a/dojox/lang/oo/Decorator.js b/dojox/lang/oo/Decorator.js
index 4cd68b1..332057f 100644
--- a/dojox/lang/oo/Decorator.js
+++ b/dojox/lang/oo/Decorator.js
@@ -9,15 +9,15 @@ if(!dojo._hasResource["dojox.lang.oo.Decorator"]){
 dojo._hasResource["dojox.lang.oo.Decorator"]=true;
 dojo.provide("dojox.lang.oo.Decorator");
 (function(){
-var oo=dojox.lang.oo,D=oo.Decorator=function(_3,_4){
-this.value=_3;
-this.decorator=typeof _4=="object"?function(){
-return _4.exec.apply(_4,arguments);
-}:_4;
+var oo=dojox.lang.oo,D=oo.Decorator=function(_1,_2){
+this.value=_1;
+this.decorator=typeof _2=="object"?function(){
+return _2.exec.apply(_2,arguments);
+}:_2;
 };
-oo.makeDecorator=function(_5){
-return function(_6){
-return new D(_6,_5);
+oo.makeDecorator=function(_3){
+return function(_4){
+return new D(_4,_3);
 };
 };
 })();
diff --git a/dojox/lang/oo/Filter.js b/dojox/lang/oo/Filter.js
index 74e01af..5e20e1f 100644
--- a/dojox/lang/oo/Filter.js
+++ b/dojox/lang/oo/Filter.js
@@ -9,20 +9,19 @@ if(!dojo._hasResource["dojox.lang.oo.Filter"]){
 dojo._hasResource["dojox.lang.oo.Filter"]=true;
 dojo.provide("dojox.lang.oo.Filter");
 (function(){
-var oo=dojox.lang.oo,F=oo.Filter=function(_3,_4){
-this.bag=_3;
-this.filter=typeof _4=="object"?function(){
-return _4.exec.apply(_4,arguments);
-}:_4;
+var oo=dojox.lang.oo,F=oo.Filter=function(_1,_2){
+this.bag=_1;
+this.filter=typeof _2=="object"?function(){
+return _2.exec.apply(_2,arguments);
+}:_2;
+},_3=function(_4){
+this.map=_4;
 };
-var _5=function(_6){
-this.map=_6;
+_3.prototype.exec=function(_5){
+return this.map.hasOwnProperty(_5)?this.map[_5]:_5;
 };
-_5.prototype.exec=function(_7){
-return this.map.hasOwnProperty(_7)?this.map[_7]:_7;
-};
-oo.filter=function(_8,_9){
-return new F(_8,new _5(_9));
+oo.filter=function(_6,_7){
+return new F(_6,new _3(_7));
 };
 })();
 }
diff --git a/dojox/lang/oo/aop.js b/dojox/lang/oo/aop.js
index e4b93da..c1f8f9b 100644
--- a/dojox/lang/oo/aop.js
+++ b/dojox/lang/oo/aop.js
@@ -9,14 +9,13 @@ if(!dojo._hasResource["dojox.lang.oo.aop"]){
 dojo._hasResource["dojox.lang.oo.aop"]=true;
 dojo.provide("dojox.lang.oo.aop");
 dojo.require("dojox.lang.oo.Decorator");
-dojo.require("dojox.lang.oo.chain");
 dojo.require("dojox.lang.oo.general");
 (function(){
-var oo=dojox.lang.oo,md=oo.makeDecorator,_3=oo.aop;
-_3.before=oo.chain.before;
-_3.around=oo.general.wrap;
-_3.afterReturning=md(function(_4,_5,_6){
-return dojo.isFunction(_6)?function(){
+var oo=dojox.lang.oo,md=oo.makeDecorator,_1=oo.general,_2=oo.aop,_3=dojo.isFunction;
+_2.before=_1.before;
+_2.around=_1.wrap;
+_2.afterReturning=md(function(_4,_5,_6){
+return _3(_6)?function(){
 var _7=_6.apply(this,arguments);
 _5.call(this,_7);
 return _7;
@@ -24,8 +23,8 @@ return _7;
 _5.call(this);
 };
 });
-_3.afterThrowing=md(function(_8,_9,_a){
-return dojo.isFunction(_a)?function(){
+_2.afterThrowing=md(function(_8,_9,_a){
+return _3(_a)?function(){
 var _b;
 try{
 _b=_a.apply(this,arguments);
@@ -37,8 +36,8 @@ throw e;
 return _b;
 }:_a;
 });
-_3.after=md(function(_c,_d,_e){
-return dojo.isFunction(_e)?function(){
+_2.after=md(function(_c,_d,_e){
+return _3(_e)?function(){
 var _f;
 try{
 _f=_e.apply(this,arguments);
diff --git a/dojox/lang/oo/declare.js b/dojox/lang/oo/declare.js
deleted file mode 100644
index cba6d8c..0000000
--- a/dojox/lang/oo/declare.js
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.lang.oo.declare"]){
-dojo._hasResource["dojox.lang.oo.declare"]=true;
-dojo.provide("dojox.lang.oo.declare");
-dojo.experimental("dojox.lang.oo.mixin");
-(function(){
-var d=dojo,oo=dojox.lang.oo,op=Object.prototype,_4=d.isFunction,_5=function(){
-},_6,i,_8=function(a,f){
-for(var i=0,l=a.length;i<l;++i){
-f(a[i]);
-}
-},_d=function(_e,_f){
-if(_e){
-throw new Error("declare: "+_f);
-}
-},mix=function(_11,_12,_13){
-var t=_11[_13],s=_12[_13];
-return t!==s&&s!==op[_13]?_11[_13]=s:0;
-},_16=function(_17,_18,_19){
-var t=mix(_17,_18,_19);
-if(_4(t)){
-t.nom=_19;
-}
-},_1b=function(_1c,_1d,mix){
-for(var _1f in _1d){
-mix(_1c,_1d,_1f);
-}
-_8(_6,function(_20){
-if(_20 in _1d){
-mix(_1c,_1d,_20);
-}
-});
-},_21=function(_22,_23){
-var m=_23._meta,mb=_22.bases;
-m&&mb.push(m.bases);
-mb.push(_23);
-};
-for(i in {toString:1}){
-_6=[];
-break;
-}
-_6=_6||["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString"];
-oo.makeDeclare=function(_26,_27){
-var _28={constructor:"after"},_29=function(_2a,_2b){
-var fs=[],mb=_2a.bases,i,l,t,c,m,h;
-for(i=0,l=mb.length;i<l;++i){
-(t=(c=mb[i])&&(m=c._meta)&&(h=m.hidden)?(_2b in h)&&h[_2b]:c.prototype[_2b])&&fs.push(t);
-}
-(t=_2a.hidden[_2b])&&fs.push(t);
-return _28[_2b]==="after"?fs:fs.reverse();
-},_33=function(_34,_35,a){
-var c=this.constructor,m=c._meta,_39=c._cache,_3a,i,l,f,n,ch,s,x;
-if(typeof _34!="string"){
-a=_35;
-_35=_34;
-_34="";
-}
-_3a=_33.caller;
-n=_3a.nom;
-_d(n&&_34&&n!==_34,"calling inherited() with a different name: "+_34);
-_34=_34||n;
-ch=_39[_34];
-if(!ch){
-_d(!_34,"can't deduce a name to call inherited()");
-_d(typeof _28[_34]=="string","chained method: "+_34);
-ch=_39[_34]=_29(m,_34);
-}
-do{
-s=this._inherited,n=s.length-1;
-if(n>=0){
-x=s[n];
-if(x.name===_34&&ch[x.pos]===_3a&&_3a.caller===_33){
-break;
-}
-}
-for(i=0,l=ch.length;i<l&&ch[i]!==_3a;++i){
-}
-if(i==l){
-this[_34]===_3a&&(i=-1)||_d(1,"can't find the caller for inherited()");
-}
-s.push(x={name:_34,start:i,pos:i});
-}while(false);
-f=ch[++x.pos];
-try{
-return f?f.apply(this,a||_35):undefined;
-}
-finally{
-x.start==--x.pos&&s.pop();
-}
-};
-_26=_26||[];
-_8(_26,function(_41){
-_28[_41]="before";
-});
-_27=_27||[];
-_8(_27,function(_42){
-_28[_42]="after";
-});
-return function(_43,_44,_45){
-var _46,_47,i,l,t,f,_4b,_4c={},_4d={bases:[]};
-if(typeof _43!="string"){
-_45=_44;
-_44=_43;
-_43="";
-}
-if(d.isArray(_44)){
-_46=_44;
-_44=_46[0];
-}
-if(_44){
-_21(_4d,_44);
-if(_46){
-for(i=1,l=_46.length;i<l;++i){
-_d(!(t=_46[i]),"mixin #"+i+" is null");
-_21(_4d,t);
-_5.prototype=_44.prototype;
-_47=new _5;
-_1b(_47,t.prototype,mix);
-(_4b=function(){
-}).superclass=_44;
-_4b.prototype=_47;
-_44=_47.constructor=_4b;
-}
-}
-_5.prototype=_44.prototype;
-_47=new _5;
-}else{
-_47={};
-}
-_1b(_47,(_4d.hidden=_45||{}),_16);
-_4d.bases=_4d.bases.concat.apply([],_4d.bases);
-_8(_27.concat(_26),function(_4e){
-(_47[_4e]=function(){
-var c=this.constructor,t=_29(c._meta,_4e),l=t.length,f=function(){
-for(var i=0;i<l;++i){
-t[i].apply(this,arguments);
-}
-};
-f.nom=_4e;
-(c.prototype[_4e]=f).apply(this,arguments);
-}).nom=_4e;
-});
-_47.inherited=_33;
-t=_29(_4d,"constructor");
-_4b=function(){
-this._inherited=[];
-var a=arguments,_52=a,a0=a[0],f,i,l;
-a=a0&&(f=a0.preamble)&&f.apply(this,a)||a;
-a=(f=this.preamble)&&f.apply(this,a)||a;
-for(i=0,l=t.length-1;i<l;++i){
-t[i].apply(this,a);
-}
-l>=0&&t[i].apply(this,t[i]===_4b._meta.hidden.constructor?_52:a);
-(f=this.postscript)&&f.apply(this,_52);
-};
-_4b._meta=_4d;
-_4b._cache={};
-_4b.superclass=_44&&_44.prototype;
-_47.constructor=_4b;
-_4b.prototype=_47;
-_43&&d.setObject(_47.declaredClass=_43,_4b);
-return _4b;
-};
-};
-oo.declare=oo.makeDeclare();
-})();
-}
diff --git a/dojox/lang/oo/general.js b/dojox/lang/oo/general.js
index 99016a3..7ed8cfa 100644
--- a/dojox/lang/oo/general.js
+++ b/dojox/lang/oo/general.js
@@ -10,40 +10,40 @@ dojo._hasResource["dojox.lang.oo.general"]=true;
 dojo.provide("dojox.lang.oo.general");
 dojo.require("dojox.lang.oo.Decorator");
 (function(){
-var oo=dojox.lang.oo,md=oo.makeDecorator,_3=oo.general;
-_3.augment=md(function(_4,_5,_6){
-return typeof _6=="undefined"?_5:_6;
+var oo=dojox.lang.oo,md=oo.makeDecorator,_1=oo.general,_2=dojo.isFunction;
+_1.augment=md(function(_3,_4,_5){
+return typeof _5=="undefined"?_4:_5;
 });
-_3.override=md(function(_7,_8,_9){
-return typeof _9!="undefined"?_8:_9;
+_1.override=md(function(_6,_7,_8){
+return typeof _8!="undefined"?_7:_8;
 });
-_3.shuffle=md(function(_a,_b,_c){
-return dojo.isFunction(_c)?function(){
-return _c.apply(this,_b.apply(this,arguments));
-}:_c;
+_1.shuffle=md(function(_9,_a,_b){
+return _2(_b)?function(){
+return _b.apply(this,_a.apply(this,arguments));
+}:_b;
 });
-_3.wrap=md(function(_d,_e,_f){
+_1.wrap=md(function(_c,_d,_e){
 return function(){
-return _e.call(this,_f,arguments);
+return _d.call(this,_e,arguments);
 };
 });
-_3.tap=md(function(_10,_11,_12){
+_1.tap=md(function(_f,_10,_11){
 return function(){
-_11.apply(this,arguments);
+_10.apply(this,arguments);
 return this;
 };
 });
-_3.before=md(function(_13,_14,_15){
-return dojo.isFunction(_15)?function(){
-_14.apply(this,arguments);
-return _15.apply(this,arguments);
-}:_14;
+_1.before=md(function(_12,_13,_14){
+return _2(_14)?function(){
+_13.apply(this,arguments);
+return _14.apply(this,arguments);
+}:_13;
 });
-_3.after=md(function(_16,_17,_18){
-return dojo.isFunction(_18)?function(){
-_18.apply(this,arguments);
-return _17.apply(this,arguments);
-}:_17;
+_1.after=md(function(_15,_16,_17){
+return _2(_17)?function(){
+_17.apply(this,arguments);
+return _16.apply(this,arguments);
+}:_16;
 });
 })();
 }
diff --git a/dojox/lang/oo/mixin.js b/dojox/lang/oo/mixin.js
index a986085..3f99f41 100644
--- a/dojox/lang/oo/mixin.js
+++ b/dojox/lang/oo/mixin.js
@@ -12,54 +12,70 @@ dojo.experimental("dojox.lang.oo.mixin");
 dojo.require("dojox.lang.oo.Filter");
 dojo.require("dojox.lang.oo.Decorator");
 (function(){
-var oo=dojox.lang.oo,_2=oo.Filter,_3=oo.Decorator,_4={},_5=function(_6){
-return _6;
-},_7=function(_8,_9,_a){
-return _9;
-},_b=function(_c,_d,_e,_f){
-_c[_d]=_e;
-},_10={},_11=oo.applyDecorator=function(_12,_13,_14,_15){
-if(_14 instanceof _3){
-var d=_14.decorator;
-_14=_11(_12,_13,_14.value,_15);
-return d(_13,_14,_15);
+var oo=dojox.lang.oo,_1=oo.Filter,_2=oo.Decorator,_3={},_4=function(_5){
+return _5;
+},_6=function(_7,_8,_9){
+return _8;
+},_a=function(_b,_c,_d,_e){
+_b[_c]=_d;
+},_f={},_10=dojo._extraNames,_11=_10.length,_12=oo.applyDecorator=function(_13,_14,_15,_16){
+if(_15 instanceof _2){
+var d=_15.decorator;
+_15=_12(_13,_14,_15.value,_16);
+return d(_14,_15,_16);
 }
-return _12(_13,_14,_15);
+return _13(_14,_15,_16);
 };
 oo.__mixin=function(_17,_18,_19,_1a,_1b){
-var _1c,_1d,_1e,_1f,_20;
+var _1c,_1d,_1e,_1f,_20,i;
 for(_1c in _18){
-if(!(_1c in _4)){
 _1e=_18[_1c];
+if(!(_1c in _3)||_3[_1c]!==_1e){
 _1d=_1a(_1c,_17,_18,_1e);
-if(_1d){
+if(_1d&&(!(_1d in _17)||!(_1d in _3)||_3[_1d]!==_1e)){
 _20=_17[_1d];
-_1f=_11(_19,_1d,_1e,_20);
+_1f=_12(_19,_1d,_1e,_20);
 if(_20!==_1f){
 _1b(_17,_1d,_1f,_20);
 }
 }
 }
 }
+if(_11){
+for(i=0;i<_11;++i){
+_1c=_10[i];
+_1e=_18[_1c];
+if(!(_1c in _3)||_3[_1c]!==_1e){
+_1d=_1a(_1c,_17,_18,_1e);
+if(_1d&&(!(_1d in _17)||!(_1d in _3)||_3[_1d]!==_1e)){
+_20=_17[_1d];
+_1f=_12(_19,_1d,_1e,_20);
+if(_20!==_1f){
+_1b(_17,_1d,_1f,_20);
+}
+}
+}
+}
+}
 return _17;
 };
 oo.mixin=function(_21,_22){
 var _23,_24,i=1,l=arguments.length;
 for(;i<l;++i){
 _22=arguments[i];
-if(_22 instanceof _2){
+if(_22 instanceof _1){
 _24=_22.filter;
 _22=_22.bag;
 }else{
-_24=_5;
+_24=_4;
 }
-if(_22 instanceof _3){
+if(_22 instanceof _2){
 _23=_22.decorator;
 _22=_22.value;
 }else{
-_23=_7;
+_23=_6;
 }
-oo.__mixin(_21,_22,_23,_24,_b);
+oo.__mixin(_21,_22,_23,_24,_a);
 }
 return _21;
 };
diff --git a/dojox/lang/oo/rearrange.js b/dojox/lang/oo/rearrange.js
index 9e2f47f..3dcf1ed 100644
--- a/dojox/lang/oo/rearrange.js
+++ b/dojox/lang/oo/rearrange.js
@@ -8,18 +8,42 @@
 if(!dojo._hasResource["dojox.lang.oo.rearrange"]){
 dojo._hasResource["dojox.lang.oo.rearrange"]=true;
 dojo.provide("dojox.lang.oo.rearrange");
-dojox.lang.oo.rearrange=function(_1,_2){
-for(var _3 in _2){
-if(_2.hasOwnProperty(_3)&&_3 in _1){
-var _4=_2[_3],_5=_1[_3];
-if(!(delete _1[_3])){
-_1[_3]=undefined;
+(function(){
+var _1=dojo._extraNames,_2=_1.length,_3=Object.prototype.toString;
+dojox.lang.oo.rearrange=function(_4,_5){
+var _6,_7,_8,i,t;
+for(_6 in _5){
+_7=_5[_6];
+if(!_7||_3.call(_7)=="[object String]"){
+_8=_4[_6];
+if(!(_6 in empty)||empty[_6]!==_8){
+if(!(delete _4[_6])){
+_4[_6]=undefined;
 }
-if(_4){
-_1[_4]=_5;
+if(_7){
+_4[_7]=_8;
 }
 }
 }
-return _1;
+}
+if(_2){
+for(i=0;i<_2;++i){
+_6=_1[i];
+_7=_5[_6];
+if(!_7||_3.call(_7)=="[object String]"){
+_8=_4[_6];
+if(!(_6 in empty)||empty[_6]!==_8){
+if(!(delete _4[_6])){
+_4[_6]=undefined;
+}
+if(_7){
+_4[_7]=_8;
+}
+}
+}
+}
+}
+return _4;
 };
+})();
 }
diff --git a/dojox/lang/typed.js b/dojox/lang/typed.js
new file mode 100644
index 0000000..7c95480
--- /dev/null
+++ b/dojox/lang/typed.js
@@ -0,0 +1,146 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.lang.typed"]){
+dojo._hasResource["dojox.lang.typed"]=true;
+(function(){
+var _1,_2=typeof dojo!="undefined";
+if(_2){
+dojo.provide("dojox.lang.typed");
+dojo.require("dojox.json.schema");
+_1=dojox.json.schema;
+}else{
+if(typeof JSONSchema=="undefined"){
+throw new Error("Dojo or JSON Schema library must be present");
+}
+_1=JSONSchema;
+}
+function _3(_4,_5){
+var _6=function(){
+var _7=_5();
+if(_7&&_7.parameters){
+var _8=_7.parameters;
+for(var j=0;j<_8.length;j++){
+arguments[j]=_9(arguments[j],_8[j],j.toString());
+}
+if(_7.additionalParameters){
+for(;j<arguments.length;j++){
+arguments[j]=_9(arguments[j],_7.additionalParameters,j.toString());
+}
+}
+}
+var _a=_4.apply(this,arguments);
+if(_7.returns){
+_9(_a,_7.returns);
+}
+return _a;
+};
+_6.__typedFunction__=true;
+for(var i in _4){
+_6[i]=_4[i];
+}
+return _6;
+};
+function _b(_c){
+return function(){
+return _c;
+};
+};
+function _9(_d,_e,_f){
+if(typeof _d=="function"&&_e&&!_d.__typedFunction__){
+_d=_3(_d,_b(_e));
+}
+var _10=_1._validate(_d,_e,_f);
+if(!_10.valid){
+var _11="";
+var _12=_10.errors;
+for(var i=0;i<_12.length;i++){
+_11+=_12[i].property+" "+_12[i].message+"\n";
+}
+throw new TypeError(_11);
+}
+return _d;
+};
+var _13=_1.__defineGetter__;
+var _14=function(_15){
+if(_15.__typedClass__){
+return _15;
+}
+var _16=function(){
+var i,_17,_18=_16.properties;
+var _19=_16.methods;
+_15.apply(this,arguments);
+this.__props__={};
+for(i in _19){
+_17=this[i];
+if(_17){
+if(!_17.__typedFunction__){
+var _1a=this;
+while(!_1a.hasOwnProperty(i)&&_1a.__proto__){
+_1a=_1a.__proto__;
+}
+(function(i){
+_1a[i]=_3(_17,function(){
+return _19[i];
+});
+})(i);
+}
+}else{
+(function(i){
+this[i]=function(){
+throw new TypeError("The method "+i+" is defined but not implemented");
+};
+})(i);
+}
+}
+if(_13){
+var _1b=this;
+for(i in _18){
+_17=this[i];
+if(this.hasOwnProperty(i)){
+this.__props__[i]=_17;
+}
+(function(i){
+delete _1b[i];
+_1b.__defineGetter__(i,function(){
+return i in this.__props__?this.__props__[i]:this.__proto__[i];
+});
+_1b.__defineSetter__(i,function(_1c){
+_9(_1c,_18[i],i);
+return this.__props__[i]=_1c;
+});
+})(i);
+}
+}
+_9(this,_16);
+};
+_16.prototype=_15.prototype;
+for(var i in _15){
+_16[i]=_15[i];
+}
+if(_15.prototype.declaredClass&&_2){
+dojo.setObject(_15.prototype.declaredClass,_16);
+}
+_16.__typedClass__=true;
+return _16;
+};
+if(_2){
+dojox.lang.typed=_14;
+if(dojo.config.typeCheckAllClasses){
+var _1d=dojo.declare;
+dojo.declare=function(_1e){
+var _1f=_1d.apply(this,arguments);
+_1f=_14(_1f);
+return _1f;
+};
+dojo.mixin(dojo.declare,_1d);
+}
+}else{
+typed=_14;
+}
+})();
+}
diff --git a/dojox/lang/utils.js b/dojox/lang/utils.js
index af81f81..3d76c3e 100644
--- a/dojox/lang/utils.js
+++ b/dojox/lang/utils.js
@@ -10,7 +10,7 @@ dojo._hasResource["dojox.lang.utils"]=true;
 dojo.provide("dojox.lang.utils");
 (function(){
 var _1={},du=dojox.lang.utils;
-var _3=function(o){
+var _2=function(o){
 if(dojo.isArray(o)){
 return dojo._toArray(o);
 }
@@ -19,41 +19,41 @@ return o;
 }
 return dojo.delegate(o);
 };
-dojo.mixin(du,{coerceType:function(_5,_6){
-switch(typeof _5){
+dojo.mixin(du,{coerceType:function(_3,_4){
+switch(typeof _3){
 case "number":
-return Number(eval("("+_6+")"));
+return Number(eval("("+_4+")"));
 case "string":
-return String(_6);
+return String(_4);
 case "boolean":
-return Boolean(eval("("+_6+")"));
+return Boolean(eval("("+_4+")"));
 }
-return eval("("+_6+")");
-},updateWithObject:function(_7,_8,_9){
-if(!_8){
-return _7;
+return eval("("+_4+")");
+},updateWithObject:function(_5,_6,_7){
+if(!_6){
+return _5;
 }
-for(var x in _7){
-if(x in _8&&!(x in _1)){
-var t=_7[x];
+for(var x in _5){
+if(x in _6&&!(x in _1)){
+var t=_5[x];
 if(t&&typeof t=="object"){
-du.updateWithObject(t,_8[x],_9);
+du.updateWithObject(t,_6[x],_7);
 }else{
-_7[x]=_9?du.coerceType(t,_8[x]):_3(_8[x]);
+_5[x]=_7?du.coerceType(t,_6[x]):_2(_6[x]);
 }
 }
 }
-return _7;
-},updateWithPattern:function(_c,_d,_e,_f){
-if(!_d||!_e){
-return _c;
+return _5;
+},updateWithPattern:function(_8,_9,_a,_b){
+if(!_9||!_a){
+return _8;
 }
-for(var x in _e){
-if(x in _d&&!(x in _1)){
-_c[x]=_f?du.coerceType(_e[x],_d[x]):_3(_d[x]);
+for(var x in _a){
+if(x in _9&&!(x in _1)){
+_8[x]=_b?du.coerceType(_a[x],_9[x]):_2(_9[x]);
 }
 }
-return _c;
+return _8;
 }});
 })();
 }
diff --git a/dojox/layout/ContentPane.js b/dojox/layout/ContentPane.js
index 0c5d5f4..59a4d3c 100644
--- a/dojox/layout/ContentPane.js
+++ b/dojox/layout/ContentPane.js
@@ -10,67 +10,17 @@ dojo._hasResource["dojox.layout.ContentPane"]=true;
 dojo.provide("dojox.layout.ContentPane");
 dojo.require("dijit.layout.ContentPane");
 dojo.require("dojox.html._base");
-(function(){
 dojo.declare("dojox.layout.ContentPane",dijit.layout.ContentPane,{adjustPaths:false,cleanContent:false,renderStyles:false,executeScripts:true,scriptHasHooks:false,constructor:function(){
 this.ioArgs={};
 this.ioMethod=dojo.xhrGet;
-this.onLoadDeferred=new dojo.Deferred();
-this.onUnloadDeferred=new dojo.Deferred();
-},postCreate:function(){
-this._setUpDeferreds();
-dijit.layout.ContentPane.prototype.postCreate.apply(this,arguments);
 },onExecError:function(e){
-},_setContentAttr:function(_2){
-var _3=this._setUpDeferreds();
-this.inherited(arguments);
-return _3;
-},cancel:function(){
-if(this._xhrDfd&&this._xhrDfd.fired==-1){
-this.onUnloadDeferred=null;
-}
-dijit.layout.ContentPane.prototype.cancel.apply(this,arguments);
-},_setUpDeferreds:function(){
-var _t=this,_5=function(){
-_t.cancel();
-};
-var _6=(_t.onLoadDeferred=new dojo.Deferred());
-var _7=(_t._nextUnloadDeferred=new dojo.Deferred());
-return {cancel:_5,addOnLoad:function(_8){
-_6.addCallback(_8);
-},addOnUnload:function(_9){
-_7.addCallback(_9);
-}};
-},_onLoadHandler:function(){
-dijit.layout.ContentPane.prototype._onLoadHandler.apply(this,arguments);
-if(this.onLoadDeferred){
-this.onLoadDeferred.callback(true);
-}
-},_onUnloadHandler:function(){
-this.isLoaded=false;
-this.cancel();
-if(this.onUnloadDeferred){
-this.onUnloadDeferred.callback(true);
-}
-dijit.layout.ContentPane.prototype._onUnloadHandler.apply(this,arguments);
-if(this._nextUnloadDeferred){
-this.onUnloadDeferred=this._nextUnloadDeferred;
-}
-},_onError:function(_a,_b){
-dijit.layout.ContentPane.prototype._onError.apply(this,arguments);
-if(this.onLoadDeferred){
-this.onLoadDeferred.errback(_b);
-}
-},refresh:function(){
-var _c=this._setUpDeferreds();
-this.inherited(arguments);
-return _c;
-},_setContent:function(_d){
-var _e=this._contentSetter;
-if(!(_e&&_e instanceof dojox.html._ContentSetter)){
-_e=this._contentSetter=new dojox.html._ContentSetter({node:this.containerNode,_onError:dojo.hitch(this,this._onError),onContentError:dojo.hitch(this,function(e){
-var _10=this.onContentError(e);
+},_setContent:function(_1){
+var _2=this._contentSetter;
+if(!(_2&&_2 instanceof dojox.html._ContentSetter)){
+_2=this._contentSetter=new dojox.html._ContentSetter({node:this.containerNode,_onError:dojo.hitch(this,this._onError),onContentError:dojo.hitch(this,function(e){
+var _3=this.onContentError(e);
 try{
-this.containerNode.innerHTML=_10;
+this.containerNode.innerHTML=_3;
 }
 catch(e){
 console.error("Fatal "+this.id+" could not change content due to "+e.message,e);
@@ -80,5 +30,4 @@ console.error("Fatal "+this.id+" could not change content due to "+e.message,e);
 this._contentSetterParams={adjustPaths:Boolean(this.adjustPaths&&(this.href||this.referencePath)),referencePath:this.href||this.referencePath,renderStyles:this.renderStyles,executeScripts:this.executeScripts,scriptHasHooks:this.scriptHasHooks,scriptHookReplacement:"dijit.byId('"+this.id+"')"};
 this.inherited("_setContent",arguments);
 }});
-})();
 }
diff --git a/dojox/layout/DragPane.js b/dojox/layout/DragPane.js
index 5687c4c..d210bd5 100644
--- a/dojox/layout/DragPane.js
+++ b/dojox/layout/DragPane.js
@@ -27,9 +27,9 @@ dojo.setSelectable(this.domNode,true);
 dojo.style(this.domNode,"cursor","pointer");
 this.disconnect(this._mover);
 },_move:function(e){
-var _5=this.invert?1:-1;
-this.domNode.scrollTop+=(this._y-e.pageY)*_5;
-this.domNode.scrollLeft+=(this._x-e.pageX)*_5;
+var _1=this.invert?1:-1;
+this.domNode.scrollTop+=(this._y-e.pageY)*_1;
+this.domNode.scrollLeft+=(this._x-e.pageX)*_1;
 this._x=e.pageX;
 this._y=e.pageY;
 }});
diff --git a/dojox/layout/ExpandoPane.js b/dojox/layout/ExpandoPane.js
index a60b8fe..fca923e 100644
--- a/dojox/layout/ExpandoPane.js
+++ b/dojox/layout/ExpandoPane.js
@@ -11,8 +11,8 @@ dojo.provide("dojox.layout.ExpandoPane");
 dojo.experimental("dojox.layout.ExpandoPane");
 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],{maxHeight:"",maxWidth:"",splitter:"",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\" dojoA [...]
+dojo.require("dijit._Contained");
+dojo.declare("dojox.layout.ExpandoPane",[dijit.layout.ContentPane,dijit._Templated,dijit._Contained],{maxHeight:"",maxWidth:"",splitter:false,templateString:dojo.cache("dojox.layout","resources/ExpandoPane.html","<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></d [...]
 this.inherited(arguments);
 this._animConnects=[];
 this._isHorizontal=true;
@@ -41,6 +41,7 @@ _1="Bottom";
 break;
 }
 dojo.addClass(this.domNode,"dojoxExpando"+_1);
+dojo.addClass(this.iconNode,"dojoxExpandoIcon"+_1);
 this._isHorizontal=/top|bottom/.test(this.region);
 }
 dojo.style(this.domNode,{overflow:"hidden",padding:0});
@@ -67,7 +68,7 @@ this._hideAnim.gotoPercent(99,true);
 }
 this._hasSizes=true;
 },_afterResize:function(e){
-var _7=this._currentSize;
+var _4=this._currentSize;
 this._currentSize=dojo.marginBox(this.domNode);
 var n=this._currentSize[(this._isHorizontal?"h":"w")];
 if(n>this._titleHeight){
@@ -78,18 +79,18 @@ this._showEnd();
 this._showSize=n;
 this._setupAnims();
 }else{
-this._showSize=_7[(this._isHorizontal?"h":"w")];
+this._showSize=_4[(this._isHorizontal?"h":"w")];
 this._showing=false;
 this._hideWrapper();
 this._hideAnim.gotoPercent(89,true);
 }
 },_setupAnims:function(){
 dojo.forEach(this._animConnects,dojo.disconnect);
-var _9={node:this.domNode,duration:this.duration},_a=this._isHorizontal,_b={},_c={},_d=_a?"height":"width";
-_b[_d]={end:this._showSize,unit:"px"};
-_c[_d]={end:this._closedSize,unit:"px"};
-this._showAnim=dojo.animateProperty(dojo.mixin(_9,{easing:this.easeIn,properties:_b}));
-this._hideAnim=dojo.animateProperty(dojo.mixin(_9,{easing:this.easeOut,properties:_c}));
+var _5={node:this.domNode,duration:this.duration},_6=this._isHorizontal,_7={},_8={},_9=_6?"height":"width";
+_7[_9]={end:this._showSize};
+_8[_9]={end:this._closedSize};
+this._showAnim=dojo.animateProperty(dojo.mixin(_5,{easing:this.easeIn,properties:_7}));
+this._hideAnim=dojo.animateProperty(dojo.mixin(_5,{easing:this.easeOut,properties:_8}));
 this._animConnects=[dojo.connect(this._showAnim,"onEnd",this,"_showEnd"),dojo.connect(this._hideAnim,"onEnd",this,"_hideEnd")];
 },toggle:function(){
 if(this._showing){
@@ -111,12 +112,12 @@ dojo.removeClass(this.domNode,"dojoxExpandoClosed");
 setTimeout(dojo.hitch(this._container,"layout"),15);
 },_hideEnd:function(){
 setTimeout(dojo.hitch(this._container,"layout"),15);
-},resize:function(_e){
+},resize:function(_a){
 if(!this._hasSizes){
-this._startupSizes(_e);
+this._startupSizes(_a);
 }
-var _f=(_e&&_e.h)?_e:dojo.marginBox(this.domNode);
-this._contentBox={w:_f.w||dojo.marginBox(this.domNode).w,h:_f.h-this._titleHeight};
+var _b=(_a&&_a.h)?_a:dojo.marginBox(this.domNode);
+this._contentBox={w:_b.w||dojo.marginBox(this.domNode).w,h:_b.h-this._titleHeight};
 dojo.style(this.containerNode,"height",this._contentBox.h+"px");
 this._layoutChildren();
 },_trap:function(e){
diff --git a/dojox/layout/FloatingPane.js b/dojox/layout/FloatingPane.js
index b915068..501631d 100644
--- a/dojox/layout/FloatingPane.js
+++ b/dojox/layout/FloatingPane.js
@@ -14,10 +14,9 @@ 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],{closable:true,dockable:true,resizable:false,maxable:false,resizeAxis:"xy",title:"",dockTo:"",duration:400,contentClass:"dojoxFloatingPaneContent",_showAnim:null,_hideAnim:null,_dockNode:null,_restoreState:{},_allFPs:[],_startZ:100,templateString:null,templateString:"<div class=\"dojoxFloatingPane\" id=\"${id}\">\n\t<div tabindex=\"0\" waiRole=\"button\" class=\"dojoxFloatingPaneTitle\" dojoAttachPoint=\ [...]
-this.setTitle(this.title);
+dojo.declare("dojox.layout.FloatingPane",[dojox.layout.ContentPane,dijit._Templated],{closable:true,dockable:true,resizable:false,maxable:false,resizeAxis:"xy",title:"",dockTo:"",duration:400,contentClass:"dojoxFloatingPaneContent",_showAnim:null,_hideAnim:null,_dockNode:null,_restoreState:{},_allFPs:[],_startZ:100,templateString:dojo.cache("dojox.layout","resources/FloatingPane.html","<div class=\"dojoxFloatingPane\" id=\"${id}\">\n\t<div tabindex=\"0\" waiRole=\"button\" class=\"dojoxF [...]
 this.inherited(arguments);
-var _1=new dojo.dnd.Moveable(this.domNode,{handle:this.focusNode});
+new dojo.dnd.Moveable(this.domNode,{handle:this.focusNode});
 if(!this.dockable){
 this.dockNode.style.display="none";
 }
@@ -31,12 +30,12 @@ this.restoreNode.style.display="none";
 if(!this.resizable){
 this.resizeHandle.style.display="none";
 }else{
-var _2=dojo.marginBox(this.domNode);
-this.domNode.style.width=_2.w+"px";
+this.domNode.style.width=dojo.marginBox(this.domNode).w+"px";
 }
 this._allFPs.push(this);
 this.domNode.style.position="absolute";
 this.bgIframe=new dijit.BackgroundIframe(this.domNode);
+this._naturalState=dojo.coords(this.domNode);
 },startup:function(){
 if(this._started){
 return;
@@ -51,25 +50,23 @@ this.containerNode.style.overflow="auto";
 this._resizeHandle=new dojox.layout.ResizeHandle({targetId:this.id,resizeAxis:this.resizeAxis},this.resizeHandle);
 }
 if(this.dockable){
-var _3=this.dockTo;
+var _1=this.dockTo;
 if(this.dockTo){
 this.dockTo=dijit.byId(this.dockTo);
 }else{
 this.dockTo=dijit.byId("dojoxGlobalFloatingDock");
 }
 if(!this.dockTo){
-var _4;
-var _5;
-if(_3){
-_4=_3;
-_5=dojo.byId(_3);
+var _2,_3;
+if(_1){
+_2=_1;
+_3=dojo.byId(_1);
 }else{
-_5=document.createElement("div");
-dojo.body().appendChild(_5);
-dojo.addClass(_5,"dojoxFloatingDockDefault");
-_4="dojoxGlobalFloatingDock";
+_3=dojo.create("div",null,dojo.body());
+dojo.addClass(_3,"dojoxFloatingDockDefault");
+_2="dojoxGlobalFloatingDock";
 }
-this.dockTo=new dojox.layout.Dock({id:_4,autoPosition:"south"},_5);
+this.dockTo=new dojox.layout.Dock({id:_2,autoPosition:"south"},_3);
 this.dockTo.startup();
 }
 if((this.domNode.style.display=="none")||(this.domNode.style.visibility=="hidden")){
@@ -80,9 +77,9 @@ this.connect(this.focusNode,"onmousedown","bringToTop");
 this.connect(this.domNode,"onmousedown","bringToTop");
 this.resize(dojo.coords(this.domNode));
 this._started=true;
-},setTitle:function(_6){
-this.titleNode.innerHTML=_6;
-this.title=_6;
+},setTitle:function(_4){
+dojo.deprecated("pane.setTitle","Use pane.attr('title', someTitle)","2.0");
+this.attr("title",_4);
 },close:function(){
 if(!this.closable){
 return;
@@ -91,26 +88,26 @@ dojo.unsubscribe(this._listener);
 this.hide(dojo.hitch(this,function(){
 this.destroyRecursive();
 }));
-},hide:function(_7){
+},hide:function(_5){
 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(_7){
-_7();
+if(_5){
+_5();
 }
 })}).play();
-},show:function(_8){
-var _9=dojo.fadeIn({node:this.domNode,duration:this.duration,beforeBegin:dojo.hitch(this,function(){
+},show:function(_6){
+var _7=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 _8=="function"){
-_8();
+if(typeof _6=="function"){
+_6();
 }
 this._isDocked=false;
 if(this._dockNode){
@@ -127,7 +124,7 @@ this.hide(dojo.hitch(this,"_dock"));
 if(this._maximized){
 return;
 }
-this._naturalState=dojo.coords(this.domNode);
+this._naturalState=dojo.position(this.domNode);
 if(this._isDocked){
 this.show();
 setTimeout(dojo.hitch(this,"maximize"),this.duration);
@@ -146,32 +143,33 @@ if(!this._isDocked&&this.dockable){
 this._dockNode=this.dockTo.addNode(this);
 this._isDocked=true;
 }
-},resize:function(_a){
-this._currentState=_a;
-var _b=this.domNode.style;
-if(_a.t){
-_b.top=_a.t+"px";
+},resize:function(_8){
+_8=_8||this._naturalState;
+this._currentState=_8;
+var _9=this.domNode.style;
+if("t" in _8){
+_9.top=_8.t+"px";
 }
-if(_a.l){
-_b.left=_a.l+"px";
+if("l" in _8){
+_9.left=_8.l+"px";
 }
-_b.width=_a.w+"px";
-_b.height=_a.h+"px";
-var _c={l:0,t:0,w:_a.w,h:(_a.h-this.focusNode.offsetHeight)};
-dojo.marginBox(this.canvas,_c);
+_9.width=_8.w+"px";
+_9.height=_8.h+"px";
+var _a={l:0,t:0,w:_8.w,h:(_8.h-this.focusNode.offsetHeight)};
+dojo.marginBox(this.canvas,_a);
 this._checkIfSingleChild();
 if(this._singleChild&&this._singleChild.resize){
-this._singleChild.resize(_c);
+this._singleChild.resize(_a);
 }
 },bringToTop:function(){
-var _d=dojo.filter(this._allFPs,function(i){
+var _b=dojo.filter(this._allFPs,function(i){
 return i!==this;
 },this);
-_d.sort(function(a,b){
+_b.sort(function(a,b){
 return a.domNode.style.zIndex-b.domNode.style.zIndex;
 });
-_d.push(this);
-dojo.forEach(_d,function(w,x){
+_b.push(this);
+dojo.forEach(_b,function(w,x){
 w.domNode.style.zIndex=this._startZ+(x*2);
 dojo.removeClass(w.domNode,"dojoxFloatingPaneFg");
 },this);
@@ -183,16 +181,14 @@ this._resizeHandle.destroy();
 }
 this.inherited(arguments);
 }});
-dojo.declare("dojox.layout.Dock",[dijit._Widget,dijit._Templated],{templateString:"<div class=\"dojoxDock\"><ul dojoAttachPoint=\"containerNode\" class=\"dojoxDockList\"></ul></div>",_docked:[],_inPositioning:false,autoPosition:false,addNode:function(_13){
-var div=document.createElement("li");
-this.containerNode.appendChild(div);
-var _15=new dojox.layout._DockNode({title:_13.title,paneRef:_13},div);
-_15.startup();
-return _15;
+dojo.declare("dojox.layout.Dock",[dijit._Widget,dijit._Templated],{templateString:"<div class=\"dojoxDock\"><ul dojoAttachPoint=\"containerNode\" class=\"dojoxDockList\"></ul></div>",_docked:[],_inPositioning:false,autoPosition:false,addNode:function(_c){
+var _d=dojo.create("li",null,this.containerNode),_e=new dojox.layout._DockNode({title:_c.title,paneRef:_c},_d);
+_e.startup();
+return _e;
 },startup:function(){
 if(this.id=="dojoxGlobalFloatingDock"||this.isFixedDock){
-dojo.connect(window,"onresize",this,"_positionDock");
-dojo.connect(window,"onscroll",this,"_positionDock");
+this.connect(window,"onresize","_positionDock");
+this.connect(window,"onscroll","_positionDock");
 if(dojo.isIE){
 this.connect(this.domNode,"onresize","_positionDock");
 }
@@ -204,11 +200,11 @@ if(!this._inPositioning){
 if(this.autoPosition=="south"){
 setTimeout(dojo.hitch(this,function(){
 this._inPositiononing=true;
-var _17=dijit.getViewport();
+var _f=dijit.getViewport();
 var s=this.domNode.style;
-s.left=_17.l+"px";
-s.width=(_17.w-2)+"px";
-s.top=(_17.h+_17.t)-this.domNode.offsetHeight+"px";
+s.left=_f.l+"px";
+s.width=(_f.w-2)+"px";
+s.top=(_f.h+_f.t)-this.domNode.offsetHeight+"px";
 this._inPositioning=false;
 }),125);
 }
@@ -217,6 +213,9 @@ this._inPositioning=false;
 dojo.declare("dojox.layout._DockNode",[dijit._Widget,dijit._Templated],{title:"",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(){
 this.paneRef.show();
 this.paneRef.bringToTop();
+if(!this.paneRef.isLoaded){
+this.paneRef.refresh();
+}
 this.destroy();
 }});
 }
diff --git a/dojox/layout/GridContainer.js b/dojox/layout/GridContainer.js
index 13d62dc..27a28c2 100644
--- a/dojox/layout/GridContainer.js
+++ b/dojox/layout/GridContainer.js
@@ -15,46 +15,23 @@ dojo.require("dijit._Container");
 dojo.require("dijit._Contained");
 dojo.require("dojo.dnd.move");
 dojo.require("dojox.layout.dnd.PlottedDnd");
-dojo.requireLocalization("dojox.layout","GridContainer",null,"ROOT,en,fr");
-dojo.declare("dojox.layout.GridContainer",[dijit._Widget,dijit._Templated,dijit._Container,dijit._Contained],{templateString:"<div id=\"${id}\" class=\"gridContainer\" dojoAttachPoint=\"containerNode\" tabIndex=\"0\" dojoAttachEvent=\"onkeypress:_selectFocus\">\n\t<table class=\"gridContainerTable\" dojoAttachPoint=\"gridContainerTable\" cellspacing=\"0\" cellpadding=\"0\">\n\t\t<tbody class=\"gridContainerBody\">\n\t\t\t<tr class=\"gridContainerRow\" dojoAttachPoint=\"gridNode\"></tr>\n [...]
-this.acceptTypes=_1["acceptTypes"]||["dijit.layout.ContentPane"];
-this.dragOffset=_1["dragOffset"]||{x:0,y:0};
-},postMixInProperties:function(){
-this.i18n=dojo.i18n.getLocalization("dojox.layout","GridContainer");
-},_createCells:function(){
+dojo.declare("dojox.layout.GridContainer",[dijit._Widget,dijit._Templated,dijit._Container,dijit._Contained],{templateString:dojo.cache("dojox.layout","resources/GridContainer.html","<div id=\"${id}\" class=\"gridContainer\" dojoAttachPoint=\"containerNode\" tabIndex=\"0\" dojoAttachEvent=\"onkeypress:_selectFocus\">\n\t<table class=\"gridContainerTable\" dojoAttachPoint=\"gridContainerTable\" cellspacing=\"0\" cellpadding=\"0\">\n\t\t<tbody class=\"gridContainerBody\">\n\t\t\t<tr class= [...]
+_1=_1||{};
+this.acceptTypes=_1.acceptTypes||["dijit.layout.ContentPane"];
+this.offsetDrag=_1.offsetDrag||_1.dragOffset||{x:0,y:0};
+},postCreate:function(){
+this.inherited(arguments);
 if(this.nbZones===0){
 this.nbZones=1;
 }
-var _3=100/this.nbZones;
 if(dojo.isIE&&dojo.marginBox(this.gridNode).height){
-var _4=document.createTextNode(" ");
-this.gridNode.appendChild(_4);
+var _3=document.createTextNode(" ");
+this.gridNode.appendChild(_3);
 }
-var _5=[];
-this.cell=[];
-var i=0;
-while(i<this.nbZones){
-var _7=dojo.doc.createElement("td");
-dojo.addClass(_7,"gridContainerZone");
-_7.id=this.id+"_dz"+i;
-_7.style.width=_3+"%";
-var _8=this.gridNode.appendChild(_7);
-this.cell[i]=_8;
-i++;
+for(var i=0;i<this.nbZones;i++){
+var _4=dojo.create("td",{id:this.id+"_dz"+i,className:"gridContainerZone",style:{width:this._getColWidth(i)+"%"}},this.gridNode);
 }
 },startup:function(){
-this.inherited(arguments);
-this._createCells();
-if(this.usepref!==true){
-this[(this.isAutoOrganized?"_organizeServices":"_organizeServicesManually")]();
-}else{
-return;
-}
-this.init();
-dojo.forEach(this.getChildren(),function(_9){
-!_9.started&&!_9._started&&_9.startup();
-});
-},init:function(){
 this.grid=this._createGrid();
 this.connect(dojo.global,"onresize","onResized");
 this.connect(this,"onDndDrop","_placeGrips");
@@ -64,255 +41,281 @@ if(this.hasResizableColumns){
 this._initPlaceGrips();
 this._placeGrips();
 }
+if(this.usepref!==true){
+this[(this.isAutoOrganized?"_organizeServices":"_organizeServicesManually")]();
+}
+for(var j=0;j<this.grid.length;j++){
+var dz=this.grid[j];
+dojo.forEach(dz.node.childNodes,function(_5){
+dz.setItem(_5.id,{data:_5,type:[_5.getAttribute("dndType")]});
+});
+}
+this.inherited(arguments);
 },destroy:function(){
 for(var i=0;i<this.handleDndStart;i++){
 dojo.disconnect(this.handleDndStart[i]);
 }
 dojo.unsubscribe(this.dropHandler);
 this.inherited(arguments);
+},resize:function(){
+dojo.forEach(this.getChildren(),function(_6){
+_6.resize&&_6.resize();
+});
+},getZones:function(){
+return dojo.query(".gridContainerZone",this.containerNode);
+},getNewChildren:function(){
+return dojo.query("> [widgetId]",this.containerNode).map(dijit.byNode);
+},getChildren:function(){
+var _7=dojo.query(".gridContainerZone > [widgetId]",this.containerNode).map(dijit.byNode);
+return _7;
 },onResized:function(){
 if(this.hasResizableColumns){
 this._placeGrips();
-this._oldwidth=this.domNode.offsetWidth;
-this._oldheight=this.domNode.offsetHeight;
 }
 },_organizeServices:function(){
-var _b=this.nbZones;
-var _c=this.getChildren().length;
-var _d=Math.floor(_c/_b);
-var _e=_c%_b;
-var i=0;
-for(var z=0;z<_b;z++){
-for(var r=0;r<_d;r++){
-this._insertService(z,i++,0,true);
+var _8=this.nbZones,_9=this.getNewChildren(),_a=_9.length,_b=Math.floor(_a/_8),_c=_a%_8,i=0;
+for(var z=0;z<_8;z++){
+for(var r=0;r<_b;r++){
+this._insertService(z,i,_9[i],true);
+i++;
 }
-if(_e>0){
+if(_c>0){
 try{
-this._insertService(z,i++,0,true);
+this._insertService(z,i,_9[i],true);
+i++;
 }
 catch(e){
-console.error("Unable to insert service in grid container",e,this.getChildren());
+console.error("Unable to insert service in grid container",e,_9);
 }
-_e--;
+_c--;
 }else{
-if(_d===0){
+if(_b===0){
 break;
 }
 }
 }
 },_organizeServicesManually:function(){
-var _12=this.getChildren();
-for(var i=0;i<_12.length;i++){
+var _d=this.getNewChildren();
+for(var i=0;i<_d.length;i++){
 try{
-this._insertService(_12[i].column-1,i,0,true);
+this._insertService(_d[i].column-1,i,_d[i],true);
 }
 catch(e){
-console.error("Unable to insert service in grid container",e,_12[i]);
+console.error("Unable to insert service in grid container",e,_d[i]);
+}
 }
+},_insertService:function(z,p,_e,_f){
+if(_e===undefined){
+return;
 }
-},_insertService:function(z,p,i,_17){
-var _18=this.cell[z];
-var _19=_18.childNodes.length;
-var _1a=this.getChildren()[(i?i:0)];
-if(typeof (p)=="undefined"||p>_19){
-p=_19;
+var _10=this.getZones()[z];
+var _11=_10.childNodes.length;
+if(p===undefined||p>_11){
+p=_11;
 }
-var _1b=dojo.place(_1a.domNode,_18,p);
-_1a.domNode.setAttribute("tabIndex",0);
-if(!_1a.dragRestriction){
-dojo.addClass(_1a.domNode,"dojoDndItem");
+var _12=dojo.place(_e.domNode,_10,p);
+_e.domNode.setAttribute("tabIndex",0);
+if(!_e.dragRestriction){
+dojo.addClass(_e.domNode,"dojoDndItem");
 }
-if(!_1a.domNode.getAttribute("dndType")){
-_1a.domNode.setAttribute("dndType",_1a.declaredClass);
+if(!_e.domNode.getAttribute("dndType")){
+_e.domNode.setAttribute("dndType",_e.declaredClass);
 }
-dojox.layout.dnd._setGcDndHandle(_1a,this.withHandles,this.handleClasses,_17);
+dojox.layout.dnd._setGcDndHandle(_e,this.withHandles,this.handleClasses,_f);
 if(this.hasResizableColumns){
-if(_1a.onLoad){
-this.connect(_1a,"onLoad","_placeGrips");
+if(_e.onLoad){
+this.connect(_e,"onLoad","_placeGrips");
 }
-if(_1a.onExecError){
-this.connect(_1a,"onExecError","_placeGrips");
+if(_e.onExecError){
+this.connect(_e,"onExecError","_placeGrips");
 }
-if(_1a.onUnLoad){
-this.connect(_1a,"onUnLoad","_placeGrips");
+if(_e.onUnLoad){
+this.connect(_e,"onUnLoad","_placeGrips");
 }
 }
 this._placeGrips();
-return _1a.id;
-},addService:function(_1c,z,p){
-_1c.domNode.id=_1c.id;
-this.addChild(_1c);
+return _e.id;
+},addService:function(_13,z,p){
+return this.addChild(_13,z,p);
+},addChild:function(_14,z,p){
+_14.domNode.id=_14.id;
+if(z<=0){
+z=0;
+}
+var _15=z||0;
 if(p<=0){
 p=0;
 }
-var _1f=this._insertService(z,p);
-this.grid[z].setItem(_1c.id,{data:_1c.domNode,type:[_1c.domNode.getAttribute("dndType")]});
-return _1f;
+var row=p||0;
+var _16=this._insertService(_15,row,_14);
+if(this._started&&!_14._started){
+this.grid[z].setItem(_14.id,{data:_14.domNode,type:[_14.domNode.getAttribute("dndType")]});
+_14.startup();
+}
+return _16;
 },_createGrid:function(){
-var _20=[];
+var _17=[];
 var i=0;
-this.tabDZ=[];
 while(i<this.nbZones){
-var _22=this.cell[i];
-this.tabDZ[i]=this._createZone(_22);
+var _18=this._createZone(this.getZones()[i]);
 if(this.hasResizableColumns&&i!=(this.nbZones-1)){
-this._createGrip(this.tabDZ[i]);
+this._createGrip(_18);
 }
-_20.push(this.tabDZ[i]);
+_17.push(_18);
 i++;
 }
 if(this.hasResizableColumns){
 this.handleDndStart=[];
-for(var j=0;j<this.tabDZ.length;j++){
-var dz=this.tabDZ[j];
-var _25=this;
-this.handleDndStart.push(dojo.connect(dz,"onDndStart",dz,function(_26){
-if(_26==this){
-_25.handleDndInsertNodes=[];
-for(i=0;i<_25.tabDZ.length;i++){
-_25.handleDndInsertNodes.push(dojo.connect(_25.tabDZ[i],"insertNodes",_25,function(){
-_25._disconnectDnd();
+for(var j=0;j<_17.length;j++){
+var dz=_17[j];
+var _19=this;
+this.handleDndStart.push(dojo.connect(dz,"onDndStart",dz,function(_1a){
+if(_1a==this){
+_19.handleDndInsertNodes=[];
+for(i=0;i<_19.grid.length;i++){
+_19.handleDndInsertNodes.push(dojo.connect(_19.grid[i],"insertNodes",_19,function(){
+_19._disconnectDnd();
 }));
 }
-_25.handleDndInsertNodes.push(dojo.connect(dz,"onDndCancel",_25,_25._disconnectDnd));
-_25.onResized();
+_19.handleDndInsertNodes.push(dojo.connect(dz,"onDndCancel",_19,_19._disconnectDnd));
+_19.onResized();
 }
 }));
 }
 }
-return _20;
+return _17;
 },_disconnectDnd:function(){
 dojo.forEach(this.handleDndInsertNodes,dojo.disconnect);
 setTimeout(dojo.hitch(this,"onResized"),0);
-},_createZone:function(_27){
-var dz=null;
-dz=new dojox.layout.dnd.PlottedDnd(_27.id,{accept:this.acceptTypes,withHandles:this.withHandles,handleClasses:this.handleClasses,singular:true,hideSource:true,opacity:this.opacity,dom:this.domNode,allowAutoScroll:this.allowAutoScroll,isOffset:this.isOffset,offsetDrag:this.offsetDrag});
+},_createZone:function(_1b){
+var dz=new dojox.layout.dnd.PlottedDnd(_1b.id,{accept:this.acceptTypes,withHandles:this.withHandles,handleClasses:this.handleClasses,singular:true,hideSource:true,opacity:this.opacity,dom:this.domNode,allowAutoScroll:this.allowAutoScroll,isOffset:this.isOffset,offsetDrag:this.offsetDrag});
 this.connect(dz,"insertDashedZone","_placeGrips");
 this.connect(dz,"deleteDashedZone","_placeGrips");
 return dz;
 },_createGrip:function(dz){
-var _2a=document.createElement("div");
-_2a.className="gridContainerGrip";
-_2a.setAttribute("tabIndex","0");
-var _2b=this;
-this.onMouseOver=this.connect(_2a,"onmouseover",function(e){
-var _2d=false;
-for(var i=0;i<_2b.grid.length-1;i++){
-if(dojo.hasClass(_2b.grid[i].grip,"gridContainerGripShow")){
-_2d=true;
+var _1c=document.createElement("div");
+_1c.className="gridContainerGrip";
+_1c.setAttribute("tabIndex","0");
+var _1d=this;
+this.onMouseOver=this.connect(_1c,"onmouseover",function(e){
+var _1e=false;
+for(var i=0;i<_1d.grid.length-1;i++){
+if(dojo.hasClass(_1d.grid[i].grip,"gridContainerGripShow")){
+_1e=true;
 break;
 }
 }
-if(!_2d){
+if(!_1e){
 dojo.removeClass(e.target,"gridContainerGrip");
 dojo.addClass(e.target,"gridContainerGripShow");
 }
 });
-this.connect(_2a,"onmouseout",function(e){
-if(!_2b._isResized){
+this.connect(_1c,"onmouseout",function(e){
+if(!_1d._isResized){
 dojo.removeClass(e.target,"gridContainerGripShow");
 dojo.addClass(e.target,"gridContainerGrip");
 }
 });
-this.connect(_2a,"onmousedown",function(e){
-_2b._a11yOn=false;
-_2b._activeGrip=e.target;
-_2b.resizeColumnOn(e);
+this.connect(_1c,"onmousedown",function(e){
+_1d._a11yOn=false;
+_1d._activeGrip=e.target;
+_1d.resizeColumnOn(e);
 });
-this.domNode.appendChild(_2a);
-dz.grip=_2a;
+this.domNode.appendChild(_1c);
+dz.grip=_1c;
 },_initPlaceGrips:function(){
 var dcs=dojo.getComputedStyle(this.domNode);
-var gcs=dojo.getComputedStyle(this.gridContainerTable);
 this._x=parseInt(dcs.paddingLeft);
-this._topGrip=parseInt(dcs.paddingTop);
-if(dojo.isIE||gcs.borderCollapse!="collapse"){
+var _1f=parseInt(dcs.paddingTop);
+if(dojo.isIE||dojo.getComputedStyle(this.gridContainerTable).borderCollapse!="collapse"){
 var ex=dojo._getBorderExtents(this.gridContainerTable);
 this._x+=ex.l;
-this._topGrip+=ex.t;
+_1f+=ex.t;
 }
-this._topGrip+="px";
-dojo.forEach(this.grid,function(_34){
-if(_34.grip){
-var _35=_34.grip;
+_1f+="px";
+for(var z=0;z<this.grid.length;z++){
+var _20=this.grid[z];
+if(_20.grip){
+var _21=_20.grip;
 if(!dojo.isIE){
-_34.pad=dojo._getPadBorderExtents(_34.node).w;
+_20.pad=dojo._getPadBorderExtents(_20.node).w;
+}
+_21.style.top=_1f;
 }
-_35.style.top=this._topGrip;
 }
-},this);
 },_placeGrips:function(){
-var _36;
+var _22;
+var _23=this._x;
+dojo.forEach(this.grid,function(_24){
+if(_24.grip){
+if(_22===undefined){
 if(this.allowAutoScroll){
-_36=this.gridNode.scrollHeight;
+_22=this.gridNode.scrollHeight;
 }else{
-_36=dojo.contentBox(this.gridNode).h;
+_22=dojo.contentBox(this.gridNode).h;
+}
 }
-var _37=this._x;
-dojo.forEach(this.grid,function(_38){
-if(_38.grip){
-var _39=_38.grip;
-_37+=dojo[(dojo.isIE?"marginBox":"contentBox")](_38.node).w+(dojo.isIE?0:_38.pad);
-dojo.style(_39,{left:_37+"px",height:_36+"px"});
+var _25=_24.grip;
+_23+=dojo[(dojo.isIE?"marginBox":"contentBox")](_24.node).w+(dojo.isIE?0:_24.pad);
+dojo.style(_25,{left:_23+"px",height:_22+"px"});
 }
 },this);
 },_getZoneByIndex:function(n){
 return this.grid[(n>=0&&n<this.grid.length?n:0)];
-},getIndexZone:function(_3b){
+},getIndexZone:function(_26){
 for(var z=0;z<this.grid.length;z++){
-if(this.grid[z].domNode==_3b){
+if(this.grid[z].node.id==_26.id){
 return z;
 }
 }
 return -1;
 },resizeColumnOn:function(e){
 var k=dojo.keys;
-if(this._a11yOn&&e.keyCode!=k.LEFT_ARROW&&e.keyCode!=k.RIGHT_ARROW){
-return;
-}
+var i;
+if(!(this._a11yOn&&e.keyCode!=k.LEFT_ARROW&&e.keyCode!=k.RIGHT_ARROW)){
 e.preventDefault();
 dojo.body().style.cursor="ew-resize";
 this._isResized=true;
 this.initX=e.pageX;
-var _3f=[];
-for(var i=0;i<this.grid.length;i++){
-_3f[i]=dojo.contentBox(this.grid[i].node).w;
+var _27=[];
+for(i=0;i<this.grid.length;i++){
+_27[i]=dojo.contentBox(this.grid[i].node).w;
 }
-this.oldTabSize=_3f;
-for(var i=0;i<this.grid.length;i++){
+this.oldTabSize=_27;
+for(i=0;i<this.grid.length;i++){
 if(this._activeGrip==this.grid[i].grip){
 this.currentColumn=this.grid[i].node;
-this.currentColumnWidth=_3f[i];
+this.currentColumnWidth=_27[i];
 this.nextColumn=this.currentColumn.nextSibling;
-this.nextColumnWidth=_3f[i+1];
+this.nextColumnWidth=_27[i+1];
 }
-this.grid[i].node.style.width=_3f[i]+"px";
+this.grid[i].node.style.width=_27[i]+"px";
 }
-var _41=function(_42,_43){
-var _44=0;
-var _45=0;
-dojo.forEach(_42,function(_46){
-if(_46.nodeType==1){
-var _47=dojo.getComputedStyle(_46);
-var _48=(dojo.isIE?_43:parseInt(_47.minWidth));
-_45=_48+parseInt(_47.marginLeft)+parseInt(_47.marginRight);
-if(_44<_45){
-_44=_45;
+var _28=function(_29,_2a){
+var _2b=0;
+var _2c=0;
+dojo.forEach(_29,function(_2d){
+if(_2d.nodeType==1){
+var _2e=dojo.getComputedStyle(_2d);
+var _2f=(dojo.isIE?_2a:parseInt(_2e.minWidth));
+_2c=_2f+parseInt(_2e.marginLeft)+parseInt(_2e.marginRight);
+if(_2b<_2c){
+_2b=_2c;
 }
 }
 });
-return _44;
+return _2b;
 };
-var _49=_41(this.currentColumn.childNodes,this.minChildWidth);
-var _4a=_41(this.nextColumn.childNodes,this.minChildWidth);
-var _4b=Math.round((dojo.marginBox(this.gridContainerTable).w*this.minColWidth)/100);
-this.currentMinCol=_49;
-this.nextMinCol=_4a;
-if(_4b>this.currentMinCol){
-this.currentMinCol=_4b;
+var _30=_28(this.currentColumn.childNodes,this.minChildWidth);
+var _31=_28(this.nextColumn.childNodes,this.minChildWidth);
+var _32=Math.round((dojo.marginBox(this.gridContainerTable).w*this.minColWidth)/100);
+this.currentMinCol=_30;
+this.nextMinCol=_31;
+if(_32>this.currentMinCol){
+this.currentMinCol=_32;
 }
-if(_4b>this.nextMinCol){
-this.nextMinCol=_4b;
+if(_32>this.nextMinCol){
+this.nextMinCol=_32;
 }
 if(this._a11yOn){
 this.connectResizeColumnMove=this.connect(dojo.doc,"onkeypress","resizeColumnMove");
@@ -320,6 +323,7 @@ this.connectResizeColumnMove=this.connect(dojo.doc,"onkeypress","resizeColumnMov
 this.connectResizeColumnMove=this.connect(dojo.doc,"onmousemove","resizeColumnMove");
 this.connectResizeColumnOff=this.connect(document,"onmouseup","resizeColumnOff");
 }
+}
 },resizeColumnMove:function(e){
 var d=0;
 if(this._a11yOn){
@@ -360,30 +364,31 @@ this._a11yOn=false;
 this.disconnect(this.connectResizeColumnMove);
 this.disconnect(this.connectResizeColumnOff);
 }
-var _50=[];
-var _51=[];
-var _52=this.gridContainerTable.clientWidth;
-for(var i=0;i<this.grid.length;i++){
-var _cb=dojo.contentBox(this.grid[i].node);
+var _33=[];
+var _34=[];
+var _35=this.gridContainerTable.clientWidth;
+var i;
+for(i=0;i<this.grid.length;i++){
+var _36=dojo.contentBox(this.grid[i].node);
 if(dojo.isIE){
-_50[i]=dojo.marginBox(this.grid[i].node).w;
-_51[i]=_cb.w;
+_33[i]=dojo.marginBox(this.grid[i].node).w;
+_34[i]=_36.w;
 }else{
-_50[i]=_cb.w;
-_51=_50;
+_33[i]=_36.w;
+_34=_33;
 }
 }
-var _55=false;
-for(var i=0;i<_51.length;i++){
-if(_51[i]!=this.oldTabSize[i]){
-_55=true;
+var _37=false;
+for(i=0;i<_34.length;i++){
+if(_34[i]!=this.oldTabSize[i]){
+_37=true;
 break;
 }
 }
-if(_55){
+if(_37){
 var mul=dojo.isIE?100:10000;
-for(var i=0;i<this.grid.length;i++){
-this.grid[i].node.style.width=Math.round((100*mul*_50[i])/_52)/mul+"%";
+for(i=0;i<this.grid.length;i++){
+this.grid[i].node.style.width=Math.round((100*mul*_33[i])/_35)/mul+"%";
 }
 this._placeGrips();
 }
@@ -392,140 +397,128 @@ dojo.removeClass(this._activeGrip,"gridContainerGripShow");
 dojo.addClass(this._activeGrip,"gridContainerGrip");
 }
 this._isResized=false;
-},setColumns:function(_57){
-if(_57>0){
-var _58=this.grid.length-_57;
-if(_58>0){
-var _59=[];
-var _5a,_5b,end;
+},setColumns:function(_38){
+var _39;
+if(_38>0){
+var _3a=this.grid.length-_38;
+if(_3a>0){
+var _3b=[];
+var _3c,end,z,_3d,j;
 if(this.mode=="right"){
 end=(this.isLeftFixed&&this.grid.length>0)?1:0;
-_5b=this.grid.length-(this.isRightFixed?2:1);
-for(var z=_5b;z>=end;z--){
-var _5e=0;
-var _5a=this.grid[z].node;
-for(var j=0;j<_5a.childNodes.length;j++){
-if(_5a.childNodes[j].nodeType==1&&!(_5a.childNodes[j].id=="")){
-_5e++;
+_3c=this.grid.length-(this.isRightFixed?2:1);
+for(z=_3c;z>=end;z--){
+_3d=0;
+_39=this.grid[z].node;
+for(j=0;j<_39.childNodes.length;j++){
+if(_39.childNodes[j].nodeType==1&&!(_39.childNodes[j].id=="")){
+_3d++;
 break;
 }
 }
-if(_5e==0){
-_59[_59.length]=z;
+if(_3d==0){
+_3b[_3b.length]=z;
 }
-if(_59.length>=_58){
-this._deleteColumn(_59);
+if(_3b.length>=_3a){
+this._deleteColumn(_3b);
 break;
 }
 }
-if(_59.length<_58){
-console.error(this.i18n.err_onSetNbColsRightMode);
+if(_3b.length<_3a){
+console.error("Move boxes in first columns, in all tabs before changing the organization of the page");
 }
 }else{
-if(this.isLeftFixed&&this.grid.length>0){
-_5b=1;
-}else{
-_5b=0;
-}
-if(this.isRightFixed){
-end=this.grid.length-1;
-}else{
+_3c=(this.isLeftFixed&&this.grid.length>0)?1:0;
 end=this.grid.length;
-}
-for(var z=_5b;z<end;z++){
-var _5e=0;
-var _5a=this.grid[z].node;
-for(var j=0;j<_5a.childNodes.length;j++){
-if(_5a.childNodes[j].nodeType==1&&!(_5a.childNodes[j].id=="")){
-_5e++;
+if(this.isRightFixed){
+end--;
+}
+for(z=_3c;z<end;z++){
+_3d=0;
+_39=this.grid[z].node;
+for(j=0;j<_39.childNodes.length;j++){
+if(_39.childNodes[j].nodeType==1&&!(_39.childNodes[j].id=="")){
+_3d++;
 break;
 }
 }
-if(_5e==0){
-_59[_59.length]=z;
+if(_3d==0){
+_3b[_3b.length]=z;
 }
-if(_59.length>=_58){
-this._deleteColumn(_59);
+if(_3b.length>=_3a){
+this._deleteColumn(_3b);
 break;
 }
 }
-if(_59.length<_58){
-alert(this.i18n.err_onSetNbColsLeftMode);
+if(_3b.length<_3a){
+console.warn("Move boxes in last columns, in all tabs before changing the organization of the page");
 }
 }
 }else{
-if(_58<0){
-this._addColumn(Math.abs(_58));
+if(_3a<0){
+this._addColumn(Math.abs(_3a));
 }
 }
 this._initPlaceGrips();
 this._placeGrips();
 }
-},_addColumn:function(_60){
-var _61;
+},_addColumn:function(_3e){
+var _3f;
 if(this.hasResizableColumns&&!this.isRightFixed&&this.mode=="right"){
-_61=this.grid[this.grid.length-1];
-this._createGrip(_61);
+_3f=this.grid[this.grid.length-1];
+this._createGrip(_3f);
 }
-for(var i=0;i<_60;i++){
-_61=dojo.doc.createElement("td");
-dojo.addClass(_61,"gridContainerZone");
-_61.id=this.id+"_dz"+this.nbZones;
+for(var i=0;i<_3e;i++){
+_3f=dojo.doc.createElement("td");
+dojo.addClass(_3f,"gridContainerZone");
+_3f.id=this.id+"_dz"+this.nbZones;
 var dz;
 if(this.mode=="right"){
 if(this.isRightFixed){
-this.grid[this.grid.length-1].node.parentNode.insertBefore(_61,this.grid[this.grid.length-1].node);
-dz=this._createZone(_61);
-this.tabDZ.splice(this.tabDZ.length-1,0,dz);
+this.grid[this.grid.length-1].node.parentNode.insertBefore(_3f,this.grid[this.grid.length-1].node);
+dz=this._createZone(_3f);
 this.grid.splice(this.grid.length-1,0,dz);
-this.cell.splice(this.cell.length-1,0,_61);
 }else{
-var _64=this.gridNode.appendChild(_61);
-dz=this._createZone(_61);
-this.tabDZ.push(dz);
+var _40=this.gridNode.appendChild(_3f);
+dz=this._createZone(_3f);
 this.grid.push(dz);
-this.cell.push(_61);
 }
 }else{
 if(this.isLeftFixed){
-(this.grid.length==1)?this.grid[0].node.parentNode.appendChild(_61,this.grid[0].node):this.grid[1].node.parentNode.insertBefore(_61,this.grid[1].node);
-dz=this._createZone(_61);
-this.tabDZ.splice(1,0,dz);
+(this.grid.length==1)?this.grid[0].node.parentNode.appendChild(_3f,this.grid[0].node):this.grid[1].node.parentNode.insertBefore(_3f,this.grid[1].node);
+dz=this._createZone(_3f);
 this.grid.splice(1,0,dz);
-this.cell.splice(1,0,_61);
 }else{
-this.grid[this.grid.length-this.nbZones].node.parentNode.insertBefore(_61,this.grid[this.grid.length-this.nbZones].node);
-dz=this._createZone(_61);
-this.tabDZ.splice(this.tabDZ.length-this.nbZones,0,dz);
+this.grid[this.grid.length-this.nbZones].node.parentNode.insertBefore(_3f,this.grid[this.grid.length-this.nbZones].node);
+dz=this._createZone(_3f);
 this.grid.splice(this.grid.length-this.nbZones,0,dz);
-this.cell.splice(this.cell.length-this.nbZones,0,_61);
 }
 }
 if(this.hasResizableColumns){
-var _65=this;
-var _66=dojo.connect(dz,"onDndStart",dz,function(_67){
-if(_67==this){
-_65.handleDndInsertNodes=[];
-for(var o=0;o<_65.tabDZ.length;o++){
-_65.handleDndInsertNodes.push(dojo.connect(_65.tabDZ[o],"insertNodes",_65,function(){
-_65._disconnectDnd();
+var _41=this;
+var _42=dojo.connect(dz,"onDndStart",dz,function(_43){
+if(_43==this){
+_41.handleDndInsertNodes=[];
+for(var o=0;o<_41.grid.length;o++){
+_41.handleDndInsertNodes.push(dojo.connect(_41.grid[o],"insertNodes",_41,function(){
+_41._disconnectDnd();
 }));
 }
-_65.handleDndInsertNodes.push(dojo.connect(dz,"onDndCancel",_65,_65._disconnectDnd));
-_65.onResized();
+_41.handleDndInsertNodes.push(dojo.connect(dz,"onDndCancel",_41,_41._disconnectDnd));
+_41.onResized();
 }
 });
 if(this.mode=="right"){
 if(this.isRightFixed){
-this.handleDndStart.splice(this.handleDndStart.length-1,0,_66);
+this.handleDndStart.splice(this.handleDndStart.length-1,0,_42);
 }else{
-this.handleDndStart.push(_66);
+this.handleDndStart.push(_42);
 }
 }else{
 if(this.isLeftFixed){
-this.handleDndStart.splice(1,0,_66);
+this.handleDndStart.splice(1,0,_42);
 }else{
-this.handleDndStart.splice(this.handleDndStart.length-this.nbZones,0,_66);
+this.handleDndStart.splice(this.handleDndStart.length-this.nbZones,0,_42);
 }
 }
 this._createGrip(dz);
@@ -533,239 +526,243 @@ this._createGrip(dz);
 this.nbZones++;
 }
 this._updateColumnsWidth();
-},_deleteColumn:function(_69){
-var _6a,_6b,_6c;
-_6c=0;
-for(var i=0;i<_69.length;i++){
-var idx=_69[i];
+},_deleteColumn:function(_44){
+var _45,_46,_47;
+_47=0;
+for(var i=0;i<_44.length;i++){
+var idx=_44[i];
 if(this.mode=="right"){
-_6a=this.grid[idx];
+_45=this.grid[idx];
 }else{
-_6a=this.grid[idx-_6c];
+_45=this.grid[idx-_47];
 }
-for(var j=0;j<_6a.node.childNodes.length;j++){
-if(_6a.node.childNodes[j].nodeType!=1){
+for(var j=0;j<_45.node.childNodes.length;j++){
+if(_45.node.childNodes[j].nodeType!=1){
 continue;
 }
-_6b=dijit.byId(_6a.node.childNodes[j].id);
+_46=dijit.byId(_45.node.childNodes[j].id);
 for(var x=0;x<this.getChildren().length;x++){
-if(this.getChildren()[x]===_6b){
+if(this.getChildren()[x]===_46){
 this.getChildren().splice(x,1);
 break;
 }
 }
 }
-_6a.node.parentNode.removeChild(_6a.node);
+_45.node.parentNode.removeChild(_45.node);
 if(this.mode=="right"){
 if(this.hasResizableColumns){
 dojo.disconnect(this.handleDndStart[idx]);
 }
 this.grid.splice(idx,1);
-this.tabDZ.splice(idx,1);
-this.cell.splice(idx,1);
 }else{
 if(this.hasResizableColumns){
-dojo.disconnect(this.handleDndStart[idx-_6c]);
+dojo.disconnect(this.handleDndStart[idx-_47]);
 }
-this.grid.splice(idx-_6c,1);
-this.tabDZ.splice(idx-_6c,1);
-this.cell.splice(idx-_6c,1);
+this.grid.splice(idx-_47,1);
 }
 this.nbZones--;
-_6c++;
-if(_6a.grip){
-this.domNode.removeChild(_6a.grip);
+_47++;
+if(_45.grip){
+this.domNode.removeChild(_45.grip);
 }
 }
 this._updateColumnsWidth();
+},_getColWidth:function(idx){
+if(idx<this.colWidths.length){
+return this.colWidths[idx];
+}
+var _48=100;
+dojo.forEach(this.colWidths,function(_49){
+_48-=_49;
+});
+return _48/(this.nbZones-this.colWidths.length);
 },_updateColumnsWidth:function(){
-var _71=100/this.nbZones;
-var _72;
+var _4a;
 for(var z=0;z<this.grid.length;z++){
-_72=this.grid[z].node;
-_72.style.width=_71+"%";
-}
-},_selectFocus:function(_74){
-var e=_74.keyCode;
-var _76=null;
-var _77=dijit.getFocus();
-var _78=_77.node;
+this.grid[z].node.style.width=this._getColWidth(z)+"%";
+}
+},_selectFocus:function(_4b){
+var e=_4b.keyCode;
+var _4c=null;
+var _4d=dijit.getFocus();
+var _4e=_4d.node;
 var k=dojo.keys;
-var _7a=(e==k.UP_ARROW||e==k.LEFT_ARROW)?"lastChild":"firstChild";
+var i,_4f,_50,r,z,_51;
+var _52=(e==k.UP_ARROW||e==k.LEFT_ARROW)?"lastChild":"firstChild";
 var pos=(e==k.UP_ARROW||e==k.LEFT_ARROW)?"previousSibling":"nextSibling";
-if(_78==this.containerNode){
+if(_4e==this.containerNode){
 switch(e){
 case k.DOWN_ARROW:
 case k.RIGHT_ARROW:
-for(var i=0;i<this.gridNode.childNodes.length;i++){
-_76=this.gridNode.childNodes[i].firstChild;
-var _7d=false;
-while(!_7d){
-if(_76!=null){
-if(_76.style.display!=="none"){
-dijit.focus(_76);
-dojo.stopEvent(_74);
-_7d=true;
+for(i=0;i<this.gridNode.childNodes.length;i++){
+_4c=this.gridNode.childNodes[i].firstChild;
+_4f=false;
+while(!_4f){
+if(_4c!=null){
+if(_4c.style.display!=="none"){
+dijit.focus(_4c);
+dojo.stopEvent(_4b);
+_4f=true;
 }else{
-_76=_76[pos];
+_4c=_4c[pos];
 }
 }else{
 break;
 }
 }
-if(_7d){
+if(_4f){
 break;
 }
 }
 break;
 case k.UP_ARROW:
 case k.LEFT_ARROW:
-for(var i=this.gridNode.childNodes.length-1;i>=0;i--){
-_76=this.gridNode.childNodes[i].lastChild;
-var _7d=false;
-while(!_7d){
-if(_76!=null){
-if(_76.style.display!=="none"){
-dijit.focus(_76);
-dojo.stopEvent(_74);
-_7d=true;
+for(i=this.gridNode.childNodes.length-1;i>=0;i--){
+_4c=this.gridNode.childNodes[i].lastChild;
+_4f=false;
+while(!_4f){
+if(_4c!=null){
+if(_4c.style.display!=="none"){
+dijit.focus(_4c);
+dojo.stopEvent(_4b);
+_4f=true;
 }else{
-_76=_76[pos];
+_4c=_4c[pos];
 }
 }else{
 break;
 }
 }
-if(_7d){
+if(_4f){
 break;
 }
 }
 break;
 }
 }else{
-if(_78.parentNode.parentNode==this.gridNode){
+if(_4e.parentNode.parentNode==this.gridNode){
 switch(e){
 case k.UP_ARROW:
 case k.DOWN_ARROW:
-dojo.stopEvent(_74);
-var _7e=0;
-dojo.forEach(_78.parentNode.childNodes,function(_7f){
-if(_7f.style.display!=="none"){
-_7e++;
+dojo.stopEvent(_4b);
+var _53=0;
+dojo.forEach(_4e.parentNode.childNodes,function(_54){
+if(_54.style.display!=="none"){
+_53++;
 }
 });
-if(_7e==1){
+if(_53==1){
 return;
 }
-var _7d=false;
-_76=_78[pos];
-while(!_7d){
-if(_76==null){
-_76=_78.parentNode[_7a];
-if(_76.style.display!=="none"){
-_7d=true;
+_4f=false;
+_4c=_4e[pos];
+while(!_4f){
+if(_4c==null){
+_4c=_4e.parentNode[_52];
+if(_4c.style.display!=="none"){
+_4f=true;
 }else{
-_76=_76[pos];
+_4c=_4c[pos];
 }
 }else{
-if(_76.style.display!=="none"){
-_7d=true;
+if(_4c.style.display!=="none"){
+_4f=true;
 }else{
-_76=_76[pos];
+_4c=_4c[pos];
 }
 }
 }
-if(_74.shiftKey){
-if(dijit.byNode(_78).dragRestriction){
+if(_4b.shiftKey){
+if(dijit.byNode(_4e).dragRestriction){
 return;
 }
-var _80=_78.getAttribute("dndtype");
-var _81=false;
-for(var i=0;i<this.acceptTypes.length;i++){
-if(_80==this.acceptTypes[i]){
-var _81=true;
+_51=_4e.getAttribute("dndtype");
+_50=false;
+for(i=0;i<this.acceptTypes.length;i++){
+if(_51==this.acceptTypes[i]){
+_50=true;
 break;
 }
 }
-if(_81){
-var _82=_78.parentNode;
-var _83=_82.firstChild;
-var _84=_82.lastChild;
-while(_83.style.display=="none"||_84.style.display=="none"){
-if(_83.style.display=="none"){
-_83=_83.nextSibling;
+if(_50){
+var _55=_4e.parentNode;
+var _56=_55.firstChild;
+var _57=_55.lastChild;
+while(_56.style.display=="none"||_57.style.display=="none"){
+if(_56.style.display=="none"){
+_56=_56.nextSibling;
 }
-if(_84.style.display=="none"){
-_84=_84.previousSibling;
+if(_57.style.display=="none"){
+_57=_57.previousSibling;
 }
 }
 if(e==k.UP_ARROW){
-var r=_82.removeChild(_78);
-if(r==_83){
-_82.appendChild(r);
+r=_55.removeChild(_4e);
+if(r==_56){
+_55.appendChild(r);
 }else{
-_82.insertBefore(r,_76);
+_55.insertBefore(r,_4c);
 }
 r.setAttribute("tabIndex","0");
 dijit.focus(r);
 }else{
-if(_78==_84){
-var r=_82.removeChild(_78);
-_82.insertBefore(r,_76);
+if(_4e==_57){
+r=_55.removeChild(_4e);
+_55.insertBefore(r,_4c);
 r.setAttribute("tabIndex","0");
 dijit.focus(r);
 }else{
-var r=_82.removeChild(_76);
-_82.insertBefore(r,_78);
-_78.setAttribute("tabIndex","0");
-dijit.focus(_78);
+r=_55.removeChild(_4c);
+_55.insertBefore(r,_4e);
+_4e.setAttribute("tabIndex","0");
+dijit.focus(_4e);
 }
 }
 }else{
 this._displayPopup();
 }
 }else{
-dijit.focus(_76);
+dijit.focus(_4c);
 }
 break;
 case k.RIGHT_ARROW:
 case k.LEFT_ARROW:
-dojo.stopEvent(_74);
-if(_74.shiftKey){
-if(dijit.byNode(_78).dragRestriction){
+dojo.stopEvent(_4b);
+if(_4b.shiftKey){
+if(dijit.byNode(_4e).dragRestriction){
 return;
 }
-var z=0;
-if(_78.parentNode[pos]==null){
+z=0;
+if(_4e.parentNode[pos]==null){
 if(e==k.LEFT_ARROW){
-var z=this.gridNode.childNodes.length-1;
+z=this.gridNode.childNodes.length-1;
 }
 }else{
-if(_78.parentNode[pos].nodeType==3){
+if(_4e.parentNode[pos].nodeType==3){
 z=this.gridNode.childNodes.length-2;
 }else{
-for(var i=0;i<this.gridNode.childNodes.length;i++){
-if(_78.parentNode[pos]==this.gridNode.childNodes[i]){
+for(i=0;i<this.gridNode.childNodes.length;i++){
+if(_4e.parentNode[pos]==this.gridNode.childNodes[i]){
 break;
 }
 z++;
 }
 }
 }
-var _80=_78.getAttribute("dndtype");
-var _81=false;
-for(var i=0;i<this.acceptTypes.length;i++){
-if(_80==this.acceptTypes[i]){
-_81=true;
+_51=_4e.getAttribute("dndtype");
+_50=false;
+for(i=0;i<this.acceptTypes.length;i++){
+if(_51==this.acceptTypes[i]){
+_50=true;
 break;
 }
 }
-if(_81){
-var _87=_78.parentNode;
-var _88=dijit.byNode(_78);
-var r=_87.removeChild(_78);
-var _89=(e==k.RIGHT_ARROW?0:this.gridNode.childNodes[z].length);
-this.addService(_88,z,_89);
+if(_50){
+var _58=_4e.parentNode;
+var _59=dijit.byNode(_4e);
+r=_58.removeChild(_4e);
+var _5a=(e==k.RIGHT_ARROW?0:this.gridNode.childNodes[z].length);
+this.addService(_59,z,_5a);
 r.setAttribute("tabIndex","0");
 dijit.focus(r);
 this._placeGrips();
@@ -773,54 +770,54 @@ this._placeGrips();
 this._displayPopup();
 }
 }else{
-var _8a=_78.parentNode;
-while(_76===null){
-if(_8a[pos]!==null&&_8a[pos].nodeType!==3){
-_8a=_8a[pos];
+var _5b=_4e.parentNode;
+while(_4c===null){
+if(_5b[pos]!==null&&_5b[pos].nodeType!==3){
+_5b=_5b[pos];
 }else{
 if(pos==="previousSibling"){
-_8a=_8a.parentNode.childNodes[_8a.parentNode.childNodes.length-1];
+_5b=_5b.parentNode.childNodes[_5b.parentNode.childNodes.length-1];
 }else{
-_8a=_8a.parentNode.childNodes[0];
+_5b=_5b.parentNode.childNodes[0];
 }
 }
-var _7d=false;
-var _8b=_8a[_7a];
-while(!_7d){
-if(_8b!=null){
-if(_8b.style.display!=="none"){
-_76=_8b;
-_7d=true;
+_4f=false;
+var _5c=_5b[_52];
+while(!_4f){
+if(_5c!=null){
+if(_5c.style.display!=="none"){
+_4c=_5c;
+_4f=true;
 }else{
-_8b=_8b[pos];
+_5c=_5c[pos];
 }
 }else{
 break;
 }
 }
 }
-dijit.focus(_76);
+dijit.focus(_4c);
 }
 break;
 }
 }else{
-if(dojo.hasClass(_78,"gridContainerGrip")||dojo.hasClass(_78,"gridContainerGripShow")){
-this._activeGrip=_74.target;
+if(dojo.hasClass(_4e,"gridContainerGrip")||dojo.hasClass(_4e,"gridContainerGripShow")){
+this._activeGrip=_4b.target;
 this._a11yOn=true;
-this.resizeColumnOn(_74);
+this.resizeColumnOn(_4b);
 }
 }
 }
 },_displayPopup:function(){
 if(this._canDisplayPopup){
-var _8c=dojo.doc.createElement("div");
-dojo.addClass(_8c,"gridContainerPopup");
-_8c.innerHTML=this.i18n.alertPopup;
-var _8d=this.containerNode.appendChild(_8c);
+var _5d=dojo.doc.createElement("div");
+dojo.addClass(_5d,"gridContainerPopup");
+_5d.innerHTML="this widget type is not accepted to be moved!";
+var _5e=this.containerNode.appendChild(_5d);
 this._canDisplayPopup=false;
 setTimeout(dojo.hitch(this,function(){
-this.containerNode.removeChild(_8d);
-dojo.destroy(_8d);
+this.containerNode.removeChild(_5e);
+dojo.destroy(_5e);
 this._canDisplayPopup=true;
 }),this.timeDisplayPopup);
 }
diff --git a/dojox/layout/README b/dojox/layout/README
index 6802bb2..14d3211 100644
--- a/dojox/layout/README
+++ b/dojox/layout/README
@@ -17,6 +17,7 @@ Project state:
 [ResizeHandle] experimental
 [RotatorContainer] beta
 [ScrollPane] experimental
+[TableContainer] experimental
 
 -------------------------------------------------------------------------------
 Credits
@@ -31,6 +32,7 @@ Credits
 [ResizeHandle] Peter Higgins (dante)
 [RotatorContainer] Chris Barber (cb1)
 [ScrollPane] Peter Higgins (dante), Shane O'Sullivan (sos)
+[TableContainer] Shane O'Sullivan (sos)
 
 -------------------------------------------------------------------------------
 Project description
@@ -72,6 +74,10 @@ Project description
 	dojox.layout.ScrollPane - a dynamically scrolling pane. Adjusts naturally sized content
 	to a "viewport" and scrolls based on relative mouse position. 
 	
+	dojox.layout.TableContainer - A container widget that lays out child widgets using a
+	Table element. It can create labels for each widget, placed either above or
+	beside the widgets.
+	
 -------------------------------------------------------------------------------
 Dependencies
 
diff --git a/dojox/layout/RadioGroup.js b/dojox/layout/RadioGroup.js
index 927dce1..ab05ae5 100644
--- a/dojox/layout/RadioGroup.js
+++ b/dojox/layout/RadioGroup.js
@@ -26,62 +26,62 @@ dojo.style(this.buttonHolder,"display","block");
 if(this.hasButtons){
 dojo.style(_1.domNode,"position","absolute");
 var _2=this.buttonNode.appendChild(dojo.create("td"));
-var n=dojo.create("div",null,_2),_4=dojo.getObject(this.buttonClass),_5=new _4({label:_1.title,page:_1},n);
-dojo.mixin(_1,{_radioButton:_5});
-_5.startup();
+var n=dojo.create("div",null,_2),_3=dojo.getObject(this.buttonClass),_4=new _3({label:_1.title,page:_1},n);
+dojo.mixin(_1,{_radioButton:_4});
+_4.startup();
 }
 _1.domNode.style.display="none";
-},removeChild:function(_6){
-if(this.hasButtons&&_6._radioButton){
-_6._radioButton.destroy();
-delete _6._radioButton;
+},removeChild:function(_5){
+if(this.hasButtons&&_5._radioButton){
+_5._radioButton.destroy();
+delete _5._radioButton;
 }
 this.inherited(arguments);
-},_transition:function(_7,_8){
-this._showChild(_7);
-if(_8){
-this._hideChild(_8);
-}
-if(this.doLayout&&_7.resize){
-_7.resize(this._containerContentBox||this._contentBox);
-}
-},_showChild:function(_9){
-var _a=this.getChildren();
-_9.isFirstChild=(_9==_a[0]);
-_9.isLastChild=(_9==_a[_a.length-1]);
-_9.selected=true;
-_9.domNode.style.display="";
-if(_9._onShow){
-_9._onShow();
+},_transition:function(_6,_7){
+this._showChild(_6);
+if(_7){
+this._hideChild(_7);
+}
+if(this.doLayout&&_6.resize){
+_6.resize(this._containerContentBox||this._contentBox);
+}
+},_showChild:function(_8){
+var _9=this.getChildren();
+_8.isFirstChild=(_8==_9[0]);
+_8.isLastChild=(_8==_9[_9.length-1]);
+_8.selected=true;
+_8.domNode.style.display="";
+if(_8._onShow){
+_8._onShow();
 }else{
-if(_9.onShow){
-_9.onShow();
+if(_8.onShow){
+_8.onShow();
 }
 }
-},_hideChild:function(_b){
-_b.selected=false;
-_b.domNode.style.display="none";
-if(_b.onHide){
-_b.onHide();
+},_hideChild:function(_a){
+_a.selected=false;
+_a.domNode.style.display="none";
+if(_a.onHide){
+_a.onHide();
 }
 }});
-dojo.declare("dojox.layout.RadioGroupFade",dojox.layout.RadioGroup,{_hideChild:function(_c){
-dojo.fadeOut({node:_c.domNode,duration:this.duration,onEnd:dojo.hitch(this,"inherited",arguments)}).play();
-},_showChild:function(_d){
+dojo.declare("dojox.layout.RadioGroupFade",dojox.layout.RadioGroup,{_hideChild:function(_b){
+dojo.fadeOut({node:_b.domNode,duration:this.duration,onEnd:dojo.hitch(this,"inherited",arguments,arguments)}).play();
+},_showChild:function(_c){
 this.inherited(arguments);
-dojo.style(_d.domNode,"opacity",0);
-dojo.fadeIn({node:_d.domNode,duration:this.duration}).play();
+dojo.style(_c.domNode,"opacity",0);
+dojo.fadeIn({node:_c.domNode,duration:this.duration}).play();
 }});
 dojo.declare("dojox.layout.RadioGroupSlide",dojox.layout.RadioGroup,{easing:"dojo.fx.easing.backOut",zTop:99,constructor:function(){
 if(dojo.isString(this.easing)){
 this.easing=dojo.getObject(this.easing);
 }
-},_positionChild:function(_e){
+},_positionChild:function(_d){
 if(!this._size){
 return;
 }
 var rA=true,rB=true;
-switch(_e.slideFrom){
+switch(_d.slideFrom){
 case "bottom":
 rB=!rB;
 break;
@@ -99,31 +99,31 @@ rA=Math.round(Math.random());
 rB=Math.round(Math.random());
 break;
 }
-var _11=rA?"top":"left",val=(rB?"-":"")+(this._size[rA?"h":"w"]+20)+"px";
-dojo.style(_e.domNode,_11,val);
-},_showChild:function(_13){
-var _14=this.getChildren();
-_13.isFirstChild=(_13==_14[0]);
-_13.isLastChild=(_13==_14[_14.length-1]);
-_13.selected=true;
-dojo.style(_13.domNode,{zIndex:this.zTop,display:""});
+var _e=rA?"top":"left",_f=(rB?"-":"")+(this._size[rA?"h":"w"]+20)+"px";
+dojo.style(_d.domNode,_e,_f);
+},_showChild:function(_10){
+var _11=this.getChildren();
+_10.isFirstChild=(_10==_11[0]);
+_10.isLastChild=(_10==_11[_11.length-1]);
+_10.selected=true;
+dojo.style(_10.domNode,{zIndex:this.zTop,display:""});
 if(this._anim&&this._anim.status()=="playing"){
 this._anim.gotoPercent(100,true);
 }
-this._anim=dojo.animateProperty({node:_13.domNode,properties:{left:0,top:0},duration:this.duration,easing:this.easing,onEnd:dojo.hitch(_13,function(){
+this._anim=dojo.animateProperty({node:_10.domNode,properties:{left:0,top:0},duration:this.duration,easing:this.easing,onEnd:dojo.hitch(_10,function(){
 if(this.onShow){
 this.onShow();
 }
 if(this._onShow){
 this._onShow();
 }
-}),beforeBegin:dojo.hitch(this,"_positionChild",_13)});
+}),beforeBegin:dojo.hitch(this,"_positionChild",_10)});
 this._anim.play();
-},_hideChild:function(_15){
-_15.selected=false;
-_15.domNode.style.zIndex=this.zTop-1;
-if(_15.onHide){
-_15.onHide();
+},_hideChild:function(_12){
+_12.selected=false;
+_12.domNode.style.zIndex=this.zTop-1;
+if(_12.onHide){
+_12.onHide();
 }
 }});
 dojo.declare("dojox.layout._RadioButton",[dijit._Widget,dijit._Templated,dijit._Contained],{label:"",page:null,templateString:"<div dojoAttachPoint=\"focusNode\" class=\"dojoxRadioButton\"><span dojoAttachPoint=\"titleNode\" class=\"dojoxRadioButtonLabel\">${label}</span></div>",startup:function(){
diff --git a/dojox/layout/ResizeHandle.js b/dojox/layout/ResizeHandle.js
index 5ad4e30..091d879 100644
--- a/dojox/layout/ResizeHandle.js
+++ b/dojox/layout/ResizeHandle.js
@@ -12,7 +12,7 @@ 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],{targetId:"",targetContainer:null,resizeAxis:"xy",activeResize:false,activeResizeClass:"dojoxResizeHandleClone",animateSizing:true,animateMethod:"chain",animateDuration:225,minHeight:100,minWidth:100,constrainMax:false,maxHeight:0,maxWidth:0,fixedAspect:false,intermediateChanges:false,templateString:"<div dojoAttachPoint=\"resizeHandle\" class=\"dojoxResizeHandle\"><div></div></div>",postCreate:function(){
+dojo.declare("dojox.layout.ResizeHandle",[dijit._Widget,dijit._Templated],{targetId:"",targetContainer:null,resizeAxis:"xy",activeResize:false,activeResizeClass:"dojoxResizeHandleClone",animateSizing:true,animateMethod:"chain",animateDuration:225,minHeight:100,minWidth:100,constrainMax:false,maxHeight:0,maxWidth:0,fixedAspect:false,intermediateChanges:false,startTopic:"/dojo/resize/start",endTopic:"/dojo/resize/stop",templateString:"<div dojoAttachPoint=\"resizeHandle\" class=\"dojoxResi [...]
 this.connect(this.resizeHandle,"onmousedown","_beginSizing");
 if(!this.activeResize){
 this._resizeHelper=dijit.byId("dojoxGlobalResizeHelper");
@@ -49,6 +49,7 @@ break;
 if(this._isSizing){
 return false;
 }
+dojo.publish(this.startTopic,[this]);
 this.targetWidget=dijit.byId(this.targetId);
 this.targetDomNode=this.targetWidget?this.targetWidget.domNode:dojo.byId(this.targetId);
 if(this.targetContainer){
@@ -67,16 +68,16 @@ this.startPoint={x:e.clientX,y:e.clientY};
 var mb=this.targetWidget?dojo.marginBox(this.targetDomNode):dojo.contentBox(this.targetDomNode);
 this.startSize={w:mb.w,h:mb.h};
 if(this.fixedAspect){
-var _5,_6;
+var _2,_3;
 if(mb.w>mb.h){
-_5="w";
-_6=mb.w/mb.h;
+_2="w";
+_3=mb.w/mb.h;
 }else{
-_5="h";
-_6=mb.h/mb.w;
+_2="h";
+_3=mb.h/mb.w;
 }
-this._aspect={prop:_5};
-this._aspect[_5]=_6;
+this._aspect={prop:_2};
+this._aspect[_2]=_3;
 }
 this._pconnects=[];
 this._pconnects.push(dojo.connect(dojo.doc,"onmousemove",this,"_updateSizing"));
@@ -86,11 +87,11 @@ dojo.stopEvent(e);
 if(this.activeResize){
 this._changeSizing(e);
 }else{
-var _8=this._getNewCoords(e);
-if(_8===false){
+var _4=this._getNewCoords(e);
+if(_4===false){
 return;
 }
-this._resizeHelper.resize(_8);
+this._resizeHelper.resize(_4);
 }
 e.preventDefault();
 },_getNewCoords:function(e){
@@ -103,51 +104,51 @@ catch(e){
 return false;
 }
 this._activeResizeLastEvent=e;
-var dx=this.startPoint.x-e.clientX,dy=this.startPoint.y-e.clientY,_c=this.startSize.w-(this._resizeX?dx:0),_d=this.startSize.h-(this._resizeY?dy:0);
-return this._checkConstraints(_c,_d);
-},_checkConstraints:function(_e,_f){
+var dx=this.startPoint.x-e.clientX,dy=this.startPoint.y-e.clientY,_5=this.startSize.w-(this._resizeX?dx:0),_6=this.startSize.h-(this._resizeY?dy:0);
+return this._checkConstraints(_5,_6);
+},_checkConstraints:function(_7,_8){
 if(this.minSize){
 var tm=this.minSize;
-if(_e<tm.w){
-_e=tm.w;
+if(_7<tm.w){
+_7=tm.w;
 }
-if(_f<tm.h){
-_f=tm.h;
+if(_8<tm.h){
+_8=tm.h;
 }
 }
 if(this.constrainMax&&this.maxSize){
 var ms=this.maxSize;
-if(_e>ms.w){
-_e=ms.w;
+if(_7>ms.w){
+_7=ms.w;
 }
-if(_f>ms.h){
-_f=ms.h;
+if(_8>ms.h){
+_8=ms.h;
 }
 }
 if(this.fixedAspect){
 var ta=this._aspect[this._aspect.prop];
-if(_e<_f){
-_f=_e*ta;
+if(_7<_8){
+_8=_7*ta;
 }else{
-if(_f<_e){
-_e=_f*ta;
+if(_8<_7){
+_7=_8*ta;
 }
 }
 }
-return {w:_e,h:_f};
+return {w:_7,h:_8};
 },_changeSizing:function(e){
-var tmp=this._getNewCoords(e);
-if(tmp===false){
+var _9=this._getNewCoords(e);
+if(_9===false){
 return;
 }
 if(this.targetWidget&&dojo.isFunction(this.targetWidget.resize)){
-this.targetWidget.resize(tmp);
+this.targetWidget.resize(_9);
 }else{
 if(this.animateSizing){
-var _15=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})]);
-_15.play();
+var _a=dojo.fx[this.animateMethod]([dojo.animateProperty({node:this.targetDomNode,properties:{width:{start:this.startSize.w,end:_9.w}},duration:this.animateDuration}),dojo.animateProperty({node:this.targetDomNode,properties:{height:{start:this.startSize.h,end:_9.h}},duration:this.animateDuration})]);
+_a.play();
 }else{
-dojo.style(this.targetDomNode,{width:tmp.w+"px",height:tmp.h+"px"});
+dojo.style(this.targetDomNode,{width:_9.w+"px",height:_9.h+"px"});
 }
 }
 if(this.intermediateChanges){
@@ -155,19 +156,27 @@ this.onResize(e);
 }
 },_endSizing:function(e){
 dojo.forEach(this._pconnects,dojo.disconnect);
+var _b=dojo.partial(dojo.publish,this.endTopic,[this]);
 if(!this.activeResize){
 this._resizeHelper.hide();
 this._changeSizing(e);
+setTimeout(_b,this.animateDuration+15);
+}else{
+_b();
 }
 this._isSizing=false;
 this.onResize(e);
 },onResize:function(e){
 }});
 dojo.declare("dojox.layout._ResizeHelper",dijit._Widget,{show:function(){
-dojo.fadeIn({node:this.domNode,duration:120,beforeBegin:dojo.partial(dojo.style,this.domNode,"display","")}).play();
+dojo.fadeIn({node:this.domNode,duration:120,beforeBegin:function(n){
+dojo.style(n,"display","");
+}}).play();
 },hide:function(){
-dojo.fadeOut({node:this.domNode,duration:250,onEnd:dojo.partial(dojo.style,this.domNode,"display","none")}).play();
-},resize:function(dim){
-dojo.marginBox(this.domNode,dim);
+dojo.fadeOut({node:this.domNode,duration:250,onEnd:function(n){
+dojo.style(n,"display","none");
+}}).play();
+},resize:function(_c){
+dojo.marginBox(this.domNode,_c);
 }});
 }
diff --git a/dojox/layout/RotatorContainer.js b/dojox/layout/RotatorContainer.js
index c8cf0ae..ee5737f 100644
--- a/dojox/layout/RotatorContainer.js
+++ b/dojox/layout/RotatorContainer.js
@@ -14,7 +14,7 @@ dojo.require("dijit.layout.StackController");
 dojo.require("dijit._Widget");
 dojo.require("dijit._Templated");
 dojo.require("dijit._Contained");
-dojo.declare("dojox.layout.RotatorContainer",[dijit.layout.StackContainer,dijit._Templated],{templateString:"<div class=\"dojoxRotatorContainer\"><div dojoAttachPoint=\"tabNode\"></div><div class=\"dojoxRotatorPager\" dojoAttachPoint=\"pagerNode\"></div><div class=\"dojoxRotatorContent\" dojoAttachPoint=\"containerNode\"></div></div>",showTabs:true,transitionDelay:5000,transition:"fade",transitionDuration:1000,autoStart:true,suspendOnHover:false,pauseOnManualChange:null,reverse:false,pag [...]
+dojo.declare("dojox.layout.RotatorContainer",[dijit.layout.StackContainer,dijit._Templated],{templateString:"<div class=\"dojoxRotatorContainer\"><div dojoAttachPoint=\"tabNode\"></div><div class=\"dojoxRotatorPager\" dojoAttachPoint=\"pagerNode\"></div><div class=\"dojoxRotatorContent\" dojoAttachPoint=\"containerNode\"></div></div>",showTabs:true,transitionDelay:5000,transition:"fade",transitionDuration:1000,autoStart:true,suspendOnHover:false,pauseOnManualChange:null,reverse:false,pag [...]
 this.inherited(arguments);
 dojo.style(this.domNode,"position","relative");
 if(this.cycles-0==this.cycles&&this.cycles!=-1){
@@ -25,8 +25,7 @@ this.cycles=-1;
 if(this.pauseOnManualChange===null){
 this.pauseOnManualChange=!this.suspendOnHover;
 }
-var id=this.id||"rotator"+(new Date()).getTime();
-var sc=new dijit.layout.StackController({containerId:id},this.tabNode);
+var id=this.id||"rotator"+(new Date()).getTime(),sc=new dijit.layout.StackController({containerId:id},this.tabNode);
 this.tabNode=sc.domNode;
 this._stackController=sc;
 dojo.style(this.tabNode,"display",this.showTabs?"":"none");
@@ -45,7 +44,7 @@ if(this._started){
 return;
 }
 var c=this.getChildren();
-for(var i=0,_6=c.length;i<_6;i++){
+for(var i=0,_1=c.length;i<_1;i++){
 if(c[i].declaredClass==this.pagerClass){
 this.pagerNode.appendChild(c[i].domNode);
 break;
@@ -60,20 +59,9 @@ this._updatePager();
 },destroy:function(){
 dojo.forEach(this._subscriptions,dojo.unsubscribe);
 this.inherited(arguments);
-},setAttribute:function(_7,_8){
-this.inherited(arguments);
-switch(_7){
-case "showTabs":
-this.showTabs=_8;
-dojo.style(this.tabNode,"display",_8?"":"none");
-break;
-case "transitionDelay":
-case "transitionDuration":
-case "suspendOnHover":
-case "pauseOnManualChange":
-case "reverse":
-this[_7]=_8;
-}
+},_setShowTabsAttr:function(_2){
+this.showTabs=_2;
+dojo.style(this.tabNode,"display",_2?"":"none");
 },_updatePager:function(){
 var c=this.getChildren();
 dojo.publish(this.id+"-update",[this._playing,dojo.indexOf(c,this.selectedChildWidget)+1,c.length]);
@@ -89,24 +77,22 @@ this._timer=setTimeout(dojo.hitch(this,"_play",true),200);
 },_resetTimer:function(){
 clearTimeout(this._timer);
 this._timer=null;
-},_cycle:function(_a){
-if(_a instanceof Boolean||typeof _a=="boolean"){
+},_cycle:function(_3){
+if(_3 instanceof Boolean||typeof _3=="boolean"){
 this._manualChange();
 }
-var c=this.getChildren();
-var _c=c.length;
-var i=dojo.indexOf(c,this.selectedChildWidget)+(_a===false||(_a!==true&&this.reverse)?-1:1);
-this.selectChild(c[(i<_c?(i<0?_c-1:i):0)]);
+var c=this.getChildren(),_4=c.length,i=dojo.indexOf(c,this.selectedChildWidget)+(_3===false||(_3!==true&&this.reverse)?-1:1);
+this.selectChild(c[(i<_4?(i<0?_4-1:i):0)]);
 this._updatePager();
 },_manualChange:function(){
 if(this.pauseOnManualChange){
 this._playing=false;
 }
 this.cycles=-1;
-},_play:function(_e){
+},_play:function(_5){
 this._playing=true;
 this._resetTimer();
-if(_e!==true&&this.cycles>0){
+if(_5!==true&&this.cycles>0){
 this.cycles--;
 }
 if(this.cycles==0){
@@ -120,19 +106,19 @@ this._updatePager();
 },_pause:function(){
 this._playing=false;
 this._resetTimer();
-},_state:function(_f){
-if(_f){
+},_state:function(_6){
+if(_6){
 this.cycles=-1;
 this._play();
 }else{
 this._pause();
 }
-},_transition:function(_10,_11){
+},_transition:function(_7,_8){
 this._resetTimer();
-if(_11&&this.transitionDuration){
+if(_8&&this.transitionDuration){
 switch(this.transition){
 case "fade":
-this._fade(_10,_11);
+this._fade(_7,_8);
 return;
 }
 }
@@ -144,25 +130,23 @@ this._play();
 }else{
 this._updatePager();
 }
-},_fade:function(_12,_13){
-this._styleNode(_13.domNode,1,1);
-this._styleNode(_12.domNode,0,2);
-this._showChild(_12);
-if(this.doLayout&&_12.resize){
-_12.resize(this._containerContentBox||this._contentBox);
-}
-var _14={duration:this.transitionDuration};
-var _15=dojo.fx.combine([dojo["fadeOut"](dojo.mixin({node:_13.domNode},_14)),dojo["fadeIn"](dojo.mixin({node:_12.domNode},_14))]);
-this.connect(_15,"onEnd",dojo.hitch(this,function(){
-this._hideChild(_13);
+},_fade:function(_9,_a){
+this._styleNode(_a.domNode,1,1);
+this._styleNode(_9.domNode,0,2);
+this._showChild(_9);
+if(this.doLayout&&_9.resize){
+_9.resize(this._containerContentBox||this._contentBox);
+}
+var _b={duration:this.transitionDuration},_c=dojo.fx.combine([dojo["fadeOut"](dojo.mixin({node:_a.domNode},_b)),dojo["fadeIn"](dojo.mixin({node:_9.domNode},_b))]);
+this.connect(_c,"onEnd",dojo.hitch(this,function(){
+this._hideChild(_a);
 this._transitionEnd();
 }));
-_15.play();
-},_styleNode:function(_16,_17,_18){
-
-dojo.style(_16,"opacity",_17);
-dojo.style(_16,"zIndex",_18);
-dojo.style(_16,"position","absolute");
+_c.play();
+},_styleNode:function(_d,_e,_f){
+dojo.style(_d,"opacity",_e);
+dojo.style(_d,"zIndex",_f);
+dojo.style(_d,"position","absolute");
 }});
 dojo.declare("dojox.layout.RotatorPager",[dijit._Widget,dijit._Templated,dijit._Contained],{widgetsInTemplate:true,rotatorId:"",postMixInProperties:function(){
 this.templateString="<div>"+this.srcNodeRef.innerHTML+"</div>";
@@ -190,18 +174,18 @@ this._subscriptions=[dojo.subscribe(p.id+"-state",this,"_state"),dojo.subscribe(
 },destroy:function(){
 dojo.forEach(this._subscriptions,dojo.unsubscribe);
 this.inherited(arguments);
-},_state:function(_1a){
-if(this.playPause&&this.playPause.checked!=_1a){
-this.playPause.attr("label",_1a?"Pause":"Play");
-this.playPause.setAttribute("checked",_1a);
-}
-},_update:function(_1b,_1c,_1d){
-this._state(_1b);
-if(this.current&&_1c){
-this.current.innerHTML=_1c;
-}
-if(this.total&&_1d){
-this.total.innerHTML=_1d;
+},_state:function(_10){
+if(this.playPause&&this.playPause.checked!=_10){
+this.playPause.attr("label",_10?"Pause":"Play");
+this.playPause.attr("checked",_10);
+}
+},_update:function(_11,_12,_13){
+this._state(_11);
+if(this.current&&_12){
+this.current.innerHTML=_12;
+}
+if(this.total&&_13){
+this.total.innerHTML=_13;
 }
 }});
 }
diff --git a/dojox/layout/ScrollPane.js b/dojox/layout/ScrollPane.js
index b27466a..b212ecc 100644
--- a/dojox/layout/ScrollPane.js
+++ b/dojox/layout/ScrollPane.js
@@ -11,7 +11,7 @@ dojo.provide("dojox.layout.ScrollPane");
 dojo.experimental("dojox.layout.ScrollPane");
 dojo.require("dijit.layout.ContentPane");
 dojo.require("dijit._Templated");
-dojo.declare("dojox.layout.ScrollPane",[dijit.layout.ContentPane,dijit._Templated],{_line:null,_lo:null,_offset:15,orientation:"vertical",autoHide:true,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 dojo [...]
+dojo.declare("dojox.layout.ScrollPane",[dijit.layout.ContentPane,dijit._Templated],{_line:null,_lo:null,_offset:15,orientation:"vertical",autoHide:true,templateString:dojo.cache("dojox.layout","resources/ScrollPane.html","<div class=\"dojoxScrollWindow\" dojoAttachEvent=\"onmouseenter: _enter, onmouseleave: _leave\">\n    <div class=\"dojoxScrollWrapper\" style=\"${style}\" dojoAttachPoint=\"wrapper\" dojoAttachEvent=\"onmousemove: _calc\">\n\t<div class=\"dojoxScrollPane\" dojoAttachPoi [...]
 if(_1){
 if(_1.h){
 dojo.style(this.domNode,"height",_1.h+"px");
diff --git a/dojox/layout/TableContainer.js b/dojox/layout/TableContainer.js
new file mode 100644
index 0000000..600fbe8
--- /dev/null
+++ b/dojox/layout/TableContainer.js
@@ -0,0 +1,136 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.layout.TableContainer"]){
+dojo._hasResource["dojox.layout.TableContainer"]=true;
+dojo.experimental("dojox.layout.TableContainer");
+dojo.provide("dojox.layout.TableContainer");
+dojo.require("dijit.layout._LayoutWidget");
+dojo.declare("dojox.layout.TableContainer",dijit.layout._LayoutWidget,{cols:1,labelWidth:"100",showLabels:true,orientation:"horiz",spacing:1,customClass:"",postCreate:function(){
+this.inherited(arguments);
+this._children=[];
+dojo.connect(this,"attr",dojo.hitch(this,function(_1,_2){
+if(_2&&(_1=="orientation"||_1=="customClass"||_1=="cols")){
+this.layout();
+}
+}));
+},startup:function(){
+if(this._started){
+return;
+}
+this.inherited(arguments);
+if(this._initialized){
+return;
+}
+var _3=this.getChildren();
+if(_3.length<1){
+return;
+}
+this._initialized=true;
+dojo.addClass(this.domNode,"dijitTableLayout");
+dojo.forEach(_3,function(_4){
+if(!_4.started&&!_4._started){
+_4.startup();
+}
+});
+this.resize();
+this.layout();
+},resize:function(){
+dojo.forEach(this.getChildren(),function(_5){
+if(typeof _5.resize=="function"){
+_5.resize();
+}
+});
+},layout:function(){
+if(!this._initialized){
+return;
+}
+var _6=this.getChildren();
+var _7={};
+var _8=this;
+function _9(_a,_b,_c){
+if(_8.customClass!=""){
+var _d=_8.customClass+"-"+(_b||_a.tagName.toLowerCase());
+dojo.addClass(_a,_d);
+if(arguments.length>2){
+dojo.addClass(_a,_d+"-"+_c);
+}
+}
+};
+dojo.forEach(this._children,dojo.hitch(this,function(_e){
+_7[_e.id]=_e;
+}));
+dojo.forEach(_6,dojo.hitch(this,function(_f,_10){
+if(!_7[_f.id]){
+this._children.push(_f);
+}
+}));
+var _11=dojo.create("table",{"width":"100%","class":"tableContainer-table tableContainer-table-"+this.orientation,"cellspacing":this.spacing},this.domNode);
+var _12=dojo.create("tbody");
+_11.appendChild(_12);
+_9(_11,"table",this.orientation);
+var _13=Math.floor(100/this.cols)+"%";
+var _14=dojo.create("tr",{},_12);
+var _15=(!this.showLabels||this.orientation=="horiz")?_14:dojo.create("tr",{},_12);
+var _16=this.cols*(this.showLabels?2:1);
+var _17=0;
+dojo.forEach(this._children,dojo.hitch(this,function(_18,_19){
+var _1a=_18.colspan||1;
+if(_1a>1){
+_1a=this.showLabels?Math.min(_16-1,_1a*2-1):Math.min(_16,_1a);
+}
+if(_17+_1a-1+(this.showLabels?1:0)>=_16){
+_17=0;
+_14=dojo.create("tr",{},_12);
+_15=this.orientation=="horiz"?_14:dojo.create("tr",{},_12);
+}
+var _1b;
+if(this.showLabels){
+_1b=dojo.create("td",{"class":"tableContainer-labelCell"},_14);
+if(_18.spanLabel){
+dojo.attr(_1b,this.orientation=="vert"?"rowspan":"colspan",2);
+}else{
+_9(_1b,"labelCell");
+var _1c={"for":_18.attr("id")};
+var _1d=dojo.create("label",_1c,_1b);
+if(Number(this.labelWidth)>-1||String(this.labelWidth).indexOf("%")>-1){
+dojo.style(_1b,"width",String(this.labelWidth).indexOf("%")<0?this.labelWidth+"px":this.labelWidth);
+}
+_1d.innerHTML=_18.attr("label")||_18.attr("title");
+}
+}
+var _1e;
+if(_18.spanLabel&&_1b){
+_1e=_1b;
+}else{
+_1e=dojo.create("td",{"class":"tableContainer-valueCell"},_15);
+}
+if(_1a>1){
+dojo.attr(_1e,"colspan",_1a);
+}
+_9(_1e,"valueCell",_19);
+_1e.appendChild(_18.domNode);
+_17+=_1a+(this.showLabels?1:0);
+}));
+if(this.table){
+this.table.parentNode.removeChild(this.table);
+}
+dojo.forEach(_6,function(_1f){
+if(typeof _1f.layout=="function"){
+_1f.layout();
+}
+});
+this.table=_11;
+this.resize();
+},_setSpacingAttr:function(_20){
+this.spacing=_20;
+if(this.table){
+this.table.cellspacing=Number(_20);
+}
+}});
+dojo.extend(dijit._Widget,{label:"",title:"",spanLabel:false,colspan:1});
+}
diff --git a/dojox/layout/ToggleSplitter.js b/dojox/layout/ToggleSplitter.js
index 14b0e64..c11535d 100644
--- a/dojox/layout/ToggleSplitter.js
+++ b/dojox/layout/ToggleSplitter.js
@@ -84,15 +84,15 @@ var _15={},dim=this.horizontal?"height":"width";
 _15["overflow"]=(_13)?_14["overflow"]:"hidden";
 _15["visibility"]=(_13)?_14["visibility"]:"hidden";
 _15[dim]=(_13)?_12.style[dim]||_14[dim]:this._closedSize;
-var _17=["Top","Right","Bottom","Left"];
-dojo.forEach(["padding","margin","border"],function(_18){
-for(var i=0;i<_17.length;i++){
-var _1a=_18+_17[i];
-if(_18=="border"){
-_18+="Width";
+var _16=["Top","Right","Bottom","Left"];
+dojo.forEach(["padding","margin","border"],function(_17){
+for(var i=0;i<_16.length;i++){
+var _18=_17+_16[i];
+if(_17=="border"){
+_17+="Width";
 }
-if(undefined!==_14[_1a]){
-_15[_1a]=(_13)?_14[_1a]:0;
+if(undefined!==_14[_18]){
+_15[_18]=(_13)?_14[_18]:0;
 }
 }
 });
@@ -109,12 +109,12 @@ dojo.removeClass(this.domNode,"dojoxToggleSplitterOpen");
 dojo.addClass(this.toggleNode,"dojoxToggleSplitterIconClosed");
 dojo.removeClass(this.toggleNode,"dojoxToggleSplitterIconOpen");
 }
-},_setOpenAttr:function(_1b){
+},_setOpenAttr:function(_19){
 if(!this._started){
 return;
 }
-this.open=_1b;
-this._handleOnChange(_1b,true);
+this.open=_19;
+this._handleOnChange(_19,true);
 var evt=this.open?"onOpen":"onClose";
 this[evt](this.child);
 },onOpen:function(){
diff --git a/dojox/layout/dnd/Avatar.js b/dojox/layout/dnd/Avatar.js
index 5cd160c..43bcca9 100644
--- a/dojox/layout/dnd/Avatar.js
+++ b/dojox/layout/dnd/Avatar.js
@@ -8,27 +8,22 @@
 if(!dojo._hasResource["dojox.layout.dnd.Avatar"]){
 dojo._hasResource["dojox.layout.dnd.Avatar"]=true;
 dojo.provide("dojox.layout.dnd.Avatar");
+dojo.require("dojo.dnd.Avatar");
 dojo.require("dojo.dnd.common");
-dojox.layout.dnd.Avatar=function(_1,_2){
-this.manager=_1;
-this.construct(_2);
-};
-dojo.extend(dojox.layout.dnd.Avatar,{construct:function(_3){
-var _4=this.manager.source;
-var _5=(_4.creator)?_4._normalizedCreator(_4.getItem(this.manager.nodes[0].id).data,"avatar").node:this.manager.nodes[0].cloneNode(true);
-_5.id=dojo.dnd.getUniqueId();
-dojo.addClass(_5,"dojoDndAvatar");
-_5.style.position="absolute";
-_5.style.zIndex=1999;
-_5.style.margin="0px";
-_5.style.width=dojo.marginBox(_4.node).w+"px";
-dojo.style(_5,"opacity",_3);
-this.node=_5;
-},destroy:function(){
-dojo.destroy(this.node);
-this.node=false;
+dojo.declare("dojox.layout.dnd.Avatar",dojo.dnd.Avatar,{constructor:function(_1,_2){
+this.opacity=_2||0.9;
+},construct:function(){
+var _3=this.manager.source,_4=_3.creator?_3._normalizedCreator(_3.getItem(this.manager.nodes[0].id).data,"avatar").node:this.manager.nodes[0].cloneNode(true);
+dojo.addClass(_4,"dojoDndAvatar");
+_4.id=dojo.dnd.getUniqueId();
+_4.style.position="absolute";
+_4.style.zIndex=1999;
+_4.style.margin="0px";
+_4.style.width=dojo.marginBox(_3.node).w+"px";
+dojo.style(_4,"opacity",this.opacity);
+this.node=_4;
 },update:function(){
-dojo[(this.manager.canDropFlag?"add":"remove")+"Class"](this.node,"dojoDndAvatarCanDrop");
+dojo.toggleClass(this.node,"dojoDndAvatarCanDrop",this.manager.canDropFlag);
 },_generateText:function(){
 }});
 }
diff --git a/dojox/layout/dnd/PlottedDnd.js b/dojox/layout/dnd/PlottedDnd.js
index 6cd0562..091da4a 100644
--- a/dojox/layout/dnd/PlottedDnd.js
+++ b/dojox/layout/dnd/PlottedDnd.js
@@ -41,64 +41,64 @@ _4.coords.mh=c.h;
 if(!this.withHandles){
 return true;
 }
-for(var _7=(e.target);_7&&_7!=this.node;_7=_7.parentNode){
-if(dojo.hasClass(_7,this.defaultHandleClass)){
+for(var _5=(e.target);_5&&_5!=this.node;_5=_5.parentNode){
+if(dojo.hasClass(_5,this.defaultHandleClass)){
 return true;
 }
 }
 return false;
-},setDndItemSelectable:function(_8,_9){
-for(var _a=_8;_a&&_8!=this.node;_a=_a.parentNode){
-if(dojo.hasClass(_a,"dojoDndItem")){
-dojo.setSelectable(_a,_9);
+},setDndItemSelectable:function(_6,_7){
+for(var _8=_6;_8&&_6!=this.node;_8=_8.parentNode){
+if(dojo.hasClass(_8,"dojoDndItem")){
+dojo.setSelectable(_8,_7);
 return;
 }
 }
-},getDraggedWidget:function(_b){
-var _c=_b;
-while(_c&&_c.nodeName.toLowerCase()!="body"&&!dojo.hasClass(_c,"dojoDndItem")){
-_c=_c.parentNode;
+},getDraggedWidget:function(_9){
+var _a=_9;
+while(_a&&_a.nodeName.toLowerCase()!="body"&&!dojo.hasClass(_a,"dojoDndItem")){
+_a=_a.parentNode;
 }
-return (_c)?dijit.byNode(_c):null;
-},isAccepted:function(_d){
-var _e=(_d)?_d.getAttribute("dndtype"):null;
-return (_e&&_e in this.accept);
-},onDndStart:function(_f,_10,_11){
-this.firstIndicator=(_f==this);
+return (_a)?dijit.byNode(_a):null;
+},isAccepted:function(_b){
+var _c=(_b)?_b.getAttribute("dndtype"):null;
+return (_c&&_c in this.accept);
+},onDndStart:function(_d,_e,_f){
+this.firstIndicator=(_d==this);
 this._calculateCoords(true);
 var m=dojo.dnd.manager();
-if(_10[0].coords){
-this._drop.style.height=_10[0].coords.mh+"px";
-dojo.style(m.avatar.node,"width",_10[0].coords.mw+"px");
+if(_e[0].coords){
+this._drop.style.height=_e[0].coords.mh+"px";
+dojo.style(m.avatar.node,"width",_e[0].coords.mw+"px");
 }else{
 this._drop.style.height=m.avatar.node.clientHeight+"px";
 }
-this.dndNodes=_10;
-dojox.layout.dnd.PlottedDnd.superclass.onDndStart.call(this,_f,_10,_11);
-if(_f==this&&this.hideSource){
-dojo.forEach(_10,function(n){
+this.dndNodes=_e;
+dojox.layout.dnd.PlottedDnd.superclass.onDndStart.call(this,_d,_e,_f);
+if(_d==this&&this.hideSource){
+dojo.forEach(_e,function(n){
 dojo.style(n,"display","none");
 });
 }
 },onDndCancel:function(){
 var m=dojo.dnd.manager();
 if(m.source==this&&this.hideSource){
-var _15=this.getSelectedNodes();
-dojo.forEach(_15,function(n){
+var _10=this.getSelectedNodes();
+dojo.forEach(_10,function(n){
 dojo.style(n,"display","");
 });
 }
 dojox.layout.dnd.PlottedDnd.superclass.onDndCancel.call(this);
 this.deleteDashedZone();
-},onDndDrop:function(_17,_18,_19,_1a){
+},onDndDrop:function(_11,_12,_13,_14){
 try{
-if(!this.isAccepted(_18[0])){
+if(!this.isAccepted(_12[0])){
 this.onDndCancel();
 }else{
-if(_17==this&&this._over&&this.dropObject){
+if(_11==this&&this._over&&this.dropObject){
 this.current=this.dropObject.c;
 }
-dojox.layout.dnd.PlottedDnd.superclass.onDndDrop.call(this,_17,_18,_19,_1a);
+dojox.layout.dnd.PlottedDnd.superclass.onDndDrop.call(this,_11,_12,_13,_14);
 this._calculateCoords(true);
 }
 }
@@ -119,10 +119,10 @@ this.current.coords={xy:c,w:this.current.offsetWidth/2,h:this.current.offsetHeig
 this._drop.style.height=this.current.coords.mh+"px";
 if(this.isOffset){
 if(this.offsetDrag.x==0&&this.offsetDrag.y==0){
-var _1d=true;
-var _1e=dojo.coords(this._getChildByEvent(e));
-this.offsetDrag.x=_1e.x-e.pageX;
-this.offsetDrag.y=_1e.y-e.clientY;
+var _15=true;
+var _16=dojo.coords(this._getChildByEvent(e));
+this.offsetDrag.x=_16.x-e.pageX;
+this.offsetDrag.y=_16.y-e.clientY;
 }
 if(this.offsetDrag.y<16&&this.current!=null){
 this.offsetDrag.y=this.GC_OFFSET_Y;
@@ -130,7 +130,7 @@ this.offsetDrag.y=this.GC_OFFSET_Y;
 var m=dojo.dnd.manager();
 m.OFFSET_X=this.offsetDrag.x;
 m.OFFSET_Y=this.offsetDrag.y;
-if(_1d){
+if(_15){
 this.offsetDrag.x=0;
 this.offsetDrag.y=0;
 }
@@ -140,8 +140,8 @@ if(dojo.dnd.isFormElement(e)){
 this.setDndItemSelectable(e.target,true);
 }else{
 this.containerSource=true;
-var _20=this.getDraggedWidget(e.target);
-if(_20&&_20.dragRestriction){
+var _17=this.getDraggedWidget(e.target);
+if(_17&&_17.dragRestriction){
 }else{
 dojox.layout.dnd.PlottedDnd.superclass.onMouseDown.call(this,e);
 }
@@ -158,14 +158,14 @@ m.OFFSET_Y=this.GC_OFFSET_Y;
 },onMouseMove:function(e){
 var m=dojo.dnd.manager();
 if(this.isDragging){
-var _25=false;
+var _18=false;
 if(this.current!=null||(this.current==null&&!this.dropObject)){
 if(this.isAccepted(m.nodes[0])||this.containerSource){
-_25=this.setIndicatorPosition(e);
+_18=this.setIndicatorPosition(e);
 }
 }
-if(this.current!=this.targetAnchor||_25!=this.before){
-this._markTargetAnchor(_25);
+if(this.current!=this.targetAnchor||_18!=this.before){
+this._markTargetAnchor(_18);
 m.canDrop(!this.current||m.source!=this||!(this.current.id in this.selection));
 }
 if(this.allowAutoScroll){
@@ -173,22 +173,22 @@ this._checkAutoScroll(e);
 }
 }else{
 if(this.mouseDown&&this.isSource){
-var _26=this.getSelectedNodes();
-if(_26.length){
-m.startDrag(this,_26,this.copyState(dojo.dnd.getCopyKeyState(e)));
+var _19=this.getSelectedNodes();
+if(_19.length){
+m.startDrag(this,_19,this.copyState(dojo.isCopyKey(e)));
 }
 }
 if(this.allowAutoScroll){
 this._stopAutoScroll();
 }
 }
-},_markTargetAnchor:function(_27){
-if(this.current==this.targetAnchor&&this.before==_27){
+},_markTargetAnchor:function(_1a){
+if(this.current==this.targetAnchor&&this.before==_1a){
 return;
 }
 this.targetAnchor=this.current;
 this.targetBox=null;
-this.before=_27;
+this.before=_1a;
 },_unmarkTargetAnchor:function(){
 if(!this.targetAnchor){
 return;
@@ -197,19 +197,19 @@ this.targetAnchor=null;
 this.targetBox=null;
 this.before=true;
 },setIndicatorPosition:function(e){
-var _29=false;
+var _1b=false;
 if(this.current){
 if(!this.current.coords||this.allowAutoScroll){
 this.current.coords={xy:dojo.coords(this.current,true),w:this.current.offsetWidth/2,h:this.current.offsetHeight/2};
 }
-_29=this.horizontal?(e.pageX-this.current.coords.xy.x)<this.current.coords.w:(e.pageY-this.current.coords.xy.y)<this.current.coords.h;
-this.insertDashedZone(_29);
+_1b=this.horizontal?(e.pageX-this.current.coords.xy.x)<this.current.coords.w:(e.pageY-this.current.coords.xy.y)<this.current.coords.h;
+this.insertDashedZone(_1b);
 }else{
 if(!this.dropObject){
 this.insertDashedZone(false);
 }
 }
-return _29;
+return _1b;
 },onOverEvent:function(){
 this._over=true;
 dojox.layout.dnd.PlottedDnd.superclass.onOverEvent.call(this);
@@ -228,28 +228,28 @@ this.deleteDashedZone();
 }
 },deleteDashedZone:function(){
 this._drop.style.display="none";
-var _2b=this._drop.nextSibling;
-while(_2b!=null){
-_2b.coords.xy.y-=parseInt(this._drop.style.height);
-_2b=_2b.nextSibling;
+var _1c=this._drop.nextSibling;
+while(_1c!=null){
+_1c.coords.xy.y-=parseInt(this._drop.style.height);
+_1c=_1c.nextSibling;
 }
 delete this.dropObject;
-},insertDashedZone:function(_2c){
+},insertDashedZone:function(_1d){
 if(this.dropObject){
-if(_2c==this.dropObject.b&&((this.current&&this.dropObject.c==this.current.id)||(!this.current&&!this.dropObject.c))){
+if(_1d==this.dropObject.b&&((this.current&&this.dropObject.c==this.current.id)||(!this.current&&!this.dropObject.c))){
 return;
 }else{
 this.deleteDashedZone();
 }
 }
-this.dropObject={n:this._drop,c:this.current?this.current.id:null,b:_2c};
+this.dropObject={n:this._drop,c:this.current?this.current.id:null,b:_1d};
 if(this.current){
-dojo.place(this._drop,this.current,_2c?"before":"after");
+dojo.place(this._drop,this.current,_1d?"before":"after");
 if(!this.firstIndicator){
-var _2d=this._drop.nextSibling;
-while(_2d!=null){
-_2d.coords.xy.y+=parseInt(this._drop.style.height);
-_2d=_2d.nextSibling;
+var _1e=this._drop.nextSibling;
+while(_1e!=null){
+_1e.coords.xy.y+=parseInt(this._drop.style.height);
+_1e=_1e.nextSibling;
 }
 }else{
 this.firstIndicator=false;
@@ -258,19 +258,19 @@ this.firstIndicator=false;
 this.node.appendChild(this._drop);
 }
 this._drop.style.display="";
-},insertNodes:function(_2e,_2f,_30,_31){
+},insertNodes:function(_1f,_20,_21,_22){
 if(this.dropObject){
 dojo.style(this.dropObject.n,"display","none");
-dojox.layout.dnd.PlottedDnd.superclass.insertNodes.call(this,true,_2f,true,this.dropObject.n);
+dojox.layout.dnd.PlottedDnd.superclass.insertNodes.call(this,true,_20,true,this.dropObject.n);
 this.deleteDashedZone();
 }else{
-return dojox.layout.dnd.PlottedDnd.superclass.insertNodes.call(this,_2e,_2f,_30,_31);
+return dojox.layout.dnd.PlottedDnd.superclass.insertNodes.call(this,_1f,_20,_21,_22);
 }
-var _32=dijit.byId(_2f[0].getAttribute("widgetId"));
-if(_32){
-dojox.layout.dnd._setGcDndHandle(_32,this.withHandles,this.handleClasses);
+var _23=dijit.byId(_20[0].getAttribute("widgetId"));
+if(_23){
+dojox.layout.dnd._setGcDndHandle(_23,this.withHandles,this.handleClasses);
 if(this.hideSource){
-dojo.style(_32.domNode,"display","");
+dojo.style(_23.domNode,"display","");
 }
 }
 },_checkAutoScroll:function(e){
@@ -278,72 +278,72 @@ if(this._timer){
 clearTimeout(this._timer);
 }
 this._stopAutoScroll();
-var _34=this.dom,y=this._sumAncestorProperties(_34,"offsetTop");
-if((e.pageY-_34.offsetTop+30)>_34.clientHeight){
+var _24=this.dom,y=this._sumAncestorProperties(_24,"offsetTop");
+if((e.pageY-_24.offsetTop+30)>_24.clientHeight){
 this.autoScrollActive=true;
-this._autoScrollDown(_34);
+this._autoScrollDown(_24);
 }else{
-if((_34.scrollTop>0)&&(e.pageY-y)<30){
+if((_24.scrollTop>0)&&(e.pageY-y)<30){
 this.autoScrollActive=true;
-this._autoScrollUp(_34);
+this._autoScrollUp(_24);
 }
 }
-},_autoScrollUp:function(_36){
-if(this.autoScrollActive&&_36.scrollTop>0){
-_36.scrollTop-=30;
-this._timer=setTimeout(dojo.hitch(this,"_autoScrollUp",_36),100);
+},_autoScrollUp:function(_25){
+if(this.autoScrollActive&&_25.scrollTop>0){
+_25.scrollTop-=30;
+this._timer=setTimeout(dojo.hitch(this,"_autoScrollUp",_25),100);
 }
-},_autoScrollDown:function(_37){
-if(this.autoScrollActive&&(_37.scrollTop<(_37.scrollHeight-_37.clientHeight))){
-_37.scrollTop+=30;
-this._timer=setTimeout(dojo.hitch(this,"_autoScrollDown",_37),100);
+},_autoScrollDown:function(_26){
+if(this.autoScrollActive&&(_26.scrollTop<(_26.scrollHeight-_26.clientHeight))){
+_26.scrollTop+=30;
+this._timer=setTimeout(dojo.hitch(this,"_autoScrollDown",_26),100);
 }
 },_stopAutoScroll:function(){
 this.autoScrollActive=false;
-},_sumAncestorProperties:function(_38,_39){
-_38=dojo.byId(_38);
-if(!_38){
+},_sumAncestorProperties:function(_27,_28){
+_27=dojo.byId(_27);
+if(!_27){
 return 0;
 }
-var _3a=0;
-while(_38){
-var val=_38[_39];
+var _29=0;
+while(_27){
+var val=_27[_28];
 if(val){
-_3a+=val-0;
-if(_38==dojo.body()){
+_29+=val-0;
+if(_27==dojo.body()){
 break;
 }
 }
-_38=_38.parentNode;
+_27=_27.parentNode;
 }
-return _3a;
+return _29;
 }});
-dojox.layout.dnd._setGcDndHandle=function(_3c,_3d,_3e,_3f){
+dojox.layout.dnd._setGcDndHandle=function(_2a,_2b,_2c,_2d){
 var cls="GcDndHandle";
-if(!_3f){
-dojo.query(".GcDndHandle",_3c.domNode).removeClass(cls);
+if(!_2d){
+dojo.query(".GcDndHandle",_2a.domNode).removeClass(cls);
 }
-if(!_3d){
-dojo.addClass(_3c.domNode,cls);
+if(!_2b){
+dojo.addClass(_2a.domNode,cls);
 }else{
-var _41=false;
-for(var i=_3e.length-1;i>=0;i--){
-var _43=dojo.query("."+_3e[i],_3c.domNode)[0];
-if(_43){
-_41=true;
-if(_3e[i]!=cls){
-var _44=dojo.query("."+cls,_3c.domNode);
-if(_44.length==0){
-dojo.removeClass(_3c.domNode,cls);
+var _2e=false;
+for(var i=_2c.length-1;i>=0;i--){
+var _2f=dojo.query("."+_2c[i],_2a.domNode)[0];
+if(_2f){
+_2e=true;
+if(_2c[i]!=cls){
+var _30=dojo.query("."+cls,_2a.domNode);
+if(_30.length==0){
+dojo.removeClass(_2a.domNode,cls);
 }else{
-_44.removeClass(cls);
+_30.removeClass(cls);
 }
-dojo.addClass(_43,cls);
+dojo.addClass(_2f,cls);
 }
 }
 }
-if(!_41){
-dojo.addClass(_3c.domNode,cls);
+if(!_2e){
+dojo.addClass(_2a.domNode,cls);
 }
 }
 };
@@ -372,10 +372,10 @@ return;
 this.node.parentNode.removeChild(this.node);
 this.node=null;
 }});
-dojo.extend(dojo.dnd.Manager,{canDrop:function(_49){
-var _4a=this.target&&_49;
-if(this.canDropFlag!=_4a){
-this.canDropFlag=_4a;
+dojo.extend(dojo.dnd.Manager,{canDrop:function(_31){
+var _32=this.target&&_31;
+if(this.canDropFlag!=_32){
+this.canDropFlag=_32;
 if(this.avatar){
 this.avatar.update();
 }
diff --git a/dojox/layout/ext-dijit/layout/StackContainer-touch.js b/dojox/layout/ext-dijit/layout/StackContainer-touch.js
index c496df3..a1c1f3b 100644
--- a/dojox/layout/ext-dijit/layout/StackContainer-touch.js
+++ b/dojox/layout/ext-dijit/layout/StackContainer-touch.js
@@ -18,13 +18,13 @@ switch(e.type){
 case "touchmove":
 e.preventDefault();
 if(this.touchPosition){
-var _3=e.touches[0]["page"+this.axis]-this.touchPosition;
-if(Math.abs(_3)>100){
+var _1=e.touches[0]["page"+this.axis]-this.touchPosition;
+if(Math.abs(_1)>100){
 if(this.axis=="Y"){
-_3*=-1;
+_1*=-1;
 }
 delete this.touchPosition;
-if(_3>0){
+if(_1>0){
 !this.selectedChildWidget.isLastChild&&this.forward();
 }else{
 !this.selectedChildWidget.isFirstChild&&this.back();
diff --git a/dojox/layout/nls/GridContainer.js b/dojox/layout/nls/GridContainer.js
deleted file mode 100644
index 7fb53f7..0000000
--- a/dojox/layout/nls/GridContainer.js
+++ /dev/null
@@ -1 +0,0 @@
-({"err_onSetNbColsRightMode":"Move boxes in first columns, in all tabs before changing the organization of the page","err_onSetNbColsLeftMode":"Move boxes in last columns, in all tabs before changing the organization of the page","alertPopup":"this widget type is not accepted to be moved !"})
\ No newline at end of file
diff --git a/dojox/layout/nls/en/GridContainer.js b/dojox/layout/nls/en/GridContainer.js
deleted file mode 100644
index 7fb53f7..0000000
--- a/dojox/layout/nls/en/GridContainer.js
+++ /dev/null
@@ -1 +0,0 @@
-({"err_onSetNbColsRightMode":"Move boxes in first columns, in all tabs before changing the organization of the page","err_onSetNbColsLeftMode":"Move boxes in last columns, in all tabs before changing the organization of the page","alertPopup":"this widget type is not accepted to be moved !"})
\ No newline at end of file
diff --git a/dojox/layout/nls/fr/GridContainer.js b/dojox/layout/nls/fr/GridContainer.js
deleted file mode 100644
index 0dd7e7a..0000000
--- a/dojox/layout/nls/fr/GridContainer.js
+++ /dev/null
@@ -1 +0,0 @@
-({"err_onSetNbColsRightMode":"Déplacer les boites dans les premières colonnes, dans tous les onglets avant de modifier l'organisation de la page.","err_onSetNbColsLeftMode":"Déplacer les boites dans les dernières colonnes, dans tous les onglets avant de modifier l'organisation de la page","alertPopup":"Ce type de Widget n'est pas autorisé à être déplacé !"})
\ No newline at end of file
diff --git a/dojox/layout/resources/ExpandoPane.css b/dojox/layout/resources/ExpandoPane.css
index 87b5290..fbd38e2 100644
--- a/dojox/layout/resources/ExpandoPane.css
+++ b/dojox/layout/resources/ExpandoPane.css
@@ -36,6 +36,7 @@
 		width:14px;
 		cursor:pointer;
 		background-position:-60px 0px;
+		background-repeat: no-repeat;
 		height:14px;
 	}
 	.dojoxExpandoClosed .dojoxExpandoIcon {
@@ -72,15 +73,13 @@
 	}
 	
 	.soria .dojoxExpandoIcon {
-		background: url('../../../dijit/themes/soria/images/spriteRoundedIconsSmall.png') no-repeat center center;
-		background-position:-60px 0px;
+		background-image: url('../../../dijit/themes/soria/images/spriteRoundedIconsSmall.png');
 	}
 	
-	.soria .dojoxExpandoClosed .dojoxExpandoIcon {
-		background-position:0px 0px;
-		margin-right:3px;
+	.dj_ie6 .soria .dojoxExpandoIcon {
+		background-image: url('../../../dijit/themes/soria/images/spriteRoundedIconsSmall.gif');
 	}
-	
+		
 	
 	.tundra .dojoxExpandoTitle {
 		font-weight: bold;
@@ -113,12 +112,14 @@
 	}
 	
 	.tundra .dojoxExpandoIcon {
-		background: url('../../../dijit/themes/tundra/images/minusButton.gif') no-repeat center center;
-		
+		background-image: url('../../../dijit/themes/tundra/images/spriteRoundedIconsSmall.gif');
 	}
-	.tundra .dojoxExpandoClosed .dojoxExpandoIcon {
-		background: url('../../../dijit/themes/tundra/images/plusButton.gif') no-repeat;
-		margin:3px;
+	
+	.tundra .dojoxExpandoClosed .dojoxExpandoIconLeft,
+	.tundra .dojoxExpandoClosed .dojoxExpandoIconRight,
+	.tundra .dojoxExpandoClosed .dojoxExpandoIconTop,
+	.tundra .dojoxExpandoClosed .dojoxExpandoIconBottom {
+		margin-top: 3px;
 	}
 	
 	
@@ -151,16 +152,48 @@
 	}
 	
 	.nihilo .dojoxExpandoIcon {
-		background: url('../../../dijit/themes/nihilo/images/spriteRoundedIconsSmall.png') no-repeat center center;
-		background-position:-60px 0px;
+		background-image: url('../../../dijit/themes/nihilo/images/spriteRoundedIconsSmall.png');
 	}
 	
-	.nihilo .dojoxExpandoClosed .dojoxExpandoIcon {
-		background-position:0px 0px;
+	.dj_ie6 .nihilo .dojoxExpandoIcon {
+		background-image: url('../../../dijit/themes/nihilo/images/spriteRoundedIconsSmall.gif');
 	}
-	
+		
 	.nihilo .dojoxExpandoTop {
 		border-bottom:1px solid #ccc;
 		border-left:1px solid #ccc;
 		border-right:1px solid #ccc; 
 	}
+	
+	
+	
+	.dojoxExpandoClosed .dojoxExpandoIcon {
+		margin-right:4px;
+	}
+	.dojoxExpandoIconLeft {
+	  background-position: 0 0;
+	}
+	.dojoxExpandoClosed .dojoxExpandoIconLeft {
+	  background-position: -30px 0;
+		margin-right: 4px;
+	}
+	.dojoxExpandoIconRight {
+	  background-position: -30px 0;
+	}
+	.dojoxExpandoClosed .dojoxExpandoIconRight {
+	  background-position: 0 0;
+		margin-left: 4px;
+	}
+	.dojoxExpandoIconBottom {
+	  background-position: -15px 0;
+	}
+	.dojoxExpandoClosed .dojoxExpandoIconBottom {
+	  background-position: -45px 0;
+		margin-top:1px;
+	}
+	.dojoxExpandoIconTop {
+	  background-position: -45px 0;
+	}
+	.dojoxExpandoClosed .dojoxExpandoIconTop {
+	  background-position: -15px 0;
+	}
diff --git a/dojox/layout/resources/GridContainer.css b/dojox/layout/resources/GridContainer.css
index af0bd55..d656665 100644
--- a/dojox/layout/resources/GridContainer.css
+++ b/dojox/layout/resources/GridContainer.css
@@ -1,7 +1,3 @@
-
-.gridContainer * {
-	zoom:1;
-}
 .oafDndHandle {
 	cursor: move;
 }
@@ -9,16 +5,14 @@
 	display:block;	
 	position: relative;
 	background:#FFF;	
-	margin:0px;	
-	padding:10px;
+	margin:0px;
 }
 	
 .gridContainer .dojoDndAvatarHeader	{
 	display:none;
 }
 .gridContainerTable {
-	width:100%;	
-	border:1px solid #F60;
+	width:100%;
 	height: 100%;
 }
 .gridContainerPopup {
@@ -71,3 +65,12 @@
 	border-left:1px solid #aeaeae;
 	border-right:1px solid #aeaeae;
 }
+.tundra .gridContainer .dndDropIndicator,
+.nihilo .gridContainer .dndDropIndicator{
+	border: 2px dashed #CCCCCC;
+	cursor:default;
+}
+.soria .gridContainer .dndDropIndicator {
+	border: 2px dashed #99BBE8;
+	cursor:default;
+}
diff --git a/dojox/layout/resources/RotatorContainer.css b/dojox/layout/resources/RotatorContainer.css
index b370ff8..ef0afcc 100644
--- a/dojox/layout/resources/RotatorContainer.css
+++ b/dojox/layout/resources/RotatorContainer.css
@@ -19,64 +19,23 @@
 	background-image:none;
 	color:#fff;
 }
-.dojoxRotatorContainer .dojoxRotatorPager {
-	bottom:5px;
-	right:5px;
-}
-.tundra .rotatorIcons .dijitButtonText {
-	display:none;
-}
-.tundra .rotatorIcons button,
-.tundra .rotatorIcons .dijitButtonHover button,
-.tundra .rotatorIcons .dijitButtonActive button,
-.tundra .rotatorIcons .dijitToggleButtonHover button,
-.tundra .rotatorIcons .dijitToggleButtonActive button {
-	background:none;
-	border:0;
-}
-.tundra .rotatorIcons .previous,
-.tundra .rotatorIcons .next,
-.tundra .rotatorIcons .playPause,
-.tundra .rotatorIcons .dijitToggleButtonChecked .playPause {
-	background-image:url("icons/rotator.png");
-	background-repeat:no-repeat;
-	display:block;
-	height:16px;
-	width:16px;
-}
-.tundra .rotatorIcons .previous {
-	background-position:0 0;
-}
-.tundra .rotatorIcons .dijitButtonHover .previous { 
-	background-position:0 -16px;
-}
-.tundra .rotatorIcons .dijitButtonActive .previous { 
-	background-position:0 -32px;
-}
-.tundra .rotatorIcons .next{
-	background-position:-16px 0;
-}
-.tundra .rotatorIcons .dijitButtonHover .next{ 
-	background-position:-16px -16px;
-}
-.tundra .rotatorIcons .dijitButtonActive .next{ 
-	background-position:-16px -32px;
-}
-.tundra .rotatorIcons .playPause{
-	background-position:-32px 0;
-}
-.tundra .rotatorIcons .dijitToggleButtonHover .playPause{ 
-	background-position:-32px -16px;
-}
-.tundra .rotatorIcons .dijitToggleButtonActive .playPause {
-	background-position:-32px -32px;
-}
-.tundra .rotatorIcons .dijitToggleButtonChecked .playPause {
-	background-position:-48px 0;
-}
-.tundra .rotatorIcons .dijitToggleButtonCheckedHover .playPause {
-	background-position:-48px -16px;
-}
-.tundra .rotatorIcons .dijitToggleButtonCheckedActive .playPause { 
-	background-position:-48px -32px;
-}
+.dojoxRotatorContainer .dojoxRotatorPager{bottom:5px;right:5px;}
+.rotatorIcons .dijitButton{margin:0;}
+.rotatorIcons .dijitButtonNode{background:none !important;border:0 !important;padding:0 !important;}
+.rotatorIcons .dijitButtonText{display:none;}
+.rotatorIcons .previous,
+.rotatorIcons .next,
+.rotatorIcons .playPause,
+.rotatorIcons .dijitToggleButtonChecked .playPause{background-image:url("icons/rotator.png");background-repeat:no-repeat;display:block;height:16px;width:16px;}
+.rotatorIcons .previous{background-position:0 0;}
+.rotatorIcons .dijitButtonHover .previous{background-position:0 -16px;}
+.rotatorIcons .dijitButtonActive .previous{background-position:0 -32px;}
+.rotatorIcons .next{background-position:-16px 0;}
+.rotatorIcons .dijitButtonHover .next{background-position:-16px -16px;}
+.rotatorIcons .dijitButtonActive .next{background-position:-16px -32px;}
+.rotatorIcons .playPause{background-position:-32px 0;}
+.rotatorIcons .dijitToggleButtonHover .playPause{background-position:-32px -16px;}
+.rotatorIcons .dijitToggleButtonActive .playPause{background-position:-32px -32px;}
+.rotatorIcons .dijitToggleButtonChecked .playPause{background-position:-48px 0;}
+.rotatorIcons .dijitToggleButtonCheckedHover .playPause{background-position:-48px -16px;}
+.rotatorIcons .dijitToggleButtonCheckedActive .playPause{background-position:-48px -32px;}
diff --git a/dojox/math/BigInteger-ext.js b/dojox/math/BigInteger-ext.js
new file mode 100644
index 0000000..729c0d1
--- /dev/null
+++ b/dojox/math/BigInteger-ext.js
@@ -0,0 +1,796 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.math.BigInteger-ext"]){
+dojo._hasResource["dojox.math.BigInteger-ext"]=true;
+dojo.provide("dojox.math.BigInteger-ext");
+dojo.experimental("dojox.math.BigInteger-ext");
+dojo.require("dojox.math.BigInteger");
+(function(){
+var _1=dojox.math.BigInteger,_2=_1._nbi,_3=_1._nbv,_4=_1._nbits,_5=_1._Montgomery;
+function _6(){
+var r=_2();
+this._copyTo(r);
+return r;
+};
+function _7(){
+if(this.s<0){
+if(this.t==1){
+return this[0]-this._DV;
+}else{
+if(this.t==0){
+return -1;
+}
+}
+}else{
+if(this.t==1){
+return this[0];
+}else{
+if(this.t==0){
+return 0;
+}
+}
+}
+return ((this[1]&((1<<(32-this._DB))-1))<<this._DB)|this[0];
+};
+function _8(){
+return (this.t==0)?this.s:(this[0]<<24)>>24;
+};
+function _9(){
+return (this.t==0)?this.s:(this[0]<<16)>>16;
+};
+function _a(r){
+return Math.floor(Math.LN2*this._DB/Math.log(r));
+};
+function _b(){
+if(this.s<0){
+return -1;
+}else{
+if(this.t<=0||(this.t==1&&this[0]<=0)){
+return 0;
+}else{
+return 1;
+}
+}
+};
+function _c(b){
+if(b==null){
+b=10;
+}
+if(this.signum()==0||b<2||b>36){
+return "0";
+}
+var cs=this._chunkSize(b);
+var a=Math.pow(b,cs);
+var d=_3(a),y=_2(),z=_2(),r="";
+this._divRemTo(d,y,z);
+while(y.signum()>0){
+r=(a+z.intValue()).toString(b).substr(1)+r;
+y._divRemTo(d,y,z);
+}
+return z.intValue().toString(b)+r;
+};
+function _d(s,b){
+this._fromInt(0);
+if(b==null){
+b=10;
+}
+var cs=this._chunkSize(b);
+var d=Math.pow(b,cs),mi=false,j=0,w=0;
+for(var i=0;i<s.length;++i){
+var x=intAt(s,i);
+if(x<0){
+if(s.charAt(i)=="-"&&this.signum()==0){
+mi=true;
+}
+continue;
+}
+w=b*w+x;
+if(++j>=cs){
+this._dMultiply(d);
+this._dAddOffset(w,0);
+j=0;
+w=0;
+}
+}
+if(j>0){
+this._dMultiply(Math.pow(b,j));
+this._dAddOffset(w,0);
+}
+if(mi){
+_1.ZERO._subTo(this,this);
+}
+};
+function _e(a,b,c){
+if("number"==typeof b){
+if(a<2){
+this._fromInt(1);
+}else{
+this._fromNumber(a,c);
+if(!this.testBit(a-1)){
+this._bitwiseTo(_1.ONE.shiftLeft(a-1),_f,this);
+}
+if(this._isEven()){
+this._dAddOffset(1,0);
+}
+while(!this.isProbablePrime(b)){
+this._dAddOffset(2,0);
+if(this.bitLength()>a){
+this._subTo(_1.ONE.shiftLeft(a-1),this);
+}
+}
+}
+}else{
+var x=[],t=a&7;
+x.length=(a>>3)+1;
+b.nextBytes(x);
+if(t>0){
+x[0]&=((1<<t)-1);
+}else{
+x[0]=0;
+}
+this._fromString(x,256);
+}
+};
+function _10(){
+var i=this.t,r=[];
+r[0]=this.s;
+var p=this._DB-(i*this._DB)%8,d,k=0;
+if(i-->0){
+if(p<this._DB&&(d=this[i]>>p)!=(this.s&this._DM)>>p){
+r[k++]=d|(this.s<<(this._DB-p));
+}
+while(i>=0){
+if(p<8){
+d=(this[i]&((1<<p)-1))<<(8-p);
+d|=this[--i]>>(p+=this._DB-8);
+}else{
+d=(this[i]>>(p-=8))&255;
+if(p<=0){
+p+=this._DB;
+--i;
+}
+}
+if((d&128)!=0){
+d|=-256;
+}
+if(k==0&&(this.s&128)!=(d&128)){
+++k;
+}
+if(k>0||d!=this.s){
+r[k++]=d;
+}
+}
+}
+return r;
+};
+function _11(a){
+return (this.compareTo(a)==0);
+};
+function _12(a){
+return (this.compareTo(a)<0)?this:a;
+};
+function _13(a){
+return (this.compareTo(a)>0)?this:a;
+};
+function _14(a,op,r){
+var i,f,m=Math.min(a.t,this.t);
+for(i=0;i<m;++i){
+r[i]=op(this[i],a[i]);
+}
+if(a.t<this.t){
+f=a.s&this._DM;
+for(i=m;i<this.t;++i){
+r[i]=op(this[i],f);
+}
+r.t=this.t;
+}else{
+f=this.s&this._DM;
+for(i=m;i<a.t;++i){
+r[i]=op(f,a[i]);
+}
+r.t=a.t;
+}
+r.s=op(this.s,a.s);
+r._clamp();
+};
+function _15(x,y){
+return x&y;
+};
+function _16(a){
+var r=_2();
+this._bitwiseTo(a,_15,r);
+return r;
+};
+function _f(x,y){
+return x|y;
+};
+function _17(a){
+var r=_2();
+this._bitwiseTo(a,_f,r);
+return r;
+};
+function _18(x,y){
+return x^y;
+};
+function _19(a){
+var r=_2();
+this._bitwiseTo(a,_18,r);
+return r;
+};
+function _1a(x,y){
+return x&~y;
+};
+function _1b(a){
+var r=_2();
+this._bitwiseTo(a,_1a,r);
+return r;
+};
+function _1c(){
+var r=_2();
+for(var i=0;i<this.t;++i){
+r[i]=this._DM&~this[i];
+}
+r.t=this.t;
+r.s=~this.s;
+return r;
+};
+function _1d(n){
+var r=_2();
+if(n<0){
+this._rShiftTo(-n,r);
+}else{
+this._lShiftTo(n,r);
+}
+return r;
+};
+function _1e(n){
+var r=_2();
+if(n<0){
+this._lShiftTo(-n,r);
+}else{
+this._rShiftTo(n,r);
+}
+return r;
+};
+function _1f(x){
+if(x==0){
+return -1;
+}
+var r=0;
+if((x&65535)==0){
+x>>=16;
+r+=16;
+}
+if((x&255)==0){
+x>>=8;
+r+=8;
+}
+if((x&15)==0){
+x>>=4;
+r+=4;
+}
+if((x&3)==0){
+x>>=2;
+r+=2;
+}
+if((x&1)==0){
+++r;
+}
+return r;
+};
+function _20(){
+for(var i=0;i<this.t;++i){
+if(this[i]!=0){
+return i*this._DB+_1f(this[i]);
+}
+}
+if(this.s<0){
+return this.t*this._DB;
+}
+return -1;
+};
+function _21(x){
+var r=0;
+while(x!=0){
+x&=x-1;
+++r;
+}
+return r;
+};
+function _22(){
+var r=0,x=this.s&this._DM;
+for(var i=0;i<this.t;++i){
+r+=_21(this[i]^x);
+}
+return r;
+};
+function _23(n){
+var j=Math.floor(n/this._DB);
+if(j>=this.t){
+return (this.s!=0);
+}
+return ((this[j]&(1<<(n%this._DB)))!=0);
+};
+function _24(n,op){
+var r=_1.ONE.shiftLeft(n);
+this._bitwiseTo(r,op,r);
+return r;
+};
+function _25(n){
+return this._changeBit(n,_f);
+};
+function _26(n){
+return this._changeBit(n,_1a);
+};
+function _27(n){
+return this._changeBit(n,_18);
+};
+function _28(a,r){
+var i=0,c=0,m=Math.min(a.t,this.t);
+while(i<m){
+c+=this[i]+a[i];
+r[i++]=c&this._DM;
+c>>=this._DB;
+}
+if(a.t<this.t){
+c+=a.s;
+while(i<this.t){
+c+=this[i];
+r[i++]=c&this._DM;
+c>>=this._DB;
+}
+c+=this.s;
+}else{
+c+=this.s;
+while(i<a.t){
+c+=a[i];
+r[i++]=c&this._DM;
+c>>=this._DB;
+}
+c+=a.s;
+}
+r.s=(c<0)?-1:0;
+if(c>0){
+r[i++]=c;
+}else{
+if(c<-1){
+r[i++]=this._DV+c;
+}
+}
+r.t=i;
+r._clamp();
+};
+function _29(a){
+var r=_2();
+this._addTo(a,r);
+return r;
+};
+function _2a(a){
+var r=_2();
+this._subTo(a,r);
+return r;
+};
+function _2b(a){
+var r=_2();
+this._multiplyTo(a,r);
+return r;
+};
+function _2c(a){
+var r=_2();
+this._divRemTo(a,r,null);
+return r;
+};
+function _2d(a){
+var r=_2();
+this._divRemTo(a,null,r);
+return r;
+};
+function _2e(a){
+var q=_2(),r=_2();
+this._divRemTo(a,q,r);
+return [q,r];
+};
+function _2f(n){
+this[this.t]=this.am(0,n-1,this,0,0,this.t);
+++this.t;
+this._clamp();
+};
+function _30(n,w){
+while(this.t<=w){
+this[this.t++]=0;
+}
+this[w]+=n;
+while(this[w]>=this._DV){
+this[w]-=this._DV;
+if(++w>=this.t){
+this[this.t++]=0;
+}
+++this[w];
+}
+};
+function _31(){
+};
+function _32(x){
+return x;
+};
+function _33(x,y,r){
+x._multiplyTo(y,r);
+};
+function _34(x,r){
+x._squareTo(r);
+};
+_31.prototype.convert=_32;
+_31.prototype.revert=_32;
+_31.prototype.mulTo=_33;
+_31.prototype.sqrTo=_34;
+function _35(e){
+return this._exp(e,new _31());
+};
+function _36(a,n,r){
+var i=Math.min(this.t+a.t,n);
+r.s=0;
+r.t=i;
+while(i>0){
+r[--i]=0;
+}
+var j;
+for(j=r.t-this.t;i<j;++i){
+r[i+this.t]=this.am(0,a[i],r,i,0,this.t);
+}
+for(j=Math.min(a.t,n);i<j;++i){
+this.am(0,a[i],r,i,0,n-i);
+}
+r._clamp();
+};
+function _37(a,n,r){
+--n;
+var i=r.t=this.t+a.t-n;
+r.s=0;
+while(--i>=0){
+r[i]=0;
+}
+for(i=Math.max(n-this.t,0);i<a.t;++i){
+r[this.t+i-n]=this.am(n-i,a[i],r,0,0,this.t+i-n);
+}
+r._clamp();
+r._drShiftTo(1,r);
+};
+function _38(m){
+this.r2=_2();
+this.q3=_2();
+_1.ONE._dlShiftTo(2*m.t,this.r2);
+this.mu=this.r2.divide(m);
+this.m=m;
+};
+function _39(x){
+if(x.s<0||x.t>2*this.m.t){
+return x.mod(this.m);
+}else{
+if(x.compareTo(this.m)<0){
+return x;
+}else{
+var r=_2();
+x._copyTo(r);
+this.reduce(r);
+return r;
+}
+}
+};
+function _3a(x){
+return x;
+};
+function _3b(x){
+x._drShiftTo(this.m.t-1,this.r2);
+if(x.t>this.m.t+1){
+x.t=this.m.t+1;
+x._clamp();
+}
+this.mu._multiplyUpperTo(this.r2,this.m.t+1,this.q3);
+this.m._multiplyLowerTo(this.q3,this.m.t+1,this.r2);
+while(x.compareTo(this.r2)<0){
+x._dAddOffset(1,this.m.t+1);
+}
+x._subTo(this.r2,x);
+while(x.compareTo(this.m)>=0){
+x._subTo(this.m,x);
+}
+};
+function _3c(x,r){
+x._squareTo(r);
+this.reduce(r);
+};
+function _3d(x,y,r){
+x._multiplyTo(y,r);
+this.reduce(r);
+};
+_38.prototype.convert=_39;
+_38.prototype.revert=_3a;
+_38.prototype.reduce=_3b;
+_38.prototype.mulTo=_3d;
+_38.prototype.sqrTo=_3c;
+function _3e(e,m){
+var i=e.bitLength(),k,r=_3(1),z;
+if(i<=0){
+return r;
+}else{
+if(i<18){
+k=1;
+}else{
+if(i<48){
+k=3;
+}else{
+if(i<144){
+k=4;
+}else{
+if(i<768){
+k=5;
+}else{
+k=6;
+}
+}
+}
+}
+}
+if(i<8){
+z=new Classic(m);
+}else{
+if(m._isEven()){
+z=new _38(m);
+}else{
+z=new _5(m);
+}
+}
+var g=[],n=3,k1=k-1,km=(1<<k)-1;
+g[1]=z.convert(this);
+if(k>1){
+var g2=_2();
+z.sqrTo(g[1],g2);
+while(n<=km){
+g[n]=_2();
+z.mulTo(g2,g[n-2],g[n]);
+n+=2;
+}
+}
+var j=e.t-1,w,is1=true,r2=_2(),t;
+i=_4(e[j])-1;
+while(j>=0){
+if(i>=k1){
+w=(e[j]>>(i-k1))&km;
+}else{
+w=(e[j]&((1<<(i+1))-1))<<(k1-i);
+if(j>0){
+w|=e[j-1]>>(this._DB+i-k1);
+}
+}
+n=k;
+while((w&1)==0){
+w>>=1;
+--n;
+}
+if((i-=n)<0){
+i+=this._DB;
+--j;
+}
+if(is1){
+g[w]._copyTo(r);
+is1=false;
+}else{
+while(n>1){
+z.sqrTo(r,r2);
+z.sqrTo(r2,r);
+n-=2;
+}
+if(n>0){
+z.sqrTo(r,r2);
+}else{
+t=r;
+r=r2;
+r2=t;
+}
+z.mulTo(r2,g[w],r);
+}
+while(j>=0&&(e[j]&(1<<i))==0){
+z.sqrTo(r,r2);
+t=r;
+r=r2;
+r2=t;
+if(--i<0){
+i=this._DB-1;
+--j;
+}
+}
+}
+return z.revert(r);
+};
+function _3f(a){
+var x=(this.s<0)?this.negate():this.clone();
+var y=(a.s<0)?a.negate():a.clone();
+if(x.compareTo(y)<0){
+var t=x;
+x=y;
+y=t;
+}
+var i=x.getLowestSetBit(),g=y.getLowestSetBit();
+if(g<0){
+return x;
+}
+if(i<g){
+g=i;
+}
+if(g>0){
+x._rShiftTo(g,x);
+y._rShiftTo(g,y);
+}
+while(x.signum()>0){
+if((i=x.getLowestSetBit())>0){
+x._rShiftTo(i,x);
+}
+if((i=y.getLowestSetBit())>0){
+y._rShiftTo(i,y);
+}
+if(x.compareTo(y)>=0){
+x._subTo(y,x);
+x._rShiftTo(1,x);
+}else{
+y._subTo(x,y);
+y._rShiftTo(1,y);
+}
+}
+if(g>0){
+y._lShiftTo(g,y);
+}
+return y;
+};
+function _40(n){
+if(n<=0){
+return 0;
+}
+var d=this._DV%n,r=(this.s<0)?n-1:0;
+if(this.t>0){
+if(d==0){
+r=this[0]%n;
+}else{
+for(var i=this.t-1;i>=0;--i){
+r=(d*r+this[i])%n;
+}
+}
+}
+return r;
+};
+function _41(m){
+var ac=m._isEven();
+if((this._isEven()&&ac)||m.signum()==0){
+return _1.ZERO;
+}
+var u=m.clone(),v=this.clone();
+var a=_3(1),b=_3(0),c=_3(0),d=_3(1);
+while(u.signum()!=0){
+while(u._isEven()){
+u._rShiftTo(1,u);
+if(ac){
+if(!a._isEven()||!b._isEven()){
+a._addTo(this,a);
+b._subTo(m,b);
+}
+a._rShiftTo(1,a);
+}else{
+if(!b._isEven()){
+b._subTo(m,b);
+}
+}
+b._rShiftTo(1,b);
+}
+while(v._isEven()){
+v._rShiftTo(1,v);
+if(ac){
+if(!c._isEven()||!d._isEven()){
+c._addTo(this,c);
+d._subTo(m,d);
+}
+c._rShiftTo(1,c);
+}else{
+if(!d._isEven()){
+d._subTo(m,d);
+}
+}
+d._rShiftTo(1,d);
+}
+if(u.compareTo(v)>=0){
+u._subTo(v,u);
+if(ac){
+a._subTo(c,a);
+}
+b._subTo(d,b);
+}else{
+v._subTo(u,v);
+if(ac){
+c._subTo(a,c);
+}
+d._subTo(b,d);
+}
+}
+if(v.compareTo(_1.ONE)!=0){
+return _1.ZERO;
+}
+if(d.compareTo(m)>=0){
+return d.subtract(m);
+}
+if(d.signum()<0){
+d._addTo(m,d);
+}else{
+return d;
+}
+if(d.signum()<0){
+return d.add(m);
+}else{
+return d;
+}
+};
+var _42=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509];
+var _43=(1<<26)/_42[_42.length-1];
+function _44(t){
+var i,x=this.abs();
+if(x.t==1&&x[0]<=_42[_42.length-1]){
+for(i=0;i<_42.length;++i){
+if(x[0]==_42[i]){
+return true;
+}
+}
+return false;
+}
+if(x._isEven()){
+return false;
+}
+i=1;
+while(i<_42.length){
+var m=_42[i],j=i+1;
+while(j<_42.length&&m<_43){
+m*=_42[j++];
+}
+m=x._modInt(m);
+while(i<j){
+if(m%_42[i++]==0){
+return false;
+}
+}
+}
+return x._millerRabin(t);
+};
+function _45(t){
+var n1=this.subtract(_1.ONE);
+var k=n1.getLowestSetBit();
+if(k<=0){
+return false;
+}
+var r=n1.shiftRight(k);
+t=(t+1)>>1;
+if(t>_42.length){
+t=_42.length;
+}
+var a=_2();
+for(var i=0;i<t;++i){
+a._fromInt(_42[i]);
+var y=a.modPow(r,this);
+if(y.compareTo(_1.ONE)!=0&&y.compareTo(n1)!=0){
+var j=1;
+while(j++<k&&y.compareTo(n1)!=0){
+y=y.modPowInt(2,this);
+if(y.compareTo(_1.ONE)==0){
+return false;
+}
+}
+if(y.compareTo(n1)!=0){
+return false;
+}
+}
+}
+return true;
+};
+dojo.extend(_1,{_chunkSize:_a,_toRadix:_c,_fromRadix:_d,_fromNumber:_e,_bitwiseTo:_14,_changeBit:_24,_addTo:_28,_dMultiply:_2f,_dAddOffset:_30,_multiplyLowerTo:_36,_multiplyUpperTo:_37,_modInt:_40,_millerRabin:_45,clone:_6,intValue:_7,byteValue:_8,shortValue:_9,signum:_b,toByteArray:_10,equals:_11,min:_12,max:_13,and:_16,or:_17,xor:_19,andNot:_1b,not:_1c,shiftLeft:_1d,shiftRight:_1e,getLowestSetBit:_20,bitCount:_22,testBit:_23,setBit:_25,clearBit:_26,flipBit:_27,add:_29,subtract:_2a,mult [...]
+})();
+}
diff --git a/dojox/math/BigInteger.js b/dojox/math/BigInteger.js
new file mode 100644
index 0000000..824ba80
--- /dev/null
+++ b/dojox/math/BigInteger.js
@@ -0,0 +1,635 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.math.BigInteger"]){
+dojo._hasResource["dojox.math.BigInteger"]=true;
+dojo.provide("dojox.math.BigInteger");
+dojo.experimental("dojox.math.BigInteger");
+(function(){
+var _1;
+var _2=244837814094590;
+var _3=((_2&16777215)==15715070);
+function _4(a,b,c){
+if(a!=null){
+if("number"==typeof a){
+this._fromNumber(a,b,c);
+}else{
+if(!b&&"string"!=typeof a){
+this._fromString(a,256);
+}else{
+this._fromString(a,b);
+}
+}
+}
+};
+function _5(){
+return new _4(null);
+};
+function _6(i,x,w,j,c,n){
+while(--n>=0){
+var v=x*this[i++]+w[j]+c;
+c=Math.floor(v/67108864);
+w[j++]=v&67108863;
+}
+return c;
+};
+function _7(i,x,w,j,c,n){
+var xl=x&32767,xh=x>>15;
+while(--n>=0){
+var l=this[i]&32767;
+var h=this[i++]>>15;
+var m=xh*l+h*xl;
+l=xl*l+((m&32767)<<15)+w[j]+(c&1073741823);
+c=(l>>>30)+(m>>>15)+xh*h+(c>>>30);
+w[j++]=l&1073741823;
+}
+return c;
+};
+function _8(i,x,w,j,c,n){
+var xl=x&16383,xh=x>>14;
+while(--n>=0){
+var l=this[i]&16383;
+var h=this[i++]>>14;
+var m=xh*l+h*xl;
+l=xl*l+((m&16383)<<14)+w[j]+c;
+c=(l>>28)+(m>>14)+xh*h;
+w[j++]=l&268435455;
+}
+return c;
+};
+if(_3&&(navigator.appName=="Microsoft Internet Explorer")){
+_4.prototype.am=_7;
+_1=30;
+}else{
+if(_3&&(navigator.appName!="Netscape")){
+_4.prototype.am=_6;
+_1=26;
+}else{
+_4.prototype.am=_8;
+_1=28;
+}
+}
+var _9=52;
+var _a="0123456789abcdefghijklmnopqrstuvwxyz";
+var _b=[];
+var rr,vv;
+rr="0".charCodeAt(0);
+for(vv=0;vv<=9;++vv){
+_b[rr++]=vv;
+}
+rr="a".charCodeAt(0);
+for(vv=10;vv<36;++vv){
+_b[rr++]=vv;
+}
+rr="A".charCodeAt(0);
+for(vv=10;vv<36;++vv){
+_b[rr++]=vv;
+}
+function _c(n){
+return _a.charAt(n);
+};
+function _d(s,i){
+var c=_b[s.charCodeAt(i)];
+return (c==null)?-1:c;
+};
+function _e(r){
+for(var i=this.t-1;i>=0;--i){
+r[i]=this[i];
+}
+r.t=this.t;
+r.s=this.s;
+};
+function _f(x){
+this.t=1;
+this.s=(x<0)?-1:0;
+if(x>0){
+this[0]=x;
+}else{
+if(x<-1){
+this[0]=x+_DV;
+}else{
+this.t=0;
+}
+}
+};
+function nbv(i){
+var r=_5();
+r._fromInt(i);
+return r;
+};
+function _10(s,b){
+var k;
+if(b==16){
+k=4;
+}else{
+if(b==8){
+k=3;
+}else{
+if(b==256){
+k=8;
+}else{
+if(b==2){
+k=1;
+}else{
+if(b==32){
+k=5;
+}else{
+if(b==4){
+k=2;
+}else{
+this.fromRadix(s,b);
+return;
+}
+}
+}
+}
+}
+}
+this.t=0;
+this.s=0;
+var i=s.length,mi=false,sh=0;
+while(--i>=0){
+var x=(k==8)?s[i]&255:_d(s,i);
+if(x<0){
+if(s.charAt(i)=="-"){
+mi=true;
+}
+continue;
+}
+mi=false;
+if(sh==0){
+this[this.t++]=x;
+}else{
+if(sh+k>this._DB){
+this[this.t-1]|=(x&((1<<(this._DB-sh))-1))<<sh;
+this[this.t++]=(x>>(this._DB-sh));
+}else{
+this[this.t-1]|=x<<sh;
+}
+}
+sh+=k;
+if(sh>=this._DB){
+sh-=this._DB;
+}
+}
+if(k==8&&(s[0]&128)!=0){
+this.s=-1;
+if(sh>0){
+this[this.t-1]|=((1<<(this._DB-sh))-1)<<sh;
+}
+}
+this._clamp();
+if(mi){
+_4.ZERO._subTo(this,this);
+}
+};
+function _11(){
+var c=this.s&this._DM;
+while(this.t>0&&this[this.t-1]==c){
+--this.t;
+}
+};
+function _12(b){
+if(this.s<0){
+return "-"+this.negate().toString(b);
+}
+var k;
+if(b==16){
+k=4;
+}else{
+if(b==8){
+k=3;
+}else{
+if(b==2){
+k=1;
+}else{
+if(b==32){
+k=5;
+}else{
+if(b==4){
+k=2;
+}else{
+return this._toRadix(b);
+}
+}
+}
+}
+}
+var km=(1<<k)-1,d,m=false,r="",i=this.t;
+var p=this._DB-(i*this._DB)%k;
+if(i-->0){
+if(p<this._DB&&(d=this[i]>>p)>0){
+m=true;
+r=_c(d);
+}
+while(i>=0){
+if(p<k){
+d=(this[i]&((1<<p)-1))<<(k-p);
+d|=this[--i]>>(p+=this._DB-k);
+}else{
+d=(this[i]>>(p-=k))&km;
+if(p<=0){
+p+=this._DB;
+--i;
+}
+}
+if(d>0){
+m=true;
+}
+if(m){
+r+=_c(d);
+}
+}
+}
+return m?r:"0";
+};
+function _13(){
+var r=_5();
+_4.ZERO._subTo(this,r);
+return r;
+};
+function _14(){
+return (this.s<0)?this.negate():this;
+};
+function _15(a){
+var r=this.s-a.s;
+if(r){
+return r;
+}
+var i=this.t;
+r=i-a.t;
+if(r){
+return r;
+}
+while(--i>=0){
+if((r=this[i]-a[i])){
+return r;
+}
+}
+return 0;
+};
+function _16(x){
+var r=1,t;
+if((t=x>>>16)){
+x=t;
+r+=16;
+}
+if((t=x>>8)){
+x=t;
+r+=8;
+}
+if((t=x>>4)){
+x=t;
+r+=4;
+}
+if((t=x>>2)){
+x=t;
+r+=2;
+}
+if((t=x>>1)){
+x=t;
+r+=1;
+}
+return r;
+};
+function _17(){
+if(this.t<=0){
+return 0;
+}
+return this._DB*(this.t-1)+_16(this[this.t-1]^(this.s&this._DM));
+};
+function _18(n,r){
+var i;
+for(i=this.t-1;i>=0;--i){
+r[i+n]=this[i];
+}
+for(i=n-1;i>=0;--i){
+r[i]=0;
+}
+r.t=this.t+n;
+r.s=this.s;
+};
+function _19(n,r){
+for(var i=n;i<this.t;++i){
+r[i-n]=this[i];
+}
+r.t=Math.max(this.t-n,0);
+r.s=this.s;
+};
+function _1a(n,r){
+var bs=n%this._DB;
+var cbs=this._DB-bs;
+var bm=(1<<cbs)-1;
+var ds=Math.floor(n/this._DB),c=(this.s<<bs)&this._DM,i;
+for(i=this.t-1;i>=0;--i){
+r[i+ds+1]=(this[i]>>cbs)|c;
+c=(this[i]&bm)<<bs;
+}
+for(i=ds-1;i>=0;--i){
+r[i]=0;
+}
+r[ds]=c;
+r.t=this.t+ds+1;
+r.s=this.s;
+r._clamp();
+};
+function _1b(n,r){
+r.s=this.s;
+var ds=Math.floor(n/this._DB);
+if(ds>=this.t){
+r.t=0;
+return;
+}
+var bs=n%this._DB;
+var cbs=this._DB-bs;
+var bm=(1<<bs)-1;
+r[0]=this[ds]>>bs;
+for(var i=ds+1;i<this.t;++i){
+r[i-ds-1]|=(this[i]&bm)<<cbs;
+r[i-ds]=this[i]>>bs;
+}
+if(bs>0){
+r[this.t-ds-1]|=(this.s&bm)<<cbs;
+}
+r.t=this.t-ds;
+r._clamp();
+};
+function _1c(a,r){
+var i=0,c=0,m=Math.min(a.t,this.t);
+while(i<m){
+c+=this[i]-a[i];
+r[i++]=c&this._DM;
+c>>=this._DB;
+}
+if(a.t<this.t){
+c-=a.s;
+while(i<this.t){
+c+=this[i];
+r[i++]=c&this._DM;
+c>>=this._DB;
+}
+c+=this.s;
+}else{
+c+=this.s;
+while(i<a.t){
+c-=a[i];
+r[i++]=c&this._DM;
+c>>=this._DB;
+}
+c-=a.s;
+}
+r.s=(c<0)?-1:0;
+if(c<-1){
+r[i++]=this._DV+c;
+}else{
+if(c>0){
+r[i++]=c;
+}
+}
+r.t=i;
+r._clamp();
+};
+function _1d(a,r){
+var x=this.abs(),y=a.abs();
+var i=x.t;
+r.t=i+y.t;
+while(--i>=0){
+r[i]=0;
+}
+for(i=0;i<y.t;++i){
+r[i+x.t]=x.am(0,y[i],r,i,0,x.t);
+}
+r.s=0;
+r._clamp();
+if(this.s!=a.s){
+_4.ZERO._subTo(r,r);
+}
+};
+function _1e(r){
+var x=this.abs();
+var i=r.t=2*x.t;
+while(--i>=0){
+r[i]=0;
+}
+for(i=0;i<x.t-1;++i){
+var c=x.am(i,x[i],r,2*i,0,1);
+if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1))>=x._DV){
+r[i+x.t]-=x._DV;
+r[i+x.t+1]=1;
+}
+}
+if(r.t>0){
+r[r.t-1]+=x.am(i,x[i],r,2*i,0,1);
+}
+r.s=0;
+r._clamp();
+};
+function _1f(m,q,r){
+var pm=m.abs();
+if(pm.t<=0){
+return;
+}
+var pt=this.abs();
+if(pt.t<pm.t){
+if(q!=null){
+q._fromInt(0);
+}
+if(r!=null){
+this._copyTo(r);
+}
+return;
+}
+if(r==null){
+r=_5();
+}
+var y=_5(),ts=this.s,ms=m.s;
+var nsh=this._DB-_16(pm[pm.t-1]);
+if(nsh>0){
+pm._lShiftTo(nsh,y);
+pt._lShiftTo(nsh,r);
+}else{
+pm._copyTo(y);
+pt._copyTo(r);
+}
+var ys=y.t;
+var y0=y[ys-1];
+if(y0==0){
+return;
+}
+var yt=y0*(1<<this._F1)+((ys>1)?y[ys-2]>>this._F2:0);
+var d1=this._FV/yt,d2=(1<<this._F1)/yt,e=1<<this._F2;
+var i=r.t,j=i-ys,t=(q==null)?_5():q;
+y._dlShiftTo(j,t);
+if(r.compareTo(t)>=0){
+r[r.t++]=1;
+r._subTo(t,r);
+}
+_4.ONE._dlShiftTo(ys,t);
+t._subTo(y,y);
+while(y.t<ys){
+y[y.t++]=0;
+}
+while(--j>=0){
+var qd=(r[--i]==y0)?this._DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);
+if((r[i]+=y.am(0,qd,r,j,0,ys))<qd){
+y._dlShiftTo(j,t);
+r._subTo(t,r);
+while(r[i]<--qd){
+r._subTo(t,r);
+}
+}
+}
+if(q!=null){
+r._drShiftTo(ys,q);
+if(ts!=ms){
+_4.ZERO._subTo(q,q);
+}
+}
+r.t=ys;
+r._clamp();
+if(nsh>0){
+r._rShiftTo(nsh,r);
+}
+if(ts<0){
+_4.ZERO._subTo(r,r);
+}
+};
+function _20(a){
+var r=_5();
+this.abs()._divRemTo(a,null,r);
+if(this.s<0&&r.compareTo(_4.ZERO)>0){
+a._subTo(r,r);
+}
+return r;
+};
+function _21(m){
+this.m=m;
+};
+function _22(x){
+if(x.s<0||x.compareTo(this.m)>=0){
+return x.mod(this.m);
+}else{
+return x;
+}
+};
+function _23(x){
+return x;
+};
+function _24(x){
+x._divRemTo(this.m,null,x);
+};
+function _25(x,y,r){
+x._multiplyTo(y,r);
+this.reduce(r);
+};
+function _26(x,r){
+x._squareTo(r);
+this.reduce(r);
+};
+dojo.extend(_21,{convert:_22,revert:_23,reduce:_24,mulTo:_25,sqrTo:_26});
+function _27(){
+if(this.t<1){
+return 0;
+}
+var x=this[0];
+if((x&1)==0){
+return 0;
+}
+var y=x&3;
+y=(y*(2-(x&15)*y))&15;
+y=(y*(2-(x&255)*y))&255;
+y=(y*(2-(((x&65535)*y)&65535)))&65535;
+y=(y*(2-x*y%this._DV))%this._DV;
+return (y>0)?this._DV-y:-y;
+};
+function _28(m){
+this.m=m;
+this.mp=m._invDigit();
+this.mpl=this.mp&32767;
+this.mph=this.mp>>15;
+this.um=(1<<(m._DB-15))-1;
+this.mt2=2*m.t;
+};
+function _29(x){
+var r=_5();
+x.abs()._dlShiftTo(this.m.t,r);
+r._divRemTo(this.m,null,r);
+if(x.s<0&&r.compareTo(_4.ZERO)>0){
+this.m._subTo(r,r);
+}
+return r;
+};
+function _2a(x){
+var r=_5();
+x._copyTo(r);
+this.reduce(r);
+return r;
+};
+function _2b(x){
+while(x.t<=this.mt2){
+x[x.t++]=0;
+}
+for(var i=0;i<this.m.t;++i){
+var j=x[i]&32767;
+var u0=(j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x._DM;
+j=i+this.m.t;
+x[j]+=this.m.am(0,u0,x,i,0,this.m.t);
+while(x[j]>=x._DV){
+x[j]-=x._DV;
+x[++j]++;
+}
+}
+x._clamp();
+x._drShiftTo(this.m.t,x);
+if(x.compareTo(this.m)>=0){
+x._subTo(this.m,x);
+}
+};
+function _2c(x,r){
+x._squareTo(r);
+this.reduce(r);
+};
+function _2d(x,y,r){
+x._multiplyTo(y,r);
+this.reduce(r);
+};
+dojo.extend(_28,{convert:_29,revert:_2a,reduce:_2b,mulTo:_2d,sqrTo:_2c});
+function _2e(){
+return ((this.t>0)?(this[0]&1):this.s)==0;
+};
+function _2f(e,z){
+if(e>4294967295||e<1){
+return _4.ONE;
+}
+var r=_5(),r2=_5(),g=z.convert(this),i=_16(e)-1;
+g._copyTo(r);
+while(--i>=0){
+z.sqrTo(r,r2);
+if((e&(1<<i))>0){
+z.mulTo(r2,g,r);
+}else{
+var t=r;
+r=r2;
+r2=t;
+}
+}
+return z.revert(r);
+};
+function _30(e,m){
+var z;
+if(e<256||m._isEven()){
+z=new _21(m);
+}else{
+z=new _28(m);
+}
+return this._exp(e,z);
+};
+dojo.extend(_4,{_DB:_1,_DM:(1<<_1)-1,_DV:1<<_1,_FV:Math.pow(2,_9),_F1:_9-_1,_F2:2*_1-_9,_copyTo:_e,_fromInt:_f,_fromString:_10,_clamp:_11,_dlShiftTo:_18,_drShiftTo:_19,_lShiftTo:_1a,_rShiftTo:_1b,_subTo:_1c,_multiplyTo:_1d,_squareTo:_1e,_divRemTo:_1f,_invDigit:_27,_isEven:_2e,_exp:_2f,toString:_12,negate:_13,abs:_14,compareTo:_15,bitLength:_17,mod:_20,modPowInt:_30});
+dojo._mixin(_4,{ZERO:nbv(0),ONE:nbv(1),_nbi:_5,_nbv:nbv,_nbits:_16,_Montgomery:_28});
+dojox.math.BigInteger=_4;
+})();
+}
diff --git a/dojox/math/LICENSE-BigInteger b/dojox/math/LICENSE-BigInteger
new file mode 100644
index 0000000..7ccbf50
--- /dev/null
+++ b/dojox/math/LICENSE-BigInteger
@@ -0,0 +1,40 @@
+Licensing
+---------
+
+This software is covered under the following copyright:
+
+/*
+ * Copyright (c) 2003-2005  Tom Wu
+ * All Rights Reserved.
+ *
+ * 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" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF
+ * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * In addition, the following condition applies:
+ *
+ * All redistributions must retain an intact copy of this copyright notice
+ * and disclaimer.
+ */
+
+Address all questions regarding this license to:
+
+  Tom Wu
+  tjw at cs.Stanford.EDU
\ No newline at end of file
diff --git a/dojox/math/README b/dojox/math/README
index 645e55b..03f7506 100644
--- a/dojox/math/README
+++ b/dojox/math/README
@@ -11,11 +11,16 @@ Credits
 	Cal Henderson
 	Dan Pupius
 	Tom Trenka (ttrenka AT gmail.com)
+	Eugene Lazutkin (eugene.lazutkin 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.
+
+Port of Tom Wu's port of java.math.BigInteger released in 2005 under the BSD
+license (CLA on file). See http://www-cs-students.stanford.edu/~tjw/jsbn/
+for details.
 -------------------------------------------------------------------------------
 Dependencies:
 
@@ -28,8 +33,8 @@ 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/*
+http://svn.dojotoolkit.org/src/dojox/trunk/math.js
+http://svn.dojotoolkit.org/src/dojox/trunk/math/*
 
 Install into the following directory structure:
 /dojox/math/
diff --git a/dojox/math/_base.js b/dojox/math/_base.js
index 0b56225..a1b6d04 100644
--- a/dojox/math/_base.js
+++ b/dojox/math/_base.js
@@ -8,10 +8,16 @@
 if(!dojo._hasResource["dojox.math._base"]){
 dojo._hasResource["dojox.math._base"]=true;
 dojo.provide("dojox.math._base");
-dojo.mixin(dojox.math,{degreesToRadians:function(n){
+(function(){
+var m=dojox.math;
+dojo.mixin(dojox.math,{toRadians:function(n){
 return (n*Math.PI)/180;
-},radiansToDegrees:function(n){
+},toDegrees:function(n){
 return (n*180)/Math.PI;
+},degreesToRadians:function(n){
+return m.toRadians(n);
+},radiansToDegrees:function(n){
+return m.toDegrees(n);
 },factorial:function(n){
 if(n===0){
 return 1;
@@ -20,11 +26,11 @@ if(n<0||Math.floor(n)!=n){
 return NaN;
 }
 }
-var _4=1;
+var _1=1;
 for(var i=1;i<=n;i++){
-_4*=i;
+_1*=i;
 }
-return _4;
+return _1;
 },permutations:function(n,k){
 if(n==0||k==0){
 return 1;
@@ -45,34 +51,25 @@ var j=2*Math.random()-1;
 k=i*i+j*j;
 }while(k>=1);
 return i*Math.sqrt((-2*Math.log(k))/k);
-},sd:function(a){
-return Math.sqrt(this.variance(a));
-},variance:function(a){
-var _12=0,_13=0;
-dojo.forEach(a,function(_14){
-_12+=_14;
-_13+=Math.pow(_14,2);
-});
-return (_13/a.length)-Math.pow(_12/a.length,2);
-},range:function(a,b,_17){
+},range:function(a,b,_2){
 if(arguments.length<2){
 b=a,a=0;
 }
-var _18=[],s=_17||1,i;
+var _3=[],s=_2||1,i;
 if(s>0){
 for(i=a;i<b;i+=s){
-_18.push(i);
+_3.push(i);
 }
 }else{
 if(s<0){
 for(i=a;i>b;i+=s){
-_18.push(i);
+_3.push(i);
 }
 }else{
 throw new Error("dojox.math.range: step must not be zero.");
 }
 }
-return _18;
+return _3;
 },distance:function(a,b){
 return Math.sqrt(Math.pow(b[0]-a[0],2)+Math.pow(b[1]-a[1],2));
 },midpoint:function(a,b){
@@ -85,4 +82,5 @@ m[i]=(a[i]+b[i])/2;
 }
 return m;
 }});
+})();
 }
diff --git a/dojox/math/curves.js b/dojox/math/curves.js
index d376d5a..840879a 100644
--- a/dojox/math/curves.js
+++ b/dojox/math/curves.js
@@ -19,174 +19,174 @@ for(var i=0;i<_2.length;i++){
 _2[i]=Number(_2[i]);
 }
 this.getValue=function(n){
-var _5=new Array(this.dimensions);
+var _3=new Array(this.dimensions);
 for(var i=0;i<this.dimensions;i++){
-_5[i]=((this.end[i]-this.start[i])*n)+this.start[i];
+_3[i]=((this.end[i]-this.start[i])*n)+this.start[i];
 }
-return _5;
+return _3;
 };
 return this;
-},Bezier:function(_7){
-this.getValue=function(_8){
-if(_8>=1){
+},Bezier:function(_4){
+this.getValue=function(_5){
+if(_5>=1){
 return this.p[this.p.length-1];
 }
-if(_8<=0){
+if(_5<=0){
 return this.p[0];
 }
-var _9=new Array(this.p[0].length);
+var _6=new Array(this.p[0].length);
 for(var k=0;j<this.p[0].length;k++){
-_9[k]=0;
+_6[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(_8,this.p.length,i);
+C+=this.p[i][j]*this.p[this.p.length-1][0]*dojox.math.bernstein(_5,this.p.length,i);
 }
 for(var l=0;l<this.p.length;l++){
-D+=this.p[this.p.length-1][0]*dojox.math.bernstein(_8,this.p.length,l);
+D+=this.p[this.p.length-1][0]*dojox.math.bernstein(_5,this.p.length,l);
 }
-_9[j]=C/D;
+_6[j]=C/D;
 }
-return _9;
+return _6;
 };
-this.p=_7;
+this.p=_4;
 return this;
-},CatmullRom:function(_10,c){
-this.getValue=function(_12){
-var _13=_12*(this.p.length-1);
-var _14=Math.floor(_13);
-var _15=_13-_14;
-var i0=_14-1;
+},CatmullRom:function(_7,c){
+this.getValue=function(_8){
+var _9=_8*(this.p.length-1);
+var _a=Math.floor(_9);
+var _b=_9-_a;
+var i0=_a-1;
 if(i0<0){
 i0=0;
 }
-var i=_14;
-var i1=_14+1;
+var i=_a;
+var i1=_a+1;
 if(i1>=this.p.length){
 i1=this.p.length-1;
 }
-var i2=_14+2;
+var i2=_a+2;
 if(i2>=this.p.length){
 i2=this.p.length-1;
 }
-var u=_15;
-var u2=_15*_15;
-var u3=_15*_15*_15;
-var _1d=new Array(this.p[0].length);
+var u=_b;
+var u2=_b*_b;
+var u3=_b*_b*_b;
+var _c=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];
-_1d[k]=x1*u3+x2*u2+x3*u+x4;
+_c[k]=x1*u3+x2*u2+x3*u+x4;
 }
-return _1d;
+return _c;
 };
 if(!c){
 this.c=0.7;
 }else{
 this.c=c;
 }
-this.p=_10;
+this.p=_7;
 return this;
-},Arc:function(_23,end,ccw){
-function _26(a,b){
+},Arc:function(_d,_e,_f){
+function _10(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 _2b(a){
+function _11(a){
 var b=new Array(a.length);
 for(var i=0;i<a.length;i++){
 b[i]=-a[i];
 }
 return b;
 };
-var _2f=dojox.math.midpoint(_23,end);
-var _30=_26(_2b(_2f),_23);
-var rad=Math.sqrt(Math.pow(_30[0],2)+Math.pow(_30[1],2));
-var _32=dojox.math.radiansToDegrees(Math.atan(_30[1]/_30[0]));
-if(_30[0]<0){
-_32-=90;
+var _12=dojox.math.midpoint(_d,_e);
+var _13=_10(_11(_12),_d);
+var rad=Math.sqrt(Math.pow(_13[0],2)+Math.pow(_13[1],2));
+var _14=dojox.math.radiansToDegrees(Math.atan(_13[1]/_13[0]));
+if(_13[0]<0){
+_14-=90;
 }else{
-_32+=90;
+_14+=90;
 }
-dojox.math.curves.CenteredArc.call(this,_2f,rad,_32,_32+(ccw?-180:180));
-},CenteredArc:function(_33,_34,_35,end){
-this.center=_33;
-this.radius=_34;
-this.start=_35||0;
+dojox.math.curves.CenteredArc.call(this,_12,rad,_14,_14+(_f?-180:180));
+},CenteredArc:function(_15,_16,_17,end){
+this.center=_15;
+this.radius=_16;
+this.start=_17||0;
 this.end=end;
 this.getValue=function(n){
-var _38=new Array(2);
-var _39=dojox.math.degreesToRadians(this.start+((this.end-this.start)*n));
-_38[0]=this.center[0]+this.radius*Math.sin(_39);
-_38[1]=this.center[1]-this.radius*Math.cos(_39);
-return _38;
+var _18=new Array(2);
+var _19=dojox.math.degreesToRadians(this.start+((this.end-this.start)*n));
+_18[0]=this.center[0]+this.radius*Math.sin(_19);
+_18[1]=this.center[1]-this.radius*Math.cos(_19);
+return _18;
 };
 return this;
-},Circle:function(_3a,_3b){
-dojox.math.curves.CenteredArc.call(this,_3a,_3b,0,360);
+},Circle:function(_1a,_1b){
+dojox.math.curves.CenteredArc.call(this,_1a,_1b,0,360);
 return this;
 },Path:function(){
-var _3c=[];
-var _3d=[];
-var _3e=[];
-var _3f=0;
-this.add=function(_40,_41){
-if(_41<0){
+var _1c=[];
+var _1d=[];
+var _1e=[];
+var _1f=0;
+this.add=function(_20,_21){
+if(_21<0){
 console.error("dojox.math.curves.Path.add: weight cannot be less than 0");
 }
-_3c.push(_40);
-_3d.push(_41);
-_3f+=_41;
-_42();
+_1c.push(_20);
+_1d.push(_21);
+_1f+=_21;
+_22();
 };
-this.remove=function(_43){
-for(var i=0;i<_3c.length;i++){
-if(_3c[i]==_43){
-_3c.splice(i,1);
-_3f-=_3d.splice(i,1)[0];
+this.remove=function(_23){
+for(var i=0;i<_1c.length;i++){
+if(_1c[i]==_23){
+_1c.splice(i,1);
+_1f-=_1d.splice(i,1)[0];
 break;
 }
 }
-_42();
+_22();
 };
 this.removeAll=function(){
-_3c=[];
-_3d=[];
-_3f=0;
+_1c=[];
+_1d=[];
+_1f=0;
 };
 this.getValue=function(n){
-var _46=false,_47=0;
-for(var i=0;i<_3e.length;i++){
-var r=_3e[i];
+var _24=false,_25=0;
+for(var i=0;i<_1e.length;i++){
+var r=_1e[i];
 if(n>=r[0]&&n<r[1]){
-var _4a=(n-r[0])/r[2];
-_47=_3c[i].getValue(_4a);
-_46=true;
+var _26=(n-r[0])/r[2];
+_25=_1c[i].getValue(_26);
+_24=true;
 break;
 }
 }
-if(!_46){
-_47=_3c[_3c.length-1].getValue(1);
+if(!_24){
+_25=_1c[_1c.length-1].getValue(1);
 }
 for(var j=0;j<i;j++){
-_47=dojox.math.points.translate(_47,_3c[j].getValue(1));
+_25=dojox.math.points.translate(_25,_1c[j].getValue(1));
 }
-return _47;
+return _25;
 };
-function _42(){
-var _4c=0;
-for(var i=0;i<_3d.length;i++){
-var end=_4c+_3d[i]/_3f;
-var len=end-_4c;
-_3e[i]=[_4c,end,len];
-_4c=end;
+function _22(){
+var _27=0;
+for(var i=0;i<_1d.length;i++){
+var end=_27+_1d[i]/_1f;
+var len=end-_27;
+_1e[i]=[_27,end,len];
+_27=end;
 }
 };
 return this;
diff --git a/dojox/math/matrix.js b/dojox/math/matrix.js
index fbb3840..18c6d9a 100644
--- a/dojox/math/matrix.js
+++ b/dojox/math/matrix.js
@@ -41,25 +41,25 @@ console.warn("can't sum 0 matrices!");
 return 0;
 }
 var m=this.copy(arguments[0]);
-var _e=m.length;
-if(_e==0){
+var _1=m.length;
+if(_1==0){
 console.warn("can't deal with matrices of 0 rows!");
 return 0;
 }
-var _f=m[0].length;
-if(_f==0){
+var _2=m[0].length;
+if(_2==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!=_e||arg[0].length!=_f){
-console.warn("can't add matrices of different dimensions: first dimensions were "+_e+"x"+_f+", current dimensions are "+arg.length+"x"+arg[0].length);
+var _3=arguments[i];
+if(_3.length!=_1||_3[0].length!=_2){
+console.warn("can't add matrices of different dimensions: first dimensions were "+_1+"x"+_2+", current dimensions are "+_3.length+"x"+_3[0].length);
 return 0;
 }
-for(var r=0;r<_e;r++){
-for(var c=0;c<_f;c++){
-m[r][c]+=arg[r][c];
+for(var r=0;r<_1;r++){
+for(var c=0;c<_2;c++){
+m[r][c]+=_3[r][c];
 }
 }
 }
@@ -68,15 +68,15 @@ return m;
 if(a.length==1&&a[0].length==1){
 return [[1/a[0][0]]];
 }
-var tms=a.length,m=this.create(tms,tms),mm=this.adjoint(a),det=this.determinant(a),dd=0;
-if(det==0){
+var _4=a.length,m=this.create(_4,_4),mm=this.adjoint(a),_5=this.determinant(a),dd=0;
+if(_5==0){
 console.warn("Determinant Equals 0, Not Invertible.");
 return [[0]];
 }else{
-dd=1/det;
+dd=1/_5;
 }
-for(var i=0;i<tms;i++){
-for(var j=0;j<tms;j++){
+for(var i=0;i<_4;i++){
+for(var j=0;j<_4;j++){
 m[i][j]=dd*mm[i][j];
 }
 }
@@ -86,63 +86,63 @@ 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){
+var _6=a.length,_7=1,b=this.upperTriangle(a);
+for(var i=0;i<_6;i++){
+var _8=b[i][i];
+if(Math.abs(_8)<this.ALMOST_ZERO){
 return 0;
 }
-det*=bii;
+_7*=_8;
 }
-det*=this.iDF;
-return det;
+_7*=this.iDF;
+return _7;
 },upperTriangle:function(m){
 m=this.copy(m);
-var f1=0,_24=0,tms=m.length,v=1;
+var f1=0,_9=0,_a=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]);
+for(var _b=0;_b<_a-1;_b++){
+if(typeof m[_b][_b]!="number"){
+console.warn("non-numeric entry found in a numeric matrix: m["+_b+"]["+_b+"]="+m[_b][_b]);
 }
 v=1;
-var _28=0;
-while((m[col][col]==0)&&!_28){
-if(col+v>=tms){
+var _c=0;
+while((m[_b][_b]==0)&&!_c){
+if(_b+v>=_a){
 this.iDF=0;
-_28=1;
+_c=1;
 }else{
-for(var r=0;r<tms;r++){
-_24=m[col][r];
-m[col][r]=m[col+v][r];
-m[col+v][r]=_24;
+for(var r=0;r<_a;r++){
+_9=m[_b][r];
+m[_b][r]=m[_b+v][r];
+m[_b+v][r]=_9;
 }
 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]);
+for(var _d=_b+1;_d<_a;_d++){
+if(typeof m[_d][_b]!="number"){
+console.warn("non-numeric entry found in a numeric matrix: m["+_d+"]["+_b+"]="+m[_d][_b]);
 }
-if(typeof m[col][row]!="number"){
-console.warn("non-numeric entry found in a numeric matrix: m["+col+"]["+row+"]="+m[col][row]);
+if(typeof m[_b][_d]!="number"){
+console.warn("non-numeric entry found in a numeric matrix: m["+_b+"]["+_d+"]="+m[_b][_d]);
 }
-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];
+if(m[_b][_b]!=0){
+var f1=(-1)*m[_d][_b]/m[_b][_b];
+for(var i=_b;i<_a;i++){
+m[_d][i]=f1*m[_b][i]+m[_d][i];
 }
 }
 }
 }
 return m;
-},create:function(a,b,_2e){
-_2e=_2e||0;
+},create:function(a,b,_e){
+_e=_e||0;
 var m=[];
 for(var i=0;i<b;i++){
 m[i]=[];
 for(var j=0;j<a;j++){
-m[i][j]=_2e;
+m[i][j]=_e;
 }
 }
 return m;
@@ -150,13 +150,13 @@ return m;
 return this.create(a,b,1);
 },zeros:function(a,b){
 return this.create(a,b);
-},identity:function(_36,_37){
-_37=_37||1;
+},identity:function(_f,_10){
+_10=_10||1;
 var m=[];
-for(var i=0;i<_36;i++){
+for(var i=0;i<_f;i++){
 m[i]=[];
-for(var j=0;j<_36;j++){
-m[i][j]=(i==j?_37:0);
+for(var j=0;j<_f;j++){
+m[i][j]=(i==j?_10:0);
 }
 }
 return m;
@@ -202,9 +202,9 @@ m[j][i]=a[i][j];
 }
 }
 return m;
-},format:function(a,_4b){
-_4b=_4b||5;
-function _4c(x,dp){
+},format:function(a,_11){
+_11=_11||5;
+function _12(x,dp){
 var fac=Math.pow(10,dp);
 var a=Math.round(x*fac)/fac;
 var b=a.toString();
@@ -221,15 +221,15 @@ return b;
 };
 var ya=a.length;
 var xa=ya>0?a[0].length:0;
-var _54="";
+var _13="";
 for(var y=0;y<ya;y++){
-_54+="| ";
+_13+="| ";
 for(var x=0;x<xa;x++){
-_54+=_4c(a[y][x],_4b)+" ";
+_13+=_12(a[y][x],_11)+" ";
 }
-_54+="|\n";
+_13+="|\n";
 }
-return _54;
+return _13;
 },copy:function(a){
 var ya=a.length,xa=a[0].length,m=this.create(xa,ya);
 for(var y=0;y<ya;y++){
@@ -238,12 +238,12 @@ m[y][x]=a[y][x];
 }
 }
 return m;
-},scale:function(a,_5e){
+},scale:function(a,_14){
 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]*=_5e;
+a[y][x]*=_14;
 }
 }
 return a;
diff --git a/dojox/math/random/Secure.js b/dojox/math/random/Secure.js
new file mode 100644
index 0000000..92c2356
--- /dev/null
+++ b/dojox/math/random/Secure.js
@@ -0,0 +1,54 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.math.random.Secure"]){
+dojo._hasResource["dojox.math.random.Secure"]=true;
+dojo.provide("dojox.math.random.Secure");
+dojo.declare("dojox.math.random.Secure",null,{constructor:function(_1,_2){
+this.prng=_1;
+var p=this.pool=new Array(_1.size);
+this.pptr=0;
+for(var i=0,_3=_1.size;i<_3;){
+var t=Math.floor(65536*Math.random());
+p[i++]=t>>>8;
+p[i++]=t&255;
+}
+this.seedTime();
+if(!_2){
+this.h=[dojo.connect(dojo.body(),"onclick",this,"seedTime"),dojo.connect(dojo.body(),"onkeypress",this,"seedTime")];
+}
+},destroy:function(){
+if(this.h){
+dojo.forEach(this.h,dojo.disconnect);
+}
+},nextBytes:function(_4){
+var _5=this.state;
+if(!_5){
+this.seedTime();
+_5=this.state=this.prng();
+_5.init(this.pool);
+for(var p=this.pool,i=0,_6=p.length;i<_6;p[i++]=0){
+}
+this.pptr=0;
+}
+for(var i=0,_6=_4.length;i<_6;++i){
+_4[i]=_5.next();
+}
+},seedTime:function(){
+this._seed_int(new Date().getTime());
+},_seed_int:function(x){
+var p=this.pool,i=this.pptr;
+p[i++]^=x&255;
+p[i++]^=(x>>8)&255;
+p[i++]^=(x>>16)&255;
+p[i++]^=(x>>24)&255;
+if(i>=this.prng.size){
+i-=this.prng.size;
+}
+this.pptr=i;
+}});
+}
diff --git a/dojox/math/random/Simple.js b/dojox/math/random/Simple.js
new file mode 100644
index 0000000..f5a8833
--- /dev/null
+++ b/dojox/math/random/Simple.js
@@ -0,0 +1,17 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.math.random.Simple"]){
+dojo._hasResource["dojox.math.random.Simple"]=true;
+dojo.provide("dojox.math.random.Simple");
+dojo.declare("dojox.math.random.Simple",null,{destroy:function(){
+},nextBytes:function(_1){
+for(var i=0,l=_1.length;i<l;++i){
+_1[i]=Math.floor(256*Math.random());
+}
+}});
+}
diff --git a/dojox/math/random/prng4.js b/dojox/math/random/prng4.js
new file mode 100644
index 0000000..fdd0704
--- /dev/null
+++ b/dojox/math/random/prng4.js
@@ -0,0 +1,45 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.math.random.prng4"]){
+dojo._hasResource["dojox.math.random.prng4"]=true;
+dojo.provide("dojox.math.random.prng4");
+(function(){
+function _1(){
+this.i=0;
+this.j=0;
+this.S=new Array(256);
+};
+dojo.extend(_1,{init:function(_2){
+var i,j,t,S=this.S,_3=_2.length;
+for(i=0;i<256;++i){
+S[i]=i;
+}
+j=0;
+for(i=0;i<256;++i){
+j=(j+S[i]+_2[i%_3])&255;
+t=S[i];
+S[i]=S[j];
+S[j]=t;
+}
+this.i=0;
+this.j=0;
+},next:function(){
+var t,i,j,S=this.S;
+this.i=i=(this.i+1)&255;
+this.j=j=(this.j+S[i])&255;
+t=S[i];
+S[i]=S[j];
+S[j]=t;
+return S[(t+S[i])&255];
+}});
+dojox.math.random.prng4=function(){
+return new _1();
+};
+dojox.math.random.prng4.size=256;
+})();
+}
diff --git a/dojox/math/stats.js b/dojox/math/stats.js
new file mode 100644
index 0000000..220a57f
--- /dev/null
+++ b/dojox/math/stats.js
@@ -0,0 +1,108 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.math.stats"]){
+dojo._hasResource["dojox.math.stats"]=true;
+dojo.provide("dojox.math.stats");
+(function(){
+var st=dojox.math.stats;
+dojo.mixin(st,{sd:function(a){
+return Math.sqrt(st.variance(a));
+},variance:function(a){
+var _1=0,_2=0;
+dojo.forEach(a,function(_3){
+_1+=_3;
+_2+=Math.pow(_3,2);
+});
+return (_2/a.length)-Math.pow(_1/a.length,2);
+},bestFit:function(a,_4,_5){
+_4=_4||"x",_5=_5||"y";
+if(a[0]!==undefined&&typeof (a[0])=="number"){
+a=dojo.map(a,function(_6,_7){
+return {x:_7,y:_6};
+});
+}
+var sx=0,sy=0,_8=0,_9=0,_a=0,_b=0,_c=0,n=a.length,t;
+for(var i=0;i<n;i++){
+sx+=a[i][_4];
+sy+=a[i][_5];
+_8+=Math.pow(a[i][_4],2);
+_9+=Math.pow(a[i][_5],2);
+_a+=a[i][_4]*a[i][_5];
+}
+for(i=0;i<n;i++){
+t=a[i][_4]-sx/n;
+_b+=t*t;
+_c+=t*a[i][_5];
+}
+var _d=_c/(_b||1);
+var d=Math.sqrt((_8-Math.pow(sx,2)/n)*(_9-Math.pow(sy,2)/n));
+if(d===0){
+throw new Error("dojox.math.stats.bestFit: the denominator for Pearson's R is 0.");
+}
+var r=(_a-(sx*sy/n))/d;
+var r2=Math.pow(r,2);
+if(_d<0){
+r=-r;
+}
+return {slope:_d,intercept:(sy-sx*_d)/(n||1),r:r,r2:r2};
+},forecast:function(a,x,_e,_f){
+var fit=st.bestFit(a,_e,_f);
+return (fit.slope*x)+fit.intercept;
+},mean:function(a){
+var t=0;
+dojo.forEach(a,function(v){
+t+=v;
+});
+return t/Math.max(a.length,1);
+},min:function(a){
+return Math.min.apply(null,a);
+},max:function(a){
+return Math.max.apply(null,a);
+},median:function(a){
+var t=a.slice(0).sort(function(a,b){
+return a-b;
+});
+return (t[Math.floor(a.length/2)]+t[Math.ceil(a.length/2)])/2;
+},mode:function(a){
+var o={},r=0,m=Number.MIN_VALUE;
+dojo.forEach(a,function(v){
+(o[v]!==undefined)?o[v]++:o[v]=1;
+});
+for(var p in o){
+if(m<o[p]){
+m=o[p],r=p;
+}
+}
+return r;
+},sum:function(a){
+var sum=0;
+dojo.forEach(a,function(n){
+sum+=n;
+});
+return sum;
+},approxLin:function(a,pos){
+var p=pos*(a.length-1),t=Math.ceil(p),f=t-1;
+if(f<0){
+return a[0];
+}
+if(t>=a.length){
+return a[a.length-1];
+}
+return a[f]*(t-p)+a[t]*(p-f);
+},summary:function(a,_10){
+if(!_10){
+a=a.slice(0);
+a.sort(function(a,b){
+return a-b;
+});
+}
+var l=st.approxLin,_11={min:a[0],p25:l(a,0.25),med:l(a,0.5),p75:l(a,0.75),max:a[a.length-1],p10:l(a,0.1),p90:l(a,0.9)};
+return _11;
+}});
+})();
+}
diff --git a/dojox/off.js b/dojox/off.js
deleted file mode 100644
index ebe18cd..0000000
--- a/dojox/off.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.off"]){
-dojo._hasResource["dojox.off"]=true;
-dojo.provide("dojox.off");
-dojo.require("dojox.off._common");
-}
diff --git a/dojox/off/README b/dojox/off/README
deleted file mode 100644
index cede939..0000000
--- a/dojox/off/README
+++ /dev/null
@@ -1,28 +0,0 @@
--------------------------------------------------------------------------------
-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.
--------------------------------------------------------------------------------
diff --git a/dojox/off/_common.js b/dojox/off/_common.js
deleted file mode 100644
index 4a279d0..0000000
--- a/dojox/off/_common.js
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.off._common"]){
-dojo._hasResource["dojox.off._common"]=true;
-dojo.provide("dojox.off._common");
-dojo.require("dojo.gears");
-dojo.require("dojox.storage");
-dojo.require("dojox.sql");
-dojo.require("dojox.off.sync");
-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(_1){
-},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(_2){
-if(dojox.off.sync.isSyncing||dojox.off.goingOnline){
-return;
-}
-this.goingOnline=true;
-this.isOnline=false;
-this._isSiteAvailable(_2);
-},onFrameworkEvent:function(_3,_4){
-if(_3=="save"){
-if(_4.isCoreSave&&(_4.status==dojox.storage.FAILED)){
-dojox.off.coreOpFailed=true;
-dojox.off.enabled=false;
-dojox.off.onFrameworkEvent("coreOperationFailed");
-}
-}else{
-if(_3=="coreOperationFailed"){
-dojox.off.coreOpFailed=true;
-dojox.off.enabled=false;
-}
-}
-},_checkOfflineCacheAvailable:function(_5){
-this.hasOfflineCache=dojo.gears.available;
-_5();
-},_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(_6){
-dojo.xhrGet({url:this._getAvailabilityURL(),handleAs:"text",timeout:this.NET_CHECK*1000,error:dojo.hitch(this,function(_7){
-this.goingOnline=false;
-this.isOnline=false;
-if(_6){
-_6(false);
-}
-}),load:dojo.hitch(this,function(_8){
-this.goingOnline=false;
-this.isOnline=true;
-if(_6){
-_6(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(_a){
-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(_b){
-if(!this.isOnline){
-this.isOnline=true;
-this.onNetwork("online");
-}
-})});
-}),this.NET_CHECK*1000);
-},_getAvailabilityURL:function(){
-var _c=this.availabilityURL.toString();
-if(_c.indexOf("?")==-1){
-_c+="?";
-}else{
-_c+="&";
-}
-_c+="browserbust="+new Date().getTime();
-return _c;
-},_onOfflineCacheInstalled:function(){
-this.onFrameworkEvent("offlineCacheInstalled");
-},_cacheDojoResources:function(){
-var _d=true;
-dojo.forEach(dojo.query("script"),function(i){
-var _f=i.getAttribute("src");
-if(!_f){
-return;
-}
-if(_f.indexOf("_base/_loader/bootstrap.js")!=-1){
-_d=false;
-}
-});
-if(!_d){
-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(_11){
-dojox.off.sync._load(_11);
-}});
-dojox.storage.manager.addOnLoad(dojo.hitch(dojox.off,"_onStorageLoad"));
-dojo.addOnLoad(dojox.off,"_onPageLoad");
-}
diff --git a/dojox/off/docs/bookmarklets.html b/dojox/off/docs/bookmarklets.html
deleted file mode 100644
index c5ece2e..0000000
--- a/dojox/off/docs/bookmarklets.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<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>
diff --git a/dojox/off/files.js b/dojox/off/files.js
deleted file mode 100644
index b9a1b47..0000000
--- a/dojox/off/files.js
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["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(_1){
-if(dojo.isString(_1)){
-var _2=this._trimAnchor(_1+"");
-if(!this.isAvailable(_2)){
-this.listOfURLs.push(_2);
-}
-}else{
-if(_1 instanceof dojo._Url){
-var _2=this._trimAnchor(_1.uri);
-if(!this.isAvailable(_2)){
-this.listOfURLs.push(_2);
-}
-}else{
-dojo.forEach(_1,function(_3){
-_3=this._trimAnchor(_3);
-if(!this.isAvailable(_3)){
-this.listOfURLs.push(_3);
-}
-},this);
-}
-}
-},printURLs:function(){
-
-dojo.forEach(this.listOfURLs,function(i){
-
-});
-},remove:function(_5){
-for(var i=0;i<this.listOfURLs.length;i++){
-if(this.listOfURLs[i]==_5){
-this.listOfURLs=this.listOfURLs.splice(i,1);
-break;
-}
-}
-},isAvailable:function(_7){
-for(var i=0;i<this.listOfURLs.length;i++){
-if(this.listOfURLs[i]==_7){
-return true;
-}
-}
-return false;
-},refresh:function(_9){
-try{
-if(dojo.config.isDebug){
-this.printURLs();
-}
-this.refreshing=true;
-if(this.versionURL){
-this._getVersionInfo(function(_a,_b,_c){
-if(dojo.config.isDebug||!_b||_c||!_a||_a!=_b){
-console.warn("Refreshing offline file list");
-this._doRefresh(_9,_b);
-}else{
-console.warn("No need to refresh offline file list");
-_9(false,[]);
-}
-});
-}else{
-console.warn("Refreshing offline file list");
-this._doRefresh(_9);
-}
-}
-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 _d=dojo.hitch(this,function(_e){
-if(this._sameLocation(_e)){
-this.cache(_e);
-}
-});
-_d(window.location.href);
-dojo.query("script").forEach(function(i){
-try{
-_d(i.getAttribute("src"));
-}
-catch(exp){
-}
-});
-dojo.query("link").forEach(function(i){
-try{
-if(!i.getAttribute("rel")||i.getAttribute("rel").toLowerCase()!="stylesheet"){
-return;
-}
-_d(i.getAttribute("href"));
-}
-catch(exp){
-}
-});
-dojo.query("img").forEach(function(i){
-try{
-_d(i.getAttribute("src"));
-}
-catch(exp){
-}
-});
-dojo.query("a").forEach(function(i){
-try{
-_d(i.getAttribute("href"));
-}
-catch(exp){
-}
-});
-dojo.forEach(document.styleSheets,function(_13){
-try{
-if(_13.cssRules){
-dojo.forEach(_13.cssRules,function(_14){
-var _15=_14.cssText;
-if(_15){
-var _16=_15.match(/url\(\s*([^\) ]*)\s*\)/i);
-if(!_16){
-return;
-}
-for(var i=1;i<_16.length;i++){
-_d(_16[i]);
-}
-}
-});
-}else{
-if(_13.cssText){
-var _18;
-var _19=_13.cssText.toString();
-var _1a=_19.split(/\f|\r|\n/);
-for(var i=0;i<_1a.length;i++){
-_18=_1a[i].match(/url\(\s*([^\) ]*)\s*\)/i);
-if(_18&&_18.length){
-_d(_18[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(_1e,_1f){
-var _20;
-try{
-_20=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 _21="dot_store_"+window.location.href.replace(/[^0-9A-Za-z_]/g,"_");
-if(_21.length>=64){
-_21=_21.substring(0,63);
-}
-_20.removeStore(_21);
-_20.openStore(_21);
-var _22=_20.createStore(_21);
-this._store=_22;
-var _23=this;
-this._currentFileIndex=0;
-this._cancelID=_22.capture(this.listOfURLs,function(url,_25,_26){
-if(!_25&&_23.refreshing){
-_23._cancelID=null;
-_23.refreshing=false;
-var _27=[];
-_27.push("Unable to capture: "+url);
-_1e(true,_27);
-return;
-}else{
-if(_25){
-_23._currentFileIndex++;
-}
-}
-if(_25&&_23._currentFileIndex>=_23.listOfURLs.length){
-_23._cancelID=null;
-_23.refreshing=false;
-if(_1f){
-dojox.storage.put("oldVersion",_1f,null,dojox.off.STORAGE_NAMESPACE);
-}
-dojox.storage.put("justDebugged",dojo.config.isDebug,null,dojox.off.STORAGE_NAMESPACE);
-_1e(false,[]);
-}
-});
-},_getVersionInfo:function(_28){
-var _29=dojox.storage.get("justDebugged",dojox.off.STORAGE_NAMESPACE);
-var _2a=dojox.storage.get("oldVersion",dojox.off.STORAGE_NAMESPACE);
-var _2b=null;
-_28=dojo.hitch(this,_28);
-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);
-_28(_2a,_2b,_29);
-},load:function(_2d){
-if(_2d){
-_2b=_2d;
-}
-_28(_2a,_2b,_29);
-}});
-}};
-}
diff --git a/dojox/off/network_check.txt b/dojox/off/network_check.txt
deleted file mode 100644
index d00491f..0000000
--- a/dojox/off/network_check.txt
+++ /dev/null
@@ -1 +0,0 @@
-1
diff --git a/dojox/off/offline.js b/dojox/off/offline.js
deleted file mode 100644
index 2d1b8c8..0000000
--- a/dojox/off/offline.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-/*
-	This is 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.wa [...]
diff --git a/dojox/off/offline.js.uncompressed.js b/dojox/off/offline.js.uncompressed.js
deleted file mode 100644
index 92f35aa..0000000
--- a/dojox/off/offline.js.uncompressed.js
+++ /dev/null
@@ -1,6243 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-/*
-	This is 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, namespace){
-		//			  alert("status="+status+", key="+key+", message="+message);
-		//			};
-		//			dojox.storage.put("test", "hello world", resultsHandler);
-		//
-		//			Arguments:
-		//
-		//			status - The status of the put operation, given by
-		//								dojox.storage.FAILED, dojox.storage.SUCCEEDED, or
-		//								dojox.storage.PENDING
-		//			key - The key that was used for the put
-		//			message - An optional message if there was an error or things failed.
-		//			namespace - The namespace of the key. This comes at the end since
-		//									it was added later.
-		//	
-		//		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
-		
-		for(var i = 0; i < keys.length; i++){ 
-			dojox.storage.put(keys[i], values[i], resultsHandler, namespace); 
-		}
-	},
-
-	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
-		
-		var results = []; 
-		for(var i = 0; i < keys.length; i++){ 
-			results.push(dojox.storage.get(keys[i], namespace)); 
-		} 
-		
-		return results;
-	},
-
-	removeMultiple: function(/*array*/ keys, /*string?*/ namespace) {
-		// summary: Removes the given keys from this storage system.
-		
-		for(var i = 0; i < keys.length; i++){ 
-			dojox.storage.remove(keys[i], namespace); 
-		}
-	},
-	
-	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);
-		}, this); // 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");
-//
-// 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. 
-		
-		//
-		
-		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(){
-		//
-		
-		dojo.forEach(this._onLoadListeners, function(i){ 
-			try{ 
-				i(); 
-			}catch(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["dojo.gears"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.gears"] = true;
-dojo.provide("dojo.gears");
-
-dojo.gears._gearsObject = function(){
-	// summary: 
-	//		factory method to get a Google Gears plugin instance to
-	//		expose in the browser runtime environment, if present
-	var factory;
-	var results;
-	
-	var gearsObj = dojo.getObject("google.gears");
-	if(gearsObj){ return gearsObj; } // already defined elsewhere
-	
-	if(typeof GearsFactory != "undefined"){ // Firefox
-		factory = new GearsFactory();
-	}else{
-		if(dojo.isIE){
-			// IE
-			try{
-				factory = new ActiveXObject("Gears.Factory");
-			}catch(e){
-				// ok to squelch; there's no gears factory.  move on.
-			}
-		}else if(navigator.mimeTypes["application/x-googlegears"]){
-			// Safari?
-			factory = document.createElement("object");
-			factory.setAttribute("type", "application/x-googlegears");
-			factory.setAttribute("width", 0);
-			factory.setAttribute("height", 0);
-			factory.style.display = "none";
-			document.documentElement.appendChild(factory);
-		}
-	}
-
-	// still nothing?
-	if(!factory){ return null; }
-	
-	// define the global objects now; don't overwrite them though if they
-	// were somehow set internally by the Gears plugin, which is on their
-	// dev roadmap for the future
-	dojo.setObject("google.gears.factory", factory);
-	return dojo.getObject("google.gears");
-};
-
-/*=====
-dojo.gears.available = {
-	// summary: True if client is using Google Gears
-};
-=====*/
-// see if we have Google Gears installed, and if
-// so, make it available in the runtime environment
-// and in the Google standard 'google.gears' global object
-dojo.gears.available = (!!dojo.gears._gearsObject())||0;
-
-}
-
-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;
-dojo.provide("dojox.sql._crypto");
-dojo.mixin(dojox.sql._crypto, {
-	// summary: dojox.sql cryptography code
-	// description: 
-	//	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 at columbia.edu
-	//
-	// _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, parseInt(workerID,10));
-		}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._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojox.sql._base"] = true;
-dojo.provide("dojox.sql._base");
-
-
-dojo.mixin(dojox.sql, {
-	// 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)
-
-	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
-			var crypto;
-			if(this._needsEncrypt(sql)){
-				crypto = new dojox.sql._SQLCrypto("encrypt", sql, 
-													password, args, 
-													callback);
-				return null; // encrypted results will arrive asynchronously
-			}else if(this._needsDecrypt(sql)){ // otherwise we have a DECRYPT statement
-				crypto = new dojox.sql._SQLCrypto("decrypt", sql, 
-													password, args, 
-													callback);
-				return null; // 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;
-			
-			
-			
-			if(this._autoClose){
-				try{ 
-					this.close(); 
-				}catch(e){
-					
-				}
-			}
-		
-			throw exp;
-		}
-		
-		return null;
-	},
-
-	_initDb: function(){
-		if(!this.db){
-			try{
-				this.db = google.gears.factory.create('beta.database', '1.0');
-			}catch(exp){
-				dojo.setObject("google.gears.denied", true);
-				if(dojox.off){
-				  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 += ")";
-	
-		
-	},
-
-	_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);
-	}
-});
-
-dojo.declare("dojox.sql._SQLCrypto", null, {
-	// 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.	
-	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){
-		//
-	
-		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){
-		//
-		
-		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(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 = tester.exec(sql);
-			while(matches){
-				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;
-				});
-				
-				matches = tester.exec(sql)
-			}
-		}
-
-		return results;
-	},
-
-	_decryptSingleColumn: function(columnName, columnValue, password, currentRowIndex,
-											callback){
-		//
-		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){
-				//
-				callback(this._finalResultSet);
-			}
-		}));
-	}
-});
-
-(function(){
-
-	var orig_sql = dojox.sql;
-	dojox.sql = new Function("return dojox.sql._exec(arguments);");
-	dojo.mixin(dojox.sql, orig_sql);
-	
-})();
-
-}
-
-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.gears.available){
-	
-	(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 at columbia.edu 
-			constructor: function(){
-			},
-			// instance methods and properties
-			TABLE_NAME: "__DOJO_STORAGE",
-			initialized: false,
-			
-			_available: null,
-			_storageReady: false,
-			
-			initialize: function(){
-				//
-				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";
-				
-				// we delay creating our internal tables until an operation is
-				// actually called, to avoid having a Gears permission dialog
-				// on page load (bug #7538)
-				
-				// 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.gears.available;
-			},
-
-			put: function(key, value, resultsHandler, namespace){
-				this._initStorage();
-				
-				if(!this.isValidKey(key)){
-					throw new Error("Invalid key given: " + key);
-				}
-				
-				namespace = namespace||this.DEFAULT_NAMESPACE;
-				if(!this.isValidKey(namespace)){
-					throw new Error("Invalid namespace given: " + key);
-				}
-				
-				// 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
-					
-					resultsHandler(this.FAILED, key, e.toString(), namespace);
-					return;
-				}
-				
-				if(resultsHandler){
-					resultsHandler(dojox.storage.SUCCESS, key, null, namespace);
-				}
-			},
-
-			get: function(key, namespace){
-				this._initStorage();
-				
-				if(!this.isValidKey(key)){
-					throw new Error("Invalid key given: " + key);
-				}
-				
-				namespace = namespace||this.DEFAULT_NAMESPACE;
-				if(!this.isValidKey(namespace)){
-					throw new Error("Invalid namespace given: " + key);
-				}
-				
-				// 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(){
-				this._initStorage();
-				
-				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){
-				this._initStorage();
-				
-				namespace = namespace||this.DEFAULT_NAMESPACE;
-				if(!this.isValidKey(namespace)){
-					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){
-				this._initStorage();
-				
-				namespace = namespace||this.DEFAULT_NAMESPACE;
-				if(!this.isValidKey(namespace)){
-					throw new Error("Invalid namespace given: " + namespace);
-				}
-				
-				dojox.sql("DELETE FROM " + this.TABLE_NAME 
-							+ " WHERE namespace = ?",
-							namespace);
-			},
-			
-			remove: function(key, namespace){
-				this._initStorage();
-				
-				if(!this.isValidKey(key)){
-					throw new Error("Invalid key given: " + key);
-				}
-				
-				namespace = namespace||this.DEFAULT_NAMESPACE;
-				if(!this.isValidKey(namespace)){
-					throw new Error("Invalid namespace given: " + key);
-				}
-				
-				dojox.sql("DELETE FROM " + this.TABLE_NAME 
-							+ " WHERE namespace = ? AND"
-							+ " key = ?",
-							namespace,
-							key);
-			},
-			
-			putMultiple: function(keys, values, resultsHandler, namespace) {
-				this._initStorage();
-				
- 				if(!this.isValidKeyArray(keys) 
-						|| ! 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)){
-					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
-					
-					if(resultsHandler){
-						resultsHandler(this.FAILED, keys, e.toString(), namespace);
-					}
-					return;
-				}
-				
-				if(resultsHandler){
-					resultsHandler(dojox.storage.SUCCESS, keys, null, namespace);
-				}
-			},
-
-			getMultiple: function(keys, namespace){
-				//	TODO: Maybe use SELECT IN instead
-				this._initStorage();
-
-				if(!this.isValidKeyArray(keys)){
-					throw new ("Invalid key array given: " + keys);
-				}
-				
-				if(namespace == null || typeof namespace == "undefined"){
-					namespace = dojox.storage.DEFAULT_NAMESPACE;		
-				}
-				if(!this.isValidKey(namespace)){
-					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){
-				this._initStorage();
-				
-				if(!this.isValidKeyArray(keys)){
-					throw new Error("Invalid arguments: keys = [" + keys + "]");
-				}
-				
-				if(namespace == null || typeof namespace == "undefined"){
-					namespace = dojox.storage.DEFAULT_NAMESPACE;		
-				}
-				if(!this.isValidKey(namespace)){
-					throw new Error("Invalid namespace given: " + 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");
-			},
-			
-			_initStorage: function(){
-				// we delay creating the tables until an operation is actually
-				// called so that we don't give a Gears dialog right on page
-				// load (bug #7538)
-				if (this._storageReady) {
-					return;
-				}
-				
-				if (!google.gears.factory.hasPermission) {
-					var siteName = null;
-					var icon = null;
-					var msg = 'This site would like to use Google Gears to enable '
-										+ 'enhanced functionality.';
-					var allowed = google.gears.factory.getPermission(siteName, icon, msg);
-					if (!allowed) {
-						throw new Error('You must give permission to use Gears in order to '
-														+ 'store data');
-					}
-				}
-				
-				// 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){
-					
-					throw new Error('Unable to create storage tables for Gears in '
-					                + 'Dojo Storage');
-				}
-				
-				this._storageReady = true;
-		  }
-		});
-
-		// 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 at eutech-ssii.com
-	//			Brad Neuberg, bkn3 at columbia.edu 
-
-	initialized: false,
-	
-	_domain: null,
-	_available: null,
-	_statusHandler: null,
-	_allNamespaces: null,
-	_storageEventListener: null,
-	
-	initialize: function(){
-		if(dojo.config["disableWhatWGStorage"] == true){
-			return;
-		}
-		
-		// get current domain
-		this._domain = this._getDomain();
-		// 
-		
-		// indicate that this storage provider is now loaded
-		this.initialized = true;
-		dojox.storage.manager.loaded();	
-	},
-	
-	isAvailable: function(){
-		try{
-			var myStorage = globalStorage[this._getDomain()]; 
-		}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, null, namespace);
-			}
-		});
-		
-		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(), namespace);
-		}
-	},
-
-	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;
-		}
-	},
-
-	_getDomain: function(){
-		// see: https://bugzilla.mozilla.org/show_bug.cgi?id=357323
-		return ((location.hostname == "localhost" && dojo.isFF && dojo.isFF < 3) ? "localhost.localdomain" : location.hostname);
-	}
-});
-
-dojox.storage.manager.register("dojox.storage.WhatWGStorageProvider", 
-								new dojox.storage.WhatWGStorageProvider());
-
-}
-
-if(!dojo._hasResource["dojo.AdapterRegistry"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.AdapterRegistry"] = true;
-dojo.provide("dojo.AdapterRegistry");
-
-dojo.AdapterRegistry = function(/*Boolean?*/ returnWrappers){
-	//	summary:
-	//		A registry to make contextual calling/searching easier.
-	//	description:
-	//		Objects of this class keep list of arrays in the form [name, check,
-	//		wrap, directReturn] that are used to determine what the contextual
-	//		result of a set of checked arguments is. All check/wrap functions
-	//		in this registry should be of the same arity.
-	//	example:
-	//	|	// create a new registry
-	//	|	var reg = new dojo.AdapterRegistry();
-	//	|	reg.register("handleString",
-	//	|		dojo.isString,
-	//	|		function(str){
-	//	|			// do something with the string here
-	//	|		}
-	//	|	);
-	//	|	reg.register("handleArr",
-	//	|		dojo.isArray,
-	//	|		function(arr){
-	//	|			// do something with the array here
-	//	|		}
-	//	|	);
-	//	|
-	//	|	// now we can pass reg.match() *either* an array or a string and
-	//	|	// the value we pass will get handled by the right function
-	//	|	reg.match("someValue"); // will call the first function
-	//	|	reg.match(["someValue"]); // will call the second
-
-	this.pairs = [];
-	this.returnWrappers = returnWrappers || false; // Boolean
-}
-
-dojo.extend(dojo.AdapterRegistry, {
-	register: function(/*String*/ name, /*Function*/ check, /*Function*/ wrap, /*Boolean?*/ directReturn, /*Boolean?*/ override){
-		//	summary: 
-		//		register a check function to determine if the wrap function or
-		//		object gets selected
-		//	name:
-		//		a way to identify this matcher.
-		//	check:
-		//		a function that arguments are passed to from the adapter's
-		//		match() function.  The check function should return true if the
-		//		given arguments are appropriate for the wrap function.
-		//	directReturn:
-		//		If directReturn is true, the value passed in for wrap will be
-		//		returned instead of being called. Alternately, the
-		//		AdapterRegistry can be set globally to "return not call" using
-		//		the returnWrappers property. Either way, this behavior allows
-		//		the registry to act as a "search" function instead of a
-		//		function interception library.
-		//	override:
-		//		If override is given and true, the check function will be given
-		//		highest priority. Otherwise, it will be the lowest priority
-		//		adapter.
-		this.pairs[((override) ? "unshift" : "push")]([name, check, wrap, directReturn]);
-	},
-
-	match: function(/* ... */){
-		// summary:
-		//		Find an adapter for the given arguments. If no suitable adapter
-		//		is found, throws an exception. match() accepts any number of
-		//		arguments, all of which are passed to all matching functions
-		//		from the registered pairs.
-		for(var i = 0; i < this.pairs.length; i++){
-			var pair = this.pairs[i];
-			if(pair[1].apply(this, arguments)){
-				if((pair[3])||(this.returnWrappers)){
-					return pair[2];
-				}else{
-					return pair[2].apply(this, arguments);
-				}
-			}
-		}
-		throw new Error("No match found");
-	},
-
-	unregister: function(name){
-		// summary: Remove a named adapter from the registry
-
-		// FIXME: this is kind of a dumb way to handle this. On a large
-		// registry this will be slow-ish and we can use the name as a lookup
-		// should we choose to trade memory for speed.
-		for(var i = 0; i < this.pairs.length; i++){
-			var pair = this.pairs[i];
-			if(pair[0] == name){
-				this.pairs.splice(i, 1);
-				return true;
-			}
-		}
-		return false;
-	}
-});
-
-}
-
-if(!dojo._hasResource["dijit._base.place"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._base.place"] = true;
-dojo.provide("dijit._base.place");
-
-
-
-// ported from dojo.html.util
-
-dijit.getViewport = function(){
-	// summary:
-	//		Returns the dimensions and scroll position of the viewable area of a browser window
-
-	var scrollRoot = (dojo.doc.compatMode == 'BackCompat')? dojo.body() : dojo.doc.documentElement;
-
-	// get scroll position
-	var scroll = dojo._docScroll(); // scrollRoot.scrollTop/Left should work
-	return { w: scrollRoot.clientWidth, h: scrollRoot.clientHeight, l: scroll.x, t: scroll.y };
-};
-
-/*=====
-dijit.__Position = function(){
-	// x: Integer
-	//		horizontal coordinate in pixels, relative to document body
-	// y: Integer
-	//		vertical coordinate in pixels, relative to document body
-
-	thix.x = x;
-	this.y = y;
-}
-=====*/
-
-
-dijit.placeOnScreen = function(
-	/* DomNode */			node,
-	/* dijit.__Position */	pos,
-	/* String[] */			corners,
-	/* dijit.__Position? */	padding){
-	//	summary:
-	//		Positions one of the node's corners at specified position
-	//		such that node is fully visible in viewport.
-	//	description:
-	//		NOTE: node is assumed to be absolutely or relatively positioned.
-	//	pos:
-	//		Object like {x: 10, y: 20}
-	//	corners:
-	//		Array of Strings representing order to try corners in, like ["TR", "BL"].
-	//		Possible values are:
-	//			* "BL" - bottom left
-	//			* "BR" - bottom right
-	//			* "TL" - top left
-	//			* "TR" - top right
-	//	padding:
-	//		set padding to put some buffer around the element you want to position.
-	//	example:	
-	//		Try to place node's top right corner at (10,20).
-	//		If that makes node go (partially) off screen, then try placing
-	//		bottom left corner at (10,20).
-	//	|	placeOnScreen(node, {x: 10, y: 20}, ["TR", "BL"])
-
-	var choices = dojo.map(corners, function(corner){
-		var c = { corner: corner, pos: {x:pos.x,y:pos.y} };
-		if(padding){
-			c.pos.x += corner.charAt(1) == 'L' ? padding.x : -padding.x;
-			c.pos.y += corner.charAt(0) == 'T' ? padding.y : -padding.y;
-		}
-		return c; 
-	});
-
-	return dijit._place(node, choices);
-}
-
-dijit._place = function(/*DomNode*/ node, /* Array */ choices, /* Function */ layoutNode){
-	// summary:
-	//		Given a list of spots to put node, put it at the first spot where it fits,
-	//		of if it doesn't fit anywhere then the place with the least overflow
-	// choices: Array
-	//		Array of elements like: {corner: 'TL', pos: {x: 10, y: 20} }
-	//		Above example says to put the top-left corner of the node at (10,20)
-	// layoutNode: Function(node, aroundNodeCorner, nodeCorner)
-	//		for things like tooltip, they are displayed differently (and have different dimensions)
-	//		based on their orientation relative to the parent.   This adjusts the popup based on orientation.
-
-	// get {x: 10, y: 10, w: 100, h:100} type obj representing position of
-	// viewport over document
-	var view = 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.placeOnScreenAroundNode = function(
-	/* DomNode */		node,
-	/* DomNode */		aroundNode,
-	/* Object */		aroundCorners,
-	/* Function? */		layoutNode){
-
-	// summary:
-	//		Position node adjacent or kitty-corner to aroundNode
-	//		such that it's fully visible in viewport.
-	//
-	// description:
-	//		Place node such that corner of node touches a corner of
-	//		aroundNode, and that node is fully visible.
-	//
-	// aroundCorners:
-	//		Ordered list of pairs of corners to try matching up.
-	//		Each pair of corners is represented as a key/value in the hash,
-	//		where the key corresponds to the aroundNode's corner, and
-	//		the value corresponds to the node's corner:
-	//
-	//	|	{ aroundNodeCorner1: nodeCorner1, aroundNodeCorner2: nodeCorner2,  ...}
-	//
-	//		The following strings are used to represent the four corners:
-	//			* "BL" - bottom left
-	//			* "BR" - bottom right
-	//			* "TL" - top left
-	//			* "TR" - top right
-	//
-	// layoutNode: Function(node, aroundNodeCorner, nodeCorner)
-	//		For things like tooltip, they are displayed differently (and have different dimensions)
-	//		based on their orientation relative to the parent.   This adjusts the popup based on orientation.
-	//
-	// example:
-	//	|	dijit.placeOnScreenAroundNode(node, aroundNode, {'BL':'TL', 'TR':'BR'}); 
-	//		This will try to position node such that node's top-left corner is at the same position
-	//		as the bottom left corner of the aroundNode (ie, put node below
-	//		aroundNode, with left edges aligned).  If that fails it will try to put
-	// 		the bottom-right corner of node where the top right corner of aroundNode is
-	//		(ie, put node above aroundNode, with right edges aligned)
-	//
-
-	// get coordinates of aroundNode
-	aroundNode = dojo.byId(aroundNode);
-	var oldDisplay = aroundNode.style.display;
-	aroundNode.style.display="";
-	// #3172: use the slightly tighter border box instead of marginBox
-	var aroundNodeW = aroundNode.offsetWidth; //mb.w; 
-	var aroundNodeH = aroundNode.offsetHeight; //mb.h;
-	var aroundNodePos = dojo.coords(aroundNode, true);
-	aroundNode.style.display=oldDisplay;
-
-	// place the node around the calculated rectangle
-	return dijit._placeOnScreenAroundRect(node, 
-		aroundNodePos.x, aroundNodePos.y, aroundNodeW, aroundNodeH,	// rectangle
-		aroundCorners, layoutNode);
-};
-
-/*=====
-dijit.__Rectangle = function(){
-	// x: Integer
-	//		horizontal offset in pixels, relative to document body
-	// y: Integer
-	//		vertical offset in pixels, relative to document body
-	// width: Integer
-	//		width in pixels
-	// height: Integer
-	//		height in pixels
-
-	thix.x = x;
-	this.y = y;
-	thix.width = width;
-	this.height = height;
-}
-=====*/
-
-
-dijit.placeOnScreenAroundRectangle = function(
-	/* DomNode */			node,
-	/* dijit.__Rectangle */	aroundRect,
-	/* Object */			aroundCorners,
-	/* Function */			layoutNode){
-
-	// summary:
-	//		Like dijit.placeOnScreenAroundNode(), except that the "around"
-	//		parameter is an arbitrary rectangle on the screen (x, y, width, height)
-	//		instead of a dom node.
-
-	return dijit._placeOnScreenAroundRect(node, 
-		aroundRect.x, aroundRect.y, aroundRect.width, aroundRect.height,	// rectangle
-		aroundCorners, layoutNode);
-};
-
-dijit._placeOnScreenAroundRect = function(
-	/* DomNode */		node,
-	/* Number */		x,
-	/* Number */		y,
-	/* Number */		width,
-	/* Number */		height,
-	/* Object */		aroundCorners,
-	/* Function */		layoutNode){
-
-	// summary:
-	//		Like dijit.placeOnScreenAroundNode(), except it accepts coordinates
-	//		of a rectangle to place node adjacent to.
-
-	// TODO: combine with placeOnScreenAroundRectangle()
-
-	// Generate list of possible positions for node
-	var choices = [];
-	for(var nodeCorner in aroundCorners){
-		choices.push( {
-			aroundCorner: nodeCorner,
-			corner: aroundCorners[nodeCorner],
-			pos: {
-				x: x + (nodeCorner.charAt(1) == 'L' ? 0 : width),
-				y: y + (nodeCorner.charAt(0) == 'T' ? 0 : height)
-			}
-		});
-	}
-
-	return dijit._place(node, choices, layoutNode);
-};
-
-dijit.placementRegistry = new dojo.AdapterRegistry();
-dijit.placementRegistry.register("node",
-	function(n, x){
-		return typeof x == "object" &&
-			typeof x.offsetWidth != "undefined" && typeof x.offsetHeight != "undefined";
-	},
-	dijit.placeOnScreenAroundNode);
-dijit.placementRegistry.register("rect",
-	function(n, x){
-		return typeof x == "object" &&
-			"x" in x && "y" in x && "width" in x && "height" in x;
-	},
-	dijit.placeOnScreenAroundRectangle);
-
-dijit.placeOnScreenAroundElement = function(
-	/* DomNode */		node,
-	/* Object */		aroundElement,
-	/* Object */		aroundCorners,
-	/* Function */		layoutNode){
-
-	// summary:
-	//		Like dijit.placeOnScreenAroundNode(), except it accepts an arbitrary object
-	//		for the "around" argument and finds a proper processor to place a node.
-
-	return dijit.placementRegistry.match.apply(dijit.placementRegistry, arguments);
-};
-
-}
-
-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");
-dojo.experimental("dojox.flash");
-
-// for dijit.getViewport(), needed by dojox.flash.Embed.center()
-
-
-dojox.flash = function(){
-	// summary:
-	//	Utilities to embed and communicate with the Flash player from Javascript
-	//
-	// description:
-	//	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: [],
-	_installingListeners: [],
-	
-	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;
-		
-		this._visible = true;
-		if(visible !== null && 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){ // FIXME: redundant if? use forEach?
-			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){ // FIXME: redundant if? use forEach?
-			for(var i = 0; i < dojox.flash._installingListeners.length; i++){
-				dojox.flash._installingListeners[i].call(null);
-			}
-		}
-	},
-	
-	// Initializes dojox.flash.
-	_initialize: function(){
-		//
-		// 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()){		
-			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._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){
-				var axo;
-				try{
-					if(testVersion > 6){
-						axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash." 
-																		+ testVersion);
-					}else{
-						axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
-					}
-					if(typeof axo == "object"){
-						if(testVersion == 6){
-							axo.AllowScriptAccess = "always";
-						}
-						versionStr = axo.GetVariable("$version");
-					}
-				}catch(e){
-					continue;
-				}
-			}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];
-				var tempArrayMinor = (descArray[3] || 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.
-		
-		// 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;
-		var xdomainBase = document.location.protocol + '//' + document.location.host;
-		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)
-			                + "&xdomain=" + escape(xdomainBase);
-			swflocEmbed += "?MMredirectURL=" + redirectURL 
-			                + "&MMplayerType=PlugIn"
-			                + "&baseUrl=" + escape(dojoUrl)
-			                + "&xdomain=" + escape(xdomainBase);
-		}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();
-			swflocObject += "&baseUrl=" + escape(dojoUrl);
-			swflocObject += "&xdomain=" + escape(xdomainBase);
-		}
-
-		if(swflocEmbed.indexOf("?") == -1){
-			swflocEmbed += '?baseUrl='+escape(dojoUrl);
-		}else{
-		  swflocEmbed += '&baseUrl='+escape(dojoUrl);
-		}
-		swflocEmbed += '&xdomain='+escape(xdomainBase);
-		
-		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="always"></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="always" '
-				  + '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(){
-			// Prevent putting duplicate SWFs onto the page
-			var containerId = this.id + "Container";
-			if(dojo.byId(containerId)){
-				return;
-			}
-			
-			var div = document.createElement("div");
-			div.id = this.id + "Container";
-			
-			div.style.width = this.width + "px";
-			div.style.height = this.height + "px";
-			if(!this._visible){
-				div.style.position = "absolute";
-				div.style.zIndex = "10000";
-				div.style.top = "-1000px";
-			}
-
-			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.isWebKit){
-			//TODO: should this really be the else?
-			return dojo.byId(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){
-		//
-		
-		// summary: Sets the visibility of this Flash object.		
-		var container = dojo.byId(this.id + "Container");
-		if(visible){
-			container.style.position = "absolute"; // IE -- Brad Neuberg
-			container.style.visibility = "visible";
-		}else{
-			container.style.position = "absolute";
-			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;
-		}
-		
-		// transforming \ into \\ doesn't work; just use a custom encoding
-		data = data.replace("\\", "&custom_backslash;");
-
-		// also use custom encoding for the null character to avoid problems 
-		data = data.replace(/\0/g, "&custom_null;");
-
-		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;
-		}
-		
-		// needed for IE; \0 is the NULL character 
-		data = data.replace(/\&custom_null\;/g, "\0");
-	
-		// 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, "<")
-			.replace(/\&custom_gt\;/g, ">")
-			.replace(/\&custom_backslash\;/g, '\\');
-		
-		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){
-			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.
-		var installObj;
-	
-		// 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
-			installObj = new dojox.flash.Embed(false);
-			installObj.write(); // write out HTML for Flash
-		}else if(dojox.flash.info.isVersionOrAbove(6, 0, 65)){ // Express Install
-			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 at columbia.edu	
-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;
-			}
-			
-			// initialize our Flash
-			dojox.flash.addLoadedListener(dojo.hitch(this, function(){
-			  //
-			  // 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(){
-			  //
-			  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, 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, 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, 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){
-		  //
-			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, null, 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 at columbia.edu, http://codinginparadise.org
-
-// summary:
-//	Helps maintain resources that should be
-//	available offline, such as CSS files.
-// description:
-//	dojox.off.files makes it easy to indicate
-//	what resources should be available offline,
-//	such as CSS files, JavaScript, HTML, etc.
-dojox.off.files = {
-	// versionURL: String
-	//	An optional file, that if present, records the version
-	//	of our bundle of files to make available offline. If this
-	//	file is present, and we are not currently debugging,
-	//	then we only refresh our offline files if the version has
-	//	changed. 
-	versionURL: "version.js",
-	
-	// listOfURLs: Array
-	//	For advanced usage; most developers can ignore this.
-	//	Our list of URLs that will be cached and made available
-	//	offline.
-	listOfURLs: [],
-	
-	// refreshing: boolean
-	//	For advanced usage; most developers can ignore this.
-	//	Whether we are currently in the middle
-	//	of refreshing our list of offline files.
-	refreshing: false,
-
-	_cancelID: null,
-	
-	_error: false,
-	_errorMessages: [],
-	_currentFileIndex: 0,
-	_store: null,
-	_doSlurp: false,
-	
-	slurp: function(){
-		// summary:
-		//	Autoscans the page to find all resources to
-		//	cache. This includes scripts, images, CSS, and hyperlinks
-		//	to pages that are in the same scheme/port/host as this
-		//	page. We also scan the embedded CSS of any stylesheets
-		//	to find @import statements and url()'s.
-		//  You should call this method from the top-level, outside of
-		//	any functions and before the page loads:
-		//
-		//	<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
-		
-		//
-		
-		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
-		
-		dojo.forEach(this.listOfURLs, function(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 */
-		//
-		// 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){
-				//
-			}
-		});
-		
-		dojo.query("link").forEach(function(i){
-			try{
-				if(!i.getAttribute("rel")
-					|| i.getAttribute("rel").toLowerCase() != "stylesheet"){
-					return;
-				}
-			
-				handleUrl(i.getAttribute("href"));
-			}catch(exp){
-				//
-			}
-		});
-		
-		dojo.query("img").forEach(function(i){
-			try{
-				handleUrl(i.getAttribute("src"));
-			}catch(exp){
-				//
-			}
-		});
-		
-		dojo.query("a").forEach(function(i){
-			try{
-				handleUrl(i.getAttribute("href"));
-			}catch(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){
-				//
-			}
-		});
-		
-		//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){
-			//
-			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 at columbia.edu, http://codinginparadise.org
-
-// summary:
-//		Exposes syncing functionality to offline applications
-dojo.mixin(dojox.off.sync, {
-	// isSyncing: boolean
-	//		Whether we are in the middle of a syncing session.
-	isSyncing: false,
-	
-	// cancelled: boolean
-	//		Whether we were cancelled during our last sync request or not. If
-	//		we are cancelled, then successful will be false.
-	cancelled: false,
-	
-	// successful: boolean
-	//		Whether the last sync was successful or not.  If false, an error
-	//		occurred.
-	successful: true,
-	
-	// details: String[]
-	//		Details on the sync. If the sync was successful, this will carry
-	//		any conflict or merging messages that might be available; if the
-	//		sync was unsuccessful, this will have an error message.  For both
-	//		of these, this should be an array of Strings, where each string
-	//		carries details on the sync. 
-	//	Example: 
-	//		dojox.off.sync.details = ["The document 'foobar' had conflicts - yours one",
-	//						"The document 'hello world' was automatically merged"];
-	details: [],
-	
-	// error: boolean
-	//		Whether an error occurred during the syncing process.
-	error: false,
-	
-	// actions: dojox.off.sync.ActionLog
-	//		Our ActionLog that we store offline actions into for later
-	//		replaying when we go online
-	actions: null,
-	
-	// autoSync: boolean
-	//		For advanced usage; most developers can ignore this.
-	//		Whether we do automatically sync on page load or when we go online.
-	//		If true we do, if false syncing must be manually initiated.
-	//		Defaults to true.
-	autoSync: true,
-	
-	// summary:
-	//	An event handler that is called during the syncing process with
-	//	the state of syncing. It is important that you connect to this
-	//	method and respond to certain sync events, especially the 
-	//	"download" event.
-	// description:
-	//	This event handler is called during the syncing process. You can
-	//	do a dojo.connect to receive sync feedback:
-	//
-	//		dojo.connect(dojox.off.sync, "onSync", someFunc);
-	//
-	//	You will receive one argument, which is the type of the event
-	//	and which can have the following values.
-	//
-	//	The most common two types that you need to care about are "download"
-	//	and "finished", especially if you are using the default
-	//	Dojo Offline UI widget that does the hard work of informing
-	//	the user through the UI about what is occuring during syncing.
-	//
-	//	If you receive the "download" event, you should make a network call
-	//	to retrieve and store your data somehow for offline access. The
-	//	"finished" event indicates that syncing is done. An example:
-	//	
-	//		dojo.connect(dojox.off.sync, "onSync", function(type){
-	//			if(type == "download"){
-	//				// make a network call to download some data
-	//				// for use offline
-	//				dojo.xhrGet({
-	//					url: 		"downloadData.php",
-	//					handleAs:	"javascript",
-	//					error:		function(err){
-	//						dojox.off.sync.finishedDownloading(false, "Can't download data");
-	//					},
-	//					load:		function(data){
-	//						// store our data
-	//						dojox.storage.put("myData", data);
-	//
-	//						// indicate we are finished downloading
-	//						dojox.off.sync.finishedDownloading(true);
-	//					}
-	//				});
-	//			}else if(type == "finished"){
-	//				// update UI somehow to indicate we are finished,
-	//				// such as using the download data to change the 
-	//				// available data
-	//			}
-	//		})
-	//
-	//	Here is the full list of event types if you want to do deep
-	//	customization, such as updating your UI to display the progress
-	//	of syncing (note that the default Dojo Offline UI widget does
-	//	this for you if you choose to pull that in). Most of these
-	//	are only appropriate for advanced usage and can be safely
-	//	ignored:
-	//
-	//		* "start"
-	//				syncing has started
-	//		* "refreshFiles"
-	//				syncing will begin refreshing
-	//				our offline file cache
-	//		* "upload"
-	//				syncing will begin uploading
-	//				any local data changes we have on the client.
-	//				This event is fired before we fire
-	//				the dojox.off.sync.actions.onReplay event for
-	//				each action to replay; use it to completely
-	//				over-ride the replaying behavior and prevent
-	//				it entirely, perhaps rolling your own sync
-	//				protocol if needed.
-	//		* "download"
-	//				syncing will begin downloading any new data that is
-	//				needed into persistent storage. Applications are required to
-	//				implement this themselves, storing the required data into
-	//				persistent local storage using Dojo Storage.
-	//		* "finished"
-	//				syncing is finished; this
-	//				will be called whether an error ocurred or not; check
-	//				dojox.off.sync.successful and dojox.off.sync.error for sync details
-	//		* "cancel"
-	//				Fired when canceling has been initiated; canceling will be
-	//				attempted, followed by the sync event "finished".
-	onSync: function(/* String */ type){},
-	
-	synchronize: function(){ /* void */
-		// summary: Starts synchronizing
-
-		//dojo.debug("synchronize");
-		if(this.isSyncing || dojox.off.goingOnline || (!dojox.off.isOnline)){
-			return;
-		}
-	
-		this.isSyncing = true;
-		this.successful = false;
-		this.details = [];
-		this.cancelled = false;
-		
-		this.start();
-	},
-	
-	cancel: function(){ /* void */
-		// summary:
-		//	Attempts to cancel this sync session
-		
-		if(!this.isSyncing){ return; }
-		
-		this.cancelled = true;
-		if(dojox.off.files.refreshing){
-			dojox.off.files.abortRefresh();
-		}
-		
-		this.onSync("cancel");
-	},
-	
-	finishedDownloading: function(successful /* boolean? */, 
-									errorMessage /* String? */){
-		// summary:
-		//		Applications call this method from their
-		//		after getting a "download" event in
-		//		dojox.off.sync.onSync to signal that
-		//		they are finished downloading any data 
-		//		that should be available offline
-		// successful: boolean?
-		//		Whether our downloading was successful or not.
-		//		If not present, defaults to true.
-		// errorMessage: String?
-		//		If unsuccessful, a message explaining why
-		if(typeof successful == "undefined"){
-			successful = true;
-		}
-		
-		if(!successful){
-			this.successful = false;
-			this.details.push(errorMessage);
-			this.error = true;
-		}
-		
-		this.finished();
-	},
-	
-	start: function(){ /* void */
-		// summary:
-		//	For advanced usage; most developers can ignore this.
-		//	Called at the start of the syncing process. Advanced
-		//	developers can over-ride this method to use their
-		//	own sync mechanism to start syncing.
-		
-		if(this.cancelled){
-			this.finished();
-			return;
-		}
-		this.onSync("start");
-		this.refreshFiles();
-	},
-	
-	refreshFiles: function(){ /* void */
-		// summary:
-		//	For advanced usage; most developers can ignore this.
-		//	Called when we are going to refresh our list
-		//	of offline files during syncing. Advanced developers 
-		//	can over-ride this method to do some advanced magic related to
-		//	refreshing files.
-		
-		//dojo.debug("refreshFiles");
-		if(this.cancelled){
-			this.finished();
-			return;
-		}
-		
-		this.onSync("refreshFiles");
-		
-		dojox.off.files.refresh(dojo.hitch(this, function(error, errorMessages){
-			if(error){
-				this.error = true;
-				this.successful = false;
-				for(var i = 0; i < errorMessages.length; i++){
-					this.details.push(errorMessages[i]);
-				}
-				
-				// even if we get an error while syncing files,
-				// keep syncing so we can upload and download
-				// data
-			}
-			
-			this.upload();
-		}));
-	},
-	
-	upload: function(){ /* void */
-		// summary:
-		//	For advanced usage; most developers can ignore this.
-		//	Called when syncing wants to upload data. Advanced
-		//	developers can over-ride this method to completely
-		//	throw away the Action Log and replaying system
-		//	and roll their own advanced sync mechanism if needed.
-		
-		if(this.cancelled){
-			this.finished();
-			return;
-		}
-		
-		this.onSync("upload");
-		
-		// when we are done uploading start downloading
-		dojo.connect(this.actions, "onReplayFinished", this, this.download);
-		
-		// replay the actions log
-		this.actions.replay();
-	},
-	
-	download: function(){ /* void */
-		// summary:
-		//	For advanced usage; most developers can ignore this.
-		//	Called when syncing wants to download data. Advanced
-		//	developers can over-ride this method to use their
-		//	own sync mechanism.
-		
-		if(this.cancelled){
-			this.finished();
-			return;
-		}
-		
-		// apps should respond to the "download"
-		// event to download their data; when done
-		// they must call dojox.off.sync.finishedDownloading()
-		this.onSync("download");
-	},
-	
-	finished: function(){ /* void */
-		// summary:
-		//	For advanced usage; most developers can ignore this.
-		//	Called when syncing is finished. Advanced
-		//	developers can over-ride this method to clean
-		//	up after finishing their own sync
-		//	mechanism they might have rolled.
-		this.isSyncing = false;
-		
-		this.successful = (!this.cancelled && !this.error);
-		
-		this.onSync("finished");
-	},
-	
-	_save: function(callback){
-		this.actions._save(function(){
-			callback();
-		});
-	},
-	
-	_load: function(callback){
-		this.actions._load(function(){
-			callback();
-		});
-	}
-});
-
-
-// summary:
-//		A class that records actions taken by a user when they are offline,
-//		suitable for replaying when the network reappears. 
-// description:
-//		The basic idea behind this method is to record user actions that would
-//		normally have to contact a server into an action log when we are
-//		offline, so that later when we are online we can simply replay this log
-//		in the order user actions happened so that they can be executed against
-//		the server, causing synchronization to happen. 
-//		
-//		When we replay, for each of the actions that were added, we call a 
-//		method named onReplay that applications should connect to and 
-//		which will be called over and over for each of our actions -- 
-//		applications should take the offline action
-//		information and use it to talk to a server to have this action
-//		actually happen online, 'syncing' themselves with the server. 
-//
-//		For example, if the action was "update" with the item that was updated, we
-//		might call some RESTian server API that exists for updating an item in
-//		our application.  The server could either then do sophisticated merging
-//		and conflict resolution on the server side, for example, allowing you
-//		to pop up a custom merge UI, or could do automatic merging or nothing
-//		of the sort. When you are finished with this particular action, your
-//		application is then required to call continueReplay() on the actionLog object
-//		passed to onReplay() to continue replaying the action log, or haltReplay()
-//		with the reason for halting to completely stop the syncing/replaying
-//		process.
-//
-//		For example, imagine that we have a web application that allows us to add
-//		contacts. If we are offline, and we update a contact, we would add an action;
-//		imagine that the user has to click an Update button after changing the values
-//		for a given contact:
-//	
-//		dojox.off.whenOffline(dojo.byId("updateButton"), "onclick", function(evt){
-//			// get the updated customer values
-//			var customer = getCustomerValues();
-//			
-//			// we are offline -- just record this action
-//			var action = {name: "update", customer: customer};
-//			dojox.off.sync.actions.add(action)
-//			
-//			// persist this customer data into local storage as well
-//			dojox.storage.put(customer.name, customer);
-//		})
-//
-//		Then, when we go back online, the dojox.off.sync.actions.onReplay event
-//		will fire over and over, once for each action that was recorded while offline:
-//
-//		dojo.connect(dojox.off.sync.actions, "onReplay", function(action, actionLog){
-//			// called once for each action we added while offline, in the order
-//			// they were added
-//			if(action.name == "update"){
-//				var customer = action.customer;
-//				
-//				// call some network service to update this customer
-//				dojo.xhrPost({
-//					url: "updateCustomer.php",
-//					content: {customer: dojo.toJson(customer)},
-//					error: function(err){
-//						actionLog.haltReplay(err);
-//					},
-//					load: function(data){
-//						actionLog.continueReplay();
-//					}
-//				})
-//			}
-//		})
-//
-//		Note that the actions log is always automatically persisted locally while using it, so
-//		that if the user closes the browser or it crashes the actions will safely be stored
-//		for later replaying.
-dojo.declare("dojox.off.sync.ActionLog", null, {
-		// entries: Array
-		//		An array of our action entries, where each one is simply a custom
-		//		object literal that were passed to add() when this action entry
-		//		was added.
-		entries: [],
-		
-		// reasonHalted: String
-		//		If we halted, the reason why
-		reasonHalted: null,
-		
-		// isReplaying: boolean
-		//		If true, we are in the middle of replaying a command log; if false,
-		//		then we are not
-		isReplaying: false,
-		
-		// autoSave: boolean
-		//		Whether we automatically save the action log after each call to
-		//		add(); defaults to true. For applications that are rapidly adding
-		//		many action log entries in a short period of time, it can be
-		//		useful to set this to false and simply call save() yourself when
-		//		you are ready to persist your command log -- otherwise performance
-		//		could be slow as the default action is to attempt to persist the
-		//		actions log constantly with calls to add().
-		autoSave: true,
-		
-		add: function(action /* Object */){ /* void */
-			// summary:
-			//	Adds an action to our action log
-			// description:
-			//	This method will add an action to our
-			//	action log, later to be replayed when we
-			//	go from offline to online. 'action'
-			//	will be available when this action is
-			//	replayed and will be passed to onReplay.
-			//
-			//	Example usage:
-			//	
-			//	dojox.off.sync.log.add({actionName: "create", itemType: "document",
-			//					  {title: "Message", content: "Hello World"}});
-			// 
-			//	The object literal is simply a custom object appropriate
-			//	for our application -- it can be anything that preserves the state
-			//	of a user action that will be executed when we go back online
-			//	and replay this log. In the above example,
-			//	"create" is the name of this action; "documents" is the 
-			//	type of item this command is operating on, such as documents, contacts,
-			//	tasks, etc.; and the final argument is the document that was created. 
-			
-			if(this.isReplaying){
-				throw "Programming error: you can not call "
-						+ "dojox.off.sync.actions.add() while "
-						+ "we are replaying an action log";
-			}
-			
-			this.entries.push(action);
-			
-			// save our updated state into persistent
-			// storage
-			if(this.autoSave){
-				this._save();
-			}
-		},
-		
-		onReplay: function(action /* Object */, 
-							actionLog /* dojox.off.sync.ActionLog */){ /* void */
-			// summary:
-			//	Called when we replay our log, for each of our action
-			//	entries.
-			// action: Object
-			//	A custom object literal representing an action for this
-			//	application, such as 
-			//	{actionName: "create", item: {title: "message", content: "hello world"}}
-			// actionLog: dojox.off.sync.ActionLog
-			//	A reference to the dojox.off.sync.actions log so that developers
-			//	can easily call actionLog.continueReplay() or actionLog.haltReplay().
-			// description:
-			//	This callback should be connected to by applications so that
-			//	they can sync themselves when we go back online:
-			//
-			//		dojo.connect(dojox.off.sync.actions, "onReplay", function(action, actionLog){
-			//				// do something
-			//		})
-			//
-			//	When we replay our action log, this callback is called for each
-			//	of our action entries in the order they were added. The 
-			//	'action' entry that was passed to add() for this action will 
-			//	also be passed in to onReplay, so that applications can use this information
-			//	to do their syncing, such as contacting a server web-service
-			//	to create a new item, for example. 
-			// 
-			//	Inside the method you connected to onReplay, you should either call
-			//	actionLog.haltReplay(reason) if an error occurred and you would like to halt
-			//	action replaying or actionLog.continueReplay() to have the action log
-			//	continue replaying its log and proceed to the next action; 
-			//	the reason you must call these is the action you execute inside of 
-			//	onAction will probably be asynchronous, since it will be talking on 
-			//	the network, and you should call one of these two methods based on 
-			//	the result of your network call.
-		},
-		
-		length: function(){ /* Number */
-			// summary:
-			//	Returns the length of this 
-			//	action log
-			return this.entries.length;
-		},
-		
-		haltReplay: function(reason /* String */){ /* void */
-			// summary: Halts replaying this command log.
-			// reason: String
-			//		The reason we halted.
-			// description:
-			//		This method is called as we are replaying an action log; it
-			//		can be called from dojox.off.sync.actions.onReplay, for
-			//		example, for an application to indicate an error occurred
-			//		while replaying this action, halting further processing of
-			//		the action log. Note that any action log entries that
-			//		were processed before have their effects retained (i.e.
-			//		they are not rolled back), while the action entry that was
-			//		halted stays in our list of actions to later be replayed.	
-			if(!this.isReplaying){
-				return;
-			}
-			
-			if(reason){
-				this.reasonHalted = reason.toString();		
-			}
-			
-			// save the state of our action log, then
-			// tell anyone who is interested that we are
-			// done when we are finished saving
-			if(this.autoSave){
-				var self = this;
-				this._save(function(){
-					self.isReplaying = false;
-					self.onReplayFinished();
-				});
-			}else{
-				this.isReplaying = false;
-				this.onReplayFinished();
-			}
-		},
-		
-		continueReplay: function(){ /* void */
-			// summary:
-			//		Indicates that we should continue processing out list of
-			//		actions.
-			// description:
-			//		This method is called by applications that have overridden
-			//		dojox.off.sync.actions.onReplay() to continue replaying our 
-			//		action log after the application has finished handling the 
-			//		current action.
-			if(!this.isReplaying){
-				return;
-			}
-			
-			// shift off the old action we just ran
-			this.entries.shift();
-			
-			// are we done?
-			if(!this.entries.length){
-				// save the state of our action log, then
-				// tell anyone who is interested that we are
-				// done when we are finished saving
-				if(this.autoSave){
-					var self = this;
-					this._save(function(){
-						self.isReplaying = false;
-						self.onReplayFinished();
-					});
-					return;
-				}else{
-					this.isReplaying = false;
-					this.onReplayFinished();
-					return;
-				}
-			}
-			
-			// get the next action
-			var nextAction = this.entries[0];
-			this.onReplay(nextAction, this);
-		},
-		
-		clear: function(){ /* void */
-			// summary:
-			//	Completely clears this action log of its entries
-			
-			if(this.isReplaying){
-				return;
-			}
-			
-			this.entries = [];
-			
-			// save our updated state into persistent
-			// storage
-			if(this.autoSave){
-				this._save();
-			}
-		},
-		
-		replay: function(){ /* void */
-			// summary:
-			//	For advanced usage; most developers can ignore this.
-			//	Replays all of the commands that have been
-			//	cached in this command log when we go back online;
-			//	onCommand will be called for each command we have
-			
-			if(this.isReplaying){
-				return;
-			}
-			
-			this.reasonHalted = null;
-			
-			if(!this.entries.length){
-				this.onReplayFinished();
-				return;
-			}
-			
-			this.isReplaying = true;
-			
-			var nextAction = this.entries[0];
-			this.onReplay(nextAction, this);
-		},
-		
-		// onReplayFinished: Function
-		//	For advanced usage; most developers can ignore this.
-		//	Called when we are finished replaying our commands;
-		//	called if we have successfully exhausted all of our
-		//	commands, or if an error occurred during replaying.
-		//	The default implementation simply continues the
-		//	synchronization process. Connect to this to register
-		//	for the event:
-		//
-		//		dojo.connect(dojox.off.sync.actions, "onReplayFinished", 
-		//					someFunc)
-		onReplayFinished: function(){
-		},
-
-		toString: function(){
-			var results = "";
-			results += "[";
-			
-			for(var i = 0; i < this.entries.length; i++){
-				results += "{";
-				for(var j in this.entries[i]){
-					results += j + ": \"" + this.entries[i][j] + "\"";
-					results += ", ";
-				}
-				results += "}, ";
-			}
-			
-			results += "]";
-			
-			return results;
-		},
-		
-		_save: function(callback){
-			if(!callback){
-				callback = function(){};
-			}
-			
-			try{
-				var self = this;
-				var resultsHandler = function(status, key, message){
-					//
-					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){
-				
-				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 at columbia.edu, http://codinginparadise.org
-
-// summary:
-//		dojox.off is the main object for offline applications.
-dojo.mixin(dojox.off, {
-	// isOnline: boolean
-	//	true if we are online, false if not
-	isOnline: false,
-	
-	// NET_CHECK: int
-	//		For advanced usage; most developers can ignore this.
-	//		Time in seconds on how often we should check the status of the
-	//		network with an automatic background timer. The current default
-	//		is 5 seconds.
-	NET_CHECK: 5,
-	
-	// STORAGE_NAMESPACE: String
-	//		For advanced usage; most developers can ignore this.
-	//		The namespace we use to save core data into Dojo Storage.
-	STORAGE_NAMESPACE: "_dot",
-	
-	// enabled: boolean
-	//		For advanced usage; most developers can ignore this.
-	//		Whether offline ability is enabled or not. Defaults to true.
-	enabled: true,
-	
-	// availabilityURL: String
-	//		For advanced usage; most developers can ignore this.
-	//		The URL to check for site availability.  We do a GET request on
-	//		this URL to check for site availability.  By default we check for a
-	//		simple text file in src/off/network_check.txt that has one value
-	//		it, the value '1'.
-	availabilityURL: dojo.moduleUrl("dojox", "off/network_check.txt"),
-	
-	// goingOnline: boolean
-	//		For advanced usage; most developers can ignore this.
-	//		True if we are attempting to go online, false otherwise
-	goingOnline: false,
-	
-	// coreOpFailed: boolean
-	//		For advanced usage; most developers can ignore this.
-	//		A flag set by the Dojo Offline framework that indicates that the
-	//		user denied some operation that required the offline cache or an
-	//		operation failed in some critical way that was unrecoverable. For
-	//		example, if the offline cache is Google Gears and we try to get a
-	//		Gears database, a popup window appears asking the user whether they
-	//		will approve or deny this request. If the user denies the request,
-	//		and we are doing some operation that is core to Dojo Offline, then
-	//		we set this flag to 'true'.  This flag causes a 'fail fast'
-	//		condition, turning off offline ability.
-	coreOpFailed: false,
-	
-	// doNetChecking: boolean
-	//		For advanced usage; most developers can ignore this.
-	//		Whether to have a timing interval in the background doing automatic
-	//		network checks at regular intervals; the length of time between
-	//		checks is controlled by dojox.off.NET_CHECK. Defaults to true.
-	doNetChecking: true,
-	
-	// hasOfflineCache: boolean
-	//		For advanced usage; most developers can ignore this.
-	//  	Determines if an offline cache is available or installed; an
-	//  	offline cache is a facility that can truely cache offline
-	//  	resources, such as JavaScript, HTML, etc. in such a way that they
-	//  	won't be removed from the cache inappropriately like a browser
-	//  	cache would. If this is false then an offline cache will be
-	//  	installed. Only Google Gears is currently supported as an offline
-	//  	cache. Future possible offline caches include Firefox 3.
-	hasOfflineCache: null,
-	
-	// browserRestart: boolean
-	//		For advanced usage; most developers can ignore this.
-	//		If true, the browser must be restarted to register the existence of
-	//		a new host added offline (from a call to addHostOffline); if false,
-	//		then nothing is needed.
-	browserRestart: false,
-	
-	_STORAGE_APP_NAME: window.location.href.replace(/[^0-9A-Za-z_]/g, "_"),
-	
-	_initializeCalled: false,
-	_storageLoaded: false,
-	_pageLoaded: false,
-	
-	onLoad: function(){
-		// summary:
-		//	Called when Dojo Offline can be used.
-		// description:
-		//	Do a dojo.connect to this to know when you can
-		//	start using Dojo Offline:
-		//		dojo.connect(dojox.off, "onLoad", myFunc);
-	},
-	
-	onNetwork: function(type){
-		// summary:
-		//	Called when our on- or offline- status changes.
-		// description:
-		//	If we move online, then this method is called with the
-		//	value "online". If we move offline, then this method is
-		//	called with the value "offline". You can connect to this
-		//	method to do add your own behavior:
-		//
-		//		dojo.connect(dojox.off, "onNetwork", someFunc)
-		//
-		//	Note that if you are using the default Dojo Offline UI
-		//	widget that most of the on- and off-line notification
-		//	and syncing is automatically handled and provided to the
-		//	user.
-		// type: String
-		//	Either "online" or "offline".
-	},
-	
-	initialize: function(){ /* void */
-		// summary:
-		//		Called when a Dojo Offline-enabled application is finished
-		//		configuring Dojo Offline, and is ready for Dojo Offline to
-		//		initialize itself.
-		// description:
-		//		When an application has finished filling out the variables Dojo
-		//		Offline needs to work, such as dojox.off.ui.appName, it must
-		//		this method to tell Dojo Offline to initialize itself.
-		
-		//		Note:
-		//		This method is needed for a rare edge case. In some conditions,
-		//		especially if we are dealing with a compressed Dojo build, the
-		//		entire Dojo Offline subsystem might initialize itself and be
-		//		running even before the JavaScript for an application has had a
-		//		chance to run and configure Dojo Offline, causing Dojo Offline
-		//		to have incorrect initialization parameters for a given app,
-		//		such as no value for dojox.off.ui.appName. This method is
-		//		provided to prevent this scenario, to slightly 'slow down' Dojo
-		//		Offline so it can be configured before running off and doing
-		//		its thing.	
-
-		//
-		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.
-		
-		//
-		
-		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.gears.available;
-		
-		callback();
-	},
-	
-	_onLoad: function(){
-		//
-		
-		// 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(){
-		//
-		
-		// 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(){
-				//
-				// 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(){
-		//
-		this._pageLoaded = true;
-		
-		if(this._storageLoaded && this._initializeCalled){
-			this._onLoad();
-		}
-	},
-	
-	_onStorageLoad: function(){
-		//
-		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){
-				//
-				this.goingOnline = false;
-				this.isOnline = false;
-				if(callback){ callback(false); }
-			}),
-			load:		dojo.hitch(this, function(data){
-				//
-				this.goingOnline = false;
-				this.isOnline = true;
-				
-				if(callback){ callback(true);
-				}else{ this.onNetwork("online"); }
-			})
-		});
-	},
-	
-	_startNetworkThread: function(){
-		//
-		
-		// 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 at columbia.edu, http://codinginparadise.org
-
-// summary:
-//	dojox.off.ui provides a standard,
-//	default user-interface for a 
-//	Dojo Offline Widget that can easily
-//	be dropped into applications that would
-//	like to work offline.
-dojo.mixin(dojox.off.ui, {
-	// appName: String
-	//	This application's name, such as "Foobar". Note that
-	//	this is a string, not HTML, so embedded markup will
-	//	not work, including entities. Only the following
-	//	characters are allowed: numbers, letters, and spaces.
-	//	You must set this property.
-	appName: "setme",
-	
-	// autoEmbed: boolean
-	//	For advanced usage; most developers can ignore this.
-	//	Whether to automatically auto-embed the default Dojo Offline
-	//	widget into this page; default is true. 
-	autoEmbed: true,
-	
-	// autoEmbedID: String
-	//	For advanced usage; most developers can ignore this.
-	//	The ID of the DOM element that will contain our
-	//	Dojo Offline widget; defaults to the ID 'dot-widget'.
-	autoEmbedID: "dot-widget",
-	
-	// runLink: String
-	//	For advanced usage; most developers can ignore this.
-	//	The URL that should be navigated to to run this 
-	//	application offline; this will be placed inside of a
-	//	link that the user can drag to their desktop and double
-	//	click. Note that this URL must exactly match the URL
-	//	of the main page of our resource that is offline for
-	//	it to be retrieved from the offline cache correctly.
-	//	For example, if you have cached your main page as
-	//	http://foobar.com/index.html, and you set this to
-	//	http://www.foobar.com/index.html, the run link will
-	//	not work. By default this value is automatically set to 
-	//	the URL of this page, so it does not need to be set
-	//	manually unless you have unusual needs.
-	runLink: window.location.href,
-	
-	// runLinkTitle: String
-	//	For advanced usage; most developers can ignore this.
-	//	The text that will be inside of the link that a user
-	//	can drag to their desktop to run this application offline.
-	//	By default this is automatically set to "Run " plus your
-	//	application's name.
-	runLinkTitle: "Run Application",
-	
-	// learnHowPath: String
-	//	For advanced usage; most developers can ignore this.
-	//	The path to a web page that has information on 
-	//	how to use this web app offline; defaults to
-	//	src/off/ui-template/learnhow.html, relative to
-	//	your Dojo installation. Make sure to set
-	//	dojo.to.ui.customLearnHowPath to true if you want
-	//	a custom Learn How page.
-	learnHowPath: dojo.moduleUrl("dojox", "off/resources/learnhow.html"),
-	
-	// customLearnHowPath: boolean
-	//	For advanced usage; most developers can ignore this.
-	//	Whether the developer is using their own custom page
-	//	for the Learn How instructional page; defaults to false.
-	//	Use in conjunction with dojox.off.ui.learnHowPath.
-	customLearnHowPath: false,
-	
-	htmlTemplatePath: dojo.moduleUrl("dojox", "off/resources/offline-widget.html").uri,
-	cssTemplatePath: dojo.moduleUrl("dojox", "off/resources/offline-widget.css").uri,
-	onlineImagePath: dojo.moduleUrl("dojox", "off/resources/greenball.png").uri,
-	offlineImagePath: dojo.moduleUrl("dojox", "off/resources/redball.png").uri,
-	rollerImagePath: dojo.moduleUrl("dojox", "off/resources/roller.gif").uri,
-	checkmarkImagePath: dojo.moduleUrl("dojox", "off/resources/checkmark.png").uri,
-	learnHowJSPath: dojo.moduleUrl("dojox", "off/resources/learnhow.js").uri,
-	
-	_initialized: false,
-	
-	onLoad: function(){
-		// summary:
-		//	A function that should be connected to allow your
-		//	application to know when Dojo Offline, the page, and
-		//	the Offline Widget are all initialized and ready to be
-		//	used:
-		//
-		//		dojo.connect(dojox.off.ui, "onLoad", someFunc)
-	},
-
-	_initialize: function(){
-		//
-		
-		// 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){
-		//
-		// 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){
-			//
-			
-			// 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 at columbia.edu
-			//syncMessage.innerHTML = message;
-			
-			while(syncMessage.firstChild){
-				syncMessage.removeChild(syncMessage.firstChild);
-			}
-			syncMessage.appendChild(document.createTextNode(message));
-		}
-	},
-	
-	_clearSyncMessage: function(){
-		this._setSyncMessage("");
-	},
-	
-	_initImages: function(){	
-		var onlineImg = dojo.byId("dot-widget-network-indicator-online");
-		if(onlineImg){
-			onlineImg.setAttribute("src", this.onlineImagePath);
-		}
-		
-		var offlineImg = dojo.byId("dot-widget-network-indicator-offline");
-		if(offlineImg){
-			offlineImg.setAttribute("src", this.offlineImagePath);
-		}
-		
-		var roller = dojo.byId("dot-roller");
-		if(roller){
-			roller.setAttribute("src", this.rollerImagePath);
-		}
-		
-		var checkmark = dojo.byId("dot-success-checkmark");
-		if(checkmark){
-			checkmark.setAttribute("src", this.checkmarkImagePath);
-		}
-	},
-	
-	_showDetails: function(evt){
-		// cancel the button's default behavior
-		evt.preventDefault();
-		evt.stopPropagation();
-		
-		if(!dojox.off.sync.details.length){
-			return;
-		}
-		
-		// determine our HTML message to display
-		var html = "";
-		html += "<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"){
-			
-		
-			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){
-		//
-		switch(type){
-			case "start": 
-				this._updateSyncUI();
-				break;
-				
-			case "refreshFiles":
-				this._setSyncMessage("Downloading UI...");
-				break;
-				
-			case "upload":
-				this._setSyncMessage("Uploading new data...");
-				break;
-				
-			case "download":
-				this._setSyncMessage("Downloading new data...");
-				break;
-				
-			case "finished":
-				this._syncFinished();
-				break;
-				
-			case "cancel":
-				this._setSyncMessage("Canceling Sync...");
-				break;
-				
-			default:
-				dojo.warn("Programming error: "
-							+ "Unknown sync type in dojox.off.ui: " + type);
-				break;
-		}
-	},
-	
-	_onNetwork: function(type){
-		// summary:
-		//	Called when we go on- or off-line
-		// description:
-		//	When we go online or offline, this method is called to update
-		//	our UI. Default behavior is to update the Offline
-		//	Widget UI and to attempt a synchronization.
-		// type: String
-		//	"online" if we just moved online, and "offline" if we just
-		//	moved offline.
-		
-		if(!this._initialized){ return; }
-		
-		// update UI
-		this._updateNetIndicator();
-		
-		if(type == "offline"){
-			this._setSyncMessage("You are working offline");
-		
-			// clear old details
-			var details = dojo.byId("dot-sync-details");
-			if(details){ details.style.display = "none"; }
-			
-			// if we fell offline during a sync, hide
-			// the sync info
-			this._updateSyncUI();
-		}else{ // online
-			// synchronize, but pause for a few seconds
-			// so that the user can orient themselves
-			if(dojox.off.sync.autoSync){
-				if(dojo.isAIR){
-					window.setTimeout(function(){dojox.off.sync.synchronize();}, 1000);
-				}else{
-					window.setTimeout(dojox._scopeName + ".off.sync.synchronize()", 1000);
-				}
-			}
-		}
-	}
-});
-
-// register ourselves for low-level framework events
-dojo.connect(dojox.off, "onFrameworkEvent", dojox.off.ui, "_onFrameworkEvent");
-
-// start our magic when the Dojo Offline framework is ready to go
-dojo.connect(dojox.off, "onLoad", dojox.off.ui, dojox.off.ui._initialize);
-
-}
-
-if(!dojo._hasResource["dojox.off.offline"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojox.off.offline"] = true;
-dojo.provide("dojox.off.offline");
-
-
-
-
-
-
-
-}
-
diff --git a/dojox/off/resources/checkmark.png b/dojox/off/resources/checkmark.png
deleted file mode 100644
index a0ffbb1..0000000
Binary files a/dojox/off/resources/checkmark.png and /dev/null differ
diff --git a/dojox/off/resources/greenball.png b/dojox/off/resources/greenball.png
deleted file mode 100644
index 520b6a6..0000000
Binary files a/dojox/off/resources/greenball.png and /dev/null differ
diff --git a/dojox/off/resources/learnhow.html b/dojox/off/resources/learnhow.html
deleted file mode 100644
index 2833fcc..0000000
--- a/dojox/off/resources/learnhow.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<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
diff --git a/dojox/off/resources/learnhow.js b/dojox/off/resources/learnhow.js
deleted file mode 100644
index e81d99c..0000000
--- a/dojox/off/resources/learnhow.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-window.onload=function(){
-var _1=window.location.href;
-var _2=_1.match(/appName=([a-z0-9 \%]*)/i);
-var _3="Application";
-if(_2&&_2.length>0){
-_3=decodeURIComponent(_2[1]);
-}
-var _4=document.getElementById("dot-learn-how-app-name");
-_4.innerHTML="";
-_4.appendChild(document.createTextNode(_3));
-_2=_1.match(/hasOfflineCache=(true|false)/);
-var _5=false;
-if(_2&&_2.length>0){
-_5=_2[1];
-_5=(_5=="true")?true:false;
-}
-if(_5==true){
-var _6=document.getElementById("dot-download-step");
-var _7=document.getElementById("dot-install-step");
-_6.parentNode.removeChild(_6);
-_7.parentNode.removeChild(_7);
-}
-_2=_1.match(/runLink=([^\&]*)\&runLinkText=([^\&]*)/);
-if(_2&&_2.length>0){
-var _8=decodeURIComponent(_2[1]);
-var _9=document.getElementById("dot-learn-how-run-link");
-_9.setAttribute("href",_8);
-var _a=decodeURIComponent(_2[2]);
-_9.innerHTML="";
-_9.appendChild(document.createTextNode(_a));
-}
-};
diff --git a/dojox/off/resources/offline-widget.css b/dojox/off/resources/offline-widget.css
deleted file mode 100644
index 3d095e9..0000000
--- a/dojox/off/resources/offline-widget.css
+++ /dev/null
@@ -1,88 +0,0 @@
-
-#dot-widget-container{
-	
-	width: 13em;
-	height: auto;
-	border: 2px solid #CDDDE9; 
-	position: relative;
-	visibility: visible !important;
-}
-#dot-widget-title-bar{
-	background-color: #CDDDE9; 
-	padding-top: 0.2em;
-	padding-bottom: 0.2em;
-}
-#dot-widget-network-indicator{
-	height: 8px;
-	width: 8px;
-	padding-left: 0.3em;
-}
-#dot-widget-title-text{
-	vertical-align: middle;
-	font-weight: bold;
-	font-size: 14pt;
-	padding-left: 2px;
-}
-#dot-widget-contents{
-	padding: 8px 5px 8px 5px;
-}
-#dot-widget-learn-how{
-	font-size: 11pt;
-}
-#dot-sync-cancel,
-#dot-sync-status{
-	font-size: 11pt;
-}
-#dot-success-checkmark{
-	display: none;
-}
-#dot-roller{
-	display: none;
-	padding-right: 4px;
-}
-.dot-sync-error{
-	color: red;
-}
-#dot-sync-details{
-	display: none;
-	padding-left: 0.2em;
-}
-#dot-sync-status{
-	height: 2em;
-	margin-top: 0.8em;
-	margin-bottom: 0.8em;
-}
-.dot-needs-offline-cache #dot-widget-learn-how,
-.dot-needs-browser-restart{
-	text-align: center;
-	line-height: 1.2;
-	font-size: 16pt !important;
-}
-.dot-needs-offline-cache #dot-sync-status,
-.dot-needs-offline-cache #dot-widget-browser-restart{
-	display: none;
-}
-.dot-needs-browser-restart{
-    font-size: 14pt !important;
-    padding-bottom: 1em;
-    padding-top: 1em;
-}
-#dot-learn-how-body{
-	padding: 3em;
-	background-color: #CDDDE9; 
-}
-#dot-learn-how-contents{
-	border: 1px solid black; 
-	background-color: white; 
-	padding: 0.4em 0.6em 0.4em 0.6em;
-	font-size: 16pt;
-}
-#dot-learn-how-contents h1{
-	font-size: 24pt;
-}
-#dot-learn-how-contents h2{
-	font-size: 18pt;
-}
-#dot-learn-how-contents li{
-	padding-bottom: 0.6em;
-}
diff --git a/dojox/off/resources/offline-widget.html b/dojox/off/resources/offline-widget.html
deleted file mode 100644
index 5791644..0000000
--- a/dojox/off/resources/offline-widget.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!-- 
-	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> Offline!
-		</div>
-	</div>
-</div>
\ No newline at end of file
diff --git a/dojox/off/resources/redball.png b/dojox/off/resources/redball.png
deleted file mode 100644
index cc224c3..0000000
Binary files a/dojox/off/resources/redball.png and /dev/null differ
diff --git a/dojox/off/resources/roller.gif b/dojox/off/resources/roller.gif
deleted file mode 100644
index 24a3a24..0000000
Binary files a/dojox/off/resources/roller.gif and /dev/null differ
diff --git a/dojox/off/sync.js b/dojox/off/sync.js
deleted file mode 100644
index 21d3901..0000000
--- a/dojox/off/sync.js
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.off.sync"]){
-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");
-dojo.mixin(dojox.off.sync,{isSyncing:false,cancelled:false,successful:true,details:[],error:false,actions:null,autoSync:true,onSync:function(_1){
-},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(_2,_3){
-if(typeof _2=="undefined"){
-_2=true;
-}
-if(!_2){
-this.successful=false;
-this.details.push(_3);
-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(_4,_5){
-if(_4){
-this.error=true;
-this.successful=false;
-for(var i=0;i<_5.length;i++){
-this.details.push(_5[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(_7){
-this.actions._save(function(){
-_7();
-});
-},_load:function(_8){
-this.actions._load(function(){
-_8();
-});
-}});
-dojo.declare("dojox.off.sync.ActionLog",null,{entries:[],reasonHalted:null,isReplaying:false,autoSave:true,add:function(_9){
-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(_9);
-if(this.autoSave){
-this._save();
-}
-},onReplay:function(_a,_b){
-},length:function(){
-return this.entries.length;
-},haltReplay:function(_c){
-if(!this.isReplaying){
-return;
-}
-if(_c){
-this.reasonHalted=_c.toString();
-}
-if(this.autoSave){
-var _d=this;
-this._save(function(){
-_d.isReplaying=false;
-_d.onReplayFinished();
-});
-}else{
-this.isReplaying=false;
-this.onReplayFinished();
-}
-},continueReplay:function(){
-if(!this.isReplaying){
-return;
-}
-this.entries.shift();
-if(!this.entries.length){
-if(this.autoSave){
-var _e=this;
-this._save(function(){
-_e.isReplaying=false;
-_e.onReplayFinished();
-});
-return;
-}else{
-this.isReplaying=false;
-this.onReplayFinished();
-return;
-}
-}
-var _f=this.entries[0];
-this.onReplay(_f,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 _10=this.entries[0];
-this.onReplay(_10,this);
-},onReplayFinished:function(){
-},toString:function(){
-var _11="";
-_11+="[";
-for(var i=0;i<this.entries.length;i++){
-_11+="{";
-for(var j in this.entries[i]){
-_11+=j+": \""+this.entries[i][j]+"\"";
-_11+=", ";
-}
-_11+="}, ";
-}
-_11+="]";
-return _11;
-},_save:function(_14){
-if(!_14){
-_14=function(){
-};
-}
-try{
-var _15=this;
-var _16=function(_17,key,_19){
-if(_17==dojox.storage.FAILED){
-dojox.off.onFrameworkEvent("save",{status:dojox.storage.FAILED,isCoreSave:true,key:key,value:_19,namespace:dojox.off.STORAGE_NAMESPACE});
-_14();
-}else{
-if(_17==dojox.storage.SUCCESS){
-_14();
-}
-}
-};
-dojox.storage.put("actionlog",this.entries,_16,dojox.off.STORAGE_NAMESPACE);
-}
-catch(exp){
-
-dojox.off.onFrameworkEvent("save",{status:dojox.storage.FAILED,isCoreSave:true,key:"actionlog",value:this.entries,namespace:dojox.off.STORAGE_NAMESPACE});
-_14();
-}
-},_load:function(_1a){
-var _1b=dojox.storage.get("actionlog",dojox.off.STORAGE_NAMESPACE);
-if(!_1b){
-_1b=[];
-}
-this.entries=_1b;
-_1a();
-}});
-dojox.off.sync.actions=new dojox.off.sync.ActionLog();
-}
diff --git a/dojox/off/ui.js b/dojox/off/ui.js
deleted file mode 100644
index baf19df..0000000
--- a/dojox/off/ui.js
+++ /dev/null
@@ -1,358 +0,0 @@
-/*
-	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
-	Available via Academic Free License >= 2.1 OR the modified BSD license.
-	see: http://dojotoolkit.org/license for details
-*/
-
-
-if(!dojo._hasResource["dojox.off.ui"]){
-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");
-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.mod [...]
-},_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(_1){
-dojox.off.enabled=false;
-_1=_1.message||_1;
-alert("Error loading the Dojo Offline Widget from "+this.htmlTemplatePath+": "+_1);
-},load:dojo.hitch(this,this._templateLoaded)});
-},_templateLoaded:function(_2){
-var _3=dojo.byId(this.autoEmbedID);
-if(_3){
-_3.innerHTML=_2;
-}
-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 _4=dojo.byId("dot-widget-browser-restart");
-if(_4){
-_4.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(_5){
-this._onNetwork(_5?"online":"offline");
-this.onLoad();
-}));
-},_updateNetIndicator:function(){
-var _6=dojo.byId("dot-widget-network-indicator-online");
-var _7=dojo.byId("dot-widget-network-indicator-offline");
-var _8=dojo.byId("dot-widget-title-text");
-if(_6&&_7){
-if(dojox.off.isOnline==true){
-_6.style.display="inline";
-_7.style.display="none";
-}else{
-_6.style.display="none";
-_7.style.display="inline";
-}
-}
-if(_8){
-if(dojox.off.isOnline){
-_8.innerHTML="Online";
-}else{
-_8.innerHTML="Offline";
-}
-}
-},_initLearnHow:function(){
-var _9=dojo.byId("dot-widget-learn-how-link");
-if(!_9){
-return;
-}
-if(!this.customLearnHowPath){
-var _a=dojo.config.baseRelativePath;
-this.learnHowPath+="?appName="+encodeURIComponent(this.appName)+"&hasOfflineCache="+dojox.off.hasOfflineCache+"&runLink="+encodeURIComponent(this.runLink)+"&runLinkText="+encodeURIComponent(this.runLinkText)+"&baseRelativePath="+encodeURIComponent(_a);
-dojox.off.files.cache(this.learnHowJSPath);
-dojox.off.files.cache(this.learnHowPath);
-}
-_9.setAttribute("href",this.learnHowPath);
-var _b=dojo.byId("dot-widget-learn-how-app-name");
-if(!_b){
-return;
-}
-_b.innerHTML="";
-_b.appendChild(document.createTextNode(this.appName));
-},_validateAppName:function(_c){
-if(!_c){
-return false;
-}
-return (/^[a-z0-9 ]*$/i.test(_c));
-},_updateSyncUI:function(){
-var _d=dojo.byId("dot-roller");
-var _e=dojo.byId("dot-success-checkmark");
-var _f=dojo.byId("dot-sync-messages");
-var _10=dojo.byId("dot-sync-details");
-var _11=dojo.byId("dot-sync-cancel");
-if(dojox.off.sync.isSyncing){
-this._clearSyncMessage();
-if(_d){
-_d.style.display="inline";
-}
-if(_e){
-_e.style.display="none";
-}
-if(_f){
-dojo.removeClass(_f,"dot-sync-error");
-}
-if(_10){
-_10.style.display="none";
-}
-if(_11){
-_11.style.display="inline";
-}
-}else{
-if(_d){
-_d.style.display="none";
-}
-if(_11){
-_11.style.display="none";
-}
-if(_f){
-dojo.removeClass(_f,"dot-sync-error");
-}
-}
-},_setSyncMessage:function(_12){
-var _13=dojo.byId("dot-sync-messages");
-if(_13){
-while(_13.firstChild){
-_13.removeChild(_13.firstChild);
-}
-_13.appendChild(document.createTextNode(_12));
-}
-},_clearSyncMessage:function(){
-this._setSyncMessage("");
-},_initImages:function(){
-var _14=dojo.byId("dot-widget-network-indicator-online");
-if(_14){
-_14.setAttribute("src",this.onlineImagePath);
-}
-var _15=dojo.byId("dot-widget-network-indicator-offline");
-if(_15){
-_15.setAttribute("src",this.offlineImagePath);
-}
-var _16=dojo.byId("dot-roller");
-if(_16){
-_16.setAttribute("src",this.rollerImagePath);
-}
-var _17=dojo.byId("dot-success-checkmark");
-if(_17){
-_17.setAttribute("src",this.checkmarkImagePath);
-}
-},_showDetails:function(evt){
-evt.preventDefault();
-evt.stopPropagation();
-if(!dojox.off.sync.details.length){
-return;
-}
-var _19="";
-_19+="<html><head><title>Sync Details</title><head><body>";
-_19+="<h1>Sync Details</h1>\n";
-_19+="<ul>\n";
-for(var i=0;i<dojox.off.sync.details.length;i++){
-_19+="<li>";
-_19+=dojox.off.sync.details[i];
-_19+="</li>";
-}
-_19+="</ul>\n";
-_19+="<a href='javascript:window.close()' "+"style='text-align: right; padding-right: 2em;'>"+"Close Window"+"</a>\n";
-_19+="</body></html>";
-var _1b="height=400,width=600,resizable=true,"+"scrollbars=true,toolbar=no,menubar=no,"+"location=no,directories=no,dependent=yes";
-var _1c=window.open("","SyncDetails",_1b);
-if(!_1c){
-alert("Please allow popup windows for this domain; can't display sync details window");
-return;
-}
-_1c.document.open();
-_1c.document.write(_19);
-_1c.document.close();
-if(_1c.focus){
-_1c.focus();
-}
-},_cancel:function(evt){
-evt.preventDefault();
-evt.stopPropagation();
-dojox.off.sync.cancel();
-},_needsBrowserRestart:function(){
-var _1e=dojo.byId("dot-widget-browser-restart");
-if(_1e){
-dojo.addClass(_1e,"dot-needs-browser-restart");
-}
-var _1f=dojo.byId("dot-widget-browser-restart-app-name");
-if(_1f){
-_1f.innerHTML="";
-_1f.appendChild(document.createTextNode(this.appName));
-}
-var _20=dojo.byId("dot-sync-status");
-if(_20){
-_20.style.display="none";
-}
-},_showNeedsOfflineCache:function(){
-var _21=dojo.byId("dot-widget-container");
-if(_21){
-dojo.addClass(_21,"dot-needs-offline-cache");
-}
-},_hideNeedsOfflineCache:function(){
-var _22=dojo.byId("dot-widget-container");
-if(_22){
-dojo.removeClass(_22,"dot-needs-offline-cache");
-}
-},_initMainEvtHandlers:function(){
-var _23=dojo.byId("dot-sync-details-button");
-if(_23){
-dojo.connect(_23,"onclick",this,this._showDetails);
-}
-var _24=dojo.byId("dot-sync-cancel-button");
-if(_24){
-dojo.connect(_24,"onclick",this,this._cancel);
-}
-},_setOfflineEnabled:function(_25){
-var _26=[];
-_26.push(dojo.byId("dot-sync-status"));
-for(var i=0;i<_26.length;i++){
-if(_26[i]){
-_26[i].style.visibility=(_25?"visible":"hidden");
-}
-}
-},_syncFinished:function(){
-this._updateSyncUI();
-var _28=dojo.byId("dot-success-checkmark");
-var _29=dojo.byId("dot-sync-details");
-if(dojox.off.sync.successful==true){
-this._setSyncMessage("Sync Successful");
-if(_28){
-_28.style.display="inline";
-}
-}else{
-if(dojox.off.sync.cancelled==true){
-this._setSyncMessage("Sync Cancelled");
-if(_28){
-_28.style.display="none";
-}
-}else{
-this._setSyncMessage("Sync Error");
-var _2a=dojo.byId("dot-sync-messages");
-if(_2a){
-dojo.addClass(_2a,"dot-sync-error");
-}
-if(_28){
-_28.style.display="none";
-}
-}
-}
-if(dojox.off.sync.details.length&&_29){
-_29.style.display="inline";
-}
-},_onFrameworkEvent:function(_2b,_2c){
-if(_2b=="save"){
-if(_2c.status==dojox.storage.FAILED&&!_2c.isCoreSave){
-alert("Please increase the amount of local storage available "+"to this application");
-if(dojox.storage.hasSettingsUI()){
-dojox.storage.showSettingsUI();
-}
-}
-}else{
-if(_2b=="coreOperationFailed"){
-
-if(!this._userInformed){
-alert("This application will not work if Google Gears is not allowed to run");
-this._userInformed=true;
-}
-}else{
-if(_2b=="offlineCacheInstalled"){
-this._hideNeedsOfflineCache();
-if(dojox.off.hasOfflineCache==true&&dojox.off.browserRestart==true){
-this._needsBrowserRestart();
-return;
-}else{
-var _2d=dojo.byId("dot-widget-browser-restart");
-if(_2d){
-_2d.style.display="none";
-}
-}
-this._updateSyncUI();
-this._initMainEvtHandlers();
-this._setOfflineEnabled(dojox.off.enabled);
-this._testNet();
-}
-}
-}
-},_onSync:function(_2e){
-switch(_2e){
-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: "+_2e);
-break;
-}
-},_onNetwork:function(_2f){
-if(!this._initialized){
-return;
-}
-this._updateNetIndicator();
-if(_2f=="offline"){
-this._setSyncMessage("You are working offline");
-var _30=dojo.byId("dot-sync-details");
-if(_30){
-_30.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);
-}
diff --git a/dojox/resources/README.template b/dojox/resources/README.template
index 81dd925..6073c81 100644
--- a/dojox/resources/README.template
+++ b/dojox/resources/README.template
@@ -1,42 +1,42 @@
--------------------------------------------------------------------------------
-Project Name
--------------------------------------------------------------------------------
-Version X.XXX
-Release date: MM/DD/YYYY
--------------------------------------------------------------------------------
-Project state:
-[Object1]:	experimental | alpha | beta | production
-[Object2]:	experimental | alpha | beta | production
--------------------------------------------------------------------------------
-[   ]	l18n support?
-[   ]	a11y support?
--------------------------------------------------------------------------------
-Credits
-[Object1]:	Author one (author contact info)
-[Object2]:	Author two (author contact info)
--------------------------------------------------------------------------------
-Project description
-
-Describe the point of the project here.
--------------------------------------------------------------------------------
-Dependencies:
-
-List any dependencies here.
--------------------------------------------------------------------------------
-Documentation
-
-Any notes about documentation--such as a link to a page in the Book of Dojo,
-documentation state, etc.--should go here.
--------------------------------------------------------------------------------
-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.
+-------------------------------------------------------------------------------
+Project Name
+-------------------------------------------------------------------------------
+Version X.XXX
+Release date: MM/DD/YYYY
+-------------------------------------------------------------------------------
+Project state:
+[Object1]:	experimental | alpha | beta | production
+[Object2]:	experimental | alpha | beta | production
+-------------------------------------------------------------------------------
+[   ]	l18n support?
+[   ]	a11y support?
+-------------------------------------------------------------------------------
+Credits
+[Object1]:	Author one (author contact info)
+[Object2]:	Author two (author contact info)
+-------------------------------------------------------------------------------
+Project description
+
+Describe the point of the project here.
+-------------------------------------------------------------------------------
+Dependencies:
+
+List any dependencies here.
+-------------------------------------------------------------------------------
+Documentation
+
+Any notes about documentation--such as a link to a page in the Book of Dojo,
+documentation state, etc.--should go here.
+-------------------------------------------------------------------------------
+Installation instructions
+
+Use this to explain in detail what a person needs to do in order to use this
+project.  Include URLs for grabbing source, URLs for any dependencies, etc.
+Also be sure to include any additional information, such as where to place
+CSS files, images, other media, etc.  The goal is that someone reading this
+file can follow your instructions and be using this project within minutes.
+-------------------------------------------------------------------------------
+Additional Notes
+
+Anything else you think is of interest (for example, object hierarchy) should
+be placed here.
diff --git a/dojox/robot/recorder.js b/dojox/robot/recorder.js
index 0d04711..0c761f3 100644
--- a/dojox/robot/recorder.js
+++ b/dojox/robot/recorder.js
@@ -36,7 +36,7 @@ _b[1]=dt;
 _4.push({name:_a,args:_b});
 _7=new Date();
 };
-var _d=function(){
+var _c=function(){
 var c=_4;
 if(c[0].name=="doh.robot.keyPress"&&(c[0].args[0]==dojo.keys.ENTER||c[0].args[0]==77)){
 c.splice(0,1);
@@ -47,33 +47,33 @@ c.splice(i,1);
 }
 }
 for(i=0;i<c.length;i++){
-var _10,_11;
+var _d,_e;
 if(c[i+1]&&c[i].name=="doh.robot.mouseMove"&&c[i+1].name==c[i].name&&c[i+1].args[2]<_2){
-_10=c[i+1];
-_11=0;
-while(_10&&_10.name==c[i].name&&_10.args[2]<_2){
+_d=c[i+1];
+_e=0;
+while(_d&&_d.name==c[i].name&&_d.args[2]<_2){
 c.splice(i+1,1);
-_11+=_10.args[2];
-c[i].args[0]=_10.args[0];
-c[i].args[1]=_10.args[1];
-_10=c[i+1];
+_e+=_d.args[2];
+c[i].args[0]=_d.args[0];
+c[i].args[1]=_d.args[1];
+_d=c[i+1];
 }
-c[i].args[3]=_11;
+c[i].args[3]=_e;
 }else{
 if(c[i+1]&&c[i].name=="doh.robot.mouseWheel"&&c[i+1].name==c[i].name&&c[i+1].args[1]<_2){
-_10=c[i+1];
-_11=0;
-while(_10&&_10.name==c[i].name&&_10.args[1]<_2){
+_d=c[i+1];
+_e=0;
+while(_d&&_d.name==c[i].name&&_d.args[1]<_2){
 c.splice(i+1,1);
-_11+=_10.args[1];
-c[i].args[0]+=_10.args[0];
-_10=c[i+1];
+_e+=_d.args[1];
+c[i].args[0]+=_d.args[0];
+_d=c[i+1];
 }
-c[i].args[2]=_11;
+c[i].args[2]=_e;
 }else{
 if(c[i+2]&&c[i].name=="doh.robot.mouseMoveAt"&&c[i+2].name=="doh.robot.scrollIntoView"){
-var _12=c.splice(i+2,1)[0];
-c.splice(i,0,_12);
+var _f=c.splice(i+2,1)[0];
+c.splice(i,0,_f);
 }else{
 if(c[i+1]&&c[i].name=="doh.robot.mousePress"&&c[i+1].name=="doh.robot.mouseRelease"&&c[i].args[0]==c[i+1].args[0]){
 c[i].name="doh.robot.mouseClick";
@@ -89,15 +89,15 @@ c.splice(i+1,0,cmd);
 if(c[i+1]&&((c[i].name=="doh.robot.keyPress"&&typeof c[i].args[0]=="string")||c[i].name=="doh.robot.typeKeys")&&c[i+1].name=="doh.robot.keyPress"&&typeof c[i+1].args[0]=="string"&&c[i+1].args[1]<=_1&&!eval("("+c[i].args[2]+")").ctrl&&!eval("("+c[i].args[2]+")").alt&&!eval("("+c[i+1].args[2]+")").ctrl&&!eval("("+c[i+1].args[2]+")").alt){
 c[i].name="doh.robot.typeKeys";
 c[i].args.splice(3,1);
-_10=c[i+1];
-var _14=0;
-while(_10&&_10.name=="doh.robot.keyPress"&&typeof _10.args[0]=="string"&&_10.args[1]<=_1&&!eval("("+_10.args[2]+")").ctrl&&!eval("("+_10.args[2]+")").alt){
+_d=c[i+1];
+var _10=0;
+while(_d&&_d.name=="doh.robot.keyPress"&&typeof _d.args[0]=="string"&&_d.args[1]<=_1&&!eval("("+_d.args[2]+")").ctrl&&!eval("("+_d.args[2]+")").alt){
 c.splice(i+1,1);
-c[i].args[0]+=_10.args[0];
-_14+=_10.args[1];
-_10=c[i+1];
+c[i].args[0]+=_d.args[0];
+_10+=_d.args[1];
+_d=c[i+1];
 }
-c[i].args[2]=_14;
+c[i].args[2]=_10;
 c[i].args[0]="'"+c[i].args[0]+"'";
 }else{
 if(c[i].name=="doh.robot.keyPress"){
@@ -124,19 +124,18 @@ break;
 }
 }
 };
-var _16=function(){
+var _11=function(){
 if(!_6){
 _8();
 }else{
-_17();
+_12();
 }
 };
-var _17=function(){
+var _12=function(){
 var dt=Math.round((new Date()).getTime()-_6.getTime());
 _6=null;
-_d();
+_c();
 var c=_4;
-
 if(c.length){
 var s="doh.register('dojox.robot.AutoGeneratedTestGroup',{\n";
 s+="     name: 'autotest"+(_5++)+"',\n";
@@ -168,9 +167,9 @@ var div=document.createElement("div");
 div.id="dojox.robot.recorder";
 div.style.backgroundColor="white";
 div.style.position="absolute";
-var _1f={y:(window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0),x:(window.pageXOffset||(window["dojo"]?dojo._fixIeBiDiScrollLeft(document.documentElement.scrollLeft):undefined)||document.body.scrollLeft||0)};
-div.style.left=_1f.x+"px";
-div.style.top=_1f.y+"px";
+var _13={y:(window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0),x:(window.pageXOffset||(window["dojo"]?dojo._fixIeBiDiScrollLeft(document.documentElement.scrollLeft):undefined)||document.body.scrollLeft||0)};
+div.style.left=_13.x+"px";
+div.style.top=_13.y+"px";
 var h1=document.createElement("h1");
 h1.innerHTML="Your code:";
 div.appendChild(h1);
@@ -181,149 +180,149 @@ pre.innerText=s;
 pre.textContent=s;
 }
 div.appendChild(pre);
-var _22=document.createElement("button");
-_22.innerHTML="Close";
-var _23=dojo.connect(_22,"onmouseup",function(e){
+var _14=document.createElement("button");
+_14.innerHTML="Close";
+var _15=dojo.connect(_14,"onmouseup",function(e){
 dojo.stopEvent(e);
 document.body.removeChild(div);
-dojo.disconnect(_23);
+dojo.disconnect(_15);
 });
-div.appendChild(_22);
+div.appendChild(_14);
 document.body.appendChild(div);
 _4=[];
 }
 };
-var _25=function(_26){
-if(typeof _26=="string"){
-return "'"+_26+"'";
+var _16=function(_17){
+if(typeof _17=="string"){
+return "'"+_17+"'";
 }else{
-if(_26.id){
-return "'"+_26.id+"'";
+if(_17.id){
+return "'"+_17.id+"'";
 }else{
-var _27=document.getElementsByTagName(_26.nodeName);
+var _18=document.getElementsByTagName(_17.nodeName);
 var i;
-for(i=0;i<_27.length;i++){
-if(_27[i]==_26){
+for(i=0;i<_18.length;i++){
+if(_18[i]==_17){
 break;
 }
 }
-return "function(){ return document.getElementsByTagName('"+_26.nodeName+"')["+i+"]; }";
+return "function(){ return document.getElementsByTagName('"+_17.nodeName+"')["+i+"]; }";
 }
 }
 };
-var _29=function(b){
+var _19=function(b){
 return "{left:"+(b==0)+", middle:"+(b==1)+", right:"+(b==2)+"}";
 };
-var _2b=function(e){
+var _1a=function(e){
 return "{'shift':"+(e.shiftKey)+", 'ctrl':"+(e.ctrlKey)+", 'alt':"+(e.altKey)+"}";
 };
 dojo.connect(document,"onkeydown",function(e){
 if((e.keyCode==dojo.keys.ENTER||e.keyCode==77)&&e.ctrlKey&&e.altKey){
 dojo.stopEvent(e);
-_16();
+_11();
 }
 });
-var _2e={type:""};
-var _2f=function(e){
-if(!e||_2e.type==e.type&&_2e.button==e.button){
+var _1b={type:""};
+var _1c=function(e){
+if(!e||_1b.type==e.type&&_1b.button==e.button){
 return;
 }
-_2e={type:e.type,button:e.button};
-var _31=_25(e.target);
-var _32=dojo.coords(e.target);
-_9("doh.robot.mouseMoveAt",[_31,0,100,e.clientX-_32.x,e.clientY-_32.y]);
-_9("doh.robot.mousePress",[_29(e.button-(dojo.isIE?1:0)),0]);
+_1b={type:e.type,button:e.button};
+var _1d=_16(e.target);
+var _1e=dojo.coords(e.target);
+_9("doh.robot.mouseMoveAt",[_1d,0,100,e.clientX-_1e.x,e.clientY-_1e.y]);
+_9("doh.robot.mousePress",[_19(e.button-(dojo.isIE?1:0)),0]);
 };
-var _33=function(e){
-if(!e||_2e.type==e.type&&_2e.button==e.button){
+var _1f=function(e){
+if(!e||_1b.type==e.type&&_1b.button==e.button){
 return;
 }
-_2e={type:e.type,button:e.button};
-var _35=_25(e.target);
-var _36=dojo.coords(e.target);
-_9("doh.robot.mouseClick",[_29(e.button-(dojo.isIE?1:0)),0]);
+_1b={type:e.type,button:e.button};
+var _20=_16(e.target);
+var _21=dojo.coords(e.target);
+_9("doh.robot.mouseClick",[_19(e.button-(dojo.isIE?1:0)),0]);
 };
-var _37=function(e){
-if(!e||_2e.type==e.type&&_2e.button==e.button){
+var _22=function(e){
+if(!e||_1b.type==e.type&&_1b.button==e.button){
 return;
 }
-_2e={type:e.type,button:e.button};
-var _39=_25(e.target);
-var _3a=dojo.coords(e.target);
-_9("doh.robot.mouseRelease",[_29(e.button-(dojo.isIE?1:0)),0]);
+_1b={type:e.type,button:e.button};
+var _23=_16(e.target);
+var _24=dojo.coords(e.target);
+_9("doh.robot.mouseRelease",[_19(e.button-(dojo.isIE?1:0)),0]);
 };
-var _3b=function(e){
-if(!e||_2e.type==e.type&&_2e.pageX==e.pageX&&_2e.pageY==e.pageY){
+var _25=function(e){
+if(!e||_1b.type==e.type&&_1b.pageX==e.pageX&&_1b.pageY==e.pageY){
 return;
 }
-_2e={type:e.type,pageX:e.pageX,pageY:e.pageY};
+_1b={type:e.type,pageX:e.pageX,pageY:e.pageY};
 _9("doh.robot.mouseMove",[e.pageX,e.pageY,0,100,true]);
 };
-var _3d=function(e){
-if(!e||_2e.type==e.type&&_2e.pageX==e.pageX&&_2e.pageY==e.pageY){
+var _26=function(e){
+if(!e||_1b.type==e.type&&_1b.pageX==e.pageX&&_1b.pageY==e.pageY){
 return;
 }
-_2e={type:e.type,detail:(e.detail?(e.detail):(-e.wheelDelta/120))};
-_9("doh.robot.mouseWheel",[_2e.detail]);
+_1b={type:e.type,detail:(e.detail?(e.detail):(-e.wheelDelta/120))};
+_9("doh.robot.mouseWheel",[_1b.detail]);
 };
-var _3f=function(e){
-if(!e||_2e.type==e.type&&(_2e.charCode==e.charCode&&_2e.keyCode==e.keyCode)){
+var _27=function(e){
+if(!e||_1b.type==e.type&&(_1b.charCode==e.charCode&&_1b.keyCode==e.keyCode)){
 return;
 }
-_2e={type:e.type,charCode:e.charCode,keyCode:e.keyCode};
-_9("doh.robot.keyPress",[e.charOrCode==dojo.keys.SPACE?" ":e.charOrCode,0,_2b(e)]);
+_1b={type:e.type,charCode:e.charCode,keyCode:e.keyCode};
+_9("doh.robot.keyPress",[e.charOrCode==dojo.keys.SPACE?" ":e.charOrCode,0,_1a(e)]);
 };
-var _41=function(e){
-if(!e||_2e.type==e.type&&(_2e.charCode==e.charCode&&_2e.keyCode==e.keyCode)){
+var _28=function(e){
+if(!e||_1b.type==e.type&&(_1b.charCode==e.charCode&&_1b.keyCode==e.keyCode)){
 return;
 }
-_2e={type:e.type,charCode:e.charCode,keyCode:e.keyCode};
+_1b={type:e.type,charCode:e.charCode,keyCode:e.keyCode};
 };
-dojo.connect(document,"onmousedown",_2f);
-dojo.connect(document,"onmouseup",_37);
-dojo.connect(document,"onclick",_33);
-dojo.connect(document,"onkeypress",_3f);
-dojo.connect(document,"onkeyup",_41);
-dojo.connect(document,"onmousemove",_3b);
-dojo.connect(document,!dojo.isMozilla?"onmousewheel":"DOMMouseScroll",_3d);
+dojo.connect(document,"onmousedown",_1c);
+dojo.connect(document,"onmouseup",_22);
+dojo.connect(document,"onclick",_1f);
+dojo.connect(document,"onkeypress",_27);
+dojo.connect(document,"onkeyup",_28);
+dojo.connect(document,"onmousemove",_25);
+dojo.connect(document,!dojo.isMozilla?"onmousewheel":"DOMMouseScroll",_26);
 dojo.addOnLoad(function(){
 if(window["dijit"]&&dijit.scrollIntoView){
-dojo.connect(dijit,"scrollIntoView",function(_43){
-_9("doh.robot.scrollIntoView",[_25(_43)]);
+dojo.connect(dijit,"scrollIntoView",function(_29){
+_9("doh.robot.scrollIntoView",[_16(_29)]);
 });
 }
 });
-dojo.connect(dojo,"connect",function(_44,_45,f){
-if(_44&&(!f||!f._mine)){
-var _47=null;
-if(_45.toLowerCase()=="onmousedown"){
-_47=dojo.hitch(this,_2f);
+dojo.connect(dojo,"connect",function(_2a,_2b,f){
+if(_2a&&(!f||!f._mine)){
+var _2c=null;
+if(_2b.toLowerCase()=="onmousedown"){
+_2c=dojo.hitch(this,_1c);
 }else{
-if(_45.toLowerCase()==(!dojo.isMozilla?"onmousewheel":"dommousescroll")){
-_47=dojo.hitch(this,_3d);
+if(_2b.toLowerCase()==(!dojo.isMozilla?"onmousewheel":"dommousescroll")){
+_2c=dojo.hitch(this,_26);
 }else{
-if(_45.toLowerCase()=="onclick"){
-_47=dojo.hitch(this,_33);
+if(_2b.toLowerCase()=="onclick"){
+_2c=dojo.hitch(this,_1f);
 }else{
-if(_45.toLowerCase()=="onmouseup"){
-_47=dojo.hitch(this,_37);
+if(_2b.toLowerCase()=="onmouseup"){
+_2c=dojo.hitch(this,_22);
 }else{
-if(_45.toLowerCase()=="onkeypress"){
-_47=dojo.hitch(this,_3f);
+if(_2b.toLowerCase()=="onkeypress"){
+_2c=dojo.hitch(this,_27);
 }else{
-if(_45.toLowerCase()=="onkeyup"){
-_47=dojo.hitch(this,_41);
+if(_2b.toLowerCase()=="onkeyup"){
+_2c=dojo.hitch(this,_28);
 }
 }
 }
 }
 }
 }
-if(_47==null){
+if(_2c==null){
 return;
 }
-_47._mine=true;
-dojo.connect(_44,_45,_47);
+_2c._mine=true;
+dojo.connect(_2a,_2b,_2c);
 }
 });
 })();
diff --git a/dojox/rpc/Client.js b/dojox/rpc/Client.js
index d544b35..5a5e436 100644
--- a/dojox/rpc/Client.js
+++ b/dojox/rpc/Client.js
@@ -17,5 +17,5 @@ _3["Seq-Id"]=dojox._reqSeqId=(dojox._reqSeqId||0)+1;
 return dojo._defaultXhr.apply(dojo,arguments);
 };
 })();
-dojox.rpc.Client.clientId=(Math.random()+"").substring(2,14);
+dojox.rpc.Client.clientId=(Math.random()+"").substring(2,14)+(new Date().getTime()+"").substring(8,13);
 }
diff --git a/dojox/rpc/JsonRPC.js b/dojox/rpc/JsonRPC.js
index 3a9ecd0..622af64 100644
--- a/dojox/rpc/JsonRPC.js
+++ b/dojox/rpc/JsonRPC.js
@@ -17,23 +17,23 @@ if(_2){
 d.jsonrpc=_2;
 }
 return {data:dojo.toJson(d),handleAs:"json",contentType:"application/json",transport:"POST"};
-},deserialize:function(_8){
-if("Error"==_8.name){
-_8=dojo.fromJson(_8.responseText);
+},deserialize:function(_7){
+if("Error"==_7.name){
+_7=dojo.fromJson(_7.responseText);
 }
-if(_8.error){
-var e=new Error(_8.error.message||_8.error);
-e._rpcErrorObject=_8.error;
+if(_7.error){
+var e=new Error(_7.error.message||_7.error);
+e._rpcErrorObject=_7.error;
 return e;
 }
-return _8.result;
+return _7.result;
 }};
 };
-dojox.rpc.envelopeRegistry.register("JSON-RPC-1.0",function(_a){
-return _a=="JSON-RPC-1.0";
+dojox.rpc.envelopeRegistry.register("JSON-RPC-1.0",function(_8){
+return _8=="JSON-RPC-1.0";
 },dojo.mixin({namedParams:false},_1()));
-dojox.rpc.envelopeRegistry.register("JSON-RPC-2.0",function(_b){
-return _b=="JSON-RPC-2.0";
+dojox.rpc.envelopeRegistry.register("JSON-RPC-2.0",function(_9){
+return _9=="JSON-RPC-2.0";
 },_1("2.0"));
 })();
 }
diff --git a/dojox/rpc/JsonRest.js b/dojox/rpc/JsonRest.js
index 43ac94a..fd155c4 100644
--- a/dojox/rpc/JsonRest.js
+++ b/dojox/rpc/JsonRest.js
@@ -14,76 +14,113 @@ dojo.require("dojox.rpc.Rest");
 var _1=[];
 var _2=dojox.rpc.Rest;
 var jr;
-function _4(_5,_6,_7,_8){
-var _9=_6.ioArgs&&_6.ioArgs.xhr&&_6.ioArgs.xhr.getResponseHeader("Last-Modified");
-if(_9&&_2._timeStamps){
-_2._timeStamps[_8]=_9;
-}
-return _7&&dojox.json.ref.resolveJson(_7,{defaultId:_8,index:_2._index,timeStamps:_9&&_2._timeStamps,time:_9,idPrefix:_5.servicePath,idAttribute:jr.getIdAttribute(_5),schemas:jr.schemas,loader:jr._loader,assignAbsoluteIds:true});
+function _3(_4,_5,_6,_7){
+var _8=_5.ioArgs&&_5.ioArgs.xhr&&_5.ioArgs.xhr.getResponseHeader("Last-Modified");
+if(_8&&_2._timeStamps){
+_2._timeStamps[_7]=_8;
+}
+var _9=_4._schema&&_4._schema.hrefProperty;
+if(_9){
+dojox.json.ref.refAttribute=_9;
+}
+_6=_6&&dojox.json.ref.resolveJson(_6,{defaultId:_7,index:_2._index,timeStamps:_8&&_2._timeStamps,time:_8,idPrefix:_4.servicePath.replace(/[^\/]*$/,""),idAttribute:jr.getIdAttribute(_4),schemas:jr.schemas,loader:jr._loader,idAsRef:_4.idAsRef,assignAbsoluteIds:true});
+dojox.json.ref.refAttribute="$ref";
+return _6;
 };
-jr=dojox.rpc.JsonRest={conflictDateHeader:"If-Unmodified-Since",commit:function(_a){
+jr=dojox.rpc.JsonRest={serviceClass:dojox.rpc.Rest,conflictDateHeader:"If-Unmodified-Since",commit:function(_a){
 _a=_a||{};
 var _b=[];
 var _c={};
 var _d=[];
 for(var i=0;i<_1.length;i++){
-var _f=_1[i];
-var _10=_f.object;
-var old=_f.old;
-var _12=false;
-if(!(_a.service&&(_10||old)&&(_10||old).__id.indexOf(_a.service.servicePath))&&_f.save){
-delete _10.__isDirty;
-if(_10){
+var _e=_1[i];
+var _f=_e.object;
+var old=_e.old;
+var _10=false;
+if(!(_a.service&&(_f||old)&&(_f||old).__id.indexOf(_a.service.servicePath))&&_e.save){
+delete _f.__isDirty;
+if(_f){
 if(old){
-var _13;
-if((_13=_10.__id.match(/(.*)#.*/))){
-_10=_2._index[_13[1]];
+var _11;
+if((_11=_f.__id.match(/(.*)#.*/))){
+_f=_2._index[_11[1]];
+}
+if(!(_f.__id in _c)){
+_c[_f.__id]=_f;
+if(_a.incrementalUpdates&&!_11){
+var _12=(typeof _a.incrementalUpdates=="function"?_a.incrementalUpdates:function(){
+_12={};
+for(var j in _f){
+if(_f.hasOwnProperty(j)){
+if(_f[j]!==old[j]){
+_12[j]=_f[j];
+}
+}else{
+if(old.hasOwnProperty(j)){
+return null;
 }
-if(!(_10.__id in _c)){
-_c[_10.__id]=_10;
-_b.push({method:"put",target:_10,content:_10});
 }
+}
+return _12;
+})(_f,old);
+}
+if(_12){
+_b.push({method:"post",target:_f,content:_12});
 }else{
-_b.push({method:"post",target:{__id:jr.getServiceAndId(_10.__id).service.servicePath},content:_10});
+_b.push({method:"put",target:_f,content:_f});
+}
+}
+}else{
+var _13=jr.getServiceAndId(_f.__id).service;
+var _14=jr.getIdAttribute(_13);
+if((_14 in _f)&&!_a.alwaysPostNewItems){
+_b.push({method:"put",target:_f,content:_f});
+}else{
+_b.push({method:"post",target:{__id:_13.servicePath},content:_f});
+}
 }
 }else{
 if(old){
 _b.push({method:"delete",target:old});
 }
 }
-_d.push(_f);
+_d.push(_e);
 _1.splice(i--,1);
 }
 }
 dojo.connect(_a,"onError",function(){
-var _14=_1;
+if(_a.revertOnError!==false){
+var _15=_1;
 _1=_d;
-var _15=0;
+var _16=0;
 jr.revert();
-_1=_14;
+_1=_15;
+}else{
+_1=dirtyObject.concat(_d);
+}
 });
 jr.sendToServer(_b,_a);
 return _b;
-},sendToServer:function(_16,_17){
-var _18;
-var _19=dojo.xhr;
-var _1a=_16.length;
+},sendToServer:function(_17,_18){
+var _19;
+var _1a=dojo.xhr;
+var _1b=_17.length;
 var i,_1c;
 var _1d;
 var _1e=this.conflictDateHeader;
 dojo.xhr=function(_1f,_20){
 _20.headers=_20.headers||{};
-_20.headers["Transaction"]=_16.length-1==i?"commit":"open";
+_20.headers["Transaction"]=_17.length-1==i?"commit":"open";
 if(_1e&&_1d){
 _20.headers[_1e]=_1d;
 }
 if(_1c){
 _20.headers["Content-ID"]="<"+_1c+">";
 }
-return _19.apply(dojo,arguments);
+return _1a.apply(dojo,arguments);
 };
-for(i=0;i<_16.length;i++){
-var _21=_16[i];
+for(i=0;i<_17.length;i++){
+var _21=_17[i];
 dojox.rpc.JsonRest._contentId=_21.content&&_21.content.__id;
 var _22=_21.method=="post";
 _1d=_21.method=="put"&&_2._timeStamps[_21.content.__id];
@@ -94,185 +131,212 @@ _1c=_22&&dojox.rpc.JsonRest._contentId;
 var _23=jr.getServiceAndId(_21.target.__id);
 var _24=_23.service;
 var dfd=_21.deferred=_24[_21.method](_23.id.replace(/#/,""),dojox.json.ref.toJson(_21.content,false,_24.servicePath,true));
-(function(_26,dfd,_28){
-dfd.addCallback(function(_29){
+(function(_25,dfd,_26){
+dfd.addCallback(function(_27){
 try{
-var _2a=dfd.ioArgs.xhr&&dfd.ioArgs.xhr.getResponseHeader("Location");
-if(_2a){
-var _2b=_2a.match(/(^\w+:\/\/)/)&&_2a.indexOf(_28.servicePath);
-_2a=_2b>0?_2a.substring(_2b):(_28.servicePath+_2a).replace(/^(.*\/)?(\w+:\/\/)|[^\/\.]+\/\.\.\/|^.*\/(\/)/,"$2$3");
-_26.__id=_2a;
-_2._index[_2a]=_26;
+var _28=dfd.ioArgs.xhr&&dfd.ioArgs.xhr.getResponseHeader("Location");
+if(_28){
+var _29=_28.match(/(^\w+:\/\/)/)&&_28.indexOf(_26.servicePath);
+_28=_29>0?_28.substring(_29):(_26.servicePath+_28).replace(/^(.*\/)?(\w+:\/\/)|[^\/\.]+\/\.\.\/|^.*\/(\/)/,"$2$3");
+_25.__id=_28;
+_2._index[_28]=_25;
 }
-_29=_4(_28,dfd,_29,_26&&_26.__id);
+_27=_3(_26,dfd,_27,_25&&_25.__id);
 }
 catch(e){
 }
-if(!(--_1a)){
-if(_17.onComplete){
-_17.onComplete.call(_17.scope);
+if(!(--_1b)){
+if(_18.onComplete){
+_18.onComplete.call(_18.scope,_17);
 }
 }
-return _29;
+return _27;
 });
 })(_21.content,dfd,_24);
-dfd.addErrback(function(_2c){
-_1a=-1;
-_17.onError.call(_17.scope,_2c);
+dfd.addErrback(function(_2a){
+_1b=-1;
+_18.onError.call(_18.scope,_2a);
 });
 }
-dojo.xhr=_19;
+dojo.xhr=_1a;
 },getDirtyObjects:function(){
 return _1;
-},revert:function(_2d){
+},revert:function(_2b){
 for(var i=_1.length;i>0;){
 i--;
-var _2f=_1[i];
-var _30=_2f.object;
-var old=_2f.old;
-if(!(_2d&&(_30||old)&&(_30||old).__id.indexOf(_2d.servicePath))){
-if(_30&&old){
+var _2c=_1[i];
+var _2d=_2c.object;
+var old=_2c.old;
+var _2e=dojox.data._getStoreForItem(_2d||old);
+if(!(_2b&&(_2d||old)&&(_2d||old).__id.indexOf(_2b.servicePath))){
+if(_2d&&old){
 for(var j in old){
-if(old.hasOwnProperty(j)){
-_30[j]=old[j];
+if(old.hasOwnProperty(j)&&_2d[j]!==old[j]){
+if(_2e){
+_2e.onSet(_2d,j,_2d[j],old[j]);
+}
+_2d[j]=old[j];
 }
 }
-for(j in _30){
+for(j in _2d){
 if(!old.hasOwnProperty(j)){
-delete _30[j];
+if(_2e){
+_2e.onSet(_2d,j,_2d[j]);
+}
+delete _2d[j];
+}
+}
+}else{
+if(!old){
+if(_2e){
+_2e.onDelete(_2d);
+}
+}else{
+if(_2e){
+_2e.onNew(old);
 }
 }
 }
+delete (_2d||old).__isDirty;
 _1.splice(i,1);
 }
 }
-},changing:function(_33,_34){
-if(!_33.__id){
+},changing:function(_2f,_30){
+if(!_2f.__id){
 return;
 }
-_33.__isDirty=true;
+_2f.__isDirty=true;
 for(var i=0;i<_1.length;i++){
-var _36=_1[i];
-if(_33==_36.object){
-if(_34){
-_36.object=false;
+var _31=_1[i];
+if(_2f==_31.object){
+if(_30){
+_31.object=false;
 if(!this._saveNotNeeded){
-_36.save=true;
+_31.save=true;
 }
 }
 return;
 }
 }
-var old=_33 instanceof Array?[]:{};
-for(i in _33){
-if(_33.hasOwnProperty(i)){
-old[i]=_33[i];
-}
+var old=_2f instanceof Array?[]:{};
+for(i in _2f){
+if(_2f.hasOwnProperty(i)){
+old[i]=_2f[i];
 }
-_1.push({object:!_34&&_33,old:old,save:!this._saveNotNeeded});
-},deleteObject:function(_38){
-this.changing(_38,true);
-},getConstructor:function(_39,_3a){
-if(typeof _39=="string"){
-var _3b=_39;
-_39=new dojox.rpc.Rest(_39,true);
-this.registerService(_39,_3b,_3a);
 }
-if(_39._constructor){
-return _39._constructor;
+_1.push({object:!_30&&_2f,old:old,save:!this._saveNotNeeded});
+},deleteObject:function(_32){
+this.changing(_32,true);
+},getConstructor:function(_33,_34){
+if(typeof _33=="string"){
+var _35=_33;
+_33=new dojox.rpc.Rest(_33,true);
+this.registerService(_33,_35,_34);
 }
-_39._constructor=function(_3c){
-var _3d=this;
-var _3e=arguments;
-var _3f;
-function _40(_41){
-if(_41){
-_40(_41["extends"]);
-_3f=_41.properties;
-for(var i in _3f){
-var _43=_3f[i];
-if(_43&&(typeof _43=="object")&&("default" in _43)){
-_3d[i]=_43["default"];
+if(_33._constructor){
+return _33._constructor;
 }
+_33._constructor=function(_36){
+var _37=this;
+var _38=arguments;
+var _39;
+var _3a;
+function _3b(_3c){
+if(_3c){
+_3b(_3c["extends"]);
+_39=_3c.properties;
+for(var i in _39){
+var _3d=_39[i];
+if(_3d&&(typeof _3d=="object")&&("default" in _3d)){
+_37[i]=_3d["default"];
 }
 }
-if(_3c){
-dojo.mixin(_3d,_3c);
 }
-if(_41&&_41.prototype&&_41.prototype.initialize){
-_41.prototype.initialize.apply(_3d,_3e);
+if(_3c&&_3c.prototype&&_3c.prototype.initialize){
+_3a=true;
+_3c.prototype.initialize.apply(_37,_38);
 }
 };
-_40(_39._schema);
-var _44=jr.getIdAttribute(_39);
-_2._index[this.__id=this.__clientId=_39.servicePath+(this[_44]||Math.random().toString(16).substring(2,14)+"@"+((dojox.rpc.Client&&dojox.rpc.Client.clientId)||"client"))]=this;
-if(dojox.json.schema&&_3f){
-dojox.json.schema.mustBeValid(dojox.json.schema.validate(this,_39._schema));
+_3b(_33._schema);
+if(!_3a&&_36&&typeof _36=="object"){
+dojo.mixin(_37,_36);
+}
+var _3e=jr.getIdAttribute(_33);
+_2._index[this.__id=this.__clientId=_33.servicePath+(this[_3e]||Math.random().toString(16).substring(2,14)+"@"+((dojox.rpc.Client&&dojox.rpc.Client.clientId)||"client"))]=this;
+if(dojox.json.schema&&_39){
+dojox.json.schema.mustBeValid(dojox.json.schema.validate(this,_33._schema));
 }
 _1.push({object:this,save:true});
 };
-return dojo.mixin(_39._constructor,_39._schema,{load:_39});
-},fetch:function(_45){
-var _46=jr.getServiceAndId(_45);
-return this.byId(_46.service,_46.id);
-},getIdAttribute:function(_47){
-var _48=_47._schema;
-var _49;
-if(_48){
-if(!(_49=_48._idAttr)){
-for(var i in _48.properties){
-if(_48.properties[i].identity){
-_48._idAttr=_49=i;
-}
-}
-}
-}
-return _49||"id";
-},getServiceAndId:function(_4b){
-var _4c=_4b.match(/^(.*\/)([^\/]*)$/);
-var svc=jr.services[_4c[1]]||new dojox.rpc.Rest(_4c[1],true);
-return {service:svc,id:_4c[2]};
-},services:{},schemas:{},registerService:function(_4e,_4f,_50){
-_4f=_4f||_4e.servicePath;
-_4f=_4e.servicePath=_4f.match(/\/$/)?_4f:(_4f+"/");
-_4e._schema=jr.schemas[_4f]=_50||_4e._schema||{};
-jr.services[_4f]=_4e;
-},byId:function(_51,id){
-var _53,_54=_2._index[(_51.servicePath||"")+id];
-if(_54&&!_54._loadObject){
-_53=new dojo.Deferred();
-_53.callback(_54);
-return _53;
-}
-return this.query(_51,id);
-},query:function(_55,id,_57){
-var _58=_55(id,_57);
-_58.addCallback(function(_59){
-if(_59.nodeType&&_59.cloneNode){
-return _59;
-}
-return _4(_55,_58,_59,typeof id!="string"||(_57&&(_57.start||_57.count))?undefined:id);
+return dojo.mixin(_33._constructor,_33._schema,{load:_33});
+},fetch:function(_3f){
+var _40=jr.getServiceAndId(_3f);
+return this.byId(_40.service,_40.id);
+},getIdAttribute:function(_41){
+var _42=_41._schema;
+var _43;
+if(_42){
+if(!(_43=_42._idAttr)){
+for(var i in _42.properties){
+if(_42.properties[i].identity||(_42.properties[i].link=="self")){
+_42._idAttr=_43=i;
+}
+}
+}
+}
+return _43||"id";
+},getServiceAndId:function(_44){
+var _45="";
+for(var _46 in jr.services){
+if((_44.substring(0,_46.length)==_46)&&(_46.length>=_45.length)){
+_45=_46;
+}
+}
+if(_45){
+return {service:jr.services[_45],id:_44.substring(_45.length)};
+}
+var _47=_44.match(/^(.*\/)([^\/]*)$/);
+return {service:new jr.serviceClass(_47[1],true),id:_47[2]};
+},services:{},schemas:{},registerService:function(_48,_49,_4a){
+_49=_48.servicePath=_49||_48.servicePath;
+_48._schema=jr.schemas[_49]=_4a||_48._schema||{};
+jr.services[_49]=_48;
+},byId:function(_4b,id){
+var _4c,_4d=_2._index[(_4b.servicePath||"")+id];
+if(_4d&&!_4d._loadObject){
+_4c=new dojo.Deferred();
+_4c.callback(_4d);
+return _4c;
+}
+return this.query(_4b,id);
+},query:function(_4e,id,_4f){
+var _50=_4e(id,_4f);
+_50.addCallback(function(_51){
+if(_51.nodeType&&_51.cloneNode){
+return _51;
+}
+return _3(_4e,_50,_51,typeof id!="string"||(_4f&&(_4f.start||_4f.count))?undefined:id);
 });
-return _58;
-},_loader:function(_5a){
-var _5b=jr.getServiceAndId(this.__id);
-var _5c=this;
-jr.query(_5b.service,_5b.id).addBoth(function(_5d){
-if(_5d==_5c){
-delete _5d.$ref;
-delete _5d._loadObject;
+return _50;
+},_loader:function(_52){
+var _53=jr.getServiceAndId(this.__id);
+var _54=this;
+jr.query(_53.service,_53.id).addBoth(function(_55){
+if(_55==_54){
+delete _55.$ref;
+delete _55._loadObject;
 }else{
-_5c._loadObject=function(_5e){
-_5e(_5d);
+_54._loadObject=function(_56){
+_56(_55);
 };
 }
-_5a(_5d);
+_52(_55);
 });
-},isDirty:function(_5f){
-if(!_5f){
+},isDirty:function(_57){
+if(!_57){
 return !!_1.length;
 }
-return _5f.__isDirty;
+return _57.__isDirty;
 }};
 })();
 }
diff --git a/dojox/rpc/OfflineRest.js b/dojox/rpc/OfflineRest.js
index 0c70b28..8bcc172 100644
--- a/dojox/rpc/OfflineRest.js
+++ b/dojox/rpc/OfflineRest.js
@@ -19,105 +19,109 @@ var _4=_1._index;
 dojox.storage.manager.addOnLoad(function(){
 _3=dojox.storage.manager.available;
 for(var i in _4){
-_6(_4[i],i);
+_5(_4[i],i);
 }
 });
-var _7;
-function _8(_9){
-return _9.replace(/[^0-9A-Za-z_]/g,"_");
+var _6;
+function _7(_8){
+return _8.replace(/[^0-9A-Za-z_]/g,"_");
 };
-function _6(_a,id){
-if(_3&&!_7&&(id||(_a&&_a.__id))){
-dojox.storage.put(_8(id||_a.__id),typeof _a=="object"?dojox.json.ref.toJson(_a):_a,function(){
+function _5(_9,id){
+if(_3&&!_6&&(id||(_9&&_9.__id))){
+dojox.storage.put(_7(id||_9.__id),typeof _9=="object"?dojox.json.ref.toJson(_9):_9,function(){
 },_2);
 }
 };
-function _c(_d){
-return _d instanceof Error&&(_d.status==503||_d.status>12000||!_d.status);
+function _a(_b){
+return _b instanceof Error&&(_b.status==503||_b.status>12000||!_b.status);
 };
-function _e(){
+function _c(){
 if(_3){
-var _f=dojox.storage.get("dirty",_2);
-if(_f){
-for(var _10 in _f){
-_11(_10,_f);
+var _d=dojox.storage.get("dirty",_2);
+if(_d){
+for(var _e in _d){
+_f(_e,_d);
 }
 }
 }
 };
-var _12;
-function _13(){
-_12.sendChanges();
-_12.downloadChanges();
+var _10;
+function _11(){
+_10.sendChanges();
+_10.downloadChanges();
 };
-var _14=setInterval(_13,15000);
-dojo.connect(document,"ononline",_13);
-_12=dojox.rpc.OfflineRest={turnOffAutoSync:function(){
-clearInterval(_14);
-},sync:_13,sendChanges:_e,downloadChanges:function(){
-},addStore:function(_15,_16){
-_12.stores.push(_15);
-_15.fetch({queryOptions:{cache:true},query:_16,onComplete:function(_17,_18){
-_15._localBaseResults=_17;
-_15._localBaseFetch=_18;
+var _12=setInterval(_11,15000);
+dojo.connect(document,"ononline",_11);
+_10=dojox.rpc.OfflineRest={turnOffAutoSync:function(){
+clearInterval(_12);
+},sync:_11,sendChanges:_c,downloadChanges:function(){
+},addStore:function(_13,_14){
+_10.stores.push(_13);
+_13.fetch({queryOptions:{cache:true},query:_14,onComplete:function(_15,_16){
+_13._localBaseResults=_15;
+_13._localBaseFetch=_16;
 }});
 }};
-_12.stores=[];
-var _19=_1._get;
-_1._get=function(_1a,id){
+_10.stores=[];
+var _17=_1._get;
+_1._get=function(_18,id){
 try{
-_e();
+_c();
 if(window.navigator&&navigator.onLine===false){
 throw new Error();
 }
-var dfd=_19(_1a,id);
+var dfd=_17(_18,id);
 }
 catch(e){
 dfd=new dojo.Deferred();
 dfd.errback(e);
 }
-var _1d=dojox.rpc._sync;
-dfd.addCallback(function(_1e){
-_6(_1e,_1a.servicePath+id);
-return _1e;
+var _19=dojox.rpc._sync;
+dfd.addCallback(function(_1a){
+_5(_1a,_18._getRequest(id).url);
+return _1a;
 });
-dfd.addErrback(function(_1f){
+dfd.addErrback(function(_1b){
 if(_3){
-if(_c(_1f)){
-var _20={};
-var _21=function(id,_23){
-if(_20[id]){
-return _23;
+if(_a(_1b)){
+var _1c={};
+var _1d=function(id,_1e){
+if(_1c[id]){
+return _1e;
 }
-var _24=dojo.fromJson(dojox.storage.get(_8(id),_2))||_23;
-_20[id]=_24;
-for(var i in _24){
-var val=_24[i];
-if(val&&val.$ref){
-_24[i]=_21(val.$ref,val);
+var _1f=dojo.fromJson(dojox.storage.get(_7(id),_2))||_1e;
+_1c[id]=_1f;
+for(var i in _1f){
+var val=_1f[i];
+id=val&&val.$ref;
+if(id){
+if(id.substring&&id.substring(0,4)=="cid:"){
+id=id.substring(4);
 }
+_1f[i]=_1d(id,val);
 }
-if(_24 instanceof Array){
-for(i=0;i<_24.length;i++){
-if(_24[i]===undefined){
-_24.splice(i--,1);
+}
+if(_1f instanceof Array){
+for(i=0;i<_1f.length;i++){
+if(_1f[i]===undefined){
+_1f.splice(i--,1);
 }
 }
 }
-return _24;
-};
-_7=true;
-var _27=_21(_1a.servicePath+id);
-if(!_27){
 return _1f;
+};
+_6=true;
+var _20=_1d(_18._getRequest(id).url);
+if(!_20){
+return _1b;
 }
-_7=false;
-return _27;
+_6=false;
+return _20;
 }else{
-return _1f;
+return _1b;
 }
 }else{
-if(_1d){
+if(_19){
 return new Error("Storage manager not loaded, can not continue");
 }
 dfd=new dojo.Deferred();
@@ -130,59 +134,70 @@ return dfd;
 });
 return dfd;
 };
-var _28=_1._change;
-_1._change=function(_29,_2a,id,_2c){
-if(!_3){
-return _28.apply(this,arguments);
-}
-var _2d=_2a.servicePath+id;
-if(_29=="delete"){
-dojox.storage.remove(_8(_2d),_2);
+function _21(_22,_23,_24,_25,_26){
+if(_22=="delete"){
+dojox.storage.remove(_7(_23),_2);
 }else{
-dojox.storage.put(_8(dojox.rpc.JsonRest._contentId),_2c,function(){
+dojox.storage.put(_7(_24),_25,function(){
 },_2);
 }
-var _2e=_2a._store;
-if(_2e){
-_2e.updateResultSet(_2e._localBaseResults,_2e._localBaseFetch);
-dojox.storage.put(_8(_2a.servicePath+_2e._localBaseFetch.query),dojox.json.ref.toJson(_2e._localBaseResults),function(){
+var _27=_26&&_26._store;
+if(_27){
+_27.updateResultSet(_27._localBaseResults,_27._localBaseFetch);
+dojox.storage.put(_7(_26._getRequest(_27._localBaseFetch.query).url),dojox.json.ref.toJson(_27._localBaseResults),function(){
 },_2);
 }
-var _2f=dojox.storage.get("dirty",_2)||{};
-if(_29=="put"||_29=="delete"){
-var _30=_2d;
+};
+dojo.addOnLoad(function(){
+dojo.connect(dojox.data,"restListener",function(_28){
+var _29=_28.channel;
+var _2a=_28.event.toLowerCase();
+var _2b=dojox.rpc.JsonRest&&dojox.rpc.JsonRest.getServiceAndId(_29).service;
+_21(_2a,_29,_2a=="post"?_29+_28.result.id:_29,dojo.toJson(_28.result),_2b);
+});
+});
+var _2c=_1._change;
+_1._change=function(_2d,_2e,id,_2f){
+if(!_3){
+return _2c.apply(this,arguments);
+}
+var _30=_2e._getRequest(id).url;
+_21(_2d,_30,dojox.rpc.JsonRest._contentId,_2f,_2e);
+var _31=dojox.storage.get("dirty",_2)||{};
+if(_2d=="put"||_2d=="delete"){
+var _32=_30;
 }else{
-_30=0;
-for(var i in _2f){
+_32=0;
+for(var i in _31){
 if(!isNaN(parseInt(i))){
-_30=i;
+_32=i;
 }
 }
-_30++;
+_32++;
 }
-_2f[_30]={method:_29,id:_2d,content:_2c};
-return _11(_30,_2f);
+_31[_32]={method:_2d,id:_30,content:_2f};
+return _f(_32,_31);
 };
-function _11(_32,_33){
-var _34=_33[_32];
-var _35=dojox.rpc.JsonRest.getServiceAndId(_34.id);
-var _36=_28(_34.method,_35.service,_35.id,_34.content);
-_33[_32]=_34;
-dojox.storage.put("dirty",_33,function(){
+function _f(_33,_34){
+var _35=_34[_33];
+var _36=dojox.rpc.JsonRest.getServiceAndId(_35.id);
+var _37=_2c(_35.method,_36.service,_36.id,_35.content);
+_34[_33]=_35;
+dojox.storage.put("dirty",_34,function(){
 },_2);
-_36.addBoth(function(_37){
-if(_c(_37)){
+_37.addBoth(function(_38){
+if(_a(_38)){
 return null;
 }
-var _38=dojox.storage.get("dirty",_2)||{};
-delete _38[_32];
-dojox.storage.put("dirty",_38,function(){
+var _39=dojox.storage.get("dirty",_2)||{};
+delete _39[_33];
+dojox.storage.put("dirty",_39,function(){
 },_2);
-return _37;
+return _38;
 });
-return _36;
+return _37;
 };
-dojo.connect(_4,"onLoad",_6);
-dojo.connect(_4,"onUpdate",_6);
+dojo.connect(_4,"onLoad",_5);
+dojo.connect(_4,"onUpdate",_5);
 })();
 }
diff --git a/dojox/rpc/ProxiedPath.js b/dojox/rpc/ProxiedPath.js
index bd8e29e..5ef291a 100644
--- a/dojox/rpc/ProxiedPath.js
+++ b/dojox/rpc/ProxiedPath.js
@@ -13,18 +13,18 @@ dojox.rpc.envelopeRegistry.register("PROXIED-PATH",function(_1){
 return _1=="PROXIED-PATH";
 },{serialize:function(_2,_3,_4){
 var i;
-var _6=dojox.rpc.getTarget(_2,_3);
+var _5=dojox.rpc.getTarget(_2,_3);
 if(dojo.isArray(_4)){
 for(i=0;i<_4.length;i++){
-_6+="/"+(_4[i]==null?"":_4[i]);
+_5+="/"+(_4[i]==null?"":_4[i]);
 }
 }else{
 for(i in _4){
-_6+="/"+i+"/"+_4[i];
+_5+="/"+i+"/"+_4[i];
 }
 }
-return {data:"",target:(_3.proxyUrl||_2.proxyUrl)+"?url="+encodeURIComponent(_6)};
-},deserialize:function(_7){
-return _7;
+return {data:"",target:(_3.proxyUrl||_2.proxyUrl)+"?url="+encodeURIComponent(_5)};
+},deserialize:function(_6){
+return _6;
 }});
 }
diff --git a/dojox/rpc/README b/dojox/rpc/README
index e451281..af38011 100644
--- a/dojox/rpc/README
+++ b/dojox/rpc/README
@@ -12,18 +12,12 @@ JsonRPC.js: beta - plugins for json-rpc for the rpc system
 Rest.js: beta - plugin for REST style services for the rpc system
 JsonRest.js: beta - A module for tracking and persisting changes to JSON objects 
 through REST.
-LocalStorageRest.js: alpha - A module for storing REST changes locally as write-
+OfflineRest.js: alpha - A module for storing REST changes locally as write-
 back cache for offline and intermittent connection situations
-OfflineRest.js: alpha - A module for using LocalStorageRest for a full-fledged
-offline application
 ProxiedPath.js: beta - plugin for the PATH envelope to work with a simple PHP proxy
 Client.js: alpha - A module for maintaining per page/tab client sessions and 
 deterministic message sequencing with a server.
 
-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.
 
 -------------------------------------------------------------------------------
diff --git a/dojox/rpc/Rest.js b/dojox/rpc/Rest.js
index 9301c25..6773711 100644
--- a/dojox/rpc/Rest.js
+++ b/dojox/rpc/Rest.js
@@ -13,64 +13,75 @@ if(dojox.rpc&&dojox.rpc.transportRegistry){
 dojox.rpc.transportRegistry.register("REST",function(_1){
 return _1=="REST";
 },{getExecutor:function(_2,_3,_4){
-return new dojox.rpc.Rest(_3.name,(_3.contentType||_4._smd.contentType||"").match(/json|javascript/),null,function(id,_6){
-var _7=_4._getRequest(_3,[id]);
-_7.url=_7.target+(_7.data?"?"+_7.data:"");
-return _7;
+return new dojox.rpc.Rest(_3.name,(_3.contentType||_4._smd.contentType||"").match(/json|javascript/),null,function(id,_5){
+var _6=_4._getRequest(_3,[id]);
+_6.url=_6.target+(_6.data?"?"+_6.data:"");
+return _6;
 });
 }});
 }
-var _8;
-function _9(_a,_b,_c,id){
-_a.addCallback(function(_e){
-if(_c){
-_c=_a.ioArgs.xhr&&_a.ioArgs.xhr.getResponseHeader("Content-Range");
-_a.fullLength=_c&&(_c=_c.match(/\/(.*)/))&&parseInt(_c[1]);
+var _7;
+function _8(_9,_a,_b,id){
+_9.addCallback(function(_c){
+if(_9.ioArgs.xhr&&_b){
+_b=_9.ioArgs.xhr.getResponseHeader("Content-Range");
+_9.fullLength=_b&&(_b=_b.match(/\/(.*)/))&&parseInt(_b[1]);
 }
-return _e;
+return _c;
 });
-return _a;
+return _9;
 };
-_8=dojox.rpc.Rest=function(_f,_10,_11,_12){
-var _13;
-_f=_f.match(/\/$/)?_f:(_f+"/");
-_13=function(id,_15){
-return _8._get(_13,id,_15);
+_7=dojox.rpc.Rest=function(_d,_e,_f,_10){
+var _11;
+_11=function(id,_12){
+return _7._get(_11,id,_12);
 };
-_13.isJson=_10;
-_13._schema=_11;
-_13.cache={serialize:_10?((dojox.json&&dojox.json.ref)||dojo).toJson:function(_16){
-return _16;
+_11.isJson=_e;
+_11._schema=_f;
+_11.cache={serialize:_e?((dojox.json&&dojox.json.ref)||dojo).toJson:function(_13){
+return _13;
 }};
-_13._getRequest=_12||function(id,_18){
-var _19={url:_f+(dojo.isObject(id)?"?"+dojo.objectToQuery(id):id==null?"":id),handleAs:_10?"json":"text",contentType:_10?"application/json":"text/plain",sync:dojox.rpc._sync,headers:{Accept:_10?"application/json,application/javascript":"*/*"}};
-if(_18&&(_18.start>=0||_18.count>=0)){
-_19.headers.Range="items="+(_18.start||"0")+"-"+((_18.count&&_18.count!=Infinity&&(_18.count+(_18.start||0)-1))||"");
+_11._getRequest=_10||function(id,_14){
+if(dojo.isObject(id)){
+id=dojo.objectToQuery(id);
+id=id?"?"+id:"";
+}
+if(_14&&_14.sort&&!_14.queryStr){
+id+=(id?"&":"?")+"sort(";
+for(var i=0;i<_14.sort.length;i++){
+var _15=_14.sort[i];
+id+=(i>0?",":"")+(_15.descending?"-":"+")+encodeURIComponent(_15.attribute);
+}
+id+=")";
+}
+var _16={url:_d+(id==null?"":id),handleAs:_e?"json":"text",contentType:_e?"application/json":"text/plain",sync:dojox.rpc._sync,headers:{Accept:_e?"application/json,application/javascript":"*/*"}};
+if(_14&&(_14.start>=0||_14.count>=0)){
+_16.headers.Range="items="+(_14.start||"0")+"-"+((_14.count&&_14.count!=Infinity&&(_14.count+(_14.start||0)-1))||"");
 }
 dojox.rpc._sync=false;
-return _19;
+return _16;
 };
-function _1a(_1b){
-_13[_1b]=function(id,_1d){
-return _8._change(_1b,_13,id,_1d);
+function _17(_18){
+_11[_18]=function(id,_19){
+return _7._change(_18,_11,id,_19);
 };
 };
-_1a("put");
-_1a("post");
-_1a("delete");
-_13.servicePath=_f;
-return _13;
+_17("put");
+_17("post");
+_17("delete");
+_11.servicePath=_d;
+return _11;
 };
-_8._index={};
-_8._timeStamps={};
-_8._change=function(_1e,_1f,id,_21){
-var _22=_1f._getRequest(id);
-_22[_1e+"Data"]=_21;
-return _9(dojo.xhr(_1e.toUpperCase(),_22,true),_1f);
+_7._index={};
+_7._timeStamps={};
+_7._change=function(_1a,_1b,id,_1c){
+var _1d=_1b._getRequest(id);
+_1d[_1a+"Data"]=_1c;
+return _8(dojo.xhr(_1a.toUpperCase(),_1d,true),_1b);
 };
-_8._get=function(_23,id,_25){
-_25=_25||{};
-return _9(dojo.xhrGet(_23._getRequest(id,_25)),_23,(_25.start>=0||_25.count>=0),id);
+_7._get=function(_1e,id,_1f){
+_1f=_1f||{};
+return _8(dojo.xhrGet(_1e._getRequest(id,_1f)),_1e,(_1f.start>=0||_1f.count>=0),id);
 };
 })();
 }
diff --git a/dojox/rpc/SMDLibrary/friendfeed.smd b/dojox/rpc/SMDLibrary/friendfeed.smd
new file mode 100644
index 0000000..a18aa8e
--- /dev/null
+++ b/dojox/rpc/SMDLibrary/friendfeed.smd
@@ -0,0 +1,49 @@
+{
+	"SMDVersion": "2.0",
+	"id": "http://friendfeed.com/api",
+	"description": "Friendfeed's API - documentation at http://code.google.com/p/friendfeed-api/wiki/ApiDocumentation",
+
+	transport: "JSONP",
+	envelope: "URL",
+	
+	additionalParameters: true,
+	parameters: [
+		{ name: "format",  optional: false, "default": "json" },
+		{ name: "service", optional: true  },
+		{ name: "start",   optional: true, type: "integer"	},
+		{ name: "num",	   optional: true, type: "integer"	}
+	],
+
+	services: {
+		users: {
+			target: "http://friendfeed.com/api/feed/user",
+			parameters: [
+				{ name: "nickname", type: "string", optional: false, "default": "" }
+			]
+		},
+		entry: {
+			target: "http://friendfeed.com/api/feed/entry",
+			parameters: [
+				{ name: "entry_id", type: "string", optional: false, "default": "" }
+			]
+		},
+		search: {
+			target: "http://friendfeed.com/api/feed/search",
+			parameters: [
+				{ name: "q", type: "string", optional: false, "default": "" }
+			]
+		},
+		url: {
+			target: "http://friendfeed.com/api/feed/url",
+			parameters: [
+				{ name: "url", type: "string", optional: false, "default": "" }
+			]
+		},	  
+		domain: {
+			target: "http://friendfeed.com/api/feed/domain",
+			parameters: [
+				{ name: "domain", type: "string", optional: false, "default":"" }
+			]
+		}
+	}
+}
diff --git a/dojox/rpc/SMDLibrary/yahoo.smd b/dojox/rpc/SMDLibrary/yahoo.smd
index 20f936f..831e0b1 100644
--- a/dojox/rpc/SMDLibrary/yahoo.smd
+++ b/dojox/rpc/SMDLibrary/yahoo.smd
@@ -142,7 +142,7 @@
 		//
 		
 		// http://developer.yahoo.com/search/content/V1/termExtraction.html
-		contextSearch: {
+		termExtraction: {
 			// 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",
@@ -153,6 +153,28 @@
 		},
 
 		//
+		// CONTEXT SEARCH
+		//
+		
+		// http://developer.yahoo.com/search/content/V1/contextSearch.html
+		contextSearch: {
+			target: "http://search.yahooapis.com/WebSearchService/V1/contextSearch",
+			parameters: [
+				{ name: "query", type: "string", optional: true, "default": "" },
+				{ name: "context", type: "string", optional: false, "default": "" },
+				{ 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: "license", type: "string", optional: true, "default": "any" } // can be "any", "cc_any", "cc_commercial", "cc_modifiable"
+			]
+		},
+
+		//
 		// IMAGE SEARCH
 		//
 
diff --git a/dojox/rpc/Service.js b/dojox/rpc/Service.js
index b7ca289..a1f5b2e 100644
--- a/dojox/rpc/Service.js
+++ b/dojox/rpc/Service.js
@@ -13,7 +13,7 @@ dojo.declare("dojox.rpc.Service",null,{constructor:function(_1,_2){
 var _3;
 var _4=this;
 function _5(_6){
-_6._baseUrl=new dojo._Url(location.href,_3||".")+"";
+_6._baseUrl=new dojo._Url((dojo.isBrowser?location.href:dojo.config.baseUrl),_3||".")+"";
 _4._smd=_6;
 for(var _7 in _4._smd.services){
 var _8=_7.split(".");
@@ -31,11 +31,11 @@ _3=_1+"";
 }else{
 _3=_1;
 }
-var _b=dojo._getText(_3);
-if(!_b){
+var _a=dojo._getText(_3);
+if(!_a){
 throw new Error("Unable to load SMD from "+_1);
 }else{
-_5(dojo.fromJson(_b));
+_5(dojo.fromJson(_a));
 }
 }else{
 _5(_1);
@@ -43,149 +43,149 @@ _5(_1);
 }
 this._options=(_2?_2:{});
 this._requestId=0;
-},_generateService:function(_c,_d){
-if(this[_d]){
-throw new Error("WARNING: "+_c+" already exists for service. Unable to generate function");
-}
-_d.name=_c;
-var _e=dojo.hitch(this,"_executeMethod",_d);
-var _f=dojox.rpc.transportRegistry.match(_d.transport||this._smd.transport);
-if(_f.getExecutor){
-_e=_f.getExecutor(_e,_d,this);
-}
-var _10=_d.returns||(_d._schema={});
-var _11="/"+_c+"/";
-_10._service=_e;
-_e.servicePath=_11;
-_e._schema=_10;
-_e.id=dojox.rpc.Service._nextId++;
-return _e;
-},_getRequest:function(_12,_13){
+},_generateService:function(_b,_c){
+if(this[_c]){
+throw new Error("WARNING: "+_b+" already exists for service. Unable to generate function");
+}
+_c.name=_b;
+var _d=dojo.hitch(this,"_executeMethod",_c);
+var _e=dojox.rpc.transportRegistry.match(_c.transport||this._smd.transport);
+if(_e.getExecutor){
+_d=_e.getExecutor(_d,_c,this);
+}
+var _f=_c.returns||(_c._schema={});
+var _10="/"+_b+"/";
+_f._service=_d;
+_d.servicePath=_10;
+_d._schema=_f;
+_d.id=dojox.rpc.Service._nextId++;
+return _d;
+},_getRequest:function(_11,_12){
 var smd=this._smd;
-var _15=dojox.rpc.envelopeRegistry.match(_12.envelope||smd.envelope||"NONE");
-if(_15.namedParams){
-if((_13.length==1)&&dojo.isObject(_13[0])){
-_13=_13[0];
+var _13=dojox.rpc.envelopeRegistry.match(_11.envelope||smd.envelope||"NONE");
+var _14=(_11.parameters||[]).concat(smd.parameters||[]);
+if(_13.namedParams){
+if((_12.length==1)&&dojo.isObject(_12[0])){
+_12=_12[0];
 }else{
-var _16={};
-for(var i=0;i<_12.parameters.length;i++){
-if(typeof _13[i]!="undefined"||!_12.parameters[i].optional){
-_16[_12.parameters[i].name]=_13[i];
+var _15={};
+for(var i=0;i<_11.parameters.length;i++){
+if(typeof _12[i]!="undefined"||!_11.parameters[i].optional){
+_15[_11.parameters[i].name]=_12[i];
 }
 }
-_13=_16;
+_12=_15;
 }
-var _18=(_12.parameters||[]).concat(smd.parameters||[]);
-if(_12.strictParameters||smd.strictParameters){
-for(i in _13){
-var _19=false;
-for(var j=0;j<_18.length;j++){
-if(_18[i].name==i){
-_19=true;
+if(_11.strictParameters||smd.strictParameters){
+for(i in _12){
+var _16=false;
+for(var j=0;j<_14.length;j++){
+if(_14[i].name==i){
+_16=true;
 }
 }
-if(!_19){
-delete _13[i];
+if(!_16){
+delete _12[i];
 }
 }
 }
-for(i=0;i<_18.length;i++){
-var _1b=_18[i];
-if(!_1b.optional&&_1b.name&&!_13[_1b.name]){
-if(_1b["default"]){
-_13[_1b.name]=_1b["default"];
+for(i=0;i<_14.length;i++){
+var _17=_14[i];
+if(!_17.optional&&_17.name&&!_12[_17.name]){
+if(_17["default"]){
+_12[_17.name]=_17["default"];
 }else{
-if(!(_1b.name in _13)){
-throw new Error("Required parameter "+_1b.name+" was omitted");
+if(!(_17.name in _12)){
+throw new Error("Required parameter "+_17.name+" was omitted");
 }
 }
 }
 }
 }else{
-if(_12.parameters&&_12.parameters[0]&&_12.parameters[0].name&&(_13.length==1)&&dojo.isObject(_13[0])){
-if(_15.namedParams===false){
-_13=dojox.rpc.toOrdered(_12,_13);
+if(_14&&_14[0]&&_14[0].name&&(_12.length==1)&&dojo.isObject(_12[0])){
+if(_13.namedParams===false){
+_12=dojox.rpc.toOrdered(_14,_12);
 }else{
-_13=_13[0];
+_12=_12[0];
 }
 }
 }
 if(dojo.isObject(this._options)){
-_13=dojo.mixin(_13,this._options);
-}
-var _1c=_12._schema||_12.returns;
-var _1d=_15.serialize.apply(this,[smd,_12,_13]);
-_1d._envDef=_15;
-var _1e=(_12.contentType||smd.contentType||_1d.contentType);
-return dojo.mixin(_1d,{sync:dojox.rpc._sync,contentType:_1e,headers:{},target:_1d.target||dojox.rpc.getTarget(smd,_12),transport:_12.transport||smd.transport||_1d.transport,envelope:_12.envelope||smd.envelope||_1d.envelope,timeout:_12.timeout||smd.timeout,callbackParamName:_12.callbackParamName||smd.callbackParamName,schema:_1c,handleAs:_1d.handleAs||"auto",preventCache:_12.preventCache||smd.preventCache,frameDoc:this._options.frameDoc||undefined});
-},_executeMethod:function(_1f){
-var _20=[];
+_12=dojo.mixin(_12,this._options);
+}
+var _18=_11._schema||_11.returns;
+var _19=_13.serialize.apply(this,[smd,_11,_12]);
+_19._envDef=_13;
+var _1a=(_11.contentType||smd.contentType||_19.contentType);
+return dojo.mixin(_19,{sync:dojox.rpc._sync,contentType:_1a,headers:{},target:_19.target||dojox.rpc.getTarget(smd,_11),transport:_11.transport||smd.transport||_19.transport,envelope:_11.envelope||smd.envelope||_19.envelope,timeout:_11.timeout||smd.timeout,callbackParamName:_11.callbackParamName||smd.callbackParamName,schema:_18,handleAs:_19.handleAs||"auto",preventCache:_11.preventCache||smd.preventCache,frameDoc:this._options.frameDoc||undefined});
+},_executeMethod:function(_1b){
+var _1c=[];
 var i;
 for(i=1;i<arguments.length;i++){
-_20.push(arguments[i]);
+_1c.push(arguments[i]);
 }
-var _22=this._getRequest(_1f,_20);
-var _23=dojox.rpc.transportRegistry.match(_22.transport).fire(_22);
-_23.addBoth(function(_24){
-return _22._envDef.deserialize.call(this,_24);
+var _1d=this._getRequest(_1b,_1c);
+var _1e=dojox.rpc.transportRegistry.match(_1d.transport).fire(_1d);
+_1e.addBoth(function(_1f){
+return _1d._envDef.deserialize.call(this,_1f);
 });
-return _23;
+return _1e;
 }});
-dojox.rpc.getTarget=function(smd,_26){
-var _27=smd._baseUrl;
+dojox.rpc.getTarget=function(smd,_20){
+var _21=smd._baseUrl;
 if(smd.target){
-_27=new dojo._Url(_27,smd.target)+"";
+_21=new dojo._Url(_21,smd.target)+"";
 }
-if(_26.target){
-_27=new dojo._Url(_27,_26.target)+"";
+if(_20.target){
+_21=new dojo._Url(_21,_20.target)+"";
 }
-return _27;
+return _21;
 };
-dojox.rpc.toOrdered=function(_28,_29){
-if(dojo.isArray(_29)){
-return _29;
+dojox.rpc.toOrdered=function(_22,_23){
+if(dojo.isArray(_23)){
+return _23;
 }
-var _2a=[];
-for(var i=0;i<_28.parameters.length;i++){
-_2a.push(_29[_28.parameters[i].name]);
+var _24=[];
+for(var i=0;i<_22.length;i++){
+_24.push(_23[_22[i].name]);
 }
-return _2a;
+return _24;
 };
 dojox.rpc.transportRegistry=new dojo.AdapterRegistry(true);
 dojox.rpc.envelopeRegistry=new dojo.AdapterRegistry(true);
 dojox.rpc.envelopeRegistry.register("URL",function(str){
 return str=="URL";
-},{serialize:function(smd,_2e,_2f){
-var d=dojo.objectToQuery(_2f);
+},{serialize:function(smd,_25,_26){
+var d=dojo.objectToQuery(_26);
 return {data:d,transport:"POST"};
-},deserialize:function(_31){
-return _31;
+},deserialize:function(_27){
+return _27;
 },namedParams:true});
 dojox.rpc.envelopeRegistry.register("JSON",function(str){
 return str=="JSON";
-},{serialize:function(smd,_34,_35){
-var d=dojo.toJson(_35);
+},{serialize:function(smd,_28,_29){
+var d=dojo.toJson(_29);
 return {data:d,handleAs:"json",contentType:"application/json"};
-},deserialize:function(_37){
-return _37;
+},deserialize:function(_2a){
+return _2a;
 }});
 dojox.rpc.envelopeRegistry.register("PATH",function(str){
 return str=="PATH";
-},{serialize:function(smd,_3a,_3b){
+},{serialize:function(smd,_2b,_2c){
 var i;
-var _3d=dojox.rpc.getTarget(smd,_3a);
-if(dojo.isArray(_3b)){
-for(i=0;i<_3b.length;i++){
-_3d+="/"+_3b[i];
+var _2d=dojox.rpc.getTarget(smd,_2b);
+if(dojo.isArray(_2c)){
+for(i=0;i<_2c.length;i++){
+_2d+="/"+_2c[i];
 }
 }else{
-for(i in _3b){
-_3d+="/"+i+"/"+_3b[i];
+for(i in _2c){
+_2d+="/"+i+"/"+_2c[i];
 }
 }
-return {data:"",target:_3d};
-},deserialize:function(_3e){
-return _3e;
+return {data:"",target:_2d};
+},deserialize:function(_2e){
+return _2e;
 }});
 dojox.rpc.transportRegistry.register("POST",function(str){
 return str=="POST";
@@ -209,9 +209,9 @@ return dojo.io.script.get(r);
 }});
 dojox.rpc.Service._nextId=1;
 dojo._contentHandlers.auto=function(xhr){
-var _46=dojo._contentHandlers;
-var _47=xhr.getResponseHeader("Content-Type");
-var _48=!_47?_46.text(xhr):_47.match(/\/.*json/)?_46.json(xhr):_47.match(/\/javascript/)?_46.javascript(xhr):_47.match(/\/xml/)?_46.xml(xhr):_46.text(xhr);
-return _48;
+var _2f=dojo._contentHandlers;
+var _30=xhr.getResponseHeader("Content-Type");
+var _31=!_30?_2f.text(xhr):_30.match(/\/.*json/)?_2f.json(xhr):_30.match(/\/javascript/)?_2f.javascript(xhr):_30.match(/\/xml/)?_2f.xml(xhr):_2f.text(xhr);
+return _31;
 };
 }
diff --git a/dojox/secure/DOM.js b/dojox/secure/DOM.js
index c09a1bc..790c416 100644
--- a/dojox/secure/DOM.js
+++ b/dojox/secure/DOM.js
@@ -50,74 +50,74 @@ _7.data__=_6;
 return _7;
 }
 if(typeof _6=="function"){
-var _d=function(_e){
-if(typeof _e=="function"){
+var _b=function(_c){
+if(typeof _c=="function"){
 return function(){
 for(var i=0;i<arguments.length;i++){
 arguments[i]=_5(arguments[i]);
 }
-return _d(_e.apply(_5(this),arguments));
+return _b(_c.apply(_5(this),arguments));
 };
 }
-return dojox.secure.unwrap(_e);
+return dojox.secure.unwrap(_c);
 };
 return function(){
 if(_6.safetyCheck){
-_6.safetyCheck.apply(_d(this),arguments);
+_6.safetyCheck.apply(_b(this),arguments);
 }
 for(var i=0;i<arguments.length;i++){
-arguments[i]=_d(arguments[i]);
+arguments[i]=_b(arguments[i]);
 }
-return _5(_6.apply(_d(this),arguments));
+return _5(_6.apply(_b(this),arguments));
 };
 }
 }
 return _6;
 };
 unwrap=dojox.secure.unwrap;
-function _11(css){
-css+="";
-if(css.match(/behavior:|content:|javascript:|binding|expression|\@import/)){
+function _d(_e){
+_e+="";
+if(_e.match(/behavior:|content:|javascript:|binding|expression|\@import/)){
 throw new Error("Illegal CSS");
 }
 var id=_1.id||(_1.id="safe"+(""+Math.random()).substring(2));
-return css.replace(/(\}|^)\s*([^\{]*\{)/g,function(t,a,b){
+return _e.replace(/(\}|^)\s*([^\{]*\{)/g,function(t,a,b){
 return a+" #"+id+" "+b;
 });
 };
-function _17(url){
+function _f(url){
 if(url.match(/:/)&&!url.match(/^(http|ftp|mailto)/)){
 throw new Error("Unsafe URL "+url);
 }
 };
-function _19(el){
+function _10(el){
 if(el&&el.nodeType==1){
 if(el.tagName.match(/script/i)){
 var src=el.src;
 if(src&&src!=""){
 el.parentNode.removeChild(el);
-dojo.xhrGet({url:src,secure:true}).addCallback(function(_1c){
-_a.evaluate(_1c);
+dojo.xhrGet({url:src,secure:true}).addCallback(function(_11){
+_a.evaluate(_11);
 });
 }else{
-var _1d=el.innerHTML;
+var _12=el.innerHTML;
 el.parentNode.removeChild(el);
-_5.evaluate(_1d);
+_5.evaluate(_12);
 }
 }
 if(el.tagName.match(/link/i)){
 throw new Error("illegal tag");
 }
 if(el.tagName.match(/style/i)){
-var _1e=function(_1f){
+var _13=function(_14){
 if(el.styleSheet){
-el.styleSheet.cssText=_1f;
+el.styleSheet.cssText=_14;
 }else{
-var _20=doc.createTextNode(_1f);
+var _15=doc.createTextNode(_14);
 if(el.childNodes[0]){
-el.replaceChild(_20,el.childNodes[0]);
+el.replaceChild(_15,el.childNodes[0]);
 }else{
-el.appendChild(_20);
+el.appendChild(_15);
 }
 }
 };
@@ -125,111 +125,110 @@ src=el.src;
 if(src&&src!=""){
 alert("src"+src);
 el.src=null;
-dojo.xhrGet({url:src,secure:true}).addCallback(function(_21){
-_1e(_11(_21));
+dojo.xhrGet({url:src,secure:true}).addCallback(function(_16){
+_13(_d(_16));
 });
 }
-_1e(_11(el.innerHTML));
+_13(_d(el.innerHTML));
 }
 if(el.style){
-_11(el.style.cssText);
+_d(el.style.cssText);
 }
 if(el.href){
-_17(el.href);
+_f(el.href);
 }
 if(el.src){
-_17(el.src);
+_f(el.src);
 }
-var _22,i=0;
-while((_22=el.attributes[i++])){
-if(_22.name.substring(0,2)=="on"&&_22.value!="null"&&_22.value!=""){
+var _17,i=0;
+while((_17=el.attributes[i++])){
+if(_17.name.substring(0,2)=="on"&&_17.value!="null"&&_17.value!=""){
 throw new Error("event handlers not allowed in the HTML, they must be set with element.addEventListener");
 }
 }
-var _24=el.childNodes;
-for(var i=0,l=_24.length;i<l;i++){
-_19(_24[i]);
+var _18=el.childNodes;
+for(var i=0,l=_18.length;i<l;i++){
+_10(_18[i]);
 }
 }
 };
-function _26(_27){
+function _19(_1a){
 var div=document.createElement("div");
-if(_27.match(/<object/i)){
+if(_1a.match(/<object/i)){
 throw new Error("The object tag is not allowed");
 }
-div.innerHTML=_27;
-_19(div);
+div.innerHTML=_1a;
+_10(div);
 return div;
 };
 var doc=_1.ownerDocument;
 var _a={getElementById:function(id){
 return _2(doc.getElementById(id));
-},createElement:function(_2b){
-return _5(doc.createElement(_2b));
-},createTextNode:function(_2c){
-return _5(doc.createTextNode(_2c));
+},createElement:function(_1b){
+return _5(doc.createElement(_1b));
+},createTextNode:function(_1c){
+return _5(doc.createTextNode(_1c));
 },write:function(str){
-var div=_26(str);
+var div=_19(str);
 while(div.childNodes.length){
 _1.appendChild(div.childNodes[0]);
 }
 }};
 _a.open=_a.close=function(){
 };
-var _2f={innerHTML:function(_30,_31){
-
-_30.innerHTML=_26(_31).innerHTML;
+var _1d={innerHTML:function(_1e,_1f){
+_1e.innerHTML=_19(_1f).innerHTML;
 }};
-_2f.outerHTML=function(_32,_33){
+_1d.outerHTML=function(_20,_21){
 throw new Error("Can not set this property");
 };
-function _34(_35,_36){
-return function(_37,_38){
-_19(_38[_36]);
-return _37[_35](_38[0]);
+function _22(_23,_24){
+return function(_25,_26){
+_10(_26[_24]);
+return _25[_23](_26[0]);
 };
 };
-var _39={appendChild:_34("appendChild",0),insertBefore:_34("insertBefore",0),replaceChild:_34("replaceChild",1),cloneNode:function(_3a,_3b){
-return _3a.cloneNode(_3b[0]);
-},addEventListener:function(_3c,_3d){
-dojo.connect(_3c,"on"+_3d[0],this,function(_3e){
-_3e=_8(_3e||window.event);
-_3d[1].call(this,_3e);
+var _27={appendChild:_22("appendChild",0),insertBefore:_22("insertBefore",0),replaceChild:_22("replaceChild",1),cloneNode:function(_28,_29){
+return _28.cloneNode(_29[0]);
+},addEventListener:function(_2a,_2b){
+dojo.connect(_2a,"on"+_2b[0],this,function(_2c){
+_2c=_8(_2c||window.event);
+_2b[1].call(this,_2c);
 });
 }};
-_39.childNodes=_39.style=_39.ownerDocument=function(){
+_27.childNodes=_27.style=_27.ownerDocument=function(){
 };
-function _3f(_40){
-return dojox.lang.makeObservable(function(_41,_42){
-var _43;
-return _41[_42];
-},_40,function(_44,_45,_46,_47){
-for(var i=0;i<_47.length;i++){
-_47[i]=unwrap(_47[i]);
+function _2d(_2e){
+return dojox.lang.makeObservable(function(_2f,_30){
+var _31;
+return _2f[_30];
+},_2e,function(_32,_33,_34,_35){
+for(var i=0;i<_35.length;i++){
+_35[i]=unwrap(_35[i]);
 }
-if(_39[_46]){
-return _5(_39[_46].call(_44,_45,_47));
+if(_27[_34]){
+return _5(_27[_34].call(_32,_33,_35));
 }
-return _5(_45[_46].apply(_45,_47));
-},_39);
+return _5(_33[_34].apply(_33,_35));
+},_27);
 };
-var _8=_3f(function(_49,_4a,_4b){
-if(_2f[_4a]){
-_2f[_4a](_49,_4b);
+var _8=_2d(function(_36,_37,_38){
+if(_1d[_37]){
+_1d[_37](_36,_38);
 }
-_49[_4a]=_4b;
+_36[_37]=_38;
 });
-var _4c={behavior:1,MozBinding:1};
-var _9=_3f(function(_4d,_4e,_4f){
-if(!_4c[_4e]){
-_4d[_4e]=_11(_4f);
+var _39={behavior:1,MozBinding:1};
+var _9=_2d(function(_3a,_3b,_3c){
+if(!_39[_3b]){
+_3a[_3b]=_d(_3c);
 }
 });
-_5.safeHTML=_26;
-_5.safeCSS=_11;
+_5.safeHTML=_19;
+_5.safeCSS=_d;
 return _5;
 };
-dojox.secure.unwrap=function unwrap(_50){
-return (_50&&_50.data__)||_50;
+dojox.secure.unwrap=function unwrap(_3d){
+return (_3d&&_3d.data__)||_3d;
 };
 }
diff --git a/dojox/secure/capability.js b/dojox/secure/capability.js
index 2ec3785..38fe225 100644
--- a/dojox/secure/capability.js
+++ b/dojox/secure/capability.js
@@ -14,8 +14,8 @@ var _4=this.keywords;
 for(var i=0;i<_4.length;i++){
 _3[_4[i]]=true;
 }
-var _6="|this| keyword in object literal without a Class call";
-var _7=[];
+var _5="|this| keyword in object literal without a Class call";
+var _6=[];
 if(_1.match(/[\u200c-\u200f\u202a-\u202e\u206a-\u206f\uff00-\uffff]/)){
 throw new Error("Illegal unicode characters detected");
 }
@@ -24,76 +24,76 @@ throw new Error("Conditional compilation token is not allowed");
 }
 _1=_1.replace(/\\["'\\\/bfnrtu]/g,"@").replace(/\/\/.*|\/\*[\w\W]*?\*\/|\/(\\[\/\\]|[^*\/])(\\.|[^\/\n\\])*\/[gim]*|("[^"]*")|('[^']*')/g,function(t){
 return t.match(/^\/\/|^\/\*/)?" ":"0";
-}).replace(/\.\s*([a-z\$_A-Z][\w\$_]*)|([;,{])\s*([a-z\$_A-Z][\w\$_]*\s*):/g,function(t,_a,_b,_c){
-_a=_a||_c;
-if(/^__|^(apply|call|callee|caller|constructor|eval|prototype|this|unwatch|valueOf|watch)$|__$/.test(_a)){
-throw new Error("Illegal property name "+_a);
+}).replace(/\.\s*([a-z\$_A-Z][\w\$_]*)|([;,{])\s*([a-z\$_A-Z][\w\$_]*\s*):/g,function(t,_7,_8,_9){
+_7=_7||_9;
+if(/^__|^(apply|call|callee|caller|constructor|eval|prototype|this|unwatch|valueOf|watch)$|__$/.test(_7)){
+throw new Error("Illegal property name "+_7);
 }
-return (_b&&(_b+"0:"))||"~";
+return (_8&&(_8+"0:"))||"~";
 });
-_1.replace(/([^\[][\]\}]\s*=)|((\Wreturn|\S)\s*\[\s*\+?)|([^=!][=!]=[^=])/g,function(_d){
-if(!_d.match(/((\Wreturn|[=\&\|\:\?\,])\s*\[)|\[\s*\+$/)){
-throw new Error("Illegal operator "+_d.substring(1));
+_1.replace(/([^\[][\]\}]\s*=)|((\Wreturn|\S)\s*\[\s*\+?)|([^=!][=!]=[^=])/g,function(_a){
+if(!_a.match(/((\Wreturn|[=\&\|\:\?\,])\s*\[)|\[\s*\+$/)){
+throw new Error("Illegal operator "+_a.substring(1));
 }
 });
-_1=_1.replace(new RegExp("("+_2.join("|")+")[\\s~]*\\(","g"),function(_e){
+_1=_1.replace(new RegExp("("+_2.join("|")+")[\\s~]*\\(","g"),function(_b){
 return "new(";
 });
-function _f(_10,_11){
-var _12={};
-_10.replace(/#\d/g,function(b){
-var _14=_7[b.substring(1)];
-for(var i in _14){
-if(i==_6){
+function _c(_d,_e){
+var _f={};
+_d.replace(/#\d+/g,function(b){
+var _10=_6[b.substring(1)];
+for(var i in _10){
+if(i==_5){
 throw i;
 }
-if(i=="this"&&_14[":method"]&&_14["this"]==1){
-i=_6;
+if(i=="this"&&_10[":method"]&&_10["this"]==1){
+i=_5;
 }
 if(i!=":method"){
-_12[i]=2;
+_f[i]=2;
 }
 }
 });
-_10.replace(/(\W|^)([a-z_\$A-Z][\w_\$]*)/g,function(t,a,_18){
-if(_18.charAt(0)=="_"){
+_d.replace(/(\W|^)([a-z_\$A-Z][\w_\$]*)/g,function(t,a,_11){
+if(_11.charAt(0)=="_"){
 throw new Error("Names may not start with _");
 }
-_12[_18]=1;
+_f[_11]=1;
 });
-return _12;
+return _f;
 };
-var _19,_1a;
-function _1b(t,_1d,a,b,_20,_21){
-_21.replace(/(^|,)0:\s*function#(\d)/g,function(t,a,b){
-var _25=_7[b];
-_25[":method"]=1;
+var _12,_13;
+function _14(t,_15,a,b,_16,_17){
+_17.replace(/(^|,)0:\s*function#(\d+)/g,function(t,a,b){
+var _18=_6[b];
+_18[":method"]=1;
 });
-_21=_21.replace(/(^|[^_\w\$])Class\s*\(\s*([_\w\$]+\s*,\s*)*#(\d)/g,function(t,p,a,b){
-var _2a=_7[b];
-delete _2a[_6];
+_17=_17.replace(/(^|[^_\w\$])Class\s*\(\s*([_\w\$]+\s*,\s*)*#(\d+)/g,function(t,p,a,b){
+var _19=_6[b];
+delete _19[_5];
 return (p||"")+(a||"")+"#"+b;
 });
-_1a=_f(_21,_1d);
-function _2b(t,a,b,_2f){
-_2f.replace(/,?([a-z\$A-Z][_\w\$]*)/g,function(t,_31){
-if(_31=="Class"){
+_13=_c(_17,_15);
+function _1a(t,a,b,_1b){
+_1b.replace(/,?([a-z\$A-Z][_\w\$]*)/g,function(t,_1c){
+if(_1c=="Class"){
 throw new Error("Class is reserved");
 }
-delete _1a[_31];
+delete _13[_1c];
 });
 };
-if(_1d){
-_2b(t,a,a,_20);
+if(_15){
+_1a(t,a,a,_16);
 }
-_21.replace(/(\W|^)(var) ([ \t,_\w\$]+)/g,_2b);
-return (a||"")+(b||"")+"#"+(_7.push(_1a)-1);
+_17.replace(/(\W|^)(var) ([ \t,_\w\$]+)/g,_1a);
+return (a||"")+(b||"")+"#"+(_6.push(_13)-1);
 };
 do{
-_19=_1.replace(/((function|catch)(\s+[_\w\$]+)?\s*\(([^\)]*)\)\s*)?{([^{}]*)}/g,_1b);
-}while(_19!=_1&&(_1=_19));
-_1b(0,0,0,0,0,_1);
-for(i in _1a){
+_12=_1.replace(/((function|catch)(\s+[_\w\$]+)?\s*\(([^\)]*)\)\s*)?{([^{}]*)}/g,_14);
+}while(_12!=_1&&(_1=_12));
+_14(0,0,0,0,0,_1);
+for(i in _13){
 if(!(i in _3)){
 throw new Error("Illegal reference to "+i);
 }
diff --git a/dojox/secure/sandbox.js b/dojox/secure/sandbox.js
index 1aecaf7..d923f68 100644
--- a/dojox/secure/sandbox.js
+++ b/dojox/secure/sandbox.js
@@ -53,26 +53,26 @@ _d.push(i);
 _c.push("var "+i+"=dojo."+i);
 }
 eval(_c.join(";"));
-function _f(obj,_11){
-_11=""+_11;
-if(dojox.secure.badProps.test(_11)){
+function _e(_f,_10){
+_10=""+_10;
+if(dojox.secure.badProps.test(_10)){
 throw new Error("bad property access");
 }
-if(obj.__get__){
-return obj.__get__(_11);
+if(_f.__get__){
+return _f.__get__(_10);
 }
-return obj[_11];
+return _f[_10];
 };
-function set(obj,_14,_15){
-_14=""+_14;
-_f(obj,_14);
+function set(obj,_11,_12){
+_11=""+_11;
+_e(obj,_11);
 if(obj.__set){
-return obj.__set(_14);
+return obj.__set(_11);
 }
-obj[_14]=_15;
-return _15;
+obj[_11]=_12;
+return _12;
 };
-function _16(obj,fun){
+function _13(obj,fun){
 if(typeof fun!="function"){
 throw new TypeError();
 }
@@ -94,138 +94,138 @@ fun.call(obj,obj[i],i,obj);
 }
 }else{
 for(i in obj){
-fun.call(obj,_f(obj,i),i,obj);
+fun.call(obj,_e(obj,i),i,obj);
 }
 }
 };
-function _1b(_1c,_1d,_1e){
-var _1f,_20,_21;
+function _14(_15,_16,_17){
+var _18,_19,_1a;
 var arg;
 for(var i=0,l=arguments.length;typeof (arg=arguments[i])=="function"&&i<l;i++){
-if(_1f){
-_a(_1f,arg.prototype);
+if(_18){
+_a(_18,arg.prototype);
 }else{
-_20=arg;
+_19=arg;
 var F=function(){
 };
 F.prototype=arg.prototype;
-_1f=new F;
+_18=new F;
 }
 }
 if(arg){
 for(var j in arg){
-var _27=arg[j];
-if(typeof _27=="function"){
+var _1b=arg[j];
+if(typeof _1b=="function"){
 arg[j]=function(){
-if(this instanceof _1b){
+if(this instanceof _14){
 return arguments.callee.__rawMethod__.apply(this,arguments);
 }
 throw new Error("Method called on wrong object");
 };
-arg[j].__rawMethod__=_27;
+arg[j].__rawMethod__=_1b;
 }
 }
 if(arg.hasOwnProperty("constructor")){
-_21=arg.constructor;
+_1a=arg.constructor;
 }
 }
-_1f=_1f?_a(_1f,arg):arg;
-function _1b(){
-if(_20){
-_20.apply(this,arguments);
+_18=_18?_a(_18,arg):arg;
+function _14(){
+if(_19){
+_19.apply(this,arguments);
 }
-if(_21){
-_21.apply(this,arguments);
+if(_1a){
+_1a.apply(this,arguments);
 }
 };
-_a(_1b,arguments[i]);
-_1f.constructor=_1b;
-_1b.prototype=_1f;
-return _1b;
+_a(_14,arguments[i]);
+_18.constructor=_14;
+_14.prototype=_18;
+return _14;
 };
-function _28(_29){
-if(typeof _29!="function"){
+function _1c(_1d){
+if(typeof _1d!="function"){
 throw new Error("String is not allowed in setTimeout/setInterval");
 }
 };
-function _2a(_2b,_2c){
-_28(_2b);
-return _1(_2b,_2c);
+function _1e(_1f,_20){
+_1c(_1f);
+return _1(_1f,_20);
 };
-function _2d(_2e,_2f){
-_28(_2e);
-return _2(_2e,_2f);
+function _21(_22,_23){
+_1c(_22);
+return _2(_22,_23);
 };
-function _30(_31){
-return _8.evaluate(_31);
+function _24(_25){
+return _8.evaluate(_25);
 };
-var _32=_8.load=function(url){
+var _26=_8.load=function(url){
 if(url.match(/^[\w\s]*:/)){
 throw new Error("Access denied to cross-site requests");
 }
 return _6({url:(new _b._Url(_8.rootUrl,url))+"",secure:true});
 };
-_8.evaluate=function(_34){
-dojox.secure.capability.validate(_34,_d,{document:1,element:1});
-if(_34.match(/^\s*[\[\{]/)){
-var _35=eval("("+_34+")");
+_8.evaluate=function(_27){
+dojox.secure.capability.validate(_27,_d,{document:1,element:1});
+if(_27.match(/^\s*[\[\{]/)){
+var _28=eval("("+_27+")");
 }else{
-eval(_34);
+eval(_27);
 }
 };
 return {loadJS:function(url){
 _8.rootUrl=url;
-return _6({url:url,secure:true}).addCallback(function(_37){
-_30(_37,_7);
+return _6({url:url,secure:true}).addCallback(function(_29){
+_24(_29,_7);
 });
 },loadHTML:function(url){
 _8.rootUrl=url;
-return _6({url:url,secure:true}).addCallback(function(_39){
-_7.innerHTML=_39;
+return _6({url:url,secure:true}).addCallback(function(_2a){
+_7.innerHTML=_2a;
 });
-},evaluate:function(_3a){
-return _8.evaluate(_3a);
+},evaluate:function(_2b){
+return _8.evaluate(_2b);
 }};
 };
 })();
-dojox.secure._safeDojoFunctions=function(_3b,_3c){
-var _3d=["mixin","require","isString","isArray","isFunction","isObject","isArrayLike","isAlien","hitch","delegate","partial","trim","disconnect","subscribe","unsubscribe","Deferred","toJson","style","attr"];
-var doc=_3b.ownerDocument;
-var _3f=dojox.secure.unwrap;
-dojo.NodeList.prototype.addContent.safetyCheck=function(_40){
-_3c.safeHTML(_40);
-};
-dojo.NodeList.prototype.style.safetyCheck=function(_41,_42){
-if(_41=="behavior"){
+dojox.secure._safeDojoFunctions=function(_2c,_2d){
+var _2e=["mixin","require","isString","isArray","isFunction","isObject","isArrayLike","isAlien","hitch","delegate","partial","trim","disconnect","subscribe","unsubscribe","Deferred","toJson","style","attr"];
+var doc=_2c.ownerDocument;
+var _2f=dojox.secure.unwrap;
+dojo.NodeList.prototype.addContent.safetyCheck=function(_30){
+_2d.safeHTML(_30);
+};
+dojo.NodeList.prototype.style.safetyCheck=function(_31,_32){
+if(_31=="behavior"){
 throw new Error("Can not set behavior");
 }
-_3c.safeCSS(_42);
+_2d.safeCSS(_32);
 };
-dojo.NodeList.prototype.attr.safetyCheck=function(_43,_44){
-if(_44&&(_43=="src"||_43=="href"||_43=="style")){
-throw new Error("Illegal to set "+_43);
+dojo.NodeList.prototype.attr.safetyCheck=function(_33,_34){
+if(_34&&(_33=="src"||_33=="href"||_33=="style")){
+throw new Error("Illegal to set "+_33);
 }
 };
-var _45={query:function(_46,_47){
-return _3c(dojo.query(_46,_3f(_47||_3b)));
-},connect:function(el,_49){
+var _35={query:function(_36,_37){
+return _2d(dojo.query(_36,_2f(_37||_2c)));
+},connect:function(el,_38){
 var obj=el;
-arguments[0]=_3f(el);
-if(obj!=arguments[0]&&_49.substring(0,2)!="on"){
+arguments[0]=_2f(el);
+if(obj!=arguments[0]&&_38.substring(0,2)!="on"){
 throw new Error("Invalid event name for element");
 }
 return dojo.connect.apply(dojo,arguments);
 },body:function(){
-return _3b;
+return _2c;
 },byId:function(id){
-return _3b.ownerDocument.getElementById(id);
+return _2c.ownerDocument.getElementById(id);
 },fromJson:function(str){
 dojox.secure.capability.validate(str,[],{});
 return dojo.fromJson(str);
 }};
-for(var i=0;i<_3d.length;i++){
-_45[_3d[i]]=dojo[_3d[i]];
+for(var i=0;i<_2e.length;i++){
+_35[_2e[i]]=dojo[_2e[i]];
 }
-return _45;
+return _35;
 };
 }
diff --git a/dojox/sketch/Anchor.js b/dojox/sketch/Anchor.js
index 8ab1967..cf373ff 100644
--- a/dojox/sketch/Anchor.js
+++ b/dojox/sketch/Anchor.js
@@ -11,10 +11,10 @@ dojo.provide("dojox.sketch.Anchor");
 dojo.require("dojox.gfx");
 (function(){
 var ta=dojox.sketch;
-ta.Anchor=function(an,id,_4){
-var _5=this;
-var _6=4;
-var _7=null;
+ta.Anchor=function(an,id,_1){
+var _2=this;
+var _3=4;
+var _4=null;
 this.type=function(){
 return "Anchor";
 };
@@ -22,18 +22,18 @@ this.annotation=an;
 this.id=id;
 this._key="anchor-"+ta.Anchor.count++;
 this.shape=null;
-this.isControl=(_4!=null)?_4:true;
+this.isControl=(_1!=null)?_1:true;
 this.beginEdit=function(){
 this.annotation.beginEdit(ta.CommandTypes.Modify);
 };
 this.endEdit=function(){
 this.annotation.endEdit();
 };
-this.zoom=function(_8){
+this.zoom=function(_5){
 if(this.shape){
-var rs=Math.floor(_6/_8);
-var _a=dojox.gfx.renderer=="vml"?1:1/_8;
-this.shape.setShape({x:an[id].x-rs,y:an[id].y-rs,width:rs*2,height:rs*2}).setStroke({color:"black",width:_a});
+var rs=Math.floor(_3/_5);
+var _6=dojox.gfx.renderer=="vml"?1:1/_5;
+this.shape.setShape({x:an[id].x-rs,y:an[id].y-rs,width:rs*2,height:rs*2}).setStroke({color:"black",width:_6});
 }
 };
 this.setBinding=function(pt){
@@ -49,9 +49,9 @@ if(!an.shape){
 return;
 }
 an.figure._add(this);
-_7={x:an[id].x-_6,y:an[id].y-_6,width:_6*2,height:_6*2};
-this.shape=an.shape.createRect(_7).setFill([255,255,255,0.35]);
-this.shape.getEventSource().setAttribute("id",_5._key);
+_4={x:an[id].x-_3,y:an[id].y-_3,width:_3*2,height:_3*2};
+this.shape=an.shape.createRect(_4).setFill([255,255,255,0.35]);
+this.shape.getEventSource().setAttribute("id",_2._key);
 this.shape.getEventSource().setAttribute("shape-rendering","crispEdges");
 this.zoom(an.figure.zoomFactor);
 };
@@ -61,7 +61,7 @@ if(an.shape){
 an.shape.remove(this.shape);
 }
 this.shape=null;
-_7=null;
+_4=null;
 };
 };
 ta.Anchor.count=0;
diff --git a/dojox/sketch/Annotation.js b/dojox/sketch/Annotation.js
index cc4c2c0..c5b24f8 100644
--- a/dojox/sketch/Annotation.js
+++ b/dojox/sketch/Annotation.js
@@ -14,14 +14,14 @@ dojo.require("dojox.sketch._Plugin");
 var ta=dojox.sketch;
 dojo.declare("dojox.sketch.AnnotationTool",ta._Plugin,{onMouseDown:function(e){
 this._omd=true;
-},onMouseMove:function(e,_4){
+},onMouseMove:function(e,_1){
 if(!this._omd){
 return;
 }
 if(this._cshape){
-this._cshape.setShape(_4);
+this._cshape.setShape(_1);
 }else{
-this._cshape=this.figure.surface.createRect(_4).setStroke({color:"#999",width:1,style:"ShortDot"}).setFill([255,255,255,0.7]);
+this._cshape=this.figure.surface.createRect(_1).setStroke({color:"#999",width:1,style:"ShortDot"}).setFill([255,255,255,0.7]);
 this._cshape.getEventSource().setAttribute("shape-rendering","crispEdges");
 }
 },onMouseUp:function(e){
@@ -35,19 +35,19 @@ f.surface.remove(this._cshape);
 delete this._cshape;
 }
 if(!(f._startPoint.x==e.pageX&&f._startPoint.y==e.pageY)){
-var _7=10;
-if(Math.max(_7,Math.abs(f._absEnd.x-f._start.x),Math.abs(f._absEnd.y-f._start.y))>_7){
+var _2=10;
+if(Math.max(_2,Math.abs(f._absEnd.x-f._start.x),Math.abs(f._absEnd.y-f._start.y))>_2){
 this._create(f._start,f._end);
 }
 }
-},_create:function(_8,_9){
+},_create:function(_3,_4){
 var f=this.figure;
-var _=f.nextKey();
-var a=new (this.annotation)(f,_);
-a.transform={dx:_8.x/f.zoomFactor,dy:_8.y/f.zoomFactor};
-a.end={x:_9.x/f.zoomFactor,y:_9.y/f.zoomFactor};
+var _5=f.nextKey();
+var a=new (this.annotation)(f,_5);
+a.transform={dx:f._calCol(_3.x/f.zoomFactor),dy:f._calCol(_3.y/f.zoomFactor)};
+a.end={x:f._calCol(_4.x/f.zoomFactor),y:f._calCol(_4.y/f.zoomFactor)};
 if(a.control){
-a.control={x:Math.round((_9.x/2)/f.zoomFactor),y:Math.round((_9.y/2)/f.zoomFactor)};
+a.control={x:f._calCol((_4.x/2)/f.zoomFactor),y:f._calCol((_4.y/2)/f.zoomFactor)};
 }
 f.onBeforeCreateShape(a);
 a.initialize();
@@ -55,9 +55,9 @@ f.select(a);
 f.onCreateShape(a);
 f.history.add(ta.CommandTypes.Create,a);
 }});
-ta.Annotation=function(_d,id){
+ta.Annotation=function(_6,id){
 this.id=this._key=id;
-this.figure=_d;
+this.figure=_6;
 this.mode=ta.Annotation.Modes.View;
 this.shape=null;
 this.boundingBox=null;
@@ -76,24 +76,24 @@ return "";
 p.getType=function(){
 return ta.Annotation;
 };
-p.onRemove=function(_10){
+p.onRemove=function(_7){
 this.figure.history.add(ta.CommandTypes.Delete,this,this.serialize());
 };
-p.property=function(_11,_12){
+p.property=function(_8,_9){
 var r;
-_11=_11.toLowerCase();
-if(this._properties[_11]!==undefined){
-r=this._properties[_11];
+_8=_8.toLowerCase();
+if(this._properties[_8]!==undefined){
+r=this._properties[_8];
 }
 if(arguments.length>1){
-this._properties[_11]=_12;
-if(r!=_12){
-this.onPropertyChange(_11,r);
+this._properties[_8]=_9;
+if(r!=_9){
+this.onPropertyChange(_8,r);
 }
 }
 return r;
 };
-p.onPropertyChange=function(_14,_15){
+p.onPropertyChange=function(_a,_b){
 };
 p.onCreate=function(){
 this.figure.history.add(ta.CommandTypes.Create,this);
@@ -113,15 +113,15 @@ p.destroy=function(){
 };
 p.draw=function(){
 };
-p.apply=function(obj){
+p.apply=function(_c){
 };
 p.serialize=function(){
 };
 p.getBBox=function(){
 };
-p.beginEdit=function(_19){
+p.beginEdit=function(_d){
 if(!this._type){
-this._type=_19||ta.CommandTypes.Move;
+this._type=_d||ta.CommandTypes.Move;
 this._prevState=this.serialize();
 }
 };
@@ -161,11 +161,11 @@ this.transform.dx+=pt.dx;
 this.transform.dy+=pt.dy;
 this.draw();
 };
-p.getTextBox=function(_25){
+p.getTextBox=function(_e){
 var fp=this.property("font");
 var f={fontFamily:fp.family,fontSize:fp.size,fontWeight:fp.weight};
-if(_25){
-f.fontSize=Math.floor(f.fontSize/_25);
+if(_e){
+f.fontSize=Math.floor(f.fontSize/_e);
 }
 return dojox.gfx._base._getTextBox(this.property("label"),f);
 };
@@ -174,11 +174,11 @@ if(this.mode==m){
 return;
 }
 this.mode=m;
-var _29="disable";
+var _f="disable";
 if(m==ta.Annotation.Modes.Edit){
-_29="enable";
+_f="enable";
 }
-if(_29=="enable"){
+if(_f=="enable"){
 this.drawBBox();
 this.figure._add(this);
 }else{
@@ -190,7 +190,7 @@ this.boundingBox=null;
 }
 }
 for(var p in this.anchors){
-this.anchors[p][_29]();
+this.anchors[p][_f]();
 }
 };
 p.zoom=function(pct){
@@ -238,11 +238,11 @@ this.transform.dy=parseFloat(pt[1],10);
 }
 };
 ta.Annotation.Modes={View:0,Edit:1};
-ta.Annotation.register=function(_35,_36){
-var cls=ta[_35+"Annotation"];
-ta.registerTool(_35,function(p){
-dojo.mixin(p,{shape:_35,annotation:cls});
-return new (_36||ta.AnnotationTool)(p);
+ta.Annotation.register=function(_10,_11){
+var cls=ta[_10+"Annotation"];
+ta.registerTool(_10,function(p){
+dojo.mixin(p,{shape:_10,annotation:cls});
+return new (_11||ta.AnnotationTool)(p);
 });
 };
 })();
diff --git a/dojox/sketch/DoubleArrowAnnotation.js b/dojox/sketch/DoubleArrowAnnotation.js
index 38e3293..7757f33 100644
--- a/dojox/sketch/DoubleArrowAnnotation.js
+++ b/dojox/sketch/DoubleArrowAnnotation.js
@@ -12,8 +12,8 @@ dojo.require("dojox.sketch.Annotation");
 dojo.require("dojox.sketch.Anchor");
 (function(){
 var ta=dojox.sketch;
-ta.DoubleArrowAnnotation=function(_2,id){
-ta.Annotation.call(this,_2,id);
+ta.DoubleArrowAnnotation=function(_1,id){
+ta.Annotation.call(this,_1,id);
 this.transform={dx:0,dy:0};
 this.start={x:0,y:0};
 this.control={x:100,y:-50};
@@ -44,34 +44,34 @@ p.getType=function(){
 return ta.DoubleArrowAnnotation;
 };
 p._rot=function(){
-var _5=this.control.y-this.start.y;
-var _6=this.control.x-this.start.x;
-this.startRotation=Math.atan2(_5,_6);
-_5=this.end.y-this.control.y;
-_6=this.end.x-this.control.x;
-this.endRotation=Math.atan2(_5,_6);
+var _2=this.control.y-this.start.y;
+var _3=this.control.x-this.start.x;
+this.startRotation=Math.atan2(_2,_3);
+_2=this.end.y-this.control.y;
+_3=this.end.x-this.control.x;
+this.endRotation=Math.atan2(_2,_3);
 };
 p._pos=function(){
-var _7=this.textOffset;
+var _4=this.textOffset;
 if(this.control.y<this.end.y){
-_7*=-1;
+_4*=-1;
 }else{
-_7+=this.textYOffset;
+_4+=this.textYOffset;
 }
 var ab={x:((this.control.x-this.start.x)*0.5)+this.start.x,y:((this.control.y-this.start.y)*0.5)+this.start.y};
 var bc={x:((this.end.x-this.control.x)*0.5)+this.control.x,y:((this.end.y-this.control.y)*0.5)+this.control.y};
-this.textPosition={x:((bc.x-ab.x)*0.5)+ab.x,y:(((bc.y-ab.y)*0.5)+ab.y)+_7};
+this.textPosition={x:((bc.x-ab.x)*0.5)+ab.x,y:(((bc.y-ab.y)*0.5)+ab.y)+_4};
 };
-p.apply=function(_a){
-if(!_a){
+p.apply=function(_5){
+if(!_5){
 return;
 }
-if(_a.documentElement){
-_a=_a.documentElement;
+if(_5.documentElement){
+_5=_5.documentElement;
 }
-this.readCommonAttrs(_a);
-for(var i=0;i<_a.childNodes.length;i++){
-var c=_a.childNodes[i];
+this.readCommonAttrs(_5);
+for(var i=0;i<_5.childNodes.length;i++){
+var c=_5.childNodes[i];
 if(c.localName=="text"){
 this.property("label",c.childNodes.length?c.childNodes[0].nodeValue:"");
 }else{
@@ -86,38 +86,38 @@ 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);
-var _f=this.property("stroke");
-var _10=c.getAttribute("style");
-var m=_10.match(/stroke:([^;]+);/);
+var _6=this.property("stroke");
+var _7=c.getAttribute("style");
+var m=_7.match(/stroke:([^;]+);/);
 if(m){
-_f.color=m[1];
+_6.color=m[1];
 this.property("fill",m[1]);
 }
-m=_10.match(/stroke-width:([^;]+);/);
+m=_7.match(/stroke-width:([^;]+);/);
 if(m){
-_f.width=m[1];
+_6.width=m[1];
 }
-this.property("stroke",_f);
+this.property("stroke",_6);
 }
 }
 }
 };
-p.initialize=function(obj){
-var _13=(ta.Annotation.labelFont)?ta.Annotation.labelFont:{family:"Times",size:"16px"};
-this.apply(obj);
+p.initialize=function(_8){
+var _9=(ta.Annotation.labelFont)?ta.Annotation.labelFont:{family:"Times",size:"16px"};
+this.apply(_8);
 this._rot();
 this._pos();
-var rot=this.startRotation;
-var _15=dojox.gfx.matrix.rotate(rot);
-rot=this.endRotation;
-var _16=dojox.gfx.matrix.rotateAt(rot,this.end.x,this.end.y);
+var _a=this.startRotation;
+var _b=dojox.gfx.matrix.rotate(_a);
+_a=this.endRotation;
+var _c=dojox.gfx.matrix.rotateAt(_a,this.end.x,this.end.y);
 this.shape=this.figure.group.createGroup();
 this.shape.getEventSource().setAttribute("id",this.id);
 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");
 this.startArrowGroup=this.shape.createGroup().setTransform({dx:this.start.x,dy:this.start.y});
-this.startArrowGroup.applyTransform(_15);
+this.startArrowGroup.applyTransform(_b);
 this.startArrow=this.startArrowGroup.createPath();
-this.endArrowGroup=this.shape.createGroup().setTransform(_16);
+this.endArrowGroup=this.shape.createGroup().setTransform(_c);
 this.endArrow=this.endArrowGroup.createPath();
 this.labelShape=this.shape.createText({x:this.textPosition.x,y:this.textPosition.y,text:this.property("label"),align:this.textAlign}).setFill(this.property("fill"));
 this.labelShape.getEventSource().setAttribute("id",this.id+"-labelShape");
@@ -136,19 +136,19 @@ 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);
+p.draw=function(_d){
+this.apply(_d);
 this._rot();
 this._pos();
-var rot=this.startRotation;
-var _19=dojox.gfx.matrix.rotate(rot);
-rot=this.endRotation;
-var _1a=dojox.gfx.matrix.rotateAt(rot,this.end.x,this.end.y);
+var _e=this.startRotation;
+var _f=dojox.gfx.matrix.rotate(_e);
+_e=this.endRotation;
+var _10=dojox.gfx.matrix.rotateAt(_e,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");
-this.startArrowGroup.setTransform({dx:this.start.x,dy:this.start.y}).applyTransform(_19);
+this.startArrowGroup.setTransform({dx:this.start.x,dy:this.start.y}).applyTransform(_f);
 this.startArrow.setFill(this.property("fill"));
-this.endArrowGroup.setTransform(_1a);
+this.endArrowGroup.setTransform(_10);
 this.endArrow.setFill(this.property("fill"));
 this.labelShape.setShape({x:this.textPosition.x,y:this.textPosition.y,text:this.property("label")}).setFill(this.property("fill"));
 this.zoom();
diff --git a/dojox/sketch/Figure.js b/dojox/sketch/Figure.js
index 0df2c04..6f58672 100644
--- a/dojox/sketch/Figure.js
+++ b/dojox/sketch/Figure.js
@@ -14,11 +14,11 @@ dojo.require("dojox.sketch.UndoStack");
 (function(){
 var ta=dojox.sketch;
 ta.tools={};
-ta.registerTool=function(_2,fn){
-ta.tools[_2]=fn;
+ta.registerTool=function(_1,fn){
+ta.tools[_1]=fn;
 };
-ta.Figure=function(_4){
-var _5=this;
+ta.Figure=function(_2){
+var _3=this;
 this.annCounter=1;
 this.shapes=[];
 this.image=null;
@@ -30,61 +30,61 @@ this.node=null;
 this.zoomFactor=1;
 this.tools=null;
 this.obj={};
-dojo.mixin(this,_4);
+dojo.mixin(this,_2);
 this.selected=[];
 this.hasSelections=function(){
 return this.selected.length>0;
 };
-this.isSelected=function(_6){
-for(var i=0;i<_5.selected.length;i++){
-if(_5.selected[i]==_6){
+this.isSelected=function(_4){
+for(var i=0;i<_3.selected.length;i++){
+if(_3.selected[i]==_4){
 return true;
 }
 }
 return false;
 };
-this.select=function(_8){
-if(!_5.isSelected(_8)){
-_5.clearSelections();
-_5.selected=[_8];
+this.select=function(_5){
+if(!_3.isSelected(_5)){
+_3.clearSelections();
+_3.selected=[_5];
 }
-_8.setMode(ta.Annotation.Modes.View);
-_8.setMode(ta.Annotation.Modes.Edit);
+_5.setMode(ta.Annotation.Modes.View);
+_5.setMode(ta.Annotation.Modes.Edit);
 };
-this.deselect=function(_9){
-var _a=-1;
-for(var i=0;i<_5.selected.length;i++){
-if(_5.selected[i]==_9){
-_a=i;
+this.deselect=function(_6){
+var _7=-1;
+for(var i=0;i<_3.selected.length;i++){
+if(_3.selected[i]==_6){
+_7=i;
 break;
 }
 }
-if(_a>-1){
-_9.setMode(ta.Annotation.Modes.View);
-_5.selected.splice(_a,1);
+if(_7>-1){
+_6.setMode(ta.Annotation.Modes.View);
+_3.selected.splice(_7,1);
 }
-return _9;
+return _6;
 };
 this.clearSelections=function(){
-for(var i=0;i<_5.selected.length;i++){
-_5.selected[i].setMode(ta.Annotation.Modes.View);
+for(var i=0;i<_3.selected.length;i++){
+_3.selected[i].setMode(ta.Annotation.Modes.View);
 }
-_5.selected=[];
+_3.selected=[];
 };
 this.replaceSelection=function(n,o){
-if(!_5.isSelected(o)){
-_5.select(n);
+if(!_3.isSelected(o)){
+_3.select(n);
 return;
 }
-var _f=-1;
-for(var i=0;i<_5.selected.length;i++){
-if(_5.selected[i]==o){
-_f=i;
+var _8=-1;
+for(var i=0;i<_3.selected.length;i++){
+if(_3.selected[i]==o){
+_8=i;
 break;
 }
 }
-if(_f>-1){
-_5.selected.splice(_f,1,n);
+if(_8>-1){
+_3.selected.splice(_8,1,n);
 }
 };
 this._c=null;
@@ -99,86 +99,90 @@ this._end=null;
 this._absEnd=null;
 this._cshape=null;
 this._dblclick=function(e){
-var o=_5._fromEvt(e);
+var o=_3._fromEvt(e);
 if(o){
-_5.onDblClickShape(o,e);
+_3.onDblClickShape(o,e);
 }
 };
 this._keydown=function(e){
-var _14=false;
+var _9=false;
 if(e.ctrlKey){
-if(e.keyCode===90){
-_5.undo();
-_14=true;
+if(e.keyCode===90||e.keyCode===122){
+_3.undo();
+_9=true;
 }else{
-if(e.keyCode===89){
-_5.redo();
-_14=true;
+if(e.keyCode===89||e.keyCode===121){
+_3.redo();
+_9=true;
 }
 }
 }
 if(e.keyCode===46||e.keyCode===8){
-_5._delete(_5.selected);
-_14=true;
+_3._delete(_3.selected);
+_9=true;
 }
-if(_14){
+if(_9){
 dojo.stopEvent(e);
 }
 };
 this._md=function(e){
-var o=_5._fromEvt(e);
-_5._startPoint={x:e.pageX,y:e.pageY};
-_5._ctr=dojo._abs(_5.node);
-_5._ctr={x:_5._ctr.x,y:_5._ctr.y};
-var X=e.clientX-_5._ctr.x,Y=e.clientY-_5._ctr.y;
-_5._lp={x:X,y:Y};
-_5._start={x:X,y:Y};
-_5._end={x:X,y:Y};
-_5._absEnd={x:X,y:Y};
+if(dojox.gfx.renderer=="vml"){
+_3.node.focus();
+}
+var o=_3._fromEvt(e);
+_3._startPoint={x:e.pageX,y:e.pageY};
+_3._ctr=dojo.position(_3.node);
+var _a={x:_3.node.scrollLeft,y:_3.node.scrollTop};
+_3._ctr={x:_3._ctr.x-_a.x,y:_3._ctr.y-_a.y};
+var X=e.clientX-_3._ctr.x,Y=e.clientY-_3._ctr.y;
+_3._lp={x:X,y:Y};
+_3._start={x:X,y:Y};
+_3._end={x:X,y:Y};
+_3._absEnd={x:X,y:Y};
 if(!o){
-_5.clearSelections();
-_5._ctool.onMouseDown(e);
+_3.clearSelections();
+_3._ctool.onMouseDown(e);
 }else{
 if(o.type&&o.type()!="Anchor"){
-if(!_5.isSelected(o)){
-_5.select(o);
-_5._sameShapeSelected=false;
+if(!_3.isSelected(o)){
+_3.select(o);
+_3._sameShapeSelected=false;
 }else{
-_5._sameShapeSelected=true;
+_3._sameShapeSelected=true;
 }
 }
 o.beginEdit();
-_5._c=o;
+_3._c=o;
 }
 };
 this._mm=function(e){
-if(!_5._ctr){
+if(!_3._ctr){
 return;
 }
-var x=e.clientX-_5._ctr.x;
-var y=e.clientY-_5._ctr.y;
-var dx=x-_5._lp.x;
-var dy=y-_5._lp.y;
-_5._absEnd={x:x,y:y};
-if(_5._c){
-_5._c.setBinding({dx:dx/_5.zoomFactor,dy:dy/_5.zoomFactor});
-_5._lp={x:x,y:y};
+var x=e.clientX-_3._ctr.x;
+var y=e.clientY-_3._ctr.y;
+var dx=x-_3._lp.x;
+var dy=y-_3._lp.y;
+_3._absEnd={x:x,y:y};
+if(_3._c){
+_3._c.setBinding({dx:dx/_3.zoomFactor,dy:dy/_3.zoomFactor});
+_3._lp={x:x,y:y};
 }else{
-_5._end={x:dx,y:dy};
-var _1e={x:Math.min(_5._start.x,_5._absEnd.x),y:Math.min(_5._start.y,_5._absEnd.y),width:Math.abs(_5._start.x-_5._absEnd.x),height:Math.abs(_5._start.y-_5._absEnd.y)};
-if(_1e.width&&_1e.height){
-_5._ctool.onMouseMove(e,_1e);
+_3._end={x:dx,y:dy};
+var _b={x:Math.min(_3._start.x,_3._absEnd.x),y:Math.min(_3._start.y,_3._absEnd.y),width:Math.abs(_3._start.x-_3._absEnd.x),height:Math.abs(_3._start.y-_3._absEnd.y)};
+if(_b.width&&_b.height){
+_3._ctool.onMouseMove(e,_b);
 }
 }
 };
 this._mu=function(e){
-if(_5._c){
-_5._c.endEdit();
+if(_3._c){
+_3._c.endEdit();
 }else{
-_5._ctool.onMouseUp(e);
+_3._ctool.onMouseUp(e);
 }
-_5._c=_5._ctr=_5._lp=_5._action=_5._prevState=_5._startPoint=null;
-_5._cshape=_5._start=_5._end=_5._absEnd=null;
+_3._c=_3._ctr=_3._lp=_3._action=_3._prevState=_3._startPoint=null;
+_3._cshape=_3._start=_3._end=_3._absEnd=null;
 };
 this.initUndoStack();
 };
@@ -189,41 +193,45 @@ this.history=new ta.UndoStack(this);
 p.setTool=function(t){
 this._ctool=t;
 };
-p._delete=function(arr,_23){
-for(var i=0;i<arr.length;i++){
-arr[i].setMode(ta.Annotation.Modes.View);
-arr[i].destroy(_23);
-this.remove(arr[i]);
-this._remove(arr[i]);
-if(!_23){
-arr[i].onRemove();
+p.gridSize=0;
+p._calCol=function(v){
+return this.gridSize?(Math.round(v/this.gridSize)*this.gridSize):v;
+};
+p._delete=function(_c,_d){
+for(var i=0;i<_c.length;i++){
+_c[i].setMode(ta.Annotation.Modes.View);
+_c[i].destroy(_d);
+this.remove(_c[i]);
+this._remove(_c[i]);
+if(!_d){
+_c[i].onRemove();
 }
 }
-arr.splice(0,arr.length);
+_c.splice(0,_c.length);
 };
-p.onDblClickShape=function(_25,e){
-if(_25["onDblClick"]){
-_25.onDblClick(e);
+p.onDblClickShape=function(_e,e){
+if(_e["onDblClick"]){
+_e.onDblClick(e);
 }
 };
-p.onCreateShape=function(_27){
+p.onCreateShape=function(_f){
 };
-p.onBeforeCreateShape=function(_28){
+p.onBeforeCreateShape=function(_10){
 };
-p.initialize=function(_29){
-this.node=_29;
-this.surface=dojox.gfx.createSurface(_29,this.size.w,this.size.h);
+p.initialize=function(_11){
+this.node=_11;
+this.surface=dojox.gfx.createSurface(_11,this.size.w,this.size.h);
 this.group=this.surface.createGroup();
 this._cons=[];
 var es=this.surface.getEventSource();
-this._cons.push(dojo.connect(es,"ondraggesture",dojo.stopEvent),dojo.connect(es,"ondragenter",dojo.stopEvent),dojo.connect(es,"ondragover",dojo.stopEvent),dojo.connect(es,"ondragexit",dojo.stopEvent),dojo.connect(es,"ondragstart",dojo.stopEvent),dojo.connect(es,"onselectstart",dojo.stopEvent),dojo.connect(es,"onmousedown",this._md),dojo.connect(es,"onmousemove",this._mm),dojo.connect(es,"onmouseup",this._mu),dojo.connect(es,"onclick",this,"onClick"),dojo.connect(es,"ondblclick",this._dbl [...]
-this.image=this.group.createImage({width:this.size.w,height:this.size.h,src:this.imageSrc});
+this._cons.push(dojo.connect(es,"ondraggesture",dojo.stopEvent),dojo.connect(es,"ondragenter",dojo.stopEvent),dojo.connect(es,"ondragover",dojo.stopEvent),dojo.connect(es,"ondragexit",dojo.stopEvent),dojo.connect(es,"ondragstart",dojo.stopEvent),dojo.connect(es,"onselectstart",dojo.stopEvent),dojo.connect(es,"onmousedown",this._md),dojo.connect(es,"onmousemove",this._mm),dojo.connect(es,"onmouseup",this._mu),dojo.connect(es,"onclick",this,"onClick"),dojo.connect(es,"ondblclick",this._dbl [...]
+this.image=this.group.createImage({width:this.imageSize.w,height:this.imageSize.h,src:this.imageSrc});
 };
-p.destroy=function(_2b){
+p.destroy=function(_12){
 if(!this.node){
 return;
 }
-if(!_2b){
+if(!_12){
 if(this.history){
 this.history.destroy();
 }
@@ -255,8 +263,8 @@ this.shapes[i].zoom(this.zoomFactor);
 }
 };
 p.getFit=function(){
-var wF=(this.node.parentNode.clientWidth-5)/this.size.w;
-var hF=(this.node.parentNode.clientHeight-5)/this.size.h;
+var wF=(this.node.parentNode.offsetWidth-5)/this.size.w;
+var hF=(this.node.parentNode.offsetHeight-5)/this.size.h;
 return Math.min(wF,hF)*100;
 };
 p.unzoom=function(){
@@ -286,8 +294,8 @@ p._keyFromEvt=function(e){
 var key=e.target.id+"";
 if(key.length==0){
 var p=e.target.parentNode;
-var _38=this.surface.getEventSource();
-while(p&&p.id.length==0&&p!=_38){
+var _13=this.surface.getEventSource();
+while(p&&p.id.length==0&&p!=_13){
 p=p.parentNode;
 }
 key=p.id;
@@ -297,19 +305,19 @@ return key;
 p._fromEvt=function(e){
 return this._get(this._keyFromEvt(e));
 };
-p.add=function(_3a){
+p.add=function(_14){
 for(var i=0;i<this.shapes.length;i++){
-if(this.shapes[i]==_3a){
+if(this.shapes[i]==_14){
 return true;
 }
 }
-this.shapes.push(_3a);
+this.shapes.push(_14);
 return true;
 };
-p.remove=function(_3c){
+p.remove=function(_15){
 var idx=-1;
 for(var i=0;i<this.shapes.length;i++){
-if(this.shapes[i]==_3c){
+if(this.shapes[i]==_15){
 idx=i;
 break;
 }
@@ -317,7 +325,7 @@ break;
 if(idx>-1){
 this.shapes.splice(idx,1);
 }
-return _3c;
+return _15;
 };
 p.get=function(id){
 for(var i=0;i<this.shapes.length;i++){
@@ -328,77 +336,77 @@ return this.shapes[i];
 return null;
 };
 p.convert=function(ann,t){
-var _43=t+"Annotation";
-if(!ta[_43]){
+var _16=t+"Annotation";
+if(!ta[_16]){
 return;
 }
-var _44=ann.type(),id=ann.id,_46=ann.label,_47=ann.mode,_48=ann.tokenId;
-var _49,end,_4b,_4c;
-switch(_44){
+var _17=ann.type(),id=ann.id,_18=ann.label,_19=ann.mode,_1a=ann.tokenId;
+var _1b,end,_1c,_1d;
+switch(_17){
 case "Preexisting":
 case "Lead":
-_4c={dx:ann.transform.dx,dy:ann.transform.dy};
-_49={x:ann.start.x,y:ann.start.y};
+_1d={dx:ann.transform.dx,dy:ann.transform.dy};
+_1b={x:ann.start.x,y:ann.start.y};
 end={x:ann.end.x,y:ann.end.y};
-var cx=end.x-((end.x-_49.x)/2);
-var cy=end.y-((end.y-_49.y)/2);
-_4b={x:cx,y:cy};
+var cx=end.x-((end.x-_1b.x)/2);
+var cy=end.y-((end.y-_1b.y)/2);
+_1c={x:cx,y:cy};
 break;
 case "SingleArrow":
 case "DoubleArrow":
-_4c={dx:ann.transform.dx,dy:ann.transform.dy};
-_49={x:ann.start.x,y:ann.start.y};
+_1d={dx:ann.transform.dx,dy:ann.transform.dy};
+_1b={x:ann.start.x,y:ann.start.y};
 end={x:ann.end.x,y:ann.end.y};
-_4b={x:ann.control.x,y:ann.control.y};
+_1c={x:ann.control.x,y:ann.control.y};
 break;
 case "Underline":
-_4c={dx:ann.transform.dx,dy:ann.transform.dy};
-_49={x:ann.start.x,y:ann.start.y};
-_4b={x:_49.x+50,y:_49.y+50};
-end={x:_49.x+100,y:_49.y+100};
+_1d={dx:ann.transform.dx,dy:ann.transform.dy};
+_1b={x:ann.start.x,y:ann.start.y};
+_1c={x:_1b.x+50,y:_1b.y+50};
+end={x:_1b.x+100,y:_1b.y+100};
 break;
 case "Brace":
 }
-var n=new ta[_43](this,id);
+var n=new ta[_16](this,id);
 if(n.type()=="Underline"){
-n.transform={dx:_4c.dx+_49.x,dy:_4c.dy+_49.y};
+n.transform={dx:_1d.dx+_1b.x,dy:_1d.dy+_1b.y};
 }else{
 if(n.transform){
-n.transform=_4c;
+n.transform=_1d;
 }
 if(n.start){
-n.start=_49;
+n.start=_1b;
 }
 }
 if(n.end){
 n.end=end;
 }
 if(n.control){
-n.control=_4b;
+n.control=_1c;
 }
-n.label=_46;
+n.label=_18;
 n.token=dojo.lang.shallowCopy(ann.token);
 n.initialize();
 this.replaceSelection(n,ann);
 this._remove(ann);
 this.remove(ann);
 ann.destroy();
-n.setMode(_47);
+n.setMode(_19);
 };
-p.setValue=function(_50){
-var obj=dojox.xml.DomParser.parse(_50);
-var _52=this.node;
-this.load(obj,_52);
-this.zoom(this.zoomFactor*100);
+p.setValue=function(_1e){
+var obj=dojox.xml.DomParser.parse(_1e);
+var _1f=this.node;
+this.load(obj,_1f);
 };
 p.load=function(obj,n){
 if(this.surface){
 this.destroy(true);
 }
-var _55=obj.documentElement;
-this.size={w:parseFloat(_55.getAttribute("width"),10),h:parseFloat(_55.getAttribute("height"),10)};
-var g=_55.childrenByName("g")[0];
+var _20=obj.documentElement;
+this.size={w:parseFloat(_20.getAttribute("width"),10),h:parseFloat(_20.getAttribute("height"),10)};
+var g=_20.childrenByName("g")[0];
 var img=g.childrenByName("image")[0];
+this.imageSize={w:parseFloat(img.getAttribute("width"),10),h:parseFloat(img.getAttribute("height"),10)};
 this.imageSrc=img.getAttribute("xlink:href");
 this.initialize(n);
 var ann=g.childrenByName("g");
@@ -416,9 +424,9 @@ p.onLoad=function(){
 p.onClick=function(){
 };
 p._loadAnnotation=function(obj){
-var _5b=obj.getAttribute("dojoxsketch:type")+"Annotation";
-if(ta[_5b]){
-var a=new ta[_5b](this,obj.id);
+var _21=obj.getAttribute("dojoxsketch:type")+"Annotation";
+if(ta[_21]){
+var a=new ta[_21](this,obj.id);
 a.initialize(obj);
 this.nextKey();
 a.setMode(ta.Annotation.Modes.View);
diff --git a/dojox/sketch/LeadAnnotation.js b/dojox/sketch/LeadAnnotation.js
index 324c458..791a278 100644
--- a/dojox/sketch/LeadAnnotation.js
+++ b/dojox/sketch/LeadAnnotation.js
@@ -12,15 +12,14 @@ dojo.require("dojox.sketch.Annotation");
 dojo.require("dojox.sketch.Anchor");
 (function(){
 var ta=dojox.sketch;
-ta.LeadAnnotation=function(_2,id){
-ta.Annotation.call(this,_2,id);
+ta.LeadAnnotation=function(_1,id){
+ta.Annotation.call(this,_1,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.pathShape=null;
 this.labelShape=null;
@@ -38,46 +37,47 @@ p.getType=function(){
 return ta.LeadAnnotation;
 };
 p._pos=function(){
-var _5=this.textOffset,x=0,y=0;
-var _8=this.calculate.slope(this.control,this.end);
-if(Math.abs(_8)>=1){
-x=this.end.x+this.calculate.dx(this.control,this.end,_5);
+var _2=this.textOffset,x=0,y=0;
+var _3=this.calculate.slope(this.control,this.end);
+this.textAlign="middle";
+if(Math.abs(_3)>=1){
+x=this.end.x+this.calculate.dx(this.control,this.end,_2);
 if(this.control.y>this.end.y){
-y=this.end.y-_5;
+y=this.end.y-_2;
 }else{
-y=this.end.y+_5+this.textYOffset;
+y=this.end.y+_2+this.textYOffset;
 }
 }else{
-if(_8==0){
-x=this.end.x+_5;
+if(_3==0){
+x=this.end.x+_2;
 y=this.end.y+this.textYOffset;
 }else{
 if(this.start.x>this.end.x){
-x=this.end.x-_5;
+x=this.end.x-_2;
 this.textAlign="end";
 }else{
-x=this.end.x+_5;
+x=this.end.x+_2;
 this.textAlign="start";
 }
 if(this.start.y<this.end.y){
-y=this.end.y+this.calculate.dy(this.control,this.end,_5)+this.textYOffset;
+y=this.end.y+this.calculate.dy(this.control,this.end,_2)+this.textYOffset;
 }else{
-y=this.end.y+this.calculate.dy(this.control,this.end,-_5);
+y=this.end.y+this.calculate.dy(this.control,this.end,-_2);
 }
 }
 }
 this.textPosition={x:x,y:y};
 };
-p.apply=function(_9){
-if(!_9){
+p.apply=function(_4){
+if(!_4){
 return;
 }
-if(_9.documentElement){
-_9=_9.documentElement;
+if(_4.documentElement){
+_4=_4.documentElement;
 }
-this.readCommonAttrs(_9);
-for(var i=0;i<_9.childNodes.length;i++){
-var c=_9.childNodes[i];
+this.readCommonAttrs(_4);
+for(var i=0;i<_4.childNodes.length;i++){
+var c=_4.childNodes[i];
 if(c.localName=="text"){
 this.property("label",c.childNodes.length?c.childNodes[0].nodeValue:"");
 }else{
@@ -92,24 +92,24 @@ 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);
-var _e=this.property("stroke");
-var _f=c.getAttribute("style");
-var m=_f.match(/stroke:([^;]+);/);
+var _5=this.property("stroke");
+var _6=c.getAttribute("style");
+var m=_6.match(/stroke:([^;]+);/);
 if(m){
-_e.color=m[1];
+_5.color=m[1];
 this.property("fill",m[1]);
 }
-m=_f.match(/stroke-width:([^;]+);/);
+m=_6.match(/stroke-width:([^;]+);/);
 if(m){
-_e.width=m[1];
+_5.width=m[1];
 }
-this.property("stroke",_e);
+this.property("stroke",_5);
 }
 }
 }
 };
-p.initialize=function(obj){
-this.apply(obj);
+p.initialize=function(_7){
+this.apply(_7);
 this._pos();
 this.shape=this.figure.group.createGroup();
 this.shape.getEventSource().setAttribute("id",this.id);
@@ -134,8 +134,8 @@ 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);
+p.draw=function(_8){
+this.apply(_8);
 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");
@@ -143,8 +143,8 @@ this.labelShape.setShape({x:this.textPosition.x,y:this.textPosition.y,text:this.
 this.zoom();
 };
 p.serialize=function(){
-var _17=this.property("stroke");
-return "<g "+this.writeCommonAttrs()+">"+"<path style=\"stroke:"+_17.color+";stroke-width:"+_17.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:"+_17.color+";text-anchor:"+this.textAlign+"\" font-weight=\"bold\" "+"x=\""+this.textPosition.x+"\" "+"y=\""+this.textPosition.y+"\">"+this.property("label")+"</text>"+"</g>";
+var _9=this.property("stroke");
+return "<g "+this.writeCommonAttrs()+">"+"<path style=\"stroke:"+_9.color+";stroke-width:"+_9.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:"+_9.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");
 })();
diff --git a/dojox/sketch/PreexistingAnnotation.js b/dojox/sketch/PreexistingAnnotation.js
index fddcf4c..8c58e30 100644
--- a/dojox/sketch/PreexistingAnnotation.js
+++ b/dojox/sketch/PreexistingAnnotation.js
@@ -12,8 +12,8 @@ dojo.require("dojox.sketch.Annotation");
 dojo.require("dojox.sketch.Anchor");
 (function(){
 var ta=dojox.sketch;
-ta.PreexistingAnnotation=function(_2,id){
-ta.Annotation.call(this,_2,id);
+ta.PreexistingAnnotation=function(_1,id){
+ta.Annotation.call(this,_1,id);
 this.transform={dx:0,dy:0};
 this.start={x:0,y:0};
 this.end={x:200,y:200};
@@ -44,16 +44,16 @@ 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(_9){
-if(!_9){
+p.apply=function(_2){
+if(!_2){
 return;
 }
-if(_9.documentElement){
-_9=_9.documentElement;
+if(_2.documentElement){
+_2=_2.documentElement;
 }
-this.readCommonAttrs(_9);
-for(var i=0;i<_9.childNodes.length;i++){
-var c=_9.childNodes[i];
+this.readCommonAttrs(_2);
+for(var i=0;i<_2.childNodes.length;i++){
+var c=_2.childNodes[i];
 if(c.localName=="text"){
 this.property("label",c.childNodes.length?c.childNodes[0].nodeValue:"");
 }else{
@@ -73,24 +73,24 @@ this.end.y=parseFloat(c.getAttribute("height"),10)+parseFloat(c.getAttribute("y"
 if(c.getAttribute("r")!==null){
 this.radius=parseFloat(c.getAttribute("r"),10);
 }
-var _c=this.property("stroke");
-var _d=c.getAttribute("style");
-var m=_d.match(/stroke:([^;]+);/);
+var _3=this.property("stroke");
+var _4=c.getAttribute("style");
+var m=_4.match(/stroke:([^;]+);/);
 if(m){
-_c.color=m[1];
+_3.color=m[1];
 this.property("fill",m[1]);
 }
-m=_d.match(/stroke-width:([^;]+);/);
+m=_4.match(/stroke-width:([^;]+);/);
 if(m){
-_c.width=m[1];
+_3.width=m[1];
 }
-this.property("stroke",_c);
+this.property("stroke",_3);
 }
 }
 }
 };
-p.initialize=function(_f){
-this.apply(_f);
+p.initialize=function(_5){
+this.apply(_5);
 this._pos();
 this.shape=this.figure.group.createGroup();
 this.shape.getEventSource().setAttribute("id",this.id);
@@ -116,20 +116,20 @@ 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);
+p.draw=function(_6){
+this.apply(_6);
 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}).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"));
 this.zoom();
 };
-p.zoom=function(pct){
+p.zoom=function(_7){
 if(this.rectShape){
-pct=pct||this.figure.zoomFactor;
-ta.Annotation.prototype.zoom.call(this,pct);
-pct=dojox.gfx.renderer=="vml"?1:pct;
-this.rectShape.setStroke({color:this.property("fill"),width:1/pct});
+_7=_7||this.figure.zoomFactor;
+ta.Annotation.prototype.zoom.call(this,_7);
+_7=dojox.gfx.renderer=="vml"?1:_7;
+this.rectShape.setStroke({color:this.property("fill"),width:1/_7});
 }
 };
 p.serialize=function(){
diff --git a/dojox/sketch/SingleArrowAnnotation.js b/dojox/sketch/SingleArrowAnnotation.js
index 4b7114e..6083e25 100644
--- a/dojox/sketch/SingleArrowAnnotation.js
+++ b/dojox/sketch/SingleArrowAnnotation.js
@@ -12,15 +12,14 @@ dojo.require("dojox.sketch.Annotation");
 dojo.require("dojox.sketch.Anchor");
 (function(){
 var ta=dojox.sketch;
-ta.SingleArrowAnnotation=function(_2,id){
-ta.Annotation.call(this,_2,id);
+ta.SingleArrowAnnotation=function(_1,id){
+ta.Annotation.call(this,_1,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.pathShape=null;
@@ -41,51 +40,52 @@ p.getType=function(){
 return ta.SingleArrowAnnotation;
 };
 p._rot=function(){
-var _5=this.control.y-this.start.y;
-var _6=this.control.x-this.start.x;
-this.rotation=Math.atan2(_5,_6);
+var _2=this.control.y-this.start.y;
+var _3=this.control.x-this.start.x;
+this.rotation=Math.atan2(_2,_3);
 };
 p._pos=function(){
-var _7=this.textOffset,x=0,y=0;
-var _a=this.calculate.slope(this.control,this.end);
-if(Math.abs(_a)>=1){
-x=this.end.x+this.calculate.dx(this.control,this.end,_7);
+var _4=this.textOffset,x=0,y=0;
+var _5=this.calculate.slope(this.control,this.end);
+this.textAlign="middle";
+if(Math.abs(_5)>=1){
+x=this.end.x+this.calculate.dx(this.control,this.end,_4);
 if(this.control.y>this.end.y){
-y=this.end.y-_7;
+y=this.end.y-_4;
 }else{
-y=this.end.y+_7+this.textYOffset;
+y=this.end.y+_4+this.textYOffset;
 }
 }else{
-if(_a==0){
-x=this.end.x+_7;
+if(_5==0){
+x=this.end.x+_4;
 y=this.end.y+this.textYOffset;
 }else{
 if(this.start.x>this.end.x){
-x=this.end.x-_7;
+x=this.end.x-_4;
 this.textAlign="end";
 }else{
-x=this.end.x+_7;
+x=this.end.x+_4;
 this.textAlign="start";
 }
 if(this.start.y<this.end.y){
-y=this.end.y+this.calculate.dy(this.control,this.end,_7)+this.textYOffset;
+y=this.end.y+this.calculate.dy(this.control,this.end,_4)+this.textYOffset;
 }else{
-y=this.end.y+this.calculate.dy(this.control,this.end,-_7);
+y=this.end.y+this.calculate.dy(this.control,this.end,-_4);
 }
 }
 }
 this.textPosition={x:x,y:y};
 };
-p.apply=function(_b){
-if(!_b){
+p.apply=function(_6){
+if(!_6){
 return;
 }
-if(_b.documentElement){
-_b=_b.documentElement;
+if(_6.documentElement){
+_6=_6.documentElement;
 }
-this.readCommonAttrs(_b);
-for(var i=0;i<_b.childNodes.length;i++){
-var c=_b.childNodes[i];
+this.readCommonAttrs(_6);
+for(var i=0;i<_6.childNodes.length;i++){
+var c=_6.childNodes[i];
 if(c.localName=="text"){
 this.property("label",c.childNodes.length?c.childNodes[0].nodeValue:"");
 }else{
@@ -100,29 +100,29 @@ 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);
-var _10=this.property("stroke");
-var _11=c.getAttribute("style");
-var m=_11.match(/stroke:([^;]+);/);
+var _7=this.property("stroke");
+var _8=c.getAttribute("style");
+var m=_8.match(/stroke:([^;]+);/);
 if(m){
-_10.color=m[1];
+_7.color=m[1];
 this.property("fill",m[1]);
 }
-m=_11.match(/stroke-width:([^;]+);/);
+m=_8.match(/stroke-width:([^;]+);/);
 if(m){
-_10.width=m[1];
+_7.width=m[1];
 }
-this.property("stroke",_10);
+this.property("stroke",_7);
 }
 }
 }
 };
-p.initialize=function(obj){
-var _14=(ta.Annotation.labelFont)?ta.Annotation.labelFont:{family:"Times",size:"16px"};
-this.apply(obj);
+p.initialize=function(_9){
+var _a=(ta.Annotation.labelFont)?ta.Annotation.labelFont:{family:"Times",size:"16px"};
+this.apply(_9);
 this._rot();
 this._pos();
-var rot=this.rotation;
-var _16=dojox.gfx.matrix.rotate(rot);
+var _b=this.rotation;
+var _c=dojox.gfx.matrix.rotate(_b);
 this.shape=this.figure.group.createGroup();
 this.shape.getEventSource().setAttribute("id",this.id);
 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");
@@ -143,15 +143,15 @@ 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);
+p.draw=function(_d){
+this.apply(_d);
 this._rot();
 this._pos();
-var rot=this.rotation;
-var _19=dojox.gfx.matrix.rotate(rot);
+var _e=this.rotation;
+var _f=dojox.gfx.matrix.rotate(_e);
 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");
-this.arrowheadGroup.setTransform({dx:this.start.x,dy:this.start.y}).applyTransform(_19);
+this.arrowheadGroup.setTransform({dx:this.start.x,dy:this.start.y}).applyTransform(_f);
 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"));
 this.zoom();
diff --git a/dojox/sketch/Slider.js b/dojox/sketch/Slider.js
index 2e70a33..36545e5 100644
--- a/dojox/sketch/Slider.js
+++ b/dojox/sketch/Slider.js
@@ -10,7 +10,7 @@ dojo._hasResource["dojox.sketch.Slider"]=true;
 dojo.provide("dojox.sketch.Slider");
 dojo.require("dijit.form.HorizontalSlider");
 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.slider=new dijit.form.HorizontalSlider({minimum:5,maximum:100,style:"width:100px;float:right"});
 this.slider._movable.node.title="Double Click to \"Zoom to Fit\"";
 this.connect(this.slider,"onChange","_setZoom");
 this.connect(this.slider.sliderHandle,"ondblclick","_zoomToFit");
@@ -18,14 +18,18 @@ this.connect(this.slider.sliderHandle,"ondblclick","_zoomToFit");
 var r=this.figure.getFit();
 this.slider.attr("value",this.slider.maximum<r?this.slider.maximum:(this.slider.minimum>r?this.slider.minimum:r));
 },_setZoom:function(v){
-if(this.figure){
+if(v&&this.figure){
 this.figure.zoom(v);
 }
+},reset:function(){
+this.slider.attr("value",this.slider.maximum);
+this._zoomToFit();
 },setToolbar:function(t){
+this._initButton();
 t.addChild(this.slider);
 if(!t._reset2Zoom){
 t._reset2Zoom=true;
-this.connect(t,"reset","_zoomToFit");
+this.connect(t,"reset","reset");
 }
 }});
 dojox.sketch.registerTool("Slider",dojox.sketch.Slider);
diff --git a/dojox/sketch/Toolbar.js b/dojox/sketch/Toolbar.js
index 64e15a4..2bd62c5 100644
--- a/dojox/sketch/Toolbar.js
+++ b/dojox/sketch/Toolbar.js
@@ -28,21 +28,25 @@ 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(_5){
-var _6=dojo.isString(_5)?_5:_5.name;
-var p=new dojox.sketch.tools[_6](_5.args||{});
+dojo.forEach(this.plugins,function(_2){
+var _3=dojo.isString(_2)?_2:_2.name;
+var p=new dojox.sketch.tools[_3](_2.args||{});
 this._plugins.push(p);
-p.setFigure(this.figure);
 p.setToolbar(this);
 if(!this._defaultTool&&p.button){
 this._defaultTool=p;
 }
 },this);
+},setFigure:function(f){
+this.figure=f;
+this.connect(f,"onLoad","reset");
+dojo.forEach(this._plugins,function(p){
+p.setFigure(f);
+});
 },destroy:function(){
 dojo.forEach(this._plugins,function(p){
 p.destroy();
@@ -50,12 +54,12 @@ p.destroy();
 this.inherited(arguments);
 delete this._defaultTool;
 delete this._plugins;
-},addGroupItem:function(_9,_a){
-if(_a!="toolsGroup"){
-console.error("not supported group "+_a);
+},addGroupItem:function(_4,_5){
+if(_5!="toolsGroup"){
+console.error("not supported group "+_5);
 return;
 }
-this.shapeGroup.add(_9);
+this.shapeGroup.add(_4);
 },reset:function(){
 this._defaultTool.activate();
 },_setShape:function(s){
@@ -64,15 +68,16 @@ return;
 }
 if(this.figure.hasSelections()){
 for(var i=0;i<this.figure.selected.length;i++){
-var _d=this.figure.selected[i].serialize();
+var _6=this.figure.selected[i].serialize();
 this.figure.convert(this.figure.selected[i],s);
-this.figure.history.add(dojox.sketch.CommandTypes.Convert,this.figure.selected[i],_d);
+this.figure.history.add(dojox.sketch.CommandTypes.Convert,this.figure.selected[i],_6);
 }
 }
 }});
-dojox.sketch.makeToolbar=function(_e,_f){
-var _10=new dojox.sketch.Toolbar({"figure":_f});
-_e.appendChild(_10.domNode);
-return _10;
+dojox.sketch.makeToolbar=function(_7,_8){
+var _9=new dojox.sketch.Toolbar();
+_9.setFigure(_8);
+_7.appendChild(_9.domNode);
+return _9;
 };
 }
diff --git a/dojox/sketch/UnderlineAnnotation.js b/dojox/sketch/UnderlineAnnotation.js
index 8b823f0..e970d24 100644
--- a/dojox/sketch/UnderlineAnnotation.js
+++ b/dojox/sketch/UnderlineAnnotation.js
@@ -12,8 +12,8 @@ dojo.require("dojox.sketch.Annotation");
 dojo.require("dojox.sketch.Anchor");
 (function(){
 var ta=dojox.sketch;
-ta.UnderlineAnnotation=function(_2,id){
-ta.Annotation.call(this,_2,id);
+ta.UnderlineAnnotation=function(_1,id){
+ta.Annotation.call(this,_1,id);
 this.transform={dx:0,dy:0};
 this.start={x:0,y:0};
 this.property("label","#");
@@ -29,31 +29,31 @@ return "Underline";
 p.getType=function(){
 return ta.UnderlineAnnotation;
 };
-p.apply=function(_5){
-if(!_5){
+p.apply=function(_2){
+if(!_2){
 return;
 }
-if(_5.documentElement){
-_5=_5.documentElement;
+if(_2.documentElement){
+_2=_2.documentElement;
 }
-this.readCommonAttrs(_5);
-for(var i=0;i<_5.childNodes.length;i++){
-var c=_5.childNodes[i];
+this.readCommonAttrs(_2);
+for(var i=0;i<_2.childNodes.length;i++){
+var c=_2.childNodes[i];
 if(c.localName=="text"){
 this.property("label",c.childNodes[0].nodeValue);
-var _8=c.getAttribute("style");
-var m=_8.match(/fill:([^;]+);/);
+var _3=c.getAttribute("style");
+var m=_3.match(/fill:([^;]+);/);
 if(m){
-var _a=this.property("stroke");
-_a.collor=m[1];
-this.property("stroke",_a);
-this.property("fill",_a.collor);
+var _4=this.property("stroke");
+_4.collor=m[1];
+this.property("stroke",_4);
+this.property("fill",_4.collor);
 }
 }
 }
 };
-p.initialize=function(_b){
-this.apply(_b);
+p.initialize=function(_5){
+this.apply(_5);
 this.shape=this.figure.group.createGroup();
 this.shape.getEventSource().setAttribute("id",this.id);
 this.labelShape=this.shape.createText({x:0,y:0,text:this.property("label"),decoration:"underline",align:"start"});
@@ -76,19 +76,19 @@ var b=this.getTextBox();
 var z=this.figure.zoomFactor;
 return {x:0,y:(b.h*-1+4)/z,width:(b.w+2)/z,height:b.h/z};
 };
-p.draw=function(_e){
-this.apply(_e);
+p.draw=function(_6){
+this.apply(_6);
 this.shape.setTransform(this.transform);
 this.labelShape.setShape({x:0,y:0,text:this.property("label")}).setFill(this.property("fill"));
 this.zoom();
 };
-p.zoom=function(_f){
+p.zoom=function(_7){
 if(this.labelShape){
-_f=_f||this.figure.zoomFactor;
-var _10=dojox.gfx.renderer=="vml"?0:2/_f;
-ta.Annotation.prototype.zoom.call(this,_f);
-_f=dojox.gfx.renderer=="vml"?1:_f;
-this.lineShape.setShape({x1:0,x2:this.getBBox().width-_10,y1:2,y2:2}).setStroke({color:this.property("fill"),width:1/_f});
+_7=_7||this.figure.zoomFactor;
+var _8=dojox.gfx.renderer=="vml"?0:2/_7;
+ta.Annotation.prototype.zoom.call(this,_7);
+_7=dojox.gfx.renderer=="vml"?1:_7;
+this.lineShape.setShape({x1:0,x2:this.getBBox().width-_8,y1:2,y2:2}).setStroke({color:this.property("fill"),width:1/_7});
 if(this.mode==ta.Annotation.Modes.Edit){
 this.drawBBox();
 }
@@ -98,6 +98,16 @@ p.serialize=function(){
 var s=this.property("stroke");
 return "<g "+this.writeCommonAttrs()+">"+"<text style=\"fill:"+this.property("fill")+";\" font-weight=\"bold\" text-decoration=\"underline\" "+"x=\"0\" y=\"0\">"+this.property("label")+"</text>"+"</g>";
 };
-ta.Annotation.register("Underline");
+dojo.declare("dojox.sketch.UnderlineAnnotationTool",ta.AnnotationTool,{onMouseDown:function(){
+},onMouseUp:function(){
+var f=this.figure;
+if(!f._start){
+return;
+}
+f._end={x:0,y:0};
+this._create(f._start,{x:f._start.x+10,y:f._start.y+10});
+},onMouseMove:function(){
+}});
+ta.Annotation.register("Underline",ta.UnderlineAnnotationTool);
 })();
 }
diff --git a/dojox/sketch/UndoStack.js b/dojox/sketch/UndoStack.js
index ce7faee..213f8e9 100644
--- a/dojox/sketch/UndoStack.js
+++ b/dojox/sketch/UndoStack.js
@@ -12,59 +12,59 @@ 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(_2){
-this.figure=_2;
+dojo.declare("dojox.sketch.UndoStack",null,{constructor:function(_1){
+this.figure=_1;
 this._steps=[];
 this._undoedSteps=[];
-},apply:function(_3,_4,to){
-if(!_4&&!to&&_3.fullText){
-this.figure.setValue(_3.fullText);
+},apply:function(_2,_3,to){
+if(!_3&&!to&&_2.fullText){
+this.figure.setValue(_2.fullText);
 return;
 }
-var _6=_4.shapeText;
-var _7=to.shapeText;
-if(_6.length==0&&_7.length==0){
+var _4=_3.shapeText;
+var _5=to.shapeText;
+if(_4.length==0&&_5.length==0){
 return;
 }
-if(_6.length==0){
-var o=dojox.xml.DomParser.parse(_7).documentElement;
+if(_4.length==0){
+var o=dojox.xml.DomParser.parse(_5).documentElement;
 var a=this.figure._loadAnnotation(o);
 if(a){
 this.figure._add(a);
 }
 return;
 }
-if(_7.length==0){
-var _a=this.figure.get(_4.shapeId);
-this.figure._delete([_a],true);
+if(_5.length==0){
+var _6=this.figure.get(_3.shapeId);
+this.figure._delete([_6],true);
 return;
 }
-var _b=this.figure.get(to.shapeId);
-var no=dojox.xml.DomParser.parse(_7).documentElement;
-_b.draw(no);
-this.figure.select(_b);
+var _7=this.figure.get(to.shapeId);
+var no=dojox.xml.DomParser.parse(_5).documentElement;
+_7.draw(no);
+this.figure.select(_7);
 return;
-},add:function(_d,_e,_f){
-var id=_e?_e.id:"";
-var _11=_e?_e.serialize():"";
-if(_d==ta.CommandTypes.Delete){
-_11="";
+},add:function(_8,_9,_a){
+var id=_9?_9.id:"";
+var _b=_9?_9.serialize():"";
+if(_8==ta.CommandTypes.Delete){
+_b="";
 }
-var _12={cmdname:_d,before:{shapeId:id,shapeText:_f||""},after:{shapeId:id,shapeText:_11}};
-this._steps.push(_12);
+var _c={cmdname:_8,before:{shapeId:id,shapeText:_a||""},after:{shapeId:id,shapeText:_b}};
+this._steps.push(_c);
 this._undoedSteps=[];
 },destroy:function(){
 },undo:function(){
-var _13=this._steps.pop();
-if(_13){
-this._undoedSteps.push(_13);
-this.apply(_13,_13.after,_13.before);
+var _d=this._steps.pop();
+if(_d){
+this._undoedSteps.push(_d);
+this.apply(_d,_d.after,_d.before);
 }
 },redo:function(){
-var _14=this._undoedSteps.pop();
-if(_14){
-this._steps.push(_14);
-this.apply(_14,_14.before,_14.after);
+var _e=this._undoedSteps.pop();
+if(_e){
+this._steps.push(_e);
+this.apply(_e,_e.before,_e.after);
 }
 }});
 })();
diff --git a/dojox/sketch/_Plugin.js b/dojox/sketch/_Plugin.js
index 65388b7..32c1dd1 100644
--- a/dojox/sketch/_Plugin.js
+++ b/dojox/sketch/_Plugin.js
@@ -37,15 +37,15 @@ this.attr("checked",true);
 dojo.forEach(this._connects,dojo.disconnect);
 },connect:function(o,f,tf){
 this._connects.push(dojo.connect(o,f,this,tf));
-},setFigure:function(_e){
-this.figure=_e;
+},setFigure:function(_6){
+this.figure=_6;
+},setToolbar:function(_7){
 this._initButton();
-},setToolbar:function(_f){
 if(this.button){
-_f.addChild(this.button);
+_7.addChild(this.button);
 }
 if(this.itemGroup){
-_f.addGroupItem(this,this.itemGroup);
+_7.addGroupItem(this,this.itemGroup);
 }
 }});
 }
diff --git a/dojox/sql/_base.js b/dojox/sql/_base.js
index 9dbd4cf..dd8edff 100644
--- a/dojox/sql/_base.js
+++ b/dojox/sql/_base.js
@@ -85,13 +85,11 @@ return rs;
 }
 catch(exp){
 exp=exp.message||exp;
-
 if(this._autoClose){
 try{
 this.close();
 }
 catch(e){
-
 }
 }
 throw exp;
@@ -110,58 +108,57 @@ dojox.off.onFrameworkEvent("coreOperationFailed");
 throw "Google Gears must be allowed to run";
 }
 }
-},_printDebugSQL:function(_a,_b){
-var _c="dojox.sql(\""+_a+"\"";
-for(var i=0;i<_b.length;i++){
-if(typeof _b[i]=="string"){
-_c+=", \""+_b[i]+"\"";
+},_printDebugSQL:function(_9,_a){
+var _b="dojox.sql(\""+_9+"\"";
+for(var i=0;i<_a.length;i++){
+if(typeof _a[i]=="string"){
+_b+=", \""+_a[i]+"\"";
 }else{
-_c+=", "+_b[i];
+_b+=", "+_a[i];
 }
 }
-_c+=")";
-
+_b+=")";
 },_normalizeResults:function(rs){
-var _f=[];
+var _c=[];
 if(!rs){
 return [];
 }
 while(rs.isValidRow()){
-var row={};
+var _d={};
 for(var i=0;i<rs.fieldCount();i++){
-var _12=rs.fieldName(i);
-var _13=rs.field(i);
-row[_12]=_13;
+var _e=rs.fieldName(i);
+var _f=rs.field(i);
+_d[_e]=_f;
 }
-_f.push(row);
+_c.push(_d);
 rs.next();
 }
 rs.close();
-return _f;
+return _c;
 },_needsEncrypt:function(sql){
 return /encrypt\([^\)]*\)/i.test(sql);
 },_needsDecrypt:function(sql){
 return /decrypt\([^\)]*\)/i.test(sql);
 }});
-dojo.declare("dojox.sql._SQLCrypto",null,{constructor:function(_16,sql,_18,_19,_1a){
-if(_16=="encrypt"){
-this._execEncryptSQL(sql,_18,_19,_1a);
+dojo.declare("dojox.sql._SQLCrypto",null,{constructor:function(_10,sql,_11,_12,_13){
+if(_10=="encrypt"){
+this._execEncryptSQL(sql,_11,_12,_13);
 }else{
-this._execDecryptSQL(sql,_18,_19,_1a);
-}
-},_execEncryptSQL:function(sql,_1c,_1d,_1e){
-var _1f=this._stripCryptoSQL(sql);
-var _20=this._flagEncryptedArgs(sql,_1d);
-var _21=this;
-this._encrypt(_1f,_1c,_1d,_20,function(_22){
-var _23=false;
-var _24=[];
+this._execDecryptSQL(sql,_11,_12,_13);
+}
+},_execEncryptSQL:function(sql,_14,_15,_16){
+var _17=this._stripCryptoSQL(sql);
+var _18=this._flagEncryptedArgs(sql,_15);
+var _19=this;
+this._encrypt(_17,_14,_15,_18,function(_1a){
+var _1b=false;
+var _1c=[];
 var exp=null;
 try{
-_24=dojox.sql.db.execute(_1f,_22);
+_1c=dojox.sql.db.execute(_17,_1a);
 }
 catch(execError){
-_23=true;
+_1b=true;
 exp=execError.message||execError;
 }
 if(exp!=null){
@@ -172,33 +169,33 @@ dojox.sql.close();
 catch(e){
 }
 }
-_1e(null,true,exp.toString());
+_16(null,true,exp.toString());
 return;
 }
-_24=dojox.sql._normalizeResults(_24);
+_1c=dojox.sql._normalizeResults(_1c);
 if(dojox.sql._autoClose){
 dojox.sql.close();
 }
 if(dojox.sql._needsDecrypt(sql)){
-var _26=_21._determineDecryptedColumns(sql);
-_21._decrypt(_24,_26,_1c,function(_27){
-_1e(_27,false,null);
+var _1d=_19._determineDecryptedColumns(sql);
+_19._decrypt(_1c,_1d,_14,function(_1e){
+_16(_1e,false,null);
 });
 }else{
-_1e(_24,false,null);
+_16(_1c,false,null);
 }
 });
-},_execDecryptSQL:function(sql,_29,_2a,_2b){
-var _2c=this._stripCryptoSQL(sql);
-var _2d=this._determineDecryptedColumns(sql);
-var _2e=false;
-var _2f=[];
+},_execDecryptSQL:function(sql,_1f,_20,_21){
+var _22=this._stripCryptoSQL(sql);
+var _23=this._determineDecryptedColumns(sql);
+var _24=false;
+var _25=[];
 var exp=null;
 try{
-_2f=dojox.sql.db.execute(_2c,_2a);
+_25=dojox.sql.db.execute(_22,_20);
 }
 catch(execError){
-_2e=true;
+_24=true;
 exp=execError.message||execError;
 }
 if(exp!=null){
@@ -209,49 +206,49 @@ dojox.sql.close();
 catch(e){
 }
 }
-_2b(_2f,true,exp.toString());
+_21(_25,true,exp.toString());
 return;
 }
-_2f=dojox.sql._normalizeResults(_2f);
+_25=dojox.sql._normalizeResults(_25);
 if(dojox.sql._autoClose){
 dojox.sql.close();
 }
-this._decrypt(_2f,_2d,_29,function(_31){
-_2b(_31,false,null);
+this._decrypt(_25,_23,_1f,function(_26){
+_21(_26,false,null);
 });
-},_encrypt:function(sql,_33,_34,_35,_36){
+},_encrypt:function(sql,_27,_28,_29,_2a){
 this._totalCrypto=0;
 this._finishedCrypto=0;
 this._finishedSpawningCrypto=false;
-this._finalArgs=_34;
-for(var i=0;i<_34.length;i++){
-if(_35[i]){
-var _38=_34[i];
-var _39=i;
+this._finalArgs=_28;
+for(var i=0;i<_28.length;i++){
+if(_29[i]){
+var _2b=_28[i];
+var _2c=i;
 this._totalCrypto++;
-dojox.sql._crypto.encrypt(_38,_33,dojo.hitch(this,function(_3a){
-this._finalArgs[_39]=_3a;
+dojox.sql._crypto.encrypt(_2b,_27,dojo.hitch(this,function(_2d){
+this._finalArgs[_2c]=_2d;
 this._finishedCrypto++;
 if(this._finishedCrypto>=this._totalCrypto&&this._finishedSpawningCrypto){
-_36(this._finalArgs);
+_2a(this._finalArgs);
 }
 }));
 }
 }
 this._finishedSpawningCrypto=true;
-},_decrypt:function(_3b,_3c,_3d,_3e){
+},_decrypt:function(_2e,_2f,_30,_31){
 this._totalCrypto=0;
 this._finishedCrypto=0;
 this._finishedSpawningCrypto=false;
-this._finalResultSet=_3b;
-for(var i=0;i<_3b.length;i++){
-var row=_3b[i];
-for(var _41 in row){
-if(_3c=="*"||_3c[_41]){
+this._finalResultSet=_2e;
+for(var i=0;i<_2e.length;i++){
+var row=_2e[i];
+for(var _32 in row){
+if(_2f=="*"||_2f[_32]){
 this._totalCrypto++;
-var _42=row[_41];
-this._decryptSingleColumn(_41,_42,_3d,i,function(_43){
-_3e(_43);
+var _33=row[_32];
+this._decryptSingleColumn(_32,_33,_30,i,function(_34){
+_31(_34);
 });
 }
 }
@@ -259,75 +256,75 @@ _3e(_43);
 this._finishedSpawningCrypto=true;
 },_stripCryptoSQL:function(sql){
 sql=sql.replace(/DECRYPT\(\*\)/ig,"*");
-var _45=sql.match(/ENCRYPT\([^\)]*\)/ig);
-if(_45!=null){
-for(var i=0;i<_45.length;i++){
-var _47=_45[i];
-var _48=_47.match(/ENCRYPT\(([^\)]*)\)/i)[1];
-sql=sql.replace(_47,_48);
+var _35=sql.match(/ENCRYPT\([^\)]*\)/ig);
+if(_35!=null){
+for(var i=0;i<_35.length;i++){
+var _36=_35[i];
+var _37=_36.match(/ENCRYPT\(([^\)]*)\)/i)[1];
+sql=sql.replace(_36,_37);
 }
 }
-_45=sql.match(/DECRYPT\([^\)]*\)/ig);
-if(_45!=null){
-for(i=0;i<_45.length;i++){
-var _49=_45[i];
-var _4a=_49.match(/DECRYPT\(([^\)]*)\)/i)[1];
-sql=sql.replace(_49,_4a);
+_35=sql.match(/DECRYPT\([^\)]*\)/ig);
+if(_35!=null){
+for(i=0;i<_35.length;i++){
+var _38=_35[i];
+var _39=_38.match(/DECRYPT\(([^\)]*)\)/i)[1];
+sql=sql.replace(_38,_39);
 }
 }
 return sql;
-},_flagEncryptedArgs:function(sql,_4c){
-var _4d=new RegExp(/([\"][^\"]*\?[^\"]*[\"])|([\'][^\']*\?[^\']*[\'])|(\?)/ig);
-var _4e;
-var _4f=0;
-var _50=[];
-while((_4e=_4d.exec(sql))!=null){
-var _51=RegExp.lastMatch+"";
-if(/^[\"\']/.test(_51)){
+},_flagEncryptedArgs:function(sql,_3a){
+var _3b=new RegExp(/([\"][^\"]*\?[^\"]*[\"])|([\'][^\']*\?[^\']*[\'])|(\?)/ig);
+var _3c;
+var _3d=0;
+var _3e=[];
+while((_3c=_3b.exec(sql))!=null){
+var _3f=RegExp.lastMatch+"";
+if(/^[\"\']/.test(_3f)){
 continue;
 }
-var _52=false;
+var _40=false;
 if(/ENCRYPT\([^\)]*$/i.test(RegExp.leftContext)){
-_52=true;
+_40=true;
 }
-_50[_4f]=_52;
-_4f++;
+_3e[_3d]=_40;
+_3d++;
 }
-return _50;
+return _3e;
 },_determineDecryptedColumns:function(sql){
-var _54={};
+var _41={};
 if(/DECRYPT\(\*\)/i.test(sql)){
-_54="*";
+_41="*";
 }else{
-var _55=/DECRYPT\((?:\s*\w*\s*\,?)*\)/ig;
-var _56=_55.exec(sql);
-while(_56){
-var _57=new String(RegExp.lastMatch);
-var _58=_57.replace(/DECRYPT\(/i,"");
-_58=_58.replace(/\)/,"");
-_58=_58.split(/\s*,\s*/);
-dojo.forEach(_58,function(_59){
-if(/\s*\w* AS (\w*)/i.test(_59)){
-_59=_59.match(/\s*\w* AS (\w*)/i)[1];
-}
-_54[_59]=true;
+var _42=/DECRYPT\((?:\s*\w*\s*\,?)*\)/ig;
+var _43=_42.exec(sql);
+while(_43){
+var _44=new String(RegExp.lastMatch);
+var _45=_44.replace(/DECRYPT\(/i,"");
+_45=_45.replace(/\)/,"");
+_45=_45.split(/\s*,\s*/);
+dojo.forEach(_45,function(_46){
+if(/\s*\w* AS (\w*)/i.test(_46)){
+_46=_46.match(/\s*\w* AS (\w*)/i)[1];
+}
+_41[_46]=true;
 });
-_56=_55.exec(sql);
+_43=_42.exec(sql);
 }
 }
-return _54;
-},_decryptSingleColumn:function(_5a,_5b,_5c,_5d,_5e){
-dojox.sql._crypto.decrypt(_5b,_5c,dojo.hitch(this,function(_5f){
-this._finalResultSet[_5d][_5a]=_5f;
+return _41;
+},_decryptSingleColumn:function(_47,_48,_49,_4a,_4b){
+dojox.sql._crypto.decrypt(_48,_49,dojo.hitch(this,function(_4c){
+this._finalResultSet[_4a][_47]=_4c;
 this._finishedCrypto++;
 if(this._finishedCrypto>=this._totalCrypto&&this._finishedSpawningCrypto){
-_5e(this._finalResultSet);
+_4b(this._finalResultSet);
 }
 }));
 }});
 (function(){
-var _60=dojox.sql;
+var _4d=dojox.sql;
 dojox.sql=new Function("return dojox.sql._exec(arguments);");
-dojo.mixin(dojox.sql,_60);
+dojo.mixin(dojox.sql,_4d);
 })();
 }
diff --git a/dojox/sql/_crypto.js b/dojox/sql/_crypto.js
index 9b623b1..db0b704 100644
--- a/dojox/sql/_crypto.js
+++ b/dojox/sql/_crypto.js
@@ -48,49 +48,49 @@ catch(exp){
 throw exp.message||exp;
 }
 }
-},_assignWork:function(msg,_12){
+},_assignWork:function(msg,_10){
 if(!this._handleMessage.length&&this._unemployed.length){
-var _13=this._unemployed.shift().substring(1);
-this._employed["_"+_13]=_12;
-this._manager.sendMessage(msg,parseInt(_13,10));
+var _11=this._unemployed.shift().substring(1);
+this._employed["_"+_11]=_10;
+this._manager.sendMessage(msg,parseInt(_11,10));
 }else{
-this._handleMessage={msg:msg,callback:_12};
+this._handleMessage={msg:msg,callback:_10};
 }
-},_workerHandler:function(msg,_15){
-var _16=[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 [...]
-var _17=[[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 _18(_19,w){
+},_workerHandler:function(msg,_12){
+var _13=[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 [...]
+var _14=[[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 _15(_16,w){
 var Nb=4;
 var Nr=w.length/Nb-1;
-var _1d=[[],[],[],[]];
+var _17=[[],[],[],[]];
 for(var i=0;i<4*Nb;i++){
-_1d[i%4][Math.floor(i/4)]=_19[i];
-}
-_1d=_1f(_1d,w,0,Nb);
-for(var _20=1;_20<Nr;_20++){
-_1d=_21(_1d,Nb);
-_1d=_22(_1d,Nb);
-_1d=_23(_1d,Nb);
-_1d=_1f(_1d,w,_20,Nb);
-}
-_1d=_21(_1d,Nb);
-_1d=_22(_1d,Nb);
-_1d=_1f(_1d,w,Nr,Nb);
-var _24=new Array(4*Nb);
+_17[i%4][Math.floor(i/4)]=_16[i];
+}
+_17=_18(_17,w,0,Nb);
+for(var _19=1;_19<Nr;_19++){
+_17=_1a(_17,Nb);
+_17=_1b(_17,Nb);
+_17=_1c(_17,Nb);
+_17=_18(_17,w,_19,Nb);
+}
+_17=_1a(_17,Nb);
+_17=_1b(_17,Nb);
+_17=_18(_17,w,Nr,Nb);
+var _1d=new Array(4*Nb);
 for(var i=0;i<4*Nb;i++){
-_24[i]=_1d[i%4][Math.floor(i/4)];
+_1d[i]=_17[i%4][Math.floor(i/4)];
 }
-return _24;
+return _1d;
 };
-function _21(s,Nb){
+function _1a(s,Nb){
 for(var r=0;r<4;r++){
 for(var c=0;c<Nb;c++){
-s[r][c]=_16[s[r][c]];
+s[r][c]=_13[s[r][c]];
 }
 }
 return s;
 };
-function _22(s,Nb){
+function _1b(s,Nb){
 var t=new Array(4);
 for(var r=1;r<4;r++){
 for(var c=0;c<4;c++){
@@ -102,7 +102,7 @@ s[r][c]=t[c];
 }
 return s;
 };
-function _23(s,Nb){
+function _1c(s,Nb){
 for(var c=0;c<4;c++){
 var a=new Array(4);
 var b=new Array(4);
@@ -117,20 +117,20 @@ s[3][c]=a[0]^b[0]^a[1]^a[2]^b[3];
 }
 return s;
 };
-function _1f(_34,w,rnd,Nb){
+function _18(_1e,w,rnd,Nb){
 for(var r=0;r<4;r++){
 for(var c=0;c<Nb;c++){
-_34[r][c]^=w[rnd*4+c][r];
+_1e[r][c]^=w[rnd*4+c][r];
 }
 }
-return _34;
+return _1e;
 };
-function _3a(key){
+function _1f(key){
 var Nb=4;
 var Nk=key.length/4;
 var Nr=Nk+6;
 var w=new Array(Nb*(Nr+1));
-var _40=new Array(4);
+var _20=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;
@@ -138,155 +138,155 @@ w[i]=r;
 for(var i=Nk;i<(Nb*(Nr+1));i++){
 w[i]=new Array(4);
 for(var t=0;t<4;t++){
-_40[t]=w[i-1][t];
+_20[t]=w[i-1][t];
 }
 if(i%Nk==0){
-_40=_44(_45(_40));
+_20=_21(_22(_20));
 for(var t=0;t<4;t++){
-_40[t]^=_17[i/Nk][t];
+_20[t]^=_14[i/Nk][t];
 }
 }else{
 if(Nk>6&&i%Nk==4){
-_40=_44(_40);
+_20=_21(_20);
 }
 }
 for(var t=0;t<4;t++){
-w[i][t]=w[i-Nk][t]^_40[t];
+w[i][t]=w[i-Nk][t]^_20[t];
 }
 }
 return w;
 };
-function _44(w){
+function _21(w){
 for(var i=0;i<4;i++){
-w[i]=_16[w[i]];
+w[i]=_13[w[i]];
 }
 return w;
 };
-function _45(w){
+function _22(w){
 w[4]=w[0];
 for(var i=0;i<4;i++){
 w[i]=w[i+1];
 }
 return w;
 };
-function _4a(_4b,_4c,_4d){
-if(!(_4d==128||_4d==192||_4d==256)){
+function _23(_24,_25,_26){
+if(!(_26==128||_26==192||_26==256)){
 return "";
 }
-var _4e=_4d/8;
-var _4f=new Array(_4e);
-for(var i=0;i<_4e;i++){
-_4f[i]=_4c.charCodeAt(i)&255;
+var _27=_26/8;
+var _28=new Array(_27);
+for(var i=0;i<_27;i++){
+_28[i]=_25.charCodeAt(i)&255;
 }
-var key=_18(_4f,_3a(_4f));
-key=key.concat(key.slice(0,_4e-16));
-var _52=16;
-var _53=new Array(_52);
-var _54=(new Date()).getTime();
+var key=_15(_28,_1f(_28));
+key=key.concat(key.slice(0,_27-16));
+var _29=16;
+var _2a=new Array(_29);
+var _2b=(new Date()).getTime();
 for(var i=0;i<4;i++){
-_53[i]=(_54>>>i*8)&255;
+_2a[i]=(_2b>>>i*8)&255;
 }
 for(var i=0;i<4;i++){
-_53[i+4]=(_54/4294967296>>>i*8)&255;
+_2a[i+4]=(_2b/4294967296>>>i*8)&255;
 }
-var _55=_3a(key);
-var _56=Math.ceil(_4b.length/_52);
-var _57=new Array(_56);
-for(var b=0;b<_56;b++){
+var _2c=_1f(key);
+var _2d=Math.ceil(_24.length/_29);
+var _2e=new Array(_2d);
+for(var b=0;b<_2d;b++){
 for(var c=0;c<4;c++){
-_53[15-c]=(b>>>c*8)&255;
+_2a[15-c]=(b>>>c*8)&255;
 }
 for(var c=0;c<4;c++){
-_53[15-c-4]=(b/4294967296>>>c*8);
+_2a[15-c-4]=(b/4294967296>>>c*8);
 }
-var _5a=_18(_53,_55);
-var _5b=b<_56-1?_52:(_4b.length-1)%_52+1;
+var _2f=_15(_2a,_2c);
+var _30=b<_2d-1?_29:(_24.length-1)%_29+1;
 var ct="";
-for(var i=0;i<_5b;i++){
-var _5d=_4b.charCodeAt(b*_52+i);
-var _5e=_5d^_5a[i];
-ct+=String.fromCharCode(_5e);
+for(var i=0;i<_30;i++){
+var _31=_24.charCodeAt(b*_29+i);
+var _32=_31^_2f[i];
+ct+=String.fromCharCode(_32);
 }
-_57[b]=_5f(ct);
+_2e[b]=_33(ct);
 }
-var _60="";
+var _34="";
 for(var i=0;i<8;i++){
-_60+=String.fromCharCode(_53[i]);
+_34+=String.fromCharCode(_2a[i]);
 }
-_60=_5f(_60);
-return _60+"-"+_57.join("-");
+_34=_33(_34);
+return _34+"-"+_2e.join("-");
 };
-function _61(_62,_63,_64){
-if(!(_64==128||_64==192||_64==256)){
+function _35(_36,_37,_38){
+if(!(_38==128||_38==192||_38==256)){
 return "";
 }
-var _65=_64/8;
-var _66=new Array(_65);
-for(var i=0;i<_65;i++){
-_66[i]=_63.charCodeAt(i)&255;
-}
-var _68=_3a(_66);
-var key=_18(_66,_68);
-key=key.concat(key.slice(0,_65-16));
-var _6a=_3a(key);
-_62=_62.split("-");
-var _6b=16;
-var _6c=new Array(_6b);
-var _6d=_6e(_62[0]);
+var _39=_38/8;
+var _3a=new Array(_39);
+for(var i=0;i<_39;i++){
+_3a[i]=_37.charCodeAt(i)&255;
+}
+var _3b=_1f(_3a);
+var key=_15(_3a,_3b);
+key=key.concat(key.slice(0,_39-16));
+var _3c=_1f(key);
+_36=_36.split("-");
+var _3d=16;
+var _3e=new Array(_3d);
+var _3f=_40(_36[0]);
 for(var i=0;i<8;i++){
-_6c[i]=_6d.charCodeAt(i);
+_3e[i]=_3f.charCodeAt(i);
 }
-var _6f=new Array(_62.length-1);
-for(var b=1;b<_62.length;b++){
+var _41=new Array(_36.length-1);
+for(var b=1;b<_36.length;b++){
 for(var c=0;c<4;c++){
-_6c[15-c]=((b-1)>>>c*8)&255;
+_3e[15-c]=((b-1)>>>c*8)&255;
 }
 for(var c=0;c<4;c++){
-_6c[15-c-4]=((b/4294967296-1)>>>c*8)&255;
+_3e[15-c-4]=((b/4294967296-1)>>>c*8)&255;
 }
-var _72=_18(_6c,_6a);
-_62[b]=_6e(_62[b]);
+var _42=_15(_3e,_3c);
+_36[b]=_40(_36[b]);
 var pt="";
-for(var i=0;i<_62[b].length;i++){
-var _74=_62[b].charCodeAt(i);
-var _75=_74^_72[i];
-pt+=String.fromCharCode(_75);
+for(var i=0;i<_36[b].length;i++){
+var _43=_36[b].charCodeAt(i);
+var _44=_43^_42[i];
+pt+=String.fromCharCode(_44);
 }
-_6f[b-1]=pt;
+_41[b-1]=pt;
 }
-return _6f.join("");
+return _41.join("");
 };
-function _5f(str){
+function _33(str){
 return str.replace(/[\0\t\n\v\f\r\xa0!-]/g,function(c){
 return "!"+c.charCodeAt(0)+"!";
 });
 };
-function _6e(str){
+function _40(str){
 return str.replace(/!\d\d?\d?!/g,function(c){
 return String.fromCharCode(c.slice(1,-1));
 });
 };
-function _7a(_7b,_7c){
-return _4a(_7b,_7c,256);
+function _45(_46,_47){
+return _23(_46,_47,256);
 };
-function _7d(_7e,_7f){
-return _61(_7e,_7f,256);
+function _48(_49,_4a){
+return _35(_49,_4a,256);
 };
 var cmd=msg.substr(0,4);
 var arg=msg.substr(5);
 if(cmd=="encr"){
 arg=eval("("+arg+")");
-var _82=arg.plaintext;
-var _83=arg.password;
-var _84=_7a(_82,_83);
-gearsWorkerPool.sendMessage(String(_84),_15);
+var _4b=arg.plaintext;
+var _4c=arg.password;
+var _4d=_45(_4b,_4c);
+gearsWorkerPool.sendMessage(String(_4d),_12);
 }else{
 if(cmd=="decr"){
 arg=eval("("+arg+")");
-var _85=arg.ciphertext;
-var _83=arg.password;
-var _84=_7d(_85,_83);
-gearsWorkerPool.sendMessage(String(_84),_15);
+var _4e=arg.ciphertext;
+var _4c=arg.password;
+var _4d=_48(_4e,_4c);
+gearsWorkerPool.sendMessage(String(_4d),_12);
 }
 }
 }});
diff --git a/dojox/storage/AirDBStorageProvider.js b/dojox/storage/AirDBStorageProvider.js
index 74dd522..439e632 100644
--- a/dojox/storage/AirDBStorageProvider.js
+++ b/dojox/storage/AirDBStorageProvider.js
@@ -28,7 +28,6 @@ this._sql("CREATE UNIQUE INDEX IF NOT EXISTS namespace_key_index ON "+this.TABLE
 this.initialized=true;
 }
 catch(e){
-
 }
 dojox.storage.manager.loaded();
 },_sql:function(_2,_3){
@@ -61,7 +60,6 @@ this._sql("DELETE FROM "+this.TABLE_NAME+" WHERE namespace = :namespace AND key
 this._sql("INSERT INTO "+this.TABLE_NAME+" VALUES (:namespace, :key, :value)",{":namespace":_9,":key":_6,":value":_7});
 }
 catch(e){
-
 _8(this.FAILED,_6,e.toString());
 return;
 }
@@ -89,77 +87,76 @@ _d.push(rs.data[i].namespace);
 }
 }
 return _d;
-},getKeys:function(_10){
-_10=_10||this.DEFAULT_NAMESPACE;
-if(this.isValidKey(_10)==false){
-throw new Error("Invalid namespace given: "+_10);
+},getKeys:function(_e){
+_e=_e||this.DEFAULT_NAMESPACE;
+if(this.isValidKey(_e)==false){
+throw new Error("Invalid namespace given: "+_e);
 }
-var _11=[];
-var rs=this._sql("SELECT key FROM "+this.TABLE_NAME+" WHERE namespace = :namespace",{":namespace":_10});
+var _f=[];
+var rs=this._sql("SELECT key FROM "+this.TABLE_NAME+" WHERE namespace = :namespace",{":namespace":_e});
 if(rs.data){
 for(var i=0;i<rs.data.length;i++){
-_11.push(rs.data[i].key);
+_f.push(rs.data[i].key);
 }
 }
-return _11;
-},clear:function(_14){
-if(this.isValidKey(_14)==false){
-throw new Error("Invalid namespace given: "+_14);
+return _f;
+},clear:function(_10){
+if(this.isValidKey(_10)==false){
+throw new Error("Invalid namespace given: "+_10);
 }
-this._sql("DELETE FROM "+this.TABLE_NAME+" WHERE namespace = :namespace",{":namespace":_14});
-},remove:function(key,_16){
-_16=_16||this.DEFAULT_NAMESPACE;
-this._sql("DELETE FROM "+this.TABLE_NAME+" WHERE namespace = :namespace AND key = :key",{":namespace":_16,":key":key});
-},putMultiple:function(_17,_18,_19,_1a){
-if(this.isValidKeyArray(_17)===false||!_18 instanceof Array||_17.length!=_18.length){
-throw new Error("Invalid arguments: keys = ["+_17+"], values = ["+_18+"]");
+this._sql("DELETE FROM "+this.TABLE_NAME+" WHERE namespace = :namespace",{":namespace":_10});
+},remove:function(key,_11){
+_11=_11||this.DEFAULT_NAMESPACE;
+this._sql("DELETE FROM "+this.TABLE_NAME+" WHERE namespace = :namespace AND key = :key",{":namespace":_11,":key":key});
+},putMultiple:function(_12,_13,_14,_15){
+if(this.isValidKeyArray(_12)===false||!_13 instanceof Array||_12.length!=_13.length){
+throw new Error("Invalid arguments: keys = ["+_12+"], values = ["+_13+"]");
 }
-if(_1a==null||typeof _1a=="undefined"){
-_1a=this.DEFAULT_NAMESPACE;
+if(_15==null||typeof _15=="undefined"){
+_15=this.DEFAULT_NAMESPACE;
 }
-if(this.isValidKey(_1a)==false){
-throw new Error("Invalid namespace given: "+_1a);
+if(this.isValidKey(_15)==false){
+throw new Error("Invalid namespace given: "+_15);
 }
-this._statusHandler=_19;
+this._statusHandler=_14;
 try{
 this._beginTransaction();
-for(var i=0;i<_17.length;i++){
-this._sql("DELETE FROM "+this.TABLE_NAME+" WHERE namespace = :namespace AND key = :key",{":namespace":_1a,":key":_17[i]});
-this._sql("INSERT INTO "+this.TABLE_NAME+" VALUES (:namespace, :key, :value)",{":namespace":_1a,":key":_17[i],":value":_18[i]});
+for(var i=0;i<_12.length;i++){
+this._sql("DELETE FROM "+this.TABLE_NAME+" WHERE namespace = :namespace AND key = :key",{":namespace":_15,":key":_12[i]});
+this._sql("INSERT INTO "+this.TABLE_NAME+" VALUES (:namespace, :key, :value)",{":namespace":_15,":key":_12[i],":value":_13[i]});
 }
 this._commitTransaction();
 }
 catch(e){
-
-if(_19){
-_19(this.FAILED,_17,e.toString(),_1a);
+if(_14){
+_14(this.FAILED,_12,e.toString(),_15);
 }
 return;
 }
-if(_19){
-_19(this.SUCCESS,_17,null);
+if(_14){
+_14(this.SUCCESS,_12,null);
 }
-},getMultiple:function(_1c,_1d){
-if(this.isValidKeyArray(_1c)===false){
-throw new Error("Invalid key array given: "+_1c);
+},getMultiple:function(_16,_17){
+if(this.isValidKeyArray(_16)===false){
+throw new Error("Invalid key array given: "+_16);
 }
-if(_1d==null||typeof _1d=="undefined"){
-_1d=this.DEFAULT_NAMESPACE;
+if(_17==null||typeof _17=="undefined"){
+_17=this.DEFAULT_NAMESPACE;
 }
-if(this.isValidKey(_1d)==false){
-throw new Error("Invalid namespace given: "+_1d);
+if(this.isValidKey(_17)==false){
+throw new Error("Invalid namespace given: "+_17);
 }
-var _1e=[];
-for(var i=0;i<_1c.length;i++){
-var _20=this._sql("SELECT * FROM "+this.TABLE_NAME+" WHERE namespace = :namespace AND key = :key",{":namespace":_1d,":key":_1c[i]});
-_1e[i]=_20.data&&_20.data.length?_20.data[0].value:null;
+var _18=[];
+for(var i=0;i<_16.length;i++){
+var _19=this._sql("SELECT * FROM "+this.TABLE_NAME+" WHERE namespace = :namespace AND key = :key",{":namespace":_17,":key":_16[i]});
+_18[i]=_19.data&&_19.data.length?_19.data[0].value:null;
 }
-return _1e;
-},removeMultiple:function(_21,_22){
-_22=_22||this.DEFAULT_NAMESPACE;
+return _18;
+},removeMultiple:function(_1a,_1b){
+_1b=_1b||this.DEFAULT_NAMESPACE;
 this._beginTransaction();
-for(var i=0;i<_21.length;i++){
-this._sql("DELETE FROM "+this.TABLE_NAME+" WHERE namespace = namespace = :namespace AND key = :key",{":namespace":_22,":key":_21[i]});
+for(var i=0;i<_1a.length;i++){
+this._sql("DELETE FROM "+this.TABLE_NAME+" WHERE namespace = namespace = :namespace AND key = :key",{":namespace":_1b,":key":_1a[i]});
 }
 this._commitTransaction();
 },isPermanent:function(){
diff --git a/dojox/storage/AirEncryptedLocalStorageProvider.js b/dojox/storage/AirEncryptedLocalStorageProvider.js
index a08b709..d0aafad 100644
--- a/dojox/storage/AirEncryptedLocalStorageProvider.js
+++ b/dojox/storage/AirEncryptedLocalStorageProvider.js
@@ -49,7 +49,6 @@ this._setItem(_b+"_keys",_d+_8+"|");
 this._setItem("_"+_b+"_"+_8,_9);
 }
 catch(e){
-
 _a(this.FAILED,_8,e.toString(),_b);
 return;
 }
@@ -71,86 +70,85 @@ _10.push(_11[i]);
 }
 }
 return _10;
-},getKeys:function(_13){
-_13=_13||this.DEFAULT_NAMESPACE;
-if(this.isValidKey(_13)==false){
-throw new Error("Invalid namespace given: "+_13);
+},getKeys:function(_12){
+_12=_12||this.DEFAULT_NAMESPACE;
+if(this.isValidKey(_12)==false){
+throw new Error("Invalid namespace given: "+_12);
 }
-var _14=[];
-var _15=(this._getItem(_13+"_keys")||"|").split("|");
-for(var i=0;i<_15.length;i++){
-if(_15[i].length){
-_14.push(_15[i]);
+var _13=[];
+var _14=(this._getItem(_12+"_keys")||"|").split("|");
+for(var i=0;i<_14.length;i++){
+if(_14[i].length){
+_13.push(_14[i]);
 }
 }
-return _14;
-},clear:function(_17){
-if(this.isValidKey(_17)==false){
-throw new Error("Invalid namespace given: "+_17);
+return _13;
+},clear:function(_15){
+if(this.isValidKey(_15)==false){
+throw new Error("Invalid namespace given: "+_15);
 }
-var _18=this._getItem("namespaces")||"|";
-if(_18.indexOf("|"+_17+"|")!=-1){
-this._setItem("namespaces",_18.replace("|"+_17+"|","|"));
+var _16=this._getItem("namespaces")||"|";
+if(_16.indexOf("|"+_15+"|")!=-1){
+this._setItem("namespaces",_16.replace("|"+_15+"|","|"));
 }
-var _19=(this._getItem(_17+"_keys")||"|").split("|");
-for(var i=0;i<_19.length;i++){
-if(_19[i].length){
-this._removeItem(_17+"_"+_19[i]);
+var _17=(this._getItem(_15+"_keys")||"|").split("|");
+for(var i=0;i<_17.length;i++){
+if(_17[i].length){
+this._removeItem(_15+"_"+_17[i]);
 }
 }
-this._removeItem(_17+"_keys");
-},remove:function(key,_1c){
-_1c=_1c||this.DEFAULT_NAMESPACE;
-var _1d=this._getItem(_1c+"_keys")||"|";
-if(_1d.indexOf("|"+key+"|")!=-1){
-this._setItem(_1c+"_keys",_1d.replace("|"+key+"|","|"));
+this._removeItem(_15+"_keys");
+},remove:function(key,_18){
+_18=_18||this.DEFAULT_NAMESPACE;
+var _19=this._getItem(_18+"_keys")||"|";
+if(_19.indexOf("|"+key+"|")!=-1){
+this._setItem(_18+"_keys",_19.replace("|"+key+"|","|"));
 }
-this._removeItem("_"+_1c+"_"+key);
-},putMultiple:function(_1e,_1f,_20,_21){
-if(this.isValidKeyArray(_1e)===false||!_1f instanceof Array||_1e.length!=_1f.length){
-throw new Error("Invalid arguments: keys = ["+_1e+"], values = ["+_1f+"]");
+this._removeItem("_"+_18+"_"+key);
+},putMultiple:function(_1a,_1b,_1c,_1d){
+if(this.isValidKeyArray(_1a)===false||!_1b instanceof Array||_1a.length!=_1b.length){
+throw new Error("Invalid arguments: keys = ["+_1a+"], values = ["+_1b+"]");
 }
-if(_21==null||typeof _21=="undefined"){
-_21=this.DEFAULT_NAMESPACE;
+if(_1d==null||typeof _1d=="undefined"){
+_1d=this.DEFAULT_NAMESPACE;
 }
-if(this.isValidKey(_21)==false){
-throw new Error("Invalid namespace given: "+_21);
+if(this.isValidKey(_1d)==false){
+throw new Error("Invalid namespace given: "+_1d);
 }
-this._statusHandler=_20;
+this._statusHandler=_1c;
 try{
-for(var i=0;i<_1e.length;i++){
-this.put(_1e[i],_1f[i],null,_21);
+for(var i=0;i<_1a.length;i++){
+this.put(_1a[i],_1b[i],null,_1d);
 }
 }
 catch(e){
-
-if(_20){
-_20(this.FAILED,_1e,e.toString(),_21);
+if(_1c){
+_1c(this.FAILED,_1a,e.toString(),_1d);
 }
 return;
 }
-if(_20){
-_20(this.SUCCESS,_1e,null);
+if(_1c){
+_1c(this.SUCCESS,_1a,null);
 }
-},getMultiple:function(_23,_24){
-if(this.isValidKeyArray(_23)===false){
-throw new Error("Invalid key array given: "+_23);
+},getMultiple:function(_1e,_1f){
+if(this.isValidKeyArray(_1e)===false){
+throw new Error("Invalid key array given: "+_1e);
 }
-if(_24==null||typeof _24=="undefined"){
-_24=this.DEFAULT_NAMESPACE;
+if(_1f==null||typeof _1f=="undefined"){
+_1f=this.DEFAULT_NAMESPACE;
 }
-if(this.isValidKey(_24)==false){
-throw new Error("Invalid namespace given: "+_24);
+if(this.isValidKey(_1f)==false){
+throw new Error("Invalid namespace given: "+_1f);
 }
-var _25=[];
-for(var i=0;i<_23.length;i++){
-_25[i]=this.get(_23[i],_24);
+var _20=[];
+for(var i=0;i<_1e.length;i++){
+_20[i]=this.get(_1e[i],_1f);
 }
-return _25;
-},removeMultiple:function(_27,_28){
-_28=_28||this.DEFAULT_NAMESPACE;
-for(var i=0;i<_27.length;i++){
-this.remove(_27[i],_28);
+return _20;
+},removeMultiple:function(_21,_22){
+_22=_22||this.DEFAULT_NAMESPACE;
+for(var i=0;i<_21.length;i++){
+this.remove(_21[i],_22);
 }
 },isPermanent:function(){
 return true;
diff --git a/dojox/storage/AirFileStorageProvider.js b/dojox/storage/AirFileStorageProvider.js
index 6147dc8..aa5c15f 100644
--- a/dojox/storage/AirFileStorageProvider.js
+++ b/dojox/storage/AirFileStorageProvider.js
@@ -28,7 +28,6 @@ _2.createDirectory();
 this.initialized=true;
 }
 catch(e){
-
 }
 dojox.storage.manager.loaded();
 },isAvailable:function(){
@@ -54,7 +53,6 @@ _9.writeObject(_4);
 _9.close();
 }
 catch(e){
-
 _5(this.FAILED,_3,e.toString(),_6);
 return;
 }
@@ -78,86 +76,85 @@ return _c;
 },getNamespaces:function(){
 var _f=[this.DEFAULT_NAMESPACE];
 var dir=_1.File.applicationStorageDirectory.resolvePath(this._storagePath);
-var _11=dir.getDirectoryListing(),i;
-for(i=0;i<_11.length;i++){
-if(_11[i].isDirectory&&_11[i].name!=this.DEFAULT_NAMESPACE){
-_f.push(_11[i].name);
+var _10=dir.getDirectoryListing(),i;
+for(i=0;i<_10.length;i++){
+if(_10[i].isDirectory&&_10[i].name!=this.DEFAULT_NAMESPACE){
+_f.push(_10[i].name);
 }
 }
 return _f;
-},getKeys:function(_13){
-_13=_13||this.DEFAULT_NAMESPACE;
-if(this.isValidKey(_13)==false){
-throw new Error("Invalid namespace given: "+_13);
+},getKeys:function(_11){
+_11=_11||this.DEFAULT_NAMESPACE;
+if(this.isValidKey(_11)==false){
+throw new Error("Invalid namespace given: "+_11);
 }
-var _14=[];
-var dir=_1.File.applicationStorageDirectory.resolvePath(this._storagePath+_13);
+var _12=[];
+var dir=_1.File.applicationStorageDirectory.resolvePath(this._storagePath+_11);
 if(dir.exists&&dir.isDirectory){
-var _16=dir.getDirectoryListing(),i;
-for(i=0;i<_16.length;i++){
-_14.push(_16[i].name);
+var _13=dir.getDirectoryListing(),i;
+for(i=0;i<_13.length;i++){
+_12.push(_13[i].name);
 }
 }
-return _14;
-},clear:function(_18){
-if(this.isValidKey(_18)==false){
-throw new Error("Invalid namespace given: "+_18);
+return _12;
+},clear:function(_14){
+if(this.isValidKey(_14)==false){
+throw new Error("Invalid namespace given: "+_14);
 }
-var dir=_1.File.applicationStorageDirectory.resolvePath(this._storagePath+_18);
+var dir=_1.File.applicationStorageDirectory.resolvePath(this._storagePath+_14);
 if(dir.exists&&dir.isDirectory){
 dir.deleteDirectory(true);
 }
-},remove:function(key,_1b){
-_1b=_1b||this.DEFAULT_NAMESPACE;
-var _1c=_1.File.applicationStorageDirectory.resolvePath(this._storagePath+_1b+"/"+key);
-if(_1c.exists&&!_1c.isDirectory){
-_1c.deleteFile();
+},remove:function(key,_15){
+_15=_15||this.DEFAULT_NAMESPACE;
+var _16=_1.File.applicationStorageDirectory.resolvePath(this._storagePath+_15+"/"+key);
+if(_16.exists&&!_16.isDirectory){
+_16.deleteFile();
 }
-},putMultiple:function(_1d,_1e,_1f,_20){
-if(this.isValidKeyArray(_1d)===false||!_1e instanceof Array||_1d.length!=_1e.length){
-throw new Error("Invalid arguments: keys = ["+_1d+"], values = ["+_1e+"]");
+},putMultiple:function(_17,_18,_19,_1a){
+if(this.isValidKeyArray(_17)===false||!_18 instanceof Array||_17.length!=_18.length){
+throw new Error("Invalid arguments: keys = ["+_17+"], values = ["+_18+"]");
 }
-if(_20==null||typeof _20=="undefined"){
-_20=this.DEFAULT_NAMESPACE;
+if(_1a==null||typeof _1a=="undefined"){
+_1a=this.DEFAULT_NAMESPACE;
 }
-if(this.isValidKey(_20)==false){
-throw new Error("Invalid namespace given: "+_20);
+if(this.isValidKey(_1a)==false){
+throw new Error("Invalid namespace given: "+_1a);
 }
-this._statusHandler=_1f;
+this._statusHandler=_19;
 try{
-for(var i=0;i<_1d.length;i++){
-this.put(_1d[i],_1e[i],null,_20);
+for(var i=0;i<_17.length;i++){
+this.put(_17[i],_18[i],null,_1a);
 }
 }
 catch(e){
-
-if(_1f){
-_1f(this.FAILED,_1d,e.toString(),_20);
+if(_19){
+_19(this.FAILED,_17,e.toString(),_1a);
 }
 return;
 }
-if(_1f){
-_1f(this.SUCCESS,_1d,null,_20);
+if(_19){
+_19(this.SUCCESS,_17,null,_1a);
 }
-},getMultiple:function(_22,_23){
-if(this.isValidKeyArray(_22)===false){
-throw new Error("Invalid key array given: "+_22);
+},getMultiple:function(_1b,_1c){
+if(this.isValidKeyArray(_1b)===false){
+throw new Error("Invalid key array given: "+_1b);
 }
-if(_23==null||typeof _23=="undefined"){
-_23=this.DEFAULT_NAMESPACE;
+if(_1c==null||typeof _1c=="undefined"){
+_1c=this.DEFAULT_NAMESPACE;
 }
-if(this.isValidKey(_23)==false){
-throw new Error("Invalid namespace given: "+_23);
+if(this.isValidKey(_1c)==false){
+throw new Error("Invalid namespace given: "+_1c);
 }
-var _24=[];
-for(var i=0;i<_22.length;i++){
-_24[i]=this.get(_22[i],_23);
+var _1d=[];
+for(var i=0;i<_1b.length;i++){
+_1d[i]=this.get(_1b[i],_1c);
 }
-return _24;
-},removeMultiple:function(_26,_27){
-_27=_27||this.DEFAULT_NAMESPACE;
-for(var i=0;i<_26.length;i++){
-this.remove(_26[i],_27);
+return _1d;
+},removeMultiple:function(_1e,_1f){
+_1f=_1f||this.DEFAULT_NAMESPACE;
+for(var i=0;i<_1e.length;i++){
+this.remove(_1e[i],_1f);
 }
 },isPermanent:function(){
 return true;
diff --git a/dojox/storage/FlashStorageProvider.js b/dojox/storage/FlashStorageProvider.js
index 359b0d1..19ab15e 100644
--- a/dojox/storage/FlashStorageProvider.js
+++ b/dojox/storage/FlashStorageProvider.js
@@ -81,98 +81,98 @@ _9[i]=dojo.toJson(_9[i]);
 }
 _d[i]=_9[i].length;
 }
-var _f=_9.join("");
-var _10=_d.join(",");
-dojox.flash.comm.putMultiple(_c,_f,_10,_b);
-},get:function(key,_12){
+var _e=_9.join("");
+var _f=_d.join(",");
+dojox.flash.comm.putMultiple(_c,_e,_f,_b);
+},get:function(key,_10){
 if(!this.isValidKey(key)){
 throw new Error("Invalid key given: "+key);
 }
-if(!_12){
-_12=dojox.storage.DEFAULT_NAMESPACE;
+if(!_10){
+_10=dojox.storage.DEFAULT_NAMESPACE;
 }
-if(!this.isValidKey(_12)){
-throw new Error("Invalid namespace given: "+_12);
+if(!this.isValidKey(_10)){
+throw new Error("Invalid namespace given: "+_10);
 }
-var _13=dojox.flash.comm.get(key,_12);
-if(_13==""){
+var _11=dojox.flash.comm.get(key,_10);
+if(_11==""){
 return null;
 }
-return this._destringify(_13);
-},getMultiple:function(_14,_15){
-if(!this.isValidKeyArray(_14)){
-throw new ("Invalid key array given: "+_14);
+return this._destringify(_11);
+},getMultiple:function(_12,_13){
+if(!this.isValidKeyArray(_12)){
+throw new ("Invalid key array given: "+_12);
 }
-if(!_15){
-_15=dojox.storage.DEFAULT_NAMESPACE;
+if(!_13){
+_13=dojox.storage.DEFAULT_NAMESPACE;
 }
-if(!this.isValidKey(_15)){
-throw new Error("Invalid namespace given: "+_15);
+if(!this.isValidKey(_13)){
+throw new Error("Invalid namespace given: "+_13);
 }
-var _16=_14.join(",");
-var _17=dojox.flash.comm.getMultiple(_16,_15);
-var _18=eval("("+_17+")");
-for(var i=0;i<_18.length;i++){
-_18[i]=(_18[i]=="")?null:this._destringify(_18[i]);
+var _14=_12.join(",");
+var _15=dojox.flash.comm.getMultiple(_14,_13);
+var _16=eval("("+_15+")");
+for(var i=0;i<_16.length;i++){
+_16[i]=(_16[i]=="")?null:this._destringify(_16[i]);
 }
-return _18;
-},_destringify:function(_1a){
-if(dojo.isString(_1a)&&(/^string:/.test(_1a))){
-_1a=_1a.substring("string:".length);
+return _16;
+},_destringify:function(_17){
+if(dojo.isString(_17)&&(/^string:/.test(_17))){
+_17=_17.substring("string:".length);
 }else{
-_1a=dojo.fromJson(_1a);
+_17=dojo.fromJson(_17);
 }
+return _17;
+},getKeys:function(_18){
+if(!_18){
+_18=dojox.storage.DEFAULT_NAMESPACE;
+}
+if(!this.isValidKey(_18)){
+throw new Error("Invalid namespace given: "+_18);
+}
+var _19=dojox.flash.comm.getKeys(_18);
+if(_19==null||_19=="null"){
+_19="";
+}
+_19=_19.split(",");
+_19.sort();
+return _19;
+},getNamespaces:function(){
+var _1a=dojox.flash.comm.getNamespaces();
+if(_1a==null||_1a=="null"){
+_1a=dojox.storage.DEFAULT_NAMESPACE;
+}
+_1a=_1a.split(",");
+_1a.sort();
 return _1a;
-},getKeys:function(_1b){
+},clear:function(_1b){
 if(!_1b){
 _1b=dojox.storage.DEFAULT_NAMESPACE;
 }
 if(!this.isValidKey(_1b)){
 throw new Error("Invalid namespace given: "+_1b);
 }
-var _1c=dojox.flash.comm.getKeys(_1b);
-if(_1c==null||_1c=="null"){
-_1c="";
+dojox.flash.comm.clear(_1b);
+},remove:function(key,_1c){
+if(!_1c){
+_1c=dojox.storage.DEFAULT_NAMESPACE;
+}
+if(!this.isValidKey(_1c)){
+throw new Error("Invalid namespace given: "+_1c);
+}
+dojox.flash.comm.remove(key,_1c);
+},removeMultiple:function(_1d,_1e){
+if(!this.isValidKeyArray(_1d)){
+dojo.raise("Invalid key array given: "+_1d);
 }
-_1c=_1c.split(",");
-_1c.sort();
-return _1c;
-},getNamespaces:function(){
-var _1d=dojox.flash.comm.getNamespaces();
-if(_1d==null||_1d=="null"){
-_1d=dojox.storage.DEFAULT_NAMESPACE;
-}
-_1d=_1d.split(",");
-_1d.sort();
-return _1d;
-},clear:function(_1e){
 if(!_1e){
 _1e=dojox.storage.DEFAULT_NAMESPACE;
 }
 if(!this.isValidKey(_1e)){
 throw new Error("Invalid namespace given: "+_1e);
 }
-dojox.flash.comm.clear(_1e);
-},remove:function(key,_20){
-if(!_20){
-_20=dojox.storage.DEFAULT_NAMESPACE;
-}
-if(!this.isValidKey(_20)){
-throw new Error("Invalid namespace given: "+_20);
-}
-dojox.flash.comm.remove(key,_20);
-},removeMultiple:function(_21,_22){
-if(!this.isValidKeyArray(_21)){
-dojo.raise("Invalid key array given: "+_21);
-}
-if(!_22){
-_22=dojox.storage.DEFAULT_NAMESPACE;
-}
-if(!this.isValidKey(_22)){
-throw new Error("Invalid namespace given: "+_22);
-}
-var _23=_21.join(",");
-dojox.flash.comm.removeMultiple(_23,_22);
+var _1f=_1d.join(",");
+dojox.flash.comm.removeMultiple(_1f,_1e);
 },isPermanent:function(){
 return true;
 },getMaximumSize:function(){
@@ -194,17 +194,17 @@ return [];
 this._allNamespaces=this.getNamespaces();
 this.initialized=true;
 dojox.storage.manager.loaded();
-},_onStatus:function(_24,key,_26){
+},_onStatus:function(_20,key,_21){
 var ds=dojox.storage;
 var dfo=dojox.flash.obj;
-if(_24==ds.PENDING){
+if(_20==ds.PENDING){
 dfo.center();
 dfo.setVisible(true);
 }else{
 dfo.setVisible(false);
 }
 if(ds._statusHandler){
-ds._statusHandler.call(null,_24,key,null,_26);
+ds._statusHandler.call(null,_20,key,null,_21);
 }
 }});
 dojox.storage.manager.register("dojox.storage.FlashStorageProvider",new dojox.storage.FlashStorageProvider());
diff --git a/dojox/storage/GearsStorageProvider.js b/dojox/storage/GearsStorageProvider.js
index eb88423..8226aa4 100644
--- a/dojox/storage/GearsStorageProvider.js
+++ b/dojox/storage/GearsStorageProvider.js
@@ -43,7 +43,6 @@ dojox.sql("DELETE FROM "+this.TABLE_NAME+" WHERE namespace = ? AND key = ?",_4,_
 dojox.sql("INSERT INTO "+this.TABLE_NAME+" VALUES (?, ?, ?)",_4,_1,_2);
 }
 catch(e){
-
 _3(this.FAILED,_1,e.toString(),_4);
 return;
 }
@@ -81,116 +80,115 @@ _8.push(rs[i].namespace);
 }
 }
 return _8;
-},getKeys:function(_b){
+},getKeys:function(_9){
 this._initStorage();
-_b=_b||this.DEFAULT_NAMESPACE;
-if(!this.isValidKey(_b)){
-throw new Error("Invalid namespace given: "+_b);
+_9=_9||this.DEFAULT_NAMESPACE;
+if(!this.isValidKey(_9)){
+throw new Error("Invalid namespace given: "+_9);
 }
-var rs=dojox.sql("SELECT key FROM "+this.TABLE_NAME+" WHERE namespace = ?",_b);
-var _d=[];
+var rs=dojox.sql("SELECT key FROM "+this.TABLE_NAME+" WHERE namespace = ?",_9);
+var _a=[];
 for(var i=0;i<rs.length;i++){
-_d.push(rs[i].key);
+_a.push(rs[i].key);
 }
-return _d;
-},clear:function(_f){
+return _a;
+},clear:function(_b){
 this._initStorage();
-_f=_f||this.DEFAULT_NAMESPACE;
-if(!this.isValidKey(_f)){
-throw new Error("Invalid namespace given: "+_f);
+_b=_b||this.DEFAULT_NAMESPACE;
+if(!this.isValidKey(_b)){
+throw new Error("Invalid namespace given: "+_b);
 }
-dojox.sql("DELETE FROM "+this.TABLE_NAME+" WHERE namespace = ?",_f);
-},remove:function(key,_11){
+dojox.sql("DELETE FROM "+this.TABLE_NAME+" WHERE namespace = ?",_b);
+},remove:function(_c,_d){
 this._initStorage();
-if(!this.isValidKey(key)){
-throw new Error("Invalid key given: "+key);
+if(!this.isValidKey(_c)){
+throw new Error("Invalid key given: "+_c);
 }
-_11=_11||this.DEFAULT_NAMESPACE;
-if(!this.isValidKey(_11)){
-throw new Error("Invalid namespace given: "+key);
+_d=_d||this.DEFAULT_NAMESPACE;
+if(!this.isValidKey(_d)){
+throw new Error("Invalid namespace given: "+_c);
 }
-dojox.sql("DELETE FROM "+this.TABLE_NAME+" WHERE namespace = ? AND"+" key = ?",_11,key);
-},putMultiple:function(_12,_13,_14,_15){
+dojox.sql("DELETE FROM "+this.TABLE_NAME+" WHERE namespace = ? AND"+" key = ?",_d,_c);
+},putMultiple:function(_e,_f,_10,_11){
 this._initStorage();
-if(!this.isValidKeyArray(_12)||!_13 instanceof Array||_12.length!=_13.length){
-throw new Error("Invalid arguments: keys = ["+_12+"], values = ["+_13+"]");
+if(!this.isValidKeyArray(_e)||!_f instanceof Array||_e.length!=_f.length){
+throw new Error("Invalid arguments: keys = ["+_e+"], values = ["+_f+"]");
 }
-if(_15==null||typeof _15=="undefined"){
-_15=dojox.storage.DEFAULT_NAMESPACE;
+if(_11==null||typeof _11=="undefined"){
+_11=dojox.storage.DEFAULT_NAMESPACE;
 }
-if(!this.isValidKey(_15)){
-throw new Error("Invalid namespace given: "+_15);
+if(!this.isValidKey(_11)){
+throw new Error("Invalid namespace given: "+_11);
 }
-this._statusHandler=_14;
+this._statusHandler=_10;
 try{
 dojox.sql.open();
 dojox.sql.db.execute("BEGIN TRANSACTION");
-var _16="REPLACE INTO "+this.TABLE_NAME+" VALUES (?, ?, ?)";
-for(var i=0;i<_12.length;i++){
-var _18=_13[i];
-if(dojo.isString(_18)){
-_18="string:"+_18;
+var _12="REPLACE INTO "+this.TABLE_NAME+" VALUES (?, ?, ?)";
+for(var i=0;i<_e.length;i++){
+var _13=_f[i];
+if(dojo.isString(_13)){
+_13="string:"+_13;
 }else{
-_18=dojo.toJson(_18);
+_13=dojo.toJson(_13);
 }
-dojox.sql.db.execute(_16,[_15,_12[i],_18]);
+dojox.sql.db.execute(_12,[_11,_e[i],_13]);
 }
 dojox.sql.db.execute("COMMIT TRANSACTION");
 dojox.sql.close();
 }
 catch(e){
-
-if(_14){
-_14(this.FAILED,_12,e.toString(),_15);
+if(_10){
+_10(this.FAILED,_e,e.toString(),_11);
 }
 return;
 }
-if(_14){
-_14(dojox.storage.SUCCESS,_12,null,_15);
+if(_10){
+_10(dojox.storage.SUCCESS,_e,null,_11);
 }
-},getMultiple:function(_19,_1a){
+},getMultiple:function(_14,_15){
 this._initStorage();
-if(!this.isValidKeyArray(_19)){
-throw new ("Invalid key array given: "+_19);
+if(!this.isValidKeyArray(_14)){
+throw new ("Invalid key array given: "+_14);
 }
-if(_1a==null||typeof _1a=="undefined"){
-_1a=dojox.storage.DEFAULT_NAMESPACE;
+if(_15==null||typeof _15=="undefined"){
+_15=dojox.storage.DEFAULT_NAMESPACE;
 }
-if(!this.isValidKey(_1a)){
-throw new Error("Invalid namespace given: "+_1a);
+if(!this.isValidKey(_15)){
+throw new Error("Invalid namespace given: "+_15);
 }
-var _1b="SELECT * FROM "+this.TABLE_NAME+" WHERE namespace = ? AND "+" key = ?";
-var _1c=[];
-for(var i=0;i<_19.length;i++){
-var _1e=dojox.sql(_1b,_1a,_19[i]);
-if(!_1e.length){
-_1c[i]=null;
+var _16="SELECT * FROM "+this.TABLE_NAME+" WHERE namespace = ? AND "+" key = ?";
+var _17=[];
+for(var i=0;i<_14.length;i++){
+var _18=dojox.sql(_16,_15,_14[i]);
+if(!_18.length){
+_17[i]=null;
 }else{
-_1e=_1e[0].value;
-if(dojo.isString(_1e)&&(/^string:/.test(_1e))){
-_1c[i]=_1e.substring("string:".length);
+_18=_18[0].value;
+if(dojo.isString(_18)&&(/^string:/.test(_18))){
+_17[i]=_18.substring("string:".length);
 }else{
-_1c[i]=dojo.fromJson(_1e);
+_17[i]=dojo.fromJson(_18);
 }
 }
 }
-return _1c;
-},removeMultiple:function(_1f,_20){
+return _17;
+},removeMultiple:function(_19,_1a){
 this._initStorage();
-if(!this.isValidKeyArray(_1f)){
-throw new Error("Invalid arguments: keys = ["+_1f+"]");
+if(!this.isValidKeyArray(_19)){
+throw new Error("Invalid arguments: keys = ["+_19+"]");
 }
-if(_20==null||typeof _20=="undefined"){
-_20=dojox.storage.DEFAULT_NAMESPACE;
+if(_1a==null||typeof _1a=="undefined"){
+_1a=dojox.storage.DEFAULT_NAMESPACE;
 }
-if(!this.isValidKey(_20)){
-throw new Error("Invalid namespace given: "+_20);
+if(!this.isValidKey(_1a)){
+throw new Error("Invalid namespace given: "+_1a);
 }
 dojox.sql.open();
 dojox.sql.db.execute("BEGIN TRANSACTION");
-var _21="DELETE FROM "+this.TABLE_NAME+" WHERE namespace = ? AND key = ?";
-for(var i=0;i<_1f.length;i++){
-dojox.sql.db.execute(_21,[_20,_1f[i]]);
+var _1b="DELETE FROM "+this.TABLE_NAME+" WHERE namespace = ? AND key = ?";
+for(var i=0;i<_19.length;i++){
+dojox.sql.db.execute(_1b,[_1a,_19[i]]);
 }
 dojox.sql.db.execute("COMMIT TRANSACTION");
 dojox.sql.close();
@@ -209,11 +207,11 @@ if(this._storageReady){
 return;
 }
 if(!google.gears.factory.hasPermission){
-var _23=null;
-var _24=null;
+var _1c=null;
+var _1d=null;
 var msg="This site would like to use Google Gears to enable "+"enhanced functionality.";
-var _26=google.gears.factory.getPermission(_23,_24,msg);
-if(!_26){
+var _1e=google.gears.factory.getPermission(_1c,_1d,msg);
+if(!_1e){
 throw new Error("You must give permission to use Gears in order to "+"store data");
 }
 }
@@ -222,7 +220,6 @@ dojox.sql("CREATE TABLE IF NOT EXISTS "+this.TABLE_NAME+"( "+" namespace TEXT, "
 dojox.sql("CREATE UNIQUE INDEX IF NOT EXISTS namespace_key_index"+" ON "+this.TABLE_NAME+" (namespace, key)");
 }
 catch(e){
-
 throw new Error("Unable to create storage tables for Gears in "+"Dojo Storage");
 }
 this._storageReady=true;
diff --git a/dojox/storage/Provider.js b/dojox/storage/Provider.js
index 4275672..874b13c 100644
--- a/dojox/storage/Provider.js
+++ b/dojox/storage/Provider.js
@@ -35,21 +35,21 @@ console.warn("dojox.storage.getMaximumSize not implemented");
 for(var i=0;i<_d.length;i++){
 dojox.storage.put(_d[i],_e[i],_f,_10);
 }
-},getMultiple:function(_12,_13){
-var _14=[];
-for(var i=0;i<_12.length;i++){
-_14.push(dojox.storage.get(_12[i],_13));
+},getMultiple:function(_11,_12){
+var _13=[];
+for(var i=0;i<_11.length;i++){
+_13.push(dojox.storage.get(_11[i],_12));
 }
-return _14;
-},removeMultiple:function(_16,_17){
-for(var i=0;i<_16.length;i++){
-dojox.storage.remove(_16[i],_17);
+return _13;
+},removeMultiple:function(_14,_15){
+for(var i=0;i<_14.length;i++){
+dojox.storage.remove(_14[i],_15);
 }
-},isValidKeyArray:function(_19){
-if(_19===null||_19===undefined||!dojo.isArray(_19)){
+},isValidKeyArray:function(_16){
+if(_16===null||_16===undefined||!dojo.isArray(_16)){
 return false;
 }
-return !dojo.some(_19,function(key){
+return !dojo.some(_16,function(key){
 return !this.isValidKey(key);
 },this);
 },hasSettingsUI:function(){
@@ -58,11 +58,11 @@ return false;
 console.warn("dojox.storage.showSettingsUI not implemented");
 },hideSettingsUI:function(){
 console.warn("dojox.storage.hideSettingsUI not implemented");
-},isValidKey:function(_1b){
-if(_1b===null||_1b===undefined){
+},isValidKey:function(_17){
+if(_17===null||_17===undefined){
 return false;
 }
-return /^[0-9A-Za-z_]*$/.test(_1b);
+return /^[0-9A-Za-z_]*$/.test(_17);
 },getResourceList:function(){
 return [];
 }});
diff --git a/dojox/storage/WhatWGStorageProvider.js b/dojox/storage/WhatWGStorageProvider.js
index 8c12a83..d44118c 100644
--- a/dojox/storage/WhatWGStorageProvider.js
+++ b/dojox/storage/WhatWGStorageProvider.js
@@ -14,12 +14,12 @@ dojo.declare("dojox.storage.WhatWGStorageProvider",[dojox.storage.Provider],{ini
 if(dojo.config["disableWhatWGStorage"]==true){
 return;
 }
-this._domain=this._getDomain();
+this._domain=location.hostname;
 this.initialized=true;
 dojox.storage.manager.loaded();
 },isAvailable:function(){
 try{
-var _1=globalStorage[this._getDomain()];
+var _1=globalStorage[location.hostname];
 }
 catch(e){
 this._available=false;
@@ -77,60 +77,60 @@ var _e={};
 var _f=globalStorage[this._domain];
 var _10=/^__([^_]*)_/;
 for(var i=0;i<_f.length;i++){
-var _12=_f.key(i);
-if(_10.test(_12)==true){
-var _13=_12.match(_10)[1];
-if(typeof _e[_13]=="undefined"){
-_e[_13]=true;
-_d.push(_13);
+var _11=_f.key(i);
+if(_10.test(_11)==true){
+var _12=_11.match(_10)[1];
+if(typeof _e[_12]=="undefined"){
+_e[_12]=true;
+_d.push(_12);
 }
 }
 }
 return _d;
-},getKeys:function(_14){
-_14=_14||this.DEFAULT_NAMESPACE;
-if(this.isValidKey(_14)==false){
-throw new Error("Invalid namespace given: "+_14);
-}
-var _15;
-if(_14==this.DEFAULT_NAMESPACE){
-_15=new RegExp("^([^_]{2}.*)$");
+},getKeys:function(_13){
+_13=_13||this.DEFAULT_NAMESPACE;
+if(this.isValidKey(_13)==false){
+throw new Error("Invalid namespace given: "+_13);
+}
+var _14;
+if(_13==this.DEFAULT_NAMESPACE){
+_14=new RegExp("^([^_]{2}.*)$");
 }else{
-_15=new RegExp("^__"+_14+"_(.*)$");
-}
-var _16=globalStorage[this._domain];
-var _17=[];
-for(var i=0;i<_16.length;i++){
-var _19=_16.key(i);
-if(_15.test(_19)==true){
-_19=_19.match(_15)[1];
-_17.push(_19);
-}
-}
-return _17;
-},clear:function(_1a){
-_1a=_1a||this.DEFAULT_NAMESPACE;
-if(this.isValidKey(_1a)==false){
-throw new Error("Invalid namespace given: "+_1a);
-}
-var _1b;
-if(_1a==this.DEFAULT_NAMESPACE){
-_1b=new RegExp("^[^_]{2}");
+_14=new RegExp("^__"+_13+"_(.*)$");
+}
+var _15=globalStorage[this._domain];
+var _16=[];
+for(var i=0;i<_15.length;i++){
+var _17=_15.key(i);
+if(_14.test(_17)==true){
+_17=_17.match(_14)[1];
+_16.push(_17);
+}
+}
+return _16;
+},clear:function(_18){
+_18=_18||this.DEFAULT_NAMESPACE;
+if(this.isValidKey(_18)==false){
+throw new Error("Invalid namespace given: "+_18);
+}
+var _19;
+if(_18==this.DEFAULT_NAMESPACE){
+_19=new RegExp("^[^_]{2}");
 }else{
-_1b=new RegExp("^__"+_1a+"_");
+_19=new RegExp("^__"+_18+"_");
 }
-var _1c=globalStorage[this._domain];
-var _1d=[];
-for(var i=0;i<_1c.length;i++){
-if(_1b.test(_1c.key(i))==true){
-_1d[_1d.length]=_1c.key(i);
+var _1a=globalStorage[this._domain];
+var _1b=[];
+for(var i=0;i<_1a.length;i++){
+if(_19.test(_1a.key(i))==true){
+_1b[_1b.length]=_1a.key(i);
 }
 }
-dojo.forEach(_1d,dojo.hitch(_1c,"removeItem"));
-},remove:function(key,_20){
-key=this.getFullKey(key,_20);
-var _21=globalStorage[this._domain];
-_21.removeItem(key);
+dojo.forEach(_1b,dojo.hitch(_1a,"removeItem"));
+},remove:function(key,_1c){
+key=this.getFullKey(key,_1c);
+var _1d=globalStorage[this._domain];
+_1d.removeItem(key);
 },isPermanent:function(){
 return true;
 },getMaximumSize:function(){
@@ -141,18 +141,16 @@ return false;
 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,_23){
-_23=_23||this.DEFAULT_NAMESPACE;
-if(this.isValidKey(_23)==false){
-throw new Error("Invalid namespace given: "+_23);
+},getFullKey:function(key,_1e){
+_1e=_1e||this.DEFAULT_NAMESPACE;
+if(this.isValidKey(_1e)==false){
+throw new Error("Invalid namespace given: "+_1e);
 }
-if(_23==this.DEFAULT_NAMESPACE){
+if(_1e==this.DEFAULT_NAMESPACE){
 return key;
 }else{
-return "__"+_23+"_"+key;
+return "__"+_1e+"_"+key;
 }
-},_getDomain:function(){
-return ((location.hostname=="localhost"&&dojo.isFF&&dojo.isFF<3)?"localhost.localdomain":location.hostname);
 }});
 dojox.storage.manager.register("dojox.storage.WhatWGStorageProvider",new dojox.storage.WhatWGStorageProvider());
 }
diff --git a/dojox/storage/manager.js b/dojox/storage/manager.js
index e3f8a6f..1e97f59 100644
--- a/dojox/storage/manager.js
+++ b/dojox/storage/manager.js
@@ -57,15 +57,15 @@ this.available=true;
 this.isAvailable=function(){
 return this.available;
 };
-this.addOnLoad=function(_7){
-this._onLoadListeners.push(_7);
+this.addOnLoad=function(_6){
+this._onLoadListeners.push(_6);
 if(this.isInitialized()){
 this._fireLoaded();
 }
 };
-this.removeOnLoad=function(_8){
+this.removeOnLoad=function(_7){
 for(var i=0;i<this._onLoadListeners.length;i++){
-if(_8==this._onLoadListeners[i]){
+if(_7==this._onLoadListeners[i]){
 this._onLoadListeners=this._onLoadListeners.splice(i,1);
 break;
 }
@@ -78,14 +78,14 @@ return false;
 return this._initialized;
 }
 };
-this.supportsProvider=function(_a){
+this.supportsProvider=function(_8){
 try{
-var _b=eval("new "+_a+"()");
-var _c=_b.isAvailable();
-if(!_c){
+var _9=eval("new "+_8+"()");
+var _a=_9.isAvailable();
+if(!_a){
 return false;
 }
-return _c;
+return _a;
 }
 catch(e){
 return false;
@@ -103,16 +103,15 @@ try{
 i();
 }
 catch(e){
-
 }
 });
 };
 this.getResourceList=function(){
-var _e=[];
-dojo.forEach(dojox.storage.manager.providers,function(_f){
-_e=_e.concat(_f.getResourceList());
+var _b=[];
+dojo.forEach(dojox.storage.manager.providers,function(_c){
+_b=_b.concat(_c.getResourceList());
 });
-return _e;
+return _b;
 };
 };
 }
diff --git a/dojox/string/BidiComplex.js b/dojox/string/BidiComplex.js
index fc8f430..627e2cf 100644
--- a/dojox/string/BidiComplex.js
+++ b/dojox/string/BidiComplex.js
@@ -26,221 +26,221 @@ var _7="‪"+_4;
 var _8=1;
 dojo.forEach(_6,function(n){
 if(n!=null){
-var _a=_7.substring(0,n+_8);
-var _b=_7.substring(n+_8,_7.length);
-_7=_a+"‎"+_b;
+var _9=_7.substring(0,n+_8);
+var _a=_7.substring(n+_8,_7.length);
+_7=_9+"‎"+_a;
 _8++;
 }
 });
 return _7;
 };
-dojox.string.BidiComplex.stripSpecialCharacters=function(_c){
-return _c.replace(/[\u200E\u200F\u202A-\u202E]/g,"");
+dojox.string.BidiComplex.stripSpecialCharacters=function(_b){
+return _b.replace(/[\u200E\u200F\u202A-\u202E]/g,"");
 };
-dojox.string.BidiComplex._ceKeyDown=function(_d){
-var _e=dojo.isIE?_d.srcElement:_d.target;
-_1=_e.value;
+dojox.string.BidiComplex._ceKeyDown=function(_c){
+var _d=dojo.isIE?_c.srcElement:_c.target;
+_1=_d.value;
 };
-dojox.string.BidiComplex._ceKeyUp=function(_f){
-var LRM="‎";
-var _11=dojo.isIE?_f.srcElement:_f.target;
-var _12=_11.value;
-var _13=_f.keyCode;
-if((_13==dojo.keys.HOME)||(_13==dojo.keys.END)||(_13==dojo.keys.SHIFT)){
+dojox.string.BidiComplex._ceKeyUp=function(_e){
+var _f="‎";
+var _10=dojo.isIE?_e.srcElement:_e.target;
+var _11=_10.value;
+var _12=_e.keyCode;
+if((_12==dojo.keys.HOME)||(_12==dojo.keys.END)||(_12==dojo.keys.SHIFT)){
 return;
 }
-var _14,_15;
-var _16=dojox.string.BidiComplex._getCaretPos(_f,_11);
-if(_16){
-_14=_16[0];
-_15=_16[1];
+var _13,_14;
+var _15=dojox.string.BidiComplex._getCaretPos(_e,_10);
+if(_15){
+_13=_15[0];
+_14=_15[1];
 }
 if(dojo.isIE){
-var _17=_14,_18=_15;
-if(_13==dojo.keys.LEFT_ARROW){
-if((_12.charAt(_15-1)==LRM)&&(_14==_15)){
-dojox.string.BidiComplex._setSelectedRange(_11,_14-1,_15-1);
+var _16=_13,_17=_14;
+if(_12==dojo.keys.LEFT_ARROW){
+if((_11.charAt(_14-1)==_f)&&(_13==_14)){
+dojox.string.BidiComplex._setSelectedRange(_10,_13-1,_14-1);
 }
 return;
 }
-if(_13==dojo.keys.RIGHT_ARROW){
-if(_12.charAt(_15-1)==LRM){
-_18=_15+1;
-if(_14==_15){
+if(_12==dojo.keys.RIGHT_ARROW){
+if(_11.charAt(_14-1)==_f){
 _17=_14+1;
+if(_13==_14){
+_16=_13+1;
 }
 }
-dojox.string.BidiComplex._setSelectedRange(_11,_17,_18);
+dojox.string.BidiComplex._setSelectedRange(_10,_16,_17);
 return;
 }
 }else{
-if(_13==dojo.keys.LEFT_ARROW){
-if(_12.charAt(_15-1)==LRM){
-dojox.string.BidiComplex._setSelectedRange(_11,_14-1,_15-1);
+if(_12==dojo.keys.LEFT_ARROW){
+if(_11.charAt(_14-1)==_f){
+dojox.string.BidiComplex._setSelectedRange(_10,_13-1,_14-1);
 }
 return;
 }
-if(_13==dojo.keys.RIGHT_ARROW){
-if(_12.charAt(_15-1)==LRM){
-dojox.string.BidiComplex._setSelectedRange(_11,_14+1,_15+1);
+if(_12==dojo.keys.RIGHT_ARROW){
+if(_11.charAt(_14-1)==_f){
+dojox.string.BidiComplex._setSelectedRange(_10,_13+1,_14+1);
 }
 return;
 }
 }
-var _19=dojox.string.BidiComplex.createDisplayString(_12,_11.alt);
-if(_12!=_19){
-window.status=_12+" c="+_15;
-_11.value=_19;
-if((_13==dojo.keys.DELETE)&&(_19.charAt(_15)==LRM)){
-_11.value=_19.substring(0,_15)+_19.substring(_15+2,_19.length);
+var _18=dojox.string.BidiComplex.createDisplayString(_11,_10.alt);
+if(_11!=_18){
+window.status=_11+" c="+_14;
+_10.value=_18;
+if((_12==dojo.keys.DELETE)&&(_18.charAt(_14)==_f)){
+_10.value=_18.substring(0,_14)+_18.substring(_14+2,_18.length);
 }
-if(_13==dojo.keys.DELETE){
-dojox.string.BidiComplex._setSelectedRange(_11,_14,_15);
+if(_12==dojo.keys.DELETE){
+dojox.string.BidiComplex._setSelectedRange(_10,_13,_14);
 }else{
-if(_13==dojo.keys.BACKSPACE){
-if((_1.length>=_15)&&(_1.charAt(_15-1)==LRM)){
-dojox.string.BidiComplex._setSelectedRange(_11,_14-1,_15-1);
+if(_12==dojo.keys.BACKSPACE){
+if((_1.length>=_14)&&(_1.charAt(_14-1)==_f)){
+dojox.string.BidiComplex._setSelectedRange(_10,_13-1,_14-1);
 }else{
-dojox.string.BidiComplex._setSelectedRange(_11,_14,_15);
+dojox.string.BidiComplex._setSelectedRange(_10,_13,_14);
 }
 }else{
-if(_11.value.charAt(_15)!=LRM){
-dojox.string.BidiComplex._setSelectedRange(_11,_14+1,_15+1);
+if(_10.value.charAt(_14)!=_f){
+dojox.string.BidiComplex._setSelectedRange(_10,_13+1,_14+1);
 }
 }
 }
 }
 };
-dojox.string.BidiComplex._processCopy=function(_1a,_1b,_1c){
-if(_1b==null){
+dojox.string.BidiComplex._processCopy=function(_19,_1a,_1b){
+if(_1a==null){
 if(dojo.isIE){
-var _1d=document.selection.createRange();
-_1b=_1d.text;
+var _1c=document.selection.createRange();
+_1a=_1c.text;
 }else{
-_1b=_1a.value.substring(_1a.selectionStart,_1a.selectionEnd);
+_1a=_19.value.substring(_19.selectionStart,_19.selectionEnd);
 }
 }
-var _1e=dojox.string.BidiComplex.stripSpecialCharacters(_1b);
+var _1d=dojox.string.BidiComplex.stripSpecialCharacters(_1a);
 if(dojo.isIE){
-window.clipboardData.setData("Text",_1e);
+window.clipboardData.setData("Text",_1d);
 }
 return true;
 };
-dojox.string.BidiComplex._ceCopyText=function(_1f){
+dojox.string.BidiComplex._ceCopyText=function(_1e){
 if(dojo.isIE){
-_1f.returnValue=false;
+_1e.returnValue=false;
 }
-return dojox.string.BidiComplex._processCopy(_1f,null,false);
+return dojox.string.BidiComplex._processCopy(_1e,null,false);
 };
-dojox.string.BidiComplex._ceCutText=function(_20){
-var ret=dojox.string.BidiComplex._processCopy(_20,null,false);
+dojox.string.BidiComplex._ceCutText=function(_1f){
+var ret=dojox.string.BidiComplex._processCopy(_1f,null,false);
 if(!ret){
 return false;
 }
 if(dojo.isIE){
 document.selection.clear();
 }else{
-var _22=_20.selectionStart;
-_20.value=_20.value.substring(0,_22)+_20.value.substring(_20.selectionEnd);
-_20.setSelectionRange(_22,_22);
+var _20=_1f.selectionStart;
+_1f.value=_1f.value.substring(0,_20)+_1f.value.substring(_1f.selectionEnd);
+_1f.setSelectionRange(_20,_20);
 }
 return true;
 };
-dojox.string.BidiComplex._getCaretPos=function(_23,_24){
+dojox.string.BidiComplex._getCaretPos=function(_21,_22){
 if(dojo.isIE){
-var _25=0,_26=document.selection.createRange().duplicate(),_27=_26.duplicate(),_28=_26.text.length;
-if(_24.type=="textarea"){
-_27.moveToElementText(_24);
+var _23=0,_24=document.selection.createRange().duplicate(),_25=_24.duplicate(),_26=_24.text.length;
+if(_22.type=="textarea"){
+_25.moveToElementText(_22);
 }else{
-_27.expand("textedit");
+_25.expand("textedit");
 }
-while(_26.compareEndPoints("StartToStart",_27)>0){
-_26.moveStart("character",-1);
-++_25;
+while(_24.compareEndPoints("StartToStart",_25)>0){
+_24.moveStart("character",-1);
+++_23;
 }
-return [_25,_25+_28];
+return [_23,_23+_26];
 }
-return [_23.target.selectionStart,_23.target.selectionEnd];
+return [_21.target.selectionStart,_21.target.selectionEnd];
 };
-dojox.string.BidiComplex._setSelectedRange=function(_29,_2a,_2b){
+dojox.string.BidiComplex._setSelectedRange=function(_27,_28,_29){
 if(dojo.isIE){
-var _2c=_29.createTextRange();
-if(_2c){
-if(_29.type=="textarea"){
-_2c.moveToElementText(_29);
+var _2a=_27.createTextRange();
+if(_2a){
+if(_27.type=="textarea"){
+_2a.moveToElementText(_27);
 }else{
-_2c.expand("textedit");
+_2a.expand("textedit");
 }
-_2c.collapse();
-_2c.moveEnd("character",_2b);
-_2c.moveStart("character",_2a);
-_2c.select();
+_2a.collapse();
+_2a.moveEnd("character",_29);
+_2a.moveStart("character",_28);
+_2a.select();
 }
 }else{
-_29.selectionStart=_2a;
-_29.selectionEnd=_2b;
+_27.selectionStart=_28;
+_27.selectionEnd=_29;
 }
 };
-var _2d=function(c){
+var _2b=function(c){
 return (c>="0"&&c<="9")||(c>"ÿ");
 };
-var _2f=function(c){
+var _2c=function(c){
 return (c>="A"&&c<="Z")||(c>="a"&&c<="z");
 };
-var _31=function(_32,i,_34){
+var _2d=function(_2e,i,_2f){
 while(i>0){
-if(i==_34){
+if(i==_2f){
 return false;
 }
 i--;
-if(_2d(_32.charAt(i))){
+if(_2b(_2e.charAt(i))){
 return true;
 }
-if(_2f(_32.charAt(i))){
+if(_2c(_2e.charAt(i))){
 return false;
 }
 }
 return false;
 };
-dojox.string.BidiComplex._parse=function(str,_36){
-var _37=-1,_38=[];
-var _39={FILE_PATH:"/\\:.",URL:"/:.?=&#",XPATH:"/\\:.<>=[]",EMAIL:"<>@.,;"}[_36];
-switch(_36){
+dojox.string.BidiComplex._parse=function(str,_30){
+var _31=-1,_32=[];
+var _33={FILE_PATH:"/\\:.",URL:"/:.?=&#",XPATH:"/\\:.<>=[]",EMAIL:"<>@.,;"}[_30];
+switch(_30){
 case "FILE_PATH":
 case "URL":
 case "XPATH":
 dojo.forEach(str,function(ch,i){
-if(_39.indexOf(ch)>=0&&_31(str,i,_37)){
-_37=i;
-_38.push(i);
+if(_33.indexOf(ch)>=0&&_2d(str,i,_31)){
+_31=i;
+_32.push(i);
 }
 });
 break;
 case "EMAIL":
-var _3c=false;
+var _34=false;
 dojo.forEach(str,function(ch,i){
 if(ch=="\""){
-if(_31(str,i,_37)){
-_37=i;
-_38.push(i);
+if(_2d(str,i,_31)){
+_31=i;
+_32.push(i);
 }
 i++;
 var i1=str.indexOf("\"",i);
 if(i1>=i){
 i=i1;
 }
-if(_31(str,i,_37)){
-_37=i;
-_38.push(i);
+if(_2d(str,i,_31)){
+_31=i;
+_32.push(i);
 }
 }
-if(_39.indexOf(ch)>=0&&_31(str,i,_37)){
-_37=i;
-_38.push(i);
+if(_33.indexOf(ch)>=0&&_2d(str,i,_31)){
+_31=i;
+_32.push(i);
 }
 });
 }
-return _38;
+return _32;
 };
 })();
 }
diff --git a/dojox/string/Builder.js b/dojox/string/Builder.js
index 363680b..15f69ca 100644
--- a/dojox/string/Builder.js
+++ b/dojox/string/Builder.js
@@ -13,31 +13,31 @@ var b="";
 this.length=0;
 this.append=function(s){
 if(arguments.length>1){
-var _4="",l=arguments.length;
+var _2="",l=arguments.length;
 switch(l){
 case 9:
-_4=""+arguments[8]+_4;
+_2=""+arguments[8]+_2;
 case 8:
-_4=""+arguments[7]+_4;
+_2=""+arguments[7]+_2;
 case 7:
-_4=""+arguments[6]+_4;
+_2=""+arguments[6]+_2;
 case 6:
-_4=""+arguments[5]+_4;
+_2=""+arguments[5]+_2;
 case 5:
-_4=""+arguments[4]+_4;
+_2=""+arguments[4]+_2;
 case 4:
-_4=""+arguments[3]+_4;
+_2=""+arguments[3]+_2;
 case 3:
-_4=""+arguments[2]+_4;
+_2=""+arguments[2]+_2;
 case 2:
-b+=""+arguments[0]+arguments[1]+_4;
+b+=""+arguments[0]+arguments[1]+_2;
 break;
 default:
 var i=0;
 while(i<arguments.length){
-_4+=arguments[i++];
+_2+=arguments[i++];
 }
-b+=_4;
+b+=_2;
 }
 }else{
 b+=s;
@@ -48,35 +48,35 @@ return this;
 this.concat=function(s){
 return this.append.apply(this,arguments);
 };
-this.appendArray=function(_8){
-return this.append.apply(this,_8);
+this.appendArray=function(_3){
+return this.append.apply(this,_3);
 };
 this.clear=function(){
 b="";
 this.length=0;
 return this;
 };
-this.replace=function(_9,_a){
-b=b.replace(_9,_a);
+this.replace=function(_4,_5){
+b=b.replace(_4,_5);
 this.length=b.length;
 return this;
 };
-this.remove=function(_b,_c){
-if(_c===undefined){
-_c=b.length;
+this.remove=function(_6,_7){
+if(_7===undefined){
+_7=b.length;
 }
-if(_c==0){
+if(_7==0){
 return this;
 }
-b=b.substr(0,_b)+b.substr(_b+_c);
+b=b.substr(0,_6)+b.substr(_6+_7);
 this.length=b.length;
 return this;
 };
-this.insert=function(_d,_e){
-if(_d==0){
-b=_e+b;
+this.insert=function(_8,_9){
+if(_8==0){
+b=_9+b;
 }else{
-b=b.slice(0,_d)+_e+b.slice(_d);
+b=b.slice(0,_8)+_9+b.slice(_8);
 }
 this.length=b.length;
 return this;
diff --git a/dojox/string/sprintf.js b/dojox/string/sprintf.js
index 7c60252..2e3d5d0 100644
--- a/dojox/string/sprintf.js
+++ b/dojox/string/sprintf.js
@@ -13,268 +13,268 @@ dojox.string.sprintf=function(_1,_2){
 for(var _3=[],i=1;i<arguments.length;i++){
 _3.push(arguments[i]);
 }
-var _5=new dojox.string.sprintf.Formatter(_1);
-return _5.format.apply(_5,_3);
+var _4=new dojox.string.sprintf.Formatter(_1);
+return _4.format.apply(_4,_3);
 };
-dojox.string.sprintf.Formatter=function(_6){
-var _7=[];
+dojox.string.sprintf.Formatter=function(_5){
+var _6=[];
 this._mapped=false;
-this._format=_6;
-this._tokens=dojox.string.tokenize(_6,this._re,this._parseDelim,this);
+this._format=_5;
+this._tokens=dojox.string.tokenize(_5,this._re,this._parseDelim,this);
 };
-dojo.extend(dojox.string.sprintf.Formatter,{_re:/\%(?:\(([\w_]+)\)|([1-9]\d*)\$)?([0 +\-\#]*)(\*|\d+)?(\.)?(\*|\d+)?[hlL]?([\%scdeEfFgGiouxX])/g,_parseDelim:function(_8,_9,_a,_b,_c,_d,_e){
-if(_8){
+dojo.extend(dojox.string.sprintf.Formatter,{_re:/\%(?:\(([\w_]+)\)|([1-9]\d*)\$)?([0 +\-\#]*)(\*|\d+)?(\.)?(\*|\d+)?[hlL]?([\%scdeEfFgGiouxX])/g,_parseDelim:function(_7,_8,_9,_a,_b,_c,_d){
+if(_7){
 this._mapped=true;
 }
-return {mapping:_8,intmapping:_9,flags:_a,_minWidth:_b,period:_c,_precision:_d,specifier:_e};
-},_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(_f){
-if(!isNaN(_f.arg)){
-var num=parseInt(_f.arg);
-if(num<0||num>127){
+return {mapping:_7,intmapping:_8,flags:_9,_minWidth:_a,period:_b,_precision:_c,specifier:_d};
+},_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(_e){
+if(!isNaN(_e.arg)){
+var _f=parseInt(_e.arg);
+if(_f<0||_f>127){
 throw new Error("invalid character code passed to %c in sprintf");
 }
-_f.arg=isNaN(num)?""+num:String.fromCharCode(num);
+_e.arg=isNaN(_f)?""+_f:String.fromCharCode(_f);
 }
-}},s:{setMaxWidth:function(_11){
-_11.maxWidth=(_11.period==".")?_11.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(_12){
-if(this._mapped&&typeof _12!="object"){
+}},s:{setMaxWidth:function(_10){
+_10.maxWidth=(_10.period==".")?_10.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(_11){
+if(this._mapped&&typeof _11!="object"){
 throw new Error("format requires a mapping");
 }
 var str="";
-var _14=0;
-for(var i=0,_16;i<this._tokens.length;i++){
-_16=this._tokens[i];
-if(typeof _16=="string"){
-str+=_16;
+var _12=0;
+for(var i=0,_13;i<this._tokens.length;i++){
+_13=this._tokens[i];
+if(typeof _13=="string"){
+str+=_13;
 }else{
 if(this._mapped){
-if(typeof _12[_16.mapping]=="undefined"){
-throw new Error("missing key "+_16.mapping);
+if(typeof _11[_13.mapping]=="undefined"){
+throw new Error("missing key "+_13.mapping);
 }
-_16.arg=_12[_16.mapping];
+_13.arg=_11[_13.mapping];
 }else{
-if(_16.intmapping){
-var _14=parseInt(_16.intmapping)-1;
+if(_13.intmapping){
+var _12=parseInt(_13.intmapping)-1;
 }
-if(_14>=arguments.length){
+if(_12>=arguments.length){
 throw new Error("got "+arguments.length+" printf arguments, insufficient for '"+this._format+"'");
 }
-_16.arg=arguments[_14++];
-}
-if(!_16.compiled){
-_16.compiled=true;
-_16.sign="";
-_16.zeroPad=false;
-_16.rightJustify=false;
-_16.alternative=false;
-var _17={};
-for(var fi=_16.flags.length;fi--;){
-var _19=_16.flags.charAt(fi);
-_17[_19]=true;
-switch(_19){
+_13.arg=arguments[_12++];
+}
+if(!_13.compiled){
+_13.compiled=true;
+_13.sign="";
+_13.zeroPad=false;
+_13.rightJustify=false;
+_13.alternative=false;
+var _14={};
+for(var fi=_13.flags.length;fi--;){
+var _15=_13.flags.charAt(fi);
+_14[_15]=true;
+switch(_15){
 case " ":
-_16.sign=" ";
+_13.sign=" ";
 break;
 case "+":
-_16.sign="+";
+_13.sign="+";
 break;
 case "0":
-_16.zeroPad=(_17["-"])?false:true;
+_13.zeroPad=(_14["-"])?false:true;
 break;
 case "-":
-_16.rightJustify=true;
-_16.zeroPad=false;
+_13.rightJustify=true;
+_13.zeroPad=false;
 break;
 case "#":
-_16.alternative=true;
+_13.alternative=true;
 break;
 default:
-throw Error("bad formatting flag '"+_16.flags.charAt(fi)+"'");
-}
-}
-_16.minWidth=(_16._minWidth)?parseInt(_16._minWidth):0;
-_16.maxWidth=-1;
-_16.toUpper=false;
-_16.isUnsigned=false;
-_16.isInt=false;
-_16.isDouble=false;
-_16.precision=1;
-if(_16.period=="."){
-if(_16._precision){
-_16.precision=parseInt(_16._precision);
+throw Error("bad formatting flag '"+_13.flags.charAt(fi)+"'");
+}
+}
+_13.minWidth=(_13._minWidth)?parseInt(_13._minWidth):0;
+_13.maxWidth=-1;
+_13.toUpper=false;
+_13.isUnsigned=false;
+_13.isInt=false;
+_13.isDouble=false;
+_13.precision=1;
+if(_13.period=="."){
+if(_13._precision){
+_13.precision=parseInt(_13._precision);
 }else{
-_16.precision=0;
+_13.precision=0;
 }
 }
-var _1a=this._specifiers[_16.specifier];
-if(typeof _1a=="undefined"){
-throw new Error("unexpected specifier '"+_16.specifier+"'");
+var _16=this._specifiers[_13.specifier];
+if(typeof _16=="undefined"){
+throw new Error("unexpected specifier '"+_13.specifier+"'");
 }
-if(_1a.extend){
-dojo.mixin(_1a,this._specifiers[_1a.extend]);
-delete _1a.extend;
+if(_16.extend){
+dojo.mixin(_16,this._specifiers[_16.extend]);
+delete _16.extend;
 }
-dojo.mixin(_16,_1a);
+dojo.mixin(_13,_16);
 }
-if(typeof _16.setArg=="function"){
-_16.setArg(_16);
+if(typeof _13.setArg=="function"){
+_13.setArg(_13);
 }
-if(typeof _16.setMaxWidth=="function"){
-_16.setMaxWidth(_16);
+if(typeof _13.setMaxWidth=="function"){
+_13.setMaxWidth(_13);
 }
-if(_16._minWidth=="*"){
+if(_13._minWidth=="*"){
 if(this._mapped){
 throw new Error("* width not supported in mapped formats");
 }
-_16.minWidth=parseInt(arguments[_14++]);
-if(isNaN(_16.minWidth)){
-throw new Error("the argument for * width at position "+_14+" is not a number in "+this._format);
+_13.minWidth=parseInt(arguments[_12++]);
+if(isNaN(_13.minWidth)){
+throw new Error("the argument for * width at position "+_12+" is not a number in "+this._format);
 }
-if(_16.minWidth<0){
-_16.rightJustify=true;
-_16.minWidth=-_16.minWidth;
+if(_13.minWidth<0){
+_13.rightJustify=true;
+_13.minWidth=-_13.minWidth;
 }
 }
-if(_16._precision=="*"&&_16.period=="."){
+if(_13._precision=="*"&&_13.period=="."){
 if(this._mapped){
 throw new Error("* precision not supported in mapped formats");
 }
-_16.precision=parseInt(arguments[_14++]);
-if(isNaN(_16.precision)){
-throw Error("the argument for * precision at position "+_14+" is not a number in "+this._format);
+_13.precision=parseInt(arguments[_12++]);
+if(isNaN(_13.precision)){
+throw Error("the argument for * precision at position "+_12+" is not a number in "+this._format);
 }
-if(_16.precision<0){
-_16.precision=1;
-_16.period="";
+if(_13.precision<0){
+_13.precision=1;
+_13.period="";
 }
 }
-if(_16.isInt){
-if(_16.period=="."){
-_16.zeroPad=false;
+if(_13.isInt){
+if(_13.period=="."){
+_13.zeroPad=false;
 }
-this.formatInt(_16);
+this.formatInt(_13);
 }else{
-if(_16.isDouble){
-if(_16.period!="."){
-_16.precision=6;
+if(_13.isDouble){
+if(_13.period!="."){
+_13.precision=6;
 }
-this.formatDouble(_16);
+this.formatDouble(_13);
 }
 }
-this.fitField(_16);
-str+=""+_16.arg;
+this.fitField(_13);
+str+=""+_13.arg;
 }
 }
 return str;
-},_zeros10:"0000000000",_spaces10:"          ",formatInt:function(_1b){
-var i=parseInt(_1b.arg);
+},_zeros10:"0000000000",_spaces10:"          ",formatInt:function(_17){
+var i=parseInt(_17.arg);
 if(!isFinite(i)){
-if(typeof _1b.arg!="number"){
-throw new Error("format argument '"+_1b.arg+"' not an integer; parseInt returned "+i);
+if(typeof _17.arg!="number"){
+throw new Error("format argument '"+_17.arg+"' not an integer; parseInt returned "+i);
 }
 i=0;
 }
-if(i<0&&(_1b.isUnsigned||_1b.base!=10)){
+if(i<0&&(_17.isUnsigned||_17.base!=10)){
 i=4294967295+i+1;
 }
 if(i<0){
-_1b.arg=(-i).toString(_1b.base);
-this.zeroPad(_1b);
-_1b.arg="-"+_1b.arg;
+_17.arg=(-i).toString(_17.base);
+this.zeroPad(_17);
+_17.arg="-"+_17.arg;
 }else{
-_1b.arg=i.toString(_1b.base);
-if(!i&&!_1b.precision){
-_1b.arg="";
+_17.arg=i.toString(_17.base);
+if(!i&&!_17.precision){
+_17.arg="";
 }else{
-this.zeroPad(_1b);
+this.zeroPad(_17);
 }
-if(_1b.sign){
-_1b.arg=_1b.sign+_1b.arg;
+if(_17.sign){
+_17.arg=_17.sign+_17.arg;
 }
 }
-if(_1b.base==16){
-if(_1b.alternative){
-_1b.arg="0x"+_1b.arg;
+if(_17.base==16){
+if(_17.alternative){
+_17.arg="0x"+_17.arg;
 }
-_1b.arg=_1b.toUpper?_1b.arg.toUpperCase():_1b.arg.toLowerCase();
+_17.arg=_17.toUpper?_17.arg.toUpperCase():_17.arg.toLowerCase();
 }
-if(_1b.base==8){
-if(_1b.alternative&&_1b.arg.charAt(0)!="0"){
-_1b.arg="0"+_1b.arg;
+if(_17.base==8){
+if(_17.alternative&&_17.arg.charAt(0)!="0"){
+_17.arg="0"+_17.arg;
 }
 }
-},formatDouble:function(_1d){
-var f=parseFloat(_1d.arg);
+},formatDouble:function(_18){
+var f=parseFloat(_18.arg);
 if(!isFinite(f)){
-if(typeof _1d.arg!="number"){
-throw new Error("format argument '"+_1d.arg+"' not a float; parseFloat returned "+f);
+if(typeof _18.arg!="number"){
+throw new Error("format argument '"+_18.arg+"' not a float; parseFloat returned "+f);
 }
 f=0;
 }
-switch(_1d.doubleNotation){
+switch(_18.doubleNotation){
 case "e":
-_1d.arg=f.toExponential(_1d.precision);
+_18.arg=f.toExponential(_18.precision);
 break;
 case "f":
-_1d.arg=f.toFixed(_1d.precision);
+_18.arg=f.toFixed(_18.precision);
 break;
 case "g":
 if(Math.abs(f)<0.0001){
-_1d.arg=f.toExponential(_1d.precision>0?_1d.precision-1:_1d.precision);
+_18.arg=f.toExponential(_18.precision>0?_18.precision-1:_18.precision);
 }else{
-_1d.arg=f.toPrecision(_1d.precision);
+_18.arg=f.toPrecision(_18.precision);
 }
-if(!_1d.alternative){
-_1d.arg=_1d.arg.replace(/(\..*[^0])0*/,"$1");
-_1d.arg=_1d.arg.replace(/\.0*e/,"e").replace(/\.0$/,"");
+if(!_18.alternative){
+_18.arg=_18.arg.replace(/(\..*[^0])0*/,"$1");
+_18.arg=_18.arg.replace(/\.0*e/,"e").replace(/\.0$/,"");
 }
 break;
 default:
-throw new Error("unexpected double notation '"+_1d.doubleNotation+"'");
+throw new Error("unexpected double notation '"+_18.doubleNotation+"'");
 }
-_1d.arg=_1d.arg.replace(/e\+(\d)$/,"e+0$1").replace(/e\-(\d)$/,"e-0$1");
+_18.arg=_18.arg.replace(/e\+(\d)$/,"e+0$1").replace(/e\-(\d)$/,"e-0$1");
 if(dojo.isOpera){
-_1d.arg=_1d.arg.replace(/^\./,"0.");
+_18.arg=_18.arg.replace(/^\./,"0.");
 }
-if(_1d.alternative){
-_1d.arg=_1d.arg.replace(/^(\d+)$/,"$1.");
-_1d.arg=_1d.arg.replace(/^(\d+)e/,"$1.e");
+if(_18.alternative){
+_18.arg=_18.arg.replace(/^(\d+)$/,"$1.");
+_18.arg=_18.arg.replace(/^(\d+)e/,"$1.e");
 }
-if(f>=0&&_1d.sign){
-_1d.arg=_1d.sign+_1d.arg;
+if(f>=0&&_18.sign){
+_18.arg=_18.sign+_18.arg;
 }
-_1d.arg=_1d.toUpper?_1d.arg.toUpperCase():_1d.arg.toLowerCase();
-},zeroPad:function(_1f,_20){
-_20=(arguments.length==2)?_20:_1f.precision;
-if(typeof _1f.arg!="string"){
-_1f.arg=""+_1f.arg;
+_18.arg=_18.toUpper?_18.arg.toUpperCase():_18.arg.toLowerCase();
+},zeroPad:function(_19,_1a){
+_1a=(arguments.length==2)?_1a:_19.precision;
+if(typeof _19.arg!="string"){
+_19.arg=""+_19.arg;
 }
-var _21=_20-10;
-while(_1f.arg.length<_21){
-_1f.arg=(_1f.rightJustify)?_1f.arg+this._zeros10:this._zeros10+_1f.arg;
+var _1b=_1a-10;
+while(_19.arg.length<_1b){
+_19.arg=(_19.rightJustify)?_19.arg+this._zeros10:this._zeros10+_19.arg;
 }
-var pad=_20-_1f.arg.length;
-_1f.arg=(_1f.rightJustify)?_1f.arg+this._zeros10.substring(0,pad):this._zeros10.substring(0,pad)+_1f.arg;
-},fitField:function(_23){
-if(_23.maxWidth>=0&&_23.arg.length>_23.maxWidth){
-return _23.arg.substring(0,_23.maxWidth);
+var pad=_1a-_19.arg.length;
+_19.arg=(_19.rightJustify)?_19.arg+this._zeros10.substring(0,pad):this._zeros10.substring(0,pad)+_19.arg;
+},fitField:function(_1c){
+if(_1c.maxWidth>=0&&_1c.arg.length>_1c.maxWidth){
+return _1c.arg.substring(0,_1c.maxWidth);
 }
-if(_23.zeroPad){
-this.zeroPad(_23,_23.minWidth);
+if(_1c.zeroPad){
+this.zeroPad(_1c,_1c.minWidth);
 return;
 }
-this.spacePad(_23);
-},spacePad:function(_24,_25){
-_25=(arguments.length==2)?_25:_24.minWidth;
-if(typeof _24.arg!="string"){
-_24.arg=""+_24.arg;
+this.spacePad(_1c);
+},spacePad:function(_1d,_1e){
+_1e=(arguments.length==2)?_1e:_1d.minWidth;
+if(typeof _1d.arg!="string"){
+_1d.arg=""+_1d.arg;
 }
-var _26=_25-10;
-while(_24.arg.length<_26){
-_24.arg=(_24.rightJustify)?_24.arg+this._spaces10:this._spaces10+_24.arg;
+var _1f=_1e-10;
+while(_1d.arg.length<_1f){
+_1d.arg=(_1d.rightJustify)?_1d.arg+this._spaces10:this._spaces10+_1d.arg;
 }
-var pad=_25-_24.arg.length;
-_24.arg=(_24.rightJustify)?_24.arg+this._spaces10.substring(0,pad):this._spaces10.substring(0,pad)+_24.arg;
+var pad=_1e-_1d.arg.length;
+_1d.arg=(_1d.rightJustify)?_1d.arg+this._spaces10.substring(0,pad):this._spaces10.substring(0,pad)+_1d.arg;
 }});
 }
diff --git a/dojox/string/tokenize.js b/dojox/string/tokenize.js
index a6052a4..c3c98d0 100644
--- a/dojox/string/tokenize.js
+++ b/dojox/string/tokenize.js
@@ -8,33 +8,33 @@
 if(!dojo._hasResource["dojox.string.tokenize"]){
 dojo._hasResource["dojox.string.tokenize"]=true;
 dojo.provide("dojox.string.tokenize");
-dojox.string.tokenize=function(_1,re,_3,_4){
-var _5=[];
-var _6,_7,_8=0;
-while(_6=re.exec(_1)){
-_7=_1.slice(_8,re.lastIndex-_6[0].length);
-if(_7.length){
-_5.push(_7);
-}
-if(_3){
+dojox.string.tokenize=function(_1,re,_2,_3){
+var _4=[];
+var _5,_6,_7=0;
+while(_5=re.exec(_1)){
+_6=_1.slice(_7,re.lastIndex-_5[0].length);
+if(_6.length){
+_4.push(_6);
+}
+if(_2){
 if(dojo.isOpera){
-var _9=_6.slice(0);
-while(_9.length<_6.length){
-_9.push(null);
+var _8=_5.slice(0);
+while(_8.length<_5.length){
+_8.push(null);
 }
-_6=_9;
+_5=_8;
 }
-var _a=_3.apply(_4,_6.slice(1).concat(_5.length));
-if(typeof _a!="undefined"){
-_5.push(_a);
+var _9=_2.apply(_3,_5.slice(1).concat(_4.length));
+if(typeof _9!="undefined"){
+_4.push(_9);
 }
 }
-_8=re.lastIndex;
+_7=re.lastIndex;
 }
-_7=_1.slice(_8);
-if(_7.length){
-_5.push(_7);
+_6=_1.slice(_7);
+if(_6.length){
+_4.push(_6);
 }
-return _5;
+return _4;
 };
 }
diff --git a/dojox/testing/DocTest.js b/dojox/testing/DocTest.js
index 16c5795..50d6575 100644
--- a/dojox/testing/DocTest.js
+++ b/dojox/testing/DocTest.js
@@ -54,36 +54,34 @@ _d={commands:[],expectedResult:[],line:0};
 }
 }
 return _c;
-},run:function(_10){
+},run:function(_e){
 this.errors=[];
-var _11=this.getTests(_10);
-if(_11){
-this._run(_11);
+var _f=this.getTests(_e);
+if(_f){
+this._run(_f);
 }
-},_run:function(_12){
-var len=_12.length;
+},_run:function(_10){
+var len=_10.length;
 this.tests=len;
 var oks=0;
 for(var i=0;i<len;i++){
-var t=_12[i];
+var t=_10[i];
 var res=this.runTest(t.commands,t.expectedResult);
 var msg="Test "+(i+1)+": ";
-var _19=t.commands.join(" ");
-_19=(_19.length>50?_19.substr(0,50)+"...":_19);
+var _11=t.commands.join(" ");
+_11=(_11.length>50?_11.substr(0,50)+"...":_11);
 if(res.success){
-
 oks+=1;
 }else{
 this.errors.push({commands:t.commands,actual:res.actualResult,expected:t.expectedResult});
-console.error(msg+"Failed: "+_19,{commands:t.commands,actualResult:res.actualResult,expectedResult:t.expectedResult});
+console.error(msg+"Failed: "+_11,{commands:t.commands,actualResult:res.actualResult,expectedResult:t.expectedResult});
 }
 }
-
-},runTest:function(_1a,_1b){
+},runTest:function(_12,_13){
 var ret={success:false,actualResult:null};
-var _1d=_1a.join("\n");
-ret.actualResult=eval(_1d);
-if((String(ret.actualResult)==_1b)||(dojo.toJson(ret.actualResult)==_1b)||((_1b.charAt(0)=="\"")&&(_1b.charAt(_1b.length-1)=="\"")&&(String(ret.actualResult)==_1b.substring(1,_1b.length-1)))){
+var _14=_12.join("\n");
+ret.actualResult=eval(_14);
+if((String(ret.actualResult)==_13)||(dojo.toJson(ret.actualResult)==_13)||((_13.charAt(0)=="\"")&&(_13.charAt(_13.length-1)=="\"")&&(String(ret.actualResult)==_13.substring(1,_13.length-1)))){
 ret.success=true;
 }
 return ret;
diff --git a/dojox/timing/Sequence.js b/dojox/timing/Sequence.js
index 076314e..daca046 100644
--- a/dojox/timing/Sequence.js
+++ b/dojox/timing/Sequence.js
@@ -24,7 +24,7 @@ this._defsResolved.push(_3);
 this._defsResolved.push(_3);
 }
 },this);
-var _6=_1[_1.length-1];
+var _5=_1[_1.length-1];
 if(_2){
 this._defsResolved.push({func:_2});
 }
@@ -35,41 +35,41 @@ this._go();
 if(!this._running){
 return;
 }
-var _7=this._defsResolved[this._curId];
+var _6=this._defsResolved[this._curId];
 this._curId+=1;
-function _8(_9){
-var _a=null;
-if(dojo.isArray(_9)){
-if(_9.length>2){
-_a=_9[0].apply(_9[1],_9.slice(2));
+function _7(_8){
+var _9=null;
+if(dojo.isArray(_8)){
+if(_8.length>2){
+_9=_8[0].apply(_8[1],_8.slice(2));
 }else{
-_a=_9[0].apply(_9[1]);
+_9=_8[0].apply(_8[1]);
 }
 }else{
-_a=_9();
+_9=_8();
 }
-return _a;
+return _9;
 };
 if(this._curId>=this._defsResolved.length){
-_8(_7.func);
+_7(_6.func);
 return;
 }
-if(_7.pauseAfter){
-if(_8(_7.func)!==false){
-setTimeout(dojo.hitch(this,"_go"),_7.pauseAfter);
+if(_6.pauseAfter){
+if(_7(_6.func)!==false){
+setTimeout(dojo.hitch(this,"_go"),_6.pauseAfter);
 }else{
-this._goOnPause=_7.pauseAfter;
+this._goOnPause=_6.pauseAfter;
 }
 }else{
-if(_7.pauseBefore){
+if(_6.pauseBefore){
 var x=dojo.hitch(this,function(){
-if(_8(_7.func)!==false){
+if(_7(_6.func)!==false){
 this._go();
 }
 });
-setTimeout(x,_7.pauseBefore);
+setTimeout(x,_6.pauseBefore);
 }else{
-if(_8(_7.func)!==false){
+if(_7(_6.func)!==false){
 this._go();
 }
 }
diff --git a/dojox/timing/Streamer.js b/dojox/timing/Streamer.js
index abb1294..6462f13 100644
--- a/dojox/timing/Streamer.js
+++ b/dojox/timing/Streamer.js
@@ -16,33 +16,33 @@ this.interval=_3||1000;
 this.minimumSize=_4||10;
 this.inputFunction=_1||function(q){
 };
-this.outputFunction=_2||function(_9){
+this.outputFunction=_2||function(_8){
 };
-var _a=new dojox.timing.Timer(this.interval);
-var _b=function(){
+var _9=new dojox.timing.Timer(this.interval);
+var _a=function(){
 _6.onTick(_6);
 if(_7.length<_6.minimumSize){
 _6.inputFunction(_7);
 }
-var _c=_7.shift();
-while(typeof (_c)=="undefined"&&_7.length>0){
-_c=_7.shift();
+var _b=_7.shift();
+while(typeof (_b)=="undefined"&&_7.length>0){
+_b=_7.shift();
 }
-if(typeof (_c)=="undefined"){
+if(typeof (_b)=="undefined"){
 _6.stop();
 return;
 }
-_6.outputFunction(_c);
+_6.outputFunction(_b);
 };
 this.setInterval=function(ms){
 this.interval=ms;
-_a.setInterval(ms);
+_9.setInterval(ms);
 };
-this.onTick=function(_e){
+this.onTick=function(_c){
 };
 this.start=function(){
 if(typeof (this.inputFunction)=="function"&&typeof (this.outputFunction)=="function"){
-_a.start();
+_9.start();
 return;
 }
 throw new Error("You cannot start a Streamer without an input and an output function.");
@@ -50,13 +50,13 @@ throw new Error("You cannot start a Streamer without an input and an output func
 this.onStart=function(){
 };
 this.stop=function(){
-_a.stop();
+_9.stop();
 };
 this.onStop=function(){
 };
-_a.onTick=this.tick;
-_a.onStart=this.onStart;
-_a.onStop=this.onStop;
+_9.onTick=this.tick;
+_9.onStart=this.onStart;
+_9.onStop=this.onStop;
 if(_5){
 _7.concat(_5);
 }
diff --git a/dojox/timing/ThreadPool.js b/dojox/timing/ThreadPool.js
index 898ab89..89b46d0 100644
--- a/dojox/timing/ThreadPool.js
+++ b/dojox/timing/ThreadPool.js
@@ -14,129 +14,129 @@ dojo.experimental("dojox.timing.ThreadPool");
 var t=dojox.timing;
 t.threadStates={UNSTARTED:"unstarted",STOPPED:"stopped",PENDING:"pending",RUNNING:"running",SUSPENDED:"suspended",WAITING:"waiting",COMPLETE:"complete",ERROR:"error"};
 t.threadPriorities={LOWEST:1,BELOWNORMAL:2,NORMAL:3,ABOVENORMAL:4,HIGHEST:5};
-t.Thread=function(fn,_3){
-var _4=this;
+t.Thread=function(fn,_1){
+var _2=this;
 this.state=t.threadStates.UNSTARTED;
-this.priority=_3||t.threadPriorities.NORMAL;
+this.priority=_1||t.threadPriorities.NORMAL;
 this.lastError=null;
 this.func=fn;
 this.invoke=function(){
-_4.state=t.threadStates.RUNNING;
+_2.state=t.threadStates.RUNNING;
 try{
 fn(this);
-_4.state=t.threadStates.COMPLETE;
+_2.state=t.threadStates.COMPLETE;
 }
 catch(e){
-_4.lastError=e;
-_4.state=t.threadStates.ERROR;
+_2.lastError=e;
+_2.state=t.threadStates.ERROR;
 }
 };
 };
-t.ThreadPool=new (function(_5,_6){
-var _7=this;
-var _8=_5;
-var _9=_8;
-var _a=_6;
-var _b=Math.floor((_a/2)/_8);
-var _c=[];
-var _d=new Array(_8+1);
-var _e=new dojox.timing.Timer();
-var _f=function(){
-var _10=_d[0]={};
-for(var i=0;i<_d.length;i++){
-window.clearTimeout(_d[i]);
-var _12=_c.shift();
-if(typeof (_12)=="undefined"){
+t.ThreadPool=new (function(_3,_4){
+var _5=this;
+var _6=_3;
+var _7=_6;
+var _8=_4;
+var _9=Math.floor((_8/2)/_6);
+var _a=[];
+var _b=new Array(_6+1);
+var _c=new dojox.timing.Timer();
+var _d=function(){
+var _e=_b[0]={};
+for(var i=0;i<_b.length;i++){
+window.clearTimeout(_b[i]);
+var _f=_a.shift();
+if(typeof (_f)=="undefined"){
 break;
 }
-_10["thread-"+i]=_12;
-_d[i]=window.setTimeout(_12.invoke,(_b*i));
+_e["thread-"+i]=_f;
+_b[i]=window.setTimeout(_f.invoke,(_9*i));
 }
-_9=_8-(i-1);
+_7=_6-(i-1);
 };
 this.getMaxThreads=function(){
-return _8;
+return _6;
 };
 this.getAvailableThreads=function(){
-return _9;
+return _7;
 };
 this.getTickInterval=function(){
-return _a;
+return _8;
 };
 this.queueUserWorkItem=function(fn){
-var _14=fn;
-if(_14 instanceof Function){
-_14=new t.Thread(_14);
+var _10=fn;
+if(_10 instanceof Function){
+_10=new t.Thread(_10);
 }
-var idx=_c.length;
-for(var i=0;i<_c.length;i++){
-if(_c[i].priority<_14.priority){
+var idx=_a.length;
+for(var i=0;i<_a.length;i++){
+if(_a[i].priority<_10.priority){
 idx=i;
 break;
 }
 }
-if(idx<_c.length){
-_c.splice(idx,0,_14);
+if(idx<_a.length){
+_a.splice(idx,0,_10);
 }else{
-_c.push(_14);
+_a.push(_10);
 }
 return true;
 };
-this.removeQueuedUserWorkItem=function(_17){
-if(_17 instanceof Function){
+this.removeQueuedUserWorkItem=function(_11){
+if(_11 instanceof Function){
 var idx=-1;
-for(var i=0;i<_c.length;i++){
-if(_c[i].func==_17){
+for(var i=0;i<_a.length;i++){
+if(_a[i].func==_11){
 idx=i;
 break;
 }
 }
 if(idx>-1){
-_c.splice(idx,1);
+_a.splice(idx,1);
 return true;
 }
 return false;
 }
 var idx=-1;
-for(var i=0;i<_c.length;i++){
-if(_c[i]==_17){
+for(var i=0;i<_a.length;i++){
+if(_a[i]==_11){
 idx=i;
 break;
 }
 }
 if(idx>-1){
-_c.splice(idx,1);
+_a.splice(idx,1);
 return true;
 }
 return false;
 };
 this.start=function(){
-_e.start();
+_c.start();
 };
 this.stop=function(){
-_e.stop();
+_c.stop();
 };
 this.abort=function(){
 this.stop();
-for(var i=1;i<_d.length;i++){
-if(_d[i]){
-window.clearTimeout(_d[i]);
+for(var i=1;i<_b.length;i++){
+if(_b[i]){
+window.clearTimeout(_b[i]);
 }
 }
-for(var _1b in _d[0]){
-this.queueUserWorkItem(_1b);
+for(var _12 in _b[0]){
+this.queueUserWorkItem(_12);
 }
-_d[0]={};
+_b[0]={};
 };
 this.reset=function(){
 this.abort();
-_c=[];
+_a=[];
 };
-this.sleep=function(_1c){
-_e.stop();
-window.setTimeout(_e.start,_1c);
+this.sleep=function(_13){
+_c.stop();
+window.setTimeout(_c.start,_13);
 };
-_e.onTick=_7.invoke;
+_c.onTick=_5.invoke;
 })(16,5000);
 })();
 }
diff --git a/dojox/uuid/_base.js b/dojox/uuid/_base.js
index 02a1483..7fc0c9a 100644
--- a/dojox/uuid/_base.js
+++ b/dojox/uuid/_base.js
@@ -30,106 +30,106 @@ var _5=_3.split("-");
 _4=((_5.length==5)&&(_5[0].length==8)&&(_5[1].length==4)&&(_5[2].length==4)&&(_5[3].length==4)&&(_5[4].length==12));
 var _6=16;
 for(var i in _5){
-var _8=_5[i];
-var _9=parseInt(_8,_6);
-_4=_4&&isFinite(_9);
+var _7=_5[i];
+var _8=parseInt(_7,_6);
+_4=_4&&isFinite(_8);
 }
 }
 return _4;
 };
-dojox.uuid.getVariant=function(_a){
+dojox.uuid.getVariant=function(_9){
 if(!dojox.uuid._ourVariantLookupTable){
-var _b=dojox.uuid.variant;
-var _c=[];
-_c[0]=_b.NCS;
-_c[1]=_b.NCS;
-_c[2]=_b.NCS;
-_c[3]=_b.NCS;
-_c[4]=_b.NCS;
-_c[5]=_b.NCS;
-_c[6]=_b.NCS;
-_c[7]=_b.NCS;
-_c[8]=_b.DCE;
-_c[9]=_b.DCE;
-_c[10]=_b.DCE;
-_c[11]=_b.DCE;
-_c[12]=_b.MICROSOFT;
-_c[13]=_b.MICROSOFT;
-_c[14]=_b.UNKNOWN;
-_c[15]=_b.UNKNOWN;
-dojox.uuid._ourVariantLookupTable=_c;
+var _a=dojox.uuid.variant;
+var _b=[];
+_b[0]=_a.NCS;
+_b[1]=_a.NCS;
+_b[2]=_a.NCS;
+_b[3]=_a.NCS;
+_b[4]=_a.NCS;
+_b[5]=_a.NCS;
+_b[6]=_a.NCS;
+_b[7]=_a.NCS;
+_b[8]=_a.DCE;
+_b[9]=_a.DCE;
+_b[10]=_a.DCE;
+_b[11]=_a.DCE;
+_b[12]=_a.MICROSOFT;
+_b[13]=_a.MICROSOFT;
+_b[14]=_a.UNKNOWN;
+_b[15]=_a.UNKNOWN;
+dojox.uuid._ourVariantLookupTable=_b;
 }
-_a=_a.toString();
-var _d=_a.charAt(19);
-var _e=16;
-var _f=parseInt(_d,_e);
-dojox.uuid.assert((_f>=0)&&(_f<=16));
-return dojox.uuid._ourVariantLookupTable[_f];
+_9=_9.toString();
+var _c=_9.charAt(19);
+var _d=16;
+var _e=parseInt(_c,_d);
+dojox.uuid.assert((_e>=0)&&(_e<=16));
+return dojox.uuid._ourVariantLookupTable[_e];
 };
-dojox.uuid.getVersion=function(_10){
-var _11="dojox.uuid.getVersion() was not passed a DCE Variant UUID.";
-dojox.uuid.assert(dojox.uuid.getVariant(_10)==dojox.uuid.variant.DCE,_11);
-_10=_10.toString();
-var _12=_10.charAt(14);
-var _13=16;
-var _14=parseInt(_12,_13);
-return _14;
+dojox.uuid.getVersion=function(_f){
+var _10="dojox.uuid.getVersion() was not passed a DCE Variant UUID.";
+dojox.uuid.assert(dojox.uuid.getVariant(_f)==dojox.uuid.variant.DCE,_10);
+_f=_f.toString();
+var _11=_f.charAt(14);
+var _12=16;
+var _13=parseInt(_11,_12);
+return _13;
 };
-dojox.uuid.getNode=function(_15){
-var _16="dojox.uuid.getNode() was not passed a TIME_BASED UUID.";
-dojox.uuid.assert(dojox.uuid.getVersion(_15)==dojox.uuid.version.TIME_BASED,_16);
-_15=_15.toString();
-var _17=_15.split("-");
-var _18=_17[4];
-return _18;
+dojox.uuid.getNode=function(_14){
+var _15="dojox.uuid.getNode() was not passed a TIME_BASED UUID.";
+dojox.uuid.assert(dojox.uuid.getVersion(_14)==dojox.uuid.version.TIME_BASED,_15);
+_14=_14.toString();
+var _16=_14.split("-");
+var _17=_16[4];
+return _17;
 };
-dojox.uuid.getTimestamp=function(_19,_1a){
-var _1b="dojox.uuid.getTimestamp() was not passed a TIME_BASED UUID.";
-dojox.uuid.assert(dojox.uuid.getVersion(_19)==dojox.uuid.version.TIME_BASED,_1b);
-_19=_19.toString();
-if(!_1a){
-_1a=null;
+dojox.uuid.getTimestamp=function(_18,_19){
+var _1a="dojox.uuid.getTimestamp() was not passed a TIME_BASED UUID.";
+dojox.uuid.assert(dojox.uuid.getVersion(_18)==dojox.uuid.version.TIME_BASED,_1a);
+_18=_18.toString();
+if(!_19){
+_19=null;
 }
-switch(_1a){
+switch(_19){
 case "string":
 case String:
-return dojox.uuid.getTimestamp(_19,Date).toUTCString();
+return dojox.uuid.getTimestamp(_18,Date).toUTCString();
 break;
 case "hex":
-var _1c=_19.split("-");
-var _1d=_1c[0];
-var _1e=_1c[1];
-var _1f=_1c[2];
-_1f=_1f.slice(1);
-var _20=_1f+_1e+_1d;
-dojox.uuid.assert(_20.length==15);
-return _20;
+var _1b=_18.split("-");
+var _1c=_1b[0];
+var _1d=_1b[1];
+var _1e=_1b[2];
+_1e=_1e.slice(1);
+var _1f=_1e+_1d+_1c;
+dojox.uuid.assert(_1f.length==15);
+return _1f;
 break;
 case null:
 case "date":
 case Date:
-var _21=3394248;
-var _22=16;
-var _23=_19.split("-");
-var _24=parseInt(_23[0],_22);
-var _25=parseInt(_23[1],_22);
-var _26=parseInt(_23[2],_22);
-var _27=_26&4095;
-_27<<=16;
-_27+=_25;
-_27*=4294967296;
-_27+=_24;
-var _28=_27/10000;
-var _29=60*60;
-var _2a=_21;
-var _2b=_2a*_29;
-var _2c=_2b*1000;
-var _2d=_28-_2c;
-var _2e=new Date(_2d);
-return _2e;
+var _20=3394248;
+var _21=16;
+var _22=_18.split("-");
+var _23=parseInt(_22[0],_21);
+var _24=parseInt(_22[1],_21);
+var _25=parseInt(_22[2],_21);
+var _26=_25&4095;
+_26<<=16;
+_26+=_24;
+_26*=4294967296;
+_26+=_23;
+var _27=_26/10000;
+var _28=60*60;
+var _29=_20;
+var _2a=_29*_28;
+var _2b=_2a*1000;
+var _2c=_27-_2b;
+var _2d=new Date(_2c);
+return _2d;
 break;
 default:
-dojox.uuid.assert(false,"dojox.uuid.getTimestamp was not passed a valid returnType: "+_1a);
+dojox.uuid.assert(false,"dojox.uuid.getTimestamp was not passed a valid returnType: "+_19);
 break;
 }
 };
diff --git a/dojox/uuid/generateRandomUuid.js b/dojox/uuid/generateRandomUuid.js
index 573bcaf..0506379 100644
--- a/dojox/uuid/generateRandomUuid.js
+++ b/dojox/uuid/generateRandomUuid.js
@@ -27,8 +27,8 @@ b=b.substring(0,4)+_5+_6+b.substring(5,8);
 var c=_2();
 c=_7+c.substring(1,4)+_5+c.substring(4,8);
 var d=_2();
-var _c=a+_5+b+_5+c+d;
-_c=_c.toLowerCase();
-return _c;
+var _8=a+_5+b+_5+c+d;
+_8=_8.toLowerCase();
+return _8;
 };
 }
diff --git a/dojox/uuid/generateTimeBasedUuid.js b/dojox/uuid/generateTimeBasedUuid.js
index c800f77..55c60b4 100644
--- a/dojox/uuid/generateTimeBasedUuid.js
+++ b/dojox/uuid/generateTimeBasedUuid.js
@@ -44,132 +44,132 @@ _10[1]&=65535;
 dojox.uuid.assert((_10[0]>>>16)===0);
 };
 function _11(x){
-var _13=new Array(0,0,0,0);
-_13[3]=x%65536;
-x-=_13[3];
+var _12=new Array(0,0,0,0);
+_12[3]=x%65536;
+x-=_12[3];
 x/=65536;
-_13[2]=x%65536;
-x-=_13[2];
+_12[2]=x%65536;
+x-=_12[2];
 x/=65536;
-_13[1]=x%65536;
-x-=_13[1];
+_12[1]=x%65536;
+x-=_12[1];
 x/=65536;
-_13[0]=x;
-return _13;
+_12[0]=x;
+return _12;
 };
-function _14(_15,_16){
+function _13(_14,_15){
+dojox.uuid.assert(dojo.isArray(_14));
 dojox.uuid.assert(dojo.isArray(_15));
-dojox.uuid.assert(dojo.isArray(_16));
+dojox.uuid.assert(_14.length==4);
 dojox.uuid.assert(_15.length==4);
-dojox.uuid.assert(_16.length==4);
-var _17=new Array(0,0,0,0);
-_17[3]=_15[3]+_16[3];
-_17[2]=_15[2]+_16[2];
-_17[1]=_15[1]+_16[1];
-_17[0]=_15[0]+_16[0];
-_f(_17);
-return _17;
+var _16=new Array(0,0,0,0);
+_16[3]=_14[3]+_15[3];
+_16[2]=_14[2]+_15[2];
+_16[1]=_14[1]+_15[1];
+_16[0]=_14[0]+_15[0];
+_f(_16);
+return _16;
 };
-function _18(_19,_1a){
+function _17(_18,_19){
+dojox.uuid.assert(dojo.isArray(_18));
 dojox.uuid.assert(dojo.isArray(_19));
-dojox.uuid.assert(dojo.isArray(_1a));
+dojox.uuid.assert(_18.length==4);
 dojox.uuid.assert(_19.length==4);
-dojox.uuid.assert(_1a.length==4);
-var _1b=false;
-if(_19[0]*_1a[0]!==0){
-_1b=true;
-}
-if(_19[0]*_1a[1]!==0){
-_1b=true;
-}
-if(_19[0]*_1a[2]!==0){
-_1b=true;
-}
-if(_19[1]*_1a[0]!==0){
-_1b=true;
-}
-if(_19[1]*_1a[1]!==0){
-_1b=true;
-}
-if(_19[2]*_1a[0]!==0){
-_1b=true;
-}
-dojox.uuid.assert(!_1b);
-var _1c=new Array(0,0,0,0);
-_1c[0]+=_19[0]*_1a[3];
-_f(_1c);
-_1c[0]+=_19[1]*_1a[2];
-_f(_1c);
-_1c[0]+=_19[2]*_1a[1];
-_f(_1c);
-_1c[0]+=_19[3]*_1a[0];
-_f(_1c);
-_1c[1]+=_19[1]*_1a[3];
-_f(_1c);
-_1c[1]+=_19[2]*_1a[2];
-_f(_1c);
-_1c[1]+=_19[3]*_1a[1];
-_f(_1c);
-_1c[2]+=_19[2]*_1a[3];
-_f(_1c);
-_1c[2]+=_19[3]*_1a[2];
-_f(_1c);
-_1c[3]+=_19[3]*_1a[3];
-_f(_1c);
-return _1c;
+var _1a=false;
+if(_18[0]*_19[0]!==0){
+_1a=true;
+}
+if(_18[0]*_19[1]!==0){
+_1a=true;
+}
+if(_18[0]*_19[2]!==0){
+_1a=true;
+}
+if(_18[1]*_19[0]!==0){
+_1a=true;
+}
+if(_18[1]*_19[1]!==0){
+_1a=true;
+}
+if(_18[2]*_19[0]!==0){
+_1a=true;
+}
+dojox.uuid.assert(!_1a);
+var _1b=new Array(0,0,0,0);
+_1b[0]+=_18[0]*_19[3];
+_f(_1b);
+_1b[0]+=_18[1]*_19[2];
+_f(_1b);
+_1b[0]+=_18[2]*_19[1];
+_f(_1b);
+_1b[0]+=_18[3]*_19[0];
+_f(_1b);
+_1b[1]+=_18[1]*_19[3];
+_f(_1b);
+_1b[1]+=_18[2]*_19[2];
+_f(_1b);
+_1b[1]+=_18[3]*_19[1];
+_f(_1b);
+_1b[2]+=_18[2]*_19[3];
+_f(_1b);
+_1b[2]+=_18[3]*_19[2];
+_f(_1b);
+_1b[3]+=_18[3]*_19[3];
+_f(_1b);
+return _1b;
 };
-function _1d(_1e,_1f){
-while(_1e.length<_1f){
-_1e="0"+_1e;
+function _1c(_1d,_1e){
+while(_1d.length<_1e){
+_1d="0"+_1d;
 }
-return _1e;
+return _1d;
 };
-function _20(){
-var _21=Math.floor((Math.random()%1)*Math.pow(2,32));
-var _22=_21.toString(_e);
-while(_22.length<8){
-_22="0"+_22;
+function _1f(){
+var _20=Math.floor((Math.random()%1)*Math.pow(2,32));
+var _21=_20.toString(_e);
+while(_21.length<8){
+_21="0"+_21;
 }
-return _22;
+return _21;
 };
-this.generateUuidString=function(_23){
-if(_23){
-dojox.uuid.assert(dojox.uuid.generateTimeBasedUuid.isValidNode(_23));
+this.generateUuidString=function(_22){
+if(_22){
+dojox.uuid.assert(dojox.uuid.generateTimeBasedUuid.isValidNode(_22));
 }else{
 if(dojox.uuid.generateTimeBasedUuid._uniformNode){
-_23=dojox.uuid.generateTimeBasedUuid._uniformNode;
+_22=dojox.uuid.generateTimeBasedUuid._uniformNode;
 }else{
 if(!_8){
-var _24=32768;
-var _25=Math.floor((Math.random()%1)*Math.pow(2,15));
-var _26=(_24|_25).toString(_e);
-_8=_26+_20();
+var _23=32768;
+var _24=Math.floor((Math.random()%1)*Math.pow(2,15));
+var _25=(_23|_24).toString(_e);
+_8=_25+_1f();
 }
-_23=_8;
+_22=_8;
 }
 }
 if(!_9){
-var _27=32768;
-var _28=Math.floor((Math.random()%1)*Math.pow(2,14));
-_9=(_27|_28).toString(_e);
+var _26=32768;
+var _27=Math.floor((Math.random()%1)*Math.pow(2,14));
+_9=(_26|_27).toString(_e);
 }
 var now=new Date();
-var _2a=now.valueOf();
-var _2b=_11(_2a);
+var _28=now.valueOf();
+var _29=_11(_28);
 if(!_c){
-var _2c=_11(60*60);
-var _2d=_11(dojox.uuid.generateTimeBasedUuid._generator.GREGORIAN_CHANGE_OFFSET_IN_HOURS);
-var _2e=_18(_2d,_2c);
-var _2f=_11(1000);
-_c=_18(_2e,_2f);
+var _2a=_11(60*60);
+var _2b=_11(dojox.uuid.generateTimeBasedUuid._generator.GREGORIAN_CHANGE_OFFSET_IN_HOURS);
+var _2c=_17(_2b,_2a);
+var _2d=_11(1000);
+_c=_17(_2c,_2d);
 _d=_11(10000);
 }
-var _30=_2b;
-var _31=_14(_c,_30);
-var _32=_18(_31,_d);
+var _2e=_29;
+var _2f=_13(_c,_2e);
+var _30=_17(_2f,_d);
 if(now.valueOf()==_a){
-_32[3]+=_b;
-_f(_32);
+_30[3]+=_b;
+_f(_30);
 _b+=1;
 if(_b==10000){
 while(now.valueOf()==_a){
@@ -180,18 +180,18 @@ now=new Date();
 _a=now.valueOf();
 _b=1;
 }
-var _33=_32[2].toString(_e);
-var _34=_32[3].toString(_e);
-var _35=_1d(_33,4)+_1d(_34,4);
-var _36=_32[1].toString(_e);
-_36=_1d(_36,4);
-var _37=_32[0].toString(_e);
-_37=_1d(_37,3);
-var _38="-";
-var _39="1";
-var _3a=_35+_38+_36+_38+_39+_37+_38+_9+_38+_23;
-_3a=_3a.toLowerCase();
-return _3a;
+var _31=_30[2].toString(_e);
+var _32=_30[3].toString(_e);
+var _33=_1c(_31,4)+_1c(_32,4);
+var _34=_30[1].toString(_e);
+_34=_1c(_34,4);
+var _35=_30[0].toString(_e);
+_35=_1c(_35,3);
+var _36="-";
+var _37="1";
+var _38=_33+_36+_34+_36+_37+_35+_36+_9+_36+_22;
+_38=_38.toLowerCase();
+return _38;
 };
 }();
 }
diff --git a/dojox/validate/README b/dojox/validate/README
index 3544c1b..9bac798 100644
--- a/dojox/validate/README
+++ b/dojox/validate/README
@@ -8,7 +8,7 @@ Project state: experimental / beta
 -------------------------------------------------------------------------------
 Credits
 	port: Peter Higgins (dante)
-	contributions: Kun Xi (bookstack at gmail com)
+	contributions: Kun Xi (bookstack at gmail com), Jared Jurkiewicz
 -------------------------------------------------------------------------------
 Project description
 
@@ -40,6 +40,8 @@ Project description
 	
 	web.js provides url and email address validation, as well as a number
 		of web/network related validation functions. 
+
+	br.js provides Brazil specific validators for CNPJ and CPF numbers.
 		
 -------------------------------------------------------------------------------
 Dependencies:
diff --git a/dojox/validate/_base.js b/dojox/validate/_base.js
index 962ff22..5577fa0 100644
--- a/dojox/validate/_base.js
+++ b/dojox/validate/_base.js
@@ -46,23 +46,23 @@ dojox.validate.isNumberFormat=function(_a,_b){
 var re=new RegExp("^"+dojox.validate.regexp.numberFormat(_b)+"$","i");
 return re.test(_a);
 };
-dojox.validate.isValidLuhn=function(_d){
-var _e=0,_f,_10;
-if(!dojo.isString(_d)){
-_d=String(_d);
+dojox.validate.isValidLuhn=function(_c){
+var _d=0,_e,_f;
+if(!dojo.isString(_c)){
+_c=String(_c);
 }
-_d=_d.replace(/[- ]/g,"");
-_f=_d.length%2;
-for(var i=0;i<_d.length;i++){
-_10=parseInt(_d.charAt(i));
-if(i%2==_f){
-_10*=2;
+_c=_c.replace(/[- ]/g,"");
+_e=_c.length%2;
+for(var i=0;i<_c.length;i++){
+_f=parseInt(_c.charAt(i));
+if(i%2==_e){
+_f*=2;
 }
-if(_10>9){
-_10-=9;
+if(_f>9){
+_f-=9;
 }
-_e+=_10;
+_d+=_f;
 }
-return !(_e%10);
+return !(_d%10);
 };
 }
diff --git a/dojox/validate/br.js b/dojox/validate/br.js
new file mode 100644
index 0000000..c1c439c
--- /dev/null
+++ b/dojox/validate/br.js
@@ -0,0 +1,203 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.validate.br"]){
+dojo._hasResource["dojox.validate.br"]=true;
+dojo.provide("dojox.validate.br");
+dojo.require("dojox.validate._base");
+dojox.validate.br.isValidCnpj=function(_1){
+if(!dojo.isString(_1)){
+if(!_1){
+return false;
+}
+_1=_1+"";
+while(_1.length<14){
+_1="0"+_1;
+}
+}
+var _2={format:["##.###.###/####-##","########/####-##","############-##","##############"]};
+if(dojox.validate.isNumberFormat(_1,_2)){
+_1=_1.replace("/","").replace(/\./g,"").replace("-","");
+var _3=[];
+var dv=[];
+var i,j,_4;
+for(i=0;i<10;i++){
+_4="";
+for(j=0;j<_1.length;j++){
+_4+=""+i;
+}
+if(_1===_4){
+return false;
+}
+}
+for(i=0;i<12;i++){
+_3.push(parseInt(_1.charAt(i),10));
+}
+for(i=12;i<14;i++){
+dv.push(parseInt(_1.charAt(i),10));
+}
+var _5=[9,8,7,6,5,4,3,2,9,8,7,6].reverse();
+var _6=0;
+for(i=0;i<_3.length;i++){
+_6+=_3[i]*_5[i];
+}
+var _7=_6%11;
+if(_7==dv[0]){
+_6=0;
+_5=[9,8,7,6,5,4,3,2,9,8,7,6,5].reverse();
+_3.push(_7);
+for(i=0;i<_3.length;i++){
+_6+=_3[i]*_5[i];
+}
+var _8=_6%11;
+if(_8===dv[1]){
+return true;
+}
+}
+}
+return false;
+};
+dojox.validate.br.computeCnpjDv=function(_9){
+if(!dojo.isString(_9)){
+if(!_9){
+return "";
+}
+_9=_9+"";
+while(_9.length<12){
+_9="0"+_9;
+}
+}
+var _a={format:["##.###.###/####","########/####","############"]};
+if(dojox.validate.isNumberFormat(_9,_a)){
+_9=_9.replace("/","").replace(/\./g,"");
+var _b=[];
+var i,j,_c;
+for(i=0;i<10;i++){
+_c="";
+for(j=0;j<_9.length;j++){
+_c+=""+i;
+}
+if(_9===_c){
+return "";
+}
+}
+for(i=0;i<_9.length;i++){
+_b.push(parseInt(_9.charAt(i),10));
+}
+var _d=[9,8,7,6,5,4,3,2,9,8,7,6].reverse();
+var _e=0;
+for(i=0;i<_b.length;i++){
+_e+=_b[i]*_d[i];
+}
+var _f=_e%11;
+_e=0;
+_d=[9,8,7,6,5,4,3,2,9,8,7,6,5].reverse();
+_b.push(_f);
+for(i=0;i<_b.length;i++){
+_e+=_b[i]*_d[i];
+}
+var dv1=_e%11;
+return (""+_f)+dv1;
+}
+return "";
+};
+dojox.validate.br.isValidCpf=function(_10){
+if(!dojo.isString(_10)){
+if(!_10){
+return false;
+}
+_10=_10+"";
+while(_10.length<11){
+_10="0"+_10;
+}
+}
+var _11={format:["###.###.###-##","#########-##","###########"]};
+if(dojox.validate.isNumberFormat(_10,_11)){
+_10=_10.replace("-","").replace(/\./g,"");
+var cpf=[];
+var dv=[];
+var i,j,tmp;
+for(i=0;i<10;i++){
+tmp="";
+for(j=0;j<_10.length;j++){
+tmp+=""+i;
+}
+if(_10===tmp){
+return false;
+}
+}
+for(i=0;i<9;i++){
+cpf.push(parseInt(_10.charAt(i),10));
+}
+for(i=9;i<12;i++){
+dv.push(parseInt(_10.charAt(i),10));
+}
+var _12=[9,8,7,6,5,4,3,2,1].reverse();
+var sum=0;
+for(i=0;i<cpf.length;i++){
+sum+=cpf[i]*_12[i];
+}
+var dv0=sum%11;
+if(dv0==dv[0]){
+sum=0;
+_12=[9,8,7,6,5,4,3,2,1,0].reverse();
+cpf.push(dv0);
+for(i=0;i<cpf.length;i++){
+sum+=cpf[i]*_12[i];
+}
+var dv1=sum%11;
+if(dv1===dv[1]){
+return true;
+}
+}
+}
+return false;
+};
+dojox.validate.br.computeCpfDv=function(_13){
+if(!dojo.isString(_13)){
+if(!_13){
+return "";
+}
+_13=_13+"";
+while(_13.length<9){
+_13="0"+_13;
+}
+}
+var _14={format:["###.###.###","#########"]};
+if(dojox.validate.isNumberFormat(_13,_14)){
+_13=_13.replace(/\./g,"");
+var cpf=[];
+for(i=0;i<10;i++){
+tmp="";
+for(j=0;j<_13.length;j++){
+tmp+=""+i;
+}
+if(_13===tmp){
+return "";
+}
+}
+for(i=0;i<_13.length;i++){
+cpf.push(parseInt(_13.charAt(i),10));
+}
+var _15=[9,8,7,6,5,4,3,2,1].reverse();
+var sum=0;
+for(i=0;i<cpf.length;i++){
+sum+=cpf[i]*_15[i];
+}
+var dv0=sum%11;
+sum=0;
+_15=[9,8,7,6,5,4,3,2,1,0].reverse();
+cpf.push(dv0);
+for(i=0;i<cpf.length;i++){
+sum+=cpf[i]*_15[i];
+}
+var dv1=sum%11;
+return (""+dv0)+dv1;
+}
+return "";
+};
+}
diff --git a/dojox/validate/ca.js b/dojox/validate/ca.js
index 20fbb27..3b84da5 100644
--- a/dojox/validate/ca.js
+++ b/dojox/validate/ca.js
@@ -14,11 +14,11 @@ return dojox.validate.us.isPhoneNumber(_1);
 },isProvince:function(_2){
 var re=new RegExp("^"+dojox.validate.regexp.ca.province()+"$","i");
 return re.test(_2);
-},isSocialInsuranceNumber:function(_4){
-var _5={format:["###-###-###","### ### ###","#########"]};
-return dojox.validate.isNumberFormat(_4,_5);
-},isPostalCode:function(_6){
+},isSocialInsuranceNumber:function(_3){
+var _4={format:["###-###-###","### ### ###","#########"]};
+return dojox.validate.isNumberFormat(_3,_4);
+},isPostalCode:function(_5){
 var re=new RegExp("^"+dojox.validate.regexp.ca.postalCode()+"$","i");
-return re.test(_6);
+return re.test(_5);
 }});
 }
diff --git a/dojox/validate/check.js b/dojox/validate/check.js
index 352fc9c..c3aadaf 100644
--- a/dojox/validate/check.js
+++ b/dojox/validate/check.js
@@ -30,62 +30,62 @@ return false;
 return (_4.length>0);
 },getInvalid:function(){
 return _4;
-},isInvalid:function(_8){
+},isInvalid:function(_7){
 for(var i=0;i<_4.length;i++){
-if(_8==_4[i]){
+if(_7==_4[i]){
 return true;
 }
 }
 return false;
 }};
-var _a=function(_b,_c){
-return (typeof _c[_b]=="undefined");
+var _8=function(_9,_a){
+return (typeof _a[_9]=="undefined");
 };
 if(_2.trim instanceof Array){
 for(var i=0;i<_2.trim.length;i++){
-var _e=_1[_2.trim[i]];
-if(_a("type",_e)||_e.type!="text"&&_e.type!="textarea"&&_e.type!="password"){
+var _b=_1[_2.trim[i]];
+if(_8("type",_b)||_b.type!="text"&&_b.type!="textarea"&&_b.type!="password"){
 continue;
 }
-_e.value=_e.value.replace(/(^\s*|\s*$)/g,"");
+_b.value=_b.value.replace(/(^\s*|\s*$)/g,"");
 }
 }
 if(_2.uppercase instanceof Array){
 for(var i=0;i<_2.uppercase.length;i++){
-var _e=_1[_2.uppercase[i]];
-if(_a("type",_e)||_e.type!="text"&&_e.type!="textarea"&&_e.type!="password"){
+var _b=_1[_2.uppercase[i]];
+if(_8("type",_b)||_b.type!="text"&&_b.type!="textarea"&&_b.type!="password"){
 continue;
 }
-_e.value=_e.value.toUpperCase();
+_b.value=_b.value.toUpperCase();
 }
 }
 if(_2.lowercase instanceof Array){
 for(var i=0;i<_2.lowercase.length;i++){
-var _e=_1[_2.lowercase[i]];
-if(_a("type",_e)||_e.type!="text"&&_e.type!="textarea"&&_e.type!="password"){
+var _b=_1[_2.lowercase[i]];
+if(_8("type",_b)||_b.type!="text"&&_b.type!="textarea"&&_b.type!="password"){
 continue;
 }
-_e.value=_e.value.toLowerCase();
+_b.value=_b.value.toLowerCase();
 }
 }
 if(_2.ucfirst instanceof Array){
 for(var i=0;i<_2.ucfirst.length;i++){
-var _e=_1[_2.ucfirst[i]];
-if(_a("type",_e)||_e.type!="text"&&_e.type!="textarea"&&_e.type!="password"){
+var _b=_1[_2.ucfirst[i]];
+if(_8("type",_b)||_b.type!="text"&&_b.type!="textarea"&&_b.type!="password"){
 continue;
 }
-_e.value=_e.value.replace(/\b\w+\b/g,function(_f){
-return _f.substring(0,1).toUpperCase()+_f.substring(1).toLowerCase();
+_b.value=_b.value.replace(/\b\w+\b/g,function(_c){
+return _c.substring(0,1).toUpperCase()+_c.substring(1).toLowerCase();
 });
 }
 }
 if(_2.digit instanceof Array){
 for(var i=0;i<_2.digit.length;i++){
-var _e=_1[_2.digit[i]];
-if(_a("type",_e)||_e.type!="text"&&_e.type!="textarea"&&_e.type!="password"){
+var _b=_1[_2.digit[i]];
+if(_8("type",_b)||_b.type!="text"&&_b.type!="textarea"&&_b.type!="password"){
 continue;
 }
-_e.value=_e.value.replace(/\D/g,"");
+_b.value=_b.value.replace(/\D/g,"");
 }
 }
 if(_2.required instanceof Array){
@@ -93,22 +93,22 @@ for(var i=0;i<_2.required.length;i++){
 if(!dojo.isString(_2.required[i])){
 continue;
 }
-var _e=_1[_2.required[i]];
-if(!_a("type",_e)&&(_e.type=="text"||_e.type=="textarea"||_e.type=="password"||_e.type=="file")&&/^\s*$/.test(_e.value)){
-_3[_3.length]=_e.name;
+var _b=_1[_2.required[i]];
+if(!_8("type",_b)&&(_b.type=="text"||_b.type=="textarea"||_b.type=="password"||_b.type=="file")&&/^\s*$/.test(_b.value)){
+_3[_3.length]=_b.name;
 }else{
-if(!_a("type",_e)&&(_e.type=="select-one"||_e.type=="select-multiple")&&(_e.selectedIndex==-1||/^\s*$/.test(_e.options[_e.selectedIndex].value))){
-_3[_3.length]=_e.name;
+if(!_8("type",_b)&&(_b.type=="select-one"||_b.type=="select-multiple")&&(_b.selectedIndex==-1||/^\s*$/.test(_b.options[_b.selectedIndex].value))){
+_3[_3.length]=_b.name;
 }else{
-if(_e instanceof Array){
-var _10=false;
-for(var j=0;j<_e.length;j++){
-if(_e[j].checked){
-_10=true;
+if(_b instanceof Array){
+var _d=false;
+for(var j=0;j<_b.length;j++){
+if(_b[j].checked){
+_d=true;
 }
 }
-if(!_10){
-_3[_3.length]=_e[0].name;
+if(!_d){
+_3[_3.length]=_b[0].name;
 }
 }
 }
@@ -120,110 +120,110 @@ for(var i=0;i<_2.required.length;i++){
 if(!dojo.isObject(_2.required[i])){
 continue;
 }
-var _e,_12;
-for(var _13 in _2.required[i]){
-_e=_1[_13];
-_12=_2.required[i][_13];
+var _b,_e;
+for(var _f in _2.required[i]){
+_b=_1[_f];
+_e=_2.required[i][_f];
 }
-if(_e instanceof Array){
-var _10=0;
-for(var j=0;j<_e.length;j++){
-if(_e[j].checked){
-_10++;
+if(_b instanceof Array){
+var _d=0;
+for(var j=0;j<_b.length;j++){
+if(_b[j].checked){
+_d++;
 }
 }
-if(_10<_12){
-_3[_3.length]=_e[0].name;
+if(_d<_e){
+_3[_3.length]=_b[0].name;
 }
 }else{
-if(!_a("type",_e)&&_e.type=="select-multiple"){
-var _14=0;
-for(var j=0;j<_e.options.length;j++){
-if(_e.options[j].selected&&!/^\s*$/.test(_e.options[j].value)){
-_14++;
+if(!_8("type",_b)&&_b.type=="select-multiple"){
+var _10=0;
+for(var j=0;j<_b.options.length;j++){
+if(_b.options[j].selected&&!/^\s*$/.test(_b.options[j].value)){
+_10++;
 }
 }
-if(_14<_12){
-_3[_3.length]=_e.name;
+if(_10<_e){
+_3[_3.length]=_b.name;
 }
 }
 }
 }
 }
 if(dojo.isObject(_2.dependencies)){
-for(_13 in _2.dependencies){
-var _e=_1[_13];
-if(_a("type",_e)){
+for(_f in _2.dependencies){
+var _b=_1[_f];
+if(_8("type",_b)){
 continue;
 }
-if(_e.type!="text"&&_e.type!="textarea"&&_e.type!="password"){
+if(_b.type!="text"&&_b.type!="textarea"&&_b.type!="password"){
 continue;
 }
-if(/\S+/.test(_e.value)){
+if(/\S+/.test(_b.value)){
 continue;
 }
-if(_5.isMissing(_e.name)){
+if(_5.isMissing(_b.name)){
 continue;
 }
-var _15=_1[_2.dependencies[_13]];
-if(_15.type!="text"&&_15.type!="textarea"&&_15.type!="password"){
+var _11=_1[_2.dependencies[_f]];
+if(_11.type!="text"&&_11.type!="textarea"&&_11.type!="password"){
 continue;
 }
-if(/^\s*$/.test(_15.value)){
+if(/^\s*$/.test(_11.value)){
 continue;
 }
-_3[_3.length]=_e.name;
+_3[_3.length]=_b.name;
 }
 }
 if(dojo.isObject(_2.constraints)){
-for(_13 in _2.constraints){
-var _e=_1[_13];
-if(!_e){
+for(_f in _2.constraints){
+var _b=_1[_f];
+if(!_b){
 continue;
 }
-if(!_a("tagName",_e)&&(_e.tagName.toLowerCase().indexOf("input")>=0||_e.tagName.toLowerCase().indexOf("textarea")>=0)&&/^\s*$/.test(_e.value)){
+if(!_8("tagName",_b)&&(_b.tagName.toLowerCase().indexOf("input")>=0||_b.tagName.toLowerCase().indexOf("textarea")>=0)&&/^\s*$/.test(_b.value)){
 continue;
 }
-var _16=true;
-if(dojo.isFunction(_2.constraints[_13])){
-_16=_2.constraints[_13](_e.value);
+var _12=true;
+if(dojo.isFunction(_2.constraints[_f])){
+_12=_2.constraints[_f](_b.value);
 }else{
-if(dojo.isArray(_2.constraints[_13])){
-if(dojo.isArray(_2.constraints[_13][0])){
-for(var i=0;i<_2.constraints[_13].length;i++){
-_16=dojox.validate.evaluateConstraint(_2,_2.constraints[_13][i],_13,_e);
-if(!_16){
+if(dojo.isArray(_2.constraints[_f])){
+if(dojo.isArray(_2.constraints[_f][0])){
+for(var i=0;i<_2.constraints[_f].length;i++){
+_12=dojox.validate.evaluateConstraint(_2,_2.constraints[_f][i],_f,_b);
+if(!_12){
 break;
 }
 }
 }else{
-_16=dojox.validate.evaluateConstraint(_2,_2.constraints[_13],_13,_e);
+_12=dojox.validate.evaluateConstraint(_2,_2.constraints[_f],_f,_b);
 }
 }
 }
-if(!_16){
-_4[_4.length]=_e.name;
+if(!_12){
+_4[_4.length]=_b.name;
 }
 }
 }
 if(dojo.isObject(_2.confirm)){
-for(_13 in _2.confirm){
-var _e=_1[_13];
-var _15=_1[_2.confirm[_13]];
-if(_a("type",_e)||_a("type",_15)||(_e.type!="text"&&_e.type!="textarea"&&_e.type!="password")||(_15.type!=_e.type)||(_15.value==_e.value)||(_5.isInvalid(_e.name))||(/^\s*$/.test(_15.value))){
+for(_f in _2.confirm){
+var _b=_1[_f];
+var _11=_1[_2.confirm[_f]];
+if(_8("type",_b)||_8("type",_11)||(_b.type!="text"&&_b.type!="textarea"&&_b.type!="password")||(_11.type!=_b.type)||(_11.value==_b.value)||(_5.isInvalid(_b.name))||(/^\s*$/.test(_11.value))){
 continue;
 }
-_4[_4.length]=_e.name;
+_4[_4.length]=_b.name;
 }
 }
 return _5;
 };
-dojox.validate.evaluateConstraint=function(_17,_18,_19,_1a){
-var _1b=_18[0];
-var _1c=_18.slice(1);
-_1c.unshift(_1a.value);
-if(typeof _1b!="undefined"){
-return _1b.apply(null,_1c);
+dojox.validate.evaluateConstraint=function(_13,_14,_15,_16){
+var _17=_14[0];
+var _18=_14.slice(1);
+_18.unshift(_16.value);
+if(typeof _17!="undefined"){
+return _17.apply(null,_18);
 }
 return false;
 };
diff --git a/dojox/validate/creditCard.js b/dojox/validate/creditCard.js
index c9386ea..8bec221 100644
--- a/dojox/validate/creditCard.js
+++ b/dojox/validate/creditCard.js
@@ -27,22 +27,22 @@ _6.push(p);
 }
 return _6.length?_6.join("|"):false;
 };
-dojox.validate.isValidCvv=function(_9,_a){
-if(!dojo.isString(_9)){
-_9=String(_9);
+dojox.validate.isValidCvv=function(_8,_9){
+if(!dojo.isString(_8)){
+_8=String(_8);
 }
-var _b;
-switch(_a.toLowerCase()){
+var _a;
+switch(_9.toLowerCase()){
 case "mc":
 case "ec":
 case "vi":
 case "di":
-_b="###";
+_a="###";
 break;
 case "ax":
-_b="####";
+_a="####";
 break;
 }
-return !!_b&&_9.length&&dojox.validate.isNumberFormat(_9,{format:_b});
+return !!_a&&_8.length&&dojox.validate.isNumberFormat(_8,{format:_a});
 };
 }
diff --git a/dojox/validate/regexp.js b/dojox/validate/regexp.js
index 945bfb3..7f3fc7c 100644
--- a/dojox/validate/regexp.js
+++ b/dojox/validate/regexp.js
@@ -61,104 +61,104 @@ a.push(_7);
 if(_1.allowHybrid){
 a.push(_8);
 }
-var _a="";
+var _9="";
 if(a.length>0){
-_a="("+a.join("|")+")";
+_9="("+a.join("|")+")";
 }
-return _a;
-},host:function(_b){
-_b=(typeof _b=="object")?_b:{};
-if(typeof _b.allowIP!="boolean"){
-_b.allowIP=true;
+return _9;
+},host:function(_a){
+_a=(typeof _a=="object")?_a:{};
+if(typeof _a.allowIP!="boolean"){
+_a.allowIP=true;
 }
-if(typeof _b.allowLocal!="boolean"){
-_b.allowLocal=false;
+if(typeof _a.allowLocal!="boolean"){
+_a.allowLocal=false;
 }
-if(typeof _b.allowPort!="boolean"){
-_b.allowPort=true;
+if(typeof _a.allowPort!="boolean"){
+_a.allowPort=true;
 }
-if(typeof _b.allowNamed!="boolean"){
-_b.allowNamed=false;
+if(typeof _a.allowNamed!="boolean"){
+_a.allowNamed=false;
 }
-var _c="(?:[\\da-zA-Z](?:[-\\da-zA-Z]{0,61}[\\da-zA-Z])?)";
-var _d="(?:[a-zA-Z](?:[-\\da-zA-Z]{0,6}[\\da-zA-Z])?)";
-var _e=_b.allowPort?"(\\:\\d+)?":"";
-var _f="((?:"+_c+"\\.)*"+_d+"\\.?)";
-if(_b.allowIP){
-_f+="|"+dojox.validate.regexp.ipAddress(_b);
+var _b="(?:[\\da-zA-Z](?:[-\\da-zA-Z]{0,61}[\\da-zA-Z])?)";
+var _c="(?:[a-zA-Z](?:[-\\da-zA-Z]{0,6}[\\da-zA-Z])?)";
+var _d=_a.allowPort?"(\\:\\d+)?":"";
+var _e="((?:"+_b+"\\.)+"+_c+"\\.?)";
+if(_a.allowIP){
+_e+="|"+dojox.validate.regexp.ipAddress(_a);
 }
-if(_b.allowLocal){
-_f+="|localhost";
+if(_a.allowLocal){
+_e+="|localhost";
 }
-if(_b.allowNamed){
-_f+="|^[^-][a-zA-Z0-9_-]*";
+if(_a.allowNamed){
+_e+="|^[^-][a-zA-Z0-9_-]*";
 }
-return "("+_f+")"+_e;
-},url:function(_10){
-_10=(typeof _10=="object")?_10:{};
-if(!("scheme" in _10)){
-_10.scheme=[true,false];
+return "("+_e+")"+_d;
+},url:function(_f){
+_f=(typeof _f=="object")?_f:{};
+if(!("scheme" in _f)){
+_f.scheme=[true,false];
 }
-var _11=dojo.regexp.buildGroupRE(_10.scheme,function(q){
+var _10=dojo.regexp.buildGroupRE(_f.scheme,function(q){
 if(q){
 return "(https?|ftps?)\\://";
 }
 return "";
 });
-var _13="(/(?:[^?#\\s/]+/)*(?:[^?#\\s/]+(?:\\?[^?#\\s/]*)?(?:#[A-Za-z][\\w.:-]*)?)?)?";
-return _11+dojox.validate.regexp.host(_10)+_13;
-},emailAddress:function(_14){
-_14=(typeof _14=="object")?_14:{};
-if(typeof _14.allowCruft!="boolean"){
-_14.allowCruft=false;
-}
-_14.allowPort=false;
-var _15="([\\da-zA-Z]+[-._+&'])*[\\da-zA-Z]+";
-var _16=_15+"@"+dojox.validate.regexp.host(_14);
-if(_14.allowCruft){
-_16="<?(mailto\\:)?"+_16+">?";
-}
-return _16;
-},emailAddressList:function(_17){
-_17=(typeof _17=="object")?_17:{};
-if(typeof _17.listSeparator!="string"){
-_17.listSeparator="\\s;,";
-}
-var _18=dojox.validate.regexp.emailAddress(_17);
-var _19="("+_18+"\\s*["+_17.listSeparator+"]\\s*)*"+_18+"\\s*["+_17.listSeparator+"]?\\s*";
-return _19;
-},numberFormat:function(_1a){
-_1a=(typeof _1a=="object")?_1a:{};
-if(typeof _1a.format=="undefined"){
-_1a.format="###-###-####";
-}
-var _1b=function(_1c){
-return dojo.regexp.escapeString(_1c,"?").replace(/\?/g,"\\d?").replace(/#/g,"\\d");
+var _11="(/(?:[^?#\\s/]+/)*(?:[^?#\\s/]+(?:\\?[^?#\\s/]*)?(?:#[A-Za-z][\\w.:-]*)?)?)?";
+return _10+dojox.validate.regexp.host(_f)+_11;
+},emailAddress:function(_12){
+_12=(typeof _12=="object")?_12:{};
+if(typeof _12.allowCruft!="boolean"){
+_12.allowCruft=false;
+}
+_12.allowPort=false;
+var _13="([!#-'*+\\-\\/-9=?A-Z^-~]+[.])*[!#-'*+\\-\\/-9=?A-Z^-~]+";
+var _14=_13+"@"+dojox.validate.regexp.host(_12);
+if(_12.allowCruft){
+_14="<?(mailto\\:)?"+_14+">?";
+}
+return _14;
+},emailAddressList:function(_15){
+_15=(typeof _15=="object")?_15:{};
+if(typeof _15.listSeparator!="string"){
+_15.listSeparator="\\s;,";
+}
+var _16=dojox.validate.regexp.emailAddress(_15);
+var _17="("+_16+"\\s*["+_15.listSeparator+"]\\s*)*"+_16+"\\s*["+_15.listSeparator+"]?\\s*";
+return _17;
+},numberFormat:function(_18){
+_18=(typeof _18=="object")?_18:{};
+if(typeof _18.format=="undefined"){
+_18.format="###-###-####";
+}
+var _19=function(_1a){
+return dojo.regexp.escapeString(_1a,"?").replace(/\?/g,"\\d?").replace(/#/g,"\\d");
 };
-return dojo.regexp.buildGroupRE(_1a.format,_1b);
+return dojo.regexp.buildGroupRE(_18.format,_19);
 }});
 dojox.validate.regexp.ca={postalCode:function(){
 return "([A-Z][0-9][A-Z] [0-9][A-Z][0-9])";
 },province:function(){
 return "(AB|BC|MB|NB|NL|NS|NT|NU|ON|PE|QC|SK|YT)";
 }};
-dojox.validate.regexp.us={state:function(_1d){
-_1d=(typeof _1d=="object")?_1d:{};
-if(typeof _1d.allowTerritories!="boolean"){
-_1d.allowTerritories=true;
+dojox.validate.regexp.us={state:function(_1b){
+_1b=(typeof _1b=="object")?_1b:{};
+if(typeof _1b.allowTerritories!="boolean"){
+_1b.allowTerritories=true;
 }
-if(typeof _1d.allowMilitary!="boolean"){
-_1d.allowMilitary=true;
+if(typeof _1b.allowMilitary!="boolean"){
+_1b.allowMilitary=true;
 }
-var _1e="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";
-var _1f="AS|FM|GU|MH|MP|PW|PR|VI";
-var _20="AA|AE|AP";
-if(_1d.allowTerritories){
-_1e+="|"+_1f;
+var _1c="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";
+var _1d="AS|FM|GU|MH|MP|PW|PR|VI";
+var _1e="AA|AE|AP";
+if(_1b.allowTerritories){
+_1c+="|"+_1d;
 }
-if(_1d.allowMilitary){
-_1e+="|"+_20;
+if(_1b.allowMilitary){
+_1c+="|"+_1e;
 }
-return "("+_1e+")";
+return "("+_1c+")";
 }};
 }
diff --git a/dojox/validate/us.js b/dojox/validate/us.js
index 0fb5c79..51bfaeb 100644
--- a/dojox/validate/us.js
+++ b/dojox/validate/us.js
@@ -13,16 +13,16 @@ dojox.validate.us.isState=function(_1,_2){
 var re=new RegExp("^"+dojox.validate.regexp.us.state(_2)+"$","i");
 return re.test(_1);
 };
-dojox.validate.us.isPhoneNumber=function(_4){
-var _5={format:["###-###-####","(###) ###-####","(###) ### ####","###.###.####","###/###-####","### ### ####","###-###-#### x#???","(###) ###-#### x#???","(###) ### #### x#???","###.###.#### x#???","###/###-#### x#???","### ### #### x#???","##########"]};
-return dojox.validate.isNumberFormat(_4,_5);
+dojox.validate.us.isPhoneNumber=function(_3){
+var _4={format:["###-###-####","(###) ###-####","(###) ### ####","###.###.####","###/###-####","### ### ####","###-###-#### x#???","(###) ###-#### x#???","(###) ### #### x#???","###.###.#### x#???","###/###-#### x#???","### ### #### x#???","##########"]};
+return dojox.validate.isNumberFormat(_3,_4);
 };
-dojox.validate.us.isSocialSecurityNumber=function(_6){
-var _7={format:["###-##-####","### ## ####","#########"]};
-return dojox.validate.isNumberFormat(_6,_7);
+dojox.validate.us.isSocialSecurityNumber=function(_5){
+var _6={format:["###-##-####","### ## ####","#########"]};
+return dojox.validate.isNumberFormat(_5,_6);
 };
-dojox.validate.us.isZipCode=function(_8){
-var _9={format:["#####-####","##### ####","#########","#####"]};
-return dojox.validate.isNumberFormat(_8,_9);
+dojox.validate.us.isZipCode=function(_7){
+var _8={format:["#####-####","##### ####","#########","#####"]};
+return dojox.validate.isNumberFormat(_7,_8);
 };
 }
diff --git a/dojox/validate/web.js b/dojox/validate/web.js
index d651288..930f92c 100644
--- a/dojox/validate/web.js
+++ b/dojox/validate/web.js
@@ -13,27 +13,27 @@ dojox.validate.isIpAddress=function(_1,_2){
 var re=new RegExp("^"+dojox.validate.regexp.ipAddress(_2)+"$","i");
 return re.test(_1);
 };
-dojox.validate.isUrl=function(_4,_5){
-var re=new RegExp("^"+dojox.validate.regexp.url(_5)+"$","i");
-return re.test(_4);
+dojox.validate.isUrl=function(_3,_4){
+var re=new RegExp("^"+dojox.validate.regexp.url(_4)+"$","i");
+return re.test(_3);
 };
-dojox.validate.isEmailAddress=function(_7,_8){
-var re=new RegExp("^"+dojox.validate.regexp.emailAddress(_8)+"$","i");
-return re.test(_7);
+dojox.validate.isEmailAddress=function(_5,_6){
+var re=new RegExp("^"+dojox.validate.regexp.emailAddress(_6)+"$","i");
+return re.test(_5);
 };
-dojox.validate.isEmailAddressList=function(_a,_b){
-var re=new RegExp("^"+dojox.validate.regexp.emailAddressList(_b)+"$","i");
-return re.test(_a);
+dojox.validate.isEmailAddressList=function(_7,_8){
+var re=new RegExp("^"+dojox.validate.regexp.emailAddressList(_8)+"$","i");
+return re.test(_7);
 };
-dojox.validate.getEmailAddressList=function(_d,_e){
-if(!_e){
-_e={};
+dojox.validate.getEmailAddressList=function(_9,_a){
+if(!_a){
+_a={};
 }
-if(!_e.listSeparator){
-_e.listSeparator="\\s;,";
+if(!_a.listSeparator){
+_a.listSeparator="\\s;,";
 }
-if(dojox.validate.isEmailAddressList(_d,_e)){
-return _d.split(new RegExp("\\s*["+_e.listSeparator+"]\\s*"));
+if(dojox.validate.isEmailAddressList(_9,_a)){
+return _9.split(new RegExp("\\s*["+_a.listSeparator+"]\\s*"));
 }
 return [];
 };
diff --git a/dojox/widget/AnalogGauge.js b/dojox/widget/AnalogGauge.js
index 3fc899c..2d4eed6 100644
--- a/dojox/widget/AnalogGauge.js
+++ b/dojox/widget/AnalogGauge.js
@@ -50,25 +50,25 @@ this.shapes[s].getEventSource().style.cursor="pointer";
 }
 }
 if(this.label){
-var _6=this.length+this.offset;
-var x=this._gauge.cx+(_6+5)*Math.sin(this._gauge._getRadians(a));
-var y=this._gauge.cy-(_6+5)*Math.cos(this._gauge._getRadians(a));
-var _9="start";
+var _3=this.length+this.offset;
+var x=this._gauge.cx+(_3+5)*Math.sin(this._gauge._getRadians(a));
+var y=this._gauge.cy-(_3+5)*Math.cos(this._gauge._getRadians(a));
+var _4="start";
 if(a<=-10){
-_9="end";
+_4="end";
 }
 if(a>-10&&a<10){
-_9="middle";
+_4="middle";
 }
-var _a="bottom";
+var _5="bottom";
 if((a<-90)||(a>90)){
-_a="top";
+_5="top";
 }
-this.text=this._gauge.drawText(""+this.label,x,y,_9,_a,this.color,this.font);
+this.text=this._gauge.drawText(""+this.label,x,y,_4,_5,this.color,this.font);
 }
 this.currentValue=this.value;
 }
-},_move:function(_b){
+},_move:function(_6){
 var v=this.value;
 if(v<this._gauge.min){
 v=this._gauge.min;
@@ -77,34 +77,34 @@ if(v>this._gauge.max){
 v=this._gauge.max;
 }
 var c=this.currentValue;
-if(_b){
-var _e=this._gauge._getAngle(v);
+if(_6){
+var _7=this._gauge._getAngle(v);
 for(var i in this.shapes){
-this.shapes[i].setTransform([{dx:this._gauge.cx,dy:this._gauge.cy},dojox.gfx.matrix.rotateg(_e)]);
+this.shapes[i].setTransform([{dx:this._gauge.cx,dy:this._gauge.cy},dojox.gfx.matrix.rotateg(_7)]);
 if(this.hover){
 this.shapes[i].getEventSource().setAttribute("hover",this.hover);
 }
 }
 }else{
 if(c!=v){
-var _10=new dojo._Animation({curve:[c,v],duration:this.duration,easing:this.easing});
-dojo.connect(_10,"onAnimate",dojo.hitch(this,function(_11){
+var _8=new dojo.Animation({curve:[c,v],duration:this.duration,easing:this.easing});
+dojo.connect(_8,"onAnimate",dojo.hitch(this,function(_9){
 for(var i in this.shapes){
-this.shapes[i].setTransform([{dx:this._gauge.cx,dy:this._gauge.cy},dojox.gfx.matrix.rotateg(this._gauge._getAngle(_11))]);
+this.shapes[i].setTransform([{dx:this._gauge.cx,dy:this._gauge.cy},dojox.gfx.matrix.rotateg(this._gauge._getAngle(_9))]);
 if(this.hover){
 this.shapes[i].getEventSource().setAttribute("hover",this.hover);
 }
 }
-this.currentValue=_11;
+this.currentValue=_9;
 }));
-_10.play();
+_8.play();
 }
 }
 }});
 dojo.declare("dojox.widget.AnalogGauge",dojox.widget.gauge._Gauge,{startAngle:-90,endAngle:90,cx:0,cy:0,radius:0,_defaultIndicator:dojox.widget.gauge.AnalogLineIndicator,startup:function(){
 if(this.getChildren){
-dojo.forEach(this.getChildren(),function(_13){
-_13.startup();
+dojo.forEach(this.getChildren(),function(_a){
+_a.startup();
 });
 }
 this.startAngle=Number(this.startAngle);
@@ -123,17 +123,17 @@ this.radius=Math.min(this.cx,this.cy)-25;
 }
 this._oppositeMiddle=(this.startAngle+this.endAngle)/2+180;
 this.inherited(arguments);
-},_getAngle:function(_14){
-return (_14-this.min)/(this.max-this.min)*(this.endAngle-this.startAngle)+this.startAngle;
-},_getValueForAngle:function(_15){
-if(_15>this._oppositeMiddle){
-_15-=360;
-}
-return (_15-this.startAngle)*(this.max-this.min)/(this.endAngle-this.startAngle)+this.min;
-},_getRadians:function(_16){
-return _16*Math.PI/180;
-},_getDegrees:function(_17){
-return _17*180/Math.PI;
+},_getAngle:function(_b){
+return (_b-this.min)/(this.max-this.min)*(this.endAngle-this.startAngle)+this.startAngle;
+},_getValueForAngle:function(_c){
+if(_c>this._oppositeMiddle){
+_c-=360;
+}
+return (_c-this.startAngle)*(this.max-this.min)/(this.endAngle-this.startAngle)+this.min;
+},_getRadians:function(_d){
+return _d*Math.PI/180;
+},_getDegrees:function(_e){
+return _e*180/Math.PI;
 },draw:function(){
 var i;
 if(this._rangeData){
@@ -149,19 +149,19 @@ for(i=0;i<this._indicatorData.length;i++){
 this._indicatorData[i].draw();
 }
 }
-},drawRange:function(_19){
-var _1a;
-if(_19.shape){
-this.surface.remove(_19.shape);
-_19.shape=null;
+},drawRange:function(_f){
+var _10;
+if(_f.shape){
+this.surface.remove(_f.shape);
+_f.shape=null;
 }
 var a1;
 var a2;
-if((_19.low==this.min)&&(_19.high==this.max)&&((this.endAngle-this.startAngle)==360)){
-_1a=this.surface.createCircle({cx:this.cx,cy:this.cy,r:this.radius});
+if((_f.low==this.min)&&(_f.high==this.max)&&((this.endAngle-this.startAngle)==360)){
+_10=this.surface.createCircle({cx:this.cx,cy:this.cy,r:this.radius});
 }else{
-a1=this._getRadians(this._getAngle(_19.low));
-a2=this._getRadians(this._getAngle(_19.high));
+a1=this._getRadians(this._getAngle(_f.low));
+a2=this._getRadians(this._getAngle(_f.high));
 var x1=this.cx+this.radius*Math.sin(a1);
 var y1=this.cy-this.radius*Math.cos(a1);
 var x2=this.cx+this.radius*Math.sin(a2);
@@ -170,77 +170,77 @@ var big=0;
 if((a2-a1)>Math.PI){
 big=1;
 }
-_1a=this.surface.createPath();
-if(_19.size){
-_1a.moveTo(this.cx+(this.radius-_19.size)*Math.sin(a1),this.cy-(this.radius-_19.size)*Math.cos(a1));
+_10=this.surface.createPath();
+if(_f.size){
+_10.moveTo(this.cx+(this.radius-_f.size)*Math.sin(a1),this.cy-(this.radius-_f.size)*Math.cos(a1));
 }else{
-_1a.moveTo(this.cx,this.cy);
+_10.moveTo(this.cx,this.cy);
 }
-_1a.lineTo(x1,y1);
-_1a.arcTo(this.radius,this.radius,0,big,1,x2,y2);
-if(_19.size){
-_1a.lineTo(this.cx+(this.radius-_19.size)*Math.sin(a2),this.cy-(this.radius-_19.size)*Math.cos(a2));
-_1a.arcTo((this.radius-_19.size),(this.radius-_19.size),0,big,0,this.cx+(this.radius-_19.size)*Math.sin(a1),this.cy-(this.radius-_19.size)*Math.cos(a1));
+_10.lineTo(x1,y1);
+_10.arcTo(this.radius,this.radius,0,big,1,x2,y2);
+if(_f.size){
+_10.lineTo(this.cx+(this.radius-_f.size)*Math.sin(a2),this.cy-(this.radius-_f.size)*Math.cos(a2));
+_10.arcTo((this.radius-_f.size),(this.radius-_f.size),0,big,0,this.cx+(this.radius-_f.size)*Math.sin(a1),this.cy-(this.radius-_f.size)*Math.cos(a1));
 }
-_1a.closePath();
+_10.closePath();
 }
-if(dojo.isArray(_19.color)||dojo.isString(_19.color)){
-_1a.setStroke({color:_19.color});
-_1a.setFill(_19.color);
+if(dojo.isArray(_f.color)||dojo.isString(_f.color)){
+_10.setStroke({color:_f.color});
+_10.setFill(_f.color);
 }else{
-if(_19.color.type){
-a1=this._getRadians(this._getAngle(_19.low));
-a2=this._getRadians(this._getAngle(_19.high));
-_19.color.x1=this.cx+(this.radius*Math.sin(a1))/2;
-_19.color.x2=this.cx+(this.radius*Math.sin(a2))/2;
-_19.color.y1=this.cy-(this.radius*Math.cos(a1))/2;
-_19.color.y2=this.cy-(this.radius*Math.cos(a2))/2;
-_1a.setFill(_19.color);
-_1a.setStroke({color:_19.color.colors[0].color});
+if(_f.color.type){
+a1=this._getRadians(this._getAngle(_f.low));
+a2=this._getRadians(this._getAngle(_f.high));
+_f.color.x1=this.cx+(this.radius*Math.sin(a1))/2;
+_f.color.x2=this.cx+(this.radius*Math.sin(a2))/2;
+_f.color.y1=this.cy-(this.radius*Math.cos(a1))/2;
+_f.color.y2=this.cy-(this.radius*Math.cos(a2))/2;
+_10.setFill(_f.color);
+_10.setStroke({color:_f.color.colors[0].color});
 }else{
-_1a.setStroke({color:"green"});
-_1a.setFill("green");
-_1a.getEventSource().setAttribute("class",_19.color.style);
+_10.setStroke({color:"green"});
+_10.setFill("green");
+_10.getEventSource().setAttribute("class",_f.color.style);
 }
 }
-if(_19.hover){
-_1a.getEventSource().setAttribute("hover",_19.hover);
+if(_f.hover){
+_10.getEventSource().setAttribute("hover",_f.hover);
 }
-_19.shape=_1a;
-},getRangeUnderMouse:function(_22){
-var _23=null;
+_f.shape=_10;
+},getRangeUnderMouse:function(_11){
+var _12=null;
 var pos=dojo.coords(this.gaugeContent);
-var x=_22.clientX-pos.x;
-var y=_22.clientY-pos.y;
+var x=_11.clientX-pos.x;
+var y=_11.clientY-pos.y;
 var r=Math.sqrt((y-this.cy)*(y-this.cy)+(x-this.cx)*(x-this.cx));
 if(r<this.radius){
-var _28=this._getDegrees(Math.atan2(y-this.cy,x-this.cx)+Math.PI/2);
-var _29=this._getValueForAngle(_28);
+var _13=this._getDegrees(Math.atan2(y-this.cy,x-this.cx)+Math.PI/2);
+var _14=this._getValueForAngle(_13);
 if(this._rangeData){
-for(var i=0;(i<this._rangeData.length)&&!_23;i++){
-if((Number(this._rangeData[i].low)<=_29)&&(Number(this._rangeData[i].high)>=_29)){
-_23=this._rangeData[i];
+for(var i=0;(i<this._rangeData.length)&&!_12;i++){
+if((Number(this._rangeData[i].low)<=_14)&&(Number(this._rangeData[i].high)>=_14)){
+_12=this._rangeData[i];
 }
 }
 }
 }
-return _23;
-},_dragIndicator:function(_2b,_2c){
-var pos=dojo.coords(_2b.gaugeContent);
-var x=_2c.clientX-pos.x;
-var y=_2c.clientY-pos.y;
-var _30=_2b._getDegrees(Math.atan2(y-_2b.cy,x-_2b.cx)+Math.PI/2);
-var _31=_2b._getValueForAngle(_30);
-if(_31<_2b.min){
-_31=_2b.min;
+return _12;
+},_dragIndicator:function(_15,_16){
+var pos=dojo.coords(_15.gaugeContent);
+var x=_16.clientX-pos.x;
+var y=_16.clientY-pos.y;
+var _17=_15._getDegrees(Math.atan2(y-_15.cy,x-_15.cx)+Math.PI/2);
+var _18=_15._getValueForAngle(_17);
+if(_18<_15.min){
+_18=_15.min;
 }
-if(_31>_2b.max){
-_31=_2b.max;
+if(_18>_15.max){
+_18=_15.max;
 }
-_2b._drag.value=_31;
-_2b._drag.currentValue=_31;
-_2b._drag.onDragMove(_2b._drag);
-_2b._drag.draw(true);
-dojo.stopEvent(_2c);
+_15._drag.value=_18;
+_15._drag.currentValue=_18;
+_15._drag.onDragMove(_15._drag);
+_15._drag.draw(true);
+dojo.stopEvent(_16);
 }});
 }
diff --git a/dojox/widget/AutoRotator.js b/dojox/widget/AutoRotator.js
new file mode 100644
index 0000000..c11cabb
--- /dev/null
+++ b/dojox/widget/AutoRotator.js
@@ -0,0 +1,104 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.widget.AutoRotator"]){
+dojo._hasResource["dojox.widget.AutoRotator"]=true;
+dojo.provide("dojox.widget.AutoRotator");
+dojo.require("dojox.widget.Rotator");
+(function(d){
+d.declare("dojox.widget.AutoRotator",dojox.widget.Rotator,{suspendOnHover:false,duration:4000,autoStart:true,pauseOnManualChange:false,cycles:-1,random:false,reverse:false,constructor:function(){
+var _1=this;
+if(_1.cycles-0==_1.cycles&&_1.cycles>0){
+_1.cycles++;
+}else{
+_1.cycles=_1.cycles?-1:0;
+}
+_1._connects=[d.connect(_1._domNode,"onmouseover",function(){
+if(_1.suspendOnHover&&!_1.anim&&!_1.wfe){
+var t=_1._endTime,n=_1._now();
+_1._suspended=true;
+_1._resetTimer();
+_1._resumeDuration=t>n?t-n:0.01;
+}
+}),d.connect(_1._domNode,"onmouseout",function(){
+if(_1.suspendOnHover&&!_1.anim){
+_1._suspended=false;
+if(_1.playing&&!_1.wfe){
+_1.play(true);
+}
+}
+})];
+if(_1.autoStart&&_1.panes.length>1){
+_1.play();
+}else{
+_1.pause();
+}
+},destroy:function(){
+d.forEach(this._connects,d.disconnect);
+this.inherited(arguments);
+},play:function(_2,_3){
+this.playing=true;
+this._resetTimer();
+if(_2!==true&&this.cycles>0){
+this.cycles--;
+}
+if(this.cycles==0){
+this.pause();
+}else{
+if(!this._suspended){
+this.onUpdate("play");
+if(_3){
+this._cycle();
+}else{
+var r=(this._resumeDuration||0)-0,u=(r>0?r:(this.panes[this.idx].duration||this.duration))-0;
+this._resumeDuration=0;
+this._endTime=this._now()+u;
+this._timer=setTimeout(d.hitch(this,"_cycle",false),u);
+}
+}
+}
+},pause:function(){
+this.playing=this._suspended=false;
+this.cycles=-1;
+this._resetTimer();
+this.onUpdate("pause");
+},_now:function(){
+return (new Date()).getTime();
+},_resetTimer:function(){
+clearTimeout(this._timer);
+},_cycle:function(_4){
+var _5=this,i=_5.idx,j;
+if(_5.random){
+do{
+j=Math.floor(Math.random()*_5.panes.length+1);
+}while(j==i);
+}else{
+j=i+(_5.reverse?-1:1);
+}
+var _6=_5.go(j);
+if(_6){
+_6.addCallback(function(_7){
+_5.onUpdate("cycle");
+if(_5.playing){
+_5.play(false,_7);
+}
+});
+}
+},onManualChange:function(_8){
+this.cycles=-1;
+if(_8!="play"){
+this._resetTimer();
+if(this.pauseOnManualChange){
+this.pause();
+}
+}
+if(this.playing){
+this.play();
+}
+}});
+})(dojo);
+}
diff --git a/dojox/widget/BarGauge.js b/dojox/widget/BarGauge.js
index fca0eb6..242531d 100644
--- a/dojox/widget/BarGauge.js
+++ b/dojox/widget/BarGauge.js
@@ -22,21 +22,21 @@ v=this._gauge.min;
 if(v>this._gauge.max){
 v=this._gauge.max;
 }
-var _2=this._gauge._getPosition(v);
-var _3=[];
+var _1=this._gauge._getPosition(v);
+var _2=[];
 if(this.width>1){
-_3[0]=this._gauge.surface.createRect({x:_2,y:this._gauge.dataY+this.offset,width:this.width,height:this.length});
-_3[0].setStroke({color:this.color});
-_3[0].setFill(this.color);
+_2[0]=this._gauge.surface.createRect({x:_1,y:this._gauge.dataY+this.offset,width:this.width,height:this.length});
+_2[0].setStroke({color:this.color});
+_2[0].setFill(this.color);
 }else{
-_3[0]=this._gauge.surface.createLine({x1:_2,y1:this._gauge.dataY+this.offset,x2:_2,y2:this._gauge.dataY+this.offset+this.length});
-_3[0].setStroke({color:this.color});
+_2[0]=this._gauge.surface.createLine({x1:_1,y1:this._gauge.dataY+this.offset,x2:_1,y2:this._gauge.dataY+this.offset+this.length});
+_2[0].setStroke({color:this.color});
 }
-return _3;
-},draw:function(_4){
+return _2;
+},draw:function(_3){
 var i;
 if(this.shapes){
-this._move(_4);
+this._move(_3);
 }else{
 if(this.shapes){
 for(i=0;i<this.shapes.length;i++){
@@ -63,8 +63,8 @@ v=this._gauge.min;
 if(v>this._gauge.max){
 v=this._gauge.max;
 }
-var _7=this._gauge._getPosition(v);
-this.text=this._gauge.drawText(""+this.label,_7,this._gauge.dataY+this.offset-5,"middle","top",this.color,this.font);
+var _4=this._gauge._getPosition(v);
+this.text=this._gauge.drawText(""+this.label,_4,this._gauge.dataY+this.offset-5,"middle","top",this.color,this.font);
 }
 for(i=0;i<this.shapes.length;i++){
 if(this.hover){
@@ -77,7 +77,7 @@ this.shapes[i].getEventSource().style.cursor="pointer";
 }
 this.currentValue=this.value;
 }
-},_move:function(_8){
+},_move:function(_5){
 var v=this.value;
 if(v<this.min){
 v=this.min;
@@ -88,20 +88,20 @@ v=this.max;
 var c=this._gauge._getPosition(this.currentValue);
 this.currentValue=v;
 v=this._gauge._getPosition(v)-this._gauge.dataX;
-if(_8){
+if(_5){
 this.shapes[0].applyTransform(dojox.gfx.matrix.translate(v-(this.shapes[0].matrix?this.shapes[0].matrix.dx:0),0));
 }else{
-var _b=new dojo._Animation({curve:[c,v],duration:this.duration,easing:this.easing});
-dojo.connect(_b,"onAnimate",dojo.hitch(this,function(_c){
-this.shapes[0].applyTransform(dojox.gfx.matrix.translate(_c-(this.shapes[0].matrix?this.shapes[0].matrix.dx:0),0));
+var _6=new dojo.Animation({curve:[c,v],duration:this.duration,easing:this.easing});
+dojo.connect(_6,"onAnimate",dojo.hitch(this,function(_7){
+this.shapes[0].applyTransform(dojox.gfx.matrix.translate(_7-(this.shapes[0].matrix?this.shapes[0].matrix.dx:0),0));
 }));
-_b.play();
+_6.play();
 }
 }});
 dojo.declare("dojox.widget.BarGauge",dojox.widget.gauge._Gauge,{dataX:5,dataY:5,dataWidth:0,dataHeight:0,_defaultIndicator:dojox.widget.gauge.BarLineIndicator,startup:function(){
 if(this.getChildren){
-dojo.forEach(this.getChildren(),function(_d){
-_d.startup();
+dojo.forEach(this.getChildren(),function(_8){
+_8.startup();
 });
 }
 if(!this.dataWidth){
@@ -111,10 +111,10 @@ if(!this.dataHeight){
 this.dataHeight=this.gaugeHeight-10;
 }
 this.inherited(arguments);
-},_getPosition:function(_e){
-return this.dataX+Math.floor((_e-this.min)/(this.max-this.min)*this.dataWidth);
-},_getValueForPosition:function(_f){
-return (_f-this.dataX)*(this.max-this.min)/this.dataWidth+this.min;
+},_getPosition:function(_9){
+return this.dataX+Math.floor((_9-this.min)/(this.max-this.min)*this.dataWidth);
+},_getValueForPosition:function(_a){
+return (_a-this.dataX)*(this.max-this.min)/this.dataWidth+this.min;
 },draw:function(){
 if(!this.surface){
 this.createSurface();
@@ -133,62 +133,62 @@ for(i=0;i<this._indicatorData.length;i++){
 this._indicatorData[i].draw();
 }
 }
-},drawRange:function(_11){
-if(_11.shape){
-this.surface.remove(_11.shape);
-_11.shape=null;
+},drawRange:function(_b){
+if(_b.shape){
+this.surface.remove(_b.shape);
+_b.shape=null;
 }
-var x1=this._getPosition(_11.low);
-var x2=this._getPosition(_11.high);
-var _14=this.surface.createRect({x:x1,y:this.dataY,width:x2-x1,height:this.dataHeight});
-if(dojo.isArray(_11.color)||dojo.isString(_11.color)){
-_14.setStroke({color:_11.color});
-_14.setFill(_11.color);
+var x1=this._getPosition(_b.low);
+var x2=this._getPosition(_b.high);
+var _c=this.surface.createRect({x:x1,y:this.dataY,width:x2-x1,height:this.dataHeight});
+if(dojo.isArray(_b.color)||dojo.isString(_b.color)){
+_c.setStroke({color:_b.color});
+_c.setFill(_b.color);
 }else{
-if(_11.color.type){
+if(_b.color.type){
 var y=this.dataY+this.dataHeight/2;
-_11.color.x1=x1;
-_11.color.x2=x2;
-_11.color.y1=y;
-_11.color.y2=y;
-_14.setFill(_11.color);
-_14.setStroke({color:_11.color.colors[0].color});
+_b.color.x1=x1;
+_b.color.x2=x2;
+_b.color.y1=y;
+_b.color.y2=y;
+_c.setFill(_b.color);
+_c.setStroke({color:_b.color.colors[0].color});
 }else{
-_14.setStroke({color:"green"});
-_14.setFill("green");
-_14.getEventSource().setAttribute("class",_11.color.style);
+_c.setStroke({color:"green"});
+_c.setFill("green");
+_c.getEventSource().setAttribute("class",_b.color.style);
 }
 }
-if(_11.hover){
-_14.getEventSource().setAttribute("hover",_11.hover);
+if(_b.hover){
+_c.getEventSource().setAttribute("hover",_b.hover);
 }
-_11.shape=_14;
-},getRangeUnderMouse:function(_16){
-var _17=null;
-var pos=dojo.coords(this.gaugeContent);
-var x=_16.clientX-pos.x;
-var _1a=this._getValueForPosition(x);
+_b.shape=_c;
+},getRangeUnderMouse:function(_d){
+var _e=null;
+var _f=dojo.coords(this.gaugeContent);
+var x=_d.clientX-_f.x;
+var _10=this._getValueForPosition(x);
 if(this._rangeData){
-for(var i=0;(i<this._rangeData.length)&&!_17;i++){
-if((Number(this._rangeData[i].low)<=_1a)&&(Number(this._rangeData[i].high)>=_1a)){
-_17=this._rangeData[i];
+for(var i=0;(i<this._rangeData.length)&&!_e;i++){
+if((Number(this._rangeData[i].low)<=_10)&&(Number(this._rangeData[i].high)>=_10)){
+_e=this._rangeData[i];
 }
 }
 }
-return _17;
-},_dragIndicator:function(_1c,_1d){
-var pos=dojo.coords(_1c.gaugeContent);
-var x=_1d.clientX-pos.x;
-var _20=_1c._getValueForPosition(x);
-if(_20<_1c.min){
-_20=_1c.min;
+return _e;
+},_dragIndicator:function(_11,_12){
+var pos=dojo.coords(_11.gaugeContent);
+var x=_12.clientX-pos.x;
+var _13=_11._getValueForPosition(x);
+if(_13<_11.min){
+_13=_11.min;
 }
-if(_20>_1c.max){
-_20=_1c.max;
+if(_13>_11.max){
+_13=_11.max;
 }
-_1c._drag.value=_20;
-_1c._drag.onDragMove(_1c._drag);
-_1c._drag.draw(true);
-dojo.stopEvent(_1d);
+_11._drag.value=_13;
+_11._drag.onDragMove(_11._drag);
+_11._drag.draw(true);
+dojo.stopEvent(_12);
 }});
 }
diff --git a/dojox/widget/Calendar.js b/dojox/widget/Calendar.js
index f2ccb4c..f292d95 100644
--- a/dojox/widget/Calendar.js
+++ b/dojox/widget/Calendar.js
@@ -9,25 +9,26 @@ if(!dojo._hasResource["dojox.widget.Calendar"]){
 dojo._hasResource["dojox.widget.Calendar"]=true;
 dojo.provide("dojox.widget.Calendar");
 dojo.experimental("dojox.widget.Calendar");
-dojo.require("dijit._Calendar");
+dojo.require("dijit.Calendar");
 dojo.require("dijit._Container");
-dojo.declare("dojox.widget._CalendarBase",[dijit._Widget,dijit._Templated,dijit._Container],{templateString:"<div class=\"dojoxCalendar\">\n    <div tabindex=\"0\" class=\"dojoxCalendarContainer\" style=\"visibility: visible; width: 180px; heightL 138px;\" dojoAttachPoint=\"container\">\n\t\t<div style=\"display:none\">\n\t\t\t<div dojoAttachPoint=\"previousYearLabelNode\"></div>\n\t\t\t<div dojoAttachPoint=\"nextYearLabelNode\"></div>\n\t\t\t<div dojoAttachPoint=\"monthLabelSpacer\"></d [...]
+dojo.declare("dojox.widget._CalendarBase",[dijit._Widget,dijit._Templated,dijit._Container],{templateString:dojo.cache("dojox.widget","Calendar/Calendar.html","<div class=\"dojoxCalendar\">\n    <div tabindex=\"0\" class=\"dojoxCalendarContainer\" style=\"visibility: visible;\" dojoAttachPoint=\"container\">\n\t\t<div style=\"display:none\">\n\t\t\t<div dojoAttachPoint=\"previousYearLabelNode\"></div>\n\t\t\t<div dojoAttachPoint=\"nextYearLabelNode\"></div>\n\t\t\t<div dojoAttachPoint=\" [...]
 this._views=[];
 },postMixInProperties:function(){
 var c=this.constraints;
 if(c){
-var _2=dojo.date.stamp.fromISOString;
+var _1=dojo.date.stamp.fromISOString;
 if(typeof c.min=="string"){
-c.min=_2(c.min);
+c.min=_1(c.min);
 }
 if(typeof c.max=="string"){
-c.max=_2(c.max);
+c.max=_1(c.max);
 }
 }
 },postCreate:function(){
-this._height=dojo.style(this.containerNode,"height");
 this.displayMonth=new Date(this.attr("value"));
-var _3={parent:this,_getValueAttr:dojo.hitch(this,function(){
+var _2={parent:this,_getValueAttr:dojo.hitch(this,function(){
+return new Date(this._internalValue||this.value);
+}),_getDisplayMonthAttr:dojo.hitch(this,function(){
 return new Date(this.displayMonth);
 }),_getConstraintsAttr:dojo.hitch(this,function(){
 return this.constraints;
@@ -35,17 +36,17 @@ return this.constraints;
 return this.lang;
 }),isDisabledDate:dojo.hitch(this,this.isDisabledDate),getClassForDate:dojo.hitch(this,this.getClassForDate),addFx:this.useFx?dojo.hitch(this,this.addFx):function(){
 }};
-dojo.forEach(this._views,function(_4){
-var _5=new _4(_3,dojo.create("div"));
-this.addChild(_5);
-var _6=_5.getHeader();
-if(_6){
-this.header.appendChild(_6);
-dojo.style(_6,"display","none");
-}
-dojo.style(_5.domNode,"visibility","hidden");
-dojo.connect(_5,"onValueSelected",this,"_onDateSelected");
-_5.attr("value",this.attr("value"));
+dojo.forEach(this._views,function(_3){
+var _4=new _3(_2,dojo.create("div"));
+this.addChild(_4);
+var _5=_4.getHeader();
+if(_5){
+this.header.appendChild(_5);
+dojo.style(_5,"display","none");
+}
+dojo.style(_4.domNode,"visibility","hidden");
+dojo.connect(_4,"onValueSelected",this,"_onDateSelected");
+_4.attr("value",this.attr("value"));
 },this);
 if(this._views.length<2){
 dojo.style(this.header,"cursor","auto");
@@ -53,146 +54,148 @@ dojo.style(this.header,"cursor","auto");
 this.inherited(arguments);
 this._children=this.getChildren();
 this._currentChild=0;
-var _7=new Date();
-this.footer.innerHTML="Today: "+dojo.date.locale.format(_7,{formatLength:this.footerFormat,selector:"date",locale:this.lang});
+var _6=new Date();
+this.footer.innerHTML="Today: "+dojo.date.locale.format(_6,{formatLength:this.footerFormat,selector:"date",locale:this.lang});
 dojo.connect(this.footer,"onclick",this,"goToToday");
-var _8=this._children[0];
-dojo.style(_8.domNode,"top","0px");
-dojo.style(_8.domNode,"visibility","visible");
-var _9=_8.getHeader();
-if(_9){
-dojo.style(_8.getHeader(),"display","");
-}
-dojo[_8.useHeader?"removeClass":"addClass"](this.container,"no-header");
-_8.onDisplay();
-var _a=this;
-var _b=function(_c,_d,_e){
-dijit.typematic.addMouseListener(_a[_c],_a,function(_f){
-if(_f>=0){
-_a._adjustDisplay(_d,_e);
+var _7=this._children[0];
+dojo.style(_7.domNode,"top","0px");
+dojo.style(_7.domNode,"visibility","visible");
+var _8=_7.getHeader();
+if(_8){
+dojo.style(_7.getHeader(),"display","");
+}
+dojo[_7.useHeader?"removeClass":"addClass"](this.container,"no-header");
+_7.onDisplay();
+var _9=this;
+var _a=function(_b,_c,_d){
+dijit.typematic.addMouseListener(_9[_b],_9,function(_e){
+if(_e>=0){
+_9._adjustDisplay(_c,_d);
 }
 },0.8,500);
 };
-_b("incrementMonth","month",1);
-_b("decrementMonth","month",-1);
+_a("incrementMonth","month",1);
+_a("decrementMonth","month",-1);
 this._updateTitleStyle();
-},addFx:function(_10,_11){
-},_setValueAttr:function(_12){
-if(!_12["getFullYear"]){
-_12=dojo.date.stamp.fromISOString(_12+"");
-}
-if(!this.value||dojo.date.compare(_12,this.value)){
-_12=new Date(_12);
-this.displayMonth=new Date(_12);
-if(!this.isDisabledDate(_12,this.lang)){
-this.value=_12;
-this.onChange(_12);
+},addFx:function(_f,_10){
+},_setValueAttr:function(_11){
+if(!_11["getFullYear"]){
+_11=dojo.date.stamp.fromISOString(_11+"");
+}
+if(!this.value||dojo.date.compare(_11,this.value)){
+_11=new Date(_11);
+this.displayMonth=new Date(_11);
+this._internalValue=_11;
+if(!this.isDisabledDate(_11,this.lang)&&this._currentChild==0){
+this.value=_11;
+this.onChange(_11);
 }
 this._children[this._currentChild].attr("value",this.value);
 return true;
 }
 return false;
-},isDisabledDate:function(_13,_14){
+},isDisabledDate:function(_12,_13){
 var c=this.constraints;
-var _16=dojo.date.compare;
-return c&&(c.min&&(_16(c.min,_13,"date")>0)||(c.max&&_16(c.max,_13,"date")<0));
-},onValueSelected:function(_17){
-},_onDateSelected:function(_18,_19,_1a){
-this.displayMonth=_18;
-this.attr("value",_18);
+var _14=dojo.date.compare;
+return c&&(c.min&&(_14(c.min,_12,"date")>0)||(c.max&&_14(c.max,_12,"date")<0));
+},onValueSelected:function(_15){
+},_onDateSelected:function(_16,_17,_18){
+this.displayMonth=_16;
+this.attr("value",_16);
 if(!this._transitionVert(-1)){
-if(!_19&&_19!==0){
-_19=this.attr("value");
+if(!_17&&_17!==0){
+_17=this.attr("value");
 }
-this.onValueSelected(_19);
+this.onValueSelected(_17);
 }
-},onChange:function(_1b){
+},onChange:function(_19){
 },onHeaderClick:function(e){
 this._transitionVert(1);
 },goToToday:function(){
 this.attr("value",new Date());
 this.onValueSelected(this.attr("value"));
-},_transitionVert:function(_1d){
-var _1e=this._children[this._currentChild];
-var _1f=this._children[this._currentChild+_1d];
-if(!_1f){
+},_transitionVert:function(_1a){
+var _1b=this._children[this._currentChild];
+var _1c=this._children[this._currentChild+_1a];
+if(!_1c){
 return false;
 }
-dojo.style(_1f.domNode,"visibility","visible");
-var _20=dojo.style(this.containerNode,"height");
-_1f.attr("value",this.displayMonth);
-if(_1e.header){
-dojo.style(_1e.header,"display","none");
-}
-if(_1f.header){
-dojo.style(_1f.header,"display","");
-}
-dojo.style(_1f.domNode,"top",(_20*-1)+"px");
-dojo.style(_1f.domNode,"visibility","visible");
-this._currentChild+=_1d;
-var _21=_20*_1d;
-var _22=0;
-dojo.style(_1f.domNode,"top",(_21*-1)+"px");
-var _23=dojo.animateProperty({node:_1e.domNode,properties:{top:_21},onEnd:function(){
-dojo.style(_1e.domNode,"visibility","hidden");
+dojo.style(_1c.domNode,"visibility","visible");
+var _1d=dojo.style(this.containerNode,"height");
+_1c.attr("value",this.displayMonth);
+if(_1b.header){
+dojo.style(_1b.header,"display","none");
+}
+if(_1c.header){
+dojo.style(_1c.header,"display","");
+}
+dojo.style(_1c.domNode,"top",(_1d*-1)+"px");
+dojo.style(_1c.domNode,"visibility","visible");
+this._currentChild+=_1a;
+var _1e=_1d*_1a;
+var _1f=0;
+dojo.style(_1c.domNode,"top",(_1e*-1)+"px");
+var _20=dojo.animateProperty({node:_1b.domNode,properties:{top:_1e},onEnd:function(){
+dojo.style(_1b.domNode,"visibility","hidden");
 }});
-var _24=dojo.animateProperty({node:_1f.domNode,properties:{top:_22},onEnd:function(){
-_1f.onDisplay();
+var _21=dojo.animateProperty({node:_1c.domNode,properties:{top:_1f},onEnd:function(){
+_1c.onDisplay();
 }});
-dojo[_1f.useHeader?"removeClass":"addClass"](this.container,"no-header");
-_23.play();
-_24.play();
-_1e.onBeforeUnDisplay();
-_1f.onBeforeDisplay();
+dojo[_1c.useHeader?"removeClass":"addClass"](this.container,"no-header");
+_20.play();
+_21.play();
+_1b.onBeforeUnDisplay();
+_1c.onBeforeDisplay();
 this._updateTitleStyle();
 return true;
 },_updateTitleStyle:function(){
 dojo[this._currentChild<this._children.length-1?"addClass":"removeClass"](this.header,"navToPanel");
-},_slideTable:function(_25,_26,_27){
-var _28=_25.domNode;
-var _29=_28.cloneNode(true);
-var _2a=dojo.style(_28,"width");
-_28.parentNode.appendChild(_29);
-dojo.style(_28,"left",(_2a*_26)+"px");
-_27();
-var _2b=dojo.animateProperty({node:_29,properties:{left:_2a*_26*-1},duration:500,onEnd:function(){
-_29.parentNode.removeChild(_29);
+},_slideTable:function(_22,_23,_24){
+var _25=_22.domNode;
+var _26=_25.cloneNode(true);
+var _27=dojo.style(_25,"width");
+_25.parentNode.appendChild(_26);
+dojo.style(_25,"left",(_27*_23)+"px");
+_24();
+var _28=dojo.animateProperty({node:_26,properties:{left:_27*_23*-1},duration:500,onEnd:function(){
+_26.parentNode.removeChild(_26);
 }});
-var _2c=dojo.animateProperty({node:_28,properties:{left:0},duration:500});
-_2b.play();
-_2c.play();
-},_addView:function(_2d){
-this._views.push(_2d);
-},getClassForDate:function(_2e,_2f){
-},_adjustDisplay:function(_30,_31,_32){
-var _33=this._children[this._currentChild];
-var _34=this.displayMonth=_33.adjustDate(this.displayMonth,_31);
-this._slideTable(_33,_31,function(){
-_33.attr("value",_34);
+var _29=dojo.animateProperty({node:_25,properties:{left:0},duration:500});
+_28.play();
+_29.play();
+},_addView:function(_2a){
+this._views.push(_2a);
+},getClassForDate:function(_2b,_2c){
+},_adjustDisplay:function(_2d,_2e,_2f){
+var _30=this._children[this._currentChild];
+var _31=this.displayMonth=_30.adjustDate(this.displayMonth,_2e);
+this._slideTable(_30,_2e,function(){
+_30.attr("value",_31);
 });
 }});
-dojo.declare("dojox.widget._CalendarView",dijit._Widget,{headerClass:"",useHeader:true,cloneClass:function(_35,n,_37){
-var _38=dojo.query(_35,this.domNode)[0];
-if(!_37){
-for(var i=0;i<n;i++){
-_38.parentNode.appendChild(_38.cloneNode(true));
+dojo.declare("dojox.widget._CalendarView",dijit._Widget,{headerClass:"",useHeader:true,cloneClass:function(_32,n,_33){
+var _34=dojo.query(_32,this.domNode)[0];
+var i;
+if(!_33){
+for(i=0;i<n;i++){
+_34.parentNode.appendChild(_34.cloneNode(true));
 }
 }else{
-var _3a=dojo.query(_35,this.domNode)[0];
-for(var i=0;i<n;i++){
-_38.parentNode.insertBefore(_38.cloneNode(true),_3a);
+var _35=dojo.query(_32,this.domNode)[0];
+for(i=0;i<n;i++){
+_34.parentNode.insertBefore(_34.cloneNode(true),_35);
 }
 }
-},_setText:function(_3b,_3c){
-while(_3b.firstChild){
-_3b.removeChild(_3b.firstChild);
+},_setText:function(_36,_37){
+if(_36.innerHTML!=_37){
+dojo.empty(_36);
+_36.appendChild(dojo.doc.createTextNode(_37));
 }
-_3b.appendChild(dojo.doc.createTextNode(_3c));
 },getHeader:function(){
 return this.header||(this.header=this.header=dojo.create("span",{"class":this.headerClass}));
-},onValueSelected:function(_3d){
-},adjustDate:function(_3e,_3f){
-return dojo.date.add(_3e,this.datePart,_3f);
+},onValueSelected:function(_38){
+},adjustDate:function(_39,_3a){
+return dojo.date.add(_39,this.datePart,_3a);
 },onDisplay:function(){
 },onBeforeDisplay:function(){
 },onBeforeUnDisplay:function(){
@@ -200,14 +203,14 @@ return dojo.date.add(_3e,this.datePart,_3f);
 dojo.declare("dojox.widget._CalendarDay",null,{parent:null,constructor:function(){
 this._addView(dojox.widget._CalendarDayView);
 }});
-dojo.declare("dojox.widget._CalendarDayView",[dojox.widget._CalendarView,dijit._Templated],{templateString:"<div class=\"dijitCalendarDayLabels\" style=\"left: 0px;\" dojoAttachPoint=\"dayContainer\">\n\t<div dojoAttachPoint=\"header\">\n\t\t<div dojoAttachPoint=\"monthAndYearHeader\">\n\t\t\t<span dojoAttachPoint=\"monthLabelNode\" class=\"dojoxCalendarMonthLabelNode\"></span>\n\t\t\t<span dojoAttachPoint=\"headerComma\" class=\"dojoxCalendarComma\">,</span>\n\t\t\t<span dojoAttachPoint [...]
+dojo.declare("dojox.widget._CalendarDayView",[dojox.widget._CalendarView,dijit._Templated],{templateString:dojo.cache("dojox.widget","Calendar/CalendarDay.html","<div class=\"dijitCalendarDayLabels\" style=\"left: 0px;\" dojoAttachPoint=\"dayContainer\">\n\t<div dojoAttachPoint=\"header\">\n\t\t<div dojoAttachPoint=\"monthAndYearHeader\">\n\t\t\t<span dojoAttachPoint=\"monthLabelNode\" class=\"dojoxCalendarMonthLabelNode\"></span>\n\t\t\t<span dojoAttachPoint=\"headerComma\" class=\"dojo [...]
 this.cloneClass(".dijitCalendarDayLabelTemplate",6);
 this.cloneClass(".dijitCalendarDateTemplate",6);
 this.cloneClass(".dijitCalendarWeekTemplate",5);
-var _40=dojo.date.locale.getNames("days",this.dayWidth,"standAlone",this.getLang());
-var _41=dojo.cldr.supplemental.getFirstDayOfWeek(this.getLang());
-dojo.query(".dijitCalendarDayLabel",this.domNode).forEach(function(_42,i){
-this._setText(_42,_40[(i+_41)%7]);
+var _3b=dojo.date.locale.getNames("days",this.dayWidth,"standAlone",this.getLang());
+var _3c=dojo.cldr.supplemental.getFirstDayOfWeek(this.getLang());
+dojo.query(".dijitCalendarDayLabel",this.domNode).forEach(function(_3d,i){
+this._setText(_3d,_3b[(i+_3c)%7]);
 },this);
 },onDisplay:function(){
 if(!this._addedFx){
@@ -215,103 +218,117 @@ this._addedFx=true;
 this.addFx(".dijitCalendarDateTemplate div",this.domNode);
 }
 },_onDayClick:function(e){
-var _45=new Date(this.attr("value"));
+if(typeof (e.target._date)=="undefined"){
+return;
+}
+var _3e=new Date(this.attr("displayMonth"));
 var p=e.target.parentNode;
 var c="dijitCalendar";
 var d=dojo.hasClass(p,c+"PreviousMonth")?-1:(dojo.hasClass(p,c+"NextMonth")?1:0);
 if(d){
-_45=dojo.date.add(_45,"month",d);
+_3e=dojo.date.add(_3e,"month",d);
 }
-_45.setDate(e.target._date);
-if(this.isDisabledDate(_45)){
+_3e.setDate(e.target._date);
+if(this.isDisabledDate(_3e)){
 dojo.stopEvent(e);
 return;
 }
-this.attr("value",_45);
-this.parent._onDateSelected(_45);
-},_setValueAttr:function(_49){
+this.parent._onDateSelected(_3e);
+},_setValueAttr:function(_3f){
 this._populateDays();
 },_populateDays:function(){
-var _4a=this.attr("value");
-_4a.setDate(1);
-var _4b=_4a.getDay();
-var _4c=dojo.date.getDaysInMonth(_4a);
-var _4d=dojo.date.getDaysInMonth(dojo.date.add(_4a,"month",-1));
-var _4e=new Date();
-var _4f=this.attr("value");
-var _50=dojo.cldr.supplemental.getFirstDayOfWeek(this.getLang());
-if(_50>_4b){
-_50-=7;
-}
-dojo.query(".dijitCalendarDateTemplate",this.domNode).forEach(function(_51,i){
-i+=_50;
-var _53=new Date(_4a);
-var _54,_55="dijitCalendar",adj=0;
-if(i<_4b){
-_54=_4d-_4b+i+1;
+var _40=new Date(this.attr("displayMonth"));
+_40.setDate(1);
+var _41=_40.getDay();
+var _42=dojo.date.getDaysInMonth(_40);
+var _43=dojo.date.getDaysInMonth(dojo.date.add(_40,"month",-1));
+var _44=new Date();
+var _45=this.attr("value");
+var _46=dojo.cldr.supplemental.getFirstDayOfWeek(this.getLang());
+if(_46>_41){
+_46-=7;
+}
+var _47=dojo.date.compare;
+var _48=".dijitCalendarDateTemplate";
+var _49="dijitCalendarSelectedDate";
+var _4a=this._lastDate;
+var _4b=_4a==null||_4a.getMonth()!=_40.getMonth()||_4a.getFullYear()!=_40.getFullYear();
+this._lastDate=_40;
+if(!_4b){
+dojo.query(_48,this.domNode).removeClass(_49).filter(function(_4c){
+return _4c.className.indexOf("dijitCalendarCurrent")>-1&&_4c._date==_45.getDate();
+}).addClass(_49);
+return;
+}
+dojo.query(_48,this.domNode).forEach(function(_4d,i){
+i+=_46;
+var _4e=new Date(_40);
+var _4f,_50="dijitCalendar",adj=0;
+if(i<_41){
+_4f=_43-_41+i+1;
 adj=-1;
-_55+="Previous";
+_50+="Previous";
 }else{
-if(i>=(_4b+_4c)){
-_54=i-_4b-_4c+1;
+if(i>=(_41+_42)){
+_4f=i-_41-_42+1;
 adj=1;
-_55+="Next";
+_50+="Next";
 }else{
-_54=i-_4b+1;
-_55+="Current";
+_4f=i-_41+1;
+_50+="Current";
 }
 }
 if(adj){
-_53=dojo.date.add(_53,"month",adj);
+_4e=dojo.date.add(_4e,"month",adj);
 }
-_53.setDate(_54);
-if(!dojo.date.compare(_53,_4e,"date")){
-_55="dijitCalendarCurrentDate "+_55;
+_4e.setDate(_4f);
+if(!_47(_4e,_44,"date")){
+_50="dijitCalendarCurrentDate "+_50;
 }
-if(!dojo.date.compare(_53,_4f,"date")){
-_55="dijitCalendarSelectedDate "+_55;
+if(!_47(_4e,_45,"date")&&!_47(_4e,_45,"month")&&!_47(_4e,_45,"year")){
+_50=_49+" "+_50;
 }
-if(this.isDisabledDate(_53,this.getLang())){
-_55=" dijitCalendarDisabledDate "+_55;
+if(this.isDisabledDate(_4e,this.getLang())){
+_50=" dijitCalendarDisabledDate "+_50;
 }
-var _57=this.getClassForDate(_53,this.getLang());
-if(_57){
-_55+=_57+" "+_55;
+var _51=this.getClassForDate(_4e,this.getLang());
+if(_51){
+_50+=_51+" "+_50;
 }
-_51.className=_55+"Month dijitCalendarDateTemplate";
-_51.dijitDateValue=_53.valueOf();
-var _58=dojo.query(".dijitCalendarDateLabel",_51)[0];
-this._setText(_58,_53.getDate());
-_58._date=_58.parentNode._date=_53.getDate();
+_4d.className=_50+"Month dijitCalendarDateTemplate";
+_4d.dijitDateValue=_4e.valueOf();
+var _52=dojo.query(".dijitCalendarDateLabel",_4d)[0];
+this._setText(_52,_4e.getDate());
+_52._date=_52.parentNode._date=_4e.getDate();
 },this);
-var _59=dojo.date.locale.getNames("months","wide","standAlone",this.getLang());
-this._setText(this.monthLabelNode,_59[_4a.getMonth()]);
-this._setText(this.yearLabelNode,_4a.getFullYear());
+var _53=dojo.date.locale.getNames("months","wide","standAlone",this.getLang());
+this._setText(this.monthLabelNode,_53[_40.getMonth()]);
+this._setText(this.yearLabelNode,_40.getFullYear());
 }});
 dojo.declare("dojox.widget._CalendarMonthYear",null,{constructor:function(){
 this._addView(dojox.widget._CalendarMonthYearView);
 }});
-dojo.declare("dojox.widget._CalendarMonthYearView",[dojox.widget._CalendarView,dijit._Templated],{templateString:"<div class=\"dojoxCal-MY-labels\" style=\"left: 0px;\"\t\n\tdojoAttachPoint=\"myContainer\" dojoAttachEvent=\"onclick: onClick\">\n\t\t<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" style=\"margin: auto;\">\n\t\t\t\t<tbody>\n\t\t\t\t\t\t<tr class=\"dojoxCal-MY-G-Template\">\n\t\t\t\t\t\t\t\t<td class=\"dojoxCal-MY-M-Template\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"dojox [...]
+dojo.declare("dojox.widget._CalendarMonthYearView",[dojox.widget._CalendarView,dijit._Templated],{templateString:dojo.cache("dojox.widget","Calendar/CalendarMonthYear.html","<div class=\"dojoxCal-MY-labels\" style=\"left: 0px;\"\t\n\tdojoAttachPoint=\"myContainer\" dojoAttachEvent=\"onclick: onClick\">\n\t\t<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" style=\"margin: auto;\">\n\t\t\t\t<tbody>\n\t\t\t\t\t\t<tr class=\"dojoxCal-MY-G-Template\">\n\t\t\t\t\t\t\t\t<td class=\"dojox [...]
 this.cloneClass(".dojoxCal-MY-G-Template",5,".dojoxCal-MY-btns");
 this.monthContainer=this.yearContainer=this.myContainer;
-var _5a="dojoxCalendarYearLabel";
-var _5b="dojoxCalendarDecrease";
-var _5c="dojoxCalendarIncrease";
-dojo.query("."+_5a,this.myContainer).forEach(function(_5d,idx){
-var _5f=_5c;
+var _54="dojoxCalendarYearLabel";
+var _55="dojoxCalendarDecrease";
+var _56="dojoxCalendarIncrease";
+dojo.query("."+_54,this.myContainer).forEach(function(_57,idx){
+var _58=_56;
 switch(idx){
 case 0:
-_5f=_5b;
+_58=_55;
 case 1:
-dojo.removeClass(_5d,_5a);
-dojo.addClass(_5d,_5f);
+dojo.removeClass(_57,_54);
+dojo.addClass(_57,_58);
 break;
 }
 });
-this._decBtn=dojo.query("."+_5b,this.myContainer)[0];
-this._incBtn=dojo.query("."+_5c,this.myContainer)[0];
-dojo.query(".dojoxCal-MY-M-Template",this.domNode).filter(function(_60){
-return _60.cellIndex==1;
+this._decBtn=dojo.query("."+_55,this.myContainer)[0];
+this._incBtn=dojo.query("."+_56,this.myContainer)[0];
+dojo.query(".dojoxCal-MY-M-Template",this.domNode).filter(function(_59){
+return _59.cellIndex==1;
 }).addClass("dojoxCal-MY-M-last");
 dojo.connect(this,"onBeforeDisplay",dojo.hitch(this,function(){
 this._cachedDate=new Date(this.attr("value").getTime());
@@ -330,122 +347,122 @@ this._cachedDate=this.attr("value");
 this._populateYears();
 this._populateMonths();
 this.addFx(".dojoxCalendarMonthLabel,.dojoxCalendarYearLabel ",this.myContainer);
-},_setValueAttr:function(_61){
-this._populateYears(_61.getFullYear());
+},_setValueAttr:function(_5a){
+this._populateYears(_5a.getFullYear());
 },getHeader:function(){
 return null;
-},_getMonthNames:function(_62){
-this._monthNames=this._monthNames||dojo.date.locale.getNames("months",_62,"standAlone",this.getLang());
+},_getMonthNames:function(_5b){
+this._monthNames=this._monthNames||dojo.date.locale.getNames("months",_5b,"standAlone",this.getLang());
 return this._monthNames;
 },_populateMonths:function(){
-var _63=this._getMonthNames("abbr");
-dojo.query(".dojoxCalendarMonthLabel",this.monthContainer).forEach(dojo.hitch(this,function(_64,cnt){
-this._setText(_64,_63[cnt]);
+var _5c=this._getMonthNames("abbr");
+dojo.query(".dojoxCalendarMonthLabel",this.monthContainer).forEach(dojo.hitch(this,function(_5d,cnt){
+this._setText(_5d,_5c[cnt]);
 }));
-var _66=this.attr("constraints");
-if(_66){
-var _67=new Date();
-_67.setFullYear(this._year);
+var _5e=this.attr("constraints");
+if(_5e){
+var _5f=new Date();
+_5f.setFullYear(this._year);
 var min=-1,max=12;
-if(_66.min){
-var _6a=_66.min.getFullYear();
-if(_6a>this._year){
+if(_5e.min){
+var _60=_5e.min.getFullYear();
+if(_60>this._year){
 min=12;
 }else{
-if(_6a==this._year){
-min=_66.min.getMonth();
+if(_60==this._year){
+min=_5e.min.getMonth();
 }
 }
 }
-if(_66.max){
-var _6b=_66.max.getFullYear();
-if(_6b<this._year){
+if(_5e.max){
+var _61=_5e.max.getFullYear();
+if(_61<this._year){
 max=-1;
 }else{
-if(_6b==this._year){
-max=_66.max.getMonth();
+if(_61==this._year){
+max=_5e.max.getMonth();
 }
 }
 }
-dojo.query(".dojoxCalendarMonthLabel",this.monthContainer).forEach(dojo.hitch(this,function(_6c,cnt){
-dojo[(cnt<min||cnt>max)?"addClass":"removeClass"](_6c,"dijitCalendarDisabledDate");
+dojo.query(".dojoxCalendarMonthLabel",this.monthContainer).forEach(dojo.hitch(this,function(_62,cnt){
+dojo[(cnt<min||cnt>max)?"addClass":"removeClass"](_62,"dijitCalendarDisabledDate");
 }));
 }
 var h=this.getHeader();
 if(h){
 this._setText(this.getHeader(),this.attr("value").getFullYear());
 }
-},_populateYears:function(_6f){
-var _70=this.attr("constraints");
-var _71=_6f||this.attr("value").getFullYear();
-var _72=_71-Math.floor(this.displayedYears/2);
-var min=_70&&_70.min?_70.min.getFullYear():_72-10000;
-_72=Math.max(min,_72);
-this._displayedYear=_71;
-var _74=dojo.query(".dojoxCalendarYearLabel",this.yearContainer);
-var max=_70&&_70.max?_70.max.getFullYear()-_72:_74.length;
-var _76="dijitCalendarDisabledDate";
-_74.forEach(dojo.hitch(this,function(_77,cnt){
+},_populateYears:function(_63){
+var _64=this.attr("constraints");
+var _65=_63||this.attr("value").getFullYear();
+var _66=_65-Math.floor(this.displayedYears/2);
+var min=_64&&_64.min?_64.min.getFullYear():_66-10000;
+_66=Math.max(min,_66);
+this._displayedYear=_65;
+var _67=dojo.query(".dojoxCalendarYearLabel",this.yearContainer);
+var max=_64&&_64.max?_64.max.getFullYear()-_66:_67.length;
+var _68="dijitCalendarDisabledDate";
+_67.forEach(dojo.hitch(this,function(_69,cnt){
 if(cnt<=max){
-this._setText(_77,_72+cnt);
-dojo.removeClass(_77,_76);
+this._setText(_69,_66+cnt);
+dojo.removeClass(_69,_68);
 }else{
-dojo.addClass(_77,_76);
+dojo.addClass(_69,_68);
 }
 }));
 if(this._incBtn){
-dojo[max<_74.length?"addClass":"removeClass"](this._incBtn,_76);
+dojo[max<_67.length?"addClass":"removeClass"](this._incBtn,_68);
 }
 if(this._decBtn){
-dojo[min>=_72?"addClass":"removeClass"](this._decBtn,_76);
+dojo[min>=_66?"addClass":"removeClass"](this._decBtn,_68);
 }
 var h=this.getHeader();
 if(h){
-this._setText(this.getHeader(),_72+" - "+(_72+11));
+this._setText(this.getHeader(),_66+" - "+(_66+11));
 }
 },_updateSelectedYear:function(){
 this._year=String((this._cachedDate||this.attr("value")).getFullYear());
-this._updateSelectedNode(".dojoxCalendarYearLabel",dojo.hitch(this,function(_7a,idx){
-return this._year!==null&&_7a.innerHTML==this._year;
+this._updateSelectedNode(".dojoxCalendarYearLabel",dojo.hitch(this,function(_6a,idx){
+return this._year!==null&&_6a.innerHTML==this._year;
 }));
 },_updateSelectedMonth:function(){
-var _7c=(this._cachedDate||this.attr("value")).getMonth();
-this._month=_7c;
-this._updateSelectedNode(".dojoxCalendarMonthLabel",function(_7d,idx){
-return idx==_7c;
+var _6b=(this._cachedDate||this.attr("value")).getMonth();
+this._month=_6b;
+this._updateSelectedNode(".dojoxCalendarMonthLabel",function(_6c,idx){
+return idx==_6b;
 });
-},_updateSelectedNode:function(_7f,_80){
+},_updateSelectedNode:function(_6d,_6e){
 var sel="dijitCalendarSelectedDate";
-dojo.query(_7f,this.domNode).forEach(function(_82,idx,_84){
-dojo[_80(_82,idx,_84)?"addClass":"removeClass"](_82.parentNode,sel);
+dojo.query(_6d,this.domNode).forEach(function(_6f,idx,_70){
+dojo[_6e(_6f,idx,_70)?"addClass":"removeClass"](_6f.parentNode,sel);
 });
-var _85=dojo.query(".dojoxCal-MY-M-Template div",this.myContainer).filter(function(_86){
-return dojo.hasClass(_86.parentNode,sel);
+var _71=dojo.query(".dojoxCal-MY-M-Template div",this.myContainer).filter(function(_72){
+return dojo.hasClass(_72.parentNode,sel);
 })[0];
-if(!_85){
+if(!_71){
 return;
 }
-var _87=dojo.hasClass(_85,"dijitCalendarDisabledDate");
-dojo[_87?"addClass":"removeClass"](this.okBtn,"dijitDisabled");
+var _73=dojo.hasClass(_71,"dijitCalendarDisabledDate");
+dojo[_73?"addClass":"removeClass"](this.okBtn,"dijitDisabled");
 },onClick:function(evt){
-var _89;
-var _8a=this;
+var _74;
+var _75=this;
 var sel="dijitCalendarSelectedDate";
 function hc(c){
 return dojo.hasClass(evt.target,c);
 };
 if(hc("dijitCalendarDisabledDate")){
 dojo.stopEvent(evt);
-return;
+return false;
 }
 if(hc("dojoxCalendarMonthLabel")){
-_89="dojoxCal-MY-M-Template";
+_74="dojoxCal-MY-M-Template";
 this._month=evt.target.parentNode.cellIndex+(evt.target.parentNode.parentNode.rowIndex*2);
 this._cachedDate.setMonth(this._month);
 this._updateSelectedMonth();
 }else{
 if(hc("dojoxCalendarYearLabel")){
-_89="dojoxCal-MY-Y-Template";
+_74="dojoxCal-MY-Y-Template";
 this._year=Number(evt.target.innerHTML);
 this._cachedDate.setYear(this._year);
 this._populateMonths();
@@ -453,11 +470,11 @@ this._updateSelectedYear();
 }else{
 if(hc("dojoxCalendarDecrease")){
 this._populateYears(this._displayedYear-10);
-return;
+return true;
 }else{
 if(hc("dojoxCalendarIncrease")){
 this._populateYears(this._displayedYear+10);
-return;
+return true;
 }else{
 return true;
 }
diff --git a/dojox/widget/Calendar/Calendar.html b/dojox/widget/Calendar/Calendar.html
index a5ea6c0..7aafc40 100644
--- a/dojox/widget/Calendar/Calendar.html
+++ b/dojox/widget/Calendar/Calendar.html
@@ -1,5 +1,5 @@
 <div class="dojoxCalendar">
-    <div tabindex="0" class="dojoxCalendarContainer" style="visibility: visible; width: 180px; heightL 138px;" dojoAttachPoint="container">
+    <div tabindex="0" class="dojoxCalendarContainer" style="visibility: visible;" dojoAttachPoint="container">
 		<div style="display:none">
 			<div dojoAttachPoint="previousYearLabelNode"></div>
 			<div dojoAttachPoint="nextYearLabelNode"></div>
diff --git a/dojox/widget/CalendarViews.js b/dojox/widget/CalendarViews.js
index 0dc8778..bdc0344 100644
--- a/dojox/widget/CalendarViews.js
+++ b/dojox/widget/CalendarViews.js
@@ -13,13 +13,12 @@ dojo.require("dojox.widget.Calendar");
 dojo.declare("dojox.widget._CalendarMonth",null,{constructor:function(){
 this._addView(dojox.widget._CalendarMonthView);
 }});
-dojo.declare("dojox.widget._CalendarMonthView",[dojox.widget._CalendarView,dijit._Templated],{templateString:"<div class=\"dojoxCalendarMonthLabels\" style=\"left: 0px;\"  \n\tdojoAttachPoint=\"monthContainer\" dojoAttachEvent=\"onclick: onClick\">\n    <table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" style=\"margin: auto;\">\n        <tbody>\n            <tr class=\"dojoxCalendarMonthGroupTemplate\">\n                <td class=\"dojoxCalendarMonthTemplate\">\n                     [...]
+dojo.declare("dojox.widget._CalendarMonthView",[dojox.widget._CalendarView,dijit._Templated],{templateString:dojo.cache("dojox.widget","Calendar/CalendarMonth.html","<div class=\"dojoxCalendarMonthLabels\" style=\"left: 0px;\"  \n\tdojoAttachPoint=\"monthContainer\" dojoAttachEvent=\"onclick: onClick\">\n    <table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" style=\"margin: auto;\">\n        <tbody>\n            <tr class=\"dojoxCalendarMonthGroupTemplate\">\n                <td cla [...]
 this.cloneClass(".dojoxCalendarMonthTemplate",3);
 this.cloneClass(".dojoxCalendarMonthGroupTemplate",2);
 this._populateMonths();
 this.addFx(".dojoxCalendarMonthLabel",this.domNode);
 },_setValueAttr:function(_1){
-
 this.header.innerHTML=_1.getFullYear();
 },_getMonthNames:dojox.widget._CalendarMonthYearView.prototype._getMonthNames,_populateMonths:dojox.widget._CalendarMonthYearView.prototype._populateMonths,onClick:function(_2){
 if(!dojo.hasClass(_2.target,"dojoxCalendarMonthLabel")){
@@ -34,7 +33,7 @@ this.onValueSelected(_4,_3);
 dojo.declare("dojox.widget._CalendarYear",null,{parent:null,constructor:function(){
 this._addView(dojox.widget._CalendarYearView);
 }});
-dojo.declare("dojox.widget._CalendarYearView",[dojox.widget._CalendarView,dijit._Templated],{templateString:"<div class=\"dojoxCalendarYearLabels\" style=\"left: 0px;\" dojoAttachPoint=\"yearContainer\">\n    <table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" style=\"margin: auto;\" dojoAttachEvent=\"onclick: onClick\">\n        <tbody>\n            <tr class=\"dojoxCalendarYearGroupTemplate\">\n                <td class=\"dojoxCalendarNextMonth dojoxCalendarYearTemplate\">\n        [...]
+dojo.declare("dojox.widget._CalendarYearView",[dojox.widget._CalendarView,dijit._Templated],{templateString:dojo.cache("dojox.widget","Calendar/CalendarYear.html","<div class=\"dojoxCalendarYearLabels\" style=\"left: 0px;\" dojoAttachPoint=\"yearContainer\">\n    <table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" style=\"margin: auto;\" dojoAttachEvent=\"onclick: onClick\">\n        <tbody>\n            <tr class=\"dojoxCalendarYearGroupTemplate\">\n                <td class=\"dojox [...]
 this.cloneClass(".dojoxCalendarYearTemplate",3);
 this.cloneClass(".dojoxCalendarYearGroupTemplate",2);
 this._populateYears();
diff --git a/dojox/widget/ColorPicker.js b/dojox/widget/ColorPicker.js
index 07dc1b0..f4c13f7 100644
--- a/dojox/widget/ColorPicker.js
+++ b/dojox/widget/ColorPicker.js
@@ -9,15 +9,22 @@ if(!dojo._hasResource["dojox.widget.ColorPicker"]){
 dojo._hasResource["dojox.widget.ColorPicker"]=true;
 dojo.provide("dojox.widget.ColorPicker");
 dojo.experimental("dojox.widget.ColorPicker");
+dojo.requireLocalization("dojox.widget","ColorPicker",null,"ROOT,th");
+dojo.requireLocalization("dojo.cldr","number",null,"ROOT,ar,ca,cs,da,de,de-de,el,en,en-au,en-gb,en-us,es,es-es,fi,fr,he,hu,it,ja,ja-jp,ko,ko-kr,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-cn,zh-tw");
 dojo.require("dijit.form._FormWidget");
 dojo.require("dojo.dnd.move");
 dojo.require("dojo.fx");
 dojo.require("dojox.color");
+dojo.require("dojo.i18n");
 (function(d){
-var _2=function(_3){
-return _3;
+var _1=function(_2){
+return _2;
 };
-dojo.declare("dojox.widget.ColorPicker",dijit.form._FormWidget,{showRgb:true,showHsv:true,showHex:true,webSafe:true,animatePoint:true,slideDuration:250,liveUpdate:false,PICKER_HUE_H:150,PICKER_SAT_VAL_H:150,PICKER_SAT_VAL_W:150,value:"#ffffff",_underlay:d.moduleUrl("dojox.widget","ColorPicker/images/underlay.png"),templateString:"<div class=\"dojoxColorPicker\" dojoAttachEvent=\"onkeypress: _handleKey\">\n\t<div class=\"dojoxColorPickerBox\">\n\t\t<div dojoAttachPoint=\"cursorNode\" tabI [...]
+dojo.declare("dojox.widget.ColorPicker",dijit.form._FormWidget,{showRgb:true,showHsv:true,showHex:true,webSafe:true,animatePoint:true,slideDuration:250,liveUpdate:false,PICKER_HUE_H:150,PICKER_SAT_VAL_H:150,PICKER_SAT_VAL_W:150,value:"#ffffff",_underlay:d.moduleUrl("dojox.widget","ColorPicker/images/underlay.png"),templateString:dojo.cache("dojox.widget","ColorPicker/ColorPicker.html","<div class=\"dojoxColorPicker\" dojoAttachEvent=\"onkeypress: _handleKey\">\n\t<div class=\"dojoxColorP [...]
+dojo.mixin(this,dojo.i18n.getLocalization("dojox.widget","ColorPicker"));
+dojo.mixin(this,dojo.i18n.getLocalization("dojo.cldr","number"));
+this.inherited(arguments);
+},postCreate:function(){
 this.inherited(arguments);
 if(d.isIE<7){
 this.colorUnderlay.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+this._underlay+"', sizingMethod='scale')";
@@ -36,9 +43,9 @@ if(!this.webSafe){
 this.safePreviewNode.style.visibility="hidden";
 }
 this._offset=0;
-var _4=d.marginBox(this.cursorNode);
-var _5=d.marginBox(this.hueCursorNode);
-this._shift={hue:{x:Math.round(_5.w/2)-1,y:Math.round(_5.h/2)-1},picker:{x:Math.floor(_4.w/2),y:Math.floor(_4.h/2)}};
+var _3=d.marginBox(this.cursorNode);
+var _4=d.marginBox(this.hueCursorNode);
+this._shift={hue:{x:Math.round(_4.w/2)-1,y:Math.round(_4.h/2)-1},picker:{x:Math.floor(_3.w/2),y:Math.floor(_3.h/2)}};
 this.PICKER_HUE_H=d.coords(this.hueNode).h;
 var cu=d.coords(this.colorUnderlay);
 this.PICKER_SAT_VAL_H=cu.h;
@@ -52,21 +59,21 @@ d.subscribe("/dnd/move/start",d.hitch(this,"_setTimer"));
 },startup:function(){
 this._started=true;
 this.attr("value",this.value);
-},_setValueAttr:function(_9){
+},_setValueAttr:function(_5){
 if(!this._started){
 return;
 }
-this.setColor(_9,true);
-},setColor:function(_a,_b){
-var _c=dojox.color.fromString(_a);
-this._updatePickerLocations(_c);
-this._updateColorInputs(_c);
-this._updateValue(_c,_b);
-},_setTimer:function(_d){
-dijit.focus(_d.node);
+this.setColor(_5,true);
+},setColor:function(_6,_7){
+var _8=dojox.color.fromString(_6);
+this._updatePickerLocations(_8);
+this._updateColorInputs(_8);
+this._updateValue(_8,_7);
+},_setTimer:function(_9){
+dijit.focus(_9.node);
 d.setSelectable(this.domNode,false);
 this._timer=setInterval(d.hitch(this,"_updateColor"),45);
-},_clearTimer:function(_e){
+},_clearTimer:function(_a){
 clearInterval(this._timer);
 this._timer=null;
 this.onChange(this.value);
@@ -74,51 +81,51 @@ d.setSelectable(this.domNode,true);
 },_setHue:function(h){
 d.style(this.colorUnderlay,"backgroundColor",dojox.color.fromHsv(h,100,100).toHex());
 },_updateColor:function(){
-var _10=d.style(this.hueCursorNode,"top")+this._shift.hue.y,_11=d.style(this.cursorNode,"top")+this._shift.picker.y,_12=d.style(this.cursorNode,"left")+this._shift.picker.x,h=Math.round(360-(_10/this.PICKER_HUE_H*360)),col=dojox.color.fromHsv(h,_12/this.PICKER_SAT_VAL_W*100,100-(_11/this.PICKER_SAT_VAL_H*100));
-this._updateColorInputs(col);
-this._updateValue(col,true);
+var _b=d.style(this.hueCursorNode,"top")+this._shift.hue.y,_c=d.style(this.cursorNode,"top")+this._shift.picker.y,_d=d.style(this.cursorNode,"left")+this._shift.picker.x,h=Math.round(360-(_b/this.PICKER_HUE_H*360)),_e=dojox.color.fromHsv(h,_d/this.PICKER_SAT_VAL_W*100,100-(_c/this.PICKER_SAT_VAL_H*100));
+this._updateColorInputs(_e);
+this._updateValue(_e,true);
 if(h!=this._hue){
 this._setHue(h);
 }
 },_colorInputChange:function(e){
-var col,_17=false;
+var _f,_10=false;
 switch(e.target){
 case this.hexCode:
-col=dojox.color.fromString(e.target.value);
-_17=true;
+_f=dojox.color.fromString(e.target.value);
+_10=true;
 break;
 case this.Rval:
 case this.Gval:
 case this.Bval:
-col=dojox.color.fromArray([this.Rval.value,this.Gval.value,this.Bval.value]);
-_17=true;
+_f=dojox.color.fromArray([this.Rval.value,this.Gval.value,this.Bval.value]);
+_10=true;
 break;
 case this.Hval:
 case this.Sval:
 case this.Vval:
-col=dojox.color.fromHsv(this.Hval.value,this.Sval.value,this.Vval.value);
-_17=true;
+_f=dojox.color.fromHsv(this.Hval.value,this.Sval.value,this.Vval.value);
+_10=true;
 break;
 }
-if(_17){
-this._updatePickerLocations(col);
-this._updateColorInputs(col);
-this._updateValue(col,true);
+if(_10){
+this._updatePickerLocations(_f);
+this._updateColorInputs(_f);
+this._updateValue(_f,true);
 }
-},_updateValue:function(col,_19){
+},_updateValue:function(col,_11){
 var hex=col.toHex();
 this.value=this.valueNode.value=hex;
-if(_19&&(!this._timer||this.liveUpdate)){
+if(_11&&(!this._timer||this.liveUpdate)){
 this.onChange(hex);
 }
 },_updatePickerLocations:function(col){
-var hsv=col.toHsv(),_1d=Math.round(this.PICKER_HUE_H-hsv.h/360*this.PICKER_HUE_H-this._shift.hue.y),_1e=Math.round(hsv.s/100*this.PICKER_SAT_VAL_W-this._shift.picker.x),_1f=Math.round(this.PICKER_SAT_VAL_H-hsv.v/100*this.PICKER_SAT_VAL_H-this._shift.picker.y);
+var hsv=col.toHsv(),_12=Math.round(this.PICKER_HUE_H-hsv.h/360*this.PICKER_HUE_H-this._shift.hue.y),_13=Math.round(hsv.s/100*this.PICKER_SAT_VAL_W-this._shift.picker.x),_14=Math.round(this.PICKER_SAT_VAL_H-hsv.v/100*this.PICKER_SAT_VAL_H-this._shift.picker.y);
 if(this.animatePoint){
-d.fx.slideTo({node:this.hueCursorNode,duration:this.slideDuration,top:_1d,left:0}).play();
-d.fx.slideTo({node:this.cursorNode,duration:this.slideDuration,top:_1f,left:_1e}).play();
+d.fx.slideTo({node:this.hueCursorNode,duration:this.slideDuration,top:_12,left:0}).play();
+d.fx.slideTo({node:this.cursorNode,duration:this.slideDuration,top:_14,left:_13}).play();
 }else{
-d.style(this.hueCursorNode,"top",_1d+"px");
-d.style(this.cursorNode,{left:_1e+"px",top:_1f+"px"});
+d.style(this.hueCursorNode,"top",_12+"px");
+d.style(this.cursorNode,{left:_13+"px",top:_14+"px"});
 }
 if(hsv.h!=this._hue){
 this._setHue(hsv.h);
@@ -141,25 +148,25 @@ this.hexCode.value=hex;
 }
 this.previewNode.style.backgroundColor=hex;
 if(this.webSafe){
-this.safePreviewNode.style.backgroundColor=_2(hex);
+this.safePreviewNode.style.backgroundColor=_1(hex);
 }
 },_setHuePoint:function(evt){
-var _24=evt.layerY-this._shift.hue.y;
+var _15=evt.layerY-this._shift.hue.y;
 if(this.animatePoint){
-d.fx.slideTo({node:this.hueCursorNode,duration:this.slideDuration,top:_24,left:0,onEnd:d.hitch(this,"_updateColor",true)}).play();
+d.fx.slideTo({node:this.hueCursorNode,duration:this.slideDuration,top:_15,left:0,onEnd:d.hitch(this,"_updateColor",true)}).play();
 }else{
-d.style(this.hueCursorNode,"top",_24+"px");
+d.style(this.hueCursorNode,"top",_15+"px");
 this._updateColor(false);
 }
 },_setPoint:function(evt){
-var _26=evt.layerY-this._shift.picker.y,_27=evt.layerX-this._shift.picker.x;
+var _16=evt.layerY-this._shift.picker.y,_17=evt.layerX-this._shift.picker.x;
 if(evt){
 dijit.focus(evt.target);
 }
 if(this.animatePoint){
-d.fx.slideTo({node:this.cursorNode,duration:this.slideDuration,top:_26,left:_27,onEnd:d.hitch(this,"_updateColor",true)}).play();
+d.fx.slideTo({node:this.cursorNode,duration:this.slideDuration,top:_16,left:_17,onEnd:d.hitch(this,"_updateColor",true)}).play();
 }else{
-d.style(this.cursorNode,{left:_27+"px",top:_26+"px"});
+d.style(this.cursorNode,{left:_17+"px",top:_16+"px"});
 this._updateColor(false);
 }
 },_handleKey:function(e){
diff --git a/dojox/widget/ColorPicker/ColorPicker.html b/dojox/widget/ColorPicker/ColorPicker.html
index 7bcf2f0..032f882 100644
--- a/dojox/widget/ColorPicker/ColorPicker.html
+++ b/dojox/widget/ColorPicker/ColorPicker.html
@@ -12,20 +12,20 @@
 	<div class="dojoxColorPickerOptional" dojoAttachEvent="onchange: _colorInputChange">
 		<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>
+			<tr><td>${redLabel}</td><td><input dojoAttachPoint="Rval" size="1"></td></tr>
+			<tr><td>${greenLabel}</td><td><input dojoAttachPoint="Gval" size="1"></td></tr>
+			<tr><td>${blueLabel}</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"> °</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>
+			<tr><td>${hueLabel}</td><td><input dojoAttachPoint="Hval"size="1"> ${degLabel}</td></tr>
+			<tr><td>${saturationLabel}</td><td><input dojoAttachPoint="Sval" size="1"> ${percentSign}</td></tr>
+			<tr><td>${valueLabel}</td><td><input dojoAttachPoint="Vval" size="1"> ${percentSign}</td></tr>
 			</table>
 		</div>
 		<div class="dojoxColorPickerHex" dojoAttachPoint="hexNode">	
-			hex: <input dojoAttachPoint="hexCode, focusNode, valueNode" size="6" class="dojoxColorPickerHexCode">
+			${hexLabel}: <input dojoAttachPoint="hexCode, focusNode, valueNode" size="6" class="dojoxColorPickerHexCode">
 		</div>
 	</div>
 </div>
diff --git a/dojox/widget/DataPresentation.js b/dojox/widget/DataPresentation.js
new file mode 100644
index 0000000..20accf6
--- /dev/null
+++ b/dojox/widget/DataPresentation.js
@@ -0,0 +1,395 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.widget.DataPresentation"]){
+dojo._hasResource["dojox.widget.DataPresentation"]=true;
+dojo.provide("dojox.widget.DataPresentation");
+dojo.experimental("dojox.widget.DataPresentation");
+dojo.require("dojox.grid.DataGrid");
+dojo.require("dojox.charting.Chart2D");
+dojo.require("dojox.charting.widget.Legend");
+dojo.require("dojox.charting.action2d.Tooltip");
+dojo.require("dojox.charting.action2d.Highlight");
+dojo.require("dojo.colors");
+dojo.require("dojo.data.ItemFileWriteStore");
+(function(){
+var _1=function(_2,_3,_4,_5,_6){
+var _7=[],_8=_3;
+_7[0]={value:0,text:""};
+var _9=_2.slice(0);
+if(_4){
+_9.reverse();
+}
+var _a=_9.length;
+if((_5!=="ClusteredBars")&&(_5!=="StackedBars")){
+var _b=_6.offsetWidth;
+var _c=(""+_9[0]).length*_9.length*7;
+if(_8==1){
+for(var z=1;z<500;++z){
+if((_c/z)<_b){
+break;
+}
+++_8;
+}
+}
+}
+for(var i=0;i<_a;i++){
+if(i%_8==0){
+_7.push({value:(i+1),text:_9[i]});
+}else{
+_7.push({value:(i+1),text:""});
+}
+}
+_7.push({value:(_a+1),text:""});
+return _7;
+};
+var _d=function(_e,_f){
+var _10={vertical:false,labels:_f,min:0,max:_f.length-1,majorTickStep:1,minorTickStep:1};
+if((_e==="ClusteredBars")||(_e==="StackedBars")){
+_10.vertical=true;
+}
+if((_e==="Lines")||(_e==="Areas")||(_e==="StackedAreas")){
+_10.min++;
+_10.max--;
+}
+return _10;
+};
+var _11=function(_12,_13,_14,_15){
+var _16={vertical:true,fixLower:"major",fixUpper:"major",natural:true};
+if(_13==="secondary"){
+_16.leftBottom=false;
+}
+if((_12==="ClusteredBars")||(_12==="StackedBars")){
+_16.vertical=false;
+}
+if(_14==_15){
+_16.min=_14-1;
+_16.max=_15+1;
+}
+return _16;
+};
+var _17=function(_18,_19,_1a){
+var _1b={type:_18,hAxis:"independent",vAxis:"dependent-"+_19,gap:4,lines:false,areas:false,markers:false};
+if((_18==="ClusteredBars")||(_18==="StackedBars")){
+_1b.hAxis=_1b.vAxis;
+_1b.vAxis="independent";
+}
+if((_18==="Lines")||(_18==="Hybrid-Lines")||(_18==="Areas")||(_18==="StackedAreas")){
+_1b.lines=true;
+}
+if((_18==="Areas")||(_18==="StackedAreas")){
+_1b.areas=true;
+}
+if(_18==="Lines"){
+_1b.markers=true;
+}
+if(_18==="Hybrid-Lines"){
+_1b.shadows={dx:2,dy:2,dw:2};
+_1b.type="Lines";
+}
+if(_18==="Hybrid-ClusteredColumns"){
+_1b.type="ClusteredColumns";
+}
+if(_1a){
+_1b.animate=_1a;
+}
+return _1b;
+};
+var _1c=function(_1d,_1e,_1f,_20,_21,_22,_23,_24,_25,_26){
+var _27=_1e;
+if(!_27){
+_1d.innerHTML="";
+_27=new dojox.charting.Chart2D(_1d);
+}
+if(_23){
+_23._clone=function(){
+var _28=new dojox.charting.Theme({chart:this.chart,plotarea:this.plotarea,axis:this.axis,series:this.series,marker:this.marker,antiAlias:this.antiAlias,assignColors:this.assignColors,assignMarkers:this.assigneMarkers,colors:dojo.delegate(this.colors)});
+_28.markers=this.markers;
+_28._buildMarkerArray();
+return _28;
+};
+_27.setTheme(_23);
+}
+var _29=_1(_24.series_data[0],_22,_20,_1f,_1d);
+var _2a={};
+var _2b=null;
+var _2c=null;
+var _2d=_24.series_name.length;
+for(var i=0;i<_2d;i++){
+if(_24.series_chart[i]&&(_24.series_data[i].length>0)){
+var _2e=_1f;
+var _2f=_24.series_axis[i];
+if(_2e=="Hybrid"){
+if(_24.series_charttype[i]=="line"){
+_2e="Hybrid-Lines";
+}else{
+_2e="Hybrid-ClusteredColumns";
+}
+}
+if(!_2a[_2f]){
+_2a[_2f]={};
+}
+if(!_2a[_2f][_2e]){
+var _30=_2f+"-"+_2e;
+_27.addPlot(_30,_17(_2e,_2f,_21));
+new dojox.charting.action2d.Tooltip(_27,_30);
+if((_2e!=="Lines")&&(_2e!=="Hybrid-Lines")){
+new dojox.charting.action2d.Highlight(_27,_30);
+}
+_2a[_2f][_2e]=true;
+}
+var _31=[];
+var _32=_24.series_data[i].length;
+for(var j=0;j<_32;j++){
+var val=_24.series_data[i][j];
+_31.push(val);
+if(_2b===null||val>_2b){
+_2b=val;
+}
+if(_2c===null||val<_2c){
+_2c=val;
+}
+}
+if(_20){
+_31.reverse();
+}
+var _33={plot:_2f+"-"+_2e};
+if(_24.series_linestyle[i]){
+_33.stroke={style:_24.series_linestyle[i]};
+}
+_27.addSeries(_24.series_name[i],_31,_33);
+}
+}
+_27.addAxis("independent",_d(_1f,_29));
+_27.addAxis("dependent-primary",_11(_1f,"primary",_2c,_2b));
+_27.addAxis("dependent-secondary",_11(_1f,"secondary",_2c,_2b));
+_27.render();
+return _27;
+};
+var _34=function(_35,_36,_37,_38){
+var _39=_36;
+if(!_39){
+if(_38){
+_39=new dojox.charting.widget.Legend({chart:_37,horizontal:false},_35);
+}else{
+_39=new dojox.charting.widget.Legend({chart:_37,vertical:false},_35);
+}
+}
+return _39;
+};
+var _3a=function(_3b,_3c,_3d,_3e,_3f){
+var _40=_3c||new dojox.grid.DataGrid({},_3b);
+_40.startup();
+_40.setStore(_3d,_3e,_3f);
+var _41=[];
+for(var ser=0;ser<_3d.series_name.length;ser++){
+if(_3d.series_grid[ser]&&(_3d.series_data[ser].length>0)){
+_41.push({field:"data."+ser,name:_3d.series_name[ser],width:"auto",formatter:_3d.series_gridformatter[ser]});
+}
+}
+_40.setStructure(_41);
+_40.render();
+return _40;
+};
+var _42=function(_43,_44){
+if(_44.title){
+_43.innerHTML=_44.title;
+}
+};
+var _45=function(_46,_47){
+if(_47.footer){
+_46.innerHTML=_47.footer;
+}
+};
+var _48=function(_49,_4a){
+var _4b=_49;
+if(_4a){
+var _4c=_4a.split(/[.\[\]]+/);
+for(var _4d in _4c){
+if(_4b){
+_4b=_4b[_4c[_4d]];
+}
+}
+}
+return _4b;
+};
+dojo.declare("dojox.widget.DataPresentation",null,{type:"chart",chartType:"clusteredBars",reverse:false,animate:null,labelMod:1,legendVertical:false,constructor:function(_4e,_4f){
+dojo.mixin(this,_4f);
+this.domNode=dojo.byId(_4e);
+this[this.type+"Node"]=this.domNode;
+if(typeof this.theme=="string"){
+this.theme=dojo.getObject(this.theme);
+}
+this.chartNode=dojo.byId(this.chartNode);
+this.legendNode=dojo.byId(this.legendNode);
+this.gridNode=dojo.byId(this.gridNode);
+this.titleNode=dojo.byId(this.titleNode);
+this.footerNode=dojo.byId(this.footerNode);
+if(this.url){
+this.setURL(null,this.refreshInterval);
+}else{
+if(this.data){
+this.setData(null,this.refreshInterval);
+}else{
+this.setStore();
+}
+}
+},setURL:function(url,_50){
+if(_50){
+this.cancelRefresh();
+}
+this.url=url||this.url;
+this.refreshInterval=_50||this.refreshInterval;
+var me=this;
+dojo.xhrGet({url:this.url,handleAs:"json-comment-optional",load:function(_51,_52){
+me.setData(_51);
+},error:function(xhr,_53){
+if(me.urlError&&(typeof me.urlError=="function")){
+me.urlError(xhr,_53);
+}
+}});
+if(_50&&(this.refreshInterval>0)){
+this.refreshIntervalPending=setInterval(function(){
+me.setURL();
+},this.refreshInterval);
+}
+},setData:function(_54,_55){
+if(_55){
+this.cancelRefresh();
+}
+this.data=_54||this.data;
+this.refreshInterval=_55||this.refreshInterval;
+var _56=(typeof this.series=="function")?this.series(this.data):this.series;
+var _57=[],_58=[],_59=[],_5a=[],_5b=[],_5c=[],_5d=[],_5e=[],_5f=[],_60=0;
+for(var ser=0;ser<_56.length;ser++){
+_57[ser]=_48(this.data,_56[ser].datapoints);
+if(_57[ser]&&(_57[ser].length>_60)){
+_60=_57[ser].length;
+}
+_58[ser]=[];
+_59[ser]=_56[ser].name||(_56[ser].namefield?_48(this.data,_56[ser].namefield):null)||("series "+ser);
+_5a[ser]=(_56[ser].chart!==false);
+_5b[ser]=_56[ser].charttype||"bar";
+_5c[ser]=_56[ser].linestyle;
+_5d[ser]=_56[ser].axis||"primary";
+_5e[ser]=(_56[ser].grid!==false);
+_5f[ser]=_56[ser].gridformatter;
+}
+var _61,_62,_63,_64;
+var _65=[];
+for(_61=0;_61<_60;_61++){
+_62={index:_61};
+for(ser=0;ser<_56.length;ser++){
+if(_57[ser]&&(_57[ser].length>_61)){
+_63=_48(_57[ser][_61],_56[ser].field);
+if(_5a[ser]){
+_64=parseFloat(_63);
+if(!isNaN(_64)){
+_63=_64;
+}
+}
+_62["data."+ser]=_63;
+_58[ser].push(_63);
+}
+}
+_65.push(_62);
+}
+if(_60<=0){
+_65.push({index:0});
+}
+var _66=new dojo.data.ItemFileWriteStore({data:{identifier:"index",items:_65}});
+if(this.data.title){
+_66.title=this.data.title;
+}
+if(this.data.footer){
+_66.footer=this.data.footer;
+}
+_66.series_data=_58;
+_66.series_name=_59;
+_66.series_chart=_5a;
+_66.series_charttype=_5b;
+_66.series_linestyle=_5c;
+_66.series_axis=_5d;
+_66.series_grid=_5e;
+_66.series_gridformatter=_5f;
+this.setPreparedStore(_66);
+if(_55&&(this.refreshInterval>0)){
+var me=this;
+this.refreshIntervalPending=setInterval(function(){
+me.setData();
+},this.refreshInterval);
+}
+},refresh:function(){
+if(this.url){
+this.setURL(this.url,this.refreshInterval);
+}else{
+if(this.data){
+this.setData(this.data,this.refreshInterval);
+}
+}
+},cancelRefresh:function(){
+if(this.refreshIntervalPending){
+clearInterval(this.refreshIntervalPending);
+this.refreshIntervalPending=undefined;
+}
+},setStore:function(_67,_68,_69){
+this.setPreparedStore(_67,_68,_69);
+},setPreparedStore:function(_6a,_6b,_6c){
+this.preparedstore=_6a||this.store;
+this.query=_6b||this.query;
+this.queryOptions=_6c||this.queryOptions;
+if(this.preparedstore){
+if(this.chartNode){
+this.chartWidget=_1c(this.chartNode,this.chartWidget,this.chartType,this.reverse,this.animate,this.labelMod,this.theme,this.preparedstore,this.query,this,_6c);
+}
+if(this.legendNode){
+this.legendWidget=_34(this.legendNode,this.legendWidget,this.chartWidget,this.legendVertical);
+}
+if(this.gridNode){
+this.gridWidget=_3a(this.gridNode,this.gridWidget,this.preparedstore,this.query,this.queryOptions);
+}
+if(this.titleNode){
+_42(this.titleNode,this.preparedstore);
+}
+if(this.footerNode){
+_45(this.footerNode,this.preparedstore);
+}
+}
+},getChartWidget:function(){
+return this.chartWidget;
+},getGridWidget:function(){
+return this.gridWidget;
+},destroy:function(){
+this.cancelRefresh();
+if(this.chartWidget){
+this.chartWidget.destroy();
+this.chartWidget=undefined;
+}
+if(this.legendWidget){
+this.legendWidget=undefined;
+}
+if(this.gridWidget){
+this.gridWidget=undefined;
+}
+if(this.chartNode){
+this.chartNode.innerHTML="";
+}
+if(this.legendNode){
+this.legendNode.innerHTML="";
+}
+if(this.gridNode){
+this.gridNode.innerHTML="";
+}
+if(this.titleNode){
+this.titleNode.innerHTML="";
+}
+if(this.footerNode){
+this.footerNode.innerHTML="";
+}
+}});
+})();
+}
diff --git a/dojox/widget/Dialog.js b/dojox/widget/Dialog.js
index 2c4f3a5..00af40d 100644
--- a/dojox/widget/Dialog.js
+++ b/dojox/widget/Dialog.js
@@ -10,8 +10,9 @@ dojo._hasResource["dojox.widget.Dialog"]=true;
 dojo.provide("dojox.widget.Dialog");
 dojo.experimental("dojox.widget.Dialog");
 dojo.require("dijit.Dialog");
+dojo.require("dojox.layout.ContentPane");
 dojo.require("dojox.fx");
-dojo.declare("dojox.widget.Dialog",dijit.Dialog,{templateString:"<div class=\"dojoxDialog\" tabindex=\"-1\" waiRole=\"dialog\" waiState=\"labelledby-${id}_title\">\n\t<div dojoAttachPoint=\"titleBar\" class=\"dojoxDialogTitleBar\">\n\t\t<span dojoAttachPoint=\"titleNode\" class=\"dojoxDialogTitle\" id=\"${id}_title\">${title}</span>\n\t</div>\n\t<div dojoAttachPoint=\"dojoxDialogWrapper\">\n\t\t<div dojoAttachPoint=\"containerNode\" class=\"dojoxDialogPaneContent\"></div>\n\t</div>\n\t<d [...]
+dojo.declare("dojox.widget.Dialog",[dojox.layout.ContentPane,dijit._DialogBase],{templateString:dojo.cache("dojox.widget","Dialog/Dialog.html","<div class=\"dojoxDialog\" tabindex=\"-1\" waiRole=\"dialog\" waiState=\"labelledby-${id}_title\">\n\t<div dojoAttachPoint=\"titleBar\" class=\"dojoxDialogTitleBar\">\n\t\t<span dojoAttachPoint=\"titleNode\" class=\"dojoxDialogTitle\" id=\"${id}_title\">${title}</span>\n\t</div>\n\t<div dojoAttachPoint=\"dojoxDialogWrapper\">\n\t\t<div dojoAttach [...]
 this.easing=_1.easing||dojo._defaultEasing;
 this.dimensions=_1.dimensions||[300,300];
 },_setup:function(){
@@ -28,9 +29,12 @@ this._setSize();
 this.inherited(arguments);
 },_setSize:function(){
 this._vp=dijit.getViewport();
-var tc=this.containerNode,_5=this.sizeToViewport;
-return this._displaysize={w:_5?tc.scrollWidth:this.dimensions[0],h:_5?tc.scrollHeight:this.dimensions[1]};
+var tc=this.containerNode,_3=this.sizeToViewport;
+return this._displaysize={w:_3?tc.scrollWidth:this.dimensions[0],h:_3?tc.scrollHeight:this.dimensions[1]};
 },show:function(){
+if(this.open){
+return;
+}
 this._setSize();
 dojo.style(this.closeButtonNode,"opacity",0);
 dojo.style(this.domNode,{overflow:"hidden",opacity:0,width:"1px",height:"1px"});
@@ -48,9 +52,9 @@ this._modalconnects.push(dojo.connect(dijit._underlay.domNode,"onclick",this,"on
 this._modalconnects.push(dojo.connect(this.domNode,"onmouseenter",this,"_handleNav"));
 this._modalconnects.push(dojo.connect(this.domNode,"onmouseleave",this,"_handleNav"));
 },_handleNav:function(e){
-var _8="_navOut",_9="_navIn",_a=(e.type=="mouseout"?_9:_8),_b=(e.type=="mouseout"?_8:_9);
-this[_a].stop();
-this[_b].play();
+var _4="_navOut",_5="_navIn",_6=(e.type=="mouseout"?_5:_4),_7=(e.type=="mouseout"?_4:_5);
+this[_6].stop();
+this[_7].play();
 },_position:function(){
 if(!this._started){
 return;
@@ -64,18 +68,19 @@ this.inherited(arguments);
 if(!this.open){
 dojo.style(this.containerNode,"opacity",0);
 }
-var _c=this.viewportPadding*2;
-var _d={node:this.domNode,duration:this.sizeDuration||dijit._defaultDuration,easing:this.easing,method:this.sizeMethod};
+var _8=this.viewportPadding*2;
+var _9={node:this.domNode,duration:this.sizeDuration||dijit._defaultDuration,easing:this.easing,method:this.sizeMethod};
 var ds=this._displaysize||this._setSize();
-_d["width"]=ds.w=(ds.w+_c>=this._vp.w||this.sizeToViewport)?this._vp.w-_c:ds.w;
-_d["height"]=ds.h=(ds.h+_c>=this._vp.h||this.sizeToViewport)?this._vp.h-_c:ds.h;
-this._sizing=dojox.fx.sizeTo(_d);
+_9["width"]=ds.w=(ds.w+_8>=this._vp.w||this.sizeToViewport)?this._vp.w-_8:ds.w;
+_9["height"]=ds.h=(ds.h+_8>=this._vp.h||this.sizeToViewport)?this._vp.h-_8:ds.h;
+this._sizing=dojox.fx.sizeTo(_9);
 this._sizingConnect=this.connect(this._sizing,"onEnd","_showContent");
 this._sizing.play();
 },_showContent:function(e){
-var _10=this.containerNode;
-dojo.style(this.domNode,"overflow","visible");
-dojo.style(_10,{height:this._displaysize.h+"px",width:this._displaysize.w+"px",overflow:"auto"});
-dojo.anim(_10,{opacity:1});
+var _a=this.containerNode;
+dojo.style(this.domNode,{overflow:"visible",opacity:1});
+dojo.style(this.closeButtonNode,"opacity",1);
+dojo.style(_a,{height:this._displaysize.h-this.titleNode.offsetHeight+"px",width:this._displaysize.w+"px",overflow:"auto"});
+dojo.anim(_a,{opacity:1});
 }});
 }
diff --git a/dojox/widget/Dialog/Dialog.css b/dojox/widget/Dialog/Dialog.css
index f4b2c07..cc073d5 100644
--- a/dojox/widget/Dialog/Dialog.css
+++ b/dojox/widget/Dialog/Dialog.css
@@ -34,7 +34,6 @@
 .dojoxDialogTitleBar {
 	
 	cursor:move;
-	position:absolute;
 	top:0;
 	left:0;
 	right:0;
diff --git a/dojox/widget/DocTester.js b/dojox/widget/DocTester.js
index d81ddb7..f393ce2 100644
--- a/dojox/widget/DocTester.js
+++ b/dojox/widget/DocTester.js
@@ -13,7 +13,7 @@ dojo.require("dijit._Widget");
 dojo.require("dijit._Templated");
 dojo.require("dojox.form.BusyButton");
 dojo.require("dojox.testing.DocTest");
-dojo.declare("dojox.widget.DocTester",[dijit._Widget,dijit._Templated],{templateString:"<div dojoAttachPoint=\"domNode\" class=\"dojoxDocTester\">\n\t<div dojoAttachPoint=\"containerNode\"></div>\n\t<button dojoType=\"dojox.form.BusyButton\" busyLabel=\"Testing...\" dojoAttachPoint=\"runButtonNode\">Run tests</button>\n\t<button dojoType=\"dijit.form.Button\" dojoAttachPoint=\"resetButtonNode\" style=\"display:none;\">Reset</button>\n\t<span>\n\t\t<span dojoAttachPoint=\"numTestsNode\">0 [...]
+dojo.declare("dojox.widget.DocTester",[dijit._Widget,dijit._Templated],{templateString:dojo.cache("dojox.widget","DocTester/DocTester.html","<div dojoAttachPoint=\"domNode\" class=\"dojoxDocTester\">\n\t<div dojoAttachPoint=\"containerNode\"></div>\n\t<button dojoType=\"dojox.form.BusyButton\" busyLabel=\"Testing...\" dojoAttachPoint=\"runButtonNode\">Run tests</button>\n\t<button dojoType=\"dijit.form.Button\" dojoAttachPoint=\"resetButtonNode\" style=\"display:none;\">Reset</button>\n\ [...]
 var _2=_1.innerHTML;
 this.doctests=new dojox.testing.DocTest();
 this.tests=this.doctests.getTestsFromString(this._unescapeHtml(_2));
@@ -22,11 +22,11 @@ var _4=_2.split("\n");
 var _5="<div class=\"actualResult\">FAILED, actual result was: <span class=\"result\"></span></div>";
 var _6="<pre class=\"testCase testNum0 odd\">";
 for(var i=0;i<_4.length;i++){
-var _8=dojo.indexOf(_3,i);
-if(_8>0&&_8!=-1){
-var _9=_8%2?"even":"odd";
+var _7=dojo.indexOf(_3,i);
+if(_7>0&&_7!=-1){
+var _8=_7%2?"even":"odd";
 _6+=_5;
-_6+="</pre><pre class=\"testCase testNum"+_8+" "+_9+"\">";
+_6+="</pre><pre class=\"testCase testNum"+_7+" "+_8+"\">";
 }
 _6+=_4[i].replace(/^\s+/,"")+"\n";
 }
@@ -38,19 +38,19 @@ dojo.connect(this.runButtonNode,"onClick",dojo.hitch(this,"runTests"));
 dojo.connect(this.resetButtonNode,"onClick",dojo.hitch(this,"reset"));
 this.numTestsNode.innerHTML=this.tests.length;
 },runTests:function(){
-var _a={ok:0,nok:0};
+var _9={ok:0,nok:0};
 for(var i=0;i<this.tests.length;i++){
-var _c=this.doctests.runTest(this.tests[i].commands,this.tests[i].expectedResult);
-dojo.query(".testNum"+i,this.domNode).addClass(_c.success?"resultOk":"resultNok");
-if(!_c.success){
-_a.nok++;
-this.numTestsNokNode.innerHTML=_a.nok;
-var _d=dojo.query(".testNum"+i+" .actualResult",this.domNode)[0];
-dojo.style(_d,"display","inline");
-dojo.query(".result",_d)[0].innerHTML=dojo.toJson(_c.actualResult);
+var _a=this.doctests.runTest(this.tests[i].commands,this.tests[i].expectedResult);
+dojo.query(".testNum"+i,this.domNode).addClass(_a.success?"resultOk":"resultNok");
+if(!_a.success){
+_9.nok++;
+this.numTestsNokNode.innerHTML=_9.nok;
+var _b=dojo.query(".testNum"+i+" .actualResult",this.domNode)[0];
+dojo.style(_b,"display","inline");
+dojo.query(".result",_b)[0].innerHTML=dojo.toJson(_a.actualResult);
 }else{
-_a.ok++;
-this.numTestsOkNode.innerHTML=_a.ok;
+_9.ok++;
+this.numTestsOkNode.innerHTML=_9.ok;
 }
 }
 this.runButtonNode.cancel();
@@ -63,8 +63,8 @@ this.numTestsOkNode.innerHTML="0";
 this.numTestsNokNode.innerHTML="0";
 dojo.query(".actualResult",this.domNode).style("display","none");
 dojo.query(".testCase",this.domNode).removeClass("resultOk").removeClass("resultNok");
-},_unescapeHtml:function(_e){
-_e=String(_e).replace(/&/gm,"&").replace(/</gm,"<").replace(/>/gm,">").replace(/"/gm,"\"");
-return _e;
+},_unescapeHtml:function(_c){
+_c=String(_c).replace(/&/gm,"&").replace(/</gm,"<").replace(/>/gm,">").replace(/"/gm,"\"");
+return _c;
 }});
 }
diff --git a/dojox/widget/DynamicTooltip.js b/dojox/widget/DynamicTooltip.js
new file mode 100644
index 0000000..de83ef3
--- /dev/null
+++ b/dojox/widget/DynamicTooltip.js
@@ -0,0 +1,44 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.widget.DynamicTooltip"]){
+dojo._hasResource["dojox.widget.DynamicTooltip"]=true;
+dojo.provide("dojox.widget.DynamicTooltip");
+dojo.experimental("dojox.widget.DynamicTooltip");
+dojo.require("dijit.Tooltip");
+dojo.requireLocalization("dijit","loading",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
+dojo.declare("dojox.widget.DynamicTooltip",dijit.Tooltip,{hasLoaded:false,href:"",label:"",preventCache:false,postMixInProperties:function(){
+this.inherited(arguments);
+this._setLoadingLabel();
+},_setLoadingLabel:function(){
+if(this.href){
+this.label=dojo.i18n.getLocalization("dijit","loading",this.lang).loadingState;
+}
+},_setHrefAttr:function(_1){
+this.href=_1;
+this.hasLoaded=false;
+},loadContent:function(){
+if(!this.hasLoaded&&this.href){
+this._setLoadingLabel();
+this.hasLoaded=true;
+dojo.xhrGet({url:this.href,handleAs:"text",tooltipWidget:this,load:function(_2,_3){
+this.tooltipWidget.label=_2;
+this.tooltipWidget.close();
+this.tooltipWidget.open();
+},preventCache:this.preventCache});
+}
+},refresh:function(){
+this.hasLoaded=false;
+},open:function(_4){
+_4=_4||this._connectNodes[0];
+if(!_4){
+return;
+}
+this.loadContent();
+this.inherited(arguments);
+}});
+}
diff --git a/dojox/widget/FeedPortlet.js b/dojox/widget/FeedPortlet.js
new file mode 100644
index 0000000..37e9d3c
--- /dev/null
+++ b/dojox/widget/FeedPortlet.js
@@ -0,0 +1,227 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.widget.FeedPortlet"]){
+dojo._hasResource["dojox.widget.FeedPortlet"]=true;
+dojo.provide("dojox.widget.FeedPortlet");
+dojo.require("dojox.widget.Portlet");
+dojo.require("dijit.Tooltip");
+dojo.require("dijit.form.TextBox");
+dojo.require("dijit.form.Button");
+dojo.require("dojox.data.GoogleFeedStore");
+dojo.declare("dojox.widget.FeedPortlet",dojox.widget.Portlet,{local:false,maxResults:5,url:"",openNew:true,showFeedTitle:true,postCreate:function(){
+this.inherited(arguments);
+if(this.local&&!dojox.data.AtomReadStore){
+throw Error(this.declaredClass+": To use local feeds, you must include dojox.data.AtomReadStore on the page.");
+}
+},onFeedError:function(){
+this.containerNode.innerHTML="Error accessing the feed.";
+},addChild:function(_1){
+this.inherited(arguments);
+var _2=_1.attr("feedPortletUrl");
+if(_2){
+this.attr("url",_2);
+}
+},_getTitle:function(_3){
+var t=this.store.getValue(_3,"title");
+return this.local?t.text:t;
+},_getLink:function(_4){
+var l=this.store.getValue(_4,"link");
+return this.local?l.href:l;
+},_getContent:function(_5){
+var c=this.store.getValue(_5,"summary");
+if(!c){
+return null;
+}
+if(this.local){
+c=c.text;
+}
+c=c.split("<script").join("<!--").split("</script>").join("-->");
+c=c.split("<iframe").join("<!--").split("</iframe>").join("-->");
+return c;
+},_setUrlAttr:function(_6){
+this.url=_6;
+if(this._started){
+this.load();
+}
+},startup:function(){
+if(this.started||this._started){
+return;
+}
+this.inherited(arguments);
+if(!this.url||this.url==""){
+throw new Error(this.id+": A URL must be specified for the feed portlet");
+}
+if(this.url&&this.url!=""){
+this.load();
+}
+},load:function(){
+if(this._resultList){
+dojo.destroy(this._resultList);
+}
+var _7,_8;
+if(this.local){
+_7=new dojox.data.AtomReadStore({url:this.url});
+_8={};
+}else{
+_7=new dojox.data.GoogleFeedStore();
+_8={url:this.url};
+}
+var _9={query:_8,count:this.maxResults,onComplete:dojo.hitch(this,function(_a){
+if(this.showFeedTitle&&_7.getFeedValue){
+var _b=this.store.getFeedValue("title");
+if(_b){
+this.attr("title",_b.text?_b.text:_b);
+}
+}
+this.generateResults(_a);
+}),onError:dojo.hitch(this,"onFeedError")};
+this.store=_7;
+_7.fetch(_9);
+},generateResults:function(_c){
+var _d=this.store;
+var _e;
+var ul=this._resultList=dojo.create("ul",{"class":"dojoxFeedPortletList"},this.containerNode);
+dojo.forEach(_c,dojo.hitch(this,function(_f){
+var li=dojo.create("li",{innerHTML:"<a href=\""+this._getLink(_f)+"\""+(this.openNew?" target=\"_blank\"":"")+">"+this._getTitle(_f)+"</a>"},ul);
+dojo.connect(li,"onmouseover",dojo.hitch(this,function(evt){
+if(_e){
+clearTimeout(_e);
+}
+_e=setTimeout(dojo.hitch(this,function(){
+_e=null;
+var _10=this._getContent(_f);
+if(!_10){
+return;
+}
+var _11="<div class=\"dojoxFeedPortletPreview\">"+_10+"</div>";
+dojo.query("li",ul).forEach(function(_12){
+if(_12!=evt.target){
+dijit.hideTooltip(_12);
+}
+});
+dijit.showTooltip(_11,li.firstChild);
+}),500);
+}));
+dojo.connect(li,"onmouseout",function(){
+if(_e){
+clearTimeout(_e);
+_e=null;
+}
+dijit.hideTooltip(li.firstChild);
+});
+}));
+this.resize();
+}});
+dojo.declare("dojox.widget.ExpandableFeedPortlet",dojox.widget.FeedPortlet,{onlyOpenOne:false,generateResults:function(_13){
+var _14=this.store;
+var _15="dojoxPortletToggleIcon";
+var _16="dojoxPortletItemCollapsed";
+var _17="dojoxPortletItemOpen";
+var _18;
+var ul=this._resultList=dojo.create("ul",{"class":"dojoxFeedPortletExpandableList"},this.containerNode);
+dojo.forEach(_13,dojo.hitch(this,dojo.hitch(this,function(_19){
+var li=dojo.create("li",{"class":_16},ul);
+var _1a=dojo.create("div",{style:"width: 100%;"},li);
+var _1b=dojo.create("div",{"class":"dojoxPortletItemSummary",innerHTML:this._getContent(_19)},li);
+dojo.create("span",{"class":_15,innerHTML:"<img src='"+dojo.config.baseUrl+"/resources/blank.gif'>"},_1a);
+var a=dojo.create("a",{href:this._getLink(_19),innerHTML:this._getTitle(_19)},_1a);
+if(this.openNew){
+dojo.attr(a,"target","_blank");
+}
+})));
+dojo.connect(ul,"onclick",dojo.hitch(this,function(evt){
+if(dojo.hasClass(evt.target,_15)||dojo.hasClass(evt.target.parentNode,_15)){
+dojo.stopEvent(evt);
+var li=evt.target.parentNode;
+while(li.tagName!="LI"){
+li=li.parentNode;
+}
+if(this.onlyOpenOne){
+dojo.query("li",ul).filter(function(_1c){
+return _1c!=li;
+}).removeClass(_17).addClass(_16);
+}
+var _1d=dojo.hasClass(li,_17);
+dojo.toggleClass(li,_17,!_1d);
+dojo.toggleClass(li,_16,_1d);
+}
+}));
+}});
+dojo.declare("dojox.widget.PortletFeedSettings",dojox.widget.PortletSettings,{"class":"dojoxPortletFeedSettings",urls:null,selectedIndex:0,buildRendering:function(){
+if(this.urls&&this.urls.length>0){
+var s=dojo.create("select");
+if(this.srcNodeRef){
+dojo.place(s,this.srcNodeRef,"before");
+dojo.destroy(this.srcNodeRef);
+}
+this.srcNodeRef=s;
+dojo.forEach(this.urls,function(url){
+dojo.create("option",{value:url.url||url,innerHTML:url.label||url},s);
+});
+}
+if(this.srcNodeRef.tagName=="SELECT"){
+this.text=this.srcNodeRef;
+var div=dojo.create("div",{},this.srcNodeRef,"before");
+div.appendChild(this.text);
+this.srcNodeRef=div;
+dojo.query("option",this.text).filter("return !item.value;").forEach("item.value = item.innerHTML");
+if(!this.text.value){
+dojo.attr(s||this.text,"value",this.text.options[this.selectedIndex].value);
+}
+}
+this.inherited(arguments);
+},postCreate:function(){
+if(!this.text){
+var _1e=this.text=new dijit.form.TextBox({});
+dojo.create("span",{innerHTML:"Choose Url: "},this.domNode);
+this.addChild(_1e);
+}
+this.addChild(new dijit.form.Button({label:"Load",onClick:dojo.hitch(this,function(){
+this.portlet.attr("url",(this.text.tagName=="SELECT")?this.text.value:this.text.attr("value"));
+if(this.text.tagName=="SELECT"){
+dojo.some(this.text.options,dojo.hitch(this,function(opt,idx){
+if(opt.selected){
+this.attr("selectedIndex",idx);
+return true;
+}
+return false;
+}));
+}
+this.toggle();
+})}));
+this.addChild(new dijit.form.Button({label:"Cancel",onClick:dojo.hitch(this,"toggle")}));
+this.inherited(arguments);
+},startup:function(){
+if(this._started){
+return;
+}
+this.inherited(arguments);
+if(!this.portlet){
+throw Error(this.declaredClass+": A PortletFeedSettings widget cannot exist without a Portlet.");
+}
+if(this.text.tagName=="SELECT"){
+dojo.forEach(this.text.options,dojo.hitch(this,function(opt,_1f){
+dojo.attr(opt,"selected",_1f==this.selectedIndex);
+}));
+}
+var url=this.portlet.attr("url");
+if(url){
+if(this.text.tagName=="SELECT"){
+if(!this.urls&&dojo.query("option[value='"+url+"']",this.text).length<1){
+dojo.place(dojo.create("option",{value:url,innerHTML:url,selected:"true"}),this.text,"first");
+}
+}else{
+this.text.attr("value",url);
+}
+}else{
+this.portlet.attr("url",this.attr("feedPortletUrl"));
+}
+},_getFeedPortletUrlAttr:function(){
+return this.text.value;
+}});
+}
diff --git a/dojox/widget/FilePicker.js b/dojox/widget/FilePicker.js
index 2603cb2..18e49d3 100644
--- a/dojox/widget/FilePicker.js
+++ b/dojox/widget/FilePicker.js
@@ -11,7 +11,7 @@ dojo.provide("dojox.widget.FilePicker");
 dojo.require("dojox.widget.RollingList");
 dojo.require("dojo.i18n");
 dojo.requireLocalization("dojox.widget","FilePicker",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
-dojo.declare("dojox.widget._FileInfoPane",[dojox.widget._RollingListPane],{templateString:"",templateString:"<div class=\"dojoxFileInfoPane\">\n\t<table>\n\t\t<tbody>\n\t\t\t<tr>\n\t\t\t\t<td class=\"dojoxFileInfoLabel dojoxFileInfoNameLabel\">${_messages.name}</td>\n\t\t\t\t<td class=\"dojoxFileInfoName\" dojoAttachPoint=\"nameNode\"></td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<td class=\"dojoxFileInfoLabel dojoxFileInfoPathLabel\">${_messages.path}</td>\n\t\t\t\t<td class=\"dojoxFileInfoPa [...]
+dojo.declare("dojox.widget._FileInfoPane",[dojox.widget._RollingListPane],{templateString:"",templateString:dojo.cache("dojox.widget","FilePicker/_FileInfoPane.html","<div class=\"dojoxFileInfoPane\">\n\t<table>\n\t\t<tbody>\n\t\t\t<tr>\n\t\t\t\t<td class=\"dojoxFileInfoLabel dojoxFileInfoNameLabel\">${_messages.name}</td>\n\t\t\t\t<td class=\"dojoxFileInfoName\" dojoAttachPoint=\"nameNode\"></td>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<td class=\"dojoxFileInfoLabel dojoxFileInfoPathLabel\">$ [...]
 this._messages=dojo.i18n.getLocalization("dojox.widget","FilePicker",this.lang);
 this.inherited(arguments);
 },onItems:function(){
@@ -38,9 +38,9 @@ return true;
 }else{
 if(this._isIdentity){
 var _5=[this.store.getIdentity(_3),this.store.getIdentity(_4)];
-dojo.forEach(_5,function(i,_7){
+dojo.forEach(_5,function(i,_6){
 if(i.lastIndexOf(this.pathSeparator)==(i.length-1)){
-_5[_7]=i.substring(0,i.length-1);
+_5[_6]=i.substring(0,i.length-1);
 }else{
 }
 },this);
@@ -55,23 +55,23 @@ if(this._started){
 return;
 }
 this.inherited(arguments);
-var _8,_9=this.getChildren()[0];
-var _a=dojo.hitch(this,function(){
-if(_8){
-this.disconnect(_8);
-}
-delete _8;
-var _b=_9.items[0];
-if(_b){
-var _c=this.store;
-var _d=_c.getValue(_b,this.parentAttr);
-var _e=_c.getValue(_b,this.pathAttr);
-this.pathSeparator=this.pathSeparator||_c.pathSeparator;
+var _7,_8=this.getChildren()[0];
+var _9=dojo.hitch(this,function(){
+if(_7){
+this.disconnect(_7);
+}
+delete _7;
+var _a=_8.items[0];
+if(_a){
+var _b=this.store;
+var _c=_b.getValue(_a,this.parentAttr);
+var _d=_b.getValue(_a,this.pathAttr);
+this.pathSeparator=this.pathSeparator||_b.pathSeparator;
 if(!this.pathSeparator){
-this.pathSeparator=_e.substring(_d.length,_d.length+1);
+this.pathSeparator=_d.substring(_c.length,_c.length+1);
 }
 if(!this.topDir){
-this.topDir=_d;
+this.topDir=_c;
 if(this.topDir.lastIndexOf(this.pathSeparator)!=(this.topDir.length-1)){
 this.topDir+=this.pathSeparator;
 }
@@ -79,57 +79,57 @@ this.topDir+=this.pathSeparator;
 }
 });
 if(!this.pathSeparator||!this.topDir){
-if(!_9.items){
-_8=this.connect(_9,"onItems",_a);
+if(!_8.items){
+_7=this.connect(_8,"onItems",_9);
 }else{
-_a();
+_9();
 }
 }
-},getChildItems:function(_f){
-var ret=this.inherited(arguments);
-if(!ret&&this.store.getValue(_f,"directory")){
-ret=[];
+},getChildItems:function(_e){
+var _f=this.inherited(arguments);
+if(!_f&&this.store.getValue(_e,"directory")){
+_f=[];
 }
-return ret;
-},getMenuItemForItem:function(_11,_12,_13){
-var _14={iconClass:"dojoxDirectoryItemIcon"};
-if(!this.store.getValue(_11,"directory")){
-_14.iconClass="dojoxFileItemIcon";
-var l=this.store.getLabel(_11),idx=l.lastIndexOf(".");
+return _f;
+},getMenuItemForItem:function(_10,_11,_12){
+var _13={iconClass:"dojoxDirectoryItemIcon"};
+if(!this.store.getValue(_10,"directory")){
+_13.iconClass="dojoxFileItemIcon";
+var l=this.store.getLabel(_10),idx=l.lastIndexOf(".");
 if(idx>=0){
-_14.iconClass+=" dojoxFileItemIcon_"+l.substring(idx+1);
+_13.iconClass+=" dojoxFileItemIcon_"+l.substring(idx+1);
 }
 if(!this.selectFiles){
-_14.disabled=true;
+_13.disabled=true;
 }
 }
-var ret=new dijit.MenuItem(_14);
+var ret=new dijit.MenuItem(_13);
 return ret;
-},getPaneForItem:function(_18,_19,_1a){
+},getPaneForItem:function(_14,_15,_16){
 var ret=null;
-if(!_18||(this.store.isItem(_18)&&this.store.getValue(_18,"directory"))){
+if(!_14||(this.store.isItem(_14)&&this.store.getValue(_14,"directory"))){
 ret=new dojox.widget._RollingListGroupPane({});
 }else{
-if(this.store.isItem(_18)&&!this.store.getValue(_18,"directory")){
+if(this.store.isItem(_14)&&!this.store.getValue(_14,"directory")){
 ret=new dojox.widget._FileInfoPane({});
 }
 }
 return ret;
-},_setPathValueAttr:function(_1c,_1d,_1e){
-if(!_1c){
+},_setPathValueAttr:function(_17,_18,_19){
+if(!_17){
 this.attr("value",null);
 return;
 }
-if(_1c.lastIndexOf(this.pathSeparator)==(_1c.length-1)){
-_1c=_1c.substring(0,_1c.length-1);
+if(_17.lastIndexOf(this.pathSeparator)==(_17.length-1)){
+_17=_17.substring(0,_17.length-1);
 }
-this.store.fetchItemByIdentity({identity:_1c,onItem:function(v){
-if(_1d){
+this.store.fetchItemByIdentity({identity:_17,onItem:function(v){
+if(_18){
 this._lastExecutedValue=v;
 }
 this.attr("value",v);
-if(_1e){
-_1e();
+if(_19){
+_19();
 }
 },scope:this});
 },_getPathValueAttr:function(val){
@@ -141,20 +141,20 @@ return this.store.getValue(val,this.pathAttr);
 }else{
 return "";
 }
-},_setValue:function(_21){
+},_setValue:function(_1a){
 delete this._setInProgress;
-var _22=this.store;
-if(_21&&_22.isItem(_21)){
-var _23=this.store.getValue(_21,"directory");
-if((_23&&!this.selectDirectories)||(!_23&&!this.selectFiles)){
+var _1b=this.store;
+if(_1a&&_1b.isItem(_1a)){
+var _1c=this.store.getValue(_1a,"directory");
+if((_1c&&!this.selectDirectories)||(!_1c&&!this.selectFiles)){
 return;
 }
 }else{
-_21=null;
+_1a=null;
 }
-if(!this._itemsMatch(this.value,_21)){
-this.value=_21;
-this._onChange(_21);
+if(!this._itemsMatch(this.value,_1a)){
+this.value=_1a;
+this._onChange(_1a);
 }
 }});
 }
diff --git a/dojox/widget/FisheyeList.js b/dojox/widget/FisheyeList.js
index ed56f8d..6ffea3b 100644
--- a/dojox/widget/FisheyeList.js
+++ b/dojox/widget/FisheyeList.js
@@ -18,7 +18,7 @@ this.timerScale=1;
 },EDGE:{CENTER:0,LEFT:1,RIGHT:2,TOP:3,BOTTOM:4},templateString:"<div class=\"dojoxFisheyeListBar\" dojoAttachPoint=\"containerNode\"></div>",snarfChildDomOutput:true,itemWidth:40,itemHeight:40,itemMaxWidth:150,itemMaxHeight:150,imgNode:null,orientation:"horizontal",isFixed:false,conservativeTrigger:false,effectUnits:2,itemPadding:10,attachEdge:"center",labelEdge:"bottom",postCreate:function(){
 var e=this.EDGE;
 dojo.setSelectable(this.domNode,false);
-var _2=this.isHorizontal=(this.orientation=="horizontal");
+var _1=this.isHorizontal=(this.orientation=="horizontal");
 this.selectedNode=-1;
 this.isOver=false;
 this.hitX1=-1;
@@ -30,7 +30,7 @@ this.labelEdge=this._toEdge(this.labelEdge,e.TOP);
 if(this.labelEdge==e.CENTER){
 this.labelEdge=e.TOP;
 }
-if(_2){
+if(_1){
 if(this.anchorEdge==e.LEFT){
 this.anchorEdge=e.CENTER;
 }
@@ -57,11 +57,11 @@ if(this.labelEdge==e.BOTTOM){
 this.labelEdge=e.LEFT;
 }
 }
-var _3=this.effectUnits;
-this.proximityLeft=this.itemWidth*(_3-0.5);
-this.proximityRight=this.itemWidth*(_3-0.5);
-this.proximityTop=this.itemHeight*(_3-0.5);
-this.proximityBottom=this.itemHeight*(_3-0.5);
+var _2=this.effectUnits;
+this.proximityLeft=this.itemWidth*(_2-0.5);
+this.proximityRight=this.itemWidth*(_2-0.5);
+this.proximityTop=this.itemHeight*(_2-0.5);
+this.proximityBottom=this.itemHeight*(_2-0.5);
 if(this.anchorEdge==e.LEFT){
 this.proximityLeft=0;
 }
@@ -103,48 +103,48 @@ 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 _5=this.isHorizontal?this.itemWidth:this.itemHeight;
-var r=this.effectUnits*_5;
+var _3=this.isHorizontal?this.itemWidth:this.itemHeight;
+var r=this.effectUnits*_3;
 var c=this.isHorizontal?this.children[i].cenX:this.children[i].cenY;
-var _8=this.isHorizontal?this.proximityLeft:this.proximityTop;
-var _9=this.isHorizontal?this.proximityRight:this.proximityBottom;
-var _a=this.isHorizontal?this.barWidth:this.barHeight;
-var _b=r;
-var _c=r;
-if(_b>c+_8){
-_b=c+_8;
+var _4=this.isHorizontal?this.proximityLeft:this.proximityTop;
+var _5=this.isHorizontal?this.proximityRight:this.proximityBottom;
+var _6=this.isHorizontal?this.barWidth:this.barHeight;
+var _7=r;
+var _8=r;
+if(_7>c+_4){
+_7=c+_4;
 }
-if(_c>(_a-c+_9)){
-_c=_a-c+_9;
+if(_8>(_6-c+_5)){
+_8=_6-c+_5;
 }
-this.children[i].effectRangeLeft=_b/_5;
-this.children[i].effectRangeRght=_c/_5;
+this.children[i].effectRangeLeft=_7/_3;
+this.children[i].effectRangeRght=_8/_3;
 }
 this.domNode.style.width=this.barWidth+"px";
 this.domNode.style.height=this.barHeight+"px";
 for(var i=0;i<this.children.length;i++){
-var _d=this.children[i];
-var _e=_d.domNode;
-_e.style.left=_d.posX+"px";
-_e.style.top=_d.posY+"px";
-_e.style.width=this.itemWidth+"px";
-_e.style.height=this.itemHeight+"px";
-_d.imgNode.style.left=this.itemPadding+"%";
-_d.imgNode.style.top=this.itemPadding+"%";
-_d.imgNode.style.width=(100-2*this.itemPadding)+"%";
-_d.imgNode.style.height=(100-2*this.itemPadding)+"%";
+var _9=this.children[i];
+var _a=_9.domNode;
+_a.style.left=_9.posX+"px";
+_a.style.top=_9.posY+"px";
+_a.style.width=this.itemWidth+"px";
+_a.style.height=this.itemHeight+"px";
+_9.imgNode.style.left=this.itemPadding+"%";
+_9.imgNode.style.top=this.itemPadding+"%";
+_9.imgNode.style.width=(100-2*this.itemPadding)+"%";
+_9.imgNode.style.height=(100-2*this.itemPadding)+"%";
 }
 this._calcHitGrid();
-},_overElement:function(_f,e){
-_f=dojo.byId(_f);
-var _11={x:e.pageX,y:e.pageY};
-var bb=dojo._getBorderBox(_f);
-var _13=dojo.coords(_f,true);
-var top=_13.y;
-var _15=top+bb.h;
-var _16=_13.x;
-var _17=_16+bb.w;
-return (_11.x>=_16&&_11.x<=_17&&_11.y>=top&&_11.y<=_15);
+},_overElement:function(_b,e){
+_b=dojo.byId(_b);
+var _c={x:e.pageX,y:e.pageY};
+var bb=dojo._getBorderBox(_b);
+var _d=dojo.coords(_b,true);
+var _e=_d.y;
+var _f=_e+bb.h;
+var _10=_d.x;
+var _11=_10+bb.w;
+return (_c.x>=_10&&_c.x<=_11&&_c.y>=_e&&_c.y<=_f);
 },_onBodyOut:function(e){
 if(this._overElement(dojo.body(),e)){
 return;
@@ -199,65 +199,65 @@ var prx=this.isHorizontal?this.proximityLeft:this.proximityTop;
 var siz=this.isHorizontal?this.itemWidth:this.itemHeight;
 var sim=this.isHorizontal?(1-this.timerScale)*this.itemWidth+this.timerScale*this.itemMaxWidth:(1-this.timerScale)*this.itemHeight+this.timerScale*this.itemMaxHeight;
 var cen=((pos-prx)/siz)-0.5;
-var _25=(sim/siz)-0.5;
-if(_25>this.effectUnits){
-_25=this.effectUnits;
+var _12=(sim/siz)-0.5;
+if(_12>this.effectUnits){
+_12=this.effectUnits;
 }
-var _26=0;
+var _13=0;
 if(this.anchorEdge==this.EDGE.BOTTOM){
-var _27=(y-this.proximityTop)/this.itemHeight;
-_26=(_27>0.5)?1:y/(this.proximityTop+(this.itemHeight/2));
+var _14=(y-this.proximityTop)/this.itemHeight;
+_13=(_14>0.5)?1:y/(this.proximityTop+(this.itemHeight/2));
 }
 if(this.anchorEdge==this.EDGE.TOP){
-var _27=(y-this.proximityTop)/this.itemHeight;
-_26=(_27<0.5)?1:(this.totalHeight-y)/(this.proximityBottom+(this.itemHeight/2));
+var _14=(y-this.proximityTop)/this.itemHeight;
+_13=(_14<0.5)?1:(this.totalHeight-y)/(this.proximityBottom+(this.itemHeight/2));
 }
 if(this.anchorEdge==this.EDGE.RIGHT){
-var _27=(x-this.proximityLeft)/this.itemWidth;
-_26=(_27>0.5)?1:x/(this.proximityLeft+(this.itemWidth/2));
+var _14=(x-this.proximityLeft)/this.itemWidth;
+_13=(_14>0.5)?1:x/(this.proximityLeft+(this.itemWidth/2));
 }
 if(this.anchorEdge==this.EDGE.LEFT){
-var _27=(x-this.proximityLeft)/this.itemWidth;
-_26=(_27<0.5)?1:(this.totalWidth-x)/(this.proximityRight+(this.itemWidth/2));
+var _14=(x-this.proximityLeft)/this.itemWidth;
+_13=(_14<0.5)?1:(this.totalWidth-x)/(this.proximityRight+(this.itemWidth/2));
 }
 if(this.anchorEdge==this.EDGE.CENTER){
 if(this.isHorizontal){
-_26=y/(this.totalHeight);
+_13=y/(this.totalHeight);
 }else{
-_26=x/(this.totalWidth);
+_13=x/(this.totalWidth);
 }
-if(_26>0.5){
-_26=1-_26;
+if(_13>0.5){
+_13=1-_13;
 }
-_26*=2;
+_13*=2;
 }
 for(var i=0;i<this.itemCount;i++){
-var _29=this._weighAt(cen,i);
-if(_29<0){
-_29=0;
+var _15=this._weighAt(cen,i);
+if(_15<0){
+_15=0;
 }
-this._setItemSize(i,_29*_26);
+this._setItemSize(i,_15*_13);
 }
-var _2a=Math.round(cen);
-var _2b=0;
+var _16=Math.round(cen);
+var _17=0;
 if(cen<0){
-_2a=0;
+_16=0;
 }else{
 if(cen>this.itemCount-1){
-_2a=this.itemCount-1;
+_16=this.itemCount-1;
 }else{
-_2b=(cen-_2a)*((this.isHorizontal?this.itemWidth:this.itemHeight)-this.children[_2a].sizeMain);
+_17=(cen-_16)*((this.isHorizontal?this.itemWidth:this.itemHeight)-this.children[_16].sizeMain);
 }
 }
-this._positionElementsFrom(_2a,_2b);
+this._positionElementsFrom(_16,_17);
 },_weighAt:function(cen,i){
-var _2e=Math.abs(cen-i);
-var _2f=((cen-i)>0)?this.children[i].effectRangeRght:this.children[i].effectRangeLeft;
-return (_2e>_2f)?0:(1-_2e/_2f);
-},_setItemSize:function(p,_31){
-_31*=this.timerScale;
-var w=Math.round(this.itemWidth+((this.itemMaxWidth-this.itemWidth)*_31));
-var h=Math.round(this.itemHeight+((this.itemMaxHeight-this.itemHeight)*_31));
+var _18=Math.abs(cen-i);
+var _19=((cen-i)>0)?this.children[i].effectRangeRght:this.children[i].effectRangeLeft;
+return (_18>_19)?0:(1-_18/_19);
+},_setItemSize:function(p,_1a){
+_1a*=this.timerScale;
+var w=Math.round(this.itemWidth+((this.itemMaxWidth-this.itemWidth)*_1a));
+var h=Math.round(this.itemHeight+((this.itemMaxHeight-this.itemHeight)*_1a));
 if(this.isHorizontal){
 this.children[p].sizeW=w;
 this.children[p].sizeH=h;
@@ -300,33 +300,33 @@ this.children[p].domNode.style.height=h+"px";
 if(this.children[p].svgNode){
 this.children[p].svgNode.setSize(w,h);
 }
-},_positionElementsFrom:function(p,_37){
+},_positionElementsFrom:function(p,_1b){
 var pos=0;
 if(this.isHorizontal){
-pos=Math.round(this.children[p].usualX+_37);
+pos=Math.round(this.children[p].usualX+_1b);
 this.children[p].domNode.style.left=pos+"px";
 }else{
-pos=Math.round(this.children[p].usualY+_37);
+pos=Math.round(this.children[p].usualY+_1b);
 this.children[p].domNode.style.top=pos+"px";
 }
 this._positionLabel(this.children[p]);
-var _39=pos;
+var _1c=pos;
 for(var i=p-1;i>=0;i--){
-_39-=this.children[i].sizeMain;
+_1c-=this.children[i].sizeMain;
 if(this.isHorizontal){
-this.children[i].domNode.style.left=_39+"px";
+this.children[i].domNode.style.left=_1c+"px";
 }else{
-this.children[i].domNode.style.top=_39+"px";
+this.children[i].domNode.style.top=_1c+"px";
 }
 this._positionLabel(this.children[i]);
 }
-var _3b=pos;
+var _1d=pos;
 for(var i=p+1;i<this.itemCount;i++){
-_3b+=this.children[i-1].sizeMain;
+_1d+=this.children[i-1].sizeMain;
 if(this.isHorizontal){
-this.children[i].domNode.style.left=_3b+"px";
+this.children[i].domNode.style.left=_1d+"px";
 }else{
-this.children[i].domNode.style.top=_3b+"px";
+this.children[i].domNode.style.top=_1d+"px";
 }
 this._positionLabel(this.children[i]);
 }
@@ -389,20 +389,20 @@ catch(e){
 }else{
 return wh&&!isNaN(wh.nodeType);
 }
-},_hasParent:function(_44){
-return Boolean(_44&&_44.parentNode&&this._isNode(_44.parentNode));
+},_hasParent:function(_1e){
+return Boolean(_1e&&_1e.parentNode&&this._isNode(_1e.parentNode));
 },postCreate:function(){
 if((this.iconSrc.toLowerCase().substring(this.iconSrc.length-4)==".png")&&dojo.isIE<7){
 if(this._hasParent(this.imgNode)&&this.id!=""){
-var _45=this.imgNode.parentNode;
-_45.setAttribute("id",this.id);
+var _1f=this.imgNode.parentNode;
+_1f.setAttribute("id",this.id);
 }
 this.imgNode.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+this.iconSrc+"', sizingMethod='scale')";
 this.imgNode.src=this._blankGif.toString();
 }else{
 if(this._hasParent(this.imgNode)&&this.id!=""){
-var _45=this.imgNode.parentNode;
-_45.setAttribute("id",this.id);
+var _1f=this.imgNode.parentNode;
+_1f.setAttribute("id",this.id);
 }
 this.imgNode.src=this.iconSrc;
 }
diff --git a/dojox/widget/FisheyeLite.js b/dojox/widget/FisheyeLite.js
index cb87798..5222017 100644
--- a/dojox/widget/FisheyeLite.js
+++ b/dojox/widget/FisheyeLite.js
@@ -11,7 +11,7 @@ dojo.provide("dojox.widget.FisheyeLite");
 dojo.experimental("dojox.widget.FisheyeLite");
 dojo.require("dijit._Widget");
 dojo.require("dojo.fx.easing");
-dojo.declare("dojox.widget.FisheyeLite",dijit._Widget,{durationIn:350,easeIn:dojo.fx.easing.backOut,durationOut:1420,easeOut:dojo.fx.easing.elasticOut,properties:null,unit:"px",constructor:function(_1,_2){
+dojo.declare("dojox.widget.FisheyeLite",dijit._Widget,{durationIn:350,easeIn:dojo.fx.easing.backOut,durationOut:1420,easeOut:dojo.fx.easing.elasticOut,properties:null,units:"px",constructor:function(_1,_2){
 this.properties=_1.properties||{fontSize:2.75};
 },postCreate:function(){
 this.inherited(arguments);
@@ -29,9 +29,9 @@ this._runningOut.play();
 },_makeAnims:function(){
 var _3={},_4={},cs=dojo.getComputedStyle(this._target);
 for(var p in this.properties){
-var _7=this.properties[p],_8=dojo.isObject(_7),v=parseInt(cs[p]);
-_4[p]={end:v,unit:this.unit};
-_3[p]=_8?_7:{end:_7*v,unit:this.unit};
+var _5=this.properties[p],_6=dojo.isObject(_5),v=parseInt(cs[p]);
+_4[p]={end:v,units:this.units};
+_3[p]=_6?_5:{end:_5*v,units:this.units};
 }
 this._runningIn=dojo.animateProperty({node:this._target,easing:this.easeIn,duration:this.durationIn,properties:_3});
 this._runningOut=dojo.animateProperty({node:this._target,duration:this.durationOut,easing:this.easeOut,properties:_4});
diff --git a/dojox/widget/Iterator.js b/dojox/widget/Iterator.js
index 65fc687..256be19 100644
--- a/dojox/widget/Iterator.js
+++ b/dojox/widget/Iterator.js
@@ -48,36 +48,36 @@ this.fetch();
 }else{
 this.onDataAvailable(this.data||this.dataValues);
 }
-},_addItem:function(_9,_a){
-if(dojo.isString(_9)){
-_9={value:_9};
+},_addItem:function(_2,_3){
+if(dojo.isString(_2)){
+_2={value:_2};
 }
-var _b=new this.widgetCtor(_9);
-this.children.push(_b);
-dojo.place(_b.domNode,this._srcParent,this._srcIndex+_a);
-},getAttrValuesObj:function(_c){
-var _d={};
-if(dojo.isString(_c)){
-dojo.forEach(this.attrs,function(_e){
-_d[_e]=(_e=="value")?_c:this.defaultValue;
+var _4=new this.widgetCtor(_2);
+this.children.push(_4);
+dojo.place(_4.domNode,this._srcParent,this._srcIndex+_3);
+},getAttrValuesObj:function(_5){
+var _6={};
+if(dojo.isString(_5)){
+dojo.forEach(this.attrs,function(_7){
+_6[_7]=(_7=="value")?_5:this.defaultValue;
 },this);
 }else{
-dojo.forEach(this.attrs,function(_f){
+dojo.forEach(this.attrs,function(_8){
 if(this.store){
-_d[_f]=this.store.getValue(_c,_f)||this.defaultValue;
+_6[_8]=this.store.getValue(_5,_8)||this.defaultValue;
 }else{
-_d[_f]=_c[_f]||this.defaultValue;
+_6[_8]=_5[_8]||this.defaultValue;
 }
 },this);
 }
-return _d;
-},onDataAvailable:function(_10){
+return _6;
+},onDataAvailable:function(_9){
 this.clear();
-dojo.forEach(_10,function(_11,idx){
-this._addItem(this.getAttrValuesObj(_11),idx);
+dojo.forEach(_9,function(_a,_b){
+this._addItem(this.getAttrValuesObj(_a),_b);
 },this);
-},fetch:function(_13,_14,end){
-this.store.fetch({query:_13||this.query,start:_14||this.start,count:end||this.fetchMax,onComplete:dojo.hitch(this,"onDataAvailable")});
+},fetch:function(_c,_d,_e){
+this.store.fetch({query:_c||this.query,start:_d||this.start,count:_e||this.fetchMax,onComplete:dojo.hitch(this,"onDataAvailable")});
 }});
 dojox.widget.Iterator._classes={};
 }
diff --git a/dojox/widget/Pager.js b/dojox/widget/Pager.js
index 07450d5..b860f0e 100644
--- a/dojox/widget/Pager.js
+++ b/dojox/widget/Pager.js
@@ -12,7 +12,7 @@ dojo.experimental("dojox.widget.Pager");
 dojo.require("dijit._Widget");
 dojo.require("dijit._Templated");
 dojo.require("dojo.fx");
-dojo.declare("dojox.widget.Pager",[dijit._Widget,dijit._Templated],{templateString:"<div dojoAttachPoint=\"pagerContainer\" tabIndex=\"0\" dojoAttachEvent=\"onkeypress: _handleKey, onfocus: _a11yStyle, onblur:_a11yStyle\" class=\"${orientation}PagerContainer\">\n    <div class=\"pagerContainer\">\n\t\t<div dojoAttachPoint=\"pagerContainerStatus\" class=\"${orientation}PagerStatus\"></div>\n\t\t<div dojoAttachPoint=\"pagerContainerView\" class=\"${orientation}PagerView\">\n\t\t    <div do [...]
+dojo.declare("dojox.widget.Pager",[dijit._Widget,dijit._Templated],{templateString:dojo.cache("dojox.widget","Pager/Pager.html","<div dojoAttachPoint=\"pagerContainer\" tabIndex=\"0\" dojoAttachEvent=\"onkeypress: _handleKey, onfocus: _a11yStyle, onblur:_a11yStyle\" class=\"${orientation}PagerContainer\">\n    <div class=\"pagerContainer\">\n\t\t<div dojoAttachPoint=\"pagerContainerStatus\" class=\"${orientation}PagerStatus\"></div>\n\t\t<div dojoAttachPoint=\"pagerContainerView\" class= [...]
 var h=(this.orientation=="horizontal");
 dojo.mixin(this,{_totalPages:0,_currentPage:1,dirClass:"pager"+(h?"Horizontal":"Vertical"),iconNext:dojo.moduleUrl("dojox.widget","Pager/images/"+(h?"h":"v")+"Next.png"),iconPrevious:dojo.moduleUrl("dojox.widget","Pager/images/"+(h?"h":"v")+"Previous.png")});
 },postCreate:function(){
@@ -22,8 +22,8 @@ this.store.fetch({onComplete:dojo.hitch(this,"_init")});
 dojo[(e.type=="focus"?"addClass":"removeClass")](e.target,"pagerFocus");
 },_handleKey:function(e){
 var dk=dojo.keys;
-var _5=(e.charCode==dk.SPACE?dk.SPACE:e.keyCode);
-switch(_5){
+var _1=(e.charCode==dk.SPACE?dk.SPACE:e.keyCode);
+switch(_1){
 case dk.UP_ARROW:
 case dk.RIGHT_ARROW:
 case 110:
@@ -49,122 +49,122 @@ break;
 }
 break;
 }
-},_init:function(_6){
-this.items=_6;
+},_init:function(_2){
+this.items=_2;
 this._renderPages();
 this._renderStatus();
 this._renderPager();
 },_renderPages:function(){
-var _7=this.pagerContainerView;
-var _h=(this.orientation=="horizontal");
-var _9=dojo.style;
-if(_h){
-var _a=dojo.marginBox(this.pagerContainerPager).h;
-var _b=dojo.marginBox(this.pagerContainerStatus).h;
+var _3=this.pagerContainerView;
+var _4=(this.orientation=="horizontal");
+var _5=dojo.style;
+if(_4){
+var _6=dojo.marginBox(this.pagerContainerPager).h;
+var _7=dojo.marginBox(this.pagerContainerStatus).h;
 if(this.pagerPos!="center"){
-var _c=_a+_b;
+var _8=_6+_7;
 }else{
-var _c=_b;
-var _d=this.pagerIconNext.width;
-var _e=_9(_7,"width");
-var _f=_e-(2*_d);
-_9(_7,{width:_f+"px",marginLeft:this.pagerIconNext.width+"px",marginRight:this.pagerIconNext.width+"px"});
-}
-var _10=_9(this.pagerContainer,"height")-_c;
-_9(this.pagerContainerView,"height",_10+"px");
-var _11=Math.floor(_9(_7,"width")/this.itemsPage);
+var _8=_7;
+var _9=this.pagerIconNext.width;
+var _a=_5(_3,"width");
+var _b=_a-(2*_9);
+_5(_3,{width:_b+"px",marginLeft:this.pagerIconNext.width+"px",marginRight:this.pagerIconNext.width+"px"});
+}
+var _c=_5(this.pagerContainer,"height")-_8;
+_5(this.pagerContainerView,"height",_c+"px");
+var _d=Math.floor(_5(_3,"width")/this.itemsPage);
 if(this.statusPos=="trailing"){
 if(this.pagerPos!="center"){
-_9(_7,"marginTop",_a+"px");
+_5(_3,"marginTop",_6+"px");
 }
-_9(_7,"marginBottom",_b+"px");
+_5(_3,"marginBottom",_7+"px");
 }else{
-_9(_7,"marginTop",_b+"px");
+_5(_3,"marginTop",_7+"px");
 if(this.pagerPos!="center"){
-_9(_7,"marginTop",_a+"px");
+_5(_3,"marginTop",_6+"px");
 }
 }
 }else{
-var _12=dojo.marginBox(this.pagerContainerPager).w;
-var _13=dojo.marginBox(this.pagerContainerStatus).w;
-var _14=_9(this.pagerContainer,"width");
+var _e=dojo.marginBox(this.pagerContainerPager).w;
+var _f=dojo.marginBox(this.pagerContainerStatus).w;
+var _10=_5(this.pagerContainer,"width");
 if(this.pagerPos!="center"){
-var _15=_12+_13;
+var _11=_e+_f;
 }else{
-var _15=_13;
-var _16=this.pagerIconNext.height;
-var _17=_9(_7,"height");
-var _18=_17-(2*_16);
-_9(_7,{height:_18+"px",marginTop:this.pagerIconNext.height+"px",marginBottom:this.pagerIconNext.height+"px"});
-}
-var _19=_9(this.pagerContainer,"width")-_15;
-_9(_7,"width",_19+"px");
-var _11=Math.floor(_9(_7,"height")/this.itemsPage);
+var _11=_f;
+var _12=this.pagerIconNext.height;
+var _13=_5(_3,"height");
+var _14=_13-(2*_12);
+_5(_3,{height:_14+"px",marginTop:this.pagerIconNext.height+"px",marginBottom:this.pagerIconNext.height+"px"});
+}
+var _15=_5(this.pagerContainer,"width")-_11;
+_5(_3,"width",_15+"px");
+var _d=Math.floor(_5(_3,"height")/this.itemsPage);
 if(this.statusPos=="trailing"){
 if(this.pagerPos!="center"){
-_9(_7,"marginLeft",_12+"px");
+_5(_3,"marginLeft",_e+"px");
 }
-_9(_7,"marginRight",_13+"px");
+_5(_3,"marginRight",_f+"px");
 }else{
-_9(_7,"marginLeft",_13+"px");
+_5(_3,"marginLeft",_f+"px");
 if(this.pagerPos!="center"){
-_9(_7,"marginRight",_12+"px");
-}
-}
-}
-var _1a=dojo.getObject(this.itemClass);
-var _1b="padding"+(_h?"Left":"Top");
-var _1c="padding"+(_h?"Right":"Bottom");
-dojo.forEach(this.items,function(_1d,cnt){
-var _1f=dojo.create("div",{innerHTML:_1d.content});
-var _20=new _1a({id:this.id+"-item-"+(cnt+1)},_1f);
-this.pagerItems.appendChild(_20.domNode);
-var _21={};
-_21[(_h?"width":"height")]=(_11-this.itemSpace)+"px";
-var p=(_h?"height":"width");
-_21[p]=_9(_7,p)+"px";
-_9(_20.containerNode,_21);
+_5(_3,"marginRight",_e+"px");
+}
+}
+}
+var _16=dojo.getObject(this.itemClass);
+var _17="padding"+(_4?"Left":"Top");
+var _18="padding"+(_4?"Right":"Bottom");
+dojo.forEach(this.items,function(_19,cnt){
+var _1a=dojo.create("div",{innerHTML:_19.content});
+var _1b=new _16({id:this.id+"-item-"+(cnt+1)},_1a);
+this.pagerItems.appendChild(_1b.domNode);
+var _1c={};
+_1c[(_4?"width":"height")]=(_d-this.itemSpace)+"px";
+var p=(_4?"height":"width");
+_1c[p]=_5(_3,p)+"px";
+_5(_1b.containerNode,_1c);
 if(this.resizeChildren){
-_20.resizeChildren();
+_1b.resizeChildren();
 }
-_20.parseChildren();
-_9(_20.domNode,"position","absolute");
+_1b.parseChildren();
+_5(_1b.domNode,"position","absolute");
 if(cnt<this.itemsPage){
-var pos=(cnt)*_11;
-var _24=(_h?"left":"top");
-var dir=(_h?"top":"left");
-_9(_20.domNode,dir,"0px");
-_9(_20.domNode,_24,pos+"px");
+var pos=(cnt)*_d;
+var _1d=(_4?"left":"top");
+var dir=(_4?"top":"left");
+_5(_1b.domNode,dir,"0px");
+_5(_1b.domNode,_1d,pos+"px");
 }else{
-_9(_20.domNode,"top","-1000px");
-_9(_20.domNode,"left","-1000px");
+_5(_1b.domNode,"top","-1000px");
+_5(_1b.domNode,"left","-1000px");
 }
-_9(_20.domNode,_1c,(this.itemSpace/2)+"px");
-_9(_20.domNode,_1b,(this.itemSpace/2)+"px");
+_5(_1b.domNode,_18,(this.itemSpace/2)+"px");
+_5(_1b.domNode,_17,(this.itemSpace/2)+"px");
 },this);
 },_renderPager:function(){
 var tcp=this.pagerContainerPager;
-var _27="0px";
-var _h=(this.orientation=="horizontal");
-if(_h){
+var _1e="0px";
+var _1f=(this.orientation=="horizontal");
+if(_1f){
 if(this.statusPos=="center"){
 }else{
 if(this.statusPos=="trailing"){
-dojo.style(tcp,"top",_27);
+dojo.style(tcp,"top",_1e);
 }else{
-dojo.style(tcp,"bottom",_27);
+dojo.style(tcp,"bottom",_1e);
 }
 }
-dojo.style(this.pagerNext,"right",_27);
-dojo.style(this.pagerPrevious,"left",_27);
+dojo.style(this.pagerNext,"right",_1e);
+dojo.style(this.pagerPrevious,"left",_1e);
 }else{
 if(this.statusPos=="trailing"){
-dojo.style(tcp,"left",_27);
+dojo.style(tcp,"left",_1e);
 }else{
-dojo.style(tcp,"right",_27);
+dojo.style(tcp,"right",_1e);
 }
-dojo.style(this.pagerNext,"bottom",_27);
-dojo.style(this.pagerPrevious,"top",_27);
+dojo.style(this.pagerNext,"bottom",_1e);
+dojo.style(this.pagerPrevious,"top",_1e);
 }
 },_renderStatus:function(){
 this._totalPages=Math.ceil(this.items.length/this.itemsPage);
@@ -173,89 +173,89 @@ this.iconHeight=0;
 this.iconsLoaded=0;
 this._iconConnects=[];
 for(var i=1;i<=this._totalPages;i++){
-var _2a=new Image();
-var _2b=i;
-dojo.connect(_2a,"onclick",dojo.hitch(this,function(_2c){
-this._pagerSkip(_2c);
-},_2b));
-this._iconConnects[_2b]=dojo.connect(_2a,"onload",dojo.hitch(this,function(_2d){
-this.iconWidth+=_2a.width;
-this.iconHeight+=_2a.height;
+var _20=new Image();
+var _21=i;
+dojo.connect(_20,"onclick",dojo.hitch(this,function(_22){
+this._pagerSkip(_22);
+},_21));
+this._iconConnects[_21]=dojo.connect(_20,"onload",dojo.hitch(this,function(_23){
+this.iconWidth+=_20.width;
+this.iconHeight+=_20.height;
 this.iconsLoaded++;
 if(this._totalPages==this.iconsLoaded){
 if(this.orientation=="horizontal"){
 if(this.statusPos=="trailing"){
 if(this.pagerPos=="center"){
-var _2e=dojo.style(this.pagerContainer,"height");
-var _2f=dojo.style(this.pagerContainerStatus,"height");
-dojo.style(this.pagerContainerPager,"top",((_2e/2)-(_2f/2))+"px");
+var _24=dojo.style(this.pagerContainer,"height");
+var _25=dojo.style(this.pagerContainerStatus,"height");
+dojo.style(this.pagerContainerPager,"top",((_24/2)-(_25/2))+"px");
 }
 dojo.style(this.pagerContainerStatus,"bottom","0px");
 }else{
 if(this.pagerPos=="center"){
-var _2e=dojo.style(this.pagerContainer,"height");
-var _2f=dojo.style(this.pagerContainerStatus,"height");
-dojo.style(this.pagerContainerPager,"bottom",((_2e/2)-(_2f/2))+"px");
+var _24=dojo.style(this.pagerContainer,"height");
+var _25=dojo.style(this.pagerContainerStatus,"height");
+dojo.style(this.pagerContainerPager,"bottom",((_24/2)-(_25/2))+"px");
 }
 dojo.style(this.pagerContainerStatus,"top","0px");
 }
-var _30=(dojo.style(this.pagerContainer,"width")/2)-(this.iconWidth/2);
-dojo.style(this.pagerContainerStatus,"paddingLeft",_30+"px");
+var _26=(dojo.style(this.pagerContainer,"width")/2)-(this.iconWidth/2);
+dojo.style(this.pagerContainerStatus,"paddingLeft",_26+"px");
 }else{
 if(this.statusPos=="trailing"){
 if(this.pagerPos=="center"){
-var _31=dojo.style(this.pagerContainer,"width");
-var _32=dojo.style(this.pagerContainerStatus,"width");
-dojo.style(this.pagerContainerPager,"left",((_31/2)-(_32/2))+"px");
+var _27=dojo.style(this.pagerContainer,"width");
+var _28=dojo.style(this.pagerContainerStatus,"width");
+dojo.style(this.pagerContainerPager,"left",((_27/2)-(_28/2))+"px");
 }
 dojo.style(this.pagerContainerStatus,"right","0px");
 }else{
 if(this.pagerPos=="center"){
-var _31=dojo.style(this.pagerContainer,"width");
-var _32=dojo.style(this.pagerContainerStatus,"width");
-dojo.style(this.pagerContainerPager,"right",((_31/2)-(_32/2))+"px");
+var _27=dojo.style(this.pagerContainer,"width");
+var _28=dojo.style(this.pagerContainerStatus,"width");
+dojo.style(this.pagerContainerPager,"right",((_27/2)-(_28/2))+"px");
 }
 dojo.style(this.pagerContainerStatus,"left","0px");
 }
-var _30=(dojo.style(this.pagerContainer,"height")/2)-(this.iconHeight/2);
-dojo.style(this.pagerContainerStatus,"paddingTop",_30+"px");
+var _26=(dojo.style(this.pagerContainer,"height")/2)-(this.iconHeight/2);
+dojo.style(this.pagerContainerStatus,"paddingTop",_26+"px");
 }
 }
-dojo.disconnect(this._iconConnects[_2d]);
-},_2b));
+dojo.disconnect(this._iconConnects[_23]);
+},_21));
 if(i==this._currentPage){
-_2a.src=this.iconPageActive;
+_20.src=this.iconPageActive;
 }else{
-_2a.src=this.iconPage;
+_20.src=this.iconPage;
 }
-var _2b=i;
-dojo.addClass(_2a,this.orientation+"PagerIcon");
-dojo.attr(_2a,"id",this.id+"-status-"+i);
-this.pagerContainerStatus.appendChild(_2a);
+var _21=i;
+dojo.addClass(_20,this.orientation+"PagerIcon");
+dojo.attr(_20,"id",this.id+"-status-"+i);
+this.pagerContainerStatus.appendChild(_20);
 if(this.orientation=="vertical"){
-dojo.style(_2a,"display","block");
+dojo.style(_20,"display","block");
 }
 }
-},_pagerSkip:function(_33){
-if(this._currentPage==_33){
+},_pagerSkip:function(_29){
+if(this._currentPage==_29){
 return;
 }else{
-var _34;
-var _35;
-if(_33<this._currentPage){
-_34=this._currentPage-_33;
-_35=(this._totalPages+_33)-this._currentPage;
+var _2a;
+var _2b;
+if(_29<this._currentPage){
+_2a=this._currentPage-_29;
+_2b=(this._totalPages+_29)-this._currentPage;
 }else{
-_34=(this._totalPages+this._currentPage)-_33;
-_35=_33-this._currentPage;
+_2a=(this._totalPages+this._currentPage)-_29;
+_2b=_29-this._currentPage;
 }
-var b=(_35>_34);
-this._toScroll=(b?_34:_35);
+var b=(_2b>_2a);
+this._toScroll=(b?_2a:_2b);
 var cmd=(b?"_pagerPrevious":"_pagerNext");
-var _38=this.connect(this,"onScrollEnd",function(){
+var _2c=this.connect(this,"onScrollEnd",function(){
 this._toScroll--;
 if(this._toScroll<1){
-this.disconnect(_38);
+this.disconnect(_2c);
 }else{
 this[cmd]();
 }
@@ -266,22 +266,22 @@ this[cmd]();
 if(this._anim){
 return;
 }
-var _39=[];
+var _2d=[];
 for(var i=this._currentPage*this.itemsPage;i>(this._currentPage-1)*this.itemsPage;i--){
 if(!dojo.byId(this.id+"-item-"+i)){
 continue;
 }
-var _3b=dojo.byId(this.id+"-item-"+i);
-var _3c=dojo.marginBox(_3b);
+var _2e=dojo.byId(this.id+"-item-"+i);
+var _2f=dojo.marginBox(_2e);
 if(this.orientation=="horizontal"){
-var _3d=_3c.l-(this.itemsPage*_3c.w);
-_39.push(dojo.fx.slideTo({node:_3b,left:_3d,duration:this.duration}));
+var _30=_2f.l-(this.itemsPage*_2f.w);
+_2d.push(dojo.fx.slideTo({node:_2e,left:_30,duration:this.duration}));
 }else{
-var _3d=_3c.t-(this.itemsPage*_3c.h);
-_39.push(dojo.fx.slideTo({node:_3b,top:_3d,duration:this.duration}));
+var _30=_2f.t-(this.itemsPage*_2f.h);
+_2d.push(dojo.fx.slideTo({node:_2e,top:_30,duration:this.duration}));
 }
 }
-var _3e=this._currentPage;
+var _31=this._currentPage;
 if(this._currentPage==this._totalPages){
 this._currentPage=1;
 }else{
@@ -290,53 +290,53 @@ this._currentPage++;
 var cnt=this.itemsPage;
 for(var i=this._currentPage*this.itemsPage;i>(this._currentPage-1)*this.itemsPage;i--){
 if(dojo.byId(this.id+"-item-"+i)){
-var _3b=dojo.byId(this.id+"-item-"+i);
-var _3c=dojo.marginBox(_3b);
+var _2e=dojo.byId(this.id+"-item-"+i);
+var _2f=dojo.marginBox(_2e);
 if(this.orientation=="horizontal"){
-var _40=(dojo.style(this.pagerContainerView,"width")+((cnt-1)*_3c.w))-1;
-dojo.style(_3b,"left",_40+"px");
-dojo.style(_3b,"top","0px");
-var _3d=_40-(this.itemsPage*_3c.w);
-_39.push(dojo.fx.slideTo({node:_3b,left:_3d,duration:this.duration}));
+var _32=(dojo.style(this.pagerContainerView,"width")+((cnt-1)*_2f.w))-1;
+dojo.style(_2e,"left",_32+"px");
+dojo.style(_2e,"top","0px");
+var _30=_32-(this.itemsPage*_2f.w);
+_2d.push(dojo.fx.slideTo({node:_2e,left:_30,duration:this.duration}));
 }else{
-_40=(dojo.style(this.pagerContainerView,"height")+((cnt-1)*_3c.h))-1;
-dojo.style(_3b,"top",_40+"px");
-dojo.style(_3b,"left","0px");
-var _3d=_40-(this.itemsPage*_3c.h);
-_39.push(dojo.fx.slideTo({node:_3b,top:_3d,duration:this.duration}));
+_32=(dojo.style(this.pagerContainerView,"height")+((cnt-1)*_2f.h))-1;
+dojo.style(_2e,"top",_32+"px");
+dojo.style(_2e,"left","0px");
+var _30=_32-(this.itemsPage*_2f.h);
+_2d.push(dojo.fx.slideTo({node:_2e,top:_30,duration:this.duration}));
 }
 }
 cnt--;
 }
-this._anim=dojo.fx.combine(_39);
-var _41=this.connect(this._anim,"onEnd",function(){
+this._anim=dojo.fx.combine(_2d);
+var _33=this.connect(this._anim,"onEnd",function(){
 delete this._anim;
 this.onScrollEnd();
-this.disconnect(_41);
+this.disconnect(_33);
 });
 this._anim.play();
-dojo.byId(this.id+"-status-"+_3e).src=this.iconPage;
+dojo.byId(this.id+"-status-"+_31).src=this.iconPage;
 dojo.byId(this.id+"-status-"+this._currentPage).src=this.iconPageActive;
 },_pagerPrevious:function(){
 if(this._anim){
 return;
 }
-var _42=[];
+var _34=[];
 for(var i=this._currentPage*this.itemsPage;i>(this._currentPage-1)*this.itemsPage;i--){
 if(!dojo.byId(this.id+"-item-"+i)){
 continue;
 }
-var _44=dojo.byId(this.id+"-item-"+i);
-var _45=dojo.marginBox(_44);
+var _35=dojo.byId(this.id+"-item-"+i);
+var _36=dojo.marginBox(_35);
 if(this.orientation=="horizontal"){
-var _46=dojo.style(_44,"left")+(this.itemsPage*_45.w);
-_42.push(dojo.fx.slideTo({node:_44,left:_46,duration:this.duration}));
+var _37=dojo.style(_35,"left")+(this.itemsPage*_36.w);
+_34.push(dojo.fx.slideTo({node:_35,left:_37,duration:this.duration}));
 }else{
-var _46=dojo.style(_44,"top")+(this.itemsPage*_45.h);
-_42.push(dojo.fx.slideTo({node:_44,top:_46,duration:this.duration}));
+var _37=dojo.style(_35,"top")+(this.itemsPage*_36.h);
+_34.push(dojo.fx.slideTo({node:_35,top:_37,duration:this.duration}));
 }
 }
-var _47=this._currentPage;
+var _38=this._currentPage;
 if(this._currentPage==1){
 this._currentPage=this._totalPages;
 }else{
@@ -346,35 +346,35 @@ var cnt=this.itemsPage;
 var j=1;
 for(var i=this._currentPage*this.itemsPage;i>(this._currentPage-1)*this.itemsPage;i--){
 if(dojo.byId(this.id+"-item-"+i)){
-var _44=dojo.byId(this.id+"-item-"+i);
-var _45=dojo.marginBox(_44);
+var _35=dojo.byId(this.id+"-item-"+i);
+var _36=dojo.marginBox(_35);
 if(this.orientation=="horizontal"){
-var _4a=-(j*_45.w)+1;
-dojo.style(_44,"left",_4a+"px");
-dojo.style(_44,"top","0px");
-var _46=((cnt-1)*_45.w);
-_42.push(dojo.fx.slideTo({node:_44,left:_46,duration:this.duration}));
-var _46=_4a+(this.itemsPage*_45.w);
-_42.push(dojo.fx.slideTo({node:_44,left:_46,duration:this.duration}));
+var _39=-(j*_36.w)+1;
+dojo.style(_35,"left",_39+"px");
+dojo.style(_35,"top","0px");
+var _37=((cnt-1)*_36.w);
+_34.push(dojo.fx.slideTo({node:_35,left:_37,duration:this.duration}));
+var _37=_39+(this.itemsPage*_36.w);
+_34.push(dojo.fx.slideTo({node:_35,left:_37,duration:this.duration}));
 }else{
-_4a=-((j*_45.h)+1);
-dojo.style(_44,"top",_4a+"px");
-dojo.style(_44,"left","0px");
-var _46=((cnt-1)*_45.h);
-_42.push(dojo.fx.slideTo({node:_44,top:_46,duration:this.duration}));
+_39=-((j*_36.h)+1);
+dojo.style(_35,"top",_39+"px");
+dojo.style(_35,"left","0px");
+var _37=((cnt-1)*_36.h);
+_34.push(dojo.fx.slideTo({node:_35,top:_37,duration:this.duration}));
 }
 }
 cnt--;
 j++;
 }
-this._anim=dojo.fx.combine(_42);
-var _4b=dojo.connect(this._anim,"onEnd",dojo.hitch(this,function(){
+this._anim=dojo.fx.combine(_34);
+var _3a=dojo.connect(this._anim,"onEnd",dojo.hitch(this,function(){
 delete this._anim;
 this.onScrollEnd();
-dojo.disconnect(_4b);
+dojo.disconnect(_3a);
 }));
 this._anim.play();
-dojo.byId(this.id+"-status-"+_47).src=this.iconPage;
+dojo.byId(this.id+"-status-"+_38).src=this.iconPage;
 dojo.byId(this.id+"-status-"+this._currentPage).src=this.iconPageActive;
 },onScrollEnd:function(){
 }});
diff --git a/dojox/widget/PlaceholderMenuItem.js b/dojox/widget/PlaceholderMenuItem.js
index 8fbd05f..aa47168 100644
--- a/dojox/widget/PlaceholderMenuItem.js
+++ b/dojox/widget/PlaceholderMenuItem.js
@@ -25,13 +25,13 @@ if(_2<0){
 return false;
 }
 var p=this.getParent();
-dojo.forEach(_1,function(_4){
-p.addChild(_4,_2++);
+dojo.forEach(_1,function(_3){
+p.addChild(_3,_2++);
 });
 this._replacedWith=_1;
 this._replaced=true;
 return true;
-},unReplace:function(_5){
+},unReplace:function(_4){
 if(!this._replaced){
 return [];
 }
@@ -40,31 +40,31 @@ if(!p){
 return [];
 }
 var r=this._replacedWith;
-dojo.forEach(this._replacedWith,function(_8){
-p.removeChild(_8);
-if(_5){
-_8.destroy();
+dojo.forEach(this._replacedWith,function(_5){
+p.removeChild(_5);
+if(_4){
+_5.destroy();
 }
 });
 this._replacedWith=[];
 this._replaced=false;
 return r;
 }});
-dojo.extend(dijit.Menu,{getPlaceholders:function(_9){
+dojo.extend(dijit.Menu,{getPlaceholders:function(_6){
 var r=[];
-var _b=this.getChildren();
-_b.forEach(function(_c){
-if(_c._isPlaceholder&&(!_9||_c.label==_9)){
-r.push(_c);
+var _7=this.getChildren();
+_7.forEach(function(_8){
+if(_8._isPlaceholder&&(!_6||_8.label==_6)){
+r.push(_8);
 }else{
-if(_c._started&&_c.popup&&_c.popup.getPlaceholders){
-r=r.concat(_c.popup.getPlaceholders(_9));
+if(_8._started&&_8.popup&&_8.popup.getPlaceholders){
+r=r.concat(_8.popup.getPlaceholders(_6));
 }else{
-if(!_c._started&&_c.dropDownContainer){
-var _d=dojo.query("[widgetId]",_c.dropDownContainer)[0];
-var _e=dijit.byNode(_d);
-if(_e.getPlaceholders){
-r=r.concat(_e.getPlaceholders(_9));
+if(!_8._started&&_8.dropDownContainer){
+var _9=dojo.query("[widgetId]",_8.dropDownContainer)[0];
+var _a=dijit.byNode(_9);
+if(_a.getPlaceholders){
+r=r.concat(_a.getPlaceholders(_6));
 }
 }
 }
diff --git a/dojox/widget/Portlet.js b/dojox/widget/Portlet.js
new file mode 100644
index 0000000..e4ccaa1
--- /dev/null
+++ b/dojox/widget/Portlet.js
@@ -0,0 +1,222 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.widget.Portlet"]){
+dojo._hasResource["dojox.widget.Portlet"]=true;
+dojo.experimental("dojox.widget.Portlet");
+dojo.provide("dojox.widget.Portlet");
+dojo.require("dijit.TitlePane");
+dojo.require("dojo.fx");
+dojo.declare("dojox.widget.Portlet",[dijit.TitlePane,dijit._Container],{resizeChildren:true,closable:true,_parents:null,_size:null,dragRestriction:false,buildRendering:function(){
+this.inherited(arguments);
+dojo.style(this.domNode,"visibility","hidden");
+},postCreate:function(){
+this.inherited(arguments);
+dojo.addClass(this.domNode,"dojoxPortlet");
+dojo.removeClass(this.arrowNode,"dijitArrowNode");
+dojo.addClass(this.arrowNode,"dojoxPortletIcon dojoxArrowDown");
+dojo.addClass(this.titleBarNode,"dojoxPortletTitle");
+dojo.addClass(this.hideNode,"dojoxPortletContentOuter");
+dojo.addClass(this.domNode,"dojoxPortlet-"+(!this.dragRestriction?"movable":"nonmovable"));
+var _1=this;
+if(this.resizeChildren){
+this.subscribe("/dnd/drop",function(){
+_1._updateSize();
+});
+this.subscribe("/Portlet/sizechange",function(_2){
+_1.onSizeChange(_2);
+});
+this.connect(window,"onresize",function(){
+_1._updateSize();
+});
+var _3=dojo.hitch(this,function(id,_4){
+var _5=dijit.byId(id);
+if(_5.selectChild){
+var s=this.subscribe(id+"-selectChild",function(_6){
+var n=_1.domNode.parentNode;
+while(n){
+if(n==_6.domNode){
+_1.unsubscribe(s);
+_1._updateSize();
+break;
+}
+n=n.parentNode;
+}
+});
+var _7=dijit.byId(_4);
+if(_5&&_7){
+_1._parents.push({parent:_5,child:_7});
+}
+}
+});
+var _8;
+this._parents=[];
+for(var p=this.domNode.parentNode;p!=null;p=p.parentNode){
+var id=p.getAttribute?p.getAttribute("widgetId"):null;
+if(id){
+_3(id,_8);
+_8=id;
+}
+}
+}
+this.connect(this.titleBarNode,"onmousedown",function(_9){
+if(dojo.hasClass(_9.target,"dojoxPortletIcon")){
+dojo.stopEvent(_9);
+return false;
+}
+return true;
+});
+this.connect(this._wipeOut,"onEnd",function(){
+_1._publish();
+});
+this.connect(this._wipeIn,"onEnd",function(){
+_1._publish();
+});
+if(this.closable){
+this.closeIcon=this._createIcon("dojoxCloseNode","dojoxCloseNodeHover",dojo.hitch(this,"onClose"));
+dojo.style(this.closeIcon,"display","");
+}
+},startup:function(){
+if(this._started){
+return;
+}
+var _a=this.getChildren();
+this._placeSettingsWidgets();
+dojo.forEach(_a,function(_b){
+try{
+if(!_b.started&&!_b._started){
+_b.startup();
+}
+}
+catch(e){
+}
+});
+this.inherited(arguments);
+dojo.style(this.domNode,"visibility","visible");
+},_placeSettingsWidgets:function(){
+dojo.forEach(this.getChildren(),dojo.hitch(this,function(_c){
+if(_c.portletIconClass&&_c.toggle&&!_c.attr("portlet")){
+this._createIcon(_c.portletIconClass,_c.portletIconHoverClass,dojo.hitch(_c,"toggle"));
+dojo.place(_c.domNode,this.containerNode,"before");
+_c.attr("portlet",this);
+}
+}));
+},_createIcon:function(_d,_e,fn){
+var _f=dojo.create("div",{"class":"dojoxPortletIcon "+_d,"waiRole":"presentation"});
+dojo.place(_f,this.arrowNode,"before");
+this.connect(_f,"onclick",fn);
+if(_e){
+this.connect(_f,"onmouseover",function(){
+dojo.addClass(_f,_e);
+});
+this.connect(_f,"onmouseout",function(){
+dojo.removeClass(_f,_e);
+});
+}
+return _f;
+},onClose:function(evt){
+dojo.style(this.domNode,"display","none");
+},onSizeChange:function(_10){
+if(_10==this){
+return;
+}
+this._updateSize();
+},_updateSize:function(){
+if(!this.open||!this._started||!this.resizeChildren){
+return;
+}
+if(this._timer){
+clearTimeout(this._timer);
+}
+this._timer=setTimeout(dojo.hitch(this,function(){
+var _11={w:dojo.style(this.domNode,"width"),h:dojo.style(this.domNode,"height")};
+for(var i=0;i<this._parents.length;i++){
+var p=this._parents[i];
+var sel=p.parent.selectedChildWidget;
+if(sel&&sel!=p.child){
+return;
+}
+}
+if(this._size){
+if(this._size.w==_11.w&&this._size.h==_11.h){
+return;
+}
+}
+this._size=_11;
+var fns=["resize","layout"];
+this._timer=null;
+var _12=this.getChildren();
+dojo.forEach(_12,function(_13){
+for(var i=0;i<fns.length;i++){
+if(dojo.isFunction(_13[fns[i]])){
+try{
+_13[fns[i]]();
+}
+catch(e){
+}
+break;
+}
+}
+});
+this.onUpdateSize();
+}),100);
+},onUpdateSize:function(){
+},_publish:function(){
+dojo.publish("/Portlet/sizechange",[this]);
+},_onTitleClick:function(evt){
+if(evt.target==this.arrowNode){
+this.inherited(arguments);
+}
+},addChild:function(_14){
+this._size=null;
+this.inherited(arguments);
+if(this._started){
+this._placeSettingsWidgets();
+this._updateSize();
+}
+if(this._started&&!_14.started&&!_14._started){
+_14.startup();
+}
+},_setCss:function(){
+this.inherited(arguments);
+dojo.style(this.arrowNode,"display",this.toggleable?"":"none");
+}});
+dojo.declare("dojox.widget.PortletSettings",[dijit._Container,dijit.layout.ContentPane],{portletIconClass:"dojoxPortletSettingsIcon",portletIconHoverClass:"dojoxPortletSettingsIconHover",postCreate:function(){
+dojo.style(this.domNode,"display","none");
+dojo.addClass(this.domNode,"dojoxPortletSettingsContainer");
+dojo.removeClass(this.domNode,"dijitContentPane");
+},_setPortletAttr:function(_15){
+this.portlet=_15;
+},toggle:function(){
+var n=this.domNode;
+if(dojo.style(n,"display")=="none"){
+dojo.style(n,{"display":"block","height":"1px","width":"auto"});
+dojo.fx.wipeIn({node:n}).play();
+}else{
+dojo.fx.wipeOut({node:n,onEnd:dojo.hitch(this,function(){
+dojo.style(n,{"display":"none","height":"","width":""});
+})}).play();
+}
+}});
+dojo.declare("dojox.widget.PortletDialogSettings",dojox.widget.PortletSettings,{dimensions:null,constructor:function(_16,_17){
+this.dimensions=_16.dimensions||[300,100];
+},toggle:function(){
+if(!this.dialog){
+dojo["require"]("dijit.Dialog");
+this.dialog=new dijit.Dialog({title:this.title});
+dojo.body().appendChild(this.dialog.domNode);
+this.dialog.containerNode.appendChild(this.domNode);
+dojo.style(this.dialog.domNode,{"width":this.dimensions[0]+"px","height":this.dimensions[1]+"px"});
+dojo.style(this.domNode,"display","");
+}
+if(this.dialog.open){
+this.dialog.hide();
+}else{
+this.dialog.show(this.domNode);
+}
+}});
+}
diff --git a/dojox/widget/Portlet/Portlet.css b/dojox/widget/Portlet/Portlet.css
new file mode 100644
index 0000000..50c2c59
--- /dev/null
+++ b/dojox/widget/Portlet/Portlet.css
@@ -0,0 +1,138 @@
+.dojoxPortlet {
+	margin-bottom: 5px;
+}
+.dojoxPortlet .dijitTitlePaneTitle .dojoxPortletIcon {
+	width: 15px;
+	height: 15px;
+	float: right;
+	cursor: pointer;
+	background-repeat: no-repeat;
+}
+.tundra .dojoxPortlet-movable .dijitTitlePaneTitle,
+.soria .dojoxPortlet-movable .dijitTitlePaneTitle,
+.nihilo .dojoxPortlet-movable .dijitTitlePaneTitle {
+	cursor: move;
+}
+.dojoxPortlet .dijitTitlePaneTitle {
+	font-weight: bold;
+	font-size: 0.9em;
+}
+.soria .dojoxPortlet .dijitTitlePaneTitle {
+	color: #243C5F;
+}
+.tundra .dojoxPortlet .dijitTitlePaneTitle,
+.nihilo .dojoxPortlet .dijitTitlePaneTitle {
+	color: #333;
+}
+.dojoxPortlet-nonmovable .dijitTitlePaneTitle {
+	cursor: default;
+}
+.tundra .dojoxPortlet .dojoxPortletIcon {
+	background-image: url("../../../dijit/themes/tundra/images/spriteRoundedIconsSmall.gif");
+}
+.soria .dojoxPortlet .dojoxPortletIcon {
+	background-image: url("../../../dijit/themes/soria/images/spriteRoundedIconsSmall.gif");
+}
+.nihilo .dojoxPortlet .dojoxPortletIcon {
+	background-image: url("../../../dijit/themes/nihilo/images/spriteRoundedIconsSmall.gif");
+}
+.dojoxPortlet .dojoxCloseNode, 
+.dojoxPortlet .dojoxCloseNode {
+	background-position: right 0px;
+}
+.dojoxPortlet .dojoxCloseNodeHover {
+	background-position: right -15px;
+}
+.tundra .dojoxPortlet .dijitOpen .dojoxArrowDown,
+.soria .dojoxPortlet .dijitOpen .dojoxArrowDown,
+.nihilo .dojoxPortlet .dijitOpen .dojoxArrowDown {
+	background-position: -15px top;
+}
+.tundra .dojoxPortlet .dijitClosed .dojoxArrowDown,
+.soria .dojoxPortlet .dijitClosed .dojoxArrowDown,
+.nihilo .dojoxPortlet .dijitClosed .dojoxArrowDown {
+	background-position: 0 top;
+}
+.tundra .dojoxPortlet .dojoxPortletSettingsIcon,
+.soria .dojoxPortlet .dojoxPortletSettingsIcon,
+.nihilo .dojoxPortlet .dojoxPortletSettingsIcon {
+	background-image: url(images/icons.png);
+	background-position: 0 1px;
+}
+.tundra .dojoxPortletSettingsContainer,
+.soria .dojoxPortletSettingsContainer,
+.nihilo .dojoxPortletSettingsContainer {
+	border-bottom: 1px solid #BFBFBF;
+	padding: 4px;
+}
+.tundra .dijitDialogPaneContent .dojoxPortletSettingsContainer,
+.soria .dijitDialogPaneContent .dojoxPortletSettingsContainer,
+.nihilo .dijitDialogPaneContent .dojoxPortletSettingsContainer {
+	border-bottom: none;
+}
+.soria .dojoDndItemOver .dojoxPortletTitle {
+  border-top: 1px solid #8D8D8D;
+	border-left: 1px solid #8D8D8D;
+	border-right: 1px solid #8D8D8D;
+}
+.soria .dojoDndItemOver .dojoxPortletContentOuter {
+  border-bottom: 1px solid #9D9D9D;
+	border-left: 1px solid #9D9D9D;
+	border-right: 1px solid #9D9D9D;
+}
+.dojoxPortlet div.dojoxPortletContentOuter {
+	background: url(../../../dijit/themes/tundra/images/validationInputBg.gif) repeat-x top left;
+}
+.dojoxFeedPortletList {
+	padding-left: 25px;
+	margin: 0px;
+}
+.dojoxFeedPortletExpandableList {
+	padding-left: 0px;
+	margin: 0px;
+}
+.dojoxFeedPortletExpandableList li {
+	margin-bottom: 5px;
+}
+.dojoxFeedPortletList li {
+	padding-top: 4px;
+}
+.dojoxFeedPortletPreview {
+	max-height: 300px;
+	max-width: 400px;
+	overflow: hidden;
+}
+.dojoxFeedPortletPreview * {
+	max-height: 295px;
+	max-width: 395px;
+}
+.dojoxPortletFeedSettings {
+	padding: 5px;
+	border-bottom: 1px solid #9D9D9D;
+}
+.dojoxFeedPortletExpandableList {
+	list-style: none;
+}
+.dojoxPortletToggleIcon {
+	margin-right: 6px;
+	cursor: pointer;
+}
+.dojoxPortletToggleIcon img {
+	width: 15px;
+	height: 14px;
+}
+.dojoxPortletItemCollapsed .dojoxPortletToggleIcon {
+	background: url(../../../dijit/themes/tundra/images/plusButton.gif) no-repeat 0 0;
+}
+.dojoxPortletItemOpen .dojoxPortletToggleIcon {
+	background: url(../../../dijit/themes/tundra/images/minusButton.gif) no-repeat 0 0;
+}
+.dojoxPortletItemSummary {
+	margin-left: 20px;
+}
+.dojoxPortletItemCollapsed .dojoxPortletItemSummary {
+  display: none;
+}
+.dojoxPortletItemOpen .dojoxPortletItemSummary {
+  display: block;
+}
diff --git a/dojox/widget/Portlet/images/icons.gif b/dojox/widget/Portlet/images/icons.gif
new file mode 100644
index 0000000..cafca8d
Binary files /dev/null and b/dojox/widget/Portlet/images/icons.gif differ
diff --git a/dojox/widget/Portlet/images/icons.png b/dojox/widget/Portlet/images/icons.png
new file mode 100644
index 0000000..d5cbcf5
Binary files /dev/null and b/dojox/widget/Portlet/images/icons.png differ
diff --git a/dojox/widget/README b/dojox/widget/README
index e54122d..ea318a5 100644
--- a/dojox/widget/README
+++ b/dojox/widget/README
@@ -10,12 +10,14 @@ Project state:
 [CalendarFx]	experimental
 [ColorPicker]	beta
 [Dialog]	experimental
+[FeedPortlet]	experimental
 [FilePicker]	experimental
 [FisheyeList]	experimental
 [FisheyeLite]	beta
 [Iterator]	experimental
 [Loader]	experimental
 [Pager]		experimental
+[Portlet]	experimental
 [PlaceholderMenuItem]	experimental
 [Roller]	experimental
 [RollingList]	experimental
@@ -32,6 +34,7 @@ Credits:
 [CalendarFx] Shane O'Sullivan
 [ColorPicker] Peter Higgins (dante)
 [Dialog] Peter Higgins (dante)
+[FeedPortlet] Shane O'Sullivan
 [FilePicker] Nathan Toone (toonetown)
 [FisheyeList] Karl Tiedt (kteidt)
 [FisheyeLite] Peter Higgins (dante)
@@ -39,6 +42,7 @@ Credits:
 [Loader] Peter Higgins (dante)
 [Pager] Nikolai Onken (nonken), Peter Higgins (dante);
 [PlaceholderMenuItem] Nathan Toone (toonetown)
+[Portlet] Shane O'Sullivan
 [Roller] Peter Higgins (dante)
 [RollingList] Nathan Toone (toonetown)
 [SortList] Peter Higgins (dante)
@@ -47,6 +51,7 @@ Credits:
 [AnalogGauge] Benjamin Schell (bmschell) CCLA
 [BarGauge] Benjamin Schell (bmschell) CCLA 
 [Standby] Jared Jurkiewicz (jaredj) CCLA 
+[UpgradeBar] Mike Wilcox (mwilcox), Revin Guillen
 
 -------------------------------------------------------------------------------
 Project description
@@ -166,3 +171,6 @@ Other Notes (Brief widget list):
 		Overlay color, image, and alt text can all be customized.
 		Requires dojo >= 1.3
 
+	* UpgradeBar - Displays the "yellow bar" at the top of a page to indicate the user
+ 		needs to upgrade their browser or a plugin
+		Requires dojo >= 1.3
diff --git a/dojox/widget/Roller.js b/dojox/widget/Roller.js
index 9bb5e02..f76f092 100644
--- a/dojox/widget/Roller.js
+++ b/dojox/widget/Roller.js
@@ -35,12 +35,12 @@ var n=this.domNode;
 dojo.mixin(this,{_anim:{"in":dojo.fadeIn({node:n,duration:this.durationIn}),"out":dojo.fadeOut({node:n,duration:this.durationOut})}});
 this._setupConnects();
 },_setupConnects:function(){
-var _4=this._anim;
-this.connect(_4["out"],"onEnd",function(){
+var _2=this._anim;
+this.connect(_2["out"],"onEnd",function(){
 this._set(this._idx+1);
-_4["in"].play(15);
+_2["in"].play(15);
 });
-this.connect(_4["in"],"onEnd",function(){
+this.connect(_2["in"],"onEnd",function(){
 this._timeout=setTimeout(dojo.hitch(this,"_run"),this.delay);
 });
 },start:function(){
@@ -70,10 +70,10 @@ this._roller.innerHTML=this.items[i]||"error!";
 this._idx=i;
 }});
 dojo.declare("dojox.widget.RollerSlide",dojox.widget.Roller,{durationOut:175,makeAnims:function(){
-var n=this.domNode,_a="position",_b={top:{end:0,start:25},opacity:1};
-dojo.style(n,_a,"relative");
-dojo.style(this._roller,_a,"absolute");
-dojo.mixin(this,{_anim:{"in":dojo.animateProperty({node:n,duration:this.durationIn,properties:_b}),"out":dojo.fadeOut({node:n,duration:this.durationOut})}});
+var n=this.domNode,_3="position",_4={top:{end:0,start:25},opacity:1};
+dojo.style(n,_3,"relative");
+dojo.style(this._roller,_3,"absolute");
+dojo.mixin(this,{_anim:{"in":dojo.animateProperty({node:n,duration:this.durationIn,properties:_4}),"out":dojo.fadeOut({node:n,duration:this.durationOut})}});
 this._setupConnects();
 }});
 dojo.declare("dojox.widget._RollerHover",null,{postCreate:function(){
diff --git a/dojox/widget/RollingList.js b/dojox/widget/RollingList.js
index 196f40d..dd98fd2 100644
--- a/dojox/widget/RollingList.js
+++ b/dojox/widget/RollingList.js
@@ -9,23 +9,23 @@ if(!dojo._hasResource["dojox.widget.RollingList"]){
 dojo._hasResource["dojox.widget.RollingList"]=true;
 dojo.provide("dojox.widget.RollingList");
 dojo.experimental("dojox.widget.RollingList");
-dojo.require("dijit._Templated");
 dojo.require("dijit.layout.ContentPane");
+dojo.require("dijit._Templated");
+dojo.require("dijit._Contained");
 dojo.require("dijit.layout._LayoutWidget");
 dojo.require("dijit.Menu");
 dojo.require("dojox.html.metrics");
 dojo.require("dijit.form.Button");
 dojo.require("dojo.i18n");
-dojo.requireLocalization("dojox.widget","RollingList",null,"ROOT,ca,sk,sl,th");
 dojo.requireLocalization("dijit","common",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
 dojo.declare("dojox.widget._RollingListPane",[dijit.layout.ContentPane,dijit._Templated,dijit._Contained],{templateString:"<div class=\"dojoxRollingListPane\"><table><tbody><tr><td dojoAttachPoint=\"containerNode\"></td></tr></tbody></div>",parentWidget:null,parentPane:null,store:null,items:null,query:null,queryOptions:null,_focusByNode:true,minWidth:0,_setContentAndScroll:function(_1,_2){
 this._setContent(_1,_2);
 this.parentWidget.scrollIntoView(this);
-},_updateNodeWidth:function(n,_4){
+},_updateNodeWidth:function(n,_3){
 n.style.width="";
-var _5=dojo.marginBox(n).w;
-if(_5<_4){
-dojo.marginBox(n,{w:_4});
+var _4=dojo.marginBox(n).w;
+if(_4<_3){
+dojo.marginBox(n,{w:_3});
 }
 },_onMinWidthChange:function(v){
 this._updateNodeWidth(this.domNode,v);
@@ -63,11 +63,11 @@ this.parentWidget._onExecute();
 }
 }
 }
-},focus:function(_9){
+},focus:function(_5){
 if(this.parentWidget._focusedPane!=this){
 this.parentWidget._focusedPane=this;
 this.parentWidget.scrollIntoView(this);
-if(this._focusByNode&&(!this.parentWidget._savedFocus||_9)){
+if(this._focusByNode&&(!this.parentWidget._savedFocus||_5)){
 try{
 (this.focusNode||this.domNode).focus();
 }
@@ -75,18 +75,11 @@ catch(e){
 }
 }
 }
-},_loadCheck:function(){
-if(!this._started){
-var c=this.connect(this,"startup",function(){
-this.disconnect(c);
-this._loadCheck();
-});
-}
-var _b=this.domNode&&this._isShown();
-if((this.store||this.items)&&((this.refreshOnShow&&_b)||(!this.isLoaded&&_b))){
-this._loadQuery();
+},_onShow:function(){
+if((this.store||this.items)&&((this.refreshOnShow&&this.domNode)||(!this.isLoaded&&this.domNode))){
+this.refresh();
 }
-},_loadQuery:function(){
+},_load:function(){
 this.isLoaded=false;
 if(this.items){
 this._setContentAndScroll(this.onLoadStart(),true);
@@ -94,92 +87,94 @@ window.setTimeout(dojo.hitch(this,"_doQuery"),1);
 }else{
 this._doQuery();
 }
-},_doLoadItems:function(_c,_d){
-var _e=0,_f=this.store;
-dojo.forEach(_c,function(_10){
-if(!_f.isItemLoaded(_10)){
-_e++;
+},_doLoadItems:function(_6,_7){
+var _8=0,_9=this.store;
+dojo.forEach(_6,function(_a){
+if(!_9.isItemLoaded(_a)){
+_8++;
 }
 });
-if(_e===0){
-_d();
+if(_8===0){
+_7();
 }else{
-var _11=function(_12){
-_e--;
-if((_e)===0){
-_d();
+var _b=function(_c){
+_8--;
+if((_8)===0){
+_7();
 }
 };
-dojo.forEach(_c,function(_13){
-if(!_f.isItemLoaded(_13)){
-_f.loadItem({item:_13,onItem:_11});
+dojo.forEach(_6,function(_d){
+if(!_9.isItemLoaded(_d)){
+_9.loadItem({item:_d,onItem:_b});
 }
 });
 }
 },_doQuery:function(){
-var _14=this.parentWidget.preloadItems;
-_14=(_14===true||(this.items&&this.items.length<=Number(_14)));
-if(this.items&&_14){
+if(!this.domNode){
+return;
+}
+var _e=this.parentWidget.preloadItems;
+_e=(_e===true||(this.items&&this.items.length<=Number(_e)));
+if(this.items&&_e){
 this._doLoadItems(this.items,dojo.hitch(this,"onItems"));
 }else{
 if(this.items){
 this.onItems();
 }else{
 this._setContentAndScroll(this.onFetchStart(),true);
-this.store.fetch({query:this.query,onComplete:function(_15){
-this.items=_15;
+this.store.fetch({query:this.query,onComplete:function(_f){
+this.items=_f;
 this.onItems();
 },onError:function(e){
 this._onError("Fetch",e);
 },scope:this});
 }
 }
-},_hasItem:function(_17){
-var _18=this.items||[];
-for(var i=0,_1a;(_1a=_18[i]);i++){
-if(this.parentWidget._itemsMatch(_1a,_17)){
+},_hasItem:function(_10){
+var _11=this.items||[];
+for(var i=0,_12;(_12=_11[i]);i++){
+if(this.parentWidget._itemsMatch(_12,_10)){
 return true;
 }
 }
 return false;
-},_onSetItem:function(_1b,_1c,_1d,_1e){
-if(this._hasItem(_1b)){
-this._loadCheck(true);
+},_onSetItem:function(_13,_14,_15,_16){
+if(this._hasItem(_13)){
+this.refresh();
 }
-},_onNewItem:function(_1f,_20){
+},_onNewItem:function(_17,_18){
 var sel;
-if((!_20&&!this.parentPane)||(_20&&this.parentPane&&this.parentPane._hasItem(_20.item)&&(sel=this.parentPane._getSelected())&&this.parentWidget._itemsMatch(sel.item,_20.item))){
-this.items.push(_1f);
-this._loadCheck(true);
+if((!_18&&!this.parentPane)||(_18&&this.parentPane&&this.parentPane._hasItem(_18.item)&&(sel=this.parentPane._getSelected())&&this.parentWidget._itemsMatch(sel.item,_18.item))){
+this.items.push(_17);
+this.refresh();
 }else{
-if(_20&&this.parentPane&&this._hasItem(_20.item)){
-this._loadCheck(true);
+if(_18&&this.parentPane&&this._hasItem(_18.item)){
+this.refresh();
 }
 }
-},_onDeleteItem:function(_22){
-if(this._hasItem(_22)){
+},_onDeleteItem:function(_19){
+if(this._hasItem(_19)){
 this.items=dojo.filter(this.items,function(i){
-return (i!=_22);
+return (i!=_19);
 });
-this._loadCheck(true);
+this.refresh();
 }
 },onFetchStart:function(){
 return this.loadingMessage;
-},onFetchError:function(_24){
+},onFetchError:function(_1a){
 return this.errorMessage;
 },onLoadStart:function(){
 return this.loadingMessage;
-},onLoadError:function(_25){
+},onLoadError:function(_1b){
 return this.errorMessage;
 },onItems:function(){
+if(!this.onLoadDeferred){
+this.cancel();
+this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));
+}
 this._onLoadHandler();
 }});
-dojo.declare("dojox.widget._RollingListGroupPane",[dojox.widget._RollingListPane],{templateString:"<div><div dojoAttachPoint=\"containerNode\"></div>"+"<div dojoAttachPoint=\"menuContainer\">"+"<div dojoAttachPoint=\"menuNode\"></div>"+"</div></div>",_menu:null,_loadCheck:function(){
-var _26=this._isShown();
-if((this.store||this.items)&&((this.refreshOnShow&&_26)||(!this.isLoaded&&_26))){
-this._loadQuery();
-}
-},_setContent:function(_27){
+dojo.declare("dojox.widget._RollingListGroupPane",[dojox.widget._RollingListPane],{templateString:"<div><div dojoAttachPoint=\"containerNode\"></div>"+"<div dojoAttachPoint=\"menuContainer\">"+"<div dojoAttachPoint=\"menuNode\"></div>"+"</div></div>",_menu:null,_setContent:function(_1c){
 if(!this._menu){
 this.inherited(arguments);
 }
@@ -187,46 +182,46 @@ this.inherited(arguments);
 if(!this._menu){
 return;
 }
-var _29=dojo.marginBox(this.domNode).w;
-var _2a=dojo.marginBox(this._menu.domNode).w;
-this._updateNodeWidth(this._menu.domNode,v-(_29-_2a));
+var _1d=dojo.marginBox(this.domNode).w;
+var _1e=dojo.marginBox(this._menu.domNode).w;
+this._updateNodeWidth(this._menu.domNode,v-(_1d-_1e));
 },onItems:function(){
-var _2b,_2c=false;
+var _1f,_20=false;
 if(this._menu){
-_2b=this._getSelected();
+_1f=this._getSelected();
 this._menu.destroyRecursive();
 }
 this._menu=this._getMenu();
-var _2d,_2e;
+var _21,_22;
 if(this.items.length){
-dojo.forEach(this.items,function(_2f){
-_2d=this.parentWidget._getMenuItemForItem(_2f,this);
-if(_2d){
-if(_2b&&this.parentWidget._itemsMatch(_2d.item,_2b.item)){
-_2e=_2d;
+dojo.forEach(this.items,function(_23){
+_21=this.parentWidget._getMenuItemForItem(_23,this);
+if(_21){
+if(_1f&&this.parentWidget._itemsMatch(_21.item,_1f.item)){
+_22=_21;
 }
-this._menu.addChild(_2d);
+this._menu.addChild(_21);
 }
 },this);
 }else{
-_2d=this.parentWidget._getMenuItemForItem(null,this);
-if(_2d){
-this._menu.addChild(_2d);
+_21=this.parentWidget._getMenuItemForItem(null,this);
+if(_21){
+this._menu.addChild(_21);
 }
 }
-if(_2e){
-this._setSelected(_2e);
-if((_2b&&!_2b.children&&_2e.children)||(_2b&&_2b.children&&!_2e.children)){
-var _30=this.parentWidget._getPaneForItem(_2e.item,this,_2e.children);
-if(_30){
-this.parentWidget.addChild(_30,this.getIndexInParent()+1);
+if(_22){
+this._setSelected(_22);
+if((_1f&&!_1f.children&&_22.children)||(_1f&&_1f.children&&!_22.children)){
+var _24=this.parentWidget._getPaneForItem(_22.item,this,_22.children);
+if(_24){
+this.parentWidget.addChild(_24,this.getIndexInParent()+1);
 }else{
 this.parentWidget._removeAfter(this);
-this.parentWidget._onItemClick(null,this,_2e.item,_2e.children);
+this.parentWidget._onItemClick(null,this,_22.item,_22.children);
 }
 }
 }else{
-if(_2b){
+if(_1f){
 this.parentWidget._removeAfter(this);
 }
 }
@@ -236,16 +231,16 @@ this.parentWidget.scrollIntoView(this);
 this._checkScrollConnection(true);
 this.inherited(arguments);
 this._onMinWidthChange(this.minWidth);
-},_checkScrollConnection:function(_31){
-var _32=this.store;
+},_checkScrollConnection:function(_25){
+var _26=this.store;
 if(this._scrollConn){
 this.disconnect(this._scrollConn);
 }
 delete this._scrollConn;
 if(!dojo.every(this.items,function(i){
-return _32.isItemLoaded(i);
+return _26.isItemLoaded(i);
 })){
-if(_31){
+if(_25){
 this._loadVisibleItems();
 }
 this._scrollConn=this.connect(this.domNode,"onscroll","_onScrollPane");
@@ -253,42 +248,42 @@ this._scrollConn=this.connect(this.domNode,"onscroll","_onScrollPane");
 },startup:function(){
 this.inherited(arguments);
 this.parentWidget._updateClass(this.domNode,"GroupPane");
-},focus:function(_34){
+},focus:function(_27){
 if(this._menu){
 if(this._pendingFocus){
 this.disconnect(this._pendingFocus);
 }
 delete this._pendingFocus;
-var _35=this._menu.focusedChild;
-if(!_35){
-var _36=dojo.query(".dojoxRollingListItemSelected",this.domNode)[0];
-if(_36){
-_35=dijit.byNode(_36);
+var _28=this._menu.focusedChild;
+if(!_28){
+var _29=dojo.query(".dojoxRollingListItemSelected",this.domNode)[0];
+if(_29){
+_28=dijit.byNode(_29);
 }
 }
-if(!_35){
-_35=this._menu.getChildren()[0]||this._menu;
+if(!_28){
+_28=this._menu.getChildren()[0]||this._menu;
 }
 this._focusByNode=false;
-if(_35.focusNode){
-if(!this.parentWidget._savedFocus||_34){
+if(_28.focusNode){
+if(!this.parentWidget._savedFocus||_27){
 try{
-_35.focusNode.focus();
+_28.focusNode.focus();
 }
 catch(e){
 }
 }
 window.setTimeout(function(){
 try{
-dijit.scrollIntoView(_35.focusNode);
+dijit.scrollIntoView(_28.focusNode);
 }
 catch(e){
 }
 },1);
 }else{
-if(_35.focus){
-if(!this.parentWidget._savedFocus||_34){
-_35.focus();
+if(_28.focus){
+if(!this.parentWidget._savedFocus||_27){
+_28.focus();
 }
 }else{
 this._focusByNode=true;
@@ -301,21 +296,21 @@ this._pendingFocus=this.connect(this,"onItems","focus");
 }
 }
 },_getMenu:function(){
-var _37=this;
-var _38=new dijit.Menu({parentMenu:this.parentPane?this.parentPane._menu:null,onCancel:function(_39){
-if(_37.parentPane){
-_37.parentPane.focus(true);
+var _2a=this;
+var _2b=new dijit.Menu({parentMenu:this.parentPane?this.parentPane._menu:null,onCancel:function(_2c){
+if(_2a.parentPane){
+_2a.parentPane.focus(true);
 }
 },_moveToPopup:function(evt){
 if(this.focusedChild&&!this.focusedChild.disabled){
 this.focusedChild._onClick(evt);
 }
 }},this.menuNode);
-this.connect(_38,"onItemClick",function(_3b,evt){
-if(_3b.disabled){
+this.connect(_2b,"onItemClick",function(_2d,evt){
+if(_2d.disabled){
 return;
 }
-evt.alreadySelected=dojo.hasClass(_3b.domNode,"dojoxRollingListItemSelected");
+evt.alreadySelected=dojo.hasClass(_2d.domNode,"dojoxRollingListItemSelected");
 if(evt.alreadySelected&&((evt.type=="keypress"&&evt.charOrCode!=dojo.keys.ENTER)||(evt.type=="internal"))){
 var p=this.parentWidget.getChildren()[this.getIndexInParent()+1];
 if(p){
@@ -323,43 +318,33 @@ p.focus(true);
 this.parentWidget.scrollIntoView(p);
 }
 }else{
-this._setSelected(_3b,_38);
-this.parentWidget._onItemClick(evt,this,_3b.item,_3b.children);
+this._setSelected(_2d,_2b);
+this.parentWidget._onItemClick(evt,this,_2d.item,_2d.children);
 if(evt.type=="keypress"&&evt.charOrCode==dojo.keys.ENTER){
 this.parentWidget._onExecute();
 }
 }
 });
-if(!_38._started){
-_38.startup();
+if(!_2b._started){
+_2b.startup();
 }
-return _38;
+return _2b;
 },_onScrollPane:function(){
 if(this._visibleLoadPending){
 window.clearTimeout(this._visibleLoadPending);
 }
 this._visibleLoadPending=window.setTimeout(dojo.hitch(this,"_loadVisibleItems"),500);
-},_layoutHack:function(){
-if(dojo.isFF==2&&!this._layoutHackHandle){
-var _3e=this.domNode;
-var old=_3e.style.opacity;
-_3e.style.opacity="0.999";
-this._layoutHackHandle=setTimeout(dojo.hitch(this,function(){
-this._layoutHackHandle=null;
-_3e.style.opacity=old;
-}),0);
-}
 },_loadVisibleItems:function(){
 delete this._visibleLoadPending;
-var _40=this._menu;
-if(!_40){
+var _2e=this._menu;
+if(!_2e){
 return;
 }
-var _41=_40.getChildren();
-if(!_41||!_41.length){
+var _2f=_2e.getChildren();
+if(!_2f||!_2f.length){
 return;
 }
-var _42=function(n,m,pb){
+var _30=function(n,m,pb){
 var s=dojo.getComputedStyle(n);
 var r=0;
 if(m){
@@ -370,98 +355,92 @@ r+=dojo._getPadBorderExtents(n,s).t;
 }
 return r;
 };
-var _48=_42(this.domNode,false,true)+_42(this.containerNode,true,true)+_42(_40.domNode,true,true)+_42(_41[0].domNode,true,false);
+var _31=_30(this.domNode,false,true)+_30(this.containerNode,true,true)+_30(_2e.domNode,true,true)+_30(_2f[0].domNode,true,false);
 var h=dojo.contentBox(this.domNode).h;
-var _4a=this.domNode.scrollTop-_48-(h/2);
-var _4b=_4a+(3*h/2);
-var _4c=dojo.filter(_41,function(c){
+var _32=this.domNode.scrollTop-_31-(h/2);
+var _33=_32+(3*h/2);
+var _34=dojo.filter(_2f,function(c){
 var cnt=c.domNode.offsetTop;
 var s=c.store;
 var i=c.item;
-return (cnt>=_4a&&cnt<=_4b&&!s.isItemLoaded(i));
+return (cnt>=_32&&cnt<=_33&&!s.isItemLoaded(i));
 });
-var _51=dojo.map(_4c,function(c){
+var _35=dojo.map(_34,function(c){
 return c.item;
 });
-var _53=dojo.hitch(this,function(){
-var _54=this._getSelected();
-var _55;
-dojo.forEach(_51,function(_56,idx){
-var _58=this.parentWidget._getMenuItemForItem(_56,this);
-var _59=_4c[idx];
-var _5a=_59.getIndexInParent();
-_40.removeChild(_59);
-if(_58){
-if(_54&&this.parentWidget._itemsMatch(_58.item,_54.item)){
-_55=_58;
-}
-_40.addChild(_58,_5a);
-if(_40.focusedChild==_59){
-_40.focusChild(_58);
-}
-}
-_59.destroy();
+var _36=dojo.hitch(this,function(){
+var _37=this._getSelected();
+var _38;
+dojo.forEach(_35,function(_39,idx){
+var _3a=this.parentWidget._getMenuItemForItem(_39,this);
+var _3b=_34[idx];
+var _3c=_3b.getIndexInParent();
+_2e.removeChild(_3b);
+if(_3a){
+if(_37&&this.parentWidget._itemsMatch(_3a.item,_37.item)){
+_38=_3a;
+}
+_2e.addChild(_3a,_3c);
+if(_2e.focusedChild==_3b){
+_2e.focusChild(_3a);
+}
+}
+_3b.destroy();
 },this);
 this._checkScrollConnection(false);
-this._layoutHack();
 });
-this._doLoadItems(_51,_53);
-},_getSelected:function(_5b){
-if(!_5b){
-_5b=this._menu;
+this._doLoadItems(_35,_36);
+},_getSelected:function(_3d){
+if(!_3d){
+_3d=this._menu;
 }
-if(_5b){
-var _5c=this._menu.getChildren();
-for(var i=0,_5e;(_5e=_5c[i]);i++){
-if(dojo.hasClass(_5e.domNode,"dojoxRollingListItemSelected")){
-return _5e;
+if(_3d){
+var _3e=this._menu.getChildren();
+for(var i=0,_3f;(_3f=_3e[i]);i++){
+if(dojo.hasClass(_3f.domNode,"dojoxRollingListItemSelected")){
+return _3f;
 }
 }
 }
 return null;
-},_setSelected:function(_5f,_60){
-if(!_60){
-_60=this._menu;
+},_setSelected:function(_40,_41){
+if(!_41){
+_41=this._menu;
 }
-if(_60){
-dojo.forEach(_60.getChildren(),function(i){
-this.parentWidget._updateClass(i.domNode,"Item",{"Selected":(_5f&&(i==_5f&&!i.disabled))});
+if(_41){
+dojo.forEach(_41.getChildren(),function(i){
+this.parentWidget._updateClass(i.domNode,"Item",{"Selected":(_40&&(i==_40&&!i.disabled))});
 },this);
 }
-},destroy:function(){
-if(this._layoutHackHandle){
-clearTimeout(this._layoutHackHandle);
-}
-this.inherited(arguments);
 }});
-dojo.declare("dojox.widget.RollingList",[dijit._Widget,dijit._Templated,dijit._Container],{templateString:"<div class=\"dojoxRollingList ${className}\"\n\t><div class=\"dojoxRollingListContainer\" dojoAttachPoint=\"containerNode\" dojoAttachEvent=\"onkeypress:_onKey\"\n\t></div\n\t><div class=\"dojoxRollingListButtons\" dojoAttachPoint=\"buttonsNode\"\n        ><button dojoType=\"dijit.form.Button\" dojoAttachPoint=\"okButton\"\n\t\t\t\tdojoAttachEvent=\"onClick:_onExecute\">${okButtonLa [...]
+dojo.declare("dojox.widget.RollingList",[dijit._Widget,dijit._Templated,dijit._Container],{templateString:dojo.cache("dojox.widget","RollingList/RollingList.html","<div class=\"dojoxRollingList ${className}\"\n\t><div class=\"dojoxRollingListContainer\" dojoAttachPoint=\"containerNode\" dojoAttachEvent=\"onkeypress:_onKey\"\n\t></div\n\t><div class=\"dojoxRollingListButtons\" dojoAttachPoint=\"buttonsNode\"\n        ><button dojoType=\"dijit.form.Button\" dojoAttachPoint=\"okButton\"\n\t [...]
 this.inherited(arguments);
 var loc=dojo.i18n.getLocalization("dijit","common");
 this.okButtonLabel=this.okButtonLabel||loc.buttonOk;
 this.cancelButtonLabel=this.cancelButtonLabel||loc.buttonCancel;
-},_setShowButtonsAttr:function(_63){
-var _64=false;
-if((this.showButtons!=_63&&this._started)||(this.showButtons==_63&&!this.started)){
-_64=true;
-}
-dojo.toggleClass(this.domNode,"dojoxRollingListButtonsHidden",!_63);
-this.showButtons=_63;
-if(_64){
+},_setShowButtonsAttr:function(_42){
+var _43=false;
+if((this.showButtons!=_42&&this._started)||(this.showButtons==_42&&!this.started)){
+_43=true;
+}
+dojo.toggleClass(this.domNode,"dojoxRollingListButtonsHidden",!_42);
+this.showButtons=_42;
+if(_43){
 if(this._started){
 this.layout();
 }else{
 window.setTimeout(dojo.hitch(this,"layout"),0);
 }
 }
-},_itemsMatch:function(_65,_66){
-if(!_65&&!_66){
+},_itemsMatch:function(_44,_45){
+if(!_44&&!_45){
 return true;
 }else{
-if(!_65||!_66){
+if(!_44||!_45){
 return false;
 }
 }
-return (_65==_66||(this._isIdentity&&this.store.getIdentity(_65)==this.store.getIdentity(_66)));
+return (_44==_45||(this._isIdentity&&this.store.getIdentity(_44)==this.store.getIdentity(_45)));
 },_removeAfter:function(idx){
 if(typeof idx!="number"){
 idx=this.getIndexOfChild(idx);
@@ -474,73 +453,73 @@ c.destroyRecursive();
 }
 },this);
 }
-var _6a=this.getChildren(),_6b=_6a[_6a.length-1];
-var _6c=null;
-while(_6b&&!_6c){
-var val=_6b._getSelected?_6b._getSelected():null;
+var _46=this.getChildren(),_47=_46[_46.length-1];
+var _48=null;
+while(_47&&!_48){
+var val=_47._getSelected?_47._getSelected():null;
 if(val){
-_6c=val.item;
+_48=val.item;
 }
-_6b=_6b.parentPane;
+_47=_47.parentPane;
 }
 if(!this._setInProgress){
-this._setValue(_6c);
+this._setValue(_48);
 }
-},addChild:function(_6e,_6f){
-if(_6f>0){
-this._removeAfter(_6f-1);
+},addChild:function(_49,_4a){
+if(_4a>0){
+this._removeAfter(_4a-1);
 }
 this.inherited(arguments);
-if(!_6e._started){
-_6e.startup();
+if(!_49._started){
+_49.startup();
 }
-_6e.attr("minWidth",this.minPaneWidth);
+_49.attr("minWidth",this.minPaneWidth);
 this.layout();
 if(!this._savedFocus){
-_6e.focus();
+_49.focus();
 }
-},_setMinPaneWidthAttr:function(_70){
-if(_70!==this.minPaneWidth){
-this.minPaneWidth=_70;
+},_setMinPaneWidthAttr:function(_4b){
+if(_4b!==this.minPaneWidth){
+this.minPaneWidth=_4b;
 dojo.forEach(this.getChildren(),function(c){
-c.attr("minWidth",_70);
+c.attr("minWidth",_4b);
 });
 }
-},_updateClass:function(_72,_73,_74){
+},_updateClass:function(_4c,_4d,_4e){
 if(!this._declaredClasses){
 this._declaredClasses=("dojoxRollingList "+this.className).split(" ");
 }
 dojo.forEach(this._declaredClasses,function(c){
 if(c){
-dojo.addClass(_72,c+_73);
-for(var k in _74||{}){
-dojo.toggleClass(_72,c+_73+k,_74[k]);
+dojo.addClass(_4c,c+_4d);
+for(var k in _4e||{}){
+dojo.toggleClass(_4c,c+_4d+k,_4e[k]);
 }
-dojo.toggleClass(_72,c+_73+"FocusSelected",(dojo.hasClass(_72,c+_73+"Focus")&&dojo.hasClass(_72,c+_73+"Selected")));
-dojo.toggleClass(_72,c+_73+"HoverSelected",(dojo.hasClass(_72,c+_73+"Hover")&&dojo.hasClass(_72,c+_73+"Selected")));
+dojo.toggleClass(_4c,c+_4d+"FocusSelected",(dojo.hasClass(_4c,c+_4d+"Focus")&&dojo.hasClass(_4c,c+_4d+"Selected")));
+dojo.toggleClass(_4c,c+_4d+"HoverSelected",(dojo.hasClass(_4c,c+_4d+"Hover")&&dojo.hasClass(_4c,c+_4d+"Selected")));
 }
 });
-},scrollIntoView:function(_77){
+},scrollIntoView:function(_4f){
 if(this._scrollingTimeout){
 window.clearTimeout(this._scrollingTimeout);
 }
 delete this._scrollingTimeout;
 this._scrollingTimeout=window.setTimeout(dojo.hitch(this,function(){
-if(_77.domNode){
-dijit.scrollIntoView(_77.domNode);
+if(_4f.domNode){
+dijit.scrollIntoView(_4f.domNode);
 }
 delete this._scrollingTimeout;
 return;
 }),1);
-},resize:function(_78){
-dijit.layout._LayoutWidget.prototype.resize.call(this,_78);
+},resize:function(_50){
+dijit.layout._LayoutWidget.prototype.resize.call(this,_50);
 },layout:function(){
-var _79=this.getChildren();
+var _51=this.getChildren();
 if(this._contentBox){
 var bn=this.buttonsNode;
-var _7b=this._contentBox.h-dojo.marginBox(bn).h-dojox.html.metrics.getScrollbar().h;
-dojo.forEach(_79,function(c){
-dojo.marginBox(c.domNode,{h:_7b});
+var _52=this._contentBox.h-dojo.marginBox(bn).h-dojox.html.metrics.getScrollbar().h;
+dojo.forEach(_51,function(c){
+dojo.marginBox(c.domNode,{h:_52});
 });
 }
 if(this._focusedPane){
@@ -550,105 +529,105 @@ if(!this._savedFocus){
 foc.focus();
 }
 }else{
-if(_79&&_79.length){
+if(_51&&_51.length){
 if(!this._savedFocus){
-_79[0].focus();
+_51[0].focus();
 }
 }
 }
-},_onChange:function(_7e){
-this.onChange(_7e);
-},_setValue:function(_7f){
+},_onChange:function(_53){
+this.onChange(_53);
+},_setValue:function(_54){
 delete this._setInProgress;
-if(!this._itemsMatch(this.value,_7f)){
-this.value=_7f;
-this._onChange(_7f);
+if(!this._itemsMatch(this.value,_54)){
+this.value=_54;
+this._onChange(_54);
 }
-},_setValueAttr:function(_80){
-if(this._itemsMatch(this.value,_80)&&!_80){
+},_setValueAttr:function(_55){
+if(this._itemsMatch(this.value,_55)&&!_55){
 return;
 }
-if(this._setInProgress&&this._setInProgress===_80){
+if(this._setInProgress&&this._setInProgress===_55){
 return;
 }
-this._setInProgress=_80;
-if(!_80||!this.store.isItem(_80)){
-var _81=this.getChildren()[0];
-_81._setSelected(null);
-this._onItemClick(null,_81,null,null);
+this._setInProgress=_55;
+if(!_55||!this.store.isItem(_55)){
+var _56=this.getChildren()[0];
+_56._setSelected(null);
+this._onItemClick(null,_56,null,null);
 return;
 }
-var _82=dojo.hitch(this,function(_83,_84){
-var _85=this.store,id;
-if(this.parentAttr&&_85.getFeatures()["dojo.data.api.Identity"]&&((id=this.store.getValue(_83,this.parentAttr))||id==="")){
+var _57=dojo.hitch(this,function(_58,_59){
+var _5a=this.store,id;
+if(this.parentAttr&&_5a.getFeatures()["dojo.data.api.Identity"]&&((id=this.store.getValue(_58,this.parentAttr))||id==="")){
 var cb=function(i){
-if(_85.getIdentity(i)==_85.getIdentity(_83)){
-_84(null);
+if(_5a.getIdentity(i)==_5a.getIdentity(_58)){
+_59(null);
 }else{
-_84([i]);
+_59([i]);
 }
 };
 if(id===""){
-_84(null);
+_59(null);
 }else{
 if(typeof id=="string"){
-_85.fetchItemByIdentity({identity:id,onItem:cb});
+_5a.fetchItemByIdentity({identity:id,onItem:cb});
 }else{
-if(_85.isItem(id)){
+if(_5a.isItem(id)){
 cb(id);
 }
 }
 }
 }else{
-var _89=this.childrenAttrs.length;
-var _8a=[];
-dojo.forEach(this.childrenAttrs,function(_8b){
+var _5b=this.childrenAttrs.length;
+var _5c=[];
+dojo.forEach(this.childrenAttrs,function(_5d){
 var q={};
-q[_8b]=_83;
-_85.fetch({query:q,scope:this,onComplete:function(_8d){
-if(this._setInProgress!==_80){
+q[_5d]=_58;
+_5a.fetch({query:q,scope:this,onComplete:function(_5e){
+if(this._setInProgress!==_55){
 return;
 }
-_8a=_8a.concat(_8d);
-_89--;
-if(_89===0){
-_84(_8a);
+_5c=_5c.concat(_5e);
+_5b--;
+if(_5b===0){
+_59(_5c);
 }
 }});
 },this);
 }
 });
-var _8e=dojo.hitch(this,function(_8f,idx){
-var set=_8f[idx];
-var _92=this.getChildren()[idx];
-var _93;
-if(set&&_92){
+var _5f=dojo.hitch(this,function(_60,idx){
+var set=_60[idx];
+var _61=this.getChildren()[idx];
+var _62;
+if(set&&_61){
 var fx=dojo.hitch(this,function(){
-if(_93){
-this.disconnect(_93);
+if(_62){
+this.disconnect(_62);
 }
-delete _93;
-if(this._setInProgress!==_80){
+delete _62;
+if(this._setInProgress!==_55){
 return;
 }
-var _95=dojo.filter(_92._menu.getChildren(),function(i){
+var _63=dojo.filter(_61._menu.getChildren(),function(i){
 return this._itemsMatch(i.item,set);
 },this)[0];
-if(_95){
+if(_63){
 idx++;
-_92._menu.onItemClick(_95,{type:"internal",stopPropagation:function(){
+_61._menu.onItemClick(_63,{type:"internal",stopPropagation:function(){
 },preventDefault:function(){
 }});
-if(_8f[idx]){
-_8e(_8f,idx);
+if(_60[idx]){
+_5f(_60,idx);
 }else{
 this._setValue(set);
-this.onItemClick(set,_92,this.getChildItems(set));
+this.onItemClick(set,_61,this.getChildItems(set));
 }
 }
 });
-if(!_92.isLoaded){
-_93=this.connect(_92,"onLoad",fx);
+if(!_61.isLoaded){
+_62=this.connect(_61,"onLoad",fx);
 }else{
 fx();
 }
@@ -658,116 +637,116 @@ this.attr("value",null);
 }
 }
 });
-var _97=[];
-var _98=dojo.hitch(this,function(_99){
-if(_99&&_99.length){
-_97.push(_99[0]);
-_82(_99[0],_98);
+var _64=[];
+var _65=dojo.hitch(this,function(_66){
+if(_66&&_66.length){
+_64.push(_66[0]);
+_57(_66[0],_65);
 }else{
-if(!_99){
-_97.pop();
+if(!_66){
+_64.pop();
 }
-_97.reverse();
-_8e(_97,0);
+_64.reverse();
+_5f(_64,0);
 }
 });
 var ns=this.domNode.style;
 if(ns.display=="none"||ns.visibility=="hidden"){
-this._setValue(_80);
+this._setValue(_55);
 }else{
-if(!this._itemsMatch(_80,this._visibleItem)){
-_98([_80]);
+if(!this._itemsMatch(_55,this._visibleItem)){
+_65([_55]);
 }
 }
-},_onItemClick:function(evt,_9c,_9d,_9e){
+},_onItemClick:function(evt,_67,_68,_69){
 if(evt){
-var _9f=this._getPaneForItem(_9d,_9c,_9e);
-var _a0=(evt.type=="click"&&evt.alreadySelected);
-if(_a0&&_9f){
-this._removeAfter(_9c.getIndexInParent()+1);
-var _a1=_9c.getNextSibling();
-if(_a1&&_a1._setSelected){
-_a1._setSelected(null);
-}
-this.scrollIntoView(_a1);
-}else{
-if(_9f){
-this.addChild(_9f,_9c.getIndexInParent()+1);
+var _6a=this._getPaneForItem(_68,_67,_69);
+var _6b=(evt.type=="click"&&evt.alreadySelected);
+if(_6b&&_6a){
+this._removeAfter(_67.getIndexInParent()+1);
+var _6c=_67.getNextSibling();
+if(_6c&&_6c._setSelected){
+_6c._setSelected(null);
+}
+this.scrollIntoView(_6c);
+}else{
+if(_6a){
+this.addChild(_6a,_67.getIndexInParent()+1);
 if(this._savedFocus){
-_9f.focus(true);
+_6a.focus(true);
 }
 }else{
-this._removeAfter(_9c);
-this.scrollIntoView(_9c);
+this._removeAfter(_67);
+this.scrollIntoView(_67);
 }
 }
 }else{
-if(_9c){
-this._removeAfter(_9c);
-this.scrollIntoView(_9c);
+if(_67){
+this._removeAfter(_67);
+this.scrollIntoView(_67);
 }
 }
 if(!evt||evt.type!="internal"){
-this._setValue(_9d);
-this.onItemClick(_9d,_9c,_9e);
+this._setValue(_68);
+this.onItemClick(_68,_67,_69);
 }
-this._visibleItem=_9d;
-},_getPaneForItem:function(_a2,_a3,_a4){
-var ret=this.getPaneForItem(_a2,_a3,_a4);
+this._visibleItem=_68;
+},_getPaneForItem:function(_6d,_6e,_6f){
+var ret=this.getPaneForItem(_6d,_6e,_6f);
 ret.store=this.store;
 ret.parentWidget=this;
-ret.parentPane=_a3||null;
-if(!_a2){
+ret.parentPane=_6e||null;
+if(!_6d){
 ret.query=this.query;
 ret.queryOptions=this.queryOptions;
 }else{
-if(_a4){
-ret.items=_a4;
+if(_6f){
+ret.items=_6f;
 }else{
-ret.items=[_a2];
+ret.items=[_6d];
 }
 }
 return ret;
-},_getMenuItemForItem:function(_a6,_a7){
-var _a8=this.store;
-if(!_a6||!_a8||!_a8.isItem(_a6)){
-var i=new dijit.MenuItem({label:dojo.i18n.getLocalization("dojox.widget","RollingList",this.lang).empty,disabled:true,iconClass:"dojoxEmpty",focus:function(){
+},_getMenuItemForItem:function(_70,_71){
+var _72=this.store;
+if(!_70||!_72||!_72.isItem(_70)){
+var i=new dijit.MenuItem({label:"---",disabled:true,iconClass:"dojoxEmpty",focus:function(){
 }});
 this._updateClass(i.domNode,"Item");
 return i;
 }else{
-var _aa=_a8.isItemLoaded(_a6);
-var _ab=_aa?this.getChildItems(_a6):undefined;
-var _ac;
-if(_ab){
-_ac=this.getMenuItemForItem(_a6,_a7,_ab);
-_ac.children=_ab;
-this._updateClass(_ac.domNode,"Item",{"Expanding":true});
-if(!_ac._started){
-var c=_ac.connect(_ac,"startup",function(){
+var _73=_72.isItemLoaded(_70);
+var _74=_73?this.getChildItems(_70):undefined;
+var _75;
+if(_74){
+_75=this.getMenuItemForItem(_70,_71,_74);
+_75.children=_74;
+this._updateClass(_75.domNode,"Item",{"Expanding":true});
+if(!_75._started){
+var c=_75.connect(_75,"startup",function(){
 this.disconnect(c);
 dojo.style(this.arrowWrapper,"display","");
 });
 }else{
-dojo.style(_ac.arrowWrapper,"display","");
+dojo.style(_75.arrowWrapper,"display","");
 }
 }else{
-_ac=this.getMenuItemForItem(_a6,_a7,null);
-if(_aa){
-this._updateClass(_ac.domNode,"Item",{"Single":true});
+_75=this.getMenuItemForItem(_70,_71,null);
+if(_73){
+this._updateClass(_75.domNode,"Item",{"Single":true});
 }else{
-this._updateClass(_ac.domNode,"Item",{"Unloaded":true});
-_ac.attr("disabled",true);
+this._updateClass(_75.domNode,"Item",{"Unloaded":true});
+_75.attr("disabled",true);
 }
 }
-_ac.store=this.store;
-_ac.item=_a6;
-if(!_ac.label){
-_ac.attr("label",this.store.getLabel(_a6).replace(/</,"<"));
+_75.store=this.store;
+_75.item=_70;
+if(!_75.label){
+_75.attr("label",this.store.getLabel(_70).replace(/</,"<"));
 }
-if(_ac.focusNode){
-var _ae=this;
-_ac.focus=function(){
+if(_75.focusNode){
+var _76=this;
+_75.focus=function(){
 if(!this.disabled){
 try{
 this.focusNode.focus();
@@ -776,39 +755,39 @@ catch(e){
 }
 }
 };
-_ac.connect(_ac.focusNode,"onmouseenter",function(){
+_75.connect(_75.focusNode,"onmouseenter",function(){
 if(!this.disabled){
-_ae._updateClass(this.domNode,"Item",{"Hover":true});
+_76._updateClass(this.domNode,"Item",{"Hover":true});
 }
 });
-_ac.connect(_ac.focusNode,"onmouseleave",function(){
+_75.connect(_75.focusNode,"onmouseleave",function(){
 if(!this.disabled){
-_ae._updateClass(this.domNode,"Item",{"Hover":false});
+_76._updateClass(this.domNode,"Item",{"Hover":false});
 }
 });
-_ac.connect(_ac.focusNode,"blur",function(){
-_ae._updateClass(this.domNode,"Item",{"Focus":false,"Hover":false});
+_75.connect(_75.focusNode,"blur",function(){
+_76._updateClass(this.domNode,"Item",{"Focus":false,"Hover":false});
 });
-_ac.connect(_ac.focusNode,"focus",function(){
-_ae._updateClass(this.domNode,"Item",{"Focus":true});
-_ae._focusedPane=_a7;
+_75.connect(_75.focusNode,"focus",function(){
+_76._updateClass(this.domNode,"Item",{"Focus":true});
+_76._focusedPane=_71;
 });
 if(this.executeOnDblClick){
-_ac.connect(_ac.focusNode,"ondblclick",function(){
-_ae._onExecute();
+_75.connect(_75.focusNode,"ondblclick",function(){
+_76._onExecute();
 });
 }
 }
-return _ac;
+return _75;
 }
-},_setStore:function(_af){
-if(_af===this.store&&this._started){
+},_setStore:function(_77){
+if(_77===this.store&&this._started){
 return;
 }
-this.store=_af;
-this._isIdentity=_af.getFeatures()["dojo.data.api.Identity"];
-var _b0=this._getPaneForItem();
-this.addChild(_b0,0);
+this.store=_77;
+this._isIdentity=_77.getFeatures()["dojo.data.api.Identity"];
+var _78=this._getPaneForItem();
+this.addChild(_78,0);
 },_onKey:function(e){
 if(e.charOrCode==dojo.keys.BACKSPACE){
 dojo.stopEvent(e);
@@ -838,21 +817,21 @@ this.onCancel();
 this._lastExecutedValue=this.attr("value");
 this.onExecute();
 },focus:function(){
-var _b2=this._savedFocus;
+var _79=this._savedFocus;
 this._savedFocus=dijit.getFocus(this);
 if(!this._savedFocus.node){
 delete this._savedFocus;
 }
 if(!this._focusedPane){
-var _b3=this.getChildren()[0];
-if(_b3&&!_b2){
-_b3.focus(true);
+var _7a=this.getChildren()[0];
+if(_7a&&!_79){
+_7a.focus(true);
 }
 }else{
 this._savedFocus=dijit.getFocus(this);
 var foc=this._focusedPane;
 delete this._focusedPane;
-if(!_b2){
+if(!_79){
 foc.focus(true);
 }
 }
@@ -869,11 +848,11 @@ return false;
 }
 return true;
 },_updateChildClasses:function(){
-var _b6=this.getChildren();
-var _b7=_b6.length;
-dojo.forEach(_b6,function(c,idx){
-dojo.toggleClass(c.domNode,"dojoxRollingListPaneCurrentChild",(idx==(_b7-1)));
-dojo.toggleClass(c.domNode,"dojoxRollingListPaneCurrentSelected",(idx==(_b7-2)));
+var _7b=this.getChildren();
+var _7c=_7b.length;
+dojo.forEach(_7b,function(c,idx){
+dojo.toggleClass(c.domNode,"dojoxRollingListPaneCurrentChild",(idx==(_7c-1)));
+dojo.toggleClass(c.domNode,"dojoxRollingListPaneCurrentSelected",(idx==(_7c-2)));
 });
 },startup:function(){
 if(this._started){
@@ -889,26 +868,26 @@ this._setStore(this.store);
 this.attr("showButtons",this.showButtons);
 this.inherited(arguments);
 this._lastExecutedValue=this.attr("value");
-},getChildItems:function(_ba){
-var _bb,_bc=this.store;
-dojo.forEach(this.childrenAttrs,function(_bd){
-var _be=_bc.getValues(_ba,_bd);
-if(_be&&_be.length){
-_bb=(_bb||[]).concat(_be);
+},getChildItems:function(_7d){
+var _7e,_7f=this.store;
+dojo.forEach(this.childrenAttrs,function(_80){
+var _81=_7f.getValues(_7d,_80);
+if(_81&&_81.length){
+_7e=(_7e||[]).concat(_81);
 }
 });
-return _bb;
-},getMenuItemForItem:function(_bf,_c0,_c1){
+return _7e;
+},getMenuItemForItem:function(_82,_83,_84){
 return new dijit.MenuItem({});
-},getPaneForItem:function(_c2,_c3,_c4){
-if(!_c2||_c4){
+},getPaneForItem:function(_85,_86,_87){
+if(!_85||_87){
 return new dojox.widget._RollingListGroupPane({});
 }else{
 return null;
 }
-},onItemClick:function(_c5,_c6,_c7){
+},onItemClick:function(_88,_89,_8a){
 },onExecute:function(){
 },onCancel:function(){
-},onChange:function(_c8){
+},onChange:function(_8b){
 }});
 }
diff --git a/dojox/widget/Rotator.js b/dojox/widget/Rotator.js
new file mode 100644
index 0000000..7a90d9a
--- /dev/null
+++ b/dojox/widget/Rotator.js
@@ -0,0 +1,148 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.widget.Rotator"]){
+dojo._hasResource["dojox.widget.Rotator"]=true;
+dojo.provide("dojox.widget.Rotator");
+dojo.require("dojo.parser");
+(function(d){
+var _1="dojox.widget.rotator.swap",_2=500,_3="display",_4="none",_5="zIndex";
+d.declare("dojox.widget.Rotator",null,{transition:_1,transitionParams:"duration:"+_2,panes:null,constructor:function(_6,_7){
+d.mixin(this,_6);
+var _8=this,t=_8.transition,tt=_8._transitions={},_9=_8._idMap={},tp=_8.transitionParams=eval("({ "+_8.transitionParams+" })"),_7=_8._domNode=dojo.byId(_7),cb=_8._domNodeContentBox=d.contentBox(_7),p={left:0,top:0},_a=function(bt,dt){
+console.warn(_8.declaredClass," - Unable to find transition \"",bt,"\", defaulting to \"",dt,"\".");
+};
+_8.id=_7.id||(new Date()).getTime();
+if(d.style(_7,"position")=="static"){
+d.style(_7,"position","relative");
+}
+tt[t]=d.getObject(t);
+if(!tt[t]){
+_a(t,_1);
+tt[_8.transition=_1]=d.getObject(_1);
+}
+if(!tp.duration){
+tp.duration=_2;
+}
+d.forEach(_8.panes,function(p){
+d.create("div",p,_7);
+});
+var pp=_8.panes=[];
+d.query(">",_7).forEach(function(n,i){
+var q={node:n,idx:i,params:d.mixin({},tp,eval("({ "+(d.attr(n,"transitionParams")||"")+" })"))},r=q.trans=d.attr(n,"transition")||_8.transition;
+d.forEach(["id","title","duration","waitForEvent"],function(a){
+q[a]=d.attr(n,a);
+});
+if(q.id){
+_9[id]=i;
+}
+if(!tt[r]&&!(tt[r]=d.getObject(r))){
+_a(r,q.trans=_8.transition);
+}
+p.position="absolute";
+p.display=_4;
+if(_8.idx==null||d.attr(n,"selected")){
+if(_8.idx!=null){
+d.style(pp[_8.idx].node,_3,_4);
+}
+_8.idx=i;
+p.display="";
+}
+d.style(n,p);
+d.query("> script[type^='dojo/method']",n).orphan().forEach(function(s){
+var e=d.attr(s,"event");
+if(e){
+q[e]=d.parser._functionFromScript(s);
+}
+});
+pp.push(q);
+});
+_8._controlSub=d.subscribe(_8.id+"/rotator/control",_8,"control");
+},destroy:function(){
+d.forEach([this._controlSub,this.wfe],d.unsubscribe);
+d.destroy(this._domNode);
+},next:function(){
+return this.go(this.idx+1);
+},prev:function(){
+return this.go(this.idx-1);
+},go:function(p){
+var _b=this,i=_b.idx,pp=_b.panes,_c=pp.length,_d=_b._idMap[p];
+_b._resetWaitForEvent();
+p=_d!=null?_d:(p||0);
+p=p<_c?(p<0?_c-1:p):0;
+if(p==i||_b.anim){
+return null;
+}
+var _e=pp[i],_f=pp[p];
+d.style(_e.node,_5,2);
+d.style(_f.node,_5,1);
+var _10={current:_e,next:_f,rotator:_b},_11=_b.anim=_b._transitions[_f.trans](d.mixin({rotatorBox:_b._domNodeContentBox},_10,_f.params));
+if(_11){
+var def=new d.Deferred(),ev=_f.waitForEvent,h=d.connect(_11,"onEnd",function(){
+d.style(_e.node,{display:_4,left:0,opacity:1,top:0,zIndex:0});
+d.disconnect(h);
+_b.anim=null;
+_b.idx=p;
+if(_e.onAfterOut){
+_e.onAfterOut(_10);
+}
+if(_f.onAfterIn){
+_f.onAfterIn(_10);
+}
+_b.onUpdate("onAfterTransition");
+if(!ev){
+_b._resetWaitForEvent();
+def.callback();
+}
+});
+_b.wfe=ev?d.subscribe(ev,function(){
+_b._resetWaitForEvent();
+def.callback(true);
+}):null;
+_b.onUpdate("onBeforeTransition");
+if(_e.onBeforeOut){
+_e.onBeforeOut(_10);
+}
+if(_f.onBeforeIn){
+_f.onBeforeIn(_10);
+}
+_11.play();
+return def;
+}
+},onUpdate:function(_12,_13){
+d.publish(this.id+"/rotator/update",[_12,this,_13||{}]);
+},_resetWaitForEvent:function(){
+if(this.wfe){
+d.unsubscribe(this.wfe);
+this.wfe=null;
+}
+},control:function(_14){
+var _15=d._toArray(arguments),_16=this;
+_15.shift();
+_16._resetWaitForEvent();
+if(_16[_14]){
+var def=_16[_14].apply(_16,_15);
+if(def){
+def.addCallback(function(){
+_16.onUpdate(_14);
+});
+}
+_16.onManualChange(_14);
+}else{
+console.warn(_16.declaredClass," - Unsupported action \"",_14,"\".");
+}
+},onManualChange:function(){
+}});
+d.setObject(_1,function(_17){
+return new d._Animation({play:function(){
+d.style(_17.current.node,_3,_4);
+d.style(_17.next.node,_3,"");
+this._fire("onEnd");
+}});
+});
+})(dojo);
+}
diff --git a/dojox/widget/SortList.js b/dojox/widget/SortList.js
index 75b5ea5..ebc3c66 100644
--- a/dojox/widget/SortList.js
+++ b/dojox/widget/SortList.js
@@ -11,7 +11,7 @@ dojo.provide("dojox.widget.SortList");
 dojo.experimental("dojox.widget.SortList");
 dojo.require("dijit.layout._LayoutWidget");
 dojo.require("dijit._Templated");
-dojo.declare("dojox.widget.SortList",[dijit.layout._LayoutWidget,dijit._Templated],{title:"",heading:"",descending:true,selected:null,sortable:true,store:"",key:"name",baseClass:"dojoxSortList",templateString:"<div class=\"sortList\" id=\"${id}\">\n\t\t<div class=\"sortListTitle\" dojoAttachPoint=\"titleNode\">\n\t\t<div class=\"dijitInline sortListIcon\"> </div>\n\t\t<span dojoAttachPoint=\"focusNode\">${title}</span>\n\t\t</div>\n\t\t<div class=\"sortListBodyWrapper\" dojoAttach [...]
+dojo.declare("dojox.widget.SortList",[dijit.layout._LayoutWidget,dijit._Templated],{title:"",heading:"",descending:true,selected:null,sortable:true,store:"",key:"name",baseClass:"dojoxSortList",templateString:dojo.cache("dojox.widget","SortList/SortList.html","<div class=\"sortList\" id=\"${id}\">\n\t\t<div class=\"sortListTitle\" dojoAttachPoint=\"titleNode\">\n\t\t<div class=\"dijitInline sortListIcon\"> </div>\n\t\t<span dojoAttachPoint=\"focusNode\">${title}</span>\n\t\t</div> [...]
 dojo.create("li",{innerHTML:this.store.getValue(_1,this.key).replace(/</g,"<")},this.containerNode);
 },postCreate:function(){
 if(this.store){
@@ -37,20 +37,20 @@ this.inherited(arguments);
 var _3=((this._contentBox.h)-(dojo.style(this.titleNode,"height")))-10;
 this.bodyWrapper.style.height=Math.abs(_3)+"px";
 },onSort:function(e){
-var _5=dojo.query("li",this.domNode);
+var _4=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"));
-_5.sort(this._sorter);
+_4.sort(this._sorter);
 if(this.descending){
-_5.reverse();
+_4.reverse();
 }
 }
 var i=0;
-dojo.forEach(_5,function(_7){
-dojo[(i++)%2===0?"addClass":"removeClass"](_7,"sortListItemOdd");
-this.containerNode.appendChild(_7);
+dojo.forEach(_4,function(_5){
+dojo[(i++)%2===0?"addClass":"removeClass"](_5,"sortListItemOdd");
+this.containerNode.appendChild(_5);
 },this);
 },_set:function(e){
 if(e.target!==this.bodyWrapper){
@@ -65,22 +65,22 @@ this._updateValues(e.target.innerHTML);
 },_updateValues:function(){
 this._selected=dojo.query("li.sortListItemSelected",this.containerNode);
 this.selected=[];
-dojo.forEach(this._selected,function(_b){
-this.selected.push(_b.innerHTML);
+dojo.forEach(this._selected,function(_6){
+this.selected.push(_6.innerHTML);
 },this);
 this.onChanged(arguments);
 },_sorter:function(a,b){
-var _e=a.innerHTML;
-var _f=b.innerHTML;
-if(_e>_f){
+var _7=a.innerHTML;
+var _8=b.innerHTML;
+if(_7>_8){
 return 1;
 }
-if(_e<_f){
+if(_7<_8){
 return -1;
 }
 return 0;
-},setTitle:function(_10){
-this.focusNode.innerHTML=this.title=_10;
+},setTitle:function(_9){
+this.focusNode.innerHTML=this.title=_9;
 },onChanged:function(){
 }});
 }
diff --git a/dojox/widget/Standby.js b/dojox/widget/Standby.js
index ff07214..fa53cdb 100644
--- a/dojox/widget/Standby.js
+++ b/dojox/widget/Standby.js
@@ -12,7 +12,8 @@ dojo.require("dijit._Widget");
 dojo.require("dijit._Templated");
 dojo.require("dojo.fx");
 dojo.experimental("dojox.widget.Standby");
-dojo.declare("dojox.widget.Standby",[dijit._Widget,dijit._Templated],{templateString:"<div>\n\t<div class=\"standbyUnderlayNode\" dojoAttachPoint=\"_underlayNode\">\n\t</div>\n\t<img src=\"${image}\" class=\"standbyImageNode\" dojoAttachPoint=\"_imageNode\">\n</div>\n\n",_underlayNode:null,_imageNode:null,image:dojo.moduleUrl("dojox","widget/Standby/images/loading.gif").toString(),imageText:"Please Wait...",_displayed:false,_resizeCheck:null,target:"",color:"#C0C0C0",startup:function(_1){
+dojo.declare("dojox.widget.Standby",[dijit._Widget,dijit._Templated],{templateString:"<div>"+"<div style=\"display: none; opacity: 0; z-index: 9999; "+"position: absolute; cursor:wait;\" dojoAttachPoint=\"_underlayNode\"></div>"+"<img src=\"${image}\" style=\"opacity: 0; display: none; z-index: -10000; "+"position: absolute; top: 0px; left: 0px; cursor:wait;\" "+"dojoAttachPoint=\"_imageNode\">"+"<div style=\"opacity: 0; display: none; z-index: -10000; position: absolute; "+"top: 0px;\"  [...]
+if(!this._started){
 if(typeof this.target==="string"){
 var w=dijit.byId(this.target);
 if(w){
@@ -21,19 +22,33 @@ this.target=w.domNode;
 this.target=dojo.byId(this.target);
 }
 }
-dojo.style(this._underlayNode,"display","none");
-dojo.style(this._imageNode,"display","none");
-dojo.style(this._underlayNode,"backgroundColor",this.color);
+if(this.text){
+this._textNode.innerHTML=this.text;
+}
+if(this.centerIndicator==="image"){
+this._centerNode=this._imageNode;
 dojo.attr(this._imageNode,"src",this.image);
 dojo.attr(this._imageNode,"alt",this.imageText);
+}else{
+this._centerNode=this._textNode;
+}
+dojo.style(this._underlayNode,{display:"none",backgroundColor:this.color});
+dojo.style(this._centerNode,"display","none");
 this.connect(this._underlayNode,"onclick","_ignore");
 if(this.domNode.parentNode&&this.domNode.parentNode!=dojo.body()){
 dojo.body().appendChild(this.domNode);
 }
+if(dojo.isIE==7){
+this._ieFixNode=dojo.doc.createElement("div");
+dojo.style(this._ieFixNode,{opacity:"0",zIndex:"-1000",position:"absolute",top:"-1000px"});
+dojo.body().appendChild(this._ieFixNode);
+}
+}
 },show:function(){
 if(!this._displayed){
 this._displayed=true;
 this._size();
+this._disableOverflow();
 this._fadeIn();
 }
 },hide:function(){
@@ -46,93 +61,268 @@ clearInterval(this._resizeCheck);
 this._resizeCheck=null;
 }
 }
+},isVisible:function(){
+return this._displayed;
+},onShow:function(){
+},onHide:function(){
+},uninitialize:function(){
+this._displayed=false;
+if(this._resizeCheck){
+clearInterval(this._resizeCheck);
+}
+dojo.style(this._centerNode,"display","none");
+dojo.style(this._underlayNode,"display","none");
+if(dojo.isIE==7){
+dojo.body().removeChild(this._ieFixNode);
+delete this._ieFixNode;
+}
+this.target=null;
+this._imageNode=null;
+this._textNode=null;
+this._centerNode=null;
+this.inherited(arguments);
 },_size:function(){
 if(this._displayed){
-var _3=dojo.style(this._imageNode,"display");
-dojo.style(this._imageNode,"display","block");
-var _4=dojo.coords(this.target);
-var _5=dojo.marginBox(this._imageNode);
-dojo.style(this._imageNode,"display",_3);
-dojo.style(this._imageNode,"zIndex","10000");
-var _6=dojo._docScroll();
-if(!_6){
-_6={x:0,y:0};
-}
-var _7=dojo.style(this.target,"marginLeft");
-if(dojo.isWebKit&&_7){
-_7=_7*2;
-}
-if(_7){
-_4.w=_4.w-_7;
-}
-if(!dojo.isWebKit){
-var _8=dojo.style(this.target,"marginRight");
-if(_8){
-_4.w=_4.w-_8;
-}
-}
-var _9=dojo.style(this.target,"marginTop");
-if(_9){
-_4.h=_4.h-_9;
-}
-var _a=dojo.style(this.target,"marginBottom");
-if(_a){
-_4.h=_4.h-_a;
-}
-if(_4.h>0&&_4.w>0){
-dojo.style(this._underlayNode,"width",_4.w+"px");
-dojo.style(this._underlayNode,"height",_4.h+"px");
-dojo.style(this._underlayNode,"top",(_4.y+_6.y)+"px");
-dojo.style(this._underlayNode,"left",(_4.x+_6.x)+"px");
-var _b=function(_c,_d){
-dojo.forEach(_c,function(_e){
-dojo.style(this._underlayNode,_e,dojo.style(this.target,_e));
-},_d);
-};
-var _f=["borderRadius","borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"];
-_b(_f,this);
+var _2=dojo.attr(dojo.body(),"dir");
+if(_2){
+_2=_2.toLowerCase();
+}
+var _3;
+var _4=this._scrollerWidths();
+var _5=this.target;
+var _6=dojo.style(this._centerNode,"display");
+dojo.style(this._centerNode,"display","block");
+var _7=dojo.position(_5,true);
+if(_5===dojo.body()||_5===dojo.doc){
+_7=dijit.getViewport();
+_7.x=_7.l;
+_7.y=_7.t;
+}
+var _8=dojo.marginBox(this._centerNode);
+dojo.style(this._centerNode,"display",_6);
+if(this._ieFixNode){
+_3=-this._ieFixNode.offsetTop/1000;
+_7.x=Math.floor((_7.x+0.9)/_3);
+_7.y=Math.floor((_7.y+0.9)/_3);
+_7.w=Math.floor((_7.w+0.9)/_3);
+_7.h=Math.floor((_7.h+0.9)/_3);
+}
+var zi=dojo.style(_5,"zIndex");
+var _9=zi;
+var _a=zi;
+if(this.zIndex==="auto"){
+if(zi!="auto"){
+_9=parseInt(_9,10)+1;
+_a=parseInt(_a,10)+2;
+}
+}else{
+_9=parseInt(this.zIndex,10)+1;
+_a=parseInt(this.zIndex,10)+2;
+}
+dojo.style(this._centerNode,"zIndex",_a);
+dojo.style(this._underlayNode,"zIndex",_9);
+var pn=_5.parentNode;
+if(pn&&pn!==dojo.body()&&_5!==dojo.body()&&_5!==dojo.doc){
+var _b=_7.h;
+var _c=_7.w;
+var _d=dojo.position(pn,true);
+if(this._ieFixNode){
+_3=-this._ieFixNode.offsetTop/1000;
+_d.x=Math.floor((_d.x+0.9)/_3);
+_d.y=Math.floor((_d.y+0.9)/_3);
+_d.w=Math.floor((_d.w+0.9)/_3);
+_d.h=Math.floor((_d.h+0.9)/_3);
+}
+_d.w-=pn.scrollHeight>pn.clientHeight&&pn.clientHeight>0?_4.v:0;
+_d.h-=pn.scrollWidth>pn.clientWidth&&pn.clientWidth>0?_4.h:0;
+if(_2==="rtl"){
+if(dojo.isOpera){
+_7.x+=pn.scrollHeight>pn.clientHeight&&pn.clientHeight>0?_4.v:0;
+_d.x+=pn.scrollHeight>pn.clientHeight&&pn.clientHeight>0?_4.v:0;
+}else{
+if(dojo.isIE){
+_d.x+=pn.scrollHeight>pn.clientHeight&&pn.clientHeight>0?_4.v:0;
+}else{
+if(dojo.isWebKit){
+}
+}
+}
+}
+if(_d.w<_7.w){
+_7.w=_7.w-_d.w;
+}
+if(_d.h<_7.h){
+_7.h=_7.h-_d.h;
+}
+var _e=_d.y;
+var _f=_d.y+_d.h;
+var _10=_7.y;
+var _11=_7.y+_b;
+var _12=_d.x;
+var _13=_d.x+_d.w;
+var _14=_7.x;
+var _15=_7.x+_c;
+var _16;
+if(_11>_e&&_10<_e){
+_7.y=_d.y;
+_16=_e-_10;
+var _17=_b-_16;
+if(_17<_d.h){
+_7.h=_17;
+}else{
+_7.h-=2*(pn.scrollWidth>pn.clientWidth&&pn.clientWidth>0?_4.h:0);
+}
+}else{
+if(_10<_f&&_11>_f){
+_7.h=_f-_10;
+}else{
+if(_11<=_e||_10>=_f){
+_7.h=0;
+}
+}
+}
+if(_15>_12&&_14<_12){
+_7.x=_d.x;
+_16=_12-_14;
+var _18=_c-_16;
+if(_18<_d.w){
+_7.w=_18;
+}else{
+_7.w-=2*(pn.scrollHeight>pn.clientHeight&&pn.clientHeight>0?_4.w:0);
+}
+}else{
+if(_14<_13&&_15>_13){
+_7.w=_13-_14;
+}else{
+if(_15<=_12||_14>=_13){
+_7.w=0;
+}
+}
+}
+}
+if(_7.h>0&&_7.w>0){
+dojo.style(this._underlayNode,{display:"block",width:_7.w+"px",height:_7.h+"px",top:_7.y+"px",left:_7.x+"px"});
+var _19=["borderRadius","borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"];
+this._cloneStyles(_19);
 if(!dojo.isIE){
-_f=["MozBorderRadius","MozBorderRadiusTopleft","MozBorderRadiusTopright","MozBorderRadiusBottomleft","MozBorderRadiusBottomright","WebkitBorderRadius","WebkitBorderTopLeftRadius","WebkitBorderTopRightRadius","WebkitBorderBottomLeftRadius","WebkitBorderBottomRightRadius"];
-_b(_f,this);
+_19=["MozBorderRadius","MozBorderRadiusTopleft","MozBorderRadiusTopright","MozBorderRadiusBottomleft","MozBorderRadiusBottomright","WebkitBorderRadius","WebkitBorderTopLeftRadius","WebkitBorderTopRightRadius","WebkitBorderBottomLeftRadius","WebkitBorderBottomRightRadius"];
+this._cloneStyles(_19,this);
+}
+var _1a=(_7.h/2)-(_8.h/2);
+var _1b=(_7.w/2)-(_8.w/2);
+if(_7.h>=_8.h&&_7.w>=_8.w){
+dojo.style(this._centerNode,{top:(_1a+_7.y)+"px",left:(_1b+_7.x)+"px",display:"block"});
+}else{
+dojo.style(this._centerNode,"display","none");
 }
-var _10=(_4.h/2)-(_5.h/2);
-var _11=(_4.w/2)-(_5.w/2);
-dojo.style(this._imageNode,"top",(_10+_4.y+_6.y)+"px");
-dojo.style(this._imageNode,"left",(_11+_4.x+_6.x)+"px");
-dojo.style(this._underlayNode,"display","block");
-dojo.style(this._imageNode,"display","block");
 }else{
 dojo.style(this._underlayNode,"display","none");
-dojo.style(this._imageNode,"display","none");
+dojo.style(this._centerNode,"display","none");
 }
 if(this._resizeCheck===null){
-var _12=this;
+var _1c=this;
 this._resizeCheck=setInterval(function(){
-_12._size();
+_1c._size();
 },100);
 }
 }
+},_cloneStyles:function(_1d){
+dojo.forEach(_1d,function(_1e){
+dojo.style(this._underlayNode,_1e,dojo.style(this.target,_1e));
+},this);
 },_fadeIn:function(){
-var _13=dojo.animateProperty({node:this._underlayNode,properties:{opacity:{start:0,end:0.75}}});
-var _14=dojo.animateProperty({node:this._imageNode,properties:{opacity:{start:0,end:1}}});
-var _15=dojo.fx.combine([_13,_14]);
-_15.play();
+var _1f=this;
+var _20=dojo.animateProperty({duration:_1f.duration,node:_1f._underlayNode,properties:{opacity:{start:0,end:0.75}}});
+var _21=dojo.animateProperty({duration:_1f.duration,node:_1f._centerNode,properties:{opacity:{start:0,end:1}},onEnd:function(){
+_1f.onShow();
+}});
+var _22=dojo.fx.combine([_20,_21]);
+_22.play();
 },_fadeOut:function(){
-var _16=this;
-var _17=dojo.animateProperty({node:this._underlayNode,properties:{opacity:{start:0.75,end:0}},onEnd:function(){
-dojo.style(_16._underlayNode,"display","none");
+var _23=this;
+var _24=dojo.animateProperty({duration:_23.duration,node:_23._underlayNode,properties:{opacity:{start:0.75,end:0}},onEnd:function(){
+dojo.style(_23._underlayNode,{"display":"none","zIndex":"-1000"});
 }});
-var _18=dojo.animateProperty({node:this._imageNode,properties:{opacity:{start:1,end:0}},onEnd:function(){
-dojo.style(_16._imageNode,"display","none");
+var _25=dojo.animateProperty({duration:_23.duration,node:_23._centerNode,properties:{opacity:{start:1,end:0}},onEnd:function(){
+dojo.style(_23._centerNode,{"display":"none","zIndex":"-1000"});
+_23.onHide();
+_23._enableOverflow();
 }});
-var _19=dojo.fx.combine([_17,_18]);
-_19.play();
-},_ignore:function(_1a){
-if(_1a){
-_1a.preventDefault();
-_1a.stopPropagation();
+var _26=dojo.fx.combine([_24,_25]);
+_26.play();
+},_ignore:function(_27){
+if(_27){
+dojo.stopEvent(_27);
+}
+},_scrollerWidths:function(){
+var div=dojo.doc.createElement("div");
+dojo.style(div,{position:"absolute",opacity:0,overflow:"hidden",width:"50px",height:"50px",zIndex:"-100",top:"-200px",left:"-200px",padding:"0px",margin:"0px"});
+var _28=dojo.doc.createElement("div");
+dojo.style(_28,{width:"200px",height:"10px"});
+div.appendChild(_28);
+dojo.body().appendChild(div);
+var b=dojo.contentBox(div);
+dojo.style(div,"overflow","scroll");
+var a=dojo.contentBox(div);
+dojo.body().removeChild(div);
+return {v:b.w-a.w,h:b.h-a.h};
+},_setTextAttr:function(_29){
+this._textNode.innerHTML=_29;
+this.text=_29;
+},_setColorAttr:function(c){
+dojo.style(this._underlayNode,"backgroundColor",c);
+this.color=c;
+},_setImageTextAttr:function(_2a){
+dojo.attr(this._imageNode,"alt",_2a);
+this.imageText=_2a;
+},_setImageAttr:function(url){
+dojo.attr(this._imageNode,"src",url);
+this.image=url;
+},_setCenterIndicatorAttr:function(_2b){
+this.centerIndicator=_2b;
+if(_2b==="image"){
+this._centerNode=this._imageNode;
+dojo.style(this._textNode,"display","none");
+}else{
+this._centerNode=this._textNode;
+dojo.style(this._imageNode,"display","none");
+}
+},_disableOverflow:function(){
+if(this.target===dojo.body()||this.target===dojo.doc){
+this._overflowDisabled=true;
+var _2c=dojo.body();
+if(_2c.style&&_2c.style.overflow){
+this._oldOverflow=dojo.style(_2c,"overflow");
+}else{
+this._oldOverflow="";
+}
+if(dojo.isIE&&!dojo.isQuirks){
+if(_2c.parentNode&&_2c.parentNode.style&&_2c.parentNode.style.overflow){
+this._oldBodyParentOverflow=_2c.parentNode.style.overflow;
+}else{
+this._oldBodyParentOverflow="scroll";
+}
+dojo.style(_2c.parentNode,"overflow","hidden");
+}
+dojo.style(_2c,"overflow","hidden");
+}
+},_enableOverflow:function(){
+if(this._overflowDisabled){
+delete this._overflowDisabled;
+var _2d=dojo.body();
+if(dojo.isIE&&!dojo.isQuirks){
+_2d.parentNode.style.overflow=this._oldBodyParentOverflow;
+delete this._oldBodyParentOverflow;
+}
+dojo.style(_2d,"overflow",this._oldOverflow);
+if(dojo.isWebKit){
+var div=dojo.create("div",{style:{height:"2px"}});
+_2d.appendChild(div);
+setTimeout(function(){
+_2d.removeChild(div);
+},0);
+}
+delete this._oldOverflow;
 }
-},uninitialize:function(){
-this.hide();
 }});
 }
diff --git a/dojox/widget/Standby/Standby.css b/dojox/widget/Standby/Standby.css
deleted file mode 100644
index f83d2e5..0000000
--- a/dojox/widget/Standby/Standby.css
+++ /dev/null
@@ -1,16 +0,0 @@
-.standbyUnderlayNode {
-	display: none;
-	opacity: 0;
-	z-index: 9999;
-	position: absolute;
-	cursor:wait;
-}
-.standbyImageNode {
-	opacity: 0;
-        display: none;
-	z-index: -10000;
-	position: absolute;
-	top: 0px;
-	left: 0px;
-	cursor:wait;
-}
diff --git a/dojox/widget/Standby/Standby.html b/dojox/widget/Standby/Standby.html
deleted file mode 100644
index 8d4a2ad..0000000
--- a/dojox/widget/Standby/Standby.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<div>
-	<div class="standbyUnderlayNode" dojoAttachPoint="_underlayNode">
-	</div>
-	<img src="${image}" class="standbyImageNode" dojoAttachPoint="_imageNode">
-</div>
-
diff --git a/dojox/widget/Toaster.js b/dojox/widget/Toaster.js
index 06342b5..3d42d9b 100644
--- a/dojox/widget/Toaster.js
+++ b/dojox/widget/Toaster.js
@@ -11,13 +11,10 @@ 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],{templateString:"<div dojoAttachPoint=\"clipNode\"><div dojoAttachPoint=\"containerNode\" dojoAttachEvent=\"onclick:onSelect\"><div dojoAttachPoint=\"contentNode\"></div></div></div>",messageTopic:"",messageTypes:{MESSAGE:"message",WARNING:"warning",ERROR:"error",FATAL:"fatal"},defaultType:"message",positionDirection:"br-up",positionDirectionTypes:["br-up","br-left","bl-up","bl-right","tr-down","tr-left","tl-down","tl-r [...]
+dojo.declare("dojox.widget.Toaster",[dijit._Widget,dijit._Templated],{templateString:"<div class=\"dijitToasterClip\" dojoAttachPoint=\"clipNode\"><div class=\"dijitToasterContainer\" dojoAttachPoint=\"containerNode\" dojoAttachEvent=\"onclick:onSelect\"><div class=\"dijitToasterContent\" dojoAttachPoint=\"contentNode\"></div></div></div>",messageTopic:"",messageTypes:{MESSAGE:"message",WARNING:"warning",ERROR:"error",FATAL:"fatal"},defaultType:"message",positionDirection:"br-up",positio [...]
 this.inherited(arguments);
 this.hide();
 dojo.body().appendChild(this.domNode);
-this.clipNode.className="dijitToasterClip";
-this.containerNode.className+=" dijitToasterContainer";
-this.contentNode.className="dijitToasterContent";
 if(this.messageTopic){
 dojo.subscribe(this.messageTopic,this,"_handleMessage");
 }
@@ -29,51 +26,51 @@ this.setContent(_1.message,_1.type,_1.duration);
 }
 },_capitalize:function(w){
 return w.substring(0,1).toUpperCase()+w.substring(1);
-},setContent:function(_3,_4,_5){
-_5=_5||this.duration;
+},setContent:function(_2,_3,_4){
+_4=_4||this.duration;
 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(_3,_4,_5);
+this.setContent(_2,_3,_4);
 }),50);
 return;
 }
 }
-for(var _6 in this.messageTypes){
-dojo.removeClass(this.containerNode,"dijitToaster"+this._capitalize(this.messageTypes[_6]));
+for(var _5 in this.messageTypes){
+dojo.removeClass(this.containerNode,"dijitToaster"+this._capitalize(this.messageTypes[_5]));
 }
 dojo.style(this.containerNode,"opacity",1);
-this._setContent(_3);
-dojo.addClass(this.containerNode,"dijitToaster"+this._capitalize(_4||this.defaultType));
+this._setContent(_2);
+dojo.addClass(this.containerNode,"dijitToaster"+this._capitalize(_3||this.defaultType));
 this.show();
-var _7=dojo.marginBox(this.containerNode);
+var _6=dojo.marginBox(this.containerNode);
 this._cancelHideTimer();
 if(this.isVisible){
 this._placeClip();
 if(!this._stickyMessage){
-this._setHideTimer(_5);
+this._setHideTimer(_4);
 }
 }else{
-var _8=this.containerNode.style;
+var _7=this.containerNode.style;
 var pd=this.positionDirection;
 if(pd.indexOf("-up")>=0){
-_8.left=0+"px";
-_8.top=_7.h+10+"px";
+_7.left=0+"px";
+_7.top=_6.h+10+"px";
 }else{
 if(pd.indexOf("-left")>=0){
-_8.left=_7.w+10+"px";
-_8.top=0+"px";
+_7.left=_6.w+10+"px";
+_7.top=0+"px";
 }else{
 if(pd.indexOf("-right")>=0){
-_8.left=0-_7.w-10+"px";
-_8.top=0+"px";
+_7.left=0-_6.w-10+"px";
+_7.top=0+"px";
 }else{
 if(pd.indexOf("-down")>=0){
-_8.left=0+"px";
-_8.top=0-_7.h-10+"px";
+_7.left=0+"px";
+_7.top=0-_6.h-10+"px";
 }else{
 throw new Error(this.id+".positionDirection is invalid: "+pd);
 }
@@ -81,14 +78,14 @@ throw new Error(this.id+".positionDirection is invalid: "+pd);
 }
 }
 this.slideAnim=dojo.fx.slideTo({node:this.containerNode,top:0,left:0,duration:this.slideDuration});
-this.connect(this.slideAnim,"onEnd",function(_a,_b){
+this.connect(this.slideAnim,"onEnd",function(_8,_9){
 this.fadeAnim=dojo.fadeOut({node:this.containerNode,duration:1000});
-this.connect(this.fadeAnim,"onEnd",function(_c){
+this.connect(this.fadeAnim,"onEnd",function(_a){
 this.isVisible=false;
 this.hide();
 });
-this._setHideTimer(_5);
-this.connect(this,"onSelect",function(_d){
+this._setHideTimer(_4);
+this.connect(this,"onSelect",function(_b){
 this._cancelHideTimer();
 this._stickyMessage=false;
 this.fadeAnim.play();
@@ -97,65 +94,65 @@ this.isVisible=true;
 });
 this.slideAnim.play();
 }
-},_setContent:function(_e){
-if(dojo.isFunction(_e)){
-_e(this);
+},_setContent:function(_c){
+if(dojo.isFunction(_c)){
+_c(this);
 return;
 }
-if(_e&&this.isVisible){
-_e=this.contentNode.innerHTML+this.separator+_e;
+if(_c&&this.isVisible){
+_c=this.contentNode.innerHTML+this.separator+_c;
 }
-this.contentNode.innerHTML=_e;
+this.contentNode.innerHTML=_c;
 },_cancelHideTimer:function(){
 if(this._hideTimer){
 clearTimeout(this._hideTimer);
 this._hideTimer=null;
 }
-},_setHideTimer:function(_f){
+},_setHideTimer:function(_d){
 this._cancelHideTimer();
-if(_f>0){
+if(_d>0){
 this._cancelHideTimer();
-this._hideTimer=setTimeout(dojo.hitch(this,function(evt){
+this._hideTimer=setTimeout(dojo.hitch(this,function(_e){
 if(this.bgIframe&&this.bgIframe.iframe){
 this.bgIframe.iframe.style.display="none";
 }
 this._hideTimer=null;
 this._stickyMessage=false;
 this.fadeAnim.play();
-}),_f);
+}),_d);
 }else{
 this._stickyMessage=true;
 }
 },_placeClip:function(){
-var _11=dijit.getViewport();
-var _12=dojo.marginBox(this.containerNode);
-var _13=this.clipNode.style;
-_13.height=_12.h+"px";
-_13.width=_12.w+"px";
+var _f=dijit.getViewport();
+var _10=dojo.marginBox(this.containerNode);
+var _11=this.clipNode.style;
+_11.height=_10.h+"px";
+_11.width=_10.w+"px";
 var pd=this.positionDirection;
 if(pd.match(/^t/)){
-_13.top=_11.t+"px";
+_11.top=_f.t+"px";
 }else{
 if(pd.match(/^b/)){
-_13.top=(_11.h-_12.h-2+_11.t)+"px";
+_11.top=(_f.h-_10.h-2+_f.t)+"px";
 }
 }
 if(pd.match(/^[tb]r-/)){
-_13.left=(_11.w-_12.w-1-_11.l)+"px";
+_11.left=(_f.w-_10.w-1-_f.l)+"px";
 }else{
 if(pd.match(/^[tb]l-/)){
-_13.left=0+"px";
+_11.left=0+"px";
 }
 }
-_13.clip="rect(0px, "+_12.w+"px, "+_12.h+"px, 0px)";
+_11.clip="rect(0px, "+_10.w+"px, "+_10.h+"px, 0px)";
 if(dojo.isIE){
 if(!this.bgIframe){
 this.clipNode.id=dijit.getUniqueId("dojox_widget_Toaster_clipNode");
 this.bgIframe=new dijit.BackgroundIframe(this.clipNode);
 }
-var _15=this.bgIframe.iframe;
-if(_15){
-_15.style.display="block";
+var _12=this.bgIframe.iframe;
+if(_12){
+_12.style.display="block";
 }
 }
 },onSelect:function(e){
diff --git a/dojox/widget/UpgradeBar.js b/dojox/widget/UpgradeBar.js
new file mode 100644
index 0000000..879a825
--- /dev/null
+++ b/dojox/widget/UpgradeBar.js
@@ -0,0 +1,101 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.widget.UpgradeBar"]){
+dojo._hasResource["dojox.widget.UpgradeBar"]=true;
+dojo.provide("dojox.widget.UpgradeBar");
+dojo.require("dijit._Widget");
+dojo.require("dijit._Templated");
+dojo.require("dojo.fx");
+dojo.require("dojo.cookie");
+dojo.experimental("dojox.widget.UpgradeBar");
+dojo.declare("dojox.widget.UpgradeBar",[dijit._Widget,dijit._Templated],{notifications:[],buttonCancel:"Close for now",noRemindButton:"Don't Remind Me Again",templateString:dojo.cache("dojox.widget","UpgradeBar/UpgradeBar.html","<div class=\"dojoxUpgradeBar\">\n\t<div class=\"dojoxUpgradeBarMessage\" dojoAttachPoint=\"messageNode\">message</div>\n\t<div class=\"dojoxUpgradeBarReminderButton\" dojoAttachPoint=\"dontRemindButtonNode\" dojoAttachEvent=\"onclick:_onDontRemindClick\">${noRemi [...]
+if(!_1.notifications&&_2){
+dojo.forEach(_2.childNodes,function(n){
+if(n.nodeType==1){
+var _3=dojo.attr(n,"validate");
+this.notifications.push({message:n.innerHTML,validate:function(){
+var _4=true;
+try{
+_4=dojo.eval(_3);
+}
+catch(e){
+}
+return _4;
+}});
+}
+},this);
+}
+},checkNotifications:function(){
+if(!this.notifications.length){
+return;
+}
+for(var i=0;i<this.notifications.length;i++){
+var _5=this.notifications[i].validate();
+if(_5){
+this.notify(this.notifications[i].message);
+break;
+}
+}
+},postCreate:function(){
+this.inherited(arguments);
+if(this.domNode.parentNode){
+dojo.style(this.domNode,"display","none");
+}
+dojo.mixin(this.attributeMap,{message:{node:"messageNode",type:"innerHTML"}});
+if(!this.noRemindButton){
+dojo.destroy(this.dontRemindButtonNode);
+}
+if(dojo.isIE==6){
+var _6=this;
+var _7=function(){
+var v=dijit.getViewport();
+dojo.style(_6.domNode,"width",v.w+"px");
+};
+this.connect(window,"resize",function(){
+_7();
+});
+_7();
+}
+dojo.addOnLoad(this,"checkNotifications");
+},notify:function(_8){
+if(dojo.cookie("disableUpgradeReminders")){
+return;
+}
+if(!this.domNode.parentNode){
+document.body.appendChild(this.domNode);
+}else{
+dojo.style(this.domNode,"display","");
+}
+if(_8){
+this.attr("message",_8);
+}
+},show:function(){
+this._bodyMarginTop=dojo.style(dojo.body(),"marginTop");
+this._size=dojo.contentBox(this.domNode).h;
+dojo.style(this.domNode,{display:"block",height:0,opacity:0});
+if(!this._showAnim){
+this._showAnim=dojo.fx.combine([dojo.animateProperty({node:dojo.body(),duration:500,properties:{marginTop:this._bodyMarginTop+this._size}}),dojo.animateProperty({node:this.domNode,duration:500,properties:{height:this._size,opacity:1}})]);
+}
+this._showAnim.play();
+},hide:function(){
+if(!this._hideAnim){
+this._hideAnim=dojo.fx.combine([dojo.animateProperty({node:dojo.body(),duration:500,properties:{marginTop:this._bodyMarginTop}}),dojo.animateProperty({node:this.domNode,duration:500,properties:{height:0,opacity:0}})]);
+dojo.connect(this._hideAnim,"onEnd",this,function(){
+dojo.style(this.domNode,"display","none");
+});
+}
+this._hideAnim.play();
+},_onDontRemindClick:function(){
+dojo.cookie("disableUpgradeReminders",true,{expires:3650});
+this.hide();
+},_onCloseEnter:function(){
+dojo.addClass(this.closeButtonNode,"dojoxUpgradeBarCloseIcon-hover");
+},_onCloseLeave:function(){
+dojo.removeClass(this.closeButtonNode,"dojoxUpgradeBarCloseIcon-hover");
+}});
+}
diff --git a/dojox/widget/UpgradeBar/UpgradeBar.css b/dojox/widget/UpgradeBar/UpgradeBar.css
new file mode 100644
index 0000000..2526b90
--- /dev/null
+++ b/dojox/widget/UpgradeBar/UpgradeBar.css
@@ -0,0 +1,61 @@
+
+.dojoxUpgradeBar {
+	position:absolute;
+	left:0;
+	top:0;
+	width:100%;
+	height:32px;
+	overflow:hidden;
+	z-index:100;
+	background:#f3f2af;
+	box-shadow:0 2px 6px #444;
+	-webkit-box-shadow:0 1px 6px #444;
+	-moz-box-shadow:0 1px 6px #444;
+	font-size:.8em;
+}
+.dj_ie .dojoxUpgradeBar {
+	border-bottom:#665F48 2px solid;
+}
+.dojoxUpgradeBarMessage {
+	position:absolute;
+	padding-left:10px;
+	top:50%;
+	margin-top:-.75em;
+	left:5px;
+	width:100%;
+}
+.dojoxUpgradeBarMessage a{
+	margin-left:10px;
+}
+.dojoxUpgradeBarReminderButton {
+	position:absolute;
+	top:25%;
+	margin-right:50px;
+	font-size:11px;
+	text-decoration:underline;
+	text-align:right;
+	cursor:pointer;
+	right:-20px;
+}
+.dj_ie6 .dojoxUpgradeBarReminderButton {
+	margin-top:2px;
+}
+.dojoxUpgradeBarCloseIcon {
+	background: url("../../../dijit/themes/tundra/images/tabClose.png") no-repeat right top;
+	position: absolute;
+	vertical-align: middle;
+	right: 5px;
+	top: 30%;
+	height: 15px;
+	width: 15px;
+	cursor: pointer;
+}
+.dj_ie6 .dojoxUpgradeBarCloseIcon {
+	background : url("../../../dijit/themes/tundra/images/tabClose.gif") no-repeat right top;
+}
+.dojoxUpgradeBarCloseIcon-hover {
+	background: url("../../../dijit/themes/tundra/images/tabCloseHover.png") no-repeat right top;
+}
+.dj_ie6 .dojoxUpgradeBarCloseIcon-hover {
+	background : url("../../../dijit/themes/tundra/images/tabCloseHover.gif") no-repeat right top;
+}
diff --git a/dojox/widget/UpgradeBar/UpgradeBar.html b/dojox/widget/UpgradeBar/UpgradeBar.html
new file mode 100644
index 0000000..70c1aee
--- /dev/null
+++ b/dojox/widget/UpgradeBar/UpgradeBar.html
@@ -0,0 +1,5 @@
+<div class="dojoxUpgradeBar">
+	<div class="dojoxUpgradeBarMessage" dojoAttachPoint="messageNode">message</div>
+	<div class="dojoxUpgradeBarReminderButton" dojoAttachPoint="dontRemindButtonNode" dojoAttachEvent="onclick:_onDontRemindClick">${noRemindButton}</div>
+	<span dojoAttachPoint="closeButtonNode" class="dojoxUpgradeBarCloseIcon" dojoAttachEvent="onclick: hide, onmouseenter: _onCloseEnter, onmouseleave: _onCloseLeave" title="${buttonCancel}"></span>
+</div>
\ No newline at end of file
diff --git a/dojox/widget/Wizard.js b/dojox/widget/Wizard.js
index 44b2ff6..bd96723 100644
--- a/dojox/widget/Wizard.js
+++ b/dojox/widget/Wizard.js
@@ -14,7 +14,7 @@ dojo.require("dijit.form.Button");
 dojo.require("dojo.i18n");
 dojo.requireLocalization("dijit","common",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
 dojo.requireLocalization("dojox.widget","Wizard",null,"ROOT,ar,ca,cs,da,de,el,es,fi,fr,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ru,sk,sl,sv,th,tr,zh,zh-tw");
-dojo.declare("dojox.widget.Wizard",[dijit.layout.StackContainer,dijit._Templated],{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.Butto [...]
+dojo.declare("dojox.widget.Wizard",[dijit.layout.StackContainer,dijit._Templated],{widgetsInTemplate:true,templateString:dojo.cache("dojox.widget","Wizard/Wizard.html","<div class=\"dojoxWizard\" dojoAttachPoint=\"wizardNode\">\n    <div class=\"dojoxWizardContainer\" dojoAttachPoint=\"containerNode\"></div>\n    <div class=\"dojoxWizardButtons\" dojoAttachPoint=\"wizardNav\">\n        <button dojoType=\"dijit.form.Button\" type=\"button\" dojoAttachPoint=\"previousButton\">${previousBut [...]
 this.inherited(arguments);
 var _1=dojo.mixin({cancel:dojo.i18n.getLocalization("dijit","common",this.lang).buttonCancel},dojo.i18n.getLocalization("dojox.widget","Wizard",this.lang));
 var _2;
@@ -44,12 +44,12 @@ this._checkButtons();
 this._started=true;
 },_checkButtons:function(){
 var sw=this.selectedChildWidget;
-var _4=sw.isLastChild;
-this.nextButton.attr("disabled",_4);
+var _3=sw.isLastChild;
+this.nextButton.attr("disabled",_3);
 this._setButtonClass(this.nextButton);
 if(sw.doneFunction){
 this.doneButton.domNode.style.display="";
-if(_4){
+if(_3){
 this.nextButton.domNode.style.display="none";
 }
 }else{
@@ -57,8 +57,8 @@ this.doneButton.domNode.style.display="none";
 }
 this.previousButton.attr("disabled",!this.selectedChildWidget.canGoBack);
 this._setButtonClass(this.previousButton);
-},_setButtonClass:function(_5){
-_5.domNode.style.display=(this.hideDisabled&&_5.disabled)?"none":"";
+},_setButtonClass:function(_4){
+_4.domNode.style.display=(this.hideDisabled&&_4.disabled)?"none":"";
 },_forward:function(){
 if(this.selectedChildWidget._checkPass()){
 this.forward();
@@ -88,13 +88,13 @@ this.inherited(arguments);
 },_checkPass:function(){
 var r=true;
 if(this.passFunction&&dojo.isFunction(this.passFunction)){
-var _7=this.passFunction();
-switch(typeof _7){
+var _5=this.passFunction();
+switch(typeof _5){
 case "boolean":
-r=_7;
+r=_5;
 break;
 case "string":
-alert(_7);
+alert(_5);
 r=false;
 break;
 }
diff --git a/dojox/widget/Wizard/Wizard.html b/dojox/widget/Wizard/Wizard.html
index 1ae6a1e..a91e677 100644
--- a/dojox/widget/Wizard/Wizard.html
+++ b/dojox/widget/Wizard/Wizard.html
@@ -1,9 +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>
+        <button dojoType="dijit.form.Button" type="button" dojoAttachPoint="previousButton">${previousButtonLabel}</button>
+        <button dojoType="dijit.form.Button" type="button" dojoAttachPoint="nextButton">${nextButtonLabel}</button>
+        <button dojoType="dijit.form.Button" type="button" dojoAttachPoint="doneButton" style="display:none">${doneButtonLabel}</button>
+        <button dojoType="dijit.form.Button" type="button" dojoAttachPoint="cancelButton">${cancelButtonLabel}</button>
     </div>
 </div>
diff --git a/dojox/widget/gauge/AnalogArcIndicator.js b/dojox/widget/gauge/AnalogArcIndicator.js
index 8cc605b..8aa9d61 100644
--- a/dojox/widget/gauge/AnalogArcIndicator.js
+++ b/dojox/widget/gauge/AnalogArcIndicator.js
@@ -13,28 +13,28 @@ dojo.experimental("dojox.widget.gauge.AnalogArcIndicator");
 dojo.declare("dojox.widget.gauge.AnalogArcIndicator",[dojox.widget.gauge.AnalogLineIndicator],{_createArc:function(_1){
 if(this.shapes[0]){
 var a=this._gauge._getRadians(this._gauge._getAngle(_1));
-var _3=Math.cos(a);
-var _4=Math.sin(a);
+var _2=Math.cos(a);
+var _3=Math.sin(a);
 var sa=this._gauge._getRadians(this._gauge.startAngle);
-var _6=Math.cos(sa);
-var _7=Math.sin(sa);
-var _8=this.offset+this.width;
+var _4=Math.cos(sa);
+var _5=Math.sin(sa);
+var _6=this.offset+this.width;
 var p=["M"];
-p.push(this._gauge.cx+this.offset*_7);
-p.push(this._gauge.cy-this.offset*_6);
+p.push(this._gauge.cx+this.offset*_5);
+p.push(this._gauge.cy-this.offset*_4);
 p.push("A",this.offset,this.offset,0,((a-sa)>Math.PI)?1:0,1);
-p.push(this._gauge.cx+this.offset*_4);
-p.push(this._gauge.cy-this.offset*_3);
+p.push(this._gauge.cx+this.offset*_3);
+p.push(this._gauge.cy-this.offset*_2);
 p.push("L");
-p.push(this._gauge.cx+_8*_4);
-p.push(this._gauge.cy-_8*_3);
-p.push("A",_8,_8,0,((a-sa)>Math.PI)?1:0,0);
-p.push(this._gauge.cx+_8*_7);
-p.push(this._gauge.cy-_8*_6);
+p.push(this._gauge.cx+_6*_3);
+p.push(this._gauge.cy-_6*_2);
+p.push("A",_6,_6,0,((a-sa)>Math.PI)?1:0,0);
+p.push(this._gauge.cx+_6*_5);
+p.push(this._gauge.cy-_6*_4);
 this.shapes[0].setShape(p.join(" "));
 this.currentValue=_1;
 }
-},draw:function(_a){
+},draw:function(_7){
 var v=this.value;
 if(v<this._gauge.min){
 v=this._gauge.min;
@@ -43,19 +43,19 @@ if(v>this._gauge.max){
 v=this._gauge.max;
 }
 if(this.shapes){
-if(_a){
+if(_7){
 this._createArc(v);
 }else{
-var _c=new dojo._Animation({curve:[this.currentValue,v],duration:this.duration,easing:this.easing});
-dojo.connect(_c,"onAnimate",dojo.hitch(this,this._createArc));
-_c.play();
+var _8=new dojo.Animation({curve:[this.currentValue,v],duration:this.duration,easing:this.easing});
+dojo.connect(_8,"onAnimate",dojo.hitch(this,this._createArc));
+_8.play();
 }
 }else{
-var _d={color:this.color,width:1};
+var _9={color:this.color,width:1};
 if(this.color.type){
-_d.color=this.color.colors[0].color;
+_9.color=this.color.colors[0].color;
 }
-this.shapes=[this._gauge.surface.createPath().setStroke(_d).setFill(this.color)];
+this.shapes=[this._gauge.surface.createPath().setStroke(_9).setFill(this.color)];
 this._createArc(v);
 if(this.hover){
 this.shapes[0].getEventSource().setAttribute("hover",this.hover);
diff --git a/dojox/widget/gauge/AnalogArrowIndicator.js b/dojox/widget/gauge/AnalogArrowIndicator.js
index fb64af1..6d3b650 100644
--- a/dojox/widget/gauge/AnalogArrowIndicator.js
+++ b/dojox/widget/gauge/AnalogArrowIndicator.js
@@ -15,14 +15,14 @@ if(!this._gauge){
 return null;
 }
 var x=Math.floor(this.width/2);
-var _2=this.width*5;
-var _3=(this.width&1);
-var _4=[];
-var _5=[{x:-x,y:0},{x:-x,y:-this.length+_2},{x:-2*x,y:-this.length+_2},{x:0,y:-this.length},{x:2*x+_3,y:-this.length+_2},{x:x+_3,y:-this.length+_2},{x:x+_3,y:0},{x:-x,y:0}];
-_4[0]=this._gauge.surface.createPolyline(_5).setStroke({color:this.color}).setFill(this.color);
-_4[1]=this._gauge.surface.createLine({x1:-x,y1:0,x2:-x,y2:-this.length+_2}).setStroke({color:this.highlight});
-_4[2]=this._gauge.surface.createLine({x1:-x-3,y1:-this.length+_2,x2:0,y2:-this.length}).setStroke({color:this.highlight});
-_4[3]=this._gauge.surface.createCircle({cx:0,cy:0,r:this.width}).setStroke({color:this.color}).setFill(this.color);
-return _4;
+var _1=this.width*5;
+var _2=(this.width&1);
+var _3=[];
+var _4=[{x:-x,y:0},{x:-x,y:-this.length+_1},{x:-2*x,y:-this.length+_1},{x:0,y:-this.length},{x:2*x+_2,y:-this.length+_1},{x:x+_2,y:-this.length+_1},{x:x+_2,y:0},{x:-x,y:0}];
+_3[0]=this._gauge.surface.createPolyline(_4).setStroke({color:this.color}).setFill(this.color);
+_3[1]=this._gauge.surface.createLine({x1:-x,y1:0,x2:-x,y2:-this.length+_1}).setStroke({color:this.highlight});
+_3[2]=this._gauge.surface.createLine({x1:-x-3,y1:-this.length+_1,x2:0,y2:-this.length}).setStroke({color:this.highlight});
+_3[3]=this._gauge.surface.createCircle({cx:0,cy:0,r:this.width}).setStroke({color:this.color}).setFill(this.color);
+return _3;
 }});
 }
diff --git a/dojox/widget/gauge/AnalogNeedleIndicator.js b/dojox/widget/gauge/AnalogNeedleIndicator.js
index 522901d..95c1b50 100644
--- a/dojox/widget/gauge/AnalogNeedleIndicator.js
+++ b/dojox/widget/gauge/AnalogNeedleIndicator.js
@@ -15,16 +15,16 @@ if(!this._gauge){
 return null;
 }
 var x=Math.floor(this.width/2);
-var _2=this.width*5;
-var _3=(this.width&1);
-var _4=[];
-var _5={color:this.color,width:1};
+var _1=this.width*5;
+var _2=(this.width&1);
+var _3=[];
+var _4={color:this.color,width:1};
 if(this.color.type){
-_5.color=this.color.colors[0].color;
+_4.color=this.color.colors[0].color;
 }
 var xy=(Math.sqrt(2)*(x));
-_4[0]=this._gauge.surface.createPath().setStroke(_5).setFill(this.color).moveTo(xy,-xy).arcTo((2*x),(2*x),0,0,0,-xy,-xy).lineTo(0,-this.length).closePath();
-_4[1]=this._gauge.surface.createCircle({cx:0,cy:0,r:this.width}).setStroke({color:this.color}).setFill(this.color);
-return _4;
+_3[0]=this._gauge.surface.createPath().setStroke(_4).setFill(this.color).moveTo(xy,-xy).arcTo((2*x),(2*x),0,0,0,-xy,-xy).lineTo(0,-this.length).closePath();
+_3[1]=this._gauge.surface.createCircle({cx:0,cy:0,r:this.width}).setStroke({color:this.color}).setFill(this.color);
+return _3;
 }});
 }
diff --git a/dojox/widget/gauge/BarIndicator.js b/dojox/widget/gauge/BarIndicator.js
index 9784a4d..dfd6342 100644
--- a/dojox/widget/gauge/BarIndicator.js
+++ b/dojox/widget/gauge/BarIndicator.js
@@ -21,41 +21,41 @@ v=this._gauge.min;
 if(v>this._gauge.max){
 v=this._gauge.max;
 }
-var _2=this._gauge._getPosition(v);
-if(_2==this.dataX){
-_2=this.dataX+1;
+var _1=this._gauge._getPosition(v);
+if(_1==this.dataX){
+_1=this.dataX+1;
 }
 var y=this._gauge.dataY+Math.floor((this._gauge.dataHeight-this.width)/2)+this.offset;
-var _4=[];
-_4[0]=this._gauge.surface.createRect({x:this._gauge.dataX,y:y,width:_2-this._gauge.dataX,height:this.width});
-_4[0].setStroke({color:this.color});
-_4[0].setFill(this.color);
-_4[1]=this._gauge.surface.createLine({x1:this._gauge.dataX,y1:y,x2:_2,y2:y});
-_4[1].setStroke({color:this.highlight});
+var _2=[];
+_2[0]=this._gauge.surface.createRect({x:this._gauge.dataX,y:y,width:_1-this._gauge.dataX,height:this.width});
+_2[0].setStroke({color:this.color});
+_2[0].setFill(this.color);
+_2[1]=this._gauge.surface.createLine({x1:this._gauge.dataX,y1:y,x2:_1,y2:y});
+_2[1].setStroke({color:this.highlight});
 if(this.highlight2){
 y--;
-_4[2]=this._gauge.surface.createLine({x1:this._gauge.dataX,y1:y,x2:_2,y2:y});
-_4[2].setStroke({color:this.highlight2});
+_2[2]=this._gauge.surface.createLine({x1:this._gauge.dataX,y1:y,x2:_1,y2:y});
+_2[2].setStroke({color:this.highlight2});
 }
-return _4;
-},_createShapes:function(_5){
+return _2;
+},_createShapes:function(_3){
 for(var i in this.shapes){
 i=this.shapes[i];
-var _7={};
+var _4={};
 for(var j in i){
-_7[j]=i[j];
+_4[j]=i[j];
 }
 if(i.shape.type=="line"){
-_7.shape.x2=_5+_7.shape.x1;
+_4.shape.x2=_3+_4.shape.x1;
 }else{
 if(i.shape.type=="rect"){
-_7.width=_5;
+_4.width=_3;
 }
 }
-i.setShape(_7);
+i.setShape(_4);
 }
-},_move:function(_9){
-var _a=false;
+},_move:function(_5){
+var _6=false;
 var c;
 var v=this.value;
 if(v<this.min){
@@ -67,13 +67,13 @@ v=this.max;
 c=this._gauge._getPosition(this.currentValue);
 this.currentValue=v;
 v=this._gauge._getPosition(v)-this._gauge.dataX;
-if(_9){
+if(_5){
 this._createShapes(v);
 }else{
 if(c!=v){
-var _d=new dojo._Animation({curve:[c,v],duration:this.duration,easing:this.easing});
-dojo.connect(_d,"onAnimate",dojo.hitch(this,this._createShapes));
-_d.play();
+var _7=new dojo.Animation({curve:[c,v],duration:this.duration,easing:this.easing});
+dojo.connect(_7,"onAnimate",dojo.hitch(this,this._createShapes));
+_7.play();
 }
 }
 }});
diff --git a/dojox/widget/gauge/_Gauge.js b/dojox/widget/gauge/_Gauge.js
index a7f968b..d7b6d9a 100644
--- a/dojox/widget/gauge/_Gauge.js
+++ b/dojox/widget/gauge/_Gauge.js
@@ -16,7 +16,7 @@ dojo.require("dijit.Tooltip");
 dojo.require("dojo.fx.easing");
 dojo.require("dojox.gfx");
 dojo.experimental("dojox.widget.gauge._Gauge");
-dojo.declare("dojox.widget.gauge._Gauge",[dijit._Widget,dijit._Templated,dijit._Container],{width:0,height:0,background:null,min:0,max:0,image:null,useRangeStyles:0,useTooltip:true,majorTicks:null,minorTicks:null,_defaultIndicator:null,defaultColors:[[0,84,170,1],[68,119,187,1],[102,153,204,1],[153,187,238,1],[153,204,255,1],[204,238,255,1],[221,238,255,1]],min:null,max:null,surface:null,hideValues:false,gaugeContent:undefined,templateString:"<div>\n\t<div class=\"dojoxGaugeContent\" doj [...]
+dojo.declare("dojox.widget.gauge._Gauge",[dijit._Widget,dijit._Templated,dijit._Container],{width:0,height:0,background:null,min:0,max:0,image:null,useRangeStyles:0,useTooltip:true,majorTicks:null,minorTicks:null,_defaultIndicator:null,defaultColors:[[0,84,170,1],[68,119,187,1],[102,153,204,1],[153,187,238,1],[153,204,255,1],[204,238,255,1],[221,238,255,1]],min:null,max:null,surface:null,hideValues:false,gaugeContent:undefined,templateString:dojo.cache("dojox.widget.gauge","_Gauge.html", [...]
 if(this.image===null){
 this.image={};
 }
@@ -33,15 +33,15 @@ this.indicators=[];
 var _1=[],_2=[];
 var i;
 if(this.hasChildren()){
-var _4=this.getChildren();
-for(i=0;i<_4.length;i++){
-if(/dojox\.widget\..*Indicator/.test(_4[i].declaredClass)){
-_2.push(_4[i]);
+var _3=this.getChildren();
+for(i=0;i<_3.length;i++){
+if(/dojox\.widget\..*Indicator/.test(_3[i].declaredClass)){
+_2.push(_3[i]);
 continue;
 }
-switch(_4[i].declaredClass){
+switch(_3[i].declaredClass){
 case "dojox.widget.gauge.Range":
-_1.push(_4[i]);
+_1.push(_3[i]);
 break;
 }
 }
@@ -65,33 +65,33 @@ this.setMajorTicks(this.majorTicks);
 for(i=0;i<this.indicators.length;i++){
 this.addIndicator(this.indicators[i]);
 }
-},_setTicks:function(_5,_6,_7){
+},_setTicks:function(_4,_5,_6){
 var i;
-if(_5&&dojo.isArray(_5._ticks)){
-for(i=0;i<_5._ticks.length;i++){
-this.removeIndicator(_5._ticks[i]);
+if(_4&&dojo.isArray(_4._ticks)){
+for(i=0;i<_4._ticks.length;i++){
+this.removeIndicator(_4._ticks[i]);
 }
 }
-var t={length:_6.length,offset:_6.offset,noChange:true};
-if(_6.color){
-t.color=_6.color;
+var t={length:_5.length,offset:_5.offset,noChange:true};
+if(_5.color){
+t.color=_5.color;
 }
-if(_6.font){
-t.font=_6.font;
+if(_5.font){
+t.font=_5.font;
 }
-_6._ticks=[];
-for(i=this.min;i<=this.max;i+=_6.interval){
+_5._ticks=[];
+for(i=this.min;i<=this.max;i+=_5.interval){
 t.value=i;
-if(_7){
+if(_6){
 t.label=""+i;
 }
-_6._ticks.push(this.addIndicator(t));
+_5._ticks.push(this.addIndicator(t));
 }
-return _6;
-},setMinorTicks:function(_a){
-this.minorTicks=this._setTicks(this.minorTicks,_a,false);
-},setMajorTicks:function(_b){
-this.majorTicks=this._setTicks(this.majorTicks,_b,true);
+return _5;
+},setMinorTicks:function(_7){
+this.minorTicks=this._setTicks(this.minorTicks,_7,false);
+},setMajorTicks:function(_8){
+this.majorTicks=this._setTicks(this.majorTicks,_8,true);
 },postCreate:function(){
 if(this.hideValues){
 dojo.style(this.containerNode,"display","none");
@@ -119,72 +119,72 @@ if(this.image.x||this.image.y){
 this._img.setTransform({dx:this.image.x||0,dy:this.image.y||0});
 }
 }
-},setBackground:function(_c){
-if(!_c){
-_c=this._backgroundDefault;
+},setBackground:function(_9){
+if(!_9){
+_9=this._backgroundDefault;
 }
-this.background=_c.color||_c;
+this.background=_9.color||_9;
 this._background.setFill(this.background);
-},addRange:function(_d){
-this.addRanges([_d]);
-},addRanges:function(_e){
+},addRange:function(_a){
+this.addRanges([_a]);
+},addRanges:function(_b){
 if(!this._rangeData){
 this._rangeData=[];
 }
-var _f;
-for(var i=0;i<_e.length;i++){
-_f=_e[i];
-if((this.min===null)||(_f.low<this.min)){
-this.min=_f.low;
+var _c;
+for(var i=0;i<_b.length;i++){
+_c=_b[i];
+if((this.min===null)||(_c.low<this.min)){
+this.min=_c.low;
 }
-if((this.max===null)||(_f.high>this.max)){
-this.max=_f.high;
+if((this.max===null)||(_c.high>this.max)){
+this.max=_c.high;
 }
-if(!_f.color){
-var _11=this._rangeData.length%this.defaultColors.length;
+if(!_c.color){
+var _d=this._rangeData.length%this.defaultColors.length;
 if(dojox.gfx.svg&&this.useRangeStyles>0){
-_11=(this._rangeData.length%this.useRangeStyles)+1;
-_f.color={style:"dojoxGaugeRange"+_11};
+_d=(this._rangeData.length%this.useRangeStyles)+1;
+_c.color={style:"dojoxGaugeRange"+_d};
 }else{
-_11=this._rangeData.length%this.defaultColors.length;
-_f.color=this.defaultColors[_11];
+_d=this._rangeData.length%this.defaultColors.length;
+_c.color=this.defaultColors[_d];
 }
 }
-this._rangeData[this._rangeData.length]=_f;
+this._rangeData[this._rangeData.length]=_c;
 }
 this.draw();
-},addIndicator:function(_12){
-_12._gauge=this;
-if(!_12.declaredClass){
-_12=new this._defaultIndicator(_12);
+},addIndicator:function(_e){
+_e._gauge=this;
+if(!_e.declaredClass){
+_e=new this._defaultIndicator(_e);
 }
-if(!_12.hideValue){
-this.containerNode.appendChild(_12.domNode);
+if(!_e.hideValue){
+this.containerNode.appendChild(_e.domNode);
 }
 if(!this._indicatorData){
 this._indicatorData=[];
 }
-this._indicatorData[this._indicatorData.length]=_12;
-_12.draw();
-return _12;
-},removeIndicator:function(_13){
+this._indicatorData[this._indicatorData.length]=_e;
+_e.draw();
+return _e;
+},removeIndicator:function(_f){
 for(var i=0;i<this._indicatorData.length;i++){
-if(this._indicatorData[i]===_13){
+if(this._indicatorData[i]===_f){
 this._indicatorData.splice(i,1);
-_13.remove();
+_f.remove();
 break;
 }
 }
-},moveIndicatorToFront:function(_15){
-if(_15.shapes){
-for(var i=0;i<_15.shapes.length;i++){
-_15.shapes[i].moveToFront();
+},moveIndicatorToFront:function(_10){
+if(_10.shapes){
+for(var i=0;i<_10.shapes.length;i++){
+_10.shapes[i].moveToFront();
 }
 }
-},drawText:function(txt,x,y,_1a,_1b,_1c,_1d){
-var t=this.surface.createText({x:x,y:y,text:txt,align:_1a});
-t.setFill(_1c);
-t.setFont(_1d);
+},drawText:function(txt,x,y,_11,_12,_13,_14){
+var t=this.surface.createText({x:x,y:y,text:txt,align:_11});
+t.setFill(_13);
+t.setFont(_14);
 return t;
 },removeText:function(t){
 this.surface.rawNode.removeChild(t);
@@ -198,58 +198,58 @@ dijit.hideTooltip(this.mouseNode);
 }
 this._lastHover=txt;
 }
-},handleMouseOver:function(_22){
-var _23=_22.target.getAttribute("hover");
-if(_22.target.getAttribute("overlay")){
+},handleMouseOver:function(_15){
+var _16=_15.target.getAttribute("hover");
+if(_15.target.getAttribute("overlay")){
 this._overOverlay=true;
-var r=this.getRangeUnderMouse(_22);
+var r=this.getRangeUnderMouse(_15);
 if(r&&r.hover){
-_23=r.hover;
+_16=r.hover;
 }
 }
 if(this.useTooltip&&!this._drag){
-if(_23){
-this.updateTooltip(_23,_22);
+if(_16){
+this.updateTooltip(_16,_15);
 }else{
-this.updateTooltip("",_22);
+this.updateTooltip("",_15);
 }
 }
-},handleMouseOut:function(_25){
-if(_25.target.getAttribute("overlay")){
+},handleMouseOut:function(_17){
+if(_17.target.getAttribute("overlay")){
 this._overOverlay=false;
 }
 if(this.useTooltip&&this.mouseNode){
 dijit.hideTooltip(this.mouseNode);
 }
-},handleMouseDown:function(_26){
+},handleMouseDown:function(_18){
 for(var i=0;i<this._indicatorData.length;i++){
-var _28=this._indicatorData[i].shapes;
-for(var s=0;s<_28.length;s++){
-if(_28[s].getEventSource()==_26.target){
+var _19=this._indicatorData[i].shapes;
+for(var s=0;s<_19.length;s++){
+if(_19[s].getEventSource()==_18.target){
 this._drag=this._indicatorData[i];
-s=_28.length;
+s=_19.length;
 i=this._indicatorData.length;
 }
 }
 }
-dojo.stopEvent(_26);
-},handleMouseUp:function(_2a){
+dojo.stopEvent(_18);
+},handleMouseUp:function(_1a){
 this._drag=null;
-dojo.stopEvent(_2a);
-},handleMouseMove:function(_2b){
-if(_2b){
-dojo.style(this.mouseNode,"left",_2b.pageX+1+"px");
-dojo.style(this.mouseNode,"top",_2b.pageY+1+"px");
+dojo.stopEvent(_1a);
+},handleMouseMove:function(_1b){
+if(_1b){
+dojo.style(this.mouseNode,"left",_1b.pageX+1+"px");
+dojo.style(this.mouseNode,"top",_1b.pageY+1+"px");
 }
 if(this._drag){
-this._dragIndicator(this,_2b);
+this._dragIndicator(this,_1b);
 }else{
 if(this.useTooltip&&this._overOverlay){
-var r=this.getRangeUnderMouse(_2b);
+var r=this.getRangeUnderMouse(_1b);
 if(r&&r.hover){
-this.updateTooltip(r.hover,_2b);
+this.updateTooltip(r.hover,_1b);
 }else{
-this.updateTooltip("",_2b);
+this.updateTooltip("",_1b);
 }
 }
 }
@@ -257,7 +257,7 @@ this.updateTooltip("",_2b);
 dojo.declare("dojox.widget.gauge.Range",[dijit._Widget,dijit._Contained],{low:0,high:0,hover:"",color:null,size:0,startup:function(){
 this.color=this.color.color||this.color;
 }});
-dojo.declare("dojox.widget.gauge._Indicator",[dijit._Widget,dijit._Contained,dijit._Templated],{value:0,type:"",color:"black",label:"",font:{family:"sans-serif",size:"12px"},length:0,width:0,offset:0,hover:"",front:false,easing:dojo._defaultEasing,duration:1000,hideValue:false,noChange:false,_gauge:null,title:"",templateString:"<div class=\"dojoxGaugeIndicatorDiv\">\n\t<label class=\"dojoxGaugeIndicatorLabel\" for=\"${title}\">${title}:</label>\n\t<input class=\"dojoxGaugeIndicatorInput\ [...]
+dojo.declare("dojox.widget.gauge._Indicator",[dijit._Widget,dijit._Contained,dijit._Templated],{value:0,type:"",color:"black",label:"",font:{family:"sans-serif",size:"12px"},length:0,width:0,offset:0,hover:"",front:false,easing:dojo._defaultEasing,duration:1000,hideValue:false,noChange:false,_gauge:null,title:"",templateString:dojo.cache("dojox.widget.gauge","_Indicator.html","<div class=\"dojoxGaugeIndicatorDiv\">\n\t<label class=\"dojoxGaugeIndicatorLabel\" for=\"${title}\">${title}:</ [...]
 if(this.onDragMove){
 this.onDragMove=dojo.hitch(this.onDragMove);
 }
@@ -268,13 +268,13 @@ dojo.style(this.domNode,"display","none");
 if(dojo.isString(this.easing)){
 this.easing=dojo.getObject(this.easing);
 }
-},_update:function(_2d){
-var _2e=this.valueNode.value;
-if(_2e===""){
+},_update:function(_1c){
+var _1d=this.valueNode.value;
+if(_1d===""){
 this.value=null;
 }else{
-this.value=Number(_2e);
-this.hover=this.title+": "+_2e;
+this.value=Number(_1d);
+this.hover=this.title+": "+_1d;
 }
 if(this._gauge){
 this.draw();
@@ -283,16 +283,16 @@ if((this.title=="Target"||this.front)&&this._gauge.moveIndicator){
 this._gauge.moveIndicatorToFront(this);
 }
 }
-},update:function(_2f){
+},update:function(_1e){
 if(!this.noChange){
-this.valueNode.value=_2f;
+this.valueNode.value=_1e;
 this._update();
 }
 },onDragMove:function(){
 this.value=Math.floor(this.value);
 this.valueNode.value=this.value;
 this.hover=this.title+": "+this.value;
-},draw:function(_30){
+},draw:function(_1f){
 },remove:function(){
 for(var i=0;i<this.shapes.length;i++){
 this._gauge.surface.remove(this.shapes[i]);
diff --git a/dojox/widget/nls/ColorPicker.js b/dojox/widget/nls/ColorPicker.js
new file mode 100644
index 0000000..480e3d8
--- /dev/null
+++ b/dojox/widget/nls/ColorPicker.js
@@ -0,0 +1 @@
+({"redLabel":"r","valueLabel":"v","hexLabel":"hex","hueLabel":"h","saturationLabel":"s","degLabel":"°","greenLabel":"g","blueLabel":"b"})
\ No newline at end of file
diff --git a/dojox/widget/nls/RollingList.js b/dojox/widget/nls/RollingList.js
deleted file mode 100644
index 2c1f566..0000000
--- a/dojox/widget/nls/RollingList.js
+++ /dev/null
@@ -1 +0,0 @@
-({"empty":"<EMPTY>"})
\ No newline at end of file
diff --git a/dojox/widget/nls/ca/RollingList.js b/dojox/widget/nls/ca/RollingList.js
deleted file mode 100644
index bc0296e..0000000
--- a/dojox/widget/nls/ca/RollingList.js
+++ /dev/null
@@ -1 +0,0 @@
-({"empty":"<BUIT>"})
\ No newline at end of file
diff --git a/dojox/widget/nls/sk/RollingList.js b/dojox/widget/nls/sk/RollingList.js
deleted file mode 100644
index bcfe692..0000000
--- a/dojox/widget/nls/sk/RollingList.js
+++ /dev/null
@@ -1 +0,0 @@
-({"empty":"<PRÁZDNY>"})
\ No newline at end of file
diff --git a/dojox/widget/nls/sl/RollingList.js b/dojox/widget/nls/sl/RollingList.js
deleted file mode 100644
index 37d408f..0000000
--- a/dojox/widget/nls/sl/RollingList.js
+++ /dev/null
@@ -1 +0,0 @@
-({"empty":"<PRAZNO>"})
\ No newline at end of file
diff --git a/dojox/widget/nls/th/ColorPicker.js b/dojox/widget/nls/th/ColorPicker.js
new file mode 100644
index 0000000..2edfabd
--- /dev/null
+++ b/dojox/widget/nls/th/ColorPicker.js
@@ -0,0 +1 @@
+({"redLabel":"อาร์","valueLabel":"วี","hexLabel":"เลขฐานสิบหก","hueLabel":"เอช","saturationLabel":"เอส","greenLabel":"จี","blueLabel":"บี","degLabel":"°"})
\ No newline at end of file
diff --git a/dojox/widget/nls/th/RollingList.js b/dojox/widget/nls/th/RollingList.js
deleted file mode 100644
index fb5711f..0000000
--- a/dojox/widget/nls/th/RollingList.js
+++ /dev/null
@@ -1 +0,0 @@
-({"empty":"<ว่าง>"})
\ No newline at end of file
diff --git a/dojox/widget/rotator/Controller.js b/dojox/widget/rotator/Controller.js
new file mode 100644
index 0000000..d6fda59
--- /dev/null
+++ b/dojox/widget/rotator/Controller.js
@@ -0,0 +1,87 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.widget.rotator.Controller"]){
+dojo._hasResource["dojox.widget.rotator.Controller"]=true;
+dojo.provide("dojox.widget.rotator.Controller");
+(function(d){
+var _1="dojoxRotator",_2=_1+"Play",_3=_1+"Pause",_4=_1+"Number",_5=_1+"Tab",_6=_1+"Selected";
+d.declare("dojox.widget.rotator.Controller",null,{rotator:null,commands:"prev,play/pause,info,next",constructor:function(_7,_8){
+d.mixin(this,_7);
+var r=this.rotator;
+if(r){
+while(_8.firstChild){
+_8.removeChild(_8.firstChild);
+}
+var ul=this._domNode=d.create("ul",null,_8),_9=" "+_1+"Icon",cb=function(_a,_b,_c){
+d.create("li",{className:_b,innerHTML:"<a href=\"#\"><span>"+_a+"</span></a>",onclick:function(e){
+d.stopEvent(e);
+if(r){
+r.control.apply(r,_c);
+}
+}},ul);
+};
+d.forEach(this.commands.split(","),function(b,i){
+switch(b){
+case "prev":
+cb("Prev",_1+"Prev"+_9,["prev"]);
+break;
+case "play/pause":
+cb("Play",_2+_9,["play"]);
+cb("Pause",_3+_9,["pause"]);
+break;
+case "info":
+this._info=d.create("li",{className:_1+"Info",innerHTML:this._buildInfo(r)},ul);
+break;
+case "next":
+cb("Next",_1+"Next"+_9,["next"]);
+break;
+case "#":
+case "titles":
+for(var j=0;j<r.panes.length;j++){
+cb(b=="#"?j+1:r.panes[j].title||"Tab "+(j+1),(b=="#"?_4:_5)+" "+(j==r.idx?_6:"")+" "+_1+"Pane"+j,["go",j]);
+}
+break;
+}
+},this);
+d.query("li:first-child",ul).addClass(_1+"First");
+d.query("li:last-child",ul).addClass(_1+"Last");
+this._togglePlay();
+this._con=d.connect(r,"onUpdate",this,"_onUpdate");
+}
+},destroy:function(){
+d.disconnect(this._con);
+d.destroy(this._domNode);
+},_togglePlay:function(_d){
+var p=this.rotator.playing;
+d.query("."+_2,this._domNode).style("display",p?"none":"");
+d.query("."+_3,this._domNode).style("display",p?"":"none");
+},_buildInfo:function(r){
+return "<span>"+(r.idx+1)+" / "+r.panes.length+"</span>";
+},_onUpdate:function(_e){
+var r=this.rotator;
+switch(_e){
+case "play":
+case "pause":
+this._togglePlay();
+break;
+case "onAfterTransition":
+if(this._info){
+this._info.innerHTML=this._buildInfo(r);
+}
+var s=function(n){
+if(r.idx<n.length){
+d.addClass(n[r.idx],_6);
+}
+};
+s(d.query("."+_4,this._domNode).removeClass(_6));
+s(d.query("."+_5,this._domNode).removeClass(_6));
+break;
+}
+}});
+})(dojo);
+}
diff --git a/dojox/widget/rotator/Fade.js b/dojox/widget/rotator/Fade.js
new file mode 100644
index 0000000..6c85de3
--- /dev/null
+++ b/dojox/widget/rotator/Fade.js
@@ -0,0 +1,25 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.widget.rotator.Fade"]){
+dojo._hasResource["dojox.widget.rotator.Fade"]=true;
+dojo.provide("dojox.widget.rotator.Fade");
+dojo.require("dojo.fx");
+(function(d){
+function _1(_2,_3){
+var n=_2.next.node;
+d.style(n,{display:"",opacity:0});
+_2.node=_2.current.node;
+return d.fx[_3]([d.fadeOut(_2),d.fadeIn(d.mixin(_2,{node:n}))]);
+};
+d.mixin(dojox.widget.rotator,{fade:function(_4){
+return _1(_4,"chain");
+},crossFade:function(_5){
+return _1(_5,"combine");
+}});
+})(dojo);
+}
diff --git a/dojox/widget/rotator/Pan.js b/dojox/widget/rotator/Pan.js
new file mode 100644
index 0000000..03877fc
--- /dev/null
+++ b/dojox/widget/rotator/Pan.js
@@ -0,0 +1,75 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.widget.rotator.Pan"]){
+dojo._hasResource["dojox.widget.rotator.Pan"]=true;
+dojo.provide("dojox.widget.rotator.Pan");
+dojo.require("dojo.fx");
+(function(d){
+var _1=0,_2=1,UP=2,_3=3;
+function _4(_5,_6){
+var n=_6.next.node,r=_6.rotatorBox,m=_5%2,a=m?"left":"top",s=(m?r.w:r.h)*(_5<2?-1:1),p={},q={};
+d.style(n,"display","");
+p[a]={start:0,end:-s};
+q[a]={start:s,end:0};
+return d.fx.combine([d.animateProperty({node:_6.current.node,duration:_6.duration,properties:p,easing:_6.easing}),d.animateProperty({node:n,duration:_6.duration,properties:q,easing:_6.easing})]);
+};
+function _7(n,z){
+d.style(n,"zIndex",z);
+};
+d.mixin(dojox.widget.rotator,{pan:function(_8){
+var w=_8.wrap,p=_8.rotator.panes,_9=p.length,z=_9,j=_8.current.idx,k=_8.next.idx,nw=Math.abs(k-j),ww=Math.abs((_9-Math.max(j,k))+Math.min(j,k))%_9,_a=j<k,_b=_3,_c=[],_d=[],_e=_8.duration;
+if((!w&&!_a)||(w&&(_a&&nw>ww||!_a&&nw<ww))){
+_b=_2;
+}
+if(_8.continuous){
+if(_8.quick){
+_e=Math.round(_e/(w?Math.min(ww,nw):nw));
+}
+_7(p[j].node,z--);
+var f=(_b==_3);
+while(1){
+var i=j;
+if(f){
+if(++j>=_9){
+j=0;
+}
+}else{
+if(--j<0){
+j=_9-1;
+}
+}
+var x=p[i],y=p[j];
+_7(y.node,z--);
+_c.push(_4(_b,d.mixin({easing:function(m){
+return m;
+}},_8,{current:x,next:y,duration:_e})));
+if((f&&j==k)||(!f&&j==k)){
+break;
+}
+_d.push(y.node);
+}
+var _f=d.fx.chain(_c),h=d.connect(_f,"onEnd",function(){
+d.disconnect(h);
+d.forEach(_d,function(q){
+d.style(q,{display:"none",left:0,opacity:1,top:0,zIndex:0});
+});
+});
+return _f;
+}
+return _4(_b,_8);
+},panDown:function(_10){
+return _4(_1,_10);
+},panRight:function(_11){
+return _4(_2,_11);
+},panUp:function(_12){
+return _4(UP,_12);
+},panLeft:function(_13){
+return _4(_3,_13);
+}});
+})(dojo);
+}
diff --git a/dojox/widget/rotator/Slide.js b/dojox/widget/rotator/Slide.js
new file mode 100644
index 0000000..03846c9
--- /dev/null
+++ b/dojox/widget/rotator/Slide.js
@@ -0,0 +1,32 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.widget.rotator.Slide"]){
+dojo._hasResource["dojox.widget.rotator.Slide"]=true;
+dojo.provide("dojox.widget.rotator.Slide");
+(function(d){
+var _1=0,_2=1,UP=2,_3=3;
+function _4(_5,_6){
+var _7=_6.node=_6.next.node,r=_6.rotatorBox,m=_5%2,s=(m?r.w:r.h)*(_5<2?-1:1);
+d.style(_7,{display:"",zIndex:(d.style(_6.current.node,"zIndex")||1)+1});
+if(!_6.properties){
+_6.properties={};
+}
+_6.properties[m?"left":"top"]={start:s,end:0};
+return d.animateProperty(_6);
+};
+d.mixin(dojox.widget.rotator,{slideDown:function(_8){
+return _4(_1,_8);
+},slideRight:function(_9){
+return _4(_2,_9);
+},slideUp:function(_a){
+return _4(UP,_a);
+},slideLeft:function(_b){
+return _4(_3,_b);
+}});
+})(dojo);
+}
diff --git a/dojox/widget/rotator/Wipe.js b/dojox/widget/rotator/Wipe.js
new file mode 100644
index 0000000..af1fc39
--- /dev/null
+++ b/dojox/widget/rotator/Wipe.js
@@ -0,0 +1,52 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.widget.rotator.Wipe"]){
+dojo._hasResource["dojox.widget.rotator.Wipe"]=true;
+dojo.provide("dojox.widget.rotator.Wipe");
+(function(d){
+var _1=2,_2=3,UP=0,_3=1;
+function _4(_5,w,h,x){
+var a=[0,w,0,0];
+if(_5==_2){
+a=[0,w,h,w];
+}else{
+if(_5==UP){
+a=[h,w,h,0];
+}else{
+if(_5==_3){
+a=[0,0,h,0];
+}
+}
+}
+if(x!=null){
+a[_5]=_5==_1||_5==_3?x:(_5%2?w:h)-x;
+}
+return a;
+};
+function _6(n,_7,w,h,x){
+d.style(n,"clip",_7==null?"auto":"rect("+_4(_7,w,h,x).join("px,")+"px)");
+};
+function _8(_9,_a){
+var _b=_a.next.node,w=_a.rotatorBox.w,h=_a.rotatorBox.h;
+d.style(_b,{display:"",zIndex:(d.style(_a.current.node,"zIndex")||1)+1});
+_6(_b,_9,w,h);
+return new d.Animation(d.mixin({node:_b,curve:[0,_9%2?w:h],onAnimate:function(x){
+_6(_b,_9,w,h,parseInt(x));
+}},_a));
+};
+d.mixin(dojox.widget.rotator,{wipeDown:function(_c){
+return _8(_1,_c);
+},wipeRight:function(_d){
+return _8(_2,_d);
+},wipeUp:function(_e){
+return _8(UP,_e);
+},wipeLeft:function(_f){
+return _8(_3,_f);
+}});
+})(dojo);
+}
diff --git a/dojox/wire/CompositeWire.js b/dojox/wire/CompositeWire.js
index 1790d94..bd33da4 100644
--- a/dojox/wire/CompositeWire.js
+++ b/dojox/wire/CompositeWire.js
@@ -21,23 +21,23 @@ for(var c in this.children){
 _3[c]=this.children[c].getValue(_2);
 }
 return _3;
-},_setValue:function(_5,_6){
-if(!_5||!this.children){
-return _5;
+},_setValue:function(_4,_5){
+if(!_4||!this.children){
+return _4;
 }
 for(var c in this.children){
-this.children[c].setValue(_6[c],_5);
+this.children[c].setValue(_5[c],_4);
 }
-return _5;
-},_initializeChildren:function(_8){
-if(!_8){
+return _4;
+},_initializeChildren:function(_6){
+if(!_6){
 return;
 }
-for(var c in _8){
-var _a=_8[c];
-_a.parent=this;
-if(!dojox.wire.isWire(_a)){
-_8[c]=dojox.wire.create(_a);
+for(var c in _6){
+var _7=_6[c];
+_7.parent=this;
+if(!dojox.wire.isWire(_7)){
+_6[c]=dojox.wire.create(_7);
 }
 }
 }});
diff --git a/dojox/wire/DataWire.js b/dojox/wire/DataWire.js
index 6f3ef7f..27b4dff 100644
--- a/dojox/wire/DataWire.js
+++ b/dojox/wire/DataWire.js
@@ -26,59 +26,59 @@ return undefined;
 }
 }
 return _3;
-},_setValue:function(_6,_7){
-if(!_6||!this.attribute||!this.dataStore){
-return _6;
+},_setValue:function(_5,_6){
+if(!_5||!this.attribute||!this.dataStore){
+return _5;
 }
-var _8=_6;
-var _9=this.attribute.split(".");
-var _a=_9.length-1;
-for(var i=0;i<_a;i++){
-_8=this._getAttributeValue(_8,_9[i]);
-if(!_8){
+var _7=_5;
+var _8=this.attribute.split(".");
+var _9=_8.length-1;
+for(var i=0;i<_9;i++){
+_7=this._getAttributeValue(_7,_8[i]);
+if(!_7){
 return undefined;
 }
 }
-this._setAttributeValue(_8,_9[_a],_7);
-return _6;
-},_getAttributeValue:function(_c,_d){
-var _e=undefined;
-var i1=_d.indexOf("[");
+this._setAttributeValue(_7,_8[_9],_6);
+return _5;
+},_getAttributeValue:function(_a,_b){
+var _c=undefined;
+var i1=_b.indexOf("[");
 if(i1>=0){
-var i2=_d.indexOf("]");
-var _11=_d.substring(i1+1,i2);
-_d=_d.substring(0,i1);
-var _12=this.dataStore.getValues(_c,_d);
-if(_12){
-if(!_11){
-_e=_12;
+var i2=_b.indexOf("]");
+var _d=_b.substring(i1+1,i2);
+_b=_b.substring(0,i1);
+var _e=this.dataStore.getValues(_a,_b);
+if(_e){
+if(!_d){
+_c=_e;
 }else{
-_e=_12[_11];
+_c=_e[_d];
 }
 }
 }else{
-_e=this.dataStore.getValue(_c,_d);
+_c=this.dataStore.getValue(_a,_b);
 }
-return _e;
-},_setAttributeValue:function(_13,_14,_15){
-var i1=_14.indexOf("[");
+return _c;
+},_setAttributeValue:function(_f,_10,_11){
+var i1=_10.indexOf("[");
 if(i1>=0){
-var i2=_14.indexOf("]");
-var _18=_14.substring(i1+1,i2);
-_14=_14.substring(0,i1);
-var _19=null;
-if(!_18){
-_19=_15;
+var i2=_10.indexOf("]");
+var _12=_10.substring(i1+1,i2);
+_10=_10.substring(0,i1);
+var _13=null;
+if(!_12){
+_13=_11;
 }else{
-_19=this.dataStore.getValues(_13,_14);
-if(!_19){
-_19=[];
+_13=this.dataStore.getValues(_f,_10);
+if(!_13){
+_13=[];
 }
-_19[_18]=_15;
+_13[_12]=_11;
 }
-this.dataStore.setValues(_13,_14,_19);
+this.dataStore.setValues(_f,_10,_13);
 }else{
-this.dataStore.setValue(_13,_14,_15);
+this.dataStore.setValue(_f,_10,_11);
 }
 }});
 }
diff --git a/dojox/wire/TableAdapter.js b/dojox/wire/TableAdapter.js
index 18632ec..b66cbad 100644
--- a/dojox/wire/TableAdapter.js
+++ b/dojox/wire/TableAdapter.js
@@ -21,17 +21,17 @@ _3=[_3];
 }
 var _4=[];
 for(var i in _3){
-var _6=this._getRow(_3[i]);
-_4.push(_6);
+var _5=this._getRow(_3[i]);
+_4.push(_5);
 }
 return _4;
-},_setValue:function(_7,_8){
+},_setValue:function(_6,_7){
 throw new Error("Unsupported API: "+this._wireClass+"._setValue");
-},_getRow:function(_9){
-var _a=(dojo.isArray(this.columns)?[]:{});
+},_getRow:function(_8){
+var _9=(dojo.isArray(this.columns)?[]:{});
 for(var c in this.columns){
-_a[c]=this.columns[c].getValue(_9);
+_9[c]=this.columns[c].getValue(_8);
 }
-return _a;
+return _9;
 }});
 }
diff --git a/dojox/wire/TextAdapter.js b/dojox/wire/TextAdapter.js
index 54466fc..6e733ce 100644
--- a/dojox/wire/TextAdapter.js
+++ b/dojox/wire/TextAdapter.js
@@ -20,20 +20,20 @@ return _2;
 }
 var _3="";
 for(var i in this.segments){
-var _5=this.segments[i].getValue(_2);
-_3=this._addSegment(_3,_5);
+var _4=this.segments[i].getValue(_2);
+_3=this._addSegment(_3,_4);
 }
 return _3;
-},_setValue:function(_6,_7){
+},_setValue:function(_5,_6){
 throw new Error("Unsupported API: "+this._wireClass+"._setValue");
-},_addSegment:function(_8,_9){
-if(!_9){
-return _8;
-}else{
+},_addSegment:function(_7,_8){
 if(!_8){
-return _9;
+return _7;
+}else{
+if(!_7){
+return _8;
 }else{
-return _8+this.delimiter+_9;
+return _7+this.delimiter+_8;
 }
 }
 }});
diff --git a/dojox/wire/TreeAdapter.js b/dojox/wire/TreeAdapter.js
index 3c96a41..15ba3ab 100644
--- a/dojox/wire/TreeAdapter.js
+++ b/dojox/wire/TreeAdapter.js
@@ -26,63 +26,63 @@ _4=_4.concat(this._getNodes(_3[i],this.nodes[i2]));
 }
 }
 return _4;
-},_setValue:function(_7,_8){
+},_setValue:function(_5,_6){
 throw new Error("Unsupported API: "+this._wireClass+"._setValue");
-},_initializeChildren:function(_9){
-if(!_9){
+},_initializeChildren:function(_7){
+if(!_7){
 return;
 }
-for(var i in _9){
-var _b=_9[i];
-if(_b.node){
-_b.node.parent=this;
-if(!dojox.wire.isWire(_b.node)){
-_b.node=dojox.wire.create(_b.node);
+for(var i in _7){
+var _8=_7[i];
+if(_8.node){
+_8.node.parent=this;
+if(!dojox.wire.isWire(_8.node)){
+_8.node=dojox.wire.create(_8.node);
 }
 }
-if(_b.title){
-_b.title.parent=this;
-if(!dojox.wire.isWire(_b.title)){
-_b.title=dojox.wire.create(_b.title);
+if(_8.title){
+_8.title.parent=this;
+if(!dojox.wire.isWire(_8.title)){
+_8.title=dojox.wire.create(_8.title);
 }
 }
-if(_b.children){
-this._initializeChildren(_b.children);
+if(_8.children){
+this._initializeChildren(_8.children);
 }
 }
-},_getNodes:function(_c,_d){
-var _e=null;
-if(_d.node){
-_e=_d.node.getValue(_c);
-if(!_e){
+},_getNodes:function(_9,_a){
+var _b=null;
+if(_a.node){
+_b=_a.node.getValue(_9);
+if(!_b){
 return [];
 }
-if(!dojo.isArray(_e)){
-_e=[_e];
+if(!dojo.isArray(_b)){
+_b=[_b];
 }
 }else{
-_e=[_c];
-}
-var _f=[];
-for(var i in _e){
-_c=_e[i];
-var _11={};
-if(_d.title){
-_11.title=_d.title.getValue(_c);
+_b=[_9];
+}
+var _c=[];
+for(var i in _b){
+_9=_b[i];
+var _d={};
+if(_a.title){
+_d.title=_a.title.getValue(_9);
 }else{
-_11.title=_c;
+_d.title=_9;
 }
-if(_d.children){
-var _12=[];
-for(var i2 in _d.children){
-_12=_12.concat(this._getNodes(_c,_d.children[i2]));
+if(_a.children){
+var _e=[];
+for(var i2 in _a.children){
+_e=_e.concat(this._getNodes(_9,_a.children[i2]));
 }
-if(_12.length>0){
-_11.children=_12;
+if(_e.length>0){
+_d.children=_e;
 }
 }
-_f.push(_11);
+_c.push(_d);
 }
-return _f;
+return _c;
 }});
 }
diff --git a/dojox/wire/Wire.js b/dojox/wire/Wire.js
index 22a6fc9..529f68a 100644
--- a/dojox/wire/Wire.js
+++ b/dojox/wire/Wire.js
@@ -62,26 +62,26 @@ return _6;
 _6=this._getPropertyValue(_6,_7[i]);
 }
 }
-var _9=undefined;
+var _8=undefined;
 if(this._getValue){
-_9=this._getValue(_6);
+_8=this._getValue(_6);
 }else{
-_9=_6;
+_8=_6;
 }
-if(_9){
+if(_8){
 if(this.type){
 if(this.type=="string"){
-_9=_9.toString();
+_8=_8.toString();
 }else{
 if(this.type=="number"){
-_9=parseInt(_9,10);
+_8=parseInt(_8,10);
 }else{
 if(this.type=="boolean"){
-_9=(_9!="false");
+_8=(_8!="false");
 }else{
 if(this.type=="array"){
-if(!dojo.isArray(_9)){
-_9=[_9];
+if(!dojo.isArray(_8)){
+_8=[_8];
 }
 }
 }
@@ -89,143 +89,143 @@ _9=[_9];
 }
 }
 if(this.converter&&this.converter.convert){
-_9=this.converter.convert(_9,this);
+_8=this.converter.convert(_8,this);
 }
 }
-return _9;
-},setValue:function(_a,_b){
-var _c=undefined;
+return _8;
+},setValue:function(_9,_a){
+var _b=undefined;
 if(dojox.wire.isWire(this.object)){
-_c=this.object.getValue(_b);
+_b=this.object.getValue(_a);
 }else{
-_c=(this.object||_b);
+_b=(this.object||_a);
 }
-var _d=undefined;
+var _c=undefined;
 var o;
 if(this.property){
-if(!_c){
+if(!_b){
 if(dojox.wire.isWire(this.object)){
-_c={};
-this.object.setValue(_c,_b);
+_b={};
+this.object.setValue(_b,_a);
 }else{
 throw new Error(this._wireClass+".setValue(): invalid object");
 }
 }
-var _f=this.property.split(".");
-var _10=_f.length-1;
-for(var i=0;i<_10;i++){
-var p=_f[i];
-o=this._getPropertyValue(_c,p);
+var _d=this.property.split(".");
+var _e=_d.length-1;
+for(var i=0;i<_e;i++){
+var p=_d[i];
+o=this._getPropertyValue(_b,p);
 if(!o){
 o={};
-this._setPropertyValue(_c,p,o);
+this._setPropertyValue(_b,p,o);
 }
-_c=o;
+_b=o;
 }
-_d=_f[_10];
+_c=_d[_e];
 }
 if(this._setValue){
-if(_d){
-o=this._getPropertyValue(_c,_d);
+if(_c){
+o=this._getPropertyValue(_b,_c);
 if(!o){
 o={};
-this._setPropertyValue(_c,_d,o);
+this._setPropertyValue(_b,_c,o);
 }
-_c=o;
+_b=o;
 }
-var _13=this._setValue(_c,_a);
-if(!_c&&_13){
+var _f=this._setValue(_b,_9);
+if(!_b&&_f){
 if(dojox.wire.isWire(this.object)){
-this.object.setValue(_13,_b);
+this.object.setValue(_f,_a);
 }else{
 throw new Error(this._wireClass+".setValue(): invalid object");
 }
 }
 }else{
-if(_d){
-this._setPropertyValue(_c,_d,_a);
+if(_c){
+this._setPropertyValue(_b,_c,_9);
 }else{
 if(dojox.wire.isWire(this.object)){
-this.object.setValue(_a,_b);
+this.object.setValue(_9,_a);
 }else{
 throw new Error(this._wireClass+".setValue(): invalid property");
 }
 }
 }
-},_getPropertyValue:function(_14,_15){
-var _16=undefined;
-var i1=_15.indexOf("[");
+},_getPropertyValue:function(_10,_11){
+var _12=undefined;
+var i1=_11.indexOf("[");
 if(i1>=0){
-var i2=_15.indexOf("]");
-var _19=_15.substring(i1+1,i2);
-var _1a=null;
+var i2=_11.indexOf("]");
+var _13=_11.substring(i1+1,i2);
+var _14=null;
 if(i1===0){
-_1a=_14;
+_14=_10;
 }else{
-_15=_15.substring(0,i1);
-_1a=this._getPropertyValue(_14,_15);
-if(_1a&&!dojo.isArray(_1a)){
-_1a=[_1a];
+_11=_11.substring(0,i1);
+_14=this._getPropertyValue(_10,_11);
+if(_14&&!dojo.isArray(_14)){
+_14=[_14];
 }
 }
-if(_1a){
-_16=_1a[_19];
+if(_14){
+_12=_14[_13];
 }
 }else{
-if(_14.getPropertyValue){
-_16=_14.getPropertyValue(_15);
+if(_10.getPropertyValue){
+_12=_10.getPropertyValue(_11);
 }else{
-var _1b="get"+_15.charAt(0).toUpperCase()+_15.substring(1);
-if(this._useAttr(_14)){
-_16=_14.attr(_15);
+var _15="get"+_11.charAt(0).toUpperCase()+_11.substring(1);
+if(this._useAttr(_10)){
+_12=_10.attr(_11);
 }else{
-if(_14[_1b]){
-_16=_14[_1b]();
+if(_10[_15]){
+_12=_10[_15]();
 }else{
-_16=_14[_15];
+_12=_10[_11];
 }
 }
 }
 }
-return _16;
-},_setPropertyValue:function(_1c,_1d,_1e){
-var i1=_1d.indexOf("[");
+return _12;
+},_setPropertyValue:function(_16,_17,_18){
+var i1=_17.indexOf("[");
 if(i1>=0){
-var i2=_1d.indexOf("]");
-var _21=_1d.substring(i1+1,i2);
-var _22=null;
+var i2=_17.indexOf("]");
+var _19=_17.substring(i1+1,i2);
+var _1a=null;
 if(i1===0){
-_22=_1c;
+_1a=_16;
 }else{
-_1d=_1d.substring(0,i1);
-_22=this._getPropertyValue(_1c,_1d);
-if(!_22){
-_22=[];
-this._setPropertyValue(_1c,_1d,_22);
+_17=_17.substring(0,i1);
+_1a=this._getPropertyValue(_16,_17);
+if(!_1a){
+_1a=[];
+this._setPropertyValue(_16,_17,_1a);
 }
 }
-_22[_21]=_1e;
+_1a[_19]=_18;
 }else{
-if(_1c.setPropertyValue){
-_1c.setPropertyValue(_1d,_1e);
+if(_16.setPropertyValue){
+_16.setPropertyValue(_17,_18);
 }else{
-var _23="set"+_1d.charAt(0).toUpperCase()+_1d.substring(1);
-if(this._useAttr(_1c)){
-_1c.attr(_1d,_1e);
+var _1b="set"+_17.charAt(0).toUpperCase()+_17.substring(1);
+if(this._useAttr(_16)){
+_16.attr(_17,_18);
 }else{
-if(_1c[_23]){
-_1c[_23](_1e);
+if(_16[_1b]){
+_16[_1b](_18);
 }else{
-_1c[_1d]=_1e;
+_16[_17]=_18;
 }
 }
 }
 }
-},_useAttr:function(_24){
-var _25=false;
-if(dojo.isFunction(_24.attr)){
-_25=true;
+},_useAttr:function(_1c){
+var _1d=false;
+if(dojo.isFunction(_1c.attr)){
+_1d=true;
 }
-return _25;
+return _1d;
 }});
 }
diff --git a/dojox/wire/XmlWire.js b/dojox/wire/XmlWire.js
index e3defd5..9fbc833 100644
--- a/dojox/wire/XmlWire.js
+++ b/dojox/wire/XmlWire.js
@@ -22,112 +22,112 @@ if(_4.charAt(0)=="/"){
 i=_4.indexOf("/",1);
 _4=_4.substring(i+1);
 }
-var _6=_4.split("/");
-var _7=_6.length-1;
-for(i=0;i<_7;i++){
-_3=this._getChildNode(_3,_6[i]);
+var _5=_4.split("/");
+var _6=_5.length-1;
+for(i=0;i<_6;i++){
+_3=this._getChildNode(_3,_5[i]);
 if(!_3){
 return undefined;
 }
 }
-var _8=this._getNodeValue(_3,_6[_7]);
-return _8;
-},_setValue:function(_9,_a){
+var _7=this._getNodeValue(_3,_5[_6]);
+return _7;
+},_setValue:function(_8,_9){
 if(!this.path){
-return _9;
+return _8;
 }
-var _b=_9;
-var _c=this._getDocument(_b);
-var _d=this.path;
+var _a=_8;
+var _b=this._getDocument(_a);
+var _c=this.path;
 var i;
-if(_d.charAt(0)=="/"){
-i=_d.indexOf("/",1);
-if(!_b){
-var _f=_d.substring(1,i);
-_b=_c.createElement(_f);
-_9=_b;
-}
-_d=_d.substring(i+1);
+if(_c.charAt(0)=="/"){
+i=_c.indexOf("/",1);
+if(!_a){
+var _d=_c.substring(1,i);
+_a=_b.createElement(_d);
+_8=_a;
+}
+_c=_c.substring(i+1);
 }else{
-if(!_b){
+if(!_a){
 return undefined;
 }
 }
-var _10=_d.split("/");
-var _11=_10.length-1;
-for(i=0;i<_11;i++){
-var _12=this._getChildNode(_b,_10[i]);
-if(!_12){
-_12=_c.createElement(_10[i]);
-_b.appendChild(_12);
+var _e=_c.split("/");
+var _f=_e.length-1;
+for(i=0;i<_f;i++){
+var _10=this._getChildNode(_a,_e[i]);
+if(!_10){
+_10=_b.createElement(_e[i]);
+_a.appendChild(_10);
 }
-_b=_12;
+_a=_10;
 }
-this._setNodeValue(_b,_10[_11],_a);
-return _9;
-},_getNodeValue:function(_13,exp){
-var _15=undefined;
+this._setNodeValue(_a,_e[_f],_9);
+return _8;
+},_getNodeValue:function(_11,exp){
+var _12=undefined;
 if(exp.charAt(0)=="@"){
-var _16=exp.substring(1);
-_15=_13.getAttribute(_16);
+var _13=exp.substring(1);
+_12=_11.getAttribute(_13);
 }else{
 if(exp=="text()"){
-var _17=_13.firstChild;
-if(_17){
-_15=_17.nodeValue;
+var _14=_11.firstChild;
+if(_14){
+_12=_14.nodeValue;
 }
 }else{
-_15=[];
-for(var i=0;i<_13.childNodes.length;i++){
-var _19=_13.childNodes[i];
-if(_19.nodeType===1&&_19.nodeName==exp){
-_15.push(_19);
+_12=[];
+for(var i=0;i<_11.childNodes.length;i++){
+var _15=_11.childNodes[i];
+if(_15.nodeType===1&&_15.nodeName==exp){
+_12.push(_15);
 }
 }
 }
 }
-return _15;
-},_setNodeValue:function(_1a,exp,_1c){
+return _12;
+},_setNodeValue:function(_16,exp,_17){
 if(exp.charAt(0)=="@"){
-var _1d=exp.substring(1);
-if(_1c){
-_1a.setAttribute(_1d,_1c);
+var _18=exp.substring(1);
+if(_17){
+_16.setAttribute(_18,_17);
 }else{
-_1a.removeAttribute(_1d);
+_16.removeAttribute(_18);
 }
 }else{
 if(exp=="text()"){
-while(_1a.firstChild){
-_1a.removeChild(_1a.firstChild);
+while(_16.firstChild){
+_16.removeChild(_16.firstChild);
 }
-if(_1c){
-var _1e=this._getDocument(_1a).createTextNode(_1c);
-_1a.appendChild(_1e);
+if(_17){
+var _19=this._getDocument(_16).createTextNode(_17);
+_16.appendChild(_19);
 }
 }
 }
-},_getChildNode:function(_1f,_20){
-var _21=1;
-var i1=_20.indexOf("[");
+},_getChildNode:function(_1a,_1b){
+var _1c=1;
+var i1=_1b.indexOf("[");
 if(i1>=0){
-var i2=_20.indexOf("]");
-_21=_20.substring(i1+1,i2);
-_20=_20.substring(0,i1);
+var i2=_1b.indexOf("]");
+_1c=_1b.substring(i1+1,i2);
+_1b=_1b.substring(0,i1);
 }
-var _24=1;
-for(var i=0;i<_1f.childNodes.length;i++){
-var _26=_1f.childNodes[i];
-if(_26.nodeType===1&&_26.nodeName==_20){
-if(_24==_21){
-return _26;
+var _1d=1;
+for(var i=0;i<_1a.childNodes.length;i++){
+var _1e=_1a.childNodes[i];
+if(_1e.nodeType===1&&_1e.nodeName==_1b){
+if(_1d==_1c){
+return _1e;
 }
-_24++;
+_1d++;
 }
 }
 return null;
-},_getDocument:function(_27){
-if(_27){
-return (_27.nodeType==9?_27:_27.ownerDocument);
+},_getDocument:function(_1f){
+if(_1f){
+return (_1f.nodeType==9?_1f:_1f.ownerDocument);
 }else{
 return dojox.xml.parser.parse();
 }
diff --git a/dojox/wire/ml/Action.js b/dojox/wire/ml/Action.js
index 8bed3f7..4a2ef3d 100644
--- a/dojox/wire/ml/Action.js
+++ b/dojox/wire/ml/Action.js
@@ -51,20 +51,20 @@ dojo.disconnect(this._triggerHandle);
 },run:function(){
 var _4=this.getChildren();
 for(var i in _4){
-var _6=_4[i];
-if(_6 instanceof dojox.wire.ml.ActionFilter){
-if(!_6.filter.apply(_6,arguments)){
+var _5=_4[i];
+if(_5 instanceof dojox.wire.ml.ActionFilter){
+if(!_5.filter.apply(_5,arguments)){
 return;
 }
 }
 }
 this._run.apply(this,arguments);
 },_run:function(){
-var _7=this.getChildren();
-for(var i in _7){
-var _9=_7[i];
-if(_9 instanceof dojox.wire.ml.Action){
-_9.run.apply(_9,arguments);
+var _6=this.getChildren();
+for(var i in _6){
+var _7=_6[i];
+if(_7 instanceof dojox.wire.ml.Action){
+_7.run.apply(_7,arguments);
 }
 }
 },uninitialize:function(){
@@ -75,28 +75,28 @@ dojo.declare("dojox.wire.ml.ActionFilter",dijit._Widget,{required:"",requiredVal
 if(this.required===""){
 return true;
 }else{
-var _a=dojox.wire.ml._getValue(this.required,arguments);
+var _8=dojox.wire.ml._getValue(this.required,arguments);
 if(this.requiredValue===""){
-if(_a){
+if(_8){
 return true;
 }
 }else{
-var _b=this.requiredValue;
+var _9=this.requiredValue;
 if(this.type!==""){
-var _c=this.type.toLowerCase();
-if(_c==="boolean"){
-if(_b.toLowerCase()==="false"){
-_b=false;
+var _a=this.type.toLowerCase();
+if(_a==="boolean"){
+if(_9.toLowerCase()==="false"){
+_9=false;
 }else{
-_b=true;
+_9=true;
 }
 }else{
-if(_c==="number"){
-_b=parseInt(_b,10);
+if(_a==="number"){
+_9=parseInt(_9,10);
 }
 }
 }
-if(_a===_b){
+if(_8===_9){
 return true;
 }
 }
diff --git a/dojox/wire/ml/Data.js b/dojox/wire/ml/Data.js
index 12d794d..ade9d43 100644
--- a/dojox/wire/ml/Data.js
+++ b/dojox/wire/ml/Data.js
@@ -20,54 +20,54 @@ this._properties={};
 }
 var _2=this.getChildren();
 for(var i in _2){
-var _4=_2[i];
-if((_4 instanceof dojox.wire.ml.DataProperty)&&_4.name){
-this.setPropertyValue(_4.name,_4.getValue());
+var _3=_2[i];
+if((_3 instanceof dojox.wire.ml.DataProperty)&&_3.name){
+this.setPropertyValue(_3.name,_3.getValue());
 }
 }
-},getPropertyValue:function(_5){
-return this._properties[_5];
-},setPropertyValue:function(_6,_7){
-this._properties[_6]=_7;
+},getPropertyValue:function(_4){
+return this._properties[_4];
+},setPropertyValue:function(_5,_6){
+this._properties[_5]=_6;
 }});
 dojo.declare("dojox.wire.ml.DataProperty",[dijit._Widget,dijit._Container],{name:"",type:"",value:"",_getValueAttr:function(){
 return this.getValue();
 },getValue:function(){
-var _8=this.value;
+var _7=this.value;
 if(this.type){
 if(this.type=="number"){
-_8=parseInt(_8);
+_7=parseInt(_7);
 }else{
 if(this.type=="boolean"){
-_8=(_8=="true");
+_7=(_7=="true");
 }else{
 if(this.type=="array"){
-_8=[];
-var _9=this.getChildren();
-for(var i in _9){
-var _b=_9[i];
-if(_b instanceof dojox.wire.ml.DataProperty){
-_8.push(_b.getValue());
+_7=[];
+var _8=this.getChildren();
+for(var i in _8){
+var _9=_8[i];
+if(_9 instanceof dojox.wire.ml.DataProperty){
+_7.push(_9.getValue());
 }
 }
 }else{
 if(this.type=="object"){
-_8={};
-var _9=this.getChildren();
-for(var i in _9){
-var _b=_9[i];
-if((_b instanceof dojox.wire.ml.DataProperty)&&_b.name){
-_8[_b.name]=_b.getValue();
+_7={};
+var _8=this.getChildren();
+for(var i in _8){
+var _9=_8[i];
+if((_9 instanceof dojox.wire.ml.DataProperty)&&_9.name){
+_7[_9.name]=_9.getValue();
 }
 }
 }else{
 if(this.type=="element"){
-_8=new dojox.wire.ml.XmlElement(_8);
-var _9=this.getChildren();
-for(var i in _9){
-var _b=_9[i];
-if((_b instanceof dojox.wire.ml.DataProperty)&&_b.name){
-_8.setPropertyValue(_b.name,_b.getValue());
+_7=new dojox.wire.ml.XmlElement(_7);
+var _8=this.getChildren();
+for(var i in _8){
+var _9=_8[i];
+if((_9 instanceof dojox.wire.ml.DataProperty)&&_9.name){
+_7.setPropertyValue(_9.name,_9.getValue());
 }
 }
 }
@@ -76,6 +76,6 @@ _8.setPropertyValue(_b.name,_b.getValue());
 }
 }
 }
-return _8;
+return _7;
 }});
 }
diff --git a/dojox/wire/ml/DataStore.js b/dojox/wire/ml/DataStore.js
index e9fe89d..619493a 100644
--- a/dojox/wire/ml/DataStore.js
+++ b/dojox/wire/ml/DataStore.js
@@ -31,14 +31,14 @@ _2[a.nodeName]=a.nodeValue;
 return new _1(_2);
 },getFeatures:function(){
 return this.store.getFeatures();
-},fetch:function(_6){
-return this.store.fetch(_6);
-},save:function(_7){
-this.store.save(_7);
-},newItem:function(_8){
-return this.store.newItem(_8);
-},deleteItem:function(_9){
-return this.store.deleteItem(_9);
+},fetch:function(_4){
+return this.store.fetch(_4);
+},save:function(_5){
+this.store.save(_5);
+},newItem:function(_6){
+return this.store.newItem(_6);
+},deleteItem:function(_7){
+return this.store.deleteItem(_7);
 },revert:function(){
 return this.store.revert();
 }});
diff --git a/dojox/wire/ml/Invocation.js b/dojox/wire/ml/Invocation.js
index 2ff35fd..17d5613 100644
--- a/dojox/wire/ml/Invocation.js
+++ b/dojox/wire/ml/Invocation.js
@@ -56,11 +56,11 @@ _4=true;
 var r=_3.apply(_2,_1);
 if(!_4){
 if(r&&(r instanceof dojo.Deferred)){
-var _8=this;
-r.addCallbacks(function(_9){
-_8.onComplete(_9);
-},function(_a){
-_8.onError(_a);
+var _7=this;
+r.addCallbacks(function(_8){
+_7.onComplete(_8);
+},function(_9){
+_7.onError(_9);
 });
 }else{
 this.onComplete(r);
@@ -72,38 +72,38 @@ this.onError(e);
 }
 }
 }
-},onComplete:function(_b){
+},onComplete:function(_a){
 if(this.result){
-dojox.wire.ml._setValue(this.result,_b);
+dojox.wire.ml._setValue(this.result,_a);
 }
 if(this.error){
 dojox.wire.ml._setValue(this.error,"");
 }
-},onError:function(_c){
+},onError:function(_b){
 if(this.error){
-if(_c&&_c.message){
-_c=_c.message;
+if(_b&&_b.message){
+_b=_b.message;
 }
-dojox.wire.ml._setValue(this.error,_c);
+dojox.wire.ml._setValue(this.error,_b);
 }
-},_getParameters:function(_d){
+},_getParameters:function(_c){
 if(!this.parameters){
-return _d;
-}
-var _e=[];
-var _f=this.parameters.split(",");
-if(_f.length==1){
-var _10=dojox.wire.ml._getValue(dojo.trim(_f[0]),_d);
-if(dojo.isArray(_10)){
-_e=_10;
+return _c;
+}
+var _d=[];
+var _e=this.parameters.split(",");
+if(_e.length==1){
+var _f=dojox.wire.ml._getValue(dojo.trim(_e[0]),_c);
+if(dojo.isArray(_f)){
+_d=_f;
 }else{
-_e.push(_10);
+_d.push(_f);
 }
 }else{
-for(var i in _f){
-_e.push(dojox.wire.ml._getValue(dojo.trim(_f[i]),_d));
+for(var i in _e){
+_d.push(dojox.wire.ml._getValue(dojo.trim(_e[i]),_c));
 }
 }
-return _e;
+return _d;
 }});
 }
diff --git a/dojox/wire/ml/Service.js b/dojox/wire/ml/Service.js
index b0757a3..af10330 100644
--- a/dojox/wire/ml/Service.js
+++ b/dojox/wire/ml/Service.js
@@ -21,150 +21,150 @@ this.handler=this._createHandler();
 if(this.url){
 var _1=this;
 var d=dojo.xhrGet({url:this.url,handleAs:"json",sync:true});
-d.addCallback(function(_3){
-_1.smd=_3;
+d.addCallback(function(_2){
+_1.smd=_2;
 });
 if(this.smd&&!this.serviceUrl){
 this.serviceUrl=(this.smd.serviceUrl||this.smd.serviceURL);
 }
 }
-var _4=undefined;
+var _3=undefined;
 if(this.handlerClass){
-_4=dojox.wire._getClass(this.handlerClass);
+_3=dojox.wire._getClass(this.handlerClass);
 }else{
 if(this.serviceType){
-_4=this._handlerClasses[this.serviceType];
-if(_4&&dojo.isString(_4)){
-_4=dojox.wire._getClass(_4);
-this._handlerClasses[this.serviceType]=_4;
+_3=this._handlerClasses[this.serviceType];
+if(_3&&dojo.isString(_3)){
+_3=dojox.wire._getClass(_3);
+this._handlerClasses[this.serviceType]=_3;
 }
 }else{
 if(this.smd&&this.smd.serviceType){
-_4=this._handlerClasses[this.smd.serviceType];
-if(_4&&dojo.isString(_4)){
-_4=dojox.wire._getClass(_4);
-this._handlerClasses[this.smd.serviceType]=_4;
+_3=this._handlerClasses[this.smd.serviceType];
+if(_3&&dojo.isString(_3)){
+_3=dojox.wire._getClass(_3);
+this._handlerClasses[this.smd.serviceType]=_3;
 }
 }
 }
 }
-if(!_4){
+if(!_3){
 return null;
 }
-return new _4();
-},callMethod:function(_5,_6){
-var _7=new dojo.Deferred();
-this.handler.bind(_5,_6,_7,this.serviceUrl);
-return _7;
+return new _3();
+},callMethod:function(_4,_5){
+var _6=new dojo.Deferred();
+this.handler.bind(_4,_5,_6,this.serviceUrl);
+return _6;
 }});
-dojo.declare("dojox.wire.ml.RestHandler",null,{contentType:"text/plain",handleAs:"text",bind:function(_8,_9,_a,_b){
-_8=_8.toUpperCase();
-var _c=this;
-var _d={url:this._getUrl(_8,_9,_b),contentType:this.contentType,handleAs:this.handleAs,headers:this.headers,preventCache:this.preventCache};
+dojo.declare("dojox.wire.ml.RestHandler",null,{contentType:"text/plain",handleAs:"text",bind:function(_7,_8,_9,_a){
+_7=_7.toUpperCase();
+var _b=this;
+var _c={url:this._getUrl(_7,_8,_a),contentType:this.contentType,handleAs:this.handleAs,headers:this.headers,preventCache:this.preventCache};
 var d=null;
-if(_8=="POST"){
-_d.postData=this._getContent(_8,_9);
-d=dojo.rawXhrPost(_d);
+if(_7=="POST"){
+_c.postData=this._getContent(_7,_8);
+d=dojo.rawXhrPost(_c);
 }else{
-if(_8=="PUT"){
-_d.putData=this._getContent(_8,_9);
-d=dojo.rawXhrPut(_d);
+if(_7=="PUT"){
+_c.putData=this._getContent(_7,_8);
+d=dojo.rawXhrPut(_c);
 }else{
-if(_8=="DELETE"){
-d=dojo.xhrDelete(_d);
+if(_7=="DELETE"){
+d=dojo.xhrDelete(_c);
 }else{
-d=dojo.xhrGet(_d);
+d=dojo.xhrGet(_c);
 }
 }
 }
-d.addCallbacks(function(_f){
-_a.callback(_c._getResult(_f));
-},function(_10){
-_a.errback(_10);
+d.addCallbacks(function(_d){
+_9.callback(_b._getResult(_d));
+},function(_e){
+_9.errback(_e);
 });
-},_getUrl:function(_11,_12,url){
-var _14;
-if(_11=="GET"||_11=="DELETE"){
-if(_12.length>0){
-_14=_12[0];
+},_getUrl:function(_f,_10,url){
+var _11;
+if(_f=="GET"||_f=="DELETE"){
+if(_10.length>0){
+_11=_10[0];
 }
 }else{
-if(_12.length>1){
-_14=_12[1];
+if(_10.length>1){
+_11=_10[1];
 }
 }
+if(_11){
+var _12="";
+for(var _13 in _11){
+var _14=_11[_13];
 if(_14){
-var _15="";
-for(var _16 in _14){
-var _17=_14[_16];
-if(_17){
-_17=encodeURIComponent(_17);
-var _18="{"+_16+"}";
-var _19=url.indexOf(_18);
-if(_19>=0){
-url=url.substring(0,_19)+_17+url.substring(_19+_18.length);
+_14=encodeURIComponent(_14);
+var _15="{"+_13+"}";
+var _16=url.indexOf(_15);
+if(_16>=0){
+url=url.substring(0,_16)+_14+url.substring(_16+_15.length);
 }else{
-if(_15){
-_15+="&";
+if(_12){
+_12+="&";
 }
-_15+=(_16+"="+_17);
+_12+=(_13+"="+_14);
 }
 }
 }
-if(_15){
-url+="?"+_15;
+if(_12){
+url+="?"+_12;
 }
 }
 return url;
-},_getContent:function(_1a,_1b){
-if(_1a=="POST"||_1a=="PUT"){
-return (_1b?_1b[0]:null);
+},_getContent:function(_17,_18){
+if(_17=="POST"||_17=="PUT"){
+return (_18?_18[0]:null);
 }else{
 return null;
 }
-},_getResult:function(_1c){
-return _1c;
+},_getResult:function(_19){
+return _19;
 }});
-dojo.declare("dojox.wire.ml.XmlHandler",dojox.wire.ml.RestHandler,{contentType:"text/xml",handleAs:"xml",_getContent:function(_1d,_1e){
-var _1f=null;
-if(_1d=="POST"||_1d=="PUT"){
-var p=_1e[0];
+dojo.declare("dojox.wire.ml.XmlHandler",dojox.wire.ml.RestHandler,{contentType:"text/xml",handleAs:"xml",_getContent:function(_1a,_1b){
+var _1c=null;
+if(_1a=="POST"||_1a=="PUT"){
+var p=_1b[0];
 if(p){
 if(dojo.isString(p)){
-_1f=p;
+_1c=p;
 }else{
-var _21=p;
-if(_21 instanceof dojox.wire.ml.XmlElement){
-_21=_21.element;
+var _1d=p;
+if(_1d instanceof dojox.wire.ml.XmlElement){
+_1d=_1d.element;
 }else{
-if(_21.nodeType===9){
-_21=_21.documentElement;
+if(_1d.nodeType===9){
+_1d=_1d.documentElement;
 }
 }
-var _22="<?xml version=\"1.0\"?>";
-_1f=_22+dojox.xml.parser.innerXML(_21);
+var _1e="<?xml version=\"1.0\"?>";
+_1c=_1e+dojox.xml.parser.innerXML(_1d);
 }
 }
 }
-return _1f;
-},_getResult:function(_23){
-if(_23){
-_23=new dojox.wire.ml.XmlElement(_23);
+return _1c;
+},_getResult:function(_1f){
+if(_1f){
+_1f=new dojox.wire.ml.XmlElement(_1f);
 }
-return _23;
+return _1f;
 }});
-dojo.declare("dojox.wire.ml.JsonHandler",dojox.wire.ml.RestHandler,{contentType:"text/json",handleAs:"json",headers:{"Accept":"*/json"},_getContent:function(_24,_25){
-var _26=null;
-if(_24=="POST"||_24=="PUT"){
-var p=(_25?_25[0]:undefined);
+dojo.declare("dojox.wire.ml.JsonHandler",dojox.wire.ml.RestHandler,{contentType:"text/json",handleAs:"json",headers:{"Accept":"*/json"},_getContent:function(_20,_21){
+var _22=null;
+if(_20=="POST"||_20=="PUT"){
+var p=(_21?_21[0]:undefined);
 if(p){
 if(dojo.isString(p)){
-_26=p;
+_22=p;
 }else{
-_26=dojo.toJson(p);
+_22=dojo.toJson(p);
 }
 }
 }
-return _26;
+return _22;
 }});
 }
diff --git a/dojox/wire/ml/Transfer.js b/dojox/wire/ml/Transfer.js
index 0748fe0..3dabb9a 100644
--- a/dojox/wire/ml/Transfer.js
+++ b/dojox/wire/ml/Transfer.js
@@ -44,79 +44,79 @@ _4.object=dojox.wire.ml._getValue(_4.object.substring(0,i));
 if(_4.dataStore){
 _4.dataStore=dojox.wire.ml._getValue(_4.dataStore);
 }
-var _6=undefined;
-var _7=this.getChildren();
-for(var i in _7){
-var _8=_7[i];
-if(_8 instanceof dojox.wire.ml.ChildWire&&_8.which==_3){
-if(!_6){
-_6={};
+var _5=undefined;
+var _6=this.getChildren();
+for(var i in _6){
+var _7=_6[i];
+if(_7 instanceof dojox.wire.ml.ChildWire&&_7.which==_3){
+if(!_5){
+_5={};
 }
-_8._addWire(this,_6);
+_7._addWire(this,_5);
 }
 }
-if(_6){
-_6.object=dojox.wire.create(_4);
-_6.dataStore=_4.dataStore;
-_4=_6;
+if(_5){
+_5.object=dojox.wire.create(_4);
+_5.dataStore=_4.dataStore;
+_4=_5;
 }
 return _4;
 }});
-dojo.declare("dojox.wire.ml.ChildWire",dijit._Widget,{which:"source",object:"",property:"",type:"",converter:"",attribute:"",path:"",name:"",_addWire:function(_9,_a){
+dojo.declare("dojox.wire.ml.ChildWire",dijit._Widget,{which:"source",object:"",property:"",type:"",converter:"",attribute:"",path:"",name:"",_addWire:function(_8,_9){
 if(this.name){
-if(!_a.children){
-_a.children={};
+if(!_9.children){
+_9.children={};
 }
-_a.children[this.name]=this._getWire(_9);
+_9.children[this.name]=this._getWire(_8);
 }else{
-if(!_a.children){
-_a.children=[];
+if(!_9.children){
+_9.children=[];
 }
-_a.children.push(this._getWire(_9));
+_9.children.push(this._getWire(_8));
 }
-},_getWire:function(_b){
+},_getWire:function(_a){
 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};
 }});
-dojo.declare("dojox.wire.ml.ColumnWire",dojox.wire.ml.ChildWire,{column:"",_addWire:function(_c,_d){
+dojo.declare("dojox.wire.ml.ColumnWire",dojox.wire.ml.ChildWire,{column:"",_addWire:function(_b,_c){
 if(this.column){
-if(!_d.columns){
-_d.columns={};
+if(!_c.columns){
+_c.columns={};
 }
-_d.columns[this.column]=this._getWire(_c);
+_c.columns[this.column]=this._getWire(_b);
 }else{
-if(!_d.columns){
-_d.columns=[];
+if(!_c.columns){
+_c.columns=[];
 }
-_d.columns.push(this._getWire(_c));
+_c.columns.push(this._getWire(_b));
 }
 }});
-dojo.declare("dojox.wire.ml.NodeWire",[dojox.wire.ml.ChildWire,dijit._Container],{titleProperty:"",titleAttribute:"",titlePath:"",_addWire:function(_e,_f){
-if(!_f.nodes){
-_f.nodes=[];
+dojo.declare("dojox.wire.ml.NodeWire",[dojox.wire.ml.ChildWire,dijit._Container],{titleProperty:"",titleAttribute:"",titlePath:"",_addWire:function(_d,_e){
+if(!_e.nodes){
+_e.nodes=[];
 }
-_f.nodes.push(this._getWires(_e));
-},_getWires:function(_10){
-var _11={node:this._getWire(_10),title:{type:"string",property:this.titleProperty,attribute:this.titleAttribute,path:this.titlePath}};
-var _12=[];
-var _13=this.getChildren();
-for(var i in _13){
-var _15=_13[i];
-if(_15 instanceof dojox.wire.ml.NodeWire){
-_12.push(_15._getWires(_10));
+_e.nodes.push(this._getWires(_d));
+},_getWires:function(_f){
+var _10={node:this._getWire(_f),title:{type:"string",property:this.titleProperty,attribute:this.titleAttribute,path:this.titlePath}};
+var _11=[];
+var _12=this.getChildren();
+for(var i in _12){
+var _13=_12[i];
+if(_13 instanceof dojox.wire.ml.NodeWire){
+_11.push(_13._getWires(_f));
 }
 }
-if(_12.length>0){
-_11.children=_12;
+if(_11.length>0){
+_10.children=_11;
 }
-return _11;
+return _10;
 }});
-dojo.declare("dojox.wire.ml.SegmentWire",dojox.wire.ml.ChildWire,{_addWire:function(_16,_17){
-if(!_17.segments){
-_17.segments=[];
+dojo.declare("dojox.wire.ml.SegmentWire",dojox.wire.ml.ChildWire,{_addWire:function(_14,_15){
+if(!_15.segments){
+_15.segments=[];
 }
-_17.segments.push(this._getWire(_16));
-if(_16.delimiter&&!_17.delimiter){
-_17.delimiter=_16.delimiter;
+_15.segments.push(this._getWire(_14));
+if(_14.delimiter&&!_15.delimiter){
+_15.delimiter=_14.delimiter;
 }
 }});
 }
diff --git a/dojox/wire/ml/util.js b/dojox/wire/ml/util.js
index c52bf7d..bfb10a6 100644
--- a/dojox/wire/ml/util.js
+++ b/dojox/wire/ml/util.js
@@ -24,126 +24,126 @@ if(i>=0){
 _3=_1.substring(i+1);
 _1=_1.substring(0,i);
 }
-var _5=(dijit.byId(_1)||dojo.byId(_1)||dojo.getObject(_1));
-if(!_5){
+var _4=(dijit.byId(_1)||dojo.byId(_1)||dojo.getObject(_1));
+if(!_4){
 return undefined;
 }
 if(!_3){
-return _5;
+return _4;
 }else{
-return new dojox.wire.Wire({object:_5,property:_3}).getValue();
+return new dojox.wire.Wire({object:_4,property:_3}).getValue();
 }
 };
-dojox.wire.ml._setValue=function(_6,_7){
-if(!_6){
+dojox.wire.ml._setValue=function(_5,_6){
+if(!_5){
 return;
 }
-var i=_6.indexOf(".");
+var i=_5.indexOf(".");
 if(i<0){
 return;
 }
-var _9=this._getValue(_6.substring(0,i));
-if(!_9){
+var _7=this._getValue(_5.substring(0,i));
+if(!_7){
 return;
 }
-var _a=_6.substring(i+1);
-var _b=new dojox.wire.Wire({object:_9,property:_a}).setValue(_7);
+var _8=_5.substring(i+1);
+var _9=new dojox.wire.Wire({object:_7,property:_8}).setValue(_6);
 };
-dojo.declare("dojox.wire.ml.XmlElement",null,{constructor:function(_c){
-if(dojo.isString(_c)){
-_c=this._getDocument().createElement(_c);
+dojo.declare("dojox.wire.ml.XmlElement",null,{constructor:function(_a){
+if(dojo.isString(_a)){
+_a=this._getDocument().createElement(_a);
 }
-this.element=_c;
-},getPropertyValue:function(_d){
-var _e=undefined;
+this.element=_a;
+},getPropertyValue:function(_b){
+var _c=undefined;
 if(!this.element){
-return _e;
+return _c;
 }
-if(!_d){
-return _e;
+if(!_b){
+return _c;
 }
-if(_d.charAt(0)=="@"){
-var _f=_d.substring(1);
-_e=this.element.getAttribute(_f);
+if(_b.charAt(0)=="@"){
+var _d=_b.substring(1);
+_c=this.element.getAttribute(_d);
 }else{
-if(_d=="text()"){
-var _10=this.element.firstChild;
-if(_10){
-_e=_10.nodeValue;
+if(_b=="text()"){
+var _e=this.element.firstChild;
+if(_e){
+_c=_e.nodeValue;
 }
 }else{
-var _11=[];
+var _f=[];
 for(var i=0;i<this.element.childNodes.length;i++){
-var _13=this.element.childNodes[i];
-if(_13.nodeType===1&&_13.nodeName==_d){
-_11.push(new dojox.wire.ml.XmlElement(_13));
+var _10=this.element.childNodes[i];
+if(_10.nodeType===1&&_10.nodeName==_b){
+_f.push(new dojox.wire.ml.XmlElement(_10));
 }
 }
-if(_11.length>0){
-if(_11.length===1){
-_e=_11[0];
+if(_f.length>0){
+if(_f.length===1){
+_c=_f[0];
 }else{
-_e=_11;
+_c=_f;
 }
 }
 }
 }
-return _e;
-},setPropertyValue:function(_14,_15){
+return _c;
+},setPropertyValue:function(_11,_12){
 var i;
-var _17;
+var _13;
 if(!this.element){
 return;
 }
-if(!_14){
+if(!_11){
 return;
 }
-if(_14.charAt(0)=="@"){
-var _18=_14.substring(1);
-if(_15){
-this.element.setAttribute(_18,_15);
+if(_11.charAt(0)=="@"){
+var _14=_11.substring(1);
+if(_12){
+this.element.setAttribute(_14,_12);
 }else{
-this.element.removeAttribute(_18);
+this.element.removeAttribute(_14);
 }
 }else{
-if(_14=="text()"){
+if(_11=="text()"){
 while(this.element.firstChild){
 this.element.removeChild(this.element.firstChild);
 }
-if(_15){
-_17=this._getDocument().createTextNode(_15);
-this.element.appendChild(_17);
+if(_12){
+_13=this._getDocument().createTextNode(_12);
+this.element.appendChild(_13);
 }
 }else{
-var _19=null;
-var _1a;
+var _15=null;
+var _16;
 for(i=this.element.childNodes.length-1;i>=0;i--){
-_1a=this.element.childNodes[i];
-if(_1a.nodeType===1&&_1a.nodeName==_14){
-if(!_19){
-_19=_1a.nextSibling;
+_16=this.element.childNodes[i];
+if(_16.nodeType===1&&_16.nodeName==_11){
+if(!_15){
+_15=_16.nextSibling;
 }
-this.element.removeChild(_1a);
+this.element.removeChild(_16);
 }
 }
-if(_15){
-if(dojo.isArray(_15)){
-for(i in _15){
-var e=_15[i];
+if(_12){
+if(dojo.isArray(_12)){
+for(i in _12){
+var e=_12[i];
 if(e.element){
-this.element.insertBefore(e.element,_19);
+this.element.insertBefore(e.element,_15);
 }
 }
 }else{
-if(_15 instanceof dojox.wire.ml.XmlElement){
-if(_15.element){
-this.element.insertBefore(_15.element,_19);
+if(_12 instanceof dojox.wire.ml.XmlElement){
+if(_12.element){
+this.element.insertBefore(_12.element,_15);
 }
 }else{
-_1a=this._getDocument().createElement(_14);
-_17=this._getDocument().createTextNode(_15);
-_1a.appendChild(_17);
-this.element.insertBefore(_1a,_19);
+_16=this._getDocument().createElement(_11);
+_13=this._getDocument().createTextNode(_12);
+_16.appendChild(_13);
+this.element.insertBefore(_16,_15);
 }
 }
 }
@@ -152,9 +152,9 @@ this.element.insertBefore(_1a,_19);
 },toString:function(){
 var s="";
 if(this.element){
-var _1d=this.element.firstChild;
-if(_1d){
-s=_1d.nodeValue;
+var _17=this.element.firstChild;
+if(_17){
+s=_17.nodeValue;
 }
 }
 return s;
@@ -162,45 +162,45 @@ return s;
 if(!this.element){
 return null;
 }
-var _1e="";
+var _18="";
 var obj={};
-var _20=0;
+var _19=0;
 var i;
 for(i=0;i<this.element.childNodes.length;i++){
-var _22=this.element.childNodes[i];
-if(_22.nodeType===1){
-_20++;
-var o=new dojox.wire.ml.XmlElement(_22).toObject();
-var _24=_22.nodeName;
-var p=obj[_24];
+var _1a=this.element.childNodes[i];
+if(_1a.nodeType===1){
+_19++;
+var o=new dojox.wire.ml.XmlElement(_1a).toObject();
+var _1b=_1a.nodeName;
+var p=obj[_1b];
 if(!p){
-obj[_24]=o;
+obj[_1b]=o;
 }else{
 if(dojo.isArray(p)){
 p.push(o);
 }else{
-obj[_24]=[p,o];
+obj[_1b]=[p,o];
 }
 }
 }else{
-if(_22.nodeType===3||_22.nodeType===4){
-_1e+=_22.nodeValue;
+if(_1a.nodeType===3||_1a.nodeType===4){
+_18+=_1a.nodeValue;
 }
 }
 }
-var _26=0;
+var _1c=0;
 if(this.element.nodeType===1){
-_26=this.element.attributes.length;
-for(i=0;i<_26;i++){
-var _27=this.element.attributes[i];
-obj["@"+_27.nodeName]=_27.nodeValue;
+_1c=this.element.attributes.length;
+for(i=0;i<_1c;i++){
+var _1d=this.element.attributes[i];
+obj["@"+_1d.nodeName]=_1d.nodeValue;
 }
 }
-if(_20===0){
-if(_26===0){
-return _1e;
+if(_19===0){
+if(_1c===0){
+return _18;
 }
-obj["text()"]=_1e;
+obj["text()"]=_18;
 }
 return obj;
 },_getDocument:function(){
diff --git a/dojox/xml/DomParser.js b/dojox/xml/DomParser.js
index ed2c7aa..812df63 100644
--- a/dojox/xml/DomParser.js
+++ b/dojox/xml/DomParser.js
@@ -45,43 +45,43 @@ delete all[id];
 this.byId=this.getElementById=function(id){
 return all[id];
 };
-this.byName=this.getElementsByTagName=_14;
-this.byNameNS=this.getElementsByTagNameNS=_15;
-this.childrenByName=_16;
-this.childrenByNameNS=_17;
+this.byName=this.getElementsByTagName=_10;
+this.byNameNS=this.getElementsByTagNameNS=_11;
+this.childrenByName=_12;
+this.childrenByNameNS=_13;
 })();
 };
-function _14(_18){
-function __(_1a,_1b,arr){
-dojo.forEach(_1a.childNodes,function(c){
+function _10(_14){
+function _15(_16,_17,arr){
+dojo.forEach(_16.childNodes,function(c){
 if(c.nodeType==_1.ELEMENT){
-if(_1b=="*"){
+if(_17=="*"){
 arr.push(c);
 }else{
-if(c.nodeName==_1b){
+if(c.nodeName==_17){
 arr.push(c);
 }
 }
-__(c,_1b,arr);
+_15(c,_17,arr);
 }
 });
 };
 var a=[];
-__(this,_18,a);
+_15(this,_14,a);
 return a;
 };
-function _15(_1f,ns){
-function __(_22,_23,ns,arr){
-dojo.forEach(_22.childNodes,function(c){
+function _11(_18,ns){
+function _19(_1a,_1b,ns,arr){
+dojo.forEach(_1a.childNodes,function(c){
 if(c.nodeType==_1.ELEMENT){
-if(_23=="*"&&c.ownerDocument._nsPaths[ns]==c.namespace){
+if(_1b=="*"&&c.ownerDocument._nsPaths[ns]==c.namespace){
 arr.push(c);
 }else{
-if(c.localName==_23&&c.ownerDocument._nsPaths[ns]==c.namespace){
+if(c.localName==_1b&&c.ownerDocument._nsPaths[ns]==c.namespace){
 arr.push(c);
 }
 }
-__(c,_23,ns,arr);
+_19(c,_1b,ns,arr);
 }
 });
 };
@@ -89,17 +89,17 @@ if(!ns){
 ns=_e;
 }
 var a=[];
-__(this,_1f,ns,a);
+_19(this,_18,ns,a);
 return a;
 };
-function _16(_28){
+function _12(_1c){
 var a=[];
 dojo.forEach(this.childNodes,function(c){
 if(c.nodeType==_1.ELEMENT){
-if(_28=="*"){
+if(_1c=="*"){
 a.push(c);
 }else{
-if(c.nodeName==_28){
+if(c.nodeName==_1c){
 a.push(c);
 }
 }
@@ -107,14 +107,14 @@ a.push(c);
 });
 return a;
 };
-function _17(_2b,ns){
+function _13(_1d,ns){
 var a=[];
 dojo.forEach(this.childNodes,function(c){
 if(c.nodeType==_1.ELEMENT){
-if(_2b=="*"&&c.ownerDocument._nsPaths[ns]==c.namespace){
+if(_1d=="*"&&c.ownerDocument._nsPaths[ns]==c.namespace){
 a.push(c);
 }else{
-if(c.localName==_2b&&c.ownerDocument._nsPaths[ns]==c.namespace){
+if(c.localName==_1d&&c.ownerDocument._nsPaths[ns]==c.namespace){
 a.push(c);
 }
 }
@@ -122,50 +122,50 @@ a.push(c);
 });
 return a;
 };
-function _2f(v){
+function _1e(v){
 return {nodeType:_1.TEXT,nodeName:"#text",nodeValue:v.replace(_8," ").replace(_9,">").replace(_a,"<").replace(_c,"'").replace(_b,"\"").replace(_d,"&")};
 };
-function _31(_32){
+function _1f(_20){
 for(var i=0;i<this.attributes.length;i++){
-if(this.attributes[i].nodeName==_32){
+if(this.attributes[i].nodeName==_20){
 return this.attributes[i].nodeValue;
 }
 }
 return null;
 };
-function _34(_35,ns){
+function _21(_22,ns){
 for(var i=0;i<this.attributes.length;i++){
-if(this.ownerDocument._nsPaths[ns]==this.attributes[i].namespace&&this.attributes[i].localName==_35){
+if(this.ownerDocument._nsPaths[ns]==this.attributes[i].namespace&&this.attributes[i].localName==_22){
 return this.attributes[i].nodeValue;
 }
 }
 return null;
 };
-function _38(_39,val){
+function _23(_24,val){
 var old=null;
 for(var i=0;i<this.attributes.length;i++){
-if(this.attributes[i].nodeName==_39){
+if(this.attributes[i].nodeName==_24){
 old=this.attributes[i].nodeValue;
 this.attributes[i].nodeValue=val;
 break;
 }
 }
-if(_39=="id"){
+if(_24=="id"){
 if(old!=null){
 this.ownerDocument._remove(old);
 }
 this.ownerDocument._add(this);
 }
 };
-function _3d(_3e,val,ns){
+function _25(_26,val,ns){
 for(var i=0;i<this.attributes.length;i++){
-if(this.ownerDocument._nsPaths[ns]==this.attributes[i].namespace&&this.attributes[i].localName==_3e){
+if(this.ownerDocument._nsPaths[ns]==this.attributes[i].namespace&&this.attributes[i].localName==_26){
 this.attributes[i].nodeValue=val;
 return;
 }
 }
 };
-function _42(){
+function _27(){
 var p=this.parentNode;
 if(p){
 for(var i=0;i<p.childNodes.length;i++){
@@ -176,7 +176,7 @@ return p.childNodes[i-1];
 }
 return null;
 };
-function _45(){
+function _28(){
 var p=this.parentNode;
 if(p){
 for(var i=0;i<p.childNodes.length;i++){
@@ -188,114 +188,114 @@ return p.childNodes[i+1];
 return null;
 };
 this.parse=function(str){
-var _49=_f();
+var _29=_f();
 if(str==null){
-return _49;
+return _29;
 }
 if(str.length==0){
-return _49;
+return _29;
 }
 if(str.indexOf("<!ENTITY")>0){
-var _4a,eRe=[];
+var _2a,eRe=[];
 if(_4.test(str)){
 _4.lastIndex=0;
-while((_4a=_4.exec(str))!=null){
-eRe.push({entity:"&"+_4a[1].replace(_7,"")+";",expression:_4a[2]});
+while((_2a=_4.exec(str))!=null){
+eRe.push({entity:"&"+_2a[1].replace(_7,"")+";",expression:_2a[2]});
 }
 for(var i=0;i<eRe.length;i++){
 str=str.replace(new RegExp(eRe[i].entity,"g"),eRe[i].expression);
 }
 }
 }
-var _4d=[],_4e;
-while((_4e=_5.exec(str))!=null){
-_4d.push(_4e[1]);
+var _2b=[],_2c;
+while((_2c=_5.exec(str))!=null){
+_2b.push(_2c[1]);
 }
-for(var i=0;i<_4d.length;i++){
-str=str.replace(_4d[i],i);
+for(var i=0;i<_2b.length;i++){
+str=str.replace(_2b[i],i);
 }
-var _4f=[],_50;
-while((_50=_6.exec(str))!=null){
-_4f.push(_50[1]);
+var _2d=[],_2e;
+while((_2e=_6.exec(str))!=null){
+_2d.push(_2e[1]);
 }
-for(i=0;i<_4f.length;i++){
-str=str.replace(_4f[i],i);
+for(i=0;i<_2d.length;i++){
+str=str.replace(_2d[i],i);
 }
-var res,obj=_49;
+var res,obj=_29;
 while((res=_2.exec(str))!=null){
 if(res[2].charAt(0)=="/"&&res[2].replace(_7,"").length>1){
 if(obj.parentNode){
 obj=obj.parentNode;
 }
-var _53=(res[3]||"").replace(_7,"");
-if(_53.length>0){
-obj.childNodes.push(_2f(_53));
+var _2f=(res[3]||"").replace(_7,"");
+if(_2f.length>0){
+obj.childNodes.push(_1e(_2f));
 }
 }else{
 if(res[1].length>0){
 if(res[1].charAt(0)=="?"){
-var _54=res[1].substr(1);
-var _55=res[2].substr(0,res[2].length-2);
-obj.childNodes.push({nodeType:_1.PROCESSING_INSTRUCTION,nodeName:_54,nodeValue:_55});
+var _30=res[1].substr(1);
+var _31=res[2].substr(0,res[2].length-2);
+obj.childNodes.push({nodeType:_1.PROCESSING_INSTRUCTION,nodeName:_30,nodeValue:_31});
 }else{
 if(res[1].charAt(0)=="!"){
 if(res[1].indexOf("![CDATA[")==0){
 var val=parseInt(res[1].replace("![CDATA[","").replace("]]",""));
-obj.childNodes.push({nodeType:_1.CDATA_SECTION,nodeName:"#cdata-section",nodeValue:_4d[val]});
+obj.childNodes.push({nodeType:_1.CDATA_SECTION,nodeName:"#cdata-section",nodeValue:_2b[val]});
 }else{
 if(res[1].substr(0,3)=="!--"){
 var val=parseInt(res[1].replace("!--","").replace("--",""));
-obj.childNodes.push({nodeType:_1.COMMENT,nodeName:"#comment",nodeValue:_4f[val]});
+obj.childNodes.push({nodeType:_1.COMMENT,nodeName:"#comment",nodeValue:_2d[val]});
 }
 }
 }else{
-var _54=res[1].replace(_7,"");
-var o={nodeType:_1.ELEMENT,nodeName:_54,localName:_54,namespace:_e,ownerDocument:_49,attributes:[],parentNode:null,childNodes:[]};
-if(_54.indexOf(":")>-1){
-var t=_54.split(":");
+var _30=res[1].replace(_7,"");
+var o={nodeType:_1.ELEMENT,nodeName:_30,localName:_30,namespace:_e,ownerDocument:_29,attributes:[],parentNode:null,childNodes:[]};
+if(_30.indexOf(":")>-1){
+var t=_30.split(":");
 o.namespace=t[0];
 o.localName=t[1];
 }
-o.byName=o.getElementsByTagName=_14;
-o.byNameNS=o.getElementsByTagNameNS=_15;
-o.childrenByName=_16;
-o.childrenByNameNS=_17;
-o.getAttribute=_31;
-o.getAttributeNS=_34;
-o.setAttribute=_38;
-o.setAttributeNS=_3d;
-o.previous=o.previousSibling=_42;
-o.next=o.nextSibling=_45;
-var _59;
-while((_59=_3.exec(res[2]))!=null){
-if(_59.length>0){
-var _54=_59[1].replace(_7,"");
-var val=(_59[4]||_59[6]||"").replace(_8," ").replace(_9,">").replace(_a,"<").replace(_c,"'").replace(_b,"\"").replace(_d,"&");
-if(_54.indexOf("xmlns")==0){
-if(_54.indexOf(":")>0){
-var ns=_54.split(":");
-_49.namespaces[ns[1]]=val;
-_49._nsPaths[val]=ns[1];
+o.byName=o.getElementsByTagName=_10;
+o.byNameNS=o.getElementsByTagNameNS=_11;
+o.childrenByName=_12;
+o.childrenByNameNS=_13;
+o.getAttribute=_1f;
+o.getAttributeNS=_21;
+o.setAttribute=_23;
+o.setAttributeNS=_25;
+o.previous=o.previousSibling=_27;
+o.next=o.nextSibling=_28;
+var _32;
+while((_32=_3.exec(res[2]))!=null){
+if(_32.length>0){
+var _30=_32[1].replace(_7,"");
+var val=(_32[4]||_32[6]||"").replace(_8," ").replace(_9,">").replace(_a,"<").replace(_c,"'").replace(_b,"\"").replace(_d,"&");
+if(_30.indexOf("xmlns")==0){
+if(_30.indexOf(":")>0){
+var ns=_30.split(":");
+_29.namespaces[ns[1]]=val;
+_29._nsPaths[val]=ns[1];
 }else{
-_49.namespaces[_e]=val;
-_49._nsPaths[val]=_e;
+_29.namespaces[_e]=val;
+_29._nsPaths[val]=_e;
 }
 }else{
-var ln=_54;
+var ln=_30;
 var ns=_e;
-if(_54.indexOf(":")>0){
-var t=_54.split(":");
+if(_30.indexOf(":")>0){
+var t=_30.split(":");
 ln=t[1];
 ns=t[0];
 }
-o.attributes.push({nodeType:_1.ATTRIBUTE,nodeName:_54,localName:ln,namespace:ns,nodeValue:val});
+o.attributes.push({nodeType:_1.ATTRIBUTE,nodeName:_30,localName:ln,namespace:ns,nodeValue:val});
 if(ln=="id"){
 o.id=val;
 }
 }
 }
 }
-_49._add(o);
+_29._add(o);
 if(obj){
 obj.childNodes.push(o);
 o.parentNode=obj;
@@ -303,23 +303,23 @@ if(res[2].charAt(res[2].length-1)!="/"){
 obj=o;
 }
 }
-var _53=res[3];
-if(_53.length>0){
-obj.childNodes.push(_2f(_53));
+var _2f=res[3];
+if(_2f.length>0){
+obj.childNodes.push(_1e(_2f));
 }
 }
 }
 }
 }
 }
-for(var i=0;i<_49.childNodes.length;i++){
-var e=_49.childNodes[i];
+for(var i=0;i<_29.childNodes.length;i++){
+var e=_29.childNodes[i];
 if(e.nodeType==_1.ELEMENT){
-_49.documentElement=e;
+_29.documentElement=e;
 break;
 }
 }
-return _49;
+return _29;
 };
 })();
 }
diff --git a/dojox/xml/parser.js b/dojox/xml/parser.js
index 5627240..0855194 100644
--- a/dojox/xml/parser.js
+++ b/dojox/xml/parser.js
@@ -16,13 +16,13 @@ if(_1&&dojo.trim(_1)&&"DOMParser" in dojo.global){
 var _5=new DOMParser();
 _4=_5.parseFromString(_1,_2);
 var de=_4.documentElement;
-var _7="http://www.mozilla.org/newlayout/xml/parsererror.xml";
-if(de.nodeName=="parsererror"&&de.namespaceURI==_7){
-var _8=de.getElementsByTagNameNS(_7,"sourcetext")[0];
-if(!_8){
-_8=_8.firstChild.data;
+var _6="http://www.mozilla.org/newlayout/xml/parsererror.xml";
+if(de.nodeName=="parsererror"&&de.namespaceURI==_6){
+var _7=de.getElementsByTagNameNS(_6,"sourcetext")[0];
+if(!_7){
+_7=_7.firstChild.data;
 }
-throw new Error("Error parsing text "+nativeDoc.documentElement.firstChild.data+" \n"+_8);
+throw new Error("Error parsing text "+nativeDoc.documentElement.firstChild.data+" \n"+_7);
 }
 return _4;
 }else{
@@ -54,13 +54,13 @@ return _4;
 }else{
 if(_3.implementation&&_3.implementation.createDocument){
 if(_1&&dojo.trim(_1)&&_3.createElement){
-var _e=_3.createElement("xml");
-_e.innerHTML=_1;
-var _f=_3.implementation.createDocument("foo","",null);
-dojo.forEach(_e.childNodes,function(_10){
-_f.importNode(_10,true);
+var _8=_3.createElement("xml");
+_8.innerHTML=_1;
+var _9=_3.implementation.createDocument("foo","",null);
+dojo.forEach(_8.childNodes,function(_a){
+_9.importNode(_a,true);
 });
-return _f;
+return _9;
 }else{
 return _3.implementation.createDocument("","",null);
 }
@@ -69,66 +69,66 @@ return _3.implementation.createDocument("","",null);
 }
 return null;
 };
-dojox.xml.parser.textContent=function(_11,_12){
+dojox.xml.parser.textContent=function(_b,_c){
 if(arguments.length>1){
-var _13=_11.ownerDocument||dojo.doc;
-dojox.xml.parser.replaceChildren(_11,_13.createTextNode(_12));
-return _12;
+var _d=_b.ownerDocument||dojo.doc;
+dojox.xml.parser.replaceChildren(_b,_d.createTextNode(_c));
+return _c;
 }else{
-if(_11.textContent!==undefined){
-return _11.textContent;
+if(_b.textContent!==undefined){
+return _b.textContent;
 }
-var _14="";
-if(_11){
-dojo.forEach(_11.childNodes,function(_15){
-switch(_15.nodeType){
+var _e="";
+if(_b){
+dojo.forEach(_b.childNodes,function(_f){
+switch(_f.nodeType){
 case 1:
 case 5:
-_14+=dojox.xml.parser.textContent(_15);
+_e+=dojox.xml.parser.textContent(_f);
 break;
 case 3:
 case 2:
 case 4:
-_14+=_15.nodeValue;
+_e+=_f.nodeValue;
 }
 });
 }
-return _14;
+return _e;
 }
 };
-dojox.xml.parser.replaceChildren=function(_16,_17){
-var _18=[];
+dojox.xml.parser.replaceChildren=function(_10,_11){
+var _12=[];
 if(dojo.isIE){
-dojo.forEach(_16.childNodes,function(_19){
-_18.push(_19);
+dojo.forEach(_10.childNodes,function(_13){
+_12.push(_13);
 });
 }
-dojox.xml.parser.removeChildren(_16);
-dojo.forEach(_18,dojo.destroy);
-if(!dojo.isArray(_17)){
-_16.appendChild(_17);
+dojox.xml.parser.removeChildren(_10);
+dojo.forEach(_12,dojo.destroy);
+if(!dojo.isArray(_11)){
+_10.appendChild(_11);
 }else{
-dojo.forEach(_17,function(_1a){
-_16.appendChild(_1a);
+dojo.forEach(_11,function(_14){
+_10.appendChild(_14);
 });
 }
 };
-dojox.xml.parser.removeChildren=function(_1b){
-var _1c=_1b.childNodes.length;
-while(_1b.hasChildNodes()){
-_1b.removeChild(_1b.firstChild);
+dojox.xml.parser.removeChildren=function(_15){
+var _16=_15.childNodes.length;
+while(_15.hasChildNodes()){
+_15.removeChild(_15.firstChild);
 }
-return _1c;
+return _16;
 };
-dojox.xml.parser.innerXML=function(_1d){
-if(_1d.innerXML){
-return _1d.innerXML;
+dojox.xml.parser.innerXML=function(_17){
+if(_17.innerXML){
+return _17.innerXML;
 }else{
-if(_1d.xml){
-return _1d.xml;
+if(_17.xml){
+return _17.xml;
 }else{
 if(typeof XMLSerializer!="undefined"){
-return (new XMLSerializer()).serializeToString(_1d);
+return (new XMLSerializer()).serializeToString(_17);
 }
 }
 }
diff --git a/dojox/xml/widgetParser.js b/dojox/xml/widgetParser.js
index c070514..af8ae24 100644
--- a/dojox/xml/widgetParser.js
+++ b/dojox/xml/widgetParser.js
@@ -12,58 +12,58 @@ dojo.require("dojox.xml.parser");
 dojo.require("dojo.parser");
 dojox.xml.widgetParser=new function(){
 var d=dojo;
-this.parseNode=function(_2){
-var _3=[];
-d.query("script[type='text/xml']",_2).forEach(function(_4){
-_3.push.apply(_3,this._processScript(_4));
+this.parseNode=function(_1){
+var _2=[];
+d.query("script[type='text/xml']",_1).forEach(function(_3){
+_2.push.apply(_2,this._processScript(_3));
 },this).orphan();
-return d.parser.instantiate(_3);
+return d.parser.instantiate(_2);
 };
-this._processScript=function(_5){
-var _6=_5.src?d._getText(_5.src):_5.innerHTML||_5.firstChild.nodeValue;
-var _7=this.toHTML(dojox.xml.parser.parse(_6).firstChild);
-var _8=d.query("[dojoType]",_7);
-dojo.query(">",_7).place(_5,"before");
-_5.parentNode.removeChild(_5);
-return _8;
+this._processScript=function(_4){
+var _5=_4.src?d._getText(_4.src):_4.innerHTML||_4.firstChild.nodeValue;
+var _6=this.toHTML(dojox.xml.parser.parse(_5).firstChild);
+var _7=d.query("[dojoType]",_6);
+dojo.query(">",_6).place(_4,"before");
+_4.parentNode.removeChild(_4);
+return _7;
 };
-this.toHTML=function(_9){
-var _a;
-var _b=_9.nodeName;
+this.toHTML=function(_8){
+var _9;
+var _a=_8.nodeName;
 var dd=dojo.doc;
-var _d=_9.nodeType;
-if(_d>=3){
-return dd.createTextNode((_d==3||_d==4)?_9.nodeValue:"");
+var _b=_8.nodeType;
+if(_b>=3){
+return dd.createTextNode((_b==3||_b==4)?_8.nodeValue:"");
 }
-var _e=_9.localName||_b.split(":").pop();
-var _f=_9.namespaceURI||(_9.getNamespaceUri?_9.getNamespaceUri():"");
-if(_f=="html"){
-_a=dd.createElement(_e);
+var _c=_8.localName||_a.split(":").pop();
+var _d=_8.namespaceURI||(_8.getNamespaceUri?_8.getNamespaceUri():"");
+if(_d=="html"){
+_9=dd.createElement(_c);
 }else{
-var _10=_f+"."+_e;
-_a=_a||dd.createElement((_10=="dijit.form.ComboBox")?"select":"div");
-_a.setAttribute("dojoType",_10);
+var _e=_d+"."+_c;
+_9=_9||dd.createElement((_e=="dijit.form.ComboBox")?"select":"div");
+_9.setAttribute("dojoType",_e);
 }
-d.forEach(_9.attributes,function(_11){
-var _12=_11.name||_11.nodeName;
-var _13=_11.value||_11.nodeValue;
-if(_12.indexOf("xmlns")!=0){
-if(dojo.isIE&&_12=="style"){
-_a.style.setAttribute("cssText",_13);
+d.forEach(_8.attributes,function(_f){
+var _10=_f.name||_f.nodeName;
+var _11=_f.value||_f.nodeValue;
+if(_10.indexOf("xmlns")!=0){
+if(dojo.isIE&&_10=="style"){
+_9.style.setAttribute("cssText",_11);
 }else{
-_a.setAttribute(_12,_13);
+_9.setAttribute(_10,_11);
 }
 }
 });
-d.forEach(_9.childNodes,function(cn){
-var _15=this.toHTML(cn);
-if(_e=="script"){
-_a.text+=_15.nodeValue;
+d.forEach(_8.childNodes,function(cn){
+var _12=this.toHTML(cn);
+if(_c=="script"){
+_9.text+=_12.nodeValue;
 }else{
-_a.appendChild(_15);
+_9.appendChild(_12);
 }
 },this);
-return _a;
+return _9;
 };
 }();
 }
diff --git a/dojox/xmpp/ChatService.js b/dojox/xmpp/ChatService.js
index 9090ca7..7daa51d 100644
--- a/dojox/xmpp/ChatService.js
+++ b/dojox/xmpp/ChatService.js
@@ -85,6 +85,6 @@ _10.append(this.chatid);
 _10.append("</thread></message>");
 this.session.dispatchPacket(_10.toString());
 },onNewMessage:function(msg){
-},onInvite:function(_12){
+},onInvite:function(_11){
 }});
 }
diff --git a/dojox/xmpp/PresenceService.js b/dojox/xmpp/PresenceService.js
index ebb909d..c3d12c7 100644
--- a/dojox/xmpp/PresenceService.js
+++ b/dojox/xmpp/PresenceService.js
@@ -38,92 +38,92 @@ return;
 if(this.isInvisible){
 this._setVisible();
 }
-var _6=new dojox.string.Builder(dojox.xmpp.util.createElement("presence",p,false));
+var _5=new dojox.string.Builder(dojox.xmpp.util.createElement("presence",p,false));
 if(_4.show&&_4.show!=dojox.xmpp.presence.STATUS_OFFLINE){
-_6.append(dojox.xmpp.util.createElement("show",{},false));
-_6.append(_4.show);
-_6.append("</show>");
+_5.append(dojox.xmpp.util.createElement("show",{},false));
+_5.append(_4.show);
+_5.append("</show>");
 }
 if(_4.status){
-_6.append(dojox.xmpp.util.createElement("status",{},false));
-_6.append(_4.status);
-_6.append("</status>");
+_5.append(dojox.xmpp.util.createElement("status",{},false));
+_5.append(_4.status);
+_5.append("</status>");
 }
 if(this.avatarHash){
-_6.append(dojox.xmpp.util.createElement("x",{xmlns:"vcard-temp:x:update"},false));
-_6.append(dojox.xmpp.util.createElement("photo",{},false));
-_6.append(this.avatarHash);
-_6.append("</photo>");
-_6.append("</x>");
+_5.append(dojox.xmpp.util.createElement("x",{xmlns:"vcard-temp:x:update"},false));
+_5.append(dojox.xmpp.util.createElement("photo",{},false));
+_5.append(this.avatarHash);
+_5.append("</photo>");
+_5.append("</x>");
 }
 if(_4.priority&&_4.show!=dojox.xmpp.presence.STATUS_OFFLINE){
 if(_4.priority>127||_4.priority<-128){
 _4.priority=5;
 }
-_6.append(dojox.xmpp.util.createElement("priority",{},false));
-_6.append(_4.priority);
-_6.append("</priority>");
+_5.append(dojox.xmpp.util.createElement("priority",{},false));
+_5.append(_4.priority);
+_5.append("</priority>");
 }
-_6.append("</presence>");
-this.session.dispatchPacket(_6.toString());
-},toggleBlockContact:function(_7){
-if(!this.restrictedContactjids[_7]){
-this.restrictedContactjids[_7]=this._createRestrictedJid();
+_5.append("</presence>");
+this.session.dispatchPacket(_5.toString());
+},toggleBlockContact:function(_6){
+if(!this.restrictedContactjids[_6]){
+this.restrictedContactjids[_6]=this._createRestrictedJid();
 }
-this.restrictedContactjids[_7].blocked=!this.restrictedContactjids[_7].blocked;
+this.restrictedContactjids[_6].blocked=!this.restrictedContactjids[_6].blocked;
 this._updateRestricted();
 return this.restrictedContactjids;
-},toggleContactInvisiblity:function(_8){
-if(!this.restrictedContactjids[_8]){
-this.restrictedContactjids[_8]=this._createRestrictedJid();
+},toggleContactInvisiblity:function(_7){
+if(!this.restrictedContactjids[_7]){
+this.restrictedContactjids[_7]=this._createRestrictedJid();
 }
-this.restrictedContactjids[_8].invisible=!this.restrictedContactjids[_8].invisible;
+this.restrictedContactjids[_7].invisible=!this.restrictedContactjids[_7].invisible;
 this._updateRestricted();
 return this.restrictedContactjids;
 },_createRestrictedJid:function(){
 return {invisible:false,blocked:false};
 },_updateRestricted:function(){
-var _9={id:this.session.getNextIqId(),from:this.session.jid+"/"+this.session.resource,type:"set"};
-var _a=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_9,false));
-_a.append(dojox.xmpp.util.createElement("query",{xmlns:"jabber:iq:privacy"},false));
-_a.append(dojox.xmpp.util.createElement("list",{name:"iwcRestrictedContacts"},false));
-var _b=1;
-for(var _c in this.restrictedContactjids){
-var _d=this.restrictedContactjids[_c];
-if(_d.blocked||_d.invisible){
-_a.append(dojox.xmpp.util.createElement("item",{value:dojox.xmpp.util.encodeJid(_c),action:"deny",order:_b++},false));
-if(_d.blocked){
-_a.append(dojox.xmpp.util.createElement("message",{},true));
-}
-if(_d.invisible){
-_a.append(dojox.xmpp.util.createElement("presence-out",{},true));
-}
-_a.append("</item>");
+var _8={id:this.session.getNextIqId(),from:this.session.jid+"/"+this.session.resource,type:"set"};
+var _9=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_8,false));
+_9.append(dojox.xmpp.util.createElement("query",{xmlns:"jabber:iq:privacy"},false));
+_9.append(dojox.xmpp.util.createElement("list",{name:"iwcRestrictedContacts"},false));
+var _a=1;
+for(var _b in this.restrictedContactjids){
+var _c=this.restrictedContactjids[_b];
+if(_c.blocked||_c.invisible){
+_9.append(dojox.xmpp.util.createElement("item",{value:dojox.xmpp.util.encodeJid(_b),action:"deny",order:_a++},false));
+if(_c.blocked){
+_9.append(dojox.xmpp.util.createElement("message",{},true));
+}
+if(_c.invisible){
+_9.append(dojox.xmpp.util.createElement("presence-out",{},true));
+}
+_9.append("</item>");
 }else{
-delete this.restrictedContactjids[_c];
-}
-}
-_a.append("</list>");
-_a.append("</query>");
-_a.append("</iq>");
-var _e=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_9,false));
-_e.append(dojox.xmpp.util.createElement("query",{xmlns:"jabber:iq:privacy"},false));
-_e.append(dojox.xmpp.util.createElement("active",{name:"iwcRestrictedContacts"},true));
-_e.append("</query>");
-_e.append("</iq>");
-this.session.dispatchPacket(_a.toString());
-this.session.dispatchPacket(_e.toString());
+delete this.restrictedContactjids[_b];
+}
+}
+_9.append("</list>");
+_9.append("</query>");
+_9.append("</iq>");
+var _d=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_8,false));
+_d.append(dojox.xmpp.util.createElement("query",{xmlns:"jabber:iq:privacy"},false));
+_d.append(dojox.xmpp.util.createElement("active",{name:"iwcRestrictedContacts"},true));
+_d.append("</query>");
+_d.append("</iq>");
+this.session.dispatchPacket(_9.toString());
+this.session.dispatchPacket(_d.toString());
 },_setVisible:function(){
-var _f={id:this.session.getNextIqId(),from:this.session.jid+"/"+this.session.resource,type:"set"};
-var req=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_f,false));
-req.append(dojox.xmpp.util.createElement("query",{xmlns:"jabber:iq:privacy"},false));
-req.append(dojox.xmpp.util.createElement("active",{},true));
-req.append("</query>");
-req.append("</iq>");
-this.session.dispatchPacket(req.toString());
+var _e={id:this.session.getNextIqId(),from:this.session.jid+"/"+this.session.resource,type:"set"};
+var _f=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_e,false));
+_f.append(dojox.xmpp.util.createElement("query",{xmlns:"jabber:iq:privacy"},false));
+_f.append(dojox.xmpp.util.createElement("active",{},true));
+_f.append("</query>");
+_f.append("</iq>");
+this.session.dispatchPacket(_f.toString());
 },_setInvisible:function(){
-var _11={id:this.session.getNextIqId(),from:this.session.jid+"/"+this.session.resource,type:"set"};
-var req=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_11,false));
+var _10={id:this.session.getNextIqId(),from:this.session.jid+"/"+this.session.resource,type:"set"};
+var req=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_10,false));
 req.append(dojox.xmpp.util.createElement("query",{xmlns:"jabber:iq:privacy"},false));
 req.append(dojox.xmpp.util.createElement("list",{name:"invisible"},false));
 req.append(dojox.xmpp.util.createElement("item",{action:"deny",order:"1"},false));
@@ -132,32 +132,32 @@ req.append("</item>");
 req.append("</list>");
 req.append("</query>");
 req.append("</iq>");
-_11={id:this.session.getNextIqId(),from:this.session.jid+"/"+this.session.resource,type:"set"};
-var _13=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_11,false));
-_13.append(dojox.xmpp.util.createElement("query",{xmlns:"jabber:iq:privacy"},false));
-_13.append(dojox.xmpp.util.createElement("active",{name:"invisible"},true));
-_13.append("</query>");
-_13.append("</iq>");
+_10={id:this.session.getNextIqId(),from:this.session.jid+"/"+this.session.resource,type:"set"};
+var _11=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_10,false));
+_11.append(dojox.xmpp.util.createElement("query",{xmlns:"jabber:iq:privacy"},false));
+_11.append(dojox.xmpp.util.createElement("active",{name:"invisible"},true));
+_11.append("</query>");
+_11.append("</iq>");
 this.session.dispatchPacket(req.toString());
-this.session.dispatchPacket(_13.toString());
-},_manageSubscriptions:function(_14,_15){
-if(!_14){
+this.session.dispatchPacket(_11.toString());
+},_manageSubscriptions:function(_12,_13){
+if(!_12){
 return;
 }
-if(_14.indexOf("@")==-1){
-_14+="@"+this.session.domain;
+if(_12.indexOf("@")==-1){
+_12+="@"+this.session.domain;
 }
-var req=dojox.xmpp.util.createElement("presence",{to:_14,type:_15},true);
+var req=dojox.xmpp.util.createElement("presence",{to:_12,type:_13},true);
 this.session.dispatchPacket(req);
-},subscribe:function(_17){
-this._manageSubscriptions(_17,"subscribe");
-},approveSubscription:function(_18){
-this._manageSubscriptions(_18,"subscribed");
-},unsubscribe:function(_19){
-this._manageSubscriptions(_19,"unsubscribe");
-},declineSubscription:function(_1a){
-this._manageSubscriptions(_1a,"unsubscribed");
-},cancelSubscription:function(_1b){
-this._manageSubscriptions(_1b,"unsubscribed");
+},subscribe:function(_14){
+this._manageSubscriptions(_14,"subscribe");
+},approveSubscription:function(_15){
+this._manageSubscriptions(_15,"subscribed");
+},unsubscribe:function(_16){
+this._manageSubscriptions(_16,"unsubscribe");
+},declineSubscription:function(_17){
+this._manageSubscriptions(_17,"unsubscribed");
+},cancelSubscription:function(_18){
+this._manageSubscriptions(_18,"unsubscribed");
 }});
 }
diff --git a/dojox/xmpp/README b/dojox/xmpp/README
index 322cce2..f4e8856 100644
--- a/dojox/xmpp/README
+++ b/dojox/xmpp/README
@@ -13,6 +13,7 @@ Credits
 	Dustin Machi
 	Jason Cline
 	Revin Guillen
+	Mike Wilcox - updates
 -------------------------------------------------------------------------------
 Project description
 
@@ -29,4 +30,26 @@ FIXME
 -------------------------------------------------------------------------------
 Installation instructions
 
-FIXME
+To use the XMPP test, you should have the appropriate server installed on your
+machine. We reccomend Openfire, a real time collaboration server licensed under
+the Open Source GPL.:
+http://www.igniterealtime.org/projects/openfire/index.jsp
+
+It's very easy to install. Download the version for your machine and launch the installer.
+After installation is complete, server settings are made at:
+http://127.0.0.1:9090/index.jsp
+
+The settings for the most part are those that suggest the easiest for setup. The main setting
+you need to notice is HTTP Binding. This needs to be enabled at port 7070. Also enable
+Script Syntax for BOSH clients.
+
+Next go to the top tabs to Users/Groups and create a user or two. It gives you the option to make
+a user the Admin - this will overwrite the current Admin.
+
+Now you can launch test_xmppService.html. In the login, use the user ID and password from one of
+the users you just created. I used my computer name for Domain, but I'm not sure what this does.
+Finally, in HTTP-Bind URL, use the address for Openfire, with the HTTP Bind port of 7070:
+http://127.0.0.1:7070/http-bind/
+
+You can open another tab in Firefox and log in as a second user.
+
diff --git a/dojox/xmpp/RosterService.js b/dojox/xmpp/RosterService.js
index 3b61c95..9d1f523 100644
--- a/dojox/xmpp/RosterService.js
+++ b/dojox/xmpp/RosterService.js
@@ -32,42 +32,42 @@ _7.append("</group>");
 }
 }
 _7.append("</item></query></iq>");
-var _9=this.session.dispatchPacket(_7.toString(),"iq",_6.id);
-_9.addCallback(this,"verifyRoster");
-return _9;
-},updateRosterItem:function(_a,_b,_c){
-if(_a.indexOf("@")==-1){
-_a+=_a+"@"+this.session.domain;
-}
-var _d={id:this.session.getNextIqId(),from:this.session.jid+"/"+this.session.resource,type:"set"};
-var _e=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_d,false));
-_e.append(dojox.xmpp.util.createElement("query",{xmlns:"jabber:iq:roster"},false));
-var i=this.session.getRosterIndex(_a);
+var _8=this.session.dispatchPacket(_7.toString(),"iq",_6.id);
+_8.addCallback(this,"verifyRoster");
+return _8;
+},updateRosterItem:function(_9,_a,_b){
+if(_9.indexOf("@")==-1){
+_9+=_9+"@"+this.session.domain;
+}
+var _c={id:this.session.getNextIqId(),from:this.session.jid+"/"+this.session.resource,type:"set"};
+var _d=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_c,false));
+_d.append(dojox.xmpp.util.createElement("query",{xmlns:"jabber:iq:roster"},false));
+var i=this.session.getRosterIndex(_9);
 if(i==-1){
 return;
 }
-var _10={jid:_a};
-if(_b){
-_10.name=_b;
+var _e={jid:_9};
+if(_a){
+_e.name=_a;
 }else{
 if(this.session.roster[i].name){
-_10.name=this.session.roster[i].name;
+_e.name=this.session.roster[i].name;
 }
 }
-if(_10.name){
-_10.name=dojox.xmpp.util.xmlEncode(_10.name);
+if(_e.name){
+_e.name=dojox.xmpp.util.xmlEncode(_e.name);
 }
-_e.append(dojox.xmpp.util.createElement("item",_10,false));
-var _11=_c?_c:this.session.roster[i].groups;
-if(_11){
-for(var x=0;x<_11.length;x++){
-_e.append("<group>");
-_e.append(_11[x]);
-_e.append("</group>");
+_d.append(dojox.xmpp.util.createElement("item",_e,false));
+var _f=_b?_b:this.session.roster[i].groups;
+if(_f){
+for(var x=0;x<_f.length;x++){
+_d.append("<group>");
+_d.append(_f[x]);
+_d.append("</group>");
 }
 }
-_e.append("</item></query></iq>");
-var def=this.session.dispatchPacket(_e.toString(),"iq",_d.id);
+_d.append("</item></query></iq>");
+var def=this.session.dispatchPacket(_d.toString(),"iq",_c.id);
 def.addCallback(this,"verifyRoster");
 return def;
 },verifyRoster:function(res){
@@ -77,133 +77,133 @@ var err=this.session.processXmppError(res);
 this.onAddRosterItemFailed(err);
 }
 return res;
-},addRosterItemToGroup:function(jid,_17){
+},addRosterItemToGroup:function(jid,_10){
 if(!jid){
 throw new Error("Roster::addRosterItemToGroup() JID is null or undefined");
 }
-if(!_17){
+if(!_10){
 throw new Error("Roster::addRosterItemToGroup() group is null or undefined");
 }
-var _18=this.session.getRosterIndex(jid);
-if(_18==-1){
+var _11=this.session.getRosterIndex(jid);
+if(_11==-1){
 return;
 }
-var _19=this.session.roster[_18];
-var _1a=[];
-var _1b=false;
-for(var i=0;((_19<_19.groups.length)&&(!_1b));i++){
-if(_19.groups[i]!=_17){
+var _12=this.session.roster[_11];
+var _13=[];
+var _14=false;
+for(var i=0;((_12<_12.groups.length)&&(!_14));i++){
+if(_12.groups[i]!=_10){
 continue;
 }
-_1b=true;
+_14=true;
 }
-if(!_1b){
-return this.updateRosterItem(jid,_19.name,_19.groups.concat(_17),_18);
+if(!_14){
+return this.updateRosterItem(jid,_12.name,_12.groups.concat(_10),_11);
 }
 return dojox.xmpp.xmpp.INVALID_ID;
-},removeRosterGroup:function(_1d){
-var _1e=this.session.roster;
-for(var i=0;i<_1e.length;i++){
-var _20=_1e[i];
-if(_20.groups.length>0){
-for(var j=0;j<_20.groups.length;j++){
-if(_20.groups[j]==_1d){
-_20.groups.splice(j,1);
-this.updateRosterItem(_20.jid,_20.name,_20.groups);
+},removeRosterGroup:function(_15){
+var _16=this.session.roster;
+for(var i=0;i<_16.length;i++){
+var _17=_16[i];
+if(_17.groups.length>0){
+for(var j=0;j<_17.groups.length;j++){
+if(_17.groups[j]==_15){
+_17.groups.splice(j,1);
+this.updateRosterItem(_17.jid,_17.name,_17.groups);
 }
 }
 }
 }
-},renameRosterGroup:function(_22,_23){
-var _24=this.session.roster;
-for(var i=0;i<_24.length;i++){
-var _26=_24[i];
-if(_26.groups.length>0){
-for(var j=0;j<_26.groups.length;j++){
-if(_26.groups[j]==_22){
-_26.groups[j]=_23;
-this.updateRosterItem(_26.jid,_26.name,_26.groups);
+},renameRosterGroup:function(_18,_19){
+var _1a=this.session.roster;
+for(var i=0;i<_1a.length;i++){
+var _1b=_1a[i];
+if(_1b.groups.length>0){
+for(var j=0;j<_1b.groups.length;j++){
+if(_1b.groups[j]==_18){
+_1b.groups[j]=_19;
+this.updateRosterItem(_1b.jid,_1b.name,_1b.groups);
 }
 }
 }
 }
-},removeRosterItemFromGroup:function(jid,_29){
+},removeRosterItemFromGroup:function(jid,_1c){
 if(!jid){
 throw new Error("Roster::addRosterItemToGroup() JID is null or undefined");
 }
-if(!_29){
+if(!_1c){
 throw new Error("Roster::addRosterItemToGroup() group is null or undefined");
 }
-var _2a=this.session.getRosterIndex(jid);
-if(_2a==-1){
+var _1d=this.session.getRosterIndex(jid);
+if(_1d==-1){
 return;
 }
-var _2b=this.session.roster[_2a];
-var _2c=false;
-for(var i=0;((i<_2b.groups.length)&&(!_2c));i++){
-if(_2b.groups[i]!=_29){
+var _1e=this.session.roster[_1d];
+var _1f=false;
+for(var i=0;((i<_1e.groups.length)&&(!_1f));i++){
+if(_1e.groups[i]!=_1c){
 continue;
 }
-_2c=true;
-_2a=i;
+_1f=true;
+_1d=i;
 }
-if(_2c==true){
-_2b.groups.splice(_2a,1);
-return this.updateRosterItem(jid,_2b.name,_2b.groups);
+if(_1f==true){
+_1e.groups.splice(_1d,1);
+return this.updateRosterItem(jid,_1e.name,_1e.groups);
 }
 return dojox.xmpp.xmpp.INVALID_ID;
-},rosterItemRenameGroup:function(jid,_2f,_30){
+},rosterItemRenameGroup:function(jid,_20,_21){
 if(!jid){
 throw new Error("Roster::rosterItemRenameGroup() JID is null or undefined");
 }
-if(!_30){
+if(!_21){
 throw new Error("Roster::rosterItemRenameGroup() group is null or undefined");
 }
-var _31=this.session.getRosterIndex(jid);
-if(_31==-1){
+var _22=this.session.getRosterIndex(jid);
+if(_22==-1){
 return;
 }
-var _32=this.session.roster[_31];
-var _33=false;
-for(var i=0;((i<_32.groups.length)&&(!_33));i++){
-if(_32.groups[i]==_2f){
-_32.groups[i]=_30;
-_33=true;
+var _23=this.session.roster[_22];
+var _24=false;
+for(var i=0;((i<_23.groups.length)&&(!_24));i++){
+if(_23.groups[i]==_20){
+_23.groups[i]=_21;
+_24=true;
 }
 }
-if(_33==true){
-return this.updateRosterItem(jid,_32.name,_32.groups);
+if(_24==true){
+return this.updateRosterItem(jid,_23.name,_23.groups);
 }
 return dojox.xmpp.xmpp.INVALID_ID;
-},renameRosterItem:function(jid,_36){
+},renameRosterItem:function(jid,_25){
 if(!jid){
 throw new Error("Roster::addRosterItemToGroup() JID is null or undefined");
 }
-if(!_36){
+if(!_25){
 throw new Error("Roster::addRosterItemToGroup() New Name is null or undefined");
 }
-var _37=this.session.getRosterIndex(jid);
-if(_37==-1){
+var _26=this.session.getRosterIndex(jid);
+if(_26==-1){
 return;
 }
-return this.updateRosterItem(jid,_36,this.session.roster.groups,_37);
+return this.updateRosterItem(jid,_25,this.session.roster.groups,_26);
 },removeRosterItem:function(jid){
 if(!jid){
 throw new Error("Roster::addRosterItemToGroup() JID is null or undefined");
 }
 var req={id:this.session.getNextIqId(),from:this.session.jid+"/"+this.session.resource,type:"set"};
-var _3a=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",req,false));
-_3a.append(dojox.xmpp.util.createElement("query",{xmlns:"jabber:iq:roster"},false));
+var _27=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",req,false));
+_27.append(dojox.xmpp.util.createElement("query",{xmlns:"jabber:iq:roster"},false));
 if(jid.indexOf("@")==-1){
 jid+=jid+"@"+this.session.domain;
 }
-_3a.append(dojox.xmpp.util.createElement("item",{jid:jid,subscription:"remove"},true));
-_3a.append("</query></iq>");
-var def=this.session.dispatchPacket(_3a.toString(),"iq",req.id);
+_27.append(dojox.xmpp.util.createElement("item",{jid:jid,subscription:"remove"},true));
+_27.append("</query></iq>");
+var def=this.session.dispatchPacket(_27.toString(),"iq",req.id);
 def.addCallback(this,"verifyRoster");
 return def;
 },getAvatar:function(jid){
-},publishAvatar:function(_3d,_3e){
+},publishAvatar:function(_28,_29){
 },onVerifyRoster:function(id){
 },onVerifyRosterFailed:function(err){
 }});
diff --git a/dojox/xmpp/TransportSession.js b/dojox/xmpp/TransportSession.js
index 77c0256..8eb7da8 100644
--- a/dojox/xmpp/TransportSession.js
+++ b/dojox/xmpp/TransportSession.js
@@ -8,11 +8,11 @@
 if(!dojo._hasResource["dojox.xmpp.TransportSession"]){
 dojo._hasResource["dojox.xmpp.TransportSession"]=true;
 dojo.provide("dojox.xmpp.TransportSession");
+dojo.require("dojox.xmpp.bosh");
 dojo.require("dojox.xmpp.util");
-dojo.require("dojo.io.script");
-dojo.require("dojo.io.iframe");
 dojo.require("dojox.data.dom");
 dojox.xmpp.TransportSession=function(_1){
+this.sendTimeout=(this.wait+20)*1000;
 if(_1&&dojo.isObject(_1)){
 dojo.mixin(this,_1);
 if(this.useScriptSrcTransport){
@@ -20,13 +20,7 @@ this.transportIframes=[];
 }
 }
 };
-dojox.xmpp.TransportSession._iframeOnload=function(_2){
-var _3=dojo.io.iframe.doc(dojo.byId("xmpp-transport-"+_2));
-_3.write("<script>var isLoaded=true; var rid=0; var transmiting=false; function _BOSH_(msg) { transmiting=false; parent.dojox.xmpp.TransportSession.handleBOSH(msg, rid); } </script>");
-};
-dojox.xmpp.TransportSession.handleBOSH=function(_4,_5){
-};
-dojo.extend(dojox.xmpp.TransportSession,{rid:0,hold:1,polling:1000,secure:false,wait:60,lang:"en",submitContentType:"text/xml; charset=utf=8",serviceUrl:"/httpbind",defaultResource:"dojoIm",domain:"imserver.com",sendTimeout:(this.wait+20)*1000,useScriptSrcTransport:false,keepAliveTimer:null,state:"NotReady",transmitState:"Idle",protocolPacketQueue:[],outboundQueue:[],outboundRequests:{},inboundQueue:[],deferredRequests:{},matchTypeIdAttribute:{},open:function(){
+dojo.extend(dojox.xmpp.TransportSession,{rid:0,hold:1,polling:1000,secure:false,wait:60,lang:"en",submitContentType:"text/xml; charset=utf=8",serviceUrl:"/httpbind",defaultResource:"dojoIm",domain:"imserver.com",sendTimeout:0,useScriptSrcTransport:false,keepAliveTimer:null,state:"NotReady",transmitState:"Idle",protocolPacketQueue:[],outboundQueue:[],outboundRequests:{},inboundQueue:[],deferredRequests:{},matchTypeIdAttribute:{},open:function(){
 this.status="notReady";
 this.rid=Math.round(Math.random()*1000000000);
 this.protocolPacketQueue=[];
@@ -37,27 +31,26 @@ this.deferredRequests={};
 this.matchTypeIdAttribute={};
 this.keepAliveTimer=setTimeout(dojo.hitch(this,"_keepAlive"),10000);
 if(this.useScriptSrcTransport){
-dojo.connect(dojox.xmpp.TransportSession,"handleBOSH",this,"processScriptSrc");
-this.transportIframes=[];
-for(var i=0;i<=this.hold;i++){
-var _7=dojo.io.iframe.create("xmpp-transport-"+i,dojox._scopeName+".xmpp.TransportSession._iframeOnload("+i+");");
-this.transportIframes.push(_7);
-if(i==0){
-dojo.connect(_7,"onload",this,"_sendLogin");
-}
-}
+dojox.xmpp.bosh.initialize({iframes:this.hold+1,load:dojo.hitch(this,function(){
+this._sendLogin();
+})});
 }else{
 this._sendLogin();
 }
 },_sendLogin:function(){
-var _8=this.rid++;
-var _9={content:this.submitContentType,hold:this.hold,rid:_8,to:this.domain,secure:this.secure,wait:this.wait,"xml:lang":this.lang,xmlns:dojox.xmpp.xmpp.BODY_NS};
-var _a=dojox.xmpp.util.createElement("body",_9,true);
-this.addToOutboundQueue(_a,_8);
-},processScriptSrc:function(_b,_c){
-var _d=dojox.data.dom.createDocument(_b,"text/xml");
-if(_d){
-this.processDocument(_d,_c);
+var _2=this.rid++;
+var _3={content:this.submitContentType,hold:this.hold,rid:_2,to:this.domain,secure:this.secure,wait:this.wait,"xml:lang":this.lang,"xmpp:version":"1.0",xmlns:dojox.xmpp.xmpp.BODY_NS,"xmlns:xmpp":"urn:xmpp:xbosh"};
+var _4=dojox.xmpp.util.createElement("body",_3,true);
+this.addToOutboundQueue(_4,_2);
+},_sendRestart:function(){
+var _5=this.rid++;
+var _6={rid:_5,sid:this.sid,to:this.domain,"xmpp:restart":"true","xml:lang":this.lang,xmlns:dojox.xmpp.xmpp.BODY_NS,"xmlns:xmpp":"urn:xmpp:xbosh"};
+var _7=dojox.xmpp.util.createElement("body",_6,true);
+this.addToOutboundQueue(_7,_5);
+},processScriptSrc:function(_8,_9){
+var _a=dojox.xml.parser.parse(_8,"text/xml");
+if(_a){
+this.processDocument(_a,_9);
 }else{
 }
 },_keepAlive:function(){
@@ -66,30 +59,30 @@ return;
 }
 this._dispatchPacket();
 this.keepAliveTimer=setTimeout(dojo.hitch(this,"_keepAlive"),10000);
-},close:function(_e){
-var _f=this.rid++;
-var req={sid:this.sid,rid:_f,type:"terminate"};
-var _11=null;
-if(_e){
-_11=new dojox.string.Builder(dojox.xmpp.util.createElement("body",req,false));
-_11.append(_e);
-_11.append("</body>");
+},close:function(_b){
+var _c=this.rid++;
+var _d={sid:this.sid,rid:_c,type:"terminate"};
+var _e=null;
+if(_b){
+_e=new dojox.string.Builder(dojox.xmpp.util.createElement("body",_d,false));
+_e.append(_b);
+_e.append("</body>");
 }else{
-_11=new dojox.string.Builder(dojox.xmpp.util.createElement("body",req,false));
+_e=new dojox.string.Builder(dojox.xmpp.util.createElement("body",_d,false));
 }
-this.addToOutboundQueue(_11.toString(),_f);
+this.addToOutboundQueue(_e.toString(),_c);
 this.state=="Terminate";
-},dispatchPacket:function(msg,_13,_14,_15){
-if(msg){
-this.protocolPacketQueue.push(msg);
+},dispatchPacket:function(_f,_10,_11,_12){
+if(_f){
+this.protocolPacketQueue.push(_f);
 }
 var def=new dojo.Deferred();
-if(_13&&_14){
-def.protocolMatchType=_13;
-def.matchId=_14;
-def.matchProperty=_15||"id";
+if(_10&&_11){
+def.protocolMatchType=_10;
+def.matchId=_11;
+def.matchProperty=_12||"id";
 if(def.matchProperty!="id"){
-this.matchTypeIdAttribute[_13]=def.matchProperty;
+this.matchTypeIdAttribute[_10]=def.matchProperty;
 }
 }
 this.deferredRequests[def.protocolMatchType+"-"+def.matchId]=def;
@@ -101,11 +94,9 @@ return def;
 clearTimeout(this.dispatchTimer);
 delete this.dispatchTimer;
 if(!this.sid){
-
 return;
 }
 if(!this.authId){
-
 return;
 }
 if(this.transmitState!="error"&&(this.protocolPacketQueue.length==0)&&(this.outboundQueue.length>0)){
@@ -114,12 +105,13 @@ return;
 if(this.state=="wait"||this.isTerminated()){
 return;
 }
-var req={sid:this.sid};
+var req={sid:this.sid,xmlns:dojox.xmpp.xmpp.BODY_NS};
+var _13;
 if(this.protocolPacketQueue.length>0){
 req.rid=this.rid++;
-var _18=new dojox.string.Builder(dojox.xmpp.util.createElement("body",req,false));
-_18.append(this.processProtocolPacketQueue());
-_18.append("</body>");
+_13=new dojox.string.Builder(dojox.xmpp.util.createElement("body",req,false));
+_13.append(this.processProtocolPacketQueue());
+_13.append("</body>");
 delete this.lastPollTime;
 }else{
 if(this.lastPollTime){
@@ -131,9 +123,9 @@ return;
 }
 req.rid=this.rid++;
 this.lastPollTime=new Date().getTime();
-var _18=new dojox.string.Builder(dojox.xmpp.util.createElement("body",req,true));
+_13=new dojox.string.Builder(dojox.xmpp.util.createElement("body",req,true));
 }
-this.addToOutboundQueue(_18.toString(),req.rid);
+this.addToOutboundQueue(_13.toString(),req.rid);
 },redispatchPacket:function(rid){
 var env=this.outboundRequests[rid];
 this.sendXml(env,rid);
@@ -150,58 +142,50 @@ break;
 }
 delete this.outboundRequests[rid];
 },processProtocolPacketQueue:function(){
-var _20=new dojox.string.Builder();
+var _14=new dojox.string.Builder();
 for(var i=0;i<this.protocolPacketQueue.length;i++){
-_20.append(this.protocolPacketQueue[i]);
+_14.append(this.protocolPacketQueue[i]);
 }
 this.protocolPacketQueue=[];
-return _20.toString();
-},findOpenIframe:function(){
-for(var i=0;i<this.transportIframes.length;i++){
-var _23=this.transportIframes[i];
-var win=_23.contentWindow;
-if(win.isLoaded&&!win.transmiting){
-return _23;
-}
-}
-},sendXml:function(_25,rid){
+return _14.toString();
+},sendXml:function(_15,rid){
 if(this.isTerminated()){
-return;
+return false;
 }
 this.transmitState="transmitting";
+var def=null;
 if(this.useScriptSrcTransport){
-var _27=this.findOpenIframe();
-var _28=dojo.io.iframe.doc(_27);
-_27.contentWindow.rid=rid;
-_27.contentWindow.transmiting=true;
-dojo.io.script.attach("rid-"+rid,this.serviceUrl+"?"+encodeURIComponent(_25),_28);
+def=dojox.xmpp.bosh.get({rid:rid,url:this.serviceUrl+"?"+encodeURIComponent(_15),error:dojo.hitch(this,function(res,io){
+this.setState("Terminate","error");
+return false;
+}),timeout:this.sendTimeout});
 }else{
-var def=dojo.rawXhrPost({contentType:"text/xml",url:this.serviceUrl,postData:_25,handleAs:"xml",error:dojo.hitch(this,function(res,io){
+def=dojo.rawXhrPost({contentType:"text/xml",url:this.serviceUrl,postData:_15,handleAs:"xml",error:dojo.hitch(this,function(res,io){
 return this.processError(io.xhr.responseXML,io.xhr.status,rid);
 }),timeout:this.sendTimeout});
+}
 def.addCallback(this,function(res){
 return this.processDocument(res,rid);
 });
 return def;
-}
 },processDocument:function(doc,rid){
-if(this.isTerminated()){
-return;
+if(this.isTerminated()||!doc.firstChild){
+return false;
 }
 this.transmitState="idle";
-var _2f=doc.firstChild;
-if(_2f.nodeName!="body"){
+var _16=doc.firstChild;
+if(_16.nodeName!="body"){
 }
 if(this.outboundQueue.length<1){
-return;
+return false;
 }
-var _30=this.outboundQueue[0]["rid"];
-if(rid==_30){
+var _17=this.outboundQueue[0]["rid"];
+if(rid==_17){
 this.removeFromOutboundQueue(rid);
-this.processResponse(_2f,rid);
+this.processResponse(_16,rid);
 this.processInboundQueue();
 }else{
-var gap=rid-_30;
+var gap=rid-_17;
 if(gap<this.hold+2){
 this.addToInboundQueue(doc,rid);
 }else{
@@ -210,8 +194,8 @@ this.addToInboundQueue(doc,rid);
 return doc;
 },processInboundQueue:function(){
 while(this.inboundQueue.length>0){
-var _32=this.inboundQueue.shift();
-this.processDocument(_32["doc"],_32["rid"]);
+var _18=this.inboundQueue.shift();
+this.processDocument(_18["doc"],_18["rid"]);
 }
 },addToInboundQueue:function(doc,rid){
 for(var i=0;i<this.inboundQueue.length;i++){
@@ -220,39 +204,39 @@ continue;
 }
 this.inboundQueue.splice(i,0,{doc:doc,rid:rid});
 }
-},processResponse:function(_36,rid){
-if(_36.getAttribute("type")=="terminate"){
-var _38=_36.firstChild.firstChild;
-var _39="";
-if(_38.nodeName=="conflict"){
-_39="conflict";
+},processResponse:function(_19,rid){
+if(_19.getAttribute("type")=="terminate"){
+var _1a=_19.firstChild.firstChild;
+var _1b="";
+if(_1a.nodeName=="conflict"){
+_1b="conflict";
 }
-this.setState("Terminate",_39);
+this.setState("Terminate",_1b);
 return;
 }
 if((this.state!="Ready")&&(this.state!="Terminate")){
-var sid=_36.getAttribute("sid");
+var sid=_19.getAttribute("sid");
 if(sid){
 this.sid=sid;
 }else{
 throw new Error("No sid returned during xmpp session startup");
 }
-this.authId=_36.getAttribute("authid");
+this.authId=_19.getAttribute("authid");
 if(this.authId==""){
 if(this.authRetries--<1){
 console.error("Unable to obtain Authorization ID");
 this.terminateSession();
 }
 }
-this.wait=_36.getAttribute("wait");
-if(_36.getAttribute("polling")){
-this.polling=parseInt(_36.getAttribute("polling"))*1000;
+this.wait=_19.getAttribute("wait");
+if(_19.getAttribute("polling")){
+this.polling=parseInt(_19.getAttribute("polling"))*1000;
 }
-this.inactivity=_36.getAttribute("inactivity");
+this.inactivity=_19.getAttribute("inactivity");
 this.setState("Ready");
 }
-dojo.forEach(_36.childNodes,function(_3b){
-this.processProtocolResponse(_3b,rid);
+dojo.forEach(_19.childNodes,function(_1c){
+this.processProtocolResponse(_1c,rid);
 },this);
 if(this.transmitState=="idle"){
 this.dispatchPacket();
@@ -265,35 +249,44 @@ if(def){
 def.callback(msg);
 delete this.deferredRequests[key];
 }
-},setState:function(_40,_41){
-if(this.state!=_40){
-if(this["on"+_40]){
-this["on"+_40](_40,this.state,_41);
+},setState:function(_1d,_1e){
+if(this.state!=_1d){
+if(this["on"+_1d]){
+this["on"+_1d](_1d,this.state,_1e);
 }
-this.state=_40;
+this.state=_1d;
 }
 },isTerminated:function(){
 return this.state=="Terminate";
-},processError:function(err,_43,rid){
+},processError:function(err,_1f,rid){
 if(this.isTerminated()){
-return;
+return false;
 }
-if(_43!=200){
-this.setState("Terminate",_45);
-return;
+if(_1f!=200){
+if(_1f>=400&&_1f<500){
+this.setState("Terminate",_20);
+return false;
+}else{
+this.removeFromOutboundQueue(rid);
+setTimeout(dojo.hitch(this,function(){
+this.dispatchPacket();
+}),200);
+return true;
+}
+return false;
 }
 if(err&&err.dojoType&&err.dojoType=="timeout"){
 }
 this.removeFromOutboundQueue(rid);
 if(err&&err.firstChild){
 if(err.firstChild.getAttribute("type")=="terminate"){
-var _46=err.firstChild.firstChild;
-var _45="";
-if(_46&&_46.nodeName=="conflict"){
-_45="conflict";
+var _21=err.firstChild.firstChild;
+var _20="";
+if(_21&&_21.nodeName=="conflict"){
+_20="conflict";
 }
-this.setState("Terminate",_45);
-return;
+this.setState("Terminate",_20);
+return false;
 }
 }
 this.transmitState="error";
@@ -301,8 +294,8 @@ setTimeout(dojo.hitch(this,function(){
 this.dispatchPacket();
 }),200);
 return true;
-},onTerminate:function(_47,_48,_49){
+},onTerminate:function(_22,_23,_24){
 },onProcessProtocolResponse:function(msg){
-},onReady:function(_4b,_4c){
+},onReady:function(_25,_26){
 }});
 }
diff --git a/dojox/xmpp/UserService.js b/dojox/xmpp/UserService.js
index 2f8bd05..ffcc744 100644
--- a/dojox/xmpp/UserService.js
+++ b/dojox/xmpp/UserService.js
@@ -42,35 +42,35 @@ this.onSetPersonalProfileFailure(_b);
 }
 }
 },onSetPersonalProfile:function(id){
-},onSetPersonalProfileFailure:function(_d){
-},_onGetPersonalProfile:function(_e){
-if(_e.getAttribute("type")=="result"){
-var _f={};
-if(_e.hasChildNodes()){
-var _10=_e.firstChild;
-if((_10.nodeName=="query")&&(_10.getAttribute("xmlns")=="jabber:iq:private")){
-var _11=_10.firstChild;
-if((_11.nodeName=="query")&&(_11.getAttributes("xmlns")=="sun:xmpp:properties")){
-for(var i=0;i<_11.childNodes.length;i++){
-var n=_11.childNodes[i];
+},onSetPersonalProfileFailure:function(_c){
+},_onGetPersonalProfile:function(_d){
+if(_d.getAttribute("type")=="result"){
+var _e={};
+if(_d.hasChildNodes()){
+var _f=_d.firstChild;
+if((_f.nodeName=="query")&&(_f.getAttribute("xmlns")=="jabber:iq:private")){
+var _10=_f.firstChild;
+if((_10.nodeName=="query")&&(_10.getAttributes("xmlns")=="sun:xmpp:properties")){
+for(var i=0;i<_10.childNodes.length;i++){
+var n=_10.childNodes[i];
 if(n.nodeName=="property"){
-var _14=n.getAttribute("name");
+var _11=n.getAttribute("name");
 var val=n.firstChild||"";
-_f[_14]=val;
+_e[_11]=val;
 }
 }
 }
 }
-this.onGetPersonalProfile(_f);
+this.onGetPersonalProfile(_e);
 }
 }else{
-if(_e.getAttribute("type")=="error"){
-var err=this.session.processXmppError(_e);
+if(_d.getAttribute("type")=="error"){
+var err=this.session.processXmppError(_d);
 this.onGetPersonalProfileFailure(err);
 }
 }
-return _e;
-},onGetPersonalProfile:function(_17){
+return _d;
+},onGetPersonalProfile:function(_12){
 },onGetPersonalProfileFailure:function(err){
 }});
 }
diff --git a/dojox/xmpp/bosh.js b/dojox/xmpp/bosh.js
new file mode 100644
index 0000000..98284bb
--- /dev/null
+++ b/dojox/xmpp/bosh.js
@@ -0,0 +1,132 @@
+/*
+	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
+	Available via Academic Free License >= 2.1 OR the modified BSD license.
+	see: http://dojotoolkit.org/license for details
+*/
+
+
+if(!dojo._hasResource["dojox.xmpp.bosh"]){
+dojo._hasResource["dojox.xmpp.bosh"]=true;
+dojo.provide("dojox.xmpp.bosh");
+dojo.require("dojo.io.script");
+dojo.require("dojo.io.iframe");
+dojo.require("dojox.xml.parser");
+dojox.xmpp.bosh={transportIframes:[],initialize:function(_1){
+this.transportIframes=[];
+var _2=dojox._scopeName+".xmpp.bosh";
+var c=dojo.connect(dojo.getObject(_2),"_iframeOnload",this,function(_3){
+if(_3==0){
+_1.load();
+dojo.disconnect(c);
+}
+});
+for(var i=0;i<_1.iframes;i++){
+var _4="xmpp-transport-"+i;
+var _5=dojo.byId("xmpp-transport-"+i);
+if(_5){
+if(window[_4]){
+window[_4]=null;
+}
+if(window.frames[_4]){
+window.frames[_4]=null;
+}
+dojo.destroy(_5);
+}
+_5=dojo.io.iframe.create("xmpp-transport-"+i,_2+"._iframeOnload("+i+");");
+this.transportIframes.push(_5);
+}
+},_iframeOnload:function(_6){
+var _7=dojo.io.iframe.doc(dojo.byId("xmpp-transport-"+_6));
+_7.write("<script>var isLoaded=true; var rid=0; var transmiting=false; function _BOSH_(msg) { transmiting=false; parent.dojox.xmpp.bosh.handle(msg, rid); } </script>");
+},findOpenIframe:function(){
+for(var i=0;i<this.transportIframes.length;i++){
+var _8=this.transportIframes[i];
+var _9=_8.contentWindow;
+if(_9.isLoaded&&!_9.transmiting){
+return _8;
+}
+}
+return false;
+},handle:function(_a,_b){
+var _c=this["rid"+_b];
+var _d=dojox.xml.parser.parse(_a,"text/xml");
+if(_d){
+_c.ioArgs.xmppMessage=_d;
+}else{
+_c.errback(new Error("Recieved bad document from server: "+_a));
+}
+},get:function(_e){
+var _f=this.findOpenIframe();
+var _10=dojo.io.iframe.doc(_f);
+_e.frameDoc=_10;
+var dfd=this._makeScriptDeferred(_e);
+var _11=dfd.ioArgs;
+_f.contentWindow.rid=_11.rid;
+_f.contentWindow.transmiting=true;
+dojo._ioAddQueryToUrl(_11);
+dojo._ioNotifyStart(dfd);
+dojo.io.script.attach(_11.id,_11.url,_10);
+dojo._ioWatch(dfd,this._validCheck,this._ioCheck,this._resHandle);
+return dfd;
+},remove:function(id,_12){
+dojo.destroy(dojo.byId(id,_12));
+if(this[id]){
+delete this[id];
+}
+},_makeScriptDeferred:function(_13){
+var dfd=dojo._ioSetArgs(_13,this._deferredCancel,this._deferredOk,this._deferredError);
+var _14=dfd.ioArgs;
+_14.id="rid"+_13.rid;
+_14.rid=_13.rid;
+_14.canDelete=true;
+_14.frameDoc=_13.frameDoc;
+this[_14.id]=dfd;
+return dfd;
+},_deferredCancel:function(dfd){
+dfd.canceled=true;
+if(dfd.ioArgs.canDelete){
+dojox.xmpp.bosh._addDeadScript(dfd.ioArgs);
+}
+},_deferredOk:function(dfd){
+var _15=dfd.ioArgs;
+if(_15.canDelete){
+dojox.xmpp.bosh._addDeadScript(_15);
+}
+return _15.xmppMessage||_15;
+},_deferredError:function(_16,dfd){
+if(dfd.ioArgs.canDelete){
+if(_16.dojoType=="timeout"){
+dojox.xmpp.bosh.remove(dfd.ioArgs.id,dfd.ioArgs.frameDoc);
+}else{
+dojox.xmpp.bosh._addDeadScript(dfd.ioArgs);
+}
+}
+return _16;
+},_deadScripts:[],_addDeadScript:function(_17){
+dojox.xmpp.bosh._deadScripts.push({id:_17.id,frameDoc:_17.frameDoc});
+_17.frameDoc=null;
+},_validCheck:function(dfd){
+var _18=dojox.xmpp.bosh;
+var _19=_18._deadScripts;
+if(_19&&_19.length>0){
+for(var i=0;i<_19.length;i++){
+_18.remove(_19[i].id,_19[i].frameDoc);
+_19[i].frameDoc=null;
+}
+dojox.xmpp.bosh._deadScripts=[];
+}
+return true;
+},_ioCheck:function(dfd){
+var _1a=dfd.ioArgs;
+if(_1a.xmppMessage){
+return true;
+}
+return false;
+},_resHandle:function(dfd){
+if(dojox.xmpp.bosh._ioCheck(dfd)){
+dfd.callback(dfd);
+}else{
+dfd.errback(new Error("inconceivable dojox.xmpp.bosh._resHandle error"));
+}
+}};
+}
diff --git a/dojox/xmpp/sasl.js b/dojox/xmpp/sasl.js
index 4ab235c..e5a3724 100644
--- a/dojox/xmpp/sasl.js
+++ b/dojox/xmpp/sasl.js
@@ -9,24 +9,111 @@ if(!dojo._hasResource["dojox.xmpp.sasl"]){
 dojo._hasResource["dojox.xmpp.sasl"]=true;
 dojo.provide("dojox.xmpp.sasl");
 dojo.require("dojox.xmpp.util");
+dojo.require("dojo.AdapterRegistry");
+dojo.require("dojox.encoding.digests.MD5");
 dojox.xmpp.sasl.saslNS="urn:ietf:params:xml:ns:xmpp-sasl";
-dojox.xmpp.sasl.SunWebClientAuth=function(_1){
-var _2={xmlns:dojox.xmpp.sasl.saslNS,mechanism:"SUN-COMMS-CLIENT-PROXY-AUTH"};
-var _3=dojox.xmpp.util.createElement("auth",_2,true);
-_1.dispatchPacket(_3);
-};
-dojox.xmpp.sasl.SaslPlain=function(_4){
-var _5={xmlns:dojox.xmpp.sasl.saslNS,mechanism:"PLAIN"};
-var _6=new dojox.string.Builder(dojox.xmpp.util.createElement("auth",_5,false));
-var id=_4.jid;
-var _8=_4.jid.indexOf("@");
-if(_8!=-1){
-id=_4.jid.substring(0,_8);
+dojo.declare("dojox.xmpp.sasl._Base",null,{mechanism:null,closeAuthTag:true,constructor:function(_1){
+this.session=_1;
+this.startAuth();
+},startAuth:function(){
+var _2=new dojox.string.Builder(dojox.xmpp.util.createElement("auth",{xmlns:dojox.xmpp.sasl.saslNS,mechanism:this.mechanism},this.closeAuthTag));
+this.appendToAuth(_2);
+this.session.dispatchPacket(_2.toString());
+},appendToAuth:function(_3){
+},onChallenge:function(_4){
+if(!this.first_challenge){
+this.first_challenge=true;
+this.onFirstChallenge(_4);
+}else{
+this.onSecondChallenge(_4);
+}
+},onFirstChallenge:function(){
+},onSecondChallenge:function(){
+},onSuccess:function(){
+this.session.sendRestart();
+}});
+dojo.declare("dojox.xmpp.sasl.SunWebClientAuth",dojox.xmpp.sasl._Base,{mechanism:"SUN-COMMS-CLIENT-PROXY-AUTH"});
+dojo.declare("dojox.xmpp.sasl.Plain",dojox.xmpp.sasl._Base,{mechanism:"PLAIN",closeAuthTag:false,appendToAuth:function(_5){
+var id=this.session.jid;
+var _6=this.session.jid.indexOf("@");
+if(_6!=-1){
+id=this.session.jid.substring(0,_6);
 }
-var _9="\x00"+id+"\x00"+_4.password;
-_9=dojox.xmpp.util.Base64.encode(_9);
-_6.append(_9);
-_6.append("</auth>");
-_4.dispatchPacket(_6.toString());
+var _7=this.session.jid+"\x00"+id+"\x00"+this.session.password;
+_7=dojox.xmpp.util.Base64.encode(_7);
+_5.append(_7);
+_5.append("</auth>");
+delete this.session.password;
+}});
+dojo.declare("dojox.xmpp.sasl.DigestMD5",dojox.xmpp.sasl._Base,{mechanism:"DIGEST-MD5",onFirstChallenge:function(_8){
+var _9=dojox.encoding.digests;
+var _a=dojox.encoding.digests.outputTypes;
+var _b=function(n){
+return _9.MD5(n,_a.Hex);
+};
+var H=function(s){
+return _9.MD5(s,_a.String);
 };
+var _c=dojox.xmpp.util.Base64.decode(_8.firstChild.nodeValue);
+var ch={realm:"",nonce:"",qop:"auth",maxbuf:65536};
+_c.replace(/([a-z]+)=([^,]+)/g,function(t,k,v){
+v=v.replace(/^"(.+)"$/,"$1");
+ch[k]=v;
+});
+var _d="";
+switch(ch.qop){
+case "auth-int":
+case "auth-conf":
+_d=":00000000000000000000000000000000";
+case "auth":
+break;
+default:
+return false;
+}
+var _e=_9.MD5(Math.random()*1234567890,_a.Hex);
+var _f="xmpp/"+this.session.domain;
+var _10=this.session.jid;
+var _11=this.session.jid.indexOf("@");
+if(_11!=-1){
+_10=this.session.jid.substring(0,_11);
+}
+_10=dojox.xmpp.util.encodeJid(_10);
+var A1=new dojox.string.Builder();
+A1.append(H(_10+":"+ch.realm+":"+this.session.password),":",ch.nonce+":"+_e);
+delete this.session.password;
+var _12=":"+_f+_d;
+var A2="AUTHENTICATE"+_12;
+var _13=new dojox.string.Builder();
+_13.append(_b(A1.toString()),":",ch.nonce,":00000001:",_e,":",ch.qop,":");
+var ret=new dojox.string.Builder();
+ret.append("username=\"",_10,"\",","realm=\"",ch.realm,"\",","nonce=",ch.nonce,",","cnonce=\"",_e,"\",","nc=\"00000001\",qop=\"",ch.qop,"\",digest-uri=\"",_f,"\",","response=\"",_b(_13.toString()+_b(A2)),"\",charset=\"utf-8\"");
+var _14=new dojox.string.Builder(dojox.xmpp.util.createElement("response",{xmlns:dojox.xmpp.xmpp.SASL_NS},false));
+_14.append(dojox.xmpp.util.Base64.encode(ret.toString()));
+_14.append("</response>");
+this.rspauth=_b(_13.toString()+_b(_12));
+this.session.dispatchPacket(_14.toString());
+},onSecondChallenge:function(msg){
+var _15=dojox.xmpp.util.Base64.decode(msg.firstChild.nodeValue);
+if(this.rspauth==_15.substring(8)){
+var _16=new dojox.string.Builder(dojox.xmpp.util.createElement("response",{xmlns:dojox.xmpp.xmpp.SASL_NS},true));
+this.session.dispatchPacket(_16.toString());
+}else{
+}
+}});
+dojox.xmpp.sasl.registry=new dojo.AdapterRegistry();
+dojox.xmpp.sasl.registry.register("SUN-COMMS-CLIENT-PROXY-AUTH",function(_17){
+return _17=="SUN-COMMS-CLIENT-PROXY-AUTH";
+},function(_18,_19){
+return new dojox.xmpp.sasl.SunWebClientAuth(_19);
+});
+dojox.xmpp.sasl.registry.register("DIGEST-MD5",function(_1a){
+return _1a=="DIGEST-MD5";
+},function(_1b,_1c){
+return new dojox.xmpp.sasl.DigestMD5(_1c);
+});
+dojox.xmpp.sasl.registry.register("PLAIN",function(_1d){
+return _1d=="PLAIN";
+},function(_1e,_1f){
+return new dojox.xmpp.sasl.Plain(_1f);
+});
 }
diff --git a/dojox/xmpp/util.js b/dojox/xmpp/util.js
index 3e3b317..b4bb7f5 100644
--- a/dojox/xmpp/util.js
+++ b/dojox/xmpp/util.js
@@ -9,6 +9,7 @@ if(!dojo._hasResource["dojox.xmpp.util"]){
 dojo._hasResource["dojox.xmpp.util"]=true;
 dojo.provide("dojox.xmpp.util");
 dojo.require("dojox.string.Builder");
+dojo.require("dojox.encoding.base64");
 dojox.xmpp.util.xmlEncode=function(_1){
 if(_1){
 _1=_1.replace("&","&").replace(">",">").replace("<","<").replace("'","'").replace("\"",""");
@@ -19,43 +20,43 @@ dojox.xmpp.util.encodeJid=function(_2){
 var _3=new dojox.string.Builder();
 for(var i=0;i<_2.length;i++){
 var ch=_2.charAt(i);
-var _6=ch;
+var _4=ch;
 switch(ch){
 case " ":
-_6="\\20";
+_4="\\20";
 break;
 case "\"":
-_6="\\22";
+_4="\\22";
 break;
 case "#":
-_6="\\23";
+_4="\\23";
 break;
 case "&":
-_6="\\26";
+_4="\\26";
 break;
 case "'":
-_6="\\27";
+_4="\\27";
 break;
 case "/":
-_6="\\2f";
+_4="\\2f";
 break;
 case ":":
-_6="\\3a";
+_4="\\3a";
 break;
 case "<":
-_6="\\3c";
+_4="\\3c";
 break;
 case ">":
-_6="\\3e";
+_4="\\3e";
 break;
 }
-_3.append(_6);
+_3.append(_4);
 }
 return _3.toString();
 };
-dojox.xmpp.util.decodeJid=function(_7){
-_7=_7.replace(/\\([23][02367acef])/g,function(_8){
-switch(_8){
+dojox.xmpp.util.decodeJid=function(_5){
+_5=_5.replace(/\\([23][02367acef])/g,function(_6){
+switch(_6){
 case "\\20":
 return " ";
 case "\\22":
@@ -77,91 +78,59 @@ return ">";
 }
 return "ARG";
 });
-return _7;
+return _5;
 };
-dojox.xmpp.util.createElement=function(_9,_a,_b){
-var _c=new dojox.string.Builder("<");
-_c.append(_9+" ");
-for(var _d in _a){
-_c.append(_d+"=\"");
-_c.append(_a[_d]);
-_c.append("\" ");
+dojox.xmpp.util.createElement=function(_7,_8,_9){
+var _a=new dojox.string.Builder("<");
+_a.append(_7+" ");
+for(var _b in _8){
+_a.append(_b+"=\"");
+_a.append(_8[_b]);
+_a.append("\" ");
 }
-if(_b){
-_c.append("/>");
+if(_9){
+_a.append("/>");
 }else{
-_c.append(">");
+_a.append(">");
 }
-return _c.toString();
+return _a.toString();
 };
-dojox.xmpp.util.stripHtml=function(_e){
+dojox.xmpp.util.stripHtml=function(_c){
 var re=/<[^>]*?>/gi;
 for(var i=0;i<arguments.length;i++){
 }
-return _e.replace(re,"");
+return _c.replace(re,"");
 };
-dojox.xmpp.util.decodeHtmlEntities=function(str){
+dojox.xmpp.util.decodeHtmlEntities=function(_d){
 var ta=dojo.doc.createElement("textarea");
-ta.innerHTML=str.replace(/</g,"<").replace(/>/g,">");
+ta.innerHTML=_d.replace(/</g,"<").replace(/>/g,">");
 return ta.value;
 };
-dojox.xmpp.util.htmlToPlain=function(str){
-str=dojox.xmpp.util.decodeHtmlEntities(str);
-str=str.replace(/<br\s*[i\/]{0,1}>/gi,"\n");
-str=dojox.xmpp.util.stripHtml(str);
-return str;
+dojox.xmpp.util.htmlToPlain=function(_e){
+_e=dojox.xmpp.util.decodeHtmlEntities(_e);
+_e=_e.replace(/<br\s*[i\/]{0,1}>/gi,"\n");
+_e=dojox.xmpp.util.stripHtml(_e);
+return _e;
 };
 dojox.xmpp.util.Base64={};
-dojox.xmpp.util.Base64.keylist="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
-dojox.xmpp.util.Base64.encode=function(_14){
-var _15="";
-var c1,c2,c3;
-var _19,_1a,_1b,_1c;
-var i=0;
-do{
-c1=c2=c3="";
-_19=_1a=_1b=_1c="";
-c1=_14.charCodeAt(i++);
-c2=_14.charCodeAt(i++);
-c3=_14.charCodeAt(i++);
-_19=c1>>2;
-_1a=((c1&3)<<4)|(c2>>4);
-_1b=((c2&15)<<2)|(c3>>6);
-_1c=c3&63;
-if(isNaN(c2)){
-_1b=_1c=64;
-}else{
-if(isNaN(c3)){
-_1c=64;
-}
+dojox.xmpp.util.Base64.encode=function(_f){
+var s2b=function(s){
+var b=[];
+for(var i=0;i<s.length;++i){
+b.push(s.charCodeAt(i));
 }
-_15=_15+dojox.xmpp.util.Base64.keylist.charAt(_19)+dojox.xmpp.util.Base64.keylist.charAt(_1a)+dojox.xmpp.util.Base64.keylist.charAt(_1b)+dojox.xmpp.util.Base64.keylist.charAt(_1c);
-}while(i<_14.length);
-return _15;
+return b;
 };
-dojox.xmpp.util.Base64.decode=function(_1e){
-var _1f="";
-var c1,c2,c3;
-var _23,_24,_25,_26="";
-var i=0;
-do{
-c1=c2=c3="";
-_23=_24=_25=_26="";
-_23=dojox.xmpp.util.Base64.keylist.indexOf(_1e.charAt(i++));
-_24=dojox.xmpp.util.Base64.keylist.indexOf(_1e.charAt(i++));
-_25=dojox.xmpp.util.Base64.keylist.indexOf(_1e.charAt(i++));
-_26=dojox.xmpp.util.Base64.keylist.indexOf(_1e.charAt(i++));
-c1=(_23<<2)|(_24>>4);
-c2=((_24&15)<<4)|(_25>>2);
-c3=((_25&3)<<6)|_26;
-_1f=_1f+String.fromCharCode(c1);
-if(_25!=64){
-_1f=_1f+String.fromCharCode(c2);
-}
-if(_26!=64){
-_1f=_1f+String.fromCharCode(c3);
-}
-}while(i<_1e.length);
-return _1f;
+return dojox.encoding.base64.encode(s2b(_f));
+};
+dojox.xmpp.util.Base64.decode=function(_10){
+var b2s=function(b){
+var s=[];
+dojo.forEach(b,function(c){
+s.push(String.fromCharCode(c));
+});
+return s.join("");
+};
+return b2s(dojox.encoding.base64.decode(_10));
 };
 }
diff --git a/dojox/xmpp/widget/ChatSession.js b/dojox/xmpp/widget/ChatSession.js
index 384c5a1..6edad66 100644
--- a/dojox/xmpp/widget/ChatSession.js
+++ b/dojox/xmpp/widget/ChatSession.js
@@ -8,7 +8,7 @@
 if(!dojo._hasResource["dojox.xmpp.widget.ChatSession"]){
 dojo._hasResource["dojox.xmpp.widget.ChatSession"]=true;
 dojo.provide("dojox.xmpp.widget.ChatSession");
-dojo.declare("dojox.xmpp.widget.ChatSession",[dijit.layout.LayoutContainer,dijit._Templated],{templateString:"<div>\n<div dojoAttachPoint=\"messages\" dojoType=\"dijit.layout.ContentPane\" layoutAlign=\"client\" style=\"overflow:auto\">\n</div>\n<div dojoType=\"dijit.layout.ContentPane\" layoutAlign=\"bottom\" style=\"border-top: 2px solid #333333; height: 35px;\"><input dojoAttachPoint=\"chatInput\" dojoAttachEvent=\"onkeypress: onKeyPress\" style=\"width: 100%;height: 35px;\" /></div>\ [...]
+dojo.declare("dojox.xmpp.widget.ChatSession",[dijit.layout.LayoutContainer,dijit._Templated],{templateString:dojo.cache("dojox.xmpp.widget","templates/ChatSession.html","<div>\n<div dojoAttachPoint=\"messages\" dojoType=\"dijit.layout.ContentPane\" layoutAlign=\"client\" style=\"overflow:auto\">\n</div>\n<div dojoType=\"dijit.layout.ContentPane\" layoutAlign=\"bottom\" style=\"border-top: 2px solid #333333; height: 35px;\"><input dojoAttachPoint=\"chatInput\" dojoAttachEvent=\"onkeypress [...]
 },displayMessage:function(_1,_2){
 if(_1){
 var _3=_1.from?this.chatWith:"me";
@@ -18,8 +18,8 @@ this.goToLastMessage();
 },goToLastMessage:function(){
 this.messages.domNode.scrollTop=this.messages.domNode.scrollHeight;
 },onKeyPress:function(e){
-var _5=e.keyCode||e.charCode;
-if((_5==dojo.keys.ENTER)&&(this.chatInput.value!="")){
+var _4=e.keyCode||e.charCode;
+if((_4==dojo.keys.ENTER)&&(this.chatInput.value!="")){
 this.instance.sendMessage({body:this.chatInput.value});
 this.displayMessage({body:this.chatInput.value},"out");
 this.chatInput.value="";
diff --git a/dojox/xmpp/xmppSession.js b/dojox/xmpp/xmppSession.js
index d8bdee2..f2f624b 100644
--- a/dojox/xmpp/xmppSession.js
+++ b/dojox/xmpp/xmppSession.js
@@ -14,8 +14,11 @@ dojo.require("dojox.xmpp.PresenceService");
 dojo.require("dojox.xmpp.UserService");
 dojo.require("dojox.xmpp.ChatService");
 dojo.require("dojox.xmpp.sasl");
-dojox.xmpp.xmpp={STREAM_NS:"http://etherx.jabber.org/streams",CLIENT_NS:"jabber:client",STANZA_NS:"urn:ietf:params:xml:ns:xmpp-stanzas",SASL_NS:"urn:ietf:params:xml:ns:xmpp-sasl",BIND_NS:"urn:ietf:params:xml:ns:xmpp-bind",BODY_NS:"http://jabber.org/protocol/httpbind",XHTML_BODY_NS:"http://www.w3.org/1999/xhtml",XHTML_IM_NS:"http://jabber.org/protocol/xhtml-im",INACTIVE:"Inactive",CONNECTED:"Connected",ACTIVE:"Active",TERMINATE:"Terminate",LOGIN_FAILURE:"LoginFailure",INVALID_ID:-1,NO_ID: [...]
+dojox.xmpp.xmpp={STREAM_NS:"http://etherx.jabber.org/streams",CLIENT_NS:"jabber:client",STANZA_NS:"urn:ietf:params:xml:ns:xmpp-stanzas",SASL_NS:"urn:ietf:params:xml:ns:xmpp-sasl",BIND_NS:"urn:ietf:params:xml:ns:xmpp-bind",SESSION_NS:"urn:ietf:params:xml:ns:xmpp-session",BODY_NS:"http://jabber.org/protocol/httpbind",XHTML_BODY_NS:"http://www.w3.org/1999/xhtml",XHTML_IM_NS:"http://jabber.org/protocol/xhtml-im",INACTIVE:"Inactive",CONNECTED:"Connected",ACTIVE:"Active",TERMINATE:"Terminate", [...]
 dojox.xmpp.xmppSession=function(_1){
+this.roster=[];
+this.chatRegister=[];
+this._iqId=Math.round(Math.random()*1000000000);
 if(_1&&dojo.isObject(_1)){
 dojo.mixin(this,_1);
 }
@@ -24,7 +27,7 @@ dojo.connect(this.session,"onReady",this,"onTransportReady");
 dojo.connect(this.session,"onTerminate",this,"onTransportTerminate");
 dojo.connect(this.session,"onProcessProtocolResponse",this,"processProtocolResponse");
 };
-dojo.extend(dojox.xmpp.xmppSession,{roster:[],chatRegister:[],_iqId:Math.round(Math.random()*1000000000),open:function(_2,_3,_4){
+dojo.extend(dojox.xmpp.xmppSession,{roster:[],chatRegister:[],_iqId:0,open:function(_2,_3,_4){
 if(!_2){
 throw new Error("User id cannot be null");
 }else{
@@ -97,6 +100,7 @@ break;
 },featuresHandler:function(_b){
 var _c=[];
 var _d=false;
+var _e=false;
 if(_b.hasChildNodes()){
 for(var i=0;i<_b.childNodes.length;i++){
 var n=_b.childNodes[i];
@@ -109,53 +113,63 @@ break;
 case "bind":
 _d=true;
 break;
+case "session":
+_e=true;
 }
 }
 }
-if(this.state==dojox.xmpp.xmpp.CONNECTED&&_d){
+if(this.state==dojox.xmpp.xmpp.CONNECTED){
+if(!this.auth){
 for(var i=0;i<_c.length;i++){
-if(_c[i]=="SUN-COMMS-CLIENT-PROXY-AUTH"){
-dojox.xmpp.sasl.SunWebClientAuth(this);
-break;
-}else{
-if(_c[i]=="PLAIN"){
-dojox.xmpp.sasl.SaslPlain(this);
+try{
+this.auth=dojox.xmpp.sasl.registry.match(_c[i],this);
 break;
+}
+catch(e){
+console.warn("No suitable auth mechanism found for: ",_c[i]);
+}
+}
 }else{
-console.error("No suitable auth mechanism found for: ",_c[i]);
+if(_d){
+this.bindResource(_e);
 }
 }
 }
-delete this.password;
+},saslHandler:function(_f){
+if(_f.nodeName=="success"){
+this.auth.onSuccess();
+return;
 }
-},saslHandler:function(msg){
-if(msg.nodeName=="success"){
-this.bindResource();
+if(_f.nodeName=="challenge"){
+this.auth.onChallenge(_f);
 return;
 }
-if(msg.hasChildNodes()){
-this.onLoginFailure(msg.firstChild.nodeName);
+if(_f.hasChildNodes()){
+this.onLoginFailure(_f.firstChild.nodeName);
+this.session.setState("Terminate",_f.firstChild.nodeName);
 }
+},sendRestart:function(){
+this.session._sendRestart();
 },chatHandler:function(msg){
-var _13={from:msg.getAttribute("from"),to:msg.getAttribute("to")};
-var _14=null;
+var _10={from:msg.getAttribute("from"),to:msg.getAttribute("to")};
+var _11=null;
 for(var i=0;i<msg.childNodes.length;i++){
 var n=msg.childNodes[i];
 if(n.hasChildNodes()){
 switch(n.nodeName){
 case "thread":
-_13.chatid=n.firstChild.nodeValue;
+_10.chatid=n.firstChild.nodeValue;
 break;
 case "body":
 if(!n.getAttribute("xmlns")||(n.getAttribute("xmlns")=="")){
-_13.body=n.firstChild.nodeValue;
+_10.body=n.firstChild.nodeValue;
 }
 break;
 case "subject":
-_13.subject=n.firstChild.nodeValue;
+_10.subject=n.firstChild.nodeValue;
 case "html":
 if(n.getAttribute("xmlns")==dojox.xmpp.xmpp.XHTML_IM_NS){
-_13.xhtml=n.getElementsByTagName("body")[0];
+_10.xhtml=n.getElementsByTagName("body")[0];
 }
 break;
 case "x":
@@ -164,12 +178,12 @@ default:
 }
 }
 }
-var _17=-1;
-if(_13.chatid){
+var _12=-1;
+if(_10.chatid){
 for(var i=0;i<this.chatRegister.length;i++){
 var ci=this.chatRegister[i];
-if(ci&&ci.chatid==_13.chatid){
-_17=i;
+if(ci&&ci.chatid==_10.chatid){
+_12=i;
 break;
 }
 }
@@ -177,44 +191,44 @@ break;
 for(var i=0;i<this.chatRegister.length;i++){
 var ci=this.chatRegister[i];
 if(ci){
-if(ci.uid==this.getBareJid(_13.from)){
-_17=i;
+if(ci.uid==this.getBareJid(_10.from)){
+_12=i;
 }
 }
 }
 }
-if(_17>-1&&_14){
-var _19=this.chatRegister[_17];
-_19.setState(_14);
-if(_19.firstMessage){
-if(_14==dojox.xmpp.chat.ACTIVE_STATE){
-_19.useChatState=(_14!=null)?true:false;
-_19.firstMessage=false;
+if(_12>-1&&_11){
+var _13=this.chatRegister[_12];
+_13.setState(_11);
+if(_13.firstMessage){
+if(_11==dojox.xmpp.chat.ACTIVE_STATE){
+_13.useChatState=(_11!=null)?true:false;
+_13.firstMessage=false;
 }
 }
 }
-if((!_13.body||_13.body=="")&&!_13.xhtml){
+if((!_10.body||_10.body=="")&&!_10.xhtml){
 return;
 }
-if(_17>-1){
-var _19=this.chatRegister[_17];
-_19.recieveMessage(_13);
+if(_12>-1){
+var _13=this.chatRegister[_12];
+_13.recieveMessage(_10);
 }else{
-var _1a=new dojox.xmpp.ChatService();
-_1a.uid=this.getBareJid(_13.from);
-_1a.chatid=_13.chatid;
-_1a.firstMessage=true;
-if(!_14||_14!=dojox.xmpp.chat.ACTIVE_STATE){
+var _14=new dojox.xmpp.ChatService();
+_14.uid=this.getBareJid(_10.from);
+_14.chatid=_10.chatid;
+_14.firstMessage=true;
+if(!_11||_11!=dojox.xmpp.chat.ACTIVE_STATE){
 this.useChatState=false;
 }
-this.registerChatInstance(_1a,_13);
+this.registerChatInstance(_14,_10);
 }
 },simpleMessageHandler:function(msg){
-},registerChatInstance:function(_1c,_1d){
-_1c.setSession(this);
-this.chatRegister.push(_1c);
-this.onRegisterChatInstance(_1c,_1d);
-_1c.recieveMessage(_1d,true);
+},registerChatInstance:function(_15,_16){
+_15.setSession(this);
+this.chatRegister.push(_15);
+this.onRegisterChatInstance(_15,_16);
+_15.recieveMessage(_16,true);
 },iqSetHandler:function(msg){
 if(msg.hasChildNodes()){
 var fn=msg.firstChild;
@@ -229,33 +243,33 @@ default:
 break;
 }
 }
-},sendIqResult:function(_20,to){
-var req={id:_20,to:to||this.domain,type:"result",from:this.jid+"/"+this.resource};
+},sendIqResult:function(_17,to){
+var req={id:_17,to:to||this.domain,type:"result",from:this.jid+"/"+this.resource};
 this.dispatchPacket(dojox.xmpp.util.createElement("iq",req,true));
-},rosterSetHandler:function(_23){
-for(var i=0;i<_23.childNodes.length;i++){
-var n=_23.childNodes[i];
+},rosterSetHandler:function(_18){
+for(var i=0;i<_18.childNodes.length;i++){
+var n=_18.childNodes[i];
 if(n.nodeName=="item"){
-var _26=false;
-var _27=-1;
-var _28=null;
-var _29=null;
+var _19=false;
+var _1a=-1;
+var _1b=null;
+var _1c=null;
 for(var x=0;x<this.roster.length;x++){
 var r=this.roster[x];
 if(n.getAttribute("jid")==r.jid){
-_26=true;
+_19=true;
 if(n.getAttribute("subscription")=="remove"){
-_28={id:r.jid,name:r.name,groups:[]};
+_1b={id:r.jid,name:r.name,groups:[]};
 for(var y=0;y<r.groups.length;y++){
-_28.groups.push(r.groups[y]);
+_1b.groups.push(r.groups[y]);
 }
 this.roster.splice(x,1);
-_27=dojox.xmpp.roster.REMOVED;
+_1a=dojox.xmpp.roster.REMOVED;
 }else{
-_29=dojo.clone(r);
-var _2d=n.getAttribute("name");
-if(_2d){
-this.roster[x].name=_2d;
+_1c=dojo.clone(r);
+var _1d=n.getAttribute("name");
+if(_1d){
+this.roster[x].name=_1d;
 }
 r.groups=[];
 if(n.getAttribute("subscription")){
@@ -266,32 +280,32 @@ if(n.getAttribute("ask")=="subscribe"){
 r.substatus=dojox.xmpp.presence.SUBSCRIPTION_REQUEST_PENDING;
 }
 for(var y=0;y<n.childNodes.length;y++){
-var _2e=n.childNodes[y];
-if((_2e.nodeName=="group")&&(_2e.hasChildNodes())){
-var _2f=_2e.firstChild.nodeValue;
-r.groups.push(_2f);
+var _1e=n.childNodes[y];
+if((_1e.nodeName=="group")&&(_1e.hasChildNodes())){
+var _1f=_1e.firstChild.nodeValue;
+r.groups.push(_1f);
 }
 }
-_28=r;
-_27=dojox.xmpp.roster.CHANGED;
+_1b=r;
+_1a=dojox.xmpp.roster.CHANGED;
 }
 break;
 }
 }
-if(!_26&&(n.getAttribute("subscription")!="remove")){
+if(!_19&&(n.getAttribute("subscription")!="remove")){
 r=this.createRosterEntry(n);
-_28=r;
-_27=dojox.xmpp.roster.ADDED;
+_1b=r;
+_1a=dojox.xmpp.roster.ADDED;
 }
-switch(_27){
+switch(_1a){
 case dojox.xmpp.roster.ADDED:
-this.onRosterAdded(_28);
+this.onRosterAdded(_1b);
 break;
 case dojox.xmpp.roster.REMOVED:
-this.onRosterRemoved(_28);
+this.onRosterRemoved(_1b);
 break;
 case dojox.xmpp.roster.CHANGED:
-this.onRosterChanged(_28,_29);
+this.onRosterChanged(_1b,_1c);
 break;
 }
 }
@@ -303,11 +317,8 @@ if(jid!=this.jid){
 return;
 }
 }
-var _32=this.getResourceFromJid(msg.getAttribute("from"));
-if(!_32){
-return;
-}
-var p={from:this.getBareJid(msg.getAttribute("from")),resource:_32,show:dojox.xmpp.presence.STATUS_ONLINE,priority:5,hasAvatar:false};
+var _20=this.getResourceFromJid(msg.getAttribute("from"));
+var p={from:this.getBareJid(msg.getAttribute("from")),resource:_20,show:dojox.xmpp.presence.STATUS_ONLINE,priority:5,hasAvatar:false};
 if(msg.getAttribute("type")=="unavailable"){
 p.show=dojox.xmpp.presence.STATUS_OFFLINE;
 }
@@ -333,11 +344,11 @@ break;
 }
 this.onPresenceUpdate(p);
 },retrieveRoster:function(){
-var _36={id:this.getNextIqId(),from:this.jid+"/"+this.resource,type:"get"};
-var req=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_36,false));
+var _21={id:this.getNextIqId(),from:this.jid+"/"+this.resource,type:"get"};
+var req=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_21,false));
 req.append(dojox.xmpp.util.createElement("query",{xmlns:"jabber:iq:roster"},true));
 req.append("</iq>");
-var def=this.dispatchPacket(req,"iq",_36.id);
+var def=this.dispatchPacket(req,"iq",_21.id);
 def.addCallback(this,"onRetrieveRoster");
 },getRosterIndex:function(jid){
 if(jid.indexOf("@")==-1){
@@ -349,61 +360,64 @@ return i;
 }
 }
 return -1;
-},createRosterEntry:function(_3b){
-var re={name:_3b.getAttribute("name"),jid:_3b.getAttribute("jid"),groups:[],status:dojox.xmpp.presence.SUBSCRIPTION_NONE,substatus:dojox.xmpp.presence.SUBSCRIPTION_SUBSTATUS_NONE};
+},createRosterEntry:function(_22){
+var re={name:_22.getAttribute("name"),jid:_22.getAttribute("jid"),groups:[],status:dojox.xmpp.presence.SUBSCRIPTION_NONE,substatus:dojox.xmpp.presence.SUBSCRIPTION_SUBSTATUS_NONE};
 if(!re.name){
 re.name=re.id;
 }
-for(var i=0;i<_3b.childNodes.length;i++){
-var n=_3b.childNodes[i];
+for(var i=0;i<_22.childNodes.length;i++){
+var n=_22.childNodes[i];
 if(n.nodeName=="group"&&n.hasChildNodes()){
 re.groups.push(n.firstChild.nodeValue);
 }
 }
-if(_3b.getAttribute("subscription")){
-re.status=_3b.getAttribute("subscription");
+if(_22.getAttribute("subscription")){
+re.status=_22.getAttribute("subscription");
 }
-if(_3b.getAttribute("ask")=="subscribe"){
+if(_22.getAttribute("ask")=="subscribe"){
 re.substatus=dojox.xmpp.presence.SUBSCRIPTION_REQUEST_PENDING;
 }
 return re;
-},bindResource:function(){
-var _3f={xmlns:"jabber:client",id:this.getNextIqId(),type:"set"};
-var _40=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_3f,false));
-_40.append(dojox.xmpp.util.createElement("bind",{xmlns:dojox.xmpp.xmpp.BIND_NS},false));
+},bindResource:function(_23){
+var _24={id:this.getNextIqId(),type:"set"};
+var _25=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_24,false));
+_25.append(dojox.xmpp.util.createElement("bind",{xmlns:dojox.xmpp.xmpp.BIND_NS},false));
 if(this.resource){
-_40.append(dojox.xmpp.util.createElement("resource"));
-_40.append(this.resource);
-_40.append("</resource>");
-}
-_40.append("</bind></iq>");
-var def=this.dispatchPacket(_40,"iq",_3f.id);
-def.addCallback(this,"onBindResource");
+_25.append(dojox.xmpp.util.createElement("resource"));
+_25.append(this.resource);
+_25.append("</resource>");
+}
+_25.append("</bind></iq>");
+var def=this.dispatchPacket(_25,"iq",_24.id);
+def.addCallback(this,function(msg){
+this.onBindResource(msg,_23);
+return msg;
+});
 },getNextIqId:function(){
 return "im_"+this._iqId++;
 },presenceSubscriptionRequest:function(msg){
 this.onSubscriptionRequest(msg);
-},dispatchPacket:function(msg,_44,_45){
+},dispatchPacket:function(msg,_26,_27){
 if(this.state!="Terminate"){
-return this.session.dispatchPacket(msg,_44,_45);
+return this.session.dispatchPacket(msg,_26,_27);
 }else{
 }
-},setState:function(_46,_47){
-if(this.state!=_46){
-if(this["on"+_46]){
-this["on"+_46](_46,this.state,_47);
-}
-this.state=_46;
-}
-},search:function(_48,_49,_4a){
-var req={id:this.getNextIqId(),"xml:lang":this.lang,type:"set",from:this.jid+"/"+this.resource,to:_49};
-var _4c=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",req,false));
-_4c.append(dojox.xmpp.util.createElement("query",{xmlns:"jabber:iq:search"},false));
-_4c.append(dojox.xmpp.util.createElement(_4a,{},false));
-_4c.append(_48);
-_4c.append("</").append(_4a).append(">");
-_4c.append("</query></iq>");
-var def=this.dispatchPacket(_4c.toString,"iq",req.id);
+},setState:function(_28,_29){
+if(this.state!=_28){
+if(this["on"+_28]){
+this["on"+_28](_28,this.state,_29);
+}
+this.state=_28;
+}
+},search:function(_2a,_2b,_2c){
+var req={id:this.getNextIqId(),"xml:lang":this.lang,type:"set",from:this.jid+"/"+this.resource,to:_2b};
+var _2d=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",req,false));
+_2d.append(dojox.xmpp.util.createElement("query",{xmlns:"jabber:iq:search"},false));
+_2d.append(dojox.xmpp.util.createElement(_2c,{},false));
+_2d.append(_2a);
+_2d.append("</").append(_2c).append(">");
+_2d.append("</query></iq>");
+var def=this.dispatchPacket(_2d.toString,"iq",req.id);
 def.addCallback(this,"_onSearchResults");
 },_onSearchResults:function(msg){
 if((msg.getAttribute("type")=="result")&&(msg.hasChildNodes())){
@@ -412,16 +426,25 @@ this.onSearchResults([]);
 },onLogin:function(){
 this.retrieveRoster();
 },onLoginFailure:function(msg){
-},onBindResource:function(msg){
+},onBindResource:function(msg,_2e){
 if(msg.getAttribute("type")=="result"){
 if((msg.hasChildNodes())&&(msg.firstChild.nodeName=="bind")){
-var _51=msg.firstChild;
-if((_51.hasChildNodes())&&(_51.firstChild.nodeName=="jid")){
-if(_51.firstChild.hasChildNodes()){
-var _52=_51.firstChild.firstChild.nodeValue;
-this.jid=this.getBareJid(_52);
-this.resource=this.getResourceFromJid(_52);
-}
+var _2f=msg.firstChild;
+if((_2f.hasChildNodes())&&(_2f.firstChild.nodeName=="jid")){
+if(_2f.firstChild.hasChildNodes()){
+var _30=_2f.firstChild.firstChild.nodeValue;
+this.jid=this.getBareJid(_30);
+this.resource=this.getResourceFromJid(_30);
+}
+}
+if(_2e){
+var _31={id:this.getNextIqId(),type:"set"};
+var _32=new dojox.string.Builder(dojox.xmpp.util.createElement("iq",_31,false));
+_32.append(dojox.xmpp.util.createElement("session",{xmlns:dojox.xmpp.xmpp.SESSION_NS},true));
+_32.append("</iq>");
+var def=this.dispatchPacket(_32,"iq",_31.id);
+def.addCallback(this,"onBindSession");
+return;
 }
 }else{
 }
@@ -432,15 +455,21 @@ var err=this.processXmppError(msg);
 this.onLoginFailure(err);
 }
 }
-return msg;
-},onSearchResults:function(_54){
+},onBindSession:function(msg){
+if(msg.getAttribute("type")=="error"){
+var err=this.processXmppError(msg);
+this.onLoginFailure(err);
+}else{
+this.onLogin();
+}
+},onSearchResults:function(_33){
 },onRetrieveRoster:function(msg){
 if((msg.getAttribute("type")=="result")&&msg.hasChildNodes()){
-var _56=msg.getElementsByTagName("query")[0];
-if(_56.getAttribute("xmlns")=="jabber:iq:roster"){
-for(var i=0;i<_56.childNodes.length;i++){
-if(_56.childNodes[i].nodeName=="item"){
-this.roster[i]=this.createRosterEntry(_56.childNodes[i]);
+var _34=msg.getElementsByTagName("query")[0];
+if(_34.getAttribute("xmlns")=="jabber:iq:roster"){
+for(var i=0;i<_34.childNodes.length;i++){
+if(_34.childNodes[i].nodeName=="item"){
+this.roster[i]=this.createRosterEntry(_34.childNodes[i]);
 }
 }
 }
@@ -459,15 +488,15 @@ this.setState(dojox.xmpp.xmpp.CONNECTED);
 this.rosterService=new dojox.xmpp.RosterService(this);
 this.presenceService=new dojox.xmpp.PresenceService(this);
 this.userService=new dojox.xmpp.UserService(this);
-},onTransportTerminate:function(_5a,_5b,_5c){
-this.setState(dojox.xmpp.xmpp.TERMINATE,_5c);
+},onTransportTerminate:function(_35,_36,_37){
+this.setState(dojox.xmpp.xmpp.TERMINATE,_37);
 },onConnected:function(){
-},onTerminate:function(_5d,_5e,_5f){
+},onTerminate:function(_38,_39,_3a){
 },onActive:function(){
-},onRegisterChatInstance:function(_60,_61){
+},onRegisterChatInstance:function(_3b,_3c){
 },onRosterAdded:function(ri){
 },onRosterRemoved:function(ri){
-},onRosterChanged:function(ri,_65){
+},onRosterChanged:function(ri,_3d){
 },processXmppError:function(msg){
 var err={stanzaType:msg.nodeName,id:msg.getAttribute("id")};
 for(var i=0;i<msg.childNodes.length;i++){
@@ -491,7 +520,7 @@ break;
 }
 }
 return err;
-},sendStanzaError:function(_6c,to,id,_6f,_70,_71){
+},sendStanzaError:function(_3e,to,id,_3f,_40,_41){
 var req={type:"error"};
 if(to){
 req.to=to;
@@ -499,16 +528,16 @@ req.to=to;
 if(id){
 req.id=id;
 }
-var _73=new dojox.string.Builder(dojox.xmpp.util.createElement(_6c,req,false));
-_73.append(dojox.xmpp.util.createElement("error",{type:_6f},false));
-_73.append(dojox.xmpp.util.createElement("condition",{xmlns:dojox.xmpp.xmpp.STANZA_NS},true));
-if(_71){
-var _74={xmlns:dojox.xmpp.xmpp.STANZA_NS,"xml:lang":this.lang};
-_73.append(dojox.xmpp.util.createElement("text",_74,false));
-_73.append(_71).append("</text>");
+var _42=new dojox.string.Builder(dojox.xmpp.util.createElement(_3e,req,false));
+_42.append(dojox.xmpp.util.createElement("error",{type:_3f},false));
+_42.append(dojox.xmpp.util.createElement("condition",{xmlns:dojox.xmpp.xmpp.STANZA_NS},true));
+if(_41){
+var _43={xmlns:dojox.xmpp.xmpp.STANZA_NS,"xml:lang":this.lang};
+_42.append(dojox.xmpp.util.createElement("text",_43,false));
+_42.append(_41).append("</text>");
 }
-_73.append("</error></").append(_6c).append(">");
-this.dispatchPacket(_73.toString());
+_42.append("</error></").append(_3e).append(">");
+this.dispatchPacket(_42.toString());
 },getBareJid:function(jid){
 var i=jid.indexOf("/");
 if(i!=-1){

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/dojo.git



More information about the Pkg-javascript-commits mailing list